服务端的TigerApi 框架,基于.NET6 2024 版本
Tiger.Business.MES/Common/WorkBatch.cs
@@ -62,20 +62,26 @@
        public void Update()
        {
            WO = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).IncludesAllFirstLayer().First();
            Batch = Biz.Db.Queryable<BIZ_MES_WO_BATCH>().Where(q => q.BATCH_NO == Batch.BATCH_NO).First();
            if (WoContext.WoBatchDic.ContainsKey(Batch.BATCH_NO))
            var wo = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).IncludesAllFirstLayer().First();
            var batch = Biz.Db.Queryable<BIZ_MES_WO_BATCH>().Where(q => q.BATCH_NO == Batch.BATCH_NO).First();
            if (WoContext.WoBatchDic.ContainsKey(batch.BATCH_NO))
            {
                if (WO.STATUS > BIZ_MES_WO.STATUSs.Working.GetValue() || Batch.STATUS > BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())
                if (wo.STATUS > BIZ_MES_WO.STATUSs.Working.GetValue() || batch.STATUS > BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())
                {
                    WoContext.WoBatchDic.Remove(Batch.BATCH_NO);
                }
                else if(wo.UPDATE_TIME > WO.UPDATE_TIME || batch.UPDATE_TIME > Batch.UPDATE_TIME)
                {
                    GetBatchInfo();
                }
            }
            else
            {
                GetBatchInfo();
                WoContext.WoBatchDic.Add(Batch.BATCH_NO, this);
                WoContext.WoBatchDic.Add(batch.BATCH_NO, this);
            }
            WO = wo;
            Batch = batch;
        }
        private void GetBatchInfo()
@@ -99,7 +105,7 @@
        }
        /// <summary>
        /// 添加节点的下一个行为到工步列表
        /// 递归遍历工序节点,给下级工序节点排序和整理前置工序
        /// </summary>
        /// <param name="parent"></param>
        private void NodeSorting(MES_WO_NODE parent)
@@ -231,6 +237,48 @@
        }
        /// <summary>
        /// 检查工单是否完工,已完工则修改相应状态并记录到数据库
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public async Task<bool> CheckIsComplete(string user)
        {
            var woSNs = Biz.Db.Queryable<BIZ_MES_WO_SN>().Where(q => q.WORK_ORDER == OrderNo).ToList();
            //判断当前工单批次是否已完工
            if (!woSNs.Any(q => q.BATCH_NO == Batch.BATCH_NO && q.STATUS < BIZ_MES_WO_SN.STATUSs.Finished.GetValue()) &&
                 woSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO && q.STATUS == BIZ_MES_WO_SN.STATUSs.Finished.GetValue()) == Batch.PLAN_QTY)
            {
                Batch.STATUS = BIZ_MES_WO_BATCH.STATUSs.Closed.GetValue();
                Batch.ACT_END_TIME = DateTime.Now;
            }
            //判断当前工单是否已完工
            if (!woSNs.Any(q => q.STATUS < BIZ_MES_WO_SN.STATUSs.Finished.GetValue()) &&
                 woSNs.Count(q => q.STATUS == BIZ_MES_WO_SN.STATUSs.Finished.GetValue()) == WO.PLAN_QTY)
            {
                WO.STATUS = BIZ_MES_WO.STATUSs.Closed.GetValue();
                WO.ACT_END_TIME = DateTime.Now;
            }
            //保存数据库
            var db = Biz.Db;
            var dbTran = db.UseTran(() =>
            {
                db.Updateable(WO, user).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.ACT_END_TIME }).ExecuteCommand();
                db.Updateable(Batch, user).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.ACT_END_TIME }).ExecuteCommand();
            });
            if (!dbTran.IsSuccess)
            {
                //throw dbTran.ErrorException;
                Logger.Default.Fatal(dbTran.ErrorException, $"检查工单批次[{Batch.BATCH_NO}]是否完工异常");
                return false;
            }
            return true;
        }
        /// <summary>
        /// 根据岗位编码判断是不是首站
        /// </summary>
        /// <param name="postCode"></param>
@@ -346,7 +394,7 @@
                    }
                    //如果当前工序有必须执行的后续工序,则报错
                    if (nextNodes.Any(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y" && s.CAN_SKIP != "Y")))
                    if (nextNodes.Any(q => q.OPER_CODE != "EndNode" && NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y" && s.CAN_SKIP != "Y")))
                    {
                        action.IsSuccessed = false;
                        action.Data.SetValue(this, null);
@@ -391,7 +439,7 @@
        }
        /// <summary>
        /// 添加节点的下一个可执行节点
        /// 获取节点的下一个可执行节点(排除有前置工序未完成的节点)
        /// </summary>
        /// <param name="parent"></param>
        /// <param name="wipSN">当前的条码过站记录,需要导航查询生产过程记录信息</param>
@@ -426,7 +474,7 @@
        }
        /// <summary>
        /// 根据传入的条码返回下一站可进入进入的目标工序
        /// 根据传入的条码返回下一站可进入的目标工序
        /// </summary>
        /// <param name="wipSN">当前的条码过站记录,需要导航查询生产过程记录和生产不良记录信息</param>
        /// <returns></returns>