| | |
| | | |
| | | #region å走空箱é»è¾ |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// å走空箱 - æ¸
ç已宿æ£éçæçæ°æ® |
| | | /// </summary> |
| | |
| | | await UpdateOrderStatusAfterPalletRemoval(orderNo); |
| | | |
| | | // è®°å½æä½åå² |
| | | // await RecordEmptyPalletRemoval(orderNo, palletCode, completedLocks); |
| | | await RecordEmptyPalletRemoval(orderNo, palletCode, completedLocks); |
| | | |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | |
| | | { |
| | | foreach (var lockInfo in completedLocks) |
| | | { |
| | | // æ è®°éå®è®°å½ä¸ºå·²åèµ°ï¼å¯ä»¥æ°å¢ç¶ææç´æ¥å é¤ï¼æ ¹æ®ä¸å¡éæ±ï¼ |
| | | // è¿éæä»¬å°å
¶ç¶ææ´æ°ä¸º"å·²åèµ°"ï¼å¹¶è®°å½åèµ°æ¶é´ |
| | | // æ è®°éå®è®°å½ä¸ºå·²åèµ° |
| | | lockInfo.Status = (int)OutLockStockStatusEnum.å·²åèµ°; |
| | | lockInfo.Operator = App.User.UserName; |
| | | await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync(); |
| | | |
| | | // åæ¶æ¸
ç对åºçåºåè®°å½ç¶æ |
| | | // æ¸
ç对åºçåºåè®°å½ç¶æ |
| | | await CleanupStockInfo(lockInfo); |
| | | } |
| | | } |
| | |
| | | var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .FirstAsync(x => x.Barcode == lockInfo.CurrentBarcode && x.StockId == lockInfo.StockId); |
| | | |
| | | if (stockDetail != null) |
| | | { |
| | | // 妿åºåå·²ç»åºåºå®æï¼æ 记为已æ¸
ç |
| | | if (stockDetail.Status == (int)StockStatusEmun.åºåºå®æ) |
| | | if (stockDetail != null && stockDetail.Status == (int)StockStatusEmun.åºåºå®æ) |
| | | { |
| | | stockDetail.Status = (int)StockStatusEmun.å·²æ¸
ç; |
| | | await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ´æ°è®¢åç¶æ |
| | |
| | | |
| | | #endregion |
| | | |
| | | #region è¾
婿¹æ³ |
| | | |
| | | private string GetPalletStatusText(PalletStatusEnum status) |
| | | { |
| | | return status switch |
| | | { |
| | | PalletStatusEnum.æªå¼å§ => "æªå¼å§", |
| | | PalletStatusEnum.æ£éä¸ => "æ£éä¸", |
| | | PalletStatusEnum.已宿 => "已宿", |
| | | PalletStatusEnum.æ ä»»å¡ => "æ ä»»å¡", |
| | | _ => "æªç¥" |
| | | }; |
| | | } |
| | | |
| | | #endregion |
| | | #region 忹忣 |
| | | |
| | | /// <summary> |
| | |
| | | return WebResponseContent.Instance.Error("æªæ¾å°åæ£è®°å½"); |
| | | |
| | | // æ¢å¤éå®ä¿¡æ¯ååºå |
| | | await RevertPickingData(pickingRecord); |
| | | var revertResult = await RevertPickingData(pickingRecord); |
| | | |
| | | //æ´æ°æ¹æ¬¡åè®¢åæ°æ® |
| | | await RevertBatchAndOrderData(pickingRecord); |
| | | await RevertBatchAndOrderData(pickingRecord, revertResult); |
| | | |
| | | // æ è®°åæ£è®°å½ä¸ºå·²åæ¶ |
| | | pickingRecord.IsCancelled = true; |
| | |
| | | return WebResponseContent.Instance.Error($"åæ¶åæ£å¤±è´¥ï¼{ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region æå¨æå
|
| | |
| | | |
| | | #endregion |
| | | |
| | | |
| | | |
| | | #region åæ¶æå
|
| | | |
| | | #region åæ¶æå
- ä¿®å¤çæ¬ |
| | | |
| | | /// <summary> |
| | | /// åæ¶æå
- æ¯æå¤æ¬¡æå
çæ
åµ |
| | | /// åæ¶æå
|
| | | /// </summary> |
| | | public async Task<WebResponseContent> CancelSplitPackage(string orderNo, string palletCode, string newBarcode) |
| | | { |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ§è¡åæ¶æå
é»è¾ - ä¿®å¤çæ¬ |
| | | /// æ§è¡åæ¶æå
é»è¾ |
| | | /// </summary> |
| | | private async Task ExecuteCancelSplitLogic(Dt_SplitPackageRecord splitRecord, |
| | | Dt_OutStockLockInfo originalLockInfo, Dt_OutStockLockInfo newLockInfo, |
| | |
| | | |
| | | await _outStockLockInfoService.Db.Updateable(originalLockInfo).ExecuteCommandAsync(); |
| | | |
| | | // 2. æ¢å¤ååºåæç» |
| | | // æ¢å¤ååºåæç» |
| | | var originalStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .FirstAsync(x => x.Barcode == splitRecord.OriginalBarcode && x.StockId == splitRecord.StockId); |
| | | |
| | |
| | | |
| | | await _stockInfoDetailService.Db.Updateable(originalStock).ExecuteCommandAsync(); |
| | | |
| | | // 3. å 餿°éå®ä¿¡æ¯ |
| | | // å 餿°éå®ä¿¡æ¯ |
| | | await _outStockLockInfoService.Db.Deleteable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.Id == newLockInfo.Id) |
| | | .ExecuteCommandAsync(); |
| | | |
| | | // 4. å 餿°åºåæç» |
| | | // å 餿°åºåæç» |
| | | await _stockInfoDetailService.Db.Deleteable<Dt_StockInfoDetail>() |
| | | .Where(x => x.Barcode == newLockInfo.CurrentBarcode) |
| | | .ExecuteCommandAsync(); |
| | | |
| | | // 5. æ è®°æå
è®°å½ä¸ºå·²æ¤é |
| | | //æ è®°æå
è®°å½ä¸ºå·²æ¤é |
| | | splitRecord.IsReverted = true; |
| | | splitRecord.RevertTime = DateTime.Now; |
| | | splitRecord.RevertOperator = App.User.UserName; |
| | | await _splitPackageService.Db.Updateable(splitRecord).ExecuteCommandAsync(); |
| | | |
| | | // 6. æ£æ¥å¹¶æ´æ°æ¹æ¬¡å订åç¶æ |
| | | // æ£æ¥å¹¶æ´æ°æ¹æ¬¡å订åç¶æ |
| | | await CheckAndUpdateBatchStatus(originalLockInfo.BatchNo); |
| | | await CheckAndUpdateOrderStatus(originalLockInfo.OrderNo); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éªè¯åæ¶æå
è¯·æ± - å¢å¼ºçæ¬ |
| | | /// éªè¯åæ¶æå
è¯·æ± |
| | | /// </summary> |
| | | private async Task<ValidationResult<(Dt_SplitPackageRecord, Dt_OutStockLockInfo, Dt_StockInfoDetail)>> ValidateCancelSplitRequest( |
| | | string orderNo, string palletCode, string newBarcode) |
| | |
| | | |
| | | #endregion |
| | | |
| | | #region DTOç±» |
| | | |
| | | |
| | | |
| | | public class SplitPackageChainInfoDto |
| | | { |
| | | public string OriginalBarcode { get; set; } |
| | | public string RootBarcode { get; set; } // æ°å¢ï¼æ ¹æ¡ç |
| | | public int TotalSplitTimes { get; set; } |
| | | public string ChainType { get; set; } // "root" æ "branch" |
| | | public List<SplitChainItemDto> SplitChain { get; set; } |
| | | } |
| | | |
| | | public class SplitChainItemDto |
| | | { |
| | | public DateTime SplitTime { get; set; } |
| | | public string OriginalBarcode { get; set; } |
| | | public string NewBarcode { get; set; } |
| | | public decimal SplitQuantity { get; set; } |
| | | public string Operator { get; set; } |
| | | public bool IsReverted { get; set; } |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #endregion |
| | | |
| | | #region åæ¹ååº |
| | | |
| | |
| | | { |
| | | _unitOfWorkManage.BeginTran(); |
| | | |
| | | // æ¥æ¾æç䏿ªå®æçéå®è®°å½ |
| | | // æ¥æ¾æç䏿ªå®æçéå®è®°å½ï¼åªå¤çåºåºä¸çè®°å½ï¼ |
| | | var unfinishedLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderNo == orderNo && |
| | | x.PalletCode == palletCode && |
| | |
| | | if (!unfinishedLocks.Any()) |
| | | return WebResponseContent.Instance.Error("该æçæ²¡ææªå®æçéå®è®°å½"); |
| | | |
| | | // ææ¹æ¬¡åç»å¤ç |
| | | var batchGroups = unfinishedLocks.GroupBy(x => x.BatchNo); |
| | | // æåºåºæ¹æ¬¡åç»å¤ç |
| | | var batchGroups = unfinishedLocks.GroupBy(x => x.OutboundBatchNo); // ä½¿ç¨ OutboundBatchNo |
| | | |
| | | foreach (var batchGroup in batchGroups) |
| | | { |
| | | var batchNo = batchGroup.Key; |
| | | var outboundBatchNo = batchGroup.Key; |
| | | var batchLocks = batchGroup.ToList(); |
| | | |
| | | // éæ¾åºååéå®è®°å½ |
| | |
| | | } |
| | | |
| | | // æ´æ°æ¹æ¬¡ç¶æ |
| | | await UpdateBatchStatusForReturn(batchNo, batchLocks); |
| | | await UpdateBatchStatusForReturn(outboundBatchNo, batchLocks); |
| | | |
| | | // æ´æ°è®¢åæç»çå·²åé
æ°é |
| | | await UpdateOrderDetailAfterReturn(batchLocks); |
| | |
| | | return WebResponseContent.Instance.Error($"åæ¹ååºå¤±è´¥ï¼{ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region éªè¯æ¹æ³ |
| | |
| | | return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail, Dt_OutboundBatch)>.Error( |
| | | $"åºåæ°éä¸è¶³ï¼éè¦ï¼{lockInfo.AssignQuantity}ï¼å®é
ï¼{stockDetail.StockQuantity}"); |
| | | |
| | | // ä½¿ç¨ OutboundBatchNo æ¥æ¾æ¹æ¬¡ |
| | | var batch = await _outboundBatchRepository.Db.Queryable<Dt_OutboundBatch>() |
| | | .FirstAsync(x => x.BatchNo == lockInfo.OutboundBatchNo); |
| | | .FirstAsync(x => x.BatchNo == lockInfo.OutboundBatchNo); // ä¿®æ£ä¸º OutboundBatchNo |
| | | |
| | | return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail, Dt_OutboundBatch)>.Success((lockInfo, orderDetail, stockDetail, batch)); |
| | | } |
| | | |
| | | private async Task<ValidationResult<(Dt_OutStockLockInfo, Dt_StockInfoDetail)>> ValidateSplitRequest( |
| | | string orderNo, string palletCode, string originalBarcode, decimal splitQuantity) |
| | | { |
| | |
| | | .FirstAsync(x => x.Id == pickingRecord.OutStockLockId); |
| | | |
| | | lockInfo.PickedQty -= pickingRecord.PickQuantity; |
| | | |
| | | // æ ¹æ®æ£éæ°éå¤æç¶æ |
| | | if (lockInfo.PickedQty <= 0) |
| | | { |
| | | lockInfo.Status = (int)OutLockStockStatusEnum.åºåºä¸; |
| | | } |
| | | else if (lockInfo.PickedQty < lockInfo.AssignQuantity) |
| | | { |
| | | lockInfo.Status = (int)OutLockStockStatusEnum.åºåºä¸; |
| | | } |
| | | |
| | | await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync(); |
| | | |
| | | // æ¢å¤åºå |
| | |
| | | |
| | | stockDetail.StockQuantity += pickingRecord.PickQuantity; |
| | | stockDetail.OutboundQuantity -= pickingRecord.PickQuantity; |
| | | |
| | | // æ¢å¤åºåç¶æ |
| | | if (stockDetail.StockQuantity > 0) |
| | | { |
| | | stockDetail.Status = (int)StockStatusEmun.åºåºéå®; |
| | | } |
| | | |
| | | await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | |
| | | return new RevertPickingResult |
| | |
| | | StockDetail = stockDetail |
| | | }; |
| | | } |
| | | |
| | | private async Task<SplitResultDto> ExecuteSplitLogic(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail, |
| | | decimal splitQuantity, string palletCode) |
| | | { |
| | |
| | | StockId = stockDetail.StockId, |
| | | MaterielCode = stockDetail.MaterielCode, |
| | | OrderNo = stockDetail.OrderNo, |
| | | BatchNo = stockDetail.BatchNo, |
| | | BatchNo = stockDetail.BatchNo, // ç©ææ¹æ¬¡ |
| | | StockQuantity = splitQuantity, |
| | | OutboundQuantity = 0, |
| | | Barcode = newBarcode, |
| | |
| | | BarcodeUnit=stockDetail.BarcodeUnit, |
| | | BusinessType=stockDetail.BusinessType, |
| | | InboundOrderRowNo=stockDetail.InboundOrderRowNo, |
| | | |
| | | |
| | | }; |
| | | await _stockInfoDetailService.Db.Insertable(newStockDetail).ExecuteCommandAsync(); |
| | | |
| | |
| | | stockDetail.StockQuantity -= splitQuantity; |
| | | await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | |
| | | |
| | | // å建æ°éå®ä¿¡æ¯ - ä½¿ç¨æ£ç¡®ç OutboundBatchNo |
| | | var newLockInfo = new Dt_OutStockLockInfo |
| | | { |
| | | OrderNo = lockInfo.OrderNo, |
| | | OrderDetailId = lockInfo.OrderDetailId, |
| | | BatchNo = lockInfo.BatchNo, |
| | | OutboundBatchNo = lockInfo.OutboundBatchNo, // ä½¿ç¨ OutboundBatchNo |
| | | MaterielCode = lockInfo.MaterielCode, |
| | | MaterielName = lockInfo.MaterielName, |
| | | StockId = lockInfo.StockId, |
| | | OrderQuantity = splitQuantity, |
| | | //OriginalQuantity = quantity, |
| | | AssignQuantity = splitQuantity, |
| | | PickedQty = 0, |
| | | LocationCode = lockInfo.LocationCode, |
| | |
| | | SupplyCode = lockInfo.SupplyCode, |
| | | OrderType = lockInfo.OrderType, |
| | | CurrentBarcode = newBarcode, |
| | | // OriginalLockQuantity = quantity, |
| | | IsSplitted = 1, |
| | | ParentLockId = lockInfo.Id, |
| | | Operator = App.User.UserName, |
| | |
| | | WarehouseCode = lockInfo.WarehouseCode, |
| | | BarcodeQty = lockInfo.BarcodeQty, |
| | | BarcodeUnit = lockInfo.BarcodeUnit, |
| | | |
| | | }; |
| | | |
| | | await _outStockLockInfoService.Db.Insertable(newLockInfo).ExecuteCommandAsync(); |
| | |
| | | |
| | | return new SplitResultDto { NewBarcode = newBarcode }; |
| | | } |
| | | |
| | | private async Task ExecuteCancelSplitLogic(Dt_SplitPackageRecord splitRecord, Dt_OutStockLockInfo newLockInfo, Dt_StockInfoDetail newStockDetail) |
| | | { |
| | | // æ¢å¤ååºå |
| | |
| | | await CheckAndUpdateOrderStatus(orderNo); |
| | | } |
| | | |
| | | private async Task RevertBatchAndOrderData(Dt_PickingRecord pickingRecord) |
| | | private async Task RevertBatchAndOrderData(Dt_PickingRecord pickingRecord, RevertPickingResult revertResult) |
| | | { |
| | | // æ¢å¤æ¹æ¬¡å®ææ°é |
| | | var batch = await _outboundBatchRepository.Db.Queryable<Dt_OutboundBatch>() |
| | | .FirstAsync(x => x.BatchNo == pickingRecord.BatchNo); |
| | | .FirstAsync(x => x.BatchNo == revertResult.LockInfo.OutboundBatchNo); // ä½¿ç¨ OutboundBatchNo |
| | | |
| | | if (batch != null) |
| | | { |
| | | batch.CompletedQuantity -= pickingRecord.PickQuantity; |
| | | |
| | | // éæ°è®¡ç®æ¹æ¬¡ç¶æ |
| | | if (batch.CompletedQuantity <= 0) |
| | | { |
| | | batch.BatchStatus = (int)BatchStatusEnum.åé
ä¸; |
| | | } |
| | | else if (batch.CompletedQuantity < batch.BatchQuantity) |
| | | { |
| | | batch.BatchStatus = (int)BatchStatusEnum.æ§è¡ä¸; |
| | | } |
| | | |
| | | await _outboundBatchRepository.Db.Updateable(batch).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | // æ¢å¤è®¢åæç» |
| | | var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | |
| | | // éæ°æ£æ¥è®¢åç¶æ |
| | | await CheckAndUpdateOrderStatus(pickingRecord.OrderNo); |
| | | } |
| | | |
| | | private async Task ReleaseLockAndStock(Dt_OutStockLockInfo lockInfo) |
| | | { |
| | | // æ¢å¤åºåç¶æ |
| | | // æ¢å¤åºåç¶æ - ååºååºåå为å¯ç¨ç¶æ |
| | | var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .FirstAsync(x => x.Barcode == lockInfo.CurrentBarcode && x.StockId == lockInfo.StockId); |
| | | |
| | | if (stockDetail != null) |
| | | { |
| | | // ååºååºåç¶ææ¢å¤ä¸ºå
¥åºå®æï¼å¯ç¨ç¶æï¼ |
| | | stockDetail.Status = (int)StockStatusEmun.å
¥åºå®æ; |
| | | await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | // æ´æ°éå®è®°å½ç¶æä¸ºååº |
| | | // æ´æ°éå®è®°å½ç¶æä¸ºå·²ååº |
| | | lockInfo.Status = (int)OutLockStockStatusEnum.å·²ååº; |
| | | lockInfo.Operator = App.User.UserName; |
| | | await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | private async Task UpdateBatchStatusForReturn(string batchNo, List<Dt_OutStockLockInfo> returnedLocks) |
| | | /// <summary> |
| | | /// æ´æ°æ¹æ¬¡ç¶æï¼ååºï¼ |
| | | /// </summary> |
| | | private async Task UpdateBatchStatusForReturn(string outboundBatchNo, List<Dt_OutStockLockInfo> returnedLocks) |
| | | { |
| | | var batch = await _outboundBatchRepository.Db.Queryable<Dt_OutboundBatch>() |
| | | .FirstAsync(x => x.BatchNo == batchNo); |
| | | .FirstAsync(x => x.BatchNo == outboundBatchNo); |
| | | |
| | | // 计ç®ååºæ°é |
| | | if (batch != null) |
| | | { |
| | | // 计ç®ååºæ°éï¼æªæ£éçé¨åï¼ |
| | | var returnedQty = returnedLocks.Sum(x => x.AssignQuantity - x.PickedQty); |
| | | batch.CompletedQuantity -= returnedQty; |
| | | |
| | | // æ´æ°æ¹æ¬¡ç¶æ |
| | | if (batch.CompletedQuantity <= 0) |
| | | { |
| | | batch.BatchStatus = (int)BatchStatusEnum.å·²ååº; |
| | | } |
| | | else |
| | | else if (batch.CompletedQuantity < batch.BatchQuantity) |
| | | { |
| | | batch.BatchStatus = (int)BatchStatusEnum.æ§è¡ä¸; |
| | | } |
| | | else |
| | | { |
| | | batch.BatchStatus = (int)BatchStatusEnum.已宿; |
| | | } |
| | | |
| | | batch.Operator = App.User.UserName; |
| | | await _outboundBatchRepository.Db.Updateable(batch).ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ´æ°è®¢åæç»ï¼ååºåï¼ |
| | | /// </summary> |
| | | private async Task UpdateOrderDetailAfterReturn(List<Dt_OutStockLockInfo> returnedLocks) |
| | | { |
| | | var orderDetailGroups = returnedLocks.GroupBy(x => x.OrderDetailId); |
| | |
| | | var orderDetailId = group.Key; |
| | | var returnedQty = group.Sum(x => x.AssignQuantity - x.PickedQty); |
| | | |
| | | await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>() |
| | | .SetColumns(x => x.AllocatedQuantity == x.AllocatedQuantity - returnedQty) |
| | | .Where(x => x.Id == orderDetailId) |
| | | .ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .FirstAsync(x => x.Id == orderDetailId); |
| | | |
| | | if (orderDetail != null) |
| | | { |
| | | orderDetail.AllocatedQuantity -= returnedQty; |
| | | await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | #region è¾
婿¹æ³ |
| | |
| | | PickTime = DateTime.Now, |
| | | Operator = App.User.UserName, |
| | | OutStockLockId = result.FinalLockInfo.Id, |
| | | |
| | | BarcodeUnit = result.FinalLockInfo.BarcodeUnit, |
| | | BarcodeQty = result.FinalLockInfo.BarcodeQty, |
| | | BatchNo = result.FinalLockInfo.BatchNo, |
| | | lineNo = result.FinalLockInfo.lineNo, |
| | | SupplyCode = result.FinalLockInfo.SupplyCode, |
| | | WarehouseCode = result.FinalLockInfo.WarehouseCode, |
| | | // IsCancelled = false |
| | | }; |
| | | |
| | |
| | | .Where(x => x.OrderNo == orderNo) |
| | | .ExecuteCommandAsync(); |
| | | } |
| | | |
| | | private string GetPalletStatusText(PalletStatusEnum status) |
| | | { |
| | | return status switch |
| | | { |
| | | PalletStatusEnum.æªå¼å§ => "æªå¼å§", |
| | | PalletStatusEnum.æ£éä¸ => "æ£éä¸", |
| | | PalletStatusEnum.已宿 => "已宿", |
| | | PalletStatusEnum.æ ä»»å¡ => "æ ä»»å¡", |
| | | _ => "æªç¥" |
| | | }; |
| | | } |
| | | #endregion |
| | | |
| | | |
| | | #region DTOç±» |
| | | |
| | | public class PickingResult |