杨前锦
2025-07-07 c8f338feee0b6003d8f069b1d37fd9b90dd1b7f4
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/core/Monitor.cs
New file
@@ -0,0 +1,318 @@
using HH.WCS.Mobox3.FJJF.models;
using HH.WCS.Mobox3.FJJT.api;
using HH.WCS.Mobox3.FJJT.device;
using HH.WCS.Mobox3.FJJT.models;
using HH.WCS.Mobox3.FJJT.process;
using HH.WCS.Mobox3.FJJT.util;
using HH.WCS.Mobox3.FJJT.wms;
using NLog.Fluent;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web.UI.WebControls;
using static HH.WCS.Mobox3.FJJT.api.ApiHelper;
using static HH.WCS.Mobox3.FJJT.util.Settings;
namespace HH.WCS.Mobox3.FJJT.core
{
    /// <summary>
    /// 定时轮询任务
    /// </summary>
    internal class Monitor
    {
        /// <summary>
        /// 监听钢包满料下线MES任务
        /// </summary>
        public static void MonitorGBOffLineMesTask()
        {
            var mesTaskList = WMSHelper.GetLjMesTaskList("PENDING");
            if (mesTaskList.Count > 0)
            {
                mesTaskList = mesTaskList.Where(a => a.MSG_TYPE == "1" && a.PALLET_TYPE == "7").ToList();
                if (mesTaskList.Count > 0)
                {
                    foreach (var mesTask in mesTaskList)
                    {
                        LogHelper.Info("MES钢包满料下线任务", "WMS");
                        OffLineRequest request = new OffLineRequest() { loc = mesTask.POSITION_ID, cntrNo = mesTask.PALLET_ID };
                        ApiHelper.offLineProcess(request);
                    }
                }
            }
        }
        /// <summary>
        /// 监听成型机叫料MES任务
        /// </summary>
        public static void MonitorCXJCallMaterialMesTask()
        {
            var mesTaskList = WMSHelper.GetLjMesTaskList("PENDING");
            if (mesTaskList.Count > 0)
            {
                mesTaskList = mesTaskList.Where(a => a.MSG_TYPE == "0").ToList();
                if (mesTaskList.Count > 0)
                {
                    foreach (var mesTask in mesTaskList)
                    {
                        var lineSideLoc = WMSHelper.GetLineSideLoc(mesTask.EQP);
                        if (lineSideLoc != null)
                        {
                            LogHelper.Info($"成型机叫料任务,MES任务ID:{mesTask.ID}", "WMS");
                            if (mesTask.PALLET_TYPE == "5" || mesTask.PALLET_TYPE == "6")
                            {
                                // 2.1成新机叫料(斜裁)
                                var xcTask = WMSHelper.GetLjXcTaskById(mesTask.ID);
                                if (xcTask == null)
                                {
                                    ApiHelper.callMaterialXC(mesTask.MATERIAL_CODE, mesTask.POSITION_ID, mesTask.ID);
                                }
                            }
                            else
                            {
                                // 2.2 成新机叫料
                                ApiHelper.callMaterial(mesTask.MATERIAL_CODE, mesTask.EQP, mesTask.ID);
                            }
                        }
                    }
                }
            }
        }
        /// <summary>
        /// 监听任务中间表
        /// </summary>
        public static void MonitorXcTask()
        {
           var ljMesTasks = WMSHelper.GetLjMesTaskListHD();
            foreach (var mesTask in ljMesTasks)
            {
               var xcTask = WMSHelper.GetLjXcTaskById(mesTask.ID);
                if (xcTask != null && xcTask.RETURN_CODE != mesTask.RETURN_CODE)
                {
                    if (xcTask.RETURN_CODE == "3")
                    {
                        var wcsTask = WCSHelper.GetTask(xcTask.AGVORDER_ID);
                        if (wcsTask != null)
                        {
                            var wmsTask = WMSHelper.GetWmsTask(wcsTask.S_OP_CODE);
                            if (wmsTask != null)
                            {
                                Location startLoc = LocationHelper.GetLoc(xcTask.POSITION_ID);
                                if (startLoc != null)
                                {
                                    wcsTask.S_CNTR_CODE = xcTask.PALLET_ID;
                                    wcsTask.S_START_LOC = startLoc.S_CODE;
                                    wcsTask.S_START_AREA = startLoc.S_AREA_CODE;
                                    wcsTask.N_B_STATE = 0;
                                    wcsTask.S_B_STATE = "等待";
                                    WCSHelper.UpdateWcsTask(wcsTask);
                                    wmsTask.S_CNTR_CODE = xcTask.PALLET_ID;
                                    wmsTask.S_START_LOC = startLoc.S_CODE;
                                    wmsTask.S_START_AREA = startLoc.S_AREA_CODE;
                                    wmsTask.N_B_STATE = 1;
                                    wmsTask.S_B_STATE = "执行";
                                    WMSHelper.UpdateWmsTask(wmsTask);
                                    // 查询托盘物料信息表
                                    WMSHelper.updateCarrier(mesTask.PALLET_ID);
                                }
                            }
                        }
                    }
                    mesTask.POSITION_ID = xcTask.POSITION_ID;
                    mesTask.RETURN_CODE = xcTask.RETURN_CODE;
                    mesTask.YCL_BATCH = xcTask.YCL_BATCH;
                    mesTask.PALLET_ID = xcTask.PALLET_ID;
                    WMSHelper.updateLjMesTask(mesTask);
                }
            }
        }
        /// <summary>
        /// 自动补充空工装到接驳位
        /// </summary>
        public static void AutoReplenishEmptyPallet()
        {
            var logicConfigs = WMSHelper.getLogicConfigByTaskType("3");
            if (logicConfigs != null && logicConfigs.Count > 0)
            {
                foreach (var item in logicConfigs)
                {
                    var jbLoc = LocationHelper.GetLoc(item.S_LKKTJBLOC);
                    var wmsTask = WMSHelper.GetWmsTaskByEnd(item.S_LKKTJBLOC);
                    if (wmsTask == null && jbLoc.N_CURRENT_NUM == 0)
                    {
                        LogHelper.Info($"非直连接驳位:{jbLoc.S_CODE},需要补充空工装", "WMS");
                        Location startLoc = WMSHelper.getOutStockStartLoc(item.S_AREA_CODE, null);
                        if (startLoc != null)
                        {
                            var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE);
                            wmsTask = new WMSTask()
                            {
                                S_CNTR_CODE = locCntrRels[0].S_CNTR_CODE,
                                S_CODE = WMSHelper.GenerateTaskNo(),
                                S_START_LOC = startLoc.S_CODE,
                                S_START_AREA = startLoc.S_AREA_CODE,
                                S_END_LOC = jbLoc.S_CODE,
                                S_END_AREA = jbLoc.S_AREA_CODE,
                                S_TYPE = "空工装自动出库任务",
                                S_OP_DEF_NAME = "自动补充空工装到接驳位",
                                T_START_TIME = DateTime.Now,
                            };
                            if (WMSHelper.CreateWmsTask(wmsTask))
                            {
                                WCSTask wcsTask = new WCSTask()
                                {
                                    S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                                    S_OP_CODE = wmsTask.S_CODE,
                                    S_CODE = WCSHelper.GenerateTaskNo(),
                                    S_CNTR_CODE = wmsTask.S_CNTR_CODE,
                                    S_TYPE = wmsTask.S_TYPE,
                                    S_START_LOC = startLoc.S_CODE,
                                    S_START_AREA = startLoc.S_AREA_CODE,
                                    S_END_LOC = jbLoc.S_CODE,
                                    S_END_AREA = jbLoc.S_AREA_CODE,
                                    S_SCHEDULE_TYPE = "WCS",
                                    N_PRIORITY = 10,
                                    T_START_TIME = DateTime.Now,
                                };
                                if (WCSHelper.CreateTask(wcsTask))
                                {
                                    // 起点、终点加锁
                                    LocationHelper.LockLoc(wcsTask.S_START_LOC, 2);
                                    LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
                                    // 更新作业任务状态
                                    wmsTask.N_B_STATE = 1;
                                    WMSHelper.UpdateTaskState(wmsTask);
                                }
                            }
                        }
                        else
                        {
                            WMSHelper.addAlarmRecord("流程异常", "高", $"非直连接驳位:{jbLoc.S_CODE}补充空工装失败,原因:库区:{item.S_AREA_CODE}没有空工装");
                        }
                    }
                }
            }
        }
        /// <summary>
        /// 中转库空工装周转c厂
        /// 1.监听MES任务,查询入库中转库的任务
        /// 2.查询是否创建对应的空工装出库任务
        /// 3.没有,则查询中转库数量满足是否创建出库任务
        /// </summary>
        public static void ZZKInStockTaskMonitor() {
        }
        /// <summary>
        /// 监听MES托盘与物料信息表 、基础物料信息表
        /// </summary>
        public static void MonitorPalletAndMateral()
        {
            // 1.监听MES托盘物料绑定关系表,更新容器物料表
            LogHelper.Info("监听托盘物料绑定关系表,更新容器物料表", "WMS");
            WMSHelper.updatePalletAndMateral();
            // 2.监听MES物料表,更新物料信息
            LogHelper.Info("监听物料表,更新物料信息", "WMS");
            WMSHelper.updateMateral();
        }
        /// <summary>
        /// 定时更新库存信息  更新频率: 1分钟
        /// </summary>
        public static void UpdateInventoryRegularly()
        {
            var db = new SqlHelper<object>().GetInstance();
            var areaCodeList = Settings.areaPropertyList.Select(a => a.areaCode).ToList();
            var locations = db.Queryable<Location>()
                .LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE)
                .Where((a,b) => a.N_CURRENT_NUM > 0 && b.S_CNTR_CODE != null && areaCodeList.Contains(a.S_AREA_CODE) )
                .ToList();
            // 删除所有库存信息,进行重置
            db.Deleteable<LjLotOnhand>().ExecuteCommand();
            foreach (var loc in locations)
            {
                var locCntrRels = LocationHelper.GetLocCntr(loc.S_CODE);
                if (locCntrRels != null && locCntrRels.Count > 0)
                {
                    locCntrRels.ForEach(a => {
                        var cntrItemRels = ContainerHelper.GetCntrItemRel(a.S_CNTR_CODE);
                        foreach (var cntrItem in cntrItemRels)
                        {
                            var material = WMSHelper.GetMaterial(cntrItem.S_ITEM_CODE);
                            LjLotOnhand ljLotOnhand = new LjLotOnhand()
                            {
                                ID = WMSHelper.GenerateStockRecordNo(),
                                MATERIAL_CODE = cntrItem.S_ITEM_CODE,
                                LOT_NAME = cntrItem.S_BATCH_NO,
                                PALLET_ID = cntrItem.S_CNTR_CODE,
                                STORAGE_LOCATION = loc.S_CODE,
                                QC_STATUS = cntrItem.S_ITEM_STATE,
                                UNIT = material == null ? "":material.S_UNIT,
                                QTY = cntrItem.F_QTY,
                                IN_DATE = cntrItem.T_INBOUND_TIME.ToString("yyyy-MM-dd"),
                                CREATION_DATE = DateTime.Now,
                                WAREHOUSE_TYPE = "2"
                            };
                            db.Insertable(ljLotOnhand).ExecuteCommand();
                        }
                    });
                }
            }
        }
        /// <summary>
        /// 监听批次状态表,更新批次的最长停放日期和最小停放日期
        /// 更新频次:分钟
        /// </summary>
        public static void AutoUpdateBatchStatus() {
            var db = new SqlHelper<object>().GetInstance();
            var lotStatusList = db.Queryable<LjLotStatus>().Where(a => a.RECEIVE_FLAG.Trim() == "PENDING").ToList();
            foreach (var lotStatus in lotStatusList)
            {
               var cntrItemRels = db.Queryable<CntrItemRel>().Where(a => a.S_ITEM_CODE.Trim() == lotStatus.MATERIAL_CODE && a.S_BATCH_NO == lotStatus.LOT_NAME).ToList();
                if (cntrItemRels != null && cntrItemRels.Count > 0)
                {
                    foreach (var item in cntrItemRels)
                    {
                        item.D_EXP_DATE = lotStatus.SHELFLIFE_DATE;
                        item.D_EXP_DATE1 = lotStatus.MINSHELFLIFE_DATE;
                        db.Updateable(lotStatus).ExecuteCommand();
                    }
                }
                lotStatus.RECEIVE_DATE = DateTime.Now;
                lotStatus.RECEIVE_FLAG = "COMPLETE";
                db.Updateable(lotStatus).ExecuteCommand();
            }
        }
        /// <summary>
        /// 监听物料配置中间表
        /// </summary>
        public static void MonitorItemConfig()
        {
        }
    }
}