From 201b456883c4d4799561fd17acec3f8c2111445f Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期一, 29 七月 2024 18:09:22 +0800
Subject: [PATCH] 获取过程变量优化

---
 Tiger.Business.MES/Transaction/Position.cs |  243 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 233 insertions(+), 10 deletions(-)

diff --git a/Tiger.Business.MES/Transaction/Position.cs b/Tiger.Business.MES/Transaction/Position.cs
index 498f67b..99879d9 100644
--- a/Tiger.Business.MES/Transaction/Position.cs
+++ b/Tiger.Business.MES/Transaction/Position.cs
@@ -10,9 +10,7 @@
 using System.Threading.Tasks;
 using Tiger.Model;
 using static Tiger.Business.Biz;
-using Org.BouncyCastle.Ocsp;
 using Tiger.Model.Entitys.MES.Position;
-using MailKit.Search;
 
 namespace Tiger.Business.MES.Transaction
 {
@@ -41,6 +39,9 @@
             //if (CurFactory.IsNullOrEmpty()) throw new InvalidDataException($"MES.Transaction.Position.FactoryNotExistsException", new Exception($"{postCode}|{CurWorkshop.FTY_CODE}"));
             if (CurFactory.IsNullOrEmpty()) throw new InvalidDataException($"宀椾綅[{postCode}]鎵�灞炵殑宸ュ巶[{CurWorkshop.FTY_CODE}]涓嶅瓨鍦紝璇峰厛璁剧疆鎵�灞炲伐鍘�", new Exception($"{postCode}|{CurWorkshop.FTY_CODE}"));
 
+            //鍔犺浇褰撳墠浜х嚎鐨勭彮鍒�
+            CurShiftSys = Biz.Db.Queryable<MES_SHIFT_SYS>().Where(q => q.SFTS_CODE == CurLine.SFTS_CODE).IncludesAllFirstLayer().IncludesAllSecondLayer(q => q.Shifts).First();
+
             return this;
         }
 
@@ -51,12 +52,18 @@
         public MES_WORKSHOP CurWorkshop { get; set; }
         public MES_LINE CurLine { get; set; }
         public MES_POSITION CurPosition { get; set; }
+        public MES_SHIFT_SYS CurShiftSys { get; set; }
         public WorkBatch CurBatch { get; set; }
         public IWorkBatch WorkBatch => CurBatch;
         public MES_WIP_DATA CurWipSN { get; set; }
+        public MES_WIP_HIS CurWipSNHis { get; set; }
+        public Dictionary<string, object> Context { get; set; } = new();
         public List<WorkStep> Steps { get; set; } = new();
-        public bool IsFinishAllSteps => Steps.Any() && !Steps.Any(q => !q.IsFinished);
-        public int CurStep => Steps.Where(q => !q.IsFinished).OrderBy(q => q.Sequence).FirstOrDefault()?.Sequence ?? 0;
+        public WorkStep CurStep { get; set; }
+        public List<WorkStep> NextSteps { get; set; } = new();
+        public bool IsFinishNodeSteps => !Steps.Any(q => q.Type == IWorkStep.Types.Node && !q.IsFinished);
+        public bool IsFinishAllSteps => !Steps.Any() || !Steps.Any(q => !q.IsFinished);
+        //public int CurStep => Steps.Where(q => !q.IsFinished).OrderBy(q => q.Sequence).FirstOrDefault()?.Sequence ?? 0;
         private DbClient CommitDB;
         #endregion Propertys & Variables
 
@@ -86,23 +93,23 @@
                     if (wo.IsNullOrEmpty())
                     {
                         action.IsSuccessed = false;
-                        action.LocaleMsg = new($"宸ュ崟[{input.OrderNo}]涓嶅瓨鍦�", input.OrderNo);
-                        //action.LocaleMsg = new("MES.Transaction.Position.SelectOrder.EmptyException", input.OrderNO);
+                        //action.LocaleMsg = new($"宸ュ崟[{input.OrderNo}]涓嶅瓨鍦�", input.OrderNo);
+                        action.LocaleMsg = new("MES.Transaction.Position.SelectOrder.EmptyException", input.OrderNo);
                         return action;
                     }
                     if (wo.STATUS != BIZ_MES_WO.STATUSs.Release.GetValue() && wo.STATUS != BIZ_MES_WO.STATUSs.Working.GetValue())
                     {
                         action.IsSuccessed = false;
-                        action.LocaleMsg = new($"宸ュ崟[{input.OrderNo}]鐘舵�乕{wo.STATUS.GetEnum<BIZ_MES_WO.STATUSs>().GetName()}]涓嶈兘鐢熶骇");
-                        //action.LocaleMsg = new("MES.Transaction.Position.SelectOrder.StatusException", input.OrderNO, query.STATUS.GetEnum<BIZ_MES_WO.STATUSs>().GetName());
+                        //action.LocaleMsg = new($"宸ュ崟[{input.OrderNo}]鐘舵�乕{wo.STATUS.GetEnum<BIZ_MES_WO.STATUSs>().GetName()}]涓嶈兘鐢熶骇");
+                        action.LocaleMsg = new("MES.Transaction.Position.SelectOrder.StatusException", input.OrderNo, wo.STATUS.GetEnum<BIZ_MES_WO.STATUSs>().GetName());
                         return action;
                     }
                     var batch = await Biz.Db.Queryable<BIZ_MES_WO_BATCH>().ByAuth(input.AuthOption).Where(q => q.ORDER_NO == input.OrderNo && q.ACT_LINE == CurLine.LINE_CODE).FirstAsync();
                     if (batch.IsNullOrEmpty())
                     {
                         action.IsSuccessed = false;
-                        action.LocaleMsg = new($"宸ュ崟[{input.OrderNo}]娌℃湁涓嬪彂鍒颁骇绾跨姸鎬乕{CurLine.LINE_CODE}]");
-                        //action.LocaleMsg = new("MES.Transaction.Position.SelectOrder.LineException", input.OrderNO, CurLine.LINE_CODE);
+                        //action.LocaleMsg = new($"宸ュ崟[{input.OrderNo}]娌℃湁涓嬪彂鍒颁骇绾跨姸鎬乕{CurLine.LINE_CODE}]");
+                        action.LocaleMsg = new("MES.Transaction.Position.SelectOrder.LineException", input.OrderNo, CurLine.LINE_CODE);
                         return action;
                     }
                     var wb = new WorkBatch(input.OrderNo).Init(CurLine.LINE_CODE);
@@ -119,6 +126,27 @@
         }
 
         /// <summary>
+        /// 鑾峰彇褰撳墠鏃堕棿鎵�灞炵殑鐝埗鐝鏃舵
+        /// </summary>
+        public ShiftPeriod GetShiftPeriodForNow()
+        {
+            var time = DateTime.Now.ToString("HHmm").ToInt32();
+            foreach (var shift in CurShiftSys.Shifts)
+            {
+                var period = shift.Periods.Where(q => q.PRD_BEGIN <= time && time <= q.PRD_END).FirstOrDefault();
+                if (!period.IsNullOrEmpty())
+                {
+                    var result = new ShiftPeriod();
+                    result.ShiftSys = CurShiftSys;
+                    result.Shift = shift;
+                    result.Period = period;
+                    return result;
+                }
+            }
+            return null;
+        }
+
+        /// <summary>
         /// 閲嶇疆褰撳墠宸ユ
         /// </summary>
         public void ResetSteps()
@@ -127,6 +155,201 @@
             CurWipSN = null;
         }
 
+        /// <summary>
+        /// 鐢熸垚浼犲叆宸ユ鍚庣画鐨勮涓哄埌宸ユ鍒楄〃
+        /// </summary>
+        /// <param name="parent"></param>
+        public void GenerateSteps(WorkStep parent)
+        {
+            //閫掑綊娣诲姞鎵�鏈夊伐姝�
+            AddNextActToSteps(parent);
+            //璋冩暣宸ユ鐨勫簭鍙�
+            //while (CurBatch.Edges.Any(q => Steps.First(s => s.NodeID == q.SRC_NODE).Sequence <= Steps.First(s => s.NodeID == q.TGT_NODE).Sequence))
+            //{
+            //    var edges = CurBatch.Edges.Where(q => Steps.First(s => s.NodeID == q.SRC_NODE).Sequence >= Steps.First(s => s.NodeID == q.TGT_NODE).Sequence).ToList();
+            //    foreach (var edge in edges)
+            //    {
+            //        var source = Steps.First(s => s.NodeID == edge.SRC_NODE);
+            //        var target = Steps.First(s => s.NodeID == edge.TGT_NODE);
+            //        target.Sequence = source.Sequence + 1;
+            //    }
+            //}
+        }
+
+        /// <summary>
+        /// 娣诲姞鑺傜偣鐨勪笅涓�涓涓哄埌宸ユ鍒楄〃
+        /// </summary>
+        /// <param name="parent"></param>
+        private void AddNextActToSteps(WorkStep parent)
+        {
+            var edges = CurBatch.Edges.Where(q => q.SRC_NODE == parent.NodeID && CurBatch.NodeActs.Any(a => a.NODE_ID == parent.Node.ID && a.ID == q.TGT_NODE)).ToList();
+            foreach (var edge in edges)
+            {
+                var act = CurBatch.NodeActs.First(q => q.ID == edge.TGT_NODE);
+                if (Steps.Any(q => q.NodeID == act.ID))
+                {
+                    var next = Steps.First(q => q.NodeID == act.ID);
+                    next.Sequence = next.Sequence > parent.Sequence ? next.Sequence : (parent.Sequence + 1);
+                    next.PrepNodeIDs.Add(parent.NodeID);
+                    next.PrepNodeIDs.AddRange(parent.PrepNodeIDs);
+                    next.PrepNodeIDs = next.PrepNodeIDs.Distinct().ToList();
+                    AddNextActToSteps(next);
+                }
+                else
+                {
+                    var next = new WorkStep(IWorkStep.Types.Action, this)
+                    {
+                        NodeID = act.ID,
+                        Sequence = parent.Sequence + 1,
+                        Node = parent.Node,
+                        NodeAct = act,
+                        Setting = CurBatch.ActionSets.FirstOrDefault(q => q.ACT_ID == act.ID),
+                    };
+                    next.PrepNodeIDs.Add(parent.NodeID);
+                    next.PrepNodeIDs.AddRange(parent.PrepNodeIDs);
+                    next.PrepNodeIDs = next.PrepNodeIDs.Distinct().ToList();
+                    Steps.Add(next);
+                    AddNextActToSteps(next);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鏍规嵁浼犲叆鐨勫伐姝ワ紝杩斿洖涓嬩竴姝ュ彲鎵ц鐨勫伐姝ュ垪琛�
+        /// </summary>
+        /// <param name="curStep"></param>
+        public List<WorkStep> GetNextSteps(WorkStep curStep)
+        {
+            var result = new List<WorkStep>();
+            var nextSteps = Steps.Where(q => !q.IsFinished
+                                        && CurBatch.Edges.Any(e => e.SRC_NODE == curStep.NodeID && e.TGT_NODE == q.NodeID)
+                                     ).ToList();
+            //灏濊瘯灏嗗綋鍓嶅伐姝ョ殑鍚庣画宸ユ娣诲姞鍒板彲浠ユ墽琛岀殑宸ユ鍒楄〃
+            foreach (var step in nextSteps)
+            {
+                //鏌ユ壘鏈夋病鏈夊墠缃伐姝ユ湭瀹屾垚锛岃嫢鏈夊垯涓嶅厑璁哥户缁墽琛�
+                if (!Steps.Any(q => step.PrepNodeIDs.Any(id => id == q.NodeID && !q.IsFinished)))
+                {
+                    result.Add(step);
+                }
+            }
+            //濡傛灉褰撳墠宸ユ娌℃湁鍙墽琛岀殑鍚庣画宸ユ锛屽垯鍦ㄥ墠缃伐姝ユ煡鎵捐繕鏈夋病鏈夊悗缁伐姝ユ病瀹屾垚鐨勫伐姝ワ紝鏈夊垯鎵ц
+            if (!result.Any())
+            {
+                //鏌ユ壘鏈夋病鏈夊墠缃伐姝ユ湭瀹屾垚锛岃嫢鏈夊垯鍏堝畬鎴愭湭瀹屾垚鐨勫墠缃伐姝�
+                var prepIDs = curStep.PrepNodeIDs.Where(id => CurBatch.Edges.Any(e => e.SRC_NODE == id && Steps.Any(q => !q.IsFinished && e.TGT_NODE == q.NodeID))).ToList();
+                var prepSteps = Steps.Where(q => prepIDs.Contains(q.NodeID)).OrderByDescending(q => q.Sequence).ToList();
+                while (prepSteps.Any() && !result.Any())
+                {
+                    var prep = prepSteps.First();
+                    var prepNext = GetNextSteps(prep);
+                    if (prepNext.Any())
+                    {
+                        result = prepNext;
+                    }
+                    else
+                    {
+                        prepSteps.Remove(prep);
+                    }
+                }
+
+            }
+            return result.OrderBy(q => q.NodeAct.ACT_NAME).ToList();
+        }
+
+        /// <summary>
+        /// 寮�濮嬫墽琛屼笅涓�琛屼负宸ユ
+        /// </summary>
+        /// <param name="input"></param>
+        public ApiAction<SubmitOutput> BeginNextActionStep(SubmitInput input)
+        {
+            var result = new ApiAction<SubmitOutput>();
+            //璁剧疆鍚庣画鍙墽琛岀殑宸ユ鍒楄〃
+            NextSteps = GetNextSteps(CurStep);
+            //灏濊瘯鏈夋病鏈夊彲浠ョ洿鎺ュ紑濮嬬殑鍚庣画宸ユ
+            foreach (var step in NextSteps)
+            {
+                //灏濊瘯鎵ц鍚庣画宸ユ
+                var canBegin = step.TryBegin(input);
+                //濡傛灉鍚庣画宸ユ鍙互鐩存帴寮�濮嬪垯鐩存帴鎵ц
+                if (canBegin.IsSuccessed)
+                {
+                    //鏇存柊褰撳墠鎵ц宸ユ涓哄凡寮�濮嬪伐姝�
+                    CurStep = step;
+                    //鏇存柊鍚庣画鍙墽琛岀殑宸ユ鍒楄〃
+                    NextSteps = GetNextSteps(CurStep);
+                    //杩斿洖缁撴灉鍒板鎴风
+                    result = canBegin;
+                    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;
+                    
+                    return result;
+                }
+            }
+
+            //娌℃湁鍙互鐩存帴寮�濮嬬殑鍚庣画宸ユ锛屾牴鎹悗缁伐姝ヨ繑鍥濧piAction
+            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.StepActCode = CurStep.NodeAct.ACT_CODE;
+            result.Data.NextStepID = "";
+
+            //娌℃湁鍙互鐩存帴寮�濮嬬殑鍚庣画宸ユ锛屾牴鎹悗缁彲鎵ц宸ユ鍒楄〃杩斿洖鐩稿簲鐨勬搷浣滄彁绀�
+            if (NextSteps.Count == 1)
+            {
+                result.LocaleMsg = NextSteps.First().GetBeginMsg();
+            }
+            else
+            {
+                result.LocaleMsg = new(T(L("MES.Transaction.Position.PleaseSelectNextStep"), input.Locale) + "\r\n" +
+                                              string.Join("\r\n", NextSteps.Select(q => "    >> " + T(q.GetBeginMsg(), input.Locale))));
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鎵撳嵃鏍囩妯℃澘杩囩▼鍙橀噺鍊�
+        /// </summary>
+        /// <param name="labelPVs">杩囩▼鍙橀噺鍒楄〃</param>
+        /// <param name="lv">鏍囩妯℃澘鍙橀噺</param>
+        /// <returns></returns>
+        public string GetPrintProcessValue(List<BAS_LABEL_PV> labelPVs, BAS_LABEL_VAR lv)
+        {
+            var pv = labelPVs.FirstOrDefault(q => q.VAR_CODE == lv.VAR_VALUE);
+            if (!pv.IsNullOrEmpty())
+            {
+                switch (pv.VAR_TYPE.GetEnum<BAS_LABEL_PV.VAR_TYPEs>())
+                {
+                    case BAS_LABEL_PV.VAR_TYPEs.ServerMethod:
+                        {
+                            switch (pv.VAR_METHOD)
+                            {
+                                case "GetSN":
+                                    return CurWipSN.SN;
+                                case "GetBAS_ITEM":
+                                    return WorkBatch.Product.ToJson();
+                                case "GetCustomer":
+                                    return WorkBatch.Batch.ToJson();
+                                default:
+                                    return "";
+                            }
+                        }
+                    case BAS_LABEL_PV.VAR_TYPEs.WebApiWebApi:
+                        break;
+                    case BAS_LABEL_PV.VAR_TYPEs.StoredProcedure:
+                        break;
+                    default:
+                        break;
+                }
+            }
+            return "";
+        }
+
         #endregion Functions
 
         public override bool Close(bool needSaveHistoryLog = false)

--
Gitblit v1.9.3