杨张扬
2025-06-13 c3202f7d43746c084066d88e58913d85c0173d88
双钱-需求变更,增加复检合格物料自动搬送流程
6个文件已修改
106 ■■■■ 已修改文件
Program.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/ApiHelper.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/ApiModel.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
core/Monitor.cs 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_CG_Detail.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
wms/LocationHelper.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Program.cs
@@ -145,6 +145,8 @@
                tasks.Add(GetTask(Monitor.FullOutTime));//满托过期出库 过期合格回库,过期次品回炉
                tasks.Add(GetTask(Monitor.CGOkCheck));// 在复检区检测物品合格,合格的物品自动回库
                Task.WaitAll(tasks.ToArray());
            }
            public void Stop() { Console.WriteLine("work stopped"); }
api/ApiHelper.cs
@@ -167,10 +167,10 @@
                            && o.C_ENABLE == "Y" && o.N_CURRENT_NUM == 0).
                            OrderBy(o => o.T_MODIFY, OrderByType.Asc).First();//查询合适的终点货位
                }
                else if (model.cgState == 4)//技术合格回库
                else if (model.cgState == 4)//技术判定回库
                {
                    cG_Detail.N_ITEM_STATE = 4;
                    cG_Detail.S_ITEM_STATE = "技术合格";
                    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 == "无"
@@ -225,7 +225,7 @@
                else
                {
                    result.resultCode = 6;
                    result.resultMsg = $"物料状态只能为0合格1待检2不合格,下线即待检,3过期,4技术合格,5混合,6一级料、7二级料,如果为其他值,则不处理";
                    result.resultMsg = $"物料状态只能为0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6一级料、7二级料,如果为其他值,则不处理";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
@@ -241,7 +241,7 @@
                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);//起点出库锁,
@@ -1021,13 +1021,13 @@
                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 == 4 && s.S_ITEM_STATE == "技术合格"). //技术合格
                    && s.N_ITEM_STATE == 4 && s.S_ITEM_STATE == "技术判定"). //技术判定
                    First();//筛选有容器货位关系表信息,筛选有容器货品明细表信息
                if (startLoc == null)//其次合格
api/ApiModel.cs
@@ -433,14 +433,14 @@
            public string old_StartLoc { get; set; }//旧容器的起点
            /// <summary>
            /// 0合格1待检2不合格,下线即待检,3过期,4技术合格,5混合,6一级料、7二级料
            /// 0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6一级料、7二级料
            /// </summary>
            public int old_IsOK { get; set; }//旧容器ID,旧容器的货品的
            public string new_CntIds { get; set; }//拆后的新容器ID
            public string new_StartLoc { get; set; }//新容器ID起点
            /// <summary>
            /// 0合格1待检2不合格,下线即待检,3过期,4技术合格,5混合,6一级料、7二级料
            /// 0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6一级料、7二级料
            /// </summary>
            public int new_IsOK { get; set; }//新容器ID的货品的
            public string staff { get; set; } = "None";//操作人
core/Monitor.cs
@@ -350,6 +350,84 @@
        }
        /// <summary>
        /// 在复检区检测物品合格,合格的物品自动回库
        /// </summary>
        internal static void CGOkCheck()
        {
            var db = new SqlHelper<object>().GetInstance();
            try
            {
                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) => s.N_ITEM_STATE == 0 && s.S_ITEM_STATE == "合格"
                    && o.S_AREA_CODE == Settings.Areas[7] && o.N_CURRENT_NUM > 0
                    && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无").First();
                if (startLoc== null)
                {
                    LogHelper.Info("复检区没有合格的物品,无需自动返回");
                    return;
                }
                var endLoc = db.Queryable<TN_Location>().First(a => a.S_AREA_CODE == Settings.Areas[1]
                && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无"
                && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == a.S_CODE).NotAny()//不能有货
                );
                if (endLoc != null)
                {
                    LogHelper.Info("终点库区已满或者已全部锁住");
                    return;
                }
                var cginfo = db.Queryable<TN_CG_Detail>()
                    .LeftJoin<TN_Loc_Container>((o, i) => o.S_CNTR_CODE == i.S_CNTR_CODE)
                    .Where((o, i) => i.S_LOC_CODE == startLoc.S_CODE).First();
                if (WCSHelper.CreateTask(startLoc.S_CODE, endLoc.S_CODE, "复检自动合格回库", 3, cginfo.S_CNTR_CODE, out string taskNo, cginfo.S_SPE))//创建搬送任务,起点终点容器
                {
                    LocationHelper.LockLoc(startLoc.S_CODE, 2);//起点出库锁,
                    LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁
                    LogHelper.Info($"生成复检自动合格回库任务成功,容器号{cginfo.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}");
                    Task task99 = Task.Run(() =>
                    {
                        WMSHelper.InsertOpInfo("自动轮询", "复检自动合格回库", cginfo.S_CNTR_CODE);
                    });
                    Task task27 = Task.Run(() =>
                    {
                        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 = "自动轮询",
                            SHIFT = "无",
                        };
                        SpecHelper.InsertInventoryM(target);
                    });
                    return ;
                }
                else
                {
                    LogHelper.Info($"生成复检自动合格回库任务失败,容器号{cginfo.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}");
                    return;
                }
            }
            catch(Exception ex)
            {
                LogHelper.Error("CGOkCheck发生了异常", ex);
            }
        }
        /// <summary>
        /// 满托过期出库 过期合格回库,过期次品回炉
        /// </summary>
        internal static void FullOutTime()
models/TN_CG_Detail.cs
@@ -27,12 +27,12 @@
        public string S_SPE { get; set; }//货品规格
        /// <summary>
        /// 0合格1待检2不合格,下线即待检,3过期,4技术合格,5混合,6一级料、7二级料
        /// 0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6一级料、7二级料
        /// </summary>
        public string S_ITEM_STATE { get; set; }//货品状态
        /// <summary>
        ///0合格1待检2不合格,下线即待检,3过期,4技术合格,5混合,6一级料、7二级料
        ///0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6一级料、7二级料
        /// </summary>
        public int N_ITEM_STATE { get; set; }//货品状态_字典
        public string S_BATCH_NO { get; set; }//批次号
wms/LocationHelper.cs
@@ -517,7 +517,7 @@
        }
        /// <summary>
        /// 0合格1待检2不合格,下线即待检,3过期,4技术合格,5混合,6一级料、7二级料
        /// 0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6一级料、7二级料
        /// </summary>
        /// <param name="state"></param>
        /// <returns></returns>
@@ -541,7 +541,7 @@
            }
            if (state == 4)
            {
                return "技术合格";
                return "技术判定";
            }
            if (state == 5)
            {
@@ -605,7 +605,7 @@
        public string rfId { get; set; }//容器号
        /// <summary>
        /// 0合格1待检2不合格,3过期,4技术合格,5混合,6一级料、7二级料
        /// 0合格1待检2不合格,3过期,4技术判定,5混合,6一级料、7二级料
        /// </summary>
        public int cgState { get; set; }//物料状态