From 2fbbc3ccaa4123a2d550fa64d91fa8ac25323a58 Mon Sep 17 00:00:00 2001
From: wangxinhui <wangxinhui@hnkhzn.com>
Date: 星期五, 11 七月 2025 15:32:03 +0800
Subject: [PATCH] 上传最新

---
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ErpProScrapSheetDetailService.cs |  330 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 328 insertions(+), 2 deletions(-)

diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ErpProScrapSheetDetailService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ErpProScrapSheetDetailService.cs"
index e911579..7fb5094 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ErpProScrapSheetDetailService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ErpProScrapSheetDetailService.cs"
@@ -1,13 +1,28 @@
-锘縰sing System;
+锘縰sing OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using WIDESEA_Common.LocationEnum;
+using WIDESEA_Common.OrderEnum;
+using WIDESEA_Common.StockEnum;
+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_External.ERPService;
+using WIDESEA_External.Model;
+using WIDESEA_IBasicService;
 using WIDESEA_IOutboundRepository;
 using WIDESEA_IOutboundService;
+using WIDESEA_IRecordService;
+using WIDESEA_IStockRepository;
+using WIDESEA_IStockService;
 using WIDESEA_Model.Models;
+using WIDESEA_OutboundRepository;
 
 namespace WIDESEA_OutboundService
 {
@@ -15,10 +30,321 @@
     {
         private readonly IUnitOfWorkManage _unitOfWorkManage;
         public IErpProScrapSheetDetailRepository Repository => BaseDal;
+        public IErpProScrapSheetRepository _proScrapSheetRepository;
+        public IInvokeERPService _invokeERPService;
+        public IStockRepository _stockRepository;
+        public IStockService _stockService;
+        public IOutProStockInfoService _outProStockInfoService;
+        public IBasicService _basicService;
+        public IRecordService _recordService;
 
-        public ErpProScrapSheetDetailService(IErpProScrapSheetDetailRepository BaseDal, IUnitOfWorkManage unitOfWorkManage) : base(BaseDal)
+        public ErpProScrapSheetDetailService(IErpProScrapSheetDetailRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IErpProScrapSheetRepository proScrapSheetRepository, IInvokeERPService invokeERPService, IStockRepository stockRepository, IStockService stockService, IOutProStockInfoService outProStockInfoService, IRecordService recordService) : base(BaseDal)
         {
             _unitOfWorkManage = unitOfWorkManage;
+            _proScrapSheetRepository = proScrapSheetRepository;
+            _invokeERPService = invokeERPService;
+            _stockRepository = stockRepository;
+            _stockService = stockService;
+            _outProStockInfoService = outProStockInfoService;
+            _recordService = recordService;
+        }
+        //鑾峰彇瀵瑰簲鍗曞彿鐨勬姤搴熸槑缁�
+        public List<Dt_ErpProScrapSheetDetail> GetByDetails(string scrapNo)
+        {
+            List<Dt_ErpProScrapSheetDetail> proScrapSheetDetails = _proScrapSheetRepository.Db.Queryable<Dt_ErpProScrapSheet, Dt_ErpProScrapSheetDetail>((master, detail) => master.Id == detail.ProScrapSheetId)
+                .Where((master, detail) => master.ProScrapSheetOrderNo==scrapNo)
+                .Select((master, detail) => detail)
+                .ToList();
+            return proScrapSheetDetails;
+        }
+        /// <summary>
+        /// 鎻愪氦鎶ュ簾鎿嶄綔
+        /// </summary>
+        /// <returns></returns>
+        public WebResponseContent UpProScrap(string scrapNo,int[] keys)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                //鑾峰彇鎵�鏈夌殑鎶ュ簾鏄庣粏
+                Dt_ErpProScrapSheet erpProScrapSheet = _proScrapSheetRepository.Db.Queryable<Dt_ErpProScrapSheet>().Where(x => x.ProScrapSheetOrderNo == scrapNo).Includes(x => x.Details).First();
+                if (erpProScrapSheet == null)
+                {
+                    return content.Error($"鏈壘鍒板搴旀姤搴熷崟{scrapNo}");
+                }
+                if (erpProScrapSheet.Details == null || erpProScrapSheet.Details.Count<=0)
+                {
+                    return content.Error($"鏈壘鍒板搴旀姤搴熷崟{scrapNo}鏄庣粏");
+                }
+                List<Dt_ErpProScrapSheetDetail> erpProScrapSheetDetails = erpProScrapSheet.Details.Where(x=> keys.Contains(x.Id) && x.ScrapProDetailStatus== OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()).ToList();
+                List<Dt_ErpProScrapSheetDetail> overDetails= erpProScrapSheet.Details.Where(x => x.ScrapProDetailStatus == OutOrderStatusEnum.鍏抽棴.ObjToInt()).ToList();
+                int overCount = overDetails.Count;
+                //杩涜鎶ュ簾鎻愪氦鎿嶄綔
+                if (erpProScrapSheetDetails.Count!= keys.Length)
+                {
+                    return content.Error($"鎻愪氦浜嗗凡鎶ュ簾鏄庣粏鎴栨鍦ㄥ嚭搴撲腑,璇锋鏌�");
+                }
+                if ((overCount + keys.Length) == erpProScrapSheet.Details.Count)
+                {
+                    erpProScrapSheet.ProScrapStatus = ProScrapSheetStatusEnum.Valid.ObjToInt();
+                }
+                List<ScrapSheetItem> scrapSheetItems = new List<ScrapSheetItem>();
+                foreach (var item in erpProScrapSheetDetails)
+                {
+                    item.ScrapProDetailStatus = OutOrderStatusEnum.鍏抽棴.ObjToInt();
+                    item.OverScrapPcsQty = item.ScrapPcsQty;
+                    item.OverScrapSETQty = item.ScrapSETQty;
+                    ScrapSheetItem scrapSheetItem = new ScrapSheetItem()
+                    {
+                        PartNum = item.ScrapProCode,
+                        PartRev = item.ScrapProVersion,
+                        Lotno = item.ScrapProVersion,
+                        QtyOfArray = item.ScrapSETQty,
+                        QtyOfUnit = item.ScrapPcsQty,
+                        QtyOfArray_Alloc = 0,
+                        QtyOfUnit_Alloc = 0,
+                    };
+                    scrapSheetItems.Add(scrapSheetItem);
+                }
+                _unitOfWorkManage.BeginTran();
+                _proScrapSheetRepository.UpdateData(erpProScrapSheet);
+                BaseDal.UpdateData(erpProScrapSheetDetails);
+                if (erpProScrapSheet.ProScrapStatus == ProScrapSheetStatusEnum.Valid.ObjToInt())
+                {
+                    ERPScrapSheetModel scrapSheetModel = new ERPScrapSheetModel()
+                    {
+                        Way = 1,
+                        UniqueTag = erpProScrapSheet.Id.ToString(),
+                        Code = erpProScrapSheet.ProScrapSheetOrderNo,
+                        Status = ProScrapSheetStatusEnum.Valid.ToString(),
+                        Createtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
+                        Createuser = erpProScrapSheet.Creater,
+                        WarehouseCode = WarehouseEnum.HA71.ToString(),
+                        DataItem = new List<ScrapSheetItem>()
+                    };
+                    if (overCount>0)
+                    {
+                        foreach (var item in overDetails)
+                        {
+                            ScrapSheetItem scrapSheetItem = new ScrapSheetItem()
+                            {
+                                PartNum = item.ScrapProCode,
+                                PartRev = item.ScrapProVersion,
+                                Lotno = item.ScrapProVersion,
+                                QtyOfArray = item.ScrapSETQty,
+                                QtyOfUnit = item.ScrapPcsQty,
+                                QtyOfArray_Alloc = 0,
+                                QtyOfUnit_Alloc = 0,
+                            };
+                            scrapSheetItems.Add(scrapSheetItem);
+                        }
+                    }
+                    scrapSheetModel.DataItem = scrapSheetItems;
+                    //涓婁紶ERP鎶ュ簾
+                    string response = _invokeERPService.InvokeProScrapSheetApi(scrapSheetModel);
+                    ErpRequestContent requestContent = response.DeserializeObject<ErpRequestContent>();
+                    if (requestContent.res != 1)
+                    {
+                        throw new Exception($"{requestContent.Data}");
+                    }
+                }
+                _unitOfWorkManage.CommitTran();
+                content.OK();
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                content.Error(ex.Message);
+            }
+            return content;
+        }
+        /// <summary>
+        /// 鎶ュ簾鏁版嵁澶勭悊
+        /// </summary>
+        public WebResponseContent LockOutboundStockDataUpdate(List<Dt_ProStockInfo> proStockInfos, List<Dt_ErpProScrapSheetDetail> scrapSheetDetails, List<Dt_OutProStockInfo> outProStockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null)
+        {
+            try
+            {
+                //鏇存柊搴撳瓨灞炴��
+                _stockService.ProStockInfoService.Repository.UpdateData(proStockInfos);
+                List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>();
+                foreach (var item in proStockInfos)
+                {
+                    proStockInfoDetails.AddRange(item.proStockInfoDetails);
+                }
+                //鏇存柊搴撳瓨鏄庣粏
+                proStockInfoDetails.ForEach(x => x.ProOutDetailStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt());
+                _stockService.ProStockInfoDetailService.Repository.UpdateData(proStockInfoDetails);
+                
+                BaseDal.UpdateData(scrapSheetDetails);
+
+                List<Dt_OutProStockInfo> addOutStockLockInfos = outProStockInfos.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;
+                        });
+                    }
+
+                    _outProStockInfoService.Repository.AddData(addOutStockLockInfos);
+                }
+                List<Dt_OutProStockInfo> updateOutStockLockInfos = outProStockInfos.Where(x => x.Id > 0).ToList();
+                if (updateOutStockLockInfos != null && updateOutStockLockInfos.Any())
+                {
+                    _outProStockInfoService.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);
+            }
+        }
+        public (List<Dt_ProStockInfo>, List<Dt_ErpProScrapSheetDetail>, List<Dt_OutProStockInfo>, List<Dt_LocationInfo>) AssignProStockOut(List<Dt_ErpProScrapSheetDetail> proOutOrderDetails, Dt_ErpProScrapSheet scrapSheet)
+        {
+            List<Dt_ProStockInfo> outStocks = new List<Dt_ProStockInfo>();
+            List<Dt_OutProStockInfo> outProStockInfos = new List<Dt_OutProStockInfo>();
+            List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
+            //List<Dt_ProOutOrderDetail> groupDetails = proOutOrderDetails.GroupBy(x => new { x.SaleOrder, x.PCode, x.PVer, x.PLot, x.DateCode }).Select(x => new Dt_ProOutOrderDetail()
+            //{
+            //    QtyPcs = x.Sum(x => x.QtyPcs) - x.Sum(x => x.OverQtyPcs),
+            //    SaleOrder = x.Key.SaleOrder,
+            //    PCode = x.Key.PCode,
+            //    PVer = x.Key.PVer,
+            //    PLot = x.Key.PLot,
+            //    DateCode = x.Key.DateCode,
+            //}).ToList();
+            //foreach (var item in groupDetails)
+            //{
+            //    float needQty = item.QtyPcs;
+            //    //鏌ユ壘鍙敤搴撳瓨
+            //    List<Dt_ProStockInfo> stockInfoss = _stockInfoService.ProStockInfoService.GetUseableStocks(proOutOrder.WarehouseId, item);
+            //    if (!stockInfoss.Any())
+            //    {
+            //        throw new Exception("鏈壘鍒板彲鍒嗛厤搴撳瓨");
+            //    }
+            //    //鑾峰彇鍑哄簱搴撳瓨
+            //    List<Dt_ProStockInfo> assignOutStocks = _stockInfoService.ProStockInfoService.GetOutboundStocks(stockInfoss, item, needQty, out float residueQuantity);
+            //    item.LockQtyPcs += needQty - residueQuantity;
+            //    if (item.QtyPcs> item.LockQtyPcs)
+            //    {
+            //        throw new Exception($"浜у搧缂栫爜{item.PCode}鍙垎閰嶆暟閲忎笉瓒�,鍙敤鏁伴噺{item.LockQtyPcs}");
+            //    }
+            //    outStocks.AddRange(assignOutStocks);
+            //    float assignQuantity = needQty - residueQuantity;
+            //    bool isCanLot = string.IsNullOrEmpty(item.PLot);
+            //    bool isCanDate = string.IsNullOrEmpty(item.DateCode);
+            //    List<Dt_ProOutOrderDetail> details = proOutOrderDetails
+            //        .Where(x =>x.PCode == item.PCode && x.PVer == item.PVer
+            //        && (isCanLot ? isCanLot : x.PLot == item.PLot)
+            //        && (isCanDate ? isCanDate : x.DateCode == item.DateCode))
+            //        .ToList();
+
+            //    for (int i = 0; i < details.Count; i++)
+            //    {
+            //        float orderQuantity = details[i].QtyPcs;
+            //        for (int j = 0; j < assignOutStocks.Count; j++)
+            //        {
+            //            //鍑哄簱璁㈠崟鏄庣粏宸插垎閰嶆暟閲�
+            //            float detailAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
+            //                && (isCanLot ? isCanLot : x.PLot == item.PLot)
+            //                && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
+            //                && x.OrderDetailId == details[i].Id).Sum(x => x.AssignQuantity);
+
+            //            float palletAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
+            //                && (isCanLot ? isCanLot : x.PLot == item.PLot)
+            //                && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
+            //                && x.PalletCode == assignOutStocks[j].PalletCode).Sum(x => x.AssignQuantity);
+            //            //鍑哄簱璇︽儏宸插垎閰嶆暟閲�
+            //            palletAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
+            //                && (isCanLot ? isCanLot : x.PLot == item.PLot)
+            //                && (isCanDate ? isCanDate : x.DateCode == item.DateCode) 
+            //                && x.PalletCode == assignOutStocks[j].PalletCode).Sum(x => x.AssignQuantity);//鍑哄簱璇︽儏宸插垎閰嶆暟閲�
+            //            float palletOutboundQuantity = assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
+            //            if (palletAssignQuantity < palletOutboundQuantity)//濡傛灉鍑哄簱璇︽儏宸插垎閰嶆暟閲忓皬浜庢墭鐩樺凡鍒嗛厤鏁伴噺锛屽垯鍙互缁х画娣诲姞璇ユ墭鐩樺嚭搴撲俊鎭�
+            //            {
+            //                float orderDetailNeedQuantity = details[i].QtyPcs - detailAssignQuantity;
+            //                if (orderDetailNeedQuantity > assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity)
+            //                {
+            //                    details[i].LockQtyPcs += assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity;
+            //                    Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(proOutOrder, details[i], assignOutStocks[j], assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity);
+            //                    outProStockInfos.Add(outStockLockInfo);
+            //                }
+            //                else
+            //                {
+            //                    Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(proOutOrder, details[i], assignOutStocks[j], details[i].QtyPcs - details[i].LockQtyPcs);
+            //                    outProStockInfos.Add(outStockLockInfo);
+            //                    details[i].LockQtyPcs = details[i].QtyPcs;
+            //                    break;
+            //                }
+
+            //            }
+            //        }
+            //    }
+            //    List<string> locationArr = outStocks.Select(x => x.LocationCode).ToList();
+
+            //    locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(locationArr));
+
+            //}
+            foreach (var item in proOutOrderDetails)
+            {
+                float needQty = item.ScrapPcsQty;
+                //鏌ユ壘鍙敤搴撳瓨
+                List<Dt_ProStockInfo> stockInfoss = _stockService.ProStockInfoService.GetUseableStocks(scrapSheet.WarehouseId, item);
+                if (!stockInfoss.Any())
+                {
+                    throw new Exception("鏈壘鍒板彲鍒嗛厤搴撳瓨");
+                }
+                //鑾峰彇鍑哄簱搴撳瓨
+                List<Dt_ProStockInfo> assignOutStocks = _stockService.ProStockInfoService.GetOutboundStocks(stockInfoss, item, needQty, out float residueQuantity);
+                item.LockPcsQty += (int)(needQty - residueQuantity);
+                if (item.ScrapPcsQty > item.LockPcsQty)
+                {
+                    throw new Exception($"浜у搧缂栫爜{item.ScrapProCode}鍙垎閰嶆暟閲忎笉瓒�,鍙敤鏁伴噺{item.LockPcsQty}");
+                }
+                outStocks.AddRange(assignOutStocks);
+                item.LockPcsQty = 0;
+                for (int j = 0; j < assignOutStocks.Count; j++)
+                {
+                    //鍑哄簱璁㈠崟鏄庣粏宸插垎閰嶆暟閲�
+                    float detailAssignQuantity = outProStockInfos.Where(x => x.OrderDetailId == item.Id).Sum(x => x.AssignQuantity);
+                    ////鍑哄簱璇︽儏宸插垎閰嶆暟閲�
+                    //float palletAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
+                    //    && (isCanLot ? isCanLot : x.PLot == item.PLot)
+                    //    && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
+                    //    && x.PalletCode == assignOutStocks[j].PalletCode).Sum(x => x.AssignQuantity);
+                    ////鍑哄簱璇︽儏宸插垎閰嶆暟閲�
+                    //float palletOutboundQuantity = assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
+                    //if (palletAssignQuantity < palletOutboundQuantity)//濡傛灉鍑哄簱璇︽儏宸插垎閰嶆暟閲忓皬浜庢墭鐩樺凡鍒嗛厤鏁伴噺锛屽垯鍙互缁х画娣诲姞璇ユ墭鐩樺嚭搴撲俊鎭�
+                    //{
+                    float orderDetailNeedQuantity = item.ScrapPcsQty - detailAssignQuantity;
+                    if (orderDetailNeedQuantity > assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity))
+                    {
+                        item.LockPcsQty += (int)assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
+                        Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(scrapSheet, item, assignOutStocks[j], assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity));
+                        outProStockInfos.Add(outStockLockInfo);
+                    }
+                    else
+                    {
+                        Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(scrapSheet, item, assignOutStocks[j], item.ScrapPcsQty - detailAssignQuantity);
+                        outProStockInfos.Add(outStockLockInfo);
+                        item.LockPcsQty = item.ScrapPcsQty;
+                        break;
+                    }
+                    //}
+                }
+                List<string> locationArr = outStocks.Select(x => x.LocationCode).ToList();
+
+                locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(locationArr));
+
+            }
+            return (outStocks, proOutOrderDetails, outProStockInfos, locationInfos);
         }
     }
 }

--
Gitblit v1.9.3