服务端的TigerApi 框架,基于.NET6 2024 版本
Rodney Chen
2024-08-16 eec9f268552af1d0ce8c95312930770669f1cc18
Tiger.Business/MES/WoContext.cs
@@ -1,10 +1,15 @@
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
@@ -16,30 +21,201 @@
    {
        #region 工单管理
        /// <summary>
        /// 工单批次字典
        ///
        /// </summary>
        public static Dictionary<string, WorkBatch> WoBatchDic { get; set; } = new Dictionary<string, WorkBatch>();
        /// <summary>
        /// 从工单批次字典中获取一个工单批次对象
        /// </summary>
        /// <param name="workOrder"></param>
        /// <param name="workorder"></param>
        /// <param name="lineCode"></param>
        /// <returns></returns>
        public static WorkBatch GetBatch(string workOrder, string lineCode)
        public static WorkBatch GetBatch(string workorder, string lineCode)
        {
            return WoBatchDic.FirstOrDefault(q => q.Value.Batch.ORDER_NO == workOrder && q.Value.Batch.ACT_LINE == lineCode).Value;
            return WoBatchDic.FirstOrDefault(q => q.Value.Batch.ORDER_NO == workorder && q.Value.Batch.ACT_LINE == lineCode).Value;
        }
        /// <summary>
        /// 判断工单批次是否存在于工单批次字典中
        /// </summary>
        /// <param name="workOrder"></param>
        /// <param name="workorder"></param>
        /// <param name="lineCode"></param>
        /// <returns></returns>
        public static bool ExistsBatch(string workOrder, string lineCode)
        public static bool ExistsBatch(string workorder, string lineCode)
        {
            return WoBatchDic.Any(q => q.Value.Batch.ORDER_NO == workOrder && q.Value.Batch.ACT_LINE == lineCode);
            return WoBatchDic.Any(q => q.Value.Batch.ORDER_NO == workorder && q.Value.Batch.ACT_LINE == lineCode);
        }
        /// 从工单批次字典中删除一个工单批次对象
        /// </summary>
        /// <param name="batchNo"></param>
        /// <param name="lineCode"></param>
        /// <returns></returns>
        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;
            }
        }
        /// 从工单批次字典中删除一个工单批次对象
        /// </summary>
        /// <param name="batchNo"></param>
        /// <param name="lineCode"></param>
        /// <returns></returns>
        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;
            }
        }
        /// <summary>
        /// 获取SN的下一个工序节点列表
        /// </summary>
        /// <param name="sn"></param>
        /// <returns></returns>
        public static ApiAction<List<MES_WO_NODE>> GetSnNextNodes(string sn)
        {
            var action = new ApiAction<List<MES_WO_NODE>>(new List<MES_WO_NODE>());
            try
            {
                var wipSNs = Biz.Db.Queryable<MES_WIP_DATA>().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<BIZ_MES_WO_SN>().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;
        }
        /// <summary>
        /// 设置当前条码的工序信息
        /// </summary>
        public static ApiAction<OperInfo> GetSnOperInfo(string sn)
        {
            var action = new ApiAction<OperInfo>(new OperInfo());
            try
            {
                var wipSNs = Biz.Db.Queryable<MES_WIP_DATA>().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<BIZ_MES_WO_SN>().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 = 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
    }