¶Ô±ÈÐÂÎļþ |
| | |
| | | using Rhea.Common; |
| | | using Tiger.IBusiness; |
| | | using SqlSugar; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Linq.Expressions; |
| | | using System.Text; |
| | | using System.Threading; |
| | | using System.Threading.Tasks; |
| | | using Tiger.Model; |
| | | using Tiger.Model.Entitys.MES.Position; |
| | | using Tiger.Business.MES.WorkAction; |
| | | |
| | | namespace Tiger.Business.MES.Transaction |
| | | { |
| | | /// <summary> |
| | | /// å
è£
å·¥åºäºå¡ |
| | | /// </summary> |
| | | public class YadaPacking : Position, IYadaPacking |
| | | { |
| | | public new IYadaPacking Init(string id, string apiHost, string userCode, string postCode) |
| | | { |
| | | base.Init(id, apiHost, userCode, postCode); |
| | | Logger.Console.Info($"User[{userCode}] start a {this.GetType().Name}[{postCode}] Transaction[ID: {TransID}]"); |
| | | return this; |
| | | } |
| | | |
| | | #region Propertys & Variables |
| | | /// <summary> |
| | | /// å·¥åºå½åæ§è¡çæä»¤ä»£ç ï¼å
æ¬ï¼<br/> |
| | | /// {null or ""}ï¼å·¥åºç©ºé²ï¼æä»¤ä¸ºç©ºåè®¤ä¸ºå·¥åºæ²¡ææ§è¡ä»»ä½æä»¤<br/> |
| | | /// NodeSubmitï¼äº§åè¿ç«ï¼æ£å¸¸äº§åè¿ç«é»è¾<br/> |
| | | /// PkgSubmitï¼æå¨ç»æå
è£
ï¼æå¨ä¿åæåçå
è£
æ°æ®<br/> |
| | | /// </summary> |
| | | public string NodeCmd { get; set; } |
| | | public PackingAction TempPkgAction { get; set; } |
| | | public bool IsPrintCustomerLabel { get; set; } |
| | | #endregion Propertys & Variables |
| | | |
| | | #region Functions |
| | | /// <summary> |
| | | /// å
è£
å·¥åºï¼æäº¤æä½æ°æ® |
| | | /// </summary> |
| | | /// <param name="input"></param> |
| | | /// <returns></returns> |
| | | public async Task<ApiAction<SubmitOutput>> Submit(SubmitInput input) |
| | | { |
| | | var action = new ApiAction<SubmitOutput>(new SubmitOutput()); |
| | | try |
| | | { |
| | | if (input.Qty.ToInt32() <= 0) |
| | | { |
| | | action.Data.ShortMsg = new("请è¾å
¥å
è£
æ°é", ShortMessage.Types.Error); |
| | | action.Data.OperInfo = new(); |
| | | action.Data.Data = "QtyError"; |
| | | action.IsSuccessed = false; |
| | | action.LocaleMsg = new($"å
è£
æ°é[{input.Qty}]䏿£ç¡®ï¼è¯·éæ°è¾å
¥æ°éåç»§ç»å
è£
æä½"); |
| | | //action.LocaleMsg = new("MES.Transaction.PackingNode.Submit.QtyError", input.Qty); |
| | | return action; |
| | | } |
| | | if (input.Options.ContainsKey("IsPrintCustomerLabel")) |
| | | { |
| | | IsPrintCustomerLabel = input.Options["IsPrintCustomerLabel"].ToBoolean(); |
| | | } |
| | | //PkgSubmitï¼æå¨ç»æå
è£
ï¼æå¨ä¿åæåçå
è£
æ°æ® |
| | | if (NodeCmd == "PkgSubmit") |
| | | { |
| | | action = TempPkgAction.Submit(input); |
| | | //妿è¡ä¸ºè¢«æ è®°æå·²å®æï¼åéç½®å·¥åº |
| | | if (TempPkgAction.IsFinished) |
| | | { |
| | | action.Data.OperInfo = CurOperInfo(input.Locale); |
| | | ResetNode(); |
| | | } |
| | | } |
| | | //NodeSubmitï¼äº§åè¿ç«ï¼æ£å¸¸äº§åè¿ç«é»è¾ |
| | | else |
| | | { |
| | | //å·¥æ¥å表为空æè
å·¥åºèç¹å·¥æ¥ææªå®ææ¶ï¼ä¼å
宿工åºèç¹å·¥æ¥ |
| | | if (Steps.IsNullOrEmpty() || !IsFinishNodeSteps) |
| | | { |
| | | //å
夿å½åå·¥åä¸ä¸ºç©ºä¸å½åå²ä½å¨å½å工忝䏿¯é¦ç«ï¼å¦ææ¯åä¸å
è®¸åæ´å½åå·¥åï¼å°è¯ææ¡ç ç»å®å°å½åå·¥å |
| | | if (!CurBatch.IsNullOrEmpty() && CurBatch.IsFirstNode(PostCode)) |
| | | { |
| | | //æ´æ°CurBatch |
| | | CurBatch?.Update(); |
| | | //æäº¤æ°æ® |
| | | action = NodeSubmit(action, input); |
| | | //æ´æ°å·¥åºä¿¡æ¯ |
| | | if (!action.IsSuccessed) |
| | | { |
| | | var info = WoContext.GetSnOperInfo(input.SN).Data; |
| | | info.InputQty = CurOperInfo(input.Locale).InputQty; |
| | | action.Data.OperInfo = info; |
| | | } |
| | | else if (Steps.Any() && !IsFinishAllSteps) |
| | | { |
| | | action.Data.OperInfo = SetOperNodeInfo(CurOperInfo(input.Locale)); |
| | | } |
| | | } |
| | | //å½åå²ä½å¨å½åå·¥å䏿¯é¦ç«ï¼åæ¥æ¾æ¡ç å·²ç»å®çå·¥åå½ä½å½åå·¥å |
| | | else |
| | | { |
| | | var wosns = Biz.Db.Queryable<BIZ_MES_WO_BATCH, BIZ_MES_WO_SN>((q, s) => new JoinQueryInfos(JoinType.Inner, q.ORDER_NO == s.WORK_ORDER && q.BATCH_NO == s.BATCH_NO)) |
| | | .ByAuth(input.AuthOption)//.Where((q, s) => s.STATUS < BIZ_MES_WO_SN.STATUSs.Finished.GetValue()) |
| | | .Where((q, s) => s.SN == input.SN || s.FLOW_SN == input.SN || s.TRAY_SN == input.SN).Select((q, s) => new { Batch = q, SN = s }).ToList(); |
| | | |
| | | //æ¥æ¾å°æ¡ç å·²ç»å®çå·¥å |
| | | if (wosns.Any(q => q.SN.STATUS < BIZ_MES_WO_SN.STATUSs.Finished.GetValue())) |
| | | { |
| | | var curSNs = wosns.Where(q => q.SN.STATUS < BIZ_MES_WO_SN.STATUSs.Finished.GetValue()); |
| | | if (curSNs.Count() > 1 && curSNs.Any(q => q.SN.TRAY_SN != q.SN.OUTER_SN)) |
| | | { |
| | | action.Data.ShortMsg = new("è¯·æ«æäº§å", ShortMessage.Types.Error); |
| | | action.Data.OperInfo = new(); |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = new($"æ¡ç [{0}]æ¯è½½å
·æ¡ç ï¼è¯·æ«æè½½å
·ä¸çäº§åæ¡ç ç»§ç»å
è£
æä½"); |
| | | action.LocaleMsg = new("MES.Transaction.PackingNode.Submit.OnlyMinPackage", input.SN); |
| | | return action; |
| | | } |
| | | var curPkg = Context.ContainsKey("CurPackage") ? Context["CurPackage"] as WipPkg : null; |
| | | if (!curPkg.IsNullOrEmpty() && !curPkg.IsFinished && curPkg.WorkBatch != curSNs.First().Batch.BATCH_NO) |
| | | { |
| | | action.Data.ShortMsg = new("å·¥åæ¹æ¬¡é误", ShortMessage.Types.Error); |
| | | action.Data.OperInfo = new(); |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = new($"æ£å¨å
è£
å·¥åæ¹æ¬¡[{0}]ç产åï¼è¯·å
宿å½åå
è£
ååæ«æå
¶ä»æ¹æ¬¡[{1}]ç产å[{2}]"); |
| | | action.LocaleMsg = new("MES.Transaction.PackingNode.Submit.BatchError", curPkg.WorkBatch, curSNs.First().Batch.BATCH_NO, input.SN); |
| | | return action; |
| | | } |
| | | if (curSNs.First().Batch.ACT_LINE != CurLine.LINE_CODE) |
| | | { |
| | | action.Data.ShortMsg = new("产线æäº§é误", ShortMessage.Types.Error); |
| | | action.Data.OperInfo = new(); |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = new($"æ¡ç [{0}]å·²å¨äº§çº¿[{1}]æå
¥ç产ï¼è¯·å¨æ£ç¡®å²ä½æ«æ"); |
| | | action.LocaleMsg = new("MES.Transaction.PackingNode.Submit.NotCorrectLine", input.SN, curSNs.First().Batch.ACT_LINE); |
| | | } |
| | | else |
| | | { |
| | | if (CurBatch?.Batch?.ORDER_NO != curSNs.First().Batch.ORDER_NO) |
| | | { |
| | | //æ¡ç å·²ç»å®çå·¥åä¸çäºå½åå·¥åå鿰鿩工å |
| | | var result = await SelectOrder(new() { AuthOption = input.AuthOption, OrderNo = curSNs.First().Batch.ORDER_NO }, curSNs.First().Batch.BATCH_NO); |
| | | if (!result.IsSuccessed) |
| | | { |
| | | action.Data.ShortMsg = new("å·¥åå¼å¸¸", ShortMessage.Types.Error); |
| | | action.Data.OperInfo = new(); |
| | | action.IsSuccessed = result.IsSuccessed; |
| | | action.LocaleMsg = result.LocaleMsg; |
| | | return action; |
| | | } |
| | | } |
| | | //æ´æ°CurBatch |
| | | CurBatch?.Update(); |
| | | //æ¡ç è¿ç« |
| | | action = NodeSubmit(action, input); |
| | | if (!action.IsSuccessed && !CurWipSNs.Any()) |
| | | { |
| | | var info = WoContext.GetSnOperInfo(input.SN).Data; |
| | | info.InputQty = CurOperInfo(input.Locale).InputQty; |
| | | action.Data.OperInfo = info; |
| | | } |
| | | else if (Steps.Any() && !IsFinishAllSteps) |
| | | { |
| | | action.Data.OperInfo = SetOperNodeInfo(CurOperInfo(input.Locale)); |
| | | } |
| | | } |
| | | } |
| | | //æ¥æ¾ä¸å°æ¡ç å·²ç»å®çå·¥å |
| | | else |
| | | { |
| | | var lastSn = wosns.OrderByDescending(q => q.SN.UPDATE_TIME).FirstOrDefault(); |
| | | if (!lastSn.IsNullOrEmpty()) |
| | | { |
| | | action.Data.ShortMsg = new($"产å{lastSn.SN.STATUS.GetEnumDesc<BIZ_MES_WO_SN.STATUSs>()}", ShortMessage.Types.Error); |
| | | action.Data.OperInfo = new(); |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = new($"è¿ç«æ«æéè¯¯ï¼æ¡ç [{0}]{1}", input.SN); |
| | | action.LocaleMsg = new("MES.Transaction.PackingNode.Submit.SnStatusError", input.SN, lastSn.SN.STATUS.GetEnumDesc<BIZ_MES_WO_SN.STATUSs>()); |
| | | } |
| | | else |
| | | { |
| | | //没æå½åå·¥åï¼åå
鿩工åååæ«ææ¡ç |
| | | if (CurBatch.IsNullOrEmpty()) |
| | | { |
| | | action.Data.ShortMsg = new("æªéæ©å·¥å", ShortMessage.Types.Error); |
| | | action.Data.OperInfo = new(); |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = new($"æªéæ©å·¥åï¼è¯·å
éæ©è¦ç产çå·¥å"); |
| | | action.LocaleMsg = new("MES.Transaction.PackingNode.Submit.NotSelectOrderException"); |
| | | } |
| | | //æå½åå·¥åä¸ä¸æ¯æå
¥ï¼åæç¤ºæ¡ç æªæå
¥ç产ï¼è¯·å
å»é¦ç«æ«æ |
| | | else |
| | | { |
| | | |
| | | action.Data.ShortMsg = new("æªæå
¥ç产", ShortMessage.Types.Error); |
| | | action.Data.OperInfo = new(); |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = new($"æ¡ç [{input.SN}]å°æªæå
¥ç产ï¼è¯·å
å»é¦ç«æ«æ", input.SN); |
| | | action.LocaleMsg = new("MES.Transaction.PackingNode.Submit.NotInputException", input.SN); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | //宿工åºèç¹å·¥æ¥åï¼åå¼å§æ§è¡å½åå·¥åºçè¡ä¸ºå·¥æ¥ |
| | | else if (IsFinishNodeSteps && !IsFinishAllSteps) |
| | | { |
| | | //æ´æ°CurBatch |
| | | CurBatch?.Update(); |
| | | |
| | | var submitStep = Steps.Where(q => q.ID == input.CurStepID && !q.IsFinished).FirstOrDefault(); |
| | | //妿客æ·ç«¯è¿åçå½åå·¥æ¥IDæ¾ä¸å°æªå®æçè¡ä¸ºå·¥æ¥ï¼åç´æ¥å¼å§ä¸ä¸ä¸ªè¡ä¸ºå·¥æ¥ |
| | | if (submitStep.IsNullOrEmpty()) |
| | | { |
| | | action = BeginNextActionStep(input); |
| | | } |
| | | else |
| | | { |
| | | action = submitStep.Submit(input); |
| | | //妿å½åå·¥æ¥å·²å®æï¼å¼å§æ§è¡ä¸ä¸å·¥æ¥ |
| | | if (action.IsSuccessed && submitStep.IsFinished) |
| | | { |
| | | action = BeginNextActionStep(input); |
| | | } |
| | | //妿å½åå·¥æ¥æªå®æ |
| | | else |
| | | { |
| | | //è¡ä¸ºæ§è¡åºéï¼å·¥æ¥è¢«éç½® |
| | | if (Steps.IsNullOrEmpty()) |
| | | { |
| | | action.LocaleMsg = new(Biz.T(action.LocaleMsg, input.Locale) + Biz.T(Biz.L("MES.Transaction.Position.RescanSN"), input.Locale)); |
| | | } |
| | | else |
| | | { |
| | | action.Data.SetValue(CurBatch, CurStep, CurStep?.ID, IsFinishAllSteps); |
| | | } |
| | | } |
| | | } |
| | | //妿ææå·¥æ¥é½å®æ |
| | | if (IsFinishAllSteps) |
| | | { |
| | | action = DoIfFinishAllSteps(action, input.Locale); |
| | | } |
| | | else |
| | | { |
| | | action.Data.OperInfo = CurOperInfo(input.Locale); |
| | | } |
| | | } |
| | | //没æå¯æ§è¡çå·¥æ¥ |
| | | else |
| | | { |
| | | action.Data.ShortMsg = new("éç½®æ«æ", ShortMessage.Types.Error); |
| | | action.Data.OperInfo = CurOperInfo(input.Locale); |
| | | ResetNode(); |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = new($"å²ä½[{CurPosition.POST_CODE}]å·¥æ¥æ§è¡å¼å¸¸ï¼è¯·éæ°æ«æäº§åæ¡ç ", CurPosition.POST_CODE); |
| | | action.LocaleMsg = new("MES.Transaction.PackingNode.Submit.WorkStepException", CurPosition.POST_CODE); |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | action.Data.ShortMsg = new("å·¥åºå¼å¸¸", ShortMessage.Types.Error); |
| | | action.Data.OperInfo = CurOperInfo(input.Locale); |
| | | //action.CatchExceptionWithLog(ex, $"å
è£
å·¥åºï¼æäº¤æä½æ°æ®å¼å¸¸"); |
| | | action.CatchExceptionWithLog(ex, Biz.L("MES.Transaction.PackingNode.SubmitException")); |
| | | } |
| | | return action; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å·¥åºèç¹å·¥æ¥æäº¤æ°æ® |
| | | /// </summary> |
| | | /// <param name="action"></param> |
| | | /// <param name="input"></param> |
| | | /// <returns></returns> |
| | | public ApiAction<SubmitOutput> NodeSubmit(ApiAction<SubmitOutput> action, SubmitInput input) |
| | | { |
| | | var curNode = CurBatch.GetNode(PostCode); |
| | | try |
| | | { |
| | | //å·¥åºèç¹é»è¾å¢å å¦ææ ¹åºå½åå²ä½æ¾ä¸å°å¯¹åºå·¥åºçæ¶åè¦æ¥é |
| | | if (curNode.IsNullOrEmpty()) |
| | | { |
| | | action.Data.ShortMsg = new("æªç¥å·¥åº", ShortMessage.Types.Error); |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = new($"å²ä½[{0}]å¨å·¥å[{1}]å·¥èºè·¯çº¿ä¸æ¾ä¸å°å¯¹åºçå·¥åºï¼è¯·æ£æ¥å·¥åå·¥èºè·¯çº¿ä¸å·¥åºä¸å²ä½çç»å®å
³ç³»æ¯å¦æ£ç¡®"); |
| | | action.LocaleMsg = new("MES.Transaction.PackingNode.NodeSubmit.OperateNodeError", PostCode, CurBatch.WO.ORDER_NO); |
| | | return action; |
| | | } |
| | | var curNodeSetting = CurBatch.GetNodeSetting(curNode); |
| | | |
| | | //å½å·¥æ¥å表为空ï¼åæ§è¡å½åå·¥åºçå¿
è¦é»è¾å½ä½ç¬¬ä¸ä¸ªå·¥åºèç¹ï¼å®æåæéæ±å建åç»çå·¥æ¥å表 |
| | | if (Steps.IsNullOrEmpty()) |
| | | { |
| | | BeginAt = DateTime.Now; |
| | | //夿工å宿¶ç¶æå¤ææ¯å¦å¯ä»¥ç产 |
| | | var woStatus = CurBatch.CheckCanProduce(curNode, curNodeSetting); |
| | | if (!woStatus.IsSuccessed) |
| | | { |
| | | woStatus.Data.ShortMsg = new("å·¥åå¼å¸¸", ShortMessage.Types.Error); |
| | | return woStatus; |
| | | } |
| | | |
| | | var wipSNs = Biz.Db.Queryable<MES_WIP_DATA>().IncludesAllFirstLayer().Where(q => q.SN == input.SN || q.FLOW_SN == input.SN || q.TRAY_SN == input.SN).ToList(); |
| | | if (wipSNs.IsNullOrEmpty()) |
| | | { |
| | | var wipSN = new MES_WIP_DATA() |
| | | { |
| | | SN = input.SN, |
| | | FLOW_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, |
| | | FTY_CODE = CurFactory.FTY_CODE, |
| | | WS_CODE = CurWorkshop.WS_CODE, |
| | | LINE_CODE = CurLine.LINE_CODE, |
| | | POST_CODE = CurPosition.POST_CODE, |
| | | 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, |
| | | }; |
| | | wipSNs.Add(wipSN); |
| | | } |
| | | |
| | | //妿æ¡ç 䏿¯å½åå·¥åæè
产线ç忥é |
| | | if (wipSNs.Any(q => q.WORK_ORDER != CurBatch.WO.ORDER_NO || q.LINE_CODE != CurLine.LINE_CODE)) |
| | | { |
| | | if (wipSNs.First().LINE_CODE == CurLine.LINE_CODE) |
| | | { |
| | | action.Data.ShortMsg = new("å·¥åé误", ShortMessage.Types.Error); |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = new($"产å[{CurSN}]ä¸å±äºå½åå·¥åï¼è¯·åæ¢å°å·¥å[{wipSNs.First().WORK_ORDER}]ååæ«æ"); |
| | | action.LocaleMsg = new("MES.Transaction.PackingNode.NodeSubmit.WoError", input.SN, wipSNs.First().WORK_ORDER); |
| | | return action; |
| | | } |
| | | else |
| | | { |
| | | action.Data.ShortMsg = new("产线é误", ShortMessage.Types.Error); |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = new($"产å[{CurSN}]å·²å¨äº§çº¿[{wipSNs.First().LINE_CODE}]æäº§ï¼è¯·å°äº§çº¿[{wipSNs.First().LINE_CODE}]æ«æ"); |
| | | action.LocaleMsg = new("MES.Transaction.PackingNode.NodeSubmit.LineError", input.SN, wipSNs.First().LINE_CODE); |
| | | return action; |
| | | } |
| | | } |
| | | |
| | | //éæ³è¿ç«é²åï¼è¿å
¥å·¥åºæ¶è¦å¢å 夿æ¡ç æ¯å¦ææµç¨è¿ç« |
| | | var canGotoNext = CurBatch.CanGotoNext(input, wipSNs.First(), curNode); |
| | | if (!canGotoNext.IsSuccessed) |
| | | { |
| | | woStatus.Data.ShortMsg = new("è¿ç«é误", ShortMessage.Types.Error); |
| | | return canGotoNext; |
| | | } |
| | | |
| | | //设置å½åæä»¤ä¸ºæ£å¸¸äº§åè¿ç« |
| | | NodeCmd = "NodeSubmit"; |
| | | |
| | | //ç»å®æ¡ç å°å·¥å |
| | | foreach (var wipSN in wipSNs) |
| | | { |
| | | if (!CurBatch.WoSNs.Any(q => q.WIP_ID == wipSN.ID)) |
| | | { |
| | | CurBatch.WoSNs.Add(new() |
| | | { |
| | | WORK_ORDER = CurBatch.Batch.ORDER_NO, |
| | | WIP_ID = wipSN.ID, |
| | | SN = wipSN.SN, |
| | | FLOW_SN = wipSN.SN, |
| | | TRAY_SN = wipSN.TRAY_SN, |
| | | STATUS = BIZ_MES_WO_SN.STATUSs.NotInput.GetValue(), |
| | | }); |
| | | } |
| | | } |
| | | |
| | | //æ´æ°å·¥åæ¡ç æç»ä¿¡æ¯ |
| | | var woSNs = CurBatch.WoSNs.Where(q => wipSNs.Any(w => q.WIP_ID == w.ID)).ToList(); |
| | | foreach (var woSN in woSNs) |
| | | { |
| | | woSN.AUTH_ORG = CurBatch.WO.AUTH_ORG; |
| | | woSN.AUTH_PROD = CurLine.LINE_CODE; |
| | | woSN.BATCH_NO = CurBatch.Batch.BATCH_NO; |
| | | } |
| | | |
| | | //æ¡ç è¿ç« |
| | | foreach (var wipSN in wipSNs) |
| | | { |
| | | wipSN.AUTH_ORG = CurBatch.WO.AUTH_ORG; |
| | | wipSN.AUTH_PROD = CurLine.LINE_CODE; |
| | | wipSN.STATUS = MES_WIP_DATA.STATUSs.OK.GetValue();//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; |
| | | var curShiftPeriod = GetShiftPeriodForNow(); |
| | | if (!curShiftPeriod.IsNullOrEmpty()) |
| | | { |
| | | wipSN.SFTS_CODE = curShiftPeriod.ShiftSys.SFTS_CODE; |
| | | wipSN.SFT_CODE = curShiftPeriod.Shift.SFT_CODE; |
| | | wipSN.PRD_CODE = curShiftPeriod.Period.PRD_CODE; |
| | | } |
| | | //å¦ææ¯æå
¥ç« |
| | | if (curNodeSetting.IS_INPUT == "Y") |
| | | { |
| | | var woSN = woSNs.First(q => q.WIP_ID == wipSN.ID); |
| | | woSN.STATUS = BIZ_MES_WO_SN.STATUSs.Inputed.GetValue(); |
| | | wipSN.STATUS = MES_WIP_DATA.STATUSs.Input.GetValue(); |
| | | wipSN.INLINE_DATE = DateTime.Now; |
| | | } |
| | | //妿æ¯äº§åºç« |
| | | if (curNodeSetting.IS_OUTPUT == "Y") |
| | | { |
| | | var woSN = woSNs.First(q => q.WIP_ID == wipSN.ID); |
| | | 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; |
| | | var dft = CurBatch.Defects.FirstOrDefault(q => q.DFT_CODE == wipSN.DFT_CODE); |
| | | var defect = new MES_WIP_DFT() |
| | | { |
| | | AUTH_ORG = wipSN.AUTH_ORG, |
| | | AUTH_PROD = wipSN.LINE_CODE, |
| | | WIP_ID = wipSN.ID, |
| | | SN = wipSN.SN, |
| | | STATUS = MES_WIP_DFT.STATUSs.WaitHandle.GetValue(), |
| | | ITEM_CODE = wipSN.ITEM_CODE, |
| | | WORK_ORDER = wipSN.WORK_ORDER, |
| | | BATCH_NO = wipSN.BATCH_NO, |
| | | ROT_CODE = wipSN.ROT_CODE, |
| | | NODE_ID = wipSN.NODE_ID, |
| | | NODE_NAME = wipSN.NODE_NAME, |
| | | FTY_CODE = wipSN.FTY_CODE, |
| | | WS_CODE = wipSN.WS_CODE, |
| | | LINE_CODE = wipSN.LINE_CODE, |
| | | POST_CODE = wipSN.POST_CODE, |
| | | OPER_CODE = wipSN.OPER_CODE, |
| | | SEGMENT = wipSN.SEGMENT, |
| | | DFT_CODE = dft.DFT_CODE, |
| | | DFT_NAME = dft.DFT_NAME, |
| | | DFT_LEVEL = dft.DFT_LEVEL, |
| | | FLOW_SN = wipSN.FLOW_SN, |
| | | TRAY_SN = wipSN.TRAY_SN, |
| | | INNER_SN = wipSN.INNER_SN, |
| | | CARTON_SN = wipSN.CARTON_SN, |
| | | PALLET_SN = wipSN.PALLET_SN, |
| | | INV_FLAG = wipSN.INV_FLAG, |
| | | OPERATION_TIME = DateTime.Now, |
| | | SFTS_CODE = wipSN.SFTS_CODE, |
| | | SFT_CODE = wipSN.SFT_CODE, |
| | | PRD_CODE = wipSN.PRD_CODE, |
| | | OBA_BATCH = wipSN.OBA_BATCH, |
| | | LOCK_BATCH = wipSN.LOCK_BATCH, |
| | | }; |
| | | CurDefects.Add(defect); |
| | | } |
| | | } |
| | | |
| | | //å·¥åå¼å·¥ |
| | | CurBatch.StartWorking(UserCode); |
| | | |
| | | //æå½åæ¡ç å¢å å°å½åæ¡ç å表 |
| | | CurWipSNs = wipSNs; |
| | | CurWipSNHiss.Clear(); |
| | | foreach (var wipSN in wipSNs) |
| | | { |
| | | var his = new MES_WIP_HIS(wipSN, $"å·¥å[{wipSN.WORK_ORDER}]æ¡ç [{wipSN.SN}]å¨å²ä½[{wipSN.POST_CODE}]è¿ç«å·¥åº[{wipSN.NODE_NAME}]æåï¼TransIdï¼{TransID}ï¼"); |
| | | wipSN.History.Add(his); |
| | | CurWipSNHiss.Add(his); |
| | | } |
| | | |
| | | //å建åéå
é对象ç¨äºä¼ å
¥DBSubmitActionä¸ä¿åå½åéè¦æåçæ°æ®å¼ |
| | | var _woSns = woSNs.Clone(); |
| | | var _wipSns = wipSNs.Clone(); |
| | | var _wipHiss = CurWipSNHiss.Clone(); |
| | | var _defect = CurDefects.Clone(); |
| | | var _curNodeSetting = curNodeSetting.Clone(); |
| | | var _Batch = CurBatch.Batch.Clone(); |
| | | |
| | | //åå§åå·¥æ¥å表 |
| | | Steps.Clear(); |
| | | var curStep = new WorkStep(IWorkStep.NodeTypes.Node, this) |
| | | { |
| | | Name = "æ«æäº§å", |
| | | Sequence = Steps.Count + 1, |
| | | Node = curNode, |
| | | OperSetting = CurBatch.NodeSets.FirstOrDefault(q => q.NODE_ID == curNode.ID), |
| | | DBSubmitAction = () => |
| | | { |
| | | //使ç¨ç»ä¸çäºå¡DB对象 |
| | | var db = GetCommitDB(); |
| | | //æ°æ®ä¿åé»è¾ |
| | | db.Storageable(_woSns, UserCode).ExecuteCommand(); |
| | | db.Storageable(_wipSns, UserCode).ExecuteCommand(); |
| | | db.Storageable(_wipHiss, UserCode).ExecuteCommand(); |
| | | //妿æä¸è¯åä¿å |
| | | if (_defect.Any()) |
| | | { |
| | | db.Storageable(_defect, UserCode).ExecuteCommand(); |
| | | } |
| | | //å¦ææ¯æå
¥ç« |
| | | if (_curNodeSetting.IS_INPUT == "Y") |
| | | { |
| | | db.Updateable<BIZ_MES_WO>().SetColumns(q => q.INPUT_QTY == q.INPUT_QTY + _woSns.Count).Where(q => q.ORDER_NO == _Batch.ORDER_NO).ExecuteCommand(); |
| | | db.Updateable<BIZ_MES_WO_BATCH>().SetColumns(q => q.INPUT_QTY == q.INPUT_QTY + _woSns.Count).Where(q => q.BATCH_NO == _Batch.BATCH_NO).ExecuteCommand(); |
| | | } |
| | | //妿æ¯äº§åºç« |
| | | if (_curNodeSetting.IS_OUTPUT == "Y") |
| | | { |
| | | db.Updateable<BIZ_MES_WO>().SetColumns(q => q.OUTPUT_QTY == q.OUTPUT_QTY + _woSns.Count).Where(q => q.ORDER_NO == _Batch.ORDER_NO).ExecuteCommand(); |
| | | db.Updateable<BIZ_MES_WO_BATCH>().SetColumns(q => q.OUTPUT_QTY == q.OUTPUT_QTY + _woSns.Count).Where(q => q.BATCH_NO == _Batch.BATCH_NO).ExecuteCommand(); |
| | | } |
| | | } |
| | | }; |
| | | Steps.Add(curStep); |
| | | |
| | | //æéè¦ç¨æ·æäº¤ä¿¡æ¯åæ·»å å·¥åºèç¹çå
¶ä»å·¥æ¥ |
| | | |
| | | //æåæ·»å å½åå·¥åºçè¡ä¸ºå·¥æ¥ |
| | | try |
| | | { |
| | | GenerateSteps(curStep); |
| | | } |
| | | catch (System.Exception ex) |
| | | { |
| | | ResetNode(); |
| | | //action.CatchExceptionWithLog(ex, $"{curNode.NODE_NAME}ï¼å·¥åºè¡ä¸ºå·¥æ¥çæå¼å¸¸ï¼è¯·æ£æ¥å·¥åºè¡ä¸ºè®¾ç½®"); |
| | | action.CatchExceptionWithLog(ex, Biz.L("MES.Transaction.PackingNode.NodeSubmit.GenerateStepsException", curNode.NODE_NAME)); |
| | | } |
| | | |
| | | //å®æç¬¬ä¸ä¸ªå·¥åºèç¹å·¥æ¥ |
| | | curStep.IsFinished = true; |
| | | curStep.Status = StepStatus.Finished; |
| | | CurStep = curStep; |
| | | } |
| | | else if (!IsFinishNodeSteps) |
| | | { |
| | | var curStep = Steps.Where(q => q.NodeType == IWorkStep.NodeTypes.Node && !q.IsFinished).OrderBy(q => q.Sequence).First(); |
| | | |
| | | //æ ¹æ®å·¥åºèç¹å·¥æ¥çåºå·å¤çç¸åºå·¥æ¥çå¤çé»è¾ |
| | | switch (curStep.Sequence) |
| | | { |
| | | case 2: |
| | | { |
| | | //第äºå·¥æ¥çå¤çé»è¾ |
| | | |
| | | |
| | | //宿å½åå·¥åºèç¹å·¥æ¥ |
| | | curStep.IsFinished = true; |
| | | curStep.Status = StepStatus.Finished; |
| | | CurStep = curStep; |
| | | } |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | |
| | | //æªå®æææå·¥æ¥ |
| | | if (!IsFinishAllSteps) |
| | | { |
| | | //æªå®æææå·¥åºèç¹å·¥æ¥ |
| | | if (!IsFinishNodeSteps) |
| | | { |
| | | var next = Steps.Where(q => q.NodeType == IWorkStep.NodeTypes.Node && !q.IsFinished).OrderBy(q => q.Sequence).First(); |
| | | //设置åç»å¯æ§è¡çå·¥æ¥å表 |
| | | NextSteps.Clear(); |
| | | NextSteps.Add(next); |
| | | //æ ¹æ®åç»å·¥æ¥è¿åApiAction |
| | | action.Data.SetValue(CurBatch, CurStep, next.ID, IsFinishAllSteps); |
| | | |
| | | //æ ¹æ®å·¥åºèç¹å·¥æ¥çåºå·è¿åç¸åºçæä½æç¤º |
| | | switch (next.Sequence) |
| | | { |
| | | case 2: |
| | | //action.LocaleMsg = new($"请æ§è¡ç¬¬äºæ¥"); |
| | | action.LocaleMsg = new("MES.Transaction.PackingNode.ç¬¬äºæ¥æä½æç¤º"); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | //已宿ææå·¥åºèç¹å·¥æ¥ï¼å¼å§æ§è¡è¡ä¸ºå·¥æ¥ |
| | | else |
| | | { |
| | | action = BeginNextActionStep(input); |
| | | } |
| | | } |
| | | //已宿ææå·¥æ¥ |
| | | if (IsFinishAllSteps) |
| | | { |
| | | action.Data.SetValue(CurBatch, CurStep, "", IsFinishAllSteps); |
| | | action = DoIfFinishAllSteps(action, input.Locale); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | action.Data.ShortMsg = new("å·¥æ¥å¼å¸¸", ShortMessage.Types.Error); |
| | | ResetNode(); |
| | | //action.CatchExceptionWithLog(ex, $"{curNode.NODE_NAME}ï¼å·¥åºèç¹å·¥æ¥æäº¤æ°æ®å¼å¸¸ï¼è¯·æ£æ¥å·¥åºèç¹è®¾ç½®"); |
| | | action.CatchExceptionWithLog(ex, Biz.L("MES.Transaction.PackingNode.NodeSubmitException", curNode.NODE_NAME)); |
| | | } |
| | | return action; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 宿ææå·¥æ¥åæ§è¡ |
| | | /// </summary> |
| | | /// <param name="action"></param> |
| | | /// <returns></returns> |
| | | public ApiAction<SubmitOutput> DoIfFinishAllSteps(ApiAction<SubmitOutput> action, string locale) |
| | | { |
| | | var curPkg = Context.ContainsKey("CurPackage") ? Context["CurPackage"] as WipPkg : null; |
| | | var operInfo = SetOperNodeInfo(CurOperInfo(locale)); |
| | | Action endAction = null; |
| | | |
| | | //妿å½åæ¡ç å·²ç»èµ°å°æµç¨ç»ç¹åè®°å½æ¡ç å®å·¥ |
| | | if (operInfo.IsReachedEndNode) |
| | | { |
| | | //æ è®°å½åå
è£
ä¿¡æ¯ä¸ºç»ç¹ç« |
| | | if (!curPkg.IsNullOrEmpty()) |
| | | { |
| | | curPkg.IsReachedEndNode = true; |
| | | } |
| | | //æ´æ°å·¥åæ¡ç æç»ä¿¡æ¯ |
| | | var woSNs = CurBatch.WoSNs.Where(q => CurWipSNs.Any(w => q.WIP_ID == w.ID)).ToList(); |
| | | foreach (var woSN in woSNs) |
| | | { |
| | | woSN.STATUS = BIZ_MES_WO_SN.STATUSs.Finished.GetValue(); |
| | | } |
| | | var curNode = CurBatch.Nodes.First(q => q.OPER_CODE == "EndNode"); |
| | | //æ¡ç å®å·¥ |
| | | foreach (var wipSN in CurWipSNs) |
| | | { |
| | | wipSN.STATUS = MES_WIP_DATA.STATUSs.Finished.GetValue(); |
| | | wipSN.NODE_ID = curNode.ID; |
| | | wipSN.NODE_NAME = curNode.NODE_NAME; |
| | | wipSN.OPER_CODE = curNode.OPER_CODE; |
| | | wipSN.SEGMENT = curNode.SEGMENT; |
| | | wipSN.OPERATION_TIME = DateTime.Now; |
| | | } |
| | | |
| | | var wipHiss = new List<MES_WIP_HIS>(); |
| | | foreach (var wipSN in CurWipSNs) |
| | | { |
| | | var his = new MES_WIP_HIS(wipSN, $"å·¥å[{wipSN.WORK_ORDER}]æ¡ç [{wipSN.SN}]å¨å²ä½[{wipSN.POST_CODE}]è¿ç«å·¥åº[{wipSN.NODE_NAME}]æå"); |
| | | wipSN.History.Add(his); |
| | | wipHiss.Add(his); |
| | | } |
| | | |
| | | //å建åéå
é对象ç¨äºä¼ å
¥DBSubmitActionä¸ä¿åå½åéè¦æåçæ°æ®å¼ |
| | | var _woSns = woSNs.Clone(); |
| | | var _wipSns = CurWipSNs.Clone(); |
| | | var _wipHiss = wipHiss.Clone(); |
| | | var _pkgList = curPkg?.IsFinished == true ? GetPackageList(curPkg.Item) : new(); |
| | | //ä¿åæ°æ® |
| | | endAction = () => |
| | | { |
| | | //使ç¨ç»ä¸çäºå¡DB对象 |
| | | var db = GetCommitDB(); |
| | | //æ°æ®ä¿åé»è¾ |
| | | db.Updateable(_woSns, UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); |
| | | db.Updateable(_wipSns, UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.NODE_ID, q.NODE_NAME, q.OPER_CODE, q.SEGMENT, q.OPERATION_TIME }).ExecuteCommand(); |
| | | db.Storageable(_wipHiss, UserCode).ExecuteCommand(); |
| | | if (_pkgList.Any()) |
| | | { |
| | | var wipIDs = _pkgList.Where(q => !q.WIP_ID.IsNullOrEmpty()).Select(q => q.WIP_ID).ToList(); |
| | | var wo = _pkgList.First().WORK_ORDER; |
| | | //å
è£
ä¿¡æ¯ä¿åå°ç产è¿ç¨è®°å½ |
| | | db.Updateable<MES_WIP_HIS>() |
| | | .SetColumns(q => q.TRAY_SN == curPkg.Item.Package.SN) |
| | | .SetColumns(q => q.INNER_SN == q.CARTON_SN) |
| | | .SetColumns(q => q.CARTON_SN == curPkg.Item.Package.SN) |
| | | .Where(q => q.WORK_ORDER == wo && q.OPER_CODE == "EndNode" && wipIDs.Contains(q.WIP_ID)) |
| | | .ExecuteCommand(); |
| | | } |
| | | }; |
| | | } |
| | | |
| | | //ä¿åæ°æ®åº |
| | | SaveStepsCommitActionToDB(endAction); |
| | | |
| | | //ä¿åæåï¼è¿åè¿ç«æ¶æ¯ |
| | | CurOperInfo(locale).InputQty += CurWipSNs.Count; |
| | | action.Data.Data = new PackingActionOutput() { PkgInfo = curPkg }; |
| | | action.Data.OperInfo = operInfo; |
| | | action.Data.ShortMsg = new(CurWipSNs.Any(q => q.DFT_FLAG == "Y") ? "ä¸è¯è¿ç«" : "è¯åè¿ç«", ShortMessage.Types.Success); |
| | | //action.LocaleMsg = new($"å·¥å[{CurWipSN.WORK_ORDER}]çæ¡ç [{CurWipSN.SN}]å¨å²ä½[{CurWipSN.POST_CODE}]å·¥åº[{CurWipSN.NODE_NAME}]è¿ç«æåï¼ç¶æ[{CurWipSN.STATUS.GetEnumDesc<MES_WIP_DATA.STATUSs>()}]"); |
| | | action.LocaleMsg = new("MES.Transaction.PackingNode.ScanSn.PassSuccess", CurWipSNs.First().WORK_ORDER, CurSN, CurWipSNs.First().POST_CODE, CurWipSNs.First().NODE_NAME, CurWipSNs.First().STATUS.GetEnumDesc<MES_WIP_DATA.STATUSs>()); |
| | | |
| | | //妿å½åæ¡ç å·²ç»å®å·¥ï¼æ£æ¥å½åå·¥åæ¹æ¬¡å工忝å¦å®å·¥ |
| | | if (action.Data.OperInfo.IsReachedEndNode) |
| | | { |
| | | CurBatch.CheckIsComplete(UserCode); |
| | | } |
| | | |
| | | //éç½®å·¥åº |
| | | ResetNode(); |
| | | |
| | | return action; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å
è£
å·¥åºï¼æå¨ç»æå
è£
|
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public async Task<ApiAction<SubmitOutput>> CompletePkg(ApiAction input) |
| | | { |
| | | var action = new ApiAction<SubmitOutput>(new SubmitOutput()); |
| | | try |
| | | { |
| | | //PkgSubmitï¼æå¨ç»æå
è£
ï¼ä¿åæåçå
è£
æ°æ® |
| | | if (NodeCmd.IsNullOrEmpty("PkgSubmit") == "PkgSubmit" || CurWipSNs.IsNullOrEmpty()) |
| | | { |
| | | if (Context.ContainsKey("CurPackage")) |
| | | { |
| | | TempPkgAction = new PackingAction(); |
| | | TempPkgAction.Init(this); |
| | | |
| | | var CurPkg = Context["CurPackage"] as WipPkg; |
| | | int shipQty = input.Data.ToInt32(); |
| | | int curQty = CurPkg.Item.TotalQty; |
| | | int ruleQty = TempPkgAction.PkgRule.GetTotalQty(); |
| | | //æå¡«åºè´§æ°éåéªè¯å½åå
è£
æ°éå¿
é¡»çäºï¼åºè´§æ°é/å
è£
è§åæ°éï¼ç使° |
| | | if (shipQty > 0 && curQty != shipQty % ruleQty) |
| | | { |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = new($"åºè´§æ°é设å®ä¸º[{0}]ï¼ç®åå
è£
äº[{1}]ï¼å
è£
å°¾æ°çæ°éå¿
鿝[{2}]ï¼è¯·è£
夿°éååç»æå
è£
"); |
| | | action.LocaleMsg = new("MES.Transaction.PackingNode.NotMatchShipQty", shipQty, curQty, shipQty % ruleQty); |
| | | return action; |
| | | } |
| | | |
| | | NodeCmd = "PkgSubmit"; |
| | | action = TempPkgAction.Submit(null); |
| | | } |
| | | else |
| | | { |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = new($"æ¾ä¸å°æåçå
è£
æ°æ®ï¼æ éæå¨ç»æå
è£
"); |
| | | action.LocaleMsg = new("MES.Transaction.PackingNode.NoCurPackage"); |
| | | } |
| | | } |
| | | //å·¥åºå¤äºå
¶ä»å½ä»¤æ¨¡å¼ï¼ä¸å
许æå¨ç»æå
è£
|
| | | else |
| | | { |
| | | switch (NodeCmd) |
| | | { |
| | | case "NodeSubmit": |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = new($"æ£å¨è¿è¡æ¡ç [{CurWipSN.SN}]çè¿ç«ä¸å¡ï¼ä¸å
许æå¨ç»æå
è£
"); |
| | | action.LocaleMsg = new("MES.Transaction.PackingNode.WorkingOnNodeSubmit", CurSN); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | action.CatchExceptionWithLog(ex, $"å
è£
å·¥åºï¼æå¨ç»æå
è£
å¼å¸¸"); |
| | | NodeCmd = null; |
| | | } |
| | | return action; |
| | | } |
| | | |
| | | #endregion Functions |
| | | |
| | | /// <summary> |
| | | /// éç½®å½åå·¥æ¥ï¼æéè¦åéåæ¤æ¹æ³ |
| | | /// </summary> |
| | | public override void ResetNode() |
| | | { |
| | | base.ResetNode(); |
| | | NodeCmd = null; |
| | | } |
| | | |
| | | public override bool Close(bool needSaveHistoryLog = false) |
| | | { |
| | | //needSaveHistoryLog = true; |
| | | //ä¿åæä½æ¥å¿ |
| | | |
| | | this.IsFinished = true; |
| | | return IsFinished ? base.Close(needSaveHistoryLog) : IsFinished; |
| | | } |
| | | }//endClass |
| | | } |