From dab0a583302f306d8c0ec37fbae37c9b4e37e473 Mon Sep 17 00:00:00 2001
From: dengjunjie <dengjunjie@hnkhzn.com>
Date: 星期一, 29 十二月 2025 18:46:15 +0800
Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/MeiRuiAn/JiAnLiKu
---
WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs | 718 +++++++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 647 insertions(+), 71 deletions(-)
diff --git a/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs b/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
index dc164dc..22b8de2 100644
--- a/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
+++ b/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -79,6 +79,8 @@
using WIDESEA_InboundRepository;
using System.Drawing.Printing;
using System;
+using WIDESEA_Common.Log;
+using static WIDESEA_Common.HouseInboundPassBack.data.data1;
namespace WIDESEA_TaskInfoService
{
@@ -107,10 +109,11 @@
private readonly IStockInfoDetailRepository _stockInfoDetailRepository;
private readonly IReturnOrderRepository _returnOrderRepository;
private readonly IProductionRepository _productionRepository;
- private readonly IInboundRepository _inboundRepository;
+ private readonly IInboundRepository _inboundRepository;
+
public ITaskRepository Repository => BaseDal;
- public TaskService(ITaskRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IMaterielInfoService materielInfoService, IInboundOrderDetail_HtyService inboundOrderDetail_HtyService, IOutboundOrder_HtyService outboundOrder_HtyService, IOutboundOrderDetail_HtyService outboundOrderDetail_HtyService, IInboundOrder_HtyService inboundOrder_HtyService, IStockRepository stockRepository, IInboundOrderDetailService inboundOrderDetailService, IBasicService basicService, IOutboundService outboundService, IInboundService inboundService, IRecordService recordService, IStockService stockService, ITask_HtyService taskHtyService, ILocationInfoService locationInfoService, IOutboundOrderDetailRepository outboundOrderDetailRepository, IBasicRepository basicRepository, IStockInfoDetailRepository stockInfoDetailRepository, IPalletTypeInfoRepository palletTypeInfoRepository, IReturnOrderRepository returnOrderRepository, IProductionRepository productionRepository,IInboundRepository inboundRepository) : base(BaseDal)
+ public TaskService(ITaskRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IMaterielInfoService materielInfoService, IInboundOrderDetail_HtyService inboundOrderDetail_HtyService, IOutboundOrder_HtyService outboundOrder_HtyService, IOutboundOrderDetail_HtyService outboundOrderDetail_HtyService, IInboundOrder_HtyService inboundOrder_HtyService, IStockRepository stockRepository, IInboundOrderDetailService inboundOrderDetailService, IBasicService basicService, IOutboundService outboundService, IInboundService inboundService, IRecordService recordService, IStockService stockService, ITask_HtyService taskHtyService, ILocationInfoService locationInfoService, IOutboundOrderDetailRepository outboundOrderDetailRepository, IBasicRepository basicRepository, IStockInfoDetailRepository stockInfoDetailRepository, IPalletTypeInfoRepository palletTypeInfoRepository, IReturnOrderRepository returnOrderRepository, IProductionRepository productionRepository, IInboundRepository inboundRepository) : base(BaseDal)
{
_mapper = mapper;
_stockRepository = stockRepository;
@@ -145,6 +148,7 @@
public string ReceiveERPTaskout = WIDESEA_Core.Helper.AppSettings.Configuration["ReceiveERPTaskout"];
public string InMaterialWarehousingCallback = WIDESEA_Core.Helper.AppSettings.Configuration["InMaterialWarehousingCallback"];
+
/// <summary>
/// 浠诲姟淇℃伅鎺ㄩ�佽嚦WCS
/// </summary>
@@ -173,6 +177,30 @@
}
}
+ public WebResponseContent PushTasksWCS(List<Dt_Task> tasks, string agvDescription = "")
+ {
+ try
+ {
+ List<WMSTaskDTO> taskDTOs = _mapper.Map<List<WMSTaskDTO>>(tasks);
+ taskDTOs.ForEach(x =>
+ {
+ x.AGVArea = agvDescription;
+ });
+ string url = AppSettings.app("WCS");
+ if (string.IsNullOrEmpty(url))
+ {
+ return WebResponseContent.Instance.Error($"鏈壘鍒癢CSApi鍦板潃,璇锋鏌ラ厤缃枃浠�");
+ }
+ string response = HttpHelper.Post($"{url}/api/Task/ReceiveCPTask", taskDTOs.Serialize());
+
+ return JsonConvert.DeserializeObject<WebResponseContent>(response) ?? WebResponseContent.Instance.Error("杩斿洖閿欒");
+ }
+ catch (Exception ex)
+ {
+ return WebResponseContent.Instance.Error(ex.Message);
+ }
+ }
+
public WebResponseContent FeedBackWCSTaskCompleted(int taskNum)
{
try
@@ -187,7 +215,7 @@
{
return WebResponseContent.Instance.Error($"鏈壘鍒癢CSApi鍦板潃,璇锋鏌ラ厤缃枃浠�");
}
- string response = HttpHelper.Get($"{url}/api/Task/RecWMSTaskCompleted?taskNum=" + taskNum);
+ string response = HttpHelper.Post($"{url}/api/Task/RecWMSTaskCompleted?taskNum=" + taskNum);
return JsonConvert.DeserializeObject<WebResponseContent>(response) ?? WebResponseContent.Instance.Error("杩斿洖閿欒");
}
@@ -464,35 +492,308 @@
dt_StockInfo.LocationCode = dt_LocationInfo.LocationCode;
-
- Dt_InboundOrder? inboundOrder = _inboundService.InbounOrderService.Db.Queryable<Dt_InboundOrder>().Where(x => x.OrderNo == dt_StockInfo.Details.FirstOrDefault().OrderNo).Includes(x => x.Details).First();
- Dt_InboundOrderDetail? inboundOrderDetail = null;
-
- // 3. 澶勭悊鍏ュ簱閫昏緫
- if (task.TaskType == TaskTypeEnum.Inbound.ObjToInt())
+ if (warehouse.WarehouseCode.Contains("TestJCLK"))
{
- return ProcessInbound(task, dt_StockInfo, dt_LocationInfo);
- }
- if (task.TaskType == TaskTypeEnum.SurplusReturn.ObjToInt() || task.TaskType == TaskTypeEnum.ReverseIn.ObjToInt())
- {
- return ReturnInbound(task, dt_StockInfo, dt_LocationInfo);
- }
- if(task.TaskType == TaskTypeEnum.InInventory.ObjToInt())
- {
- int lastStatus = dt_LocationInfo.LocationStatus;
- dt_LocationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
- dt_StockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
- // 鏇存柊搴撳瓨鏄庣粏鐘舵��
- dt_StockInfo.Details.ForEach(x => x.Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt());
- _unitOfWorkManage.BeginTran();
- UpdateTaskStatus(task);
- UpdateLocationStatus(dt_LocationInfo, lastStatus);
- UpdateStockInfo(dt_StockInfo);
- AddRecords(task, dt_StockInfo, dt_LocationInfo, lastStatus);
- _unitOfWorkManage.CommitTran();
- return WebResponseContent.Instance.OK();
+ // 1. 鑾峰彇鍏ュ簱鍗曚俊鎭�
+ Dt_InboundOrder? inboundOrder = null;
+ if (!string.IsNullOrEmpty(dt_StockInfo.Details.FirstOrDefault()?.OrderNo))
+ {
+ inboundOrder = _inboundService.InbounOrderService.Db.Queryable<Dt_InboundOrder>()
+ .Where(x => x.OrderNo == dt_StockInfo.Details.FirstOrDefault().OrderNo)
+ .Includes(x => x.Details)
+ .First();
+ }
+ // 3. 澶勭悊鍏ュ簱閫昏緫
+ if (task.TaskType == TaskTypeEnum.Inbound.ObjToInt())
+ {
+ int lastStatus = dt_LocationInfo.LocationStatus;
+ dt_LocationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
+
+ if (task.TaskType == TaskTypeEnum.Inbound.ObjToInt() && inboundOrder == null)
+ {
+ return WebResponseContent.Instance.Error("鏈壘鍒板叆搴撳崟淇℃伅");
+ }
+ var allBoxCodesForDetail = BaseDal.Db.Queryable<Dt_StockInfoDetailCP>()
+ .Where(x => x.StockDetailId == dt_StockInfo.Details.FirstOrDefault().Id)
+ .Select(x => x.BoxCode)
+ .ToList();
+
+ // 2. 鑾峰彇鎵樼洏涓嬬殑鎵�鏈夌鍙�
+ var boxCodes = new List<string>();
+
+ // 鏂规硶1锛氫粠搴撳瓨鏄庣粏鐨凚oxCodes瀛楁鑾峰彇锛堢粍鐩樻椂淇濆瓨鐨勶級
+ foreach (var detail in allBoxCodesForDetail)
+ {
+ if (!string.IsNullOrEmpty(detail))
+ {
+ var codes = detail.Split(',', StringSplitOptions.RemoveEmptyEntries);
+ boxCodes.AddRange(codes);
+ }
+ }
+
+ // 鏍规嵁鎵樼洏鏄庣粏鑾峰彇瀵瑰簲鐨勫叆搴撳崟鏄庣粏
+ List<Dt_InboundOrderDetail> inboundOrderDetails = new List<Dt_InboundOrderDetail>();
+
+ // 澶勭悊澶氫釜搴撳瓨鏄庣粏鐨勬儏鍐�
+ foreach (var stockDetail in dt_StockInfo.Details)
+ {
+ if (!string.IsNullOrEmpty(stockDetail.OrderNo))
+ {
+ var detail = inboundOrder.Details.FirstOrDefault(x => x.LinId == stockDetail.LinId && x.BatchNo == stockDetail.BatchNo);
+
+ if (detail != null && !inboundOrderDetails.Any(x => x.Id == detail.Id))
+ {
+ inboundOrderDetails.Add(detail);
+ }
+ }
+ }
+
+ if (!inboundOrderDetails.Any())
+ {
+ return WebResponseContent.Instance.Error($"鏈壘鍒板搴旂殑鍏ュ簱鍗曟槑缁�");
+ }
+
+ // 鏇存柊鍏ュ簱鍗曟槑缁嗙姸鎬�
+ foreach (var inboundOrderDetail in inboundOrderDetails)
+ {
+ // 妫�鏌ヨ鏄庣粏鏄惁宸插叏閮ㄥ叆搴�
+ decimal totalStockQuantity = dt_StockInfo.Details
+ .Where(x => x.LinId == inboundOrderDetail.LinId && x.BatchNo == inboundOrderDetail.BatchNo)
+ .Sum(x => x.StockQuantity);
+
+ decimal orderQuantity = Convert.ToDecimal(inboundOrderDetail.OrderQuantity);
+ decimal receiptQuantity = Convert.ToDecimal(inboundOrderDetail.ReceiptQuantity);
+ decimal overInQuantity = Convert.ToDecimal(inboundOrderDetail.OverInQuantity);
+
+ // 鏇存柊鏀惰揣鏁伴噺
+ inboundOrderDetail.OverInQuantity = totalStockQuantity += overInQuantity;
+
+ // 妫�鏌ユ槸鍚﹀叏閮ㄥ畬鎴�
+ if (inboundOrderDetail.OverInQuantity == inboundOrderDetail.OrderQuantity)
+ {
+ inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
+ }
+ else
+ {
+ inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Inbounding.ObjToInt();
+ }
+ }
+
+ ///鏇存柊搴撳瓨鐘舵��
+ dt_StockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+ // 鏇存柊搴撳瓨鏄庣粏鐘舵��
+ dt_StockInfo.Details.ForEach(x => x.Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt());
+
+ // 3. 鏌ヨ鎴愬搧鍏ュ簱鏄庣粏锛圕P鍏ュ簱鍗曟槑缁嗭級
+ List<Dt_CPInboundOrderDetail> cpInboundDetails = new List<Dt_CPInboundOrderDetail>();
+ if (boxCodes.Any())
+ {
+ cpInboundDetails = BaseDal.Db.Queryable<Dt_CPInboundOrderDetail>()
+ .Where(x => boxCodes.Contains(x.BoxCode))
+ .ToList();
+ }
+
+ // 鏇存柊鎴愬搧鍏ュ簱鏄庣粏鐘舵��
+ if (cpInboundDetails.Any())
+ {
+ foreach (var cpDetail in cpInboundDetails)
+ {
+ cpDetail.CPOrderDetailStatus = InboundStatusEnum.鍏ュ簱瀹屾垚.ObjToInt();
+ }
+ }
+
+ // 4. 鏌ヨ骞舵洿鏂版垚鍝佸簱瀛樻槑缁嗭紙濡傛灉鏈夊崟鐙殑鎴愬搧搴撳瓨琛級
+ List<Dt_StockInfoDetailCP> cpStockDetails = new List<Dt_StockInfoDetailCP>();
+ if (boxCodes.Any())
+ {
+ cpStockDetails = BaseDal.Db.Queryable<Dt_StockInfoDetailCP>()
+ .Where(x => boxCodes.Contains(x.BoxCode))
+ .ToList();
+
+ // 鏇存柊鎴愬搧搴撳瓨鏄庣粏鐘舵��
+ foreach (var cpStockDetail in cpStockDetails)
+ {
+ cpStockDetail.CPStockDetailStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+ }
+ }
+
+ try
+ {
+ _unitOfWorkManage.BeginTran();
+
+ // 鏇存柊浠诲姟鐘舵��
+ UpdateTaskStatus(task);
+
+ // 鏇存柊璐т綅鐘舵��
+ UpdateLocationStatus(dt_LocationInfo, lastStatus);
+
+ // 鏇存柊搴撳瓨淇℃伅
+ UpdateStockInfo(dt_StockInfo);
+
+ // 娣诲姞璁板綍
+ AddRecords(task, dt_StockInfo, dt_LocationInfo, lastStatus);
+
+ // 鏇存柊鍏ュ簱鍗曟槑缁�
+ if (inboundOrderDetails.Any())
+ {
+ BaseDal.Db.Updateable(inboundOrderDetails).ExecuteCommand();
+
+ // 妫�鏌ュ叆搴撳崟鏄惁鍏ㄩ儴瀹屾垚
+ bool allCompleted = inboundOrder.Details.All(x =>
+ x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt());
+
+ if (allCompleted)
+ {
+ inboundOrder.OrderStatus = InboundStatusEnum.鍏ュ簱瀹屾垚.ObjToInt();
+ }
+ else
+ {
+ inboundOrder.OrderStatus = InboundStatusEnum.鍏ュ簱涓�.ObjToInt();
+ }
+ }
+
+ // 鏇存柊鍏ュ簱鍗�
+ UpdateInboundOrder(inboundOrder, inboundOrderDetails.FirstOrDefault());
+
+ // 鏇存柊鎴愬搧鍏ュ簱鏄庣粏鐘舵��
+ if (cpInboundDetails.Any())
+ {
+ BaseDal.Db.Updateable(cpInboundDetails).ExecuteCommand();
+ }
+
+ // 鏇存柊鎴愬搧搴撳瓨鏄庣粏鐘舵��
+ if (cpStockDetails.Any())
+ {
+ BaseDal.Db.Updateable(cpStockDetails).ExecuteCommand();
+ }
+
+ // 鍗曟嵁鏁伴噺鍏ㄩ儴涓婃灦瀹屾垚锛屽鐞哤MS鍥炰紶
+ if (inboundOrderDetails.Any(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()) && inboundOrder.System.Equals("ERP"))
+ {
+ foreach (var detail in inboundOrderDetails.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()))
+ {
+ FeedBackInboundERP(inboundOrder.UpperOrderNo, detail.LinId);
+ }
+ }
+ if (inboundOrder.OrderStatus == InboundStatusEnum.鍏ュ簱瀹屾垚.ObjToInt() && inboundOrder.OrderType == 0 && inboundOrder.System.Equals("SMOM"))
+ {
+ List<Dt_StockInfo> StockInfos = _stockRepository.StockInfoRepository.Db
+ .Queryable<Dt_StockInfo>()
+ .Includes(x => x.Details, d => d.StockDetails)
+ .Where(x => x.WarehouseId == task.WarehouseId &&
+ x.Details.Any(v => v.OrderNo == inboundOrder.OrderNo))
+ .ToList();
+
+ if (StockInfos.Count == 0) throw new Exception("鏈壘鍒板簱瀛樹俊鎭�");
+ var houseInboundPassBack = new HouseInboundPassBack
+ {
+ ApiType = "AsnController",
+ Method = "AsrsGroudingAsn",
+ Parameters = new List<HouseInboundPassBack.data>
+ {
+ new HouseInboundPassBack.data
+ {
+ Value = new List<data.data1>
+ {
+ new data.data1
+ {
+ AsnNo = inboundOrder.OrderNo,
+ //InWarehouse = task.Roadway,
+ TransactionCode = inboundOrder.TransactionCode,
+ InoutType = inboundOrder.OrderType,
+ OrderType = inboundOrder.InoutType,
+ // 閬嶅巻鎵�鏈夊簱瀛樻槑缁嗭紝娣诲姞鍒� DetailList
+ DetailList = StockInfos.Select(d => new data.data1.Inbound
+ {
+ LinId = d.Details.FirstOrDefault()?.LinId?? "",
+ MaterielCode = d.Details.FirstOrDefault()?.MaterielCode?? "",
+ OrderQuantity = d.Details.FirstOrDefault().StockQuantity,
+ BatchNo = d.Details.FirstOrDefault()?.BatchNo,
+ LPNNo = d.PalletCode,
+ FinishQty = d.Details.FirstOrDefault().StockQuantity,
+ LocationName = d.LocationCode,
+ LabelList= d.Details
+ .Where(detail => detail.StockDetails != null)
+ .SelectMany(detail => detail.StockDetails)
+ .Where(stockDetail => !string.IsNullOrEmpty(stockDetail.BoxCode))
+ .Select(stockDetail => stockDetail.BoxCode )
+ .ToList()
+ }).ToList()
+ }
+ }
+ }
}
+ };
+
+ var authResult = AuthenticateWithWMS();
+ if (authResult.IsSuccess)
+ {
+ houseInboundPassBack.Context = new Dictionary<string, string>
+ {
+ { "Ticket", authResult.Ticket },
+ { "InvOrgId", authResult.InvOrgId }
+ };
+
+ var response = HttpHelper.Post<MomRequestContent>(ReceiveWMSTaskin, houseInboundPassBack, "绔嬪簱鍏ュ簱鏁伴噺鍥炰紶WMS");
+ // 鍒ゆ柇Success鐨勫��
+ if (!response.Success)
+ {
+ throw new Exception($"鎿嶄綔澶辫触: {response.Message ?? "鏈彁渚涢敊璇俊鎭�"}");
+ }
+
+ }
+
+ }
+ else if (inboundOrder.OrderStatus == InboundStatusEnum.鍏ュ簱瀹屾垚.ObjToInt() && inboundOrder.OrderType == 2 && inboundOrder.System.Equals("SMOM"))
+ {
+ SendAllocateInfoToWMS(task, inboundOrder, dt_StockInfo);
+ }
+
+ _unitOfWorkManage.CommitTran();
+ return WebResponseContent.Instance.OK();
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ throw new Exception($"鍏ュ簱澶勭悊澶辫触锛歿ex.Message}", ex);
+ }
+ }
+ }
+
+
+ else
+ {
+ Dt_InboundOrder? inboundOrder = _inboundService.InbounOrderService.Db.Queryable<Dt_InboundOrder>().Where(x => x.OrderNo == dt_StockInfo.Details.FirstOrDefault().OrderNo).Includes(x => x.Details).First();
+ Dt_InboundOrderDetail? inboundOrderDetail = null;
+
+ // 3. 澶勭悊鍏ュ簱閫昏緫
+ if (task.TaskType == TaskTypeEnum.Inbound.ObjToInt())
+ {
+ return ProcessInbound(task, dt_StockInfo, dt_LocationInfo);
+ }
+ if (task.TaskType == TaskTypeEnum.SurplusReturn.ObjToInt() || task.TaskType == TaskTypeEnum.ReverseIn.ObjToInt())
+ {
+ return ReturnInbound(task, dt_StockInfo, dt_LocationInfo);
+ }
+ if (task.TaskType == TaskTypeEnum.InInventory.ObjToInt())
+ {
+ int lastStatus = dt_LocationInfo.LocationStatus;
+ dt_LocationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
+ dt_StockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+ // 鏇存柊搴撳瓨鏄庣粏鐘舵��
+ dt_StockInfo.Details.ForEach(x => x.Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt());
+ _unitOfWorkManage.BeginTran();
+ UpdateTaskStatus(task);
+ UpdateLocationStatus(dt_LocationInfo, lastStatus);
+ UpdateStockInfo(dt_StockInfo);
+ AddRecords(task, dt_StockInfo, dt_LocationInfo, lastStatus);
+ _unitOfWorkManage.CommitTran();
+ return WebResponseContent.Instance.OK();
+
+ }
+ }
+
return WebResponseContent.Instance.OK();
}
catch (Exception ex)
@@ -884,7 +1185,7 @@
System = returnOrder.System,
}
}
- }
+ }
}
};
var authResult = AuthenticateWithWMS();
@@ -907,7 +1208,7 @@
// 濡傛灉Success涓篺alse锛屾姏鍑哄紓甯稿苟鍖呭惈閿欒淇℃伅
throw new Exception($"鎿嶄綔澶辫触: {response.Message ?? "鏈彁渚涢敊璇俊鎭�"}");
}
-
+
}
return WebResponseContent.Instance.OK();
}
@@ -1133,7 +1434,7 @@
if (stockInfo == null) return WebResponseContent.Instance.Error("鏈壘鍒板簱瀛樹俊鎭�");
if (locationInfo == null) return WebResponseContent.Instance.Error("鏈壘鍒拌揣浣嶄俊鎭�");
- if ((outStockLockInfos == null || outStockLockInfos.Count == 0)&& task.TaskType != TaskTypeEnum.OutInventory.ObjToInt())
+ if ((outStockLockInfos == null || outStockLockInfos.Count == 0) && task.TaskType != TaskTypeEnum.OutInventory.ObjToInt())
return WebResponseContent.Instance.Error("鏈壘鍒板嚭搴撹鎯呬俊鎭�");
return WebResponseContent.Instance.OK();
@@ -1205,8 +1506,7 @@
if (outboundOrderDetails.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt() && inboundOrder.System.Equals("ERP"))
{
FeedBackOutERP(outboundOrder.OrderNo, outboundOrderDetails.LinId);
- //DownloadReport(path, savePath, outboundOrderDetails.Id);
- //printTest(savePath);
+ DownloadReport(path, savePath, outboundOrderDetails.Id);
}
///鍗曟嵁瀹屾垚鎺ㄩ�丼MOM绯荤粺
if (outboundOrder.OrderStatus == OutboundStatusEnum.鍑哄簱瀹屾垚.ObjToInt() && inboundOrder.System.Equals("SMOM"))
@@ -1235,7 +1535,7 @@
private void UpdateOutboundOrderDetails(Dt_StockInfo stockInfo, Dt_OutboundOrder inboundOrder, ref Dt_OutboundOrderDetail inboundOrderDetail)
{
int overCount = inboundOrder.Details.Count(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt());
- inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.BatchNo == stockInfo.Details.FirstOrDefault()?.BatchNo);
+ //inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.BatchNo == stockInfo.Details.FirstOrDefault()?.BatchNo&&x.LPNNo==stockInfo.PalletCode);
foreach (var item in stockInfo.Details)
{
@@ -1480,15 +1780,15 @@
OrderType = outboundOrder.InoutType,
DetailList = outStockLockInfos.Select(item =>
{
- var detail = _stockService.StockInfoDetailService.Repository.QueryFirst(x => x.StockId == item.Id);
+ //var detail = _stockService.StockInfoDetailService.Repository.QueryFirst(x => x.StockId == item.StockId);
return new Allocate.data1.Inventory
{
LinId = outDetail.LinId,
LPN_No = item.PalletCode,
- MaterielCode = detail.MaterielCode,
- OrderQuantity = detail.OutboundQuantity,
- BatchNo = detail.BatchNo,
- FinishQty = detail.OutboundQuantity,
+ MaterielCode = outDetail.MaterielCode,
+ OrderQuantity = outDetail.OrderQuantity,
+ BatchNo = outDetail.BatchNo,
+ FinishQty = outDetail.OrderQuantity,
LocationName = task.SourceAddress
};
}).ToList()
@@ -1664,72 +1964,348 @@
throw new Exception($"鎿嶄綔澶辫触: {response.Message ?? "鏈彁渚涢敊璇俊鎭�"}");
}
}
- public string DownloadReport(string path, string savePath, int orderId)
+ // 鏂规硶澹版槑娣诲姞 async 鍏抽敭瀛楋紝杩斿洖鍊兼敼涓� Task<string>
+ public async Task<string> DownloadReport(string path, string savePath, int orderId)
{
- // 鏋勫缓瀹屾暣 URL锛岋紙鎶ヨ〃浼犲弬锛�
string reportUrl = path + "&orderId=" + orderId;
try
{
- // 纭繚淇濆瓨鐩綍瀛樺湪
string directory = Path.GetDirectoryName(savePath);
+ Console.WriteLine($"涓嬭浇鍦板潃: {reportUrl}");
+ Console.WriteLine($"淇濆瓨璺緞: {savePath}");
+
+ // 纭繚鐩綍瀛樺湪
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
+ Console.WriteLine($"宸插垱寤虹洰褰�: {directory}");
}
- string[] files = Directory.GetFiles(directory);
- // 鍒犻櫎姣忎釜鏂囦欢
- foreach (string filePath in files)
+ // 娓呯悊鐩綍涓嬬幇鏈夋枃浠�
+ if (File.Exists(savePath))
{
- File.Delete(filePath);
+ File.Delete(savePath);
+ Console.WriteLine($"宸插垹闄ゆ棫鏂囦欢: {savePath}");
}
- // 浣跨敤 HttpClient 涓嬭浇鏂囦欢
+
+ // 浣跨敤涓存椂鏂囦欢鍚嶄笅杞斤紝涓嬭浇瀹屾垚鍚庡啀閲嶅懡鍚�
+ string tempFilePath = savePath + ".tmp";
+
+ // 寮傛涓嬭浇鏂囦欢
using (var httpClient = new HttpClient())
{
- // 璁剧疆瓒呮椂鏃堕棿锛堝竼杞姤琛ㄧ敓鎴愬彲鑳介渶瑕佽緝闀挎椂闂达級
httpClient.Timeout = TimeSpan.FromMinutes(5);
- // 鍙戦�� GET 璇锋眰锛堝悓姝ユ柟寮忥級
- using (var response = httpClient.GetAsync(reportUrl, HttpCompletionOption.ResponseHeadersRead).GetAwaiter().GetResult())
+ using (var response = await httpClient.GetAsync(reportUrl, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false))
{
- // 妫�鏌ュ搷搴旂姸鎬�
response.EnsureSuccessStatusCode();
- // 鑾峰彇鍐呭娴侊紙鍚屾鏂瑰紡锛�
- using (var contentStream = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult())
+ using (var contentStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
{
- // 鍒涘缓鏂囦欢娴�
- using (var fileStream = new FileStream(savePath, FileMode.Create, FileAccess.Write, FileShare.None))
+ Console.WriteLine($"寮�濮嬪啓鍏ヤ复鏃舵枃浠�: {tempFilePath}");
+
+ using (var fileStream = new FileStream(
+ tempFilePath,
+ FileMode.Create,
+ FileAccess.Write,
+ FileShare.None,
+ bufferSize: 4096,
+ useAsync: true
+ ))
{
- // 澶嶅埗鍐呭鍒版枃浠讹紙鍚屾鏂瑰紡锛�
- contentStream.CopyToAsync(fileStream).GetAwaiter().GetResult();
+ await contentStream.CopyToAsync(fileStream).ConfigureAwait(false);
+ await fileStream.FlushAsync().ConfigureAwait(false);
+ Console.WriteLine($"涓存椂鏂囦欢鍐欏叆瀹屾垚: {tempFilePath}");
}
}
}
}
- return savePath;
+ // 鍏抽敭浼樺寲锛氱‘淇濇枃浠跺畬鍏ㄥ啓鍏ョ鐩�
+ await EnsureFileCompletelyWritten(tempFilePath);
+
+ // 閲嶅懡鍚嶄负鐩爣鏂囦欢
+ File.Move(tempFilePath, savePath, true);
+ Console.WriteLine($"鏂囦欢閲嶅懡鍚嶅畬鎴�: {savePath}");
+
+ // 楠岃瘉鏂囦欢鍙闂�
+ await ValidateFileAccessible(savePath);
+
+ // 鎵撳嵃鏂囦欢
+ PrintTestDirect(savePath);
+
+ return savePath;
}
catch (Exception ex)
{
- throw new ValidationException(ex.Message);
+ Console.WriteLine($"涓嬭浇澶辫触: {ex.Message}");
+ throw new InvalidOperationException($"鏂囦欢涓嬭浇寮傚父: {ex.Message}", ex);
}
}
- public virtual void printTest(string fullPath)
+ /// <summary>
+ /// 纭繚鏂囦欢瀹屽叏鍐欏叆纾佺洏
+ /// </summary>
+ private async Task EnsureFileCompletelyWritten(string filePath)
{
- Spire.Pdf.PdfDocument pdf = new PdfDocument();
- //鏂囦欢鍦板潃
- pdf.LoadFromFile(fullPath);
- //鎸囧畾鎵撳嵃鏈轰綅缃�
- string url = AppSettings.app("PrinterName");
- pdf.PrintSettings.PrinterName = url;
- //鎵ц鎵撳嵃
- pdf.Print();
- //鍐呭瓨閲婃斁
- pdf.Dispose();
+ const int maxRetries = 5;
+ const int delayMs = 500;
+ for (int i = 0; i < maxRetries; i++)
+ {
+ try
+ {
+ // 灏濊瘯浠ヨ鍙栨ā寮忔墦寮�鏂囦欢锛岀‘淇濇枃浠舵病鏈夎鍗犵敤
+ using (var fs = new FileStream(filePath,
+ FileMode.Open,
+ FileAccess.Read,
+ FileShare.Read,
+ bufferSize: 4096,
+ useAsync: true))
+ {
+ // 楠岃瘉鏂囦欢鏈夊唴瀹�
+ if (fs.Length > 0)
+ {
+ Console.WriteLine($"鏂囦欢楠岃瘉鎴愬姛: 澶у皬={fs.Length}瀛楄妭 (灏濊瘯 {i + 1}/{maxRetries})");
+ return;
+ }
+ else
+ {
+ Console.WriteLine($"璀﹀憡: 鏂囦欢澶у皬涓�0 (灏濊瘯 {i + 1}/{maxRetries})");
+ }
+ }
+ }
+ catch (IOException ex)
+ {
+ Console.WriteLine($"鏂囦欢鍙兘浠嶅湪鍐欏叆涓� (灏濊瘯 {i + 1}/{maxRetries}): {ex.Message}");
+ }
+
+ if (i < maxRetries - 1)
+ {
+ await Task.Delay(delayMs);
+ }
+ }
+
+ throw new IOException($"鏂囦欢鍐欏叆鏈畬鎴愭垨鏃犳硶璁块棶: {filePath}");
+ }
+
+ /// <summary>
+ /// 楠岃瘉鏂囦欢鍙闂笖涓嶄负绌�
+ /// </summary>
+ private async Task ValidateFileAccessible(string filePath)
+ {
+ const int maxRetries = 3;
+ const int delayMs = 300;
+
+ for (int i = 0; i < maxRetries; i++)
+ {
+ try
+ {
+ if (!File.Exists(filePath))
+ {
+ throw new FileNotFoundException($"鏂囦欢涓嶅瓨鍦�: {filePath}");
+ }
+
+ var fileInfo = new FileInfo(filePath);
+
+ // 楠岃瘉鏂囦欢澶у皬澶т簬0
+ if (fileInfo.Length == 0)
+ {
+ throw new InvalidDataException($"鏂囦欢澶у皬涓�0: {filePath}");
+ }
+
+ // 楠岃瘉鏂囦欢涓嶆槸瀹屽叏鐢辩┖瀛楃缁勬垚锛堝彲閫夋鏌ワ級
+ await ValidateFileContent(filePath);
+
+ Console.WriteLine($"鏂囦欢楠岃瘉閫氳繃: {filePath} (澶у皬={fileInfo.Length}瀛楄妭)");
+ return;
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"鏂囦欢楠岃瘉澶辫触 (灏濊瘯 {i + 1}/{maxRetries}): {ex.Message}");
+
+ if (i == maxRetries - 1)
+ {
+ throw;
+ }
+
+ await Task.Delay(delayMs);
+ }
+ }
+ }
+
+ /// <summary>
+ /// 楠岃瘉鏂囦欢鍐呭锛堝彲閫夛級
+ /// </summary>
+ private async Task ValidateFileContent(string filePath)
+ {
+ try
+ {
+ // 璇诲彇鏂囦欢鍓嶅嚑涓瓧鑺傦紝纭繚涓嶆槸瀹屽叏鐢辩┖瀛楃缁勬垚
+ using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true))
+ {
+ byte[] buffer = new byte[Math.Min(1024, fs.Length)];
+ int bytesRead = await fs.ReadAsync(buffer, 0, buffer.Length);
+
+ // 妫�鏌ユ槸鍚﹂兘鏄�0锛堢┖鏂囦欢锛�
+ if (bytesRead > 0 && buffer.All(b => b == 0))
+ {
+ throw new InvalidDataException("鏂囦欢鍐呭寮傚父: 鍏ㄩ儴涓�0瀛楄妭");
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"鏂囦欢鍐呭楠岃瘉寮傚父: {ex.Message}");
+ // 鍙互閫夋嫨鏄惁鎶涘嚭寮傚父
+ }
+ }
+
+ public virtual void PrintTestDirect(string fullPath)
+ {
+ const int maxRetryCount = 3;
+ const int retryDelayMs = 1000;
+
+ if (!File.Exists(fullPath))
+ {
+ Console.WriteLine($"鎵撳嵃澶辫触锛氭枃浠朵笉瀛樺湪 {fullPath}");
+ return;
+ }
+
+ // 鑾峰彇鎵撳嵃鏈哄悕绉�
+ string printerName = AppSettings.app("PrinterName");
+
+ // 灏濊瘯涓嶅悓鐨勬墦鍗版柟娉�
+ for (int retryCount = 0; retryCount < maxRetryCount; retryCount++)
+ {
+ try
+ {
+ Console.WriteLine($"灏濊瘯鎵撳嵃 (鏂规硶 {retryCount + 1}/{maxRetryCount}): {fullPath}");
+
+ switch (retryCount)
+ {
+ case 0:
+ // 鏂规硶1: 浣跨敤鍘熷鎵撳嵃鍛戒护
+ PrintUsingRawCommand(fullPath, printerName);
+ break;
+ case 1:
+ // 鏂规硶3: 鐩存帴浣跨敤Spire.PDF浣嗙畝鍖栬缃�
+ PrintUsingSpireSimple(fullPath, printerName);
+ break;
+ case 2:
+ // 鏂规硶3: 鐩存帴浣跨敤Spire.PDF浣嗙畝鍖栬缃�
+ PrintUsingSpireSimple(fullPath, printerName);
+ break;
+ }
+
+ Console.WriteLine("鎵撳嵃浠诲姟鍙戦�佹垚鍔�");
+ return;
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"鎵撳嵃鏂规硶 {retryCount + 1} 澶辫触: {ex.Message}");
+
+ if (retryCount < maxRetryCount - 1)
+ {
+ Thread.Sleep(retryDelayMs);
+ }
+ }
+ }
+
+ Console.WriteLine("鎵�鏈夋墦鍗版柟娉曢兘澶辫触");
+ }
+
+ /// <summary>
+ /// 浣跨敤鍘熷鎵撳嵃鍛戒护
+ /// </summary>
+ private void PrintUsingRawCommand(string filePath, string printerName)
+ {
+ try
+ {
+ // 鏂规硶1: 浣跨敤Process鐩存帴鎵撳嵃
+ var process = new System.Diagnostics.Process();
+ process.StartInfo.FileName = filePath;
+ process.StartInfo.Verb = "print";
+ process.StartInfo.CreateNoWindow = true;
+ process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
+ process.Start();
+
+ // 绛夊緟涓�娈垫椂闂磋鎵撳嵃浠诲姟鎻愪氦
+ if (!process.WaitForExit(5000))
+ {
+ Console.WriteLine("鎵撳嵃杩涚▼鏈強鏃堕��鍑猴紝浣嗕换鍔″彲鑳藉凡鎻愪氦");
+ }
+ }
+ catch
+ {
+ // 濡傛灉涓婅堪鏂规硶澶辫触锛屽皾璇曚娇鐢╮undll32
+ try
+ {
+ var args = $@"/c rundll32.exe C:\Windows\System32\shimgvw.dll,ImageView_PrintTo ""{filePath}"" ""{printerName}""";
+ System.Diagnostics.Process.Start("cmd.exe", args);
+ }
+ catch
+ {
+ throw;
+ }
+ }
+ }
+
+ /// <summary>
+ /// 浣跨敤Spire.PDF浣嗙畝鍖栬缃�
+ /// </summary>
+ private void PrintUsingSpireSimple(string filePath, string printerName)
+ {
+ using (Spire.Pdf.PdfDocument pdf = new Spire.Pdf.PdfDocument())
+ {
+ // 浣跨敤鏈�灏忛厤缃姞杞芥枃浠�
+ pdf.LoadFromFile(filePath);
+
+ // 璁剧疆鍩烘湰鎵撳嵃鏈轰俊鎭�
+ if (!string.IsNullOrEmpty(printerName))
+ {
+ pdf.PrintSettings.PrinterName = printerName;
+ }
+
+ // 鐩存帴鎵撳嵃锛屼笉妫�鏌�
+ pdf.Print();
+ }
+ }
+
+ /// <summary>
+ /// 妫�鏌ユ枃浠舵槸鍚﹀彲璁块棶
+ /// </summary>
+ private bool IsFileAccessible(string filePath)
+ {
+ try
+ {
+ using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
+ {
+ return fs.Length > 0;
+ }
+ }
+ catch
+ {
+ return false;
+ }
+ }
+
+ /// <summary>
+ /// 灏濊瘯寮哄埗鍨冨溇鍥炴敹锛岄噴鏀惧彲鑳藉瓨鍦ㄧ殑鏂囦欢鍙ユ焺
+ /// </summary>
+ private void TryForceGarbageCollection()
+ {
+ try
+ {
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ Console.WriteLine("宸叉墽琛屽瀮鍦惧洖鏀�");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"鍨冨溇鍥炴敹澶辫触: {ex.Message}");
+ }
}
--
Gitblit v1.9.3