irc-netcore-api/IRaCIS.Core.Application/Service/QC/TrialQCQuestionService.cs

175 lines
7.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//--------------------------------------------------------------------
// 此代码由T4模板自动生成 byzhouhang 20210918
// 生成时间 2021-11-11 11:04:54
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//--------------------------------------------------------------------
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Infrastructure;
using Microsoft.AspNetCore.Mvc;
namespace IRaCIS.Core.Application.Contracts
{
/// <summary>
/// 项目QC 问题 管理
/// </summary>
[ApiExplorerSettings(GroupName = "Image")]
public class TrialQCQuestionConfigureService : BaseService, ITrialQCQuestionConfigureService
{
private readonly IRepository<TrialQCQuestion> _trialQcQuestionRepository;
public TrialQCQuestionConfigureService(IRepository<TrialQCQuestion> trialQcQuestionRepository)
{
_trialQcQuestionRepository = trialQcQuestionRepository;
}
[HttpPost]
public async Task<(List<TrialQCQuestionConfigureView>, object)> GetTrialQCQuestionConfigureList(TrialQCQuestionQuery queryTrialQCQuestionConfigure)
{
var trialQCQuestionQueryable = _trialQcQuestionRepository.Where(t => t.TrialId == queryTrialQCQuestionConfigure.TrialId)
.WhereIf(!string.IsNullOrWhiteSpace(queryTrialQCQuestionConfigure.QuestionName), t => t.QuestionName.Contains(queryTrialQCQuestionConfigure.QuestionName))
.WhereIf(!string.IsNullOrWhiteSpace(queryTrialQCQuestionConfigure.Type), t => t.Type.Contains(queryTrialQCQuestionConfigure.Type))
.ProjectTo<TrialQCQuestionConfigureView>(_mapper.ConfigurationProvider);
var list = await trialQCQuestionQueryable.OrderBy(t => t.ShowOrder).ToListAsync();
var isHaveQCQuestion = _repository.Where<TrialQCQuestion>(t => t.TrialId == queryTrialQCQuestionConfigure.TrialId).Any();
var signInfo = await _repository.Where<Trial>(t => t.Id == queryTrialQCQuestionConfigure.TrialId)
.Select(trial => new
{
trial.QCProcessEnum,
trial.QCQuestionConfirmedTime,
trial.QCQuestionConfirmedUserId,
RealName = trial.QCQuestionConfirmedUser.FullName,
trial.QCQuestionConfirmedUser.UserName,
IsHaveQCQuestion = isHaveQCQuestion
}).FirstOrDefaultAsync();
return (list, signInfo!);
}
/// <summary>
/// 父问题 下拉框选项 需要排除自己 、把自己设置为父亲 (互为父亲) 、是自己孙辈的(明明是自己子孙,却设置为自己父亲)
/// </summary>
/// <param name="trialQCQuestionFilterSelect"></param>
/// <returns></returns>
[HttpPost]
public async Task<List<TrialQCQuestionSelect>> GetTrialQCQuestionSelectList(TrialQCQuestionFilterSelect trialQCQuestionFilterSelect)
{
//设置父亲的时候,不允许设置为自己的孙子 这种会形成环
var initList = await _trialQcQuestionRepository.Where(t => t.TrialId == trialQCQuestionFilterSelect.TrialId)
.WhereIf(trialQCQuestionFilterSelect.TypeArray.Count() > 0, t => trialQCQuestionFilterSelect.TypeArray.Contains(t.Type))
//.WhereIf(trialQCQuestionFilterSelect.Id != null, t => t.Id != trialQCQuestionFilterSelect.Id /*&& t.ParentId != trialQCQuestionFilterSelect.Id*/)
.OrderBy(t => t.ShowOrder).ProjectTo<TrialQCQuestionSelect>(_mapper.ConfigurationProvider).ToListAsync();
//父亲的序号肯定要比自己小
if (trialQCQuestionFilterSelect.Id != null)
{
var selectItem = initList.FirstOrDefault(t => t.Id == trialQCQuestionFilterSelect.Id);
initList = initList.WhereIf(selectItem != null, t => t.Id != selectItem!.Id && t.ShowOrder < selectItem.ShowOrder).ToList();
}
var exceptList = GetChildId(trialQCQuestionFilterSelect.Id ?? Guid.Empty, initList);
return initList.Where(t => !exceptList.Contains(t.Id)).ToList();
}
private List<Guid> GetChildId(Guid parentId, List<TrialQCQuestionSelect> list)
{
var ids = new List<Guid>();
var childIds = list.Where(t => t.ParentId == parentId).Select(t => t.Id).ToList();
foreach (var childId in childIds)
{
ids.AddRange(childId);
var childs = GetChildId(childId, list);
ids.AddRange(childs);
}
return ids;
}
public async Task VerifyIsQCConfirmedAsync(Guid trialId)
{
if (!await _repository.AnyAsync<Trial>(t => t.Id == trialId && t.QCQuestionConfirmedUserId == null))
{
throw new BusinessValidationFailedException("QC已确认不允许操作");
}
}
/// <summary>
/// 批量添加 QC 问题
/// </summary>
/// <param name="batchList"></param>
/// <param name="trialId"></param>
/// <returns></returns>
[HttpPost("{trialId:guid}")]
public async Task<IResponseOutput> BatchAddTrialQCQuestionConfigure(List<TrialQCQuestionConfigureBatchAdd> batchList, Guid trialId)
{
await VerifyIsQCConfirmedAsync(trialId);
var batchConfigList = _mapper.Map<List<TrialQCQuestion>>(batchList);
batchConfigList.ForEach(t => t.TrialId = trialId);
await _trialQcQuestionRepository.AddRangeAsync(batchConfigList);
var success = await _repository.SaveChangesAsync();
return ResponseOutput.Result(success);
}
public async Task<IResponseOutput> AddOrUpdateTrialQCQuestionConfigure(TrialQCQuestionAddOrEdit addOrEditTrialQCQuestionConfigure)
{
await VerifyIsQCConfirmedAsync(addOrEditTrialQCQuestionConfigure.TrialId);
var entity = await _trialQcQuestionRepository.InsertOrUpdateAsync(addOrEditTrialQCQuestionConfigure, true);
return ResponseOutput.Ok(entity.Id.ToString());
}
[HttpDelete("{trialId:guid}/{trialQCQuestionConfigureId:guid}")]
public async Task<IResponseOutput> DeleteTrialQCQuestionConfigure(Guid trialQCQuestionConfigureId, Guid trialId)
{
await VerifyIsQCConfirmedAsync(trialId);
if (await _trialQcQuestionRepository.AnyAsync(t => t.ParentId == trialQCQuestionConfigureId))
{
return ResponseOutput.NotOk("请先清除子问题 再删除父问题");
}
if (await _repository.AnyAsync<TrialQCQuestionAnswer>(t => t.TrialQCQuestionConfigureId == trialQCQuestionConfigureId))
{
return ResponseOutput.NotOk("已有QC审核记录不允许删除该问题项");
}
var success = await _trialQcQuestionRepository.DeleteFromQueryAsync(t => t.Id == trialQCQuestionConfigureId, true);
return ResponseOutput.Result(true);
}
}
}