using PadApplication.DB;
using PadApplication.Entites.DbModels;
using PadApplication.Entites.Dto;
using System.Net.Http;
using System.Text;
using Newtonsoft.Json;
using SqlSugar;
namespace PadApplication.Services;
///
/// 工单状态管理类,负责工单状态相关的数据操作
/// 继承自Repository基类,包含基础的CRUD操作
///
public class MesOrderStaManager : Repository
{
private readonly MesQaItemsDetect02Manager
mesQaItemsDetect02Manager = new();
///
/// 更新不良品ID
///
/// 包含不良品ID(ngId)和状态ID(staId)的数据传输对象
/// 更新是否成功
public bool UpdateNg(OrderMachineDto dto)
{
// 更新MesOrderSta表中指定ID记录的不良品ID
return Db.Updateable()
// 设置NgId字段为传入的ngId值
.SetColumns(s => s.NgId == dto.ngId)
// 根据主键Id匹配记录
.Where(s => s.Id == dto.staId)
// 执行更新并判断影响行数是否大于0
.ExecuteCommand() > 0;
}
///
/// 根据工单号查找工单状态信息
///
/// 包含工单ID的查询条件
/// 工单状态信息,包含工单状态等详细信息
public MesOrderSta FindByOrderNo(OrderMachineDto query)
{
// 查询MesOrderSta表获取工单状态记录
var mesOrderSta = Db.Queryable()
.Where(s => s.OrderId == query.OrderId)
.First();
// 如果未找到记录,返回空对象
if (mesOrderSta == null) return new MesOrderSta();
// 查询Womdaa表获取工单主表信息
var womdaa = Db.Queryable()
.Where(a => a.Id == query.OrderId).First();
// 判空处理,避免空引用异常
mesOrderSta.OrderStatus = womdaa != null ? womdaa.Daa018 : null;
return mesOrderSta;
}
///
/// 更新换模时间
///
/// 工单状态实体,包含换模开始/结束时间
/// 更新是否成功
public bool ChangeMoldTime(MesOrderSta entity)
{
var vWom = Db.Queryable()
.Where(s => s.MachineNo == entity.MachineNo)
.OrderByDescending(s => s.WGSJ)
.First();
return Db.Updateable()
// 如果有换模开始时间则更新
// .SetColumnsIF(entity.ChangeMoldStartTime != null,
// s => s.ChangeMoldStartTime == entity.ChangeMoldStartTime)
// 如果有换模结束时间则更新
.SetColumnsIF(entity.ChangeMoldEndTime != null,
s => s.ChangeMoldEndTime == entity.ChangeMoldEndTime)
// 如果标记为1则更新机器开始时间为当前时间
.SetColumnsIF(entity.Flag == 1,
s => s.MaStartTime ==
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
.SetColumnsIF(entity.Flag == 1 && vWom.WGSJ.Value < DateTime.Now,
s => s.ChangeMoldStartTime ==
vWom.WGSJ.Value.ToString("yyyy-MM-dd HH:mm:ss"))
// 根据ID匹配记录
.Where(s => s.Id == entity.Id)
// 执行更新并判断影响行数是否大于0
.ExecuteCommand() > 0;
}
///
/// 更新机器时间并处理首检/重送检
///
///
/// 工单状态实体,包含机器时间信息
/// Flag:1 = 首次送检呼叫;2 = 首检不合格后重新送检;其它值仅更新时间不触发首检单创建
///
/// 更新是否成功
public bool ChangeMachineTime(MesOrderSta entity)
{
var womdaa = Db.Queryable()
.Where(s => s.Id == entity.OrderId).First();
if (womdaa == null) throw new Exception("工单不存在");
// ================== 首次送检处理(Flag == 1)==================
if (entity.Flag == 1)
{
// 幂等:先查是否已有未作废的首检单(避免重复生成)
var existsFirst = Db.Queryable()
.Where(s => s.Aufnr == womdaa.Daa001 && s.Ftype == "首检" && (s.Fcancel == null || s.Fcancel != "Y"))
.Any();
if (!existsFirst)
{
// 行级锁防并发(Oracle FOR UPDATE)
Db.Ado.ExecuteCommand("SELECT ID FROM WOMDAA WHERE DAA001 = :BILL_NO FOR UPDATE",
new SugarParameter("BILL_NO", womdaa.Daa001));
// 二次确认
existsFirst = Db.Queryable()
.Where(s => s.Aufnr == womdaa.Daa001 && s.Ftype == "首检" && (s.Fcancel == null || s.Fcancel != "Y"))
.Any();
if (!existsFirst)
{
// 调用存储过程生成首检单
Db.Ado.ExecuteCommand(
"BEGIN AUTOMATIC_IPQC_FIRST_CHECK(:BILL_NO); END;",
new SugarParameter("BILL_NO", womdaa.Daa001, System.Data.DbType.String));
}
// 再次查询新生成的首检单
var newLatest = Db.Queryable()
.Where(s => s.Aufnr == womdaa.Daa001
&& s.Ftype == "首检"
&& (s.Fcancel == null || s.Fcancel != "Y"))
.OrderBy(s => s.CreateDate, OrderByType.Desc)
.First();
// 存储过程未生成 → 兜底 C# 自动生成
if (newLatest == null)
{
Console.WriteLine("[送检] 存储过程未生成,执行 C# 兜底逻辑");
var fallback = mesQaItemsDetect02Manager.AutomaticIpqcFirstCheck(womdaa.Daa001);
if (fallback)
{
newLatest = Db.Queryable()
.Where(s => s.Aufnr == womdaa.Daa001
&& s.Ftype == "首检"
&& (s.Fcancel == null || s.Fcancel != "Y"))
.OrderBy(s => s.CreateDate, OrderByType.Desc)
.First();
}
}
}
// 统一更新最新首检备注
var latestFirst = Db.Queryable()
.Where(s => s.Aufnr == womdaa.Daa001 && s.Ftype == "首检" && (s.Fcancel == null || s.Fcancel != "Y"))
.OrderBy(s => s.CreateDate, OrderByType.Desc)
.First();
if (latestFirst != null)
{
var ts = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
var remark = $"工控机于{ts}自动创建的首检单";
Db.Updateable()
.SetColumns(s => s.Remeke == remark)
.Where(s => s.Id == latestFirst.Id)
.ExecuteCommand();
}
}
// ================== 不合格后重新送检(Flag == 2)==================
else if (entity.Flag == 2)
{
// 1.加锁防并发(行级锁)
Db.Ado.ExecuteCommand(
"SELECT ID FROM WOMDAA WHERE DAA001 = :BILL_NO FOR UPDATE",
new SugarParameter("BILL_NO", womdaa.Daa001));
// 2. 当前最新未作废首检单
var latestFirst = Db.Queryable()
.Where(s => s.Aufnr == womdaa.Daa001
&& s.Ftype == "首检"
&& (s.Fcancel == null || s.Fcancel != "Y"))
.OrderBy(s => s.CreateDate, OrderByType.Desc)
.First();
bool needReCreate = false;
/*
3. 判断是否需要重新生成首检单
• 如果最新首检单存在且结果为“不合格”或“NG”,则需要重建首检单。
• 如果没有活动首检单,但存在已作废的不合格首检记录,也允许重建。
*/
if (latestFirst != null)
{
var resu = latestFirst.FcheckResu?.Trim();
if (!string.IsNullOrEmpty(resu) &&
(resu == "不合格" || resu.Equals("NG", StringComparison.OrdinalIgnoreCase)))
{
needReCreate = true;
}
}
else
{
// 4. 没有活动首检单,判断是否存在已作废的不合格首检记录
var existsCanceledNg = Db.Queryable()
.Where(s => s.Aufnr == womdaa.Daa001
&& s.Ftype == "首检"
&& s.Fcancel == "Y"
&& (s.FcheckResu == "不合格" || s.FcheckResu == "NG"))
.Any();
if (existsCanceledNg)
{
needReCreate = true;
Console.WriteLine("[重送检] 无活动首检单但存在作废的不合格记录,允许重建");
}
}
if (needReCreate)
{
// 作废当前活动不合格单
if (latestFirst != null)
{
Db.Updateable()
.SetColumns(s => s.Fcancel == "Y")
.Where(s => s.Id == latestFirst.Id
&& (s.Fcancel == null || s.Fcancel != "Y"))
.ExecuteCommand();
}
bool procOk = true;
string procErr = "";
try
{
// 5. 调用存储过程生成新首检单
Db.Ado.ExecuteCommand(
"BEGIN AUTOMATIC_IPQC_FIRST_CHECK(:BILL_NO); END;",
new SugarParameter("BILL_NO", womdaa.Daa001, System.Data.DbType.String));
}
catch (Exception ex)
{
procOk = false;
procErr = ex.Message;
Console.WriteLine($"[重送检] 存储过程异常: {procErr}");
}
// 再次查询新生成的首检单
var newLatest = Db.Queryable()
.Where(s => s.Aufnr == womdaa.Daa001
&& s.Ftype == "首检"
&& (s.Fcancel == null || s.Fcancel != "Y"))
.OrderBy(s => s.CreateDate, OrderByType.Desc)
.First();
// 存储过程未生成 → 兜底 C# 自动生成
if (newLatest == null)
{
Console.WriteLine("[重送检] 存储过程未生成,执行 C# 兜底逻辑");
var fallback = mesQaItemsDetect02Manager.AutomaticIpqcFirstCheck(womdaa.Daa001);
if (fallback)
{
newLatest = Db.Queryable()
.Where(s => s.Aufnr == womdaa.Daa001
&& s.Ftype == "首检"
&& (s.Fcancel == null || s.Fcancel != "Y"))
.OrderBy(s => s.CreateDate, OrderByType.Desc)
.First();
}
}
//6. 新首检单生成后,写入备注
var ts = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//只有开工状态下可以暂停工单
//当首检结果为‘合格’、‘不合格’时,更新备注
if (newLatest != null && newLatest.FcheckResu == "合格")
{
var remark = $"工控机于{ts}取消暂停重新送检生成的首检单";
Db.Updateable()
.SetColumns(s => s.Remeke == remark)
.Where(s => s.Id == newLatest.Id)
.ExecuteCommand();
}
else if (newLatest != null && newLatest.FcheckResu == "不合格")
{
var remark = $"工控机于{ts}不合格重新送检生成的首检单";
Db.Updateable()
.SetColumns(s => s.Remeke == remark)
.Where(s => s.Id == newLatest.Id)
.ExecuteCommand();
}
else
{
Console.WriteLine("[重送检] 仍未生成新首检单,请检查存储过程计数是否排除作废单。");
}
}
}
// ========= 首检不合格清空送检时间处理(Flag != 2 时才清空;并生成统一 remark) =========
string remarkToSet = null; // 最终要写入 MES_ORDER_STA.remark 的内容
var clearMaShoutTime = false; // 是否需要真正写 null 清空送检时间
if (entity.Flag == 1)
{
// 首次送检提交
if (!string.IsNullOrEmpty(entity.MaShoutTime))
remarkToSet = $"于{entity.MaShoutTime}时间有一次送检";
}
else if (entity.Flag == 2)
{
// 不合格重新送检(不清空送检时间,由前端可能覆盖为新时间)
if (!string.IsNullOrEmpty(entity.MaShoutTime))
remarkToSet = $"于{entity.MaShoutTime}时间不合格重新送检";
}
// 非重新送检场景(Flag!=2)才检查是否需要因“不合格”清空送检时间
if (entity.Flag != 2)
{
var latestFirstCheck = Db.Queryable()
.Where(s => s.Aufnr == womdaa.Daa001
&& s.Ftype == "首检"
&& (s.Fcancel == null || s.Fcancel != "Y"))
.OrderBy(s => s.CreateDate, OrderByType.Desc)
.First();
if (latestFirstCheck != null && latestFirstCheck.FcheckResu == "不合格")
{
entity.MaShoutTime = null; // 置空实体(后面更新时使用)
clearMaShoutTime = true;
remarkToSet = "首检不合格,送检时间已清空,请重新送检呼叫生成新的首检单";
}
}
// ========= 首检不合格清空送检时间处理结束 =========
// ================== 采集数/锚点 Anchors 处理 ==================
var mesReporting = Db.Queryable()
.Where(s => s.BillNo == womdaa.Daa001)
.OrderByDescending(s => s.Id)
.First();
var editDate = DateTime.Now.ToString("yyyy-MM-dd");
// 发送HTTP请求刷新设备采集数据(失败不阻断后续)
MesNumericalBycl mesNumerical = null;
try
{
using (var httpClient = new HttpClient())
{
httpClient.Timeout = TimeSpan.FromSeconds(30);
var content = new StringContent(
JsonConvert.SerializeObject(new { machineNo = entity.MachineNo }),
Encoding.UTF8,
"application/json");
var response = httpClient
.PostAsync("http://192.168.0.94:9095/Numerical/RefreshDevBycl", content)
.GetAwaiter().GetResult();
if (response.IsSuccessStatusCode)
{
var responseString = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
var responseObj = JsonConvert.DeserializeObject(responseString);
if (responseObj != null && responseObj.code == 200)
{
mesNumerical = Db.Queryable()
.Where(s => s.EditDate == editDate && s.MachineNo == entity.MachineNo)
.OrderByDescending(s => s.Id)
.First();
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"发送数据刷新请求时出错: {ex.Message}");
}
// 删除并重建当日锚点记录
Db.Deleteable()
.Where(a => a.EditDate == editDate && a.OrderId == womdaa.Id)
.ExecuteCommand();
MesAnchors eAnchors = new MesAnchors
{
OrderId = womdaa.Id,
OrderNo = womdaa.Daa001,
EditDate = editDate,
Qty = mesReporting == null ? 0 : (long?)(mesReporting.DyQty ?? 0),
InitialValue = mesNumerical == null ? 0 : mesNumerical.CjNum
};
Db.Insertable(eAnchors).ExecuteCommand();
// ================== 首检合格 -> 自动调机完成 + 写入开工时间 ==================
if (!clearMaShoutTime && !string.IsNullOrEmpty(entity.MaShoutTime)) // 未被清空的前提下才判断合格逻辑
{
if (DateTime.TryParse(entity.MaShoutTime, out var sjTime) &&
DateTime.TryParse(entity.MaStartTime, out var startTime))
{
if (sjTime >= startTime)
{
var sjRecord = Db.Queryable()
.Where(x => x.Aufnr == womdaa.Daa001 && x.Ftype == "首检" && (x.Fcancel == null || x.Fcancel != "Y"))
.OrderBy(x => x.CreateDate, OrderByType.Desc)
.First();
if (sjRecord != null && sjRecord.FcheckResu == "合格")
{
QualifiedInspection(new OrderMachineDto
{
OrderId = entity.OrderId,
orderNo = entity.OrderNo,
machineNo = entity.MachineNo
});
// 将送检时间写入开工时间
entity.StartTime = entity.MaShoutTime;
entity.MaEndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
// 若之前 remark 是“送检”可继续沿用;不强制覆盖
}
}
}
}
// ================== 最终更新 MES_ORDER_STA ==================
return Db.Updateable()
// 送检时间更新:若需要清空则明确赋 null;否则当有值时更新
.SetColumnsIF(clearMaShoutTime, s => s.MaShoutTime == null)
.SetColumnsIF(!clearMaShoutTime && entity.MaShoutTime != null,
s => s.MaShoutTime == entity.MaShoutTime)
// 调机开始时间
.SetColumnsIF(entity.MaStartTime != null,
s => s.MaStartTime == entity.MaStartTime)
// 调机完成时间
.SetColumnsIF(entity.MaEndTime != null,
s => s.MaEndTime == entity.MaEndTime)
// 开工时间
.SetColumnsIF(entity.StartTime != null,
s => s.StartTime == entity.StartTime)
// 统一备注(由前面逻辑确定)
.SetColumnsIF(!string.IsNullOrEmpty(remarkToSet),
s => s.remark == remarkToSet)
// 过滤当前记录
.Where(s => s.Id == entity.Id)
.ExecuteCommand() > 0;
}
///
/// 初始化工单状态
///
/// 包含工单信息的查询条件
/// 初始化是否成功
public bool init(OrderMachineDto query)
{
// 查询是否已存在该工单的状态记录
var count = Db.Queryable()
.Where(s => s.OrderId == query.OrderId).Count();
// 如果已存在则返回true
if (count > 0) return true;
// 创建新的工单状态记录
var mesOrderSta = new MesOrderSta
{
OrderId = query.OrderId.Value,
OrderNo = query.orderNo,
MachineNo = query.machineNo,
StartTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
};
// 插入新记录
return Insert(mesOrderSta);
}
///
/// 绑定工单到机器
///
/// 工单状态实体,包含机器编号等信息
/// 绑定是否成功
public bool Binding(MesOrderSta entity)
{
// 验证ID是否有效
if (entity.Id <= 0) return true;
// 验证机器编号是否为空
if (string.IsNullOrEmpty(entity.MachineNo)) return false;
// 将该机器上其他显示的工单状态设为不显示
var executeCommand = Db.Updateable()
.SetColumns(s => s.IsShow == 0)
.Where(s => s.IsShow == 1 && s.MachineNo == entity.MachineNo)
.ExecuteCommand();
// 将当前工单状态设为显示
var sql = "UPDATE MES_ORDER_STA SET IS_SHOW = 1 WHERE ID = " +
entity.Id;
executeCommand += Db.Ado.ExecuteCommand(sql);
// 判断是否至少有一条记录被更新
return executeCommand >= 1;
}
///
/// 更新工单时间和状态
///
/// 工单状态实体,包含时间和状态信息
/// 更新是否成功
public bool UpdateTime(MesOrderSta entity)
{
// 验证ID是否有效
if (entity.Id <= 0) return true;
// 验证机器编号是否为空
if (string.IsNullOrEmpty(entity.MachineNo)) return false;
var executeCommand = 0;
// 使用事务处理更新操作
executeCommand += UseTransaction(db =>
{
// 根据标记获取对应的状态文本
var daa018 = entity.Flag switch
{
0 => "开工",
1 => "完工", // 这里将daa018设置为完工
2 => "暂停",
3 => "未开工",
_ => ""
};
// 如果状态无效则返回0
if ("".Equals(daa018)) return 0;
var date = DateTime.Now.ToString("yyyy-MM-dd");
// 查询当前机器上的工单选择记录
var list = Db.Queryable()
.Where(a => a.MachineNo == entity.MachineNo
&& a.EditDate == date
&& a.IsShow == 0).ToList();
// 获取工单ID列表
var orderIds = list.Select(s => s.OrderId).ToList();
// 初始化每个工单的状态
list.ForEach(s =>
{
var query = new OrderMachineDto
{
OrderId = s.OrderId,
orderNo = s.OrderNo,
machineNo = s.MachineNo
};
init(query);
});
var updateable = 0;
var endDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
// 根据不同状态执行相应的处理
switch (daa018)
{
case "开工":
// 开工时绑定工单
Binding(entity);
break;
case "暂停":
foreach (var orderId in orderIds)
{
var womdaa = db.Queryable()
.Where(s => s.Id == orderId).First();
var btnLog = new MesWorkorderBtnLog
{
WorkNo = womdaa.Daa001,
BtnType = "工控暂停工单",
BtnDate = DateTime.Now
};
db.Insertable(btnLog)
.ExecuteCommand();
updateable += db.Updateable()
.SetColumns(s => s.Daa018 == daa018)
.SetColumnsIF("暂停".Equals(daa018),
s => s.Daa034 == DateTime.Now)
.Where(s => s.Id == orderId).ExecuteCommand();
db.Updateable()
.SetColumns(a => a.IsShow == 1)
.Where(a => a.OrderId == orderId)
.ExecuteCommand();
//更新工单状态表
db.Updateable()
.SetColumns(a => a.IsShow == 0)
.SetColumns(a => a.SuspendTime == endDate)
.Where(a => a.OrderId == orderId)
.ExecuteCommand();
}
break;
case "完工":
{
// 更新工单选择表显示状态
// Db.Updateable()
// .SetColumns(a => a.IsShow == 1)
// .Where(a => orderIds.Contains(a.OrderId))
// .ExecuteCommand();
// 更新工单状态表
// Db.Updateable()
// .SetColumns(a => a.IsShow == 0)
// .SetColumns(a => a.EndTime == endDate)
// .Where(a => orderIds.Contains(a.OrderId))
// .ExecuteCommand();
// 处理每个工单的报工数据
foreach (var orderId in orderIds)
{
// 查询工单主表信息
var womdaa = Db.Queryable()
.Where(s => s.Id == orderId).First();
//当已生成数不等于完工数是就跳过
if (womdaa.Daa008 > womdaa.Daa011)
{
updateable += 1;
continue;
}
var btnLog = new MesWorkorderBtnLog
{
WorkNo = womdaa.Daa001,
BtnType = "工控自动完工",
BtnDate = DateTime.Now
};
db.Insertable(btnLog)
.ExecuteCommand();
// 更新工单主表状态 - 这里将Womdaa表的daa018更新为完工状态
updateable = db.Updateable()
.SetColumns(s => s.Daa018 == daa018)
.SetColumnsIF("完工".Equals(daa018),
s => s.Daa017 == DateTime.Now)
.SetColumnsIF("暂停".Equals(daa018),
s => s.Daa034 == DateTime.Now)
.Where(s => s.Id == orderId).ExecuteCommand();
// Db.Deleteable()
// .Where(a => a.OrderId == orderId)
// .ExecuteCommand();
//
// Db.Deleteable()
// .Where(a => a.OrderId == orderId)
// .ExecuteCommand();
//更新工单选择表显示状态
db.Updateable()
.SetColumns(a => a.IsShow == 1)
.Where(a => a.OrderId == orderId)
.ExecuteCommand();
//更新工单状态表
db.Updateable()
.SetColumns(a => a.IsShow == 0)
.SetColumns(a => a.EndTime == endDate)
.Where(a => a.OrderId == orderId)
.ExecuteCommand();
// 查询已报工数量
var reporting = db.Queryable()
.Where(s => s.BillNo == womdaa.Daa001)
.Select(s => new MesReporting
{
OkQty = SqlFunc.AggregateSum(s.OkQty),
BfQty = SqlFunc.AggregateSum(s.BfQty)
}).First();
reporting.OkQty ??= 0;
reporting.BfQty ??= 0;
// 查询工单视图信息
// var vOrder = db.Queryable()
// .Where(s => s.ID == orderId).First();
// 计算待报工数量
// var reportingOkQty =
// Convert.ToDecimal(vOrder.todayOutput) -
// reporting.OkQty;
var CjQty = Db.Queryable()
.Where(s => s.MachineNo == entity.MachineNo && s.EditDate == date)
.OrderByDescending(s => s.CjTiem)
.Select(s => s.CjNum).First();
// 计算待报工数量
var reportingOkQty = CjQty - reporting.OkQty;
// 如果有待报工数量则创建报工记录
if (!(reportingOkQty > 0)) continue;
var mesReporting = new MesReporting
{
CheckType = 1,
BgDate = DateTime.Now,
AddressCode = womdaa.AddressCode,
MachineNo = womdaa.MachineNo,
// BfQty = reportingOkQty,
BfQty = 0,
BlQty = reportingOkQty,
OkQty = 0,
ItemNo = womdaa.Daa002,
BillNo = womdaa.Daa001,
CjQty = CjQty,
DyQty = reporting.OkQty
};
// 插入报工记录
db.Insertable(mesReporting)
.IgnoreColumns(true).ExecuteCommand();
}
break;
}
}
// 判断更新是否成功
if (updateable >= 1) return updateable;
throw new Exception("工单状态更新错误");
});
return executeCommand >= 1;
}
///
/// 检查工单状态是否允许操作
///
/// 包含工单信息和操作标识的查询条件
/// 是否允许操作
public bool StateCheck(OrderMachineDto query)
{
// 查询工单视图信息
var vOrder = Db.Queryable()
.Where(s => s.ID == query.OrderId).First();
// 根据不同操作标识进行检查
switch (query.Flag)
{
case 0: // 开工检查
vOrder.BGQTY ??= 0;
// 判断是否已完工
if (vOrder.Daa008 > vOrder.BGQTY) return true;
throw new Exception("当前工单已经完工,不允许再开工");
case 1: // 完工检查
return true;
case 2: // 暂停检查
// 判断是否处于开工状态
if (!"开工".Equals(vOrder.Daa018))
throw new Exception("只有开工状态下才允许暂停");
return true;
case 3: // 反完工检查
// 判断是否处于完工状态
if (!"完工".Equals(vOrder.Daa018))
throw new Exception("只有完工状态下才允许反完工");
return true;
default:
return false;
}
}
///
/// 检验合格时更新工单状态
///
/// 包含工单信息的查询条件
/// 更新是否成功
public bool QualifiedInspection(OrderMachineDto query)
{
var endDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
// 查询工单主表信息
var womdaa = Db.Queryable()
.Where(s => s.Id == query.OrderId).First();
// 根据是否有首检时间更新不同的字段
if (!womdaa.Daa016.HasValue)
// 首次首检更新
Db.Updateable()
.SetColumns(s => s.Daa018 == "开工")
.SetColumns(s => s.Daa022 == 1)
.SetColumns(s => s.Daa016 == DateTime.Now)
.SetColumns(s => s.Daa032 == DateTime.Now)
.Where(s => s.Id == query.OrderId).ExecuteCommand();
else
// 非首次首检更新
Db.Updateable()
.SetColumns(s => s.Daa018 == "开工")
.SetColumns(s => s.Daa022 == 1)
.SetColumns(s => s.Daa032 == DateTime.Now)
.Where(s => s.Id == query.OrderId).ExecuteCommand();
// 查询工单状态信息
var entity = Db.Queryable()
.Where(s => s.OrderId == query.OrderId).First();
// 绑定工单并更新时间
var binding = Binding(entity);
var btnLog = new MesWorkorderBtnLog
{
WorkNo = womdaa.Daa001,
BtnType = "工控首检开工",
BtnDate = DateTime.Now
};
Db.Insertable(btnLog).ExecuteCommand();
if (binding)
return Db.Updateable()
.SetColumns(s => s.MaEndTime == endDate) // 自动写入调机完成时间
.SetColumns(s => s.StartTime == entity.MaShoutTime)
.Where(s => s.OrderId == query.OrderId).ExecuteCommand() > 0;
return false;
}
///
/// 检验不合格时清空首检时间
///
/// 包含工单信息的查询条件
/// 清空是否成功
public bool InspectionIsUnqualified(OrderMachineDto query)
{
// 清空工单状态表的送检时间
return Db.Updateable()
.SetColumns(s => s.MaShoutTime == null)
.Where(s => s.OrderId == query.OrderId).ExecuteCommand() > 0;
}
///
/// 完工检查
///
/// 包含工单信息的查询条件
/// 完工处理是否成功
public bool Completed(OrderMachineDto query)
{
// 查询工单状态信息
var entity = Db.Queryable()
.Where(s => s.OrderId == query.OrderId).First();
// 设置完工标记
entity.Flag = 1;
// 更新工单时间和状态
return UpdateTime(entity);
}
}