From 0023d3db5bd701864b73e57c0240c219c40c3a4e Mon Sep 17 00:00:00 2001
From: wangxinhui <wangxinhui@hnkhzn.com>
Date: 星期一, 14 七月 2025 14:12:34 +0800
Subject: [PATCH] 1

---
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ErpProScrapSheetDetailService.cs |  244 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 242 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..c699330 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,235 @@
     {
         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, IBasicService basicService) : base(BaseDal)
         {
             _unitOfWorkManage = unitOfWorkManage;
+            _proScrapSheetRepository = proScrapSheetRepository;
+            _invokeERPService = invokeERPService;
+            _stockRepository = stockRepository;
+            _stockService = stockService;
+            _outProStockInfoService = outProStockInfoService;
+            _recordService = recordService;
+            _basicService = basicService;
+        }
+        //鑾峰彇瀵瑰簲鍗曞彿鐨勬姤搴熸槑缁�
+        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.ScrapProCode,
+                        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.ScrapProCode,
+                                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>();
+            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 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> locationCodes = outStocks.Select(x => x.LocationCode).ToList();
+                List<Dt_LocationInfo> locationInfos1 = _basicService.LocationInfoService.Repository.GetLocationInfos(locationCodes);
+                if (locationInfos1 == null) 
+                {
+                    throw new Exception($"{locationCodes}璐т綅鏌ヨ涓虹┖锛岃妫�鏌�");
+                }
+                locationInfos.AddRange(locationInfos1);
+            }
+            return (outStocks, proOutOrderDetails, outProStockInfos, locationInfos);
         }
     }
 }

--
Gitblit v1.9.3