| 
using System; 
 | 
using System.Collections.Generic; 
 | 
using System.Linq; 
 | 
using System.Text; 
 | 
using System.Threading.Tasks; 
 | 
using WIDESEA_Core.BaseServices; 
 | 
using WIDESEA_DTO.ERP; 
 | 
using WIDESEA_DTO.MES; 
 | 
using WIDESEA_DTO; 
 | 
using WIDESEA_IOutboundRepository; 
 | 
using WIDESEA_IOutboundService; 
 | 
using WIDESEA_Model.Models; 
 | 
using WIDESEA_Common.OrderEnum; 
 | 
using WIDESEA_Core.Helper; 
 | 
using WIDESEA_IBasicRepository; 
 | 
using WIDESEA_Common.WareHouseEnum; 
 | 
using WIDESEA_Core; 
 | 
using WIDESEA_IStockService; 
 | 
using WIDESEA_IBasicService; 
 | 
using WIDESEA_Common.LocationEnum; 
 | 
using WIDESEA_IRecordService; 
 | 
using WIDESEA_Common.StockEnum; 
 | 
  
 | 
namespace WIDESEA_OutboundService 
 | 
{ 
 | 
    public class MesOutboundOrderService : ServiceBase<Dt_MesOutboundOrder, IMesOutboundOrderRepository>, IMesOutboundOrderService 
 | 
    { 
 | 
        private readonly IBasicRepository _basicRepository; 
 | 
        private readonly IStockService _stockService; 
 | 
        private readonly IOutStockLockInfoService _outStockLockInfoService; 
 | 
        private readonly IBasicService _basicService; 
 | 
        private readonly IRecordService _recordService; 
 | 
  
 | 
        public IMesOutboundOrderRepository Repository => BaseDal; 
 | 
  
 | 
        public MesOutboundOrderService(IMesOutboundOrderRepository BaseDal, IBasicRepository basicRepository, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IBasicService basicService, IRecordService recordService) : base(BaseDal) 
 | 
        { 
 | 
            _basicRepository = basicRepository; 
 | 
            _stockService = stockService; 
 | 
            _outStockLockInfoService = outStockLockInfoService; 
 | 
            _basicService = basicService; 
 | 
            _recordService = recordService; 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        ///  
 | 
        /// </summary> 
 | 
        /// <param name="mesOutboundOrder"></param> 
 | 
        /// <returns></returns> 
 | 
        /// <exception cref="Exception"></exception> 
 | 
        public (List<Dt_StockInfo>, Dt_MesOutboundOrder, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_MesOutboundOrder mesOutboundOrder) 
 | 
        { 
 | 
            List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>(); 
 | 
  
 | 
            List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>(); 
 | 
            List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>(); 
 | 
  
 | 
            float originalNeedQuantity = mesOutboundOrder.OrderQuantity; 
 | 
  
 | 
            float needQuantity = originalNeedQuantity; 
 | 
  
 | 
            List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(mesOutboundOrder.MaterialCode, "", mesOutboundOrder.WarehouseId); 
 | 
            if (!stockInfos.Any()) 
 | 
            { 
 | 
                throw new Exception($"未找到可分配库存"); 
 | 
            } 
 | 
            List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos, mesOutboundOrder.MaterialCode, needQuantity, out float residueQuantity); 
 | 
            mesOutboundOrder.LockQuantity += needQuantity - residueQuantity; 
 | 
            outStocks.AddRange(autoAssignStocks); 
 | 
            float assignQuantity = needQuantity - residueQuantity; 
 | 
  
 | 
            float orderQuantity = mesOutboundOrder.OrderQuantity; 
 | 
            for (int j = 0; j < autoAssignStocks.Count; j++) 
 | 
            { 
 | 
                float detailAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesOutboundOrder.MaterialCode).Sum(x => x.AssignQuantity);//出库订单明细已分配数量 
 | 
  
 | 
                float palletAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesOutboundOrder.MaterialCode && x.PalletCode == autoAssignStocks[j].PalletCode).Sum(x => x.AssignQuantity);//出库详情已分配数量 
 | 
  
 | 
                float palletOutboundQuantity = autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity); 
 | 
                if (palletAssignQuantity < palletOutboundQuantity)//如果出库详情已分配数量小于托盘已分配数量,则可以继续添加该托盘出库信息 
 | 
                { 
 | 
                    float orderDetailNeedQuantity = mesOutboundOrder.OrderQuantity - detailAssignQuantity; 
 | 
                    if (orderDetailNeedQuantity > autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity) 
 | 
                    { 
 | 
                        mesOutboundOrder.LockQuantity += autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity; 
 | 
                        Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesOutboundOrder, autoAssignStocks[j], autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity); 
 | 
                        outStockLockInfos.Add(outStockLockInfo); 
 | 
                    } 
 | 
                    else 
 | 
                    { 
 | 
                        Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesOutboundOrder, autoAssignStocks[j], mesOutboundOrder.OrderQuantity - mesOutboundOrder.LockQuantity); 
 | 
                        outStockLockInfos.Add(outStockLockInfo); 
 | 
                        mesOutboundOrder.LockQuantity = mesOutboundOrder.OrderQuantity; 
 | 
                        break; 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
            locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList())); 
 | 
  
 | 
            return (outStocks, mesOutboundOrder, outStockLockInfos, locationInfos); 
 | 
        } 
 | 
  
 | 
        public WebResponseContent LockOutboundStockDataUpdate(List<Dt_StockInfo> stockInfos, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null) 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                stockInfos.ForEach(x => { 
 | 
                    x.StockStatus = StockStatusEmun.出库锁定.ObjToInt(); 
 | 
                }); 
 | 
                _stockService.StockInfoService.Repository.UpdateData(stockInfos); 
 | 
                List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>(); 
 | 
                foreach (var item in stockInfos) 
 | 
                { 
 | 
                    stockInfoDetails.AddRange(item.Details); 
 | 
                } 
 | 
                _stockService.StockInfoDetailService.Repository.UpdateData(stockInfoDetails); 
 | 
  
 | 
                List<Dt_OutStockLockInfo> addOutStockLockInfos = outStockLockInfos.Where(x => x.Id == 0).ToList(); 
 | 
                if (addOutStockLockInfos != null && addOutStockLockInfos.Any()) 
 | 
                { 
 | 
                    if (tasks != null) 
 | 
                    { 
 | 
                        addOutStockLockInfos.ForEach(x => 
 | 
                        { 
 | 
                            x.TaskNum = tasks.FirstOrDefault(v => v.PalletCode == x.PalletCode)?.TaskNum; 
 | 
                        }); 
 | 
                    } 
 | 
  
 | 
                    _outStockLockInfoService.Repository.AddData(addOutStockLockInfos); 
 | 
                } 
 | 
                List<Dt_OutStockLockInfo> updateOutStockLockInfos = outStockLockInfos.Where(x => x.Id > 0).ToList(); 
 | 
                if (updateOutStockLockInfos != null && updateOutStockLockInfos.Any()) 
 | 
                { 
 | 
                    _outStockLockInfoService.Repository.UpdateData(updateOutStockLockInfos); 
 | 
                } 
 | 
  
 | 
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, locationStatus, LocationChangeType.OutboundAssignLocation, "", tasks?.Select(x => x.TaskNum).ToList()); 
 | 
                _basicService.LocationInfoService.Repository.UpdateLocationStatus(locationInfos, locationStatus); 
 | 
                return WebResponseContent.Instance.OK(); 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                return WebResponseContent.Instance.Error(ex.Message); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
} 
 |