海波 张
1 天以前 3a56820d028e98ac3c4bd315aa76181d7d6720cd
dispatch/WcsTask.cs
@@ -16,6 +16,7 @@
using System.Web.Services.Description;
using Top.Api;
using static HH.WCS.ZhongCeJinTan.api.ApiModel;
using static HH.WCS.ZhongCeJinTan.util.Settings;
using static HH.WCS.ZhongCeJinTan.wms.WcsModel;
namespace HH.WCS.ZhongCeJinTan.dispatch
@@ -52,18 +53,14 @@
                        isFu = "1";
                    }
                }
                var workFlow = TaskHelper.selectWorkFlowByType(mst.N_TYPE.ToString(), mst.TOOLSTYPE);
                if (workFlow != null)
                {
                    if (workFlow.INOROUT.Contains("入库"))
                    if (mst.S_TYPE.Contains("入库")|| mst.S_TYPE.Contains("回库"))
                    {
                        Type = "1";
                    }
                    if (workFlow.INOROUT.Contains("出库"))
                    if (mst.S_TYPE.Contains("出库"))
                    {
                        Type = "2";
                        var count = TaskHelper.GetConnectionTask(mst.S_END_LOC);
@@ -74,7 +71,7 @@
                    }
                }
                if (mst.S_CNTR_CODE.Contains("KJZ"))
                {
@@ -193,10 +190,10 @@
                stnNo = aloneWcsTask.S_START_LOC,//接驳位
                reqTime = DateTime.Now.ToString()//操作时间
            };
            LogHelper.Info("Wcs立库输送线是否有货 地址信息:" + baseUrl + "CV-state", "立库");
            LogHelper.Info("Wcs立库输送线是否有货 参数信息:" + JsonConvert.SerializeObject(interact), "立库");
            LogHelper.Info("Wcs立库输送线是否有货 地址信息:" + baseUrl + "CV-state", "是否有货");
            LogHelper.Info("Wcs立库输送线是否有货 参数信息:" + JsonConvert.SerializeObject(interact), "是否有货");
            var result = apiHelper.Post(baseUrl + "CV-state", JsonConvert.SerializeObject(interact));
            LogHelper.Info("Wcs立库输送线是否有货 返回信息:" + JsonConvert.SerializeObject(result), "立库");
            LogHelper.Info("Wcs立库输送线是否有货 返回信息:" + JsonConvert.SerializeObject(result), "是否有货");
            if (!string.IsNullOrEmpty(result))
            {
                var res = JsonConvert.DeserializeObject<WcsTaskReturn>(result);
@@ -211,7 +208,7 @@
            }
            else
            {
                LogHelper.Info("Wcs立库输送线是否有货 返回信息为空", "立库");
                LogHelper.Info("Wcs立库输送线是否有货 返回信息为空", "是否有货");
                return false;
            }
        }
@@ -644,9 +641,7 @@
                     //任务完成
                    case "2":
                        LogHelper.Info($"任务{taskNo}完成", "Wcs任务执行通知");
                        LocationHelper.UnLockLoc(transportTask.S_START_LOC);
                        TaskProcess.OperateStatus(transportTask, 4);
                        LocationHelper.UnLockLoc(transportTask.S_END_LOC);
                        TaskProcess.OperateStatus(transportTask, 6);
                        TaskHelper.End(transportTask);
                        LocationHelper.CreateUpAndDown(transportTask);
@@ -692,6 +687,14 @@
                                        LogHelper.Info($"RFID校验失败,没找到对应{transportTask.S_OP_CODE}的agv任务", "Wcs任务执行通知");
                                        throw new Exception($"RFID校验失败,没找到对应{transportTask.S_OP_CODE}的agv任务");
                                    }
                                    WmsTaskAction ac7 = TaskHelper.GetActionRecord(agvTask.S_CODE, "7");
                                    if (ac7!=null)
                                    {
                                        LogHelper.Info($"RFID校验失败,agv任务{agvTask.S_CODE},已经取消,请人工处理", "Wcs任务执行通知");
                                        throw new Exception($"RFID校验失败,agv任务{agvTask.S_CODE},已经取消,请人工处理");
                                    }
                                    var workFlow = TaskHelper.selectWorkFlowByType(agvTask.N_TYPE.ToString(), agvTask.TOOLSTYPE);
                                    if (workFlow == null)
@@ -739,6 +742,112 @@
                                    throw new Exception($"RFID校验失败,通知Wcs取消任务失败");
                                }
                            }
                            if (model.code == "2") {
                                TaskHelper.Fail(transportTask);
                                TaskProcess.OperateStatus(transportTask, 7);
                                if (!WcsCancellTask(transportTask)) {
                                    LogHelper.Info($"外形检测失败,通知Wcs取消任务失败", "Wcs任务执行通知");
                                    throw new Exception($"外形检测失败,通知Wcs取消任务失败");
                                }
                                var work = TaskHelper.GetWmsWork(transportTask.S_OP_CODE);
                                if (work==null)
                                {
                                    LogHelper.Info($"未查询到{transportTask.S_OP_CODE}对应的作业", "Wcs任务执行通知");
                                    throw new Exception("未查询到对应的作业");
                                }
                                var workFlow = TaskHelper.selectWorkFlowByType(work.N_TYPE.ToString(), work.TOOLSTYPE);
                                if (workFlow == null)
                                {
                                    LogHelper.Info($"外形检测失败,没找到对应作业流程", "Wcs任务执行通知");
                                    throw new Exception($"外形检测失败,没找到对应作业流程");
                                }
                                //查找终点
                                var endList = LocationHelper.GetAllLocList1(workFlow.ERRORAREA);
                                //var end = LocationHelper.FindBalanceEndcolByLocList(endList, workFlow.ERRORAREA,workFlow.ROADWAY);
                                var end = LocationHelper.FindEndcolByLoc(endList, workFlow.ERRORAREA);
                                LogHelper.Info($"外形检测失败失败下发异常终点信息" + JsonConvert.SerializeObject(end), "Wcs任务执行通知");
                                if (end == null)
                                {
                                    LogHelper.Info($"外形检测失败失败下发任务失败,终点库区{workFlow.ERRORAREA},没找到终点", "Wcs任务执行通知");
                                    throw new Exception($"外形检测失败失败终点库区{workFlow.ERRORAREA},没找到终点");
                                }
                                LocationHelper.LockLoc(end.S_CODE, "入库锁", 1);
                                var connectionLoc = LocationHelper.GetLoc(work.CONNECTION.Replace("R", "C"));
                                if (connectionLoc==null)
                                {
                                    LogHelper.Info($"未查询到{work.CONNECTION.Replace("R", "C")}对应的接驳位", "Wcs任务执行通知");
                                    throw new Exception("未查询到对应的出库接驳位");
                                }
                                var connection = connectionLoc.S_CODE;
                                var operation = new WmsWork
                                {
                                    // 作业号
                                    S_CODE = TaskHelper.GenerateTaskNo(),
                                    // 作业类型
                                    N_TYPE = 99,
                                    // 作业类型
                                    S_TYPE = work.S_TYPE.Replace("入","出"),
                                    // 起点货位
                                    S_START_LOC = work.CONNECTION,
                                    // 起点库区编码
                                    S_START_AREA = work.CONNECTION_AREA,
                                    //起点库区名称
                                    S_START_AREA_NAME = work.CONNECTION_AREA,
                                    //接驳位
                                    CONNECTION = connection,
                                    //接驳库区名称
                                    CONNECTION_AREA = connectionLoc.S_AREA_Name,
                                    // 终点货位
                                    S_END_LOC = end.S_CODE,
                                    // 终点库区编码
                                    S_END_AREA = end.S_AREA_CODE,
                                    //终点库区名称
                                    S_END_AREA_NAME = end.S_AREA_Name,
                                    // 容器编码
                                    S_CNTR_CODE = work.S_CNTR_CODE,
                                    // 作业定义名称
                                    S_OP_DEF_NAME = workFlow.FLOWNAME,
                                    //优先级
                                    N_PRIORITY = work.N_PRIORITY,
                                    //工装类型
                                    TOOLSTYPE = work.TOOLSTYPE
                                };
                                //创建作业
                                if (WMSHelper.CreateWmsWork(operation))
                                {
                                    if (connection != "")
                                    {
                                        LocationHelper.LockLoc(operation.S_START_LOC, "出库锁", 2);
                                        LocationHelper.LockLoc(operation.S_END_LOC, "入库锁", 1);
                                        LocationHelper.LockLoc(operation.CONNECTION, "入库锁", 1);
                                    }
                                    LogHelper.Info($"异常出库作业创建成功{operation.S_CODE}", "Mes任务下发");
                                }
                                else
                                {
                                    LogHelper.Info($"异常出库任务下发创建作业失败", "Mes任务下发");
                                    throw new Exception($"异常出库任务下发创建作业失败");
                                }
                            }
                            newDb.BeginTran();
                            var R = newDb.Insertable(RfidChek).ExecuteCommand();
                            if (R == 0)
@@ -767,6 +876,8 @@
                            {
                                TaskHelper.Fail(agvTask1);
                                NDCApi.CancelOrder(agvTask1.S_CODE.Trim());
                                LogHelper.Info($"Wcs任务执行通知,任务号{transportTask.S_CODE}取消,解锁", "解锁");
                                TaskProcess.CacheBitCancelUpdate(agvTask1);
                            }
                        }
@@ -1207,8 +1318,75 @@
            }
        }
        /// <summary>
        /// 取货无货
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static WcsWarningReurn ZcOutChangeBit(changeBitParme model)
        {
            var result = new WcsWarningReurn();
            var newDb = new SqlHelper<object>().GetInstance();
            try
            {
                if (string.IsNullOrEmpty(model.taskNo))
                {
                    throw new Exception("任务号为空");
                }
                var task = TaskHelper.GetTask(model.taskNo);
                if (task == null)
                {
                    throw new Exception($"未查询到任务号{model.taskNo}的任务");
                }
                if (task.S_TYPE.Contains("出库"))
                {
                    //取货无货
                    LogHelper.Info($"任务号{task.S_CODE},取货无货,取消任务", "取货无货");
                    if (WcsCancellTask(task))
                    {
                        LogHelper.Info($"任务号{task.S_CODE},取消任务成功,起点{task.S_START_LOC}设为异常", "取货无货");
                        TaskHelper.Fail(task);
                        TaskProcess.OperateStatus(task, 7);
                        LocationHelper.updateLocLock(task.S_START_LOC, 3, "其他锁");
                        var agvTask = TaskHelper.GetTaskByWorkNo(task.S_OP_CODE, "agv");
                        if (agvTask != null)
                        {
                            if (agvTask.S_B_STATE != "未执行")
                            {
                                NDCApi.CancelOrder(agvTask.S_CODE.Trim());
                            }
                            TaskHelper.Fail(agvTask);
                            LogHelper.Info($"取货无货,任务号{task.S_CODE}取消,解锁", "解锁");
                            TaskProcess.CacheBitCancelUpdate(agvTask);
                        }
                    }
                }
                else
                {
                    throw new Exception($"任务号{model.taskNo},任务类型{task.S_TYPE}");
                }
                result.msg = "Wcs取货无货处理成功";
                result.code = "0";
                result.requestPk = model.requestPk;
                return result;
            }
            catch (Exception ex)
            {
                newDb.RollbackTran();
                result.msg = "Wcs取货无货异常";
                result.code = "1";
                result.requestPk = model.requestPk;
                LogHelper.Info("Wcs取货无货异常" + ex.Message, "取货无货");
                return result;
            }
        }
        /// <summary>
        /// 放货有货
@@ -1233,47 +1411,24 @@
                            throw new Exception($"未查询到任务号{model.taskNo}的任务");
                        }
                    if (task.S_TYPE.Contains("出库"))
                    {
                        //取货无货
                        LogHelper.Info($"任务号{task.S_CODE},取货无货,取消任务", "放货有货");
                        if (WcsCancellTask(task))
                        {
                            LogHelper.Info($"任务号{task.S_CODE},取消任务成功,起点{task.S_START_LOC}设为异常", "放货有货");
                            TaskHelper.Fail(task);
                            TaskProcess.OperateStatus(task, 7);
                            LocationHelper.updateLocLock(task.S_START_LOC, 4, "异常锁");
                            var agvTask = TaskHelper.GetTaskByWorkNo(task.S_OP_CODE, "agv");
                            if (agvTask != null)
                            {
                                if (agvTask.S_B_STATE!="未执行")
                                {
                                    NDCApi.CancelOrder(agvTask.S_CODE.Trim());
                                }
                                TaskHelper.Fail(agvTask);
                                TaskProcess.CacheBitCancelUpdate(agvTask);
                            }
                        }
                    }
                    else {
                    if (!task.S_TYPE.Contains("出库")) {
                        //卸货有货
                        if (task.S_B_STATE.Contains("完成") || task.S_B_STATE.Contains("取消") || task.S_B_STATE.Contains("失败"))
                        if (task.S_B_STATE == "完成" || task.S_B_STATE.Contains("取消") || task.S_B_STATE.Contains("失败"))
                        {
                            throw new Exception($"任务号{model.taskNo},任务状态:{task.S_B_STATE},不能改道");
                        }
                        var endLoc = LocationHelper.GetLocOne(task.S_END_LOC);
                        var end = newDb.Queryable<Location>().Where(a => a.S_AREA_CODE == endLoc.S_AREA_CODE && a.N_ROW == endLoc.N_ROW && a.N_COL > endLoc.N_COL && a.S_LOCK_STATE == "无" && a.N_CURRENT_NUM == 0 && a.C_ENABLE == "Y").OrderBy(b => b.N_COL).First();
                        var end = newDb.Queryable<Location>().Where(a => a.S_AREA_CODE == endLoc.S_AREA_CODE && a.N_ROADWAY == endLoc.N_ROADWAY && a.N_COL != endLoc.N_COL && a.S_LOCK_STATE == "无" && a.N_CURRENT_NUM == 0 && a.C_ENABLE == "Y").OrderBy(b => b.N_ROW).OrderBy(b => b.N_COL).OrderBy(b => b.N_LAYER).First();
                        LogHelper.Info($"Wcs放货有货寻找新终点信息" + JsonConvert.SerializeObject(end), "放货有货");
                        if (end != null)
                        {
                            newDb.BeginTran();
                            endLoc.N_LOCK_STATE = 4;
                            endLoc.S_LOCK_STATE = "异常锁";
                            endLoc.N_LOCK_STATE = 3;
                            endLoc.S_LOCK_STATE = "其他锁";
                            newDb.Updateable(endLoc).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE }).ExecuteCommand();
                            task.S_END_LOC = end.S_CODE;
                            newDb.Updateable(task).UpdateColumns(it => new { it.S_END_LOC }).ExecuteCommand();
@@ -1282,17 +1437,19 @@
                            result.msg = end.S_CODE;
                            result.code = "0";
                            result.requestPk = model.requestPk;
                            return result;
                        }
                        else
                        {
                            throw new Exception($"未查询到库区{endLoc.S_AREA_CODE}有符合的货位");
                        }
                    }else
                        {
                        throw new Exception($"任务号{model.taskNo},任务类型{task.S_TYPE}");
                    }
                        result.msg = "Wcs放货有货/取货无货处理成功";
                        result.code = "0";
                        result.requestPk = model.requestPk;
                        return result;
                    }
                    catch (Exception ex)
                    {
@@ -1303,7 +1460,6 @@
                        LogHelper.Info("Wcs放货有货异常" + ex.Message, "放货有货");
                    return result;
                    }
                    return result;
             }
@@ -1338,6 +1494,47 @@
                result.msg = "成功";
                result.requestPk = model.requestPk;
                LogHelper.Info("Wcs通知确认返回" + JsonConvert.SerializeObject(result), "通知确认");
                //查找立库通知确认表
                var mst = TaskHelper.GetTask(model.requestPk);
                if (mst==null)
                {
                    throw new Exception($"为查询到任务{model.requestPk}");
                }
                if (mst.S_TYPE.Contains("出库"))
                {
                    var ac1102 = TaskHelper.GetWcsSafety(mst.S_CODE, "1102");
                    if (ac1102 == null) {
                        if (model.trkType == "1" && model.isAllow == "1")
                        {
                            //立库通知成功修改参数
                            LogHelper.Info($"立库通知确认,取货交管成功,修改参数", "安全交互");
                            NDCApi.ChangeOrderParam(mst.S_CODE, 6, "1");
                        }
                        else
                        {
                            LogHelper.Info($"立库通知确认,任务号={mst.S_CODE},取货交管不允许,不修改参数", "安全交互");
                        }
                    }
                }
                else {
                    var ac1104 = TaskHelper.GetWcsSafety(mst.S_CODE, "1104");
                    if (ac1104==null)
                    {
                        if (model.trkType == "2" && model.isAllow == "1")
                        {
                            //立库通知成功修改参数
                            LogHelper.Info($"立库通知确认,任务号={mst.S_CODE},卸货交管成功,修改参数", "安全交互");
                            NDCApi.ChangeOrderParam(mst.S_CODE, 6, "1");
                        }
                        else
                        {
                            LogHelper.Info($"立库通知确认,任务号={mst.S_CODE},卸货交管不允许,不修改参数", "安全交互");
                        }
                    }
                }
                return result;
            }
            catch (Exception ex)