From 695571c6009ecbc12e7d4a4fb147df7967a1260e Mon Sep 17 00:00:00 2001
From: wangxinhui <wangxinhui@hnkhzn.com>
Date: 星期一, 07 七月 2025 20:21:19 +0800
Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/MeiRuiAn/HuaiAn
---
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/LocationInfoService.cs | 264 ++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 253 insertions(+), 11 deletions(-)
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/LocationInfoService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/LocationInfoService.cs"
index a5bfbb3..bdba1c5 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/LocationInfoService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/LocationInfoService.cs"
@@ -16,23 +16,265 @@
using WIDESEA_IRecordService;
using WIDESEA_IBasicService;
using WIDESEA_Model.Models;
+using WIDESEA_Common.CommonEnum;
+using WIDESEA_Common.LocationEnum;
namespace WIDESEA_BasicService
{
- public partial class LocationInfoService : ServiceBase<Dt_LocationInfo, ILocationInfoRepository>, ILocationInfoService
+ public class LocationInfoService_Old
{
- private readonly IRecordService _recordService;
- public LocationInfoService(ILocationInfoRepository BaseDal, IBasicRepository basicRepository, IRecordService recordService) : base(BaseDal)
+ private readonly ILocationInfoRepository Repository;
+
+ public LocationInfoService_Old(ILocationInfoRepository repository)
{
- _basicRepository = basicRepository;
- _recordService = recordService;
+ Repository = repository;
}
- private Dictionary<string, OrderByType> _emptyAssignOrderBy = new Dictionary<string, OrderByType>()
+
+ double weightValue = 0.5;
+
+ private readonly static object _locker = new object();
+ static List<LocationCache> locationCaches = new List<LocationCache>();
+
+ /// <summary>
+ /// 璐т綅鍒嗛厤閫昏緫
+ /// </summary>
+ /// <param name="roadwayNo">宸烽亾鍙�</param>
+ /// <param name="palletType">鎵樼洏绫诲瀷</param>
+ /// <returns></returns>
+ public Dt_LocationInfo? AssignLocation(string roadwayNo, PalletTypeEnum palletType)
{
- { nameof(Dt_LocationInfo.Depth), OrderByType.Desc },
- { nameof(Dt_LocationInfo.Layer), OrderByType.Asc },
- { nameof(Dt_LocationInfo.Column), OrderByType.Asc },
- { nameof(Dt_LocationInfo.Row), OrderByType.Asc },
- };
+ lock (_locker)
+ {
+ List<LocationCache> removeItems = locationCaches.Where(x => (DateTime.Now - x.DateTime).TotalMinutes > 5).ToList();
+ int count = removeItems.Count;
+ for (int i = 0; i < count; i++)
+ {
+ locationCaches.Remove(removeItems[i]);
+ }
+
+ List<string> lockLocationCodes = locationCaches.Select(x => x.LocationCode).ToList();
+
+ List<Dt_LocationInfo> locationInfos = Repository.QueryData(x => x.RoadwayNo == roadwayNo);
+
+ //宸插畾涔夎揣浣嶇被鍨嬬殑璐т綅
+ List<Dt_LocationInfo> definedTypeLocations = locationInfos.Where(x => x.LocationType == palletType.ObjToInt()).ToList();
+
+ //鏈畾涔夌被鍨嬬殑绌鸿揣浣�
+ List<Dt_LocationInfo> undefinedTypeEmptyLocations = locationInfos.Where(x => (x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() || x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt()) && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.LocationType == LocationTypeEnum.Undefined.ObjToInt() && !lockLocationCodes.Contains(x.LocationCode)).OrderByDescending(x => x.Depth).ThenBy(x => x.Layer).ThenBy(x => x.Row).ThenBy(x => x.Column).ToList();
+
+ if (locationInfos.Count * weightValue >= definedTypeLocations.Count && undefinedTypeEmptyLocations.Count > 0)//濡傛灉宸插畾涔夌被鍨嬭揣浣嶆湭瓒呰繃姣斾緥锛屼笖鏈夋湭瀹氫箟绫诲瀷鐨勮揣浣�
+ {
+ if (palletType == PalletTypeEnum.LargePallet)
+ {
+ undefinedTypeEmptyLocations = undefinedTypeEmptyLocations.Where(x => x.Column % 2 == 1).ToList();
+ }
+ for (int i = 0; i < undefinedTypeEmptyLocations.Count; i++)
+ {
+ Dt_LocationInfo undefinedTypeEmptyLocation = undefinedTypeEmptyLocations[i];
+ Dt_LocationInfo? locationInfo = GetUsableLocation(locationInfos, undefinedTypeEmptyLocation, palletType);
+ if (locationInfo != null)
+ {
+ //UpdateLocationStatus(locationInfo.LocationCode, palletType, LocationStatusEnum.Lock);
+ locationCaches.Add(new LocationCache { LocationCode = locationInfo.LocationCode, DateTime = DateTime.Now });
+ return locationInfo;
+ }
+ }
+ }
+ else
+ {
+ List<Dt_LocationInfo> definedTypeEmptyLocations = locationInfos.Where(x => (x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() || x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt()) && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.LocationType == palletType.ObjToInt() && !lockLocationCodes.Contains(x.LocationCode)).OrderByDescending(x => x.Depth).ThenBy(x => x.Layer).ThenBy(x => x.Row).ThenBy(x => x.Column).ToList();
+
+ for (int i = 0; i < definedTypeEmptyLocations.Count; i++)
+ {
+ Dt_LocationInfo definedTypeEmptyLocation = definedTypeEmptyLocations[i];
+ Dt_LocationInfo? locationInfo = GetUsableLocation(locationInfos, definedTypeEmptyLocation, palletType);
+ if (locationInfo != null)
+ {
+ //UpdateLocationStatus(locationInfo.LocationCode, palletType, LocationStatusEnum.Lock);
+ locationCaches.Add(new LocationCache { LocationCode = locationInfo.LocationCode, DateTime = DateTime.Now });
+ return locationInfo;
+ }
+ }
+ }
+ return null;
+ }
+ }
+
+ public Dt_LocationInfo? GetUsableLocation(List<Dt_LocationInfo> locationInfos, Dt_LocationInfo undefinedTypeEmptyLocation, PalletTypeEnum palletType)
+ {
+ switch (palletType)
+ {
+ case PalletTypeEnum.LargePallet:
+ {
+ Dt_LocationInfo? nearLocation = locationInfos.FirstOrDefault(x => x.Row == undefinedTypeEmptyLocation.Row && x.Layer == undefinedTypeEmptyLocation.Layer && x.Depth == undefinedTypeEmptyLocation.Depth && x.Column == undefinedTypeEmptyLocation.Column + 1);
+ if (nearLocation != null && nearLocation.LocationStatus == LocationStatusEnum.Free.ObjToInt() && DepthLocationIsEmpty(locationInfos, undefinedTypeEmptyLocation) != null)
+ {
+ Dt_LocationInfo? locationInfo = DepthLocationIsEmpty(locationInfos, undefinedTypeEmptyLocation);
+ if (locationInfo != null)
+ {
+ return locationInfo;
+ }
+ }
+ }
+ break;
+ case PalletTypeEnum.SmallPallet:
+ {
+ Dt_LocationInfo? locationInfo = DepthLocationIsEmpty(locationInfos, undefinedTypeEmptyLocation);
+ if (locationInfo != null)
+ {
+ return locationInfo;
+ }
+ }
+ break;
+ }
+ return null;
+ }
+
+ private Dt_LocationInfo? DepthLocationIsEmpty(List<Dt_LocationInfo> locationInfos, Dt_LocationInfo undefinedTypeEmptyLocation)
+ {
+ int maxDepth = locationInfos.Max(x => x.Depth);
+ if (undefinedTypeEmptyLocation.Depth == 1 && maxDepth == 1)
+ {
+ return undefinedTypeEmptyLocation;
+ }
+ else
+ {
+ List<Dt_LocationInfo> locations = GetGroupLocations(locationInfos, undefinedTypeEmptyLocation);
+
+ List<Dt_LocationInfo> moreDepth = locations.Where(x => x.Depth > undefinedTypeEmptyLocation.Depth).ToList();
+ bool moreDepthFlag = moreDepth.FirstOrDefault(x => x.LocationStatus != LocationStatusEnum.InStock.ObjToInt()) == null;//鏌ヨ澶т簬褰撳墠璐т綅娣卞害鐨勯泦鍚堥噷鏄惁鏈夌姸鎬佷笉涓烘湁璐х殑璐т綅锛屽鏋滄槸true锛屽垯琛ㄧず娣辫揣浣嶆湁鏈浣跨敤鐨勬儏鍐�
+
+ List<Dt_LocationInfo> littleDepth = locations.Where(x => x.Depth <= undefinedTypeEmptyLocation.Depth).ToList();
+ bool littleDepthFlag = littleDepth.FirstOrDefault(x => x.LocationStatus != LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.OnlyIn.ObjToInt() && x.EnableStatus != EnableStatusEnum.Normal.ObjToInt()) == null; //鏌ヨ灏忎簬褰撳墠璐т綅娣卞害鐨勯泦鍚堥噷鏄惁鏈夌姸鎬佷笉涓虹┖锛屼笖绂佺敤鐘舵�佷笉涓虹鐢ㄤ互鍙婂彧鍏ョ殑璐т綅锛屽鏋滄槸true锛屽垯琛ㄧず娴呰揣浣嶈浣跨敤鎴栬�呰绂佺敤鐨勬儏鍐�
+
+ if (moreDepthFlag && littleDepthFlag)
+ {
+ return undefinedTypeEmptyLocation;
+ }
+ }
+ return null;
+ }
+
+ /// <summary>
+ /// 淇敼璐т綅鐘舵�佸強绫诲瀷
+ /// </summary>
+ /// <param name="locationCode">璐т綅缂栧彿</param>
+ /// <param name="palletType">鎵樼洏绫诲瀷</param>
+ /// <param name="locationStatus">璐т綅鐘舵��</param>
+ public void UpdateLocationStatus(string locationCode, PalletTypeEnum palletType, LocationStatusEnum locationStatus)
+ {
+ Dt_LocationInfo location = Repository.QueryFirst(x => x.LocationCode == locationCode);
+ List<Dt_LocationInfo> locationInfos = Repository.QueryData(x => x.RoadwayNo == location.RoadwayNo);
+
+ List<Dt_LocationInfo> locations = GetGroupLocations(locationInfos, location);
+ if (locationInfos.Max(x => x.Depth) < 3)
+ {
+ for (int i = 0; i < locations.Count; i++)
+ {
+ locations[i].LocationStatus = locationStatus.ObjToInt();
+ locations[i].LocationType = palletType.ObjToInt();
+ }
+
+ Dt_LocationInfo? nearLocation = locationInfos.FirstOrDefault(x => x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column + 1);
+ if (nearLocation != null)
+ {
+ List<Dt_LocationInfo> nearLocations = GetGroupLocations(locationInfos, nearLocation);
+ for (int i = 0; i < nearLocations.Count; i++)
+ {
+ nearLocations[i].LocationType = palletType.ObjToInt();
+ if (palletType == PalletTypeEnum.LargePallet)
+ {
+ nearLocations[i].LocationStatus = locationStatus.ObjToInt();
+ }
+ }
+ locations.AddRange(nearLocations);
+ }
+ }
+ else
+ {
+ for (int i = 0; i < locations.Count; i++)
+ {
+ locations[i].LocationStatus = locationStatus.ObjToInt();
+ locations[i].LocationType = palletType.ObjToInt();
+ }
+ }
+ Repository.UpdateData(locations);
+ }
+
+ /// <summary>
+ /// 淇敼璐т綅鐘舵�佸強绫诲瀷
+ /// </summary>
+ /// <param name="location">璐т綅瀵硅薄</param>
+ /// <param name="palletType">鎵樼洏绫诲瀷</param>
+ /// <param name="locationStatus">璐т綅鐘舵��</param>
+ public void UpdateLocationStatus(Dt_LocationInfo location, PalletTypeEnum palletType, LocationStatusEnum locationStatus)
+ {
+ List<Dt_LocationInfo> locationInfos = Repository.QueryData(x => x.RoadwayNo == location.RoadwayNo);
+
+ List<Dt_LocationInfo> locations = GetGroupLocations(locationInfos, location);
+ if (locationInfos.Max(x => x.Depth) < 3)
+ {
+ for (int i = 0; i < locations.Count; i++)
+ {
+ locations[i].LocationStatus = locationStatus.ObjToInt();
+ locations[i].LocationType = palletType.ObjToInt();
+ }
+
+ Dt_LocationInfo? nearLocation = locationInfos.FirstOrDefault(x => x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column + 1);
+ if (nearLocation != null)
+ {
+ List<Dt_LocationInfo> nearLocations = GetGroupLocations(locationInfos, nearLocation);
+ for (int i = 0; i < nearLocations.Count; i++)
+ {
+ nearLocations[i].LocationType = palletType.ObjToInt();
+ if (palletType == PalletTypeEnum.LargePallet)
+ {
+ nearLocations[i].LocationStatus = locationStatus.ObjToInt();
+ }
+ }
+ locations.AddRange(nearLocations);
+ }
+ }
+ else
+ {
+ for (int i = 0; i < locations.Count; i++)
+ {
+ locations[i].LocationStatus = locationStatus.ObjToInt();
+ locations[i].LocationType = palletType.ObjToInt();
+ }
+ }
+ Repository.UpdateData(locations);
+ }
+
+ private List<Dt_LocationInfo> GetGroupLocations(List<Dt_LocationInfo> locationInfos, Dt_LocationInfo location)
+ {
+ List<Dt_LocationInfo> groupLocations = new List<Dt_LocationInfo>() { location };
+ int maxDepth = locationInfos.Max(x => x.Depth);
+ for (int j = location.Depth + 1; j <= maxDepth; j++)
+ {
+ Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Column == location.Column && x.Layer == location.Layer);
+ if (locationInfo != null)
+ {
+ groupLocations.Add(locationInfo);
+ }
+ }
+
+ for (int j = location.Depth - 1; j >= 1; j--)
+ {
+ Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Column == location.Column && x.Layer == location.Layer);
+ if (locationInfo != null)
+ {
+ groupLocations.Add(locationInfo);
+ }
+ }
+ return groupLocations;
+ }
+ }
+
+ public class LocationCache
+ {
+ public string LocationCode { get; set; }
+
+ public DateTime DateTime { get; set; }
}
}
--
Gitblit v1.9.3