From 673b5a596f611099eaacc310f6e7def0e022daca Mon Sep 17 00:00:00 2001
From: heshaofeng <heshaofeng@hnkhzn.com>
Date: 星期三, 29 四月 2026 11:00:55 +0800
Subject: [PATCH] 添加盘点模板和胶箱台账功能
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs | 562 +++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 435 insertions(+), 127 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_TaskInfoService/TaskService_Outbound.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_TaskInfoService/TaskService_Outbound.cs"
index 37dcbc7..26affda 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_TaskInfoService/TaskService_Outbound.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_TaskInfoService/TaskService_Outbound.cs"
@@ -1,6 +1,8 @@
锘縰sing MailKit.Search;
+using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
+using OfficeOpenXml;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using SqlSugar;
using System;
@@ -31,6 +33,7 @@
using WIDESEA_Model.Models.Check;
using WIDESEA_Model.Models.Outbound;
+
namespace WIDESEA_TaskInfoService
{
public partial class TaskService
@@ -40,18 +43,19 @@
/// </summary>
/// <param name="inTask"></param>
/// <returns></returns>
- public async Task<WebResponseContent> PalletOutboundTask(int num, int locationType)
+ // 鏂规硶澧炲姞浜� string? SupplierCode 鍙�夊弬鏁�
+ public async Task<WebResponseContent> PalletOutboundTask(int num, int locationType, string? supplierCode = null)
{
WebResponseContent content = new WebResponseContent();
try
{
Dictionary<string, SqlSugar.OrderByType> orderByDict = new Dictionary<string, SqlSugar.OrderByType>()
- {
- { nameof(Dt_LocationInfo.Layer), SqlSugar.OrderByType.Asc },
- { nameof(Dt_LocationInfo.Row), SqlSugar.OrderByType.Asc },
- { nameof(Dt_LocationInfo.Column), SqlSugar.OrderByType.Asc },
- { nameof(Dt_LocationInfo.Depth), SqlSugar.OrderByType.Desc },
- };
+ {
+ { nameof(Dt_LocationInfo.Layer), SqlSugar.OrderByType.Asc },
+ { nameof(Dt_LocationInfo.Row), SqlSugar.OrderByType.Asc },
+ { nameof(Dt_LocationInfo.Column), SqlSugar.OrderByType.Asc },
+ { nameof(Dt_LocationInfo.Depth), SqlSugar.OrderByType.Desc },
+ };
var query = _stockRepository.Db.Queryable<Dt_StockInfo>()
.Where(x => x.PalletType == PalletTypeEnum.Empty.ObjToInt()
@@ -59,7 +63,7 @@
.WhereIF(locationType != 0, x => x.LocationType == locationType)
.LeftJoin<Dt_LocationInfo>((s, l) => s.LocationCode == l.LocationCode);
- if (query.Count() == 0)
+ if (!await query.AnyAsync())
{
return WebResponseContent.Instance.Error("鏈壘鍒扮┖鎵樼洏搴撳瓨");
}
@@ -80,17 +84,34 @@
}
else
{
- query = query.OrderBy(sortSql);
+ query.OrderBy(sortSql);
}
}
var stockInfos = await query.Take(num).ToListAsync();
+ _unitOfWorkManage.BeginTran();
+
+ Dt_PlasticContainerLedger? todayLedger = null;
+ var today = DateTime.Now.Date;
+ var tomorrow = today.AddDays(1);
+
+ if (!string.IsNullOrWhiteSpace(supplierCode))
+ {
+ todayLedger = await _stockRepository.Db.Queryable<Dt_PlasticContainerLedger>()
+ .Where(x => x.SupplyCode == supplierCode)
+ .Where(x => x.CreateDate >= today && x.CreateDate < tomorrow)
+ .FirstAsync();
+ }
+
+ string allTaskNums = string.Empty;
+
foreach (var stockInfo in stockInfos)
{
- Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode);
+ Dt_LocationInfo locationInfo = await _locationInfoService.Repository.QueryFirstAsync(x => x.LocationCode == stockInfo.LocationCode);
if (locationInfo == null)
{
+ _unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error("鏈壘鍒扮┖鎵樼洏搴撳瓨瀵瑰簲鐨勮揣浣嶄俊鎭�");
}
@@ -107,35 +128,78 @@
TaskType = TaskTypeEnum.OutEmpty.ObjToInt(),
WarehouseId = stockInfo.WarehouseId,
PalletType = stockInfo.PalletType
-
};
- int beforeStatus = locationInfo.LocationStatus;
- _unitOfWorkManage.BeginTran();
- stockInfo.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
- locationInfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
- int taskId = BaseDal.AddData(task);
+ int taskId = await BaseDal.AddDataAsync(task);
task.TaskId = taskId;
+ allTaskNums += task.TaskNum + ",";
+
+ stockInfo.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
_stockService.StockInfoService.UpdateData(stockInfo);
+ int beforeStatus = locationInfo.LocationStatus;
+ locationInfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
_locationInfoService.UpdateData(locationInfo);
- _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), "", task.TaskNum);
-
- _unitOfWorkManage.CommitTran();
-
+ _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(
+ locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), "", task.TaskNum);
}
+
+ if (!string.IsNullOrWhiteSpace(supplierCode))
+ {
+ var ledgerList = new List<Dt_PlasticContainerLedger>();
+
+ foreach (var stock in stockInfos)
+ {
+ ledgerList.Add(new Dt_PlasticContainerLedger
+ {
+ SupplyCode = supplierCode,
+ PalletCode = stock.PalletCode,
+ CreateDate = DateTime.Now,
+ Creater = App.User?.ToString()
+ });
+ }
+ _plasticContainerLedger.AddData(ledgerList);
+ }
+
+ _unitOfWorkManage.CommitTran();
return content.OK("绌烘墭鍑哄簱鎴愬姛!");
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ return WebResponseContent.Instance.Error(ex.Message);
+ }
+ }
+
+
+ /// <summary>
+ /// 瀹炴椂鎼滅储渚涘簲鍟嗙紪鐮侊紙鏀寔杈撳叆 r 鑷姩鍖归厤锛屼笅鎷夋鐢級
+ /// </summary>
+ /// <param name="keyword">杈撳叆鐨勫叧閿瘝锛堝 r锛�</param>
+ /// <returns>鍖归厤鐨勪緵搴斿晢缂栫爜鍒楄〃</returns>
+ public async Task<WebResponseContent> SearchSupplierCode(string keyword)
+ {
+ try
+ {
+ if (string.IsNullOrWhiteSpace(keyword))
+ return WebResponseContent.Instance.OK("娌℃湁鍖归厤鍒拌渚涘簲鍟嗙紪鍙�");
+
+ var list = await _stockRepository.Db.Queryable<Dt_SupplierInfo>()
+ .Where(x => x.SupplierShortName.StartsWith(keyword))
+ .OrderBy(x => x.SupplierShortName)
+ .Take(20)
+ .Select(x => x.SupplierShortName)
+ .ToListAsync();
+
+ return WebResponseContent.Instance.OK(data:list);
}
catch (Exception ex)
{
return WebResponseContent.Instance.Error(ex.Message);
}
}
-
-
-
/// <summary>
/// 鍑哄簱浠诲姟鏁版嵁澶勭悊
@@ -1126,127 +1190,196 @@
/// <returns></returns>
public async Task<WebResponseContent> TakeOutbound(List<StockViewDTO> stockViews, string outStation)
{
- WebResponseContent content = new WebResponseContent();
+ var content = new WebResponseContent();
+ var errorMessages = new List<string>();
+
try
{
- var allFactoryAreas = stockViews.SelectMany(sv => sv.Details)
- .Select(x => x.FactoryArea)
- .GroupBy(x => x)
- .ToList();
- if (allFactoryAreas.Count >= 2)
+ if (stockViews == null || !stockViews.Any())
{
- return content.Error($"璇烽�夋嫨鍚屼竴鍘傚尯鍖哄煙鐨勫簱瀛樿繘琛岀洏鐐癸紝褰撳墠娑夊強{allFactoryAreas.Count}涓笉鍚岀殑鍘傚尯");
+ content.Error("鏈幏鍙栧埌搴撳瓨鏁版嵁");
+ content.Data = new { total = 0, success = 0, fail = 0, failMsg = errorMessages };
+ return content;
}
- List<int> ids = stockViews.Select(x => x.StockId).ToList();
- //鑾峰彇搴撳瓨
- List<Dt_StockInfo> stockInfos = _stockRepository.Db.Queryable<Dt_StockInfo>().Where(x => ids.Contains(x.Id)).Includes(x => x.Details).ToList();
- if (stockInfos.Count != stockViews.Count)
+
+ var ids = stockViews.Select(x => x.StockId).ToList();
+ var stockInfos = _stockRepository.Db.Queryable<Dt_StockInfo>()
+ .Where(x => ids.Contains(x.Id))
+ .Includes(x => x.Details)
+ .ToList();
+
+ var locCodes = stockInfos.Select(x => x.LocationCode).ToList();
+ var locationInfos = _locationInfoService.Db.Queryable<Dt_LocationInfo>()
+ .Where(x => locCodes.Contains(x.LocationCode))
+ .ToList();
+
+ var finalSuccessStocks = new List<Dt_StockInfo>();
+ var finalSuccessLocations = new List<Dt_LocationInfo>();
+
+ foreach (var stock in stockInfos)
{
- StockViewDTO? stockViewDTO = stockViews.FirstOrDefault(x => !stockInfos.Select(x => x.PalletCode).ToList().Contains(x.PalletCode));
- return content.Error($"鏈壘鍒皗stockViewDTO?.PalletCode}搴撳瓨");
- }
- //鑾峰彇璐т綅
- List<string> locStrs = stockInfos.Select(x => x.LocationCode).ToList();
- List<Dt_LocationInfo> locationInfos =_locationInfoService.Db.Queryable<Dt_LocationInfo>().Where(x => locStrs.Contains(x.LocationCode)).ToList();
- if (stockInfos.Count != locationInfos.Count)
- {
- string? locStr = locStrs.FirstOrDefault(x => !locationInfos.Select(x => x.LocationCode).ToList().Contains(x));
- return content.Error($"鏈壘鍒皗locStr}璐т綅鏁版嵁");
- }
- Dt_TakeStockOrder takeStockOrder = new Dt_TakeStockOrder()
- {
- WarehouseId = stockInfos.FirstOrDefault().WarehouseId,
- TakeStockStatus = TakeStockStatusEnum.鐩樼偣涓�.ObjToInt(),
- OrderNo = CreateCodeByRule(nameof(RuleCodeEnum.PDCodeRule)),
- AllPalletCode = string.Join(",", stockInfos.Select(item => item.PalletCode).Where(palletCode => !string.IsNullOrEmpty(palletCode))),
- Remark = outStation
-
- };
- foreach (var item in stockInfos)
- {
- if (item.Details.Count <= 0)
+ try
{
- return content.Error($"鏈壘鍒皗item.PalletCode}搴撳瓨鏄庣粏鏁版嵁");
+ if (stock.Details == null || !stock.Details.Any())
+ {
+ errorMessages.Add($"鎵樼洏銆恵stock.PalletCode}銆戯細鏃犲簱瀛樻槑缁�");
+ continue;
+ }
+
+ var loc = locationInfos.FirstOrDefault(x => x.LocationCode == stock.LocationCode);
+ if (loc == null)
+ {
+ errorMessages.Add($"鎵樼洏銆恵stock.PalletCode}銆戯細搴撲綅涓嶅瓨鍦�");
+ continue;
+ }
+
+ if (loc.EnableStatus != EnableStatusEnum.Normal.ObjToInt() ||
+ loc.LocationStatus != LocationStatusEnum.InStock.ObjToInt() ||
+ stock.StockStatus != StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt())
+ {
+ errorMessages.Add($"鎵樼洏銆恵stock.PalletCode}銆戯細鐘舵�佷笉鍏佽鍑哄簱");
+ continue;
+ }
+
+ finalSuccessStocks.Add(stock);
+ finalSuccessLocations.Add(loc);
}
- Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == item.LocationCode);
- if (locationInfo == null || (locationInfo.EnableStatus == EnableStatusEnum.Disable.ObjToInt() || locationInfo.EnableStatus != EnableStatusEnum.Normal.ObjToInt()) || locationInfo.LocationStatus != LocationStatusEnum.InStock.ObjToInt() || item.StockStatus != StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt())
+ catch (Exception ex)
{
- return content.Error($"{item.PalletCode}璐т綅鎴栧簱瀛樼姸鎬佷笉婊¤冻鍑哄簱鏉′欢");
- }
+ errorMessages.Add($"鎵樼洏銆恵stock.PalletCode}銆戝紓甯革細{ex.Message}");
+ continue;
+ }
}
- List<Dt_Task> tasks = GetTasks(stockInfos, TaskTypeEnum.OutInventory,outStation);
- if (tasks == null || tasks.Count <= 0)
+
+ if (finalSuccessStocks.Any())
{
- return content.Error($"鐢熸垚浠诲姟澶辫触");
+ var takeStockOrder = new Dt_TakeStockOrder
+ {
+ WarehouseId = finalSuccessStocks.First().WarehouseId,
+ TakeStockStatus = TakeStockStatusEnum.鐩樼偣涓�.ObjToInt(),
+ OrderNo = CreateCodeByRule(nameof(RuleCodeEnum.PDCodeRule)),
+ AllPalletCode = string.Join(",", finalSuccessStocks.Select(x => x.PalletCode)),
+ Remark = outStation
+ };
+
+ var tasks = GetTasks(finalSuccessStocks, TaskTypeEnum.OutInventory, outStation);
+ if (tasks == null || tasks.Count <= 0)
+ {
+ errorMessages.Add("浠诲姟鐢熸垚澶辫触");
+ }
+ else
+ {
+ finalSuccessStocks.ForEach(x => x.StockStatus = StockStatusEmun.鐩樼偣鍑哄簱閿佸畾.ObjToInt());
+ finalSuccessLocations.ForEach(x => x.LocationStatus = LocationStatusEnum.Lock.ObjToInt());
+ tasks.ForEach(x => x.OrderNo = takeStockOrder.OrderNo);
+
+ _unitOfWorkManage.BeginTran();
+ _stockRepository.UpdateData(finalSuccessStocks);
+ _takeStockOrder.AddData(takeStockOrder);
+ BaseDal.AddData(tasks);
+ _locationInfoService.UpdateData(finalSuccessLocations);
+ _unitOfWorkManage.CommitTran();
+ }
}
- stockInfos.ForEach(x =>
- {
- x.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
- });
- tasks.ForEach(x =>
- {
- x.OrderNo = takeStockOrder.OrderNo;
- });
- locationInfos.ForEach(x =>
- {
- x.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
- });
- _unitOfWorkManage.BeginTran();
- //鏇存柊搴撳瓨鐘舵��
- _stockRepository.UpdateData(stockInfos);
- _takeStockOrder.AddData(takeStockOrder);
- //鏂板缓浠诲姟
- BaseDal.AddData(tasks);
- _locationInfoService.UpdateData(locationInfos);
- _unitOfWorkManage.CommitTran();
- content.OK();
- //TaskModel esstask = new TaskModel()
- //{
- // taskType = "carry",
- // taskGroupCode = "",
- // groupPriority = 0,
- // tasks = new List<TasksType>()
- //};
- //foreach (var task in tasks)
- //{
- // esstask.
- // tasks.Add(new TasksType
- // {
- // taskCode = task.TaskNum.ToString(),
- // taskPriority = 0,
- // taskDescribe = new TaskDescribeType
- // {
- // containerCode = task.PalletCode,
- // containerType = "CT_KUBOT_STANDARD",
- // fromLocationCode = task.SourceAddress ?? "",
- // toStationCode = "",
- // toLocationCode = task.TargetAddress,
- // deadline = 0,
- // storageTag = ""
- // }
- // }
- // );
- //}
- //var result = await _eSSApiService.CreateTaskAsync(esstask);
-
- //_logger.LogInformation("鍒涘缓浠诲姟PalletOutboundTask 杩斿洖: " + result);
- //if (result)
- //{
- // return WebResponseContent.Instance.OK();
- //}
- //else
- //{
- // return WebResponseContent.Instance.Error("涓嬪彂鏈哄櫒浜轰换鍔″け璐ワ紒");
- //}
- //content.OK();
+ content.OK($"澶勭悊瀹屾垚锛氭垚鍔熴�恵finalSuccessStocks.Count}銆戞潯锛屽け璐ャ�恵errorMessages.Count}銆戞潯");
+ content.Data = new
+ {
+ total = stockInfos.Count,
+ success = finalSuccessStocks.Count,
+ fail = errorMessages.Count,
+ failMsg = errorMessages
+ };
+ return content;
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
- return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message));
+ content.Error($"绯荤粺寮傚父锛歿ex.Message}");
+ content.Data = new
+ {
+ total = stockViews?.Count ?? 0,
+ success = 0,
+ fail = 1,
+ failMsg = new List<string> { ex.Message }
+ };
+ return content;
}
- return content;
+ }
+
+ public async Task<WebResponseContent> BatchOutboundByExcel(IFormFile file, string outStation)
+ {
+ WebResponseContent content = new WebResponseContent();
+ List<StockViewDTO> successStockViews = new List<StockViewDTO>();
+ List<string> noStockMaterialCodes = new List<string>();
+
+ try
+ {
+ if (file == null || file.Length == 0)
+ return content.Error("涓婁紶澶辫触锛氳閫夋嫨闇�瑕佸鍏ョ殑Excel鏂囦欢");
+
+ var ext = Path.GetExtension(file.FileName).ToLower();
+ if (ext != ".xls" && ext != ".xlsx")
+ return content.Error("涓婁紶澶辫触锛氫粎鏀寔 .xls 鍜� .xlsx 鏍煎紡鐨凟xcel鏂囦欢锛岃閲嶆柊涓婁紶");
+
+ try
+ {
+ using var stream = file.OpenReadStream();
+ var excelList = ReadExcel(stream);
+
+ if (!excelList.Any())
+ return content.Error("瀵煎叆澶辫触锛欵xcel鏂囦欢涓湭璇诲彇鍒颁换浣曟湁鏁堟暟鎹�");
+
+ foreach (var item in excelList)
+ {
+ var matchedStocks = _stockRepository.Db.Queryable<Dt_StockInfo>()
+ .Includes(x => x.Details)
+ .Where(x =>
+ x.Details.Any(d =>
+ d.WarehouseCode == item.WarehouseCode
+ && d.MaterielCode == item.MaterialCode
+ )
+ )
+ .ToList();
+
+ if (matchedStocks.Any())
+ {
+ successStockViews.AddRange(matchedStocks.Select(s => new StockViewDTO
+ {
+ StockId = s.Id
+ }));
+ }
+ else
+ {
+ noStockMaterialCodes.Add(item.MaterialCode);
+ }
+ }
+
+ // 鎵ц鍑哄簱
+ if (successStockViews.Any())
+ {
+ var result = await TakeOutbound(successStockViews, outStation);
+ return result;
+ }
+
+ // 鏃犱换浣曞彲鍑哄簱鏁版嵁
+ var msg = "鏈煡璇㈠埌浠讳綍鍙嚭搴撳簱瀛�";
+ if (noStockMaterialCodes.Any())
+ {
+ msg += $"锛屾棤搴撳瓨鏂欏彿锛歿string.Join("銆�", noStockMaterialCodes)}";
+ }
+ return content.Error(msg);
+ }
+ catch (Exception ex)
+ {
+ return content.Error($"Excel瑙f瀽澶辫触锛歿ex.Message}");
+ }
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ return content.Error($"鎵归噺鍑哄簱澶辫触锛氱郴缁熷紓甯革紝{ex.Message}");
+ }
}
/// <summary>
/// 鍗曟嵁鐢熸垚鏂规硶
@@ -1441,6 +1574,181 @@
}
}
}
+
+ /// <summary>
+ /// 閫夊畾搴撳瓨璺ㄥ尯鍩熺Щ搴�
+ /// </summary>
+ /// <param name="stockViews"></param>
+ /// <param name="targetLocationType">鐩爣璐т綅绫诲瀷</param>
+ /// <returns></returns>
+ public async Task<WebResponseContent> CrossAreaOutbound(List<StockViewDTO> stockViews, int targetLocationType)
+ {
+ WebResponseContent content = new WebResponseContent();
+ try
+ {
+ if(targetLocationType == (int)LocationTypeEnum.Electronic)
+ {
+ return content.Error("鐢靛瓙浠撲笉鍏佽璺ㄥ尯鍩熺Щ搴�");
+ }
+ List<int> ids = stockViews.Select(x => x.StockId).ToList();
+ List<Dt_StockInfo> stockInfos = _stockRepository.Db.Queryable<Dt_StockInfo>().Where(x => ids.Contains(x.Id)).Includes(x => x.Details).ToList();
+
+ if (stockInfos.Count != stockViews.Count)
+ {
+ StockViewDTO? stockViewDTO = stockViews.FirstOrDefault(x => !stockInfos.Select(x => x.PalletCode).Contains(x.PalletCode));
+ return content.Error($"鏈壘鍒皗stockViewDTO?.PalletCode}搴撳瓨");
+ }
+
+ List<string> locStrs = stockInfos.Select(x => x.LocationCode).ToList();
+ List<Dt_LocationInfo> locationInfos = _locationInfoService.Db.Queryable<Dt_LocationInfo>().Where(x => locStrs.Contains(x.LocationCode)).ToList();
+
+ if (stockInfos.Count != locationInfos.Count)
+ {
+ string? locStr = locStrs.FirstOrDefault(x => !locationInfos.Select(x => x.LocationCode).Contains(x));
+ return content.Error($"鏈壘鍒皗locStr}璐т綅鏁版嵁");
+ }
+
+ foreach (var item in stockInfos)
+ {
+ if (item.PalletType != PalletTypeEnum.Empty.ObjToInt())
+ {
+ return content.Error($"鎵樼洏銆恵item.PalletCode}銆戦潪绌虹锛屼粎绌虹鍏佽璺ㄥ尯鍩熺Щ搴擄紒");
+ }
+ Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == item.LocationCode);
+ if (locationInfo == null || locationInfo.EnableStatus != EnableStatusEnum.Normal.ObjToInt() || item.StockStatus != StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt())
+ {
+ return content.Error($"{item.PalletCode}璐т綅鎴栧簱瀛樼姸鎬佷笉婊¤冻鍑哄簱鏉′欢");
+ }
+ }
+
+ List<Dt_Task> tasks = CrossAreaGetTasks(stockInfos, targetLocationType, TaskTypeEnum.CrossAreaRelocation);
+
+ if (tasks == null || tasks.Count <= 0)
+ {
+ return content.Error("鐢熸垚璺ㄥ尯鍩熺Щ搴撲换鍔″け璐�");
+ }
+
+ stockInfos.ForEach(x =>
+ {
+ x.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+ });
+
+ tasks.ForEach(x =>
+ {
+ x.OrderNo = "璺ㄥ尯鍩熺Щ搴�";
+ });
+
+ locationInfos.ForEach(x =>
+ {
+ x.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
+ });
+
+ _unitOfWorkManage.BeginTran();
+ _stockRepository.UpdateData(stockInfos);
+ BaseDal.AddData(tasks);
+ _locationInfoService.UpdateData(locationInfos);
+ _unitOfWorkManage.CommitTran();
+
+ content.OK();
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message));
+ }
+ return content;
+ }
+
+
+ /// <summary>
+ /// 鐢熸垚璺ㄥ尯鍩熺Щ搴撲换鍔�
+ /// </summary>
+ /// <param name="stockInfos">搴撳瓨鍒楄〃</param>
+ /// <param name="targetAreaCode">鐩爣鍖哄煙缂栫爜</param>
+ /// <param name="taskType">浠诲姟绫诲瀷</param>
+ /// <returns></returns>
+ public List<Dt_Task> CrossAreaGetTasks(List<Dt_StockInfo> stockInfos, int targetLocationType, TaskTypeEnum taskType)
+ {
+ using (var scope = new TransactionScope(TransactionScopeOption.Required,
+ new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
+ {
+ try
+ {
+ List<Dt_Task> tasks = new List<Dt_Task>();
+
+ foreach (var stockInfo in stockInfos)
+ {
+ Dt_LocationInfo newLocation = _locationInfoService.AssignLocation(targetLocationType);
+
+ if (newLocation == null)
+ {
+ throw new Exception($"{stockInfo.PalletCode} 娌℃湁绌洪棽璐т綅鍙繘琛岃法鍖哄煙绉诲簱");
+ }
+
+ if (!tasks.Exists(x => x.PalletCode == stockInfo.PalletCode))
+ {
+ Dt_Task task = new()
+ {
+ CurrentAddress = stockInfo.LocationCode,
+ Grade = 0,
+ PalletCode = stockInfo.PalletCode,
+ NextAddress = "",
+ Roadway = newLocation.RoadwayNo,
+ SourceAddress = stockInfo.LocationCode,
+ TargetAddress = newLocation.LocationCode,
+ TaskStatus = TaskStatusEnum.New.ObjToInt(),
+ TaskType = taskType.ObjToInt(),
+ PalletType = stockInfo.PalletType,
+ WarehouseId = stockInfo.WarehouseId,
+ };
+ tasks.Add(task);
+ }
+
+ newLocation.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
+ _locationInfoService.UpdateData(newLocation);
+ }
+
+ scope.Complete();
+ return tasks;
+ }
+ catch (Exception ex)
+ {
+ throw new Exception(ex.Message);
+ }
+ }
+ }
+
+ public static List<ExcelInventoryOutboundDto> ReadExcel(Stream stream)
+ {
+ var list = new List<ExcelInventoryOutboundDto>();
+
+ using (var package = new ExcelPackage(stream))
+ {
+ var sheet = package.Workbook.Worksheets.FirstOrDefault();
+ if (sheet == null) return list;
+
+ // 姝g‘鑾峰彇琛屾暟
+ int rowCount = sheet.Dimension?.End.Row ?? 0;
+
+ // 绗�2琛屽紑濮嬭
+ for (int row = 2; row <= rowCount; row++)
+ {
+ string location = sheet.Cells[row, 8].Value?.ToString()?.Trim() ?? "";
+ string materialCode = sheet.Cells[row, 2].Value?.ToString()?.Trim() ?? "";
+
+ if (string.IsNullOrEmpty(location) || string.IsNullOrEmpty(materialCode))
+ continue;
+
+ list.Add(new ExcelInventoryOutboundDto
+ {
+ WarehouseCode = location,
+ MaterialCode = materialCode
+ });
+ }
+ }
+
+ return list;
+ }
}
}
--
Gitblit v1.9.3