| | |
| | | using System; |
| | | using Microsoft.AspNetCore.Http; |
| | | using SqlSugar; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | |
| | | using WIDESEA_Core; |
| | | using WIDESEA_Core.BaseRepository; |
| | | using WIDESEA_Core.BaseServices; |
| | | using WIDESEA_Core.Helper; |
| | | using WIDESEA_DTO.Outbound; |
| | | using WIDESEA_IBasicService; |
| | | using WIDESEA_IOutboundService; |
| | |
| | | private readonly IStockInfoDetailService _stockInfoDetailService; |
| | | private readonly ILocationInfoService _locationInfoService; |
| | | private readonly IOutboundOrderDetailService _outboundOrderDetailService; |
| | | private readonly IOutboundOrderService _outboundOrderService; |
| | | private readonly ISplitPackageService _splitPackageService; |
| | | |
| | | |
| | | public OutboundPickingService(IRepository<Dt_PickingRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, ILocationInfoService locationInfoService, IOutboundOrderDetailService outboundOrderDetailService, ISplitPackageService splitPackageService) : 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) : base(BaseDal) |
| | | { |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _stockInfoService = stockInfoService; |
| | |
| | | _locationInfoService = locationInfoService; |
| | | _outboundOrderDetailService = outboundOrderDetailService; |
| | | _splitPackageService = splitPackageService; |
| | | _outboundOrderService = outboundOrderService; |
| | | } |
| | | |
| | | |
| | | |
| | | #region æ¥è¯¢åºåºè¯¦æ
å表 |
| | | public async Task<List<OutStockLockListResp>> GetOutStockLockListAsync(string orderNo) |
| | | { |
| | |
| | | return locks.Select(t => new OutStockLockListResp |
| | | { |
| | | Id = t.Id, |
| | | // TaskNum = t.TaskNum, |
| | | // TaskNum = t.TaskNum, |
| | | PalletCode = t.PalletCode, |
| | | CurrentBarcode = t.CurrentBarcode, |
| | | AssignQuantity = t.AssignQuantity, |
| | | PickedQty = t.PickedQty, |
| | | Status = t.Status, |
| | | // IsSplitted = t.IsSplitted |
| | | // IsSplitted = t.IsSplitted |
| | | }).ToList(); |
| | | } |
| | | #endregion |
| | |
| | | return WebResponseContent.Instance.Error("æ¡ç ä¸åå¨"); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | var result = new |
| | | { |
| | | Barcode = barcode, |
| | | MaterielCode = stockDetail.MaterielCode, |
| | | |
| | | |
| | | BatchNo = stockDetail.BatchNo, |
| | | AvailableQuantity = stockDetail.StockQuantity - stockDetail.OutboundQuantity, |
| | | LocationCode = stockDetail.StockInfo?.LocationCode, |
| | |
| | | } |
| | | } |
| | | |
| | | public async Task<WebResponseContent> ConfirmPicking(string orderNo, string palletCode, string barcode) |
| | | { |
| | | try |
| | | { |
| | | _unitOfWorkManage.BeginTran(); |
| | | // 1. éªè¯æ¡ç æææ§ |
| | | var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(x => x.Barcode == barcode) |
| | | .FirstAsync(); |
| | | |
| | | if (stockDetail == null) |
| | | return WebResponseContent.Instance.Error("æ æçæ¡ç æç©æç¼ç "); |
| | | |
| | | // 2. æ£æ¥åºåå¯ç¨æ°é |
| | | var availableQty = stockDetail.StockQuantity - stockDetail.OutboundQuantity; |
| | | if (availableQty <= 0) |
| | | return WebResponseContent.Instance.Error("åºåæ°éä¸è¶³"); |
| | | |
| | | // 3. æ¥æ¾ç¸å
³çåºåºè¯¦æ
ä¿¡æ¯ |
| | | var outStockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderNo == orderNo && |
| | | x.PalletCode == palletCode && |
| | | x.CurrentBarcode == barcode && |
| | | x.Status == 0 && |
| | | x.RemainQuantity > 0) |
| | | .FirstAsync(); |
| | | |
| | | if (outStockInfo == null) |
| | | return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçæ£éä¿¡æ¯æå·²æ£é宿"); |
| | | |
| | | // 4. æ£æ¥åºåºè¯¦æ
é宿°é |
| | | if (outStockInfo.RemainQuantity <= 0) |
| | | return WebResponseContent.Instance.Error("该æ¡ç å·²æ å©ä½å¯æ£éæ°é"); |
| | | |
| | | // 5. æ´æ°åºåºè¯¦æ
çå·²æ£éæ°é |
| | | outStockInfo.PickedQty = outStockInfo.AssignQuantity; |
| | | outStockInfo.Status = 1; |
| | | await _outStockLockInfoService.Db.Updateable(outStockInfo).ExecuteCommandAsync(); |
| | | |
| | | // 6. æ´æ°åºååºåºæ°é |
| | | await _stockInfoDetailService.Db.Updateable<Dt_StockInfoDetail>() |
| | | .SetColumns(x => x.OutboundQuantity == x.OutboundQuantity + outStockInfo.AssignQuantity) |
| | | .Where(x => x.Id == stockDetail.Id) |
| | | .ExecuteCommandAsync(); |
| | | |
| | | // 7. æ´æ°åºåºåæç» |
| | | var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .Where(x => x.Id == outStockInfo.OrderDetailId) |
| | | .FirstAsync(); |
| | | |
| | | orderDetail.OverOutQuantity += outStockInfo.AssignQuantity; |
| | | await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync(); |
| | | |
| | | // 8. æ£æ¥æ¯å¦å®æåºåº |
| | | await CheckAndUpdateOrderStatus(orderNo); |
| | | |
| | | // 9. è®°å½æ£éåå² |
| | | var pickingHistory = new Dt_PickingRecord |
| | | { |
| | | |
| | | OrderNo = orderNo, |
| | | PalletCode = palletCode, |
| | | Barcode = barcode, |
| | | MaterielCode = outStockInfo.MaterielCode, |
| | | PickQuantity = outStockInfo.AssignQuantity, |
| | | PickTime = DateTime.Now, |
| | | OutStockLockId = outStockInfo.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) |
| | | { |
| | | |
| | | |
| | | var orderDetails = await _stockInfoDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .Where(x => x.OrderId == orderNo.ObjToInt()) |
| | | .ToListAsync(); |
| | | |
| | | bool allCompleted = true; |
| | | foreach (var detail in orderDetails) |
| | | { |
| | | if (detail.OverOutQuantity < detail.NeedOutQuantity) |
| | | { |
| | | allCompleted = false; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if (allCompleted) |
| | | { |
| | | await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>() |
| | | .SetColumns(x => x.OrderStatus == 2) // 已宿 |
| | | .Where(x => x.OrderNo == orderNo) |
| | | .ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | // åæ¶æ£éåè½ |
| | | public async Task<WebResponseContent> CancelPicking(string orderNo, string palletCode, string barcode) |
| | | { |
| | | try |
| | | { |
| | | _unitOfWorkManage.BeginTran(); |
| | | // æ¥æ¾æ£éè®°å½ |
| | | var outStockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderNo == orderNo && |
| | | x.PalletCode == palletCode && |
| | | x.CurrentBarcode == barcode && |
| | | x.Status == 1) |
| | | .FirstAsync(); |
| | | |
| | | if (outStockInfo == null) |
| | | return WebResponseContent.Instance.Error("æªæ¾å°å·²æ£éè®°å½"); |
| | | |
| | | // è¿ååºåºè¯¦æ
ç¶æ |
| | | outStockInfo.PickedQty = 0; |
| | | outStockInfo.Status = 0; |
| | | await _outStockLockInfoService.Db.Updateable(outStockInfo).ExecuteCommandAsync(); |
| | | |
| | | // è¿ååºååºåºæ°é |
| | | await _stockInfoDetailService.Db.Updateable<Dt_StockInfoDetail>() |
| | | .SetColumns(x => x.OutboundQuantity == x.OutboundQuantity - outStockInfo.AssignQuantity) |
| | | .Where(x => x.Barcode == barcode) |
| | | .ExecuteCommandAsync(); |
| | | |
| | | // è¿ååºåºåæç» |
| | | var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .Where(x => x.Id == outStockInfo.OrderDetailId) |
| | | .FirstAsync(); |
| | | |
| | | orderDetail.OverOutQuantity -= outStockInfo.AssignQuantity; |
| | | await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync(); |
| | | |
| | | // å 餿£éåå² |
| | | await Db.Deleteable<Dt_PickingRecord>() |
| | | .Where(x => x.OutStockLockId == outStockInfo.Id) |
| | | .ExecuteCommandAsync(); |
| | | |
| | | _unitOfWorkManage.CommitTran(); |
| | | return WebResponseContent.Instance.OK("åæ¶æ£éæå"); |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error($"åæ¶æ£é失败ï¼{ex.Message}"); |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// æ ¹æ®æ¡ç æ¥æ¾éå®ä¿¡æ¯ |
| | | /// </summary> |
| | |
| | | .FirstAsync(); |
| | | } |
| | | |
| | | // è·åæªæ£éå表 |
| | | public async Task<List<Dt_OutStockLockInfo>> GetUnpickedList(string orderNo, string palletCode) |
| | | { |
| | | var list = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderNo == orderNo && |
| | | x.PalletCode == palletCode && |
| | | x.Status == 0 && |
| | | x.RemainQuantity > 0) |
| | | .ToListAsync(); |
| | | return list; |
| | | } |
| | | |
| | | // è·åå·²æ£éå表 |
| | | public async Task<List<Dt_OutStockLockInfo>> GetPickedList(string orderNo, string palletCode) |
| | | { |
| | | var list = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderNo == orderNo && |
| | | x.PalletCode == palletCode && |
| | | x.Status == 1) |
| | | .ToListAsync(); |
| | | return list; |
| | | } |
| | | // è·åæ£éæ±æ» |
| | | public async Task<object> GetPickingSummary(string orderNo) |
| | | { |
| | | var summary = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderNo == orderNo && x.Status == 0) |
| | | .GroupBy(x => new { x.PalletCode, x.MaterielCode }) |
| | | .Select(x => new |
| | | { |
| | | PalletCode = x.PalletCode, |
| | | MaterielCode = x.MaterielCode, |
| | | UnpickedCount = SqlFunc.AggregateCount(x.Id), |
| | | UnpickedQuantity = SqlFunc.AggregateSum(x.RemainQuantity) |
| | | }) |
| | | .ToListAsync(); |
| | | |
| | | return summary; |
| | | } |
| | | /// <summary> |
| | | /// è·åæ£éåå² |
| | | /// </summary> |
| | |
| | | .ToListAsync(); |
| | | } |
| | | |
| | | public async Task GetPalletPickingSummary(string orderNo, string palletCode) |
| | | { |
| | | var summary = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderNo == orderNo && x.PalletCode == palletCode) |
| | | .GroupBy(x => new { x.PalletCode, x.Status }) |
| | | .Select(x => new |
| | | { |
| | | PalletCode = x.PalletCode, |
| | | Status = x.Status, |
| | | TotalAssignQty = SqlFunc.AggregateSum(x.AssignQuantity), |
| | | TotalPickedQty = SqlFunc.AggregateSum(x.PickedQty) |
| | | }) |
| | | .ToListAsync(); |
| | | |
| | | // return summary; |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ¤éæ£é |
| | | /// </summary> |