using HslCommunication.WebSocket; using Magicodes.ExporterAndImporter.Core; using Magicodes.ExporterAndImporter.Excel; using MathNet.Numerics.Statistics.Mcmc; using NPOI.Util.Collections; 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; using WIDESEA_Core; using WIDESEA_Core.Enums; using WIDESEA_DTO.Basic; using WIDESEAWCS_Common; using WIDESEAWCS_Common.WareHouseEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.BaseRepository; using WIDESEAWCS_Core.BaseServices; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_Core.Utilities; using WIDESEAWCS_IBasicInfoRepository; using WIDESEAWCS_IBasicInfoService; using WIDESEAWCS_Model.Models; namespace WIDESEAWCS_BasicInfoService { public class LocationCache { public string LocationCode { get; set; } public DateTime DateTime { get; set; } } public partial class LocationInfoService : ServiceBase, ILocationInfoService { private readonly IUnitOfWorkManage _unitOfWorkManage; public ILocationInfoRepository Repository => BaseDal; public LocationInfoService(ILocationInfoRepository BaseDal, IUnitOfWorkManage unitOfWorkManage) : base(BaseDal) { _unitOfWorkManage = unitOfWorkManage; } /// /// 批量启用货位 /// /// 货位主键数组 /// public WebResponseContent LocationEnableStatus(int[] keys) { List locationInfos = Repository.QueryData(x => keys.Contains(x.Id)); locationInfos.ForEach(x => { x.EnableStatus = EnableStatusEnum.Normal.ObjToInt(); }); Repository.UpdateData(locationInfos); return WebResponseContent.Instance.OK(); } /// /// 批量禁用货位 /// /// 货位主键数组 /// public WebResponseContent LocationDisableStatus(int[] keys) { List locationInfos = Repository.QueryData(x => keys.Contains(x.Id)); locationInfos.ForEach(x => { x.EnableStatus = EnableStatusEnum.Disable.ObjToInt(); }); Repository.UpdateData(locationInfos); return WebResponseContent.Instance.OK(); } /// /// 单个启用货位 /// /// 货位主键 /// public WebResponseContent LocationEnableStatus(int key) { return LocationEnableStatus(new int[] { key }); } /// /// 单个禁用货位 /// /// 货位主键 /// public WebResponseContent LocationDisableStatus(int key) { return LocationDisableStatus(new int[] { key }); } private readonly static object _locker = new object(); private static List locationCaches = new List(); /// /// 分配货位 /// public Dt_LocationInfo? AssignLocation() { lock (_locker) { List removeItems = locationCaches.Where(x => (DateTime.Now - x.DateTime).TotalMinutes > 5).ToList();//查询添加静态变量超过5分钟的货位 int count = removeItems.Count; for (int i = 0; i < count; i++) { locationCaches.Remove(removeItems[i]);//移除查询添加静态变量超过5分钟的货位 } List lockLocations = locationCaches.Select(x => x.LocationCode).ToList(); Dictionary orderBy = new Dictionary() { { nameof(Dt_LocationInfo.Row),OrderByType.Asc }, { nameof(Dt_LocationInfo.Layer),OrderByType.Asc }, { nameof(Dt_LocationInfo.Columns),OrderByType.Desc }, }; Dt_LocationInfo locationInfo = BaseDal.QueryFirst(x => x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && !lockLocations.Contains(x.LocationCode), orderBy);//查询空货位信息并排除5分钟内分配的货位,根据层、列、深度、行排序 if (locationInfo!=null) { LocationCache locationCache = new LocationCache() { LocationCode = locationInfo.LocationCode, DateTime = DateTime.Now, }; locationCaches.Add(locationCache); } return locationInfo; } } /// /// 初始化货位 /// /// /// public WebResponseContent InitializationLocation(InitializationLocationDTO initializationLocationDTO) { try { List locationInfos = new List(); for (int i = 0; i < initializationLocationDTO.MaxRow; i++) { for (int j = 0; j < initializationLocationDTO.MaxColumn; j++) { for (int k = 0; k < initializationLocationDTO.MaxLayer; k++) { Dt_LocationInfo locationInfo = new Dt_LocationInfo() { WarehouseId = 0, Columns = j + 1, EnableStatus = EnableStatusEnum.Normal.ObjToInt(), Layer = k + 1, LocationStatus = LocationStatusEnum.Free.ObjToInt(), RoadwayNo = $"{initializationLocationDTO.Roadway}", Row = i + 1, }; locationInfo.LocationCode = $"{locationInfo.RoadwayNo}-{locationInfo.Row.ToString().PadLeft(3, '0')}-{locationInfo.Columns.ToString().PadLeft(3, '0')}-{locationInfo.Layer.ToString().PadLeft(3, '0')}"; locationInfo.LocationName = $"{locationInfo.RoadwayNo}巷道{locationInfo.Row.ToString().PadLeft(3, '0')}行{locationInfo.Columns.ToString().PadLeft(3, '0')}列{locationInfo.Layer.ToString().PadLeft(3, '0')}层"; int point = 0; if (locationInfo.Row%2==0) { point = locationInfo.Row / 2; } else { if (locationInfo.Row==1) { point = 1; } else { point = (locationInfo.Row / 2)+1; } } locationInfo.AgvPoint = $"{point.ToString().PadLeft(2, '0')}-{locationInfo.Columns.ToString().PadLeft(2, '0')}"; locationInfos.Add(locationInfo); } } } BaseDal.AddData(locationInfos); return WebResponseContent.Instance.OK(); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } public override WebResponseContent Export(PageDataOptions options) { WebResponseContent content = new WebResponseContent(); try { string savePath = AppDomain.CurrentDomain.BaseDirectory + $"ExcelExport"; IExporter exporter = new ExcelExporter(); options.Page = 1; options.Rows = 30; options.Order = "asc"; options.Sort = "id"; string where = string.Empty; ISugarQueryable sugarQueryable = BaseDal.Db.Queryable(); if (!string.IsNullOrEmpty(options.Wheres)) { try { List searchParametersList = options.Wheres.DeserializeObject>(); if (searchParametersList?.Any() == true) { foreach (var param in searchParametersList) { switch (param.Name) { } } } } catch (Exception ex) { } } byte[] data = exporter.ExportAsByteArray(sugarQueryable.ToList()).Result; string fileName = "库位信息.xlsx"; FileHelper.WriteFile(savePath, fileName, data); content = WebResponseContent.Instance.OK(data: savePath + "\\" + fileName); } catch (Exception ex) { content = WebResponseContent.Instance.Error(ex.Message); } return content; } } }