using Tiger.Model;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
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;
namespace Tiger.Business
{
public partial class Biz
{
///
/// 工单批次
///
public partial class WorkBatch : IWorkBatch, IDisposable
{
public WorkBatch(string order)
{
OrderNo = order;
}
#region Propertys & Variables
public string OrderNo { get; set; }
public BIZ_MES_WO WO { get; set; }
public BIZ_MES_WO_BATCH Batch { get; set; }
public BAS_CUSTOMER Customer { get; set; }
public List WoSNs { get; set; }
public List Edges { get; set; }
public List Nodes { get; set; }
public List NodeSets { get; set; }
public List NodeActs { get; set; }
public List ActionSets { get; set; }
public List NodePosts { get; set; }
public List NodeDftgs { get; set; }
public List DefectGroups { get; set; }
///
/// 事务锁
///
public object TransLock { get; }
#endregion
#region Functions
///
/// 初始化工单资料
///
///
public WorkBatch Init(string lineCode)
{
WO = Biz.Db.Queryable().Where(q => q.ORDER_NO == OrderNo).First();
Batch = Biz.Db.Queryable().Where(q => q.ORDER_NO == OrderNo && q.ACT_LINE == lineCode
&& (q.STATUS == BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() || q.STATUS == BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())).First();
Customer = Biz.Db.Queryable().Where(q => q.CUST_CODE == WO.CUST_CODE).First();
WoSNs = Biz.Db.Queryable().Where(q => q.WORK_ORDER == OrderNo).ToList();
Edges = Biz.Db.Queryable().Where(q => q.WORK_ORDER == OrderNo).ToList();
Nodes = Biz.Db.Queryable().Where(q => q.WORK_ORDER == OrderNo).ToList();
NodeSets = Biz.Db.Queryable().Where(q => q.WORK_ORDER == OrderNo).ToList();
NodeActs = Biz.Db.Queryable().Where(q => q.WORK_ORDER == OrderNo).IncludesAllFirstLayer().ToList();
ActionSets = Biz.Db.Queryable().Where(q => q.WORK_ORDER == OrderNo).ToList();
NodePosts = Biz.Db.Queryable().Where(q => q.WORK_ORDER == OrderNo).ToList();
NodeDftgs = Biz.Db.Queryable().Where(q => q.WORK_ORDER == OrderNo).ToList();
DefectGroups = Biz.Db.Queryable().IncludesAllFirstLayer().ToList();
return this;
}
///
/// 工单开工
///
///
///
public bool StartWorking(string user)
{
if (Batch.STATUS == BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() || Batch.STATUS == BIZ_MES_WO_BATCH.STATUSs.Paused.GetValue())
{
WO.STATUS = BIZ_MES_WO.STATUSs.Working.GetValue();
WO.ACT_START_TIME = WO.ACT_START_TIME < new DateTime(2000, 1, 1) ? DateTime.Now : WO.ACT_START_TIME;
Batch.STATUS = BIZ_MES_WO_BATCH.STATUSs.Working.GetValue();
Batch.ACT_START_TIME = WO.ACT_START_TIME < new DateTime(2000, 1, 1) ? DateTime.Now : WO.ACT_START_TIME;
//保存数据库
var db = Biz.Db;
var dbTran = db.UseTran(() =>
{
db.Updateable(WO, user).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.ACT_START_TIME }).ExecuteCommand();
db.Updateable(Batch, user).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.ACT_START_TIME }).ExecuteCommand();
});
if (!dbTran.IsSuccess)
{
//throw dbTran.ErrorException;
return false;
}
}
return true;
}
///
/// 工单暂停
///
///
///
public bool PausedWorking(string user)
{
if (Batch.STATUS == BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())
{
WO.STATUS = BIZ_MES_WO.STATUSs.Paused.GetValue();
Batch.STATUS = BIZ_MES_WO_BATCH.STATUSs.Paused.GetValue();
//保存数据库
var db = Biz.Db;
var dbTran = db.UseTran(() =>
{
db.Updateable(WO, user).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
db.Updateable(Batch, user).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
});
if (!dbTran.IsSuccess)
{
//throw dbTran.ErrorException;
return false;
}
}
return true;
}
///
/// 根据岗位编码判断是不是首站
///
///
///
public bool IsFirstNode(string postCode)
{
return Nodes.Any(q => q.IS_FIRST_NODE == "Y" && NodePosts.Any(p => p.NODE_ID == q.ID && p.POST_CODE == postCode));
}
///
/// 根据岗位编码返回工序节点
///
///
///
public MES_WO_NODE GetNode(string postCode)
{
return Nodes.FirstOrDefault(q => NodePosts.Any(p => p.NODE_ID == q.ID && p.POST_CODE == postCode));
}
///
/// 根据岗位编码返回工序不良代码
///
///
///
public List GetNodeDefects(string postCode)
{
var result = new List();
var groups = DefectGroups.Where((b, s) => NodeDftgs.Any(d => d.NODE_ID == GetNode(postCode).ID && d.DFTG_CODE == b.DFTG_CODE)).ToList();
foreach (var group in groups)
{
result.AddRange(group.Defects.Select(q => new DefectOutput {
DFTG_CODE = q.DFTG_CODE,
DFTG_NAME = group.DFTG_NAME,
DFT_CODE = q.DFT_CODE,
DFT_NAME = q.DFT_NAME,
DFT_LEVEL = q.DFT_LEVEL,
}));
}
return result;
}
#endregion
///
/// 关闭工单
///
///
public bool Close()
{
Dispose();
return true;
}
public virtual void Dispose()
{
WoContext.WoBatchDic.Remove(OrderNo);
}
}
}
}