using DeviceRepair.Models;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
namespace DeviceRepair.DataAccess
{
///
/// 设备维修
///
public class MaintenanceAccess : DbContext
{
private static MaintenanceAccess manager;
public static MaintenanceAccess Instance
{
get
{
if (manager == null)
manager = new MaintenanceAccess();
return manager;
}
}
///
/// 查询数据
///
///
public APIResponseData GetDatas(DeviceWarrantyRequestFormFilter FilterInfo)
{
APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"获取数据失败!" };
try
{
db.ChangeDatabase("main");
var exp = Expressionable.Create();
if (FilterInfo != null)
{
//exp.AndIF(!string.IsNullOrWhiteSpace(FilterInfo.EquipmentID), x => x.EquipmentID.Equals(FilterInfo.EquipmentID, StringComparison.CurrentCultureIgnoreCase));
//exp.AndIF(FilterInfo.StartTime.HasValue, x => x.CreatOn >= FilterInfo.StartTime.Value);
//exp.AndIF(FilterInfo.EndTime.HasValue, x => x.CreatOn <= FilterInfo.EndTime.Value);
//exp.AndIF(FilterInfo.Status == DeviceWarrantyRequestFormStatus.AwaitingRepair,
// x => SqlFunc.Subqueryable().Where(s => s.FormID == x.AutoID).NotAny());
//exp.AndIF(FilterInfo.Status == DeviceWarrantyRequestFormStatus.AwaitingApproval,
// x => SqlFunc.Subqueryable().Where(s => s.FormID == x.AutoID && s.SubmitBy > 0).Any());
//exp.AndIF(FilterInfo.Status == DeviceWarrantyRequestFormStatus.BeComplate,
// x => SqlFunc.Subqueryable().Where(s => s.FormID == x.AutoID && s.SubmitBy > 0 && s.ValidateBy > 0).Any());
exp.AndIF(!string.IsNullOrWhiteSpace(FilterInfo.EquipmentID), x => x.EquipmentID.Contains(FilterInfo.EquipmentID));
exp.AndIF(FilterInfo.StartTime.HasValue, x => x.CreatOn >= FilterInfo.StartTime.Value);
exp.AndIF(FilterInfo.EndTime.HasValue, x => x.CreatOn <= FilterInfo.EndTime.Value);
exp.AndIF(FilterInfo.Status == DeviceWarrantyRequestFormStatus.AwaitingRepair,
x => SqlFunc.Subqueryable().Where(s => s.FormID == x.AutoID).NotAny());
exp.AndIF(FilterInfo.Status == DeviceWarrantyRequestFormStatus.AwaitingApproval,
x => SqlFunc.Subqueryable().Where(s => s.FormID == x.AutoID && s.SubmitBy > 0).Any());
exp.AndIF(FilterInfo.Status == DeviceWarrantyRequestFormStatus.BeComplate,
x => SqlFunc.Subqueryable().Where(s => s.FormID == x.AutoID && s.SubmitBy > 0 && s.ValidateBy > 0).Any());
bool isDown = FilterInfo.DownStatus == DeviceRunningStatus.Stop;
exp.AndIF(FilterInfo.DownStatus != DeviceRunningStatus.All,
x => x.IsDown == isDown);
}
List Datas = CurrentDb.AsQueryable().With(SqlWith.NoLock).Where(exp.ToExpression()).ToList();
//List Datas = CurrentDb.AsQueryable().Where(exp.ToExpression()).ToList();
//int[] pks = Datas.Select(x => x.AutoID).ToArray();
//Dictionary Maintaions = db.Queryable()
// .With(SqlWith.NoLock)
// .Where(x => SqlFunc.ContainsArray(pks, x.FormID)).ToList().ToDictionary(x => x.FormID, x => x);
//int[] mpks = Maintaions.Select(x => x.Value.AutoID).ToArray();
//List Accessories = db.Queryable()
// .With(SqlWith.NoLock)
// .Where(x => SqlFunc.ContainsArray(mpks, x.MaintaionID)).ToList();
//foreach (DeviceWarrantyRequestForm item in Datas)
//{
// if (Maintaions.ContainsKey(item.AutoID))
// {
// item.MaintaionInfo = Maintaions[item.AutoID];
// if (Accessories.Any(x => x.MaintaionID == item.MaintaionInfo.AutoID))
// {
// item.MaintaionInfo.Accessories = Accessories.Where(x => x.MaintaionID == item.MaintaionInfo.AutoID)?.ToList();
// }
// }
//}
apiResponseData.Code = 1;
apiResponseData.Data = Datas;
apiResponseData.Message = "";
}
catch (SqlSugarException e)
{
apiResponseData.Code = -1;
apiResponseData.Message = e.Message;
}
catch (Exception ex)
{
apiResponseData.Code = -1;
apiResponseData.Message = ex.Message;
}
return apiResponseData;
}
///
/// 设备维修
///
///
///
public APIResponseData DeviceMaintion(DeviceWarrantyRequestMaintaionInfo Entity, List AccessoriesItems, HeaderModel Operation)
{
APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"数据插入失败!" };
try
{
if (Entity == null)
{
throw new Exception("待插入的数据库对象不能为空!");
}
DateTime CurrentTime = DateTime.Now;
if (Entity.AutoID > 0)
{
/// 修改
Entity.ModifyBy = Operation.Operator;
Entity.ModifyOn = CurrentTime;
}
else
{
/// 新增
Entity.CreatOn = CurrentTime;
Entity.CreateBy = Operation.Operator;
Entity.Guid = Guid.NewGuid();
}
if (Entity.IsSubmit)
{
Entity.SubmitBy = Operation.Operator;
Entity.SubmitOn = CurrentTime;
}
try
{
db.ChangeDatabase("main");
db.BeginTran();
if (db.Queryable().Any(x => x.FormID == Entity.AutoID && x.SubmitBy > 0))
throw new Exception($"当前数据已被处理,请刷新后再试!");
DeviceWarrantyRequestMaintaionInfo MaintaionInfo = db.Saveable(Entity).ExecuteReturnEntity();
if (MaintaionInfo != null)
{
bool IsSuccess = true;
if (AccessoriesItems != null)
{
foreach (var item in AccessoriesItems)
{
item.Guid = Guid.NewGuid();
item.MaintaionID = MaintaionInfo.AutoID;
item.CreatBy = Operation.Operator;
item.CreatOn = CurrentTime;
}
IsSuccess = db.Saveable(AccessoriesItems).ExecuteCommand() == AccessoriesItems.Count;
}
if (IsSuccess)
{
db.CommitTran();
apiResponseData.Code = 1;
apiResponseData.Message = string.Empty;
}
}
else
{
db.RollbackTran();
}
}
catch (Exception)
{
db.RollbackTran();
throw;
}
}
catch (SqlSugarException e)
{
apiResponseData.Code = -1;
apiResponseData.Message = e.Message;
}
catch (Exception ex)
{
apiResponseData.Code = -1;
if (((System.Data.SqlClient.SqlException)ex).Number == 2627)
{
apiResponseData.Message = $"当前数据已被处理,请刷新后再试!";
}
else
{
apiResponseData.Message = ex.Message;
}
}
return apiResponseData;
}
///
/// 停机单新增
///
///
///
public APIResponseData DeviceDownFormAdd(DeviceWarrantyRequestForm Form, HeaderModel Operation)
{
APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"数据插入失败!" };
try
{
if (Form == null)
{
throw new Exception("待插入的数据库对象不能为空!");
}
DateTime CurrentTime = DateTime.Now;
db.ChangeDatabase("main");
db.BeginTran();
#region 2024年5月21日 会议,确定一个设备,同时能存在多个维修单
//// 当前设备存在未完成的设备停机单
//if (db.Queryable().Any(x =>
// x.EquipmentID == Form.EquipmentID &&
// (
// !SqlFunc.Subqueryable().Where(s => s.FormID == x.AutoID).Any() ||
// SqlFunc.Subqueryable().Where(s => s.FormID == x.AutoID && (s.SubmitBy == 0 || s.ValidateBy == 0)).Any())
//))
//{
// throw new Exception("当前设备存在未完成的设备停机单!");
//}
#endregion
Form.GUID = Guid.NewGuid();
Form.CreatBy = Operation.Operator;
Form.CreatorName = Operation.OperatorName;
Form.CreatOn = CurrentTime;
try
{
int AutoID = db.Saveable(Form).ExecuteReturnEntity()?.AutoID ?? 0;
if (AutoID > 0)
{
db.CommitTran();
apiResponseData.Code = 1;
apiResponseData.Message = string.Empty;
apiResponseData.Data = AutoID;
}
else
{
db.RollbackTran();
}
}
catch (Exception)
{
db.RollbackTran();
throw;
}
}
catch (SqlSugarException e)
{
apiResponseData.Code = -1;
apiResponseData.Message = e.Message;
}
catch (Exception ex)
{
apiResponseData.Code = -1;
apiResponseData.Message = ex.Message;
}
return apiResponseData;
}
///
/// 停机单 - 评估
///
///
///
///
public APIResponseData DownFormAssessment(DeviceWarrantyEvaluatorInfo Evaluator, HeaderModel Operation)
{
APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"数据处理失败!" };
try
{
if (Evaluator.FormID <= 0)
{
throw new Exception("待处理的停机单主键编号无效!");
}
if (!Operation.OperatorGUID.HasValue || Operation.OperatorGUID == Guid.Empty)
{
throw new Exception("传入的操作人参数无效!");
}
DateTime CurrentTime = DateTime.Now;
db.ChangeDatabase("main");
DeviceWarrantyRequestForm Entity = db.Queryable().First(x => x.AutoID == Evaluator.FormID);
if (Entity == null)
{
throw new Exception("待处理的停机单主键编号无效!");
}
if (Evaluator.EvaluatorCode.ToUpper() != "QE" && Evaluator.EvaluatorCode.ToUpper() != "PE")
{
throw new Exception($"程序出错,未知的评估编码:{Evaluator.EvaluatorCode.ToUpper()}!");
}
Evaluator.CreatorName = Operation.OperatorName;
Evaluator.CreateBy = Operation.Operator;
Evaluator.CreatOn = CurrentTime;
Evaluator.Guid = Guid.NewGuid();
//switch (AssessmentCode.ToUpper())
//{
// case "QA":
// Entity.EvaluatornameQa = Operation.OperatorName;
// Entity.EvaluatoronQa = CurrentTime;
// Entity.EvaluatorcodeQa = Operation.OperatorGUID;
// break;
// case "EA":
// Entity.EvaluatornameEa = Operation.OperatorName;
// Entity.EvaluatoronEa = CurrentTime;
// Entity.EvaluatorcodeEa = Operation.OperatorGUID;
// break;
// case "MT":
// Entity.EvaluatornameMt = Operation.OperatorName;
// Entity.EvaluatoronMt = CurrentTime;
// Entity.EvaluatorcodeMt = Operation.OperatorGUID;
// break;
// case "TL":
// Entity.EvaluatornameTl = Operation.OperatorName;
// Entity.EvaluatoronTl = CurrentTime;
// Entity.EvaluatorcodeTl = Operation.OperatorGUID;
// break;
// default:
// break;
//}
if (db.Insertable(Evaluator).ExecuteCommand() > 0)
{
apiResponseData.Code = 1;
apiResponseData.Message = string.Empty;
}
}
catch (System.Data.SqlClient.SqlException ex)
{
apiResponseData.Code = -1;
apiResponseData.Message = ex.Number == 2627 ? "当前数据已被处理,请刷新后在试!" : ex.Message;
}
catch (SqlSugarException e)
{
apiResponseData.Code = -1;
apiResponseData.Message = e.Message;
}
catch (Exception ex)
{
apiResponseData.Code = -1;
apiResponseData.Message = ex.Message;
}
return apiResponseData;
}
///
/// 修改停机单 停机状态
///
///
///
///
public APIResponseData ChangeDownStatus(int AutoID, bool Status, HeaderModel Operation)
{
APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"数据处理失败!" };
try
{
if (AutoID <= 0)
{
throw new Exception("待处理的停机单主键编号无效!");
}
DateTime CurrentTime = DateTime.Now;
db.ChangeDatabase("main");
DeviceWarrantyRequestForm Entity = db.Queryable().First(x => x.AutoID == AutoID);
if (Entity == null)
{
throw new Exception("待处理的停机单主键编号无效!");
}
Entity.IsDown = Status;
if (db.Updateable(Entity).UpdateColumns(it => new { it.IsDown }).ExecuteCommand() > 0)
{
apiResponseData.Code = 1;
apiResponseData.Message = string.Empty;
}
}
catch (SqlSugarException e)
{
apiResponseData.Code = -1;
apiResponseData.Message = e.Message;
}
catch (Exception ex)
{
apiResponseData.Code = -1;
apiResponseData.Message = ex.Message;
}
return apiResponseData;
}
///
/// 双重验证
///
/// 1:技术人员确认 2:工程师或维修主管确认
///
///
public APIResponseData ValidateMaintenance(int AutoID, int t, HeaderModel Operation)
{
APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"数据处理失败!" };
try
{
if (AutoID <= 0)
{
throw new Exception("待处理的停机单主键编号无效!");
}
DateTime CurrentTime = DateTime.Now;
db.ChangeDatabase("main");
DeviceWarrantyRequestMaintaionInfo Entity = db.Queryable().First(x => x.FormID == AutoID);
if (Entity == null)
{
throw new Exception("待处理的停机单主键编号无效!");
}
if (t == 1)
{
if (Entity.ValidateBy > 0)
throw new Exception("当前维修单数据已被处理,请刷新后再试!");
Entity.ValidateBy = Operation.Operator;
Entity.ValidateOn = CurrentTime;
}
else if (t == 2)
{
if (Entity.Validate2By > 0)
throw new Exception("当前维修单数据已被处理,请刷新后再试!");
Entity.Validate2By = Operation.Operator;
Entity.Validate2On = CurrentTime;
}
else
{
throw new Exception("传入的确认人岗位错误!");
}
if (db.Updateable(Entity).ExecuteCommand() > 0)
{
apiResponseData.Code = 1;
apiResponseData.Message = string.Empty;
}
}
catch (SqlSugarException e)
{
apiResponseData.Code = -1;
apiResponseData.Message = e.Message;
}
catch (Exception ex)
{
apiResponseData.Code = -1;
apiResponseData.Message = ex.Message;
}
return apiResponseData;
}
///
/// 生产部门 - 设备恢复确认
///
///
///
///
public APIResponseData DeviceResumptionComfirm(int AutoID, HeaderModel Operation)
{
APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"数据处理失败!" };
try
{
if (AutoID <= 0)
{
throw new Exception("待处理的停机单主键编号无效!");
}
DateTime CurrentTime = DateTime.Now;
db.ChangeDatabase("main");
DeviceWarrantyRequestForm Entity = db.Queryable().First(x => x.AutoID == AutoID);
if (Entity == null)
{
throw new Exception("待处理的停机单主键编号无效!");
}
if (Entity.MaintaionItems != null && Entity.MaintaionItems.SubmitBy > 0 &&
((Entity.InProduction && Entity.EvaluatorItems?.Count == 2) || !Entity.InProduction) &&
((Entity.MaintaionItems.BeValidate && Entity.MaintaionItems.Validate2By > 0 && Entity.MaintaionItems.ValidateBy > 0) || !Entity.MaintaionItems.BeValidate)
&& Entity.RestorationConfirmationBy == 0
)
{
Entity.RestorationConfirmationOn = CurrentTime;
Entity.RestorationConfirmationBy = Operation.Operator;
Entity.RestorationConfirmationOnName = Operation.OperatorName;
if (db.Updateable(Entity).ExecuteCommand() > 0)
{
apiResponseData.Code = 1;
apiResponseData.Message = string.Empty;
}
}
else
{
throw new Exception("待处理的停机单状态异常,请重试!");
}
}
catch (SqlSugarException e)
{
apiResponseData.Code = -1;
apiResponseData.Message = e.Message;
}
catch (Exception ex)
{
apiResponseData.Code = -1;
apiResponseData.Message = ex.Message;
}
return apiResponseData;
}
///
/// 判断维修单是否提交
///
///
///
public APIResponseData MaintionDataIsSubmit(int FormAutoId)
{
APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"数据插入失败!" };
try
{
if (FormAutoId == 0)
throw new Exception("待查询的维修单编号不能为空!");
db.ChangeDatabase("main");
int Count = db.Queryable().With(SqlWith.NoLock).Count(x => x.FormID == FormAutoId && x.SubmitBy > 0);
apiResponseData.Code = 1;
apiResponseData.Data = Count;
}
catch (SqlSugarException e)
{
apiResponseData.Code = -1;
apiResponseData.Message = e.Message;
}
catch (Exception ex)
{
apiResponseData.Code = -1;
apiResponseData.Message = ex.Message;
}
return apiResponseData;
}
}
}