| | |
| | | using Microsoft.Extensions.DependencyInjection; |
| | | using Volo.Abp; |
| | | using Microsoft.Extensions.DependencyInjection; |
| | | using NPOI.Util; |
| | | using CMS.Plugin.PipeLineLems.Domain.CallMaterialOrder; |
| | | using CMS.Plugin.PipeLineLems.Application.Contracts.Services; |
| | | using CMS.Plugin.PipeLineLems.Application.Contracts.Dtos.CallMaterialOrder; |
| | | using Volo.Abp.Uow; |
| | | |
| | | namespace CMS.Plugin.PipeLineLems.Application.Implements; |
| | | |
| | |
| | | public class SharedService: CMSPluginAppService |
| | | { |
| | | |
| | | public async Task<MesOrderResponse> CommonCreatebyApsAsync(List<WorkPlanInput> input, IServiceProvider _serviceProvider, WorkPlanAppService workPlanAppService) |
| | | public async Task<MesOrderResponse> CommonCreatebyApsAsync(List<WorkPlanInput> input, IServiceProvider _serviceProvider, |
| | | WorkPlanAppService workPlanAppService |
| | | ) |
| | | { |
| | | if (input == null) |
| | | { |
| | |
| | | throw new UserFriendlyException("输入参数Data不能为空"); |
| | | } |
| | | |
| | | //校验数据 |
| | | //1、原料标识相同的不能存在于两个 管段编号中 |
| | | //var validationResult = ValidateUniqueDataIdentifierPerPipeSection(input); |
| | | //if (!validationResult.isValid) |
| | | //{ |
| | | // 处理验证失败的情况 |
| | | // throw new UserFriendlyException($"验证失败: {validationResult.errorMessage}"); |
| | | // 返回错误信息给客户端或进行其他处理 |
| | | //} |
| | | |
| | | |
| | | var callMaterialOrderAppService = _serviceProvider.GetRequiredService<ICallMaterialOrderAppService>(); |
| | | |
| | | var orderManager = _serviceProvider.GetRequiredService<IOrderManager>(); |
| | | var productProvider = _serviceProvider.GetRequiredService<IProductProvider>(); |
| | | var formulaProvider = _serviceProvider.GetRequiredService<IFormulaProvider>(); |
| | | List<OrderModel> orderModels = new List<OrderModel>(); |
| | | //按照任务编号分组 |
| | | var groupTask = input.GroupBy(x => x.TaskCode); |
| | | |
| | | #region 事务 |
| | | |
| | | using var scope = _serviceProvider.CreateScope(); |
| | | var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>(); |
| | | using var uow = unitOfWorkManager.Begin(requiresNew: true); |
| | | |
| | | try |
| | | { |
| | | #region 数据处理 |
| | | |
| | | //按照 原料标识 分组 |
| | | var groupTask = input.GroupBy(x => x.DataIdentifier); |
| | | foreach (var gTask in groupTask) |
| | | { |
| | | var taskCode = gTask.Key; |
| | | var order = await orderManager.GetByCodeAsync(taskCode); |
| | | if (order != null) |
| | | { |
| | | throw new UserFriendlyException($"任务编号[{taskCode}]已存在"); |
| | | } |
| | | |
| | | |
| | | |
| | | //var product = await productProvider.FindByNameAsync(orderItem.PipeSectionName); |
| | |
| | | { |
| | | throw new UserFriendlyException($"产品名称[切割原料管]无关联配方"); |
| | | } |
| | | //分组数据 |
| | | var group = gTask.ToList().GroupBy(x => x.DataIdentifier); |
| | | //按照 管段编号 分组 |
| | | var group = gTask.ToList().GroupBy(x => x.PipeSpecCode); |
| | | foreach (var item in group) |
| | | { |
| | | var prodOrderNo = "Order_" + item.Key; |
| | | var order = await orderManager.GetByCodeAsync(prodOrderNo); |
| | | if (order != null) |
| | | { |
| | | throw new UserFriendlyException($"生产工单[{prodOrderNo}]已存在"); |
| | | } |
| | | |
| | | OrderModel orderModelForCut = new OrderModel() |
| | | { |
| | | Id = Guid.NewGuid(), |
| | | Code = "Cut_" + taskCode, |
| | | Code = prodOrderNo, |
| | | Source = "APS推送", |
| | | PlanStartTime = gTask.ToList().First().PlannedStartTime, |
| | | PlanFinishTime = gTask.ToList().First().PlannedEndTime, |
| | | PlanQty = (ulong)item.ToList().Count, |
| | | PlanQty = 1, |
| | | Status = OrderStatus.NotActive, |
| | | Product = new AssociationProductModel() { Id = productForCut.Id, Name = productForCut.Name, Model = productForCut.Model, ShortNumber = productForCut.ShortNumber }, |
| | | Formula = new AssociationFormulaModel() { Id = formulaForCut.Id, Code = formulaForCut.Code, Name = formulaForCut.Name } |
| | |
| | | orderModelForCut.ExtraProperties["OuterDiameter"] = gTask.ToList().First().OuterDiameter;//外径 |
| | | orderModelForCut.ExtraProperties["Material"] = gTask.ToList().First().Material;//材质 |
| | | orderModelForCut.ExtraProperties["Length"] = gTask.ToList().First().Length;//长度 |
| | | orderModelForCut.ExtraProperties["DataIdentifier"] = gTask.ToList().First().DataIdentifier;//原料标识 |
| | | orderModelForCut.ExtraProperties["MaterialMode"] = gTask.ToList().First().MaterialMode;//原料类型 |
| | | orderModelForCut.ExtraProperties["PipeFittingCode"] = gTask.ToList().First().PipeFittingCode;//管段编号 |
| | | |
| | | var orderForCut = await orderManager.GetByCodeAsync(orderModelForCut.Code); |
| | | if (orderForCut != null) |
| | |
| | | //orderModels.Add(orderModelResult); |
| | | } |
| | | |
| | | |
| | | //保存到 scms_callmaterialorders 表中 |
| | | CallMaterialOrderCreateDto insertObjForOrder = new CallMaterialOrderCreateDto() |
| | | { |
| | | CallMaterialStatus = Domain.Shared.Enums.CallMaterialStatusEnum.未执行, |
| | | DataIdentifier = gTask.Key, |
| | | MaterialMode = gTask.ToList().First().MaterialMode, |
| | | Quantity = 1 |
| | | }; |
| | | |
| | | await callMaterialOrderAppService.CreateAsync(insertObjForOrder); |
| | | } |
| | | |
| | | |
| | | //保存到表中 |
| | | |
| | | |
| | | //保存到 scms_workplans 表中 |
| | | foreach (var item in input) |
| | | { |
| | | var insertObj = ObjectMapper.Map<WorkPlanInput, WorkPlanCreateDto>(item); |
| | | //insertObj.OrgMaterialCode = "1111"; |
| | | insertObj.CallMaterialStatus = Domain.Shared.Enums.CallMaterialStatusEnum.未执行; |
| | | insertObj.WorkPlanStatus = Domain.Shared.Enums.WorkPlanStatusEnum.未执行; |
| | | insertObj.Sort = 1; |
| | | await workPlanAppService.CreateAsync(insertObj); |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | await uow.CompleteAsync(); |
| | | } |
| | | catch (Exception) |
| | | { |
| | | |
| | | throw; |
| | | } |
| | | finally |
| | | { |
| | | await uow.RollbackAsync(); |
| | | } |
| | | |
| | | |
| | | |
| | | #endregion |
| | | |
| | | |
| | | |
| | | // 发布事件 |
| | |
| | | return response; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 验证原料标识相同的记录不能存在于两个不同的管段编号中 |
| | | /// </summary> |
| | | /// <param name="inputs">作业计划输入参数列表</param> |
| | | /// <returns>验证结果,包含是否通过验证及错误信息</returns> |
| | | public static (bool isValid, string errorMessage) ValidateUniqueDataIdentifierPerPipeSection(List<WorkPlanInput> inputs) |
| | | { |
| | | if (inputs == null || !inputs.Any()) |
| | | { |
| | | return (true, string.Empty); |
| | | } |
| | | |
| | | // 使用Lookup分组,键为原料标识,值为对应的管段编号集合 |
| | | var dataIdentifierGroups = inputs.ToLookup(x => x.DataIdentifier, x => x.PipeSpecCode); |
| | | |
| | | foreach (var group in dataIdentifierGroups) |
| | | { |
| | | // 忽略空的原料标识 |
| | | if (string.IsNullOrEmpty(group.Key)) |
| | | { |
| | | continue; |
| | | } |
| | | |
| | | // 获取当前原料标识对应的唯一管段编号集合 |
| | | var uniquePipeSections = group.Distinct().ToList(); |
| | | |
| | | // 如果存在多个不同的管段编号,则违反规则 |
| | | if (uniquePipeSections.Count > 1) |
| | | { |
| | | return (false, $"原料标识 '{group.Key}' 存在于多个不同的管段编号中: {string.Join(", ", uniquePipeSections)}"); |
| | | } |
| | | } |
| | | |
| | | return (true, string.Empty); |
| | | } |
| | | } |