| | |
| | | private readonly IRepository<Dt_Task> _taskRepository; |
| | | private readonly IESSApiService _eSSApiService; |
| | | private readonly IInvokeMESService _invokeMESService; |
| | | private readonly IDailySequenceService _dailySequenceService; |
| | | |
| | | private readonly ILogger<OutboundPickingService> _logger; |
| | | |
| | |
| | | |
| | | }; |
| | | |
| | | 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; |
| | |
| | | _eSSApiService = eSSApiService; |
| | | _logger = logger; |
| | | _invokeMESService = invokeMESService; |
| | | _dailySequenceService = dailySequenceService; |
| | | } |
| | | |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | 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}æä¸åå¨å¾
åæ£è®°å½"); |
| | | } |
| | | |
| | | } |
| | | 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.æ£é宿; |
| | | 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. è®°å½æ£éåå² |
| | | 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("æ£é确认æå"); |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æ£é确认失败ï¼{ex.Message}"); |
| | | } |
| | | } |
| | | // æ£æ¥å¹¶æ´æ°è®¢åç¶æ |
| | | private async Task CheckAndUpdateOrderStatus(string orderNo) |
| | | { |
| | |
| | | } |
| | | } |
| | | } |
| | | 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}æä¸åå¨å¾
åæ£è®°å½"); |
| | | } |
| | | |
| | | 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.æ£é宿, |
| | | 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 |
| | | }); |
| | | |
| | | // æ´æ°æ£éè®°å½ä¸çæ¡ç ä¸ºæ°æ¡ç |
| | | 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.æ£é宿; |
| | | 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(); |
| | | |
| | | // è®°å½æ£éåå² |
| | | 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("æ£é确认æåï¼å·²èªå¨æå
", new { SplitResults = splitResults }); |
| | | } |
| | | |
| | | return WebResponseContent.Instance.OK("æ£é确认æå"); |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error($"æ£é确认失败ï¼{ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ååºæä½ |
| | |
| | | { |
| | | 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>(); |
| | | |
| | |
| | | |
| | | // æ£æ¥æç䏿¯å¦æå
¶ä»éåºåºè´§ç©ï¼åºåè´§ç©ï¼ |
| | | 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.æ£é宿); |
| | | |
| | | if (allPicked) |
| | | { |
| | | return WebResponseContent.Instance.OK("ææè´§ç©å·²æ£éå®æï¼æç为空"); |
| | | } |
| | | 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); |
| | |
| | | // æ´æ°åºåºéå®è®°å½ç¶æ |
| | | 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) |
| | |
| | | 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 |
| | | { |
| | |
| | | { |
| | | 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(); |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | // æ
åµ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(); |
| | | } |
| | | // ä¿åä»»å¡ ç»ESSä¸åä»»å¡ |
| | | if (tasks.Any()) |
| | | { |
| | |
| | | await _taskRepository.Db.Insertable(tasks).ExecuteCommandAsync(); |
| | | var targetAddress = task.TargetAddress; |
| | | _taskRepository.DeleteData(task); |
| | | |
| | | // ç» ESS æµå¨ä¿¡å·ååå»ºä»»å¡ |
| | | try |
| | | { |
| | |
| | | slotCode = movestations[targetAddress], |
| | | containerCode = palletCode |
| | | }); |
| | | |
| | | if (result) |
| | | { |
| | | TaskModel esstask = new TaskModel() |
| | |
| | | } |
| | | }; |
| | | |
| | | |
| | | 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> |
| | | /// å建ååºä»»å¡ |
| | |
| | | try |
| | | { |
| | | _unitOfWorkManage.BeginTran(); |
| | | |
| | | // æ¥æ¾æ£éè®°å½ |
| | | var outStockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderNo == orderNo && |
| | | x.PalletCode == palletCode && |
| | | x.CurrentBarcode == barcode && |
| | | x.Status == 6) |
| | | var pickingRecord = await Db.Queryable<Dt_PickingRecord>() |
| | | .Where(it => it.OrderNo == orderNo && |
| | | it.PalletCode == palletCode && |
| | | it.Barcode == barcode) |
| | | .OrderByDescending(it => it.PickTime) |
| | | .FirstAsync(); |
| | | |
| | | if (outStockInfo == null) |
| | | return WebResponseContent.Instance.Error("æªæ¾å°å·²æ£éè®°å½"); |
| | | if (pickingRecord == null) |
| | | return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçæ£éè®°å½"); |
| | | |
| | | // è¿ååºåºè¯¦æ
ç¶æ |
| | | 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) |
| | | // æ¥æ¾åºåºéå®ä¿¡æ¯ |
| | | var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(it => it.Id == pickingRecord.OutStockLockId) |
| | | .FirstAsync(); |
| | | |
| | | stockDetail.StockQuantity += outStockInfo.AssignQuantity; |
| | | stockDetail.OutboundQuantity += outStockInfo.AssignQuantity; |
| | | await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | if (lockInfo == null) |
| | | return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçåºåºéå®ä¿¡æ¯"); |
| | | |
| | | //æ£æ¥æ¯å¦å¯ä»¥åæ¶ï¼ç¶æå¿
é¡»æ¯æ£éå®æï¼ |
| | | if (lockInfo.Status != (int)OutLockStockStatusEnum.æ£é宿) |
| | | return WebResponseContent.Instance.Error("å½åç¶æä¸å
è®¸åæ¶åæ£"); |
| | | |
| | | // è¿ååºåºåæç» |
| | | var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .Where(x => x.Id == outStockInfo.OrderDetailId) |
| | | .FirstAsync(); |
| | | decimal cancelQty = pickingRecord.PickQuantity; |
| | | |
| | | orderDetail.OverOutQuantity -= outStockInfo.AssignQuantity; |
| | | orderDetail.PickedQty = 0; |
| | | await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync(); |
| | | // æ£æ¥æå
é¾å
³ç³» |
| | | var splitChain = await GetSplitChain(barcode); |
| | | |
| | | // å 餿£éåå² |
| | | await Db.Deleteable<Dt_PickingRecord>() |
| | | .Where(x => x.OutStockLockId == outStockInfo.Id) |
| | | .ExecuteCommandAsync(); |
| | | 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("åæ¶æ£éæå"); |
| | | |
| | | return WebResponseContent.Instance.OK($"忶忣æåï¼æ¢å¤æ°éï¼{cancelQty}"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error($"åæ¶æ£é失败ï¼{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(); |
| | | } |
| | | |
| | | // æ¢å¤è®¢åæç»æ£éæ°éï¼ä½¿ç¨åå§éå®ä¿¡æ¯ç订åæç»IDï¼ |
| | | await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>() |
| | | .SetColumns(it => it.PickedQty == it.PickedQty - cancelQty) |
| | | .Where(it => it.Id == originalLockInfo.OrderDetailId) |
| | | .ExecuteCommandAsync(); |
| | | |
| | | // æ¢å¤è®¢åç¶æ |
| | | await CheckAndRevertOrderStatus(orderNo); |
| | | |
| | | // å 餿£éè®°å½ |
| | | 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. å 餿£éè®°å½ |
| | | 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) |
| | | { |