schangxiang@126.com
2025-05-10 8372214fbc4db844645b846b286c441c1822af3d
第一版提交
已修改6个文件
1432 ■■■■■ 文件已修改
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Services/IWorkPlanAppService.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/MesAppService.cs 288 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/WorkPlanAppService.cs 862 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/MapperProfiles/WorkPlanAutoMapperProfile.cs 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems/CMSPluginEntry.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems/Controller/WorkPlanController.cs 271 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Services/IWorkPlanAppService.cs
@@ -42,5 +42,7 @@
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWorkPlanInput input);
    Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWorkPlanInput input);
    Task<MesOrderResponse> CreatebyApsAsync(List<WorkPlanInput> input);
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/MesAppService.cs
@@ -1,164 +1,164 @@
//using CMS.Plugin.FormulaManagement.Abstractions;
//using CMS.Plugin.OrderManagement.Abstractions;
//using CMS.Plugin.OrderManagement.Abstractions.Enums;
//using CMS.Plugin.OrderManagement.Abstractions.Models;
//using CMS.Plugin.PipeLineLems.Application.Contracts.Dtos.WorkPlan;
//using CMS.Plugin.PipeLineLems.Application.Contracts.Services;
//using CMS.Plugin.PipeLineLems.Domain.WorkPlan;
//using CMS.Plugin.ProductManagement.Abstractions;
//using Microsoft.Extensions.DependencyInjection;
//using Volo.Abp;
using CMS.Plugin.FormulaManagement.Abstractions;
using CMS.Plugin.OrderManagement.Abstractions;
using CMS.Plugin.OrderManagement.Abstractions.Enums;
using CMS.Plugin.OrderManagement.Abstractions.Models;
using CMS.Plugin.PipeLineLems.Application.Contracts.Dtos.WorkPlan;
using CMS.Plugin.PipeLineLems.Application.Contracts.Services;
using CMS.Plugin.PipeLineLems.Domain.WorkPlan;
using CMS.Plugin.ProductManagement.Abstractions;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp;
//namespace CMS.Plugin.PipeLineLems.Application.Implements;
namespace CMS.Plugin.PipeLineLems.Application.Implements;
//public class MesAppService : CMSPluginAppService, IMesAppService
//{
//    private readonly IServiceProvider _serviceProvider;
//    private readonly IWorkPlanAppService _workPlanAppService;
public class SharedService : CMSPluginAppService
{
    private readonly IServiceProvider _serviceProvider;
    private readonly IWorkPlanAppService _workPlanAppService;
//    //private readonly IEventBus _eventBus;
    //private readonly IEventBus _eventBus;
//    public MesAppService(IServiceProvider serviceProvider
//        , IWorkPlanAppService workPlanAppService
//        //, IEventBus eventBus
//        )
//    {
//        _serviceProvider = serviceProvider;
//        // _eventBus = eventBus;
//        _workPlanAppService = workPlanAppService;
//    }
    public SharedService(IServiceProvider serviceProvider
        , IWorkPlanAppService workPlanAppService
        //, IEventBus eventBus
        )
    {
        _serviceProvider = serviceProvider;
        // _eventBus = eventBus;
        _workPlanAppService = workPlanAppService;
    }
//    public async Task<MesOrderResponse> CreateAsync(List<WorkPlanInput> input)
//    {
//        if (input == null)
//        {
//            throw new UserFriendlyException("输入参数不能为空");
//        }
    public async Task<MesOrderResponse> CreateAsync(List<WorkPlanInput> input)
    {
        if (input == null)
        {
            throw new UserFriendlyException("输入参数不能为空");
        }
//        if (input.Count == 0)
//        {
//            throw new UserFriendlyException("输入参数Data不能为空");
//        }
        if (input.Count == 0)
        {
            throw new UserFriendlyException("输入参数Data不能为空");
        }
//        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);
//        foreach (var gTask in groupTask)
//        {
//            var taskCode = gTask.Key;
//            var order = await orderManager.GetByCodeAsync(taskCode);
//            if (order != null)
//            {
//                throw new UserFriendlyException($"任务编号[{taskCode}]已存在");
//            }
        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);
        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);
//            //if (product == null)
//            //{
//            //    throw new UserFriendlyException($"产品名称[{orderItem.PipeSectionName}]不存在");
//            //}
            //var product = await productProvider.FindByNameAsync(orderItem.PipeSectionName);
            //if (product == null)
            //{
            //    throw new UserFriendlyException($"产品名称[{orderItem.PipeSectionName}]不存在");
            //}
//            //var formula = await formulaProvider.GetFormulaAsync(product.Id);
//            //if (formula == null)
//            //{
//            //    throw new UserFriendlyException($"产品型号[{orderItem.MaterialCode}]无关联配方");
//            //}
//            //首先要创建 打码切割的工单
//            var productForCut = await productProvider.FindByNameAsync("切割原料管");
//            if (productForCut == null)
//            {
//                throw new UserFriendlyException($"产品名称[切割原料管]不存在");
//            }
//            var formulaForCut = await formulaProvider.GetFormulaAsync(productForCut.Id);
//            if (formulaForCut == null)
//            {
//                throw new UserFriendlyException($"产品名称[切割原料管]无关联配方");
//            }
//            //分组数据
//            var group = gTask.ToList().GroupBy(x => x.DataIdentifier);
//            foreach (var item in group)
//            {
//                OrderModel orderModelForCut = new OrderModel()
//                {
//                    Id = Guid.NewGuid(),
//                    Code = "Cut_" + taskCode,
//                    Source = "APS推送",
//                    PlanStartTime = gTask.ToList().First().PlannedStartTime,
//                    PlanFinishTime = gTask.ToList().First().PlannedEndTime,
//                    PlanQty = (ulong)item.ToList().Count,
//                    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;//长度
            //var formula = await formulaProvider.GetFormulaAsync(product.Id);
            //if (formula == null)
            //{
            //    throw new UserFriendlyException($"产品型号[{orderItem.MaterialCode}]无关联配方");
            //}
            //首先要创建 打码切割的工单
            var productForCut = await productProvider.FindByNameAsync("切割原料管");
            if (productForCut == null)
            {
                throw new UserFriendlyException($"产品名称[切割原料管]不存在");
            }
            var formulaForCut = await formulaProvider.GetFormulaAsync(productForCut.Id);
            if (formulaForCut == null)
            {
                throw new UserFriendlyException($"产品名称[切割原料管]无关联配方");
            }
            //分组数据
            var group = gTask.ToList().GroupBy(x => x.DataIdentifier);
            foreach (var item in group)
            {
                OrderModel orderModelForCut = new OrderModel()
                {
                    Id = Guid.NewGuid(),
                    Code = "Cut_" + taskCode,
                    Source = "APS推送",
                    PlanStartTime = gTask.ToList().First().PlannedStartTime,
                    PlanFinishTime = gTask.ToList().First().PlannedEndTime,
                    PlanQty = (ulong)item.ToList().Count,
                    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;//长度
//                var orderForCut = await orderManager.GetByCodeAsync(orderModelForCut.Code);
//                if (orderForCut != null)
//                {
//                    //throw new UserFriendlyException($"工单[{orderModelForCut.Code}]已存在");
//                    //不再抛异常,直接跳过
//                    break;
//                }
                var orderForCut = await orderManager.GetByCodeAsync(orderModelForCut.Code);
                if (orderForCut != null)
                {
                    //throw new UserFriendlyException($"工单[{orderModelForCut.Code}]已存在");
                    //不再抛异常,直接跳过
                    break;
                }
//                var orderModelResultForCut = await orderManager.CreateAsync(orderModelForCut);
//                if (orderModelResultForCut == null)
//                {
//                    throw new UserFriendlyException($"工单[{orderModelForCut.Code}]创建失败");
//                }
//                orderModels.Add(orderModelResultForCut);
                var orderModelResultForCut = await orderManager.CreateAsync(orderModelForCut);
                if (orderModelResultForCut == null)
                {
                    throw new UserFriendlyException($"工单[{orderModelForCut.Code}]创建失败");
                }
                orderModels.Add(orderModelResultForCut);
//                //OrderModel orderModel = new OrderModel();
//                //orderModel.Id = Guid.NewGuid();
//                //orderModel.Code = orderItem.TaskCode;
//                //orderModel.Source = "APS推送";
//                //orderModel.Product = new AssociationProductModel() { Id = product.Id, Name = product.Name, Model = product.Model, ShortNumber = product.ShortNumber };
//                ////orderModel.Formula = new AssociationFormulaModel() { Id = formula.Id, Code = formula.Code, Name = formula.Name };
//                //orderModel.PlanStartTime = orderItem.PlannedStartTime;
//                //orderModel.PlanFinishTime = orderItem.PlannedEndTime;
//                //orderModel.PlanQty = (ulong?)orderItem.OrderQty;
//                //orderModel.Status = OrderStatus.NotActive;
//                //orderModel.ExtraProperties["Source"] = "ddd";
//                //var source = orderModel.ExtraProperties["Source"];
//                //var orderModelResult = await orderManager.CreateAsync(orderModel);
//                //if (orderModelResult == null)
//                //{
//                //    throw new UserFriendlyException($"工单[{orderItem.TaskCode}]创建失败");
//                //}
//                //orderModels.Add(orderModelResult);
//            }
                //OrderModel orderModel = new OrderModel();
                //orderModel.Id = Guid.NewGuid();
                //orderModel.Code = orderItem.TaskCode;
                //orderModel.Source = "APS推送";
                //orderModel.Product = new AssociationProductModel() { Id = product.Id, Name = product.Name, Model = product.Model, ShortNumber = product.ShortNumber };
                ////orderModel.Formula = new AssociationFormulaModel() { Id = formula.Id, Code = formula.Code, Name = formula.Name };
                //orderModel.PlanStartTime = orderItem.PlannedStartTime;
                //orderModel.PlanFinishTime = orderItem.PlannedEndTime;
                //orderModel.PlanQty = (ulong?)orderItem.OrderQty;
                //orderModel.Status = OrderStatus.NotActive;
                //orderModel.ExtraProperties["Source"] = "ddd";
                //var source = orderModel.ExtraProperties["Source"];
                //var orderModelResult = await orderManager.CreateAsync(orderModel);
                //if (orderModelResult == null)
                //{
                //    throw new UserFriendlyException($"工单[{orderItem.TaskCode}]创建失败");
                //}
                //orderModels.Add(orderModelResult);
            }
//        }
        }
//        //保存到表中
//        foreach (var item in input)
//        {
//            var insertObj = ObjectMapper.Map<WorkPlanInput, WorkPlanCreateDto>(item);
//            insertObj.OrgMaterialCode = "1111";
//            insertObj.Sort = 1;
//            await _workPlanAppService.CreateAsync(insertObj);
//        }
        //保存到表中
        foreach (var item in input)
        {
            var insertObj = ObjectMapper.Map<WorkPlanInput, WorkPlanCreateDto>(item);
            //insertObj.OrgMaterialCode = "1111";
            insertObj.Sort = 1;
            await _workPlanAppService.CreateAsync(insertObj);
        }
//        // 发布事件
//        //await _eventBus.PublishAsync(new EntityChangedEto("MESCREATE", input, null, EntityChangeType.Add, true));
        // 发布事件
        //await _eventBus.PublishAsync(new EntityChangedEto("MESCREATE", input, null, EntityChangeType.Add, true));
//        var response = new MesOrderResponse
//        {
//            Code = "000000",
//            Data = orderModels,
//            Fail = false,
//            Mesg = "处理成功",
//            Success = true,
//            Time = DateTime.UtcNow
//        };
//        return response;
//    }
//}
        var response = new MesOrderResponse
        {
            Code = "000000",
            Data = orderModels,
            Fail = false,
            Mesg = "处理成功",
            Success = true,
            Time = DateTime.UtcNow
        };
        return response;
    }
}
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/WorkPlanAppService.cs
@@ -1,127 +1,135 @@
using CMS.Plugin.PipeLineLems.Application.Contracts.Dtos.WorkPlan;
using CMS.Plugin.PipeLineLems.Application.Contracts.Services;
using CMS.Plugin.PipeLineLems.Domain.Shared;
using CmsQueryExtensions;
using CMS.Plugin.PipeLineLems.Domain.WorkPlan;
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;
namespace CMS.Plugin.PipeLineLems.Application.Implements;
using CMS.Plugin.PipeLineLems.Application.Contracts.Dtos.WorkPlan;
using CMS.Plugin.PipeLineLems.Application.Contracts.Services;
using CMS.Plugin.PipeLineLems.Domain.Shared;
using CmsQueryExtensions;
using CMS.Plugin.PipeLineLems.Domain.WorkPlan;
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 CMS.Plugin.FormulaManagement.Abstractions;
using CMS.Plugin.OrderManagement.Abstractions.Enums;
using CMS.Plugin.OrderManagement.Abstractions.Models;
using CMS.Plugin.OrderManagement.Abstractions;
using CMS.Plugin.ProductManagement.Abstractions;
using Microsoft.Extensions.DependencyInjection;
namespace CMS.Plugin.PipeLineLems.Application.Implements;
/// <summary> 
/// 作业计划表应用服务 
/// </summary> 
public class WorkPlanAppService : CMSPluginAppService, IWorkPlanAppService
{
    private readonly IWorkPlanRepository workPlanRepository;
public class WorkPlanAppService : CMSPluginAppService, IWorkPlanAppService
{
    private readonly IWorkPlanRepository workPlanRepository;
    private readonly IServiceProvider _serviceProvider;
    /// <summary> 
    /// Initializes a new instance of the <see cref="WorkPlanAppService"/> class. 
    /// </summary> 
    /// <param name="WorkPlanRepository">The task job repository.</param> 
    public WorkPlanAppService(IWorkPlanRepository _WorkPlanRepository)
    {
        workPlanRepository = _WorkPlanRepository;
    }
    public WorkPlanAppService(IWorkPlanRepository _WorkPlanRepository, IServiceProvider serviceProvider)
    {
        workPlanRepository = _WorkPlanRepository;
        _serviceProvider = serviceProvider;
    }
    /// <summary> 
    /// 获取指定作业计划表 
    /// </summary> 
    /// <param name="id"></param> 
    /// <returns></returns> 
    public virtual async Task<WorkPlanDto> GetAsync(Guid id)
    {
        return ObjectMapper.Map<WorkPlan, WorkPlanDto>(await workPlanRepository.GetAsync(id));
    }
    public virtual async Task<WorkPlanDto> GetAsync(Guid id)
    {
        return ObjectMapper.Map<WorkPlan, WorkPlanDto>(await workPlanRepository.GetAsync(id));
    }
    /// <summary> 
    /// 分页获取作业计划表 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    public virtual async Task<PagedResultDto<WorkPlanDto>> GetListAsync(GetWorkPlanInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WorkPlan.Sort);
        }
    public virtual async Task<PagedResultDto<WorkPlanDto>> GetListAsync(GetWorkPlanInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WorkPlan.Sort);
        }
        #region 动态构造查询条件  
        //动态构造查询条件  
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var count = await workPlanRepository.GetCountAsync(whereConditions);
        var list = await workPlanRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount);
        return new PagedResultDto<WorkPlanDto>(count, ObjectMapper.Map<List<WorkPlan>, List<WorkPlanDto>>(list));
    }
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var count = await workPlanRepository.GetCountAsync(whereConditions);
        var list = await workPlanRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount);
        return new PagedResultDto<WorkPlanDto>(count, ObjectMapper.Map<List<WorkPlan>, List<WorkPlanDto>>(list));
    }
    /// <summary>  
    /// 动态构造查询条件  
    /// </summary>  
    /// <param name="input">输入参数</param>  
    /// <returns></returns>  
    private FunReturnResultModel<Expression<Func<WorkPlan, bool>>> DynamicGetQueryParams(GetWorkPlanInput input)
    {
    private FunReturnResultModel<Expression<Func<WorkPlan, bool>>> DynamicGetQueryParams(GetWorkPlanInput input)
    {
        //动态构造查询条件  
        var whereConditions = WhereConditionsExtensions.GetWhereConditions<WorkPlan, GetWorkPlanInput>(input);
        if (!whereConditions.IsSuccess)
        {
            throw new Exception("动态构造查询条件失败:" + whereConditions.ErrMsg);
        }
        var whereConditions = WhereConditionsExtensions.GetWhereConditions<WorkPlan, GetWorkPlanInput>(input);
        if (!whereConditions.IsSuccess)
        {
            throw new Exception("动态构造查询条件失败:" + whereConditions.ErrMsg);
        }
        //也可再次自定义构建查询条件  
        Expression<Func<WorkPlan, bool>> extendExpression = a => a.IsDeleted == false;
        Expression<Func<WorkPlan, bool>> extendExpression = a => a.IsDeleted == false;
        // 使用 System.Linq.PredicateBuilder 的 And 
        var pres = (System.Linq.Expressions.Expression<Func<WorkPlan, bool>>)(whereConditions.data);
        whereConditions.data = System.Linq.PredicateBuilder.And(pres, extendExpression);
        return whereConditions;
    }
        var pres = (System.Linq.Expressions.Expression<Func<WorkPlan, bool>>)(whereConditions.data);
        whereConditions.data = System.Linq.PredicateBuilder.And(pres, extendExpression);
        return whereConditions;
    }
    /// <summary> 
    /// 新建作业计划表 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    /// <exception cref="UserFriendlyException"></exception> 
    public virtual async Task<WorkPlanDto> CreateAsync(WorkPlanCreateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var exist = await workPlanRepository.NameExistAsync(input.TaskCode);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.TaskCode]);
        }
        var maxSort = await workPlanRepository.GetMaxSortAsync();
        var sort = input.Sort ?? maxSort;
        var insertObj = ObjectMapper.Map<WorkPlanCreateDto, WorkPlan>(input);
        insertObj.Sort = sort;
        input.MapExtraPropertiesTo(insertObj, MappingPropertyDefinitionChecks.None);
        await workPlanRepository.InsertAsync(insertObj);
    public virtual async Task<WorkPlanDto> CreateAsync(WorkPlanCreateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var exist = await workPlanRepository.NameExistAsync(input.TaskCode);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.TaskCode]);
        }
        var maxSort = await workPlanRepository.GetMaxSortAsync();
        var sort = input.Sort ?? maxSort;
        var insertObj = ObjectMapper.Map<WorkPlanCreateDto, WorkPlan>(input);
        insertObj.Sort = sort;
        input.MapExtraPropertiesTo(insertObj, MappingPropertyDefinitionChecks.None);
        await workPlanRepository.InsertAsync(insertObj);
        //if (input.Sort.HasValue && insertObj.Sort != maxSort) 
        //{ 
        //    await AdjustSortAsync(insertObj.Id, insertObj.Sort); 
        //} 
        return ObjectMapper.Map<WorkPlan, WorkPlanDto>(insertObj);
    }
        return ObjectMapper.Map<WorkPlan, WorkPlanDto>(insertObj);
    }
    /// <summary> 
    /// 更新作业计划表 
    /// </summary> 
@@ -129,21 +137,21 @@
    /// <param name="input"></param> 
    /// <returns></returns> 
    /// <exception cref="UserFriendlyException"></exception> 
    public virtual async Task<WorkPlanDto> UpdateAsync(Guid id, WorkPlanUpdateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var updateObj = await workPlanRepository.GetAsync(id);
        var exist = await workPlanRepository.NameExistAsync(input.TaskCode, updateObj.Id);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.TaskCode]);
        }
        updateObj.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
        input.MapExtraPropertiesTo(updateObj, MappingPropertyDefinitionChecks.None);
                updateObj.TaskCode = input.TaskCode;
    public virtual async Task<WorkPlanDto> UpdateAsync(Guid id, WorkPlanUpdateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var updateObj = await workPlanRepository.GetAsync(id);
        var exist = await workPlanRepository.NameExistAsync(input.TaskCode, updateObj.Id);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.TaskCode]);
        }
        updateObj.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
        input.MapExtraPropertiesTo(updateObj, MappingPropertyDefinitionChecks.None);
        updateObj.TaskCode = input.TaskCode;
        updateObj.DataIdentifier = input.DataIdentifier;
        updateObj.MaterialMode = input.MaterialMode;
        updateObj.Length = input.Length;
@@ -177,20 +185,20 @@
        updateObj.TeamInfo = input.TeamInfo;
        updateObj.Timestamp = input.Timestamp;
        updateObj.Remark = input.Remark;
        await workPlanRepository.UpdateAsync(updateObj);
        return ObjectMapper.Map<WorkPlan, WorkPlanDto>(updateObj);
    }
        await workPlanRepository.UpdateAsync(updateObj);
        return ObjectMapper.Map<WorkPlan, WorkPlanDto>(updateObj);
    }
    /// <summary> 
    /// 克隆作业计划表 
    /// </summary> 
    /// <param name="ids"></param> 
    /// <returns></returns> 
    public async Task<List<WorkPlanDto>> CloneAsync(IEnumerable<Guid> ids)
    {
    public async Task<List<WorkPlanDto>> CloneAsync(IEnumerable<Guid> ids)
    {
        //var workPlans = new List<WorkPlan>(); 
        //if (ids != null) 
        //{ 
@@ -210,285 +218,435 @@
        //                    name += WorkPlanConsts.CloneTag; 
        //                    continue; 
        //                } 
        //                notExist = true; 
        //            } 
        //            //WorkPlan = await workPlanRepository.InsertAsync(WorkPlan.Clone(GuidGenerator.Create(), name, sort++)); 
        //            workPlans.Add(WorkPlan); 
        //        } 
        //    } 
        //} 
        //return ObjectMapper.Map<List<WorkPlan>, List<WorkPlanDto>>(workPlans); 
        return new List<WorkPlanDto>();
    }
        return new List<WorkPlanDto>();
    }
    /// <summary> 
    /// 删除单个作业计划表 
    /// </summary> 
    /// <param name="id"></param> 
    /// <returns></returns> 
    public virtual Task DeleteAsync(Guid id)
    {
        return workPlanRepository.DeleteAsync(id);
    }
    public virtual Task DeleteAsync(Guid id)
    {
        return workPlanRepository.DeleteAsync(id);
    }
    /// <summary> 
    /// 删除多个作业计划表 
    /// </summary> 
    /// <param name="ids"></param> 
    /// <returns></returns> 
    public async Task DeleteManyAsync(IEnumerable<Guid> ids)
    {
        foreach (var id in ids)
        {
            await DeleteAsync(id);
        }
    }
    public async Task DeleteManyAsync(IEnumerable<Guid> ids)
    {
        foreach (var id in ids)
        {
            await DeleteAsync(id);
        }
    }
    /// <summary> 
    /// 调整排序作业计划表 
    /// </summary> 
    /// <param name="id"></param> 
    /// <param name="sort"></param> 
    /// <returns></returns> 
    public virtual async Task AdjustSortAsync(Guid id, int sort)
    {
        var list = await workPlanRepository.GetListAsync(null, nameof(WorkPlan.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 workPlanRepository.UpdateManyAsync(list);
    }
    public virtual async Task AdjustSortAsync(Guid id, int sort)
    {
        var list = await workPlanRepository.GetListAsync(null, nameof(WorkPlan.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 workPlanRepository.UpdateManyAsync(list);
    }
    /// <summary> 
    /// 导入作业计划表 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    /// <exception cref="UserFriendlyException"></exception> 
    public async Task ImportAsync(WorkPlansImportModel input)
    {
        Check.NotNull(input, nameof(input));
        var workPlanCreateDtos = new List<(int RowIndex, WorkPlanCreateDto Item)>();
        var workPlanUpdateDtos = new List<(int RowIndex, Guid Id, WorkPlanUpdateDto Item)>();
        var importItems = input.WorkPlans;
        if (importItems != null && importItems.Any())
        {
            #region 导入校验
            // 判断名称是否重复,并输出第几行重复
            var duplicateWorkPlans = importItems.GroupBy(x => x.TaskCode).Where(x => x.Count() > 1).ToList();
            if (duplicateWorkPlans?.Any() == true)
            {
                var duplicateWorkPlanMsgs = duplicateWorkPlans.Select(x => $"第 {string.Join(",", x.Select(x => x.RowIndex))} 行:{x.Key}  名称重复");
                var errorMsg = $"导入失败!配置, {string.Join(",", duplicateWorkPlanMsgs)},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
            #endregion
            foreach (var impItem in importItems)
            {
                if (impItem.TaskCode.IsNullOrWhiteSpace())
                {
                    continue;
                }
                if (impItem.TaskCode.IsNullOrWhiteSpace())
                {
                    var errorMsg = $"导入失败!配置,第{impItem.RowIndex}行:WorkPlan名称不能为空";
                    throw new UserFriendlyException(errorMsg);
                }
                var oldWorkPlan = await workPlanRepository.FindByNameAsync(impItem.TaskCode);
                if (oldWorkPlan != null)
                {
                    var workPlanUpdateDto = new WorkPlanUpdateDto
                    {
                        TaskCode = impItem.TaskCode,
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,
WorkpieceName = impItem.WorkpieceName,
ProcessName = impItem.ProcessName,
PipeFittingCode = impItem.PipeFittingCode,
PreSerialNumber = impItem.PreSerialNumber,
PipeSpecCode = impItem.PipeSpecCode,
PipeSectionName = impItem.PipeSectionName,
OuterDiameter = impItem.OuterDiameter,
Thickness = impItem.Thickness,
Material = impItem.Material,
HasMainSignature = impItem.HasMainSignature,
ProcessRouteNumber = impItem.ProcessRouteNumber,
PlannedStartTime = impItem.PlannedStartTime,
PlannedEndTime = impItem.PlannedEndTime,
TeamInfo = impItem.TeamInfo,
Timestamp = impItem.Timestamp,
Remark = impItem.Remark,
                    };
                    workPlanUpdateDtos.Add((impItem.RowIndex, oldWorkPlan.Id, workPlanUpdateDto));
                }
                else
                {
                    var workPlanCreateDto = new WorkPlanCreateDto
                    {
                        TaskCode = impItem.TaskCode,
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,
WorkpieceName = impItem.WorkpieceName,
ProcessName = impItem.ProcessName,
PipeFittingCode = impItem.PipeFittingCode,
PreSerialNumber = impItem.PreSerialNumber,
PipeSpecCode = impItem.PipeSpecCode,
PipeSectionName = impItem.PipeSectionName,
OuterDiameter = impItem.OuterDiameter,
Thickness = impItem.Thickness,
Material = impItem.Material,
HasMainSignature = impItem.HasMainSignature,
ProcessRouteNumber = impItem.ProcessRouteNumber,
PlannedStartTime = impItem.PlannedStartTime,
PlannedEndTime = impItem.PlannedEndTime,
TeamInfo = impItem.TeamInfo,
Timestamp = impItem.Timestamp,
Remark = impItem.Remark,
                    };
                    workPlanCreateDtos.Add((impItem.RowIndex, workPlanCreateDto));
                }
            }
        }
        // 新增
        foreach (var workPlanDto in workPlanCreateDtos)
        {
            try
            {
                await CreateAsync(workPlanDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{workPlanDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
        // 更新
        foreach (var workPlanDto in workPlanUpdateDtos)
        {
            try
            {
                await UpdateAsync(workPlanDto.Id, workPlanDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{workPlanDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
    }
    public async Task ImportAsync(WorkPlansImportModel input)
    {
        //转换数据
        var result = ObjectMapper.Map<List<WorkPlansImportModel.WorkPlanImportModel>, List<WorkPlanInput>>(input.WorkPlans);
        await CreatebyApsAsync(result);
    }
    public async Task<MesOrderResponse> CreatebyApsAsync(List<WorkPlanInput> input)
    {
        if (input == null)
        {
            throw new UserFriendlyException("输入参数不能为空");
        }
        if (input.Count == 0)
        {
            throw new UserFriendlyException("输入参数Data不能为空");
        }
        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);
        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);
            //if (product == null)
            //{
            //    throw new UserFriendlyException($"产品名称[{orderItem.PipeSectionName}]不存在");
            //}
            //var formula = await formulaProvider.GetFormulaAsync(product.Id);
            //if (formula == null)
            //{
            //    throw new UserFriendlyException($"产品型号[{orderItem.MaterialCode}]无关联配方");
            //}
            //首先要创建 打码切割的工单
            var productForCut = await productProvider.FindByNameAsync("切割原料管");
            if (productForCut == null)
            {
                throw new UserFriendlyException($"产品名称[切割原料管]不存在");
            }
            var formulaForCut = await formulaProvider.GetFormulaAsync(productForCut.Id);
            if (formulaForCut == null)
            {
                throw new UserFriendlyException($"产品名称[切割原料管]无关联配方");
            }
            //分组数据
            var group = gTask.ToList().GroupBy(x => x.DataIdentifier);
            foreach (var item in group)
            {
                OrderModel orderModelForCut = new OrderModel()
                {
                    Id = Guid.NewGuid(),
                    Code = "Cut_" + taskCode,
                    Source = "APS推送",
                    PlanStartTime = gTask.ToList().First().PlannedStartTime,
                    PlanFinishTime = gTask.ToList().First().PlannedEndTime,
                    PlanQty = (ulong)item.ToList().Count,
                    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;//长度
                var orderForCut = await orderManager.GetByCodeAsync(orderModelForCut.Code);
                if (orderForCut != null)
                {
                    //throw new UserFriendlyException($"工单[{orderModelForCut.Code}]已存在");
                    //不再抛异常,直接跳过
                    break;
                }
                var orderModelResultForCut = await orderManager.CreateAsync(orderModelForCut);
                if (orderModelResultForCut == null)
                {
                    throw new UserFriendlyException($"工单[{orderModelForCut.Code}]创建失败");
                }
                orderModels.Add(orderModelResultForCut);
                //OrderModel orderModel = new OrderModel();
                //orderModel.Id = Guid.NewGuid();
                //orderModel.Code = orderItem.TaskCode;
                //orderModel.Source = "APS推送";
                //orderModel.Product = new AssociationProductModel() { Id = product.Id, Name = product.Name, Model = product.Model, ShortNumber = product.ShortNumber };
                ////orderModel.Formula = new AssociationFormulaModel() { Id = formula.Id, Code = formula.Code, Name = formula.Name };
                //orderModel.PlanStartTime = orderItem.PlannedStartTime;
                //orderModel.PlanFinishTime = orderItem.PlannedEndTime;
                //orderModel.PlanQty = (ulong?)orderItem.OrderQty;
                //orderModel.Status = OrderStatus.NotActive;
                //orderModel.ExtraProperties["Source"] = "ddd";
                //var source = orderModel.ExtraProperties["Source"];
                //var orderModelResult = await orderManager.CreateAsync(orderModel);
                //if (orderModelResult == null)
                //{
                //    throw new UserFriendlyException($"工单[{orderItem.TaskCode}]创建失败");
                //}
                //orderModels.Add(orderModelResult);
            }
        }
        //保存到表中
        foreach (var item in input)
        {
            var insertObj = ObjectMapper.Map<WorkPlanInput, WorkPlanCreateDto>(item);
            //insertObj.OrgMaterialCode = "1111";
            insertObj.Sort = 1;
            await CreateAsync(insertObj);
        }
        // 发布事件
        //await _eventBus.PublishAsync(new EntityChangedEto("MESCREATE", input, null, EntityChangeType.Add, true));
        var response = new MesOrderResponse
        {
            Code = "000000",
            Data = orderModels,
            Fail = false,
            Mesg = "处理成功",
            Success = true,
            Time = DateTime.UtcNow
        };
        return response;
    }
    ///// <summary>
    ///// 导入作业计划表
    ///// </summary>
    ///// <param name="input"></param>
    ///// <returns></returns>
    ///// <exception cref="UserFriendlyException"></exception>
    //public async Task ImportAsync(WorkPlansImportModel input)
    //{
    //    Check.NotNull(input, nameof(input));
    //    var workPlanCreateDtos = new List<(int RowIndex, WorkPlanCreateDto Item)>();
    //    var workPlanUpdateDtos = new List<(int RowIndex, Guid Id, WorkPlanUpdateDto Item)>();
    //    var importItems = input.WorkPlans;
    //    if (importItems != null && importItems.Any())
    //    {
    //        #region 导入校验
    //        // 判断名称是否重复,并输出第几行重复
    //        var duplicateWorkPlans = importItems.GroupBy(x => x.TaskCode).Where(x => x.Count() > 1).ToList();
    //        if (duplicateWorkPlans?.Any() == true)
    //        {
    //            var duplicateWorkPlanMsgs = duplicateWorkPlans.Select(x => $"第 {string.Join(",", x.Select(x => x.RowIndex))} 行:{x.Key}  名称重复");
    //            var errorMsg = $"导入失败!配置, {string.Join(",", duplicateWorkPlanMsgs)},终止导入";
    //            throw new UserFriendlyException(errorMsg);
    //        }
    //        #endregion
    //        foreach (var impItem in importItems)
    //        {
    //            if (impItem.TaskCode.IsNullOrWhiteSpace())
    //            {
    //                continue;
    //            }
    //            if (impItem.TaskCode.IsNullOrWhiteSpace())
    //            {
    //                var errorMsg = $"导入失败!配置,第{impItem.RowIndex}行:WorkPlan名称不能为空";
    //                throw new UserFriendlyException(errorMsg);
    //            }
    //            var oldWorkPlan = await workPlanRepository.FindByNameAsync(impItem.TaskCode);
    //            if (oldWorkPlan != null)
    //            {
    //                var workPlanUpdateDto = new WorkPlanUpdateDto
    //                {
    //                    TaskCode = impItem.TaskCode,
    //                    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,
    //                    WorkpieceName = impItem.WorkpieceName,
    //                    ProcessName = impItem.ProcessName,
    //                    PipeFittingCode = impItem.PipeFittingCode,
    //                    PreSerialNumber = impItem.PreSerialNumber,
    //                    PipeSpecCode = impItem.PipeSpecCode,
    //                    PipeSectionName = impItem.PipeSectionName,
    //                    OuterDiameter = impItem.OuterDiameter,
    //                    Thickness = impItem.Thickness,
    //                    Material = impItem.Material,
    //                    HasMainSignature = impItem.HasMainSignature,
    //                    ProcessRouteNumber = impItem.ProcessRouteNumber,
    //                    PlannedStartTime = impItem.PlannedStartTime,
    //                    PlannedEndTime = impItem.PlannedEndTime,
    //                    TeamInfo = impItem.TeamInfo,
    //                    Timestamp = impItem.Timestamp,
    //                    Remark = impItem.Remark,
    //                };
    //                workPlanUpdateDtos.Add((impItem.RowIndex, oldWorkPlan.Id, workPlanUpdateDto));
    //            }
    //            else
    //            {
    //                var workPlanCreateDto = new WorkPlanCreateDto
    //                {
    //                    TaskCode = impItem.TaskCode,
    //                    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,
    //                    WorkpieceName = impItem.WorkpieceName,
    //                    ProcessName = impItem.ProcessName,
    //                    PipeFittingCode = impItem.PipeFittingCode,
    //                    PreSerialNumber = impItem.PreSerialNumber,
    //                    PipeSpecCode = impItem.PipeSpecCode,
    //                    PipeSectionName = impItem.PipeSectionName,
    //                    OuterDiameter = impItem.OuterDiameter,
    //                    Thickness = impItem.Thickness,
    //                    Material = impItem.Material,
    //                    HasMainSignature = impItem.HasMainSignature,
    //                    ProcessRouteNumber = impItem.ProcessRouteNumber,
    //                    PlannedStartTime = impItem.PlannedStartTime,
    //                    PlannedEndTime = impItem.PlannedEndTime,
    //                    TeamInfo = impItem.TeamInfo,
    //                    Timestamp = impItem.Timestamp,
    //                    Remark = impItem.Remark,
    //                };
    //                workPlanCreateDtos.Add((impItem.RowIndex, workPlanCreateDto));
    //            }
    //        }
    //    }
    //    // 新增
    //    foreach (var workPlanDto in workPlanCreateDtos)
    //    {
    //        try
    //        {
    //            await CreateAsync(workPlanDto.Item);
    //        }
    //        catch (Exception e)
    //        {
    //            var errorMsg = $"导入失败!配置,第{workPlanDto.RowIndex}行:{e.Message},终止导入";
    //            throw new UserFriendlyException(errorMsg);
    //        }
    //    }
    //    // 更新
    //    foreach (var workPlanDto in workPlanUpdateDtos)
    //    {
    //        try
    //        {
    //            await UpdateAsync(workPlanDto.Id, workPlanDto.Item);
    //        }
    //        catch (Exception e)
    //        {
    //            var errorMsg = $"导入失败!配置,第{workPlanDto.RowIndex}行:{e.Message},终止导入";
    //            throw new UserFriendlyException(errorMsg);
    //        }
    //    }
    //}
    /// <summary> 
    /// 导出作业计划表 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    public async Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWorkPlanInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WorkPlan.Sort);
        }
    public async Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWorkPlanInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WorkPlan.Sort);
        }
        #region 动态构造查询条件  
        //动态构造查询条件  
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var list = await workPlanRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount, includeDetails: true);
        var result = ObjectMapper.Map<List<WorkPlan>, List<WorkPlanDto>>(list);
        var sheets = new Dictionary<string, object>
        {
            ["配置"] = ExportHelper.ConvertListToExportData(result),
        };
        var fileName = "作业计划";
        return (sheets, fileName);
    }
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var list = await workPlanRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount, includeDetails: true);
        var result = ObjectMapper.Map<List<WorkPlan>, List<WorkPlanDto>>(list);
        var sheets = new Dictionary<string, object>
        {
            ["配置"] = ExportHelper.ConvertListToExportData(result),
        };
        var fileName = "作业计划";
        return (sheets, fileName);
    }
    /// <summary> 
    /// 校验作业计划表,当新建或更新时 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    protected Task CheckCreateOrUpdateDtoAsync(WorkPlanCreateOrUpdateDtoBase input)
    {
        Check.NotNull(input, nameof(input));
                Check.NotNullOrWhiteSpace(input.TaskCode, "任务编码", 256);
    protected Task CheckCreateOrUpdateDtoAsync(WorkPlanCreateOrUpdateDtoBase input)
    {
        Check.NotNull(input, nameof(input));
        Check.NotNullOrWhiteSpace(input.TaskCode, "任务编码", 256);
        Check.NotNull(input.Length, "长度(mm)");
        Check.NotNull(input.MarkingPosition, "打码位置");
        Check.NotNull(input.CuttingPosition, "切割位置");
@@ -500,7 +658,7 @@
        Check.NotNull(input.OuterDiameter, "外径(mm)");
        Check.NotNull(input.Thickness, "壁厚(mm)");
        Check.NotNull(input.HasMainSignature, "是否主支管");
        return Task.CompletedTask;
    }
}
        return Task.CompletedTask;
    }
}
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/MapperProfiles/WorkPlanAutoMapperProfile.cs
@@ -21,6 +21,9 @@
         * into multiple profile classes for a better organization. */ 
        CreateMap<WorkPlan, WorkPlanDto>(MemberList.None).MapExtraProperties(MappingPropertyDefinitionChecks.None); 
        CreateMap<WorkPlanCreateDto, WorkPlan>(MemberList.None).MapExtraProperties(MappingPropertyDefinitionChecks.None); 
        CreateMap<GetWorkPlanInput, WorkPlan>(MemberList.None).MapExtraProperties(MappingPropertyDefinitionChecks.None);
        CreateMap<GetWorkPlanInput, WorkPlan>(MemberList.None).MapExtraProperties(MappingPropertyDefinitionChecks.None);
        CreateMap<WorkPlansImportModel.WorkPlanImportModel, WorkPlan>(MemberList.None);
        CreateMap<WorkPlansImportModel.WorkPlanImportModel, WorkPlanInput>(MemberList.None);
        CreateMap<WorkPlanInput, WorkPlanCreateDto>(MemberList.None);
    } 
PipeLineLems/server/src/CMS.Plugin.PipeLineLems/CMSPluginEntry.cs
@@ -50,7 +50,7 @@
        context.Services.AddScoped<IProjectRuntimeMigrator, CMSPluginRuntimeMigrator>();
        context.Services.AddSingleton<IProjectService, PipeLineLemsProjectService>();
        //context.Services.AddScoped<IMesAppService, MesAppService>();
        context.Services.AddScoped<IWorkPlanAppService, WorkPlanAppService>();
        context.Services.AddScoped<IEFDataProvider>(p =>
        {
PipeLineLems/server/src/CMS.Plugin.PipeLineLems/Controller/WorkPlanController.cs
@@ -1,75 +1,91 @@
using Ao.Lang;
using CMS.Extensions.Abp.AspNetCore.Mvc.Filters;
using CMS.Plugin.PipeLineLems.Application.Contracts.Dtos.WorkPlan;
using CMS.Plugin.PipeLineLems.Application.Contracts.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using MiniExcelLibs;
using System.Reflection;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
namespace CMS.Plugin.PipeLineLems.Controller
{
using Ao.Lang;
using AutoMapper.Internal.Mappers;
using CMS.Extensions.Abp.AspNetCore.Mvc.Filters;
using CMS.Plugin.PipeLineLems.Application.Contracts.Dtos.WorkPlan;
using CMS.Plugin.PipeLineLems.Application.Contracts.Services;
using CMS.Plugin.PipeLineLems.Application.Implements;
using CMS.Plugin.PipeLineLems.Domain.WorkPlan;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using MiniExcelLibs;
using System.Reflection;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
namespace CMS.Plugin.PipeLineLems.Controller
{
    /// <summary> 
    /// 作业计划表服务 
    /// </summary> 
    [ApiController]
    [TypeFilter(typeof(CMSLanguageFilter))]
    [TypeFilter(typeof(CMSUowActionFilter))]
    [TypeFilter(typeof(CMSAuditActionFilter))]
    [TypeFilter(typeof(CMSExceptionFilter))]
    [Route("api/v{version:apiVersion}/PipeLineLems/[controller]")]
    public class WorkPlanController : ControllerBase
    {
        private readonly IWorkPlanAppService _workPlanAppService;
    [ApiController]
    [TypeFilter(typeof(CMSLanguageFilter))]
    [TypeFilter(typeof(CMSUowActionFilter))]
    [TypeFilter(typeof(CMSAuditActionFilter))]
    [TypeFilter(typeof(CMSExceptionFilter))]
    [Route("api/v{version:apiVersion}/PipeLineLems/[controller]")]
    public class WorkPlanController : ControllerBase
    {
        private readonly IWorkPlanAppService _workPlanAppService;
        /// <summary>
        /// 获取生产计划.
        /// </summary>
        /// <param name="input">标识符.</param>
        /// <returns></returns>
        [HttpPost]
        [Route("GetWorkPlanByAps")]
        public virtual async Task<MesOrderResponse> CreateWorkPlanByApsAsync([FromBody] List<WorkPlanInput> input)
        {
            return await _workPlanAppService.CreatebyApsAsync(input);
        }
        /// <summary> 
        /// Initializes a new instance of the <see cref="WorkPlanController"/> class. 
        /// </summary> 
        /// <param name="workPlanAppService">The workPlan application service.</param> 
        public WorkPlanController(IWorkPlanAppService workPlanAppService)
        {
            _workPlanAppService = workPlanAppService;
        }
        public WorkPlanController(IWorkPlanAppService workPlanAppService)
        {
            _workPlanAppService = workPlanAppService;
        }
        /// <summary> 
        /// 获取作业计划表 
        /// </summary> 
        /// <param name="id">标识符.</param> 
        /// <returns></returns> 
        [HttpGet]
        [Route("{id}")]
        public virtual Task<WorkPlanDto> GetAsync(Guid id)
        {
            return _workPlanAppService.GetAsync(id);
        }
        [HttpGet]
        [Route("{id}")]
        public virtual Task<WorkPlanDto> GetAsync(Guid id)
        {
            return _workPlanAppService.GetAsync(id);
        }
        /// <summary> 
        /// 分页获取作业计划表的列表. 
        /// </summary> 
        /// <param name="input">输入.</param> 
        /// <returns></returns> 
        [HttpGet]
        [Route("Page")]
        public virtual Task<PagedResultDto<WorkPlanDto>> GetListAsync([FromQuery] GetWorkPlanInput input)
        {
            return _workPlanAppService.GetListAsync(input);
        }
        [HttpGet]
        [Route("Page")]
        public virtual Task<PagedResultDto<WorkPlanDto>> GetListAsync([FromQuery] GetWorkPlanInput input)
        {
            return _workPlanAppService.GetListAsync(input);
        }
        /// <summary> 
        /// 创建作业计划表 
        /// </summary> 
        /// <param name="input">输入.</param> 
        /// <returns></returns> 
        //[Authorize] 
        [HttpPost]
        public virtual Task<WorkPlanDto> CreateAsync(WorkPlanCreateDto input)
        {
            return _workPlanAppService.CreateAsync(input);
        }
        [HttpPost]
        public virtual Task<WorkPlanDto> CreateAsync(WorkPlanCreateDto input)
        {
            return _workPlanAppService.CreateAsync(input);
        }
        /// <summary> 
        /// 更新作业计划表 
        /// </summary> 
@@ -77,112 +93,113 @@
        /// <param name="input">输入.</param> 
        /// <returns></returns> 
        //[Authorize] 
        [HttpPut]
        [Route("{id}")]
        public virtual Task<WorkPlanDto> UpdateAsync(Guid id, WorkPlanUpdateDto input)
        {
            return _workPlanAppService.UpdateAsync(id, input);
        }
        [HttpPut]
        [Route("{id}")]
        public virtual Task<WorkPlanDto> UpdateAsync(Guid id, WorkPlanUpdateDto input)
        {
            return _workPlanAppService.UpdateAsync(id, input);
        }
        /// <summary> 
        /// 克隆作业计划表 
        /// </summary> 
        /// <param name="ids">Id集合.</param> 
        /// <returns></returns> 
        //[Authorize] 
        [HttpPost]
        [Route("Clone")]
        public virtual Task<List<WorkPlanDto>> CloneAsync([FromBody] IEnumerable<Guid> ids)
        {
            return _workPlanAppService.CloneAsync(ids);
        }
        [HttpPost]
        [Route("Clone")]
        public virtual Task<List<WorkPlanDto>> CloneAsync([FromBody] IEnumerable<Guid> ids)
        {
            return _workPlanAppService.CloneAsync(ids);
        }
        /// <summary> 
        /// 删除作业计划表 
        /// </summary> 
        /// <param name="id">标识符.</param> 
        /// <returns></returns> 
        //[Authorize] 
        [HttpDelete]
        [Route("{id}")]
        public virtual Task DeleteAsync(Guid id)
        {
            return _workPlanAppService.DeleteAsync(id);
        }
        [HttpDelete]
        [Route("{id}")]
        public virtual Task DeleteAsync(Guid id)
        {
            return _workPlanAppService.DeleteAsync(id);
        }
        /// <summary> 
        /// 批量删除作业计划表 
        /// </summary> 
        /// <param name="ids">The ids.</param> 
        /// <returns></returns> 
        //[Authorize] 
        [HttpDelete]
        public virtual Task DeleteAsync([FromBody] IEnumerable<Guid> ids)
        {
            return _workPlanAppService.DeleteManyAsync(ids);
        }
        [HttpDelete]
        public virtual Task DeleteAsync([FromBody] IEnumerable<Guid> ids)
        {
            return _workPlanAppService.DeleteManyAsync(ids);
        }
        /// <summary> 
        /// 调整排序作业计划表 
        /// </summary> 
        /// <param name="id">标识符.</param> 
        /// <returns></returns> 
        [HttpPut]
        [Route("{id}/AdjustSort/{sort}")]
        public virtual Task AdjustSortAsync(Guid id, int sort)
        {
            return _workPlanAppService.AdjustSortAsync(id, sort);
        }
        [HttpPut]
        [Route("{id}/AdjustSort/{sort}")]
        public virtual Task AdjustSortAsync(Guid id, int sort)
        {
            return _workPlanAppService.AdjustSortAsync(id, sort);
        }
        /// <summary> 
        /// 导入作业计划表 
        /// </summary> 
        /// <returns></returns> 
        [Authorize]
        [HttpPost]
        [Route("Import")]
        public virtual async Task<IActionResult> ImportAsync(IFormFile file)
        {
            using var stream = new MemoryStream();
            await file.CopyToAsync(stream);
            stream.Seek(0L, SeekOrigin.Begin);
            var sheetNames = stream.GetSheetNames();
            var workPlanRows = sheetNames.Contains("配置") ? MiniExcel.Query<WorkPlansImportModel.WorkPlanImportModel>(stream, sheetName: "配置").ToList() : new();
            if (!workPlanRows.Any())
            {
                throw new UserFriendlyException("请检查导入的表格");
            }
            await _workPlanAppService.ImportAsync(new WorkPlansImportModel
            {
                WorkPlans = workPlanRows,
            });
            return Ok();
        }
        [Authorize]
        [HttpPost]
        [Route("Import")]
        public virtual async Task<IActionResult> ImportAsync(IFormFile file)
        {
            using var stream = new MemoryStream();
            await file.CopyToAsync(stream);
            stream.Seek(0L, SeekOrigin.Begin);
            var sheetNames = stream.GetSheetNames();
            var workPlanRows = sheetNames.Contains("配置") ? MiniExcel.Query<WorkPlansImportModel.WorkPlanImportModel>(stream, sheetName: "配置").ToList() : new();
            if (!workPlanRows.Any())
            {
                throw new UserFriendlyException("请检查导入的表格");
            }
            await _workPlanAppService.ImportAsync(new WorkPlansImportModel
            {
                WorkPlans = workPlanRows,
            });
            return Ok();
        }
        /// <summary> 
        /// 导出作业计划表 
        /// </summary> 
        /// <returns></returns> 
        [HttpGet]
        [Route("Export")]
        public virtual async Task<IActionResult> ExportAsync([FromQuery] GetWorkPlanInput input)
        {
            input.MaxResultCount = int.MaxValue;
            var exportData = await _workPlanAppService.ExportAsync(input);
            var templatePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"Resources/Templates/WorkPlan导出模板.xlsx");
            if (!System.IO.File.Exists(templatePath))
            {
                templatePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? string.Empty, $"Resources/Templates/WorkPlan导出模板.xlsx");
            }
            var memoryStream = new MemoryStream();
            await memoryStream.SaveAsByTemplateAsync(templatePath, exportData.Sheets);
            memoryStream.Seek(0L, SeekOrigin.Begin);
            return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { FileDownloadName = $"{exportData.FileName}_{DateTime.Now:yyyyMMddhhmmss}.xlsx" };
        }
    }
}
        [HttpGet]
        [Route("Export")]
        public virtual async Task<IActionResult> ExportAsync([FromQuery] GetWorkPlanInput input)
        {
            input.MaxResultCount = int.MaxValue;
            var exportData = await _workPlanAppService.ExportAsync(input);
            var templatePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"Resources/Templates/WorkPlan导出模板.xlsx");
            if (!System.IO.File.Exists(templatePath))
            {
                templatePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? string.Empty, $"Resources/Templates/WorkPlan导出模板.xlsx");
            }
            var memoryStream = new MemoryStream();
            await memoryStream.SaveAsByTemplateAsync(templatePath, exportData.Sheets);
            memoryStream.Seek(0L, SeekOrigin.Begin);
            return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { FileDownloadName = $"{exportData.FileName}_{DateTime.Now:yyyyMMddhhmmss}.xlsx" };
        }
    }
}