肖洋
2024-11-29 663d9d2e658ab99a0c3598becd23b00b34b3e3d9
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Partial/Dt_TaskService.cs
@@ -1,8 +1,12 @@
using log4net.Core;

using log4net.Core;
using Mapster;
using Masuit.Tools;
using Masuit.Tools.Models;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using SixLabors.Fonts.Tables.AdvancedTypographic;
using System.Diagnostics;
using WIDESEA_Core.Const;
using WIDESEA_DTO;
using WIDESEA_DTO.MOM;
using WIDESEA_DTO.WMS;
@@ -386,25 +390,25 @@
                }
            }
            // 创建一个TrayCellsStatusDto对象,并赋值
            //TrayCellsStatusDto trayCells = new TrayCellsStatusDto()
            //{
            //    Software = "WMS",
            //    TrayBarcode = input.PalletCode,
            //    //EquipmentCode = "EQ_CWJZ01"
            //    EquipmentCode = input.EquiCodeMOM
            //};
            //创建一个TrayCellsStatusDto对象,并赋值
            TrayCellsStatusDto trayCells = new TrayCellsStatusDto()
            {
                Software = "WMS",
                TrayBarcode = input.PalletCode,
                //EquipmentCode = "EQ_CWJZ01"
                EquipmentCode = input.EquiCodeMOM
            };
            //// 调用GetTrayCellStatusAsync方法,获取整盘电芯
            //content = await GetTrayCellStatusAsync(trayCells);
            //// 如果状态为false,则返回content
            //if (!content.Status) return content;
            // 调用GetTrayCellStatusAsync方法,获取整盘电芯
            content = await GetTrayCellStatusAsync(trayCells);
            // 如果状态为false,则返回content
            if (!content.Status) return content;
            //// 添加组盘信息
            //// 将content.Data转换为ResultTrayCellsStatus对象
            //var result = JsonConvert.DeserializeObject<ResultTrayCellsStatus>(content.Data.ToString());
            //if (result.SerialNos.Count <= 0)
            //    return content.Error(result.MOMMessage);
            // 添加组盘信息
            // 将content.Data转换为ResultTrayCellsStatus对象
            var result = JsonConvert.DeserializeObject<ResultTrayCellsStatus>(content.Data.ToString());
            if (result.SerialNos.Count <= 0)
                return content.Error(result.MOMMessage);
            //Console.WriteLine(result);
            //// TODO 获取本地料框属性与整盘电芯属性获取的值进行对比,如果一致则继续,否则返回错误信息
@@ -413,9 +417,8 @@
            ////    return content.Error("料框属性不存在");
            //// 调用CreateBoxingInfo方法,创建组盘信息
            //var boxing = await CreateBoxingInfo(result, input.PalletCode);
            //if (boxing == null) return content.Error("组盘失败");
            var boxing = CreateBoxingInfo(result, input.PalletCode);
            if (boxing == null) return content.Error("组盘失败");
            //// 调用GetProcessApplyAsync方法,获取工艺路线
            //ProcessApplyDto process = await GetProcessApplyAsync(input, result);
@@ -433,10 +436,10 @@
            ////var processResponse = await GetProcessResponseAsync(process, input.Position);
            // 调用CreateNewTask方法,创建新任务
            content = await CreateNewTask(input);
            //if (content.Status)
            //{
            //    var isBox = await _boxingInfoRepository.AddDataNavAsync(boxing);
            //}
            if (content.Status)
            {
                var isBox = await _boxingInfoRepository.AddDataNavAsync(boxing);
            }
        }
        catch (Exception err)
        {
@@ -533,9 +536,10 @@
            //case 4:
            case 5:
                task = await CreateInToOutTaskAsync(input, stationManager); break;
            case 7:
                task = await CreateEmptyOutTaskAsync(input, stationManager); break;
            default:
                throw new Exception("位置站台类型");
                throw new Exception("未知站台类型");
        }
        return task;
    }
@@ -575,7 +579,16 @@
    {
        if (stationManager.stationType != 1 && stationManager.stationType != 6) throw new Exception("错误的调取");
        DtLocationInfo locationInfo = await RequestLocation(input);
        DtLocationInfo locationInfo = null;
        if (stationManager.stationType == 1 && stationManager.Roadway.Contains("FR"))
        {
            locationInfo = await RequestLocation(input, true);
        }
        else
        {
            locationInfo = await RequestLocation(input);
        }
        //DtLocationInfo locationInfo = await RequestLocation(input);
        if (locationInfo == null) throw new Exception("库位已满");
@@ -590,16 +603,15 @@
                EquipmentCode = input.EquiCodeMOM
            };
            //// 调用GetTrayCellStatusAsync方法,获取整盘电芯
            //content = await GetTrayCellStatusAsync(trayCells);
            //// 如果状态为false,则返回content
            //if (!content.Status) return content;
            // 调用GetTrayCellStatusAsync方法,获取整盘电芯
            WebResponseContent content = await GetTrayCellStatusAsync(trayCells);
            // 如果状态为false,则返回content
            if (!content.Status) throw new Exception(content.Message);
            //// 添加组盘信息
            //// 将content.Data转换为ResultTrayCellsStatus对象
            //var result = JsonConvert.DeserializeObject<ResultTrayCellsStatus>(content.Data.ToString());
            //if (result.SerialNos.Count <= 0)
            //    return content.Error(result.MOMMessage);
            // 添加组盘信息
            // 将content.Data转换为ResultTrayCellsStatus对象
            var result = JsonConvert.DeserializeObject<ResultTrayCellsStatus>(content.Data.ToString());
            if (result.SerialNos.Count <= 0) throw new Exception(result.MOMMessage);
            //Console.WriteLine(result);
            //// TODO 获取本地料框属性与整盘电芯属性获取的值进行对比,如果一致则继续,否则返回错误信息
@@ -608,9 +620,8 @@
            ////    return content.Error("料框属性不存在");
            //// 调用CreateBoxingInfo方法,创建组盘信息
            //var boxing = await CreateBoxingInfo(result, input.PalletCode);
            //if (boxing == null) return content.Error("组盘失败");
            var boxing = CreateBoxingInfo(result, input.PalletCode);
            if (boxing == null) throw new Exception("组盘失败");
            //// 调用GetProcessApplyAsync方法,获取工艺路线
            //ProcessApplyDto process = await GetProcessApplyAsync(input, result);
@@ -659,13 +670,13 @@
    /// </summary>
    /// <param name="requestTask">请求参数</param>
    /// <returns></returns>
    private async Task<DtLocationInfo> RequestLocation(RequestTaskDto requestTask)
    private async Task<DtLocationInfo> RequestLocation(RequestTaskDto requestTask, bool isCheckRequest = false)
    {
        #region 获取货位
        try
        {
            List<DtLocationInfo> locations;
            if (requestTask.Roadways.Contains("FR"))
            if (isCheckRequest)
            {
                locations = await _locationRepository.QueryDataAsync(x => x.LocationStatus == (int)LocationEnum.Free && x.RoadwayNo == requestTask.Roadways && x.EnalbeStatus == 1 && x.LocationType == 2 && x.Remark == "1");
            }
@@ -687,7 +698,7 @@
            return null;
        }
        #endregion 获取货位
    }
    }
    #endregion
    // 获取工艺申请
@@ -706,8 +717,52 @@
        };
    }
    #endregion 请求任务入库
    #endregion 请求空框出库
    public async Task<Dt_Task> CreateEmptyOutTaskAsync(RequestTaskDto input, Dt_StationManager stationManager)
    {
        try
        {
            if (stationManager.stationType != 7) throw new Exception("错误的调取");
            var stockinfo = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
                .Includes(x => x.LocationInfo)
                //.Includes(x=>x.StockInfoDetails)
                .Where(x => !x.IsFull && x.LocationInfo.RoadwayNo == stationManager.Roadway)
                .OrderBy(x => x.CreateDate)
                .FirstAsync();
            if (stockinfo == null) return null;
            var task = new Dt_Task
            {
                CurrentAddress = input.Position,
                Grade = 1,
                Roadway = input.Roadways,
                TargetAddress = stationManager.stationLocation,
                Dispatchertime = DateTime.Now,
                MaterialNo = "",
                NextAddress = input.Roadways,
                OrderNo = null,
                PalletCode = input.PalletCode,
                SourceAddress = stockinfo.LocationCode,
                TaskState = (int)TaskOutStatusEnum.OutNew,
                TaskType = (int)TaskOutboundTypeEnum.OutTray,
                TaskNum = await BaseDal.GetTaskNo(),
                Creater = "Systeam"
            };
            return task;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
    }
    #region 直接出库任务完成
    public async Task<WebResponseContent> CompleteInToOutTaskAsync(Dt_Task task)
    {
        WebResponseContent content = new WebResponseContent();
@@ -723,10 +778,88 @@
        }
        catch (Exception ex)
        {
           return content.Error (ex.Message);
            return content.Error(ex.Message);
        }
        return content;
    }
    #endregion
    #region 检测高温库是否有可出库库存
    public WebResponseContent StockCheckingAsync()
    {
        WebResponseContent webResponseContent = new WebResponseContent();
        try
        {
            Task.Run(async () =>
            {
                while (true)
                {
                    Thread.Sleep(10000);
                    var area = await _areaInfoRepository.QueryFirstAsync(x => x.AreaCode == "GWSC1");
                    var stockInfo = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
                         .Includes(x => x.LocationInfo) // 预加载LocationInfo
                         .Includes(x => x.StockInfoDetails) // 预加载StockInfoDetails
                         .Where(x => x.AreaCode == area.AreaCode && x.OutboundTime < DateTime.Now && x.IsFull == true) // 过滤条件
                         .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID) // 过滤条件
                         .OrderBy(x => x.OutboundTime) // 排序
                         .ToListAsync(); // 获取第一个元素
                    if (stockInfo.Count <= 0) continue;
                    foreach (var item in stockInfo)
                    {
                        var hasTask = BaseDal.QueryFirst(x => x.PalletCode == item.PalletCode);
                        if (hasTask != null)
                        {
                            Console.WriteLine("已存在出库任务");
                            continue;
                        }
                        string position = string.Empty;
                        if (item.LocationInfo.RoadwayNo == "GWSC1")
                            position = "1059";
                        else
                            position = "1065";
                        var task = CreateTask(item, position, (int)TaskOutboundTypeEnum.Outbound);
                        task.NextAddress = "002-000-002";
                        // 创建任务DTO
                        WMSTaskDTO taskDTO = CreateTaskDTO(task);
                        var configs = _configService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
                        var wmsBase = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.WCSIPAddress)?.ConfigValue;
                        var ipAddress = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.ReceiveTask)?.ConfigValue;
                        if (wmsBase == null || ipAddress == null)
                        {
                            throw new InvalidOperationException("WMS IP 未配置");
                        }
                        var wmsIpAddress = wmsBase + ipAddress;
                        var result = HttpHelper.PostAsync(wmsIpAddress, taskDTO.ToJsonString()).Result;
                        var content = JsonConvert.DeserializeObject<WebResponseContent>(result);
                        if (content.Status)
                        {
                            await BaseDal.AddDataAsync(task);
                            // 更新库存位置状态为不可用
                            item.LocationInfo.LocationStatus = (int)LocationEnum.InStockDisable;
                            await _locationRepository.UpdateDataAsync(item.LocationInfo);
                        }
                    }
                }
            });
            return webResponseContent.OK();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message.ToString());
            return webResponseContent.Error(ex.Message);
        }
    }
    #endregion
}