杨前锦
2025-06-05 01cc5773457f68274ef1b2d9d9daca8983761828
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/process/TaskProcess.cs
New file
@@ -0,0 +1,192 @@
using HH.WCS.Mobox3.FJJT.api;
using HH.WCS.Mobox3.FJJT.core;
using HH.WCS.Mobox3.FJJT.dispatch;
using HH.WCS.Mobox3.FJJT.util;
using HH.WCS.Mobox3.FJJT.wms;
using Newtonsoft.Json;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
namespace HH.WCS.Mobox3.FJJT.process {
    internal class TaskProcess {
        #region 任务相关
        //--------------------------------------------------任务相关--------------------------------------------------
        /// <summary>
        /// 取货卸货完成,缓存位状态更新
        /// </summary>
        /// <param name="mst"></param>
        /// <param name="load"></param>
        internal static void CacheBitUpdate(WCSTask mst, bool load) {
            if (load) {
                Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}");
                LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}");
                LocationHelper.UnBindingLoc(mst.S_START_LOC, mst.S_CNTR_CODE.Split(',').ToList());
            }
            else {
                Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}");
                LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,起点解绑容器{mst.S_CNTR_CODE}");
                // 终点为直连缓存位,不绑定
                var loc = WMSHelper.GetTransfeRelevance(mst.S_END_LOC);
                if (loc != null && loc.N_PROPERTY == 1)
                {
                    LocationHelper.UnLockLoc(mst.S_END_LOC);
                    return;
                }
                LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList());
            }
        }
        /// <summary>
        /// 任务取消,缓存位状态更新
        /// </summary>
        /// <param name="mst"></param>
        internal static void CacheBitCancelUpdate(WCSTask mst) {
            //任务取消,取货完成前的,起点的loadingCount和终点unLoadingCount都清除,取货完成的只处理终点
            if (WCSHelper.CheckActionRecordExist(mst.S_CODE, 4)) {
                //根据客户现场要求,如果取货完成任务失败人工拉到终点,我们就当卸货完成处理;如果是人工拉走到其它区域,我们就解锁终点,删除托盘。
                //终点绑定
                CacheBitUpdate(mst, false);
                LocationHelper.UnLockLoc(mst.S_END_LOC);
            }
            else {
                //起点终点解锁
                LocationHelper.UnLockLoc(mst.S_START_LOC);
                LocationHelper.UnLockLoc(mst.S_END_LOC);
            }
        }
        /// <summary>
        /// 安全请求
        /// </summary>
        /// <param name="no"></param>
        /// <param name="state"></param>
        /// <param name="forkliftNo"></param>
        /// <param name="extData"></param>
        internal static void OperateReq(string no, int state, string forkliftNo, string extData) {
            LogHelper.Info($"开始安全请求,任务号:{no},请求码:{state}", "HosttoagvTask");
            var cst = WCSHelper.GetTask(no);
            var taskAction = WCSHelper.getActionRecord(no, state);
            if (taskAction != null)
            {
                LogHelper.Info($"再次安全请求,查询设备是否反馈", "HosttoagvTask");
                if (taskAction.N_S_STATUS == 1)
                {
                    LogHelper.Info($"再次安全请求,设备已反馈", "HosttoagvTask");
                    NDCApi.ChangeOrderParam(no, 8, "1");
                }
            }
            else
            {
                LogHelper.Info($"首次进行安全请求,任务号:{no},请求码:{state}", "HosttoagvTask");
                bool result = false;
                if (state == 1101)
                {
                    result = WCSDispatch.safetyInteraction(cst.S_CODE ,cst.S_START_LOC, "1");  //请求取货,
                }
                if (state == 1102)
                {
                    result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "2");  //请求返货
                }
                if (state == 1103)
                {
                    result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "3");  //取货完成允许离开
                }
                if (state == 1104)
                {
                    result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "4");  //放货完成允许离开
                }
                // 安全请求发送成功,添加任务动作记录
                if (result)
                {
                    WCSHelper.AddActionRecord(no, state, forkliftNo, extData);
                    LogHelper.Info($"首次进行安全请求成功", "HosttoagvTask");
                }
            }
        }
        /// <summary>
        /// 任务拦截
        /// </summary>
        /// <param name="task"></param>
        /// <returns></returns>
        internal static bool Intercept(WCSTask mst) {
            var result = false;
            //出库任务是批量生成的,初始终点我们先给一个虚拟点,不推送。有单独的现场去判断出库缓存区光电,空了再给出库任务分配终点
            if (mst.S_END_LOC.Trim() == "出库虚拟点") {
                result = true;
            }
            return result;
        }
        /// <summary>
        /// 任务状态更新处理
        /// </summary>
        /// <param name="mst"></param>
        /// <param name="state"></param>
        internal static void OperateStatus(WCSTask mst, int state) {
            if (state == 4) {
                CacheBitUpdate(mst, true);
            }
            if (state == 6)//卸货完成
            {
                CacheBitUpdate(mst, false);
            }
            if (state == 7) {
                CacheBitCancelUpdate(mst);
            }
        }
        private static object locLocker = new object();
        /// <summary>
        /// 推送任务
        /// </summary>
        /// <param name="mst"></param>
        internal static bool SendTask(WCSTask mst) {
            var result = false;
            var start = "0"; var end = "0";
            if (mst.N_B_STATE == 0) {
                if (mst.S_SCHEDULE_TYPE == "NDC")
                {
                    start = LocationHelper.GetAgvSite(mst.S_START_LOC);
                    end = LocationHelper.GetAgvSite(mst.S_END_LOC);
                    var dic = new List<param>();
                    dic.Add( new param() { name = "No" , value = ""});
                    dic.Add( new param() { name = "From", value = ""});
                    dic.Add( new param() { name = "To", value = ""});
                    dic.Add( new param() { name = "3" , value = "4"});
                    dic.Add( new param() { name = "4" , value = "512"});
                    dic.Add( new param() { name = "5" , value = "0"});
                    var res = NDCApi.AddOrderNew(1,mst.N_PRIORITY,mst.S_CODE,dic);
                    if (res != null && res.err_code == 0 ) {
                        //推送成功,修改任务优先级
                        mst.N_B_STATE = 1;
                        WCSHelper.UpdateStatus(mst);
                        result = true;
                    }
                }
                else if (mst.S_SCHEDULE_TYPE == "WCS") {
                    mst.N_B_STATE = 1;
                    WCSHelper.UpdateStatus(mst);
                }
                else if (mst.S_SCHEDULE_TYPE == "AGV")
                {
                    mst.N_B_STATE = 1;
                    WCSHelper.UpdateStatus(mst);
                }
            }
            return result;
        }
        #endregion
    }
}