| | |
| | | using System; |
| | | using Dm.filter; |
| | | using MailKit.Search; |
| | | using Microsoft.AspNetCore.Http; |
| | | using Microsoft.Extensions.Logging; |
| | | using SqlSugar; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | |
| | | using WIDESEA_Common.LocationEnum; |
| | | using WIDESEA_Common.OrderEnum; |
| | | using WIDESEA_Common.StockEnum; |
| | | using WIDESEA_Common.TaskEnum; |
| | | using WIDESEA_Core; |
| | | using WIDESEA_Core.BaseRepository; |
| | | using WIDESEA_Core.BaseServices; |
| | | using WIDESEA_Core.Helper; |
| | | using WIDESEA_DTO.Basic; |
| | | using WIDESEA_DTO.Inbound; |
| | | 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; |
| | | |
| | | private readonly IRepository<Dt_Task> _taskRepository; |
| | | private readonly IESSApiService _eSSApiService; |
| | | private readonly IInvokeMESService _invokeMESService; |
| | | |
| | | public OutboundPickingService(IRepository<Dt_PickingRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, ILocationInfoService locationInfoService, IOutboundOrderDetailService outboundOrderDetailService, ISplitPackageService splitPackageService) : base(BaseDal) |
| | | private readonly ILogger<OutboundPickingService> _logger; |
| | | |
| | | private Dictionary<string, string> stations = new Dictionary<string, string> |
| | | { |
| | | {"2-1","2-9" }, |
| | | {"3-1","3-9" }, |
| | | |
| | | }; |
| | | |
| | | private Dictionary<string, string> movestations = new Dictionary<string, string> |
| | | { |
| | | {"2-1","2-5" }, |
| | | {"3-1","3-5" }, |
| | | |
| | | }; |
| | | |
| | | 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) |
| | | { |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _stockInfoService = stockInfoService; |
| | |
| | | _locationInfoService = locationInfoService; |
| | | _outboundOrderDetailService = outboundOrderDetailService; |
| | | _splitPackageService = splitPackageService; |
| | | _outboundOrderService = outboundOrderService; |
| | | _taskRepository = taskRepository; |
| | | _eSSApiService = eSSApiService; |
| | | _logger = logger; |
| | | _invokeMESService = invokeMESService; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ«ç æ£é确认 - ç®åçæ¬ |
| | | /// åªå¤çå®é
æ£éçåºåæ£å |
| | | /// </summary> |
| | | public async Task<WebResponseContent> ConfirmPicking(PickingConfirmRequest request) |
| | | |
| | | #region æ¥è¯¢åºåºè¯¦æ
å表 |
| | | public async Task<List<OutStockLockListResp>> GetOutStockLockListAsync(string orderNo) |
| | | { |
| | | var locks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(t => t.OrderNo == orderNo) |
| | | .ToListAsync(); |
| | | |
| | | return locks.Select(t => new OutStockLockListResp |
| | | { |
| | | Id = t.Id, |
| | | // TaskNum = t.TaskNum, |
| | | PalletCode = t.PalletCode, |
| | | CurrentBarcode = t.CurrentBarcode, |
| | | AssignQuantity = t.AssignQuantity, |
| | | PickedQty = t.PickedQty, |
| | | Status = t.Status, |
| | | // IsSplitted = t.IsSplitted |
| | | }).ToList(); |
| | | } |
| | | #endregion |
| | | public async Task<WebResponseContent> ValidateBarcode(string barcode) |
| | | { |
| | | try |
| | | { |
| | | if (string.IsNullOrEmpty(barcode)) |
| | | { |
| | | return WebResponseContent.Instance.Error("æ¡ç ä¸è½ä¸ºç©º"); |
| | | } |
| | | |
| | | // æ ¹æ®æ¡ç æ¥è¯¢åºåæç» |
| | | var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Includes(x => x.StockInfo) |
| | | .Where(x => x.Barcode == barcode) |
| | | .FirstAsync(); |
| | | |
| | | if (stockDetail == null) |
| | | { |
| | | return WebResponseContent.Instance.Error("æ¡ç ä¸åå¨"); |
| | | } |
| | | |
| | | |
| | | |
| | | var result = new |
| | | { |
| | | Barcode = barcode, |
| | | MaterielCode = stockDetail.MaterielCode, |
| | | |
| | | BatchNo = stockDetail.BatchNo, |
| | | AvailableQuantity = stockDetail.StockQuantity - stockDetail.OutboundQuantity, |
| | | LocationCode = stockDetail.StockInfo?.LocationCode, |
| | | PalletCode = stockDetail.StockInfo?.PalletCode |
| | | }; |
| | | |
| | | return WebResponseContent.Instance.OK(null, result); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æ¡ç éªè¯å¤±è´¥: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | |
| | | 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(); |
| | | |
| | | // 1. éªè¯æ¡ç æææ§ |
| | | 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 == request.Barcode && x.MaterielCode == request.MaterielCode) |
| | | .FirstAsync(); |
| | | .Where(x => x.Barcode == barcode && x.StockId == lockInfo.StockId) |
| | | .FirstAsync(); |
| | | |
| | | if (stockDetail == null) |
| | | return WebResponseContent.Instance.Error("æ æçæ¡ç æç©æç¼ç "); |
| | | |
| | | // 2. æ£æ¥åºåå¯ç¨æ°é |
| | | decimal availableQuantity = stockDetail.StockQuantity - stockDetail.OutboundQuantity; |
| | | if (request.PickQuantity > availableQuantity) |
| | | return WebResponseContent.Instance.Error($"æ£éæ°éè¶
è¿å¯ç¨åºåï¼å¯ç¨æ°éï¼{availableQuantity}"); |
| | | |
| | | // 3. æ¥æ¾ç¸å
³çåºåºéå®ä¿¡æ¯ï¼æ¯ææå
åçæ°æ¡ç ï¼ |
| | | var lockInfo = await FindLockInfoByBarcode(request.OrderDetailId, request.Barcode, request.MaterielCode); |
| | | decimal actualQty = lockInfo.AssignQuantity - lockInfo.PickedQty; |
| | | |
| | | if (lockInfo == null) |
| | | return WebResponseContent.Instance.Error("æªæ¾å°ç¸å
³çåºåºéå®ä¿¡æ¯"); |
| | | // 4. æ´æ°åºå |
| | | stockDetail.StockQuantity -= actualQty; |
| | | stockDetail.OutboundQuantity -= actualQty; |
| | | await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | |
| | | // 4. æ£æ¥é宿°é |
| | | decimal remainingLockQuantity = lockInfo.AssignQuantity - lockInfo.PickedQty; |
| | | if (request.PickQuantity > remainingLockQuantity) |
| | | return WebResponseContent.Instance.Error($"æ£éæ°éè¶
è¿é宿°éï¼å©ä½å¯æ£éï¼{remainingLockQuantity}"); |
| | | |
| | | // 5. æ´æ°éå®ä¿¡æ¯çå·²æ£éæ°é |
| | | lockInfo.PickedQty += request.PickQuantity; |
| | | lockInfo.PickedQty += actualQty; |
| | | lockInfo.Status = (int)OutLockStockStatusEnum.æ£é宿; |
| | | await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync(); |
| | | |
| | | // 6. æ´æ°åºååºåºæ°é - å®é
åå°åºå |
| | | stockDetail.OutboundQuantity += request.PickQuantity; |
| | | await _stockInfoService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | var splitBarcodeRecord = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>() |
| | | .Where(it => it.NewBarcode == barcode) |
| | | .FirstAsync(); |
| | | |
| | | // 7. æ´æ°åºåºåæç» |
| | | var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .Where(x => x.Id == request.OrderDetailId) |
| | | .FirstAsync(); |
| | | |
| | | orderDetail.OverOutQuantity += request.PickQuantity; |
| | | orderDetail.LockQuantity -= request.PickQuantity; |
| | | |
| | | // æ£æ¥æ¯å¦å®æåºåº |
| | | if (Math.Abs(orderDetail.OverOutQuantity - orderDetail.OrderQuantity) < 0.001m) |
| | | if (splitBarcodeRecord != null) |
| | | { |
| | | orderDetail.OrderDetailStatus = (int)OrderDetailStatusEnum.Over; |
| | | orderDetail.LockQuantity = 0; |
| | | |
| | | // æ´æ°ç¸å
³çéå®ä¿¡æ¯ç¶æä¸ºå·²åºåº |
| | | var relatedLockInfos = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderDetailId == request.OrderDetailId && |
| | | x.Status == (int)OutLockStockStatusEnum.åºåºä¸) |
| | | .ToListAsync(); |
| | | |
| | | foreach (var relatedLock in relatedLockInfos) |
| | | { |
| | | relatedLock.Status = (int)OutLockStockStatusEnum.å·²åºåº; |
| | | } |
| | | await _outStockLockInfoService.Db.Updateable(relatedLockInfos).ExecuteCommandAsync(); |
| | | splitBarcodeRecord.Status = 2; |
| | | await _splitPackageService.Db.Updateable(splitBarcodeRecord).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync(); |
| | | await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>() |
| | | .SetColumns(it => it.PickedQty == it.PickedQty + actualQty) |
| | | .Where(it => it.Id == lockInfo.OrderDetailId) |
| | | .ExecuteCommandAsync(); |
| | | |
| | | // 8. è®°å½æ£éåå² |
| | | var pickHistory = new Dt_PickingRecord |
| | | |
| | | await CheckAndUpdateOrderStatus(orderNo); |
| | | |
| | | //æ¥è¯¢ä»»å¡è¡¨ |
| | | var task = _taskRepository.QueryData(x => x.OrderNo == orderNo && x.PalletCode == palletCode).FirstOrDefault(); |
| | | // 9. è®°å½æ£éåå² |
| | | var pickingHistory = new Dt_PickingRecord |
| | | { |
| | | OrderDetailId = request.OrderDetailId, |
| | | Barcode = request.Barcode, |
| | | PickQuantity = request.PickQuantity, |
| | | 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, |
| | | |
| | | LocationCode = request.LocationCode, |
| | | StockId = stockDetail.StockId |
| | | Operator = App.User.UserName, |
| | | OutStockLockId = lockInfo.Id |
| | | }; |
| | | await Db.Insertable(pickHistory).ExecuteCommandAsync(); |
| | | await Db.Insertable(pickingHistory).ExecuteCommandAsync(); |
| | | |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | return WebResponseContent.Instance.OK("æ£é确认æå"); |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error($"æ£é确认失败: {ex.Message}"); |
| | | return WebResponseContent.Instance.Error($"æ£é确认失败ï¼{ex.Message}"); |
| | | } |
| | | } |
| | | // æ£æ¥å¹¶æ´æ°è®¢åç¶æ |
| | | private async Task CheckAndUpdateOrderStatus(string orderNo) |
| | | { |
| | | |
| | | var orderDetails = _stockInfoDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .LeftJoin<Dt_OutboundOrder>((o, item) => o.OrderId == item.Id) // å
³èæ¡ä»¶ï¼ç¶è¡¨ Id = å表 OrderId |
| | | .Where((o, item) => item.OrderNo == orderNo) // è¿æ»¤ç¶è¡¨ OrderNo |
| | | .Select((o, item) => o) // åªè¿ååè¡¨æ°æ® |
| | | .ToList(); |
| | | |
| | | //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) |
| | | { |
| | | try |
| | | { |
| | | await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>() |
| | | .SetColumns(x => x.OrderStatus == 2) // 已宿 |
| | | .Where(x => x.OrderNo == orderNo) |
| | | .ExecuteCommandAsync(); |
| | | |
| | | var outboundOrder = _stockInfoService.Db.Queryable<Dt_OutboundOrder>().First(x => x.OrderNo == orderNo); |
| | | |
| | | |
| | | if (outboundOrder != null && outboundOrder.OrderStatus == InOrderStatusEnum.å
¥åºå®æ.ObjToInt()) |
| | | { |
| | | var feedmodel = new FeedbackOutboundRequestModel |
| | | { |
| | | reqCode = Guid.NewGuid().ToString(), |
| | | reqTime = DateTime.Now.ToString(), |
| | | business_type = outboundOrder.BusinessType, |
| | | factoryArea = outboundOrder.FactoryArea, |
| | | operationType = 1, |
| | | Operator = outboundOrder.Operator, |
| | | orderNo = outboundOrder.UpperOrderNo, |
| | | status = outboundOrder.OrderStatus, |
| | | details = new List<FeedbackOutboundDetailsModel>() |
| | | |
| | | }; |
| | | var lists = _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>().Where(x => x.OrderNo == orderNo).ToList(); |
| | | |
| | | var groupedData = lists.GroupBy(item => new { item.MaterielCode, item.lineNo, item.Unit, item.WarehouseCode }) |
| | | .Select(group => new FeedbackOutboundDetailsModel |
| | | { |
| | | materialCode = group.Key.MaterielCode, |
| | | lineNo = group.Key.lineNo, |
| | | warehouseCode = group.Key.WarehouseCode, |
| | | currentDeliveryQty = group.Sum(x => x.OrderQuantity), |
| | | // warehouseCode= "1072", |
| | | unit = group.Key.Unit, |
| | | barcodes = group.Select(row => new WIDESEA_DTO.Outbound.BarcodesModel |
| | | { |
| | | barcode = row.CurrentBarcode, |
| | | supplyCode = row.SupplyCode, |
| | | batchNo = row.BatchNo, |
| | | unit = row.Unit, |
| | | qty = row.AssignQuantity |
| | | }).ToList() |
| | | }).ToList(); |
| | | feedmodel.details = groupedData; |
| | | |
| | | _invokeMESService.FeedbackOutbound(feedmodel); |
| | | } |
| | | } |
| | | catch (Exception ex) { |
| | | _logger.LogError(" OutboundPickingService FeedbackOutbound : " + ex.Message); |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// ååºæä½ |
| | | /// </summary> |
| | | |
| | | public async Task<WebResponseContent> ReturnRemaining(string orderNo, string palletCode, string reason) |
| | | { |
| | | try |
| | | { |
| | | // è·åæææªåæ£çåºåºéå®è®°å½ï¼å
æ¬æå
产ççè®°å½ |
| | | var remainingLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(it => it.OrderNo == orderNo && it.Status == 1) |
| | | .ToListAsync(); |
| | | |
| | | var stockinfo = _stockInfoService.Db.Queryable<Dt_StockInfo>().First(x => x.PalletCode == palletCode); |
| | | |
| | | |
| | | var tasks = new List<Dt_Task>(); |
| | | |
| | | // æ¥è¯¢ä»»å¡è¡¨ |
| | | var task = remainingLocks.Any() |
| | | ? _taskRepository.QueryData(x => x.TaskNum == remainingLocks.First().TaskNum).FirstOrDefault() |
| | | : _taskRepository.QueryData(x => x.PalletCode == palletCode).FirstOrDefault(); |
| | | |
| | | if (task == null) |
| | | { |
| | | 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())) |
| | | .Where(it => it.OutboundQuantity == 0 || it.OutboundQuantity < it.StockQuantity) // æªå®å
¨åºåºç |
| | | .ToListAsync(); |
| | | |
| | | // å¦ææ²¡æéè¦ååºçè´§ç©ï¼æ¢æ æªåæ£åºåºè´§ç©ï¼ä¹æ å
¶ä»åºåè´§ç©ï¼ |
| | | if (!remainingLocks.Any() && !palletStockGoods.Any()) |
| | | { |
| | | //æ¯å¦èªå¨ååºï¼æä¹ååºåºçä»»å¡å é¤ï¼ç¶åç»ä¸ªç©ºçå
¥åºã |
| | | 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) |
| | | { |
| | | var palletLocks = remainingLocks.Where(x => x.PalletCode == palletCode).ToList(); |
| | | totalReturnQty = palletLocks.Sum(x => x.AssignQuantity - x.PickedQty); |
| | | |
| | | if (totalReturnQty > 0) |
| | | { |
| | | // åé
æ°è´§ä½ |
| | | var newLocation = _locationInfoService.AssignLocation(firstlocation.LocationType); |
| | | |
| | | // æ´æ°åºåºéå®è®°å½ç¶æ |
| | | var lockIds = palletLocks.Select(x => x.Id).ToList(); |
| | | await _outStockLockInfoService.Db.Updateable<Dt_OutStockLockInfo>() |
| | | .SetColumns(it => new Dt_OutStockLockInfo { Status = OutLockStockStatusEnum.ååºä¸.ObjToInt() }) |
| | | .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) |
| | | { |
| | | decimal returnQty = lockInfo.AssignQuantity - lockInfo.PickedQty; |
| | | |
| | | // æ£æ¥åºåè®°å½æ¯å¦åå¨ |
| | | var existingStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(it => it.Barcode == lockInfo.CurrentBarcode && it.StockId == lockInfo.StockId) |
| | | .FirstAsync(); |
| | | |
| | | 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(); |
| | | } |
| | | else |
| | | { |
| | | // åºåè®°å½ä¸åå¨ï¼å¯è½æ¯æå
产ççæ°æ¡ç ï¼ï¼å建æ°çåºåè®°å½ |
| | | var newStockDetail = new Dt_StockInfoDetail |
| | | { |
| | | StockId = lockInfo.StockId, |
| | | MaterielCode = lockInfo.MaterielCode, |
| | | OrderNo = lockInfo.OrderNo, |
| | | BatchNo = lockInfo.BatchNo, |
| | | StockQuantity = returnQty, |
| | | OutboundQuantity = 0, |
| | | Barcode = lockInfo.CurrentBarcode, |
| | | InboundOrderRowNo = "0", |
| | | Status = StockStatusEmun.å
¥åºç¡®è®¤.ObjToInt(), |
| | | |
| | | }; |
| | | await _stockInfoDetailService.Db.Insertable(newStockDetail).ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | |
| | | // å建ååºä»»å¡ |
| | | CreateReturnTask(tasks, task, palletCode, newLocation); |
| | | } |
| | | } |
| | | |
| | | // æ
åµ2ï¼åºåºè´§ç©å·²åæ£å®ï¼ä½æçä¸è¿æå
¶ä»åºåè´§ç©éè¦ååº |
| | | if (!hasRemainingLocks && palletStockGoods.Any()) |
| | | { |
| | | // åé
æ°è´§ä½ |
| | | var newLocation = _locationInfoService.AssignLocation(firstlocation.LocationType); |
| | | |
| | | // å建ååºä»»å¡ |
| | | CreateReturnTask(tasks, task, palletCode, newLocation); |
| | | |
| | | totalReturnQty = palletStockGoods.Sum(x => x.StockQuantity - x.OutboundQuantity); |
| | | } |
| | | |
| | | // ä¿åä»»å¡ |
| | | if (tasks.Any()) |
| | | { |
| | | try |
| | | { |
| | | await _taskRepository.Db.Insertable(tasks).ExecuteCommandAsync(); |
| | | var targetAddress = task.TargetAddress; |
| | | _taskRepository.DeleteData(task); |
| | | // ç» ESS æµå¨ä¿¡å·ååå»ºä»»å¡ |
| | | try |
| | | { |
| | | var result = await _eSSApiService.MoveContainerAsync(new WIDESEA_DTO.Basic.MoveContainerRequest |
| | | { |
| | | slotCode = movestations[targetAddress], |
| | | containerCode = palletCode |
| | | }); |
| | | if (result) |
| | | { |
| | | TaskModel esstask = new TaskModel() |
| | | { |
| | | taskType = "putaway", |
| | | 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 = "" |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | |
| | | |
| | | var resulttask = await _eSSApiService.CreateTaskAsync(esstask); |
| | | |
| | | _logger.LogInformation("ReturnRemaining å建任å¡è¿å: " + resulttask); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _logger.LogInformation("ReturnRemaining å建任å¡è¿å catch err: " + ex.Message); |
| | | |
| | | } |
| | | |
| | | |
| | | return WebResponseContent.Instance.OK($"ååºæä½æåï¼å
±ååºæ°éï¼{totalReturnQty}"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å建ååºä»»å¡å¤±è´¥: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | return WebResponseContent.Instance.Error("æªå建任ä½ååºä»»å¡"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error($"ååºæä½å¤±è´¥: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®æ¡ç æ¥æ¾éå®ä¿¡æ¯ |
| | | /// å建ååºä»»å¡ |
| | | /// </summary> |
| | | private async Task<Dt_OutStockLockInfo> FindLockInfoByBarcode(int orderDetailId, string barcode, string materielCode) |
| | | private void CreateReturnTask(List<Dt_Task> tasks, Dt_Task originalTask, string palletCode, Dt_LocationInfo newLocation) |
| | | { |
| | | return await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderDetailId == orderDetailId && |
| | | x.MaterielCode == materielCode && |
| | | x.CurrentBarcode == barcode && |
| | | x.Status == (int)OutLockStockStatusEnum.åºåºä¸ && |
| | | x.AssignQuantity > x.PickedQty) |
| | | .FirstAsync(); |
| | | Dt_Task newTask = new() |
| | | { |
| | | CurrentAddress = stations[originalTask.TargetAddress], |
| | | Grade = 0, |
| | | PalletCode = palletCode, |
| | | NextAddress = "", |
| | | OrderNo = originalTask.OrderNo, |
| | | Roadway = newLocation.RoadwayNo, |
| | | SourceAddress = stations[originalTask.TargetAddress], |
| | | TargetAddress = newLocation.LocationCode, |
| | | TaskStatus = TaskStatusEnum.New.ObjToInt(), |
| | | TaskType = TaskTypeEnum.InPick.ObjToInt(), |
| | | PalletType = originalTask.PalletType, |
| | | WarehouseId = originalTask.WarehouseId, |
| | | |
| | | }; |
| | | tasks.Add(newTask); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ£æ¥æçæ¯å¦éè¦ååºçè¾
婿¹æ³ |
| | | /// </summary> |
| | | public async Task<bool> CheckPalletNeedReturn(string orderNo, string palletCode) |
| | | { |
| | | // 1. æ£æ¥æ¯å¦ææªåæ£çåºåºè®°å½ |
| | | var hasUnpickedLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode && it.Status == 1) |
| | | .AnyAsync(); |
| | | |
| | | if (hasUnpickedLocks) |
| | | return true; |
| | | |
| | | // 2. æ£æ¥åºåºæ¯å¦å·²å®æä½æçè¿æåºåè´§ç© |
| | | var outboundFinished = !await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(it => it.PalletCode == palletCode && it.Status == 1) |
| | | .AnyAsync(); |
| | | |
| | | var stockinfo = _stockInfoService.Db.Queryable<Dt_StockInfo>().First(x => x.PalletCode == palletCode); |
| | | |
| | | |
| | | var hasRemainingGoods = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(it => it.StockId == stockinfo.Id && it.Status == StockStatusEmun.å
¥åºç¡®è®¤.ObjToInt()) |
| | | .Where(it => it.OutboundQuantity == 0 || it.OutboundQuantity < it.StockQuantity) |
| | | .AnyAsync(); |
| | | |
| | | return outboundFinished && hasRemainingGoods; |
| | | } |
| | | |
| | | // åæ¶æ£éåè½ |
| | | 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 == 6) |
| | | .FirstAsync(); |
| | | |
| | | if (outStockInfo == 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) |
| | | .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) |
| | | .FirstAsync(); |
| | | |
| | | orderDetail.OverOutQuantity -= outStockInfo.AssignQuantity; |
| | | orderDetail.PickedQty = 0; |
| | | 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}"); |
| | | } |
| | | } |
| | | |
| | | // è·åæªæ£éå表 |
| | | 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 == 1) |
| | | .ToListAsync(); |
| | | return list.Where(x => x.RemainQuantity > 0).ToList(); |
| | | } |
| | | |
| | | // è·åå·²æ£éå表 |
| | | 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 == 6) |
| | | .ToListAsync(); |
| | | return list; |
| | | } |
| | | // è·åæ£éæ±æ» |
| | | public async Task<object> GetPickingSummary(ConfirmPickingDto dto) |
| | | { |
| | | var picked = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .WhereIF(!string.IsNullOrEmpty(dto.OrderNo), x => x.OrderNo == dto.OrderNo) |
| | | .WhereIF(!string.IsNullOrEmpty(dto.PalletCode), x => x.PalletCode == dto.PalletCode) |
| | | .Where(x => x.Status == 6) |
| | | .GroupBy(x => new { x.PalletCode, x.MaterielCode }) |
| | | .Select(x => new SummaryPickingDto |
| | | { |
| | | PalletCode = x.PalletCode, |
| | | MaterielCode = x.MaterielCode, |
| | | pickedCount = SqlFunc.AggregateCount(x.Id) |
| | | }).FirstAsync(); |
| | | if (picked == null) |
| | | { |
| | | picked = new SummaryPickingDto { pickedCount = 0 }; |
| | | } |
| | | |
| | | var summary = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .WhereIF(!string.IsNullOrEmpty(dto.OrderNo), x => x.OrderNo == dto.OrderNo) |
| | | .WhereIF(!string.IsNullOrEmpty(dto.PalletCode), x => x.PalletCode == dto.PalletCode) |
| | | .Where(x => x.Status == 1) |
| | | .GroupBy(x => new { x.PalletCode, x.MaterielCode }) |
| | | .Select(x => new SummaryPickingDto |
| | | { |
| | | PalletCode = x.PalletCode, |
| | | MaterielCode = x.MaterielCode, |
| | | UnpickedCount = SqlFunc.AggregateCount(x.Id), |
| | | UnpickedQuantity = SqlFunc.AggregateSum(x.AssignQuantity) - SqlFunc.AggregateSum(x.PickedQty), |
| | | |
| | | }).FirstAsync(); |
| | | if (summary == null) |
| | | { |
| | | summary = new SummaryPickingDto { pickedCount = 0 }; |
| | | } |
| | | summary.pickedCount = picked.pickedCount; |
| | | |
| | | return summary; |
| | | } |
| | | /// <summary> |
| | | /// è·åæ£éåå² |
| | | /// </summary> |
| | |
| | | .ToListAsync(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¤éæ£é |
| | | /// </summary> |
| | | public async Task<WebResponseContent> CancelPicking(CancelPickingRequest request) |
| | | { |
| | | // å®ç°æ¤éæ£éçé»è¾ï¼éè¦ï¼ |
| | | // 1. æ¢å¤åºååºåºæ°é |
| | | // 2. æ¢å¤éå®ä¿¡æ¯çå·²æ£éæ°é |
| | | // 3. æ¢å¤åºåºåæç»çå·²åºæ°éåé宿°é |
| | | // 4. å 餿æ è®°æ£éåå²è®°å½ |
| | | // 注æï¼è¿ééè¦äºå¡å¤ç |
| | | try |
| | | { |
| | | _unitOfWorkManage.BeginTran(); |
| | | |
| | | var pickHistory = await Db.Queryable<Dt_PickingRecord>() |
| | | .Where(x => x.Id == request.PickingHistoryId) |
| | | .FirstAsync(); |
| | | |
| | | if (pickHistory == null) |
| | | return WebResponseContent.Instance.Error("æªæ¾å°æ£éè®°å½"); |
| | | |
| | | // æ¢å¤åºå |
| | | var stockDetail = await _stockInfoService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(x => x.Barcode == pickHistory.Barcode && x.StockId == pickHistory.StockId) |
| | | .FirstAsync(); |
| | | if (stockDetail != null) |
| | | { |
| | | stockDetail.OutboundQuantity -= pickHistory.PickQuantity; |
| | | await _stockInfoService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | } |
| | | // æ¢å¤éå®ä¿¡æ¯ |
| | | var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderDetailId == pickHistory.OrderDetailId && x.StockId == pickHistory.StockId) |
| | | .FirstAsync(); |
| | | lockInfo.PickedQty -= pickHistory.PickQuantity; |
| | | await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync(); |
| | | |
| | | // æ¢å¤åºåºåæç» |
| | | var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .Where(x => x.Id == pickHistory.OrderDetailId) |
| | | .FirstAsync(); |
| | | orderDetail.OverOutQuantity -= pickHistory.PickQuantity; |
| | | orderDetail.LockQuantity += pickHistory.PickQuantity; |
| | | if (orderDetail.OverOutQuantity < orderDetail.OrderQuantity) |
| | | { |
| | | orderDetail.OrderDetailStatus = orderDetail.LockQuantity > 0 ? |
| | | (int)OrderDetailStatusEnum.Outbound : (int)OrderDetailStatusEnum.AssignOverPartial; |
| | | } |
| | | await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync(); |
| | | |
| | | // å 餿£éåå²è®°å½ |
| | | await Db.Deleteable<Dt_PickingRecord>().Where(x => x.Id == request.PickingHistoryId).ExecuteCommandAsync(); |
| | | |
| | | _unitOfWorkManage.CommitTran(); |
| | | return WebResponseContent.Instance.OK("æ¤éæå"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error($"æ¤é失败: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åæççåºåºç¶æä¿¡æ¯ |
| | |
| | | { |
| | | _unitOfWorkManage.BeginTran(); |
| | | |
| | | // 1. è·åæçåºåä¿¡æ¯ |
| | | var stockInfo = await _stockInfoService.Db.Queryable<Dt_StockInfo>() |
| | | .Includes(x => x.Details) |
| | | .Where(x => x.PalletCode == request.PalletCode) |
| | | .FirstAsync(); |
| | | .Where(x => x.PalletCode == request.PalletCode).FirstAsync(); |
| | | |
| | | if (stockInfo == null) |
| | | return WebResponseContent.Instance.Error("æªæ¾å°æçåºåä¿¡æ¯"); |
| | | |
| | | // 2. è·åç¸å
³çåºåºéå®ä¿¡æ¯ |
| | | |
| | | var lockInfos = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.PalletCode == request.PalletCode && |
| | | x.Status == (int)OutLockStockStatusEnum.åºåºä¸) |
| | | .Where(x => x.OrderNo == request.OrderNo && x.PalletCode == request.PalletCode) |
| | | .ToListAsync(); |
| | | |
| | | // 3. æ´ä¸ªæçåºåº - 设置åºåºæ°éçäºåºåæ°é |
| | | foreach (var detail in stockInfo.Details) |
| | | { |
| | | decimal outboundQuantity = detail.StockQuantity - detail.OutboundQuantity; |
| | | detail.OutboundQuantity = detail.StockQuantity; // å
¨é¨åºåº |
| | | await _stockInfoDetailService.Db.Updateable(detail).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | // 4. æ´æ°åºåºéå®ä¿¡æ¯ |
| | | foreach (var lockInfo in lockInfos) |
| | | { |
| | | decimal unpicked = lockInfo.AssignQuantity - lockInfo.PickedQty; |
| | | lockInfo.PickedQty += unpicked; // æ 记为å
¨é¨æ£é |
| | | if (lockInfo.Status == (int)OutLockStockStatusEnum.åºåºä¸) |
| | | { |
| | | lockInfo.PickedQty = lockInfo.AssignQuantity; |
| | | } |
| | | lockInfo.Status = (int)OutLockStockStatusEnum.å·²åºåº; |
| | | await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync(); |
| | | |
| | | // æ´æ°åºåºåæç» |
| | | var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .Where(x => x.Id == lockInfo.OrderDetailId) |
| | | .FirstAsync(); |
| | | orderDetail.OverOutQuantity += unpicked; |
| | | orderDetail.LockQuantity -= unpicked; |
| | | orderDetail.OrderDetailStatus = (int)OrderDetailStatusEnum.Over; |
| | | orderDetail.LockQuantity = 0; |
| | | |
| | | await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync(); |
| | | .Where(x => x.Id == lockInfo.OrderDetailId) |
| | | .FirstAsync(); |
| | | if (orderDetail != null) |
| | | { |
| | | orderDetail.OverOutQuantity += lockInfo.PickedQty; |
| | | orderDetail.LockQuantity -= lockInfo.PickedQty; |
| | | orderDetail.OrderDetailStatus = (int)OrderDetailStatusEnum.Over; |
| | | orderDetail.LockQuantity = 0; |
| | | await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | var groupDetails = lockInfos.GroupBy(x => x.OrderDetailId).Select(x => new |
| | | { |
| | | OrderDetailId = x.Key, |
| | | TotalQuantity = x.Sum(o => o.PickedQty) |
| | | }).ToList(); |
| | | foreach (var item in groupDetails) |
| | | { |
| | | var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>().Where(x => x.Id == item.OrderDetailId).FirstAsync(); |
| | | if (orderDetail != null) |
| | | { |
| | | orderDetail.OverOutQuantity = item.TotalQuantity; |
| | | orderDetail.LockQuantity = 0; |
| | | orderDetail.OrderDetailStatus = (int)OrderDetailStatusEnum.Over; |
| | | await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | |
| | | // 5. æ´æ°æå
è®°å½ç¶æ |
| | | await CheckAndUpdateOrderStatus(request.OrderNo); |
| | | |
| | | var lockInfoIds = lockInfos.Select(x => x.Id).ToList(); |
| | | var splitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>() |
| | | .Where(x => lockInfoIds.Contains(x.OutStockLockInfoId) && |
| | |
| | | await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | // 6. æ¸
ç©ºè´§ä½ |
| | | |
| | | var location = await _locationInfoService.Db.Queryable<Dt_LocationInfo>() |
| | | .Where(x => x.LocationCode == stockInfo.LocationCode) |
| | | .FirstAsync(); |
| | |
| | | await _locationInfoService.Db.Updateable(location).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | foreach (var detail in stockInfo.Details) |
| | | { |
| | | await _stockInfoDetailService.Db.Deleteable(detail).ExecuteCommandAsync(); |
| | | } |
| | | await _stockInfoService.Db.Deleteable(stockInfo).ExecuteCommandAsync(); |
| | | |
| | | |
| | | |
| | | _unitOfWorkManage.CommitTran(); |
| | | return WebResponseContent.Instance.OK("ç´æ¥åºåºæå"); |
| | | } |