using AutoMapper; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Common.MaterielEnum; using WIDESEA_Common.OrderEnum; using WIDESEA_Common.WareHouseEnum; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Helper; using WIDESEA_DTO.ERP; using WIDESEA_IBasicRepository; using WIDESEA_IOutboundRepository; using WIDESEA_IOutboundService; using WIDESEA_Model.Models; namespace WIDESEA_OutboundService { public class OutBSTOrderService : ServiceBase, IOutBSTOrderService { public IOutBSTOrderRepository Repository => BaseDal; private readonly IBasicRepository _basicRepository; private readonly IMapper _mapper; private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IOutBSTOrderDetailRepository _outBSTOrderDetailRepository; public OutBSTOrderService(IOutBSTOrderRepository BaseDal,IBasicRepository basicRepository,IMapper mapper,IUnitOfWorkManage unitOfWorkManage,IOutBSTOrderDetailRepository outBSTOrderDetailRepository) : base(BaseDal) { _basicRepository = basicRepository; _mapper = mapper; _unitOfWorkManage = unitOfWorkManage; _outBSTOrderDetailRepository = outBSTOrderDetailRepository; } /// /// 添加出库排程信息 /// public WebResponseContent AddOutBSTOrder(List bSTOutOrderDTOs) { WebResponseContent content = new WebResponseContent(); try { //新增 List outOrderDTOsAdd = bSTOutOrderDTOs.Where(x => x.Way == 1).ToList(); //修改 List outOrderDTOsUpdate = bSTOutOrderDTOs.Where(x => x.Way == 2).ToList(); //删除 List outOrderDTOsDel = bSTOutOrderDTOs.Where(x => x.Way == 3).ToList(); if (outOrderDTOsAdd.Count==0 && outOrderDTOsUpdate.Count==0 && outOrderDTOsDel.Count==0) { return content.Error($"出库排程信息传入为空"); } //获取所有出库单 List OldoutBSTOrders = BaseDal.Db.Queryable().Includes(x => x.Details).ToList(); //获取所有物料 List materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x => x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt() && x.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && x.MaterialSourceId != 0); List outBSTAddOrders = new List(); List outBSTUpOrders = new List(); List outBSTDelOrders = new List(); List outBSTOrderDetailsDel = new List(); //新增 if (outOrderDTOsAdd.Count>0) { //判断单据 Dt_OutBSTOrder? ExistAddOutOrder = OldoutBSTOrders.FirstOrDefault(x => outOrderDTOsAdd.Select(x => x.BoardMpsId).Contains(x.BoardMpsId)); if (ExistAddOutOrder != null) { return content.Error($"出库排程Id{nameof(BSTOutOrderDTO.BoardMpsId)}:{ExistAddOutOrder.BoardMpsId}已存在"); } //判断是否存在物料 List bstBoardMpsDetailItems = outOrderDTOsAdd.SelectMany(x => x.BstBoardMpsDetails).ToList(); BstBoardMpsDetailItem? bstBoardMpsDetailItem = bstBoardMpsDetailItems.FirstOrDefault(x => !materielInfos.Select(x => x.MaterialSourceId).Contains(x.MaterialId)); if (bstBoardMpsDetailItem != null) { return content.Error($"生产排程{nameof(bstBoardMpsDetailItem.BoardMpsId)}物料Id:{bstBoardMpsDetailItem.MaterialId}不存在"); } foreach (var item in outOrderDTOsAdd) { if (outOrderDTOsUpdate.FirstOrDefault(x => x.BoardMpsId == item.BoardMpsId) != null) { continue; } List bSTOrderDetails = item.BstBoardMpsDetails.Select(x => _mapper.Map(x)).ToList(); Dt_OutBSTOrder outBSTOrder = _mapper.Map(item); outBSTOrder.Details=bSTOrderDetails; outBSTAddOrders.Add(outBSTOrder); } } //修改 if (outOrderDTOsUpdate.Count > 0) { List? ExistUpdateOutBSTOrders = OldoutBSTOrders.Where(x => outOrderDTOsUpdate.Select(x => x.BoardMpsId).Contains(x.BoardMpsId)).ToList(); foreach (var item in outOrderDTOsUpdate) { Dt_OutBSTOrder? outBSTOrderUpdate = ExistUpdateOutBSTOrders.FirstOrDefault(x=>x.BoardMpsId==item.BoardMpsId); //如果订单已存在则进行更改 if (outBSTOrderUpdate != null) { if (outBSTOrderUpdate.OutBSTOrderStatus != OutOrderStatusEnum.未开始.ObjToInt()) { return content.Error($"采购{nameof(outBSTOrderUpdate.BoardMpsId)}:{outBSTOrderUpdate.BoardMpsId}订单出库中,不可更改"); } //更新数据 outBSTOrderDetailsDel.AddRange(outBSTOrderUpdate.Details); List bSTOrderDetails = item.BstBoardMpsDetails.Select(x => _mapper.Map(x)).ToList(); bSTOrderDetails.ForEach(x => { x.OutBSTOrderId = outBSTOrderUpdate.Id; }); outBSTOrderUpdate.Details = bSTOrderDetails; outBSTOrderUpdate.BoardMpsId= item.BoardMpsId; outBSTOrderUpdate.BoardMpsNo= item.BoardMpsNo; outBSTOrderUpdate.ProductionDate = DateTimeOffset.FromUnixTimeMilliseconds(item.ProductionDate).DateTime; outBSTUpOrders.Add(outBSTOrderUpdate); } else//如果不存在则进行新增 { List bSTOrderDetails = item.BstBoardMpsDetails.Select(x => _mapper.Map(x)).ToList(); Dt_OutBSTOrder outBSTOrder = _mapper.Map(item); outBSTOrder.Details = bSTOrderDetails; outBSTAddOrders.Add(outBSTOrder); } } } //删除 if (outOrderDTOsDel.Count > 0) { List? ExistDeloutBSTOrders = OldoutBSTOrders.Where(x => outOrderDTOsDel.Select(x => x.BoardMpsId).Contains(x.BoardMpsId)).ToList(); //更新的单据是否存在 if (ExistDeloutBSTOrders.Count == outOrderDTOsDel.Count) { } else { BSTOutOrderDTO? bSTOutOrderDTO = outOrderDTOsDel.FirstOrDefault(x => !ExistDeloutBSTOrders.Select(x => x.BoardMpsId).Contains(x.BoardMpsId)); return content.Error($"未找到指定生产排程单Id{nameof(BSTOutOrderDTO.BoardMpsId)}:{bSTOutOrderDTO?.BoardMpsId}"); } } _unitOfWorkManage.BeginTran(); BaseDal.Db.InsertNav(outBSTAddOrders).Include(x => x.Details).ExecuteCommand(); _outBSTOrderDetailRepository.DeleteData(outBSTOrderDetailsDel); BaseDal.Db.UpdateNav(outBSTUpOrders).Include(x => x.Details).ExecuteCommand(); _unitOfWorkManage.CommitTran(); content.OK("接收成功"); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); content.Error(ex.Message); } return content; } } }