huangxiaoqiang
3 天以前 b2feeabc23454a2c9e161aa3b26d0edf938e55bd
CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
@@ -2,6 +2,7 @@
using Masuit.Tools;
using SixLabors.Fonts.Tables.AdvancedTypographic;
using SqlSugar;
using System.Linq.Expressions;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using WIDESEA_Cache;
@@ -12,6 +13,7 @@
using WIDESEA_IServices;
using WIDESEA_IStoragIntegrationServices;
using WIDESEA_Model.Models;
using WIDESEA_Repository;
using WIDESEAWCS_BasicInfoRepository;
using WIDESEAWCS_QuartzJob.Models;
@@ -35,6 +37,7 @@
    private readonly IAgingInOrOutInputService _agingInOrOutInputService; //静置\陈化
    private readonly IDt_StationManagerRepository _stationManagerRepository;
    private readonly ISys_ConfigService _configService;
    private readonly IDt_ChangeoversRepository _dt_ChangeoversRepository;
    private readonly ISimpleCacheService _simpleCacheService;
    public Dt_TaskService(IDt_TaskRepository BaseDal,
@@ -54,6 +57,7 @@
                                IStockInfoDetailRepository stockInfoDetailRepository,
                                IDt_StationManagerRepository stationManagerRepository,
                                ISys_ConfigService configService,
                                IDt_ChangeoversRepository dt_ChangeoversRepository,
                                ISimpleCacheService simpleCacheService) : base(BaseDal)
    {
        _unitOfWorkManage = unitOfWorkManage;
@@ -71,6 +75,7 @@
        _stockInfoDetailRepository = stockInfoDetailRepository;
        _stationManagerRepository = stationManagerRepository;
        _configService = configService;
        _dt_ChangeoversRepository = dt_ChangeoversRepository;
        _simpleCacheService = simpleCacheService;
    }
@@ -608,13 +613,13 @@
        }
        LogFactory.GetLog("任务完成").InfoFormat(true, "验证任务是否存在", JsonConvert.SerializeObject(task));
        if (task.TaskType == (int)TaskOutboundTypeEnum.InToOut)
        {
            return await CompleteInToOutTaskAsync(task);
        }
        // 验证库存是否存在
        var stock = await _stockInfoRepository.QueryFirstNavAsync(x => x.PalletCode == task.PalletCode);
        if (task.TaskType == (int)TaskOutboundTypeEnum.InToOut)
        {
            return await CompleteInToOutTaskAsync(task,stock);
        }
        // 根据任务类型调用相应的完成任务方法
        switch (task.TaskType)
        {
@@ -665,6 +670,11 @@
            var stock = await QueryStockInfo(input.PalletCode);
            if (stock != null)
            {
                List<string> strings = new List<string>() { "GW", "CW", "FR" };
                if (stock.AreaCode.Contains(strings))
                {
                    return content.Error($"托盘【{stock.PalletCode}】存在库存不允许入库");
                }
                Dt_Task taskNew = new Dt_Task
                {
                    Grade = 1,
@@ -977,7 +987,9 @@
                return null;
            }
            var outBoundMateriel = AppSettings.app<OutBoundMateriel>("OutBoundMateriel");
            //var outBoundMateriel = AppSettings.app<OutBoundMateriel>("OutBoundMateriel");
            var outBoundMateriel = _dt_ChangeoversRepository.QueryData(x => x.Status == "1").ToList();
            List<string>? materielCodes = outBoundMateriel.Count != 0
                ? outBoundMateriel.Where(x => x.ProductionLine == productionLine && x.ProcessCode == area.AreaCode)
                                  .Select(x => x.MaterielCode)
@@ -1030,7 +1042,9 @@
            //    materielCodes = outBoundMateriel.Where(x => x.ProductionLine == productionLine && x.ProcessCode == areaCodes[0]).Select(x => x.MaterielCode).ToList();
            //}
            var outBoundMateriel = AppSettings.app<OutBoundMateriel>("OutBoundMateriel");
            //var outBoundMateriel = AppSettings.app<OutBoundMateriel>("OutBoundMateriel");
            var outBoundMateriel = _dt_ChangeoversRepository.QueryData(x => x.Status == "1").ToList();
            List<string>? materielCodes = outBoundMateriel.Count != 0
                ? outBoundMateriel.Where(x => x.ProductionLine == productionLine && x.ProcessCode == areaCodes[0])
                                  .Select(x => x.MaterielCode)
@@ -1086,11 +1100,11 @@
                .ToList().Select(x => x.DeviceCode).ToList();
            var result = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
                .Where(x => x.ProductionLine == station.productLine)
                .WhereIF(!station.Roadway.Contains("JZSC"), x => x.ProductionLine == station.productLine)
                .Where(x => x.AreaCode == areaCode && x.IsFull == false)
                .Includes(x=>x.StockInfoDetails)
                .Includes(x => x.StockInfoDetails)
                .Where(x => x.StockInfoDetails.Any(y => y.MaterielCode == "空托盘"))
                .Includes(x=>x.LocationInfo)
                .Includes(x => x.LocationInfo)
                .WhereIF(!deviceCode.IsNullOrEmpty(), x => deviceCode.Contains(x.LocationInfo.RoadwayNo))
                .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) // 过滤条件
                .OrderBy(x => x.CreateDate) // 排序
@@ -1115,7 +1129,7 @@
    {
        return new Dt_Task
        {
            Grade = tag == 104 ? (stockInfo.LocationInfo.RoadwayNo.Contains("CWSC") ? 1 : 2) : (stockInfo.LocationInfo.RoadwayNo.Contains("CWSC") ? 2 : 1),
            Grade = tag == 104 ? (stockInfo.LocationInfo.RoadwayNo.Contains("CWSC")|| stockInfo.LocationInfo.RoadwayNo.Contains("JZSC") ? 1 : 2) : (stockInfo.LocationInfo.RoadwayNo.Contains("CWSC") || stockInfo.LocationInfo.RoadwayNo.Contains("JZSC") ? 2 : 1),
            Roadway = stockInfo.LocationInfo.RoadwayNo,
            TargetAddress = position,
            Dispatchertime = DateTime.Now,
@@ -1678,7 +1692,6 @@
    /// 获取任务信息
    /// </summary>
    /// <returns></returns>
    ///
    public WebResponseContent GetTaskInfo()
    {
        WebResponseContent content = new WebResponseContent();
@@ -1740,10 +1753,12 @@
    /// 获取货位状态
    /// </summary>
    /// <returns></returns>
    public WebResponseContent GetStockQuantity() {
    public WebResponseContent GetStockQuantity()
    {
        WebResponseContent content = new WebResponseContent();
        try {
            var location= _locationRepository.Db.Queryable<DtLocationInfo>().ToList();
        try
        {
            var location = _locationRepository.Db.Queryable<DtLocationInfo>().ToList();
            return content.OK(data: location);
@@ -1756,11 +1771,29 @@
    public WebResponseContent Getproductionvolume()
    {
        WebResponseContent content = new WebResponseContent();
        try {
        try
        {
            var now = DateTime.Now;
            var startOfDay = new DateTime(now.Year, now.Month, now.Day);
            var endOfDay1 = startOfDay.AddDays(-7);
            var taskHty= _task_HtyRepository.Db.Queryable<Dt_Task_Hty>().Where(it=>it.CreateDate> endOfDay1).ToList();
            var taskHty = _task_HtyRepository.Db.Queryable<Dt_Task_Hty>().Where(it => it.CreateDate > endOfDay1).ToList();
            return content.OK(data: taskHty);
        }
        catch (Exception ex)
        {
            return content.Error(ex.Message);
        }
    }
    public WebResponseContent Getoutput()
    {
        WebResponseContent content = new WebResponseContent();
        try
        {
            var now = DateTime.Now;
            var firstDayOfYear = new DateTime(now.Year, 1, 1);
            var taskHty = _task_HtyRepository.Db.Queryable<Dt_Task_Hty>().Where(it => it.CreateDate > firstDayOfYear&&it.TaskType==100).ToList();
            return content.OK(data: taskHty);
        }
        catch (Exception ex)
@@ -1770,16 +1803,85 @@
    }
    #endregion
    public WebResponseContent GetTimeout()
    {
        WebResponseContent content = new WebResponseContent();
        try
        {
            var now = DateTime.Now;
            // 使用Subtract方法
            var threeHoursAgo = now.Subtract(TimeSpan.FromHours(3));
        #endregion 外部接口方法
            List<DtStockInfo> dtStocks = _stockInfoRepository.Db.Queryable<DtStockInfo>()
                               .Where(x => x.OutboundTime < threeHoursAgo).ToList();
            return content.OK1(total1: dtStocks.Count, data: dtStocks);
        }
        catch (Exception ex)
        {
            return content.Error(ex.Message);
        }
        #region 内部调用方法
    }
        /// <summary>
        /// 创建一个新的任务
        /// </summary>
        /// <param name="model">任务模型</param>
        /// <returns>创建的任务</returns>
    public WebResponseContent Getproductionstatistics()
    {
        WebResponseContent content = new WebResponseContent();
        try
        {
            var now = DateTime.Now;
            var thirtyDaysAgo = now.AddDays(-30);
            var roadwayMappings = new Dictionary<string, string> {
                    { "JZ", "静置库" },
                    { "CH", "陈化库" },
                    { "FR", "分容库" },
                    { "GW", "高温库" },
                    { "CW", "常温库" }
                };
            var roadwayKeys = roadwayMappings.Keys.ToArray();
            var taskHty = _task_HtyRepository.Db.Queryable<Dt_Task_Hty>()
                .Where(it =>
                    it.CreateDate >= thirtyDaysAgo &&
                    it.CreateDate <= now &&
                    it.TaskType == 100 &&
                    roadwayKeys.Any(rk => it.Roadway.Contains(rk)))
                .ToList()
                .Select(t => new {
                    OriginalRoadway = t.Roadway,
                    MatchedKey = roadwayKeys.FirstOrDefault(rk => t.Roadway.Contains(rk)),
                    CreateDate = t.CreateDate
                })
                .Where(t => t.MatchedKey != null)
                .GroupBy(t => new {
                    RoadwayKey = t.MatchedKey,
                    Date = t.CreateDate.Date,
                    Hour = t.CreateDate.Hour
                })
                .OrderByDescending(group => group.Key.Date)
                .ThenByDescending(group => group.Key.Hour)
                .Select(group => new {
                    Hour = $"{group.Key.Date:yyyy/M/d} {group.Key.Hour}:00",
                    Count = group.Count(),
                    Roadway = roadwayMappings[group.Key.RoadwayKey] // 映射为中文名称
                })
                .ToList();
            return content.OK1(total1: taskHty.Count, data: taskHty);
        }
        catch (Exception ex)
        {
            return content.Error(ex.Message);
        }
    }
    #endregion 外部接口方法
    #region 内部调用方法
    /// <summary>
    /// 创建一个新的任务
    /// </summary>
    /// <param name="model">任务模型</param>
    /// <returns>创建的任务</returns>
    public async Task<Dt_Task> Create(Dt_Task model)
    {
        return await BaseDal.Create(model);
@@ -1821,20 +1923,23 @@
        // 创建历史任务实例模型
        try
        {
            Dt_Task task = BaseDal.QueryFirst(x => x.TaskId == Convert.ToInt32(key[0]));
            if (task == null)
            foreach (var item in key)
            {
                return content.Error("未找到任务信息!");
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskId == Convert.ToInt32(key));
                if (task == null)
                {
                    return content.Error("未找到任务信息!");
                }
                var taskHtyNG = CreateHistoricalTask(task, true);
                // 执行数据库事务
                // 添加历史任务
                var isTaskHtyAdd = _task_HtyRepository.AddData(taskHtyNG) > 0;
                // 删除任务数据
                var isTaskDelete = BaseDal.Delete(task.TaskId);
            }
            var taskHtyNG = CreateHistoricalTask(task, true);
            // 执行数据库事务
            // 添加历史任务
            var isTaskHtyAdd = _task_HtyRepository.AddData(taskHtyNG) > 0;
            // 删除任务数据
            var isTaskDelete = BaseDal.Delete(task.TaskId);
            return content.OK("删除成功!");
        }
@@ -2064,32 +2169,32 @@
            }
            #region 更新库存信息(暂时不需要)
            if (stock.IsFull)
            {
                // 查询符合条件的库存信息
                var stocks = _stockInfoRepository.QueryData(x => x.AreaCode == stock.AreaCode && x.ProductionLine == stock.ProductionLine && x.SpecialParameterDuration != stock.SpecialParameterDuration);
            //if (stock.IsFull)
            //{
            //    // 查询符合条件的库存信息
            //    var stocks = _stockInfoRepository.QueryData(x => x.AreaCode == stock.AreaCode && x.ProductionLine == stock.ProductionLine && x.SpecialParameterDuration != stock.SpecialParameterDuration);
                // 查询任务信息
                var tasks = BaseDal.QueryData(x => x.PalletCode != stock.PalletCode && x.ProductionLine == stock.ProductionLine).Select(x => x.PalletCode).ToList();
            //    // 查询任务信息
            //    var tasks = BaseDal.QueryData(x => x.PalletCode != stock.PalletCode && x.ProductionLine == stock.ProductionLine).Select(x => x.PalletCode).ToList();
                if (stocks != null && stocks.Count > 0)
                {
                    // 过滤出需要更新的库存信息
                    var stocksToUpdate = stocks.Where(item => !tasks.Contains(item.PalletCode)).ToList();
                    foreach (var item in stocksToUpdate)
                    {
                        // 更新库存信息的特定参数
                        item.SpecialParameterDuration = stock.SpecialParameterDuration;
                        item.ParameterInfos = stock.ParameterInfos;
                        item.OutboundTime = Convert.ToDateTime(item.LinedProcessFeedbackTime == null ? item.CreateDate : item.LinedProcessFeedbackTime).AddHours(Convert.ToDouble(stock.SpecialParameterDuration));
                    }
                    if (stocksToUpdate.Count > 0)
                    {
                        // 异步更新库存信息
                        var isUpdates = await _stockInfoRepository.UpdateDataAsync(stocksToUpdate);
                    }
                }
            }
            //    if (stocks != null && stocks.Count > 0)
            //    {
            //        // 过滤出需要更新的库存信息
            //        var stocksToUpdate = stocks.Where(item => !tasks.Contains(item.PalletCode)).ToList();
            //        foreach (var item in stocksToUpdate)
            //        {
            //            // 更新库存信息的特定参数
            //            item.SpecialParameterDuration = stock.SpecialParameterDuration;
            //            item.ParameterInfos = stock.ParameterInfos;
            //            item.OutboundTime = Convert.ToDateTime(item.LinedProcessFeedbackTime == null ? item.CreateDate : item.LinedProcessFeedbackTime).AddHours(Convert.ToDouble(stock.SpecialParameterDuration));
            //        }
            //        if (stocksToUpdate.Count > 0)
            //        {
            //            // 异步更新库存信息
            //            var isUpdates = await _stockInfoRepository.UpdateDataAsync(stocksToUpdate);
            //        }
            //    }
            //}
            #endregion
            // 添加历史任务
@@ -2146,10 +2251,10 @@
                // 获取目标地址和更新任务状态
                input.Position = Regex.Replace(input.Position, @"-(\d+)", "");
                if (Convert.ToInt32(input.Position) > 1999)
                {
                    input.Position = (Convert.ToInt32(input.Position) - 1000).ToString();
                }
                //if (Convert.ToInt32(input.Position) > 1999)
                //{
                //    input.Position = (Convert.ToInt32(input.Position) - 1000).ToString();
                //}
                if (task.TaskType == (int)TaskInboundTypeEnum.InNG)
                {
@@ -2264,7 +2369,10 @@
            ToAddress = await GetRoadWayAsync(process);
        else
            ToAddress = process[0];
        if (string.IsNullOrEmpty(ToAddress))
        {
            return content.Error("无法获取目标地址");
        }
        // 创建新任务实例
        var task = new Dt_Task
        {