From 1f72396c6294b9f78723d786a9b0965414d0601a Mon Sep 17 00:00:00 2001
From: Ben Lin <maobin001@msn.com>
Date: 星期五, 13 九月 2024 15:38:38 +0800
Subject: [PATCH] 一些更改

---
 Tiger.Business.MES/Transaction/Position.cs |  253 +++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 226 insertions(+), 27 deletions(-)

diff --git a/Tiger.Business.MES/Transaction/Position.cs b/Tiger.Business.MES/Transaction/Position.cs
index 99879d9..5dcbd97 100644
--- a/Tiger.Business.MES/Transaction/Position.cs
+++ b/Tiger.Business.MES/Transaction/Position.cs
@@ -55,16 +55,26 @@
         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 List<MES_WIP_DATA> CurWipSNs { get; set; } = new();
+        public string CurSN => (CurWipSNs.Any() ? (CurWipSNs.First().TRAY_SN.IsNullOrEmpty() ? CurWipSNs.First().SN : CurWipSNs.First().TRAY_SN) : "");
+        public List<MES_WIP_HIS> CurWipSNHiss { get; set; } = new();
+        public List<MES_WIP_DFT> CurDefects { get; set; } = new();
         public Dictionary<string, object> Context { get; set; } = new();
         public List<WorkStep> Steps { get; set; } = new();
         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 IsFinishNodeSteps => !Steps.Any(q => q.NodeType == IWorkStep.NodeTypes.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;
+        /// <summary>
+        /// 鏄惁闇�瑕佷复鏃跺瓨鍌ㄦ暟鎹簱鎻愪氦鎿嶄綔锛屽緟闇�瑕佺殑鏃跺�欏啀鎻愪氦
+        /// </summary>
+        public bool NeedTemporaryStoreDBCommitAction { get; set; } = false;
+        protected Dictionary<string, List<Action>> DBCommitList { get; set; } = new();
+        protected List<Position> NodeCommitList { get; set; } = new();
+        protected Dictionary<string, OperInfo> OperInfoDic { get; set; } = new();
+        //protected OperInfo CurOperInfo { get; set; }
         #endregion Propertys & Variables
 
         #region Functions
@@ -112,10 +122,22 @@
                         action.LocaleMsg = new("MES.Transaction.Position.SelectOrder.LineException", input.OrderNo, CurLine.LINE_CODE);
                         return action;
                     }
+                    if (batch.STATUS != BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() && batch.STATUS != BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())
+                    {
+                        action.IsSuccessed = false;
+                        //action.LocaleMsg = new($"宸ュ崟[{input.OrderNo}]鐘舵�乕{wo.STATUS.GetEnum<BIZ_MES_WO_BATCH.STATUSs>().GetName()}]涓嶈兘鐢熶骇");
+                        action.LocaleMsg = new("MES.Transaction.Position.SelectOrder.StatusException", input.OrderNo, batch.STATUS.GetEnum<BIZ_MES_WO_BATCH.STATUSs>().GetName());
+                        return action;
+                    }
                     var wb = new WorkBatch(input.OrderNo).Init(CurLine.LINE_CODE);
                     WoContext.WoBatchDic.Add(wb.Batch.BATCH_NO, wb);
                 }
                 CurBatch = WoContext.GetBatch(input.OrderNo, CurLine.LINE_CODE);
+                if (!OperInfoDic.ContainsKey(CurBatch.Batch.BATCH_NO))
+                {
+                    OperInfoDic.Add(CurBatch.Batch.BATCH_NO, new());
+                }
+                
                 action.Data = new { WorkOrder = CurBatch.WO, Bacth = CurBatch.Batch };
             }
             catch (Exception ex)
@@ -147,12 +169,51 @@
         }
 
         /// <summary>
-        /// 閲嶇疆褰撳墠宸ユ
+        /// 閲嶇疆宸ュ簭鎿嶄綔
         /// </summary>
-        public void ResetSteps()
+        /// <returns></returns>
+        public ApiAction Reset()
+        {
+            var action = new ApiAction();
+
+            ResetNode();
+            action.IsSuccessed = true;
+            action.LocaleMsg = new($"宸ュ簭鎿嶄綔宸查噸缃紝璇烽噸鏂版壂鎻忚繘绔欎骇鍝佹潯鐮�");
+            action.LocaleMsg = new("MES.Transaction.Position.ResetNode");
+
+            return action;
+        }
+
+        /// <summary>
+        /// 閲嶇疆褰撳墠宸ュ簭锛屾湁闇�瑕佸垯閲嶅啓姝ゆ柟娉�
+        /// </summary>
+        public virtual void ResetNode()
         {
             Steps.Clear();
-            CurWipSN = null;
+            CurWipSNs.Clear();
+            CurWipSNHiss.Clear();
+            CurStep = null;
+            CurDefects.Clear();
+        }
+
+        /// <summary>
+        /// 璁剧疆褰撳墠鏉$爜鐨勫伐搴忎俊鎭�
+        /// </summary>
+        public OperInfo SetOperNodeInfo(OperInfo info, string locale)
+        {
+            if (CurWipSNs.Any())
+            {
+                info.CurNode = CurWipSNs.First().NODE_NAME;
+                info.NextNode = string.Join(",", CurBatch.GetNextNodes(CurWipSNs.First()).Select(q => q.NODE_NAME));
+                info.StepsInfo = Steps.Select(q => q.GetInfo(locale)).ToList();
+            }
+            else
+            {
+                info.CurNode = "   鈥�   ";
+                info.NextNode = "   鈥�   ";
+                info.StepsInfo = new();
+            }
+            return info;
         }
 
         /// <summary>
@@ -197,14 +258,16 @@
                 }
                 else
                 {
-                    var next = new WorkStep(IWorkStep.Types.Action, this)
+                    var next = new WorkStep(IWorkStep.NodeTypes.Action, this)
                     {
-                        NodeID = act.ID,
+                        Name = act.ACT_NAME,
                         Sequence = parent.Sequence + 1,
                         Node = parent.Node,
+                        OperSetting = CurBatch.NodeSets.FirstOrDefault(q => q.NODE_ID == parent.Node.ID),
                         NodeAct = act,
-                        Setting = CurBatch.ActionSets.FirstOrDefault(q => q.ACT_ID == act.ID),
+                        ActSetting = CurBatch.ActionSets.FirstOrDefault(q => q.ACT_ID == act.ID),
                     };
+                    next.Init();
                     next.PrepNodeIDs.Add(parent.NodeID);
                     next.PrepNodeIDs.AddRange(parent.PrepNodeIDs);
                     next.PrepNodeIDs = next.PrepNodeIDs.Distinct().ToList();
@@ -234,7 +297,7 @@
                 }
             }
             //濡傛灉褰撳墠宸ユ娌℃湁鍙墽琛岀殑鍚庣画宸ユ锛屽垯鍦ㄥ墠缃伐姝ユ煡鎵捐繕鏈夋病鏈夊悗缁伐姝ユ病瀹屾垚鐨勫伐姝ワ紝鏈夊垯鎵ц
-            if (!result.Any())
+            if (!result.Any() && Steps.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();
@@ -263,7 +326,7 @@
         /// <param name="input"></param>
         public ApiAction<SubmitOutput> BeginNextActionStep(SubmitInput input)
         {
-            var result = new ApiAction<SubmitOutput>();
+            var result = new ApiAction<SubmitOutput>(new SubmitOutput());
             //璁剧疆鍚庣画鍙墽琛岀殑宸ユ鍒楄〃
             NextSteps = GetNextSteps(CurStep);
             //灏濊瘯鏈夋病鏈夊彲浠ョ洿鎺ュ紑濮嬬殑鍚庣画宸ユ
@@ -280,24 +343,14 @@
                     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;
-                    
+                    result.Data.SetValue(CurBatch, CurStep, CurStep?.ID, IsFinishAllSteps);
+
                     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 = "";
+            result.Data.SetValue(CurBatch, CurStep, "", IsFinishAllSteps);
 
             //娌℃湁鍙互鐩存帴寮�濮嬬殑鍚庣画宸ユ锛屾牴鎹悗缁彲鎵ц宸ユ鍒楄〃杩斿洖鐩稿簲鐨勬搷浣滄彁绀�
             if (NextSteps.Count == 1)
@@ -313,12 +366,104 @@
         }
 
         /// <summary>
+        /// 淇濆瓨宸ユ鐨勬暟鎹簱鎻愪氦鎿嶄綔鍒版暟鎹簱
+        /// </summary>
+        protected void SaveStepsCommitActionToDB()
+        {
+            //淇濆瓨宸ユ鐨勬暟鎹簱鎻愪氦鎿嶄綔鍒版彁浜ゆ搷浣滃垪琛�
+            var commitList = new List<Action>();
+            foreach (var step in Steps.OrderBy(q => q.Sequence))
+            {
+                commitList.Add(step.DBSubmitAction);
+            }
+            DBCommitList.Add(CurSN, commitList);
+            //濡傛灉涓嶉渶瑕佷复鏃跺瓨鍌ㄦ暟鎹簱鎻愪氦鎿嶄綔锛屽垯鎶婃彁浜ゆ搷浣滃垪琛ㄦ彁浜ゅ埌鏁版嵁搴�
+            if (!NeedTemporaryStoreDBCommitAction)
+            {
+                //鎭㈠涓存椂瀛樺偍鏍囪涓篺alse
+                NeedTemporaryStoreDBCommitAction = false;
+
+                var dbTran = GetCommitDB().UseTran(() =>
+                {
+                    //鍦ㄥ悓涓�涓簨鍔′腑淇濆瓨鎵�鏈夊伐姝ョ殑鏁版嵁
+                    foreach (var wipSn in DBCommitList.Keys)
+                    {
+                        foreach (var action in DBCommitList[wipSn])
+                        {
+                            action.Invoke();
+                        }
+                    }
+                });
+                if (dbTran.IsSuccess)
+                {
+                    //淇濆瓨鎴愬姛鍒欐竻绌烘彁浜ゆ搷浣滃垪琛�
+                    DBCommitList.Clear();
+                }
+                else
+                {
+                    //鎶涘嚭寮傚父
+                    throw dbTran.ErrorException;
+                }
+            }
+        }
+
+        protected void DoSaveToDB()
+        {
+            var dbTran = GetCommitDB().UseTran(() =>
+            {
+                //鍦ㄥ悓涓�涓簨鍔′腑淇濆瓨鎵�鏈夊伐姝ョ殑鏁版嵁
+                foreach (var step in Steps.OrderBy(q => q.Sequence))
+                {
+                    step.DBSubmitAction.Invoke();
+                }
+            });
+            if (!dbTran.IsSuccess)
+            {
+                //鎶涘嚭寮傚父
+                throw dbTran.ErrorException;
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇鎵撳嵃鏍囩妯℃澘杩囩▼鍙橀噺鍊�
+        /// </summary>
+        /// <param name="labelPVs">杩囩▼鍙橀噺鍒楄〃</param>
+        /// <param name="label">鏍囩妯℃澘</param>
+        /// <returns></returns>
+        public BAS_LABEL_TEMP SetLabelVariables(List<BAS_LABEL_PV> labelPVs, BAS_LABEL_TEMP label, IWorkAction action)
+        {
+            foreach (var item in label.Variables)
+            {
+                switch (item.VAR_TYPE.GetEnum<BAS_LABEL_VAR.VAR_TYPEs>())
+                {
+                    case BAS_LABEL_VAR.VAR_TYPEs.Constant:
+                        item.Value = item.VAR_VALUE;
+                        break;
+                    case BAS_LABEL_VAR.VAR_TYPEs.ProcessVariable:
+                        item.Value = GetPrintProcessValue(labelPVs, item, action);
+                        break;
+                    case BAS_LABEL_VAR.VAR_TYPEs.DateVariable:
+                        item.Value = DateTime.Now.ToString(item.VAR_VALUE);
+                        break;
+                    case BAS_LABEL_VAR.VAR_TYPEs.BarcodeGenerate:
+                        item.Value = GetGeneratePValue(labelPVs, item);
+                        break;
+                    case BAS_LABEL_VAR.VAR_TYPEs.CustomVariable:
+                    default:
+                        item.Value = "";
+                        break;
+                }
+            }
+            return label;
+        }
+
+        /// <summary>
         /// 鑾峰彇鎵撳嵃鏍囩妯℃澘杩囩▼鍙橀噺鍊�
         /// </summary>
         /// <param name="labelPVs">杩囩▼鍙橀噺鍒楄〃</param>
         /// <param name="lv">鏍囩妯℃澘鍙橀噺</param>
         /// <returns></returns>
-        public string GetPrintProcessValue(List<BAS_LABEL_PV> labelPVs, BAS_LABEL_VAR lv)
+        public string GetPrintProcessValue(List<BAS_LABEL_PV> labelPVs, BAS_LABEL_VAR lv, IWorkAction action)
         {
             var pv = labelPVs.FirstOrDefault(q => q.VAR_CODE == lv.VAR_VALUE);
             if (!pv.IsNullOrEmpty())
@@ -330,16 +475,18 @@
                             switch (pv.VAR_METHOD)
                             {
                                 case "GetSN":
-                                    return CurWipSN.SN;
+                                    return CurSN;
                                 case "GetBAS_ITEM":
                                     return WorkBatch.Product.ToJson();
                                 case "GetCustomer":
                                     return WorkBatch.Batch.ToJson();
+                                case "GetVarByWo":
+                                    return GetLabelVarWo(lv);
                                 default:
                                     return "";
                             }
                         }
-                    case BAS_LABEL_PV.VAR_TYPEs.WebApiWebApi:
+                    case BAS_LABEL_PV.VAR_TYPEs.WebApi:
                         break;
                     case BAS_LABEL_PV.VAR_TYPEs.StoredProcedure:
                         break;
@@ -350,6 +497,58 @@
             return "";
         }
 
+        /// <summary>
+        /// 鑾峰彇鏍规嵁鏉$爜瑙勫垯鐢熸垚鏍囩妯℃澘鐨勮繃绋嬪彉閲忓��
+        /// </summary>
+        /// <param name="labelPVs"></param>
+        /// <param name="lv"></param>
+        /// <returns></returns>
+        public string GetGeneratePValue(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.BarcodeGenerate:
+                        {
+                            switch (pv.VAR_METHOD)
+                            {
+                                case "GetCartonGenerate":
+                                    return Biz.CodeRule[lv.BARCODE_RULE ?? ""]?.Generate($"{WorkBatch.Batch.BATCH_NO}-{WorkBatch.Batch.PLAN_QTY}-").Data.ToString() ?? "";
+                                case "GetHW21SNGenerate":
+                                    return Biz.CodeRule[lv.BARCODE_RULE ?? ""]?.Generate("SN:","05").Data.ToString() ?? "";
+                                default:
+                                    return "";
+                            }
+                        }
+                    default:
+                        break;
+                }
+            }
+            return "";
+        }
+
+        /// <summary>
+        /// 鑾峰彇宸ュ崟缁存姢鐨勬ā鏉垮彉閲�
+        /// </summary>
+        /// <param name="labelId"></param>
+        /// <returns></returns>
+        private string GetLabelVarWo(BAS_LABEL_VAR lv)
+        {
+            string result = "";
+            var labelVarwos = Biz.Db.Queryable<BAS_LABEL_VAR_WO>().Where(x => x.LABEL_ID == lv.LABEL_ID && x.VAR_NAME == lv.VAR_NAME).ToList();
+            if (labelVarwos.Any(q => q.WORK_ORDER == WorkBatch.Batch.ORDER_NO))
+            {
+                result = labelVarwos.First(q => q.WORK_ORDER == WorkBatch.Batch.ORDER_NO).VAR_VALUE;
+            }
+            else
+            {
+                result = labelVarwos.Count > 0 ? labelVarwos[0].DEFAULT_VALUE : "";
+            }
+            return result;
+        }
+
         #endregion Functions
 
         public override bool Close(bool needSaveHistoryLog = false)

--
Gitblit v1.9.3