From 6b6c66cd99a4e73eea9bc68c8d7c63fd08180fb9 Mon Sep 17 00:00:00 2001
From: pan <antony1029@163.com>
Date: 星期二, 18 十一月 2025 16:12:46 +0800
Subject: [PATCH] 提交
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs | 791 ++++++++++++++++++++++++++++++++++++--------------------
1 files changed, 509 insertions(+), 282 deletions(-)
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
index fafc2a8..ef0c0c2 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
@@ -1,4 +1,7 @@
-锘縰sing Microsoft.AspNetCore.Http;
+锘縰sing Dm.filter;
+using MailKit.Search;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Logging;
using SqlSugar;
using System;
using System.Collections.Generic;
@@ -8,10 +11,13 @@
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;
@@ -36,9 +42,27 @@
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;
+ 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) : base(BaseDal)
+ 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;
@@ -49,6 +73,10 @@
_outboundOrderDetailService = outboundOrderDetailService;
_splitPackageService = splitPackageService;
_outboundOrderService = outboundOrderService;
+ _taskRepository = taskRepository;
+ _eSSApiService = eSSApiService;
+ _logger = logger;
+ _invokeMESService = invokeMESService;
}
@@ -113,168 +141,105 @@
}
}
- /// <summary>
- /// 鎵爜鎷i�夌‘璁� - 绠�鍖栫増鏈�
- /// 鍙鐞嗗疄闄呮嫞閫夌殑搴撳瓨鎵e噺
- /// </summary>
- public async Task<WebResponseContent> ConfirmPicking(PickingConfirmRequest request)
- {
- try
- {
- _unitOfWorkManage.BeginTran();
-
- // 1. 楠岃瘉鏉$爜鏈夋晥鎬�
- var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(x => x.Barcode == request.Barcode && x.MaterielCode == request.MaterielCode)
- .FirstAsync();
-
- if (stockDetail == null)
- return WebResponseContent.Instance.Error("鏃犳晥鐨勬潯鐮佹垨鐗╂枡缂栫爜");
-
- // 2. 妫�鏌ュ簱瀛樺彲鐢ㄦ暟閲�
- decimal availableQuantity = stockDetail.StockQuantity - stockDetail.OutboundQuantity;
- if (request.PickQuantity > availableQuantity)
- return WebResponseContent.Instance.Error($"鎷i�夋暟閲忚秴杩囧彲鐢ㄥ簱瀛橈紝鍙敤鏁伴噺锛歿availableQuantity}");
-
- // 3. 鏌ユ壘鐩稿叧鐨勫嚭搴撻攣瀹氫俊鎭紙鏀寔鎷嗗寘鍚庣殑鏂版潯鐮侊級
- var lockInfo = await FindLockInfoByBarcode(request.OrderDetailId, request.Barcode, request.MaterielCode);
-
- if (lockInfo == null)
- return WebResponseContent.Instance.Error("鏈壘鍒扮浉鍏崇殑鍑哄簱閿佸畾淇℃伅");
-
- // 4. 妫�鏌ラ攣瀹氭暟閲�
- decimal remainingLockQuantity = lockInfo.AssignQuantity - lockInfo.PickedQty;
- if (request.PickQuantity > remainingLockQuantity)
- return WebResponseContent.Instance.Error($"鎷i�夋暟閲忚秴杩囬攣瀹氭暟閲忥紝鍓╀綑鍙嫞閫夛細{remainingLockQuantity}");
-
- // 5. 鏇存柊閿佸畾淇℃伅鐨勫凡鎷i�夋暟閲�
- lockInfo.PickedQty += request.PickQuantity;
- await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
-
- // 6. 鏇存柊搴撳瓨鍑哄簱鏁伴噺 - 瀹為檯鍑忓皯搴撳瓨
- stockDetail.OutboundQuantity += request.PickQuantity;
- await _stockInfoService.Db.Updateable(stockDetail).ExecuteCommandAsync();
-
- // 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)
- {
- 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();
- }
-
- await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
-
- // 8. 璁板綍鎷i�夊巻鍙�
- var pickHistory = new Dt_PickingRecord
- {
- OrderDetailId = request.OrderDetailId,
- Barcode = request.Barcode,
- PickQuantity = request.PickQuantity,
- PickTime = DateTime.Now,
-
- LocationCode = request.LocationCode,
- StockId = stockDetail.StockId
- };
- await Db.Insertable(pickHistory).ExecuteCommandAsync();
-
- _unitOfWorkManage.CommitTran();
-
- return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔�");
- }
- catch (Exception ex)
- {
- _unitOfWorkManage.RollbackTran();
- return WebResponseContent.Instance.Error($"鎷i�夌‘璁ゅけ璐�: {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)
+ {
+ 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}鎴栦笉瀛樺湪寰呭垎鎷h褰�");
+ }
+
+ }
+ 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)
+ .Where(x => x.Barcode == barcode && x.StockId == lockInfo.StockId)
.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();
+ decimal actualQty = lockInfo.AssignQuantity - lockInfo.PickedQty;
- if (outStockInfo == null)
- return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑鎷i�変俊鎭垨宸叉嫞閫夊畬鎴�");
+ // 4. 鏇存柊搴撳瓨
+ stockDetail.StockQuantity -= actualQty;
+ stockDetail.OutboundQuantity -= actualQty;
+ await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
- // 4. 妫�鏌ュ嚭搴撹鎯呴攣瀹氭暟閲�
- if (outStockInfo.RemainQuantity <= 0)
- return WebResponseContent.Instance.Error("璇ユ潯鐮佸凡鏃犲墿浣欏彲鎷i�夋暟閲�");
+ lockInfo.PickedQty += actualQty;
+ lockInfo.Status = (int)OutLockStockStatusEnum.鎷i�夊畬鎴�;
+ await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
- // 5. 鏇存柊鍑哄簱璇︽儏鐨勫凡鎷i�夋暟閲�
- outStockInfo.PickedQty = outStockInfo.AssignQuantity;
- outStockInfo.Status = 1;
- await _outStockLockInfoService.Db.Updateable(outStockInfo).ExecuteCommandAsync();
+ var splitBarcodeRecord = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
+ .Where(it => it.NewBarcode == barcode)
+ .FirstAsync();
- // 6. 鏇存柊搴撳瓨鍑哄簱鏁伴噺
- await _stockInfoDetailService.Db.Updateable<Dt_StockInfoDetail>()
- .SetColumns(x => x.OutboundQuantity == x.OutboundQuantity + outStockInfo.AssignQuantity)
- .Where(x => x.Id == stockDetail.Id)
- .ExecuteCommandAsync();
+ if (splitBarcodeRecord != null)
+ {
+ splitBarcodeRecord.Status = 2;
+ await _splitPackageService.Db.Updateable(splitBarcodeRecord).ExecuteCommandAsync();
+ }
- // 7. 鏇存柊鍑哄簱鍗曟槑缁�
- var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
- .Where(x => x.Id == outStockInfo.OrderDetailId)
- .FirstAsync();
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(it => it.PickedQty == it.PickedQty + actualQty)
+ .Where(it => it.Id == lockInfo.OrderDetailId)
+ .ExecuteCommandAsync();
- orderDetail.OverOutQuantity += outStockInfo.AssignQuantity;
- await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
- // 8. 妫�鏌ユ槸鍚﹀畬鎴愬嚭搴�
await CheckAndUpdateOrderStatus(orderNo);
+ //鏌ヨ浠诲姟琛�
+ var task = _taskRepository.QueryData(x => x.OrderNo == orderNo && x.PalletCode == palletCode).FirstOrDefault();
// 9. 璁板綍鎷i�夊巻鍙�
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 = outStockInfo.MaterielCode,
- PickQuantity = outStockInfo.AssignQuantity,
+ MaterielCode = lockInfo.MaterielCode,
+ PickQuantity = lockInfo.AssignQuantity,
PickTime = DateTime.Now,
- OutStockLockId = outStockInfo.Id
+ Operator = App.User.UserName,
+ OutStockLockId = lockInfo.Id
};
await Db.Insertable(pickingHistory).ExecuteCommandAsync();
@@ -291,10 +256,15 @@
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();
+ //var orderDetails = await _stockInfoDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+ // .Where(x => x.OrderId == orderNo.ObjToInt())
+ // .ToListAsync();
bool allCompleted = true;
foreach (var detail in orderDetails)
@@ -308,12 +278,320 @@
if (allCompleted)
{
- await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
- .SetColumns(x => x.OrderStatus == 2) // 宸插畬鎴�
- .Where(x => x.OrderNo == orderNo)
- .ExecuteCommandAsync();
+ 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 void CreateReturnTask(List<Dt_Task> tasks, Dt_Task originalTask, string palletCode, Dt_LocationInfo newLocation)
+ {
+ 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. 妫�鏌ユ槸鍚︽湁鏈垎鎷g殑鍑哄簱璁板綍
+ 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;
+ }
+
// 鍙栨秷鎷i�夊姛鑳�
public async Task<WebResponseContent> CancelPicking(string orderNo, string palletCode, string barcode)
{
@@ -325,7 +603,7 @@
.Where(x => x.OrderNo == orderNo &&
x.PalletCode == palletCode &&
x.CurrentBarcode == barcode &&
- x.Status == 1)
+ x.Status == 6)
.FirstAsync();
if (outStockInfo == null)
@@ -333,14 +611,18 @@
// 杩樺師鍑哄簱璇︽儏鐘舵��
outStockInfo.PickedQty = 0;
- outStockInfo.Status = 0;
+ outStockInfo.Status = 1;
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 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>()
@@ -348,6 +630,7 @@
.FirstAsync();
orderDetail.OverOutQuantity -= outStockInfo.AssignQuantity;
+ orderDetail.PickedQty = 0;
await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
// 鍒犻櫎鎷i�夊巻鍙�
@@ -364,19 +647,6 @@
return WebResponseContent.Instance.Error($"鍙栨秷鎷i�夊け璐ワ細{ex.Message}");
}
}
- /// <summary>
- /// 鏍规嵁鏉$爜鏌ユ壘閿佸畾淇℃伅
- /// </summary>
- private async Task<Dt_OutStockLockInfo> FindLockInfoByBarcode(int orderDetailId, string barcode, string materielCode)
- {
- 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();
- }
// 鑾峰彇鏈嫞閫夊垪琛�
public async Task<List<Dt_OutStockLockInfo>> GetUnpickedList(string orderNo, string palletCode)
@@ -384,10 +654,9 @@
var list = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
.Where(x => x.OrderNo == orderNo &&
x.PalletCode == palletCode &&
- x.Status == 0 &&
- x.RemainQuantity > 0)
+ x.Status == 1)
.ToListAsync();
- return list;
+ return list.Where(x => x.RemainQuantity > 0).ToList();
}
// 鑾峰彇宸叉嫞閫夊垪琛�
@@ -396,26 +665,49 @@
var list = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
.Where(x => x.OrderNo == orderNo &&
x.PalletCode == palletCode &&
- x.Status == 1)
+ x.Status == 6)
.ToListAsync();
return list;
}
// 鑾峰彇鎷i�夋眹鎬�
- public async Task<object> GetPickingSummary(string orderNo)
+ 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>()
- .Where(x => x.OrderNo == orderNo && x.Status == 0)
+ .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
+ .Select(x => new SummaryPickingDto
{
PalletCode = x.PalletCode,
MaterielCode = x.MaterielCode,
UnpickedCount = SqlFunc.AggregateCount(x.Id),
- UnpickedQuantity = SqlFunc.AggregateSum(x.RemainQuantity)
- })
- .ToListAsync();
+ UnpickedQuantity = SqlFunc.AggregateSum(x.AssignQuantity) - SqlFunc.AggregateSum(x.PickedQty),
- return summary;
+ }).FirstAsync();
+ if (summary == null)
+ {
+ summary = new SummaryPickingDto { pickedCount = 0 };
+ }
+ summary.pickedCount = picked.pickedCount;
+
+ return summary;
}
/// <summary>
/// 鑾峰彇鎷i�夊巻鍙�
@@ -435,88 +727,6 @@
.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>
- /// 鎾ら攢鎷i��
- /// </summary>
- public async Task<WebResponseContent> CancelPicking(CancelPickingRequest request)
- {
- // 瀹炵幇鎾ら攢鎷i�夌殑閫昏緫锛岄渶瑕侊細
- // 1. 鎭㈠搴撳瓨鍑哄簱鏁伴噺
- // 2. 鎭㈠閿佸畾淇℃伅鐨勫凡鎷i�夋暟閲�
- // 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();
-
- // 鍒犻櫎鎷i�夊巻鍙茶褰�
- 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>
/// 鑾峰彇鎵樼洏鐨勫嚭搴撶姸鎬佷俊鎭�
@@ -587,50 +797,59 @@
{
_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) &&
@@ -643,7 +862,7 @@
await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync();
}
- // 6. 娓呯┖璐т綅
+
var location = await _locationInfoService.Db.Queryable<Dt_LocationInfo>()
.Where(x => x.LocationCode == stockInfo.LocationCode)
.FirstAsync();
@@ -653,6 +872,14 @@
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("鐩存帴鍑哄簱鎴愬姛");
}
--
Gitblit v1.9.3