using CMS.Plugin.PipeLineLems.Application.Contracts.Dtos.WorkTask; using CMS.Plugin.PipeLineLems.Application.Contracts.Services; using CMS.Plugin.PipeLineLems.Domain.Shared; using CMS.Plugin.PipeLineLems.Domain.WorkTask; using CmsQueryExtensions; using CmsQueryExtensions.Entitys; using CmsQueryExtensions.Extension; using System.Linq.Expressions; using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; using Volo.Abp.ObjectExtending; namespace CMS.Plugin.PipeLineLems.Application.Implements; /// /// 作业任务表应用服务 /// public class WorkTaskAppService : CMSPluginAppService, IWorkTaskAppService { private readonly IWorkTaskRepository _workTaskRepository; /// /// Initializes a new instance of the class. /// /// The task job repository. public WorkTaskAppService(IWorkTaskRepository workTaskRepository) { _workTaskRepository = workTaskRepository; } /// /// 获取指定作业任务表 /// /// /// public virtual async Task GetAsync(Guid id) { return ObjectMapper.Map(await _workTaskRepository.GetAsync(id)); } /// /// 分页获取作业任务表 /// /// /// public virtual async Task> GetListAsync(GetWorkTaskInput input) { Check.NotNull(input, nameof(input)); if (input.Sorting.IsNullOrWhiteSpace()) { input.Sorting = nameof(WorkTask.Sort); } #region 动态构造查询条件 //动态构造查询条件 var whereConditions = DynamicGetQueryParams(input); #endregion var count = await _workTaskRepository.GetCountAsync(whereConditions); var list = await _workTaskRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount); return new PagedResultDto(count, ObjectMapper.Map, List>(list)); } /// /// 动态构造查询条件 /// /// 输入参数 /// private FunReturnResultModel>> DynamicGetQueryParams(GetWorkTaskInput input) { //动态构造查询条件 var whereConditions = WhereConditionsExtensions.GetWhereConditions(input); if (!whereConditions.IsSuccess) { throw new Exception("动态构造查询条件失败:" + whereConditions.ErrMsg); } //也可再次自定义构建查询条件 Expression> extendExpression = a => a.IsDeleted == false; // 使用 System.Linq.PredicateBuilder 的 And var pres = (System.Linq.Expressions.Expression>)(whereConditions.data); whereConditions.data = System.Linq.PredicateBuilder.And(pres, extendExpression); return whereConditions; } /// /// 新建作业任务表 /// /// /// /// public virtual async Task CreateAsync(WorkTaskCreateDto input) { await CheckCreateOrUpdateDtoAsync(input); var exist = await _workTaskRepository.NameExistAsync(input.Son_TaskCode); if (exist) { throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.Son_TaskCode]); } var maxSort = await _workTaskRepository.GetMaxSortAsync(); var sort = input.Sort ?? maxSort; var insertObj = ObjectMapper.Map(input); insertObj.Sort = sort; input.MapExtraPropertiesTo(insertObj, MappingPropertyDefinitionChecks.None); insertObj.CreatorName = input.CreatorName;//创建人 await _workTaskRepository.InsertAsync(insertObj); //if (input.Sort.HasValue && insertObj.Sort != maxSort) //{ // await AdjustSortAsync(insertObj.Id, insertObj.Sort); //} return ObjectMapper.Map(insertObj); } /// /// 更新作业任务表 /// /// /// /// /// public virtual async Task UpdateAsync(Guid id, WorkTaskUpdateDto input) { await CheckCreateOrUpdateDtoAsync(input); var updateObj = await _workTaskRepository.GetAsync(id); var exist = await _workTaskRepository.NameExistAsync(input.Son_TaskCode, updateObj.Id); if (exist) { throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.Son_TaskCode]); } updateObj.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp); input.MapExtraPropertiesTo(updateObj, MappingPropertyDefinitionChecks.None); // 批量赋值所有可映射字段(通过匿名对象) updateObj = ObjectMapper.Map(input, updateObj); // 等效于手动赋值所有匹配字段 updateObj.LastModifierName = input.LastModifierName;//修改人 await _workTaskRepository.UpdateAsync(updateObj); return ObjectMapper.Map(updateObj); } /// /// 克隆作业任务表 /// /// /// public async Task> CloneAsync(IEnumerable ids, MyCurrentUser myCurrentUser) { //var workTasks = new List(); //if (ids != null) //{ // var sort = await _workTaskRepository.GetMaxSortAsync(); // foreach (var id in ids) // { // var WorkTask = await _workTaskRepository.FindAsync(id); // if (WorkTask != null) // { // var name = WorkTask.Name + WorkTaskConsts.CloneTag; // var notExist = false; // while (!notExist) // { // var exist = await _workTaskRepository.NameExistAsync(name); // if (exist || workTasks.Any(x => x.Name == name)) // { // name += WorkTaskConsts.CloneTag; // continue; // } // notExist = true; // } // //WorkTask = await _workTaskRepository.InsertAsync(WorkTask.Clone(GuidGenerator.Create(), name, sort++)); // workTasks.Add(WorkTask); // } // } //} //return ObjectMapper.Map, List>(workTasks); return new List(); } /// /// 删除单个作业任务表 /// /// /// public virtual Task DeleteAsync(Guid id) { return _workTaskRepository.DeleteAsync(id); } /// /// 删除多个作业任务表 /// /// /// public async Task DeleteManyAsync(IEnumerable ids, MyCurrentUser myCurrentUser) { foreach (var id in ids) { await DeleteAsync(id); } } /// /// 物理删除作业任务表 /// /// 主键ID /// /// public virtual async Task DeletePermanentlyAsync(Guid id, MyCurrentUser myCurrentUser, CancellationToken cancellationToken = default) { _workTaskRepository.DeletePermanentlyAsync(id); } /// /// 批量物理删除作业任务表(直接删除,不软删除) /// /// 要删除的主键ID列表 /// /// public virtual async Task BatchDeletePermanentlyAsync(IEnumerable ids, MyCurrentUser myCurrentUser, CancellationToken cancellationToken = default) { _workTaskRepository.BatchDeletePermanentlyAsync(ids); } /// /// 调整排序作业任务表 /// /// /// /// public virtual async Task AdjustSortAsync(Guid id, int sort) { var list = await _workTaskRepository.GetListAsync(null, nameof(WorkTask.Sort)); if (list != null && list.Any()) { var initSort = 1; list.ForEach(x => x.AdjustSort(initSort++)); var entity = list.FirstOrDefault(x => x.Id == id); if (entity != null) { if (sort == 1) { list.Where(x => x.Id != id).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1)); } else if (entity.Sort > sort) { list.Where(x => x.Id != id && x.Sort >= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1)); list.Where(x => x.Id != id && x.Sort < sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1)); } else if (entity.Sort < sort) { list.Where(x => x.Id != id && x.Sort > sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1)); list.Where(x => x.Id != id && x.Sort <= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1)); } entity.AdjustSort(sort); } } await _workTaskRepository.UpdateManyAsync(list); } /// /// 导入作业任务表 /// /// /// /// public async Task ImportAsync(WorkTasksImportModel input, MyCurrentUser myCurrentUser) { Check.NotNull(input, nameof(input)); var workTaskCreateDtos = new List<(int RowIndex, WorkTaskCreateDto Item)>(); var workTaskUpdateDtos = new List<(int RowIndex, Guid Id, WorkTask Item)>(); var importItems = input.WorkTasks; if (importItems != null && importItems.Any()) { #region 导入校验 // 判断名称是否重复,并输出第几行重复 var duplicateWorkTasks = importItems.GroupBy(x => x.Son_TaskCode).Where(x => x.Count() > 1).ToList(); if (duplicateWorkTasks?.Any() == true) { var duplicateWorkTaskMsgs = duplicateWorkTasks.Select(x => $"第 {string.Join(",", x.Select(x => x.RowIndex))} 行:{x.Key} 名称重复"); var errorMsg = $"导入失败!配置, {string.Join(",", duplicateWorkTaskMsgs)},终止导入"; throw new UserFriendlyException(errorMsg); } #endregion foreach (var impItem in importItems) { if (impItem.Son_TaskCode.IsNullOrWhiteSpace()) { continue; } if (impItem.Son_TaskCode.IsNullOrWhiteSpace()) { var errorMsg = $"导入失败!配置,第{impItem.RowIndex}行:WorkTask名称不能为空"; throw new UserFriendlyException(errorMsg); } var oldWorkTask = await _workTaskRepository.FindByNameAsync(impItem.Son_TaskCode); if (oldWorkTask != null) { oldWorkTask = ObjectMapper.Map(impItem, oldWorkTask); // 等效于手动赋值所有匹配字段 workTaskUpdateDtos.Add((impItem.RowIndex, oldWorkTask.Id, oldWorkTask)); } else { var workTaskCreateDto = new WorkTaskCreateDto { }; workTaskCreateDto = ObjectMapper.Map(impItem, workTaskCreateDto); // 等效于手动赋值所有匹配字段 workTaskCreateDtos.Add((impItem.RowIndex, workTaskCreateDto)); } } } // 新增 foreach (var workTaskDto in workTaskCreateDtos) { try { workTaskDto.Item.CreatorName = myCurrentUser.UserAccount;//创建人 await CreateAsync(workTaskDto.Item); } catch (Exception e) { var errorMsg = $"导入失败!配置,第{workTaskDto.RowIndex}行:{e.Message},终止导入"; throw new UserFriendlyException(errorMsg); } } // 更新 foreach (var workTaskDto in workTaskUpdateDtos) { try { workTaskDto.Item.LastModifierName = myCurrentUser.UserAccount;//修改人 await _workTaskRepository.UpdateAsync(workTaskDto.Item); } catch (Exception e) { var errorMsg = $"导入失败!配置,第{workTaskDto.RowIndex}行:{e.Message},终止导入"; throw new UserFriendlyException(errorMsg); } } } /// /// 导出作业任务表 /// /// /// public async Task<(Dictionary Sheets, string FileName)> ExportAsync(GetWorkTaskInput input) { Check.NotNull(input, nameof(input)); if (input.Sorting.IsNullOrWhiteSpace()) { input.Sorting = nameof(WorkTask.Sort); } #region 动态构造查询条件 //动态构造查询条件 var whereConditions = DynamicGetQueryParams(input); #endregion var list = await _workTaskRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount, includeDetails: true); var result = ObjectMapper.Map, List>(list); var sheets = new Dictionary { ["配置"] = ExportHelper.ConvertListToExportData(result), }; var fileName = "作业任务"; return (sheets, fileName); } /// /// 校验作业任务表,当新建或更新时 /// /// /// protected Task CheckCreateOrUpdateDtoAsync(WorkTaskCreateOrUpdateDtoBase input) { Check.NotNull(input, nameof(input)); Check.NotNullOrWhiteSpace(input.Son_TaskCode, "子任务编码", 256); Check.NotNullOrWhiteSpace(input.TaskCode, "任务编码", 256); Check.NotNull(input.WorkPlanStatus, "计划状态"); Check.NotNull(input.CallMaterialStatus, "叫料状态"); Check.NotNull(input.Length, "长度(mm)"); Check.NotNull(input.MarkingPosition, "打码位置"); Check.NotNull(input.CuttingPosition, "切割位置"); Check.NotNull(input.Quantity, "管段数量"); Check.NotNull(input.FlangeThickness, "法兰厚度(mm)"); Check.NotNull(input.FlangeInnerDiameter, "法兰直径(mm)"); Check.NotNull(input.PipeDiameter, "套管长度(mm)"); Check.NotNull(input.PipeWallThickness, "套管直径(mm)"); Check.NotNull(input.OuterDiameter, "外径(mm)"); Check.NotNull(input.Thickness, "壁厚(mm)"); return Task.CompletedTask; } /// /// 根据条件获取作业任务表列表 /// /// /// /// public async Task> GetListByFilterAsync(Expression> whereConditions, CancellationToken cancellationToken = default) { return await _workTaskRepository.GetListByFilterAsync(whereConditions); } /// /// 根据条件获取单个作业任务表 /// /// /// 是否查询出多条就报错 /// /// /// public async Task GetSingleByFilterAsync(Expression> whereConditions, bool is​MultipleThrowException = false, CancellationToken cancellationToken = default) { return await _workTaskRepository.GetSingleByFilterAsync(whereConditions, is​MultipleThrowException); } /// /// 根据条件获取作业任务表列表 /// /// /// public virtual async Task> FindListByFilterAsync(GetWorkTaskInput input, CancellationToken cancellationToken = default) { Check.NotNull(input, nameof(input)); if (input.Sorting.IsNullOrWhiteSpace()) { input.Sorting = nameof(WorkTask.Sort); } #region 动态构造查询条件 //动态构造查询条件 var whereConditions = DynamicGetQueryParams(input); #endregion var list = await _workTaskRepository.GetListByFilterAsync(whereConditions?.data); return new List(ObjectMapper.Map, List>(list)); } /// /// 根据条件获取单个作业任务表 /// /// /// public virtual async Task FindSingleByFilterAsync(GetWorkTaskInput input, CancellationToken cancellationToken = default) { Check.NotNull(input, nameof(input)); if (input.Sorting.IsNullOrWhiteSpace()) { input.Sorting = nameof(WorkTask.Sort); } #region 动态构造查询条件 //动态构造查询条件 var whereConditions = DynamicGetQueryParams(input); #endregion var dataObj = await _workTaskRepository.GetSingleByFilterAsync(whereConditions?.data); return (ObjectMapper.Map(dataObj)); } }