using System.Data; using System.Xml; using System.Linq; using Masuit.Tools; using MES.Service.DB; using MES.Service.Dto.service; using MES.Service.Modes; using MES.Service.util; using SqlSugar; using Tea.Utils; using DbType = System.Data.DbType; namespace MES.Service.service.QC; public class LljService { public (List item, int TotalCount) GetPage(XJPageResult queryObj) { if (queryObj.createUser.IsNullOrEmpty()) return ([], 0); var db = SqlSugarHelper.GetInstance(); var id = Convert.ToDecimal(queryObj.id); var totalCount = 0; // 使用数据库分页查询,一次查询50条,提升性能 // 判断是否为管理员账号 bool isAdmin = queryObj.createUser == "PL017" || queryObj.createUser == "HMLYY" || queryObj.createUser == "HMCS"; List pageList; if (isAdmin) { // 管理员账号:直接查询主表,避免JOIN导致的重复记录 pageList = db.Queryable() .WhereIF( StringUtil.IsNotNullOrEmpty(queryObj.result) && "未完成".Equals(queryObj.result), a => a.FcheckResu == null) .WhereIF( StringUtil.IsNotNullOrEmpty(queryObj.result) && !"未完成".Equals(queryObj.result), a => a.FcheckResu != null) .WhereIF(id > 0, a => a.Id == id) //加筛选条件,根据选择的搜索字段进行精确搜索 .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 1, // 物料编号搜索 a => a.ItemNo != null && a.ItemNo.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 2, // 物料名称搜索 a => a.ItemName != null && a.ItemName.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 3, // 供应商搜索 a => a.SuppName != null && a.SuppName.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 4, // 到货单号搜索 a => a.LotNo != null && a.LotNo.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 5, // 检验单号搜索 a => a.ReleaseNo != null && a.ReleaseNo.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 6, // 物料规格搜索 a => a.ItemModel != null && a.ItemModel.ToLower().Contains(queryObj.SearchValue.ToLower())) .Select(a => new LtsLlj { Id = a.Id, ItemNo = a.ItemNo, ItemId = a.ItemId, ItemName = a.ItemName, ItemModel = a.ItemModel, SuppName = a.SuppName, LotNo = a.LotNo, ReleaseNo = a.ReleaseNo, FcheckResu = a.FcheckResu, CreateDate = a.CreateDate, FcovertQty = a.FcovertQty, DEPARTMENTNAME = a.DEPARTMENTNAME, FngDesc = a.FngDesc, UrgentFlag = a.UrgentFlag, Ftype = a.Ftype, LotNo1 = a.LotNo1, EMERGENCY = a.EMERGENCY, Status = a.Status, IqcDate = a.IqcDate, // 添加维护人员信息(管理员不需要此字段) Fcode = null, // 添加破坏实验数量 PHSY = a.PHSY, // 添加不良原因 BLYY = a.BLYY, // 添加所属车间 SSCJ = a.SSCJ, // 添加评审状态 PSZT = a.PSZT, // 添加检验项目维护状态 Jyxm = a.Jyxm }) .OrderBy("IQC_DATE DESC") .OrderBy("CASE WHEN EMERGENCY = 1 THEN 0 ELSE 1 END") .OrderBy("CASE WHEN JYXM = 0 THEN 0 ELSE 1 END") .OrderBy("CASE WHEN STATUS = '已提交' THEN 1 ELSE 0 END") .OrderBy("CREATE_DATE") .ToPageList(queryObj.PageIndex, queryObj.Limit, ref totalCount); } else { // 普通用户:使用JOIN查询,根据维护情况判断权限 pageList = db.Queryable((a, v) => new JoinQueryInfos(JoinType.Left, a.ItemNo == v.ItemNo)) .WhereIF( StringUtil.IsNotNullOrEmpty(queryObj.result) && "未完成".Equals(queryObj.result), (a, v) => a.FcheckResu == null) .WhereIF( StringUtil.IsNotNullOrEmpty(queryObj.result) && !"未完成".Equals(queryObj.result), (a, v) => a.FcheckResu != null) .WhereIF(id > 0, (a, v) => a.Id == id) // 权限控制:普通用户需要根据物料维护情况判断 .WhereIF(queryObj.UserIndex == "0", (a, v) => // 如果物料被维护,只有维护人员可以看到 (v.Fcode != null && v.Fcode == queryObj.createUser) || // 如果物料未被维护,所有人都可以看到 (v.Fcode == null)) //加筛选条件,根据选择的搜索字段进行精确搜索 .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 1, // 物料编号搜索 (a, v) => a.ItemNo != null && a.ItemNo.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 2, // 物料名称搜索 (a, v) => a.ItemName != null && a.ItemName.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 3, // 供应商搜索 (a, v) => a.SuppName != null && a.SuppName.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 4, // 到货单号搜索 (a, v) => a.LotNo != null && a.LotNo.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 5, // 检验单号搜索 (a, v) => a.ReleaseNo != null && a.ReleaseNo.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 6, // 物料规格搜索 (a, v) => a.ItemModel != null && a.ItemModel.ToLower().Contains(queryObj.SearchValue.ToLower())) .Select((a, v) => new LtsLlj { Id = a.Id, ItemNo = a.ItemNo, ItemId = a.ItemId, ItemName = a.ItemName, ItemModel = a.ItemModel, SuppName = a.SuppName, LotNo = a.LotNo, ReleaseNo = a.ReleaseNo, FcheckResu = a.FcheckResu, CreateDate = a.CreateDate, FcovertQty = a.FcovertQty, DEPARTMENTNAME = a.DEPARTMENTNAME, FngDesc = a.FngDesc, UrgentFlag = a.UrgentFlag, Ftype = a.Ftype, LotNo1 = a.LotNo1, EMERGENCY = a.EMERGENCY, Status = a.Status, IqcDate = a.IqcDate, // 添加维护人员信息 Fcode = v.Fcode, // 添加破坏实验数量 PHSY = a.PHSY, // 添加不良原因 BLYY = a.BLYY, // 添加所属车间 SSCJ = a.SSCJ, // 添加评审状态 PSZT = a.PSZT, // 添加检验项目维护状态 Jyxm = a.Jyxm }) .OrderBy("IQC_DATE DESC") .OrderBy("CASE WHEN EMERGENCY = 1 THEN 0 ELSE 1 END") .OrderBy("CASE WHEN JYXM = 0 THEN 0 ELSE 1 END") .OrderBy("CASE WHEN STATUS = '已提交' THEN 1 ELSE 0 END") .OrderBy("CREATE_DATE") .ToPageList(queryObj.PageIndex, queryObj.Limit, ref totalCount); } // 批量获取检验项目数量,避免N+1查询问题 if (pageList.Any()) { var releaseNos = pageList.Select(x => x.ReleaseNo).Distinct().ToList(); // 为每个检验单设置检验项目数量和NewFngDesc字段 foreach (var item in pageList) { var count = db.Queryable() .Where(x => x.ReleaseNo == item.ReleaseNo) .Count(); item.InspectionItemCount = count; item.NewFngDesc = item.FngDesc; } } // 计算所有数据的去重总数(不是当前页的去重数) int allDataQuery; if (isAdmin) { // 管理员账号:直接查询主表 allDataQuery = db.Queryable() .WhereIF( StringUtil.IsNotNullOrEmpty(queryObj.result) && "未完成".Equals(queryObj.result), a => a.FcheckResu == null) .WhereIF( StringUtil.IsNotNullOrEmpty(queryObj.result) && !"未完成".Equals(queryObj.result), a => a.FcheckResu != null) .WhereIF(id > 0, a => a.Id == id) //加筛选条件,根据选择的搜索字段进行精确搜索 .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 1, // 物料编号搜索 a => a.ItemNo != null && a.ItemNo.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 2, // 物料名称搜索 a => a.ItemName != null && a.ItemName.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 3, // 供应商搜索 a => a.SuppName != null && a.SuppName.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 4, // 到货单号搜索 a => a.LotNo != null && a.LotNo.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 5, // 检验单号搜索 a => a.ReleaseNo != null && a.ReleaseNo.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 6, // 物料规格搜索 a => a.ItemModel != null && a.ItemModel.ToLower().Contains(queryObj.SearchValue.ToLower())) .Select(a => a.ReleaseNo) .Distinct() .Count(); } else { // 普通用户:使用JOIN查询 allDataQuery = db.Queryable((a, v) => new JoinQueryInfos(JoinType.Left, a.ItemNo == v.ItemNo)) .WhereIF( StringUtil.IsNotNullOrEmpty(queryObj.result) && "未完成".Equals(queryObj.result), (a, v) => a.FcheckResu == null) .WhereIF( StringUtil.IsNotNullOrEmpty(queryObj.result) && !"未完成".Equals(queryObj.result), (a, v) => a.FcheckResu != null) .WhereIF(id > 0, (a, v) => a.Id == id) // 权限控制:普通用户需要根据物料维护情况判断 .WhereIF(queryObj.UserIndex == "0", (a, v) => // 如果物料被维护,只有维护人员可以看到 (v.Fcode != null && v.Fcode == queryObj.createUser) || // 如果物料未被维护,所有人都可以看到 (v.Fcode == null)) //加筛选条件,根据选择的搜索字段进行精确搜索 .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 1, // 物料编号搜索 (a, v) => a.ItemNo != null && a.ItemNo.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 2, // 物料名称搜索 (a, v) => a.ItemName != null && a.ItemName.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 3, // 供应商搜索 (a, v) => a.SuppName != null && a.SuppName.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 4, // 到货单号搜索 (a, v) => a.LotNo != null && a.LotNo.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 5, // 检验单号搜索 (a, v) => a.ReleaseNo != null && a.ReleaseNo.ToLower().Contains(queryObj.SearchValue.ToLower())) .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && queryObj.selectedIndex == 6, // 物料规格搜索 (a, v) => a.ItemModel != null && a.ItemModel.ToLower().Contains(queryObj.SearchValue.ToLower())) .Select((a, v) => a.ReleaseNo) .Distinct() .Count(); } var emergencyValues = pageList.Select(item => item.EMERGENCY).ToList(); return (pageList, allDataQuery); } //根据检验标准来计算检验个数 /// /// 调用存储过程,重新获取检验项目 /// /// /// /// /// public string[] SetItems(decimal itemNo, decimal quantity, string releaseNo) { // 定义输出参数 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_RELEASE_NO", releaseNo, DbType.String, ParameterDirection.Input), new("P_ITEM_ID", itemNo, DbType.String, ParameterDirection.Input), outputResult, outputMessage }; var db = SqlSugarHelper.GetInstance(); // 使用 SqlSugar 执行存储过程 db.Ado.ExecuteCommand( "BEGIN PRC_QA_ITEM_INSERT_BTN(:P_RELEASE_NO,:P_ITEM_ID, :o_Result, :o_Msg); END;", parameters.ToArray()); // 获取输出参数的值 var resultValue = outputResult.Value?.ToString(); var messageValue = outputMessage.Value?.ToString(); string[] msg = new string[2]; msg[0] = resultValue; msg[1] = messageValue; return msg; } //紧急放行 //public string[] EmergencyRelease(int id) //{ // var db = SqlSugarHelper.GetInstance(); // int emergencyStatus = db.Queryable() // .Where(t => t.Id == id) // .Select(t => t.EMERGENCY) // .First(); // if (emergencyStatus != 0) // { // return new string[] { "1", "非紧急状态,无法执行紧急放行" }; // } // var outputResult = new SugarParameter("PO_RESULT", null, // DbType.Int32, ParameterDirection.Output, 4000); // var outputMessage = new SugarParameter("PO_MSG", null, // DbType.String, ParameterDirection.Output, 4000); // var parameters = new List //{ // new("P_ID", id, DbType.Int32, ParameterDirection.Input), // outputResult, // outputMessage //}; // db.Ado.ExecuteCommand( // "BEGIN prc_MES_QA_ITEMS_update1(:P_ID, :PO_RESULT, :PO_MSG); END;", // parameters.ToArray()); // var lotNo1 = db.Queryable() // .Where(t => t.Id == id) // .Select(t => t.LotNo1) // .First(); // var resultValue = outputResult.Value?.ToString(); // var messageValue = outputMessage.Value?.ToString(); // return new string[] { resultValue, messageValue, lotNo1?.ToString() ?? "" }; //} //public string[] WithdrawEmergencyRelease(int id) //{ // var db = SqlSugarHelper.GetInstance(); // int emergencyStatus = db.Queryable() // .Where(t => t.Id == id) // .Select(t => t.EMERGENCY) // .First(); // if (emergencyStatus != 0) // { // return new string[] { "1", "非紧急状态,无需撤回" }; // } // var outputResult = new SugarParameter("PO_RESULT", null, // DbType.Int32, ParameterDirection.Output, 4000); // var outputMessage = new SugarParameter("PO_MSG", null, // DbType.String, ParameterDirection.Output, 4000); // var parameters = new List //{ // new("P_ID", id, DbType.Int32, ParameterDirection.Input), // outputResult, // outputMessage //}; // db.Ado.ExecuteCommand( // "BEGIN prc_MES_QA_ITEMS_update2(:P_ID, :PO_RESULT, :PO_MSG); END;", // parameters.ToArray()); // var lotNo1 = db.Queryable() // .Where(t => t.Id == id) // .Select(t => t.LotNo1) // .First(); // var resultValue = outputResult.Value?.ToString(); // var messageValue = outputMessage.Value?.ToString(); // return new string[] { resultValue, messageValue, lotNo1?.ToString() ?? "" }; //} public string[] EmergencyRelease(int id) { var db = SqlSugarHelper.GetInstance(); int emergencyStatus = db.Queryable() .Where(t => t.Id == id) .Select(t => t.EMERGENCY) .First(); if (emergencyStatus != 0) { return new string[] { "1", "非紧急状态,无法执行紧急放行" }; } var outputResult = new SugarParameter("PO_RESULT", null, DbType.Int32, ParameterDirection.Output, 4000); var outputMessage = new SugarParameter("PO_MSG", null, DbType.String, ParameterDirection.Output, 4000); var parameters = new List { new("P_ID", id, DbType.Int32, ParameterDirection.Input), outputResult, outputMessage }; db.Ado.ExecuteCommand( "BEGIN prc_MES_QA_ITEMS_update1(:P_ID, :PO_RESULT, :PO_MSG); END;", parameters.ToArray()); var lotNo1 = db.Queryable() .Where(t => t.Id == id) .Select(t => t.LotNo1) .First(); var resultValue = outputResult.Value?.ToString(); var messageValue = outputMessage.Value?.ToString(); return new string[] { resultValue, messageValue, lotNo1?.ToString() ?? "" }; } public string[] WithdrawEmergencyRelease(int id) { var db = SqlSugarHelper.GetInstance(); int emergencyStatus = db.Queryable() .Where(t => t.Id == id) .Select(t => t.EMERGENCY) .First(); if (emergencyStatus != 0) { return new string[] { "1", "非紧急状态,无需撤回" }; } var outputResult = new SugarParameter("PO_RESULT", null, DbType.Int32, ParameterDirection.Output, 4000); var outputMessage = new SugarParameter("PO_MSG", null, DbType.String, ParameterDirection.Output, 4000); var parameters = new List { new("P_ID", id, DbType.Int32, ParameterDirection.Input), outputResult, outputMessage }; db.Ado.ExecuteCommand( "BEGIN prc_MES_QA_ITEMS_update2(:P_ID, :PO_RESULT, :PO_MSG); END;", parameters.ToArray()); var lotNo1 = db.Queryable() .Where(t => t.Id == id) .Select(t => t.LotNo1) .First(); var resultValue = outputResult.Value?.ToString(); var messageValue = outputMessage.Value?.ToString(); return new string[] { resultValue, messageValue, lotNo1?.ToString() ?? "" }; } 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 GetAttachments(string ItemNo) { //if (string.IsNullOrEmpty(ItemNo)) //{ // throw new ArgumentException("检验单号不能为空"); //} var db = SqlSugarHelper.GetInstance(); try { return db.Queryable() .Where(x => x.ItemNo == ItemNo) .OrderBy(x => x.Fdate, OrderByType.Desc) // .ThenBy(x => x.CreateDate, OrderByType.Desc) .Select(x => new QamftpDto { Id = x.Id, itemNo = x.ItemNo, Ftype = x.Ftype, Fattach = x.Fattach, Fversion = x.Fversion, Fdate = x.Fdate, CreateBy = x.CreateBy, CreateDate = x.CreateDate, Company = x.Company, Factory = x.Factory, F_type = x.F_type, LastupdateBy = x.LastupdateBy, LastupdateDate = x.LastupdateDate, ItemId = x.ItemId }).ToList(); } catch (Exception ex) { throw new Exception($"查询附件信息失败: {ex.Message}"); } } public byte[] GetFtpFile(string itemNo, string fileName, string ftpServer) { // 参数验证 if (string.IsNullOrEmpty(itemNo) || string.IsNullOrEmpty(fileName) || string.IsNullOrEmpty(ftpServer)) { throw new ArgumentException("参数不能为空: itemNo, fileName, ftpServer"); } string ftpUser = "hm_ftp"; string ftpPwd = "dell_123"; // 标准化FTP服务器地址 string normalizedServer = NormalizeFtpServer(ftpServer); // 构建FTP文件路径 string ftpPath = $"{normalizedServer}/IQC/{itemNo}/{fileName}"; try { var request = (System.Net.FtpWebRequest)System.Net.WebRequest.Create(ftpPath); request.Method = System.Net.WebRequestMethods.Ftp.DownloadFile; request.Credentials = new System.Net.NetworkCredential(ftpUser, ftpPwd); request.UseBinary = true; request.UsePassive = false; request.Timeout = 30000; // 30秒超时 request.ReadWriteTimeout = 30000; using (var response = (System.Net.FtpWebResponse)request.GetResponse()) using (var ftpStream = response.GetResponseStream()) using (var ms = new System.IO.MemoryStream()) { if (ftpStream == null) { throw new Exception("FTP响应流为空"); } ftpStream.CopyTo(ms); var fileBytes = ms.ToArray(); if (fileBytes.Length == 0) { return null; // 文件为空或不存在 } return fileBytes; } } catch (System.Net.WebException ex) { if (ex.Response is System.Net.FtpWebResponse ftpResponse) { switch (ftpResponse.StatusCode) { case System.Net.FtpStatusCode.ActionNotTakenFileUnavailable: return null; // 文件不存在 case System.Net.FtpStatusCode.NotLoggedIn: throw new Exception("FTP认证失败,请检查用户名和密码"); case System.Net.FtpStatusCode.ActionNotTakenFilenameNotAllowed: throw new Exception("文件名不被允许或路径无效"); default: throw new Exception($"FTP错误 ({ftpResponse.StatusCode}): {ftpResponse.StatusDescription}"); } } // 处理超时和网络错误 if (ex.Status == System.Net.WebExceptionStatus.Timeout) { throw new Exception("FTP连接超时,请稍后重试"); } throw new Exception($"FTP连接失败: {ex.Message}"); } catch (Exception ex) { throw new Exception($"获取文件失败: {ex.Message}"); } } private string NormalizeFtpServer(string ftpServer) { if (string.IsNullOrEmpty(ftpServer)) { throw new ArgumentException("FTP服务器地址不能为空"); } // 确保以ftp://开头 string normalizedServer = ftpServer.StartsWith("ftp://") ? ftpServer : $"ftp://{ftpServer}"; // 特殊处理已知服务器地址 if (normalizedServer == "ftp://36.26.21.214") { normalizedServer = "ftp://36.26.21.214:21"; } else if (!normalizedServer.Contains(":") && normalizedServer.StartsWith("ftp://")) { normalizedServer += ":21"; // 默认FTP端口 } // 开发环境使用本地服务器 normalizedServer = "ftp://192.168.1.22:21"; return normalizedServer; } public string GetContentType(string fileName) { if (string.IsNullOrEmpty(fileName)) return "application/octet-stream"; var extension = System.IO.Path.GetExtension(fileName).ToLower(); return extension switch { // PDF文件 ".pdf" => "application/pdf", // 图片文件 ".jpg" or ".jpeg" => "image/jpeg", ".png" => "image/png", ".gif" => "image/gif", ".bmp" => "image/bmp", ".webp" => "image/webp", ".svg" => "image/svg+xml", ".ico" => "image/x-icon", // 文本文件 ".txt" => "text/plain; charset=utf-8", ".log" => "text/plain; charset=utf-8", ".md" => "text/markdown; charset=utf-8", ".csv" => "text/csv; charset=utf-8", ".xml" => "text/xml; charset=utf-8", ".json" => "application/json; charset=utf-8", // Office文档 ".doc" => "application/msword", ".docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document", ".xls" => "application/vnd.ms-excel", ".xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ".ppt" => "application/vnd.ms-powerpoint", ".pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation", // 压缩文件 ".zip" => "application/zip", ".rar" => "application/x-rar-compressed", ".7z" => "application/x-7z-compressed", // 其他常见格式 ".dwg" => "application/acad", ".dxf" => "application/dxf", ".step" or ".stp" => "application/step", ".iges" or ".igs" => "application/iges", // 默认二进制流 _ => "application/octet-stream" }; } public int saveItem(LLJDto rkjDto) { var items = rkjDto.items; var userNo = rkjDto.userNo; SqlSugarHelper.UseTransactionWithOracle(db => { foreach (var item in items) item.ReleaseNo = rkjDto.releaseNo; return db.Insertable(items).ExecuteCommand(); }); rkjDto.items = GetItems(rkjDto.releaseNo, null); var db = SqlSugarHelper.GetInstance(); rkjDto.items.ForEach(s => { if (s.FupAllow != null || s.Fstand != null || s.FdownAllow != null) return; // 没有录入参考值,判断有多少个NG,那么录入的抽检结果必须是OK或者NG,NG代表不合格 var ifck = db.Queryable() .Where(x => x.FcheckResu == "NG" && x.MainId == s.Id).Count(); //检验明细总数 var count = db.Queryable() .Where(x1 => x1.MainId == s.Id).Count(); if (ifck > s.FreQty && s.CheckQyt == count) s.FcheckResu = "不合格"; else if (ifck < s.FreQty && s.CheckQyt == count) s.FcheckResu = "合格"; else s.FcheckResu = "未完成"; var detail = new MesQaItemsDetectDetail12(); detail.MainId = s.Id; detail.ReleaseNo = rkjDto.releaseNo; detail.Fstand = "√"; detail.FcheckResu = "OK"; detail.LastupdateBy = rkjDto.userNo; detail.count = (int?)s.CheckQyt; SetQSItemDetail(detail); }); return Convert.ToInt32(rkjDto.gid); } public List GetItems(string? releaseNo, decimal? id) { var db = SqlSugarHelper.GetInstance(); return db.Queryable( (a, b) => new JoinQueryInfos(JoinType.Left, a.Id == b.MainId)) .Where((a, b) => a.ReleaseNo == releaseNo) // .WhereIF(id > 0, (a, b) => a.Id == id) .GroupBy((a, b) => new { a.Id, a.ReleaseNo, a.FacLevel, a.FcheckItem, a.FcheckTool, a.FdownAllow, a.FcheckLevel, a.Fstand, a.FupAllow, a.SampleSizeNo, a.FspecRequ, a.FreQty, a.CheckQyt, a.FcheckResu, a.FcheckItemDesc, a.Funit, a.Meom }).Select((a, b) => new MesQaItemsDetectDetail5 { Id = a.Id, ReleaseNo = a.ReleaseNo, CheckQyt = a.CheckQyt, FacLevel = a.FacLevel, FcheckItem = a.FcheckItem, FcheckTool = a.FcheckTool, FdownAllow = a.FdownAllow, FcheckLevel = a.FcheckLevel, Fstand = a.Fstand, FupAllow = a.FupAllow, SampleSizeNo = a.SampleSizeNo, FspecRequ = a.FspecRequ, FreQty = a.FreQty, Factory = "1000", Company = "1000", FenterQty = SqlFunc.AggregateCount(b.Id), FcheckResu = a.FcheckResu, // FcheckItemDesc = a.FcheckItemDesc FcheckItemDesc = a.FspecRequ, Funit = a.Funit, Meom = a.Meom, }).OrderBy(a => SqlFunc.IIF(a.Fstand != null, 0, 1)).OrderBy(a => a.FcheckItem, OrderByType.Desc).ToList(); } public int SetQSItemDetail(MesQaItemsDetectDetail12 detail) { var dbd = SqlSugarHelper.GetInstance(); var oracle = SqlSugarHelper.UseTransactionWithOracle(db => { List result = new(); for (var i = 0; i < detail.count; i++) { var item = new MesQaItemsDetectDetail12(); item.MainId = detail.MainId; item.ReleaseNo = detail.ReleaseNo; item.Fstand = detail.Fstand; item.FcheckResu = detail.FcheckResu; item.CreateBy = detail.LastupdateBy; item.CreateDate = DateTime.Now; item.Factory = "1000"; item.Company = "1000"; result.Add(item); } return db.Insertable(result).ExecuteCommand(); }); detail.CreateBy = detail.LastupdateBy; autoResult(detail); return oracle; } private int autoResult(MesQaItemsDetectDetail12 detail) { var db = SqlSugarHelper.GetInstance(); // Single 没有查询到结果时返回Null,如果结果大于1条会抛出错误 var QsItemOqcItem = db.Queryable() .Single(s => s.Id == detail.MainId); if (QsItemOqcItem == null) return 0; //查询这个检验项目下的检验结果 var count = db.Queryable() .Where(s => s.MainId == detail.MainId).Count(); updateDetail5(detail); var result = ""; //检验实际结果不等于应该检验的个数时直接推出 if (QsItemOqcItem.CheckQyt != count) return 0; //合格的有多少个 var passCount = db.Queryable() .Where(s => s.MainId == detail.MainId && s.Fstand == "√").Count(); //不合格的有多少个 var noCount = db.Queryable() .Where(s => s.MainId == detail.MainId && s.Fstand == "×").Count(); if (count == passCount) result = "合格"; //else if (count - passCount < QsItemOqcItem.FreQty) // result = "不合格"; else if (noCount >= QsItemOqcItem.FreQty) result = "不合格"; var useTransactionWithOracle = SqlSugarHelper.UseTransactionWithOracle( db => { var commit = 0; commit += db.Updateable() .SetColumns(s => s.FcheckResu == result) .SetColumns(s => s.FenterQty == count) .Where(s => s.Id == detail.MainId) .ExecuteCommand(); return commit; }); //5.20xwt修改将更新主表检验结果字段放在IqcQaSubmit方法下 /*var isNull = db.Queryable() .Where(s => s.ReleaseNo == detail.ReleaseNo && s.FcheckResu == null) .Count(); if (isNull > 0) return 1; //获取检验单的检验项目的个数 var sum = db.Queryable() .Where(s => s.ReleaseNo == detail.ReleaseNo).Count(); if (sum == 0) return 1; //获取检验单下的合格的检验项目个数 var icount = db.Queryable() .Where(s => s.ReleaseNo == detail.ReleaseNo && s.FcheckResu == "合格") .Count(); var FcheckResu = "不合格"; //实际个数等于理论个数时对检验单进行判定 if (sum == icount) //合格的检验结果等于总检验数视为合格 FcheckResu = "合格"; var sysUser = db.Queryable() .Where(s => s.Fcode == detail.CreateBy).First(); SqlSugarHelper.UseTransactionWithOracle(db => { return db.Updateable() .SetColumns(s => s.FcheckResu == FcheckResu) .SetColumns(s => s.FcheckDate == DateTime.Now) .SetColumns(s => s.FcheckBy == sysUser.Fname) .SetColumns(s => s.LastupdateBy == detail.CreateBy) .SetColumns(s => s.LastupdateDate == DateTime.Now) .Where(s => s.ReleaseNo == detail.ReleaseNo) .ExecuteCommand(); });*/ // if (FcheckResu.Equals("不合格")) //自动生成入库检异常对策 /// saveDetect02(detail.Id, detail.CreateBy); 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.BillNo == mesInvItemIns.CbillNo); var entity = new MesQaItemsDetect02(); entity.ItemNo = mesSchemeResult.BoardItem; entity.BoardItem = mesSchemeResult.BoardItem; entity.LineNo = mesSchemeResult.LineNo; 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 LLJDto getXjDetail02ById(decimal? id) { var rkjDto = new LLJDto(); 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.MainId == id).Count(); qsItemOqcItem.Unqualified = count; rkjDto.ItemXj01 = qsItemOqcItem; rkjDto.ItemXj02s = db.Queryable() .Where(s => s.MainId == id) .ToList(); return rkjDto; } public int UpdateQSItemDetail(MesQaItemsDetectDetail12 detail) { var withOracle = SqlSugarHelper.UseTransactionWithOracle(db => { return db.Updateable() .SetColumns(s => s.LastupdateBy == detail.LastupdateBy) // .SetColumns(s => s.LastupdateDate == 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.MainId == detail.MainId && s.Id == detail.Id) .ExecuteCommand(); }); detail.CreateBy = detail.LastupdateBy; withOracle += autoResult(detail); return withOracle; } //更新检验明细已检、不合格数量 private int updateDetail5(MesQaItemsDetectDetail12 detail) { var db = SqlSugarHelper.GetInstance(); //查询这个检验项目下的检验数量 var count = db.Queryable() .Where(s => s.MainId == detail.MainId).Count(); //获取不合格数 var countNo = db.Queryable() .Where(s => s.MainId == detail.MainId && s.Fstand == "×").Count(); //更新检验明细已检数量 var withOracle = SqlSugarHelper.UseTransactionWithOracle(db => { return db.Updateable() .SetColumns(s => s.FenterQty == count) .SetColumns(s => s.FngQty == countNo) .Where(s => s.Id == detail.MainId) .ExecuteCommand(); }); return withOracle; } //主表修改字段 public int saveRemarksGid(LLJDto dto) { return SqlSugarHelper.UseTransactionWithOracle(db => { return db.Updateable() .SetColumns(it => it.FngDesc == dto.Remarks) .Where(it => it.ReleaseNo == dto.releaseNo) .ExecuteCommand(); }); } //主表修改破坏实验 public int savePhsyGid(LLJDto dto) { return SqlSugarHelper.UseTransactionWithOracle(db => { return db.Updateable() .SetColumns(it => it.PHSY == dto.PHSY) .Where(it => it.ReleaseNo == dto.releaseNo) .ExecuteCommand(); }); } // 主表修改下拉框字段 public int saveDropdownFields(LLJDto dto) { return SqlSugarHelper.UseTransactionWithOracle(db => { return db.Updateable() .SetColumns(it => it.BLYY == dto.BLYY) .SetColumns(it => it.PSZT == dto.PSZT) .SetColumns(it => it.SSCJ == dto.SSCJ) .Where(it => it.ReleaseNo == dto.releaseNo) .ExecuteCommand(); }); } //子表修改备注字段 public int saveRemarksPid(LLJDto dto) { return SqlSugarHelper.UseTransactionWithOracle(db => { return db.Updateable() .SetColumns(it => new MesQaItemsDetectDetail5 { Funit = dto.Remarks, Meom = dto.Meom }) .Where(it => it.Id == dto.pid) .ExecuteCommand(); }); } //删除主表并且连级删除子表和孙表 public int removeXJ(string? releaseNo) { var withOracle = SqlSugarHelper.UseTransactionWithOracle(db => { var commit = 0; //删除主表 commit += db.Deleteable() .Where(s => s.ReleaseNo == releaseNo) .ExecuteCommand(); //删除子表 commit += db.Deleteable() .Where(s => s.ReleaseNo == releaseNo) .ExecuteCommand(); //删除孙表 commit += db.Deleteable() .Where(s => s.ReleaseNo == releaseNo) .ExecuteCommand(); return commit; }); return withOracle; } public bool IqcQaSubmit(LLJDto dto) { var (factory, company) = UserUtil.GetFactory(dto.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("PI_FACTORY", factory, DbType.String, ParameterDirection.Input), new("PI_COMPANY", company, DbType.String, ParameterDirection.Input), new("p_Release_No", dto.releaseNo, DbType.String, ParameterDirection.Input), new("p_User", dto.userNo, DbType.String, ParameterDirection.Input), outputResult, outputMessage }; var db = SqlSugarHelper.GetInstance(); // 使用 SqlSugar 执行存储过程 db.Ado.ExecuteCommand( "BEGIN Prc_Mes_Iqc_Qa_Submit83(:PI_FACTORY, :PI_COMPANY, :p_Release_No, :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); var sum = db.Queryable() .Where(s => s.ReleaseNo == dto.releaseNo).Count(); if (sum == 0) return true; var icount = db.Queryable() .Where(s => s.ReleaseNo == dto.releaseNo && s.FcheckResu == "合格") .Count(); var FcheckResu = "不合格"; if (sum == icount) FcheckResu = "合格"; var sysUser = db.Queryable() .Where(s => s.Fcode == dto.userNo).First(); SqlSugarHelper.UseTransactionWithOracle(db => { return db.Updateable() .SetColumns(s => s.FcheckResu == FcheckResu) .SetColumns(s => s.FcheckDate == DateTime.Now) .SetColumns(s => s.FcheckBy == sysUser.Fname) .SetColumns(s => s.LastupdateBy == dto.userNo) .SetColumns(s => s.LastupdateDate == DateTime.Now) .Where(s => s.ReleaseNo == dto.releaseNo) .ExecuteCommand(); }); return true; } catch (Exception ex) { throw new Exception(ex.Message); } } public List GetWomdab(string daa001) { //if (string.IsNullOrEmpty(ItemNo)) //{ // throw new ArgumentException("检验单号不能为空"); //} var db = SqlSugarHelper.GetInstance(); try { return db.Queryable() .LeftJoin((w, m) => w.Dab003 == m.ItemId.ToString()) // 需要替换为实际的关联字段 .Where((w, m) => w.Dab001 == daa001) .OrderBy((w, m) => w.Dab003, OrderByType.Desc) // .ThenBy((w, m) => w.CreateDate, OrderByType.Desc) .Select((w, m) => new MesItems { ItemNo = m.ItemNo, ItemName = m.ItemName, ItemModel = m.ItemModel }).ToList(); } catch (Exception ex) { throw new Exception($"查询附件信息失败: {ex.Message}"); } } public List GetWomdabById(string daa001,string ItemNo) { //if (string.IsNullOrEmpty(ItemNo)) //{ // throw new ArgumentException("检验单号不能为空"); //} var db = SqlSugarHelper.GetInstance(); try { return db.Queryable() .LeftJoin((w, m) => w.Dab003 == m.ItemId.ToString()) // 需要替换为实际的关联字段 .Where((w, m) => w.Dab001 == daa001 && m.ItemNo.Contains(ItemNo)) .OrderBy((w, m) => w.Dab003, OrderByType.Desc) // .ThenBy((w, m) => w.CreateDate, OrderByType.Desc) .Select((w, m) => new MesItems { ItemNo = m.ItemNo, ItemName = m.ItemName, ItemModel = m.ItemModel }).ToList(); } catch (Exception ex) { throw new Exception($"查询附件信息失败: {ex.Message}"); } } /// /// 根据二维码查询物料信息 /// /// 二维码内容 /// 当前检验单的到货单号(已废弃,保留参数兼容性) /// 物料信息 public List GetMaterialByBarcode(string itemBarcode, string currentBillNo) { var db = SqlSugarHelper.GetInstance(); try { // 使用JOIN查询MES_INV_ITEM_BARCODES和MES_ITEMS表 var materialInfo = db.Queryable() .LeftJoin((b, m) => b.ItemId == m.Id) .Where((b, m) => b.ItemBarcode == itemBarcode && b.ComeFlg == 1) .Select((b, m) => new MaterialInfoDto { ItemNo = b.ItemNo, // 物料编码 OldQty = b.Oldqty, // 数量 ItemId = b.ItemId, // 物料ID ItemName = m.ItemName, // 物料名称 ItemModel = m.ItemModel, // 规格型号 BillNo = b.BillNo // 到货单号 }) .ToList(); // 移除到货单号校验,直接返回查询结果 return materialInfo; } catch (Exception ex) { throw new Exception($"查询物料信息失败: {ex.Message}"); } } /// /// 查询破坏实验记录是否存在 /// /// 到货单号 /// 检验单号 /// 是否存在记录 public bool CheckPhsyRecordExists(string billNo, string releaseNo) { var db = SqlSugarHelper.GetInstance(); try { var count = db.Queryable() .Where(x => x.BillNo == billNo && x.ReleaseNo == releaseNo) .Count(); return count > 0; } catch (Exception ex) { throw new Exception($"查询破坏实验记录失败: {ex.Message}"); } } /// /// 获取破坏实验记录详细信息 /// /// 到货单号 /// 检验单号 /// 破坏实验记录信息 public List GetPhsyRecordInfo(string billNo, string releaseNo) { var db = SqlSugarHelper.GetInstance(); try { // 先查询破坏实验记录 var phsyRecords = db.Queryable() .Where(x => x.BillNo == billNo && x.ReleaseNo == releaseNo) .ToList(); var result = new List(); foreach (var record in phsyRecords) { // 尝试通过条码查询物料信息 var materialInfo = db.Queryable() .LeftJoin((b, m) => b.ItemId == m.Id) .Where((b, m) => b.ItemBarcode == record.ItemBarcode) .Select((b, m) => new { ItemNo = b.ItemNo, ItemName = m.ItemName, ItemModel = m.ItemModel }) .First(); var dto = new PhsyRecordInfoDto { ItemBarcode = record.ItemBarcode, ItemNo = materialInfo?.ItemNo ?? record.ItemBarcode, ItemName = materialInfo?.ItemName ?? "已记录物料", ItemModel = materialInfo?.ItemModel ?? "已记录规格", BillNo = record.BillNo, Yqty = record.Yqty, Cqty = record.Cqty, CreateDate = record.CreateDate }; result.Add(dto); } return result; } catch (Exception ex) { throw new Exception($"获取破坏实验记录信息失败: {ex.Message}"); } } /// /// 调用破坏实验存储过程 /// /// 扫描的条码值 /// 扫码查询出来的条码数量 /// 填写的破坏实验数量 /// 查询到的到货单号 /// 操作类型:1新增,2修改,3删除 /// 检验单号 /// 物料ID /// 执行结果 public (int result, string message) CallPhsyUpdateProcedure(string itemBarcode, decimal yqty, decimal cqty, string billNo, int lx, string releaseNo, decimal? itemId = null) { var db = SqlSugarHelper.GetInstance(); try { // 定义输入参数 var inputParam1 = new SugarParameter("P_ITEM_BARCODE", itemBarcode, DbType.String, ParameterDirection.Input); var inputParam2 = new SugarParameter("P_YQTY", yqty, DbType.Decimal, ParameterDirection.Input); var inputParam3 = new SugarParameter("P_CQTY", cqty, DbType.Decimal, ParameterDirection.Input); var inputParam4 = new SugarParameter("P_BILL_NO", billNo, DbType.String, ParameterDirection.Input); var inputParam5 = new SugarParameter("P_LX", lx, DbType.Int32, ParameterDirection.Input); var inputParam6 = new SugarParameter("ITEM_ID", itemId ?? 0, DbType.Decimal, ParameterDirection.Input); var inputParam7 = new SugarParameter("P_RELEASE_NO", releaseNo, DbType.String, ParameterDirection.Input); // 定义输出参数 var outputResult = new SugarParameter("PO_RESULT", null, DbType.Int32, ParameterDirection.Output); var outputMessage = new SugarParameter("PO_MSG", null, DbType.String, ParameterDirection.Output, 4000); // 使用SqlSugar执行存储过程 db.Ado.ExecuteCommand("BEGIN PRC_INV_PHSYUPDATE(:P_ITEM_BARCODE, :P_YQTY, :P_CQTY, :P_BILL_NO, :P_LX, :ITEM_ID, :P_RELEASE_NO, :PO_RESULT, :PO_MSG); END;", inputParam1, inputParam2, inputParam3, inputParam4, inputParam5, inputParam6, inputParam7, outputResult, outputMessage); // 获取输出参数的值 var result = outputResult.Value == null ? 1 : Convert.ToInt32(outputResult.Value); var message = outputMessage.Value?.ToString() ?? ""; return (result, message); } catch (Exception ex) { return (1, $"调用存储过程失败: {ex.Message}"); } } /// /// 设置堵穴信息 /// /// 检验单号 /// 堵穴信息,格式如"1,2,3" /// 检验项目ID /// 执行结果 public (int result, string message) SetBlockedHoles(string releaseNo, string blockedHoles, decimal itemId) { var db = SqlSugarHelper.GetInstance(); try { // 解析堵穴信息 var blockedHolesList = blockedHoles.Split(',', ',') .Select(s => s.Trim()) .Where(s => !string.IsNullOrEmpty(s)) .Select(s => int.Parse(s)) .ToList(); // 获取检验项目信息 var item = db.Queryable() .Where(x => x.Id == itemId && x.ReleaseNo == releaseNo) .First(); if (item == null) { return (1, "检验项目不存在"); } // 解析开穴数 var holeCount = ParseHoleCount(item.FcheckItem); if (holeCount == 0) { return (1, "该检验项目没有穴数信息"); } // 验证堵穴数量不能大于等于开穴数 if (blockedHolesList.Count >= holeCount) { return (1, $"堵穴数量不能大于等于开穴数({holeCount})"); } // 验证堵穴号是否在有效范围内 foreach (var hole in blockedHolesList) { if (hole < 1 || hole > holeCount) { return (1, $"堵穴号必须在1-{holeCount}之间"); } } // 计算新的检验数量 var newCheckQyt = item.CheckQyt - (item.CheckQyt / holeCount) * blockedHolesList.Count; // 更新数据库 var result = SqlSugarHelper.UseTransactionWithOracle(db => { return db.Updateable() .SetColumns(x => x.Dnum == blockedHoles) .SetColumns(x => x.CheckQyt == newCheckQyt) .Where(x => x.Id == itemId && x.ReleaseNo == releaseNo) .ExecuteCommand(); }); if (result > 0) { return (0, "堵穴设置成功"); } else { return (1, "堵穴设置失败"); } } catch (Exception ex) { return (1, $"设置堵穴失败: {ex.Message}"); } } /// /// 解析检验项目名称中的穴数 /// /// 检验项目名称 /// 穴数,如果没有穴数信息返回0 private int ParseHoleCount(string checkItemName) { if (string.IsNullOrEmpty(checkItemName)) return 0; // 匹配格式:尺寸检查(5穴)或 尺寸检查(5穴) var match = System.Text.RegularExpressions.Regex.Match(checkItemName, @"[((](\d+)穴[))]"); return match.Success ? int.Parse(match.Groups[1].Value) : 0; } }