using Microsoft.AspNetCore.Http; using Rhea.Common; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Net.WebSockets; using System.Text; using System.Threading.Tasks; using Tiger.IBusiness; using Tiger.Model; using Tiger.Model.Entitys.MES.Position; using static Tiger.Business.Biz; namespace Tiger.Business.MES { /// /// 工单 上下文 /// public class WoContext { #region 工单管理 /// /// /// public static Dictionary WoBatchDic { get; set; } = new Dictionary(); /// /// 从工单批次字典中获取一个工单批次对象 /// /// /// /// public static WorkBatch GetBatch(string workorder, string lineCode) { if (ExistsBatch(workorder, lineCode)) { return WoBatchDic.FirstOrDefault(q => q.Value.Batch.ORDER_NO == workorder && q.Value.Batch.ACT_LINE == lineCode).Value; } return null; } /// /// 判断工单批次是否存在于工单批次字典中 /// /// /// /// public static bool ExistsBatch(string workorder, string lineCode) { return WoBatchDic.Any(q => q.Value.Batch.ORDER_NO == workorder && q.Value.Batch.ACT_LINE == lineCode); } /// 从工单批次字典中删除一个工单批次对象 /// /// /// /// public static bool RemoveWo(string workorder) { try { var list = WoBatchDic.Keys.ToList().Where(q => q.Contains(workorder)); foreach (var batch in list) { WoBatchDic.Remove(batch); } return true; } catch (Exception ex) { Logger.Default.Fatal(ex, $"从工单批次字典中删除一个工单[{workorder}]对象异常"); return false; } } /// 从工单批次字典中删除一个工单批次对象 /// /// /// /// public static bool RemoveBatch(string batchNo) { try { if (WoBatchDic.ContainsKey(batchNo)) { WoBatchDic.Remove(batchNo); } return true; } catch (Exception ex) { Logger.Default.Fatal(ex, $"从工单批次字典中删除一个工单批次[{batchNo}]对象异常"); return false; } } /// /// 获取SN的下一个工序节点列表 /// /// /// public static ApiAction> GetSnNextNodes(string sn) { var action = new ApiAction>(new List()); try { var wipSNs = Biz.Db.Queryable().IncludesAllFirstLayer().Where(q => (q.SN == sn || q.FLOW_SN == sn || q.TRAY_SN == sn || q.INNER_SN == sn || q.CARTON_SN == sn || q.PALLET_SN == sn)).ToList(); if (wipSNs.IsNullOrEmpty()) { var woSNs = Biz.Db.Queryable().Where(q => (q.SN == sn || q.TRAY_SN == sn || q.OUTER_SN == sn)).ToList(); //查找到条码已绑定的工单 if (!woSNs.IsNullOrEmpty()) { foreach (var woSN in woSNs) { var wipSN = new MES_WIP_DATA() { SN = sn, FLOW_SN = sn, STATUS = MES_WIP_DATA.STATUSs.Init.GetValue(), ITEM_CODE = woSN.ITEM_CODE, WORK_ORDER = woSN.WORK_ORDER, BATCH_NO = woSN.BATCH_NO, HOLD_FLAG = "N", FINISHED_FLAG = "N", INV_FLAG = "N", DFT_FLAG = "N", DFT_COUNT = 0, }; wipSNs.Add(wipSN); } } } if (wipSNs.IsNullOrEmpty()) { action.IsSuccessed = false; //action.LocaleMsg = new($"找不到条码[{sn}]的生产信息", sn); action.LocaleMsg = new("MES.WoContext.SnNotFound", sn); } else { if (!WoBatchDic.Any(q => q.Value.WO.ORDER_NO == wipSNs.First().WORK_ORDER)) { var wb = new WorkBatch(wipSNs.First().WORK_ORDER).Init(""); WoBatchDic.Add(wb.Batch.BATCH_NO, wb); } var wo = WoBatchDic.FirstOrDefault(q => q.Value.WO.ORDER_NO == wipSNs.First().WORK_ORDER).Value; action.Data = wo.GetNextNodes(wipSNs.First()); } } catch (Exception ex) { //action.CatchExceptionWithLog(ex, $"获取条码[{sn}]的下一个工序节点列表异常"); action.CatchExceptionWithLog(ex, Biz.L("MES.WoContext.GetSnNextNodesException", sn)); } return action; } /// /// 设置当前条码的工序信息 /// public static ApiAction GetSnOperInfo(string sn) { var action = new ApiAction(new OperInfo()); try { var wipSNs = Biz.Db.Queryable().IncludesAllFirstLayer().Where(q => (q.SN == sn || q.FLOW_SN == sn || q.TRAY_SN == sn || q.INNER_SN == sn || q.CARTON_SN == sn || q.PALLET_SN == sn)).ToList(); if (wipSNs.IsNullOrEmpty()) { var woSNs = Biz.Db.Queryable().Where(q => (q.SN == sn || q.TRAY_SN == sn || q.OUTER_SN == sn)).ToList(); //查找到条码已绑定的工单 if (!woSNs.IsNullOrEmpty()) { foreach (var woSN in woSNs) { var wipSN = new MES_WIP_DATA() { SN = sn, FLOW_SN = sn, STATUS = MES_WIP_DATA.STATUSs.Init.GetValue(), ITEM_CODE = woSN.ITEM_CODE, WORK_ORDER = woSN.WORK_ORDER, BATCH_NO = woSN.BATCH_NO, HOLD_FLAG = "N", FINISHED_FLAG = "N", INV_FLAG = "N", DFT_FLAG = "N", DFT_COUNT = 0, }; wipSNs.Add(wipSN); } } } if (wipSNs.IsNullOrEmpty()) { action.IsSuccessed = false; //action.LocaleMsg = new($"找不到条码[{sn}]的生产信息", sn); action.LocaleMsg = new("MES.WoContext.SnNotFound", sn); } else { if (!WoBatchDic.Any(q => q.Value.WO.ORDER_NO == wipSNs.First().WORK_ORDER)) { var wb = new WorkBatch(wipSNs.First().WORK_ORDER).Init(""); WoBatchDic.Add(wipSNs.First().BATCH_NO, wb); } var wo = WoBatchDic.FirstOrDefault(q => q.Value.WO.ORDER_NO == wipSNs.First().WORK_ORDER).Value; action.Data = new() { CurNode = wipSNs.First().NODE_NAME, NextNode = string.Join(",", wo.GetNextNodes(wipSNs.First()).Select(q => q.NODE_NAME)), }; } } catch (Exception ex) { //action.CatchExceptionWithLog(ex, $"获取条码[{sn}]的工序信息异常"); action.CatchExceptionWithLog(ex, Biz.L("MES.WoContext.GetSnOperInfoException", sn)); } return action; } #endregion } }