From c598e4bf57de2b4703d6c0e4d0905c9159273d26 Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期二, 06 八月 2024 10:16:18 +0800
Subject: [PATCH] 条码增加托盘批量过站逻辑和包装外箱过站逻辑

---
 Tiger.Business/MES/Biz.WorkBatch.cs |  116 ++++++++++++++++++++++++++++------------------------------
 1 files changed, 56 insertions(+), 60 deletions(-)

diff --git a/Tiger.Business/MES/Biz.WorkBatch.cs b/Tiger.Business/MES/Biz.WorkBatch.cs
index 458f609..c4445af 100644
--- a/Tiger.Business/MES/Biz.WorkBatch.cs
+++ b/Tiger.Business/MES/Biz.WorkBatch.cs
@@ -8,20 +8,16 @@
 using Rhea.Common;
 using System.Net;
 using System.Linq;
-using Newtonsoft.Json;
 using Tiger.IBusiness;
-using Microsoft.AspNetCore.Http;
 using Tiger.Business.MES;
-using Org.BouncyCastle.Ocsp;
 using Tiger.Model.Entitys.MES.Position;
-using static System.Net.Mime.MediaTypeNames;
 
 namespace Tiger.Business
 {
     public partial class Biz
     {
         /// <summary>
-        /// 宸ュ崟鎵规
+        /// 鐢熶骇涓殑宸ュ崟鎵规
         /// </summary>
         public partial class WorkBatch : IWorkBatch, IDisposable
         {
@@ -59,7 +55,7 @@
             public WorkBatch Init(string lineCode)
             {
                 LineCode = lineCode;
-                WO = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).First();
+                WO = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).IncludesAllFirstLayer().First();
                 Product = Biz.Db.Queryable<BAS_ITEM>().Where(q => q.ITEM_CODE == WO.ITEM_CODE && q.AUTH_ORG == WO.AUTH_ORG).First();
                 Batch = Biz.Db.Queryable<BIZ_MES_WO_BATCH>().Where(q => q.ORDER_NO == OrderNo && q.ACT_LINE == LineCode).First();
                 Customer = Biz.Db.Queryable<BAS_CUSTOMER>().Where(q => q.CUST_CODE == WO.CUST_CODE).First();    
@@ -110,21 +106,21 @@
             }
 
             /// <summary>
-            /// 妫�鏌ュ伐鍗曞疄鏃剁姸鎬侊紝鍒ゆ柇鍙互鐢熶骇锛氬伐鍗曡窡鎵规鐘舵�佷笉鏄凡涓嬪彂鎴栬�呯敓浜т腑锛屽垯涓嶅厑璁哥敓浜�
+            /// 妫�鏌ュ伐鍗曞湪褰撳墠宸ュ簭鑺傜偣鏄惁鍙互鐢熶骇
             /// </summary>
+            /// <param name="curNode"></param>
             /// <returns></returns>
-            public ApiAction<SubmitOutput> CheckStatus()
+            public ApiAction<SubmitOutput> CheckCanProduce(MES_WO_NODE curNode)
             {
-                var action = new ApiAction<SubmitOutput>(true);
+                var action = new ApiAction<SubmitOutput>(new SubmitOutput(), true);
 
-                WO = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).First();
+                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.ORDER_NO == OrderNo && q.ACT_LINE == LineCode).First();
                 //宸ュ崟鎵规鐘舵�佷笉鏄凡涓嬪彂鎴栬�呯敓浜т腑锛屽垯涓嶅厑璁哥敓浜�
                 if (Batch.STATUS != BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() && Batch.STATUS != BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())
                 {
                     action.IsSuccessed = false;
-                    action.Data.CurWO = WO.ORDER_NO;
-                    action.Data.CurBatch = Batch.BATCH_NO;
+                    action.Data.SetValue(this, null);
                     //action.LocaleMsg = new($"宸ュ崟鎵规[{Batch.BATCH_NO}]鐘舵�乕{Batch.STATUS.GetEnum<BIZ_MES_WO_BATCH.STATUSs>().GetName()}]涓嶆槸鍏佽鐢熶骇鐨勭姸鎬侊紝璇锋壂鎻忓厑璁哥敓浜х殑浜у搧鏉$爜");
                     action.LocaleMsg = new("MES.WorkBatch.WoBatchStatusCanNotWork", Batch.BATCH_NO, Batch.STATUS.GetEnum<BIZ_MES_WO_BATCH.STATUSs>().GetName());
                 }
@@ -132,10 +128,17 @@
                 if (WO.STATUS != BIZ_MES_WO.STATUSs.Release.GetValue() && WO.STATUS != BIZ_MES_WO.STATUSs.Working.GetValue())
                 {
                     action.IsSuccessed = false;
-                    action.Data.CurWO = WO.ORDER_NO;
-                    action.Data.CurBatch = Batch.BATCH_NO;
+                    action.Data.SetValue(this, null);
                     //action.LocaleMsg = new($"宸ュ崟[{WO.ORDER_NO}]鐘舵�乕{Batch.STATUS.GetEnum<BIZ_MES_WO.STATUSs>().GetName()}]涓嶆槸鍏佽鐢熶骇鐨勭姸鎬侊紝璇锋壂鎻忓厑璁哥敓浜х殑浜у搧鏉$爜");
                     action.LocaleMsg = new("MES.WorkBatch.WoStatusCanNotWork", WO.ORDER_NO, Batch.STATUS.GetEnum<BIZ_MES_WO.STATUSs>().GetName());
+                }
+                //宸ュ崟鎵规鎶曞叆鏁伴噺鍑忓幓鎶ュ簾鏁伴噺濡傛灉澶т簬绛変簬璁″垝鏁伴噺锛屽垯涓嶅厑璁哥敓浜�
+                if (curNode.IS_INPUT == "Y" && Batch.INPUT_QTY - Batch.SCRAP_QTY >= Batch.PLAN_QTY)
+                {
+                    action.IsSuccessed = false;
+                    action.Data.SetValue(this, null);
+                    action.LocaleMsg = new($"宸ュ崟鎵规[{0}]宸叉姇鍏� {1}锛屽叾涓姤搴� {2}锛屼互婊¤冻璁″垝鏁伴噺[{3}]锛屾棤闇�缁х画鎶曞叆");
+                    action.LocaleMsg = new("MES.WorkBatch.WoInputEnough", Batch.BATCH_NO, Batch.INPUT_QTY, Batch.SCRAP_QTY, Batch.PLAN_QTY);
                 }
 
                 return action;
@@ -220,13 +223,13 @@
             /// <summary>
             /// 鏍规嵁浼犲叆鐨勬潯鐮佽繃绔欎俊鎭拰涓嬩竴绔欑殑鐩爣宸ュ簭锛屽垽鏂潯鐮佹槸鍚﹁兘杩涘叆涓嬩竴绔�
             /// </summary>
-            /// <param name="input"></param>
-            /// <param name="wipSN"></param>
-            /// <param name="nextNode"></param>
+            /// <param name="input">鏈鎻愪氦鐨勬暟鎹�</param>
+            /// <param name="wipSN">褰撳墠鐨勬潯鐮佽繃绔欒褰�</param>
+            /// <param name="nextNode">瑕佽繘鍏ョ殑鐩爣宸ュ簭</param>
             /// <returns></returns>
             public ApiAction<SubmitOutput> CanGotoNext(SubmitInput input, MES_WIP_DATA wipSN, MES_WO_NODE nextNode)
             {
-                var action = new ApiAction<SubmitOutput>();
+                var action = new ApiAction<SubmitOutput>(new SubmitOutput());
 
                 //鏉$爜鍦ㄦ湰宸ュ崟绗竴娆¤繃绔�
                 if (wipSN.NODE_ID.IsNullOrEmpty())
@@ -239,10 +242,9 @@
                     else
                     {
                         action.IsSuccessed = false;
-                        action.Data.CurWO = WO.ORDER_NO;
-                        action.Data.CurBatch = Batch.BATCH_NO;
+                        action.Data.SetValue(this, null);
                         var nextList = Nodes.Where(q => q.IS_FIRST_NODE == "Y");
-                        action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", wipSN.SN, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
+                        action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", input.SN, nextNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
                         return action;
                     }
                 }
@@ -251,47 +253,43 @@
                 {
                     var curNode = Nodes.First(q => q.ID == wipSN.NODE_ID);
                     var curSetting = NodeSets.FirstOrDefault(q => q.NODE_ID == curNode.ID);
-                    //杩涘叆缁翠慨锛氬鏋滅洰鏍囧伐搴忔槸缁翠慨宸ュ簭鍒欏垽鏂綋鍓嶆潯鐮佸湪鏈伐鍗曟湁娌℃湁鏈淮淇殑涓嶈壇璁板綍涓斿綋鍓嶅伐搴忚妭鐐规湁娌℃湁杩炵嚎鍒扮淮淇伐搴忥紝鏈夊垯鍏佽锛屾病鏈夊垯鎶ラ敊
-                    if (nextNode.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue())
+                    //杩涘叆缁翠慨锛氬鏋滅洰鏍囧伐搴忔槸缁翠慨宸ュ簭鍒欏垽鏂綋鍓嶆潯鐮佸湪鏈伐鍗曟湁鏈淮淇殑涓嶈壇璁板綍涓斿綋鍓嶅伐搴忚妭鐐规湁杩炵嚎鍒扮淮淇伐搴忥紝鍒欏厑璁歌繘鍏ョ淮淇伐搴�
+                    if (nextNode.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue()
+                        && wipSN.Defects.Any(q => q.WORK_ORDER == WO.ORDER_NO && q.STATUS < MES_WIP_DFT.STATUSs.Resolved.GetValue())
+                        && Edges.Any(q => q.SRC_NODE == curNode.ID && q.TGT_NODE == nextNode.ID))
                     {
-                        //if (nextNode.IS_FIRST_NODE == "Y")
-                        //{
-                        //    action.IsSuccessed = true;
-                        //}
-                        //else
-                        //{
-                        //    action.IsSuccessed = false;
-                        //    action.Data.CurWO = WO.ORDER_NO;
-                        //    action.Data.CurBatch = Batch.BATCH_NO;
-                        //    var nextList = Nodes.Where(q => q.IS_FIRST_NODE == "Y");
-                        //    action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", wipSN.SN, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
-                        //    return action;
-                        //}
+                        action.IsSuccessed = true;
+                        return action;
                     }
                     //缁翠慨鍥炴祦锛氬鏋滄潯鐮佺殑褰撳墠宸ュ簭鏄淮淇伐搴忥紝鍒欒涓烘槸缁翠慨鍥炴祦
                     else if (curNode.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue())
                     {
-                        //if (nextNode.IS_FIRST_NODE == "Y")
-                        //{
-                        //    action.IsSuccessed = true;
-                        //}
-                        //else
-                        //{
-                        //    action.IsSuccessed = false;
-                        //    action.Data.CurWO = WO.ORDER_NO;
-                        //    action.Data.CurBatch = Batch.BATCH_NO;
-                        //    var nextList = Nodes.Where(q => q.IS_FIRST_NODE == "Y");
-                        //    action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", wipSN.SN, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
-                        //    return action;
-                        //}
+                        //鏌ユ壘鎵�鏈夊彲浠ュ洖娴佺殑宸ュ簭
+                        var reflowNodes = Nodes.Where(q => Edges.Any(e => e.SRC_NODE == curNode.ID && e.TGT_NODE == q.ID)
+                                                                    && NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y")).ToList();
+
+                        //鍙洖娴佺殑宸ュ簭鍖呭惈鐩爣宸ュ簭涓旀潯鐮佸湪缁翠慨绔欓�夋嫨鐨勫洖娴佸伐搴忎负绌烘垨鑰呯瓑浜庣洰鏍囧伐搴忥紝鍒欏厑璁歌繘绔�
+                        if (reflowNodes.Any(q => q.ID == nextNode.ID) && (wipSN.REFLOW_NODE.IsNullOrEmpty() || wipSN.REFLOW_NODE == nextNode.NODE_NAME))
+                        {
+                            action.IsSuccessed = true;
+                            return action;
+                        }
+                        else
+                        {
+                            action.IsSuccessed = false;
+                            action.Data.SetValue(this, null);
+                            var nextList = reflowNodes.Where(q => wipSN.REFLOW_NODE.IsNullOrEmpty() || wipSN.REFLOW_NODE == q.NODE_NAME);
+                            action.LocaleMsg = new("MES.WorkBatch.ReflowToNodeException", nextNode.NODE_NAME, input.SN, curNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
+                            return action;
+                        }
                     }
-                    //涓嶈壇鍝佸叆绔欙細濡傛灉浜у搧鏈変笉鑹褰曚笖鐩爣宸ュ簭涓嶅厑璁镐笉鑹搧鍏ョ珯锛屽垯鎶ラ敊
-                    else if (wipSN.Defects.Any(q => q.STATUS < MES_WIP_DFT.STATUSs.Resolved.GetValue()) && curSetting.ALLOW_DFT_IN != "Y")
+                    //涓嶈壇鍝佸叆绔欙細濡傛灉浜у搧鏈変笉鑹褰曚笖鐩爣宸ュ簭涓嶆槸缁翠慨宸ュ簭涓斾笉鍏佽涓嶈壇鍝佸叆绔欙紝鍒欐姤閿�
+                    else if (wipSN.Defects.Any(q => q.WORK_ORDER == WO.ORDER_NO && q.STATUS < MES_WIP_DFT.STATUSs.Resolved.GetValue()) 
+                         && curSetting.ALLOW_DFT_IN != "Y" && nextNode.Operation.OPER_TYPE != MES_OPERATION.OPER_TYPEs.Repair.GetValue())
                     {
                         action.IsSuccessed = false;
-                        action.Data.CurWO = WO.ORDER_NO;
-                        action.Data.CurBatch = Batch.BATCH_NO;
-                        action.LocaleMsg = new("MES.WorkBatch.PleaseGotoRepair", curNode.NODE_NAME, wipSN.SN);
+                        action.Data.SetValue(this, null);
+                        action.LocaleMsg = new("MES.WorkBatch.PleaseGotoRepair", curNode.NODE_NAME, input.SN);
                         return action;
                     }
                     //姝e父宸ュ簭杩囩珯
@@ -310,10 +308,9 @@
                         if (nextNodes.Any(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y" && s.CAN_SKIP != "Y")))
                         {
                             action.IsSuccessed = false;
-                            action.Data.CurWO = WO.ORDER_NO;
-                            action.Data.CurBatch = Batch.BATCH_NO;
+                            action.Data.SetValue(this, null);
                             var nextList = nextNodes.Where(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y" && s.CAN_SKIP != "Y"));
-                            action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", wipSN.SN, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
+                            action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", input.SN, nextNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
                             return action;
                         }
                         //濡傛灉褰撳墠宸ュ簭娌℃湁蹇呴』鎵ц鐨勫悗缁伐搴忥紝鍒欏湪鍓嶇疆宸ュ簭鏌ユ壘杩樻湁娌℃湁鍚庣画宸ュ簭娌″畬鎴愮殑宸ュ簭锛屾湁鍒欏皾璇曟墽琛�
@@ -340,10 +337,9 @@
                             else
                             {
                                 action.IsSuccessed = false;
-                                action.Data.CurWO = WO.ORDER_NO;
-                                action.Data.CurBatch = Batch.BATCH_NO;
+                                action.Data.SetValue(this, null);
                                 var nextList = nextNodes.Where(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y"));
-                                action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", wipSN.SN, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
+                                action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", input.SN, nextNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
                                 return action;
                             }
                         }

--
Gitblit v1.9.3