From 01a5cb6f77739630a88fc2f95be694b53ade0d41 Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期五, 19 七月 2024 14:14:47 +0800
Subject: [PATCH] 工步修改为支持并行执行行为,优化工步执行逻辑

---
 Tiger.Business.MES/Transaction/TestNode.cs |  302 ++++++++++++++++++++++++++++++-------------------
 1 files changed, 184 insertions(+), 118 deletions(-)

diff --git a/Tiger.Business.MES/Transaction/TestNode.cs b/Tiger.Business.MES/Transaction/TestNode.cs
index e704a65..3e2ad80 100644
--- a/Tiger.Business.MES/Transaction/TestNode.cs
+++ b/Tiger.Business.MES/Transaction/TestNode.cs
@@ -35,18 +35,18 @@
         /// </summary>
         /// <param name="input"></param>
         /// <returns></returns>
-        public async Task<ApiAction> Submit(SubmitInput input)
+        public async Task<ApiAction<SubmitOutput>> Submit(SubmitInput input)
         {
-            var action = new ApiAction();
+            var action = new ApiAction<SubmitOutput>();
             try
             {
-                //宸ユ鍒楄〃涓虹┖鏃讹紝璁や负闇�瑕佸厛鎵弿杩囩珯鏉$爜
-                if (Steps.IsNullOrEmpty())
+                //宸ユ鍒楄〃涓虹┖鎴栬�呭伐搴忚妭鐐瑰伐姝ユ湁鏈畬鎴愭椂锛屼紭鍏堝畬鎴愬伐搴忚妭鐐瑰伐姝�
+                if (Steps.IsNullOrEmpty() || !IsFinishNodeSteps)
                 {
                     //鍏堝垽鏂綋鍓嶅伐鍗曚笉涓虹┖涓斿綋鍓嶅矖浣嶅湪褰撳墠宸ュ崟鏄笉鏄绔欙紝濡傛灉鏄垯涓嶅厑璁稿彉鏇村綋鍓嶅伐鍗曪紝灏濊瘯鎶婃潯鐮佺粦瀹氬埌褰撳墠宸ュ崟
                     if (!CurBatch.IsNullOrEmpty() && CurBatch.IsFirstNode(PostCode))
                     {
-                        action = ScanSn(action, input);
+                        action = NodeSubmit(action, input);
                         return action;
                     }
                     //褰撳墠宀椾綅鍦ㄥ綋鍓嶅伐鍗曚笉鏄绔欙紝鍒欐煡鎵炬潯鐮佸凡缁戝畾鐨勫伐鍗曞綋浣滃綋鍓嶅伐鍗�
@@ -64,12 +64,13 @@
                                 var result = await SelectOrder(new() { AuthOption = input.AuthOption, OrderNo = wosn.Batch.ORDER_NO });
                                 if (!result.IsSuccessed)
                                 {
-                                    action = result;
+                                    action.IsSuccessed = result.IsSuccessed;
+                                    action.LocaleMsg = result.LocaleMsg;
                                     return action;
                                 }
                             }
                             //鏉$爜杩囩珯
-                            action = ScanSn(action, input);
+                            action = NodeSubmit(action, input);
                             return action;
                         }
                         //鏌ユ壘涓嶅埌鏉$爜宸茬粦瀹氱殑宸ュ崟
@@ -95,20 +96,47 @@
                     }
                 }
                 //瀹屾垚绗竴姝ワ紝鍚庡紑濮嬫墽琛屽綋鍓嶅伐搴忕殑琛屼负鍒楄〃
-                else if (Steps.First().IsFinished && !IsFinishAllSteps)
+                //瀹屾垚宸ュ簭鑺傜偣宸ユ鍚庯紝鍚庡紑濮嬫墽琛屽綋鍓嶅伐搴忕殑琛屼负宸ユ
+                else if (IsFinishNodeSteps && !IsFinishAllSteps)
                 {
-                    var curStep = Steps.Where(q => q.ID == input.StepID).FirstOrDefault();
-                    if (!curStep.IsNullOrEmpty())
+                    var submitStep = Steps.Where(q => q.ID == input.CurStepID && !q.IsFinished).FirstOrDefault();
+                    if (submitStep.IsNullOrEmpty())
                     {
-                        var result = curStep.Submit(input);
-                        result.Data.StepID = curStep.ID;
-                        result.Data.IsFinished = IsFinishAllSteps;
-                        result.Data.CurStep = CurStep;
+                        action = BeginNextActionStep(input);
+                        return action;
+                    }
+                    else
+                    {
+                        var result = submitStep.Submit(input);
+                        //濡傛灉褰撳墠宸ユ宸插畬鎴愶紝寮�濮嬫墽琛屼笅涓�宸ユ
+                        if (result.IsSuccessed && submitStep.IsFinished)
+                        {
+                            result = BeginNextActionStep(input);
+                        }
+                        //濡傛灉褰撳墠宸ユ鏈畬鎴�
+                        else
+                        {
+                            //琛屼负鎵ц鍑洪敊锛屽伐姝ヨ閲嶇疆
+                            if (Steps.IsNullOrEmpty())
+                            {
+                                result.LocaleMsg = new(Biz.T(result.LocaleMsg, input.Locale) + Biz.T(Biz.L("MES.Transaction.Position.RescanSN"), input.Locale));
+                            }
+                            else
+                            {
+                                result.Data.IsFinished = IsFinishAllSteps;
+                                result.Data.CurWO = CurBatch.WO.ORDER_NO;
+                                result.Data.CurBatch = CurBatch.Batch.BATCH_NO;
+                                result.Data.CurNode = CurStep.NodeAct.ACT_NAME;
+                                result.Data.StepActCode = CurStep.NodeAct.ACT_CODE;
+                                result.Data.NextStepID = CurStep.ID;
+                            }
+                        }
+                        //濡傛灉鎵�鏈夊伐姝ラ兘瀹屾垚
                         if (IsFinishAllSteps)
                         {
-                            return DoIfFinishAllSteps(result.ToApiAction());
+                            return DoIfFinishAllSteps(result);
                         }
-                        return result.ToApiAction();
+                        return result;
                     }
                 }
                 //娌℃湁鍙墽琛岀殑宸ユ
@@ -125,130 +153,168 @@
         }
 
         /// <summary>
-        /// 鎵弿杩囩珯鏉$爜
+        /// 宸ュ簭鑺傜偣宸ユ鎻愪氦鏁版嵁
         /// </summary>
         /// <param name="action"></param>
         /// <param name="input"></param>
         /// <returns></returns>
-        public ApiAction ScanSn(ApiAction action, SubmitInput input)
+        public ApiAction<SubmitOutput> NodeSubmit(ApiAction<SubmitOutput> action, SubmitInput input)
         {
             try
             {
-                //缁戝畾鏉$爜鍒板伐鍗�
-                if (!CurBatch.WoSNs.Any(q => q.SN == input.SN))
+                //褰撳伐姝ュ垪琛ㄤ负绌猴紝鍒欐墽琛屽綋鍓嶅伐搴忕殑蹇呰閫昏緫褰撲綔绗竴涓伐搴忚妭鐐癸紝瀹屾垚鍚庢寜闇�姹傚垱寤哄悗缁殑宸ユ鍒楄〃
+                if (Steps.IsNullOrEmpty())
                 {
-                    CurBatch.WoSNs.Add(new()
+                    //缁戝畾鏉$爜鍒板伐鍗�
+                    if (!CurBatch.WoSNs.Any(q => q.SN == input.SN))
                     {
-                        WORK_ORDER = CurBatch.Batch.ORDER_NO,
-                        SN = input.SN,
-                        STATUS = BIZ_MES_WO_SN.STATUSs.NotInput.GetValue(),
-                        BATCH_NO = CurBatch.Batch.BATCH_NO,
-                    });
-                }
-                var woSN = CurBatch.WoSNs.FirstOrDefault(q => q.SN == input.SN);
-                var curNode = CurBatch.GetNode(PostCode);
-
-                //鏉$爜杩囩珯
-                var wipSN = Biz.Db.Queryable<MES_WIP_DATA>().First(q => q.SN == input.SN && q.BATCH_NO == CurBatch.Batch.BATCH_NO) ?? new MES_WIP_DATA()
-                {
-                    SN = input.SN,
-                    STATUS = MES_WIP_DATA.STATUSs.Init.GetValue(),
-                    ITEM_CODE = CurBatch.WO.ITEM_CODE,
-                    WORK_ORDER = CurBatch.Batch.ORDER_NO,
-                    BATCH_NO = CurBatch.Batch.BATCH_NO,
-                    HOLD_FLAG = "N",
-                    REWORK_FLAG = CurBatch.WO.ORDER_TYPE == BIZ_MES_WO.ORDER_TYPEs.Rework.GetValue() ? "Y" : "N",
-                    FINISHED_FLAG = "N",
-                    INV_FLAG = "N",
-                    DFT_FLAG = "N",
-                    DFT_COUNT = 0,
-                };
-                wipSN.AUTH_PROD = CurLine.LINE_CODE;
-                wipSN.STATUS = wipSN.STATUS > 0 ? MES_WIP_DATA.STATUSs.OK.GetValue() : wipSN.STATUS;
-                wipSN.ROT_CODE = CurBatch.WO.ROUTE_CODE;
-                wipSN.NODE_ID = curNode.ID;
-                wipSN.NODE_NAME = curNode.NODE_NAME;
-                wipSN.FTY_CODE = CurFactory.FTY_CODE;
-                wipSN.WS_CODE = CurWorkshop.WS_CODE;
-                wipSN.LINE_CODE = CurLine.LINE_CODE;
-                wipSN.POST_CODE = CurPosition.POST_CODE;
-                wipSN.OPER_CODE = curNode.OPER_CODE;
-                wipSN.SEGMENT = curNode.SEGMENT;
-                wipSN.OPERATION_TIME = DateTime.Now;
-                wipSN.SFTS_CODE = CurLine.SFTS_CODE;
-                //wipSN.SFT_CODE = CurBatch.WO.ROUTE_CODE;
-                //wipSN.PRD_CODE = CurBatch.WO.ROUTE_CODE;
-                CurBatch.StartWorking(UserCode);
-
-                //濡傛灉鏄姇鍏ョ珯
-                if (curNode.IS_INPUT == "Y")
-                {
-                    woSN.STATUS = BIZ_MES_WO_SN.STATUSs.Inputed.GetValue();
-                    wipSN.STATUS = MES_WIP_DATA.STATUSs.Input.GetValue();
-                    wipSN.INLINE_DATE = DateTime.Now;
-                }
-                //濡傛灉鏄骇鍑虹珯
-                if (curNode.IS_OUTPUT == "Y")
-                {
-                    woSN.STATUS = BIZ_MES_WO_SN.STATUSs.Finished.GetValue();
-                    wipSN.STATUS = MES_WIP_DATA.STATUSs.Finished.GetValue();
-                    wipSN.OUTLINE_DATE = DateTime.Now;
-                }
-                //濡傛灉鏈夋彁浜や笉鑹�
-                if (!input.DFT_CODE.IsNullOrEmpty())
-                {
-                    wipSN.STATUS = MES_WIP_DATA.STATUSs.NG.GetValue();
-                    wipSN.DFT_FLAG = "Y";
-                    wipSN.DFT_COUNT++;
-                    wipSN.DFT_CODE = input.DFT_CODE;
-                }
-
-                CurWipSNHis = new MES_WIP_HIS(CurWipSN = wipSN, $"宸ュ崟[{wipSN.WORK_ORDER}]鏉$爜[{wipSN.SN}]鍦ㄥ矖浣峓{wipSN.POST_CODE}]杩囩珯宸ュ簭[{wipSN.NODE_NAME}]鎴愬姛");
-
-                //鍒濆鍖栧伐姝ュ垪琛�
-                Steps.Clear();
-                var curStep = new Biz.WorkStep(curNode.ID, IWorkStep.Types.Node)
-                {
-                    Sequence = Steps.Count + 1,
-                    Node = curNode,
-                    DBSubmitAction = () =>
-                    {
-                        var db = GetCommitDB();
-                        db.Storageable(woSN, UserCode).ExecuteCommand();
-                        db.Storageable(wipSN, UserCode).ExecuteCommand();
-                        db.Storageable(CurWipSNHis, UserCode).ExecuteCommand();
+                        CurBatch.WoSNs.Add(new()
+                        {
+                            WORK_ORDER = CurBatch.Batch.ORDER_NO,
+                            SN = input.SN,
+                            STATUS = BIZ_MES_WO_SN.STATUSs.NotInput.GetValue(),
+                            BATCH_NO = CurBatch.Batch.BATCH_NO,
+                        });
                     }
-                };
-                Steps.Add(curStep);
+                    var woSN = CurBatch.WoSNs.FirstOrDefault(q => q.SN == input.SN);
+                    var curNode = CurBatch.GetNode(PostCode);
 
-                //濡傛灉褰撳墠宸ュ簭鑺傜偣鏈夎涓哄垯娣诲姞鍒板伐姝ュ垪琛�
-                var acts = CurBatch.NodeActs.Where(q => q.NODE_ID == curNode.ID).ToList();
-                foreach (var act in acts)
-                {
-                    Steps.Add(new Biz.WorkStep(act.ID, IWorkStep.Types.Action)
+                    //鏉$爜杩囩珯
+                    var wipSN = Biz.Db.Queryable<MES_WIP_DATA>().First(q => q.SN == input.SN && q.BATCH_NO == CurBatch.Batch.BATCH_NO) ?? new MES_WIP_DATA()
                     {
+                        SN = input.SN,
+                        STATUS = MES_WIP_DATA.STATUSs.Init.GetValue(),
+                        ITEM_CODE = CurBatch.WO.ITEM_CODE,
+                        WORK_ORDER = CurBatch.Batch.ORDER_NO,
+                        BATCH_NO = CurBatch.Batch.BATCH_NO,
+                        HOLD_FLAG = "N",
+                        REWORK_FLAG = CurBatch.WO.ORDER_TYPE == BIZ_MES_WO.ORDER_TYPEs.Rework.GetValue() ? "Y" : "N",
+                        FINISHED_FLAG = "N",
+                        INV_FLAG = "N",
+                        DFT_FLAG = "N",
+                        DFT_COUNT = 0,
+                    };
+                    wipSN.AUTH_PROD = CurLine.LINE_CODE;
+                    wipSN.STATUS = wipSN.STATUS > 0 ? MES_WIP_DATA.STATUSs.OK.GetValue() : wipSN.STATUS;
+                    wipSN.ROT_CODE = CurBatch.WO.ROUTE_CODE;
+                    wipSN.NODE_ID = curNode.ID;
+                    wipSN.NODE_NAME = curNode.NODE_NAME;
+                    wipSN.FTY_CODE = CurFactory.FTY_CODE;
+                    wipSN.WS_CODE = CurWorkshop.WS_CODE;
+                    wipSN.LINE_CODE = CurLine.LINE_CODE;
+                    wipSN.POST_CODE = CurPosition.POST_CODE;
+                    wipSN.OPER_CODE = curNode.OPER_CODE;
+                    wipSN.SEGMENT = curNode.SEGMENT;
+                    wipSN.OPERATION_TIME = DateTime.Now;
+                    wipSN.SFTS_CODE = CurLine.SFTS_CODE;
+                    //wipSN.SFT_CODE = CurBatch.WO.ROUTE_CODE;
+                    //wipSN.PRD_CODE = CurBatch.WO.ROUTE_CODE;
+                    CurBatch.StartWorking(UserCode);
+
+                    //濡傛灉鏄姇鍏ョ珯
+                    if (curNode.IS_INPUT == "Y")
+                    {
+                        woSN.STATUS = BIZ_MES_WO_SN.STATUSs.Inputed.GetValue();
+                        wipSN.STATUS = MES_WIP_DATA.STATUSs.Input.GetValue();
+                        wipSN.INLINE_DATE = DateTime.Now;
+                    }
+                    //濡傛灉鏄骇鍑虹珯
+                    if (curNode.IS_OUTPUT == "Y")
+                    {
+                        woSN.STATUS = BIZ_MES_WO_SN.STATUSs.Finished.GetValue();
+                        wipSN.STATUS = MES_WIP_DATA.STATUSs.Finished.GetValue();
+                        wipSN.OUTLINE_DATE = DateTime.Now;
+                    }
+                    //濡傛灉鏈夋彁浜や笉鑹�
+                    if (!input.DFT_CODE.IsNullOrEmpty())
+                    {
+                        wipSN.STATUS = MES_WIP_DATA.STATUSs.NG.GetValue();
+                        wipSN.DFT_FLAG = "Y";
+                        wipSN.DFT_COUNT++;
+                        wipSN.DFT_CODE = input.DFT_CODE;
+                    }
+
+                    CurWipSNHis = new MES_WIP_HIS(CurWipSN = wipSN, $"宸ュ崟[{wipSN.WORK_ORDER}]鏉$爜[{wipSN.SN}]鍦ㄥ矖浣峓{wipSN.POST_CODE}]杩囩珯宸ュ簭[{wipSN.NODE_NAME}]鎴愬姛");
+
+                    //鍒濆鍖栧伐姝ュ垪琛�
+                    Steps.Clear();
+                    var curStep = new Biz.WorkStep(IWorkStep.Types.Node, this)
+                    {
+                        NodeID = curNode.ID,
                         Sequence = Steps.Count + 1,
                         Node = curNode,
-                        NodeAct = act,
-                        Setting = CurBatch.ActionSets.FirstOrDefault(q => q.ACT_ID == act.ID),
-                    });
+                        DBSubmitAction = () =>
+                        {
+                            var db = GetCommitDB();
+                            db.Storageable(woSN, UserCode).ExecuteCommand();
+                            db.Storageable(wipSN, UserCode).ExecuteCommand();
+                            db.Storageable(CurWipSNHis, UserCode).ExecuteCommand();
+                        }
+                    };
+                    Steps.Add(curStep);
+
+                    //鏈夐渶瑕佸垯娣诲姞宸ュ簭鑺傜偣鐨勫叾浠栧伐姝�
+
+                    //鏈�鍚庢坊鍔犲綋鍓嶅伐搴忕殑琛屼负宸ユ
+                    GenerateSteps(curStep);
+
+                    //瀹屾垚绗竴涓伐搴忚妭鐐瑰伐姝�
+                    curStep.IsFinished = true;
+                    CurStep = curStep;
+                }
+                else if (!IsFinishNodeSteps)
+                {
+                    var curStep = Steps.Where(q => q.Type == IWorkStep.Types.Node && !q.IsFinished).OrderBy(q => q.Sequence).First();
+
+                    //瀹屾垚褰撳墠宸ュ簭鑺傜偣宸ユ
+                    curStep.IsFinished = true;
+                    CurStep = curStep;
                 }
 
-                //瀹屾垚褰撳墠宸ュ簭鑺傜偣
-                curStep.IsFinished = true;
                 //鏈畬鎴愭墍鏈夊伐姝�
                 if (!IsFinishAllSteps)
                 {
-                    var next = Steps.Where(q => !q.IsFinished).OrderBy(q => q.Sequence).First();
-                    var result = next.Begin(this);
-                    result.Data.StepID = next.ID;
-                    result.Data.IsFinished = IsFinishAllSteps;
-                    result.Data.CurStep = CurStep;
-                    return result.ToApiAction();
+                    var result = new ApiAction<SubmitOutput>();
+                    //鏈畬鎴愭墍鏈夊伐搴忚妭鐐瑰伐姝�
+                    if (!IsFinishNodeSteps)
+                    {
+                        var next = Steps.Where(q => q.Type == IWorkStep.Types.Node && !q.IsFinished).OrderBy(q => q.Sequence).First();
+                        //璁剧疆鍚庣画鍙墽琛岀殑宸ユ鍒楄〃
+                        NextSteps.Clear();
+                        NextSteps.Add(next);
+                        //鏍规嵁鍚庣画宸ユ杩斿洖ApiAction
+                        result.Data.IsFinished = IsFinishAllSteps;
+                        result.Data.CurWO = CurBatch.WO.ORDER_NO;
+                        result.Data.CurBatch = CurBatch.Batch.BATCH_NO;
+                        result.Data.CurNode = CurStep.Node.NODE_NAME;
+                        result.Data.NextStepID = next.ID;
+
+                        //鏍规嵁宸ュ簭鑺傜偣宸ユ鐨勫簭鍙疯繑鍥炵浉搴旂殑鎿嶄綔鎻愮ず
+                        switch (next.Sequence)
+                        {
+                            case 2:
+                                //action.LocaleMsg = new($"璇锋墽琛岀浜屾");
+                                result.LocaleMsg = new("MES.Transaction.TestNode.绗簩姝ユ搷浣滄彁绀�");
+                                break;
+                            default:
+                                break;
+                        }
+                    }
+                    //宸插畬鎴愭墍鏈夊伐搴忚妭鐐瑰伐姝ワ紝寮�濮嬫墽琛岃涓哄伐姝�
+                    else
+                    {
+                        result = BeginNextActionStep(input);
+                    }
+                    return result;
                 }
                 //宸插畬鎴愭墍鏈夊伐姝�
                 else
                 {
+                    action.Data.IsFinished = IsFinishAllSteps;
+                    action.Data.CurWO = CurBatch.WO.ORDER_NO;
+                    action.Data.CurBatch = CurBatch.Batch.BATCH_NO;
+                    action.Data.CurNode = CurStep.Node.NODE_NAME;
+                    action.Data.NextStepID = "";
                     action = DoIfFinishAllSteps(action);
                 }
             }
@@ -265,7 +331,7 @@
         /// </summary>
         /// <param name="action"></param>
         /// <returns></returns>
-        public ApiAction DoIfFinishAllSteps(ApiAction action)
+        public ApiAction<SubmitOutput> DoIfFinishAllSteps(ApiAction<SubmitOutput> action)
         {
             //淇濆瓨鏁版嵁搴�
             var dbTran = GetCommitDB().UseTran(() =>

--
Gitblit v1.9.3