From b1a419c2886666934da6499ee552516d0769562e Mon Sep 17 00:00:00 2001
From: heshaofeng <heshaofeng@hnkhzn.com>
Date: 星期四, 16 四月 2026 13:40:56 +0800
Subject: [PATCH] Merge branch 'htq20251215' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxiangmu into htq20251215
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs | 464 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 437 insertions(+), 27 deletions(-)
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs"
index 6a79f4c..0089f6b 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs"
@@ -70,6 +70,7 @@
public readonly IRepository<Dt_InboundOrder> _inboundOrderRepository;
public readonly IRepository<Dt_WarehouseArea> _warehouseAreaRepository;
public readonly IRepository<Dt_LocationType> _locationTypeRepository;
+ public readonly IRepository<Dt_OutboundOrderDetail> _outboundOrderDetailRepository;
private Dictionary<string, string> stations = new Dictionary<string, string>
{
@@ -83,7 +84,7 @@
{"3-1","3-5" },
};
- public OutboundService(IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_OutboundOrderDetail> detailRepository, IRepository<Dt_OutboundOrder> outboundRepository, IRepository<Dt_OutStockLockInfo> outboundLockInfoRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_StockInfoDetail> stockDetailRepository, IRepository<Dt_StockQuantityChangeRecord> stockChangeRepository, IRepository<Dt_StockInfoDetail_Hty> stockDetailHistoryRepository, IBasicService basicService, IOutboundOrderDetailService outboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutStockLockInfoService outboundStockLockInfoService, IFeedbackMesService feedbackMesService, IRepository<Dt_Task> taskRepository, ILocationInfoService locationInfoService, IESSApiService eSSApiService, IRepository<Dt_AllocateOrder> allocateOrderRepository, IRepository<Dt_AllocateMaterialInfo> allocateMaterialInfoRepository, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_InboundOrder> inboundOrderRepository, IRepository<Dt_LocationType> locationTypeRepository, IRepository<Dt_WarehouseArea> warehouseAreaRepository)
+ public OutboundService(IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_OutboundOrderDetail> detailRepository, IRepository<Dt_OutboundOrder> outboundRepository, IRepository<Dt_OutStockLockInfo> outboundLockInfoRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_StockInfoDetail> stockDetailRepository, IRepository<Dt_StockQuantityChangeRecord> stockChangeRepository, IRepository<Dt_StockInfoDetail_Hty> stockDetailHistoryRepository, IBasicService basicService, IOutboundOrderDetailService outboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutStockLockInfoService outboundStockLockInfoService, IFeedbackMesService feedbackMesService, IRepository<Dt_Task> taskRepository, ILocationInfoService locationInfoService, IESSApiService eSSApiService, IRepository<Dt_AllocateOrder> allocateOrderRepository, IRepository<Dt_AllocateMaterialInfo> allocateMaterialInfoRepository, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_InboundOrder> inboundOrderRepository, IRepository<Dt_LocationType> locationTypeRepository, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IRepository<Dt_OutboundOrderDetail> outboundOrderDetailRepository)
{
_mapper = mapper;
_unitOfWorkManage = unitOfWorkManage;
@@ -110,6 +111,7 @@
_inboundOrderRepository = inboundOrderRepository;
_locationTypeRepository = locationTypeRepository;
_warehouseAreaRepository = warehouseAreaRepository;
+ _outboundOrderDetailRepository = outboundOrderDetailRepository;
}
public WebResponseContent PrintFromData (string barcode)
@@ -330,7 +332,19 @@
foreach (var detail in materielCalc.Details)
{
if (remainingToLock <= 0) break;
- decimal maxLockableQty = detail.OrderQuantity - detail.OverOutQuantity;
+ decimal maxLockableQty = 0;
+ if (detail.LockQuantity > detail.OverOutQuantity && detail.OverOutQuantity > 0)
+ {
+ maxLockableQty = detail.OrderQuantity - detail.LockQuantity;
+ }
+ else if(detail.OverOutQuantity > 0)
+ {
+ maxLockableQty = detail.OrderQuantity - detail.OverOutQuantity;
+ }
+ else
+ {
+ maxLockableQty = detail.OrderQuantity - detail.OverOutQuantity - detail.LockQuantity;
+ }
if (maxLockableQty <= 0) continue;
decimal currentLockQty = Math.Min(remainingToLock, maxLockableQty);
detail.LockQuantity += currentLockQty;
@@ -344,7 +358,7 @@
_detailRepository.UpdateData(outboundOrderDetails);
if (pickedDetails.Any())
{
- UpdateStockStatus(pickedDetails.Select(x => x.PalletCode).ToList(), StockStatusEmun.鍑哄簱閿佸畾.ObjToInt());
+ UpdateStockStatus(pickedDetails.Select(x => x.PalletCode).ToList(), StockStatusEmun.鍑哄簱閿佸畾.ObjToInt(),outboundOrder);
UpdateLocationStatus(pickedDetails.Select(x => x.LocationCode).ToList(), LocationStatusEnum.Lock.ObjToInt());
}
//閲嶆鍗曚笉鎷i�夛紝鍘绘帀閿佸畾璁板綍鍥炲簱锛屽啀娆$粍鐩樻椂鎵i櫎鍘熸潯鐮�
@@ -970,11 +984,16 @@
}
}
- public bool UpdateStockStatus(List<string> palletCodes, int status)
+ public bool UpdateStockStatus(List<string> palletCodes, int status,Dt_OutboundOrder outOrder)
{
try
{
List<Dt_StockInfo> stockInfos = _stockInfoRepository.QueryData(x => palletCodes.Contains(x.PalletCode));
+ ///鏅轰粨璋冩櫤浠撳崟鎹褰�
+ if(outOrder.OrderType == 117)
+ {
+ stockInfos.ForEach(stockInfo => stockInfo.Remark = outOrder.OrderNo);
+ }
stockInfos.ForEach(stockInfo => stockInfo.StockStatus = status);
_stockInfoRepository.UpdateData(stockInfos);
return true;
@@ -1364,9 +1383,13 @@
Func<Dt_OutStockLockInfo, bool> wareWhere = x => string.IsNullOrEmpty(outboundOrderDetails.First().WarehouseCode) ? true : x.WarehouseCode == outboundOrderDetails.First().WarehouseCode;
- List<Dt_OutStockLockInfo> stockLockInfos = _outboundLockInfoRepository.QueryData(x =>
- x.OrderNo == request.OrderNo &&
- x.MaterielCode == stockInfoDetail.MaterielCode).Where(supWhere).Where(wareWhere).ToList();
+ var stockLockInfos = _outboundLockInfoRepository.QueryData(x =>
+ x.OrderDetailIds == lockInfo.OrderDetailIds &&
+ x.OrderNo == request.OrderNo &&
+ x.MaterielCode == stockInfoDetail.MaterielCode)
+ .Where(supWhere)
+ .Where(wareWhere)
+ .ToList();
if (stockLockInfos != null && stockLockInfos.Any())
{
_outboundLockInfoRepository.DeleteAndMoveIntoHty(stockLockInfos, WIDESEA_Core.Enums.OperateTypeEnum.鑷姩鍒犻櫎);
@@ -1792,9 +1815,13 @@
Func<Dt_OutStockLockInfo, bool> wareWhere = x => string.IsNullOrEmpty(outboundOrderDetails.First().WarehouseCode) ? true : x.WarehouseCode == outboundOrderDetails.First().WarehouseCode;
- List<Dt_OutStockLockInfo> stockLockInfos = _outboundLockInfoRepository.QueryData(x =>
- x.OrderNo == request.OrderNo &&
- x.MaterielCode == stockDetail.MaterielCode).Where(supWhere).Where(wareWhere).ToList();
+ var stockLockInfos = _outboundLockInfoRepository.QueryData(x =>
+ x.OrderDetailIds == lockInfo.OrderDetailIds &&
+ x.OrderNo == request.OrderNo &&
+ x.MaterielCode == stockDetail.MaterielCode)
+ .Where(supWhere)
+ .Where(wareWhere)
+ .ToList();
if (stockLockInfos != null && stockLockInfos.Any())
{
_outboundLockInfoRepository.DeleteAndMoveIntoHty(stockLockInfos, WIDESEA_Core.Enums.OperateTypeEnum.鑷姩鍒犻櫎);
@@ -1970,6 +1997,7 @@
OperateType = "鍑哄簱瀹屾垚",
InsertTime = DateTime.Now,
StockId = stockDetail.StockId,
+ Barcode = stockDetail.Barcode,
MaterielCode = stockDetail.MaterielCode,
MaterielName = stockDetail.MaterielName,
OrderNo = stockDetail.OrderNo,
@@ -1987,6 +2015,7 @@
Creater = stockDetail.Creater,
CreateDate = stockDetail.CreateDate,
WarehouseCode = stockDetail.WarehouseCode,
+ ValidDate = stockDetail.ValidDate,
Remark = $"鍑哄簱瀹屾垚鍒犻櫎锛屾潯鐮侊細{request.Barcode}锛屽師鏁伴噺锛歿stockDetail.StockQuantity}锛屽嚭搴撴暟閲忥細{actualOutboundQuantity}锛屾搷浣滆�咃細{request.Operator}"
};
_stockDetailHistoryRepository.AddData(historyRecord);
@@ -2227,6 +2256,48 @@
return content.Error($"鏈壘鍒版墭鐩榹palletCode}搴撳瓨淇℃伅涓嶅厑璁稿洖搴�");
}
+ var task = await _taskRepository.Db.Queryable<Dt_Task>()
+ .Where(x => x.PalletCode == palletCode)
+ .FirstAsync();
+
+ if (task != null)
+ {
+ return content.Error($"鎵樼洏{palletCode}瀛樺湪浠诲姟鍥炲簱澶辫触!");
+ }
+
+ // 鍒嗛厤鏂拌揣浣�
+ var newLocation = _locationInfoService.AssignLocation(stock.LocationType);
+
+ if (newLocation == null)
+ {
+ return WebResponseContent.Instance.Error("娌℃湁绌洪棽搴撲綅鍙洖搴�");
+ }
+
+ if(stock.Remark !=null && stock.Remark != "")
+ {
+ Dt_OutboundOrder outboundOrder = _outboundRepository.QueryFirst(x => x.OrderNo == stock.Remark && x.OrderType == 117 && x.OrderStatus == OutOrderStatusEnum.鍑哄簱涓�.ObjToInt());
+ if (outboundOrder != null)
+ {
+ // 1. 鏍规嵁璁㈠崟鍙锋煡璇㈣皟鎷ㄧ墿鏂欎俊鎭�
+ List<Dt_AllocateMaterialInfo> allocateMaterialInfos = _allocateMaterialInfoRepository.QueryData(x => x.OrderNo == outboundOrder.OrderNo);
+
+ // 2. 鍒ゆ柇鏄惁瀛樺湪璋冩嫧鐗╂枡锛屾病鏈夊垯鐩存帴璺宠繃鏍¢獙
+ if (allocateMaterialInfos != null && allocateMaterialInfos.Any())
+ {
+ // 3. 鎻愬彇鎵�鏈� Barcode 闆嗗悎
+ List<string> barcodes = allocateMaterialInfos.Select(x => x.Barcode).ToList();
+
+ // 4. 鏍规嵁 Barcode 鎵归噺鏌ヨ搴撳瓨鏄庣粏
+ List<Dt_StockInfoDetail> stockInfoDetails = _stockDetailRepository.QueryData(x => barcodes.Contains(x.Barcode) && x.OrderNo == outboundOrder.OrderNo);
+
+ // 5. 鏁伴噺瀵规瘮锛氫笉鐩哥瓑 鈫� 鏈叏閮ㄧ粍鐩樺畬鎴�
+ if (barcodes.Count != stockInfoDetails.Count)
+ {
+ return WebResponseContent.Instance.Error($"鏅轰粨璋冩櫤浠撳崟鎹畕outboundOrder.OrderNo}灏氭湭鍏ㄩ儴缁勭洏瀹屾垚锛岃鍏堣繘琛岀粍鐩樺啀鍥炲簱鍗曟嵁鐩稿叧鏂欑");
+ }
+ }
+ }
+ }
if (stock.Details.Count <= 0)
{
stock.PalletType = (int)PalletTypeEnum.Empty;
@@ -2332,23 +2403,6 @@
stock.LocationCode = "";
}
- var task = await _taskRepository.Db.Queryable<Dt_Task>()
- .Where(x => x.PalletCode == palletCode)
- .FirstAsync();
-
- if (task != null)
- {
- return content.Error($"鎵樼洏{palletCode}瀛樺湪浠诲姟鍥炲簱澶辫触!");
- }
-
- // 鍒嗛厤鏂拌揣浣�
- var newLocation = _locationInfoService.AssignLocation(stock.LocationType);
-
- if(newLocation == null)
- {
- return WebResponseContent.Instance.Error("娌℃湁绌洪棽搴撲綅鍙洖搴�");
- }
-
var newTask = new Dt_Task()
{
CurrentAddress = stations.GetValueOrDefault(station) ?? "",
@@ -2444,6 +2498,362 @@
#endregion
+ #region 鎾ら攢鎷i��
+ /// <summary>
+ /// 鎾ら攢鎷i�夋潯鐮侊紙鍙嶅悜鍥炴粴鍑哄簱鎷i�夋搷浣滐級
+ /// </summary>
+ /// <param name="request">鎾ら攢鎷i�夎姹傦紙鑷冲皯鍖呭惈鏉$爜銆佽鍗曞彿銆佹墭鐩樺彿锛�</param>
+ /// <returns>鎾ら攢鍝嶅簲</returns>
+ public WebResponseContent ReversePicking(ReversePickingRequestDTO request)
+ {
+ WebResponseContent content = WebResponseContent.Instance;
+ ReversePickingResponseDTO response = new ReversePickingResponseDTO();
+ try
+ {
+ if (string.IsNullOrWhiteSpace(request.Barcode) || string.IsNullOrWhiteSpace(request.OrderNo) || string.IsNullOrWhiteSpace(request.PalletCode))
+ {
+ response.Success = false;
+ response.Message = "鏉$爜銆佽鍗曞彿銆佹墭鐩樺彿涓嶈兘涓虹┖";
+ return WebResponseContent.Instance.Error(response.Message);
+ }
+
+ Dt_StockInfo stockInfo = _stockInfoRepository.QueryFirst(x => x.PalletCode == request.PalletCode);
+ if (stockInfo == null)
+ {
+ response.Success = false;
+ response.Message = $"鎵樼洏鍙� {request.PalletCode} 瀵瑰簲鐨勫簱瀛樹笉瀛樺湪";
+ return WebResponseContent.Instance.Error(response.Message);
+ }
+
+ Dt_OutboundOrder outboundOrder = _outboundRepository.QueryFirst(o => o.OrderNo == request.OrderNo);
+ if (outboundOrder == null)
+ {
+ response.Success = false;
+ response.Message = $"鍑哄簱鍗� {request.OrderNo} 涓嶅瓨鍦�";
+ return WebResponseContent.Instance.Error(response.Message);
+ }
+
+ Dt_StockInfoDetail_Hty historyDetail = _stockDetailHistoryRepository.QueryFirst(x =>
+ x.Barcode == request.Barcode &&
+ (x.OperateType == "鍑哄簱瀹屾垚" || x.OperateType == "鎷嗗寘-鍘熷璁板綍"));
+
+ if (historyDetail != null)
+ {
+ double minutesDiff = (DateTime.Now - historyDetail.InsertTime).TotalMinutes;
+ if (minutesDiff >= 30)
+ {
+ return WebResponseContent.Instance.Error($"鏉$爜{request.Barcode}宸叉棤娉曟挙閿�");
+ }
+ }
+ else
+ {
+ return WebResponseContent.Instance.Error($"鏉$爜{request.Barcode}宸叉棤娉曟挙閿�");
+ }
+
+ Dt_OutStockLockInfo lockInfo = _outboundLockInfoRepository.QueryFirst(x =>
+ x.OrderNo == request.OrderNo &&
+ x.StockId == stockInfo.Id &&
+ x.MaterielCode == historyDetail.MaterielCode &&
+ x.PalletCode == stockInfo.PalletCode);
+
+ if (lockInfo == null)
+ {
+ return WebResponseContent.Instance.Error("璇ユ墭鐩樺凡鍏ㄩ儴鎷i�夊畬,涓嶅厑璁告挙閿�");
+ }
+
+ var details = _outboundOrderDetailRepository.QueryData(x => x.OrderId == outboundOrder.Id);
+
+ var outboundDetails = details
+ .Where(x =>
+ x.MaterielCode == historyDetail.MaterielCode
+ &&
+ !string.IsNullOrEmpty(lockInfo.OrderDetailIds)
+ &&
+ lockInfo.OrderDetailIds.Split(",")
+ .Any(idStr => idStr.Trim() == x.Id.ToString())
+ ).ToList();
+
+ var detail = outboundDetails.FirstOrDefault();
+ if (detail != null && !string.IsNullOrEmpty(detail.ReturnJsonData))
+ {
+ try
+ {
+ string deleteBarcode = request.Barcode;
+
+ var list = JsonConvert.DeserializeObject<List<BarcodeItem>>(detail.ReturnJsonData);
+ if (list != null)
+ {
+ var filteredList = list.Where(x => x.barcode != deleteBarcode).ToList();
+
+ detail.ReturnJsonData = JsonConvert.SerializeObject(filteredList);
+ _outboundOrderDetailRepository.UpdateData(detail);
+ }
+ }
+ catch
+ {
+
+ }
+ }
+
+ _unitOfWorkManage.BeginTran();
+ try
+ {
+ bool isUnpack = historyDetail.OperateType == "鎷嗗寘-鍘熷璁板綍";
+ if (isUnpack)
+ {
+ return WebResponseContent.Instance.Error("璇ユ潯鐮佸凡鎷嗗寘锛屼笉鍏佽鎾ら攢");
+ }
+ else
+ {
+ ReverseFullOutboundOperation(historyDetail, stockInfo, request);
+ }
+
+ RollbackOutboundOrderDetails(historyDetail.MaterielCode, request.OrderNo, historyDetail.StockQuantity, stockInfo.Id);
+
+ lockInfo.SortedQuantity = Math.Max(0, (decimal)(lockInfo.SortedQuantity - historyDetail.StockQuantity));
+ _outboundLockInfoRepository.UpdateData(lockInfo);
+
+ _stockDetailHistoryRepository.DeleteData(historyDetail);
+
+ DeleteStockChangeRecord(request.Barcode, request.OrderNo);
+
+ if (!CheckOutboundOrderCompleted(request.OrderNo))
+ {
+ UpdateOutboundOrderStatus(request.OrderNo, OutOrderStatusEnum.鍑哄簱涓�.ObjToInt());
+ }
+
+ _unitOfWorkManage.CommitTran();
+
+ response.Success = true;
+ response.Message = $"鏉$爜 {request.Barcode} 鎾ら攢鎷i�夋垚鍔�";
+ response.Barcode = request.Barcode;
+ response.RestoredQuantity = historyDetail.StockQuantity;
+
+ content = WebResponseContent.Instance.OK(data: response);
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ response.Success = false;
+ response.Message = $"鎾ら攢鎷i�夊け璐ワ細{ex.Message}";
+ content = WebResponseContent.Instance.Error(response.Message);
+ }
+ }
+ catch (Exception ex)
+ {
+ response.Success = false;
+ response.Message = $"澶勭悊鎾ら攢鎷i�夊け璐ワ細{ex.Message}";
+ content = WebResponseContent.Instance.Error(response.Message);
+ }
+
+ return content;
+ }
+
+ /// <summary>
+ /// 鎾ら攢鎷嗗寘鍑哄簱鎿嶄綔锛堝弽鍚戞仮澶嶆媶鍖呭墠鐘舵�侊級
+ /// </summary>
+ private void ReverseUnpackOperation(Dt_StockInfoDetail_Hty historyDetail, Dt_StockInfo stockInfo, ReversePickingRequestDTO request, Dt_OutboundOrder outboundOrder)
+ {
+ Dt_StockInfoDetail currentDetail = _stockDetailRepository.QueryFirst(x =>
+ x.Barcode == request.Barcode &&
+ x.StockId == stockInfo.Id &&
+ x.MaterielCode == historyDetail.MaterielCode);
+
+ if (currentDetail != null)
+ {
+ currentDetail.StockQuantity = historyDetail.StockQuantity;
+ currentDetail.Remark = $"鎾ら攢鎷嗗寘鎷i�夛紝鎭㈠鍘熷鏁伴噺锛歿historyDetail.StockQuantity}锛屾搷浣滆�咃細{request.Operator}";
+ _stockDetailRepository.UpdateData(currentDetail);
+ }
+ else
+ {
+ Dt_StockInfoDetail restoreDetail = new Dt_StockInfoDetail
+ {
+ StockId = historyDetail.StockId,
+ MaterielCode = historyDetail.MaterielCode,
+ MaterielName = historyDetail.MaterielName,
+ Barcode =historyDetail.Barcode,
+ OrderNo = historyDetail.OrderNo,
+ BatchNo = historyDetail.BatchNo,
+ ProductionDate = historyDetail.ProductionDate,
+ EffectiveDate = historyDetail.EffectiveDate,
+ SerialNumber = historyDetail.SerialNumber,
+ StockQuantity = historyDetail.StockQuantity,
+ OutboundQuantity = historyDetail.OutboundQuantity,
+ Status = historyDetail.Status,
+ Unit = historyDetail.Unit,
+ InboundOrderRowNo = historyDetail.InboundOrderRowNo,
+ SupplyCode = historyDetail.SupplyCode,
+ Creater = request.Operator,
+ CreateDate = DateTime.Now,
+ FactoryArea = historyDetail.FactoryArea,
+ WarehouseCode = historyDetail.WarehouseCode,
+ Remark = $"鎾ら攢鎷嗗寘鎷i�夛紝閲嶆柊鍒涘缓搴撳瓨鏄庣粏锛屾潯鐮侊細{request.Barcode}锛屾搷浣滆�咃細{request.Operator}"
+ };
+ _stockDetailRepository.AddData(restoreDetail);
+ }
+
+ List<Dt_MaterialCodeInfo> materialCodeInfos = _basicService.MaterielCodeInfoService.Repository.QueryData(x =>
+ x.OldBarcode == request.Barcode &&
+ x.OrderNo == request.OrderNo);
+ if (materialCodeInfos.Any())
+ {
+ _basicService.MaterielCodeInfoService.Repository.DeleteData(materialCodeInfos);
+ }
+
+ if (outboundOrder.OrderType == InOrderTypeEnum.InternalAllocat.ObjToInt())
+ {
+ Dt_AllocateMaterialInfo allocateMaterialInfo = _allocateMaterialInfoRepository.QueryFirst(x =>
+ x.Barcode == request.Barcode &&
+ x.OrderNo == request.OrderNo);
+ if (allocateMaterialInfo != null)
+ {
+ _allocateMaterialInfoRepository.DeleteData(allocateMaterialInfo);
+ }
+ }
+ }
+
+ /// <summary>
+ /// 鎾ら攢瀹屾暣鍑哄簱鎿嶄綔锛堟仮澶嶈鍒犻櫎鐨勫簱瀛樻槑缁嗭級
+ /// </summary>
+ private void ReverseFullOutboundOperation(Dt_StockInfoDetail_Hty historyDetail, Dt_StockInfo stockInfo, ReversePickingRequestDTO request)
+ {
+ Dt_StockInfoDetail restoreDetail = new Dt_StockInfoDetail
+ {
+
+ StockId = historyDetail.StockId,
+ MaterielCode = historyDetail.MaterielCode,
+ MaterielName = historyDetail.MaterielName,
+ Barcode = historyDetail.Barcode,
+ OrderNo = historyDetail.OrderNo,
+ BatchNo = historyDetail.BatchNo,
+ ProductionDate = historyDetail.ProductionDate,
+ EffectiveDate = historyDetail.EffectiveDate,
+ SerialNumber = historyDetail.SerialNumber,
+ StockQuantity = historyDetail.StockQuantity,
+ OutboundQuantity = historyDetail.OutboundQuantity - historyDetail.StockQuantity,
+ Status = historyDetail.Status,
+ Unit = historyDetail.Unit,
+ InboundOrderRowNo = historyDetail.InboundOrderRowNo,
+ SupplyCode = historyDetail.SupplyCode,
+ Creater = request.Operator,
+ CreateDate = DateTime.Now,
+ FactoryArea = historyDetail.FactoryArea,
+ WarehouseCode = historyDetail.WarehouseCode,
+ Remark = $"鎾ら攢瀹屾暣鍑哄簱鎷i�夛紝鎭㈠搴撳瓨鏄庣粏锛屾潯鐮侊細{request.Barcode}锛屾搷浣滆�咃細{request.Operator}"
+ };
+
+ _stockDetailRepository.AddData(restoreDetail);
+
+ if (request.OrderType == InOrderTypeEnum.InternalAllocat.ObjToInt())
+ {
+ Dt_AllocateMaterialInfo allocateMaterialInfo = _allocateMaterialInfoRepository.QueryFirst(x =>
+ x.Barcode == request.Barcode &&
+ x.OrderNo == request.OrderNo);
+ if (allocateMaterialInfo != null)
+ {
+ _allocateMaterialInfoRepository.DeleteData(allocateMaterialInfo);
+ }
+ }
+ }
+
+ /// <summary>
+ /// 鍥炴粴鍑哄簱鍗曟槑缁嗭紙鎵e噺宸插嚭搴撴暟閲忥級
+ /// </summary>
+ private void RollbackOutboundOrderDetails(string materielCode, string orderNo, decimal rollbackQuantity, int stockId)
+ {
+ Dt_OutboundOrder outboundOrder = _outboundRepository.QueryFirst(x => x.OrderNo == orderNo);
+ List<Dt_OutboundOrderDetail> details = _detailRepository.QueryData(x =>
+ x.OrderId == outboundOrder.Id &&
+ x.MaterielCode == materielCode &&
+ x.OverOutQuantity > 0);
+
+ if (!details.Any()) return;
+
+ decimal remainingRollbackQty = rollbackQuantity;
+ foreach (var detail in details)
+ {
+ if (remainingRollbackQty <= 0) break;
+
+ decimal rollbackQty = Math.Min(remainingRollbackQty, detail.OverOutQuantity);
+
+ detail.OverOutQuantity -= rollbackQty;
+ detail.CurrentDeliveryQty -= rollbackQty;
+
+ if (detail.OrderDetailStatus == (int)OrderDetailStatusEnum.Over && detail.OverOutQuantity < detail.OrderQuantity - detail.MoveQty)
+ {
+ detail.OrderDetailStatus = (int)OrderDetailStatusEnum.New;
+ }
+
+ if (!string.IsNullOrEmpty(detail.ReturnJsonData))
+ {
+ List<Barcodes> barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(detail.ReturnJsonData) ?? new List<Barcodes>();
+ var targetBarcode = barcodesList.FirstOrDefault(x => x.Barcode == materielCode);
+ if (targetBarcode != null)
+ {
+ barcodesList.Remove(targetBarcode);
+ detail.ReturnJsonData = JsonConvert.SerializeObject(barcodesList, new JsonSerializerSettings
+ {
+ ContractResolver = new CamelCasePropertyNamesContractResolver()
+ });
+ }
+ }
+
+ _detailRepository.UpdateData(detail);
+ remainingRollbackQty -= rollbackQty;
+ }
+ }
+
+ /// <summary>
+ /// 鍒犻櫎搴撳瓨鍙樺姩璁板綍锛堟嫞閫夋椂鐢熸垚鐨勶級
+ /// </summary>
+ private void DeleteStockChangeRecord(string barcode, string orderNo)
+ {
+ Dt_StockQuantityChangeRecord changeRecord = _stockChangeRepository.QueryFirst(x =>
+ x.OriginalSerilNumber == barcode &&
+ x.OrderNo == orderNo &&
+ x.ChangeType == (int)StockChangeTypeEnum.Outbound);
+ if (changeRecord != null)
+ {
+ _stockChangeRepository.DeleteData(changeRecord);
+ }
+ }
+
+
+ #endregion
+
+
+ }
+
+ /// <summary>
+ /// 鏉$爜鏄庣粏瀹炰綋
+ /// </summary>
+ public class BarcodeItem
+ {
+ /// <summary>
+ /// 鏉$爜
+ /// </summary>
+ public string barcode { get; set; }
+
+ /// <summary>
+ /// 鏁伴噺
+ /// </summary>
+ public decimal qty { get; set; }
+
+ /// <summary>
+ /// 渚涘簲鍟嗙紪鐮�
+ /// </summary>
+ public string supplyCode { get; set; }
+
+ /// <summary>
+ /// 鎵规鍙�
+ /// </summary>
+ public string batchNo { get; set; }
+
+ /// <summary>
+ /// 鍗曚綅
+ /// </summary>
+ public string unit { get; set; }
}
}
--
Gitblit v1.9.3