kazelee
2025-06-26 f703b278956736aa14c12d1d25c8e8f23b822760
优化国自辅助调度和任务推送逻辑
1 文件已重命名
3个文件已添加
5个文件已修改
3个文件已删除
209 ■■■■ 已修改文件
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/1a495659-e37c-434f-8b88-6132140fefe1.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/1b470183-023c-416d-bb96-68ba4438601c.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/464eaeb0-6a8d-451a-9aba-ddc122b33d68.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/754396c7-eaff-48c1-966a-0bbb85008292.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/7b233932-2148-476d-a58f-024f6cac6202.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/9ac976c0-07a0-401d-88dc-3e2e5fd17dbc.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/f9a252f3-6694-4ab8-a204-0ccfbf239beb.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
api/MoboxController.cs 补丁 | 查看 | 原始文档 | blame | 历史
core/Monitor.cs 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
core/WCSCore.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dispatch/GZRobot.cs 111 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
process/TaskProcess.cs 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/1a495659-e37c-434f-8b88-6132140fefe1.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/1b470183-023c-416d-bb96-68ba4438601c.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/464eaeb0-6a8d-451a-9aba-ddc122b33d68.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/754396c7-eaff-48c1-966a-0bbb85008292.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/7b233932-2148-476d-a58f-024f6cac6202.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/9ac976c0-07a0-401d-88dc-3e2e5fd17dbc.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/f9a252f3-6694-4ab8-a204-0ccfbf239beb.vsidx
Binary files differ
api/MoboxController.cs
core/Monitor.cs
@@ -223,37 +223,6 @@
                    }
                    
                }
                //// BEG 查找6个月以前的任务表和任务动作表
                //var oldTaskList = db.Queryable<TN_Task>()
                //    .Where(t => t.T_MODIFY < DateTime.Now.AddMonths(-6))
                //    .Where(t => t.N_B_STATE == 3 && t.S_B_STATE == "完成")
                //    .ToList();
                //var oldTaskActionList = db.Queryable<TN_Task, TN_Task_Action>((t, a) => t.S_CODE == a.S_TASK_CODE)
                //    .Where(t => t.T_MODIFY < DateTime.Now.AddMonths(-6))
                //    .Where(t => t.N_B_STATE == 3 && t.S_B_STATE == "完成")
                //    .Select((t, a) => a)
                //    .ToList();
                //// END
                //using (var tran = db.Ado.UseTran()) {
                //    // 在出库轮询中处理,查找任务单是否有半年前且已经完成的任务,如果有则删除
                //    // 这个操作不影响正常流程,如果失败也不需要回滚
                //    //if (db.Deleteable<TN_Task>()
                //    //    .Where(t => t.T_MODIFY < DateTime.Now.AddMonths(-6))
                //    //    .Where(t => t.N_B_STATE == 3 && t.S_B_STATE == "完成")
                //    //    .ExecuteCommand() <= 0) {
                //    //    info = $"轮询{taskName}单时尝试删除半年前的任务失败";
                //    //    LogHelper.Info(info);
                //    //}
                //    if (db.Deleteable<TN_Task>(oldTaskList).ExecuteCommand() <= 0
                //        && db.Deleteable<TN_Task_Action>(oldTaskActionList).ExecuteCommand() <= 0) {
                //        info = $"轮询{taskName}单时尝试删除半年前的任务失败";
                //        LogHelper.Info(info);
                //    }
                //}
            }
            catch (Exception ex) {
core/WCSCore.cs
@@ -446,7 +446,8 @@
            if (list.Count > 0) {
                list.ForEach(task => {
                    //使用自定义任务推送
                    TaskProcess.SendTask(task);//调度NDC或杭奥或国自设备
                    //TaskProcess.SendTask(task);//调度NDC或杭奥或国自设备
                    TaskProcess.SendNDCTask(task);
                });
            }
            else {
dispatch/GZRobot.cs
@@ -28,7 +28,15 @@
            var result = apiHelper.Post(baseUrl + "api/engine/tasks/iostates/", JsonConvert.SerializeObject(data));
            var dataResult = JsonConvert.DeserializeObject<gzResult<IOStatesInfoResult>>(result);
        }
        /// <summary>
        /// 创建国自任务
        /// </summary>
        /// <param name="taskNo"></param>
        /// <param name="priority"></param>
        /// <param name="param"></param>
        /// <param name="ts"></param>
        /// <param name="created_user"></param>
        /// <returns></returns>
        public static int CreateOrder(string taskNo, int priority, string param, string ts = "churuku", string created_user = "hanhe") {
            LogHelper.Info($"CreateOrder参数信息:taskNo:{taskNo},priority:{priority},param:{param},ts:{ts},created_user:{created_user}", "API");
            var msg = "";
@@ -42,11 +50,18 @@
            if (response != "") {
                try {
                    var dataResult = JsonConvert.DeserializeObject<gzResult<OrderInfoResult>>(response);
                    if (dataResult.code == 0) {
                    //if (dataResult.code == 0) {
                    //    orderId = dataResult.data[0].in_order_id;
                    //}
                    // 返回参数中,code目前不再使用,可通过msg字段判断是否成功,如果msg为”success”则表示成功,否则为报错信息或不存在。http code为422时候的报错为系统报错,其中的msg无法全部获取。
                    // SELFNOTE: 直接调用HttpHelper.Post方法,无法获取header,暂时不考虑
                    if (dataResult.msg == "success") {
                        orderId = dataResult.data[0].in_order_id;
                    }
                }
                catch (Exception ex) {
                    LogHelper.InfoEx(ex);
                }
            }
            else {
@@ -55,29 +70,13 @@
                LogHelper.Info($"创建订单失败", "API");
            }
            return orderId;
        }
        public static bool CancelOrder(int orderId) {
            bool result = false;
            string msg = "";
            var request = new CancelOrderInfo() { order_list = new List<int>(orderId) };
            var response = apiHelper.Post(baseUrl + "api/om/order/cancel/", JsonConvert.SerializeObject(request));
            msg = $"[guozi-CancelOrder] request={request};response={response}";
            Console.WriteLine(msg);
            if (response != "") {
                var dataResult = JsonConvert.DeserializeObject<gzResult<CancelOrderInfoResult>>(response);
                if (dataResult.code == 0) {
                    result = true;
                }
            }
            else {
                msg = "[guozi-CancelOrder]取消订单失败";
                Console.WriteLine(msg);
            }
            return result;
        }
        /// <summary>
        /// 取消国自任务
        /// </summary>
        /// <param name="orderId"></param>
        /// <returns></returns>
        public static bool CancelGZOrder(int orderId) {
            bool result = false;
            string msg = "";
@@ -88,9 +87,18 @@
            msg = $"[guozi-CancelOrder] request={requests};response={response}";
            if (response != "") {
                var dataResult = JsonConvert.DeserializeObject<CancelGZOrderResult>(response);
                if (dataResult.code == 0) {
                    msg = "[guozi-CancelOrder]取消订单成功";
                    Console.WriteLine(msg);
                //if (dataResult.code == 0) {
                //    msg = "[guozi-CancelOrder]取消订单成功";
                //    Console.WriteLine(msg);
                //    result = true;
                //    return result;
                //}
                // 返回参数中,code目前不再使用,可通过msg字段判断是否成功,如果msg为”success”则表示成功,否则为报错信息或不存在。http code为422时候的报错为系统报错,其中的msg无法全部获取。
                // SELFNOTE: 直接调用HttpHelper.Post方法,无法获取header,暂时不考虑
                // 尊重文档的版本
                if (dataResult.msg == "success") { // 目前只取消一个任务,成功无需再检查success_list和error_list
                    Console.WriteLine("[guozi-CancelOrder]取消订单成功");
                    result = true;
                    return result;
                }
@@ -101,7 +109,52 @@
            }
            return result;
        }
        /// <summary>
        /// 取消多个任务
        /// </summary>
        /// <param name="orderIds"></param>
        /// <returns></returns>
        public static bool CancelGZOrders(List<int> orderIds) {
            bool result = false;
            string msg = "";
            List<CancelGZOrderInfo> requests = new List<CancelGZOrderInfo>();
            foreach (var id in orderIds) {
                var request = new CancelGZOrderInfo() { order_id = id, order_command_type_id = 2 };
                requests.Add(request);
            }
            var response = apiHelper.Put(baseUrl + "api/om/order/order-command/", JsonConvert.SerializeObject(requests));
            msg = $"[guozi-CancelOrder] request={requests};response={response}";
            if (response != "") {
                var dataResult = JsonConvert.DeserializeObject<CancelGZOrderResult>(response);
                //if (dataResult.code == 0) {
                //    msg = "[guozi-CancelOrder]取消订单成功";
                //    Console.WriteLine(msg);
                //    result = true;
                //    return result;
                //}
                // 返回参数中,code目前不再使用,可通过msg字段判断是否成功,如果msg为”success”则表示成功,否则为报错信息或不存在。http code为422时候的报错为系统报错,其中的msg无法全部获取。
                // SELFNOTE: 直接调用HttpHelper.Post方法,无法获取header,暂时不考虑
                // 尊重文档的版本
                if (dataResult.msg == "success") { // 目前只取消一个任务,成功无需再检查success_list和error_list
                    if (dataResult.success_list.Count == requests.Count && dataResult.error_list.Count == 0) {
                        Console.WriteLine("[guozi-CancelOrder]取消订单成功");
                        result = true;
                        return result;
                    }
                    else {
                        Console.WriteLine("[guozi-CancelOrder]取消订单部分失败" + JsonConvert.SerializeObject(dataResult.error_list));
                        result = true;
                        return result;
                    }
                }
            }
            else {
                msg = "[guozi-CancelOrder]取消订单失败";
                Console.WriteLine(msg);
            }
            return result;
        }
        /// <summary>
        /// 订单状态反馈
@@ -173,7 +226,6 @@
        public static QueryOrderResult QueryOrder(int id) {
            //
            var result = new QueryOrderResult() { agv_list = new List<int> { 0 } };
            string msg = "";
            var response = apiHelper.Get(baseUrl + $"/api/om/order/{id}/");
@@ -311,7 +363,7 @@
        public List<ResultInfo> error_list { get; set; }
        public class ResultInfo { public int order_id { get; set; } }
    }
    public class cancle
    public class Cancel
    {
        public List<success_list> success_list { get; set; }
        public List<error_list> error_list { get; set; }
@@ -323,6 +375,7 @@
    public class error_list
    {
        public int order_id { get; set; } // 新补充
    }
    public class CancelGZOrderResult
    {
@@ -330,7 +383,7 @@
        public string version { get; set; }
        public int code { get; set; }
        public string msg { get; set; }
        public cancle data { get; set; }
        public Cancel data { get; set; }
        public List<int> success_list { get; set; }
        public List<int> error_list { get; set; }
    }
process/TaskProcess.cs
@@ -109,6 +109,19 @@
        /// <param name="mst"></param>
        internal static bool SendTask(TN_Task mst) {
            var result = false;
            switch (mst.N_SCHEDULE_TYPE) {
                case 1: //通过NDC,hosttoagv调度设备
                    return SendNDCTask(mst);
                case 5: //通过杭奥调度设备
                    return SendHanAoTask(mst);
                case 3: //通过国自调度设备
                    return SendGZTask(mst);
            }
            return result;
        }
        public static bool SendNDCTask(TN_Task mst) {
            var result = false;
            var start = "0"; var end = "0";
            var taskType = mst.S_TYPE.Trim();
@@ -142,6 +155,57 @@
            }
            return result;
        }
        public static bool SendGZTask(TN_Task mst) {
            var db = new SqlHelper<object>().GetInstance();
            var result = false;
            var start = "0"; var end = "0";
            var taskType = mst.S_TYPE.Trim();
            if (mst.N_B_STATE == 0) {
                //var code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = mst.S_START_LOC, dst = mst.S_END_LOC }), "p2p");
                start = LocationHelper.GetAgvSite(mst.S_START_LOC);
                end = LocationHelper.GetAgvSite(mst.S_END_LOC);
                var code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = start, dst = end }), "p2pdst", "pgapi");
                if (code > 0) {
                    //更新任务状态
                    mst.N_B_STATE = 1;
                    mst.S_B_STATE = TN_Task.GetStateStr(1);
                    mst.S_EQ_TASK_CODE = code.ToString();
                    WCSHelper.UpdateStatus(mst);
                    WCSHelper.UpdateEQNo(mst);
                    LogHelper.Info($"国自推送任务成功 {mst.S_CODE};" + "start=" + mst.S_START_LOC + "end= " + mst.S_END_LOC);
                }
                else {
                    LogHelper.Info($"国自推送任务失败 {mst.S_CODE};" + JsonConvert.SerializeObject(mst));
                }
            }
            return result;
        }
        public static bool SendHanAoTask(TN_Task mst) {
            var result = false;
            //调第三方接口
            var model = new HanAo.TaskInfoModel {
                requestPk = mst.S_CODE,
                frmPos = mst.S_START_LOC,
                toPos = mst.S_END_LOC,
                trkType = mst.S_OP_NAME == "入库" ? "1" : "2",
                contNo = mst.S_CNTR_CODE
            };
            if (HanAo.CreateOrder(model)) {
                mst.N_B_STATE = 1;
                WCSHelper.UpdateStatus(mst);
                LogHelper.Info($"杭奥推送任务成功 {mst.S_CODE};" + "start=" + model.frmPos + "end= " + model.toPos);
                return true;
            }
            else {
                LogHelper.Info($"杭奥推送任务失败 {mst.S_CODE};" + JsonConvert.SerializeObject(model));
            }
            return result;
        }
        #endregion
    }
}