| | |
| | | using Microsoft.AspNetCore.Http; |
| | | using Microsoft.Extensions.Logging; |
| | | using Org.BouncyCastle.Asn1.Ocsp; |
| | | using SqlSugar.Extensions; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | |
| | | /// <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, // æ°æ¡ç æªæ£é |
| | | // 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 // è®°å½å䏿¬¡æå
IDï¼å»ºç«æå
é¾ |
| | | // }; |
| | | // 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 |
| | |
| | | if (request.SplitQuantity > remainingLockQuantity) |
| | | return WebResponseContent.Instance.Error($"æå
æ°éä¸è½å¤§äºå©ä½é宿°éï¼å©ä½ï¼{remainingLockQuantity}"); |
| | | |
| | | var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | // 3. æ¥æ¾å½åæ¡ç çåºåä¿¡æ¯ |
| | | var baseStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(x => x.Barcode == request.OriginalBarcode && x.StockId == lockInfo.StockId) |
| | | .FirstAsync(); |
| | | if (stockDetail == null) |
| | | |
| | | 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, // æ°æ¡ç æªæ£é |
| | | OrderQuantity = request.SplitQuantity, |
| | | OriginalQuantity = request.SplitQuantity, |
| | | AssignQuantity = request.SplitQuantity, |
| | | PickedQty = 0, |
| | | LocationCode = lockInfo.LocationCode, |
| | | PalletCode = lockInfo.PalletCode, |
| | | TaskNum = lockInfo.TaskNum, |
| | |
| | | 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, |
| | |
| | | |
| | | _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) |
| | |
| | | } |
| | | } |
| | | |
| | | 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) |
| | | //{ |
| | |
| | | // } |
| | | //} |
| | | |
| | | public async Task<WebResponseContent> RevertSplitPackage(string originalBarcode) |
| | | { |
| | | try |
| | | { |
| | | _unitOfWorkManage.BeginTran(); |
| | | |
| | | // 1. æ¥æ¾æææªæ¤éçæå
è®°å½ |
| | | var splitRecords = await Db.Queryable<Dt_SplitPackageRecord>() |
| | | // è·å坿¤éçæå
è®°å½å表 |
| | | public Dt_SplitPackageRecord GetRevertableSplitRecords(string originalBarcode) |
| | | { |
| | | var revertableRecords = Db.Queryable<Dt_SplitPackageRecord>() |
| | | .Where(x => x.OriginalBarcode == originalBarcode && !x.IsReverted) |
| | | .OrderBy(x => x.SplitTime) // ææ¶é´æ£åºï¼ä»ææ©å¼å§æ¤é |
| | | .ToListAsync(); |
| | | .OrderBy(x => x.SplitTime) |
| | | .First(); |
| | | |
| | | 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(); |
| | | return revertableRecords ; |
| | | } |
| | | |
| | | // 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}"); |
| | | } |
| | | } |
| | | // è·åæå
ä¿¡æ¯ |
| | | public async Task<WebResponseContent> GetSplitPackageInfo(string orderNo, string palletCode, string barcode) |
| | | { |