using System.Data; using MES.Service.DB; using MES.Service.Dto.service; using MES.Service.Modes; using MES.Service.util; using SqlSugar; using DbType = System.Data.DbType; namespace MES.Service.service.QC; public class SJService { private readonly BaseService _baseService = new(); //获取最大单号 public string getMaxBillNo() { var db = SqlSugarHelper.GetInstance(); var date = DateTime.Now.ToString("yyyy-MM-dd"); var sql = "select max(BILL_NO) from QS_ITEM_IPI_REQ where to_char(CREATE_TIME,'yyyy-mm-dd') = '" + date + "'"; var maxBillNo = db.Ado.SqlQuerySingle(sql); var number = "0001"; if (maxBillNo != null) { maxBillNo = maxBillNo.Substring(12); var no = Convert.ToInt32(maxBillNo); no++; number = no.ToString().PadLeft(4, '0'); } return "SJN" + date.Replace("-", "") + number; } //获取所有数据分页 public List getPage(SJPageResult queryObj) { var db = SqlSugarHelper.GetInstance(); string[]? lineNo = null; if (StringUtil.IsNotNullOrEmpty(queryObj.StatusUser)) lineNo = _baseService.getUserLineNo(queryObj.StatusUser); var data = db.Queryable() .WhereIF(lineNo != null && lineNo.Length > 0, a => lineNo.Contains(a.line)) .WhereIF(queryObj.Id != null, a => a.Id == queryObj.Id) .WhereIF(StringUtil.IsNotNullOrEmpty(queryObj.BillNo), a => a.BillNo == queryObj.BillNo) .WhereIF( StringUtil.IsNotNullOrEmpty(queryObj.Result) && "未完成".Equals(queryObj.Result), a => a.Result == queryObj.Result) .WhereIF( StringUtil.IsNotNullOrEmpty(queryObj.Result) && !"未完成".Equals(queryObj.Result), a => a.Result != "未完成") .OrderBy(a => a.BillNo, OrderByType.Desc) .ToPageList(queryObj.PageIndex, queryObj.Limit); return data; } //SetQSItem // public List SetQSItems(string itemNo) // { // var db = SqlSugarHelper.GetInstance(); // return db // .Queryable((a, b) => // new JoinQueryInfos(JoinType.Inner, a.MoidNum == b.MoidNum)) // .Where((a, b) => b.QsType == "1" && a.Fsubmit == 1 && a.ItemNo == itemNo).Select( // (a, b) => new QsItemIpiItem // { // ProjName = b.ProjName, // ItemMod = b.ItemMod, // InspectionMethod = b.InspectionMethod, // UsingInstruments = b.UsingInstruments, // LevelNum = SqlFunc.IsNull( // SqlFunc.IsNull(b.LevelNum * b.InspectionLevel, 1), // b.InspectionLevel), // MaxValue = b.MaxValue, // StandardValue = b.StandardValue, // MinValue = b.MinValue, // Notes = b.Notes, // FcheckLevel = b.FcheckLevel, // FacLevel = b.FacLevel, // QsCode = b.QsCode, // QsName = b.QsName, // result = "未检测" // }).ToList(); // } public List SetQSItems(string itemNo) { var db = SqlSugarHelper.GetInstance(); var count = db.Queryable().Where(s => s.QsType == "1" && s.ItemNo == itemNo && s.Fsubmit == 1).Count(); if (count <= 0) return []; return db .Queryable() .Where(b => b.QsType == "1" && b.ItemNo == itemNo).Select( b => new QsItemIpiItem { ProjName = b.ProjName, ItemMod = b.ItemMod, InspectionMethod = b.InspectionMethod, UsingInstruments = b.UsingInstruments, LevelNum = SqlFunc.IsNull( SqlFunc.IsNull(b.LevelNum * b.InspectionLevel, 1), b.InspectionLevel), MaxValue = b.MaxValue, StandardValue = b.StandardValue, MinValue = b.MinValue, Notes = b.Notes, FcheckLevel = b.FcheckLevel, FacLevel = b.FacLevel, QsCode = b.QsCode, QsName = b.QsName, Picture = b.Picture, Picturename = b.Picturename, result = "未检测", isCheck = 0 }).ToList(); } public List getQSItems(decimal? pid, decimal? id) { var db = SqlSugarHelper.GetInstance(); var qsItemIpiItems = db .Queryable() .WhereIF(pid > 0, a => a.Pid == pid) .WhereIF(id > 0, a => a.Id == id).ToList(); var array = qsItemIpiItems.Select(s => s.Id).ToArray(); var qsItemIpiItemDetails = db.Queryable() .Where(s => array.Contains(s.Pid)) .GroupBy(s => s.Pid) .Select(s => new { s.Pid, count = SqlFunc.AggregateCount(s.Id) }).ToList(); qsItemIpiItems.ForEach(s => { var find = qsItemIpiItemDetails.Find(a => s.Id == a.Pid); if (find == null) { s.isCheck = 0; s.result = "未完成"; } else { s.isCheck = find.count; if (find.count == s.LevelNum && s.IsPass == 1) s.result = "合格"; else if (find.count == s.LevelNum && s.IsPass == 0) s.result = "不合格"; else s.result = "未完成"; } }); //使用linq表达式过滤出图片id不为空的数据 var itemIpiItems = qsItemIpiItems.Where(s => s.Picture is { Length: > 0 }) .ToList(); if (itemIpiItems.Count > 0) itemIpiItems.ForEach(s => { var qsItemIpiItem = qsItemIpiItems.Find(t => t.Id == s.Id); //将字节数组转换为Base64编码的字符串 qsItemIpiItem.imageData = Convert.ToBase64String(s.Picture); }); //排序,未完成的排在前面 qsItemIpiItems = qsItemIpiItems.OrderBy(s => s.isCheck).ToList(); return qsItemIpiItems; } public QsItem Save(QsItem item) { var qsItemIpiReq = item.From; var qsItemIpiItems = item.Items; SqlSugarHelper.UseTransactionWithOracle( db => { qsItemIpiReq.StatusDate = DateTime.Now; var pid = db.Insertable(qsItemIpiReq) .ExecuteReturnIdentity(); qsItemIpiReq.Id = pid; item.gid = pid; qsItemIpiItems.ForEach(s => s.Pid = pid); return db.Insertable(qsItemIpiItems) .ExecuteCommand(); }); item.Items = getQSItems(qsItemIpiReq.Id, null); //没有上下限的检验项目自动盘点为合格 item.Items.ForEach(s => { if (s.MaxValue != null || s.StandardValue != null || s.MinValue != null) return; var detail = new QsItemIpiItemDetail(); detail.Pid = s.Id; detail.Gid = item.gid; detail.Fstand = "√"; detail.FcheckResu = "1"; detail.UpdateBy = item.From.StatusUser; detail.count = (int?)s.LevelNum; SetQSItemDetail(detail); }); item.Items = getQSItems(qsItemIpiReq.Id, null); var sjPageResult = new SJPageResult { Id = item.From.Id, Limit = 1, PageIndex = 1 }; item.Result = getPage(sjPageResult)[0]; return item; } public QsItem SaveItem(QsItem item) { var qsItemIpiItems = item.Items; SqlSugarHelper.UseTransactionWithOracle( db => { qsItemIpiItems.ForEach(s => s.Pid = item.gid); return db.Insertable(qsItemIpiItems) .ExecuteCommand(); }); item.Items = getQSItems(item.gid, null); //没有上下限的检验项目自动盘点为合格 item.Items.ForEach(s => { if (s.MaxValue != null || s.StandardValue != null || s.MinValue != null) return; var detail = new QsItemIpiItemDetail(); detail.Pid = s.Id; detail.Gid = item.gid; detail.Fstand = "√"; detail.FcheckResu = "1"; detail.UpdateBy = item.StatusUser; detail.count = (int?)s.LevelNum; SetQSItemDetail(detail); }); item.Items = getQSItems(item.gid, null); return item; } public int SetQSItemDetail(QsItemIpiItemDetail detail) { var oracle = SqlSugarHelper.UseTransactionWithOracle(db => { List result = new(); for (var i = 0; i < detail.count; i++) { var item = new QsItemIpiItemDetail(); item.Gid = detail.Gid; item.Pid = detail.Pid; item.Fstand = detail.Fstand; item.FcheckResu = detail.FcheckResu; item.CreateBy = detail.UpdateBy; item.CreateDate = DateTime.Now; result.Add(item); } return db.Insertable(result).ExecuteCommand(); }); detail.CreateBy = detail.UpdateBy; autoResult(detail); return oracle; } public List getQSItemDetail(decimal? pid, decimal? gid) { var db = SqlSugarHelper.GetInstance(); return db.Queryable() .Where(s => s.Pid == pid) .WhereIF(gid > 0, s => s.Gid == gid) .ToList(); } //自动判定是否合格 private int autoResult(QsItemIpiItemDetail detail) { var db = SqlSugarHelper.GetInstance(); // Single 没有查询到结果时返回Null,如果结果大于1条会抛出错误 var qsItemIpiItem = db.Queryable() .Single(s => s.Id == detail.Pid); if (qsItemIpiItem == null) return 0; var count = db.Queryable() .Where(s => s.Pid == detail.Pid).Count(); var result = 0; if (qsItemIpiItem.LevelNum != count) return 0; var passCount = db.Queryable() .Where(s => s.Pid == detail.Pid && s.Fstand == "√").Count(); if (count == passCount) result = 1; var useTransactionWithOracle = SqlSugarHelper.UseTransactionWithOracle( db => { var commit = 0; commit += db.Updateable() .SetColumns(s => s.IsPass == result) .Where(s => s.Id == detail.Pid) .ExecuteCommand(); return commit; }); //自动判定是否合格 //获取检验单的检验项目理论个数 var sum = db.Queryable() .Where(s => s.Pid == detail.Gid).Sum(it => it.LevelNum); if (sum == null || sum == 0) return 1; //获取检验单下的检验项目实际个数 var icount = db.Queryable() .Where(s => s.Gid == detail.Gid).Count(); if (icount == 0) return 1; //实际个数等于理论个数时对检验单进行判定 if (sum == icount) { result = 0; //获取这个检验单下的所有合格的检验结果 passCount = db.Queryable() .Where(s => s.Gid == detail.Gid && s.Fstand == "√").Count(); //合格的检验结果等于总检验数视为合格 if (icount == passCount) result = 1; useTransactionWithOracle += SqlSugarHelper.UseTransactionWithOracle( db => { return db.Updateable() .SetColumns(s => s.IsPass == result) .SetColumns(s => s.StatusUser == detail.CreateBy) .SetColumns(s => s.CompleteTime == DateTime.Now) .Where(s => s.Id == detail.Gid) .ExecuteCommand(); }); } return useTransactionWithOracle; } public int UpdateQSItemDetail(QsItemIpiItemDetail detail) { var withOracle = SqlSugarHelper.UseTransactionWithOracle(db => { return db.Updateable() .SetColumns(s => s.UpdateBy == detail.UpdateBy) .SetColumns(s => s.UpdateDate == DateTime.Now) .SetColumnsIF(StringUtil.IsNotNullOrEmpty(detail.Fstand), s => s.Fstand == detail.Fstand) .SetColumnsIF(StringUtil.IsNotNullOrEmpty(detail.FcheckResu), s => s.FcheckResu == detail.FcheckResu) .Where(s => s.Id == detail.Id) .ExecuteCommand(); }); detail.CreateBy = detail.UpdateBy; withOracle += autoResult(detail); return withOracle; } //主表修改备注字段 public int saveRemarksGid(QsItem dto) { return SqlSugarHelper.UseTransactionWithOracle(db => { return db.Updateable() .SetColumns(it => it.Remarks == dto.Remarks) //SetColumns是可以叠加的 写2个就2个字段赋值 .Where(it => it.Id == dto.gid) .ExecuteCommand(); }); } //子表修改备注字段 public int saveRemarksPid(QsItem dto) { return SqlSugarHelper.UseTransactionWithOracle(db => { return db.Updateable() .SetColumns(it => it.Remarks == dto.Remarks) //SetColumns是可以叠加的 写2个就2个字段赋值 .Where(it => it.Id == dto.pid) .ExecuteCommand(); }); } //孙表修改备注字段 public int saveRemarksById(QsItem dto) { return SqlSugarHelper.UseTransactionWithOracle(db => { return db.Updateable() .SetColumns(it => it.Remarks == dto.Remarks) //SetColumns是可以叠加的 写2个就2个字段赋值 .Where(it => it.Id == dto.id) .ExecuteCommand(); }); } public int removeXJ(decimal? id) { var withOracle = SqlSugarHelper.UseTransactionWithOracle(db => { var commit = 0; //删除主表 commit += db.Deleteable().Where(s => s.Id == id) .ExecuteCommand(); //删除子表 commit += db.Deleteable().Where(s => s.Pid == id) .ExecuteCommand(); //删除孙表 commit += db.Deleteable() .Where(s => s.Gid == id) .ExecuteCommand(); return commit; }); return withOracle; } public bool SJQaSubmit(QsItem item) { var (factory, company) = UserUtil.GetFactory(item.userNo); try { // 定义输出参数 var outputResult = new SugarParameter("o_Result", null, DbType.Int32, ParameterDirection.Output, 4000); var outputMessage = new SugarParameter("o_Msg", null, DbType.String, ParameterDirection.Output, 4000); // 定义输入参数 var parameters = new List { new("p_Id", item.gid, DbType.Int32,ParameterDirection.Input), new("p_Flag", 1, DbType.Int32,ParameterDirection.Input), new("p_User", item.userNo, DbType.String, ParameterDirection.Input), outputResult, outputMessage }; var db = SqlSugarHelper.GetInstance(); // 使用 SqlSugar 执行存储过程 db.Ado.ExecuteCommand( "BEGIN PRC_WOMDAA_SJ_UPDATE_RES(:p_Id,:p_Flag,:p_User,:o_Result, :o_Msg); END;", parameters.ToArray()); // 获取输出参数的值 var resultValue = outputResult.Value?.ToString(); var messageValue = outputMessage.Value?.ToString(); if ("1".Equals(resultValue)) { throw new Exception(messageValue); } if ("0".Equals(resultValue)) { throw new Exception(messageValue); } return true; } catch (Exception ex) { throw new Exception(ex.Message); } } }