From 246622a6e9c2563bd21d627c21c6012017f0f04e Mon Sep 17 00:00:00 2001
From: pan <antony1029@163.com>
Date: 星期四, 20 十一月 2025 15:54:03 +0800
Subject: [PATCH] 提交
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/SplitPackageService.cs | 476 +++++++++++++------
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs | 4
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_PickingRecord.cs | 10
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/OutLockStockStatusEnum.cs | 5
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs | 866 +++++++++++++++++++++++++++--------
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/Outbound/OutboundOrderGetDTO.cs | 26 +
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs | 21
7 files changed, 1,030 insertions(+), 378 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_Common/StockEnum/OutLockStockStatusEnum.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_Common/StockEnum/OutLockStockStatusEnum.cs"
index 7507b14..eca1209 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_Common/StockEnum/OutLockStockStatusEnum.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_Common/StockEnum/OutLockStockStatusEnum.cs"
@@ -19,8 +19,9 @@
public enum SplitPackageStatusEnum
{
宸叉媶鍖� = 1,
- 宸叉嫞閫� = 2,
- 宸插洖搴� = 3
+ 宸叉挙閿� = 2,
+ 宸叉嫞閫� = 3,
+ 宸插洖搴� = 4
}
public enum OutLockStockStatusEnum
{
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_DTO/Outbound/OutboundOrderGetDTO.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_DTO/Outbound/OutboundOrderGetDTO.cs"
index e62e839..b39c856 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_DTO/Outbound/OutboundOrderGetDTO.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_DTO/Outbound/OutboundOrderGetDTO.cs"
@@ -15,7 +15,23 @@
public int pageNo { get; set; }
}
+ // 鎷嗗寘閾綝TO
+ public class SplitPackageChainDto
+ {
+ public int Id { get; set; }
+ public DateTime SplitTime { get; set; }
+ public string Operator { get; set; }
+ public string OriginalBarcode { get; set; }
+ public string NewBarcode { get; set; }
+ public decimal SplitQty { get; set; }
+ public decimal RemainQuantity { get; set; }
+ public bool IsReverted { get; set; }
+ public DateTime? RevertTime { get; set; }
+ public int? PreviousSplitRecordId { get; set; }
+ public int NewLockInfoId { get; set; }
+ public int Status { get; set; }
+ }
// 鎷嗗寘璇锋眰
public class SplitPackageRequest
{
@@ -251,10 +267,20 @@
public string PalletCode { get; set; }
public string OriginalBarcode { get; set; }
public decimal SplitQuantity { get; set; }
+ public string MaterielCode { get; set; }
}
public class RevertSplitDto
{
public string OriginalBarcode { get; set; }
}
+
+ // 鎷嗗寘缁撴灉绫�
+ public class SplitResult
+ {
+ public string OriginalBarcode { get; set; }
+ public string NewBarcode { get; set; }
+ public decimal SplitQuantity { get; set; }
+ public decimal RemainQuantity { get; set; }
+ }
}
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_Model/Models/Outbound/Dt_PickingRecord.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_Model/Models/Outbound/Dt_PickingRecord.cs"
index cddab2f..798a774 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_Model/Models/Outbound/Dt_PickingRecord.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_Model/Models/Outbound/Dt_PickingRecord.cs"
@@ -104,6 +104,16 @@
public DateTime SplitTime { get; set; } = DateTime.Now;
public string Operator { get; set; } // 鎿嶄綔浜�
public int Status { get; set; } // 鐘舵�侊細1-宸叉媶鍖� 2-宸叉嫞閫� 3-宸插洖搴�
+
+ public DateTime RevertTime { get; set; }
+
+ public int PreviousSplitRecordId { get; set; }
+
+ [SugarColumn(IsNullable = true)]
+ public decimal? OriginalStockQuantity { get; set; }
+
+ public decimal StockBeforeSplit { get; set; }
+ public decimal AssignBeforeSplit { get; set; }
}
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/OutboundPickingService.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/OutboundPickingService.cs"
index 653f016..6d672b9 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/OutboundPickingService.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/OutboundPickingService.cs"
@@ -45,6 +45,7 @@
private readonly IRepository<Dt_Task> _taskRepository;
private readonly IESSApiService _eSSApiService;
private readonly IInvokeMESService _invokeMESService;
+ private readonly IDailySequenceService _dailySequenceService;
private readonly ILogger<OutboundPickingService> _logger;
@@ -62,7 +63,10 @@
};
- public OutboundPickingService(IRepository<Dt_PickingRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, ILocationInfoService locationInfoService, IOutboundOrderDetailService outboundOrderDetailService, ISplitPackageService splitPackageService, IOutboundOrderService outboundOrderService, IRepository<Dt_Task> taskRepository, IESSApiService eSSApiService, ILogger<OutboundPickingService> logger, IInvokeMESService invokeMESService) : base(BaseDal)
+ public OutboundPickingService(IRepository<Dt_PickingRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IStockService stockService,
+ IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, ILocationInfoService locationInfoService,
+ IOutboundOrderDetailService outboundOrderDetailService, ISplitPackageService splitPackageService, IOutboundOrderService outboundOrderService,
+ IRepository<Dt_Task> taskRepository, IESSApiService eSSApiService, ILogger<OutboundPickingService> logger, IInvokeMESService invokeMESService, IDailySequenceService dailySequenceService) : base(BaseDal)
{
_unitOfWorkManage = unitOfWorkManage;
_stockInfoService = stockInfoService;
@@ -77,6 +81,7 @@
_eSSApiService = eSSApiService;
_logger = logger;
_invokeMESService = invokeMESService;
+ _dailySequenceService = dailySequenceService;
}
@@ -141,117 +146,6 @@
}
}
-
- public async Task<WebResponseContent> ConfirmPicking(string orderNo, string palletCode, string barcode)
- {
- try
- {
- _unitOfWorkManage.BeginTran();
- var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(it => it.OrderNo == orderNo &&
- it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓� &&
- it.PalletCode == palletCode &&
- it.CurrentBarcode == barcode)
- .FirstAsync();
-
- if (lockInfo == null)
- {
- var splitBarcode = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
- .Where(it => it.NewBarcode == barcode && it.Status == 1)
- .FirstAsync();
-
- if (splitBarcode != null)
- {
- // 閫氳繃鎷嗗寘鏉$爜璁板綍鎵惧埌瀵瑰簲鐨勫嚭搴撻攣瀹氳褰�
- lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(it => it.ParentLockId == splitBarcode.OutStockLockInfoId)
- .FirstAsync();
-
- if (lockInfo == null)
- throw new Exception($"鏈壘鍒版媶鍖呮潯鐮亄barcode}瀵瑰簲鐨勫嚭搴撻攣瀹氳褰�");
- }
- else
- {
- throw new Exception($"鏉$爜{barcode}涓嶅睘浜庢墭鐩榹palletCode}鎴栦笉瀛樺湪寰呭垎鎷h褰�");
- }
-
- }
- if (lockInfo.PalletCode != palletCode)
- throw new Exception($"鏉$爜{barcode}涓嶅睘浜庢墭鐩榹palletCode}");
-
- var outorderdetail = _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>().First(x => x.Id == lockInfo.OrderDetailId);
- if (outorderdetail != null && lockInfo.AssignQuantity > outorderdetail.OrderQuantity)
- {
- throw new Exception($"鏉$爜{barcode}鐨勫嚭搴撴暟閲忓ぇ浜庤鍗曠殑鏁伴噺");
- }
-
- var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(x => x.Barcode == barcode && x.StockId == lockInfo.StockId)
- .FirstAsync();
-
- if (stockDetail == null)
- return WebResponseContent.Instance.Error("鏃犳晥鐨勬潯鐮佹垨鐗╂枡缂栫爜");
-
-
- decimal actualQty = lockInfo.AssignQuantity - lockInfo.PickedQty;
-
- // 4. 鏇存柊搴撳瓨
- stockDetail.StockQuantity -= actualQty;
- stockDetail.OutboundQuantity -= actualQty;
- await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
-
- lockInfo.PickedQty += actualQty;
- lockInfo.Status = (int)OutLockStockStatusEnum.鎷i�夊畬鎴�;
- await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
-
- var splitBarcodeRecord = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
- .Where(it => it.NewBarcode == barcode)
- .FirstAsync();
-
- if (splitBarcodeRecord != null)
- {
- splitBarcodeRecord.Status = 2;
- await _splitPackageService.Db.Updateable(splitBarcodeRecord).ExecuteCommandAsync();
- }
-
- await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
- .SetColumns(it => it.PickedQty == it.PickedQty + actualQty)
- .Where(it => it.Id == lockInfo.OrderDetailId)
- .ExecuteCommandAsync();
-
-
- await CheckAndUpdateOrderStatus(orderNo);
-
- //鏌ヨ浠诲姟琛�
- var task = _taskRepository.QueryData(x => x.OrderNo == orderNo && x.PalletCode == palletCode).FirstOrDefault();
- // 9. 璁板綍鎷i�夊巻鍙�
- var pickingHistory = new Dt_PickingRecord
- {
- FactoryArea = lockInfo.FactoryArea,
- TaskNo = task?.TaskNum ?? 0,
- LocationCode = task?.SourceAddress ?? "",
- StockId = stockDetail.Id,
- OrderNo = orderNo,
- OrderDetailId = lockInfo.OrderDetailId,
- PalletCode = palletCode,
- Barcode = barcode,
- MaterielCode = lockInfo.MaterielCode,
- PickQuantity = lockInfo.AssignQuantity,
- PickTime = DateTime.Now,
- Operator = App.User.UserName,
- OutStockLockId = lockInfo.Id
- };
- await Db.Insertable(pickingHistory).ExecuteCommandAsync();
-
- _unitOfWorkManage.CommitTran();
- return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔�");
-
- }
- catch (Exception ex)
- {
- return WebResponseContent.Instance.Error($"鎷i�夌‘璁ゅけ璐ワ細{ex.Message}");
- }
- }
// 妫�鏌ュ苟鏇存柊璁㈠崟鐘舵��
private async Task CheckAndUpdateOrderStatus(string orderNo)
{
@@ -340,14 +234,231 @@
}
}
}
- catch (Exception ex) {
+ catch (Exception ex)
+ {
_logger.LogError(" OutboundPickingService FeedbackOutbound : " + ex.Message);
}
-
+
}
}
+ public async Task<WebResponseContent> ConfirmPicking(string orderNo, string palletCode, string barcode)
+ {
+ try
+ {
+ _unitOfWorkManage.BeginTran();
+ // 1. 鏌ユ壘鍑哄簱閿佸畾淇℃伅
+ var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(it => it.OrderNo == orderNo &&
+ it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓� &&
+ it.PalletCode == palletCode &&
+ it.CurrentBarcode == barcode)
+ .FirstAsync();
+
+ if (lockInfo == null)
+ {
+ lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(it => it.CurrentBarcode == barcode &&
+ it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
+ .FirstAsync();
+
+ if (lockInfo == null)
+ throw new Exception($"鏉$爜{barcode}涓嶅睘浜庢墭鐩榹palletCode}鎴栦笉瀛樺湪寰呭垎鎷h褰�");
+ }
+
+ if (lockInfo.PalletCode != palletCode)
+ throw new Exception($"鏉$爜{barcode}涓嶅睘浜庢墭鐩榹palletCode}");
+
+ var outorderdetail = _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>().First(x => x.Id == lockInfo.OrderDetailId);
+ if (outorderdetail != null && lockInfo.AssignQuantity > outorderdetail.OrderQuantity)
+ {
+ throw new Exception($"鏉$爜{barcode}鐨勫嚭搴撴暟閲忓ぇ浜庤鍗曠殑鏁伴噺");
+ }
+
+ var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(x => x.Barcode == barcode && x.StockId == lockInfo.StockId)
+ .FirstAsync();
+
+ if (stockDetail == null)
+ return WebResponseContent.Instance.Error("鏃犳晥鐨勬潯鐮佹垨鐗╂枡缂栫爜");
+
+ decimal actualQty = lockInfo.AssignQuantity - lockInfo.PickedQty;
+ decimal stockQuantity = stockDetail.StockQuantity;
+
+ List<SplitResult> splitResults = new List<SplitResult>();
+
+ if (actualQty < stockQuantity)
+ {
+ // 鎯呭喌1: 鍒嗛厤鏁伴噺灏忎簬搴撳瓨鏁伴噺锛岄渶瑕佽嚜鍔ㄦ媶鍖�
+ // 璁$畻鍓╀綑搴撳瓨鏁伴噺
+ decimal remainingStockQty = stockQuantity - actualQty;
+
+ // 鏇存柊鍘熸潯鐮佸簱瀛樹负鍓╀綑鏁伴噺
+ stockDetail.StockQuantity = remainingStockQty;
+ stockDetail.OutboundQuantity = remainingStockQty;
+ await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
+
+ // 鐢熸垚鏂版潯鐮佺敤浜庤褰曟嫞閫夋暟閲忥紙浣嗕笉鍒涘缓搴撳瓨璁板綍锛�
+ var seq = await _dailySequenceService.GetNextSequenceAsync();
+ string newBarcode = "WSLOT" + DateTime.Now.ToString("yyyyMMdd") + seq.ToString()?.PadLeft(5, '0');
+
+ // 涓烘柊鏉$爜鍒涘缓鍑哄簱閿佸畾淇℃伅锛堢敤浜庤褰曟嫞閫夛級
+ var newLockInfo = new Dt_OutStockLockInfo
+ {
+ OrderNo = lockInfo.OrderNo,
+ OrderDetailId = lockInfo.OrderDetailId,
+ BatchNo = lockInfo.BatchNo,
+ MaterielCode = lockInfo.MaterielCode,
+ MaterielName = lockInfo.MaterielName,
+ StockId = lockInfo.StockId,
+ OrderQuantity = actualQty,
+ OriginalQuantity = actualQty,
+ AssignQuantity = actualQty,
+ PickedQty = actualQty,
+ LocationCode = lockInfo.LocationCode,
+ PalletCode = lockInfo.PalletCode,
+ TaskNum = lockInfo.TaskNum,
+ Status = (int)OutLockStockStatusEnum.鎷i�夊畬鎴�,
+ Unit = lockInfo.Unit,
+ SupplyCode = lockInfo.SupplyCode,
+ OrderType = lockInfo.OrderType,
+ CurrentBarcode = newBarcode,
+ OriginalLockQuantity = actualQty,
+ IsSplitted = 1,
+ ParentLockId = lockInfo.Id
+ };
+ await _outStockLockInfoService.Db.Insertable(newLockInfo).ExecuteCommandAsync();
+
+ // 璁板綍鎷嗗寘鍘嗗彶锛堢敤浜庤拷韪級
+ var splitHistory = new Dt_SplitPackageRecord
+ {
+ FactoryArea = lockInfo.FactoryArea,
+ TaskNum = lockInfo.TaskNum,
+ OutStockLockInfoId = lockInfo.Id,
+ StockId = stockDetail.StockId,
+ Operator = App.User.UserName,
+ IsReverted = false,
+ OriginalBarcode = barcode,
+ NewBarcode = newBarcode,
+ SplitQty = actualQty,
+ RemainQuantity = remainingStockQty,
+ MaterielCode = lockInfo.MaterielCode,
+ SplitTime = DateTime.Now,
+ OrderNo = lockInfo.OrderNo,
+ PalletCode = lockInfo.PalletCode,
+ Status = (int)SplitPackageStatusEnum.宸叉嫞閫�
+ };
+ await _splitPackageService.Db.Insertable(splitHistory).ExecuteCommandAsync();
+
+ // 鏇存柊鍘熼攣瀹氫俊鎭负鍓╀綑搴撳瓨鏁伴噺
+ lockInfo.AssignQuantity = remainingStockQty;
+ lockInfo.PickedQty = 0;
+
+ await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
+
+ splitResults.Add(new SplitResult
+ {
+ OriginalBarcode = barcode,
+ NewBarcode = newBarcode,
+ SplitQuantity = actualQty,
+ RemainQuantity = remainingStockQty
+ });
+
+ // 鏇存柊鎷i�夎褰曚腑鐨勬潯鐮佷负鏂版潯鐮�
+ barcode = newBarcode;
+ lockInfo = newLockInfo;
+ }
+ else if (actualQty == stockQuantity)
+ {
+ // 鎯呭喌2: 鍒嗛厤鏁伴噺绛変簬搴撳瓨鏁伴噺锛屾暣鍖呭嚭搴�
+ stockDetail.StockQuantity = 0;
+ stockDetail.OutboundQuantity = 0;
+ await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
+
+ lockInfo.PickedQty += actualQty;
+ lockInfo.Status = (int)OutLockStockStatusEnum.鎷i�夊畬鎴�;
+ await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
+ }
+ else
+ {
+ // 鎯呭喌3: 鍒嗛厤鏁伴噺澶т簬搴撳瓨鏁伴噺锛屽簱瀛樻暣鍖呭嚭搴�
+ // 鏁村寘鍑哄簱褰撳墠搴撳瓨
+ decimal stockOutQty = stockQuantity;
+ stockDetail.StockQuantity = 0;
+ stockDetail.OutboundQuantity = 0;
+ await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
+
+ // 璁$畻鍓╀綑鍒嗛厤鏁伴噺
+ decimal remainingAssignQty = actualQty - stockQuantity;
+
+ // 鏇存柊閿佸畾淇℃伅锛堝彧瀹屾垚搴撳瓨閮ㄥ垎锛�
+ lockInfo.PickedQty += stockOutQty;
+ lockInfo.AssignQuantity = remainingAssignQty;
+
+ await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
+
+ var _relatedSplitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
+ .Where(it => it.OriginalBarcode == barcode || it.NewBarcode == barcode)
+ .Where(it => !it.IsReverted)
+ .ToListAsync();
+
+ foreach (var record in _relatedSplitRecords)
+ {
+ record.Status = (int)SplitPackageStatusEnum.宸叉嫞閫�;
+ await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync();
+ }
+ }
+
+
+
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(it => it.PickedQty == it.PickedQty + actualQty)
+ .Where(it => it.Id == lockInfo.OrderDetailId)
+ .ExecuteCommandAsync();
+
+ await CheckAndUpdateOrderStatus(orderNo);
+
+ // 鏌ヨ浠诲姟琛�
+ var task = _taskRepository.QueryData(x => x.OrderNo == orderNo && x.PalletCode == palletCode).FirstOrDefault();
+
+ // 璁板綍鎷i�夊巻鍙�
+ var pickingHistory = new Dt_PickingRecord
+ {
+ FactoryArea = lockInfo.FactoryArea,
+ TaskNo = task?.TaskNum ?? 0,
+ LocationCode = task?.SourceAddress ?? "",
+ StockId = stockDetail.Id,
+ OrderNo = orderNo,
+ OrderDetailId = lockInfo.OrderDetailId,
+ PalletCode = palletCode,
+ Barcode = barcode,
+ MaterielCode = lockInfo.MaterielCode,
+ PickQuantity = actualQty,
+ PickTime = DateTime.Now,
+ Operator = App.User.UserName,
+ OutStockLockId = lockInfo.Id
+ };
+ await Db.Insertable(pickingHistory).ExecuteCommandAsync();
+
+ _unitOfWorkManage.CommitTran();
+
+ // 濡傛灉鏈夋媶鍖呯粨鏋滐紝杩斿洖鎷嗗寘淇℃伅
+ if (splitResults.Any())
+ {
+ return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔燂紝宸茶嚜鍔ㄦ媶鍖�", new { SplitResults = splitResults });
+ }
+
+ return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔�");
+
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ return WebResponseContent.Instance.Error($"鎷i�夌‘璁ゅけ璐ワ細{ex.Message}");
+ }
+ }
+
/// <summary>
/// 鍥炲簱鎿嶄綔
/// </summary>
@@ -356,13 +467,14 @@
{
try
{
- // 鑾峰彇鎵�鏈夋湭鍒嗘嫞鐨勫嚭搴撻攣瀹氳褰曪紝鍖呮嫭鎷嗗寘浜х敓鐨勮褰�
+ _unitOfWorkManage.BeginTran();
+
+ // 鑾峰彇鎵�鏈夋湭鍒嗘嫞鐨勫嚭搴撻攣瀹氳褰曪紝鍖呮嫭鎷嗗寘浜х敓鐨勮褰�
var remainingLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(it => it.OrderNo == orderNo && it.Status == 1)
+ .Where(it => it.OrderNo == orderNo && it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
.ToListAsync();
var stockinfo = _stockInfoService.Db.Queryable<Dt_StockInfo>().First(x => x.PalletCode == palletCode);
-
var tasks = new List<Dt_Task>();
@@ -376,26 +488,68 @@
return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑浠诲姟淇℃伅");
}
- // 妫�鏌ユ墭鐩樹笂鏄惁鏈夊叾浠栭潪鍑哄簱璐х墿锛堝簱瀛樿揣鐗╋級
+ // 妫�鏌ユ墭鐩樹笂鏄惁鏈夊叾浠栭潪鍑哄簱璐х墿锛堝簱瀛樿揣鐗╋級
var palletStockGoods = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(it => it.StockId == stockinfo.Id && (it.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt() || it.Status == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt() || it.Status == StockStatusEmun.鍑哄簱閿佸畾.ObjToInt()))
+ .Where(it => it.StockId == stockinfo.Id &&
+ (it.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
+ it.Status == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt() ||
+ it.Status == StockStatusEmun.鍑哄簱閿佸畾.ObjToInt()))
.Where(it => it.OutboundQuantity == 0 || it.OutboundQuantity < it.StockQuantity) // 鏈畬鍏ㄥ嚭搴撶殑
.ToListAsync();
- // 濡傛灉娌℃湁闇�瑕佸洖搴撶殑璐х墿锛堟棦鏃犳湭鍒嗘嫞鍑哄簱璐х墿锛屼篃鏃犲叾浠栧簱瀛樿揣鐗╋級
- if (!remainingLocks.Any() && !palletStockGoods.Any())
+ // 妫�鏌ユ媶鍖呰褰曪紝鎵惧嚭闇�瑕佸洖搴撶殑鏉$爜
+ var splitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
+ .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode && !it.IsReverted)
+ .ToListAsync();
+
+ // 璁$畻闇�瑕佸洖搴撶殑鎷嗗寘鏉$爜
+ var splitBarcodesToReturn = new List<string>();
+ foreach (var splitRecord in splitRecords)
{
- //鏄惁鑷姩鍥炲簱锛屾妸涔嬪墠鍑哄簱鐨勪换鍔″垹闄わ紝鐒跺悗缁勪釜绌虹洏鍏ュ簱銆�
- return WebResponseContent.Instance.Error("娌℃湁闇�瑕佸洖搴撶殑鍓╀綑璐х墿");
+ // 妫�鏌ュ師鏉$爜鏄惁杩樻湁搴撳瓨闇�瑕佸洖搴�
+ var originalStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(it => it.Barcode == splitRecord.OriginalBarcode && it.StockId == stockinfo.Id)
+ .FirstAsync();
+
+ if (originalStock != null && originalStock.StockQuantity > 0)
+ {
+ splitBarcodesToReturn.Add(splitRecord.OriginalBarcode);
+ }
+
+ // 妫�鏌ユ柊鏉$爜鏄惁杩樻湁搴撳瓨闇�瑕佸洖搴�
+ var newStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(it => it.Barcode == splitRecord.NewBarcode && it.StockId == stockinfo.Id)
+ .FirstAsync();
+
+ if (newStock != null && newStock.StockQuantity > 0)
+ {
+ splitBarcodesToReturn.Add(splitRecord.NewBarcode);
+ }
}
+ // 濡傛灉娌℃湁闇�瑕佸洖搴撶殑璐х墿锛堟棦鏃犳湭鍒嗘嫞鍑哄簱璐х墿锛屼篃鏃犲叾浠栧簱瀛樿揣鐗╋紝涔熸棤鎷嗗寘鍓╀綑璐х墿锛�
+ if (!remainingLocks.Any() && !palletStockGoods.Any() && !splitBarcodesToReturn.Any())
+ {
+ // 妫�鏌ユ槸鍚︽墍鏈夎揣鐗╅兘宸叉嫞閫夊畬鎴�
+ var allPicked = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode)
+ .AnyAsync(it => it.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴�);
+
+ if (allPicked)
+ {
+ return WebResponseContent.Instance.OK("鎵�鏈夎揣鐗╁凡鎷i�夊畬鎴愶紝鎵樼洏涓虹┖");
+ }
+ else
+ {
+ return WebResponseContent.Instance.Error("娌℃湁闇�瑕佸洖搴撶殑鍓╀綑璐х墿");
+ }
+ }
var firstlocation = _locationInfoService.Db.Queryable<Dt_LocationInfo>().First(x => x.LocationCode == task.SourceAddress);
decimal totalReturnQty = 0;
- var hasRemainingLocks = remainingLocks.Any(x => x.PalletCode == palletCode);
// 鎯呭喌1锛氬鐞嗘湭鍒嗘嫞鐨勫嚭搴撻攣瀹氳褰�
- if (hasRemainingLocks)
+ if (remainingLocks.Any(x => x.PalletCode == palletCode))
{
var palletLocks = remainingLocks.Where(x => x.PalletCode == palletCode).ToList();
totalReturnQty = palletLocks.Sum(x => x.AssignQuantity - x.PickedQty);
@@ -408,20 +562,11 @@
// 鏇存柊鍑哄簱閿佸畾璁板綍鐘舵��
var lockIds = palletLocks.Select(x => x.Id).ToList();
await _outStockLockInfoService.Db.Updateable<Dt_OutStockLockInfo>()
- .SetColumns(it => new Dt_OutStockLockInfo { Status = OutLockStockStatusEnum.鍥炲簱涓�.ObjToInt() })
+ .SetColumns(it => new Dt_OutStockLockInfo { Status = (int)OutLockStockStatusEnum.鍥炲簱涓� })
.Where(it => lockIds.Contains(it.Id))
.ExecuteCommandAsync();
- // 鏇存柊鎷嗗寘鏉$爜璁板綍鐘舵��
- var splitBarcodes = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
- .Where(it => lockIds.Contains(it.OutStockLockInfoId))
- .ToListAsync();
-
- foreach (var splitBarcode in splitBarcodes)
- {
- splitBarcode.Status = 3;
- await _splitPackageService.Db.Updateable(splitBarcode).ExecuteCommandAsync();
- }
+
// 澶勭悊搴撳瓨璁板綍
foreach (var lockInfo in palletLocks)
@@ -436,13 +581,9 @@
if (existingStock != null)
{
// 搴撳瓨璁板綍瀛樺湪锛屾仮澶嶉攣瀹氭暟閲�
- await _stockInfoDetailService.Db.Updateable<Dt_StockInfoDetail>()
- .SetColumns(it => new Dt_StockInfoDetail
- {
- OutboundQuantity = it.OutboundQuantity - returnQty
- })
- .Where(it => it.Barcode == lockInfo.CurrentBarcode && it.StockId == lockInfo.StockId)
- .ExecuteCommandAsync();
+ existingStock.OutboundQuantity = 0;
+
+ await _stockInfoDetailService.Db.Updateable(existingStock).ExecuteCommandAsync();
}
else
{
@@ -451,14 +592,17 @@
{
StockId = lockInfo.StockId,
MaterielCode = lockInfo.MaterielCode,
+ MaterielName = lockInfo.MaterielName,
OrderNo = lockInfo.OrderNo,
BatchNo = lockInfo.BatchNo,
StockQuantity = returnQty,
OutboundQuantity = 0,
Barcode = lockInfo.CurrentBarcode,
- InboundOrderRowNo = "0",
- Status = StockStatusEmun.鍏ュ簱纭.ObjToInt(),
-
+ InboundOrderRowNo = "",
+ Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt(),
+ SupplyCode = lockInfo.SupplyCode,
+ WarehouseCode = lockInfo.WarehouseCode,
+ Unit = lockInfo.Unit
};
await _stockInfoDetailService.Db.Insertable(newStockDetail).ExecuteCommandAsync();
}
@@ -469,18 +613,69 @@
}
}
- // 鎯呭喌2锛氬嚭搴撹揣鐗╁凡鍒嗘嫞瀹岋紝浣嗘墭鐩樹笂杩樻湁鍏朵粬搴撳瓨璐х墿闇�瑕佸洖搴�
- if (!hasRemainingLocks && palletStockGoods.Any())
+ // 鎯呭喌2锛氬鐞嗘媶鍖呭墿浣欑殑搴撳瓨璐х墿
+ if (splitBarcodesToReturn.Any())
{
- // 鍒嗛厤鏂拌揣浣�
- var newLocation = _locationInfoService.AssignLocation(firstlocation.LocationType);
+ decimal splitReturnQty = 0;
- // 鍒涘缓鍥炲簱浠诲姟
- CreateReturnTask(tasks, task, palletCode, newLocation);
+ foreach (var barcode in splitBarcodesToReturn)
+ {
+ var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(it => it.Barcode == barcode && it.StockId == stockinfo.Id)
+ .FirstAsync();
- totalReturnQty = palletStockGoods.Sum(x => x.StockQuantity - x.OutboundQuantity);
+ if (stockDetail != null && stockDetail.StockQuantity > 0)
+ {
+ splitReturnQty += stockDetail.StockQuantity;
+
+ // 鎭㈠搴撳瓨鐘舵�佷负鍏ュ簱瀹屾垚
+ stockDetail.OutboundQuantity = 0;
+
+ await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
+ }
+ }
+
+ totalReturnQty += splitReturnQty;
+
+ // 濡傛灉娌℃湁鍒涘缓浠诲姟锛屽垱寤哄洖搴撲换鍔�
+ if (!tasks.Any())
+ {
+ var newLocation = _locationInfoService.AssignLocation(firstlocation.LocationType);
+ CreateReturnTask(tasks, task, palletCode, newLocation);
+ }
}
+ // 鎯呭喌3锛氬嚭搴撹揣鐗╁凡鍒嗘嫞瀹岋紝浣嗘墭鐩樹笂杩樻湁鍏朵粬搴撳瓨璐х墿闇�瑕佸洖搴�
+ if (palletStockGoods.Any() && !remainingLocks.Any(x => x.PalletCode == palletCode))
+ {
+ decimal otherReturnQty = palletStockGoods.Sum(x => x.StockQuantity - x.OutboundQuantity);
+ totalReturnQty += otherReturnQty;
+ // 鏇存柊杩欎簺搴撳瓨璐х墿鐨勭姸鎬�
+ foreach (var stockGood in palletStockGoods)
+ {
+ stockGood.OutboundQuantity = 0;
+
+ await _stockInfoDetailService.Db.Updateable(stockGood).ExecuteCommandAsync();
+ }
+ // 濡傛灉娌℃湁鍒涘缓浠诲姟锛屽垱寤哄洖搴撲换鍔�
+ if (!tasks.Any())
+ {
+ var newLocation = _locationInfoService.AssignLocation(firstlocation.LocationType);
+ CreateReturnTask(tasks, task, palletCode, newLocation);
+ }
+
+
+ }
+
+ var allSplitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
+ .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode && !it.IsReverted)
+ .ToListAsync();
+
+ foreach (var record in allSplitRecords)
+ {
+ record.Status = (int)SplitPackageStatusEnum.宸插洖搴�;
+ await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync();
+ }
// 淇濆瓨浠诲姟 缁橢SS涓嬪彂浠诲姟
if (tasks.Any())
{
@@ -489,6 +684,7 @@
await _taskRepository.Db.Insertable(tasks).ExecuteCommandAsync();
var targetAddress = task.TargetAddress;
_taskRepository.DeleteData(task);
+
// 缁� ESS 娴佸姩淇″彿鍜屽垱寤轰换鍔�
try
{
@@ -497,6 +693,7 @@
slotCode = movestations[targetAddress],
containerCode = palletCode
});
+
if (result)
{
TaskModel esstask = new TaskModel()
@@ -505,51 +702,52 @@
taskGroupCode = "",
groupPriority = 0,
tasks = new List<TasksType>
- {
- new()
- {
- taskCode = tasks.First().TaskNum.ToString(),
- taskPriority = 0,
- taskDescribe = new TaskDescribeType {
- containerCode = palletCode,
- containerType = "CT_KUBOT_STANDARD",
- fromLocationCode = stations.GetValueOrDefault(targetAddress) ?? "",
- toStationCode = "",
- toLocationCode = tasks.First().TargetAddress,
- deadline = 0, storageTag = ""
- }
- }
+ {
+ new()
+ {
+ taskCode = tasks.First().TaskNum.ToString(),
+ taskPriority = 0,
+ taskDescribe = new TaskDescribeType {
+ containerCode = palletCode,
+ containerType = "CT_KUBOT_STANDARD",
+ fromLocationCode = stations.GetValueOrDefault(targetAddress) ?? "",
+ toStationCode = "",
+ toLocationCode = tasks.First().TargetAddress,
+ deadline = 0, storageTag = ""
}
+ }
+ }
};
-
var resulttask = await _eSSApiService.CreateTaskAsync(esstask);
-
_logger.LogInformation("ReturnRemaining 鍒涘缓浠诲姟杩斿洖: " + resulttask);
}
}
catch (Exception ex)
{
_logger.LogInformation("ReturnRemaining 鍒涘缓浠诲姟杩斿洖 catch err: " + ex.Message);
-
}
-
+ _unitOfWorkManage.CommitTran();
return WebResponseContent.Instance.OK($"鍥炲簱鎿嶄綔鎴愬姛锛屽叡鍥炲簱鏁伴噺锛歿totalReturnQty}");
}
catch (Exception ex)
{
+ _unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error($"鍒涘缓鍥炲簱浠诲姟澶辫触: {ex.Message}");
}
}
+ _unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error("鏈垱寤轰换浣曞洖搴撲换鍔�");
}
catch (Exception ex)
{
+ _unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error($"鍥炲簱鎿嶄綔澶辫触: {ex.Message}");
}
}
+
/// <summary>
/// 鍒涘缓鍥炲簱浠诲姟
@@ -610,56 +808,306 @@
try
{
_unitOfWorkManage.BeginTran();
- // 鏌ユ壘鎷i�夎褰�
- var outStockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(x => x.OrderNo == orderNo &&
- x.PalletCode == palletCode &&
- x.CurrentBarcode == barcode &&
- x.Status == 6)
- .FirstAsync();
- if (outStockInfo == null)
- return WebResponseContent.Instance.Error("鏈壘鍒板凡鎷i�夎褰�");
-
- // 杩樺師鍑哄簱璇︽儏鐘舵��
- outStockInfo.PickedQty = 0;
- outStockInfo.Status = 1;
- await _outStockLockInfoService.Db.Updateable(outStockInfo).ExecuteCommandAsync();
-
-
- var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(x => x.Barcode == barcode && x.StockId == outStockInfo.StockId)
- .FirstAsync();
-
- stockDetail.StockQuantity += outStockInfo.AssignQuantity;
- stockDetail.OutboundQuantity += outStockInfo.AssignQuantity;
- await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
-
-
- // 杩樺師鍑哄簱鍗曟槑缁�
- var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
- .Where(x => x.Id == outStockInfo.OrderDetailId)
+ //鏌ユ壘鎷i�夎褰�
+ var pickingRecord = await Db.Queryable<Dt_PickingRecord>()
+ .Where(it => it.OrderNo == orderNo &&
+ it.PalletCode == palletCode &&
+ it.Barcode == barcode)
+ .OrderByDescending(it => it.PickTime)
.FirstAsync();
- orderDetail.OverOutQuantity -= outStockInfo.AssignQuantity;
- orderDetail.PickedQty = 0;
- await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
+ if (pickingRecord == null)
+ return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑鎷i�夎褰�");
- // 鍒犻櫎鎷i�夊巻鍙�
- await Db.Deleteable<Dt_PickingRecord>()
- .Where(x => x.OutStockLockId == outStockInfo.Id)
- .ExecuteCommandAsync();
+ // 鏌ユ壘鍑哄簱閿佸畾淇℃伅
+ var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(it => it.Id == pickingRecord.OutStockLockId)
+ .FirstAsync();
+
+ if (lockInfo == null)
+ return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑鍑哄簱閿佸畾淇℃伅");
+
+ //妫�鏌ユ槸鍚﹀彲浠ュ彇娑堬紙鐘舵�佸繀椤绘槸鎷i�夊畬鎴愶級
+ if (lockInfo.Status != (int)OutLockStockStatusEnum.鎷i�夊畬鎴�)
+ return WebResponseContent.Instance.Error("褰撳墠鐘舵�佷笉鍏佽鍙栨秷鍒嗘嫞");
+
+ decimal cancelQty = pickingRecord.PickQuantity;
+
+ // 妫�鏌ユ媶鍖呴摼鍏崇郴
+ var splitChain = await GetSplitChain(barcode);
+
+ if (splitChain.Any())
+ {
+ // 鎯呭喌A锛氬鐞嗘媶鍖呴摼鐨勫彇娑堬紙澶氭鎵嬪姩鎷嗗寘锛�
+ await HandleSplitChainCancel(orderNo, palletCode, barcode, cancelQty, lockInfo, pickingRecord, splitChain);
+ }
+ else
+ {
+ // 鎯呭喌B锛氬鐞嗘櫘閫氭潯鐮佺殑鍙栨秷
+ await HandleNormalBarcodeCancel(orderNo, palletCode, barcode, cancelQty, lockInfo, pickingRecord);
+ }
_unitOfWorkManage.CommitTran();
- return WebResponseContent.Instance.OK("鍙栨秷鎷i�夋垚鍔�");
-
+ return WebResponseContent.Instance.OK($"鍙栨秷鍒嗘嫞鎴愬姛锛屾仮澶嶆暟閲忥細{cancelQty}");
}
catch (Exception ex)
{
- return WebResponseContent.Instance.Error($"鍙栨秷鎷i�夊け璐ワ細{ex.Message}");
+ _unitOfWorkManage.RollbackTran();
+ return WebResponseContent.Instance.Error($"鍙栨秷鍒嗘嫞澶辫触锛歿ex.Message}");
}
}
+ /// <summary>
+ /// 鑾峰彇鎷嗗寘閾撅紙浠庡綋鍓嶆潯鐮佽拷婧埌鍘熷鏉$爜锛�
+ /// </summary>
+ // 鍦� GetSplitChain 鏂规硶涓坊鍔犳洿涓ユ牸鐨勯獙璇�
+ private async Task<List<SplitChainItem>> GetSplitChain(string currentBarcode)
+ {
+ var chain = new List<SplitChainItem>();
+ var visited = new HashSet<string>();
+
+ string current = currentBarcode;
+ int maxDepth = 10; // 闃叉鏃犻檺寰幆
+
+ while (!string.IsNullOrEmpty(current) && maxDepth > 0)
+ {
+ maxDepth--;
+
+ if (visited.Contains(current))
+ {
+ _logger.LogWarning($"妫�娴嬪埌寰幆寮曠敤鍦ㄦ媶鍖呴摼涓�: {current}");
+ break;
+ }
+
+ visited.Add(current);
+
+ var splitRecord = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
+ .Where(it => it.NewBarcode == current && !it.IsReverted)
+ .FirstAsync();
+
+ if (splitRecord == null)
+ break;
+
+ // 楠岃瘉鎷嗗寘璁板綍鐨勫畬鏁存��
+ if (string.IsNullOrEmpty(splitRecord.OriginalBarcode))
+ {
+ _logger.LogError($"鎷嗗寘璁板綍 {splitRecord.Id} 缂哄皯鍘熷鏉$爜");
+ break;
+ }
+
+ var item = new SplitChainItem
+ {
+ SplitRecord = splitRecord,
+ OriginalBarcode = splitRecord.OriginalBarcode,
+ NewBarcode = splitRecord.NewBarcode,
+ SplitQuantity = splitRecord.SplitQty
+ };
+
+ chain.Add(item);
+
+ current = splitRecord.OriginalBarcode;
+ }
+
+ if (maxDepth <= 0)
+ {
+ _logger.LogWarning($"鎷嗗寘閾捐拷婧揪鍒版渶澶ф繁搴�: {currentBarcode}");
+ }
+
+ chain.Reverse();
+ return chain;
+ }
+ /// <summary>
+ /// 澶勭悊鎷嗗寘閾剧殑鍙栨秷鍒嗘嫞
+ /// </summary>
+ private async Task HandleSplitChainCancel(string orderNo, string palletCode, string barcode,
+ decimal cancelQty, Dt_OutStockLockInfo lockInfo, Dt_PickingRecord pickingRecord, List<SplitChainItem> splitChain)
+ {
+ if (!splitChain.Any())
+ return;
+
+ // 鎵惧埌鍘熷鏉$爜锛堥摼鐨勭涓�涓級
+ var originalSplitItem = splitChain.First();
+ var originalBarcode = originalSplitItem.OriginalBarcode;
+
+ // 鏌ユ壘鍘熷鏉$爜鐨勯攣瀹氫俊鎭拰搴撳瓨
+ var originalLockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(it => it.CurrentBarcode == originalBarcode && it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
+ .FirstAsync();
+
+ var originalStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(it => it.Barcode == originalBarcode && it.StockId == originalLockInfo.StockId)
+ .FirstAsync();
+
+ if (originalLockInfo == null || originalStockDetail == null)
+ throw new Exception("鏈壘鍒板師濮嬫潯鐮佺殑閿佸畾淇℃伅鎴栧簱瀛樹俊鎭�");
+
+ // 鎭㈠鍘熷鏉$爜搴撳瓨锛堝皢鍙栨秷鐨勬暟閲忓姞鍥炲幓锛�
+ originalStockDetail.StockQuantity += cancelQty;
+ originalStockDetail.OutboundQuantity += cancelQty;
+ await _stockInfoDetailService.Db.Updateable(originalStockDetail).ExecuteCommandAsync();
+
+ // 鎭㈠鍘熷鏉$爜閿佸畾淇℃伅
+ originalLockInfo.AssignQuantity += cancelQty;
+ await _outStockLockInfoService.Db.Updateable(originalLockInfo).ExecuteCommandAsync();
+
+ // 鍒犻櫎鎷嗗寘閾句腑鎵�鏈夋柊鏉$爜鐨勯攣瀹氫俊鎭拰搴撳瓨璁板綍
+ var allNewBarcodes = splitChain.Select(x => x.NewBarcode).ToList();
+
+ // 鍒犻櫎閿佸畾淇℃伅
+ await _outStockLockInfoService.Db.Deleteable<Dt_OutStockLockInfo>()
+ .Where(it => allNewBarcodes.Contains(it.CurrentBarcode))
+ .ExecuteCommandAsync();
+
+ // 鍒犻櫎搴撳瓨璁板綍锛堝彧鍒犻櫎鎷嗗寘浜х敓鐨勬柊鏉$爜搴撳瓨锛屼繚鐣欏師濮嬫潯鐮侊級
+ await _stockInfoDetailService.Db.Deleteable<Dt_StockInfoDetail>()
+ .Where(it => allNewBarcodes.Contains(it.Barcode) && it.Barcode != originalBarcode)
+ .ExecuteCommandAsync();
+
+ // 鏇存柊鎷嗗寘閾句腑鎵�鏈夋媶鍖呰褰曠姸鎬佷负宸叉媶鍖�
+ foreach (var chainItem in splitChain)
+ {
+ chainItem.SplitRecord.Status = (int)SplitPackageStatusEnum.宸叉媶鍖�;
+ await _splitPackageService.Db.Updateable(chainItem.SplitRecord).ExecuteCommandAsync();
+ }
+
+ // 鎭㈠璁㈠崟鏄庣粏鎷i�夋暟閲忥紙浣跨敤鍘熷閿佸畾淇℃伅鐨勮鍗曟槑缁咺D锛�
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(it => it.PickedQty == it.PickedQty - cancelQty)
+ .Where(it => it.Id == originalLockInfo.OrderDetailId)
+ .ExecuteCommandAsync();
+
+ // 鎭㈠璁㈠崟鐘舵��
+ await CheckAndRevertOrderStatus(orderNo);
+
+ // 鍒犻櫎鎷i�夎褰�
+ await Db.Deleteable<Dt_PickingRecord>()
+ .Where(it => it.Id == pickingRecord.Id)
+ .ExecuteCommandAsync();
+
+ //// 璁板綍鍙栨秷鎿嶄綔鍘嗗彶
+ //await RecordCancelHistory(orderNo, palletCode, barcode, cancelQty, pickingRecord.Id,
+ // lockInfo.MaterielCode, "鍙栨秷鎷嗗寘閾惧垎鎷�");
+ }
+
+ /// <summary>
+ /// 澶勭悊鏅�氭潯鐮佺殑鍙栨秷鍒嗘嫞
+ /// </summary>
+ private async Task HandleNormalBarcodeCancel(string orderNo, string palletCode, string barcode,
+ decimal cancelQty, Dt_OutStockLockInfo lockInfo, Dt_PickingRecord pickingRecord)
+ {
+ // 1. 鏌ユ壘搴撳瓨淇℃伅
+ var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(it => it.Barcode == barcode && it.StockId == lockInfo.StockId)
+ .FirstAsync();
+
+ if (stockDetail == null)
+ throw new Exception("鏈壘鍒板搴旂殑搴撳瓨淇℃伅");
+
+ // 2. 鎭㈠搴撳瓨鏁伴噺
+ if (stockDetail.StockQuantity == 0)
+ {
+ // 鏁村寘鍑哄簱鐨勬儏鍐�
+ stockDetail.StockQuantity = cancelQty;
+ stockDetail.OutboundQuantity = cancelQty;
+ }
+ else
+ {
+ // 閮ㄥ垎鍑哄簱鐨勬儏鍐�
+ stockDetail.StockQuantity += cancelQty;
+ stockDetail.OutboundQuantity += cancelQty;
+ }
+ await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
+
+ // 3. 鎭㈠閿佸畾淇℃伅鐘舵��
+ lockInfo.AssignQuantity += cancelQty;
+ lockInfo.PickedQty -= cancelQty;
+
+ if (lockInfo.PickedQty == 0)
+ {
+ lockInfo.Status = (int)OutLockStockStatusEnum.鍑哄簱涓�;
+ }
+ await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
+
+ // 4. 澶勭悊鐩稿叧鐨勬媶鍖呰褰曠姸鎬佹仮澶�
+ var relatedSplitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
+ .Where(it => it.OriginalBarcode == barcode &&
+ it.Status == (int)SplitPackageStatusEnum.宸叉嫞閫�)
+ .ToListAsync();
+
+ foreach (var record in relatedSplitRecords)
+ {
+ record.Status = (int)SplitPackageStatusEnum.宸叉媶鍖�;
+ await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync();
+ }
+
+ // 5. 鎭㈠璁㈠崟鏄庣粏鐨勬嫞閫夋暟閲�
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(it => it.PickedQty == it.PickedQty - cancelQty)
+ .Where(it => it.Id == lockInfo.OrderDetailId)
+ .ExecuteCommandAsync();
+
+ // 6. 鎭㈠璁㈠崟鐘舵��
+ await CheckAndRevertOrderStatus(orderNo);
+
+ // 7. 鍒犻櫎鎷i�夎褰�
+ await Db.Deleteable<Dt_PickingRecord>().Where(it => it.Id == pickingRecord.Id).ExecuteCommandAsync();
+
+ //// 8. 璁板綍鍙栨秷鎿嶄綔鍘嗗彶
+ //await RecordCancelHistory(orderNo, palletCode, barcode, cancelQty, pickingRecord.Id,
+ // lockInfo.MaterielCode, "鍙栨秷鍒嗘嫞");
+ }
+
+ /// <summary>
+ /// 妫�鏌ュ苟鎭㈠璁㈠崟鐘舵��
+ /// </summary>
+ private async Task CheckAndRevertOrderStatus(string orderNo)
+ {
+ var order = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
+ .Where(x => x.OrderNo == orderNo)
+ .FirstAsync();
+
+ if (order != null && order.OrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
+ {
+ await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+ .SetColumns(x => x.OrderStatus == OutOrderStatusEnum.鍑哄簱涓�.ObjToInt())
+ .Where(x => x.OrderNo == orderNo)
+ .ExecuteCommandAsync();
+ }
+ }
+
+ /// <summary>
+ /// 璁板綍鍙栨秷鎿嶄綔鍘嗗彶
+ /// </summary>
+ private async Task RecordCancelHistory(string orderNo, string palletCode, string barcode,
+ decimal cancelQty, int pickingRecordId, string materielCode, string reason)
+ {
+
+ //var cancelHistory = new Dt_PickingCancelRecord
+ //{
+ // OrderNo = orderNo,
+ // PalletCode = palletCode,
+ // Barcode = barcode,
+ // CancelQuantity = cancelQty,
+ // CancelTime = DateTime.Now,
+ // Operator = App.User.UserName,
+ // OriginalPickingRecordId = pickingRecordId,
+ // MaterielCode = materielCode,
+ // Reason = reason
+ //};
+ //await Db.Insertable(cancelHistory).ExecuteCommandAsync();
+ }
+
+ /// <summary>
+ /// 鎷嗗寘閾鹃」
+ /// </summary>
+ public class SplitChainItem
+ {
+ public Dt_SplitPackageRecord SplitRecord { get; set; }
+ public string OriginalBarcode { get; set; }
+ public string NewBarcode { get; set; }
+ public decimal SplitQuantity { get; set; }
+ }
// 鑾峰彇鏈嫞閫夊垪琛�
public async Task<List<Dt_OutStockLockInfo>> GetUnpickedList(string orderNo, string palletCode)
{
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/SplitPackageService.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/SplitPackageService.cs"
index b0b9bab..34b8f2b 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/SplitPackageService.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/SplitPackageService.cs"
@@ -1,6 +1,7 @@
锘縰sing Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Org.BouncyCastle.Asn1.Ocsp;
+using SqlSugar.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -45,6 +46,168 @@
/// <summary>
/// 鎷嗗寘鎷嗙鎿嶄綔
/// </summary>
+ //public async Task<WebResponseContent> SplitPackage(SplitPackageDto request)
+ //{
+ // try
+ // {
+ // _unitOfWorkManage.BeginTran();
+
+ // // 1. 楠岃瘉鍑哄簱閿佸畾淇℃伅
+ // var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ // .Where(x => x.OrderNo == request.OrderNo &&
+ // x.PalletCode == request.PalletCode &&
+ // x.CurrentBarcode == request.OriginalBarcode &&
+ // x.Status == 1)
+ // .FirstAsync();
+
+ // if (lockInfo == null)
+ // return WebResponseContent.Instance.Error("鏈壘鍒版湁鏁堢殑鍑哄簱閿佸畾淇℃伅");
+
+ // // 2. 妫�鏌ュ墿浣欓攣瀹氭暟閲�
+ // decimal remainingLockQuantity = lockInfo.OriginalQuantity - lockInfo.PickedQty;
+ // if (request.SplitQuantity > remainingLockQuantity)
+ // return WebResponseContent.Instance.Error($"鎷嗗寘鏁伴噺涓嶈兘澶т簬鍓╀綑閿佸畾鏁伴噺锛屽墿浣欙細{remainingLockQuantity}");
+
+ // var baseStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ // .Where(x => x.Barcode == request.OriginalBarcode && x.StockId == lockInfo.StockId)
+ // .FirstAsync();
+ // if (baseStockDetail == null)
+ // throw new Exception($"鏈壘鍒版潯鐮亄request.OriginalBarcode}瀵瑰簲鐨勫簱瀛樿褰�");
+
+
+ // // 4. 璁$畻鎷嗗垎鍚庣殑鏁伴噺
+ // decimal remainingQty = baseStockDetail.StockQuantity - request.SplitQuantity;
+
+ // // 鏇存柊鍩虹鏉$爜鐨勫簱瀛樻暟閲忎负鍓╀綑鏁伴噺
+ // baseStockDetail.StockQuantity = remainingQty;
+ // baseStockDetail.OutboundQuantity = remainingQty;
+ // await _stockInfoDetailService.Db.Updateable(baseStockDetail).ExecuteCommandAsync();
+
+
+ // var seq = await _dailySequenceService.GetNextSequenceAsync();
+ // // 3. 鐢熸垚鏂版潯鐮�
+ // string newBarcode = "WSLOT" + DateTime.Now.ToString("yyyyMMdd") + seq.ToString()?.PadLeft(5, '0');
+
+
+ // // 涓烘媶鍖呬骇鐢熺殑鏂版潯鐮佸垱寤哄簱瀛樿褰�
+ // var newStockDetail = new Dt_StockInfoDetail
+ // {
+ // SupplyCode = baseStockDetail.SupplyCode,
+ // WarehouseCode = baseStockDetail.WarehouseCode,
+ // BarcodeQty = baseStockDetail.BarcodeQty,
+ // BarcodeUnit = baseStockDetail.BarcodeUnit,
+ // BusinessType = baseStockDetail.BusinessType,
+ // Unit = baseStockDetail.Unit,
+ // StockId = lockInfo.StockId,
+ // MaterielCode = baseStockDetail.MaterielCode,
+ // OrderNo = baseStockDetail.OrderNo,
+ // BatchNo = baseStockDetail.BatchNo,
+ // StockQuantity = request.SplitQuantity, // 鏂版潯鐮佽幏寰楁媶鍒嗘暟閲�
+ // OutboundQuantity = request.SplitQuantity,
+ // Barcode = newBarcode,
+ // InboundOrderRowNo = baseStockDetail.InboundOrderRowNo,
+
+ // };
+ // await _outStockLockInfoService.Db.Insertable(newStockDetail).ExecuteCommandAsync();
+
+ // // 4. 鍒涘缓鏂扮殑鍑哄簱閿佸畾淇℃伅锛堟柊鏉$爜锛�
+ // var newLockInfo = new Dt_OutStockLockInfo
+ // {
+
+ // OrderNo = lockInfo.OrderNo,
+ // OrderDetailId = lockInfo.OrderDetailId,
+ // BatchNo = lockInfo.BatchNo,
+ // MaterielCode = lockInfo.MaterielCode,
+ // MaterielName = lockInfo.MaterielName,
+ // StockId = lockInfo.StockId,
+ // OrderQuantity = request.SplitQuantity,
+ // OriginalQuantity = request.SplitQuantity,
+ // AssignQuantity = request.SplitQuantity, // 鏂版潯鐮佸垎閰嶆暟閲�
+ // PickedQty = 0, // 鏂版潯鐮佹湭鎷i��
+ // LocationCode = lockInfo.LocationCode,
+ // PalletCode = lockInfo.PalletCode,
+ // TaskNum = lockInfo.TaskNum,
+ // Status = (int)OutLockStockStatusEnum.鍑哄簱涓�,
+ // Unit = lockInfo.Unit,
+ // SupplyCode = lockInfo.SupplyCode,
+ // OrderType = lockInfo.OrderType,
+ // CurrentBarcode = newBarcode, // 鏂版潯鐮�
+ // OriginalLockQuantity = request.SplitQuantity,
+ // IsSplitted = 1,
+ // ParentLockId = lockInfo.Id // 璁板綍鐖剁骇閿佸畾ID
+ // };
+ // await _outStockLockInfoService.Db.Insertable(newLockInfo).ExecuteCommandAsync();
+
+ // lockInfo.AssignQuantity = remainingQty;
+ // lockInfo.IsSplitted = 1; // 鏍囪涓哄凡鎷嗗寘
+ // await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
+
+ // var previousSplitRecord = await Db.Queryable<Dt_SplitPackageRecord>()
+ // .Where(x => x.OriginalBarcode == request.OriginalBarcode && !x.IsReverted)
+ // .OrderByDescending(x => x.SplitTime)
+ // .FirstAsync();
+
+ // // 6. 璁板綍鎷嗗寘鍘嗗彶锛堢敤浜庤拷韪級
+ // var splitHistory = new Dt_SplitPackageRecord
+ // {
+ // FactoryArea = lockInfo.FactoryArea,
+ // TaskNum = lockInfo.TaskNum,
+ // OutStockLockInfoId = lockInfo.Id,
+ // StockId = baseStockDetail.StockId,
+ // Operator = App.User.UserName,
+ // IsReverted = false,
+ // OriginalBarcode = request.OriginalBarcode,
+ // NewBarcode = newBarcode,
+ // SplitQty = request.SplitQuantity,
+ // RemainQuantity = remainingQty, // 璁板綍鎷嗗垎鍚庣殑鍓╀綑鏁伴噺
+ // MaterielCode = lockInfo.MaterielCode,
+ // SplitTime = DateTime.Now,
+ // OrderNo = request.OrderNo,
+ // PalletCode = request.PalletCode,
+ // Status = (int)SplitPackageStatusEnum.宸叉媶鍖�,
+ // PreviousSplitRecordId = previousSplitRecord?.Id??0 // 璁板綍鍓嶄竴娆℃媶鍖匢D锛屽缓绔嬫媶鍖呴摼
+ // };
+ // await Db.Insertable(splitHistory).ExecuteCommandAsync();
+
+ // _unitOfWorkManage.CommitTran();
+
+ // try
+ // {
+ // MaterielToMesDTO dto = new MaterielToMesDTO
+ // {
+ // batchNo = baseStockDetail.BatchNo,
+ // factoryArea = baseStockDetail.FactoryArea,
+ // materialCode = baseStockDetail.MaterielCode,
+ // newmaterialCode = newBarcode,
+ // oldmaterialCode = request.OriginalBarcode,
+ // operationType = 1,
+ // qty = remainingQty,
+ // supplyCode = baseStockDetail.SupplyCode,
+ // unit = baseStockDetail.BarcodeUnit,
+ // warehouseCode = baseStockDetail.WarehouseCode,
+ // reqCode = Guid.NewGuid().ToString(),
+ // reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
+ // };
+ // _invokeMESService.NewMaterielToMes(dto);
+ // }
+ // catch(Exception ex)
+ // {
+ // _logger.LogError("SplitPackage 鍥炰紶MES: " + ex.Message);
+ // }
+ // return WebResponseContent.Instance.OK("鎷嗗寘鎴愬姛", new
+ // {
+ // NewBarcode = newBarcode,
+ // NewLockInfoId = newLockInfo.Id
+ // });
+ // }
+ // catch (Exception ex)
+ // {
+ // _unitOfWorkManage.RollbackTran();
+ // return WebResponseContent.Instance.Error($"鎷嗗寘澶辫触: {ex.Message}");
+ // }
+ //}
+ // 鑾峰彇鏉$爜鐨勬媶鍖呭巻鍙查摼
+
public async Task<WebResponseContent> SplitPackage(SplitPackageDto request)
{
try
@@ -67,58 +230,63 @@
if (request.SplitQuantity > remainingLockQuantity)
return WebResponseContent.Instance.Error($"鎷嗗寘鏁伴噺涓嶈兘澶т簬鍓╀綑閿佸畾鏁伴噺锛屽墿浣欙細{remainingLockQuantity}");
- var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(x => x.Barcode == request.OriginalBarcode && x.StockId == lockInfo.StockId)
- .FirstAsync();
- if (stockDetail == null)
+ // 3. 鏌ユ壘褰撳墠鏉$爜鐨勫簱瀛樹俊鎭�
+ var baseStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(x => x.Barcode == request.OriginalBarcode && x.StockId == lockInfo.StockId)
+ .FirstAsync();
+
+ if (baseStockDetail == null)
throw new Exception($"鏈壘鍒版潯鐮亄request.OriginalBarcode}瀵瑰簲鐨勫簱瀛樿褰�");
- stockDetail.StockQuantity = request.SplitQuantity;
- stockDetail.OutboundQuantity = request.SplitQuantity;
- _stockInfoDetailService.Db.Updateable<Dt_StockInfoDetail>(stockDetail).ExecuteCommand();
+ // 4. 璁板綍鎷嗗寘鍓嶇殑搴撳瓨鏁伴噺鍜岄攣瀹氫俊鎭�
+ decimal stockBeforeSplit = baseStockDetail.StockQuantity;
+ decimal assignBeforeSplit = lockInfo.AssignQuantity;
+ // 5. 璁$畻鎷嗗垎鍚庣殑鍓╀綑鏁伴噺
+ decimal remainingQty = baseStockDetail.StockQuantity - request.SplitQuantity;
+ // 鏇存柊鍩虹鏉$爜鐨勫簱瀛樻暟閲忎负鍓╀綑鏁伴噺
+ baseStockDetail.StockQuantity = remainingQty;
+ baseStockDetail.OutboundQuantity = remainingQty;
+ await _stockInfoDetailService.Db.Updateable(baseStockDetail).ExecuteCommandAsync();
+
+ // 6. 鐢熸垚鏂版潯鐮�
var seq = await _dailySequenceService.GetNextSequenceAsync();
- // 3. 鐢熸垚鏂版潯鐮�
string newBarcode = "WSLOT" + DateTime.Now.ToString("yyyyMMdd") + seq.ToString()?.PadLeft(5, '0');
- decimal remainingQty = remainingLockQuantity - request.SplitQuantity;
-
- // 涓烘媶鍖呬骇鐢熺殑鏂版潯鐮佸垱寤哄簱瀛樿褰�
+ // 7. 涓烘柊鏉$爜鍒涘缓搴撳瓨璁板綍锛堟媶鍒嗗嚭鐨勬暟閲忥級
var newStockDetail = new Dt_StockInfoDetail
{
- SupplyCode = stockDetail.SupplyCode,
- WarehouseCode = stockDetail.WarehouseCode,
- BarcodeQty = stockDetail.BarcodeQty,
- BarcodeUnit = stockDetail.BarcodeUnit,
- BusinessType = stockDetail.BusinessType,
- Unit = stockDetail.Unit,
+ SupplyCode = baseStockDetail.SupplyCode,
+ WarehouseCode = baseStockDetail.WarehouseCode,
+ BarcodeQty = baseStockDetail.BarcodeQty,
+ BarcodeUnit = baseStockDetail.BarcodeUnit,
+ BusinessType = baseStockDetail.BusinessType,
+ Unit = baseStockDetail.Unit,
StockId = lockInfo.StockId,
- MaterielCode = stockDetail.MaterielCode,
- OrderNo = stockDetail.OrderNo,
- BatchNo = stockDetail.BatchNo,
- StockQuantity = remainingQty,
- OutboundQuantity = remainingQty, // 閿佸畾鍏ㄩ儴鏁伴噺
+ MaterielCode = baseStockDetail.MaterielCode,
+ OrderNo = baseStockDetail.OrderNo,
+ BatchNo = baseStockDetail.BatchNo,
+ StockQuantity = request.SplitQuantity,
+ OutboundQuantity = request.SplitQuantity,
Barcode = newBarcode,
- InboundOrderRowNo = stockDetail.InboundOrderRowNo,
-
+ InboundOrderRowNo = baseStockDetail.InboundOrderRowNo,
};
- await _outStockLockInfoService.Db.Insertable(newStockDetail).ExecuteCommandAsync();
+ await _stockInfoDetailService.Db.Insertable(newStockDetail).ExecuteCommandAsync();
- // 4. 鍒涘缓鏂扮殑鍑哄簱閿佸畾淇℃伅锛堟柊鏉$爜锛�
+ // 8. 鍒涘缓鏂扮殑鍑哄簱閿佸畾淇℃伅锛堟柊鏉$爜锛�
var newLockInfo = new Dt_OutStockLockInfo
{
-
OrderNo = lockInfo.OrderNo,
OrderDetailId = lockInfo.OrderDetailId,
BatchNo = lockInfo.BatchNo,
MaterielCode = lockInfo.MaterielCode,
MaterielName = lockInfo.MaterielName,
StockId = lockInfo.StockId,
- OrderQuantity = remainingQty,
- OriginalQuantity = remainingQty,
- AssignQuantity = remainingQty, // 鏂版潯鐮佸垎閰嶆暟閲�
- PickedQty = 0, // 鏂版潯鐮佹湭鎷i��
+ OrderQuantity = request.SplitQuantity,
+ OriginalQuantity = request.SplitQuantity,
+ AssignQuantity = request.SplitQuantity,
+ PickedQty = 0,
LocationCode = lockInfo.LocationCode,
PalletCode = lockInfo.PalletCode,
TaskNum = lockInfo.TaskNum,
@@ -126,30 +294,33 @@
Unit = lockInfo.Unit,
SupplyCode = lockInfo.SupplyCode,
OrderType = lockInfo.OrderType,
- CurrentBarcode = newBarcode, // 鏂版潯鐮�
+ CurrentBarcode = newBarcode,
OriginalLockQuantity = request.SplitQuantity,
IsSplitted = 1,
- ParentLockId = lockInfo.Id // 璁板綍鐖剁骇閿佸畾ID
+ ParentLockId = lockInfo.Id
};
await _outStockLockInfoService.Db.Insertable(newLockInfo).ExecuteCommandAsync();
- // 5. 鏇存柊鍘熼攣瀹氫俊鎭殑鍒嗛厤鏁伴噺锛堝噺灏戞媶鍖呮暟閲忥級
- lockInfo.AssignQuantity = request.SplitQuantity;
+ // 9. 鏇存柊鍘熼攣瀹氫俊鎭殑鍒嗛厤鏁伴噺锛堝噺灏戞媶鍖呮暟閲忥級
+ lockInfo.AssignQuantity = remainingQty;
+ lockInfo.IsSplitted = 1;
await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
- // 6. 璁板綍鎷嗗寘鍘嗗彶锛堢敤浜庤拷韪級
+ // 10. 璁板綍鎷嗗寘鍘嗗彶
var splitHistory = new Dt_SplitPackageRecord
{
FactoryArea = lockInfo.FactoryArea,
TaskNum = lockInfo.TaskNum,
OutStockLockInfoId = lockInfo.Id,
- StockId = stockDetail?.StockId ?? 0,
+ StockId = baseStockDetail.StockId,
Operator = App.User.UserName,
IsReverted = false,
- OriginalBarcode = lockInfo.CurrentBarcode,
+ OriginalBarcode = request.OriginalBarcode,
NewBarcode = newBarcode,
SplitQty = request.SplitQuantity,
- RemainQuantity = lockInfo.OriginalQuantity - request.SplitQuantity,
+ RemainQuantity = remainingQty,
+ StockBeforeSplit = stockBeforeSplit, // 璁板綍鎷嗗寘鍓嶇殑搴撳瓨鏁伴噺
+ AssignBeforeSplit = assignBeforeSplit, // 璁板綍鎷嗗寘鍓嶇殑鍒嗛厤鏁伴噺
MaterielCode = lockInfo.MaterielCode,
SplitTime = DateTime.Now,
OrderNo = request.OrderNo,
@@ -159,34 +330,12 @@
await Db.Insertable(splitHistory).ExecuteCommandAsync();
_unitOfWorkManage.CommitTran();
-
- try
- {
- MaterielToMesDTO dto = new MaterielToMesDTO
- {
- batchNo = stockDetail.BatchNo,
- factoryArea = stockDetail.FactoryArea,
- materialCode = stockDetail.MaterielCode,
- newmaterialCode = newBarcode,
- oldmaterialCode = request.OriginalBarcode,
- operationType = 1,
- qty = remainingQty,
- supplyCode = stockDetail.SupplyCode,
- unit = stockDetail.BarcodeUnit,
- warehouseCode = stockDetail.WarehouseCode,
- reqCode = Guid.NewGuid().ToString(),
- reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
- };
- _invokeMESService.NewMaterielToMes(dto);
- }
- catch(Exception ex)
- {
- _logger.LogError("SplitPackage 鍥炰紶MES: " + ex.Message);
- }
- return WebResponseContent.Instance.OK("鎷嗗寘鎴愬姛", new
+
+ return WebResponseContent.Instance.OK("鎷嗗寘鎴愬姛", new SplitPackageChainDto
{
NewBarcode = newBarcode,
- NewLockInfoId = newLockInfo.Id
+ NewLockInfoId = newLockInfo.Id,
+ RemainQuantity = remainingQty
});
}
catch (Exception ex)
@@ -196,7 +345,96 @@
}
}
-
+ public async Task<WebResponseContent> RevertSplitPackage(string originalBarcode)
+ {
+ try
+ {
+ _unitOfWorkManage.BeginTran();
+
+ // 1. 鏌ユ壘璇ユ潯鐮佷綔涓哄師濮嬫潯鐮佺殑鎵�鏈夋湭鎾ら攢鎷嗗寘璁板綍锛屾寜鏃堕棿鍊掑簭
+ var splitRecords = await Db.Queryable<Dt_SplitPackageRecord>()
+ .Where(x => x.OriginalBarcode == originalBarcode && !x.IsReverted)
+ .OrderByDescending(x => x.SplitTime)
+ .ToListAsync();
+
+ if (splitRecords == null || !splitRecords.Any())
+ return WebResponseContent.Instance.Error("鏈壘鍒板彲鎾ら攢鐨勬媶鍖呰褰�");
+
+ // 2. 妫�鏌ユ墍鏈夋柊鏉$爜鏄惁宸叉嫞閫�
+ var newBarcodes = splitRecords.Select(x => x.NewBarcode).ToList();
+ var newLockInfos = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(x => newBarcodes.Contains(x.CurrentBarcode))
+ .ToListAsync();
+
+ var pickedBarcodes = newLockInfos.Where(x => x.Status == 2).Select(x => x.CurrentBarcode).ToList();
+ if (pickedBarcodes.Any())
+ return WebResponseContent.Instance.Error($"浠ヤ笅鏉$爜宸叉嫞閫夛紝鏃犳硶鎾ら攢鎷嗗寘锛歿string.Join(",", pickedBarcodes)}");
+
+ // 3. 鑾峰彇鍘熸潯鐮佺殑閿佸畾淇℃伅鍜屽簱瀛樹俊鎭�
+ var originalLockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(x => x.CurrentBarcode == originalBarcode)
+ .FirstAsync();
+
+ if (originalLockInfo == null)
+ return WebResponseContent.Instance.Error("鏈壘鍒板師鏉$爜閿佸畾淇℃伅");
+
+ var originalStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(x => x.Barcode == originalBarcode && x.StockId == originalLockInfo.StockId)
+ .FirstAsync();
+
+ if (originalStockDetail == null)
+ return WebResponseContent.Instance.Error("鏈壘鍒板師鏉$爜搴撳瓨淇℃伅");
+
+ // 4. 鏌ユ壘绗竴娆℃媶鍖呰褰曪紝鑾峰彇鎷嗗寘鍓嶇殑鐘舵��
+ var firstSplitRecord = splitRecords.OrderBy(x => x.SplitTime).FirstOrDefault();
+ if (firstSplitRecord == null)
+ return WebResponseContent.Instance.Error("鏈壘鍒版湁鏁堢殑鎷嗗寘璁板綍");
+
+ // 5. 鎭㈠鍘熸潯鐮佸埌鎷嗗寘鍓嶇殑鐘舵��
+ originalStockDetail.StockQuantity = firstSplitRecord.StockBeforeSplit;
+ originalStockDetail.OutboundQuantity = firstSplitRecord.StockBeforeSplit;
+ await _stockInfoDetailService.Db.Updateable(originalStockDetail).ExecuteCommandAsync();
+
+ // 6. 鎭㈠鍘熸潯鐮侀攣瀹氫俊鎭埌鎷嗗寘鍓嶇殑鐘舵��
+ originalLockInfo.AssignQuantity = firstSplitRecord.AssignBeforeSplit;
+ originalLockInfo.OriginalQuantity = firstSplitRecord.AssignBeforeSplit;
+ originalLockInfo.OrderQuantity = firstSplitRecord.AssignBeforeSplit;
+ originalLockInfo.Status = (int)OutLockStockStatusEnum.鍑哄簱涓�;
+ originalLockInfo.IsSplitted = 0; // 鎭㈠涓烘湭鎷嗗寘鐘舵��
+ await _outStockLockInfoService.Db.Updateable(originalLockInfo).ExecuteCommandAsync();
+
+ // 7. 鍒犻櫎鎵�鏈夋柊鏉$爜鐨勯攣瀹氫俊鎭�
+ await _outStockLockInfoService.Db.Deleteable<Dt_OutStockLockInfo>()
+ .Where(x => newBarcodes.Contains(x.CurrentBarcode))
+ .ExecuteCommandAsync();
+
+ // 8. 鍒犻櫎鎵�鏈夋柊鏉$爜鐨勫簱瀛樿褰�
+ await _stockInfoDetailService.Db.Deleteable<Dt_StockInfoDetail>()
+ .Where(x => newBarcodes.Contains(x.Barcode))
+ .ExecuteCommandAsync();
+
+ // 9. 鏍囪鎵�鏈夋媶鍖呰褰曚负宸叉挙閿�
+ foreach (var record in splitRecords)
+ {
+ record.IsReverted = true;
+ record.RevertTime = DateTime.Now;
+
+ record.Status = (int)SplitPackageStatusEnum.宸叉挙閿�;
+ }
+ await Db.Updateable(splitRecords).ExecuteCommandAsync();
+
+ _unitOfWorkManage.CommitTran();
+
+ return WebResponseContent.Instance.OK($"鎾ら攢鎷嗗寘鎴愬姛锛屽叡鎾ら攢{splitRecords.Count}娆℃媶鍖咃紝{originalBarcode}鎭㈠涓烘媶鍖呭墠鏁伴噺锛歿firstSplitRecord.StockBeforeSplit}");
+
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ return WebResponseContent.Instance.Error($"鎾ら攢鎷嗗寘澶辫触锛歿ex.Message}");
+ }
+ }
+
//public async Task<WebResponseContent> RevertSplitPackage(string originalBarcode)
//{
// try
@@ -228,7 +466,7 @@
// if (originalLockInfo == null)
// return WebResponseContent.Instance.Error("鏈壘鍒板師鏉$爜閿佸畾淇℃伅");
-
+
// originalLockInfo.AssignQuantity += splitRecord.RemainQuantity;
// // originalLockInfo.Status = (int)OutLockStockStatusEnum.鍑哄簱涓�;
// originalLockInfo.IsSplitted = 0; // 鏍囪涓烘湭鎷嗗寘
@@ -269,7 +507,7 @@
// // 8. 鏇存柊鎷嗗寘璁板綍涓哄凡鎾ら攢
// splitRecord.IsReverted = true;
-
+
// await Db.Updateable(splitRecord).ExecuteCommandAsync();
// _unitOfWorkManage.CommitTran();
@@ -283,101 +521,19 @@
// return WebResponseContent.Instance.Error($"鎾ら攢鎷嗗寘澶辫触锛歿ex.Message}");
// }
//}
-
- public async Task<WebResponseContent> RevertSplitPackage(string originalBarcode)
+
+
+ // 鑾峰彇鍙挙閿�鐨勬媶鍖呰褰曞垪琛�
+ public Dt_SplitPackageRecord GetRevertableSplitRecords(string originalBarcode)
{
- try
- {
- _unitOfWorkManage.BeginTran();
+ var revertableRecords = Db.Queryable<Dt_SplitPackageRecord>()
+ .Where(x => x.OriginalBarcode == originalBarcode && !x.IsReverted)
+ .OrderBy(x => x.SplitTime)
+ .First();
- // 1. 鏌ユ壘鎵�鏈夋湭鎾ら攢鐨勬媶鍖呰褰�
- var splitRecords = await Db.Queryable<Dt_SplitPackageRecord>()
- .Where(x => x.OriginalBarcode == originalBarcode && !x.IsReverted)
- .OrderBy(x => x.SplitTime) // 鎸夋椂闂存搴忥紝浠庢渶鏃╁紑濮嬫挙閿�
- .ToListAsync();
-
- if (splitRecords == null || !splitRecords.Any())
- return WebResponseContent.Instance.Error("鏈壘鍒板彲鎾ら攢鐨勬媶鍖呰褰�");
-
- // 2. 妫�鏌ユ墍鏈夋柊鏉$爜鏄惁宸叉嫞閫�
- var newBarcodes = splitRecords.Select(x => x.NewBarcode).ToList();
- var newLockInfos = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(x => newBarcodes.Contains(x.CurrentBarcode))
- .ToListAsync();
-
- var pickedBarcodes = newLockInfos.Where(x => x.Status == 2).Select(x => x.CurrentBarcode).ToList();
- if (pickedBarcodes.Any())
- return WebResponseContent.Instance.Error($"浠ヤ笅鏉$爜宸叉嫞閫夛紝鏃犳硶鎾ら攢锛歿string.Join(",", pickedBarcodes)}");
-
- // 3. 鑾峰彇鍘熸潯鐮佷俊鎭�
- var originalLockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(x => x.CurrentBarcode == originalBarcode)
- .FirstAsync();
-
- if (originalLockInfo == null)
- return WebResponseContent.Instance.Error("鏈壘鍒板師鏉$爜閿佸畾淇℃伅");
-
- var originalStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(x => x.Barcode == originalBarcode && x.StockId == originalLockInfo.StockId)
- .FirstAsync();
-
- // 4. 鑾峰彇鎵�鏈夋柊鏉$爜鐨勫簱瀛樿褰�
- var newStockDetails = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(x => newBarcodes.Contains(x.Barcode))
- .ToListAsync();
-
- // 5. 璁$畻鎬昏繕鍘熸暟閲�
- decimal totalRevertQty = newStockDetails.Sum(x => x.StockQuantity);
-
- // 6. 杩樺師鍘熸潯鐮佸簱瀛樿褰�
- if (originalStockDetail != null)
- {
- // 鍘熸潯鐮佸綋鍓嶆暟閲忓姞涓婃墍鏈夋柊鏉$爜鐨勬暟閲�
- originalStockDetail.StockQuantity += totalRevertQty;
- originalStockDetail.OutboundQuantity += totalRevertQty;
- await _stockInfoDetailService.Db.Updateable(originalStockDetail).ExecuteCommandAsync();
- }
-
- // 7. 杩樺師鍘熸潯鐮侀攣瀹氫俊鎭�
- decimal totalAssignQty = newLockInfos.Sum(x => x.AssignQuantity);
- originalLockInfo.AssignQuantity += totalAssignQty;
- if (originalLockInfo.OrderQuantity < originalLockInfo.AssignQuantity)
- {
- originalLockInfo.AssignQuantity=originalLockInfo.OrderQuantity;
- }
- originalLockInfo.Status = (int)OutLockStockStatusEnum.鍑哄簱涓�;
- originalLockInfo.IsSplitted = 0;
- await _outStockLockInfoService.Db.Updateable(originalLockInfo).ExecuteCommandAsync();
-
- // 8. 鍒犻櫎鎵�鏈夋柊鏉$爜鐨勯攣瀹氫俊鎭�
- await _outStockLockInfoService.Db.Deleteable<Dt_OutStockLockInfo>()
- .Where(x => newBarcodes.Contains(x.CurrentBarcode))
- .ExecuteCommandAsync();
-
- // 9. 鍒犻櫎鎵�鏈夋柊鏉$爜鐨勫簱瀛樿褰�
- await _stockInfoDetailService.Db.Deleteable<Dt_StockInfoDetail>()
- .Where(x => newBarcodes.Contains(x.Barcode))
- .ExecuteCommandAsync();
-
- // 10. 鏍囪鎵�鏈夋媶鍖呰褰曚负宸叉挙閿�
- foreach (var record in splitRecords)
- {
- record.IsReverted = true;
-
- }
- await Db.Updateable(splitRecords).ExecuteCommandAsync();
-
- _unitOfWorkManage.CommitTran();
-
- return WebResponseContent.Instance.OK($"鎾ら攢鎷嗗寘鎴愬姛锛屽叡杩樺師{splitRecords.Count}娆℃媶鍖咃紝鎬绘暟閲忥細{totalRevertQty}");
-
- }
- catch (Exception ex)
- {
- _unitOfWorkManage.RollbackTran();
- return WebResponseContent.Instance.Error($"鎾ら攢鎷嗗寘澶辫触锛歿ex.Message}");
- }
+ return revertableRecords ;
}
+
// 鑾峰彇鎷嗗寘淇℃伅
public async Task<WebResponseContent> GetSplitPackageInfo(string orderNo, string palletCode, string barcode)
{
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_StockService/StockInfoService.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_StockService/StockInfoService.cs"
index d392eb2..f5ce2dd 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_StockService/StockInfoService.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_StockService/StockInfoService.cs"
@@ -100,7 +100,7 @@
.SelectMany(x => x.Details)
.Where(x => x.MaterielCode == materielCode &&
x.StockQuantity > x.OutboundQuantity) // 鏈夊彲鐢ㄥ簱瀛�
- .OrderBy(x => x.ProductionDate) // 鎸夌敓浜ф棩鏈熸帓搴忥紝鍏堣繘鍏堝嚭
+ .OrderBy(x => x.CreateDate) // 鎸夋棩鏈熸帓搴忥紝鍏堣繘鍏堝嚭
.ThenBy(x => x.StockId) // 鐩稿悓鐢熶骇鏃ユ湡鎸夊簱瀛業D鎺掑簭
.ToList();
@@ -179,7 +179,7 @@
query = query.Where(x => x.BatchNo == batchNo);
}
- return await query.OrderBy(x => x.ProductionDate).ToListAsync();
+ return await query.OrderBy(x => x.CreateDate).ToListAsync();
}
public List<Dt_StockInfo> GetStockInfos(string materielCode, string lotNo, string supplyCode, List<string> locationCodes)
{
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_TaskInfoService/TaskService.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_TaskInfoService/TaskService.cs"
index f8217d5..c2f09f0 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_TaskInfoService/TaskService.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_TaskInfoService/TaskService.cs"
@@ -293,11 +293,11 @@
}).ToList();
feedmodel.details = groupedData;
- var result= await _invokeMESService.FeedbackInbound(feedmodel);
+ var result = await _invokeMESService.FeedbackInbound(feedmodel);
if (result != null && result.code == 200)
{
_inboundOrderService.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 })
- .Where(it => it.Id== inboundOrder.Id).ExecuteCommand();
+ .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
_inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 })
.Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
}
@@ -329,7 +329,7 @@
var outloks = _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>().Where(x => x.TaskNum == task.TaskNum).ToList();
var stockids = outloks.Select(x => x.StockId).ToList();
-
+
_stockService.StockInfoService.Db.Updateable<Dt_StockInfo>()
.SetColumns(it => new Dt_StockInfo
{
@@ -343,9 +343,9 @@
{
Status = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt()
})
- .Where(it => stockids.Contains( it.StockId))
+ .Where(it => stockids.Contains(it.StockId))
.ExecuteCommand();
-
+
return WebResponseContent.Instance.OK();
@@ -419,6 +419,17 @@
return WebResponseContent.Instance.Error($"鏈壘鍒拌鎵樼洏搴撳瓨鏄庣粏淇℃伅");
}
+ // 鑾峰彇鎵�鏈夊洖搴撲腑鐨勫嚭搴撻攣瀹氳褰�
+ var returnLocks = _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(it => it.OrderNo == task.OrderNo && it.PalletCode == task.PalletCode && it.Status == (int)OutLockStockStatusEnum.鍥炲簱涓�)
+ .ToList();
+ // 鏇存柊鍑哄簱閿佸畾璁板綍鐘舵�佷负鍥炲簱瀹屾垚
+ foreach (var lockInfo in returnLocks)
+ {
+ lockInfo.Status = (int)OutLockStockStatusEnum.宸插洖搴�;
+ }
+ _outStockLockInfoService.Db.Updateable(returnLocks).ExecuteCommand();
+
//鏌ヨ揣浣�
Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
if (locationInfo == null)
--
Gitblit v1.9.3