using System.Net.NetworkInformation; using Masuit.Tools.Models; using MES.Service.DB; using MES.Service.Dto.service; using MES.Service.Modes; using MES.Service.util; using SqlSugar; namespace MES.Service.service.QC; public class RKJService { private readonly BaseService _baseService = new(); //手动执行sql //生成检验单号 public string getMaxBillNo() { var db = SqlSugarHelper.GetInstance(); var date = DateTime.Now.ToString("yyyy-MM-dd"); var sql = "select max(RELEASE_NO) from QS_ITEM_OQC_REQ where RELEASE_NO like 'RKJN%' and to_char(CREATE_DATE,'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 "RKJN" + date.Replace("-", "") + number; } //选择产线 public List getLineNo() { var db = SqlSugarHelper.GetInstance(); return db.Queryable() .Where(t => t.LineStyle == "包装" || SqlFunc.ContainsArray(new[] { "V1", "V3", "V5", "V6" }, t.LineNo)) .OrderBy(t => t.LineNo) .Select(t => new MesLine { LineNo = t.LineNo, LineName = t.LineName }).OrderBy("LINE_NO") .ToList(); } //获取工单号 public List GetDaa001s(string lineNo) { var db = SqlSugarHelper.GetInstance(); return null; } //根据检验标准来计算检验个数 public List SetItems(string itemNo, decimal quantity) { var db = SqlSugarHelper.GetInstance(); var count = db.Queryable().Where(s => s.QsType == "3" && s.ItemNo == itemNo && s.Fsubmit == 1).Count(); if (count <= 0) return []; var qsItemOqcItems = db .Queryable() .Where(b => b.QsType == "3" && b.ItemNo == itemNo).Select( b => new QsItemOqcItem { 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 = "未检测", isCheck = 0, Picture = b.Picture, Picturename = b.Picturename }).ToList(); qsItemOqcItems.ForEach(item => { string LEV = null; switch (item.FcheckLevel) { case string s when s.Contains("S1"): LEV = "B.FLEVEL_S1"; break; case string s when s.Contains("S2"): LEV = "B.FLEVEL_S2"; break; case string s when s.Contains("S3"): LEV = "B.FLEVEL_S3"; break; case string s when s.Contains("S4"): LEV = "B.FLEVEL_S4"; break; case string s when s.Contains("(I)"): LEV = "B.FLEVEL_I"; break; case string s when s.Contains("(II)"): LEV = "B.FLEVEL_II"; break; case string s when s.Contains("(III)"): LEV = "B.FLEVEL_III"; break; default: LEV = ""; // 默认值 break; } var sql = "SELECT " + LEV + " FROM MES_QM_AQL1 A LEFT JOIN MES_QM_AQL2 B ON B.AQL1_ID=A.ID WHERE A.SAMPLE_SIZE_NO='" + item.QsCode + "' AND B.LOT_FROM<= " + quantity + " AND " + quantity + "<=B.LOT_TO"; var maxBillNo = db.Ado.SqlQuerySingle(sql); var result = ExtractSubstring(item.FacLevel, '(', ')'); sql = "SELECT FSAMPLE_SIZE_WORD, " + result + " Result FROM MES_QM_AQL1 A LEFT JOIN MES_QM_AQL3 C ON C.AQL1_ID=A.ID WHERE A.SAMPLE_SIZE_NO= '" + item.QsCode + "' AND SAMPLE_SIZE_WORD= '" + maxBillNo + "'"; var resultClass = db.Ado.SqlQuerySingle(sql); item.LevelNum = resultClass.FSAMPLE_SIZE_WORD; item.FreQty = resultClass.Result; }); return qsItemOqcItems; } private string ExtractSubstring(string input, char startChar, char endChar) { var startIndex = input.IndexOf(startChar); var endIndex = input.IndexOf(endChar, startIndex); if (startIndex == -1 || endIndex == -1) // 如果未找到起始字符或结束字符,则返回空字符串或者抛出异常,根据实际情况选择 return string.Empty; // 或者抛出异常 // throw new ArgumentException("Start or end character not found"); // 提取子字符串 var length = endIndex - startIndex - 1; return input.Substring(startIndex + 1, length); } public List GetItems(decimal? pid, decimal? id) { var db = SqlSugarHelper.GetInstance(); return db.Queryable((a, b) => new JoinQueryInfos(JoinType.Left, a.Id == b.Pid)) .WhereIF(pid > 0, (a, b) => a.Pid == pid) .WhereIF(id > 0, (a, b) => a.Id == id) .GroupBy((a, b) => new { a.Id, a.ProjName, a.ItemMod, a.InspectionMethod, a.UsingInstruments, a.LevelNum, a.MaxValue, a.StandardValue, a.MinValue, a.Notes, a.IsPass, a.FcheckLevel, a.FacLevel, a.QsCode, a.QsName }).Select((a, b) => new QsItemOqcItem { ProjName = a.ProjName, Id = a.Id, ItemMod = a.ItemMod, InspectionMethod = a.InspectionMethod, UsingInstruments = a.UsingInstruments, LevelNum = a.LevelNum, MaxValue = a.MaxValue, StandardValue = a.StandardValue, MinValue = a.MinValue, Notes = a.Notes, FcheckLevel = a.FcheckLevel, FacLevel = a.FacLevel, QsCode = a.QsCode, QsName = a.QsName, isCheck = SqlFunc.AggregateCount(b.Id), Result = a.IsPass == 1 && a.LevelNum == SqlFunc.AggregateCount(b.Id) ? "合格" : a.IsPass == 0 && a.LevelNum == SqlFunc.AggregateCount(b.Id) ? "不合格" : "未完成" }).OrderBy("result desc").ToList(); } public dynamic save(RKJDto rkjDto) { var xj = rkjDto.from; var items = rkjDto.items; var userNo = rkjDto.userNo; SqlSugarHelper.UseTransactionWithOracle(db => { var commit = 0; // xj.CreateBy = userNo; // xj.CreateDate = DateTime.Now; var qsItemOqcReq = db.Queryable() .Where(s => s.Id == xj.Id) .First(); decimal? pid = 0; pid = qsItemOqcReq == null ? db.Insertable(xj).ExecuteReturnIdentity() : qsItemOqcReq.Id; xj.Id = pid; rkjDto.gid = pid; foreach (var item in items) item.Pid = pid; commit += db.Insertable(items).ExecuteCommand(); return commit; }); // using (var connection = // new OracleConnection(OracleSQLHelper.ConnectionString)) // connection.Open(); // // var transaction = connection.BeginTransaction(); // // try // { // using (var command = new OracleCommand()) // { // command.Connection = connection; // command.Transaction = transaction; // command.CommandText = "insert_and_update_picture_RKJ"; // command.CommandType = CommandType.StoredProcedure; // // // Add parameters // command.Parameters.Add("p_QS_TYPE", OracleDbType.Varchar2) // .Value = "3"; // command.Parameters.Add("p_MOID_NUM", OracleDbType.Varchar2) // .Value = rkjDto.moidNum; // command.Parameters.Add("p_pid", OracleDbType.Int32).Value = // xj.Id; // // command.ExecuteNonQuery(); // } // // transaction.Commit(); // } // catch (Exception) // { // transaction.Rollback(); // throw; // } // } rkjDto.items = GetItems(xj.Id, null); rkjDto.items.ForEach(s => { if (s.MaxValue != null || s.StandardValue != null || s.MinValue != null) return; var detail = new QsItemOqcItemDetail(); detail.Pid = s.Id; detail.Gid = rkjDto.gid; detail.Fstand = "√"; detail.FcheckResu = "1"; detail.UpdateBy = rkjDto.userNo; detail.count = (int?)s.LevelNum; SetQSItemDetail(detail); }); return Convert.ToInt32(xj.Id); } public int SetQSItemDetail(QsItemOqcItemDetail detail) { var oracle = SqlSugarHelper.UseTransactionWithOracle(db => { List result = new(); for (var i = 0; i < detail.count; i++) { var item = new QsItemOqcItemDetail(); 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; } private int autoResult(QsItemOqcItemDetail detail) { var db = SqlSugarHelper.GetInstance(); // Single 没有查询到结果时返回Null,如果结果大于1条会抛出错误 var QsItemOqcItem = db.Queryable() .Single(s => s.Id == detail.Pid); if (QsItemOqcItem == null) return 0; //查询这个检验项目下的检验结果 var count = db.Queryable() .Where(s => s.Pid == detail.Pid).Count(); var result = 0; //检验实际结果不等于应该检验的个数时直接推出 if (QsItemOqcItem.LevelNum != count) return 0; //合格的有多少个 var passCount = db.Queryable() .Where(s => s.Pid == detail.Pid && s.Fstand == "√").Count(); if (count == passCount) result = 1; else if (count - passCount < QsItemOqcItem.FreQty) 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 isNull = db.Queryable() .Where(s => s.Pid == detail.Gid && s.IsPass == null).Count(); if (isNull > 0) return 1; //获取检验单的检验项目的个数 var sum = db.Queryable() .Where(s => s.Pid == detail.Gid).Count(); if (sum == 0) return 1; //获取检验单下的合格的检验项目个数 var icount = db.Queryable() .Where(s => s.Pid == detail.Gid && s.IsPass == 1).Count(); var FcheckResu = "不合格"; //实际个数等于理论个数时对检验单进行判定 if (sum == icount) //合格的检验结果等于总检验数视为合格 FcheckResu = "合格"; SqlSugarHelper.UseTransactionWithOracle(db => { return db.Updateable() .SetColumns(s => s.FcheckResu == FcheckResu) .SetColumns(s => s.FcheckDate == DateTime.Now) .SetColumns(s => s.FcheckBy == detail.CreateBy) .SetColumns(s => s.LastupdateBy == detail.CreateBy) .SetColumns(s => s.LastupdateDate == DateTime.Now) .Where(s => s.Id == detail.Gid) .ExecuteCommand(); }); //if (FcheckResu.Equals("不合格")) // //自动生成入库检异常对策 // saveDetect02(detail.Gid, detail.CreateBy); var oqcReq = db.Queryable() .Where(s => s.Id == detail.Gid) .Select(s=>s.BillNo) .First(); if (oqcReq != null) { //FSTATUS //CHECK_RES db.Updateable() .SetColumns(s => s.Fstatus == 1) .SetColumns(s=>s.CheckRes == FcheckResu) .Where(s => s.BillNo == oqcReq) .ExecuteCommand(); } return useTransactionWithOracle; } public int saveDetect02(decimal? gid, string? createBy) { var db = SqlSugarHelper.GetInstance(); var qsItemOqcReq = db.Queryable().Single(s => s.Id == gid); var mesInvItemIns = db.Queryable() .Single(s => s.BillNo == qsItemOqcReq.BillNo); var mesSchemeResult = db.Queryable() .Single(s => s.Daa001 == mesInvItemIns.CbillNo); var entity = new MesQaItemsDetect02(); // entity.ItemNo = mesSchemeResult.BoardItem; // entity.BoardItem = mesSchemeResult.BoardItem; entity.LineNo = mesSchemeResult.Daa015; // entity.Aufnr = mesSchemeResult.TaskNo; entity.ReleaseNo = qsItemOqcReq.ReleaseNo; entity.LotNo = qsItemOqcReq.BillNo; entity.FcheckDate = qsItemOqcReq.FcheckDate; entity.FcheckMemo = qsItemOqcReq.Remarks; entity.Gid = qsItemOqcReq.Id; // entity.PlanQty = qsItemOqcReq.FcheckDate; entity.FcheckResu = "不合格"; entity.FcheckLevel = "严重"; entity.CreateDate = DateTime.Now; entity.Factory = "10000"; entity.Company = "1000"; entity.Ftype = "4"; entity.Fversion = 0; entity.Modify1Flag = 0; entity.IpqcStatus = 0; entity.Fsubmit = 1; entity.CreateBy = createBy; entity.FcheckBy = createBy; return SqlSugarHelper.UseTransactionWithOracle(db => db .Insertable(entity) .ExecuteCommand()); } public (List items, int TotalCount) getPage(XJPageResult queryObj) { var db = SqlSugarHelper.GetInstance(); var totalCount = 0; var qsItemOqcReqs = db.Queryable( (a, b, c, da, ca, m, l) => new JoinQueryInfos( JoinType.Left, a.ItemNo == b.Id.ToString(), JoinType.Left, a.BillNo == c.BillNo, JoinType.Left, da.Daa001 == c.RbillNo, JoinType.Left, c.TransctionNo == ca.TransactionNo.ToString() && c.Company == ca.Company && c.Factory == ca.Factory, JoinType.Left, m.ItemInId == c.Id, JoinType.Left, l.LineNo == da.Daa015 )) //.WhereIF(!"PL017".Equals(queryObj.createUser), // (a, b, c, da, ca, m) => lineNo.Contains(da.Daa015)) .WhereIF(!string.IsNullOrEmpty(queryObj.id), (a, b, c, da, ca, m, l) => a.Id.ToString() == queryObj.id) .WhereIF( StringUtil.IsNotNullOrEmpty(queryObj.result) && "未完成".Equals(queryObj.result), (a, b, c, da, ca, m, l) => a.FcheckResu == null) .WhereIF( StringUtil.IsNotNullOrEmpty(queryObj.result) && !"未完成".Equals(queryObj.result), (a, b, c, da, ca, m, l) => a.FcheckResu != null) .WhereIF( StringUtil.IsNotNullOrEmpty(queryObj.SearchValue), (a, b, c, da, ca, m, l) => a.ReleaseNo.Contains(queryObj.SearchValue) || b.ItemNo.Contains(queryObj.SearchValue) ) .Select((a, b, c, da, ca, m, l) => new QsItemOqcReq { BillNo = a.BillNo, Remarks = a.Remarks, Id = a.Id, CreateDate = a.CreateDate, CreateBy = a.CreateBy, FcheckResu = a.FcheckResu, ItemNo = b.ItemNo, FcheckBy = a.FcheckBy, FcheckDate = a.FcheckDate, ReleaseNo = a.ReleaseNo, ItemName = b.ItemName, ItemModel = b.ItemModel, TaskNo = c.RbillNo, //CbillNo = c.CbillNo, //LineNo = da.Daa015, LineNo = l.LineName, Quantity = m.Quantity }) .OrderBy(a => a.CreateDate, OrderByType.Desc) .ToPageList(queryObj.PageIndex, queryObj.Limit, ref totalCount); return (qsItemOqcReqs, totalCount); } //删除主表并且连级删除子表和孙表 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 RKJDto getXjDetail02ById(decimal? id) { var rkjDto = new RKJDto(); var db = SqlSugarHelper.GetInstance(); var qsItemOqcItem = db.Queryable().Single(s => s.Id == id); if (qsItemOqcItem.IsPass == 0) qsItemOqcItem.Result = "不合格"; else if (qsItemOqcItem.IsPass == 1) qsItemOqcItem.Result = "合格"; else qsItemOqcItem.Result = "未完成"; if (qsItemOqcItem.Picture is { Length: > 0 }) qsItemOqcItem.imageData = Convert.ToBase64String(qsItemOqcItem.Picture); //获取不合格数 var count = db.Queryable() .Where(s => s.Fstand == "×" && s.Pid == id).Count(); qsItemOqcItem.Unqualified = count; rkjDto.ItemXj01 = qsItemOqcItem; rkjDto.ItemXj02s = db.Queryable() .Where(s => s.Pid == id) .ToList(); return rkjDto; } public int UpdateQSItemDetail(QsItemOqcItemDetail 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(RKJDto 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(RKJDto 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(RKJDto 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 saveItem(RKJDto rkjDto) { var items = rkjDto.items; var userNo = rkjDto.userNo; SqlSugarHelper.UseTransactionWithOracle(db => { foreach (var item in items) item.Pid = rkjDto.gid; return db.Insertable(items).ExecuteCommand(); }); rkjDto.items = GetItems(rkjDto.gid, null); rkjDto.items.ForEach(s => { if (s.MaxValue != null || s.StandardValue != null || s.MinValue != null) return; var detail = new QsItemOqcItemDetail(); detail.Pid = s.Id; detail.Gid = rkjDto.gid; detail.Fstand = "√"; detail.FcheckResu = "1"; detail.UpdateBy = rkjDto.userNo; detail.count = (int?)s.LevelNum; SetQSItemDetail(detail); }); return Convert.ToInt32(rkjDto.gid); } public List GetRKDetail(RKJDto rkjDto) { //物料条码和物料编码,数量 MES_INV_ITEM_IN_C_DETAILS2 var db = SqlSugarHelper.GetInstance(); var oqcReq = db.Queryable() .Where(s => s.Id == rkjDto.gid) .Select(s => s.BillNo) .First(); if (oqcReq != null) { //FSTATUS //CHECK_RES var mesInvItemIns = db.Queryable() .Where(s => s.BillNo == oqcReq).First(); return db.Queryable() .Where(a=>a.ItemInId == mesInvItemIns.Id).ToList(); } return new List(); } }