Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Partial/Dt_TaskService.cs
@@ -1,9 +1,13 @@
using Masuit.Tools;
using Mapster;
using Masuit.Tools;
using SixLabors.Fonts.Tables.AdvancedTypographic;
using SqlSugar;
using WIDESEA_Common.CustomModels;
using WIDESEA_Core.Const;
using WIDESEA_DTO;
using WIDESEA_DTO.MOM;
using WIDESEA_DTO.WMS;
using WIDESEA_Model.Models;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob.Models;
@@ -183,6 +187,12 @@
            if (!result.Success)
            {
                List<string> strings = new List<string>() { "2036","2038","2084","2086"};
                if (input.Position.Contains(strings))
                {
                    Console.WriteLine($"{result.MOMMessage}");
                    return null;
                }
                var taskNG = new Dt_Task
                {
                    CurrentAddress = input.Position,
@@ -203,6 +213,7 @@
                    ProcessCode = result.ProcessCode,
                };
                return taskNG;
            }
            if (result.SerialNos.Count <= 0)
@@ -586,17 +597,50 @@
    #region 直接出库任务完成
    public async Task<WebResponseContent> CompleteInToOutTaskAsync(Dt_Task task)
    public async Task<WebResponseContent> CompleteInToOutTaskAsync(Dt_Task task,DtStockInfo stock)
    {
        WebResponseContent content = new WebResponseContent();
        try
        {
            //添加历史
            var taskHty = CreateHistoricalTask(task);
            // 添加历史任务
            var isTaskHtyAdd = await _task_HtyRepository.AddDataAsync(taskHty) > 0;
            //删除任务
            BaseDal.DeleteData(task);
            DtStockInfo_Hty stockInfo_Hty = null;
            if (stock != null)
            {
                stockInfo_Hty = stock.Adapt<DtStockInfo_Hty>();
                stockInfo_Hty.ModifyDate = DateTime.Now;
            }
            var taskHty = task.Adapt<Dt_Task_Hty>();
            taskHty.FinishTime = DateTime.Now;
            taskHty.OperateType = App.User.UserName != null ? (int)OperateTypeEnum.人工完成 : (int)OperateTypeEnum.自动完成;
            taskHty.Creater = App.User.UserName != null ? App.User.UserName : "System";
            var location = _locationRepository.QueryFirst(x => x.LocationCode == task.SourceAddress && x.RoadwayNo == task.Roadway);
            if(location != null)
            {
                int lastStatus = location.LocationStatus;
                location.LocationStatus = (int)LocationEnum.Free;
                _locationStatusChangeRecordRepository.AddLocationStatusChangeRecord(location, lastStatus, (int)StatusChangeTypeEnum.AutomaticDelivery, task.TaskNum);
            }
            task.TaskState = (int)TaskOutStatusEnum.OutFinish;
            // 事务处理
            await _unitOfWorkManage.UseTranAsync(async () =>
            {
                if (stockInfo_Hty != null)
                {
                    await DeleteStockInfoAsync(stock.Id);
                    await DeleteStockInfoDetailsAsync(stock.StockInfoDetails);
                    await AddStockInfoHtyAsync(stockInfo_Hty);
                }
                if (location != null)
                {
                    await UpdateLocationAsync(location);
                }
                await DeleteTaskAsync(task.TaskId);
                await AddTaskHtyAsync(taskHty);
            });
            return content.OK();
        }
@@ -1038,20 +1082,36 @@
            Dt_StationManager station = _stationManagerRepository.QueryFirst(x => x.stationChildCode == json.Position && x.stationType == 12 && x.stationArea == "Call");
            if (station == null) { throw new Exception($"未找到包装站台信息,请检查传入参数{json.Position}"); }
            EqptRunDto basic = new EqptRunDto()
            {
                EquipmentModel = "0",
                Password ="",
                EmployeeNo = "82412152",
                SessionId = Guid.NewGuid().ToString(),
                RequestTime = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now).ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),
                Software = "包装上料",
                EquipmentCode = station.stationEquipMOM,
            };
            var result = _agingInOrOutInputService.Change(basic).Result;
            var respone = JsonConvert.DeserializeObject<EqptRunDTO>(result.Data.ToString());
            if(!result.Status || !respone.Success)
            {
                throw new Exception($"{station.productLine}获取MOM换型数据异常,异常信息{respone.MOMMessage}");
            }
            var deviceCode = SqlSugarHelper.DbWCS.Queryable<Dt_DeviceInfo>()
                .Where(x => x.DeviceStatus == "1")
                .Where(x => x.DeviceCode.Contains("CWSC")) // 过滤条件
                .ToList().Select(x => x.DeviceCode).ToList();
            //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 == station.productLine && x.ProcessCode == "CWSC3")
                                  .Select(x => x.MaterielCode)
                                  .ToList()
                : null;
            //var outBoundMateriel = _dt_ChangeoversRepository.QueryData(x => x.Status == "1").ToList();
            //List<string>? materielCodes = outBoundMateriel.Count != 0
            //    ? outBoundMateriel.Where(x => x.ProductionLine == station.productLine && x.ProcessCode == "CWSC3")
            //                      .Select(x => x.MaterielCode)
            //                      .ToList()
            //    : null;
            #region
            #region Redis缓存查询代码
            //// 从缓存中获取库存信息
            //IDictionary<string, DtStockInfo>? stockInfos = _simpleCacheService.HashGetAll<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo);
            //List<DtStockInfo> stockInfoList = stockInfos.Values.ToList();
@@ -1071,22 +1131,45 @@
            //    .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails != null && x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode)))
            //    .FirstOrDefault();
            // 修改后的查询代码
            #endregion
            var stockInfo = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
                                .Includes(x => x.LocationInfo)
                                .Includes(x => x.StockInfoDetails)
                                .Where(x => x.ProductionLine == station.productLine)
                                .Where(x => x.AreaCode == "CWSC3" && x.IsFull == true)
                                // 增加对 LocationInfo 的空值检查
                                .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock)
                                // 增加对 LocationInfo 的空值检查
                                .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();
            //var stockInfo = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
            //                    .Includes(x => x.LocationInfo)
            //                    .Includes(x => x.StockInfoDetails)
            //                    .Where(x => x.ProductionLine == station.productLine)
            //                    .Where(x => x.AreaCode == "CWSC3" && x.IsFull == true)
            //                    // 增加对 LocationInfo 的空值检查
            //                    .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock)
            //                    // 增加对 LocationInfo 的空值检查
            //                    .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();
            #endregion
            if (stockInfo == null) throw new Exception($"库内{station.productLine}无满足条件的库存可出库");
            DtStockInfo stockInfo = null;
            var stockInfoList = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
                .Includes(x => x.LocationInfo)
                .Where(x => x.ProductionLine == station.productLine
                        && x.AreaCode == "CWSC3"
                        && x.IsFull == true
                        && x.LocationInfo.LocationStatus == (int)LocationEnum.InStock)
                .WhereIF(!deviceCode.IsNullOrEmpty(), x => deviceCode.Contains(x.LocationInfo.RoadwayNo))
                .OrderBy(x => x.OutboundTime)
                .ToListAsync();
            foreach (var stock in stockInfoList)
            {
                var hasMatchingDetail = await _stockInfoRepository.Db.Queryable<DtStockInfoDetail>()
                    .Where(d => d.StockId == stock.Id && respone.PreProductNo.Contains(d.MaterielCode))
                    .AnyAsync();
                if (hasMatchingDetail)
                {
                    stockInfo = stock;
                    break;
                }
            }
            if (stockInfo == null) throw new Exception($"CWSC3库内【{station.productLine}】,【物料编码{respone.PreProductNo}】无满足条件的库存可出库");
            DtLocationInfo locationInfo = _locationRepository.QueryFirst(x => x.AreaId == 5 && x.LocationCode == stockInfo.LocationCode);
@@ -1107,14 +1190,12 @@
                SourceAddress = stockInfo.LocationCode,
                TaskState = (int)TaskOutStatusEnum.OutNew,
                TaskType = (int)TaskOutboundTypeEnum.Outbound,
                TaskNum = await BaseDal.GetTaskNo(),
                TaskNum = BaseDal.GetTaskNo().Result,
                Creater = "System",
                ProductionLine = stockInfo.ProductionLine,
                ProcessCode = stockInfo.ProcessCode,
            };
            WMSTaskDTO taskDTO = CreateTaskDTO(task);
            int lastStatus = locationInfo.LocationStatus;
            BaseDal.AddData(task);
@@ -1130,6 +1211,9 @@
        catch (Exception ex)
        {
            Console.WriteLine($"CW3至包装出库异常:{ex.ToString()}");
            LogFactory.GetLog($"包装请求出库任务").Info(true, $"【异常】:【{ex.Message}】{Environment.NewLine}【{ex.StackTrace}】{Environment.NewLine}{Environment.NewLine}");
            return content.Error($"失败:{ex.Message}");
        }
    }