From 3de39066b5894850d0f0dc311b60cc09f599a025 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期四, 26 二月 2026 14:30:06 +0800
Subject: [PATCH] 修复图片导入;重构路由和堆垛机命令
---
Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs | 319 ++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 231 insertions(+), 88 deletions(-)
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs
index 16c743a..8e323e3 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs
@@ -1,23 +1,10 @@
-锘縰sing HslCommunication.WebSocket;
-using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
-using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
-using SqlSugar;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+锘縰sing SqlSugar;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.LocationEnum;
-using WIDESEA_Common.StockEnum;
+using WIDESEA_Common.TaskEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
-using WIDESEA_Core.Const;
-using WIDESEA_Core.DB;
-using WIDESEA_Core.Enums;
-using WIDESEA_Core.Helper;
-using WIDESEA_Core.Seed;
using WIDESEA_Core.Utilities;
using WIDESEA_DTO.Basic;
using WIDESEA_IBasicService;
@@ -27,124 +14,76 @@
{
public partial class LocationInfoService : ServiceBase<Dt_LocationInfo, IRepository<Dt_LocationInfo>>, ILocationInfoService
{
- private readonly IUnitOfWorkManage _unitOfWorkManage;
- private readonly IRepository<Dt_StockInfo> _stockInfoRepository;
public IRepository<Dt_LocationInfo> Repository => BaseDal;
+ public IRepository<Dt_Task> _taskRepository { get; }
- public LocationInfoService(IRepository<Dt_LocationInfo> BaseDal, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_StockInfo> stockInfoRepository) : base(BaseDal)
+ public IRepository<Dt_StockInfo> _stockInfoRepository { get; set; }
+
+ public LocationInfoService(IRepository<Dt_LocationInfo> BaseDal, IRepository<Dt_Task> taskRepository, IRepository<Dt_StockInfo> stockInfoRepository) : base(BaseDal)
{
- _unitOfWorkManage = unitOfWorkManage;
+ _taskRepository = taskRepository;
_stockInfoRepository = stockInfoRepository;
}
/// <summary>
/// 鎵归噺鍚敤璐т綅
/// </summary>
- /// <param name="keys">璐т綅涓婚敭鏁扮粍</param>
- /// <returns></returns>
public WebResponseContent LocationEnableStatus(int[] keys)
{
- List<Dt_LocationInfo> locationInfos = Repository.QueryData(x => keys.Contains(x.Id));
- locationInfos.ForEach(x =>
- {
- x.EnableStatus = EnableStatusEnum.Normal.ObjToInt();
- });
+ var locationInfos = Repository.QueryData(x => keys.Contains(x.Id));
+ locationInfos.ForEach(x => x.EnableStatus = EnableStatusEnum.Normal.GetHashCode());
Repository.UpdateData(locationInfos);
-
return WebResponseContent.Instance.OK();
}
/// <summary>
/// 鎵归噺绂佺敤璐т綅
/// </summary>
- /// <param name="keys">璐т綅涓婚敭鏁扮粍</param>
- /// <returns></returns>
public WebResponseContent LocationDisableStatus(int[] keys)
{
- List<Dt_LocationInfo> locationInfos = Repository.QueryData(x => keys.Contains(x.Id));
- locationInfos.ForEach(x =>
- {
- x.EnableStatus = EnableStatusEnum.Disable.ObjToInt();
- });
+ var locationInfos = Repository.QueryData(x => keys.Contains(x.Id));
+ locationInfos.ForEach(x => x.EnableStatus = EnableStatusEnum.Disable.GetHashCode());
Repository.UpdateData(locationInfos);
-
return WebResponseContent.Instance.OK();
}
/// <summary>
/// 鍗曚釜鍚敤璐т綅
/// </summary>
- /// <param name="key">璐т綅涓婚敭</param>
- /// <returns></returns>
- public WebResponseContent LocationEnableStatus(int key)
- {
- return LocationEnableStatus(new int[] { key });
- }
+ public WebResponseContent LocationEnableStatus(int key) => LocationEnableStatus(new[] { key });
/// <summary>
/// 鍗曚釜绂佺敤璐т綅
/// </summary>
- /// <param name="key">璐т綅涓婚敭</param>
- /// <returns></returns>
- public WebResponseContent LocationDisableStatus(int key)
- {
- return LocationDisableStatus(new int[] { key });
- }
+ public WebResponseContent LocationDisableStatus(int key) => LocationDisableStatus(new[] { key });
/// <summary>
/// 鍒濆鍖栬揣浣�
/// </summary>
- /// <param name="initializationLocationDTO"></param>
- /// <returns></returns>
- public WebResponseContent InitializationLocation(InitializationLocationDTO initializationLocationDTO)
+ public WebResponseContent InitializationLocation(InitializationLocationDTO dto)
{
try
{
- (bool, string, object?) result = ModelValidate.ValidateModelData(initializationLocationDTO);
- if (!result.Item1) return WebResponseContent.Instance.Error(result.Item2);
+ var (isValid, errorMsg, _) = ModelValidate.ValidateModelData(dto);
+ if (!isValid) return WebResponseContent.Instance.Error(errorMsg);
- int depth = initializationLocationDTO.Depth;
- List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
- for (int i = 0; i < initializationLocationDTO.MaxRow; i++)
+ var locationInfos = new List<Dt_LocationInfo>();
+ int depth = dto.Depth;
+
+ for (int row = 1; row <= dto.MaxRow; row++)
{
- if ((i + 1) % initializationLocationDTO.MaxRow == 1)
+ depth = CalculateDepth(row, dto.MaxRow, dto.Depth, depth);
+
+ for (int col = 1; col <= dto.MaxColumn; col++)
{
- depth = initializationLocationDTO.Depth;
- }
- else if ((i + 1) % initializationLocationDTO.MaxRow == initializationLocationDTO.Depth + 1)
- {
- depth = 1;
- }
- else if ((i + 1) % initializationLocationDTO.MaxRow > 1 && (i + 1) % initializationLocationDTO.MaxRow <= initializationLocationDTO.Depth)
- {
- depth -= 1;
- }
- else
- {
- depth += 1;
- }
- for (int j = 0; j < initializationLocationDTO.MaxColumn; j++)
- {
- for (int k = 0; k < initializationLocationDTO.MaxLayer; k++)
+ for (int layer = 1; layer <= dto.MaxLayer; layer++)
{
- Dt_LocationInfo locationInfo = new Dt_LocationInfo()
- {
- WarehouseId = 0,
- Column = j + 1,
- EnableStatus = EnableStatusEnum.Normal.ObjToInt(),
- Layer = k + 1,
- LocationStatus = LocationStatusEnum.Free.ObjToInt(),
- LocationType = LocationTypeEnum.Undefined.ObjToInt(),
- RoadwayNo = $"{initializationLocationDTO.Roadway.ToString()}",
- Row = i + 1,
- Depth = depth,
- };
- locationInfo.LocationCode = $"{locationInfo.RoadwayNo}-{locationInfo.Row.ToString().PadLeft(3, '0')}-{locationInfo.Column.ToString().PadLeft(3, '0')}-{locationInfo.Layer.ToString().PadLeft(3, '0')}-{locationInfo.Depth.ToString().PadLeft(2, '0')}";
- locationInfo.LocationName = $"{locationInfo.RoadwayNo}宸烽亾{locationInfo.Row.ToString().PadLeft(3, '0')}琛寋locationInfo.Column.ToString().PadLeft(3, '0')}鍒梴locationInfo.Layer.ToString().PadLeft(3, '0')}灞倇locationInfo.Depth.ToString().PadLeft(2, '0')}娣�";
- locationInfos.Add(locationInfo);
+ var location = CreateLocationInfo(dto.Roadway, row, col, layer, depth);
+ locationInfos.Add(location);
}
}
}
+
BaseDal.AddData(locationInfos);
return WebResponseContent.Instance.OK();
}
@@ -153,5 +92,209 @@
return WebResponseContent.Instance.Error(ex.Message);
}
}
+
+ private static int CalculateDepth(int row, int maxRow, int maxDepth, int currentDepth)
+ {
+ int mod = row % maxRow;
+ if (mod == 1) return maxDepth;
+ if (mod == maxDepth + 1) return 1;
+ if (mod > 1 && mod <= maxDepth) return currentDepth - 1;
+ return currentDepth + 1;
+ }
+
+ private static Dt_LocationInfo CreateLocationInfo(string roadwayNo, int row, int col, int layer, int depth)
+ {
+ return new Dt_LocationInfo
+ {
+ WarehouseId = 0,
+ Row = row,
+ Column = col,
+ Layer = layer,
+ Depth = depth,
+ RoadwayNo = roadwayNo,
+ EnableStatus = EnableStatusEnum.Normal.GetHashCode(),
+ LocationStatus = LocationStatusEnum.Free.GetHashCode(),
+ LocationType = LocationTypeEnum.Undefined.GetHashCode(),
+ LocationCode = $"{roadwayNo}-{row:D3}-{col:D3}-{layer:D3}-{depth:D2}",
+ LocationName = $"{roadwayNo}宸烽亾{row:D3}琛寋col:D3}鍒梴layer:D3}灞倇depth:D2}娣�"
+ };
+ }
+
+
+
+ /// <summary>
+ /// 鑾峰彇绌洪棽璐т綅淇℃伅(鏍规嵁宸烽亾鏌ヨ)
+ /// </summary>
+ public async Task<Dt_LocationInfo?> GetLocationInfo(string roadwayNo)
+ {
+ var locations = await BaseDal.QueryDataAsync(x =>
+ x.EnableStatus == EnableStatusEnum.Normal.GetHashCode() &&
+ x.RoadwayNo == roadwayNo &&
+ x.LocationStatus == LocationStatusEnum.Free.GetHashCode());
+
+ return locations?
+ .OrderBy(x => x.Layer)
+ .ThenBy(x => x.Depth)
+ .ThenBy(x => x.Column)
+ .ThenBy(x => x.Row)
+ .FirstOrDefault();
+ }
+
+ /// <summary>
+ /// 鑾峰彇璐т綅淇℃伅(鏍规嵁宸烽亾鍜岃揣浣嶇紪鐮佹煡璇�)
+ /// </summary>
+ public async Task<Dt_LocationInfo?> GetLocationInfo(string roadwayNo, string locationCode)
+ {
+ return await BaseDal.QueryFirstAsync(x => x.RoadwayNo == roadwayNo && x.LocationCode == locationCode);
+ }
+
+ public async Task<Dt_LocationInfo> GetLocationInfoAsync( string locationCode)
+ {
+ return await BaseDal.QueryFirstAsync(x=>x.LocationCode == locationCode);
+ }
+
+ /// <summary>
+ /// 鏇存柊璐т綅淇℃伅
+ /// </summary>
+ public async Task<bool> UpdateLocationInfoAsync(Dt_LocationInfo locationInfo)
+ {
+ return await BaseDal.UpdateDataAsync(locationInfo);
+ }
+
+
+ /// <summary>
+ /// 妫�鏌ュ苟鐢熸垚绉诲簱浠诲姟鎴栬繑鍥炲嚭搴撲换鍔�
+ /// </summary>
+ /// <param name="locationID">浠诲姟鍙�</param>
+ /// <returns>浠诲姟瀵硅薄</returns>
+ public async Task<Dt_Task> TransferCheckAsync(int taskNum)
+ {
+ try
+ {
+ // 鏍规嵁浠诲姟鍙疯幏鍙栦换鍔�
+ var outboundTask = await _taskRepository.QueryFirstAsync(x => x.TaskNum == taskNum);
+ if (outboundTask == null)
+ return null;
+
+ var location = await BaseDal.QueryFirstAsync(x => x.LocationCode == outboundTask.SourceAddress);
+
+ // 妫�鏌ユ槸鍚﹂渶瑕佽繘琛岀Щ搴�
+ if (CheckForInternalTransfer(location))
+ {
+ // 璁$畻瀵瑰簲浣嶇疆鐨勭浉瀵瑰簱浣� 锛堝鏁拌鐨勪笅涓�琛屾垨鑰呭伓鏁拌鐨勪笂涓�琛岋級
+ var newLocationID = GetRelativeLocationID(location);
+
+ // 鑾峰彇鏂扮殑搴撲綅鐨勪换鍔�
+ var internalTransferTask = await _taskRepository.QueryFirstAsync(x => x.SourceAddress == newLocationID && x.Roadway == outboundTask.Roadway);
+
+ // 濡傛灉鏂扮殑搴撲綅娌℃湁鎵惧埌瀵瑰簲鐨勪换鍔�
+ if (internalTransferTask == null)
+ {
+ return await HandleNoTaskAtLocation(outboundTask.SourceAddress, newLocationID, outboundTask);
+ }
+
+ // 鐩存帴杩斿洖涓�娣变綅鍑哄簱浠诲姟
+ return internalTransferTask;
+ }
+
+ // 杩斿洖褰撳墠搴撲綅鐨勫嚭搴撲换鍔�
+ return outboundTask;
+ }
+ catch (Exception)
+ {
+ return null;
+ }
+ }
+
+
+ #region 绉诲簱鏂规硶
+
+ /// <summary>
+ /// 璁$畻鐩稿鐨勫簱浣岻D
+ /// </summary>
+ /// <param name="locationID">褰撳墠搴撲綅ID</param>
+ /// <returns>鐩稿鐨勫簱浣岻D</returns>
+ private string GetRelativeLocationID(Dt_LocationInfo locationInfo)
+ {
+ int line = locationInfo.Row;
+
+ // 璁$畻鐩稿鐨勮揣浣嶈鍊硷紝濂囨暟琛岀殑涓嬩竴琛屾垨鑰呭伓鏁拌鐨勪笂涓�琛�
+ int relativeLine = line % 2 == 1 ? line + 1 : line - 1;
+
+ // 鏋勫缓鏂扮殑搴撲綅ID
+ string[] newLocationParts = new string[] { relativeLine.ToString().PadLeft(3, '0'), locationInfo.Column.ToString(), locationInfo.Layer.ToString() };
+ return string.Join("-", newLocationParts);
+ }
+
+ /// <summary>
+ /// 澶勭悊娌℃湁浠诲姟鐨勫簱浣嶆儏鍐�
+ /// </summary>
+ /// <param name="originalLocationID">鍘熷搴撲綅ID</param>
+ /// <param name="newLocationID">鏂扮殑搴撲綅ID</param>
+ /// <param name="outboundTask">鍑哄簱浠诲姟</param>
+ /// <returns>鐢熸垚鐨勭Щ搴撲换鍔℃垨鍘熷鍑哄簱浠诲姟</returns>
+ private async Task<Dt_Task> HandleNoTaskAtLocation(string originalLocationID, string newLocationID, Dt_Task outboundTask)
+ {
+ // 鍒ゆ柇璇ヤ綅缃槸鍚︽湁搴撳瓨
+ var stockInfo = await _stockInfoRepository.QueryFirstAsync(x => x.LocationCode == newLocationID);
+
+ if (stockInfo == null)
+ {
+ // 濡傛灉娌℃湁搴撳瓨锛岀洿鎺ヨ繑鍥炲綋鍓嶅嚭搴撲换鍔�
+ return outboundTask;
+ }
+ else
+ {
+ // 濡傛灉鏈夊簱瀛橈紝鐢熸垚绉诲簱浠诲姟
+ var emptyLocation = await GetTransferLocationEmptyAsync(outboundTask.Roadway);
+ var taskNo = await _taskRepository.GetTaskNo();
+ Dt_Task newTransferTask = new Dt_Task()
+ {
+ CreateDate = DateTime.Now,
+ Creater = App.User.UserName,
+ CurrentAddress = originalLocationID,
+ Grade = 99,
+ NextAddress = emptyLocation.LocationCode,
+ PalletCode = stockInfo.PalletCode,
+ Remark = "绉诲簱",
+ Roadway = stockInfo.LocationDetails.RoadwayNo,
+ SourceAddress = originalLocationID,
+ TaskNum = taskNo,
+ TargetAddress = emptyLocation.LocationCode,
+ TaskType = TaskTypeEnum.Relocation.GetHashCode(),
+ };
+
+ return await _taskRepository.Db.Insertable(newTransferTask).ExecuteReturnEntityAsync();
+ }
+ }
+
+ /// <summary>
+ /// 鏍规嵁璐т綅鏄惁闇�瑕佺Щ搴�
+ /// </summary>
+ /// <param name="locationID">璐т綅ID</param>
+ /// <returns>鏄惁闇�瑕佺Щ搴�</returns>
+ private bool CheckForInternalTransfer(Dt_LocationInfo location)
+ {
+ return location.Depth == 2 ? true : false;
+ }
+
+ /// <summary>
+ /// 鏍规嵁宸烽亾鑾峰彇浜屾繁浣嶇殑绌哄簱浣�
+ /// </summary>
+ /// <param name="roadway">宸烽亾</param>
+ /// <returns>璐т綅瀵硅薄</returns>
+ private async Task<Dt_LocationInfo> GetTransferLocationEmptyAsync(string roadway)
+ {
+ return await BaseDal.QueryFirstAsync(x => x.Depth == 2 && x.LocationStatus == (LocationStatusEnum.Free.GetHashCode()) && x.RoadwayNo == roadway);
+
+ //Db.Queryable<Dt_LocationInfo>()
+ //.Where(x => x.Status == LocationEnum.Free.ObjToInt())
+ //.Where(x => x.Depth == 2.ToString())
+ //.Where(x => x.Roadway == roadway)
+ //.First();
+ }
+
+ #endregion 绉诲簱鏂规硶
+
}
}
--
Gitblit v1.9.3