using CMS.Plugin.PipeLineLems.Application.Contracts.Dtos.WorkTask; using CMS.Plugin.PipeLineLems.Application.Contracts.Services; using CMS.Plugin.PipeLineLems.Domain.Shared; using CmsQueryExtensions; using CMS.Plugin.PipeLineLems.Domain.WorkTask; using CmsQueryExtensions.Extension; using System.Linq.Expressions; using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectMapping; using CmsQueryExtensions.Entitys; 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.Id = id; //updateObj.Son_TaskCode = input.Son_TaskCode; //updateObj.TaskCode = input.TaskCode; //updateObj.WorkPlanStatus = input.WorkPlanStatus; //updateObj.CallMaterialStatus = input.CallMaterialStatus; //updateObj.DataIdentifier = input.DataIdentifier; //updateObj.MaterialMode = input.MaterialMode; //updateObj.Length = input.Length; //updateObj.MarkingContent = input.MarkingContent; //updateObj.MarkingPosition = input.MarkingPosition; //updateObj.CuttingPosition = input.CuttingPosition; //updateObj.Quantity = input.Quantity; //updateObj.FlangeThickness = input.FlangeThickness; //updateObj.FlangeInnerDiameter = input.FlangeInnerDiameter; //updateObj.WeldingHeatInput = input.WeldingHeatInput; //updateObj.PipeAllowableStress = input.PipeAllowableStress; //updateObj.PipeDiameter = input.PipeDiameter; //updateObj.PipeWallThickness = input.PipeWallThickness; //updateObj.FactoryCode = input.FactoryCode; //updateObj.ProductCode = input.ProductCode; //updateObj.WorkstationCode = input.WorkstationCode; //updateObj.EquipmentCode = input.EquipmentCode; //updateObj.ProdLineCode = input.ProdLineCode; //updateObj.ShipNumber = input.ShipNumber; //updateObj.ProjectNumber = input.ProjectNumber; //updateObj.ProcessName = input.ProcessName; //updateObj.PipeFittingCode = input.PipeFittingCode; //updateObj.PreSerialNumber = input.PreSerialNumber; //updateObj.PipeSpecCode = input.PipeSpecCode; //updateObj.PipeSectionName = input.PipeSectionName; //updateObj.OuterDiameter = input.OuterDiameter; //updateObj.Thickness = input.Thickness; //updateObj.Material = input.Material; //updateObj.ProcessRouteNumber = input.ProcessRouteNumber; //updateObj.PlannedStartTime = input.PlannedStartTime; //updateObj.PlannedEndTime = input.PlannedEndTime; //updateObj.TeamInfo = input.TeamInfo; //updateObj.Timestamp = input.Timestamp; //updateObj.Remark = input.Remark; 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) { //var workTaskUpdateDto = new WorkTaskUpdateDto { }; oldWorkTask = ObjectMapper.Map(impItem, oldWorkTask); // 等效于手动赋值所有匹配字段 //var workTaskUpdateDto = new WorkTaskUpdateDto //{ // Son_TaskCode = impItem.Son_TaskCode, // TaskCode = impItem.TaskCode, // WorkPlanStatus = impItem.WorkPlanStatus, // CallMaterialStatus = impItem.CallMaterialStatus, // DataIdentifier = impItem.DataIdentifier, // MaterialMode = impItem.MaterialMode, // Length = impItem.Length, // MarkingContent = impItem.MarkingContent, // MarkingPosition = impItem.MarkingPosition, // CuttingPosition = impItem.CuttingPosition, // Quantity = impItem.Quantity, // FlangeThickness = impItem.FlangeThickness, // FlangeInnerDiameter = impItem.FlangeInnerDiameter, // WeldingHeatInput = impItem.WeldingHeatInput, // PipeAllowableStress = impItem.PipeAllowableStress, // PipeDiameter = impItem.PipeDiameter, // PipeWallThickness = impItem.PipeWallThickness, // FactoryCode = impItem.FactoryCode, // ProductCode = impItem.ProductCode, // WorkstationCode = impItem.WorkstationCode, // EquipmentCode = impItem.EquipmentCode, // ProdLineCode = impItem.ProdLineCode, // ShipNumber = impItem.ShipNumber, // ProjectNumber = impItem.ProjectNumber, // ProcessName = impItem.ProcessName, // PipeFittingCode = impItem.PipeFittingCode, // PreSerialNumber = impItem.PreSerialNumber, // PipeSpecCode = impItem.PipeSpecCode, // PipeSectionName = impItem.PipeSectionName, // OuterDiameter = impItem.OuterDiameter, // Thickness = impItem.Thickness, // Material = impItem.Material, // ProcessRouteNumber = impItem.ProcessRouteNumber, // PlannedStartTime = impItem.PlannedStartTime, // PlannedEndTime = impItem.PlannedEndTime, // TeamInfo = impItem.TeamInfo, // Timestamp = impItem.Timestamp, // Remark = impItem.Remark, //}; workTaskUpdateDtos.Add((impItem.RowIndex, oldWorkTask.Id, oldWorkTask)); } else { var workTaskCreateDto = new WorkTaskCreateDto { }; workTaskCreateDto = ObjectMapper.Map(impItem, workTaskCreateDto); // 等效于手动赋值所有匹配字段 //var workTaskCreateDto = new WorkTaskCreateDto //{ // Son_TaskCode = impItem.Son_TaskCode, // TaskCode = impItem.TaskCode, // WorkPlanStatus = impItem.WorkPlanStatus, // CallMaterialStatus = impItem.CallMaterialStatus, // DataIdentifier = impItem.DataIdentifier, // MaterialMode = impItem.MaterialMode, // Length = impItem.Length, // MarkingContent = impItem.MarkingContent, // MarkingPosition = impItem.MarkingPosition, // CuttingPosition = impItem.CuttingPosition, // Quantity = impItem.Quantity, // FlangeThickness = impItem.FlangeThickness, // FlangeInnerDiameter = impItem.FlangeInnerDiameter, // WeldingHeatInput = impItem.WeldingHeatInput, // PipeAllowableStress = impItem.PipeAllowableStress, // PipeDiameter = impItem.PipeDiameter, // PipeWallThickness = impItem.PipeWallThickness, // FactoryCode = impItem.FactoryCode, // ProductCode = impItem.ProductCode, // WorkstationCode = impItem.WorkstationCode, // EquipmentCode = impItem.EquipmentCode, // ProdLineCode = impItem.ProdLineCode, // ShipNumber = impItem.ShipNumber, // ProjectNumber = impItem.ProjectNumber, // ProcessName = impItem.ProcessName, // PipeFittingCode = impItem.PipeFittingCode, // PreSerialNumber = impItem.PreSerialNumber, // PipeSpecCode = impItem.PipeSpecCode, // PipeSectionName = impItem.PipeSectionName, // OuterDiameter = impItem.OuterDiameter, // Thickness = impItem.Thickness, // Material = impItem.Material, // ProcessRouteNumber = impItem.ProcessRouteNumber, // PlannedStartTime = impItem.PlannedStartTime, // PlannedEndTime = impItem.PlannedEndTime, // TeamInfo = impItem.TeamInfo, // Timestamp = impItem.Timestamp, // Remark = impItem.Remark, //}; 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 oldWorkObj in workTaskUpdateDtos) { try { oldWorkObj.Item.LastModifierName = myCurrentUser.UserAccount;//修改人 await _workTaskRepository.UpdateAsync(oldWorkObj.Item); } catch (Exception e) { var errorMsg = $"导入失败!配置,第{oldWorkObj.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)); } }