From a6e0ea9ce13e791f3edae4edffeb3be3ccb760be Mon Sep 17 00:00:00 2001 From: wangxinhui <wangxinhui@hnkhzn.com> Date: 星期一, 31 三月 2025 02:14:59 +0800 Subject: [PATCH] 版本更新 --- 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesRworkOutboundOrderService.cs | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 206 insertions(+), 5 deletions(-) diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesRworkOutboundOrderService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesRworkOutboundOrderService.cs" index 876025c..a49dd0f 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesRworkOutboundOrderService.cs" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesRworkOutboundOrderService.cs" @@ -1,4 +1,7 @@ -锘縰sing System; +锘縰sing Newtonsoft.Json.Serialization; +using Newtonsoft.Json; +using SqlSugar; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -6,16 +9,23 @@ using WIDESEA_Common.LocationEnum; using WIDESEA_Common.StockEnum; using WIDESEA_Core; +using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; +using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; +using WIDESEA_DTO; +using WIDESEA_DTO.MES; using WIDESEA_IBasicRepository; 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; +using WIDESEA_Common.APIEnum; +using WIDESEA_Common.OrderEnum; namespace WIDESEA_OutboundService { @@ -27,10 +37,14 @@ private readonly IBasicService _basicService; private readonly IRecordService _recordService; private readonly IOutProStockInfoService _outProStockInfoService; + private readonly IStockRepository _stockRepository; + private readonly IOutProStockInfoRepository _outProStockInfoRepository; + private readonly IUnitOfWorkManage _unitOfWorkManage; + private readonly IApiInfoRepository _apiInfoRepository; public IMesRworkOutboundOrderRepository Repository => BaseDal; - public MesRworkOutboundOrderService(IMesRworkOutboundOrderRepository BaseDal, IBasicRepository basicRepository, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IBasicService basicService, IRecordService recordService, IOutProStockInfoService outProStockInfoService) : base(BaseDal) + public MesRworkOutboundOrderService(IMesRworkOutboundOrderRepository BaseDal, IBasicRepository basicRepository, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IBasicService basicService, IRecordService recordService, IOutProStockInfoService outProStockInfoService, IStockRepository stockRepository, IOutProStockInfoRepository outProStockInfoRepository,IUnitOfWorkManage unitOfWorkManage, IApiInfoRepository apiInfoRepository) : base(BaseDal) { _basicRepository = basicRepository; _stockService = stockService; @@ -38,6 +52,10 @@ _basicService = basicService; _recordService = recordService; _outProStockInfoService = outProStockInfoService; + _stockRepository = stockRepository; + _outProStockInfoRepository = outProStockInfoRepository; + _unitOfWorkManage = unitOfWorkManage; + _apiInfoRepository = apiInfoRepository; } /// <summary> /// 鎻愬簱浠诲姟鍒嗛厤搴撳瓨 @@ -65,13 +83,15 @@ float assignQuantity = needQuantity - residueQuantity; float orderQuantity = mesRworkOutboundOrder.RequiredQuantity; + bool isCanDate = string.IsNullOrEmpty(mesRworkOutboundOrder.DateCode); for (int j = 0; j < autoAssignStocks.Count; j++) { //鍑哄簱璁㈠崟鏄庣粏宸插垎閰嶆暟閲� float detailAssignQuantity = outProStockInfos .Where(x => x.SaleOrder == mesRworkOutboundOrder.SaleOrder && x.PCode == mesRworkOutboundOrder.ProductCode - && x.PVer == mesRworkOutboundOrder.ProductVersion) + && x.PVer == mesRworkOutboundOrder.ProductVersion + && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode)) .Sum(x => x.AssignQuantity); //鍑哄簱璇︽儏宸插垎閰嶆暟閲� @@ -79,7 +99,8 @@ .Where(x => x.SaleOrder == mesRworkOutboundOrder.SaleOrder && x.PCode == mesRworkOutboundOrder.ProductCode && x.PVer == mesRworkOutboundOrder.ProductVersion - && x.PalletCode == autoAssignStocks[j].PalletCode) + && x.PalletCode == autoAssignStocks[j].PalletCode + && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode)) .Sum(x => x.AssignQuantity); float palletOutboundQuantity = autoAssignStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity); @@ -103,7 +124,7 @@ } locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(proStockInfos.Select(x => x.LocationCode).ToList())); - return (proStockInfos, assignOutOrder, outProStockInfos, locationInfos); + return (proStockInfos, mesRworkOutboundOrder, outProStockInfos, locationInfos); } public WebResponseContent LockOutboundStockDataUpdate(List<Dt_ProStockInfo> stockInfos, List<Dt_OutProStockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null) { @@ -148,5 +169,185 @@ return WebResponseContent.Instance.Error(ex.Message); } } + /// <summary> + /// 鎴愬搧MES鎻愬簱鍑哄簱瀹屽悗涓�鍖呬竴鍖呮嫞閫� + /// </summary> + /// <returns></returns> + public WebResponseContent MesRworkOutPick(int OrderId,string InrPKCode,int Count=0) + { + WebResponseContent content = new WebResponseContent(); + try + { + //鑾峰彇褰撳墠鐨凪es鎻愬簱鍗� + Dt_MesRworkOutboundOrder rworkOutboundOrder = BaseDal.QueryFirst(x => x.Id == OrderId); + if (rworkOutboundOrder == null) + { + return content.Error("鏈壘鍒板綋鍓峂es鎻愬簱鍗�"); + } + if (rworkOutboundOrder.OrderStatus>=OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()) + { + return content.Error("褰撳墠Mes鎻愬簱鍗曞凡瀹屾垚鎴栧叧闂�"); + } + //鏍规嵁鎵弿鍐呭寘鍙疯幏鍙栧簱瀛� + Dt_ProStockInfoDetail? proStockInfoDetail = _stockRepository.ProStockInfoDetailRepository.QueryFirst(x => x.BagNo == InrPKCode && x.ProOutDetailStatus == StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt()); + if (proStockInfoDetail == null) + { + return content.Error($"鏈壘鍒板唴鍖厈InrPKCode}淇℃伅"); + } + //鑾峰彇搴撳瓨淇℃伅 + Dt_ProStockInfo? proStockInfo = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => x.Id == proStockInfoDetail.ProStockId).Includes(x => x.proStockInfoDetails).First(); + if (proStockInfo == null) + { + return content.Error($"鏈壘鍒板唴鍖厈InrPKCode}搴撳瓨淇℃伅"); + } + //鏌ヨ璇ユ墭鐩樻槸鍚﹀瓨鍦ㄨ鍗曟嵁鐨勫嚭搴撹鎯� + Dt_OutProStockInfo outProStockInfo = _outProStockInfoRepository.QueryFirst(x => x.OrderNo == rworkOutboundOrder.TaskNo && x.PalletCode == proStockInfo.PalletCode); + if (outProStockInfo == null) + { + return content.Error($"鍐呭寘{InrPKCode}闈炲崟鎹畕rworkOutboundOrder.TaskNo}鍐呭"); + } + //鍒ゆ柇鏄惁鏁村寘鏁伴噺 + if (Count > 0) + { + if (Count> proStockInfoDetail.StockPcsQty) + { + return content.Error($"鍐呭寘鏁伴噺{(int)proStockInfoDetail.StockPcsQty}<鍑哄簱鏁伴噺{Count}"); + } + int setinterval = (int)proStockInfoDetail.StockPcsQty / (int)proStockInfoDetail.SETQty; + if (Count % setinterval!=0) + { + return content.Error($"鑾峰彇SET鏁伴噺澶辫触,1SET:{setinterval}PCS"); + } + proStockInfoDetail.OutSETQty = Count / setinterval; + proStockInfoDetail.OutboundQuantity = Count; + } + else + { + proStockInfoDetail.OutSETQty = proStockInfoDetail.SETQty; + proStockInfoDetail.OutboundQuantity = proStockInfoDetail.StockPcsQty; + } + rworkOutboundOrder.OverOutQuantity += proStockInfoDetail.OutboundQuantity; + if (rworkOutboundOrder.OverOutQuantity> rworkOutboundOrder.RequiredQuantity) + { + return content.Error($"鍗曟嵁{rworkOutboundOrder.TaskNo}婧㈠嚭{rworkOutboundOrder.OverOutQuantity - rworkOutboundOrder.RequiredQuantity}"); + } + if (rworkOutboundOrder.OverOutQuantity== rworkOutboundOrder.RequiredQuantity) + { + rworkOutboundOrder.OrderStatus = OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt(); + } + + int SetCount = (int)proStockInfoDetail.OutSETQty; + int EligiblePcsCount = (int)proStockInfoDetail.OutboundQuantity; + _unitOfWorkManage.BeginTran(); + if (proStockInfoDetail.SETQty == proStockInfoDetail.OutSETQty && proStockInfoDetail.StockPcsQty== proStockInfoDetail.OutboundQuantity) + { + proStockInfo.proStockInfoDetails.Remove(proStockInfoDetail); + if (proStockInfo.proStockInfoDetails.Count==0) + { + _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfo, OperateTypeEnum.鑷姩瀹屾垚); + } + _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(proStockInfoDetail, OperateTypeEnum.鑷姩瀹屾垚); + } + else + { + proStockInfoDetail.SETQty -= proStockInfoDetail.OutSETQty; + proStockInfoDetail.StockPcsQty -= proStockInfoDetail.OutboundQuantity; + proStockInfoDetail.OutSETQty = 0; + proStockInfoDetail.OutboundQuantity = 0; + _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfoDetail); + } + BaseDal.UpdateData(rworkOutboundOrder); + //MES鎴愬搧搴撳瓨鏉垮嚭搴撳悓姝� + WebResponseContent responseContent = ProductOutBoundSync(MesProOutBound(rworkOutboundOrder, new List<Dt_ProStockInfoDetail> { proStockInfoDetail }, SetCount, EligiblePcsCount)); + if (responseContent.Status) + { + throw new Exception("鍚屾MES搴撳瓨鏉垮嚭搴撳け璐�,閿欒:" + responseContent.Message); + } + _unitOfWorkManage.CommitTran(); + if (rworkOutboundOrder.OrderStatus==OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()) + { + content.OK($"鍗曞彿{rworkOutboundOrder.TaskNo}宸插畬鎴�"); + } + else + { + content.OK($"鍗曞彿{rworkOutboundOrder.TaskNo},鍓╀綑:{rworkOutboundOrder.RequiredQuantity-rworkOutboundOrder.OverOutQuantity}PCS"); + } + } + catch (Exception ex) + { + _unitOfWorkManage.RollbackTran(); + content.Error(ex.Message); + } + return content; + } + /// <summary> + /// 搴撳瓨鏉挎暟鎹浆鎹� + /// </summary> + /// <returns></returns> + public MesProductOutBound MesProOutBound(Dt_MesRworkOutboundOrder mesRworkOutboundOrder, List<Dt_ProStockInfoDetail> proStockInfoDetails,int SetCount,int EligiblePcsCount) + { + //鑾峰彇浠撳簱淇℃伅 + Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == mesRworkOutboundOrder.WarehouseId); + List<MesInventoryInfo> inventoryInfos = new List<MesInventoryInfo>(); + foreach (var item in proStockInfoDetails) + { + MesInventoryInfo mesInventoryInfo = new MesInventoryInfo() + { + Warhouseno = warehouse.WarehouseCode, + InternalPackageNumber = item.BagNo, + SetCount = SetCount, + EligiblePcsCount = EligiblePcsCount + }; + inventoryInfos.Add(mesInventoryInfo); + } + MesProductOutBound mesProductOutBound = new MesProductOutBound() + { + TaskNo = mesRworkOutboundOrder.TaskNo, + ProductCode = mesRworkOutboundOrder.ProductCode, + ProductVersion = mesRworkOutboundOrder.ProductVersion, + DateCode = mesRworkOutboundOrder.DateCode, + SaleOrder = mesRworkOutboundOrder.SaleOrder, + InventoryInfo = inventoryInfos + }; + return mesProductOutBound; + } + /// <summary> + /// 鎴愬搧搴撳瓨鏉垮悓姝ユ帴鍙� + /// </summary> + public WebResponseContent ProductOutBoundSync(MesProductOutBound model) + { + WebResponseContent content = new WebResponseContent(); + try + { + Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMS_MES_ProductOutBound.ToString()); + MESRoot<MesProductOutBound> root = new MESRoot<MesProductOutBound>() + { + From = "WMS", + DateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + Content = model + }; + JsonSerializerSettings settings = new JsonSerializerSettings + { + ContractResolver = new CamelCasePropertyNamesContractResolver() + }; + string request = JsonConvert.SerializeObject(root, settings); + string response = HttpMesHelper.Post(apiInfo.ApiAddress, request); + MesResponseContent mesResponseContent = response.DeserializeObject<MesResponseContent>(); + //璋冪敤鎺ュ彛 + if (mesResponseContent.BSucc == true) + { + content.OK(mesResponseContent.StrMsg); + } + else + { + content.Error(mesResponseContent.StrMsg); + } + } + catch (Exception ex) + { + content.Error(ex.Message); + } + return content; + } } } -- Gitblit v1.9.3