From bed76502512bd0a7f39cfa7024b238d822746e67 Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期五, 27 九月 2024 01:30:19 +0800
Subject: [PATCH] Merge branch 'master' of http://47.115.28.255:8110/r/TigerClouds-Tech/Server/TigerApi6_2024

---
 Tiger.Business.MES/Transaction/Position.cs |  582 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 573 insertions(+), 9 deletions(-)

diff --git a/Tiger.Business.MES/Transaction/Position.cs b/Tiger.Business.MES/Transaction/Position.cs
index 4d046eb..c2f109a 100644
--- a/Tiger.Business.MES/Transaction/Position.cs
+++ b/Tiger.Business.MES/Transaction/Position.cs
@@ -10,9 +10,9 @@
 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;
+using System.Globalization;
+using Tiger.Business.MES.WorkAction;
 
 namespace Tiger.Business.MES.Transaction
 {
@@ -41,24 +41,45 @@
             //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;
         }
 
         #region Propertys & Variables
         public string UserCode { get; set; }
         public string PostCode { get; set; }
+        protected DateTime BeginAt;
+        protected DateTime EndAt;
+        public TimeSpan ElapsedTime => EndAt - BeginAt;
         public MES_FACTORY CurFactory { get; set; }
         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 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.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;
+        //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();
+        private Dictionary<string, OperInfo> OperInfoDic = new();
+
         #endregion Propertys & Variables
 
         #region Functions
@@ -106,10 +127,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)
@@ -120,14 +153,545 @@
         }
 
         /// <summary>
-        /// 閲嶇疆褰撳墠宸ユ
+        /// 鑾峰彇褰撳墠鏃堕棿鎵�灞炵殑鐝埗鐝鏃舵
         /// </summary>
-        public void ResetSteps()
+        public ShiftPeriod GetShiftPeriodForNow()
         {
-            Steps.Clear();
-            CurWipSN = null;
+            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>
+        /// <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();
+            CurWipSNs.Clear();
+            CurWipSNHiss.Clear();
+            CurStep = null;
+            CurDefects.Clear();
+        }
+
+        //鑾峰彇褰撳墠鐨勫伐搴忎俊鎭�
+        protected OperInfo CurOperInfo(string locale)
+        {
+            OperInfo info = new();
+            if (CurBatch?.Batch?.BATCH_NO != null)
+            {
+                info = OperInfoDic[CurBatch.Batch.BATCH_NO];
+                info.StepsInfo = Steps.Select(q => q.GetInfo(locale)).ToList();
+            }
+            return info;
+        }
+
+        /// <summary>
+        /// 璁剧疆褰撳墠鏉$爜鐨勫伐搴忎俊鎭�
+        /// </summary>
+        public OperInfo SetOperNodeInfo(OperInfo info)
+        {
+            if (CurWipSNs.Any())
+            {
+                info.CurNode = CurWipSNs.First().NODE_NAME;
+                info.NextNode = string.Join(",", CurBatch.GetNextNodes(CurWipSNs.First()).Select(q => q.NODE_NAME));
+            }
+            else
+            {
+                info.CurNode = "   鈥�   ";
+                info.NextNode = "   鈥�   ";
+            }
+            return info;
+        }
+
+        /// <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.NodeTypes.Action, this)
+                    {
+                        Name = act.ACT_NAME,
+                        Sequence = parent.Sequence + 1,
+                        Node = parent.Node,
+                        OperSetting = CurBatch.NodeSets.FirstOrDefault(q => q.NODE_ID == parent.Node.ID),
+                        NodeAct = act,
+                        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();
+                    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() && 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();
+                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>(new SubmitOutput());
+            //璁剧疆鍚庣画鍙墽琛岀殑宸ユ鍒楄〃
+            NextSteps = GetNextSteps(CurStep);
+            //灏濊瘯鏈夋病鏈夊彲浠ョ洿鎺ュ紑濮嬬殑鍚庣画宸ユ
+            foreach (var step in NextSteps)
+            {
+                //灏濊瘯鎵ц鍚庣画宸ユ
+                var canBegin = step.TryBegin(input);
+                //濡傛灉鍚庣画宸ユ鍙互鐩存帴寮�濮嬪垯鐩存帴鎵ц
+                if (canBegin.IsSuccessed)
+                {
+                    //鏇存柊褰撳墠鎵ц宸ユ涓哄凡寮�濮嬪伐姝�
+                    CurStep = step;
+                    //鏇存柊鍚庣画鍙墽琛岀殑宸ユ鍒楄〃
+                    NextSteps = GetNextSteps(CurStep);
+                    //濡傛灉褰撳墠鎵ц宸ユ灏濊瘯鎵ц鍚庡氨宸茬粡瀹屾垚锛屼笉闇�瑕佸悗缁氦浜掞紝涓旓紝鍒欑户缁紑濮嬩笅涓�宸ユ
+                    if (CurStep.IsFinished && NextSteps.Any())
+                    {
+                        result = BeginNextActionStep(input);
+                    }
+                    else
+                    {
+                        //杩斿洖缁撴灉鍒板鎴风
+                        result = canBegin;
+                        result.Data.SetValue(CurBatch, CurStep, CurStep?.ID, IsFinishAllSteps);
+                    }
+                    return result;
+                }
+                //宸ュ簭琚噸缃�
+                else if (Steps.IsNullOrEmpty())
+                {
+                    return canBegin;
+                }
+            }
+
+            //娌℃湁鍙互鐩存帴寮�濮嬬殑鍚庣画宸ユ锛屾牴鎹悗缁伐姝ヨ繑鍥濧piAction
+            result.Data.SetValue(CurBatch, CurStep, "", IsFinishAllSteps);
+
+            //娌℃湁鍙互鐩存帴寮�濮嬬殑鍚庣画宸ユ锛屾牴鎹悗缁彲鎵ц宸ユ鍒楄〃杩斿洖鐩稿簲鐨勬搷浣滄彁绀�
+            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>
+        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();
+                        }
+                    }
+                    //璁板綍宸ュ簭鑰楁椂
+                    EndAt = DateTime.Now;
+                    var ids = CurWipSNHiss.Select(q => q.ID).ToList();
+                    GetCommitDB().Updateable<MES_WIP_HIS>().SetColumns(q => q.ELAPSED_TIME == ElapsedTime.TotalMilliseconds.ToInt64()).Where(q => ids.Contains(q.ID)).ExecuteCommand();
+                });
+                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;
+            }
+        }
+
+        #region 鎵撳嵃涓撶敤鏂规硶
+        /// <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.OrderBy(q => q.VAR_TYPE == BAS_LABEL_VAR.VAR_TYPEs.BarcodeGenerate.GetValue() ? 0 : 1))
+            {
+                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, label.Variables, 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, List<BAS_LABEL_VAR> lvars, IWorkAction action)
+        {
+            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 CurSN;
+                                case "GetBAS_ITEM":
+                                    return WorkBatch.Product.ITEM_CODE;
+                                case "GetCustomer":
+                                    return WorkBatch.Batch.ToJson();
+                                case "GetBoxQR":
+                                    return action is PackingAction ? GetBoxCode(lvars, action as PackingAction) : "";
+                                case "GetCardQR":
+                                    return action is PackingAction? GetCardCode(lvars, action as PackingAction) : "";
+                                case "GetDescription":
+                                    return WorkBatch.Product.ITEM_DESC;
+                                case "GetPAndO":
+                                    return WorkBatch.WO.SALES_CONTRACT;
+                                case "GetLTD":
+                                    return WorkBatch.Batch.Customer.SHORT_NAME;
+                                case "GetHWDate":
+                                    return WorkBatch.Batch.ToJson();
+                                case "GetModel":
+                                    return GetLabelVarWo(lv, WorkBatch.Product.ExtInfo.Model);
+                                case "GetInput":
+                                    return GetLabelVarWo(lv, WorkBatch.Product.ExtInfo.Input);
+                                case "GetOutput":
+                                    return GetLabelVarWo(lv, WorkBatch.Product.ExtInfo.OutPut);
+                                case "GetPower":
+                                    return GetLabelVarWo(lv, WorkBatch.Product.ExtInfo.Power);
+                                case "GetAccuracy":
+                                    return GetLabelVarWo(lv, WorkBatch.Product.ExtInfo.Accuracy);
+                                case "GetVarByWo":
+                                    return GetLabelVarWo(lv, "");
+                                default:
+                                    return "";
+                            }
+                        }
+                    case BAS_LABEL_PV.VAR_TYPEs.WebApi:
+                        break;
+                    case BAS_LABEL_PV.VAR_TYPEs.StoredProcedure:
+                        break;
+                    default:
+                        break;
+                }
+            }
+            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 value)
+        {
+            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 = value.IsNullOrEmpty() ? (labelVarwos.Count > 0 ? labelVarwos.First().DEFAULT_VALUE : "") : value;
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鐧界洅鏉$爜
+        /// </summary>
+        /// <param name="action"></param>
+        /// <returns></returns>
+        private string GetBoxCode(List<BAS_LABEL_VAR> lvars, PackingAction action)
+        {
+            return GetCardOrBoxQR(CurSN, lvars, action);
+        }
+
+        /// <summary>
+        /// 鑾峰彇绠辨潯鐮�
+        /// </summary>
+        /// <param name="lvars"></param>
+        /// <param name="action"></param>
+        /// <returns></returns>
+        private string GetCardCode(List<BAS_LABEL_VAR> lvars, PackingAction action)
+        {
+            var cardCode = lvars.First(q=>q.VAR_NAME == "CardQR").Value;
+            return GetCardOrBoxQR(cardCode, lvars, action);
+        }
+
+        /// <summary>
+        /// 鑾峰彇鐧界洅鎴栬�呯浜岀淮鐮�
+        /// </summary>
+        /// <param name="code"></param>
+        /// <param name="lvars"></param>
+        /// <param name="action"></param>
+        /// <returns></returns>
+        private string GetCardOrBoxQR(string code, List<BAS_LABEL_VAR> lvars, PackingAction action)
+        {
+            var itemCode = WorkBatch.Product.ITEM_CODE;
+            var wo = WorkBatch.Batch.ORDER_NO;
+            var snList = string.Join("\r\n", action.GetMinPackageList(action.CurPkg.Item).Select(q => q.SN));
+            var weight = action.CurPkg.WeightInfo.Weight;
+            var unit = action.CurPkg.WeightInfo.Unit.ToUpper();
+            var model = WorkBatch.Product.ExtInfo.Model;
+            var Input = WorkBatch.Product.ExtInfo.Input;
+            var OutPut = WorkBatch.Product.ExtInfo.OutPut;
+            var Power = WorkBatch.Product.ExtInfo.Power;
+            var Accuracy = WorkBatch.Product.ExtInfo.Accuracy;
+            var Remark = WorkBatch.Product.ExtInfo.Remark;
+
+            return $"{code}|{itemCode}|{wo}|{snList}|{weight}|鍨嬪彿:{model},杈撳叆:{Input},杈撳嚭:{OutPut},鐢垫簮:{Power},绮惧害:{Accuracy},澶囨敞:{Remark}";
+        }
+
+        /// <summary>
+        /// 鏍规嵁鍖呰宸ュ崟鍜屾潯鐮佽幏鍙栧崕涓鸿姹傜殑鐢熶骇鍛ㄦ湡
+        /// </summary>
+        /// <param name="snList"></param>
+        /// <returns></returns>
+        private string GetHuaWeiWeek(string pkgOrder, List<string> snList)
+        {
+            Dictionary<string, string> dic = new();
+            var snOrder = Biz.Db.Queryable<MES_CUST_SN, BIZ_MES_WO>((q, w) => new JoinQueryInfos(JoinType.Left, q.WORK_ORDER == w.ORDER_NO))
+                                            .Where((q, w) => q.PKG_ORDER == pkgOrder && (snList.Contains(q.FLOW_SN) || snList.Contains(q.CUST_SN)))
+                                           .Select((q, w) => new { q.PKG_ORDER, q.WORK_ORDER, w.ACT_START_TIME, w.PLAN_START_TIME, q.FLOW_SN, q.CUST_SN }).ToList();
+            foreach (var sn in snList)
+            {
+                var item = snOrder.FirstOrDefault(q => q.FLOW_SN == sn || q.CUST_SN == sn);
+                if (!item.IsNullOrEmpty())
+                {
+                    var date = item.ACT_START_TIME < new DateTime(2000, 1, 1) ? item.PLAN_START_TIME : item.ACT_START_TIME; ;
+                    var firstDay = new DateTime(date.Year, 1, 1);
+                    int daysOffset = firstDay.DayOfWeek.GetValue() > 3 ? (firstDay.DayOfWeek.GetValue() - 7) : 0;
+                    int year = date.Year + ((date - firstDay).TotalDays + daysOffset < 0 ? -1 : 0);
+                    int week = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday);
+                    dic.Add(sn, $"{year.ToString().Substring(2, 2)}{week:00}");
+                }
+                else
+                {
+                    dic.Add(sn, "");
+                }
+            }
+            var weeks = dic.Select(q => q.Value).Where(q => !q.IsNullOrEmpty()).Distinct().OrderBy(q => q).ToList();
+
+            switch (weeks.Count)
+            {
+                case 0:
+                    return "";
+                case 1:
+                    return weeks.First();
+                case 2:
+                    return string.Join("/", weeks.Select(q => q + $"({dic.Count(d => d.Value == q)})"));
+                default:
+                    return string.Join("/", weeks.Take(2)) + " (+)";
+            }
+        }
+        #endregion
         #endregion Functions
 
         public override bool Close(bool needSaveHistoryLog = false)

--
Gitblit v1.9.3