From 980648fa6e48c4418a86765d1c25f0eecfad25c5 Mon Sep 17 00:00:00 2001 From: wendy <408182087@qq.com> Date: Wed, 2 Jul 2025 09:54:42 +0800 Subject: [PATCH 1/6] =?UTF-8?q?20250702=20=E4=BF=AE=E6=94=B9=E5=A7=94?= =?UTF-8?q?=E6=89=98=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HJGL/NDT/NDTBatchImport.aspx.cs | 632 +++++++++++++----- .../HJGL/PointTrust/TrustBatch.aspx.cs | 10 +- 2 files changed, 484 insertions(+), 158 deletions(-) diff --git a/SGGL/FineUIPro.Web/HJGL/NDT/NDTBatchImport.aspx.cs b/SGGL/FineUIPro.Web/HJGL/NDT/NDTBatchImport.aspx.cs index b080ccd1..bb89fc04 100644 --- a/SGGL/FineUIPro.Web/HJGL/NDT/NDTBatchImport.aspx.cs +++ b/SGGL/FineUIPro.Web/HJGL/NDT/NDTBatchImport.aspx.cs @@ -1,6 +1,7 @@ using BLL; using MiniExcelLibs; using Model; +using NPOI.SS.Util; using System; using System.Collections.Generic; using System.Data; @@ -141,19 +142,6 @@ namespace FineUIPro.Web.HJGL.NDT { if (e.EventArgument == "Confirm_OK") { - //string rootPath = Server.MapPath("~/"); - //string uploadfilepath = rootPath + Const.NDTBatchTemplateUrl; - //string filePath = Const.NDTBatchTemplateUrl; - //string fileName = Path.GetFileName(filePath); - //FileInfo info = new FileInfo(uploadfilepath); - //long fileSize = info.Length; - //Response.ClearContent(); - //Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); - //Response.ContentType = "excel/plain"; - //Response.ContentEncoding = System.Text.Encoding.UTF8; - //Response.AddHeader("Content-Length", fileSize.ToString().Trim()); - //Response.TransmitFile(uploadfilepath, 0, fileSize); - //Response.End(); string rootPath = Server.MapPath("~/"); string initTemplatePath = Const.NDTBatchTemplateUrl; string uploadfilepath = string.Empty; @@ -177,8 +165,8 @@ namespace FineUIPro.Web.HJGL.NDT NPOI.SS.UserModel.IWorkbook workbook; using (FileStream stream = new FileStream(newUrl, FileMode.Open, FileAccess.Read)) { - workbook = new NPOI.XSSF.UserModel.XSSFWorkbook(stream); - //workbook = new NPOI.HSSF.UserModel.HSSFWorkbook(stream); + workbook = new NPOI.XSSF.UserModel.XSSFWorkbook(stream);//.xlsx + //workbook = new NPOI.HSSF.UserModel.HSSFWorkbook(stream);//.xls } // 创建单元格样式 NPOI.SS.UserModel.ICellStyle cellStyle = workbook.CreateCellStyle(); @@ -188,17 +176,34 @@ namespace FineUIPro.Web.HJGL.NDT cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; cellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center; - cellStyle.WrapText = true;//自动换行 + cellStyle.WrapText = true;//自动换行 var font = workbook.CreateFont(); font.FontHeightInPoints = 10; cellStyle.SetFont(font); - // 第二步:创建新数据行 + //尾部样式 + NPOI.SS.UserModel.ICellStyle bottomStyle = workbook.CreateCellStyle(); + bottomStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin; + bottomStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; + bottomStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; + bottomStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; + bottomStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left; + bottomStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Top; + bottomStyle.WrapText = true;//自动换行 + var bottomfont = workbook.CreateFont(); + bottomfont.FontHeightInPoints = 10; + bottomStyle.SetFont(bottomfont); + + //第二步:创建新数据行 NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0); NPOI.SS.UserModel.IRow row = sheet.GetRow(0); NPOI.SS.UserModel.ICell cell; - // 添加数据 + //设置生成下拉框的行和列 + SetCellDropdownList(sheet, 6, 6, new List() { "合格", "不合格" }.ToArray());//是否合格 + SetCellDropdownList(sheet, 7, 7, new List() { "Ⅰ", "Ⅱ", "Ⅲ", "Ⅳ", "Ⅴ" }.ToArray());//评定级别 + + //添加数据 cell = row.CreateCell(7); cell.CellStyle = cellStyle; cell.SetCellValue(batchTrust.ProjectName);//工程名称 @@ -244,63 +249,351 @@ namespace FineUIPro.Web.HJGL.NDT if (!string.IsNullOrEmpty(batchTrustItemLists.FirstOrDefault().GrooveTypeCode)) { cell.SetCellValue(batchTrustItemLists.FirstOrDefault().GrooveTypeCode);//坡口形式 - } + } cell = row5.CreateCell(7); cell.CellStyle = cellStyle; cell.SetCellValue(batchTrust.DetectionRateValue + "%");//检测比例 - int i = 9; - foreach (var item in batchTrustItemLists) + //未满11行,填充空白行到11行;超过11行按实际行填充 + if (batchTrustItemLists.Count() < 11) { - // 第二步:创建新数据行 - row = sheet.CreateRow(i); - // 添加数据 + foreach (var item in batchTrustItemLists) + { + // 第二步:创建新数据行 + row = sheet.CreateRow(i); + // 添加数据 + cell = row.CreateCell(0); + cell.CellStyle = cellStyle; + cell.SetCellValue((i - 8).ToString());//序号 + + cell = row.CreateCell(1); + cell.CellStyle = cellStyle; + cell.SetCellValue(item.PipelineCode.ToString());//管线号 + + cell = row.CreateCell(2); + cell.CellStyle = cellStyle; + cell.SetCellValue(item.WeldJointCode);//焊口号 + + cell = row.CreateCell(3); + cell.CellStyle = cellStyle; + cell.SetCellValue(item.WelderCode);//焊工号 + + cell = row.CreateCell(4); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//检测总数 + + cell = row.CreateCell(5); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//合格数 + + cell = row.CreateCell(6); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//是否合格 + + cell = row.CreateCell(7); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//评定级别 + + cell = row.CreateCell(8); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//缺陷 + + cell = row.CreateCell(9); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//返修位置 + + cell = row.CreateCell(10); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//备注 + i++; + } + + for (int j = 0; j < 11 - batchTrustItemLists.Count(); j++) + { + // 第二步:创建新数据行 + row = sheet.CreateRow(i); + // 添加数据 + cell = row.CreateCell(0); + cell.CellStyle = cellStyle; + cell.SetCellValue((i - 8).ToString());//序号 + + cell = row.CreateCell(1); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//管线号 + + cell = row.CreateCell(2); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//焊口号 + + cell = row.CreateCell(3); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//焊工号 + + cell = row.CreateCell(4); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//检测总数 + + cell = row.CreateCell(5); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//合格数 + + cell = row.CreateCell(6); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//是否合格 + + cell = row.CreateCell(7); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//评定级别 + + cell = row.CreateCell(8); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//缺陷 + + cell = row.CreateCell(9); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//返修位置 + + cell = row.CreateCell(10); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//备注 + + i++; + } + + //尾部 签字盖章 + // 创建新数据行 + row = sheet.CreateRow(20); + row.HeightInPoints = 43; + CellRangeAddress region = new CellRangeAddress(20, 20, 0, 1); + sheet.AddMergedRegion(region); cell = row.CreateCell(0); - cell.CellStyle = cellStyle; - cell.SetCellValue((i - 8).ToString());//序号 + cell.SetCellValue("委托方单位:"); + cell.CellStyle = bottomStyle; cell = row.CreateCell(1); - cell.CellStyle = cellStyle; - cell.SetCellValue(item.PipelineCode.ToString());//管线号 + cell.CellStyle = bottomStyle; + region = new CellRangeAddress(20, 20, 2, 3); + sheet.AddMergedRegion(region); cell = row.CreateCell(2); - cell.CellStyle = cellStyle; - cell.SetCellValue(item.WeldJointCode);//焊口号 + cell.SetCellValue("评片人:"); + cell.CellStyle = bottomStyle; cell = row.CreateCell(3); - cell.CellStyle = cellStyle; - cell.SetCellValue(item.WelderCode);//焊工号 + cell.CellStyle = bottomStyle; + region = new CellRangeAddress(20, 20, 4, 6); + sheet.AddMergedRegion(region); cell = row.CreateCell(4); - cell.CellStyle = cellStyle; - cell.SetCellValue("");//检测总数 + cell.SetCellValue("检测方单位:"); + cell.CellStyle = bottomStyle; cell = row.CreateCell(5); - cell.CellStyle = cellStyle; - cell.SetCellValue("");//合格数 - + cell.CellStyle = bottomStyle; cell = row.CreateCell(6); - cell.CellStyle = cellStyle; - cell.SetCellValue("");//是否合格 + cell.CellStyle = bottomStyle; + region = new CellRangeAddress(20, 20, 7, 10); + sheet.AddMergedRegion(region); cell = row.CreateCell(7); - cell.CellStyle = cellStyle; - cell.SetCellValue("");//评定级别 + cell.SetCellValue("监理单位:"); + cell.CellStyle = bottomStyle; cell = row.CreateCell(8); - cell.CellStyle = cellStyle; - cell.SetCellValue("");//缺陷 - + cell.CellStyle = bottomStyle; cell = row.CreateCell(9); - cell.CellStyle = cellStyle; - cell.SetCellValue("");//返修位置 - + cell.CellStyle = bottomStyle; cell = row.CreateCell(10); - cell.CellStyle = cellStyle; - cell.SetCellValue("");//备注 - i++; + cell.CellStyle = bottomStyle; + + row = sheet.CreateRow(21); + row.HeightInPoints = 43; + region = new CellRangeAddress(21, 21, 0, 1); + sheet.AddMergedRegion(region); + cell = row.CreateCell(0); + cell.SetCellValue("日期:"); + cell.CellStyle = bottomStyle; + + cell = row.CreateCell(1); + cell.CellStyle = bottomStyle; + + region = new CellRangeAddress(21, 21, 2, 3); + sheet.AddMergedRegion(region); + cell = row.CreateCell(2); + cell.SetCellValue("日期:"); + cell.CellStyle = bottomStyle; + + cell = row.CreateCell(3); + cell.CellStyle = bottomStyle; + + region = new CellRangeAddress(21, 21, 4, 6); + sheet.AddMergedRegion(region); + cell = row.CreateCell(4); + cell.SetCellValue("日期:"); + cell.CellStyle = bottomStyle; + + cell = row.CreateCell(5); + cell.CellStyle = bottomStyle; + cell = row.CreateCell(6); + cell.CellStyle = bottomStyle; + + region = new CellRangeAddress(21, 21, 7, 10); + sheet.AddMergedRegion(region); + cell = row.CreateCell(7); + cell.SetCellValue("日期:"); + cell.CellStyle = bottomStyle; + + cell = row.CreateCell(8); + cell.CellStyle = bottomStyle; + cell = row.CreateCell(9); + cell.CellStyle = bottomStyle; + cell = row.CreateCell(10); + cell.CellStyle = bottomStyle; + } + else + { + foreach (var item in batchTrustItemLists) + { + // 第二步:创建新数据行 + row = sheet.CreateRow(i); + // 添加数据 + cell = row.CreateCell(0); + cell.CellStyle = cellStyle; + cell.SetCellValue((i - 8).ToString());//序号 + + cell = row.CreateCell(1); + cell.CellStyle = cellStyle; + cell.SetCellValue(item.PipelineCode.ToString());//管线号 + + cell = row.CreateCell(2); + cell.CellStyle = cellStyle; + cell.SetCellValue(item.WeldJointCode);//焊口号 + + cell = row.CreateCell(3); + cell.CellStyle = cellStyle; + cell.SetCellValue(item.WelderCode);//焊工号 + + cell = row.CreateCell(4); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//检测总数 + + cell = row.CreateCell(5); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//合格数 + + cell = row.CreateCell(6); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//是否合格 + + cell = row.CreateCell(7); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//评定级别 + + cell = row.CreateCell(8); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//缺陷 + + cell = row.CreateCell(9); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//返修位置 + + cell = row.CreateCell(10); + cell.CellStyle = cellStyle; + cell.SetCellValue("");//备注 + i++; + } + + //尾部 签字盖章 + // 创建新数据行 + row = sheet.CreateRow(i); + row.HeightInPoints = 43; + CellRangeAddress region = new CellRangeAddress(i, i, 0, 1); + sheet.AddMergedRegion(region); + cell = row.CreateCell(0); + cell.SetCellValue("委托方单位:"); + cell.CellStyle = bottomStyle; + + cell = row.CreateCell(1); + cell.CellStyle = bottomStyle; + + region = new CellRangeAddress(i, i, 2, 3); + sheet.AddMergedRegion(region); + cell = row.CreateCell(2); + cell.SetCellValue("评片人:"); + cell.CellStyle = bottomStyle; + + cell = row.CreateCell(3); + cell.CellStyle = bottomStyle; + + region = new CellRangeAddress(i, i, 4, 6); + sheet.AddMergedRegion(region); + cell = row.CreateCell(4); + cell.SetCellValue("检测方单位:"); + cell.CellStyle = bottomStyle; + + cell = row.CreateCell(5); + cell.CellStyle = bottomStyle; + cell = row.CreateCell(6); + cell.CellStyle = bottomStyle; + + region = new CellRangeAddress(i, i, 7, 10); + sheet.AddMergedRegion(region); + cell = row.CreateCell(7); + cell.SetCellValue("监理单位:"); + cell.CellStyle = bottomStyle; + + cell = row.CreateCell(8); + cell.CellStyle = bottomStyle; + cell = row.CreateCell(9); + cell.CellStyle = bottomStyle; + cell = row.CreateCell(10); + cell.CellStyle = bottomStyle; + + row = sheet.CreateRow(i + 1); + row.HeightInPoints = 43; + region = new CellRangeAddress(i + 1, i + 1, 0, 1); + sheet.AddMergedRegion(region); + cell = row.CreateCell(0); + cell.SetCellValue("日期:"); + cell.CellStyle = bottomStyle; + + cell = row.CreateCell(1); + cell.CellStyle = bottomStyle; + + region = new CellRangeAddress(i + 1, i + 1, 2, 3); + sheet.AddMergedRegion(region); + cell = row.CreateCell(2); + cell.SetCellValue("日期:"); + cell.CellStyle = bottomStyle; + + cell = row.CreateCell(3); + cell.CellStyle = bottomStyle; + + region = new CellRangeAddress(i + 1, i + 1, 4, 6); + sheet.AddMergedRegion(region); + cell = row.CreateCell(4); + cell.SetCellValue("日期:"); + cell.CellStyle = bottomStyle; + + cell = row.CreateCell(5); + cell.CellStyle = bottomStyle; + cell = row.CreateCell(6); + cell.CellStyle = bottomStyle; + + region = new CellRangeAddress(i + 1, i + 1, 7, 10); + sheet.AddMergedRegion(region); + cell = row.CreateCell(7); + cell.SetCellValue("日期:"); + cell.CellStyle = bottomStyle; + + cell = row.CreateCell(8); + cell.CellStyle = bottomStyle; + cell = row.CreateCell(9); + cell.CellStyle = bottomStyle; + cell = row.CreateCell(10); + cell.CellStyle = bottomStyle; } // 第三步:写入文件流 using (FileStream stream = new FileStream(newUrl, FileMode.Create, FileAccess.Write)) @@ -322,7 +615,37 @@ namespace FineUIPro.Web.HJGL.NDT } } } + + /// + /// 设置单元格下拉框约束 + /// + /// + /// + /// + /// + public static void SetCellDropdownList(NPOI.SS.UserModel.ISheet sheet, int firstcol, int lastcol, string[] vals) + { + //设置生成下拉框的行和列 + var cellRegions = new CellRangeAddressList(1, 65535, firstcol, lastcol); + NPOI.SS.UserModel.IDataValidation validation = null; + + if (sheet.GetType().Name.Contains("XSSF")) // .xlsx + { + NPOI.XSSF.UserModel.XSSFDataValidationHelper helper = new NPOI.XSSF.UserModel.XSSFDataValidationHelper((NPOI.XSSF.UserModel.XSSFSheet)sheet);//获得一个数据验证Helper + //IDataValidation + validation = helper.CreateValidation( + helper.CreateExplicitListConstraint(vals), cellRegions);//创建约束 + } + else // HSSF .xls + { + //設置 下拉框內容 + NPOI.HSSF.UserModel.DVConstraint constraint = NPOI.HSSF.UserModel.DVConstraint.CreateExplicitListConstraint(vals); + validation = new NPOI.HSSF.UserModel.HSSFDataValidation(cellRegions, constraint); + } + sheet.AddValidationData(validation); + } #endregion + #region 将Dataset的数据导入数据库 /// /// 将Dataset的数据导入数据库 @@ -341,7 +664,7 @@ namespace FineUIPro.Web.HJGL.NDT responeData.message = "导入Excel格式错误!Excel只有" + count.ToString().Trim() + "列"; return responeData; } - if (pds.Count > 0 && pds != null) + if (pds.Count-2 > 0 && pds != null) { string NDEId = string.Empty; //string unitworkId = string.Empty; @@ -415,143 +738,138 @@ namespace FineUIPro.Web.HJGL.NDT ndes.Add(nde); } - for (int i = 9; i < pds.Count; i++) + for (int i = 9; i < pds.Count - 2; i++) { - HJGL_Batch_NDEItem item = new HJGL_Batch_NDEItem(); - item.NDEItemID = SQLHelper.GetNewID(typeof(Model.HJGL_Batch_NDEItem)); - item.NDEID = NDEId; - var batchTrustItems = BLL.Batch_BatchTrustItemService.GetViewBatchTrustItem(this.TrustBatchId); - if (batchTrustItems != null) + if (!string.IsNullOrEmpty(pds[i].B.ToString()) && !string.IsNullOrEmpty(pds[i].C.ToString())) { - var trustItem = batchTrustItems.FirstOrDefault(x => x.PipelineCode == pds[i].B.ToString() && x.WeldJointCode == pds[i].C.ToString()); - if (trustItem != null) + HJGL_Batch_NDEItem item = new HJGL_Batch_NDEItem(); + item.NDEItemID = SQLHelper.GetNewID(typeof(Model.HJGL_Batch_NDEItem)); + item.NDEID = NDEId; + var batchTrustItems = BLL.Batch_BatchTrustItemService.GetViewBatchTrustItem(this.TrustBatchId); + if (batchTrustItems != null) { - item.TrustBatchItemId = trustItem.TrustBatchItemId; - item.DetectionTypeId = trustItem.DetectionTypeId; - - //检测总数 - if (pds[i].E != null && !string.IsNullOrEmpty(pds[i].E.ToString())) + var trustItem = batchTrustItems.FirstOrDefault(x => x.PipelineCode == pds[i].B.ToString() && x.WeldJointCode == pds[i].C.ToString()); + if (trustItem != null) { - try + item.TrustBatchItemId = trustItem.TrustBatchItemId; + item.DetectionTypeId = trustItem.DetectionTypeId; + + //检测总数 + if (pds[i].E != null && !string.IsNullOrEmpty(pds[i].E.ToString())) { - item.TotalFilm = Funs.GetNewInt(pds[i].E.ToString()); - if (item.TotalFilm == null) + try + { + item.TotalFilm = Funs.GetNewInt(pds[i].E.ToString()); + if (item.TotalFilm == null) + { + result.Add("检测总数[" + pds[i].E.ToString() + "]格式错误"); + } + } + catch (Exception) { result.Add("检测总数[" + pds[i].E.ToString() + "]格式错误"); } } - catch (Exception) + //合格数 + if (pds[i].F != null && !string.IsNullOrEmpty(pds[i].F.ToString())) { - result.Add("检测总数[" + pds[i].E.ToString() + "]格式错误"); - } - } - //合格数 - if (pds[i].F != null && !string.IsNullOrEmpty(pds[i].F.ToString())) - { - try - { - item.PassFilm = Funs.GetNewInt(pds[i].F.ToString()); - if (item.PassFilm == null) + try + { + item.PassFilm = Funs.GetNewInt(pds[i].F.ToString()); + if (item.PassFilm == null) + { + result.Add("合格数[" + pds[i].F.ToString() + "]格式错误"); + } + } + catch (Exception) { result.Add("合格数[" + pds[i].F.ToString() + "]格式错误"); } } - catch (Exception) + //是否合格 + if (pds[i].G != null && !string.IsNullOrEmpty(pds[i].G.ToString())) { - result.Add("合格数[" + pds[i].F.ToString() + "]格式错误"); - } - } - //是否合格 - if (pds[i].G != null && !string.IsNullOrEmpty(pds[i].G.ToString())) - { - if (pds[i].G.ToString() == "合格" || pds[i].G.ToString() == "不合格") - { - item.CheckResult = pds[i].G.ToString() == "合格" ? "1" : "2"; - } - else - { - result.Add("是否合格[" + pds[i].G.ToString() + "]格式错误"); - } - } - //评定级别 - if (pds[i].H != null && !string.IsNullOrEmpty(pds[i].H.ToString())) - { - string gudgeGrade = pds[i].H.ToString(); - if (gudgeGrade != "Ⅰ" && gudgeGrade != "Ⅱ" && gudgeGrade != "Ⅲ" && gudgeGrade != "Ⅳ" && gudgeGrade != "Ⅴ") - { - result.Add("评定级别" + gudgeGrade + "错误"); - } - else - { - item.JudgeGrade = gudgeGrade; - } - } - //缺陷 - if (pds[i].I != null && !string.IsNullOrEmpty(pds[i].I.ToString())) - { - string checkDefects = pds[i].I.ToString(); - string defectIds = string.Empty; - string[] lists = checkDefects.Split(','); - foreach (var j in lists) - { - var u = defects.Where(x => x.DefectName == j.Trim()).FirstOrDefault(); - if (u == null) + if (pds[i].G.ToString() == "合格" || pds[i].G.ToString() == "不合格") { - result.Add("缺陷" + j.Trim() + "不存在"); + item.CheckResult = pds[i].G.ToString() == "合格" ? "1" : "2"; } else { - var q = BLL.Base_DefectService.GetDefectByDefectName(u.DefectName); - defectIds += q.DefectId + ","; + result.Add("是否合格[" + pds[i].G.ToString() + "]格式错误"); } } - if (!string.IsNullOrEmpty(defectIds)) + //评定级别 + if (pds[i].H != null && !string.IsNullOrEmpty(pds[i].H.ToString())) { - defectIds = defectIds.Substring(0, defectIds.LastIndexOf(",")); - item.CheckDefects = defectIds; + string gudgeGrade = pds[i].H.ToString(); + if (gudgeGrade != "Ⅰ" && gudgeGrade != "Ⅱ" && gudgeGrade != "Ⅲ" && gudgeGrade != "Ⅳ" && gudgeGrade != "Ⅴ") + { + result.Add("评定级别" + gudgeGrade + "错误"); + } + else + { + item.JudgeGrade = gudgeGrade; + } } - } - //返修位置 - if (pds[i].J != null && !string.IsNullOrEmpty(pds[i].J.ToString())) - { - item.RepairLocation = pds[i].J.ToString(); - } - if (pds[i].K != null && !string.IsNullOrEmpty(pds[i].K.ToString())) - { - item.Remark = pds[i].K.ToString(); - } - //报告日期 - if (pds[6].H != null && !string.IsNullOrEmpty(pds[6].H.ToString())) - { - try + //缺陷 + if (pds[i].I != null && !string.IsNullOrEmpty(pds[i].I.ToString())) { - item.ReportDate = Funs.GetNewDateTime(pds[6].H.ToString()); - if (item.ReportDate == null) + string checkDefects = pds[i].I.ToString(); + string defectIds = string.Empty; + string[] lists = checkDefects.Split(','); + foreach (var j in lists) + { + var u = defects.Where(x => x.DefectName == j.Trim()).FirstOrDefault(); + if (u == null) + { + result.Add("缺陷" + j.Trim() + "不存在"); + } + else + { + var q = BLL.Base_DefectService.GetDefectByDefectName(u.DefectName); + defectIds += q.DefectId + ","; + } + } + if (!string.IsNullOrEmpty(defectIds)) + { + defectIds = defectIds.Substring(0, defectIds.LastIndexOf(",")); + item.CheckDefects = defectIds; + } + } + //返修位置 + if (pds[i].J != null && !string.IsNullOrEmpty(pds[i].J.ToString())) + { + item.RepairLocation = pds[i].J.ToString(); + } + if (pds[i].K != null && !string.IsNullOrEmpty(pds[i].K.ToString())) + { + item.Remark = pds[i].K.ToString(); + } + //报告日期 + if (pds[6].H != null && !string.IsNullOrEmpty(pds[6].H.ToString())) + { + try + { + item.ReportDate = Funs.GetNewDateTime(pds[6].H.ToString()); + if (item.ReportDate == null) + { + result.Add("报告日期" + pds[6].H.ToString() + "格式错误"); + } + } + catch (Exception) { result.Add("报告日期" + pds[6].H.ToString() + "格式错误"); } } - catch (Exception) - { - result.Add("报告日期" + pds[6].H.ToString() + "格式错误"); - } } + else + { + result.Add("管线[" + pds[i].B.ToString() + "]焊口[" + pds[i].C.ToString() + "]" + "不存在该委托单中"); + } + item.SubmitDate = DateTime.Now; + ndeItems.Add(item); } - else - { - result.Add("管线[" + pds[i].B.ToString() + "]焊口[" + pds[i].C.ToString() + "]" + "不存在该委托单中"); - } - //var model = ndeItems.Where(x => x.TrustBatchItemId == item.TrustBatchItemId); - //if (model.Count() == 0) - //{ - item.SubmitDate = DateTime.Now; - ndeItems.Add(item); - //} - // } } - #region 数据验证和赋值 - - #endregion } } else diff --git a/SGGL/FineUIPro.Web/HJGL/PointTrust/TrustBatch.aspx.cs b/SGGL/FineUIPro.Web/HJGL/PointTrust/TrustBatch.aspx.cs index ecde9749..229f1e7b 100644 --- a/SGGL/FineUIPro.Web/HJGL/PointTrust/TrustBatch.aspx.cs +++ b/SGGL/FineUIPro.Web/HJGL/PointTrust/TrustBatch.aspx.cs @@ -1057,7 +1057,15 @@ namespace FineUIPro.Web.HJGL.PointTrust { if (pointBatchItem.IsBuildTrust != null) { - pointBatchItem.IsBuildTrust = null; + pointBatchItem.IsBuildTrust = null;//是否委托 + pointBatchItem.PointState = null;//点口类型 + pointBatchItem.PointDate = null;//点口时间 + db.SubmitChanges(); + } + var pointBatch = BLL.PointBatchService.GetPointBatchById(pointBatchItem.PointBatchId); + if (pointBatch!=null) + { + pointBatch.IsClosed = null; db.SubmitChanges(); } } From b004037b4d8dbd0b796cc4a102b88b7ec367a451 Mon Sep 17 00:00:00 2001 From: fei550 <1420031550@qq.com> Date: Thu, 3 Jul 2025 18:42:35 +0800 Subject: [PATCH 2/6] 1 --- .vs/SGGL_SeDin_New/v17/.wsuo | Bin 74752 -> 73216 bytes .../v17/DocumentLayout.backup.json | 32 ++--- SGGL/BLL/Common/ConstValue.cs | 5 + SGGL/BLL/HSSE/CostGoods/CostManageService.cs | 130 ++++++++++++------ SGGL/FineUIPro.Web/FineUIPro.Web.csproj | 2 +- SGGL/Model/HSSE/PuApiOutput.cs | 61 ++++++++ SGGL/Model/Model.csproj | 1 + 7 files changed, 168 insertions(+), 63 deletions(-) create mode 100644 SGGL/Model/HSSE/PuApiOutput.cs diff --git a/.vs/SGGL_SeDin_New/v17/.wsuo b/.vs/SGGL_SeDin_New/v17/.wsuo index 2b6a9900abb81318654938ff248b0207d9fb8e8d..7f5969003285703035b592ad9f8fad2b4e7e50b7 100644 GIT binary patch delta 1319 zcma)5T}YE*6yEv#Hm80w=TFJpO1G8E9Bs>=WmBvP*$@7JT@)edq`D{xnI;xu5+q`w zJE0I1_7xIQV0%j?%!b}b7it&XL{}Ar5nas-i?s9VR-b0z3uo{7ea~~w^Q~iA>=+k& zt03iB^-q9oysytxKe=_V;VU)?op2c!gc+Smr&6h`B+GPApKgT%xDaDGVIfy4i6Ih7 zirhRck@O6bSQ3rG|BGT~vX|)ILbpAl^O|_l)B372w7lO|66_T{rXo^!l%GP?~o2X6|I~CUD1QS4S~({2VjK$Z{OKV{j+dl4QM?P?+PQ0*ql^>-o)a7-iuR$ z6aD&19f*{&N0EkM@~&)<&&ns@#pq9-!!m<|`BN%k!)_7;j9wi$s3=P2YN4?br`*K> z)09qSqo7Igs-}{RcoqARRv}`!DHr{Q8f}^)frSkc$lJwW!8B+&Cs91=qhzFxE@r_E z7zkOwhUYD|fjJ8}M$FK$&ZWLa$v69|_p(xJ2>LEb0UIIBjXW29lKE{_AaNRukqF1H zE+Ip}#ly#>6w>&2@VB762Ld^fUFOg(d1RL|Bb+0}YygNhgSMAAwC} zBV`B8L|%slN?EA6R77XHjdiyhfE_wFA^eG9$Wkh|338`K?lxlToqC*k70)ho-3A;S z_F(M?D?2kZ2xxxm!ol}uoOrEarydW*;l~Fp10@nzvGJ*v$&YFQhx^O1=xzaPf8Gh$ z^r;P#-o&%(V^<+KA_y3|=V2u;C!O;5WciyA_+orvgwHWJ*7%g5Z>9Wf129P#%bNCEG2aurG%{6^{(^dm}*I)Dio=9M9QH;m6NqYF62;| zItUb*5QJ2sKWMBfs$9aMLeL)}PEmr@X=wj)@^1hM4~x&a)2(fXlE2{@aS7(}zIf9QZb1+tqz_4O zwJib(yx-D&@-RUiq@4{HcXJ7leUS7SQcuJ8&#voX7ujv3D(MO-hy9H=FVnp`*&+LA zv9AGcQvj|=$!9|ifbSTj^?rvv!v2tK&i{_s<*Le0LEqCm*`&_f;50cUCv{$kQ*=^q zC7a_-X;R-q_>-y2j$NGkUWZN8y|+Znv`VVYZn za{8Rc&Vii8x8)Ol;C6E^9LKtx@&lhY_i))k^X)1BPOC3Ca$ucMI6z3R6U_&2`}lb@ zJLL&jz9R((T{m$%G=}E%j${`N}(|xiFxxDjvXlCR{W*%A*ph<2w3Zp zFEdhBwC}kJfgSbbmBo+V`@twhsD&ZU8O*+cDj+3#EJs9+eSPaNa4p$!^Fv0^~ zQBaBY{+H(HZHayRYEmp87fb!)K7RF^-_7p0`_DspLM$m0Pnh#jI)xMC;$wEEe+ouo z(?-tLW2S27hIQ4n2Q+nh)-Y8)JEUua@nKt!>+CHXW#_C|tzb!b`obApu3DuJz3l4J zF~Dy!K^B~eg0_$q;to0g{&nXzbmtmRDE&`tWc?zxd@ET1gg7aT^S^2BefZ-owc=2u+uU&Vu zQ=hNz!M{FPWQ$jp0F_Gt7Pwjm%>TN8^7pN5x%wWIH)Ctx1!4Q^Z4jaSXAooOl?_FN zUs_!Je e.ConstValue == constValue && e.GroupId == groupId); } + + public static Sys_Const GetConstByConstText(string constText) + { + return Funs.DB.Sys_Const.FirstOrDefault(e => e.ConstText == constText); + } public static void DeleteConstValueBygroupId(string groupId) { var q = Funs.DB.Sys_Const.Where(x => x.GroupId == groupId); diff --git a/SGGL/BLL/HSSE/CostGoods/CostManageService.cs b/SGGL/BLL/HSSE/CostGoods/CostManageService.cs index 5ba8d146..660ee615 100644 --- a/SGGL/BLL/HSSE/CostGoods/CostManageService.cs +++ b/SGGL/BLL/HSSE/CostGoods/CostManageService.cs @@ -386,28 +386,17 @@ namespace BLL select x; var projectModel=ProjectService.GetProjectByProjectId(projectId); var contractModel = CostManageService.GetCostManageById(costManageId); - decimal totalAmount = costData.Sum(x => x.SumMoney ?? 0); + //decimal totalAmount = costData.Sum(x => x.SumMoney ?? 0); var files = new List(); if (contractModel!=null) - { - var fileDetails = GetBase64FilesWithDetails(contractModel.CostManageId); - if (fileDetails != null && fileDetails.Count > 0) + { + var url = ConstValue.GetConstByConstText("PU_PUSH_URL")?.ConstValue; + if (string.IsNullOrEmpty(url)) { - files.AddRange(fileDetails); + message = "未配置推送接口地址"; + return message; + } - - // 构建请求体 - var requestBody = new - { - projectNumber = projectModel.ProjectCode, - contractNo = contractNum, - amountHSE = totalAmount.ToString(), - files = files - }; - var jsonBody = JsonConvert.SerializeObject(requestBody); - - // 调用HSE接口推送数据 - var url = "http://172.29.60.33:9037"; var requestGetTokenUrl = url + "/auth/getToken"; string requestGetTokenBody = "{\"username\": \"coadmin\",\"password\": \"coadminPu@2025\"}"; var response = Funs.RequestPost(requestGetTokenUrl, "", requestGetTokenBody); @@ -425,10 +414,55 @@ namespace BLL { message = "获取Pu系统Token失败,Token为空"; return message; - } + } Dictionary headers = new Dictionary(); headers.Add("Authorization", "Bearer " + accessToken); + #region 先获取当前费用是否已经推送过 + var getRequestUrl = url + "/pu_api/payCraftAmountToHSE/get"; + var getRequestbody= $"{{\"projectNumber\":\"{projectModel.ProjectCode}\",\"contractNo\":\"{contractNum}\"}}"; + APICommonService.SaveSysHttpLog("PU_GetPuPayCraftAmount", getRequestUrl, getRequestbody, "Requset"); + var getResponse = Funs.RequestPost(getRequestUrl, headers, getRequestbody); + APICommonService.SaveSysHttpLog("PU_GetPuPayCraftAmount", getRequestUrl, getResponse, "Response"); + var getResponseStr = JsonConvert.DeserializeObject(getResponse); + if (getResponseStr == null) + { + message = "推送数据到HSE系统失败"; + return message; + } + else if (getResponseStr["code"]?.ToString() != "200") + { + message = getResponseStr["message"]?.ToString(); + return message; + } + var getResponseOutput = JsonConvert.DeserializeObject>(getResponseStr["data"]?.ToString()) ; + if (getResponseOutput.Any() && getResponseOutput.Count(x=>x.itemNo== costManageId)>0) + { + message = "当前费用已推送,无需重复推送!"; + return message; + } + + #endregion + + #region 推送数据至Pu var requestUrl = url + "/pu_api/payCraftAmountToHSE/add"; + // 构建请求体 + var fileDetails = GetBase64FilesWithDetails(contractModel.CostManageId); + if (fileDetails != null && fileDetails.Count > 0) + { + files.AddRange(fileDetails); + } + List puAddApiInputs = new List() + { + new PuAddApiInput() + { + projectNumber = projectModel.ProjectCode, + itemId= costManageId, + contractNo = contractNum, + amountHSE = contractModel.SumMoney.ToString(), + files = files + } + }; + var jsonBody = JsonConvert.SerializeObject(puAddApiInputs); APICommonService.SaveSysHttpLog("PU_AddPuPayCraftAmount", requestUrl, jsonBody, "Requset"); var responseHSE = Funs.RequestPost(requestUrl, headers, jsonBody); var responseHSEStr = JsonConvert.DeserializeObject(responseHSE); @@ -438,16 +472,23 @@ namespace BLL message = "推送数据到HSE系统失败"; return message; } + else if ( string.IsNullOrEmpty(responseHSEStr["code"]?.ToString())) + { + message = responseHSE; + return message; + } else if (responseHSEStr["code"]?.ToString() != "200") { message = responseHSEStr["message"]?.ToString(); return message; } - else + else { message = ""; return message; } + #endregion + } return message; @@ -459,7 +500,6 @@ namespace BLL return "推送数据失败"; } } - /// /// 获取Base64编码的附件文件 /// @@ -468,37 +508,39 @@ namespace BLL var result = new List(); // 获取费用管理信息 var costManage = GetCostManageById(costManageId); - // 获取附件文件 - var attachments = AttachFileService.getFileUrl(costManageId); + var costItem = BLL.CostManageItemService.GetCostManageItemByCostManageId(costManageId); + foreach (var item in costItem) + { // 获取附件文件 + var attachments = AttachFileService.getFileUrl(item.CostManageItemId); - if (!string.IsNullOrEmpty(attachments)) - { - string[] filePaths = attachments.Split(','); - foreach (var filePath in filePaths) + if (!string.IsNullOrEmpty(attachments)) { - string fullPath = Funs.RootPath + filePath; - if (File.Exists(fullPath)) + string[] filePaths = attachments.Split(','); + foreach (var filePath in filePaths) { - FileInfo file = new FileInfo(fullPath); - byte[] fileBytes = File.ReadAllBytes(fullPath); - string base64Content = Convert.ToBase64String(fileBytes); - - result.Add(new Model.PuPayCraftAmountFileInput + string fullPath = Funs.RootPath + filePath; + if (File.Exists(fullPath)) { - name = file.Name, - content = base64Content, - thisamount = costManage?.SumMoney?.ToString() ?? "0", - date = costManage?.CostManageDate?.ToString("yyyy-MM-dd") ?? DateTime.Now.ToString("yyyy-MM-dd") - }); - } - else - { - /* message += $"附件文件路径 {fullPath} 不存在!"; - ErrLogInfo.WriteLog(message, $"File not found: {fullPath}");*/ + FileInfo file = new FileInfo(fullPath); + byte[] fileBytes = File.ReadAllBytes(fullPath); + string base64Content = Convert.ToBase64String(fileBytes); + + result.Add(new Model.PuPayCraftAmountFileInput + { + name = file.Name, + content = base64Content, + thisamount = item?.PriceMoney?.ToString() ?? "0", + date = costManage?.CompileDate?.ToString("yyyy-MM-dd") ?? DateTime.Now.ToString("yyyy-MM-dd") + }); + + continue;//只取第一个文件 + } } } } + + return result; } diff --git a/SGGL/FineUIPro.Web/FineUIPro.Web.csproj b/SGGL/FineUIPro.Web/FineUIPro.Web.csproj index 028f77fb..1f8781f0 100644 --- a/SGGL/FineUIPro.Web/FineUIPro.Web.csproj +++ b/SGGL/FineUIPro.Web/FineUIPro.Web.csproj @@ -16785,7 +16785,7 @@ - + diff --git a/SGGL/Model/HSSE/PuApiOutput.cs b/SGGL/Model/HSSE/PuApiOutput.cs new file mode 100644 index 00000000..567b13da --- /dev/null +++ b/SGGL/Model/HSSE/PuApiOutput.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Model +{ + public class PuGetApiOutput + { + /// + /// 合同号 + /// + public string contractNo { get; set; } + + /// + /// 项目号 + /// + public string projectNumber { get; set; } + + /// + /// 主键 + /// + public string itemNo { get; set; } + + /// + /// 本次申请费用 + /// + public string amountHSE { get; set; } + } + public class PuAddApiInput + { + /// + /// 合同号 + /// + public string contractNo { get; set; } + + /// + /// 项目号 + /// + public string projectNumber { get; set; } + + /// + /// 主键 + /// + public string itemId { get; set; } + + /// + /// 本次申请费用 + /// + public string amountHSE { get; set; } + + /// + /// Gets or sets the files. + /// + /// + /// The files. + /// + public List files { get; set; } + } +} diff --git a/SGGL/Model/Model.csproj b/SGGL/Model/Model.csproj index 7a6ac86c..75f89168 100644 --- a/SGGL/Model/Model.csproj +++ b/SGGL/Model/Model.csproj @@ -245,6 +245,7 @@ + From 2fe06c242ff2c3354d2d42b6839003233327ce62 Mon Sep 17 00:00:00 2001 From: wendy <408182087@qq.com> Date: Fri, 4 Jul 2025 13:50:37 +0800 Subject: [PATCH 3/6] =?UTF-8?q?20250704=20=E8=AF=95=E5=8E=8B=E5=8C=85?= =?UTF-8?q?=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../版本日志/SGGLDB_V2025-07-02-001-bwj.sql | 33 ++ .../TestPackage/TestPackageEditService.cs | 9 + .../File/Excel/DataIn/试压包导入模版.xlsx | Bin 0 -> 8504 bytes .../HJGL/TestPackage/TestPackageEdit.aspx | 2 +- .../HJGL/TestPackage/TestPackageImport.aspx | 21 +- .../TestPackage/TestPackageImport.aspx.cs | 289 ++++++-------- SGGL/Model/Model.cs | 360 ++++++++++-------- 7 files changed, 367 insertions(+), 347 deletions(-) create mode 100644 DataBase/版本日志/SGGLDB_V2025-07-02-001-bwj.sql create mode 100644 SGGL/FineUIPro.Web/File/Excel/DataIn/试压包导入模版.xlsx diff --git a/DataBase/版本日志/SGGLDB_V2025-07-02-001-bwj.sql b/DataBase/版本日志/SGGLDB_V2025-07-02-001-bwj.sql new file mode 100644 index 00000000..d9bfa7b2 --- /dev/null +++ b/DataBase/版本日志/SGGLDB_V2025-07-02-001-bwj.sql @@ -0,0 +1,33 @@ + +alter table PTP_PipelineList add TestPackageNo varchar(50) +go + +ALTER VIEW [dbo].[View_TestPackage_PipelineList] +as +/*********ѹϸ**********/ +select l.PT_PipeId, +l.PTP_ID, +l.PipelineId, +l.TestPressure, +t.ProjectId, +t.TestPackageNo, +t.TestPackageName, +t.Remark, +t.UnitWorkId, +t.Tabler, +t.TableDate, +p.PipelineCode, +uw.UnitWorkCode, +uw.UnitWorkName, +uw.UnitId, +u.UnitCode, +u.UnitName, +t.adjustTestPressure +from PTP_PipelineList l +left join PTP_TestPackage as t on t.PTP_ID=l.PTP_ID +left join HJGL_Pipeline p on p.PipelineId = l.PipelineId +left join WBS_UnitWork uw on uw.UnitWorkId = t.UnitWorkId +left join Base_Unit u on u.UnitId =uw.UnitId +GO + + diff --git a/SGGL/BLL/HJGL/TestPackage/TestPackageEditService.cs b/SGGL/BLL/HJGL/TestPackage/TestPackageEditService.cs index a3314e5e..c1ddf1ef 100644 --- a/SGGL/BLL/HJGL/TestPackage/TestPackageEditService.cs +++ b/SGGL/BLL/HJGL/TestPackage/TestPackageEditService.cs @@ -455,5 +455,14 @@ namespace BLL db.SubmitChanges(); } } + + public static void AddPipelineLists(List pipelineList) + { + using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) + { + db.PTP_PipelineList.InsertAllOnSubmit(pipelineList); + db.SubmitChanges(); + } + } } } diff --git a/SGGL/FineUIPro.Web/File/Excel/DataIn/试压包导入模版.xlsx b/SGGL/FineUIPro.Web/File/Excel/DataIn/试压包导入模版.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8eee13d894cae67d09bd9bee814ba382f2a59157 GIT binary patch literal 8504 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 -