杨张扬
12 小时以前 f9d7694d27475954449ce3073938af98a4798b07
api/ApiHelper.cs
@@ -116,17 +116,19 @@
        }
        /// <summary>
        /// PDA满托抽检判断
        /// PDA满托复检判断
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        internal static SimpleResult PDAFullCheckIn(PDAFullCheckInfo model)
        {
            LogHelper.Info("触发API:PDA满托抽检判断" + JsonConvert.SerializeObject(model), "API");
            var db = new SqlHelper<object>().GetInstance();
            LogHelper.Info("触发API:PDA满托复检判断" + JsonConvert.SerializeObject(model), "API");
            var result = new SimpleResult();//返回结果
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var locCnt = db.Queryable<TN_Loc_Container>().First(a => a.S_CNTR_CODE == model.rfId);
                if (locCnt == null)
                {
@@ -150,7 +152,7 @@
                if (startLoc == null)
                {
                    result.resultCode = 3;
                    result.resultMsg = $"起点货位{locCnt.S_LOC_CODE}未解锁,或者不属于抽检区";
                    result.resultMsg = $"起点货位{locCnt.S_LOC_CODE}未解锁,或者不属于复检区";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
@@ -161,7 +163,21 @@
                    cG_Detail.N_ITEM_STATE = 0;
                    cG_Detail.S_ITEM_STATE = "合格";
                    endLoc = db.Queryable<TN_Location>().
                            Where(o => o.S_AREA_CODE == Settings.Areas[1] && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无" && o.C_ENABLE == "Y" && o.N_CURRENT_NUM == 0).
                            Where(o => o.S_AREA_CODE == Settings.Areas[1]
                            && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无"
                             && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).NotAny()
                            && o.C_ENABLE == "Y" && o.N_CURRENT_NUM == 0).
                            OrderBy(o => o.T_MODIFY, OrderByType.Asc).First();//查询合适的终点货位
                }
                else if (model.cgState == 4)//技术判定回库
                {
                    cG_Detail.N_ITEM_STATE = 4;
                    cG_Detail.S_ITEM_STATE = "技术判定";
                    endLoc = db.Queryable<TN_Location>().
                            Where(o => o.S_AREA_CODE == Settings.Areas[8]
                            && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无"
                            && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).NotAny()
                            && o.C_ENABLE == "Y" && o.N_CURRENT_NUM == 0).
                            OrderBy(o => o.T_MODIFY, OrderByType.Asc).First();//查询合适的终点货位
                }
                else if (model.cgState == 2)//不合格回炉
@@ -169,13 +185,49 @@
                    cG_Detail.N_ITEM_STATE = 2;
                    cG_Detail.S_ITEM_STATE = "不合格";
                    endLoc = db.Queryable<TN_Location>().
                            Where(o => o.S_AREA_CODE == Settings.Areas[8] && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无" && o.C_ENABLE == "Y" && o.N_CURRENT_NUM == 0).
                            Where(o => o.S_AREA_CODE == Settings.Areas[8]
                            && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无"
                            && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).NotAny()
                            && o.C_ENABLE == "Y" && o.N_CURRENT_NUM == 0).
                            OrderBy(o => o.T_MODIFY, OrderByType.Asc).First();//查询合适的终点货位
                }
                else if (model.cgState == 5)//混合也回库,通过点对点再发线边
                {
                    cG_Detail.N_ITEM_STATE = 5;
                    cG_Detail.S_ITEM_STATE = "混合";
                    endLoc = db.Queryable<TN_Location>().
                            Where(o => o.S_AREA_CODE == Settings.Areas[2]
                            && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无"
                            && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).NotAny()
                            && o.C_ENABLE == "Y" && o.N_CURRENT_NUM == 0).
                            OrderBy(o => o.T_MODIFY, OrderByType.Asc).First();//查询合适的终点货位
                }
                else if (model.cgState == 6)//一级料二级料回库
                {
                    cG_Detail.N_ITEM_STATE = 6;
                    cG_Detail.S_ITEM_STATE = "一级料";
                    endLoc = db.Queryable<TN_Location>().
                            Where(o => o.S_AREA_CODE == Settings.Areas[2]
                            && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无"
                            && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).NotAny()
                            && o.C_ENABLE == "Y" && o.N_CURRENT_NUM == 0).
                            OrderBy(o => o.T_MODIFY, OrderByType.Asc).First();//查询合适的终点货位
                }
                else if (model.cgState == 7)//一级料二级料回库
                {
                    cG_Detail.N_ITEM_STATE = 7;
                    cG_Detail.S_ITEM_STATE = "二级料";
                    endLoc = db.Queryable<TN_Location>().
                            Where(o => o.S_AREA_CODE == Settings.Areas[2]
                            && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无"
                            && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).NotAny()
                            && o.C_ENABLE == "Y" && o.N_CURRENT_NUM == 0).
                            OrderBy(o => o.T_MODIFY, OrderByType.Asc).First();//查询合适的终点货位
                }
                else
                {
                    result.resultCode = 6;
                    result.resultMsg = $"物料状态只能为0或2,即参数cgState = 2 或 = 0,如果为其他值,则不处理,0合格,2不合格";
                    result.resultMsg = $"物料状态只能为0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6一级料、7二级料,如果为其他值,则不处理";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
@@ -188,15 +240,23 @@
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                var typeName = (model.cgState == 0) ? "人工抽检回库" : "人工抽检回炉";
                //创建人工拆盘出库任务
                var typeName = (model.cgState == 0) ? "人工复检回库" : "人工复检回炉";
                //创建人工复检任务
                if (WCSHelper.CreateTask(startLoc.S_CODE, endLoc.S_CODE, typeName, 3, locCnt.S_CNTR_CODE,out string taskNo,cG_Detail.S_SPE))//创建搬送任务,起点终点容器
                {
                    LocationHelper.LockLoc(startLoc.S_CODE, 2);//起点出库锁,
                    LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁
                    LogHelper.Info($"生成{typeName}任务成功,容器号{locCnt.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}");
                    db.Updateable<TN_CG_Detail>().UpdateColumns(it => new { it.S_ITEM_STATE, it.N_ITEM_STATE }).ExecuteCommand();
                    if( db.Updateable<TN_CG_Detail>(cG_Detail).UpdateColumns(it => new { it.S_ITEM_STATE, it.N_ITEM_STATE }).ExecuteCommand() <= 0)
                    {
                        result.resultCode = 5;
                        result.resultMsg = $"更新容器{locCnt.S_CNTR_CODE}的货品明细失败";
                        LogHelper.Info(result.resultMsg);
                        return result;
                    }
                    Task task99 = Task.Run(() =>
                    {
@@ -209,17 +269,38 @@
                        {
                            var target = new TN_RemeltDetail()
                            {
                                CntCode = locCnt.S_CNTR_CODE,
                                StartLoc = startLoc.S_CODE,
                                LoginName = model.staff,
                                ItemCode = cG_Detail.S_ITEM_CODE,
                                Spec = cG_Detail.S_SPE,
                                CarCode = cG_Detail.S_CAR_CODE,
                                Weight = cG_Detail.F_QTY,
                                RemeltTime = DateTime.Now,
                                TaskNo = taskNo
                                CNTCODE = locCnt.S_CNTR_CODE,
                                STARTLOC = startLoc.S_CODE,
                                LOGINNAME = model.staff,
                                ITEMCODE = cG_Detail.S_ITEM_CODE,
                                SPEC = cG_Detail.S_SPE,
                                CARCODE = cG_Detail.S_CAR_CODE,
                                WEIGHT = cG_Detail.F_QTY,
                                REMELTTIME = DateTime.Now,
                                TASKNO = taskNo,
                                SHIFT = model.shift,
                            };
                            SpecHelper.InsertRemeltDetail(target);
                        }
                    });
                    Task task27 = Task.Run(() =>
                    {
                        if (model.cgState != 2)
                        {
                            var target = new TN_InventoryM()
                            {
                                S_ID = cG_Detail.S_ID,
                                RFID = cG_Detail.S_CNTR_CODE,
                                SPEC = cG_Detail.S_SPE,
                                WEIGHT = cG_Detail.F_QTY,
                                ITEMSTATE = cG_Detail.S_ITEM_STATE,
                                ITEMCODE = cG_Detail.S_ITEM_CODE,
                                LOGINNAME = model.staff,
                                SHIFT = model.shift,
                                STARTLOC = startLoc.S_CODE,
                            };
                            SpecHelper.InsertInventoryM(target);
                        }
                    });
@@ -234,12 +315,184 @@
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
            }
            catch (Exception ex)
            {
                result.resultCode = -1;
                result.resultMsg = $"发生了异常:{ex.Message}";
                result.resultMsg = $"PDA满托复检判断,发生了异常:{ex.Message}";
                LogHelper.Info(result.resultMsg);
                return result;
            }
        }
        /// <summary>
        /// 线边空托到原材料输送线
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        internal static SimpleResult EmptyLineToLine(EmptyLineToLineInfo model)
        {
            LogHelper.Info("触发API:线边空托到原材料输送线" + JsonConvert.SerializeObject(model), "API");
            var result = new SimpleResult();//返回结果
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var startLoc = db.Queryable<TN_Location>().First(o => o.S_CODE == model.startLoc);
                if (startLoc == null)
                {
                    result.resultCode = 1;
                    result.resultMsg = $"数据库中未找到此货位:{model.startLoc}";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                if (startLoc.N_CURRENT_NUM == 1 || db.Queryable<TN_Loc_Container>().Any(a=>a.S_LOC_CODE==model.startLoc))
                {
                    result.resultCode = 2;
                    result.resultMsg = $"此货位:{model.startLoc},已绑定托盘";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                if (startLoc.N_LOCK_STATE != 0  || startLoc.S_LOCK_STATE != "无")
                {
                    result.resultCode = 3;
                    result.resultMsg = $"此货位:{model.startLoc},已上锁";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                if (startLoc.C_ENABLE != "Y")
                {
                    result.resultCode = 4;
                    result.resultMsg = $"此货位:{model.startLoc},未启用";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                var startLocArea = Settings.Areas[13];
                if (startLoc.S_AREA_CODE != startLocArea)
                {
                    result.resultCode = 5;
                    result.resultMsg = $"此货位:{model.startLoc},不属于线边空托区{startLocArea}";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                var endLocIndex = Settings.LineSorting;
                var endLocLine = Settings.ProductionLines.FirstOrDefault(a => a.Sorting == endLocIndex);
                if (endLocLine == null)
                {
                    result.resultCode = 6;
                    result.resultMsg = $"配置文件中未找到序号为:{endLocIndex}的原材料产线的信息";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                var endLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == endLocLine.PointIn);
                if (endLoc == null)
                {
                    result.resultCode = 7;
                    result.resultMsg = $"数据库中未找到原材料产线空托上线口:{endLocLine.PointIn}";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                var endLocArea = Settings.Areas[14];
                if (endLoc.S_AREA_CODE != endLocArea)
                {
                    result.resultCode = 8;
                    result.resultMsg = $"此货位:{endLoc.S_CODE},不属于原材料产线空托区{endLocArea}";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                if (endLoc.N_CURRENT_NUM == 1 || db.Queryable<TN_Loc_Container>().Any(a => a.S_LOC_CODE == endLocLine.PointIn))
                {
                    result.resultCode = 9;
                    result.resultMsg = $"此货位:{model.startLoc},已绑定托盘";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                if (endLoc.N_LOCK_STATE != 0 || endLoc.S_LOCK_STATE != "无")
                {
                    result.resultCode = 10;
                    result.resultMsg = $"此货位:{model.startLoc},已上锁";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                if (endLoc.C_ENABLE != "Y")
                {
                    result.resultCode = 11;
                    result.resultMsg = $"此货位:{model.startLoc},未启用";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                var Cnt = Guid.NewGuid().ToString("D");
                using (var trans = db.Ado.UseTran())
                {
                    startLoc.N_CURRENT_NUM = 1;
                    startLoc.N_LOCK_STATE = 2;
                    startLoc.S_LOCK_STATE = "出库锁";
                    endLoc.N_LOCK_STATE = 1;
                    endLoc.S_LOCK_STATE = "入库锁";
                    var locCnt = new TN_Loc_Container()
                    {
                        S_LOC_CODE = startLoc.S_CODE,
                        S_CNTR_CODE = Cnt,
                    };
                    var task = new TN_Task()
                    {
                        S_CODE = WCSHelper.GenerateTaskNo(),
                        S_START_AREA = startLoc.S_AREA_CODE,
                        S_END_AREA = endLoc.S_AREA_CODE,
                        S_START_LOC = startLoc.S_CODE,
                        S_END_LOC = endLoc.S_CODE,
                        S_TYPE = "线边空托上线",
                        N_PRIORITY = 3,
                        N_SCHEDULE_TYPE = 1,
                        N_B_STATE = 0,
                        S_B_STATE = "等待",
                        S_CNTR_CODE = Cnt,
                    };
                    if (
                        db.Updateable<TN_Location>(startLoc).UpdateColumns(it=>new {it.N_CURRENT_NUM,it.N_LOCK_STATE,it.S_LOCK_STATE }).ExecuteCommand() == 1 &&
                        db.Updateable<TN_Location>(endLoc).UpdateColumns(it=>new {it.N_LOCK_STATE,it.S_LOCK_STATE }).ExecuteCommand() == 1 &&
                        db.Insertable<TN_Loc_Container>(locCnt).ExecuteCommand() == 1 &&
                        db.Insertable<TN_Task>(task).ExecuteCommand() == 1
                        )
                    {
                        if (Settings.LineSorting < Settings.ProductionLines.Count - 1)
                        {
                            Settings.LineSorting++;
                        }
                        else
                        {
                            Settings.LineSorting = 0;
                        }
                        trans.CommitTran();
                        result.resultCode = 0;
                        result.resultMsg = $"创建 线边空托上线 任务成功,起点:{startLoc.S_CODE},终点:{endLoc.S_CODE}";
                        LogHelper.Info(result.resultMsg);
                        return result;
                    }
                    else
                    {
                        trans.RollbackTran();
                        result.resultCode = 12;
                        result.resultMsg = $"创建 线边空托上线 任务失败,起点:{startLoc.S_CODE},终点:{endLoc.S_CODE}";
                        LogHelper.Info(result.resultMsg);
                        return result;
                    }
                }
            }
            catch(Exception ex)
            {
                result.resultCode = -1;
                result.resultMsg = $"PDA满托复检判断,发生了异常:{ex.Message}";
                LogHelper.Info(result.resultMsg);
                return result;
            }
@@ -253,11 +506,13 @@
        internal static SimpleResult PDAReturnReset(PDAReturnResetInfo model)
        {
            LogHelper.Info("触发API:人工次品回炉" + JsonConvert.SerializeObject(model), "API");
            var db = new SqlHelper<object>().GetInstance();
            var result = new SimpleResult();//返回结果
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var startLoc  =  db.Queryable<TN_Location>().First(o => o.S_CODE == model.startLoc && o.N_CURRENT_NUM ==0 && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE=="无" && o.S_AREA_CODE == Settings.Areas[4]);
                if (startLoc == null)
                {
@@ -267,7 +522,13 @@
                    return result;
                }
                var endLoc = db.Queryable<TN_Location>().First(o =>o.S_AREA_CODE == Settings.Areas[11] && o.N_CURRENT_NUM == 0 && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无");
                var endLoc = db.Queryable<TN_Location>().
                    Where(o =>o.S_AREA_CODE == Settings.Areas[11]
                    && o.N_CURRENT_NUM == 0
                    && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无"
                    && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).NotAny()
                    ).First();
                if (endLoc == null)
                {
                    result.resultCode = 2;
@@ -306,7 +567,7 @@
                endLoc.N_LOCK_STATE = 1;
                endLoc.S_LOCK_STATE = "入库锁";
                startLoc.T_MODIFY = System.DateTime.Now;
                endLoc.T_MODIFY = System.DateTime.Now;
                using (var tran = db.Ado.UseTran())
                {
@@ -365,18 +626,35 @@
                            WMSHelper.InsertOpInfo(model.staff, "人工次品回炉", locCnt.S_CNTR_CODE);
                        });
                        Task task2 = Task.Run(() =>
                        {
                            var target = new TN_RemeltDetail()
                            {
                                TASKNO = task1.S_CODE,
                                CNTCODE = model.rfId,
                                STARTLOC = model.startLoc,
                                LOGINNAME = model.staff,
                                ITEMCODE = cgInfo.S_ITEM_CODE,
                                SPEC = cgInfo.S_SPE,
                                CARCODE = cgInfo.S_CAR_CODE,
                                WEIGHT = cgInfo.F_QTY,
                                REMELTTIME = DateTime.Now,
                                SHIFT = model.shift,
                            };
                            SpecHelper.InsertRemeltDetail(target);
                        });
                        tran.CommitTran();
                        result.resultCode = 0;
                        result.resultMsg = "成功";
                        LogHelper.Info($"生成满托下线入库任务成功,容器:{model.rfId},起点:{model.startLoc},终点:{endLoc.S_CODE}");
                        LogHelper.Info($"生成人工次品回炉任务成功,容器:{model.rfId},起点:{model.startLoc},终点:{endLoc.S_CODE}");
                        return result;
                    }
                    else
                    {
                        tran.RollbackTran();
                        result.resultCode = 7;
                        result.resultMsg = $"生成满托下线入库任务失败,容器:{model.rfId},起点:{model.startLoc},终点:{endLoc.S_CODE}";
                        result.resultMsg = $"生成人工次品回炉任务失败,容器:{model.rfId},起点:{model.startLoc},终点:{endLoc.S_CODE}";
                        LogHelper.Info(result.resultMsg);
                        return result;
                    }
@@ -386,7 +664,7 @@
            catch(Exception ex)
            {
                result.resultCode = -1;
                result.resultMsg = $"发生了异常:{ex.Message}";
                result.resultMsg = $"生成人工次品回炉任务失败,发生了异常:{ex.Message}";
                LogHelper.Info(result.resultMsg);
                return result;
            }
@@ -412,7 +690,7 @@
                var allCount = allCg.Count;
                var waittime = SpecHelper.GetExportTime(model.Spe);
                var okCount = allCg.Count(o => o.N_ITEM_STATE == 0 && o.S_ITEM_STATE == "合格" && o.T_MODIFY.AddMinutes(waittime) <= System.DateTime.Now);
                var okCount = allCg.Count(o => o.N_ITEM_STATE == 0 && o.S_ITEM_STATE == "合格" && o.T_MODIFY.AddHours(waittime) <= System.DateTime.Now);
                return $"满足{model.Spe}规格的总托盘数量:{allCount},其中合格且静置时间已过的托盘数量:{okCount}";
            }
            catch (Exception ex)
@@ -579,213 +857,214 @@
        /// </summary>
        internal static SimpleResult PDAFullInArea(PDAFullInAreaInfo model)
        {
            var db = new SqlHelper<object>().GetInstance();
            var result = new SimpleResult();//返回结果
            LogHelper.Info("触发API:PDA满托下线入库" + JsonConvert.SerializeObject(model), "API");
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                if (model.RfId.Length < 16)
                {
                    result.resultCode = 1;
                    result.resultMsg = $"输入的RFID,长度不够,要大于16位";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                model.RfId = WMSHelper.ConvertHexToAscii(model.RfId.Substring(0,16));
                //该产线的满托下线位置,起点
                var startPoint = Settings.ProductionLines.FirstOrDefault(a => a.PointOut == model.StartLoc);
                if (startPoint != null)//起点存在
                {
                    var woInfo = db.Queryable<TN_WorkOrder>().Where(a => a.S_LINE_NO == startPoint.ProductionLine_Name && a.S_B_STATE == "开启").OrderBy(b => b.T_CREATE, OrderByType.Desc).First();
                    if (woInfo != null)//当前产线不存在开启的最新的工单
                    var startLoc = db.Queryable<TN_Location>().First(a => a.S_LOCK_STATE == "无" && a.N_LOCK_STATE == 0 && a.S_CODE == model.StartLoc && a.C_ENABLE == "Y");
                    if (startLoc != null)//该产线的起点没锁住
                    {
                        var startLoc = db.Queryable<TN_Location>().First(a => a.S_LOCK_STATE == "无" && a.N_LOCK_STATE == 0 && a.S_CODE == model.StartLoc && a.C_ENABLE == "Y");
                        if (startLoc != null)//该产线的起点没锁住
                        var cgInfo = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == model.RfId);
                        if (cgInfo != null)//有残留的容器货品明细关系表信息
                        {
                            var cgInfo = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == model.RfId);
                            if (cgInfo != null)//有残留的容器货品明细关系表信息
                            result.resultCode = 1;
                            result.resultMsg = $"该容器{model.RfId}已绑定货品{cgInfo.S_ITEM_CODE},如果要使用,容器先解绑货品";
                            LogHelper.Info(result.resultMsg);
                            return result;
                        }
                        else
                        {
                            var locCntrRel = db.Queryable<TN_Loc_Container>().First(a => a.S_CNTR_CODE == model.RfId);
                            if (locCntrRel != null)//当前容器是否绑定了货位
                            {
                                result.resultCode = 1;
                                result.resultMsg = $"该容器{model.RfId}已绑定货品{cgInfo.S_ITEM_CODE},如果要使用,容器先解绑货品";
                                result.resultCode = 2;
                                result.resultMsg = $"该容器{model.RfId}已绑定货位{locCntrRel.S_LOC_CODE},如果要使用,容器先解绑货位";
                                LogHelper.Info(result.resultMsg);
                                return result;
                            }
                            else
                            {
                                var locCntrRel = db.Queryable<TN_Loc_Container>().First(a => a.S_CNTR_CODE == model.RfId);
                                if (locCntrRel != null)//当前容器是否绑定了货位
                                //新增货位容器关系表
                                locCntrRel = new TN_Loc_Container()
                                {
                                    result.resultCode = 2;
                                    result.resultMsg = $"该容器{model.RfId}已绑定货位{locCntrRel.S_LOC_CODE},如果要使用,容器先解绑货位";
                                    S_LOC_CODE = startPoint.PointOut,
                                    S_CNTR_CODE = model.RfId,
                                };
                                var readBytes1 = S7Helper.ReadBytes(startPoint.ProductionLine_IP, 20, 2, 4);
                                byte[] rfid = new byte[4] { readBytes1[0], readBytes1[1], readBytes1[2], readBytes1[3] };
                                string rfids16 = BitConverter.ToString(rfid);
                                string rfids = (((readBytes1[0]) << 24) + (readBytes1[1] << 16) + (readBytes1[2] << 8) + readBytes1[3]).ToString();
                                LogHelper.Info($"产线容器号:{rfids},其16进制形式:{rfids16}");
                                if (rfids != model.RfId)
                                {
                                    result.resultCode = 9;
                                    result.resultMsg = $"PDA填入的容器号{model.RfId}与S7产线通讯的容器号{rfids}不同";
                                    LogHelper.Info(result.resultMsg);
                                    return result;
                                }
                                else
                                var readBytes2 = S7Helper.ReadBytes(startPoint.ProductionLine_IP, 20, 26, 2);
                                var modelWeight = ((readBytes2[0]) << 8) + readBytes2[1];
                                var modelCI = db.Queryable<TN_CAR_IN>().First(i => i.S_CAR_CODE == model.CarCode && i.S_CNTR_CODE == model.RfId && i.S_B_STATE == "0");//查询是否有这个对应的且状态正常的容器车号子表
                                TN_CG_Detail tN_CG_Detail = new TN_CG_Detail()//新增容器货品明细表
                                {
                                    //新增货位容器关系表
                                    locCntrRel = new TN_Loc_Container()
                                    S_CNTR_CODE = model.RfId,
                                    S_ITEM_SPEC = model.Spe,
                                    S_SPE = model.Spe,
                                    S_CAR_CODE = model.CarCode,
                                    N_ITEM_STATE = 1,
                                    S_ITEM_STATE = "待检",
                                    F_QTY = modelWeight,//这里的重量要当成数量来使用
                                };
                                var endLoc = db.Queryable<TN_Location>().
                                                      Where(c => c.S_AREA_CODE == Settings.Areas[1]
                                                      && c.S_LOCK_STATE == "无" && c.N_LOCK_STATE == 0
                                                      && c.N_CURRENT_NUM == 0 && c.C_ENABLE == "Y"
                                                      && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == c.S_CODE).NotAny()//不能有货
                                                      ).
                                                      OrderBy(o => o.N_LAYER, OrderByType.Asc).First();//查询合适的终点货位,1层先入库
                                if (endLoc != null)
                                {
                                    var task1 = new TN_Task()
                                    {
                                        S_LOC_CODE = startPoint.PointOut,
                                        S_CODE = WCSHelper.GenerateTaskNo(),
                                        S_START_AREA = startLoc.S_AREA_CODE,
                                        S_END_AREA = endLoc.S_AREA_CODE,
                                        S_START_LOC = startLoc.S_CODE,
                                        S_END_LOC = endLoc.S_CODE,
                                        S_TYPE = "PDA满托下线入库",
                                        N_B_STATE = 0,
                                        S_CNTR_CODE = model.RfId,
                                        S_SPEC = model.Spe,
                                    };
                                    var readBytes1 = S7Helper.ReadBytes(startPoint.ProductionLine_IP, 20, 2, 4);
                                    byte[] rfid = new byte[4] { readBytes1[0], readBytes1[1], readBytes1[2], readBytes1[3] };
                                    string rfids16 = BitConverter.ToString(rfid);
                                    string rfids = (((readBytes1[0]) << 24) + (readBytes1[1] << 16) + (readBytes1[2] << 8) + readBytes1[3]).ToString();
                                    LogHelper.Info($"产线容器号:{rfids},其16进制形式:{rfids16}");
                                    startLoc.N_LOCK_STATE = 2;
                                    startLoc.S_LOCK_STATE = "出库锁";
                                    startLoc.N_CURRENT_NUM = 1;
                                    startLoc.T_MODIFY = DateTime.Now;
                                    if (rfids != model.RfId)
                                    endLoc.N_LOCK_STATE = 1;
                                    endLoc.S_LOCK_STATE = "入库锁";
                                    startLoc.T_MODIFY = DateTime.Now;
                                    using (var tran = db.Ado.UseTran())
                                    {
                                        result.resultCode = 9;
                                        result.resultMsg = $"PDA填入的容器号{model.RfId}与S7产线通讯的容器号{rfids}不同";
                                        LogHelper.Info(result.resultMsg);
                                        return result;
                                    }
                                    var readBytes2 = S7Helper.ReadBytes(startPoint.ProductionLine_IP, 20, 26, 2);
                                    var modelWeight = ((readBytes2[0]) << 8) + readBytes2[1];
                                    var modelCI = db.Queryable<TN_CAR_IN>().First(i => i.S_CAR_CODE == model.CarCode && i.S_CNTR_CODE == model.RfId && i.S_B_STATE == "0");//查询是否有这个对应的且状态正常的容器车号子表
                                    TN_CG_Detail tN_CG_Detail = new TN_CG_Detail()//新增容器货品明细表
                                    {
                                        S_CNTR_CODE = model.RfId,
                                        S_ITEM_CODE = woInfo.S_ITEM_CODE,
                                        S_BATCH_NO = woInfo.S_BATCH_CODE,
                                        S_ITEM_SPEC = woInfo.S_ITEM_SPEC,
                                        S_SPE= woInfo.S_ITEM_SPEC,
                                        S_CAR_CODE = model.CarCode,
                                        N_ITEM_STATE = 1,
                                        S_ITEM_STATE = "待检",
                                        F_QTY = modelWeight,//这里的重量要当成数量来使用
                                    };
                                    var endLoc = db.Queryable<TN_Location>().
                                                          Where(c => c.S_AREA_CODE == Settings.Areas[1] && c.S_LOCK_STATE == "无" && c.N_LOCK_STATE == 0 && c.N_CURRENT_NUM == 0 && c.C_ENABLE == "Y").
                                                          OrderBy(o => o.T_MODIFY, OrderByType.Asc).First();//查询合适的终点货位,直接判断当前数量为0即可
                                    if (endLoc != null)
                                    {
                                        var task1 = new TN_Task()
                                        if (modelCI == null)//容器车号子表不存在
                                        {
                                            S_CODE = WCSHelper.GenerateTaskNo(),
                                            S_START_AREA = startLoc.S_AREA_CODE,
                                            S_END_AREA = endLoc.S_AREA_CODE,
                                            S_START_LOC = startLoc.S_CODE,
                                            S_END_LOC = endLoc.S_CODE,
                                            S_TYPE = "PDA满托下线入库",
                                            N_B_STATE = 0,
                                            S_CNTR_CODE = model.RfId,
                                            S_SPEC = model.Spe,
                                        };
                                        startLoc.N_LOCK_STATE = 2;
                                        startLoc.S_LOCK_STATE = "出库锁";
                                        startLoc.N_CURRENT_NUM = 1;
                                        startLoc.T_MODIFY = DateTime.Now;
                                        endLoc.N_LOCK_STATE = 1;
                                        endLoc.S_LOCK_STATE = "入库锁";
                                        startLoc.T_MODIFY = DateTime.Now;
                                        using (var tran = db.Ado.UseTran())
                                        {
                                            if (modelCI == null)//容器车号子表不存在
                                            modelCI = new TN_CAR_IN()
                                            {
                                                modelCI = new TN_CAR_IN()
                                                {
                                                    S_CNTR_CODE = model.RfId,
                                                    S_CAR_CODE = model.CarCode,
                                                    S_B_STATE = "0",
                                                };
                                                if (db.Insertable<TN_CAR_IN>(modelCI).ExecuteCommand() <= 0)
                                                {
                                                    tran.RollbackTran();
                                                    result.resultCode = 8;
                                                    result.resultMsg = $"新增的TN_CAR_IN表插入失败,容器:{modelCI.S_CNTR_CODE},车号:{modelCI.S_CAR_CODE}";
                                                    LogHelper.Info(result.resultMsg);
                                                    return result;
                                                }
                                            }
                                            if (db.Insertable<TN_Task>(task1).ExecuteCommand() > 0 &&
                                                db.Updateable<TN_Location>(startLoc).ExecuteCommand() > 0 &&
                                                db.Updateable<TN_Location>(endLoc).ExecuteCommand() > 0 &&
                                                db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0 &&
                                                db.Insertable<TN_CG_Detail>(tN_CG_Detail).ExecuteCommand() > 0)//创建搬送任务,起点终点容器
                                            {
                                                tran.CommitTran();
                                                result.resultCode = 0;
                                                result.resultMsg = "成功";
                                                LogHelper.Info($"生成PDA满托下线入库任务成功,容器:{modelCI.S_CNTR_CODE},起点:{startPoint.PointOut},终点:{endLoc.S_CODE}");
                                                Task task99 = Task.Run(() =>
                                                {
                                                    WMSHelper.InsertOpInfo(model.staff, "PDA满托下线入库", modelCI.S_CNTR_CODE);
                                                });
                                                Task task98 = Task.Run(() =>
                                                {
                                                    var target = new TN_EquipProDetail()
                                                    {
                                                        S_ID = tN_CG_Detail.S_ID,
                                                        TaskType = "PDA满托下线入库",
                                                        RFID = model.RfId,
                                                        Spec = woInfo.S_ITEM_SPEC,
                                                        CarCode = model.CarCode,
                                                        Weight = modelWeight,
                                                        ItemState = "待检",
                                                        ItemCode = woInfo.S_ITEM_CODE,
                                                        LoginName = model.staff,
                                                        Shift = "None",
                                                        StartLoc = startLoc.S_CODE,
                                                    };
                                                    SpecHelper.InsertEquipProDetail(target);
                                                });
                                                Task task27 = Task.Run(() =>
                                                {
                                                    var target = new TN_InventoryM()
                                                    {
                                                        S_ID = tN_CG_Detail.S_ID,
                                                        RFID = model.RfId,
                                                        Spec = woInfo.S_ITEM_SPEC,
                                                        Weight = modelWeight,
                                                        ItemState = "待检",
                                                        ItemCode = woInfo.S_ITEM_CODE,
                                                        LoginName = model.staff,
                                                        Shift = "None",
                                                    };
                                                    SpecHelper.InsertInventoryM(target);
                                                });
                                                return result;
                                            }
                                            else
                                                S_CNTR_CODE = model.RfId,
                                                S_CAR_CODE = model.CarCode,
                                                S_B_STATE = "0",
                                            };
                                            if (db.Insertable<TN_CAR_IN>(modelCI).ExecuteCommand() <= 0)
                                            {
                                                tran.RollbackTran();
                                                result.resultCode = 7;
                                                result.resultMsg = $"生成满托下线入库任务失败,容器:{modelCI.S_CNTR_CODE},起点:{startPoint.PointOut},终点:{endLoc.S_CODE}";
                                                result.resultCode = 8;
                                                result.resultMsg = $"新增的TN_CAR_IN表插入失败,容器:{modelCI.S_CNTR_CODE},车号:{modelCI.S_CAR_CODE}";
                                                LogHelper.Info(result.resultMsg);
                                                return result;
                                            }
                                        }
                                    }
                                    else
                                    {
                                        result.resultCode = 4;
                                        result.resultMsg = $"未找到合适的终点,容器:{modelCI.S_CNTR_CODE}";
                                        LogHelper.Info(result.resultMsg);
                                        return result;
                                        if (db.Insertable<TN_Task>(task1).ExecuteCommand() > 0 &&
                                            db.Updateable<TN_Location>(startLoc).ExecuteCommand() > 0 &&
                                            db.Updateable<TN_Location>(endLoc).ExecuteCommand() > 0 &&
                                            db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0 &&
                                            db.Insertable<TN_CG_Detail>(tN_CG_Detail).ExecuteCommand() > 0)//创建搬送任务,起点终点容器
                                        {
                                            tran.CommitTran();
                                            result.resultCode = 0;
                                            result.resultMsg = "成功";
                                            LogHelper.Info($"生成PDA满托下线入库任务成功,容器:{modelCI.S_CNTR_CODE},起点:{startPoint.PointOut},终点:{endLoc.S_CODE}");
                                            Task task99 = Task.Run(() =>
                                            {
                                                WMSHelper.InsertOpInfo(model.staff, "PDA满托下线入库", modelCI.S_CNTR_CODE);
                                            });
                                            Task task98 = Task.Run(() =>
                                            {
                                                var target = new TN_EquipProDetail()
                                                {
                                                    S_ID = tN_CG_Detail.S_ID,
                                                    TASKTYPE = "PDA满托下线入库",
                                                    RFID = model.RfId,
                                                    SPEC = model.Spe,
                                                    CARCODE = model.CarCode,
                                                    WEIGHT = modelWeight,
                                                    ITEMSTATE = "待检",
                                                    LOGINNAME = model.staff,
                                                    SHIFT = model.shift,
                                                    STARTLOC = startLoc.S_CODE,
                                                };
                                                SpecHelper.InsertEquipProDetail(target);
                                            });
                                            Task task27 = Task.Run(() =>
                                            {
                                                var target = new TN_InventoryM()
                                                {
                                                    S_ID = tN_CG_Detail.S_ID,
                                                    RFID = model.RfId,
                                                    SPEC = model.Spe,
                                                    WEIGHT = modelWeight,
                                                    ITEMSTATE = "待检",
                                                    LOGINNAME = model.staff,
                                                    SHIFT = model.shift,
                                                    STARTLOC = startLoc.S_CODE,
                                                };
                                                SpecHelper.InsertInventoryM(target);
                                            });
                                            return result;
                                        }
                                        else
                                        {
                                            tran.RollbackTran();
                                            result.resultCode = 7;
                                            result.resultMsg = $"生成满托下线入库任务失败,容器:{modelCI.S_CNTR_CODE},起点:{startPoint.PointOut},终点:{endLoc.S_CODE}";
                                            LogHelper.Info(result.resultMsg);
                                            return result;
                                        }
                                    }
                                }
                                else
                                {
                                    result.resultCode = 4;
                                    result.resultMsg = $"未找到合适的终点,容器:{modelCI.S_CNTR_CODE}";
                                    LogHelper.Info(result.resultMsg);
                                    return result;
                                }
                            }
                        }
                        else
                        {
                            result.resultCode = 9;
                            result.resultMsg = $"此位置:{startPoint.PointOut}已锁住";
                            LogHelper.Info(result.resultMsg);
                            return result;
                        }
                    }
                    else
                    {
                        result.resultCode = 10;
                        result.resultMsg = $"当前产线{startPoint.ProductionLine_Name}位置{startPoint.PointOut}没有开启的工单";
                        result.resultCode = 12;
                        result.resultMsg = $"此位置:{startPoint.PointOut}已锁住";
                        LogHelper.Info(result.resultMsg);
                        return result;
                    }
@@ -873,10 +1152,11 @@
            LogHelper.Info("触发API:满托出库上线" + JsonConvert.SerializeObject(model), "API");
            var result = new SimpleResult();
            var db = new SqlHelper<object>().GetInstance();
            TN_Location endLoc = new TN_Location();
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                if (model.EndLoc != string.Empty)//指定终点货位
                {
                    endLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.EndLoc);
@@ -905,7 +1185,7 @@
                        return result;
                    }
                    if (endLoc.N_CURRENT_NUM != 0)
                    if (endLoc.N_CURRENT_NUM != 0 || db.Queryable<TN_Loc_Container>().Any(b => b.S_LOC_CODE == model.EndLoc))//不能有货
                    {
                        result.resultCode = 5;
                        result.resultMsg = $"该终点货位{model.EndLoc}已满";
@@ -923,16 +1203,28 @@
                var waitTime = SpecHelper.GetWaitTime(model.Spe);
                //查询符合规格的物料所在的未锁定已启用指定货区的货位,起点
                //优先技术判定
                var startLoc = db.Queryable<TN_Location>().
                    LeftJoin<TN_Loc_Container>((o, i) => o.S_CODE == i.S_LOC_CODE).
                    LeftJoin<TN_CG_Detail>((o, i, s) => i.S_CNTR_CODE == s.S_CNTR_CODE).
                    Where((o, i, s) => o.N_CURRENT_NUM > 0 && o.S_AREA_CODE == Settings.Areas[1] && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无" && o.C_ENABLE == "Y"
                    && (s.S_ITEM_SPEC == model.Spe || s.S_SPE == model.Spe)//指定规格
                    && s.N_ITEM_STATE == 0 && s.S_ITEM_STATE == "合格" //合格的
                    && s.T_MODIFY.AddMinutes(waitTime) <= System.DateTime.Now).//根据规格的不同静置不同分钟才能出库
                    OrderBy((o, i, s) => s.T_CREATE, OrderByType.Asc).//先进先出
                    && s.N_ITEM_STATE == 4 && s.S_ITEM_STATE == "技术判定"). //技术判定
                    First();//筛选有容器货位关系表信息,筛选有容器货品明细表信息
                if (startLoc == null)//其次合格
                {
                    //查询符合规格的物料所在的未锁定已启用指定货区的货位,起点
                    startLoc = db.Queryable<TN_Location>().
                       LeftJoin<TN_Loc_Container>((o, i) => o.S_CODE == i.S_LOC_CODE).
                       LeftJoin<TN_CG_Detail>((o, i, s) => i.S_CNTR_CODE == s.S_CNTR_CODE).
                       Where((o, i, s) => o.N_CURRENT_NUM > 0 && o.S_AREA_CODE == Settings.Areas[1] && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无" && o.C_ENABLE == "Y"
                       && (s.S_ITEM_SPEC == model.Spe || s.S_SPE == model.Spe)//指定规格
                       && s.N_ITEM_STATE == 0 && s.S_ITEM_STATE == "合格" //合格的
                       && i.T_CREATE.AddMinutes(waitTime) <= System.DateTime.Now).//根据规格的不同静置不同分钟才能出库
                       OrderBy((o, i, s) => s.T_CREATE, OrderByType.Asc).//先进先出
                       First();//筛选有容器货位关系表信息,筛选有容器货品明细表信息
                }
                if (startLoc == null)
                {
@@ -970,13 +1262,15 @@
                    {
                        var target = new TN_Component_Detail()
                        {
                           ItemCode = cgInfo.S_ITEM_CODE,
                           CntrCode = container,
                           EndLoc = endLoc.S_CODE,
                           Staff = model.staff,
                           Weight = cgInfo.F_QTY,
                           Spec = model.Spe,
                           TaskNo = taskNo,
                           ITEMCODE = cgInfo.S_ITEM_CODE,
                           CNTRCODE = container,
                           CARCODE = cgInfo.S_CAR_CODE,
                           ENDLOC = endLoc.S_CODE,
                           STAFF = model.staff,
                           WEIGHT = cgInfo.F_QTY,
                           SPEC = model.Spe,
                           TASKNO = taskNo,
                           SHIFT = model.shift,
                        };
                        SpecHelper.InsertComponentDetail(target);
                    });
@@ -1008,13 +1302,14 @@
        {
            LogHelper.Info("触发API:空托下线堆叠" + JsonConvert.SerializeObject(model), "API");
            var result = new SimpleResult();
            var db = new SqlHelper<object>().GetInstance();
            TN_Location startLoc = new TN_Location();
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var startLocCntrRel = db.Queryable<TN_Loc_Container>().First(a => a.S_LOC_CODE == model.startLoc && a.S_CNTR_CODE == model.cntID);
                if (startLocCntrRel != null)
                {
@@ -1109,13 +1404,13 @@
            LogHelper.Info("触发API:余料下线入库" + JsonConvert.SerializeObject(model), "API");
            var result = new SimpleResult();
            var db = new SqlHelper<object>().GetInstance();
            TN_Location startLoc_Old = new TN_Location();
            TN_Location startLoc_New = new TN_Location();
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var cG_Detail = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == model.cntID);
                if (cG_Detail == null)
                {
@@ -1181,7 +1476,9 @@
                //查询符合的未锁定已启用指定货区的货位,终点
                var endLoc = db.Queryable<TN_Location>().
                          First(o => o.S_AREA_CODE == Settings.Areas[9] && o.S_CODE == weightPoint && o.C_ENABLE == "Y");//查询合适的终点货位
                          First(o => o.S_AREA_CODE == Settings.Areas[9]
                          && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).NotAny()
                          && o.S_CODE == weightPoint && o.C_ENABLE == "Y");//查询合适的终点货位
                if (endLoc == null)
                {
@@ -1215,17 +1512,35 @@
                    {
                        var target = new TN_SurplusDetail()
                        {
                            CntCode = model.cntID,
                            StartLoc = startLoc_New.S_CODE,
                            LoginName = model.staff,
                            ItemCode = cG_Detail.S_ITEM_CODE,
                            Spec = cG_Detail.S_SPE,
                            CarCode = cG_Detail.S_CAR_CODE,
                            Weight = cG_Detail.F_QTY,
                            RemeltTime = DateTime.Now,
                            TaskNo = taksNo
                            CNTCODE = model.cntID,
                            STARTLOC = startLoc_New.S_CODE,
                            LOGINNAME = model.staff,
                            ITEMCODE = cG_Detail.S_ITEM_CODE,
                            SPEC = cG_Detail.S_SPE,
                            CARCODE = cG_Detail.S_CAR_CODE,
                            WEIGHT = cG_Detail.F_QTY,
                            REMELTTIME = DateTime.Now,
                            TASKNO = taksNo,
                            SHIFT = model.shift,
                        };
                        SpecHelper.InsertSurplusDetail(target);
                    });
                    Task task27 = Task.Run(() =>
                    {
                        var target = new TN_InventoryM()
                        {
                            S_ID = cG_Detail.S_ID,
                            RFID = cG_Detail.S_CNTR_CODE,
                            SPEC = cG_Detail.S_SPE,
                            WEIGHT = cG_Detail.F_QTY,
                            ITEMSTATE = cG_Detail.S_ITEM_STATE,
                            ITEMCODE = cG_Detail.S_ITEM_CODE,
                            LOGINNAME = model.staff,
                            SHIFT = model.shift,
                            STARTLOC = startLoc_New.S_CODE,
                        };
                        SpecHelper.InsertInventoryM(target);
                    });
                }
                else
@@ -1369,14 +1684,16 @@
            LogHelper.Info("触发API:人工拆盘入库" + JsonConvert.SerializeObject(model), "API");
            var result = new SimpleResult();
            var db = new SqlHelper<object>().GetInstance();
            string cntLog = $"旧的容器号{model.old_CntId}";
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                if (model.new_IsOK == model.old_IsOK)
                {
                    result.resultCode = 19;
                    result.resultMsg = $"人工拆盘入库,物料需要一个合格一个不合格";
                    result.resultMsg = $"人工拆盘入库,物料需要一个待检一个不合格";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
@@ -1420,7 +1737,6 @@
                var startLoc_New = db.Queryable<TN_Location>().
                    First(b => b.S_CODE == model.new_StartLoc && b.N_CURRENT_NUM == 0 && b.S_AREA_CODE == Settings.Areas[5] && b.N_LOCK_STATE == 0 && b.S_LOCK_STATE == "无");
                if (startLoc_New == null)
                {
                    result.resultCode = 5;
@@ -1432,7 +1748,7 @@
                var locCntrRel_New1 = db.Queryable<TN_Loc_Container>().First(a => a.S_CNTR_CODE == model.new_CntIds);
                if (locCntrRel_New1 != null)
                {
                    LocationHelper.ErrorLocCntReset(new ErrorLocCntResetInfo() { cntID = model.new_CntIds ,reqCode=2});
                    LocationHelper.PdaUnBind(new PdaUnBindInfo() { cntID = model.new_CntIds ,reqCode=1});
                    result.resultCode = 6;
                    result.resultMsg = $"拆分后的新托盘存在残留的货位容器关系表,已解绑重置,容器号{model.new_CntIds},货位{locCntrRel_New1.S_LOC_CODE}";
                    LogHelper.Info(result.resultMsg);
@@ -1441,7 +1757,7 @@
                var locCntrRel_Old1 = db.Queryable<TN_Loc_Container>().First(a => a.S_CNTR_CODE == model.old_CntId);
                if (locCntrRel_Old1 != null)
                {
                    LocationHelper.ErrorLocCntReset(new ErrorLocCntResetInfo() { cntID = model.old_CntId, reqCode = 2 });
                    LocationHelper.PdaUnBind(new PdaUnBindInfo() { cntID = model.old_CntId, reqCode = 1 });
                    result.resultCode = 6;
                    result.resultMsg = $"被拆的旧托盘存在残留的货位容器关系表,已解绑重置,容器号{model.old_CntId},货位{locCntrRel_Old1.S_LOC_CODE}";
                    LogHelper.Info(result.resultMsg);
@@ -1491,15 +1807,19 @@
                }
                var endLoc_Ok = db.Queryable<TN_Location>().
                          First(o => o.S_AREA_CODE == Settings.Areas[9] && o.S_CODE == weightPoint);//查询合适的终点货位,去称重
                          First(o => o.S_AREA_CODE == Settings.Areas[9]
                          && o.S_CODE == weightPoint);//查询合适的终点货位,去称重
                var endLoc_NG = db.Queryable<TN_Location>().
                          First(o => o.S_AREA_CODE == Settings.Areas[8] && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无" && o.N_CURRENT_NUM == 0);//查询合适的终点货位
                          Where(o => o.S_AREA_CODE == Settings.Areas[8]
                          && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无"
                          && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).NotAny()//不能有货
                          && o.N_CURRENT_NUM == 0).First();//查询合适的终点货位
                if (endLoc_Ok == null)
                {
                    result.resultCode = 10;
                    result.resultMsg = $"合格的物料未找到合适的称重终点货位{weightPoint}";
                    result.resultMsg = $"待检的物料未找到合适的称重终点货位{weightPoint}";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
@@ -1507,7 +1827,7 @@
                if (endLoc_NG == null)
                {
                    result.resultCode = 16;
                    result.resultMsg = $"不合格的物料未找到合适的回炉区终点货位{Settings.Areas[8]}";
                    result.resultMsg = $"不合格的物料未找到合适的拆盘不合格区终点货位{Settings.Areas[8]}";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
@@ -1525,7 +1845,7 @@
                    fromArea = startLoc_New.S_AREA_CODE,
                    to = (model.new_IsOK == 2) ? endLoc_NG.S_CODE : endLoc_Ok.S_CODE,
                    toArea = (model.new_IsOK == 2) ? endLoc_NG.S_AREA_CODE : endLoc_Ok.S_AREA_CODE,
                    taskType = (model.new_IsOK == 2) ? "人工拆盘回炉" : "人工拆盘回库",
                    taskType = (model.new_IsOK == 2) ? "人工拆盘回不合格区" : "人工拆盘回库",
                    pri = 3,
                    cntrInfo = model.new_CntIds,
                    spec = cG_new_Detail_Ins.S_SPE,
@@ -1540,7 +1860,7 @@
                    fromArea = startLoc_Old.S_AREA_CODE,
                    to = (model.old_IsOK == 2) ? endLoc_NG.S_CODE : endLoc_Ok.S_CODE,
                    toArea = (model.old_IsOK == 2) ? endLoc_NG.S_AREA_CODE : endLoc_Ok.S_AREA_CODE,
                    taskType = (model.old_IsOK == 2) ? "人工拆盘回炉" : "人工拆盘回库",
                    taskType = (model.old_IsOK == 2) ? "人工拆盘回不合格区" : "人工拆盘回库",
                    pri = 3,
                    cntrInfo = model.old_CntId,
                    spec = cG_old_Detail.S_SPE,
@@ -1599,15 +1919,16 @@
                                {
                                    var target = new TN_RemeltDetail()
                                    {
                                        TaskNo = oldTaskCreate.taskNo,
                                        CntCode = cG_old_Detail.S_CNTR_CODE,
                                        StartLoc = startLoc_Old.S_CODE,
                                        LoginName = model.staff,
                                        ItemCode = cG_old_Detail.S_ITEM_CODE,
                                        Spec = cG_old_Detail.S_SPE,
                                        CarCode = cG_old_Detail.S_CAR_CODE,
                                        Weight = cG_old_Detail.F_QTY,
                                        RemeltTime = DateTime.Now
                                        TASKNO = oldTaskCreate.taskNo,
                                        CNTCODE = cG_old_Detail.S_CNTR_CODE,
                                        STARTLOC = startLoc_Old.S_CODE,
                                        LOGINNAME = model.staff,
                                        ITEMCODE = cG_old_Detail.S_ITEM_CODE,
                                        SPEC = cG_old_Detail.S_SPE,
                                        CARCODE = cG_old_Detail.S_CAR_CODE,
                                        WEIGHT = cG_old_Detail.F_QTY,
                                        REMELTTIME = DateTime.Now,
                                        SHIFT = model.shift,
                                    };
                                    SpecHelper.InsertRemeltDetail(target);
                                }
@@ -1615,17 +1936,54 @@
                                {
                                    var target = new TN_RemeltDetail()
                                    {
                                        TaskNo = newTaskCreate.taskNo,
                                        CntCode = cG_new_Detail_Ins.S_CNTR_CODE,
                                        StartLoc = startLoc_New.S_CODE,
                                        LoginName = model.staff,
                                        ItemCode = cG_new_Detail_Ins.S_ITEM_CODE,
                                        Spec = cG_new_Detail_Ins.S_SPE,
                                        CarCode = cG_new_Detail_Ins.S_CAR_CODE,
                                        Weight = cG_new_Detail_Ins.F_QTY,
                                        RemeltTime = DateTime.Now
                                        TASKNO = newTaskCreate.taskNo,
                                        CNTCODE = cG_new_Detail_Ins.S_CNTR_CODE,
                                        STARTLOC = startLoc_New.S_CODE,
                                        LOGINNAME = model.staff,
                                        ITEMCODE = cG_new_Detail_Ins.S_ITEM_CODE,
                                        SPEC = cG_new_Detail_Ins.S_SPE,
                                        CARCODE = cG_new_Detail_Ins.S_CAR_CODE,
                                        WEIGHT = cG_new_Detail_Ins.F_QTY,
                                        REMELTTIME = DateTime.Now,
                                        SHIFT = model.shift,
                                    };
                                    SpecHelper.InsertRemeltDetail(target);
                                }
                            });
                            Task task27 = Task.Run(() =>
                            {
                                if (model.old_IsOK == 1)
                                {
                                    var target = new TN_InventoryM()
                                    {
                                        S_ID = cG_old_Detail.S_ID,
                                        RFID = cG_old_Detail.S_CNTR_CODE,
                                        SPEC = cG_old_Detail.S_SPE,
                                        WEIGHT = cG_old_Detail.F_QTY,
                                        ITEMSTATE = cG_old_Detail.S_ITEM_STATE,
                                        ITEMCODE = cG_old_Detail.S_ITEM_CODE,
                                        LOGINNAME = model.staff,
                                        SHIFT = model.shift,
                                        STARTLOC = startLoc_Old.S_CODE,
                                    };
                                    SpecHelper.InsertInventoryM(target);
                                }
                                if (model.new_IsOK == 1)
                                {
                                    var target = new TN_InventoryM()
                                    {
                                        S_ID = cG_new_Detail_Ins.S_ID,
                                        RFID = cG_new_Detail_Ins.S_CNTR_CODE,
                                        SPEC = cG_new_Detail_Ins.S_SPE,
                                        WEIGHT = cG_new_Detail_Ins.F_QTY,
                                        ITEMSTATE = cG_new_Detail_Ins.S_ITEM_STATE,
                                        ITEMCODE = cG_new_Detail_Ins.S_ITEM_CODE,
                                        LOGINNAME = model.staff,
                                        SHIFT = model.shift,
                                        STARTLOC = startLoc_New.S_CODE,
                                    };
                                    SpecHelper.InsertInventoryM(target);
                                }
                            });
                        }
@@ -1658,5 +2016,139 @@
            return result;
        }
        /// <summary>
        /// 人工创建点到点任务
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        internal static SimpleResult CreateP2PTask(CreateP2PTaskInfo model)
        {
            LogHelper.Info("触发API:人工创建点到点任务" + JsonConvert.SerializeObject(model), "API");
            var result = new SimpleResult();
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var startLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.startLoc);
                if(!(startLoc != null  && startLoc.N_LOCK_STATE == 0 && startLoc.S_LOCK_STATE == "无"))
                {
                    result.resultCode = 1;
                    result.resultMsg = $"起始位置{model.startLoc}不满足条件:startLoc != null && startLoc.N_LOCK_STATE == 0 && startLoc.S_LOCK_STATE == 无";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                var endLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.endLoc);
                if (!(endLoc != null && endLoc.N_CURRENT_NUM == 0 && endLoc.N_LOCK_STATE == 0 && endLoc.S_LOCK_STATE == "无") || db.Queryable<TN_Loc_Container>().Any(a=>a.S_LOC_CODE == endLoc.S_CODE))
                {
                    result.resultCode = 2;
                    result.resultMsg = $"终点位置{model.endLoc}已锁住或已满";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                var startLocCnt = db.Queryable<TN_Loc_Container>().First(a => a.S_LOC_CODE == model.startLoc);
                var tn_Task = new TN_Task()
                {
                    S_CODE = WCSHelper.GenerateTaskNo(),
                    S_START_AREA = startLoc.S_AREA_CODE,
                    S_END_AREA = endLoc.S_AREA_CODE,
                    S_START_LOC = startLoc.S_CODE,
                    S_END_LOC = endLoc.S_CODE,
                    S_TYPE = "点对点",
                    N_PRIORITY = model.priority,
                    N_SCHEDULE_TYPE = 1,
                    N_B_STATE = 0
                };
                startLoc.N_LOCK_STATE  = 2;
                startLoc.S_LOCK_STATE = "出库锁";
                startLoc.N_CURRENT_NUM = 1;
                endLoc.N_LOCK_STATE = 1;
                endLoc.S_LOCK_STATE = "入库锁";
                using (var tran = db.Ado.UseTran())
                {
                    if (startLocCnt == null)
                    {
                        startLocCnt = new TN_Loc_Container()
                        {
                            S_LOC_CODE = model.startLoc,
                            S_CNTR_CODE = Guid.NewGuid().ToString("D"),
                        };
                        if (db.Insertable<TN_Loc_Container>(startLocCnt).ExecuteCommand() <= 0)
                        {
                            tran.RollbackTran();
                            result.resultCode = 3;
                            result.resultMsg = $"插入TN_Loc_Container表失败,货位:{model.startLoc}";
                            LogHelper.Info(result.resultMsg);
                            return result;
                        }
                    }
                    tn_Task.S_CNTR_CODE = startLocCnt.S_CNTR_CODE;
                    if (db.Insertable<TN_Task>(tn_Task).ExecuteCommand() > 0 &&
                        db.Updateable<TN_Location>(startLoc).ExecuteCommand() > 0 &&
                        db.Updateable<TN_Location>(endLoc).ExecuteCommand() > 0
                        ){
                        LogHelper.Info($"生成点对点任务成功,容器号{startLocCnt.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}");
                        Task task1 = Task.Run(() =>
                        {
                            WMSHelper.InsertOpInfo(model.staff, "点对点", startLocCnt.S_CNTR_CODE);
                        });
                        var cginfo = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == startLocCnt.S_CNTR_CODE);
                        Task task27 = Task.Run(() =>
                        {
                            if (endLoc.S_AREA_CODE == Settings.Areas[1] && cginfo != null) //插入WMS库存明细
                            {
                                var target = new TN_InventoryM()
                                {
                                    S_ID = cginfo.S_ID,
                                    RFID = cginfo.S_CNTR_CODE,
                                    SPEC = cginfo.S_SPE,
                                    WEIGHT = cginfo.F_QTY,
                                    ITEMSTATE = cginfo.S_ITEM_STATE,
                                    ITEMCODE = cginfo.S_ITEM_CODE,
                                    LOGINNAME = model.staff,
                                    SHIFT = model.shift,
                                    STARTLOC = model.startLoc,
                                };
                                SpecHelper.InsertInventoryM(target);
                            }
                        });
                        tran.CommitTran();
                        result.resultCode = 0;
                        result.resultMsg = "成功";
                        LogHelper.Info($"生成点对点失败,容器号{ startLocCnt.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}");
                        return result;
                    }
                    else
                    {
                        tran.RollbackTran();
                        result.resultCode = 9;
                        result.resultMsg = $"生成点对点失败,容器号{ startLocCnt.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}";
                        LogHelper.Info(result.resultMsg);
                        return result;
                    }
                }
            }
            catch (Exception ex)
            {
                result.resultCode = -1;
                result.resultMsg = $"人工创建点到点任务,发生了异常,{ex.Message}";
                LogHelper.Error(result.resultMsg, ex);
                return result;
            }
        }
    }
}