海波 张
9 天以前 121a380d651097586384ee0ac70943ce1fc13583
dispatch/WcsTask.cs
@@ -5,6 +5,7 @@
using HH.WCS.ZhongCeJinTan.util;
using HH.WCS.ZhongCeJinTan.wms;
using Newtonsoft.Json;
using Org.BouncyCastle.Asn1.Ocsp;
using S7.Net.Types;
using System;
using System.Collections.Generic;
@@ -13,6 +14,7 @@
using System.Text;
using System.Threading.Tasks;
using System.Web.Services.Description;
using Top.Api;
using static HH.WCS.ZhongCeJinTan.api.ApiModel;
using static HH.WCS.ZhongCeJinTan.wms.WcsModel;
@@ -62,6 +64,13 @@
                if (workFlow.INOROUT.Contains("出库"))
                {
                    Type = "2";
                    var count = TaskHelper.GetConnectionTask(mst.S_END_LOC);
                    if (count>=2)
                    {
                        return false;
                    }
                }
            }
@@ -246,10 +255,12 @@
                {
                    result.msg = "Wcs下发任务成功";
                    result.code = "0";
                    result.requestPk = model.requestPk;
                }
                else {
                    result.msg = "Wcs下发任务失败";
                    result.code = "1";
                    result.requestPk = model.requestPk;
                }
                return result;
@@ -257,12 +268,13 @@
            catch (Exception ex)
            {
                newDb.RollbackTran();
                result.msg = ex.Message;
                result.msg = "Wcs下发任务异常";
                result.code = "1";
                result.requestPk = model.requestPk;
                LogHelper.Info("Wcs下发任务异常" + ex.Message, "Wcs下发任务");
                return result;
            }
            return result;
        }
        /// <summary>
        /// Wcs满托入和空托出
@@ -360,56 +372,63 @@
                        var endList2 = LocationHelper.GetAllLocList1(workFlow.ERRORAREA);
                        end1 = LocationHelper.FindEndcolByLoc(endList2, workFlow.ERRORAREA);
                        LogHelper.Info($"ZcWcsInWorkArea一段任务入异常库区终点信息" + JsonConvert.SerializeObject(end1), "Wcs下发任务");
                        if (end1 == null)
                        {
                            LogHelper.Info($"ZcWcsInWorkArea任务下发失败,终点库区{workFlow.ERRORAREA},没找到终点", "Wcs下发任务");
                            throw new Exception($"终点库区{workFlow.ERRORAREA},没找到终点");
                        }
                    }
                    else {
                        end1 = LocationHelper.FindEndcolByLoc(endList1, workFlow.ENDAREA);
                        LogHelper.Info($"ZcWcsInWorkArea一段任务入三层货架终点信息" + JsonConvert.SerializeObject(end1), "Wcs下发任务");
                        if (end1 == null)
                        {
                            LogHelper.Info($"ZcWcsInWorkArea任务下发失败,终点库区{workFlow.ENDAREA},没找到终点", "Wcs下发任务");
                            throw new Exception($"终点库区{workFlow.ENDAREA},没找到终点");
                        }
                    }
                    LogHelper.Info($"ZcWcsInWorkArea任务下发终点信息" + JsonConvert.SerializeObject(end1), "Wcs下发任务");
                    if (end1 == null)
                    {
                        LogHelper.Info($"ZcWcsInWorkArea任务下发失败,终点库区{workFlow.ENDAREA},没找到终点", "Wcs下发任务");
                        throw new Exception($"终点库区{workFlow.ENDAREA},没找到终点");
                    }
                    //添加托盘物料关联表
                   
                    //添加托盘 异常托盘不添加
                    if (!(model.code == "1" || model.contNo == "99")) {
                        //添加托盘物料关联表
                        CntrItemRel rel = new CntrItemRel();
                        rel.S_CNTR_CODE = model.contNo;
                        rel.PRODUCTIONDATE = DateTime.Parse(item.wrkdatetime);
                        rel.S_ITEM_CODE = item.recipe;
                        rel.F_SUM_QTY = item.zl;
                        rel.TurnCardNum = item.tmh;
                        rel.facnm = item.facnm;
                        rel.cdrub= item.cdrub;
                        rel.cdrub = item.cdrub;
                        rel.mchid = item.mchid;
                        rel.wdate = item.wdate;
                        rel.wsht = item.wsht;
                        rel.strbat = item.strbat;
                        rel.wsht = item.wsht;
                        rel.strbat = item.strbat;
                        rel.endbat = item.endbat;
                        rel.planno = item.planno;
                        rel.stage  = item.stage;
                        rel.planno = item.planno;
                        rel.stage = item.stage;
                        rel.grd = item.grd;
                        ContainerHelper.CreateCntrItem(rel);
                    //添加托盘
                    Container cntr1 = new Container();
                    cntr1.S_CODE = model.contNo;
                    cntr1.C_ENABLE = "Y";
                    cntr1.N_DETAIL_COUNT = 1;
                    cntr1.S_TYPE = "";
                    ContainerHelper.CreateCntr(cntr1);
                        Container cntr1 = new Container();
                        cntr1.S_CODE = model.contNo;
                        cntr1.C_ENABLE = "Y";
                        cntr1.N_DETAIL_COUNT = 1;
                        cntr1.S_TYPE = "";
                        ContainerHelper.CreateCntr(cntr1);
                    }
                    //起点终点查找成功,创建作业
@@ -440,7 +459,13 @@
                        //优先级
                        N_PRIORITY = 1,
                        //工装类型
                        TOOLSTYPE = ""
                        TOOLSTYPE = "",
                        //起点库区名称
                        S_START_AREA_NAME = start1.S_AREA_Name,
                        //终点库区名称
                        S_END_AREA_NAME= end1.S_AREA_Name,
                        //接驳位库区名称
                        CONNECTION_AREA = ""
                    };
                    //创建作业
@@ -528,7 +553,13 @@
                        //优先级
                        N_PRIORITY = 1,
                        //工装类型
                        TOOLSTYPE = ""
                        TOOLSTYPE = "" ,
                        //起点库区名称
                        S_START_AREA_NAME = start.S_AREA_Name,
                        //终点库区名称
                        S_END_AREA_NAME = end.S_AREA_Name,
                        //接驳位库区名称
                        CONNECTION_AREA = ""
                    };
                    //创建作业
@@ -555,10 +586,13 @@
        }
        ///// <summary>
        /// Wcs任务执行通知
        /// </summary>
        internal static WcsWarningReurn WcsOperateTask(WcsOperateTaskParme model) {
            ///// <summary>
            /// Wcs任务执行通知
            /// </summary>
            internal static WcsWarningReurn WcsOperateTask(WcsOperateTaskParme model) {
            var result = new WcsWarningReurn();
            var newDb = new SqlHelper<object>().GetInstance();
@@ -576,7 +610,7 @@
                {
                    taskNo = model.requestPk;
                }
                var transportTask = newDb.Queryable<WMSTask>().Where(e => e.S_CODE == taskNo)?.First();
                var transportTask = newDb.Queryable<WMSTask>().Where(e => e.S_CODE == taskNo && e.S_SCHEDULE_TYPE.Contains("wcs"))?.First();
                if (transportTask == null)
                {
@@ -638,11 +672,12 @@
                                    TaskHelper.Fail(transportTask);
                                    TaskProcess.OperateStatus(transportTask, 7);
                                    var agvTask = newDb.Queryable<WMSTask>().Where(e => e.S_CODE == transportTask.S_OP_CODE+"_1")?.First();
                                    var agvTask = TaskHelper.GetTaskByWorkNo(transportTask.S_OP_CODE, "agv");
                                    if (agvTask == null)
                                    {
                                        LogHelper.Info($"RFID校验失败,没找到对应{transportTask.S_OP_CODE+"_1"}任务", "Wcs任务执行通知");
                                        throw new Exception($"RFID校验失败,没找到对应{transportTask.S_OP_CODE + "_1"}任务");
                                        LogHelper.Info($"RFID校验失败,没找到对应{transportTask.S_OP_CODE}的agv任务", "Wcs任务执行通知");
                                        throw new Exception($"RFID校验失败,没找到对应{transportTask.S_OP_CODE }的agv任务");
                                    }
                                    var workFlow = TaskHelper.selectWorkFlowByType(agvTask.N_TYPE.ToString(), agvTask.TOOLSTYPE);
                                  
@@ -654,7 +689,8 @@
                                    //查找终点
                                    var endList = LocationHelper.GetAllLocList1(workFlow.ERRORAREA);
                                    var end = LocationHelper.FindEndcolByLocList(endList, workFlow.ERRORAREA,workFlow.ROADWAY);
                                    //var end = LocationHelper.FindBalanceEndcolByLocList(endList, workFlow.ERRORAREA,workFlow.ROADWAY);
                                    var  end = LocationHelper.FindEndcolByLoc(endList, workFlow.ERRORAREA);
                                    LogHelper.Info($"RFID校验失败下发异常终点信息" + JsonConvert.SerializeObject(end), "Wcs任务执行通知");
@@ -663,23 +699,24 @@
                                        LogHelper.Info($"RFID校验失败下发任务失败,终点库区{workFlow.ERRORAREA},没找到终点", "Wcs任务执行通知");
                                        throw new Exception($"RFID校验失败终点库区{workFlow.ERRORAREA},没找到终点");
                                    }
                                    LocationHelper.LockLoc(end.S_CODE, "入库锁", 1);
                                    agvTask.S_START_LOC = agvTask.S_END_LOC;
                                    agvTask.S_START_AREA = agvTask.S_END_AREA;
                                    agvTask.S_START_AREA_NAME = agvTask.S_END_AREA_NAME;
                                    agvTask.S_END_LOC = end.S_CODE;
                                    agvTask.S_END_AREA = end.S_AREA_CODE;
                                    agvTask.S_END_AREA_NAME = end.S_AREA_Name;
                                    agvTask.S_TYPE = workFlow.FLOWNAME;
                                    newDb.BeginTran();
                                    var I = newDb.Updateable(agvTask).UpdateColumns(it => new { it.S_START_LOC, it.S_START_AREA,it.S_END_LOC,it.S_END_AREA,it.S_TYPE,it.S_B_STATE }).ExecuteCommand();
                                    var I = newDb.Updateable(agvTask).UpdateColumns(it => new { it.S_START_LOC, it.S_START_AREA,it.S_END_LOC,it.S_END_AREA,it.S_TYPE,it.S_B_STATE, it.S_START_AREA_NAME, it.S_END_AREA_NAME }).ExecuteCommand();
                                    if (I == 0)
                                    {
                                        throw new Exception("修改任务表失败");
                                    }
                                    newDb.CommitTran();
                                    //改参数通知小车
                                }
                            }
                            newDb.BeginTran();
                            var R = newDb.Insertable(RfidChek).ExecuteCommand();
                            if (R == 0)
@@ -687,25 +724,40 @@
                                throw new Exception("添加RFID校验表失败");
                            }
                            newDb.CommitTran();
                        }
                        break;
                    //9取货无货
                    case "9":
                        LogHelper.Info($"任务号{transportTask.S_CODE},取货无货,取消任务", "Wcs任务执行通知");
                        if (WcsCancellTask(transportTask)) {
                            LogHelper.Info($"任务号{transportTask.S_CODE},取消任务成功,起点{transportTask.S_START_LOC}设为异常", "Wcs任务执行通知");
                            TaskHelper.Fail(transportTask);
                            TaskProcess.OperateStatus(transportTask, 7);
                            LocationHelper.updateLocLock(transportTask.S_START_LOC, 4, "异常锁");
                            var agvTask = TaskHelper.GetTask(transportTask.S_OP_CODE + "_1");
                            if (agvTask!=null)
                    //取货完成
                    case "5":
                        TaskHelper.UpdateStatus(transportTask, "取货完成");
                        LocationHelper.UnBindingLoc(transportTask.S_START_LOC, transportTask.S_CNTR_CODE.Split(',').ToList());
                        break;
                    //7取消
                    case "7":
                        if (transportTask.S_B_STATE=="完成")
                        {
                            throw new Exception($"{transportTask}任务已完成,不允许取消");
                        }
                        LogHelper.Info($"任务号{transportTask.S_CODE},取消任务成功", "Wcs任务执行通知");
                        TaskHelper.Fail(transportTask);
                        TaskProcess.OperateStatus(transportTask, 7);
                        if (transportTask.S_TYPE.Contains("出库"))
                        {
                            var agvTask1 = TaskHelper.GetTaskByWorkNo(transportTask.S_OP_CODE, "agv");
                            if (agvTask1 != null)
                            {
                                TaskHelper.Fail(agvTask);
                                NDCApi.CancelOrder(agvTask.S_CODE.Trim());
                                TaskProcess.CacheBitCancelUpdate(agvTask);
                                TaskHelper.Fail(agvTask1);
                                NDCApi.CancelOrder(agvTask1.S_CODE.Trim());
                                TaskProcess.CacheBitCancelUpdate(agvTask1);
                            }
                        }
                        else {
                            ContainerHelper.delCntr(transportTask.S_CNTR_CODE);
                            ContainerHelper.delCntrItem(transportTask.S_CNTR_CODE);
                        }
                        break;
                    default:
                        break;
@@ -713,13 +765,15 @@
                result.msg = "通知成功";
                result.code = "0";
                result.requestPk = model.requestPk;
            }
            catch (Exception ex)
            {
                newDb.RollbackTran();
                result.msg = ex.Message;
                result.msg = "Wcs任务执行通知异常";
                result.code = "1";
                result.requestPk = model.requestPk;
                LogHelper.Info("Wcs任务执行通知异常" + ex.Message, "Wcs任务执行通知");
                return result;
            }
@@ -772,14 +826,16 @@
                newDb.CommitTran();
                result.code = "0";
                result.msg = "成功";
                result.requestPk = model.requestPk;
                LogHelper.Info("Wcs报警上报返回"+ JsonConvert.SerializeObject(result), "报警上报");
                return result;
            }
            catch (Exception ex)
            {
                newDb.RollbackTran();
                result.msg = ex.Message;
                result.msg = "Wcs报警信息异常";
                result.code = "1";
                result.requestPk = model.requestPk;
                LogHelper.Info("Wcs报警信息异常" + ex.Message, "报警上报");
                return result;
            }
@@ -897,14 +953,16 @@
               
                result.code = "0";
                result.msg = "成功";
                result.requestPk = model.requestPk;
                LogHelper.Info("Wcs巷道可用上报返回" + JsonConvert.SerializeObject(result), "巷道可用上报");
                return result;
            }
            catch (Exception ex)
            {
                newDb.RollbackTran();
                result.msg = ex.Message;
                result.msg = "Wcs巷道可用上报异常";
                result.code = "1";
                result.requestPk = model.requestPk;
                LogHelper.Info("Wcs巷道可用上报异常" + ex.Message, "巷道可用上报");
                return result;
            }
@@ -930,62 +988,42 @@
                LogHelper.Info("查询到安全请求信号记录表已经存在数据,此次信号不下达给立库", "agv执行通知");
                return true;
            }
            if (mst.S_TYPE.Contains("入库"))
            switch (state)
            {
                 Type = "2";
                 bit = mst.S_END_LOC;
                if (state == 1103)
                {
                    Meshod = "AgvRequest";
                    bit = mst.S_END_LOC;
                }
                else if (state == 7)
                {
                    Type = "3";
                    Meshod = "AgvRequestCancel";
                }
                else if (state == 4) {
                    //申请出门
                    Type = "4";
                    Meshod = "AgvRequest";
                    bit = mst.S_END_LOC;
                }
                else
                {
                    Meshod = "Complete";
                }
            }
            else if (mst.S_TYPE.Contains("出库"))
            {
                Type = "1";
                bit = mst.S_START_LOC;
                if (state == 1101)
                {
                    Meshod = "AgvRequest";
                }
                else if (state == 7)
                {
                    Type = "3";
                    Meshod = "AgvRequestCancel";
                }
                else if (state == 3)
                {
                    //申请进门
                    Type = "3";
                    Meshod = "AgvRequest";
                case 1101:
                    Type = "1";
                    bit = mst.S_START_LOC;
                }
                else
                {
                    Meshod = "AgvRequest";
                    break;
                case 1102:
                    Type = "1";
                    bit = mst.S_START_LOC;
                    Meshod = "Complete";
                }
                    break;
                case 1103:
                    Type = "2";
                    bit = mst.S_END_LOC;
                    Meshod = "AgvRequest";
                    break;
                case 1104:
                    Type = "2";
                    bit = mst.S_END_LOC;
                    Meshod = "Complete";
                    break;
                case 7:
                    Type = "5";
                    if (mst.S_TYPE.Contains("出库"))
                    {
                        bit = mst.S_START_LOC;
                    }
                    else {
                        bit = mst.S_END_LOC;
                    }
                    Meshod = "AgvRequestCancel";
                    break;
            }
            else
            {
                LogHelper.Info("除了出入库其余不需要安全请求", "agv执行通知");
                return true;
            }
@@ -1157,41 +1195,68 @@
                            throw new Exception($"未查询到任务号{model.taskNo}的任务");
                        }
                        if (task.S_B_STATE.Contains("完成")|| task.S_B_STATE.Contains("取消") || task.S_B_STATE.Contains("失败"))
                    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)
                            {
                                TaskHelper.Fail(agvTask);
                                NDCApi.CancelOrder(agvTask.S_CODE.Trim());
                                TaskProcess.CacheBitCancelUpdate(agvTask);
                            }
                        }
                    }
                    else {
                        //卸货有货
                        if (task.S_B_STATE.Contains("完成") || 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 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).OrderBy(b=>b.N_COL).First();
                        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();
                      LogHelper.Info($"Wcs放货有货寻找新终点信息" + JsonConvert.SerializeObject(end), "放货有货");
                        LogHelper.Info($"Wcs放货有货寻找新终点信息" + JsonConvert.SerializeObject(end), "放货有货");
                    if (end!=null)
                    {
                        newDb.BeginTran();
                        endLoc.N_LOCK_STATE = 4;
                        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();
                        newDb.CommitTran();
                        LocationHelper.LockLoc(end.S_CODE, "入库锁", 1);
                        result.msg = end.S_CODE;
                        result.code = "0";
                        if (end != null)
                        {
                            newDb.BeginTran();
                            endLoc.N_LOCK_STATE = 4;
                            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();
                            newDb.CommitTran();
                            LocationHelper.LockLoc(end.S_CODE, "入库锁", 1);
                            result.msg = end.S_CODE;
                            result.code = "0";
                            result.requestPk = model.requestPk;
                        }
                        else
                        {
                            throw new Exception($"未查询到库区{endLoc.S_AREA_CODE}有符合的货位");
                        }
                    }
                    else
                    {
                        throw new Exception($"未查询到库区{endLoc.S_AREA_CODE}有符合的货位");
                     }
                    }
                    catch (Exception ex)
                    {
                        newDb.RollbackTran();
                        result.msg = ex.Message;
                        result.msg = "Wcs放货有货异常";
                        result.code = "1";
                        result.requestPk = model.requestPk;
                        LogHelper.Info("Wcs放货有货异常" + ex.Message, "放货有货");
                    return result;
                    }
@@ -1229,14 +1294,16 @@
                newDb.CommitTran();
                result.code = "0";
                result.msg = "成功";
                result.requestPk = model.requestPk;
                LogHelper.Info("Wcs通知确认返回" + JsonConvert.SerializeObject(result), "通知确认");
                return result;
            }
            catch (Exception ex)
            {
                newDb.RollbackTran();
                result.msg = ex.Message;
                result.msg = "Wcs通知确认异常";
                result.code = "1";
                result.requestPk = model.requestPk;
                LogHelper.Info("Wcs通知确认异常" + ex.Message, "通知确认");
                return result;
            }
@@ -1259,6 +1326,18 @@
            public string status { get; set; }
    }
    /// <summary>
    /// mes汇报任务返回
    /// </summary>
    public class MesTaskReturn
    {
        public string code { get; set; }
        public string msg { get; set; }
        public bool success { get; set; }
        public DataItem lastTime { get; set; }
    }
    /// <summary>
    /// Mes接口返回
    /// </summary>