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
|
{
|
/// <summary>
|
/// 工单 上下文
|
/// </summary>
|
public class WoContext
|
{
|
#region 工单管理
|
/// <summary>
|
///
|
/// </summary>
|
public static Dictionary<string, WorkBatch> WoBatchDic { get; set; } = new Dictionary<string, WorkBatch>();
|
|
/// <summary>
|
/// 从工单批次字典中获取一个工单批次对象
|
/// </summary>
|
/// <param name="workorder"></param>
|
/// <param name="lineCode"></param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 判断工单批次是否存在于工单批次字典中
|
/// </summary>
|
/// <param name="workorder"></param>
|
/// <param name="lineCode"></param>
|
/// <returns></returns>
|
public static bool ExistsBatch(string workorder, string 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
|
}
|
}
|