using System; 
 | 
using System.Collections.Generic; 
 | 
using System.Linq; 
 | 
using System.Text; 
 | 
using System.Threading.Tasks; 
 | 
using WIDESEA_Common.StockEnum; 
 | 
using WIDESEA_Core; 
 | 
using WIDESEA_Core.BaseServices; 
 | 
using WIDESEA_Core.Enums; 
 | 
using WIDESEA_Core.Helper; 
 | 
using WIDESEA_IOutboundRepository; 
 | 
using WIDESEA_IRecordService; 
 | 
using WIDESEA_IStockService; 
 | 
using WIDESEA_Model.Models; 
 | 
  
 | 
namespace WIDESEA_IOutboundService 
 | 
{ 
 | 
    public partial class OutStockLockInfoService 
 | 
    { 
 | 
  
 | 
        /// <summary> 
 | 
        /// 分拣 
 | 
        /// </summary> 
 | 
        /// <param name="palletCode">托盘号</param> 
 | 
        /// <returns></returns> 
 | 
        public WebResponseContent MaterialPick(string palletCode) 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(palletCode); 
 | 
                if (stockInfo == null) 
 | 
                { 
 | 
                    return WebResponseContent.Instance.Error($"未找到该托盘库存信息"); 
 | 
                } 
 | 
                if (stockInfo.StockStatus != StockStatusEmun.出库完成.ObjToInt()) 
 | 
                { 
 | 
                    return WebResponseContent.Instance.Error($"该托盘还未出库完成"); 
 | 
                } 
 | 
                List<Dt_OutStockLockInfo> outStockLockInfos = Repository.QueryData(x => x.PalletCode == palletCode && x.Status == OutLockStockStatusEnum.出库完成.ObjToInt()); 
 | 
                if (outStockLockInfos == null || outStockLockInfos.Count == 0) 
 | 
                { 
 | 
                    return WebResponseContent.Instance.Error("该托盘已全部分拣完成"); 
 | 
                } 
 | 
                for (int i = 0; i < outStockLockInfos.Count; i++) 
 | 
                { 
 | 
                    outStockLockInfos[i].Status = OutLockStockStatusEnum.拣选完成.ObjToInt(); 
 | 
                } 
 | 
                List<Dt_StockInfoDetail> beforeDetaile = stockInfo.Details.GroupBy(x => x.MaterielCode).Select(x => new Dt_StockInfoDetail { MaterielCode = x.Key, StockQuantity = x.Sum(v => v.StockQuantity) }).ToList(); 
 | 
                List<Dt_StockInfoDetail> updateDetailList = new List<Dt_StockInfoDetail>(); 
 | 
                List<Dt_StockInfoDetail> deleteDetailList = new List<Dt_StockInfoDetail>(); 
 | 
                List<Dt_StockInfoDetail> residueDetailList = new List<Dt_StockInfoDetail>(); 
 | 
                for (int i = 0; i < stockInfo.Details.Count; i++) 
 | 
                { 
 | 
                    if (stockInfo.Details[i].OutboundQuantity > 0) 
 | 
                    { 
 | 
                        if (stockInfo.Details[i].StockQuantity > stockInfo.Details[i].OutboundQuantity) 
 | 
                        { 
 | 
                            stockInfo.Details[i].StockQuantity -= stockInfo.Details[i].OutboundQuantity; 
 | 
                            updateDetailList.Add(stockInfo.Details[i]); 
 | 
                        } 
 | 
                        else 
 | 
                        { 
 | 
                            deleteDetailList.Add(stockInfo.Details[i]); 
 | 
                        } 
 | 
                    } 
 | 
                    else 
 | 
                    { 
 | 
                        residueDetailList.Add(stockInfo.Details[i]); 
 | 
                    } 
 | 
                } 
 | 
                stockInfo.StockStatus = StockStatusEmun.拣选完成.ObjToInt(); 
 | 
                List<string> mCodes = stockInfo.Details.GroupBy(x => x.MaterielCode).Select(x => x.Key).ToList(); 
 | 
                _unitOfWorkManage.BeginTran(); 
 | 
                foreach (string code in mCodes) 
 | 
                { 
 | 
                    _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, residueDetailList, updateDetailList, deleteDetailList, StockChangeTypeEnum.Outbound); 
 | 
                } 
 | 
                updateDetailList.ForEach(x => 
 | 
                { 
 | 
                    x.OutboundQuantity = 0; 
 | 
                }); 
 | 
                if (stockInfo.Details.Count > deleteDetailList.Count) 
 | 
                    _stockService.StockInfoService.Repository.UpdateData(stockInfo); 
 | 
                else 
 | 
                    _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, OperateTypeEnum.自动完成); 
 | 
                _stockService.StockInfoDetailService.Repository.DeleteAndMoveIntoHty(deleteDetailList, OperateTypeEnum.自动完成); 
 | 
                _stockService.StockInfoDetailService.Repository.UpdateData(updateDetailList); 
 | 
                //_stockService.StockInfoDetailService.Repository.DeleteData(deleteDetailList); 
 | 
                BaseDal.UpdateData(outStockLockInfos); 
 | 
                _unitOfWorkManage.CommitTran(); 
 | 
                return WebResponseContent.Instance.OK(); 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                _unitOfWorkManage.RollbackTran(); 
 | 
                return WebResponseContent.Instance.Error(ex.Message); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
} 
 |