From 18ca3750ce28d407afb518cadecdd29d79876c8b Mon Sep 17 00:00:00 2001
From: heshaofeng <heshaofeng@hnkhzn.com>
Date: 星期二, 09 十二月 2025 19:40:15 +0800
Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxiangmu
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs | 990 +++++++++++++++++++++++++++++++++------------------------
1 files changed, 572 insertions(+), 418 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 35490c5..0da15ed 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,17 +1,8 @@
-锘縰sing Dm.filter;
-using MailKit.Search;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
+锘縰sing MailKit.Search;
using Microsoft.Extensions.Logging;
using SqlSugar;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Text.Json;
-using System.Threading.Tasks;
+using WIDESEA_BasicService;
using WIDESEA_Common.CommonEnum;
-using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.TaskEnum;
@@ -20,16 +11,21 @@
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
-using WIDESEA_DTO.Allocate;
+using WIDESEA_Core.Utilities;
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.Inbound;
using WIDESEA_DTO.Outbound;
using WIDESEA_IAllocateService;
using WIDESEA_IBasicService;
+using WIDESEA_ICheckService;
using WIDESEA_IInboundService;
using WIDESEA_IOutboundService;
using WIDESEA_IStockService;
+using WIDESEA_ITaskInfoService;
using WIDESEA_Model.Models;
+using WIDESEA_Model.Models.Basic;
+using WIDESEA_Model.Models.Check;
+using WIDESEA_Model.Models.Outbound;
namespace WIDESEA_OutboundService
{
@@ -56,9 +52,11 @@
private readonly IAllocateService _allocateService;
private readonly IRepository<Dt_InboundOrder> _inboundOrderRepository;
private readonly IInboundOrderDetailService _inboundOrderDetailService;
-
-
+ private readonly IRepository<Dt_WarehouseArea> _warehouseAreaRepository;
+ private readonly IReCheckOrderService _reCheckOrderService;
+ private readonly ITask_HtyService _task_HtyService;
private readonly ILogger<OutboundPickingService> _logger;
+ private readonly IRepository<Dt_InterfaceLog> _interfaceLog;
private Dictionary<string, string> stations = new Dictionary<string, string>
{
@@ -77,7 +75,7 @@
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, IDailySequenceService dailySequenceService, IAllocateService allocateService, IRepository<Dt_InboundOrder> inboundOrderRepository,IInboundOrderDetailService inboundOrderDetailService) : base(BaseDal)
+ IRepository<Dt_Task> taskRepository, IESSApiService eSSApiService, ILogger<OutboundPickingService> logger, IInvokeMESService invokeMESService, IDailySequenceService dailySequenceService, IAllocateService allocateService, IRepository<Dt_InboundOrder> inboundOrderRepository, IInboundOrderDetailService inboundOrderDetailService, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IReCheckOrderService reCheckOrderService, ITask_HtyService task_HtyService, IRepository<Dt_InterfaceLog> interfaceLog) : base(BaseDal)
{
_unitOfWorkManage = unitOfWorkManage;
_stockInfoService = stockInfoService;
@@ -96,6 +94,10 @@
_allocateService = allocateService;
_inboundOrderRepository = inboundOrderRepository;
_inboundOrderDetailService = inboundOrderDetailService;
+ _warehouseAreaRepository = warehouseAreaRepository;
+ _reCheckOrderService = reCheckOrderService;
+ _task_HtyService = task_HtyService;
+ _interfaceLog = interfaceLog;
}
@@ -284,15 +286,31 @@
return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑浠诲姟淇℃伅");
//鍒嗘瀽闇�瑕佸洖搴撶殑璐х墿
- //var returnAnalysis = await AnalyzeReturnItems(orderNo, palletCode, stockInfo.Id);
- //if (!returnAnalysis.HasItemsToReturn)
- // return await HandleNoReturnItems(orderNo, palletCode, task);
-
var statusAnalysis = await AnalyzePalletStatus(orderNo, palletCode, stockInfo.Id);
if (!statusAnalysis.HasItemsToReturn)
- return await HandleNoReturnItems(orderNo, palletCode, task, stockInfo.Id);
+ {
+ try
+ {
+ var result = await HandleNoReturnItems(orderNo, palletCode, task, stockInfo.Id);
+ _unitOfWorkManage.CommitTran();
+ if (result.Status)
+ {
+ task.PalletType = PalletTypeEnum.Empty.ObjToInt();
+ await CreateReturnTaskAndHandleESS(orderNo, palletCode, task, TaskTypeEnum.InEmpty, PalletTypeEnum.Empty.ObjToInt());
+ }
+ return result;
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ _logger.LogError($"ReturnRemaining 鍥炲簱绌虹澶辫触 - OrderNo: {orderNo}, PalletCode: {palletCode}, Error: {ex.Message}");
+ return WebResponseContent.Instance.Error($"鍥炲簱绌虹鎿嶄綔澶辫触: {ex.Message}");
+ }
- // 4. 妫�鏌ユ槸鍚︽湁杩涜涓殑浠诲姟
+
+ }
+
+ // 妫�鏌ユ槸鍚︽湁杩涜涓殑浠诲姟
if (statusAnalysis.HasActiveTasks)
{
return WebResponseContent.Instance.Error($"鎵樼洏 {palletCode} 鏈夎繘琛屼腑鐨勪换鍔★紝涓嶈兘鎵ц鍥炲簱鎿嶄綔");
@@ -394,16 +412,16 @@
private async Task<ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>> ValidatePickingRequest(string orderNo, string palletCode, string barcode)
{
- // 1. 鍩虹鍙傛暟楠岃瘉
+ // 鍩虹鍙傛暟楠岃瘉
if (string.IsNullOrEmpty(orderNo) || string.IsNullOrEmpty(palletCode) || string.IsNullOrEmpty(barcode))
return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error("璁㈠崟鍙枫�佹墭鐩樼爜鍜屾潯鐮佷笉鑳戒负绌�");
- // 2. 鏌ユ壘鏈夋晥鐨勯攣瀹氫俊鎭�
+ // 鏌ユ壘鏈夋晥鐨勯攣瀹氫俊鎭�
var lockInfo = await FindValidLockInfo(orderNo, palletCode, barcode);
if (lockInfo == null)
return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"鏈壘鍒版湁鏁堢殑閿佸畾淇℃伅");
- // 3. 妫�鏌ヨ鍗曠姸鎬�
+ // 妫�鏌ヨ鍗曠姸鎬�
var order = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
.Where(x => x.OrderNo == orderNo)
.FirstAsync();
@@ -411,18 +429,18 @@
if (order?.OrderStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)
return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"璁㈠崟{orderNo}宸插畬鎴愶紝涓嶈兘缁х画鍒嗘嫞");
- // 4. 鑾峰彇璁㈠崟鏄庣粏
+ // 鑾峰彇璁㈠崟鏄庣粏
var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
.FirstAsync(x => x.Id == lockInfo.OrderDetailId);
if (orderDetail == null)
return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"鏈壘鍒拌鍗曟槑缁�");
- // 5. 妫�鏌ヨ鍗曟槑缁嗘暟閲�
+ // 妫�鏌ヨ鍗曟槑缁嗘暟閲�
if (orderDetail.OverOutQuantity >= orderDetail.NeedOutQuantity)
return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"璁㈠崟鏄庣粏闇�姹傛暟閲忓凡婊¤冻");
- // 6. 鑾峰彇搴撳瓨鏄庣粏
+ // 鑾峰彇搴撳瓨鏄庣粏
var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
.Where(x => x.Barcode == barcode && x.StockId == lockInfo.StockId &&
x.Status != StockStatusEmun.鍏ュ簱纭.ObjToInt())
@@ -431,14 +449,14 @@
if (stockDetail == null)
return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"鏃犳晥鐨勬潯鐮佹垨鐗╂枡缂栫爜");
- // 7. 妫�鏌ュ簱瀛樼姸鎬佸拰鏁伴噺
+ // 妫�鏌ュ簱瀛樼姸鎬佸拰鏁伴噺
if (stockDetail.StockQuantity <= 0)
return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"鏉$爜{barcode}搴撳瓨涓嶈冻");
if (stockDetail.Status != StockStatusEmun.鍑哄簱閿佸畾.ObjToInt())
return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"鏉$爜{barcode}鐘舵�佷笉姝g‘锛屾棤娉曞垎鎷�");
- // 8. 妫�鏌ユ槸鍚﹂噸澶嶅垎鎷�
+ //妫�鏌ユ槸鍚﹂噸澶嶅垎鎷�
var existingPicking = await Db.Queryable<Dt_PickingRecord>()
.Where(x => x.Barcode == barcode && x.OrderNo == orderNo && x.PalletCode == palletCode && x.OutStockLockId == lockInfo.Id)
.FirstAsync();
@@ -471,10 +489,21 @@
var completedLockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
.Where(it => it.CurrentBarcode == barcode &&
(it.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴� ||
+ it.Status == (int)OutLockStockStatusEnum.宸查噴鏀� ||
+ it.Status == (int)OutLockStockStatusEnum.宸插彇璧� ||
it.PickedQty >= it.AssignQuantity)).FirstAsync();
if (completedLockInfo != null)
- throw new Exception($"鏉$爜{barcode}宸茬粡瀹屾垚鍒嗘嫞锛屼笉鑳介噸澶嶅垎鎷�");
+ {
+ string statusMsg = completedLockInfo.Status switch
+ {
+ (int)OutLockStockStatusEnum.鎷i�夊畬鎴� => "宸茬粡瀹屾垚鍒嗘嫞",
+ (int)OutLockStockStatusEnum.宸查噴鏀� => "宸茬粡閲婃斁",
+ (int)OutLockStockStatusEnum.宸插彇璧� => "宸茬粡鍙栬蛋",
+ _ => "宸茬粡瀹屾垚鍒嗘嫞"
+ };
+ throw new Exception($"鏉$爜{barcode}{statusMsg}锛屼笉鑳介噸澶嶅垎鎷�");
+ }
else
return null;
}
@@ -636,13 +665,13 @@
private async Task HandleFullPicking(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail,
decimal actualQty, PickingResult result)
{
- // 1. 鏇存柊搴撳瓨
+ // 鏇存柊搴撳瓨
stockDetail.StockQuantity = 0;
stockDetail.OutboundQuantity = 0;
stockDetail.Status = StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt();
await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
- // 2. 鏇存柊閿佸畾淇℃伅
+ // 鏇存柊閿佸畾淇℃伅
lockInfo.PickedQty += actualQty;
lockInfo.Status = (int)OutLockStockStatusEnum.鎷i�夊畬鎴�;
lockInfo.Operator = App.User.UserName;
@@ -655,19 +684,19 @@
decimal stockOutQty = stockQuantity;
decimal remainingAssignQty = actualQty - stockQuantity;
- // 1. 鏇存柊搴撳瓨
+ // 鏇存柊搴撳瓨
stockDetail.StockQuantity = 0;
stockDetail.OutboundQuantity = 0;
stockDetail.Status = StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt();
await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
- // 2. 鏇存柊閿佸畾淇℃伅
+ // 鏇存柊閿佸畾淇℃伅
lockInfo.PickedQty += stockOutQty;
lockInfo.AssignQuantity = remainingAssignQty;
lockInfo.Operator = App.User.UserName;
await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
- // 3. 鏇存柊鎷嗗寘璁板綍鐘舵��
+ // 鏇存柊鎷嗗寘璁板綍鐘舵��
await UpdateSplitRecordsStatus(stockDetail.Barcode);
result.ActualPickedQty = stockOutQty;
@@ -747,13 +776,13 @@
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 ,
-
+ BarcodeUnit = result.FinalLockInfo.BarcodeUnit,
+ BarcodeQty = result.FinalLockInfo.BarcodeQty,
+ BatchNo = result.FinalLockInfo.BatchNo,
+ lineNo = result.FinalLockInfo.lineNo,
+ SupplyCode = result.FinalLockInfo.SupplyCode,
+ WarehouseCode = result.FinalLockInfo.WarehouseCode,
+
};
@@ -810,13 +839,13 @@
private async Task<bool> CanCancelPicking(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail)
{
+ if (lockInfo.Status == (int)OutLockStockStatusEnum.宸查噴鏀� || lockInfo.Status == (int)OutLockStockStatusEnum.宸插彇璧�)
+ return false;
// 閿佸畾淇℃伅鐘舵�佹鏌�
if (lockInfo.Status != (int)OutLockStockStatusEnum.鎷i�夊畬鎴�)
return false;
- ////// 搴撳瓨鐘舵�佹鏌�
- ////if (stockDetail.Status == StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt())
- //// return false;
+
// 濡傛灉鏄媶鍖呰褰曪紝杩橀渶瑕佹鏌ョ埗閿佸畾淇℃伅鐘舵��
if (lockInfo.IsSplitted == 1 && lockInfo.ParentLockId.HasValue)
@@ -824,7 +853,9 @@
var parentLock = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
.FirstAsync(x => x.Id == lockInfo.ParentLockId.Value);
- if (parentLock == null || parentLock.Status == (int)OutLockStockStatusEnum.鍥炲簱涓�)
+ if (parentLock == null || parentLock.Status == (int)OutLockStockStatusEnum.鍥炲簱涓� ||
+ parentLock.Status == (int)OutLockStockStatusEnum.宸查噴鏀� ||
+ parentLock.Status == (int)OutLockStockStatusEnum.宸插彇璧�)
return false;
}
@@ -904,22 +935,7 @@
return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Success((pickingRecord, lockInfo, orderDetail));
}
- /// <summary>
- /// 妫�鏌ユ潯鐮佹槸鍚﹀凡缁忓洖搴�
- /// </summary>
- private async Task<bool> IsBarcodeReturned(string barcode, int stockId)
- {
- var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(it => it.Barcode == barcode && it.StockId == stockId)
- .FirstAsync();
- if (stockDetail == null)
- return false;
-
- // 濡傛灉鐘舵�佹槸鍏ュ簱纭鎴栧叆搴撳畬鎴愶紝璇存槑宸茬粡鍥炲簱
- return stockDetail.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
- stockDetail.Status == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
- }
/// <summary>
/// 妫�鏌ラ攣瀹氫俊鎭搴旂殑鏉$爜鏄惁宸茬粡鍥炲簱
@@ -1104,7 +1120,7 @@
{
// 鑾峰彇鏈�鏂扮殑璁㈠崟鏄庣粏鏁版嵁锛堝甫閿侊級
var currentOrderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
- .With(SqlWith.RowLock)
+ //.With(SqlWith.RowLock)
.FirstAsync(x => x.Id == orderDetailId);
decimal newOverOutQuantity = currentOrderDetail.OverOutQuantity - cancelQty;
@@ -1158,11 +1174,6 @@
#region 鍥炲簱鎿嶄綔绉佹湁鏂规硶
- private async Task<Dt_StockInfo> GetStockInfo(string palletCode)
- {
- return await _stockInfoService.Db.Queryable<Dt_StockInfo>()
- .FirstAsync(x => x.PalletCode == palletCode);
- }
/// <summary>
/// 妫�鏌ユ暣涓墭鐩樻槸鍚﹀凡缁忓洖搴�
/// </summary>
@@ -1241,23 +1252,6 @@
private async Task<WebResponseContent> HandleNoReturnItems(string orderNo, string palletCode, Dt_Task originalTask, int stockInfoId)
{
- // 妫�鏌ユ槸鍚︽墍鏈夎揣鐗╅兘宸叉嫞閫夊畬鎴�
- //var allPicked = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- // .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode)
- // .AnyAsync(it => it.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴�);
-
- //if (allPicked)
- //{
- // // 鍒犻櫎鍘熷鍑哄簱浠诲姟 缁勭┖鐩� 绌虹洏鍥炲簱
- // //await _taskRepository.Db.Deleteable(originalTask).ExecuteCommandAsync();
- // return WebResponseContent.Instance.OK("鎵�鏈夎揣鐗╁凡鎷i�夊畬鎴愶紝鎵樼洏涓虹┖");
- //}
- //else
- //{
- // // 鍒犻櫎鍘熷鍑哄簱浠诲姟
- // //await _taskRepository.Db.Deleteable(originalTask).ExecuteCommandAsync();
- // return WebResponseContent.Instance.Error("娌℃湁闇�瑕佸洖搴撶殑鍓╀綑璐х墿");
- //}
try
{
var locationtype = 0;
@@ -1286,8 +1280,6 @@
_stockInfoService.AddMaterielGroup(emptystockInfo);
//绌烘墭鐩樺浣曞鐞� 杩樻湁涓�涓嚭搴撲换鍔¤澶勭悊銆�
originalTask.PalletType = PalletTypeEnum.Empty.ObjToInt();
-
- await CreateReturnTaskAndHandleESS(orderNo, palletCode, originalTask, TaskTypeEnum.InEmpty, PalletTypeEnum.Empty.ObjToInt());
}
catch (Exception ex)
@@ -1355,16 +1347,16 @@
{
_logger.LogInformation($"寮�濮嬮噴鏀鹃攣瀹氫互渚块噸鏂板垎閰� - 璁㈠崟: {orderNo}, 鎵樼洏: {palletCode}");
- // 1. 澶勭悊鏈垎鎷g殑鍑哄簱閿佸畾璁板綍 - 瀹屽叏閲婃斁
+ // 澶勭悊鏈垎鎷g殑鍑哄簱閿佸畾璁板綍 - 瀹屽叏閲婃斁
if (analysis.HasRemainingLocks)
{
await ReleaseRemainingLocks(analysis.RemainingLocks);
}
- // 2. 澶勭悊宸插洖搴撶殑閿佸畾璁板綍 - 鍒犻櫎鎴栨爣璁颁负鏃犳晥
+ // 澶勭悊宸插洖搴撶殑閿佸畾璁板綍 - 鍒犻櫎鎴栨爣璁颁负鏃犳晥
await CleanupReturnedLocks(orderNo, palletCode);
- // 3. 閲嶇疆璁㈠崟鏄庣粏鐨勯攣瀹氭暟閲�
+ // 閲嶇疆璁㈠崟鏄庣粏鐨勯攣瀹氭暟閲�
await ResetOrderDetailLockQuantities(analysis);
_logger.LogInformation($"閿佸畾閲婃斁瀹屾垚 - 璁㈠崟: {orderNo}, 鎵樼洏: {palletCode}");
@@ -1382,8 +1374,8 @@
await _outStockLockInfoService.Db.Updateable<Dt_OutStockLockInfo>()
.SetColumns(it => new Dt_OutStockLockInfo
{
- Status = (int)OutLockStockStatusEnum.宸查噴鏀�, // 闇�瑕佹柊澧炶繖涓姸鎬�
- // ReleaseTime = DateTime.Now,
+ Status = (int)OutLockStockStatusEnum.宸查噴鏀�,
+
Operator = App.User.UserName
})
.Where(it => lockIds.Contains(it.Id))
@@ -1547,37 +1539,6 @@
}
- private async Task UpdateOrderDetailsOnReturn(List<Dt_OutStockLockInfo> remainingLocks)
- {
- // 鎸夎鍗曟槑缁嗗垎缁�
- var orderDetailGroups = remainingLocks.GroupBy(x => x.OrderDetailId);
-
- foreach (var group in orderDetailGroups)
- {
- var orderDetailId = group.Key;
- var totalReturnQty = group.Sum(x => x.AssignQuantity - x.PickedQty);
-
- // 鑾峰彇褰撳墠璁㈠崟鏄庣粏
- var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
- .FirstAsync(x => x.Id == orderDetailId);
-
- if (orderDetail != null)
- {
- // 璋冩暣宸叉嫞閫夋暟閲忓拰宸插嚭搴撴暟閲�
- decimal newPickedQty = Math.Max(0, orderDetail.PickedQty - totalReturnQty);
- decimal newOverOutQuantity = Math.Max(0, orderDetail.OverOutQuantity - totalReturnQty);
-
- await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
- .SetColumns(it => new Dt_OutboundOrderDetail
- {
- PickedQty = newPickedQty,
- OverOutQuantity = newOverOutQuantity,
- })
- .Where(it => it.Id == orderDetailId)
- .ExecuteCommandAsync();
- }
- }
- }
private async Task HandlePalletStockGoodsReturn(List<Dt_StockInfoDetail> palletStockGoods)
{
@@ -1664,15 +1625,31 @@
WarehouseId = originalTask.WarehouseId
};
- // 淇濆瓨鍥炲簱浠诲姟
- await _taskRepository.Db.Insertable(returnTask).ExecuteCommandAsync();
+ try
+ {
+ // 淇濆瓨鍥炲簱浠诲姟
+ var insertcount = await _taskRepository.Db.Insertable(returnTask).ExecuteCommandAsync();
+ if (insertcount <= 0)
+ {
+ throw new Exception("鍒涘缓浠诲姟澶辫触锛�");
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.LogInformation($"CreateReturnTaskAndHandleESS 鍒涘缓浠诲姟澶辫触: {orderNo} 锛� {palletCode}");
+ throw new Exception("鍒涘缓浠诲姟澶辫触锛�");
+ }
var targetAddress = originalTask.TargetAddress;
+ _logger.LogInformation($"CreateReturnTaskAndHandleESS 鍒犻櫎鍘嗗彶浠诲姟: {orderNo} 锛� {originalTask.TaskNum}");
// 鍒犻櫎鍘熷鍑哄簱浠诲姟
- _taskRepository.DeleteAndMoveIntoHty(originalTask, OperateTypeEnum.鑷姩瀹屾垚);
- // await _taskRepository.Db.Deleteable(originalTask).ExecuteCommandAsync();
-
-
+ // _taskRepository.DeleteAndMoveIntoHty(originalTask, OperateTypeEnum.鑷姩瀹屾垚);
+ var result = _task_HtyService.DeleteAndMoveIntoHty(originalTask, OperateTypeEnum.浜哄伐鍒犻櫎);
+ if (!result)
+ {
+ await _taskRepository.Db.Deleteable(originalTask).ExecuteCommandAsync();
+ }
+ _logger.LogInformation($"CreateReturnTaskAndHandleESS 鍒犻櫎鍘嗗彶浠诲姟: {orderNo} 锛� {originalTask.TaskNum},褰卞搷琛� {result}");
// 缁� ESS 鍙戦�佹祦鍔ㄤ俊鍙峰拰鍒涘缓浠诲姟
await SendESSCommands(palletCode, targetAddress, returnTask);
@@ -1689,7 +1666,7 @@
{
try
{
- // 1. 鍙戦�佹祦鍔ㄤ俊鍙�
+ // 鍙戦�佹祦鍔ㄤ俊鍙�
var moveResult = await _eSSApiService.MoveContainerAsync(new WIDESEA_DTO.Basic.MoveContainerRequest
{
slotCode = movestations[targetAddress],
@@ -1698,7 +1675,7 @@
//if (moveResult)
//{
- // 2. 鍒涘缓鍥炲簱浠诲姟
+ // 鍒涘缓鍥炲簱浠诲姟
var essTask = new TaskModel()
{
taskType = "putaway",
@@ -1777,7 +1754,7 @@
{
newStatus = (int)OutOrderStatusEnum.鍑哄簱瀹屾垚;
}
- else if (hasPartial )
+ else if (hasPartial)
{
newStatus = (int)OutOrderStatusEnum.鍑哄簱涓�;
}
@@ -1799,11 +1776,7 @@
_logger.LogInformation($"璁㈠崟鐘舵�佹洿鏂� - OrderNo: {orderNo}, 鏃х姸鎬�: {outboundOrder.OrderStatus}, 鏂扮姸鎬�: {newStatus}");
- // 鍙湁姝e父鍒嗘嫞瀹屾垚鏃舵墠鍚慚ES鍙嶉
- if (allCompleted && newStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)
- {
- await HandleOrderCompletion(outboundOrder, orderNo);
- }
+
}
}
catch (Exception ex)
@@ -1852,7 +1825,7 @@
.SetColumns(it => new Dt_OutboundOrderDetail
{
OrderDetailStatus = newStatus,
-
+
})
.Where(it => it.Id == orderDetailId)
.ExecuteCommandAsync();
@@ -1923,147 +1896,6 @@
}
}
- private async Task HandleOrderCompletion(Dt_OutboundOrder outboundOrder, string orderNo)
- {
- // 璋冩嫧鍑哄簱鍜岄噸妫�鍑哄簱涓嶉渶瑕佸弽棣圡ES
- if (outboundOrder.OrderType == OutOrderTypeEnum.Allocate.ObjToInt())
- {
- var allocate = _allocateService.Repository.QueryData(x => x.UpperOrderNo == outboundOrder.UpperOrderNo).First();
- var allocatefeedmodel = new AllocateDto
- {
- ReqCode = Guid.NewGuid().ToString(),
- ReqTime = DateTime.Now.ToString(),
- BusinessType = "3",
-
- FactoryArea = outboundOrder.FactoryArea,
- OperationType = 1,
- Operator = App.User.UserName,
- OrderNo = outboundOrder.UpperOrderNo,
- // documentsNO = outboundOrder.OrderNo,
- // status = outboundOrder.OrderStatus,
- fromWarehouse = allocate?.FromWarehouse ?? "",
- toWarehouse = allocate?.ToWarehouse ?? "",
- Details = new List<AllocateDtoDetail>()
-
- };
- // 鍙幏鍙栧凡鎷i�夊畬鎴愮殑閿佸畾璁板綍
- var lists = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(x => x.OrderNo == orderNo && x.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴�)
- .ToListAsync();
-
- var groupedData = lists.GroupBy(item => new { item.MaterielCode, item.lineNo, item.Unit, item.WarehouseCode })
- .Select(group => new AllocateDtoDetail
- {
- MaterialCode = group.Key.MaterielCode,
- LineNo = group.Key.lineNo,
- WarehouseCode = group.Key.WarehouseCode,
- Qty = group.Sum(x => x.PickedQty),
-
- Unit = group.Key.Unit,
- Barcodes = group.Select(row => new BarcodeInfo
- {
- Barcode = row.CurrentBarcode,
- SupplyCode = row.SupplyCode,
- BatchNo = row.BatchNo,
- Unit = row.Unit,
- Qty = row.PickedQty
- }).ToList()
-
-
- }).ToList();
- allocatefeedmodel.Details = groupedData;
-
- var result = await _invokeMESService.FeedbackAllocate(allocatefeedmodel);
- if (result != null && result.code == 200)
- {
- await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
- .SetColumns(x => x.ReturnToMESStatus == 1)
- .Where(x => x.OrderId == outboundOrder.Id).ExecuteCommandAsync();
-
- await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
- .SetColumns(x => new Dt_OutboundOrder
- {
- ReturnToMESStatus = 1,
- Operator = App.User.UserName,
- }).Where(x => x.OrderNo == orderNo).ExecuteCommandAsync();
- }
- }
- else if (outboundOrder.OrderType == OutOrderTypeEnum.ReCheck.ObjToInt())
- {
-
- }
- else
- {
- try
- {
- var feedmodel = new FeedbackOutboundRequestModel
- {
- reqCode = Guid.NewGuid().ToString(),
- reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
- business_type = outboundOrder.BusinessType,
- factoryArea = outboundOrder.FactoryArea,
- operationType = 1,
- Operator = App.User.UserName,
- orderNo = outboundOrder.UpperOrderNo,
- documentsNO = outboundOrder.OrderNo,
- status = outboundOrder.OrderStatus,
- details = new List<FeedbackOutboundDetailsModel>()
- };
-
- // 鍙幏鍙栧凡鎷i�夊畬鎴愮殑閿佸畾璁板綍
- var lists = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(x => x.OrderNo == orderNo && x.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴�)
- .ToListAsync();
-
- 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,
- qty = group.Sum(x => x.PickedQty),
- currentDeliveryQty = group.Sum(x => x.PickedQty),
- 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.PickedQty
- }).ToList()
- }).ToList();
-
- feedmodel.details = groupedData;
-
- var result = await _invokeMESService.FeedbackOutbound(feedmodel);
- if (result != null && result.code == 200)
- {
- await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
- .SetColumns(x => x.ReturnToMESStatus == 1)
- .Where(x => x.OrderId == outboundOrder.Id)
- .ExecuteCommandAsync();
-
- await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
- .SetColumns(x => new Dt_OutboundOrder
- {
- ReturnToMESStatus = 1,
- Operator = App.User.UserName,
- })
-
- .Where(x => x.OrderNo == orderNo)
- .ExecuteCommandAsync();
- }
-
- _logger.LogError($"FeedbackOutbound鎴愬姛 - OrderNo: {orderNo}, {JsonSerializer.Serialize(result)}");
- }
- catch (Exception ex)
- {
- _logger.LogError($"FeedbackOutbound澶辫触 - OrderNo: {orderNo}, Error: {ex.Message}");
- }
- }
- }
-
#endregion
#region 绌烘墭鐩�
@@ -2077,12 +1909,10 @@
{
// 1. 鍒犻櫎搴撳瓨鏁伴噺涓�0鐨勬槑缁嗚褰�
var deleteDetailCount = await _stockInfoDetailService.Db.Deleteable<Dt_StockInfoDetail>()
- .Where(x => x.StockId == stockId && x.StockQuantity == 0 && (x.Status == StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt() || x.Status ==
- StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt()))
+ .Where(x => x.StockId == stockId && x.StockQuantity == 0)
.ExecuteCommandAsync();
- await _stockInfoService.Db.Deleteable<Dt_StockInfo>()
- .Where(x => x.Id == stockId).ExecuteCommandAsync();
+ _stockInfoService.DeleteData(stockId);
_logger.LogInformation($"娓呯悊闆跺簱瀛樻槑缁嗚褰� - StockId: {stockId}, 鍒犻櫎璁板綍鏁�: {deleteDetailCount}");
@@ -2102,7 +1932,7 @@
{
try
{
- // 1. 鏌ユ壘鎵�鏈変笌璇ヨ鍗曞拰鎵樼洏鐩稿叧鐨勪换鍔�
+ // 鏌ユ壘鎵�鏈変笌璇ヨ鍗曞拰鎵樼洏鐩稿叧鐨勪换鍔�
var tasks = await _taskRepository.Db.Queryable<Dt_Task>().Where(x => x.OrderNo == orderNo && x.PalletCode == palletCode).ToListAsync();
if (tasks.Any())
@@ -2155,7 +1985,7 @@
_logger.LogInformation($"璁㈠崟 {orderNo} 杩樻湁鍏朵粬鎵樼洏鍦ㄥ鐞嗭紝涓嶆洿鏂拌鍗曠姸鎬�");
}
- // 3. 鏇存柊鎷i�夎褰曠姸鎬侊紙鍙�夛級
+ // 鏇存柊鎷i�夎褰曠姸鎬侊紙鍙�夛級
await UpdatePickingRecordsStatus(orderNo, palletCode);
}
@@ -2198,8 +2028,6 @@
_logger.LogInformation($"璁㈠崟 {orderNo} 宸叉爣璁颁负鍑哄簱瀹屾垚");
- // 鍚慚ES鍙嶉璁㈠崟瀹屾垚锛堝鏋滈渶瑕侊級
- await HandleOrderCompletion(outboundOrder, orderNo);
}
}
@@ -2217,7 +2045,6 @@
// 杩欓噷鍙互鏍规嵁闇�瑕佹洿鏂版嫞閫夎褰曠殑鐘舵�佸瓧娈�
// 渚嬪锛歱ickingRecord.Status = (int)PickingStatusEnum.宸插畬鎴�;
-
_logger.LogInformation($"鎵惧埌{pickingRecords.Count}鏉℃嫞閫夎褰� - 璁㈠崟: {orderNo}, 鎵樼洏: {palletCode}");
}
@@ -2318,88 +2145,6 @@
return result;
}
- /// <summary>
- /// 妫�鏌ユ墭鐩樻槸鍚︿负绌�
- /// </summary>
- private async Task<bool> IsPalletEmpty(string orderNo, string palletCode)
- {
- try
- {
- // 鑾峰彇搴撳瓨淇℃伅
- var stockInfo = await _stockInfoService.Db.Queryable<Dt_StockInfo>()
- .Where(x => x.PalletCode == palletCode)
- .FirstAsync();
-
- if (stockInfo == null)
- return false;
-
- // 浣跨敤缁熶竴鐨勭姸鎬佸垎鏋�
- var statusAnalysis = await AnalyzePalletStatus(orderNo, palletCode, stockInfo.Id);
- return statusAnalysis.IsEmptyPallet;
- }
- catch (Exception ex)
- {
- _logger.LogWarning($"妫�鏌ユ墭鐩樻槸鍚︿负绌哄け璐� - OrderNo: {orderNo}, PalletCode: {palletCode}, Error: {ex.Message}");
- return false;
- }
- }
- /// <summary>
- /// 妫�鏌ュ苟澶勭悊绌烘墭鐩�
- /// </summary>
- private async Task<bool> CheckAndHandleEmptyPallet(string orderNo, string palletCode)
- {
- try
- {
- // 1. 鑾峰彇搴撳瓨淇℃伅
- var stockInfo = await _stockInfoService.Db.Queryable<Dt_StockInfo>()
- .Where(x => x.PalletCode == palletCode)
- .FirstAsync();
-
- if (stockInfo == null)
- {
- _logger.LogWarning($"鏈壘鍒版墭鐩� {palletCode} 鐨勫簱瀛樹俊鎭�");
- return false;
- }
-
- // 2. 浣跨敤缁熶竴鐨勭姸鎬佸垎鏋�
- var statusAnalysis = await AnalyzePalletStatus(orderNo, palletCode, stockInfo.Id);
-
- // 3. 妫�鏌ユ槸鍚︿负绌烘墭鐩樹笖娌℃湁杩涜涓殑浠诲姟
- if (!statusAnalysis.IsEmptyPallet || statusAnalysis.HasActiveTasks)
- {
- return false;
- }
-
- _logger.LogInformation($"妫�娴嬪埌绌烘墭鐩橈紝寮�濮嬭嚜鍔ㄥ鐞� - 璁㈠崟: {orderNo}, 鎵樼洏: {palletCode}");
-
- //// 娓呯悊闆跺簱瀛樻暟鎹�
- //await CleanupZeroStockData(stockInfo.Id);
-
- //// 鏇存柊搴撳瓨涓昏〃鐘舵�佷负绌烘墭鐩�
- //await UpdateStockInfoAsEmpty(stockInfo);
-
- //// 澶勭悊鍑哄簱閿佸畾璁板綍
- //await HandleOutStockLockRecords(orderNo, palletCode);
-
- //// 澶勭悊浠诲姟鐘舵��
- //await HandleTaskStatusForEmptyPallet(orderNo, palletCode);
-
- //// 鏇存柊璁㈠崟鏁版嵁
- //await UpdateOrderDataForEmptyPallet(orderNo, palletCode);
-
- ////璁板綍鎿嶄綔鍘嗗彶
- //await RecordAutoEmptyPalletOperation(orderNo, palletCode);
-
- _logger.LogInformation($"绌烘墭鐩樿嚜鍔ㄥ鐞嗗畬鎴� - 璁㈠崟: {orderNo}, 鎵樼洏: {palletCode}");
-
- return true;
- }
- catch (Exception ex)
- {
- _logger.LogError($"鑷姩澶勭悊绌烘墭鐩樺け璐� - OrderNo: {orderNo}, PalletCode: {palletCode}, Error: {ex.Message}");
- return false;
- }
- }
private async Task<string> GenerateNewBarcode()
{
@@ -2436,8 +2181,8 @@
FactoryArea = originalLock.FactoryArea,
lineNo = originalLock.lineNo,
WarehouseCode = originalLock.WarehouseCode,
- BarcodeQty=originalLock.BarcodeQty,
- BarcodeUnit=originalLock.BarcodeUnit,
+ BarcodeQty = originalLock.BarcodeQty,
+ BarcodeUnit = originalLock.BarcodeUnit,
};
@@ -2512,11 +2257,6 @@
}
}
- private async Task<int> GenerateTaskNumber()
- {
- return await _dailySequenceService.GetNextSequenceAsync();
- }
-
private WebResponseContent CreatePickingResponse(PickingResult result, string adjustedReason)
{
//if (result.SplitResults.Any())
@@ -2550,7 +2290,7 @@
{
List<Dt_InboundOrder> InOders = _inboundOrderRepository.QueryData().Where(x => x.OrderStatus != InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt()).ToList();
List<string> InOderCodes = InOders.Select(x => x.UpperOrderNo).ToList();
- return WebResponseContent.Instance.OK("鎴愬姛",data: InOderCodes);
+ return WebResponseContent.Instance.OK("鎴愬姛", data: InOderCodes);
}
public WebResponseContent GetAvailablePickingOrders()
@@ -2566,7 +2306,7 @@
try
{
Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == noStockOut.inOder && x.OrderStatus != InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt()).Includes(x => x.Details).First();
- if(inboundOrder == null)
+ if (inboundOrder == null)
{
return WebResponseContent.Instance.Error($"鏈壘鍒伴噰璐崟锛歿noStockOut.inOder}");
}
@@ -2593,7 +2333,7 @@
//鍓╀綑鍏ュ簱鏁伴噺鍗宠櫄鎷熷嚭鍏ュ簱鍓╀綑鍙嚭鏁伴噺
decimal outQuantity = matchedDetail.OrderQuantity - matchedDetail.ReceiptQuantity;
- if(outQuantity == 0)
+ if (outQuantity == 0)
{
return WebResponseContent.Instance.Error($"璇ラ噰璐崟涓殑鏉$爜瀵瑰簲鐨勫彲鍑烘暟閲忎负0");
}
@@ -2607,7 +2347,7 @@
if ((matchedCode.LockQuantity + matchedCode.NoStockOutQty) > matchedCode.OrderQuantity)
{
- return WebResponseContent.Instance.Error($"鍑哄簱鍗曟槑缁嗘暟閲忔孩鍑簕matchedCode.LockQuantity - matchedCode.OrderQuantity}");
+ return WebResponseContent.Instance.Error($"鍑哄簱鍗曟槑缁嗘暟閲忔孩鍑簕matchedCode.LockQuantity - matchedCode.OrderQuantity}");
}
matchedDetail.OrderDetailStatus = OrderDetailStatusEnum.Inbounding.ObjToInt();
matchedCode.OrderDetailStatus = OrderDetailStatusEnum.AssignOver.ObjToInt();
@@ -2618,7 +2358,7 @@
_unitOfWorkManage.CommitTran();
return WebResponseContent.Instance.OK();
}
- catch(Exception ex)
+ catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error(ex.Message);
@@ -2643,7 +2383,7 @@
}
matchedDetail.NoStockOutQty = 0;
- if(matchedDetail.ReceiptQuantity==0 && matchedDetail.OverInQuantity==0)
+ if (matchedDetail.ReceiptQuantity == 0 && matchedDetail.OverInQuantity == 0)
{
matchedDetail.OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt();
}
@@ -2671,23 +2411,23 @@
return WebResponseContent.Instance.OK();
}
- catch(Exception ex)
+ catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error(ex.Message);
}
}
- public WebResponseContent NoStockOutSubmit(NoStockOutSubmit noStockOutSubmit)
+ public async Task<WebResponseContent> NoStockOutSubmit(NoStockOutSubmit noStockOutSubmit)
{
try
{
- Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == noStockOutSubmit.InOderSubmit && x.OrderStatus != InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt()).Includes(x => x.Details).First();
+ Dt_InboundOrder inboundOrder = _inboundOrderRepository.Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == noStockOutSubmit.InOderSubmit && x.OrderStatus != InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt()).Includes(x => x.Details).First();
if (inboundOrder == null)
{
return WebResponseContent.Instance.Error($"鏈壘鍒伴噰璐崟锛歿noStockOutSubmit.InOderSubmit}");
}
- Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == noStockOutSubmit.OutOderSubmit && x.OrderStatus != OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()).Includes(x => x.Details).First();
+ Dt_OutboundOrder outboundOrder = _inboundOrderRepository.Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == noStockOutSubmit.OutOderSubmit && x.OrderStatus != OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()).Includes(x => x.Details).First();
if (outboundOrder == null)
{
return WebResponseContent.Instance.Error($"鏈壘鍒板嚭搴撳崟锛歿noStockOutSubmit.OutOderSubmit}");
@@ -2696,9 +2436,9 @@
List<Dt_OutboundOrderDetail> outboundOrderDetails = new List<Dt_OutboundOrderDetail>();
foreach (var BarCode in noStockOutSubmit.BarCodeSubmit)
{
- var inboundOrderDetail = inboundOrder.Details.FirstOrDefault(detail => detail.Barcode == BarCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
+ var inboundOrderDetail = inboundOrder.Details.FirstOrDefault(detail => detail.Barcode == BarCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
- if(inboundOrderDetail == null)
+ if (inboundOrderDetail == null)
{
return WebResponseContent.Instance.Error($"鍦ㄩ噰璐崟 {noStockOutSubmit.InOderSubmit} 涓湭鎵惧埌鏉$爜涓� {BarCode} 鐨勬槑缁嗐��");
}
@@ -2715,12 +2455,40 @@
outboundOrderDetail.LockQuantity += outboundOrderDetail.NoStockOutQty;
outboundOrderDetail.OverOutQuantity = outboundOrderDetail.LockQuantity;
- if(outboundOrderDetail.OrderQuantity == outboundOrderDetail.OverOutQuantity)
+ if (outboundOrderDetail.OrderQuantity == outboundOrderDetail.OverOutQuantity)
{
outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
}
outboundOrderDetails.Add(outboundOrderDetail);
+ var newLockInfo = new Dt_OutStockLockInfo
+ {
+ OrderNo = outboundOrder.UpperOrderNo,
+ OrderDetailId = outboundOrderDetail.Id,
+ OutboundBatchNo = outboundOrderDetail.BatchNo,
+ MaterielCode = outboundOrderDetail.MaterielCode,
+ MaterielName = outboundOrderDetail.MaterielName,
+ StockId = 0,
+ OrderQuantity = outboundOrderDetail.OrderQuantity,
+ AssignQuantity = outboundOrderDetail.OverOutQuantity,
+ PickedQty = outboundOrderDetail.NoStockOutQty,
+ LocationCode = "绌�",
+ PalletCode = "绌�",
+ TaskNum = 0,
+ Status = (int)OutLockStockStatusEnum.鎷i�夊畬鎴�,
+ Unit = outboundOrderDetail.Unit,
+ SupplyCode = outboundOrderDetail.SupplyCode ?? "鏃�",
+ OrderType = outboundOrder.OrderType,
+ CurrentBarcode = inboundOrderDetail.Barcode,
+ IsSplitted = 1,
+ Operator = App.User.UserName,
+ lineNo = outboundOrderDetail.lineNo,
+ WarehouseCode = outboundOrderDetail.WarehouseCode ?? "鏃�",
+ BarcodeQty = outboundOrderDetail.NoStockOutQty,
+ BarcodeUnit = outboundOrderDetail.BarcodeUnit,
+ BatchNo = outboundOrderDetail.BatchNo
+ };
+ _outStockLockInfoService.AddData(newLockInfo);
}
//鍒ゆ柇鍏ュ簱鍗曟嵁鏄庣粏鏄惁鍏ㄩ儴鏄畬鎴愮姸鎬�
int e = inboundOrder.Details.Count();
@@ -2752,21 +2520,422 @@
_outboundOrderService.UpdateData(outboundOrder);
_unitOfWorkManage.CommitTran();
+ //鍏ュ簱鍥炰紶MES
+ var infeedmodel = new FeedbackInboundRequestModel
+ {
+ reqCode = Guid.NewGuid().ToString(),
+ reqTime = DateTime.Now.ToString(),
+ business_type = inboundOrder.BusinessType,
+ factoryArea = inboundOrder.FactoryArea,
+ operationType = 1,
+ Operator = App.User.UserName,
+ orderNo = inboundOrder.UpperOrderNo,
+ status = inboundOrder.OrderStatus,
+ details = new List<FeedbackInboundDetailsModel>()
+
+ };
+
+ var groupedData = inboundOrderDetails.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
+ .Select(group => new FeedbackInboundDetailsModel
+ {
+ materialCode = group.Key.MaterielCode,
+ supplyCode = group.Key.SupplyCode,
+ batchNo = group.Key.BatchNo,
+ lineNo = group.Key.lineNo,
+ warehouseCode = group.Key.WarehouseCode,
+ qty = group.Sum(x => x.BarcodeQty),
+ // warehouseCode= "1072",
+ unit = group.Key.BarcodeUnit,
+ barcodes = group.Select(row => new FeedbackBarcodesModel
+ {
+ barcode = row.Barcode,
+ qty = row.BarcodeQty
+ }).ToList()
+ }).ToList();
+ infeedmodel.details = groupedData;
+
+ var result1 = await _invokeMESService.FeedbackInbound(infeedmodel);
+ if (result1 != null && result1.code == 200)
+ {
+ var orderIds = inboundOrderDetails.Select(x => x.Id).Distinct().ToList();
+ if (inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt())
+ {
+ _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1, Remark = "" })
+ .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+ }
+ _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 })
+ .Where(it => orderIds.Contains(it.Id)).ExecuteCommand();
+ }
+ else
+ {
+ _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 2, Remark = result1.message })
+ .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+ _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 2 })
+ .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
+ }
+ //鍑哄簱鍥炰紶MES
+
+ var documentNo = UniqueValueGenerator.Generate();
+
+ var outfeedmodel = new FeedbackOutboundRequestModel
+ {
+ reqCode = Guid.NewGuid().ToString(),
+ reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
+ business_type = outboundOrder.BusinessType,
+ factoryArea = outboundOrder.FactoryArea,
+ operationType = 1,
+ Operator = App.User.UserName,
+ orderNo = outboundOrder.UpperOrderNo,
+ documentsNO = documentNo,
+ status = outboundOrder.OrderStatus,
+ details = new List<FeedbackOutboundDetailsModel>()
+ };
+ foreach (var detail in outboundOrderDetails)
+ {
+ // 鑾峰彇璇ユ槑缁嗗搴旂殑鏉$爜淇℃伅锛堜粠閿佸畾璁板綍锛�
+ var detailLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(x => x.OrderNo == outboundOrder.UpperOrderNo &&
+ x.OrderDetailId == detail.Id &&
+ (x.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴� || x.Status == (int)OutLockStockStatusEnum.宸插洖搴�))
+ .ToListAsync();
+
+ var groupdata = detailLocks.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
+ .Select(group => new FeedbackOutboundDetailsModel
+ {
+
+ materialCode = group.Key.MaterielCode,
+ lineNo = group.Key.lineNo,
+ warehouseCode = group.Key.WarehouseCode,
+ qty = group.Sum(x => x.PickedQty),
+ currentDeliveryQty = group.Sum(x => x.PickedQty),
+ unit = group.Key.BarcodeUnit,
+ barcodes = group.Select(lockInfo => new WIDESEA_DTO.Outbound.BarcodesModel
+ {
+ barcode = lockInfo.CurrentBarcode,
+ supplyCode = lockInfo.SupplyCode,
+ batchNo = lockInfo.BatchNo,
+ unit = lockInfo.BarcodeUnit,
+ qty = lockInfo.PickedQty
+ }).ToList()
+ }).ToList();
+ outfeedmodel.details.AddRange(groupdata);
+ }
+ //瀛樺偍鍥炰紶鍙傛暟锛屼繚璇佸紓甯告墜鍔ㄥ洖浼�
+ Dt_InterfaceLog interfaceLog = new Dt_InterfaceLog
+ {
+ OrderNo = outboundOrder.UpperOrderNo,
+ DocumentNo = documentNo,
+ OrderType = "铏氭嫙鍑哄叆搴�",
+ Content = outfeedmodel.ToJson(),
+ ReturnToMESStatus = 0,
+ IsDeleted = false
+ };
+ _interfaceLog.AddData(interfaceLog);
+
+ var result = await _invokeMESService.FeedbackOutbound(outfeedmodel);
+ if (result != null && result.code == 200)
+ {
+ var orderIds = outboundOrderDetails.Select(x => x.Id).Distinct().ToList();
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(x => x.ReturnToMESStatus == 1)
+ .Where(x => orderIds.Contains(x.Id))
+ .ExecuteCommandAsync();
+
+
+ await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+ .SetColumns(it => new Dt_OutboundOrder { ReturnToMESStatus = 1, Remark = "" })
+ .Where(x => x.Id == outboundOrder.Id)
+ .ExecuteCommandAsync();
+
+ await _interfaceLog.Db.Updateable<Dt_InterfaceLog>()
+ .SetColumns(x => x.ReturnToMESStatus == 1)
+ .Where(x => x.DocumentNo == documentNo)
+ .ExecuteCommandAsync();
+ }
+ else
+ {
+ var uporderIds = outboundOrderDetails.Select(x => x.Id).Distinct().ToList();
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(x => x.ReturnToMESStatus == 2)
+ .Where(x => uporderIds.Contains(x.Id))
+ .ExecuteCommandAsync();
+
+ await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+ .SetColumns(it => new Dt_OutboundOrder { ReturnToMESStatus = 2, Remark = result.message })
+ .Where(x => x.Id == outboundOrder.Id)
+ .ExecuteCommandAsync();
+
+ await _interfaceLog.Db.Updateable<Dt_InterfaceLog>()
+ .SetColumns(x => x.ReturnToMESStatus == 2)
+ .Where(x => x.DocumentNo == documentNo)
+ .ExecuteCommandAsync();
+ }
return WebResponseContent.Instance.OK();
}
- catch(Exception ex)
+ catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error(ex.Message);
}
}
+
+ public WebResponseContent GetPurchaseOrderByBarcode(string barcode)
+ {
+ try
+ {
+ Dt_InboundOrderDetail inboundOrderDetail = _stockInfoDetailService.Db.Queryable<Dt_InboundOrderDetail>().Where(x => x.Barcode == barcode && x.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()).First();
+ if (inboundOrderDetail == null)
+ {
+ return WebResponseContent.Instance.Error($"鏈壘鍒拌鏉$爜{barcode}鐨勫叆搴撴槑缁嗘垨鑰呮槑缁嗙姸鎬佸凡鍏ユ櫤浠撳畬鎴�");
+ }
+ Dt_InboundOrder inboundOrder = _inboundOrderRepository.QueryFirst(x => x.Id == inboundOrderDetail.OrderId && x.OrderStatus != InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt());
+ if (inboundOrder == null)
+ {
+ return WebResponseContent.Instance.Error($"璇ュ叆搴撳崟{inboundOrder}鐘舵�佸凡鍏ユ櫤浠撳畬鎴�");
+ }
+ var resultData = new { purchaseOrderNo = inboundOrder.UpperOrderNo };
+
+ return WebResponseContent.Instance.OK("鏌ヨ閲囪喘鍗曟垚鍔�", data: resultData);
+ }
+ catch (Exception ex)
+ {
+ return WebResponseContent.Instance.Error(ex.Message);
+ }
+ }
#endregion
+
+ public WebResponseContent UnPalletQuantity(string orderNo)
+ {
+ // 鍒濆鍖栬繑鍥濪TO锛堥粯璁ゅ�奸兘涓�0锛岄伩鍏峮ull锛�
+ var resultDTO = new PalletSumQuantityDTO
+ {
+ StockSumQuantity = 0,
+ StockCount = 0,
+ UniqueUnit = ""
+ };
+ WebResponseContent content = new WebResponseContent();
+ try
+ {
+ if (string.IsNullOrWhiteSpace(orderNo))
+ {
+ return content.Error("浼犲叆鐨勮鍗曞彿orderNo涓虹┖鎴栫┖鐧�");
+ }
+ var orderDetail = Db.Queryable<Dt_PickingRecord>().Where(s => s.OrderNo == orderNo).ToList();
+ if (orderDetail == null)
+ {
+ return content.Error("鏈壘鍒板崟鎹�");
+ }
+ var unitGroups = orderDetail.GroupBy(d => d.BarcodeUnit).ToList();
+ if (unitGroups.Count == 1)
+ {
+ resultDTO.UniqueUnit = unitGroups.First().Key;
+ }
+ else
+ {
+ resultDTO.UniqueUnit = "";
+ }
+ var validDetails = _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>().Where(s => s.OrderNo == orderNo).ToList();
+ resultDTO.StockSumQuantity = orderDetail.Sum(d => d.PickQuantity);
+ resultDTO.StockCount = orderDetail.Count;
+ if (validDetails.Any())
+ {
+ resultDTO.StockSumQuantity -= validDetails.Sum(d => d.StockQuantity);
+ // 鏄庣粏璁板綍鏁帮細绗﹀悎鏉′欢鐨勬湁鏁堣褰曟潯鏁�
+ resultDTO.StockCount -= validDetails.Count;
+ }
+ return content.OK("", resultDTO);
+ }
+ catch (Exception ex)
+ {
+ return content.Error("SumQuantity 缁熻搴撳瓨鏁伴噺澶辫触锛岃鍗曞彿锛歿OrderNo}");
+ }
+ }
+
+ public WebResponseContent BarcodeMaterielGroup(BarcodeMaterielGroupDTO materielGroupDTO)
+ {
+
+ WebResponseContent content = new WebResponseContent();
+ try
+ {
+ (bool, string, object?) result2 = ModelValidate.ValidateModelData(materielGroupDTO);
+ if (!result2.Item1) return content = WebResponseContent.Instance.Error(result2.Item2);
+
+ // materielGroupDTO.WarehouseCode
+ var code = _warehouseAreaRepository.Db.Queryable<Dt_WarehouseArea>().Where(x => x.Code == materielGroupDTO.WarehouseType).Select(x => x.Code).First();
+ if (string.IsNullOrEmpty(code))
+ {
+ return content = WebResponseContent.Instance.Error($"浠撳簱涓病鏈夎{materielGroupDTO.WarehouseType}缂栧彿銆�");
+ }
+
+ if (materielGroupDTO.orderTypes == InOrderTypeEnum.ReCheck.ObjToInt())
+ {
+ var dborder = _reCheckOrderService.Db.Queryable<Dt_ReCheckOrder>().First(x => x.OrderNo == materielGroupDTO.OrderNo);
+ if (dborder != null && (dborder.SignSeq == 0 || dborder.SignSeq == 1))
+ {
+ return content.Error("鍙湁鎷垮埌閲嶆缁撴灉鎵嶈兘鍏ュ簱锛�");
+ }
+
+
+ }
+ // Dt_InboundOrder inboundOrder = GetInboundOrder(materielGroupDTO.OrderNo);
+
+ var dbinboundOrderDetails = Db.Queryable<Dt_PickingRecord>().Where(x => x.OrderNo == materielGroupDTO.OrderNo && !x.IsCancelled && x.Barcode == materielGroupDTO.Barcodes).ToList();
+
+ if (dbinboundOrderDetails != null && !dbinboundOrderDetails.Any())
+ {
+ return content = WebResponseContent.Instance.Error($"鍗曟嵁涓病鏈夎{materielGroupDTO.Barcodes}鏉$爜鏁版嵁銆�");
+ }
+
+ List<string?> materielCodes = dbinboundOrderDetails.GroupBy(x => x.Barcode).Select(x => x.Key).ToList();
+
+ Dt_StockInfo? stockInfo = _stockService.StockInfoService.GetStockByPalletCode(materielGroupDTO.PalletCode);
+
+
+
+ (bool, string, object?) result = CheckMaterielGroupParam(materielGroupDTO, materielCodes, stockInfo);
+ if (!result.Item1) return content = WebResponseContent.Instance.Error(result.Item2);
+
+ if (stockInfo == null)
+ {
+ stockInfo = new Dt_StockInfo() { PalletType = (int)PalletTypeEnum.None, LocationType = materielGroupDTO.locationType.ObjToInt() };
+ stockInfo.Details = new List<Dt_StockInfoDetail>();
+ }
+ var inboindId = 0; Dt_InboundOrder dt_InboundOrder = null;
+ var orderno = dbinboundOrderDetails.First().OrderNo;
+ var dbinbound = _inboundOrderRepository.QueryData(x => x.InboundOrderNo == orderno).FirstOrDefault();
+ if (dbinbound == null)
+ {
+ dt_InboundOrder = new Dt_InboundOrder
+ {
+ WarehouseId = 0,
+ InboundOrderNo = dbinboundOrderDetails.First()?.OrderNo,
+ UpperOrderNo = dbinboundOrderDetails.First()?.OrderNo,
+ SupplierId = dbinboundOrderDetails.First()?.SupplyCode,
+ OrderType = materielGroupDTO.orderTypes,
+
+ BusinessType = materielGroupDTO.orderTypes.ToString(),
+
+ FactoryArea = dbinboundOrderDetails.First()?.FactoryArea,
+ Remark = "",
+ Details = new List<Dt_InboundOrderDetail>()
+ };
+ inboindId = _inboundOrderRepository.AddData(dt_InboundOrder);
+ }
+ else
+ {
+ dt_InboundOrder = new Dt_InboundOrder { Details = new List<Dt_InboundOrderDetail>() };
+ inboindId = dbinbound.Id;
+ }
+
+ foreach (var item in dbinboundOrderDetails)
+ {
+ stockInfo.Details.Add(new Dt_StockInfoDetail
+ {
+ StockId = stockInfo == null ? 0 : stockInfo.Id,
+ Barcode = item.Barcode,
+ MaterielCode = item.MaterielCode,
+ BatchNo = item.BatchNo,
+ Unit = item.BarcodeUnit,
+ InboundOrderRowNo = item.lineNo,
+ SupplyCode = item.SupplyCode,
+ WarehouseCode = materielGroupDTO.WarehouseType,
+ StockQuantity = item.PickQuantity,
+ BarcodeQty = item.BarcodeQty,
+ BarcodeUnit = item.BarcodeUnit,
+ FactoryArea = item.FactoryArea,
+ Status = 0,
+ OrderNo = item.OrderNo,
+ BusinessType = materielGroupDTO.orderTypes.ToString()
+
+ });
+ item.WarehouseCode = item.WarehouseCode;
+
+ dt_InboundOrder.Details.Add(new Dt_InboundOrderDetail
+ {
+ OrderId = inboindId,
+ MaterielCode = item.MaterielCode,
+ MaterielName = "",
+ BatchNo = item.BatchNo,
+ OrderQuantity = item.PickQuantity,
+ ReceiptQuantity = 0,
+ OverInQuantity = 0,
+ Unit = item.BarcodeUnit,
+ RowNo = 0,
+ lineNo = item.lineNo,
+ SupplyCode = item.SupplyCode,
+ WarehouseCode = item.WarehouseCode,
+ Barcode = item.Barcode,
+ OutBoxbarcodes = "",
+ BarcodeQty = (decimal)item.BarcodeQty,
+ BarcodeUnit = item.BarcodeUnit
+ });
+ }
+
+ _inboundOrderDetailService.Db.Insertable<Dt_InboundOrderDetail>(dt_InboundOrder.Details);
+ if (stockInfo.Id == 0)
+ {
+ stockInfo.PalletCode = materielGroupDTO.PalletCode;
+ stockInfo.StockStatus = StockStatusEmun.缁勭洏鏆傚瓨.ObjToInt();
+ }
+ stockInfo.PalletType = (int)PalletTypeEnum.None;
+
+ List<int> updateDetailIds = dbinboundOrderDetails.Select(x => x.Id).ToList();
+
+ try
+ {
+ _unitOfWorkManage.BeginTran();
+
+ _stockService.StockInfoService.AddMaterielGroup(stockInfo);
+ _unitOfWorkManage.CommitTran();
+ return WebResponseContent.Instance.OK();
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ return WebResponseContent.Instance.Error(ex.Message);
+ }
+ }
+ catch (Exception ex)
+ {
+ content = WebResponseContent.Instance.Error(ex.Message);
+ }
+ finally
+ {
+
+ }
+ return content;
+
+ }
+
+
+ public (bool, string, object?) CheckMaterielGroupParam(BarcodeMaterielGroupDTO materielGroupDTO, List<string> barcodeCodes, Dt_StockInfo stockInfo)
+ {
+ (bool, string, object?) result = ModelValidate.ValidateModelData(materielGroupDTO);
+ if (!result.Item1) return result;
+
+ if (_taskRepository.QueryFirst(x => x.PalletCode == materielGroupDTO.PalletCode) != null)
+ {
+ return (false, "璇ユ墭鐩樺彿宸叉湁浠诲姟", materielGroupDTO);
+ }
+
+ if (stockInfo != null && !string.IsNullOrEmpty(stockInfo.LocationCode) && stockInfo.StockStatus != StockStatusEmun.缁勭洏鏆傚瓨.ObjToInt())
+ {
+ return (false, "宸蹭笂鏋剁殑鎵樼洏涓嶈兘鍐嶆缁勭洏", materielGroupDTO);
+ }
+
+ if (_stockService.StockInfoDetailService.ExistBarcodes(barcodeCodes))
+ {
+ return (false, $"{barcodeCodes[0]} 鏉$爜鍦ㄥ簱瀛樹腑宸插瓨鍦�", materielGroupDTO);
+ }
+
+
+
+ return (true, "鎴愬姛", materielGroupDTO);
+ }
#endregion
}
-
-
#region 鏀寔绫诲畾涔�
@@ -2804,20 +2973,6 @@
public List<SplitResult> SplitResults { get; set; } = new List<SplitResult>();
}
- public class ReturnAnalysisResult
- {
- public bool HasItemsToReturn { get; set; }
- public bool HasRemainingLocks { get; set; }
- public bool HasPalletStockGoods { get; set; }
- public bool HasSplitRecords { get; set; }
- public decimal RemainingLocksReturnQty { get; set; }
- public decimal PalletStockReturnQty { get; set; }
- public decimal SplitReturnQty { get; set; }
- public decimal TotalReturnQty { get; set; }
- public List<Dt_OutStockLockInfo> RemainingLocks { get; set; } = new List<Dt_OutStockLockInfo>();
- public List<Dt_StockInfoDetail> PalletStockGoods { get; set; } = new List<Dt_StockInfoDetail>();
- public List<Dt_SplitPackageRecord> SplitRecords { get; set; } = new List<Dt_SplitPackageRecord>();
- }
public class PalletStatusAnalysis
{
public string OrderNo { get; set; }
@@ -2831,12 +2986,22 @@
public bool HasSplitRecords { get; set; }
public decimal RemainingLocksReturnQty { get; set; }
public decimal PalletStockReturnQty { get; set; }
+
public decimal SplitReturnQty { get; set; }
public decimal TotalReturnQty { get; set; }
+
+ // 鏈垎閰嶇殑閿佸畾璁板綍锛堝鑷姩鎷嗗寘浜х敓鐨勶級
+ public bool HasUnallocatedLocks { get; set; }
+ public List<Dt_OutStockLockInfo> UnallocatedLocks { get; set; } = new List<Dt_OutStockLockInfo>();
+ public decimal UnallocatedLocksReturnQty { get; set; }
+
public List<Dt_OutStockLockInfo> RemainingLocks { get; set; } = new List<Dt_OutStockLockInfo>();
public List<Dt_StockInfoDetail> PalletStockGoods { get; set; } = new List<Dt_StockInfoDetail>();
public List<Dt_SplitPackageRecord> SplitRecords { get; set; } = new List<Dt_SplitPackageRecord>();
+ // 宸插鐞嗙殑鏉$爜闆嗗悎锛堢敤浜庨伩鍏嶉噸澶嶏級
+ public HashSet<string> ProcessedBarcodes { get; set; } = new HashSet<string>();
+ public List<string> AllBarcodes { get; set; } = new List<string>();
// 绌烘墭鐩樼浉鍏冲睘鎬�
public bool IsEmptyPallet { get; set; }
public bool HasActiveTasks { get; set; }
@@ -2845,18 +3010,7 @@
public bool CanReturn => HasItemsToReturn && !HasActiveTasks;
public bool CanRemove => IsEmptyPallet && !HasActiveTasks;
}
- public class PickingContext
- {
- public string OrderNo { get; set; }
- public string PalletCode { get; set; }
- public string Barcode { get; set; }
- public string Operator { get; set; }
- public Dt_OutStockLockInfo LockInfo { get; set; }
- public Dt_OutboundOrderDetail OrderDetail { get; set; }
- public Dt_StockInfoDetail StockDetail { get; set; }
- public decimal ActualQuantity { get; set; }
- public string AdjustedReason { get; set; }
- }
+
public class CancelPickingContext
{
public string OrderNo { get; set; }
--
Gitblit v1.9.3