xxyy
2025-03-06 c51aaf0a95836b83bb4c209556cfddaf42ea3314
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
@@ -1,7 +1,9 @@
using Autofac.Core;
using Mapster;
using Mapster;
using Masuit.Tools;
using NewLife.Caching;
using SqlSugar;
using System.Text.RegularExpressions;
using WIDESEA_Cache;
using WIDESEA_Core.Const;
using WIDESEA_DTO.MOM;
using WIDESEA_DTO.WMS;
@@ -9,7 +11,6 @@
using WIDESEA_IStoragIntegrationServices;
using WIDESEAWCS_BasicInfoRepository;
using WIDESEAWCS_QuartzJob.Models;
namespace WIDESEA_StorageTaskServices;
@@ -31,6 +32,7 @@
    private readonly IAgingInOrOutInputService _agingInOrOutInputService; //静置\陈化
    private readonly IDt_StationManagerRepository _stationManagerRepository;
    private readonly ISys_ConfigService _configService;
    private readonly ISimpleCacheService _simpleCacheService;
    public Dt_TaskService(IDt_TaskRepository BaseDal,
                                IUnitOfWorkManage unitOfWorkManage,
@@ -48,7 +50,8 @@
                                IAgingInOrOutInputService agingInOrOutInputService,
                                IStockInfoDetailRepository stockInfoDetailRepository,
                                IDt_StationManagerRepository stationManagerRepository,
                                ISys_ConfigService configService) : base(BaseDal)
                                ISys_ConfigService configService,
                                ISimpleCacheService simpleCacheService) : base(BaseDal)
    {
        _unitOfWorkManage = unitOfWorkManage;
        _stockInfoRepository = stockInfoRepository;
@@ -65,6 +68,7 @@
        _stockInfoDetailRepository = stockInfoDetailRepository;
        _stationManagerRepository = stationManagerRepository;
        _configService = configService;
        _simpleCacheService = simpleCacheService;
    }
    #region 外部接口方法
@@ -446,6 +450,9 @@
            if (isResult)
            {
                _locationStatusChangeRecordRepository.AddLocationStatusChangeRecord(locationInf, lastStatus, (int)StatusChangeTypeEnum.AutomaticStorage, task.TaskNum);
                _simpleCacheService.HashAdd(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, stock.PalletCode, stock);
                content.OK("入库任务完成成功");
            }
            else
@@ -1001,7 +1008,6 @@
                    return content.Error(result.MOMMessage);
            }
            if (result.SerialNos.Count <= 0)
            {
                var config = _configService.GetByConfigKey(CateGoryConst.CONFIG_SYS_InStacker, SysConfigConst.InboundIsEmpty);
@@ -1118,7 +1124,6 @@
                return content.Error("当前托盘无产线,联系MOM添加产线");
            }
            var stationManagers = _stationManagerRepository.QueryData(x => x.stationType == 6 && x.stationChildCode == input.Position).FirstOrDefault();
            if (stationManagers == null)
            {
@@ -1206,7 +1211,6 @@
            //ConsoleHelper.WriteColorLine(JsonConvert.SerializeObject(stockInfo), ConsoleColor.DarkMagenta);
            // 新增重复任务校验
            var hasTask = BaseDal.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
            if (hasTask != null)
@@ -1251,20 +1255,98 @@
    private async Task<DtStockInfo> QueryStockInfoForRealTrayAsync(string areaCode, List<string> devices, string productionLine)
    {
        var area = await _areaInfoRepository.QueryFirstAsync(x => x.AreaCode == areaCode);
        if (area == null)
        {
            ConsoleHelper.WriteErrorLine($"查询实盘库存信息时,未找到区域代码为{areaCode}的数据");
            return null;
        }
        var result = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
            .Includes(x => x.LocationInfo) // 预加载LocationInfo
            .Includes(x => x.StockInfoDetails) // 预加载StockInfoDetails
            .Where(x => x.AreaCode == areaCode && x.OutboundTime < DateTime.Now && x.IsFull == true) // 过滤条件
            .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine)
            .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) // 过滤条件
            .WhereIF(!devices.IsNullOrEmpty(), x => devices.Contains(x.LocationInfo.RoadwayNo))
            .OrderBy(x => x.OutboundTime) // 排序
            .FirstAsync(); // 获取第一个元素
        var outBoundMateriel = AppSettings.app<OutBoundMateriel>("OutBoundMateriel");
        List<string>? materielCodes = outBoundMateriel.Count != 0
            ? outBoundMateriel.Where(x => x.ProductionLine == productionLine && x.ProcessCode == area.AreaCode)
                              .Select(x => x.MaterielCode)
                              .ToList()
            : null;
        //var firstOrDefault = result.FirstOrDefault(x => roadways.Contains(x.LocationInfo.RoadwayNo)); // 查找第一个匹配的元素
        //var firstOrDefault = result[0]; // 查找第一个匹配的元素
        //return firstOrDefault;
        IDictionary<string, DtStockInfo>? stockInfos = _simpleCacheService.HashGetAll<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo);
        List<DtStockInfo> stockInfoList = stockInfos.Values.ToList();
        var result = new DtStockInfo();
        //if (stockInfoList.IsNullOrEmpty())
        //{
        //    stockInfoList = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
        //        .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock).IncludesAllFirstLayer().ToListAsync();
        //}
        result = stockInfoList.Where(x => x.AreaCode == areaCode && x.OutboundTime < DateTime.Now && x.IsFull)
                          .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine)
                          .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable)
                          .WhereIF(!devices.IsNullOrEmpty(), x => devices.Contains(x.LocationInfo.RoadwayNo))
                          .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode)))
                          .OrderBy(x => x.OutboundTime)
                          .FirstOrDefault();
        if (result != null)
        {
            stockInfoList = stockInfoList.Where(x => x != result).ToList();
            _simpleCacheService.HashDel<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, new string[] { result.PalletCode });
        }
        return result;
        if (stockInfoList.IsNullOrEmpty())
        {
            stockInfoList = await _stockInfoRepository.Db.Queryable<DtStockInfo>().IncludesAllFirstLayer().ToListAsync();
            result = stockInfoList.Where(x => x.AreaCode == areaCode && x.OutboundTime < DateTime.Now && x.IsFull == true)
                .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine)
                .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) // 过滤条件
                .WhereIF(!devices.IsNullOrEmpty(), x => devices.Contains(x.LocationInfo.RoadwayNo))
                .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode)))
                .OrderBy(x => x.OutboundTime) // 排序
                .FirstOrDefault(); // 获取第一个元素
            if (result != null)
            {
                // 排除 result 中的元素
                stockInfoList = stockInfoList.Where(x => x != result).ToList();
            }
            foreach (var item in stockInfoList)
            {
                _simpleCacheService.HashAdd(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, item.PalletCode, item);
            }
        }
        else
        {
            result = stockInfoList.Where(x => x.AreaCode == areaCode && x.OutboundTime < DateTime.Now && x.IsFull == true)
                .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine)
                .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) // 过滤条件
                .WhereIF(!devices.IsNullOrEmpty(), x => devices.Contains(x.LocationInfo.RoadwayNo))
                .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode)))
                .OrderBy(x => x.OutboundTime) // 排序
                .FirstOrDefault(); // 获取第一个元素
            if (result != null)
            {
                // 排除 result 中的元素
                stockInfoList = stockInfoList.Where(x => x != result).ToList();
            }
            string[] xfasd = new string[] { result.PalletCode };
            _simpleCacheService.HashDel<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, new string[] { result.PalletCode });
        }
        #region
        //var result = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
        //    .Includes(x => x.LocationInfo) // 预加载LocationInfo
        //    .Includes(x => x.StockInfoDetails) // 预加载StockInfoDetails
        //    .Where(x => x.AreaCode == areaCode && x.OutboundTime < DateTime.Now && x.IsFull == true) // 过滤条件
        //    .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine)
        //    .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) // 过滤条件
        //    .WhereIF(!devices.IsNullOrEmpty(), x => devices.Contains(x.LocationInfo.RoadwayNo))
        //    .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode)))
        //    .OrderBy(x => x.OutboundTime) // 排序
        //    .FirstAsync(); // 获取第一个元素
        #endregion 请求出库(实盘&空盘)
        return result;
    }
@@ -1280,25 +1362,43 @@
            return null;
        }
        var devices = SqlSugarHelper.DbWCS.Queryable<Dt_DeviceInfo>()
        //var outBoundMateriel = AppSettings.app<OutBoundMateriel>("OutBoundMateriel");
        //List<string> materielCodes = null;
        //if (outBoundMateriel.Count != 0)
        //{
        //    materielCodes = outBoundMateriel.Where(x => x.ProductionLine == productionLine && x.ProcessCode == areaCodes[0]).Select(x => x.MaterielCode).ToList();
        //}
        var outBoundMateriel = AppSettings.app<OutBoundMateriel>("OutBoundMateriel");
        List<string>? materielCodes = outBoundMateriel.Count != 0
            ? outBoundMateriel.Where(x => x.ProductionLine == productionLine && x.ProcessCode == areaCodes[0])
                              .Select(x => x.MaterielCode)
                              .ToList()
            : null;
        var deviceCode = SqlSugarHelper.DbWCS.Queryable<Dt_DeviceInfo>()
            .Where(x => x.DeviceStatus == "1")
            .Where(x => x.DeviceCode.Contains("CWSC"))
            .ToList();
        var deviceCode = devices.Select(x => x.DeviceCode).ToList();
            .ToList().Select(x => x.DeviceCode).ToList();
        //var deviceCode = devices.Select(x => x.DeviceCode).ToList();
        var result = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
            .Includes(x => x.LocationInfo) // 预加载LocationInfo
            .Includes(x => x.StockInfoDetails) // 预加载StockInfoDetails
            .Where(x => areaCodes.Contains(x.AreaCode) && x.OutboundTime < DateTime.Now && x.IsFull == true) // 过滤条件
        IDictionary<string, DtStockInfo>? stockInfos = _simpleCacheService.HashGetAll<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo);
        List<DtStockInfo> stockInfoList = stockInfos.Values.ToList();
        var result = stockInfoList.Where(x => areaCodes.Contains(x.AreaCode) && x.OutboundTime < DateTime.Now && x.IsFull == true) // 过滤条件
            .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine)
            .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && areaId.Contains(x.LocationInfo.AreaId) && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) // 过滤条件
            .WhereIF(!deviceCode.IsNullOrEmpty(), x => deviceCode.Contains(x.LocationInfo.RoadwayNo))
            .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode)))
            .OrderBy(x => x.OutboundTime) // 排序
            .FirstAsync(); // 获取第一个元素
            .FirstOrDefault(); // 获取第一个元素
        //var firstOrDefault = result.FirstOrDefault(x => roadways.Contains(x.LocationInfo.RoadwayNo)); // 查找第一个匹配的元素
        //var firstOrDefault = result[0]; // 查找第一个匹配的元素
        //return firstOrDefault;
        if (result != null)
        {
            stockInfoList = stockInfoList.Where(x => x != result).ToList();
            _simpleCacheService.HashDel<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, new string[] { result.PalletCode });
        }
        return result;
    }
@@ -1315,27 +1415,28 @@
        ConsoleHelper.WriteColorLine(station.Roadway, ConsoleColor.Magenta);
        var stackers = station.Roadway.Split(',').ToList();
        var devices = SqlSugarHelper.DbWCS.Queryable<Dt_DeviceInfo>()
        var deviceCode = SqlSugarHelper.DbWCS.Queryable<Dt_DeviceInfo>()
            .Where(x => x.DeviceStatus == "1")
            .Where(x => stackers.Contains(x.DeviceCode))
            .ToList();
            .ToList().Select(x => x.DeviceCode).ToList();
        var deviceCode = devices.Select(x => x.DeviceCode).ToList();
        IDictionary<string, DtStockInfo>? stockInfos = _simpleCacheService.HashGetAll<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo);
        List<DtStockInfo> stockInfoList = stockInfos.Values.ToList();
        var result = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
            .Includes(x => x.LocationInfo) // 预加载LocationInfo
            .Includes(x => x.StockInfoDetails) // 预加载StockInfoDetails
            .Where(x => x.ProductionLine == station.productLine)
        var result = stockInfoList.Where(x => x.ProductionLine == station.productLine)
            .Where(x => x.AreaCode == areaCode && x.IsFull == false)
            .Where(x => x.StockInfoDetails.Any(y => y.MaterielCode == "空托盘"))
            .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) // 过滤条件
            .WhereIF(!deviceCode.IsNullOrEmpty(), x => deviceCode.Contains(x.LocationInfo.RoadwayNo))
            .OrderBy(x => x.CreateDate) // 排序
            .FirstAsync(); // 转换为列表
            .FirstOrDefault(); // 转换为列表
        //var firstOrDefault = result[0]; // 查找第一个匹配的元素
        //return firstOrDefault;
        if (result != null)
        {
            stockInfoList = stockInfoList.Where(x => x != result).ToList();
            _simpleCacheService.HashDel<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, new string[] { result.PalletCode });
        }
        return result;
    }
@@ -1662,7 +1763,7 @@
        //    content.Error(ex.Message);
        //}
        //return content;
        #endregion
        #endregion 静置异常口入库
        WebResponseContent content = new WebResponseContent();
        try
        {
@@ -1804,7 +1905,6 @@
        return content;
    }
    private WMSTaskDTO CreateWMSTaskDTO(object source)
    {
        if (source is Dt_Task taskOld)
@@ -1848,8 +1948,6 @@
    #endregion 静置异常口入库
    #endregion 外部接口方法
    #region 内部调用方法
@@ -2130,7 +2228,6 @@
                }
            }
            // 添加历史任务
            var isTaskHtyAdd = await _task_HtyRepository.AddDataAsync(taskHty) > 0;
@@ -2163,7 +2260,6 @@
    }
    #region 任务请求方法
    private static readonly SemaphoreSlim _semaphoreUpdate = new SemaphoreSlim(1, 1);
    // 更新任务货位
@@ -2251,7 +2347,6 @@
        }
        catch (Exception)
        {
            throw;
        }
        finally { _semaphoreUpdate.Release(); }
@@ -2365,8 +2460,8 @@
        return content;
    }
    private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
    /// <summary>
    /// 查找货位
    /// </summary>