From 1de898812e5e81bf91945f5e8c2f08b63608a44e Mon Sep 17 00:00:00 2001 From: fei550 <1420031550@qq.com> Date: Thu, 6 Aug 2026 15:33:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84=E6=9D=90=E6=96=99?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=B8=8E=E7=84=8A=E6=8E=A5=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBase/版本日志/SGGLDB_V2026-08-02-lpf.sql | 25 + SGGL/BLL/API/HJGL/APIWeldReportService.cs | 62 +++ SGGL/BLL/BLL.csproj | 3 +- SGGL/BLL/CLGL/TwArrivalStatisticsService.cs | 247 ++++++++-- .../HJGL/BaseInfo/MaterialCodeLibService.cs | 10 +- .../HJGL/WeldingManage/PipelineMatService.cs | 16 + .../HJGL/WeldingManage/WeldingDailyService.cs | 179 ++++++- .../File/Excel/DataIn/MaterialCodeLib.xlsx | Bin 10457 -> 4807 bytes .../File/Excel/DataIn/PipelineMat.xlsx | Bin 9134 -> 3710 bytes .../Excel/DataIn/PipelineMatWithBatch.xlsx | Bin 5338 -> 3933 bytes .../File/Fastreport/无损检测委托单_附件6.frx | 344 +++++++++++++ .../Fastreport/管道焊口检测委托单_附件4.frx | 360 ++++++++++++++ .../Fastreport/管道焊缝热处理委托_附件5.frx | 239 +++++++++ SGGL/FineUIPro.Web/FineUIPro.Web.csproj | 2 +- .../HJGL/BaseInfo/MaterialCodeLib.aspx | 3 + .../HJGL/BaseInfo/MaterialCodeLibEdit.aspx | 9 +- .../HJGL/BaseInfo/MaterialCodeLibEdit.aspx.cs | 8 +- .../MaterialCodeLibEdit.aspx.designer.cs | 5 + .../HJGL/BaseInfo/MaterialCodeLibIn.aspx.cs | 13 +- .../HJGL/DataImport/MaterialInformation.aspx | 17 +- .../DataImport/MaterialInformation.aspx.cs | 76 +-- .../MaterialInformation.aspx.designer.cs | 27 -- .../DataImport/MaterialInformationEdit.aspx | 9 + .../MaterialInformationEdit.aspx.cs | 4 + .../MaterialInformationEdit.aspx.designer.cs | 5 + .../HotProcessHard/HotProessTrust.aspx.cs | 2 +- .../HJGL/InfoQuery/JointQuery.aspx | 9 +- .../HJGL/PointTrust/TrustBatch.aspx | 8 +- .../HJGL/PointTrust/TrustBatch.aspx.cs | 24 +- .../PointTrust/TrustBatch.aspx.designer.cs | 105 ++-- .../HJGL/RepairAndExpand/RepairTrust.aspx | 6 +- .../HJGL/RepairAndExpand/RepairTrust.aspx.cs | 19 +- .../RepairTrust.aspx.designer.cs | 15 + .../HJGL/WeldingManage/PipelineMatIn.aspx | 7 +- .../HJGL/WeldingManage/PipelineMatIn.aspx.cs | 38 +- .../PipelineMatIn.aspx.designer.cs | 9 + .../HJGL/WeldingManage/WeldMatMatch.aspx | 26 +- .../HJGL/WeldingManage/WeldMatMatch.aspx.cs | 458 +++++++++++------- .../WeldMatMatch.aspx.designer.cs | 9 + .../HJGL/WeldingManage/WeldReport.aspx | 4 +- .../HJGL/WeldingManage/WeldReport.aspx.cs | 73 +-- .../HJGL/WeldingManage/WeldingConDate.aspx | 2 +- .../HJGL/WeldingManage/WeldingConDate.aspx.cs | 221 ++++----- .../HJGL/WeldingDailyTempDetailItem.cs | 211 ++++++++ SGGL/Model/CLGL/Tw_PipeMatMatchOutput.cs | 21 + SGGL/Model/Model.cs | 48 ++ SGGL/Model/Model.csproj | 1 + .../PreWeldingDailyController.cs | 140 ++++++ SGGL/WebAPI/WebAPI.csproj | 2 +- 49 files changed, 2566 insertions(+), 555 deletions(-) create mode 100644 DataBase/版本日志/SGGLDB_V2026-08-02-lpf.sql create mode 100644 SGGL/BLL/API/HJGL/APIWeldReportService.cs create mode 100644 SGGL/FineUIPro.Web/File/Fastreport/无损检测委托单_附件6.frx create mode 100644 SGGL/FineUIPro.Web/File/Fastreport/管道焊口检测委托单_附件4.frx create mode 100644 SGGL/FineUIPro.Web/File/Fastreport/管道焊缝热处理委托_附件5.frx create mode 100644 SGGL/Model/APIItem/HJGL/WeldingDailyTempDetailItem.cs diff --git a/DataBase/版本日志/SGGLDB_V2026-08-02-lpf.sql b/DataBase/版本日志/SGGLDB_V2026-08-02-lpf.sql new file mode 100644 index 00000000..12c16c05 --- /dev/null +++ b/DataBase/版本日志/SGGLDB_V2026-08-02-lpf.sql @@ -0,0 +1,25 @@ +/* + 材料用途和材料编码来源字段 + PipeArea: 1=工厂预制,2=现场安装 +*/ +IF COL_LENGTH(N'dbo.HJGL_PipeLineMat', N'PipeArea') IS NULL +BEGIN + ALTER TABLE dbo.HJGL_PipeLineMat ADD PipeArea NCHAR(1) NULL; +END; +GO + +IF COL_LENGTH(N'dbo.HJGL_MaterialCodeLib', N'DesignInstitute') IS NULL +BEGIN + ALTER TABLE dbo.HJGL_MaterialCodeLib ADD DesignInstitute NVARCHAR(200) NULL; +END; +GO + +/* 历史材料按所属管线区域回填;无法关联管线的历史数据保留为空。 */ +UPDATE mat +SET mat.PipeArea = pipe.PipeArea +FROM dbo.HJGL_PipeLineMat mat +INNER JOIN dbo.HJGL_Pipeline pipe ON pipe.PipelineId = mat.PipelineId +WHERE mat.PipeArea IS NULL + AND pipe.PipeArea IN (N'1', N'2'); +GO + \ No newline at end of file diff --git a/SGGL/BLL/API/HJGL/APIWeldReportService.cs b/SGGL/BLL/API/HJGL/APIWeldReportService.cs new file mode 100644 index 00000000..b5dfc4af --- /dev/null +++ b/SGGL/BLL/API/HJGL/APIWeldReportService.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; + +namespace BLL +{ + /// + /// 焊接日报待审核接口服务适配层。 + /// + public static class APIWeldReportService + { + /// + /// 获取焊接日报待审核列表。 + /// + public static List GetPendingWeldingDailyTempDetailList( + string projectId, string unitWorkId, string weldingDate, string pipelineCode, string welderCode) + { + return WeldingDailyService.GetWeldingDailyTempDetailList(projectId, unitWorkId, + ParseWeldingDate(weldingDate), pipelineCode, welderCode); + } + + /// + /// 查看单条焊接日报待审核明细。 + /// + public static Model.WeldingDailyTempDetailItem GetPendingWeldingDailyTempDetail(string tempDetailId) + { + return WeldingDailyService.GetWeldingDailyTempDetailById(tempDetailId); + } + + /// + /// 批量审核通过焊接日报待审核明细。 + /// + public static string AuditPendingWeldingDailyTempDetails(string[] tempDetailIds, string auditMan) + { + // 审核规则、建日报、组批及状态回写统一由PC端已经使用的公共服务处理。 + return WeldingDailyService.AuditWeldingDailyTempDetails(tempDetailIds, auditMan); + } + + /// + /// 批量删除焊接日报待审核明细。 + /// + public static string DeletePendingWeldingDailyTempDetails(string[] tempDetailIds) + { + return WeldingDailyService.DeleteWeldingDailyTempDetails(tempDetailIds); + } + + private static DateTime? ParseWeldingDate(string weldingDate) + { + if (string.IsNullOrWhiteSpace(weldingDate)) + { + return null; + } + + DateTime parsedDate; + if (!DateTime.TryParse(weldingDate, out parsedDate)) + { + throw new ArgumentException("焊接日期格式不正确"); + } + + return parsedDate.Date; + } + } +} diff --git a/SGGL/BLL/BLL.csproj b/SGGL/BLL/BLL.csproj index 25a9b42c..d06c89e6 100644 --- a/SGGL/BLL/BLL.csproj +++ b/SGGL/BLL/BLL.csproj @@ -205,6 +205,7 @@ + @@ -918,4 +919,4 @@ --> - \ No newline at end of file + diff --git a/SGGL/BLL/CLGL/TwArrivalStatisticsService.cs b/SGGL/BLL/CLGL/TwArrivalStatisticsService.cs index 81697dda..adb8ce8e 100644 --- a/SGGL/BLL/CLGL/TwArrivalStatisticsService.cs +++ b/SGGL/BLL/CLGL/TwArrivalStatisticsService.cs @@ -259,28 +259,60 @@ namespace BLL /// /// /// - public static List GetPipeMatMatch(string projectId, List pipelineIds, string warehouseCode, Dictionary> priorityWeldJoints = null) + public static List GetPipeMatMatch(string projectId, List pipelineIds, string warehouseCode, Dictionary> priorityWeldJoints = null, string pipeArea = null) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { var results = new List(); + if (pipelineIds == null || !pipelineIds.Any()) + { + return results; + } + pipelineIds = pipelineIds.Where(x => !string.IsNullOrEmpty(x)).Distinct().ToList(); + if (!pipelineIds.Any()) + { + return results; + } - // 获取所需材料列表 - var pipeLineMats = (from x in db.HJGL_PipeLineMat - join z in db.HJGL_Pipeline on x.PipelineId equals z.PipelineId - join m in db.WBS_UnitWork on z.UnitWorkId equals m.UnitWorkId - join w in db.HJGL_WeldJoint on x.WeldJointId equals w.WeldJointId into weldJoin - from w in weldJoin.DefaultIfEmpty() - // 材料匹配只处理所需量大于0的非散件材料,避免零用量明细占用库存或影响焊口生成任务单判断。 - where z.ProjectId == projectId && pipelineIds.Contains(z.PipelineId) && x.PrefabricatedComponents != "" && (x.Number ?? 0) > 0 - select new - { - PipeLineMat = x, - PipelineCode = z.PipelineCode, - UnitWorkId = z.UnitWorkId, - UnitWorkName = m.UnitWorkName, - WeldJointCode = w == null ? null : w.WeldJointCode - }).ToList(); + // 先保留当前区域内已焊和未焊数据,用于识别“已经开工但尚未完成”的续作组件。 + var pipeLineMatQuery = from x in db.HJGL_PipeLineMat + join z in db.HJGL_Pipeline on x.PipelineId equals z.PipelineId + join m in db.WBS_UnitWork on z.UnitWorkId equals m.UnitWorkId + join w in db.HJGL_WeldJoint on x.WeldJointId equals w.WeldJointId into weldJoin + from w in weldJoin.DefaultIfEmpty() + // 先保留组件全部材料行,避免数量为0的历史已焊口导致续作组件识别遗漏。 + where z.ProjectId == projectId && pipelineIds.Contains(z.PipelineId) + && x.PrefabricatedComponents != null && x.PrefabricatedComponents != "" + select new + { + PipeLineMat = x, + PipelineCode = z.PipelineCode, + UnitWorkId = z.UnitWorkId, + UnitWorkName = m.UnitWorkName, + WeldJoint = w + }; + + string jointAttribute = GetJointAttributeByPipeArea(pipeArea); + bool filterByPipeArea = !string.IsNullOrEmpty(jointAttribute); + if (filterByPipeArea) + { + // 页面用途以材料表 PipeArea 为准,工厂/现场只能匹配相应类型的焊口。 + pipeLineMatQuery = pipeLineMatQuery.Where(x => x.PipeLineMat.PipeArea == pipeArea + && x.WeldJoint != null + && x.WeldJoint.JointAttribute == jointAttribute); + } + + var allPipeLineMats = pipeLineMatQuery.ToList(); + var continuationComponentKeys = new HashSet(allPipeLineMats + .Where(x => x.WeldJoint != null && !string.IsNullOrEmpty(x.WeldJoint.WeldingDailyId)) + .Select(x => GetComponentKey(x.PipeLineMat.PipelineId, x.PipeLineMat.PrefabricatedComponents))); + + // 页面匹配只展示并消耗尚未焊接的焊口材料;不传区域的旧调用保留原查询行为。 + var pipeLineMats = filterByPipeArea + ? allPipeLineMats.Where(x => x.WeldJoint != null + && x.WeldJoint.WeldingDailyId==null + && (x.PipeLineMat.Number ?? 0) > 0).ToList() + : allPipeLineMats.Where(x => (x.PipeLineMat.Number ?? 0) > 0).ToList(); var materialCodes = pipeLineMats .Where(x => !string.IsNullOrEmpty(x.PipeLineMat.MaterialCode)) @@ -311,17 +343,16 @@ namespace BLL { lib = libByMaterialCode[x.PipeLineMat.MaterialCode]; } - // 未反写时只能按导入材料编码 Code 找候选材料库,用于展示材料名称、规格等基础信息。 + // 未反写时只能按导入材料编码 Code 找候选材料库。 else if (!string.IsNullOrEmpty(x.PipeLineMat.MaterialCode2) && libByCode.ContainsKey(x.PipeLineMat.MaterialCode2)) { lib = libByCode[x.PipeLineMat.MaterialCode2]; } - // MaterialCode 对外展示导入材料编码,避免把临时匹配出的材料主编码误当成已确认结果。 string code = !string.IsNullOrEmpty(x.PipeLineMat.MaterialCode2) ? x.PipeLineMat.MaterialCode2 : lib?.Code; return new Tw_PipeMatMatchOutput - { - Id = Guid.NewGuid().ToString(), + { + Id = Guid.NewGuid().ToString(), PipeLineMatId = x.PipeLineMat.PipeLineMatId, PipelineId = x.PipeLineMat.PipelineId, PipelineCode = x.PipelineCode, @@ -329,7 +360,7 @@ namespace BLL UnitWorkName = x.UnitWorkName, PrefabricatedComponents = x.PipeLineMat.PrefabricatedComponents, WeldJointId = x.PipeLineMat.WeldJointId, - WeldJointCode = x.WeldJointCode, + WeldJointCode = x.WeldJoint == null ? null : x.WeldJoint.WeldJointCode, MaterialCode = code, MatchMaterialCode = x.PipeLineMat.MaterialCode, Code = code, @@ -342,29 +373,179 @@ namespace BLL NeedNum = x.PipeLineMat.Number, }; }).ToList(); - var newRequiredMaterials = new List(); + + var orderedPipelineMaterials = new Dictionary>(); + foreach (string id in pipelineIds) + { + orderedPipelineMaterials[id] = requiredMaterials + .Where(x => x.PipelineId == id) + .OrderBy(x => x.PrefabricatedComponents) + .ThenBy(x => x.WeldJointCode) + .ThenBy(x => x.MaterialCode) + .ThenBy(x => x.PipeLineMatId) + .ToList(); + } + + var newRequiredMaterials = new List(); + var addedMaterialIds = new HashSet(); + + // 先处理全部管线的手动优先焊口,保证人工选择始终高于任何自动优先规则。 foreach (string id in pipelineIds) { - var pipelineMaterials = requiredMaterials.Where(x => x.PipelineId == id).ToList(); if (priorityWeldJoints != null && priorityWeldJoints.ContainsKey(id) && priorityWeldJoints[id] != null && priorityWeldJoints[id].Any()) { - // 手动优先焊口只改变本次匹配消耗顺序,不写入长期规则。 var weldJointIds = priorityWeldJoints[id]; - newRequiredMaterials.AddRange(pipelineMaterials + var manualPriorityMaterials = orderedPipelineMaterials[id] .Where(x => weldJointIds.Contains(x.WeldJointId)) - .OrderBy(x => weldJointIds.IndexOf(x.WeldJointId))); - newRequiredMaterials.AddRange(pipelineMaterials - .Where(x => !weldJointIds.Contains(x.WeldJointId))); - } - else - { - newRequiredMaterials.AddRange(pipelineMaterials); + .OrderBy(x => weldJointIds.IndexOf(x.WeldJointId)) + .ThenBy(x => x.PrefabricatedComponents) + .ThenBy(x => x.WeldJointCode) + .ThenBy(x => x.MaterialCode) + .ToList(); + newRequiredMaterials.AddRange(manualPriorityMaterials); + foreach (var item in manualPriorityMaterials) + { + addedMaterialIds.Add(item.PipeLineMatId); + } } } + + // 再处理全部续作组件,避免前一条管线的未开工组件抢占后一条管线续作组件的库存。 + foreach (string id in pipelineIds) + { + var continuationMaterials = orderedPipelineMaterials[id] + .Where(x => !addedMaterialIds.Contains(x.PipeLineMatId) + && continuationComponentKeys.Contains(GetComponentKey(x.PipelineId, x.PrefabricatedComponents))) + .ToList(); + newRequiredMaterials.AddRange(continuationMaterials); + foreach (var item in continuationMaterials) + { + addedMaterialIds.Add(item.PipeLineMatId); + } + } + + // 最后处理所有尚未开工组件,保持管线及组件内的稳定排序。 + foreach (string id in pipelineIds) + { + newRequiredMaterials.AddRange(orderedPipelineMaterials[id].Where(x => !addedMaterialIds.Contains(x.PipeLineMatId))); + } + results = GetMatMatchOutput(newRequiredMaterials, warehouseCode, projectId, true); + // 组件匹配率以当前区域剩余未焊口的材料需求为口径,并回填到每条明细供表格合并展示。 + foreach (var componentGroup in results.GroupBy(x => new { x.PipelineId, x.PrefabricatedComponents })) + { + decimal needNum = componentGroup.Sum(x => x.NeedNum) ?? 0; + decimal matchNum = componentGroup.Sum(x => x.MatchNum) ?? 0; + decimal componentMatchRate = needNum > 0 ? matchNum / needNum : 0; + string componentMatchRateString = Math.Round(componentMatchRate * 100, 2).ToString() + "%"; + foreach (var item in componentGroup) + { + item.ComponentMatchRate = componentMatchRate; + item.ComponentMatchRateString = componentMatchRateString; + } + } return results; } } + + /// + /// 获取单位工程下当前区域内同时存在已焊口和未焊口的组件汇总。 + /// + public static List GetPartialWeldedComponents(string projectId, string unitWorkId, string pipeArea, string warehouseCode) + { + string jointAttribute = GetJointAttributeByPipeArea(pipeArea); + if (string.IsNullOrEmpty(projectId) || string.IsNullOrEmpty(unitWorkId) || string.IsNullOrEmpty(jointAttribute)) + { + return new List(); + } + + using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) + { + var componentWeldRows = (from x in db.HJGL_PipeLineMat + join z in db.HJGL_Pipeline on x.PipelineId equals z.PipelineId + join m in db.WBS_UnitWork on z.UnitWorkId equals m.UnitWorkId + join w in db.HJGL_WeldJoint on x.WeldJointId equals w.WeldJointId + where z.ProjectId == projectId && z.UnitWorkId == unitWorkId + && x.PipeArea == pipeArea + && x.PrefabricatedComponents != null && x.PrefabricatedComponents != "" + && w.JointAttribute == jointAttribute + select new + { + z.PipelineId, + z.PipelineCode, + z.UnitWorkId, + m.UnitWorkName, + x.PrefabricatedComponents, + w.WeldJointId, + w.WeldingDailyId + }).ToList(); + + var partialComponents = componentWeldRows + .GroupBy(x => new { x.PipelineId, x.PipelineCode, x.UnitWorkId, x.UnitWorkName, x.PrefabricatedComponents }) + .Select(group => + { + var weldJoints = group.GroupBy(x => x.WeldJointId).Select(x => x.First()).ToList(); + int weldedCount = weldJoints.Count(x => !string.IsNullOrEmpty(x.WeldingDailyId)); + int totalCount = weldJoints.Count; + return new Tw_PartialWeldedComponentOutput + { + UnitWorkId = group.Key.UnitWorkId, + UnitWorkName = group.Key.UnitWorkName, + PipelineId = group.Key.PipelineId, + PipelineCode = group.Key.PipelineCode, + PrefabricatedComponents = group.Key.PrefabricatedComponents, + PipeArea = pipeArea, + PipeAreaText = pipeArea == PipelineService.PipeArea_SHOP ? "工厂预制" : "现场安装", + TotalWeldJointCount = totalCount, + WeldedWeldJointCount = weldedCount, + UnweldedWeldJointCount = totalCount - weldedCount + }; + }) + .Where(x => x.WeldedWeldJointCount > 0 && x.UnweldedWeldJointCount > 0) + .OrderBy(x => x.PipelineCode) + .ThenBy(x => x.PrefabricatedComponents) + .ToList(); + + if (!partialComponents.Any()) + { + return partialComponents; + } + + // 导出匹配率复用页面匹配规则,保证区域、未焊口及续作组件优先级完全一致。 + var pipelineIds = partialComponents.Select(x => x.PipelineId).Distinct().ToList(); + var matchOutputs = GetPipeMatMatch(projectId, pipelineIds, warehouseCode, null, pipeArea); + var componentRates = matchOutputs + .GroupBy(x => GetComponentKey(x.PipelineId, x.PrefabricatedComponents)) + .ToDictionary(x => x.Key, x => x.First().ComponentMatchRate ?? 0); + foreach (var component in partialComponents) + { + decimal componentRate; + componentRates.TryGetValue(GetComponentKey(component.PipelineId, component.PrefabricatedComponents), out componentRate); + component.ComponentMatchRate = componentRate; + component.ComponentMatchRateString = Math.Round(componentRate * 100, 2).ToString() + "%"; + } + + return partialComponents; + } + } + + private static string GetJointAttributeByPipeArea(string pipeArea) + { + if (pipeArea == PipelineService.PipeArea_SHOP) + { + return "预制口"; + } + if (pipeArea == PipelineService.PipeArea_FIELD) + { + return "安装口"; + } + return null; + } + + private static string GetComponentKey(string pipelineId, string componentCode) + { + return (pipelineId ?? string.Empty) + "\u001f" + (componentCode ?? string.Empty); + } /// /// 根据管线材料匹配结果,获取管线匹配率 /// diff --git a/SGGL/BLL/HJGL/BaseInfo/MaterialCodeLibService.cs b/SGGL/BLL/HJGL/BaseInfo/MaterialCodeLibService.cs index 1972854d..1886d8eb 100644 --- a/SGGL/BLL/HJGL/BaseInfo/MaterialCodeLibService.cs +++ b/SGGL/BLL/HJGL/BaseInfo/MaterialCodeLibService.cs @@ -59,7 +59,8 @@ PipeGrade = codeLib.PipeGrade, MaterialUnit = codeLib.MaterialUnit, ProjectId = codeLib.ProjectId, - Code = codeLib.Code + Code = codeLib.Code, + DesignInstitute = codeLib.DesignInstitute }; db.HJGL_MaterialCodeLib.InsertOnSubmit(newCodeLib); db.SubmitChanges(); @@ -89,6 +90,7 @@ newCodeLib.PipeGrade = codeLib.PipeGrade; newCodeLib.MaterialUnit = codeLib.MaterialUnit; newCodeLib.Code = codeLib.Code; + newCodeLib.DesignInstitute = codeLib.DesignInstitute; db.SubmitChanges(); } } @@ -231,6 +233,12 @@ /// [ExcelColumnName("类型")] public string MaterialName { get; set; } + + /// + /// 材料编码来源设计院。 + /// + [ExcelColumnName("所属设计院")] + public string DesignInstitute { get; set; } } } diff --git a/SGGL/BLL/HJGL/WeldingManage/PipelineMatService.cs b/SGGL/BLL/HJGL/WeldingManage/PipelineMatService.cs index 0c00a027..ca07e9bc 100644 --- a/SGGL/BLL/HJGL/WeldingManage/PipelineMatService.cs +++ b/SGGL/BLL/HJGL/WeldingManage/PipelineMatService.cs @@ -36,6 +36,7 @@ namespace BLL PipelineId = pipelineMat.PipelineId, Number = pipelineMat.Number, PrefabricatedComponents = pipelineMat.PrefabricatedComponents, + PipeArea = pipelineMat.PipeArea, }; db.HJGL_PipeLineMat.InsertOnSubmit(newPipelineMat); db.SubmitChanges(); @@ -57,6 +58,7 @@ namespace BLL newPipelineMat.PipelineId = pipelineMat.PipelineId; newPipelineMat.Number = pipelineMat.Number; newPipelineMat.PrefabricatedComponents = pipelineMat.PrefabricatedComponents; + newPipelineMat.PipeArea = pipelineMat.PipeArea; db.SubmitChanges(); } } @@ -80,6 +82,20 @@ namespace BLL } } + /// + /// 更新材料用途,1 为工厂预制,2 为现场安装。 + /// + public static void UpdatePipeArea(string pipelineMatId, string pipeArea) + { + Model.SGGLDB db = Funs.DB; + Model.HJGL_PipeLineMat pipeLineMat = db.HJGL_PipeLineMat.FirstOrDefault(e => e.PipeLineMatId == pipelineMatId); + if (pipeLineMat != null) + { + pipeLineMat.PipeArea = pipeArea; + db.SubmitChanges(); + } + } + /// /// 根据材料匹配结果反写材料主编码 /// diff --git a/SGGL/BLL/HJGL/WeldingManage/WeldingDailyService.cs b/SGGL/BLL/HJGL/WeldingManage/WeldingDailyService.cs index b55df11b..eada6c80 100644 --- a/SGGL/BLL/HJGL/WeldingManage/WeldingDailyService.cs +++ b/SGGL/BLL/HJGL/WeldingManage/WeldingDailyService.cs @@ -295,6 +295,179 @@ namespace BLL } #region 焊接日报待审核 + /// + /// 获取焊接日报待审核明细列表。 + /// + /// 项目ID + /// 单位工程ID,为空时不按单位工程过滤 + /// 焊接日期,为空时不按日期过滤 + /// 管线编号关键字 + /// 焊工编号关键字 + /// 待审核明细列表 + public static List GetWeldingDailyTempDetailList(string projectId, + string unitWorkId, DateTime? weldingDate, string pipelineCode, string welderCode) + { + if (string.IsNullOrEmpty(projectId)) + { + return new List(); + } + + using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) + { + var query = QueryPendingWeldingDailyTempDetails(db); + query = query.Where(x => x.ProjectId == projectId); + if (!string.IsNullOrEmpty(unitWorkId)) + { + query = query.Where(x => x.UnitWorkId == unitWorkId); + } + if (weldingDate.HasValue) + { + DateTime startDate = weldingDate.Value.Date; + DateTime endDate = startDate.AddDays(1); + query = query.Where(x => x.WeldingDate >= startDate && x.WeldingDate < endDate); + } + if (!string.IsNullOrEmpty(pipelineCode)) + { + query = query.Where(x => x.PipelineCode != null && x.PipelineCode.Contains(pipelineCode)); + } + if (!string.IsNullOrEmpty(welderCode)) + { + query = query.Where(x => (x.CoverWelderCode != null && x.CoverWelderCode.Contains(welderCode)) + || (x.BackingWelderCode != null && x.BackingWelderCode.Contains(welderCode))); + } + + var data = query.OrderBy(x => x.PipelineCode).ThenBy(x => x.WeldJointCode).ToList(); + SetWeldingDailyTempDetailAttachUrls(db, data); + return data; + } + } + + /// + /// 获取单条焊接日报待审核明细。 + /// + /// 待审核明细ID + /// 待审核明细,不存在时返回空 + public static Model.WeldingDailyTempDetailItem GetWeldingDailyTempDetailById(string tempDetailId) + { + if (string.IsNullOrEmpty(tempDetailId)) + { + return null; + } + + using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) + { + var data = QueryPendingWeldingDailyTempDetails(db) + .Where(x => x.TempDetailId == tempDetailId) + .Take(1) + .ToList(); + SetWeldingDailyTempDetailAttachUrls(db, data); + return data.FirstOrDefault(); + } + } + + /// + /// 构造待审核查询。PC端列表和接口列表、明细均从这里读取,确保字段映射和待审核状态一致。 + /// + private static System.Linq.IQueryable QueryPendingWeldingDailyTempDetails(Model.SGGLDB db) + { + // 待审核模块只展示 AuditState=0;审核、删除仍复用本类下方已有批量业务方法。 + return from temp in db.HJGL_WeldingDailyTempDetail + join jotItem in db.View_HJGL_WeldJoint on temp.WeldJointId equals jotItem.WeldJointId into jotItems + from jot in jotItems.DefaultIfEmpty() + join coverItem in db.SitePerson_Person on temp.CoverWelderId equals coverItem.PersonId into coverItems + from coverWelder in coverItems.DefaultIfEmpty() + join backingItem in db.SitePerson_Person on temp.BackingWelderId equals backingItem.PersonId into backingItems + from backingWelder in backingItems.DefaultIfEmpty() + join locationItem in db.Base_WeldingLocation on temp.WeldingLocationId equals locationItem.WeldingLocationId into locationItems + from location in locationItems.DefaultIfEmpty() + join submitItem in db.Person_Persons on temp.SubmitPersonId equals submitItem.PersonId into submitItems + from submitPerson in submitItems.DefaultIfEmpty() + where temp.AuditState == 0 + select new Model.WeldingDailyTempDetailItem + { + TempDetailId = temp.TempDetailId, + ProjectId = temp.ProjectId, + UnitId = temp.UnitId, + UnitWorkId = temp.UnitWorkId, + WeldJointId = temp.WeldJointId, + PipelineId = jot == null ? null : jot.PipelineId, + PipelineCode = jot == null ? null : jot.PipelineCode, + WeldJointCode = jot == null ? null : jot.WeldJointCode, + WeldingDate = temp.WeldingDate, + CoverWelderId = temp.CoverWelderId, + CoverWelderCode = coverWelder == null ? null : coverWelder.WelderCode, + BackingWelderId = temp.BackingWelderId, + BackingWelderCode = backingWelder == null ? null : backingWelder.WelderCode, + JointAttribute = temp.JointAttribute, + WeldingLocationId = temp.WeldingLocationId, + WeldingLocationCode = location == null ? null : location.WeldingLocationCode, + WeldingMode = temp.WeldingMode, + Material1Code = jot == null ? null : jot.Material1Code, + Material2Code = jot == null ? null : jot.Material2Code, + DNDia = jot == null ? null : jot.DNDia, + Size = jot == null ? (decimal?)null : jot.Size, + Dia = jot == null ? (decimal?)null : jot.Dia, + Thickness = jot == null ? (decimal?)null : jot.Thickness, + WeldTypeCode = jot == null ? null : jot.WeldTypeCode, + WeldingMethodCode = jot == null ? null : jot.WeldingMethodCode, + WeldingWireCode = jot == null ? null : jot.WeldingWireCode, + WeldingRodCode = jot == null ? null : jot.WeldingRodCode, + SubmitPersonId = temp.SubmitPersonId, + SubmitPersonName = submitPerson == null ? null : submitPerson.PersonName, + SubmitDate = temp.SubmitDate, + AttachUrl = temp.AttachUrl, + AuditState = temp.AuditState, + AuditMan = temp.AuditMan, + AuditDate = temp.AuditDate, + AuditRemark = temp.AuditRemark + }; + } + + /// + /// 按待审核明细ID批量回写焊前、焊后附件地址。 + /// + private static void SetWeldingDailyTempDetailAttachUrls(Model.SGGLDB db, + List data) + { + if (data == null || data.Count == 0) + { + return; + } + + var toKeyIds = data.SelectMany(x => new[] + { + x.TempDetailId + "#Before", + x.TempDetailId + "#After" + }).ToList(); + var attachUrlMap = db.AttachFile + .Where(x => x.MenuId == Const.HJGL_WeldReportMenuId && toKeyIds.Contains(x.ToKeyId)) + .Select(x => new { x.ToKeyId, x.AttachUrl }) + .ToList() + .GroupBy(x => x.ToKeyId) + .ToDictionary(x => x.Key, x => x.Select(y => y.AttachUrl).FirstOrDefault()); + + foreach (var item in data) + { + string beforeUrl; + if (attachUrlMap.TryGetValue(item.TempDetailId + "#Before", out beforeUrl)) + { + // API统一返回斜杠路径,PC端继续兼容原有反斜杠路径显示逻辑。 + item.BeforePhotoUrl = NormalizeAttachUrl(beforeUrl); + } + + string afterUrl; + if (attachUrlMap.TryGetValue(item.TempDetailId + "#After", out afterUrl)) + { + item.AfterPhotoUrl = NormalizeAttachUrl(afterUrl); + } + } + } + + private static string NormalizeAttachUrl(string attachUrl) + { + return string.IsNullOrEmpty(attachUrl) ? attachUrl : attachUrl.Replace('\\', '/'); + } + /// /// 移动端按焊口保存焊接日报待审核明细 /// @@ -610,9 +783,9 @@ namespace BLL return weldingDaily; } - var submitPerson = Funs.DB.Person_Persons.FirstOrDefault(x => x.PersonId == tempDetail.SubmitPersonId); - string personName = submitPerson != null ? submitPerson.PersonName : string.Empty; - string perfix = string.Format("{0:yyyyMMdd}", tempDetail.WeldingDate) + "-" + personName + "-"; + var submitUnitwork = Funs.DB.WBS_UnitWork.FirstOrDefault(x => x.UnitWorkId == tempDetail.UnitWorkId); + string unitWorkName = submitUnitwork != null ? submitUnitwork.UnitWorkName : string.Empty; + string perfix = string.Format("{0:yyyyMMdd}", tempDetail.WeldingDate) + "-" + unitWorkName + "-"; weldingDaily = new Model.HJGL_WeldingDaily { WeldingDailyId = Guid.NewGuid().ToString(), diff --git a/SGGL/FineUIPro.Web/File/Excel/DataIn/MaterialCodeLib.xlsx b/SGGL/FineUIPro.Web/File/Excel/DataIn/MaterialCodeLib.xlsx index d03e27fbe6c8a4c293581c01756e3a8f12ddec55..e5222ed6f125023a93048cd61bc1fff9b2564877 100644 GIT binary patch literal 4807 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 a{||wI&?G0i_~gQh5&$GJ(Q}%U-oF9tb}sn< literal 10457 zcmeHtg~Us_OHWqAUa?1^^lW3jhE}0Y)cT=6YZNKrAExfDV8K*A}(2bvCti z)>rkgH+9lwa<{Q2$%6!^$pL_auK(ZiU;G3r5=RtzSy04pq#i|g7-d%KgkWDE2MnUo zDGBuSB@C1qYiCgz|n&j6%4H1{fVh;0hXRN$FoVhQ+dXDtoBLtP(eMJUrM z;Tc*6ZYaE4L*@QbI*qbDi9Ta#LF=h^vCSwA8A;~3g5|1Ls7R`zLTjYl>Uf_b+vP;l z!ai$Y48Fz^65ENiI<^ko-o-^E&w*E08gW^sH4tk>-|eO2^`V<4I`UHSzKs*pT%S=p zTgaa@U}^!NXcgIjRmo;M?%gMdnJ+i;<1@+X1LY<J){)gp~o9T2YjAK6T8}h zCuhkAzHHCX0Km%&1VHg`v}{ykA-@FqnjDCAuRyfacQmzjVrKen`#(DV7jy70w_Xu1 z|F)L}A>>r*F?8r=b~P47MAl7Ms-0BT$4`0%xiKoA0)MrengB%=FAze~x6|kG%knCJ z)Zq~6^%h4(BpL=Ed6QdZNXor~3k)5VW3q%p#bzI>>+IF+b(*A%2aRiI3|)CkNv`bh zI=RI3nOH5#IFmXa9C{%^2-cf4f2{#|%{8OjDzI4*mE+2gnr5z?!-Vk+-}&UC14O|v z9=W5bG|V9}bo8l!ASUNR4T6YHJ}v5ao?Coe{Y%pqkm4zydg zamhi-oGV|g29C3lERQ}exZd)iAHxBW#3gH>4E0ZvJZGkQ?1KoR38D}(=*hTSGrQS2 zS{d2dS^bu`3e-kzmxNHd)DQVIJh`615Hwg(H;ct(=$2ybg+(GeH`I=F-8zxPl%hMY zq3%)MTq&y^OsmSQ=hbtDpfFh&Ew&TIJRNhfuUEuG&pQ<8qQ@zZ@tdg06`<~2_|+AL zG7UgM7(xr^YqW9js1 z1kff+q{9XTa!`m3#2IE38TX~Ksgks8@!)vX<_H`(2u8vsK!uT@CJPB7TEr)t*S-+6 z;6#=)OnMVh16Yeulely z=U-0-NbJ&2bkTnB+SZK$-a0OGOKB?AA@Nx{fvx1_J^P#NuH?C=VQ|gg<4t>zDTvwBtJ} zc3p>ijg^p0*yr#Kfqh(XJL4xb#I;Ndx|TII zCLL3UOJ2T`i9|z=-5a-&1eX?w8E4^poM67xi-x>-8P{`W$n_N3S6h8XVreCHB9zxI>8kP@hkCmz$NeB^Hb@UGd3-(E>`rQDTyW#^B{nr? zIBnL838H*GpgAD4D&&pC0J+Sa0K&|YDovAD2VI!zFM0madgh8@5AAeE!afQIH~l62blyDzPx z%h%AK0z8N(FL2?c`4K$;liy}Y>2HDJ*RbaukMHF@#;kz(_XxWL<+4O&uitouIFp19 zNfP_g#yjoirM0V_ZaRxRe4*`LK4%!YJbk}2JUF`!8tH$A(P`O~qh*l0j6(qcIG`*3 z2%}Esrl!tL%s+Rmzs1wc1o_Bi7L<_F;AfazPX=E~6Zy=-8pKsu+Ep9RcRLOYMw$}w zTyTXio#czsNdA-+wXd%cPTAR~+^^hK89gA33r}Ry#aJmP;B<#=)u;5UGZy2~zPqcR zy>nBXLf5!&d49BTnRsu950H$VSd8Z!yMi))$C1+#<%~=yVQGWmc5C7K^%~k8Q>@I? zf`B=7t1h2Bm*s}VSyvY9trh}2FP8{H!;0ZkQ(Whp>BJV8;+93^Cpq(3awB@}0|hXd zaJ2r5s_76r?W2d(9i7;GAYVTt*CecUqYpMSPXyTe-J#1oezR>{d)Q!a zGm0_cT9U`nt;h*TN3MJ*MP3&=!3&Kgz&}SOeLq8)T?Js5GP{xde)|V_4Ior`RN;Vv}028j1JNa(hc>rUzpWt>eSd&m1&ry zzS2Y2Rmde_&>_g9B~&WY=_*Gis9eZcCm~#ZluJ6Yju*Bh6pjFD`Jwd-O|tPB<3F+S z;Xj#_z*Ea%QkBqUvZ~?al-UDS4a3SlW2ywB>I4f+7z<&Odcptv-JctdQ6T(h78J+{ zeYgj(cc_!1(~;E30o^FaoN$K<3k+BAFD=h&Q)t8zNw3 z)MWUtbwzI$C4&Yix>At+_D=kh5YFbNHm1x!w?DaXq^129UlPNodgg^?=>`(t8k~me z^8k{33tXnE2SN2Y7umuxX77?E37LX-miJ~d>2&gikHOh# zn#+9d1Ub2fh(a5yPh+NIHe=bFhmGxUqA+4oU#7JbyL8}Dq(#>XEmU9GHfpC}fm2{A zw5OgW&IEwP0ULL3*4raeROQeD`~;F@Td?|MOl8^G*@Bie^!9M2H#K7-A?aH%Cgs#O zL^m>O(iW91e5imNh>8*D2JN%oCu4K41s`t@M+ODgJz)ib=ZX>u{yD1B-sC1m>arwA zxj@&O5j;|uIv^x(PX(4=3zMLALOY!hf-DrWrSPy96#Iy}*$-ufz8Q=qaNQBFU1uI) zH{ZD-3?(y)hLth~Jx#(hEFbf!{201;{i|ox@uECn?1Zoc1^w-G zH8ZPQ+#w=xJI5h1AGXuPG6MF|~!a|gsEl}TNms!*%Z@gjB0!#>n zV9LkgnG}SI!tOyU@CIxFOu2W_Y!lzhR!$K-&aGo!l;-tsQwF?pzJ5nTZEGPPivTsM z%Gd&?69~RDdSSQ5?;8PH9i3kmC!bDZi1@kNUb1#~QK~jM=+L^J54YC^yF-0E@B6KA6gj!417eG$)VA*E0(CUO*?SWuTogr{UIb{=qZ4s=f9b{b8IJy8^)m z^nS%y@H~L4u_7RN`HAEF74{REEzCB=rz2d_a0{Hm%43^}&B76s6xhgPzzcupKwA8i>rD zb$GIz$bBNvin5Xymp{cVbeYig$F}0|d!kf;96Nhj(RWo|(so%g0r5{!z}nC3 zJr)7|9Ag<9F4WG3b{EN0j94ew{uvlrf??RzN=+0$XdvC3@aB(k_}Y`ZlAqlPVF!JS zhgpY4I_vi+Ct}&Bg$xB7ZI)7bzz4vl2QVrhzA(mepAaW}^PY{p>U4g?Wie>$XFFu! zh?d?}xowC+;9jv^s^`q#WXiX8CRfg2HF%$C(c)|9Rv+%_)KYX0|Y337xtmo&!hmOVpl9O%Sw%$%!OD;)VW z>@fsUFLgKqhgW_87;HFe^Vp3;(Xy>o95WUIx{OUz3a7a^G29ducDCkGjwFI@8|Zut z36b{$nzPf)R)XQP(5FkwPW`m|VNsKGYzZ^DIXt5q4WIX_Ix=eNW-ZGWR|=D&EQ^fo zlR35OIL{{T^9zBaaj!R{aDkqj8XiRN$F$s1^MyTEXI+~G@Y=*91=O*Jan|6Rh!0%e z-j`Tsa(qk*5B}z|U@(C`g6^dn+f=gH71%J%T}o5MCcZM^dAe1&nd*8(nbkZv6<655 zV?xVY0TnsBXz3@CIU7KPV7_S_?>}GYvkqhk=#5r{!@s7cs)w7e<-&e4)C@^$Z+z$r z$l{HKD}7h{(Z)Pg(gU_;=3_$CbG;hNcMrxMl_-Vc{uOY@-t{7=g-I92gDa_$h%u%W z)(dBdAz9i}dNSAT6Vk()t_9$R4`EqNHd7LdG#93@eot;}Q>TdE?h)zyA-C~w5HGU~6NRk3Tt zB~a{XEeJ@3Erm6lFxS%m;h1qMWFu~GX}e4hspLJ(NhF0WrA@>)!M&KlnaV-G?6JFg z+}f;U-<0mwM&24*=vy@XCcjp4G>v|2xWC!$lNr0Kt>NHYzrwt+rPR_kZP{}EX5>eQ zk9S;ATiuF3#)!B-U?P=2$Vq!5cwDZro_G;L`Ii5+oq~x1D%lkdQVJfz)vrStqtJ9T zQb;+vN!U+3-5?GF5e27}zd>rM$AuUV!iLzWK;B2*wf-5KhrQ$LR~fCSxtaKZ&w38Y zPJ4X&d`@F&xDlQ6$^Ojzj@x~apSwy{;>3Z7S>{{8^%h+#M z#Jp^NEU#b2U-r4361UsZ`Gv6@L=IZ;3dR=n@wh_pwW5!%qCB%jZS^Q@vSmvT^Sd5P z2k=656?}2jhPP(MV26Y8?5vCg(4Q9!rK#z>kpcCi3bDQR`wEx^pMyGx>5TmUtrc8|w3X z4Jm&<7D8LN zneCYhe`m3Hz#k(Z` z9Fto)2Mrd+=0-%p^h4(+zdk$?{x&&5pcdn7Vq_Ler>ft$QEXJ;hIpycdM~7A$~oE# zqX(^OIHsH(`@vkEeElG`Xi;rx)pma7wfKB(++eGu=VqU7TSC`D)mOQ4SOg&hOWpcP za1_nctz277e`o-2$mDAbmDx?=G13P~#YTC=THANDkgscHNK3-ibez?>)t4LVe;&XK z%U8IT$)I~YexDhm3(leXd0oU!IbCLXO{=z(ULnd%-_P&q=>;xY;UBtQ{{aNb)<Hg*o;F8%iOJ^(-VPGB+ghxrY4C19*1O#J z21m_oKQx6sZ9MJ)8_4R}s2P=oSX+%MBRHirTj}Q9nvZYEr@f%c;k=>HAzo9a%X6*u z-1Bj$X&JNFI!r-|4SkPZziyh0^x5&A+tZ+obvl!PlgL$MJp0hI zf#Y^1NSQvOS1oDl62e zk3S`>GY8b-Yu^qLZ38RK^W$|89k3|o-CltNFg=38s)Q{`c*S@xxV|OmzKEe1_iorL zL|EY53g;@b$bzxP2=7AECaj?Z#|*P!u>Jx@SP}I%moPiGlb#QaJ+P`==;Re$@E=*? z(!){b(4ZtzWgy7`T?2eKe8rfF4CjhST~b0|pYMf)RrOw#y_2<(`C!l#5+oS>#gWAV zF3nzvI4uKB+bNK3*9S#C40m&jweZz9LD9=%^|jm6qmsowKrS@`jh_;M?O^P)kQfs}zo`rkWKUKwn4cU@wt^T=rppNv z0-G%p!mgeSj!A1)obV?d99ci0v|m@UypECzCq%kOEbC|3j1rW*ApbeOSLD`tkK%9; zm2OxP3u1<$WB`dpO&mjXOxi>i`}VBhBpTLX#gEe#xQ0RUa~7`^ zicN!1IW>#LwJsJuqDm~7WnEbWl7#9Bp0t7V_!%j~*bWjCbAbE@Bs=%(1HJ z4L)99Zk1E-``#Tr_6q8HJ-sO7eaE7SyijzwyIjULBi7Fp=)8SA+Nyq`E3AFT=3eN1 z6Laxau#4<4qS!%V8au|f?bakJ{fI!BXZvg9^o_62vu-Y7#(=8AdiUeO+1(;?VX#JZ zV72VoB7Tt9Z2`(>34_F24{mMRm#S~QJg=NsDOziaf=`oA0zwKf=Uh0(XtVN3;es2h z$1K)$5Tq$9ZVocpUt^2H^Uw8}2lrqyy*#{4)h!&+2~WoVMpaI#fi0K3vnfCTs=bKt z9vAdml>t2HZkEiCm%?|0T~Y$w;lv@(LwCA29g<2B;+Nv*cZipXJUbNbnJcmJa1Lcv$#X}0RAE=OxgNy-V$km%gBv_Jt&89v!#C3t~nY~l}i3!5y$hP!X{3xIQ2)07s7Ej*MLO(@djCc zN9U2o_LJFF?^QS5VR_{4QDN5GrGq=-NU>Cn?tc|_1Xvx)R6u8RL24%|NE|n@Ggfr8 zvv*=PwsSQ7qt)SmnmEXzg5rTPAWb~vG~g8UfD#(o7;=vTzGUm5=qPmro49f<6j6q| z-k^54pB;SHgiY)S|4vcOeF$5W^?Ap~t3zxOwggoe=(4kw(<(}`(uCJcc zx0FiX=mRUYZ)K}7h9Y&lz%eoC`nxg55A$w>V*QbO@4vz93bb};jVTc&a3e{hP1RH8 zGDzcO2{Z-9+%MaE=dQ%O#7Id?NlRwdII)ot0X$M3Zbf(gU2`AP&RpCf`i@Q)=k9;krN3Ub6G_t2!%a4yAMx^p}*uw8&<8G}yT_bhn^0#8%q@`CXx zS>&X9=*)Z0%9%j}S9NL5VD#p+JIQXrmnLrQYHMXtPy@=xs1RD&9t(Y(=Ai{$pEtLC z@nK&uzkGnfT^2GiJO37#3Z*YB1i?!B3Y)!2tYRQjvNI?tLNuO`wh);1O;#(^6|l;0**T)NBx^3Y8eGCBb~oWGF?t9mX=N zY*!g9qQZbB=0`^-V=)0S{{ZH%bFHg6W+y|=_j1T2cOJ0fjuKp3d{R27M zB%84;T;`-cOlEW&_&xao_9GLUuG|UC*vQTMccb*5ug9F{d{4Lr-VC(U-Jl28AfDRO z?8##0M$i~3)QZAFmk;0UVk#<;Uz4hrtLJcqq=?G|AGw~mEW@w z7&s#+^Za`g*?-3FKl^`aDN~gFyMe#AyZi_E+dc&X^!op2^UJTmUt0kFgm!?M0)A-- z_!a#3xzazO0Kf#?Pw@X|=JZ!PzfPe2X$b=1|NV)7OsD;7<=0t_#e?xQ5Fg`x&Qz?=;H^9prTa29sM76W^2U& diff --git a/SGGL/FineUIPro.Web/File/Excel/DataIn/PipelineMat.xlsx b/SGGL/FineUIPro.Web/File/Excel/DataIn/PipelineMat.xlsx index f5949321ad7f988ec0aa04f8a6428067d7db18a0..def3989f4914c870e07b59de073fe8e6c4852252 100644 GIT binary patch literal 3710 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 VC<8HnehCNl_CfiC9MR9G{{vG`K^Xu5 diff --git a/SGGL/FineUIPro.Web/File/Fastreport/无损检测委托单_附件6.frx b/SGGL/FineUIPro.Web/File/Fastreport/无损检测委托单_附件6.frx new file mode 100644 index 00000000..868c0f75 --- /dev/null +++ b/SGGL/FineUIPro.Web/File/Fastreport/无损检测委托单_附件6.frx @@ -0,0 +1,344 @@ + + + using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Windows.Forms; +using System.Drawing; +using System.Data; +using FastReport; +using FastReport.Data; +using FastReport.Dialog; +using FastReport.Barcode; +using FastReport.Table; +using FastReport.Utils; + +namespace FastReport +{ + public class ReportScript + { + + + private void Table4_ManualBuild(object sender, EventArgs e) + { + DataSourceBase rowData = Report.GetDataSource("Table1"); + // init the data source + rowData.Init(); + + // print the first table row - it is a header + Table4.PrintRow(0); + // each PrintRow call must be followed by either PrintColumn or PrintColumns call + // to print cells on the row + Table4.PrintColumns(); + + // now enumerate the data source and print the table body + + // print the table body + Table4.PrintRow(1); + Table4.PrintColumns(); + Table4.PrintRow(2); + Table4.PrintColumns(); + Table4.PrintRow(3); + Table4.PrintColumns(); + Table4.PrintRow(4); + Table4.PrintColumns(); + Table4.PrintRow(5); + Table4.PrintColumns(); + + // go next data source row + rowData.Next(); + + } + + private void Table5_ManualBuild(object sender, EventArgs e) + { + Table5.PrintRow(0); + Table5.PrintColumns(); + Table5.PrintRow(1); + Table5.PrintColumns(); + } + + + private int x; + private void Tabel_Data_ManualBuild(object sender, EventArgs e) + { + DataSourceBase rowData = Report.GetDataSource("Data"); + // init the data source + rowData.Init(); + + // print the first table row - it is a header + Tabel_Data.PrintRow(0); + // each PrintRow call must be followed by either PrintColumn or PrintColumns call + // to print cells on the row + Tabel_Data.PrintColumns(); + x=0; + // now enumerate the data source and print the table body + while (rowData.HasMoreRows) + { + x++; + // print the table body + Tabel_Data.PrintRow(1); + Tabel_Data.PrintColumns(); + + // go next data source row + rowData.Next(); + } + } + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SGGL/FineUIPro.Web/File/Fastreport/管道焊口检测委托单_附件4.frx b/SGGL/FineUIPro.Web/File/Fastreport/管道焊口检测委托单_附件4.frx new file mode 100644 index 00000000..ee74b1e8 --- /dev/null +++ b/SGGL/FineUIPro.Web/File/Fastreport/管道焊口检测委托单_附件4.frx @@ -0,0 +1,360 @@ + + + using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Windows.Forms; +using System.Drawing; +using System.Data; +using FastReport; +using FastReport.Data; +using FastReport.Dialog; +using FastReport.Barcode; +using FastReport.Table; +using FastReport.Utils; + +namespace FastReport +{ + public class ReportScript + { + + + private void Table4_ManualBuild(object sender, EventArgs e) + { + DataSourceBase rowData = Report.GetDataSource("Table1"); + // init the data source + rowData.Init(); + + // print the first table row - it is a header + Table4.PrintRow(0); + // each PrintRow call must be followed by either PrintColumn or PrintColumns call + // to print cells on the row + Table4.PrintColumns(); + + // now enumerate the data source and print the table body + + // print the table body + Table4.PrintRow(1); + Table4.PrintColumns(); + Table4.PrintRow(2); + Table4.PrintColumns(); + Table4.PrintRow(3); + Table4.PrintColumns(); + Table4.PrintRow(4); + Table4.PrintColumns(); + Table4.PrintRow(5); + Table4.PrintColumns(); + Table4.PrintRow(6); + Table4.PrintColumns(); + // go next data source row + rowData.Next(); + + } + + private void Table5_ManualBuild(object sender, EventArgs e) + { + Table5.PrintRow(0); + Table5.PrintColumns(); + Table5.PrintRow(1); + Table5.PrintColumns(); + } + + + private int x; + private void Tabel_Data_ManualBuild(object sender, EventArgs e) + { + DataSourceBase rowData = Report.GetDataSource("Data"); + // init the data source + rowData.Init(); + + // print the first table row - it is a header + Tabel_Data.PrintRow(0); + // each PrintRow call must be followed by either PrintColumn or PrintColumns call + // to print cells on the row + Tabel_Data.PrintColumns(); + x=0; + // now enumerate the data source and print the table body + while (rowData.HasMoreRows) + { + x++; + // print the table body + Tabel_Data.PrintRow(1); + Tabel_Data.PrintColumns(); + + // go next data source row + rowData.Next(); + } + } + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SGGL/FineUIPro.Web/File/Fastreport/管道焊缝热处理委托_附件5.frx b/SGGL/FineUIPro.Web/File/Fastreport/管道焊缝热处理委托_附件5.frx new file mode 100644 index 00000000..c758bce4 --- /dev/null +++ b/SGGL/FineUIPro.Web/File/Fastreport/管道焊缝热处理委托_附件5.frx @@ -0,0 +1,239 @@ + + + using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Windows.Forms; +using System.Drawing; +using System.Data; +using FastReport; +using FastReport.Data; +using FastReport.Dialog; +using FastReport.Barcode; +using FastReport.Table; +using FastReport.Utils; + +namespace FastReport +{ + public class ReportScript + { + + + + private int x; + private void Tabel_Data_ManualBuild(object sender, EventArgs e) + { + DataSourceBase rowData = Report.GetDataSource("Data"); + // init the data source + rowData.Init(); + + // print the first table row - it is a header + Tabel_Data.PrintRow(0); + // each PrintRow call must be followed by either PrintColumn or PrintColumns call + // to print cells on the row + Tabel_Data.PrintColumns(); + x=0; + // now enumerate the data source and print the table body + while (rowData.HasMoreRows) + { + x++; + // print the table body + Tabel_Data.PrintRow(1); + Tabel_Data.PrintColumns(); + + // go next data source row + rowData.Next(); + } + } + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SGGL/FineUIPro.Web/FineUIPro.Web.csproj b/SGGL/FineUIPro.Web/FineUIPro.Web.csproj index 2c8589e7..66a80cd3 100644 --- a/SGGL/FineUIPro.Web/FineUIPro.Web.csproj +++ b/SGGL/FineUIPro.Web/FineUIPro.Web.csproj @@ -17444,7 +17444,7 @@ - + diff --git a/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLib.aspx b/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLib.aspx index 4c64fc73..95e5f521 100644 --- a/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLib.aspx +++ b/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLib.aspx @@ -70,6 +70,9 @@ + + diff --git a/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLibEdit.aspx b/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLibEdit.aspx index 9cbad1bc..085173be 100644 --- a/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLibEdit.aspx +++ b/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLibEdit.aspx @@ -55,13 +55,20 @@ - + + + + + + + diff --git a/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLibEdit.aspx.cs b/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLibEdit.aspx.cs index 52dda9b8..64e4c0aa 100644 --- a/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLibEdit.aspx.cs +++ b/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLibEdit.aspx.cs @@ -31,6 +31,7 @@ namespace FineUIPro.Web.HJGL.BaseInfo txtMaterialSpec.Text = lib.MaterialSpec; txtMaterialDef.Text = lib.MaterialDef; txtMaterialUnit.Text = lib.MaterialUnit; + txtDesignInstitute.Text = lib.DesignInstitute; //txtMaterialCode.Enabled = false; } else @@ -71,7 +72,10 @@ namespace FineUIPro.Web.HJGL.BaseInfo MaterialMade = this.txtMaterialMade.Text.Trim(), MaterialDef = this.txtMaterialDef.Text.Trim(), MaterialUnit = txtMaterialUnit.Text.Trim(), - Code = this.txtCode.Text.Trim() + Code = this.txtCode.Text.Trim(), + DesignInstitute = string.IsNullOrWhiteSpace(txtDesignInstitute.Text) + ? null + : txtDesignInstitute.Text.Trim() }; if (!string.IsNullOrEmpty(materialCode)) @@ -91,4 +95,4 @@ namespace FineUIPro.Web.HJGL.BaseInfo } #endregion } -} \ No newline at end of file +} diff --git a/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLibEdit.aspx.designer.cs b/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLibEdit.aspx.designer.cs index 13ad643c..0fc32ebd 100644 --- a/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLibEdit.aspx.designer.cs +++ b/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLibEdit.aspx.designer.cs @@ -101,6 +101,11 @@ namespace FineUIPro.Web.HJGL.BaseInfo { /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 /// protected global::FineUIPro.TextBox txtMaterialUnit; + + /// + /// txtDesignInstitute 控件。 + /// + protected global::FineUIPro.TextBox txtDesignInstitute; /// /// txtMaterialDef 控件。 diff --git a/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLibIn.aspx.cs b/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLibIn.aspx.cs index d9d8796b..8c4eea67 100644 --- a/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLibIn.aspx.cs +++ b/SGGL/FineUIPro.Web/HJGL/BaseInfo/MaterialCodeLibIn.aspx.cs @@ -153,6 +153,9 @@ namespace FineUIPro.Web.HJGL.BaseInfo // item.MaterialMade = dv[i]["材质"].ToString(); item.MaterialUnit = rows[i].MaterialUnit; item.MaterialName = rows[i].MaterialName; + item.DesignInstitute = string.IsNullOrWhiteSpace(rows[i].DesignInstitute) + ? null + : rows[i].DesignInstitute.Trim(); //item.PipeGrade = dv[i]["管道等级"].ToString(); //item.ProjectId = CurrUser.LoginProjectId; //= SQLHelper.GetNewID(typeof(Model.Editor_CostReport)); @@ -236,6 +239,7 @@ namespace FineUIPro.Web.HJGL.BaseInfo MaterialSpec = x.MaterialSpec, MaterialUnit = x.MaterialUnit, MaterialName = x.MaterialName, + DesignInstitute = x.DesignInstitute, }).DistinctBy(temp => new { @@ -243,7 +247,8 @@ namespace FineUIPro.Web.HJGL.BaseInfo temp.MaterialDef, temp.MaterialSpec, temp.MaterialUnit, - temp.MaterialName + temp.MaterialName, + temp.DesignInstitute }).ToList(); codeLib_update = (from x in codeLib_update select new HJGL_MaterialCodeLib @@ -253,6 +258,7 @@ namespace FineUIPro.Web.HJGL.BaseInfo MaterialSpec = x.MaterialSpec, MaterialUnit = x.MaterialUnit, MaterialName = x.MaterialName, + DesignInstitute = x.DesignInstitute, }).DistinctBy(temp => new { @@ -260,7 +266,8 @@ namespace FineUIPro.Web.HJGL.BaseInfo temp.MaterialDef, temp.MaterialSpec, temp.MaterialUnit, - temp.MaterialName + temp.MaterialName, + temp.DesignInstitute }).ToList(); foreach (var item in codeLib_update) { @@ -281,4 +288,4 @@ namespace FineUIPro.Web.HJGL.BaseInfo } #endregion } -} \ No newline at end of file +} diff --git a/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformation.aspx b/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformation.aspx index 38502bbb..e712935e 100644 --- a/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformation.aspx +++ b/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformation.aspx @@ -88,13 +88,7 @@ - - - - + @@ -156,6 +150,9 @@ FieldType="String" HeaderText="数量" HeaderTextAlign="Center" TextAlign="Left"> + + @@ -218,6 +215,9 @@ FieldType="String" HeaderText="数量" HeaderTextAlign="Center" TextAlign="Left"> + + @@ -279,6 +279,9 @@ FieldType="String" HeaderText="数量" HeaderTextAlign="Center" TextAlign="Left"> + + diff --git a/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformation.aspx.cs b/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformation.aspx.cs index ee75bb0e..c0333797 100644 --- a/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformation.aspx.cs +++ b/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformation.aspx.cs @@ -327,13 +327,15 @@ namespace FineUIPro.Web.HJGL.DataImport ISNULL(lib.MaterialSpec, libCode.MaterialSpec) AS MaterialSpec, ISNULL(lib.MaterialMade, libCode.MaterialMade) AS MaterialMade, ISNULL(lib.MaterialDef, libCode.MaterialDef) AS MaterialDef, - pipe.Number,pipe.PrefabricatedComponents,weld.WeldJointCode + pipe.Number,pipe.PrefabricatedComponents, + CASE pipe.PipeArea WHEN '1' THEN N'工厂预制' WHEN '2' THEN N'现场安装' END AS PipeAreaText, + weld.WeldJointCode FROM dbo.HJGL_PipeLineMat pipe LEFT JOIN dbo.HJGL_MaterialCodeLib lib ON lib.MaterialCode = pipe.MaterialCode LEFT JOIN HJGL_Pipeline line ON pipe.PipelineId=line.PipelineId OUTER APPLY (SELECT TOP 1 * FROM dbo.HJGL_MaterialCodeLib codeLib WHERE codeLib.ProjectId=line.ProjectId AND codeLib.Code=pipe.MaterialCode2 ORDER BY codeLib.MaterialCode) libCode LEFT JOIN dbo.HJGL_WeldJoint weld ON weld.WeldJointId = pipe.WeldJointId - WHERE line.UnitWorkId=@UnitWorkId and line.PipeArea='1' and pipe.PrefabricatedComponents !='' "; + WHERE line.UnitWorkId=@UnitWorkId and pipe.PipeArea='1' and pipe.PrefabricatedComponents !='' "; List listStr = new List(); //if (!string.IsNullOrEmpty(txtMaterialCode.Text.Trim())) //{ @@ -369,13 +371,15 @@ namespace FineUIPro.Web.HJGL.DataImport ISNULL(lib.MaterialSpec, libCode.MaterialSpec) AS MaterialSpec, ISNULL(lib.MaterialMade, libCode.MaterialMade) AS MaterialMade, ISNULL(lib.MaterialDef, libCode.MaterialDef) AS MaterialDef, - pipe.Number,weld.WeldJointCode + pipe.Number, + CASE pipe.PipeArea WHEN '1' THEN N'工厂预制' WHEN '2' THEN N'现场安装' END AS PipeAreaText, + weld.WeldJointCode FROM dbo.HJGL_PipeLineMat pipe LEFT JOIN dbo.HJGL_MaterialCodeLib lib ON lib.MaterialCode = pipe.MaterialCode LEFT JOIN HJGL_Pipeline line ON pipe.PipelineId=line.PipelineId OUTER APPLY (SELECT TOP 1 * FROM dbo.HJGL_MaterialCodeLib codeLib WHERE codeLib.ProjectId=line.ProjectId AND codeLib.Code=pipe.MaterialCode2 ORDER BY codeLib.MaterialCode) libCode LEFT JOIN dbo.HJGL_WeldJoint weld ON weld.WeldJointId = pipe.WeldJointId - WHERE line.UnitWorkId=@UnitWorkId and line.PipeArea='2' "; + WHERE line.UnitWorkId=@UnitWorkId and pipe.PipeArea='2' "; List listStr = new List(); if (!string.IsNullOrEmpty(pipelineId)) { @@ -407,13 +411,15 @@ namespace FineUIPro.Web.HJGL.DataImport ISNULL(lib.MaterialSpec, libCode.MaterialSpec) AS MaterialSpec, ISNULL(lib.MaterialMade, libCode.MaterialMade) AS MaterialMade, ISNULL(lib.MaterialDef, libCode.MaterialDef) AS MaterialDef, - pipe.Number,pipe.PrefabricatedComponents,weld.WeldJointCode + pipe.Number,pipe.PrefabricatedComponents, + CASE pipe.PipeArea WHEN '1' THEN N'工厂预制' WHEN '2' THEN N'现场安装' END AS PipeAreaText, + weld.WeldJointCode FROM dbo.HJGL_PipeLineMat pipe LEFT JOIN dbo.HJGL_MaterialCodeLib lib ON lib.MaterialCode = pipe.MaterialCode LEFT JOIN HJGL_Pipeline line ON pipe.PipelineId=line.PipelineId OUTER APPLY (SELECT TOP 1 * FROM dbo.HJGL_MaterialCodeLib codeLib WHERE codeLib.ProjectId=line.ProjectId AND codeLib.Code=pipe.MaterialCode2 ORDER BY codeLib.MaterialCode) libCode LEFT JOIN dbo.HJGL_WeldJoint weld ON weld.WeldJointId = pipe.WeldJointId - WHERE line.UnitWorkId=@UnitWorkId and line.PipeArea='1' and (pipe.PrefabricatedComponents is null or pipe.PrefabricatedComponents='') "; + WHERE line.UnitWorkId=@UnitWorkId and pipe.PipeArea='1' and (pipe.PrefabricatedComponents is null or pipe.PrefabricatedComponents='') "; List listStr = new List(); //if (!string.IsNullOrEmpty(txtMaterialCode.Text.Trim())) //{ @@ -1006,64 +1012,10 @@ namespace FineUIPro.Web.HJGL.DataImport this.BindGrid2(this.tvControlItem.SelectedNodeID, this.hdUnitWorkId.Text); } - #region 导入 - /// - /// 导入按钮 - /// - /// - /// - protected void btnImport_Click(object sender, EventArgs e) - { - Model.WBS_UnitWork unitWork = BLL.UnitWorkService.GetUnitWorkByUnitWorkId(this.tvControlItem.SelectedNodeID); - if (unitWork != null) - { - PageContext.RegisterStartupScript(Window2.GetShowReference(String.Format("PipelineListIn.aspx?UnitWorkId={0}", this.tvControlItem.SelectedNodeID, "导入 - "))); - } - else - { - ShowNotify("请先选择单位工程!", MessageBoxIcon.Warning); - } - } - #endregion - #region 更新导入 - /// - /// 更新导入按钮 - /// - /// - /// - protected void btnUpdateImport_Click(object sender, EventArgs e) - { - Model.WBS_UnitWork unitWork = BLL.UnitWorkService.GetUnitWorkByUnitWorkId(this.tvControlItem.SelectedNodeID); - if (unitWork != null) - { - PageContext.RegisterStartupScript(Window2.GetShowReference(String.Format("PipelineListUpdateIn.aspx?UnitWorkId={0}", this.tvControlItem.SelectedNodeID, "更新导入 - "))); - } - else - { - ShowNotify("请先选择单位工程!", MessageBoxIcon.Warning); - } - } - #endregion - #region PDMS导入 - /// - /// 导入按钮 - /// - /// - /// - protected void btnPDMSImport_Click(object sender, EventArgs e) - { - Model.WBS_UnitWork unitWork = BLL.UnitWorkService.GetUnitWorkByUnitWorkId(this.tvControlItem.SelectedNodeID); - if (unitWork != null) - { - PageContext.RegisterStartupScript(Window2.GetShowReference(String.Format("PipelineListPDMSIn.aspx?UnitWorkId={0}", this.tvControlItem.SelectedNodeID, "导入 - "))); - } - else - { - ShowNotify("请先选择单位工程!", MessageBoxIcon.Warning); - } - } + + #region 管线材料导入 /// /// 管线材料导入 diff --git a/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformation.aspx.designer.cs b/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformation.aspx.designer.cs index 2bf6f2b7..f8071939 100644 --- a/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformation.aspx.designer.cs +++ b/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformation.aspx.designer.cs @@ -185,33 +185,6 @@ namespace FineUIPro.Web.HJGL.DataImport /// protected global::FineUIPro.Button btnPrint; - /// - /// btnImport 控件。 - /// - /// - /// 自动生成的字段。 - /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 - /// - protected global::FineUIPro.Button btnImport; - - /// - /// btnUpdateImport 控件。 - /// - /// - /// 自动生成的字段。 - /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 - /// - protected global::FineUIPro.Button btnUpdateImport; - - /// - /// btnPDMSImport 控件。 - /// - /// - /// 自动生成的字段。 - /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 - /// - protected global::FineUIPro.Button btnPDMSImport; - /// /// btnMatImport 控件。 /// diff --git a/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformationEdit.aspx b/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformationEdit.aspx index 57ea73d4..8701edce 100644 --- a/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformationEdit.aspx +++ b/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformationEdit.aspx @@ -44,6 +44,15 @@ + + + + + + + + diff --git a/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformationEdit.aspx.cs b/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformationEdit.aspx.cs index 386787b0..94cc7a3f 100644 --- a/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformationEdit.aspx.cs +++ b/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformationEdit.aspx.cs @@ -44,6 +44,9 @@ namespace FineUIPro.Web.HJGL.DataImport ? Const._Null : pipeLineMat.MaterialCode; this.txtMaterialCode.Text = pipeLineMat.MaterialCode2; + this.drpPipeArea.SelectedValue = string.IsNullOrEmpty(pipeLineMat.PipeArea) + ? PipelineService.PipeArea_SHOP + : pipeLineMat.PipeArea; BindMaterialDetails(pipeLineMat.MaterialCode, false); } } @@ -118,6 +121,7 @@ namespace FineUIPro.Web.HJGL.DataImport this.PipeLineMatId, mainMaterialCode, this.txtMaterialCode.Text.Trim()); + PipelineMatService.UpdatePipeArea(this.PipeLineMatId, this.drpPipeArea.SelectedValue); ShowNotify("保存成功!", MessageBoxIcon.Success); PageContext.RegisterStartupScript(ActiveWindow.GetHidePostBackReference()); } diff --git a/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformationEdit.aspx.designer.cs b/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformationEdit.aspx.designer.cs index ea018533..13bc9da0 100644 --- a/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformationEdit.aspx.designer.cs +++ b/SGGL/FineUIPro.Web/HJGL/DataImport/MaterialInformationEdit.aspx.designer.cs @@ -77,6 +77,11 @@ namespace FineUIPro.Web.HJGL.DataImport /// protected global::FineUIPro.TextBox txtBatchNo; + /// + /// drpPipeArea 控件。 + /// + protected global::FineUIPro.DropDownList drpPipeArea; + /// /// Toolbar1 控件。 /// diff --git a/SGGL/FineUIPro.Web/HJGL/HotProcessHard/HotProessTrust.aspx.cs b/SGGL/FineUIPro.Web/HJGL/HotProcessHard/HotProessTrust.aspx.cs index cc477ae6..cb65760b 100644 --- a/SGGL/FineUIPro.Web/HJGL/HotProcessHard/HotProessTrust.aspx.cs +++ b/SGGL/FineUIPro.Web/HJGL/HotProcessHard/HotProessTrust.aspx.cs @@ -674,7 +674,7 @@ namespace FineUIPro.Web.HJGL.HotProcessHard string initTemplatePath = ""; string rootPath = Server.MapPath("~/"); - initTemplatePath = "File\\Fastreport\\管道焊口热处理委托单NoPic.frx"; + initTemplatePath = "File\\Fastreport\\管道焊缝热处理委托_附件5.frx"; if (File.Exists(rootPath + initTemplatePath)) { diff --git a/SGGL/FineUIPro.Web/HJGL/InfoQuery/JointQuery.aspx b/SGGL/FineUIPro.Web/HJGL/InfoQuery/JointQuery.aspx index 9b77e328..c1ecbeea 100644 --- a/SGGL/FineUIPro.Web/HJGL/InfoQuery/JointQuery.aspx +++ b/SGGL/FineUIPro.Web/HJGL/InfoQuery/JointQuery.aspx @@ -233,11 +233,10 @@ - - - - + OnSelectedIndexChanged="ddlPageSize_SelectedIndexChanged"> + + + diff --git a/SGGL/FineUIPro.Web/HJGL/PointTrust/TrustBatch.aspx b/SGGL/FineUIPro.Web/HJGL/PointTrust/TrustBatch.aspx index 6c781a35..b3960430 100644 --- a/SGGL/FineUIPro.Web/HJGL/PointTrust/TrustBatch.aspx +++ b/SGGL/FineUIPro.Web/HJGL/PointTrust/TrustBatch.aspx @@ -77,7 +77,7 @@ OnClick="btnDelete_Click"> @@ -115,7 +115,7 @@ + MenuID="MenuPrint" ShowMenuIcon="true"> @@ -200,6 +200,10 @@ + + + + diff --git a/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldMatMatch.aspx.cs b/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldMatMatch.aspx.cs index f31a673a..61700c2a 100644 --- a/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldMatMatch.aspx.cs +++ b/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldMatMatch.aspx.cs @@ -1,10 +1,12 @@ using BLL; using FineUIPro.Web.DataShow; +using MiniExcelLibs; using Model; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; +using System.IO; using System.Linq; namespace FineUIPro.Web.HJGL.WeldingManage @@ -13,6 +15,19 @@ namespace FineUIPro.Web.HJGL.WeldingManage { public int pageSize = PipelineService.pageSize; + private const string TreeCommandBuilding = "建筑工程"; + private const string TreeCommandInstallation = "安装工程"; + private const string TreeCommandUnitWork = "单位工程"; + private const string TreeCommandPipeline = "管线"; + private const string TreeCommandLoad = "加载"; + private const string PrefabricationJointAttribute = "预制口"; + private const string InstallationJointAttribute = "安装口"; + private const string WeldingRodConsumablesType = "2"; + private const string WeldingWireConsumablesType = "1"; + private const string ManualWeldingMode = "手动"; + private const string CoverMaterialClassFe1 = "Fe-1"; + private const string CoverMaterialClassFe3 = "Fe-3"; + public string WarehouseId { get @@ -89,29 +104,61 @@ namespace FineUIPro.Web.HJGL.WeldingManage //ctlAuditFlow.Url = BLL.Project_SysSetService.GetAvevaNetUrl(this.CurrUser.LoginProjectId); if (!IsPostBack) { - tw_PipeMatMatchOutputs = new List(); - PipeArea = Request.Params["PipeArea"]; - drpWarehouse.DataTextField = "Key"; - drpWarehouse.DataValueField = "Value"; - drpWarehouse.DataSource = BLL.TwInOutplanmasterService.GetWarehouseCode(this.CurrUser.LoginProjectId); - drpWarehouse.DataBind(); - drpWarehouse_SelectedIndexChanged(null, null); - HJGL_MaterialService.materialStockItems_FIELD = new List(); - HJGL_MaterialService.materialStockItems_SHOP = new List(); - dicSeclectPipeLine = new Dictionary(); - priorityWeldJoints = new Dictionary>(); - var pipeline = (from x in Funs.DB.HJGL_Pipeline - where x.ProjectId == this.CurrUser.LoginProjectId - select x.FlowingSection).Distinct().ToList(); - this.drpFlowingSection.DataTextField = "Value"; - this.drpFlowingSection.DataValueField = "Value"; - this.drpFlowingSection.DataSource = pipeline; - this.drpFlowingSection.DataBind(); - Funs.FineUIPleaseSelect(drpFlowingSection); - this.InitTreeMenu();//加载树 + InitializePage(); } } + /// + /// 初始化页面状态、筛选项和左侧管线树。 + /// + private void InitializePage() + { + tw_PipeMatMatchOutputs = new List(); + PipeArea = Request.Params["PipeArea"]; + BindWarehouseOptions(); + ResetMaterialStockCache(); + dicSeclectPipeLine = new Dictionary(); + priorityWeldJoints = new Dictionary>(); + BindFlowingSectionOptions(); + InitTreeMenu(); + } + + /// + /// 绑定当前项目可用仓库,并触发仓库切换后的树刷新。 + /// + private void BindWarehouseOptions() + { + drpWarehouse.DataTextField = "Key"; + drpWarehouse.DataValueField = "Value"; + drpWarehouse.DataSource = BLL.TwInOutplanmasterService.GetWarehouseCode(this.CurrUser.LoginProjectId); + drpWarehouse.DataBind(); + drpWarehouse_SelectedIndexChanged(null, null); + } + + /// + /// 清空材料库存缓存,避免首次加载沿用其他入口的区域缓存。 + /// + private void ResetMaterialStockCache() + { + HJGL_MaterialService.materialStockItems_FIELD = new List(); + HJGL_MaterialService.materialStockItems_SHOP = new List(); + } + + /// + /// 绑定当前项目的流水段筛选项。 + /// + private void BindFlowingSectionOptions() + { + var flowingSections = (from x in Funs.DB.HJGL_Pipeline + where x.ProjectId == this.CurrUser.LoginProjectId + select x.FlowingSection).Distinct().ToList(); + drpFlowingSection.DataTextField = "Value"; + drpFlowingSection.DataValueField = "Value"; + drpFlowingSection.DataSource = flowingSections; + drpFlowingSection.DataBind(); + Funs.FineUIPleaseSelect(drpFlowingSection); + } + #region 加载树装置-单位-工作区 /// @@ -121,20 +168,10 @@ namespace FineUIPro.Web.HJGL.WeldingManage { this.tvControlItem.Nodes.Clear(); - TreeNode rootNode1 = new TreeNode(); - rootNode1.NodeID = "1"; - rootNode1.Text = "建筑工程"; - rootNode1.CommandName = "建筑工程"; - rootNode1.Selectable = false; - rootNode1.EnableCheckBox = false; + TreeNode rootNode1 = CreateRootNode("1", TreeCommandBuilding, false, false); this.tvControlItem.Nodes.Add(rootNode1); - TreeNode rootNode2 = new TreeNode(); - rootNode2.NodeID = "2"; - rootNode2.Text = "安装工程"; - rootNode2.CommandName = "安装工程"; - rootNode2.Expanded = true; - rootNode2.EnableCheckBox = false; + TreeNode rootNode2 = CreateRootNode("2", TreeCommandInstallation, true, null); this.tvControlItem.Nodes.Add(rootNode2); var unitWorkList = (from x in Funs.DB.WBS_UnitWork @@ -143,57 +180,54 @@ namespace FineUIPro.Web.HJGL.WeldingManage orderby x.UnitWorkCode select x).ToList(); - List unitWork1 = null; - List unitWork2 = null; + BindUnitWorkNodes(rootNode1, unitWorkList.Where(x => x.ProjectType == "1"), false); + BindUnitWorkNodes(rootNode2, unitWorkList.Where(x => x.ProjectType == "2"), true); + } - unitWork1 = (from x in unitWorkList where x.ProjectType == "1" select x).ToList(); - unitWork2 = (from x in unitWorkList where x.ProjectType == "2" select x).ToList(); - - if (unitWork1.Count() > 0) + /// + /// 创建建筑工程或安装工程根节点。 + /// + private TreeNode CreateRootNode(string nodeId, string text, bool expanded, bool? selectable) + { + var rootNode = new TreeNode { - foreach (var q in unitWork1) - { - int a = GetUnitWorkTestPackagePipelineCount(q.UnitWorkId); - var unitNamesUnitIds = BLL.UnitService.getUnitNamesUnitIds(q.UnitId); - TreeNode tn1 = new TreeNode(); - tn1.NodeID = q.UnitWorkId; - tn1.Text = q.UnitWorkName + "【" + a.ToString() + "】" + "管线"; - tn1.ToolTip = "施工单位:" + unitNamesUnitIds; - tn1.CommandName = "单位工程"; - tn1.EnableExpandEvent = true; - tn1.EnableClickEvent = true; - tn1.EnableCheckBox = false; - rootNode1.Nodes.Add(tn1); - if (a > 0) - { - BindTestPackageNodes(tn1); - } - } + NodeID = nodeId, + Text = text, + CommandName = text, + Expanded = expanded, + EnableCheckBox = false + }; + if (selectable.HasValue) + { + rootNode.Selectable = selectable.Value; } - if (unitWork2.Count() > 0) - { - foreach (var q in unitWork2) - { - int a = GetUnitWorkTestPackagePipelineCount(q.UnitWorkId); - var unitNamesUnitIds = BLL.UnitService.getUnitNamesUnitIds(q.UnitId); - TreeNode tn2 = new TreeNode(); - tn2.NodeID = q.UnitWorkId; - tn2.Text = q.UnitWorkName + "【" + a.ToString() + "】" + "管线"; - if (q.UnitWorkId == this.hdUnitWorkId.Text) - { - tn2.Expanded = true; - } - tn2.ToolTip = "施工单位:" + unitNamesUnitIds; - tn2.CommandName = "单位工程"; - tn2.EnableExpandEvent = true; - tn2.EnableClickEvent = true; - tn2.EnableCheckBox = false; + return rootNode; + } - rootNode2.Nodes.Add(tn2); - if (a > 0) - { - BindTestPackageNodes(tn2); - } + /// + /// 将单位工程节点绑定到指定工程根节点。 + /// + private void BindUnitWorkNodes(TreeNode parentNode, IEnumerable unitWorks, bool expandSelectedNode) + { + foreach (var unitWork in unitWorks) + { + int pipelineCount = GetUnitWorkTestPackagePipelineCount(unitWork.UnitWorkId); + var unitNamesUnitIds = BLL.UnitService.getUnitNamesUnitIds(unitWork.UnitId); + TreeNode unitWorkNode = new TreeNode + { + NodeID = unitWork.UnitWorkId, + Text = unitWork.UnitWorkName + "【" + pipelineCount.ToString() + "】管线", + ToolTip = "施工单位:" + unitNamesUnitIds, + CommandName = TreeCommandUnitWork, + EnableExpandEvent = true, + EnableClickEvent = true, + EnableCheckBox = false, + Expanded = expandSelectedNode && unitWork.UnitWorkId == hdUnitWorkId.Text + }; + parentNode.Nodes.Add(unitWorkNode); + if (pipelineCount > 0) + { + BindTestPackageNodes(unitWorkNode); } } } @@ -219,16 +253,16 @@ namespace FineUIPro.Web.HJGL.WeldingManage TreeNode newNode = new TreeNode(); newNode.Text = item.PipelineCode; newNode.NodeID = item.PipelineId; - newNode.CommandName = "管线"; + newNode.CommandName = TreeCommandPipeline; newNode.EnableClickEvent = true; node.Nodes.Add(newNode); } if (pageindex < pageCount) { TreeNode newNode = new TreeNode(); - newNode.Text = "加载"; + newNode.Text = TreeCommandLoad; newNode.NodeID = SQLHelper.GetNewID(); - newNode.CommandName = "加载"; + newNode.CommandName = TreeCommandLoad; newNode.Icon = Icon.ArrowDown; newNode.EnableClickEvent = true; node.Nodes.Add(newNode); @@ -288,7 +322,7 @@ namespace FineUIPro.Web.HJGL.WeldingManage } /// - /// 获取指定试压包下当前仓库、区域和筛选条件内尚未完成出库的管线。 + /// 获取指定试压包下当前仓库和页面筛选条件内尚未完成出库的管线;材料区域由匹配服务按材料明细过滤。 /// /// 试压包ID。 /// 符合材料匹配入口条件的管线列表。 @@ -306,7 +340,6 @@ namespace FineUIPro.Web.HJGL.WeldingManage where y == null && p.PTP_ID == ptpId && x.ProjectId == this.CurrUser.LoginProjectId - && x.PipeArea == PipeArea && x.PipelineCode.Contains(this.txtPipelineCode.Text.Trim()) && x.WarehouseId == WarehouseId orderby x.PipelineCode @@ -353,7 +386,7 @@ namespace FineUIPro.Web.HJGL.WeldingManage /// protected void tvControlItem_NodeCommand(object sender, TreeCommandEventArgs e) { - if (e.CommandName == "加载") + if (e.CommandName == TreeCommandLoad) { string CommandName = e.Node.ParentNode.CommandName; e.Node.ParentNode.CommandName = (int.Parse(CommandName.Split('|')[0]) + 1) + "|" + int.Parse(CommandName.Split('|')[1]); @@ -475,7 +508,12 @@ namespace FineUIPro.Web.HJGL.WeldingManage selectList.Add(model.Id); } - if (IsMaterialCodeConfirmed(model, confirmedPipeLineMatIds)) + // 匹配率优先级高于历史确认状态,0% 或未满配材料不能再显示为绿色。 + if (model.MatchRate == null || model.MatchRate < 1) + { + Grid1.Rows[i].RowCssClass = "red"; + } + else if (IsMaterialCodeConfirmed(model, confirmedPipeLineMatIds)) { Grid1.Rows[i].RowCssClass = "green"; } @@ -483,10 +521,6 @@ namespace FineUIPro.Web.HJGL.WeldingManage { Grid1.Rows[i].RowCssClass = "priority"; } - else if (model.MatchRate < 1 || model.MatchRate == null) - { - Grid1.Rows[i].RowCssClass = "red"; - } } Grid1.SelectedRowIDArray = selectList.ToArray(); @@ -531,10 +565,11 @@ namespace FineUIPro.Web.HJGL.WeldingManage .Distinct() .ToList(); var reportWeldJointIds = Funs.DB.HJGL_WeldJoint - .Where(x => weldJointIds.Contains(x.WeldJointId)&& x.WeldingDailyId !=null) + .Where(x => weldJointIds.Contains(x.WeldJointId) && x.WeldingDailyId != null && x.WeldingDailyId != "") .Select(x => x.WeldJointId).Distinct().ToList(); return matchOutputs - .Where(x => string.IsNullOrEmpty(x.WeldJointId) || !taskWeldJointIds.Contains(x.WeldJointId) || reportWeldJointIds.Contains(x.WeldJointId)) + .Where(x => string.IsNullOrEmpty(x.WeldJointId) + || (!taskWeldJointIds.Contains(x.WeldJointId) && !reportWeldJointIds.Contains(x.WeldJointId))) .ToList(); } @@ -600,7 +635,7 @@ namespace FineUIPro.Web.HJGL.WeldingManage /// 事件参数。 protected void btnMatchHelp_Click(object sender, EventArgs e) { - Alert.ShowInTop("1、管线绿色为匹配率100%,明细绿色为已反写材料主编码,红色为匹配率小于100%,蓝色为手动优先焊口。
2、一个焊口可能对应多条材料明细,该焊口全部有效明细已反写材料主编码后才允许一键生成任务单。
3、焊口已进行焊前准备,匹配了焊评才能生成任务单", "说明", MessageBoxIcon.Information); + Alert.ShowInTop("1、管线绿色为匹配率100%,明细绿色为已反写材料主编码,红色为匹配率小于100%,蓝色为手动优先焊口。
2、库存匹配顺序为手动优先焊口、存在已焊口的续作组件、其他未开工组件。
3、一个焊口可能对应多条材料明细,该焊口全部有效明细已反写材料主编码后才允许一键生成任务单。
4、焊口已进行焊前准备,匹配了焊评才能生成任务单", "说明", MessageBoxIcon.Information); } /// @@ -625,7 +660,8 @@ namespace FineUIPro.Web.HJGL.WeldingManage this.CurrUser.LoginProjectId, dicSeclectPipeLine.Keys.ToList(), drpWarehouse.SelectedValue, - GetPriorityWeldJointList()); + GetPriorityWeldJointList(), + PipeArea); BindGrid3(); BindGrid2(keepSelectedPipelineIds); } @@ -692,7 +728,74 @@ namespace FineUIPro.Web.HJGL.WeldingManage } /// - /// 按树节点获取可加入本次匹配的管线。单位工程节点会展开到其下所有试压包,再套用当前仓库、区域和页面筛选条件。 + /// 按当前材料区域导出所选单位工程下全部部分已焊接组件。 + /// + protected void btnExportPartialComponents_Click(object sender, EventArgs e) + { + Model.WBS_UnitWork unitWork = tvControlItem.SelectedNode == null + ? null + : BLL.UnitWorkService.GetUnitWorkByUnitWorkId(tvControlItem.SelectedNode.NodeID); + if (unitWork == null) + { + ShowNotify("请先选择需要导出的单位工程!", MessageBoxIcon.Warning); + return; + } + + var components = TwArrivalStatisticsService.GetPartialWeldedComponents( + this.CurrUser.LoginProjectId, + unitWork.UnitWorkId, + PipeArea, + drpWarehouse.SelectedValue); + if (!components.Any()) + { + ShowNotify("当前单位工程和区域下没有部分已焊接组件!", MessageBoxIcon.Warning); + return; + } + + var exportData = components.Select(x => new + { + 单位工程 = x.UnitWorkName, + 区域 = x.PipeAreaText, + 管线号 = x.PipelineCode, + 预制组件号 = x.PrefabricatedComponents, + 总焊口数 = x.TotalWeldJointCount, + 已焊口数 = x.WeldedWeldJointCount, + 未焊口数 = x.UnweldedWeldJointCount, + 组件匹配率 = x.ComponentMatchRateString + }).ToList(); + + string areaText = PipeArea == PipelineService.PipeArea_SHOP ? "工厂预制" : "现场安装"; + string fileName = GetSafeFileName(unitWork.UnitWorkName) + "_" + areaText + "_部分已焊组件_" + DateTime.Now.ToString("yyyyMMdd") + ".xlsx"; + string tempDirectory = Path.Combine(Funs.RootPath, @"File\Excel\Temp"); + Directory.CreateDirectory(tempDirectory); + string filePath = Path.Combine(tempDirectory, Guid.NewGuid().ToString("N") + ".xlsx"); + + MiniExcel.SaveAs(filePath, exportData); + FileInfo fileInfo = new FileInfo(filePath); + System.Web.HttpResponse response = System.Web.HttpContext.Current.Response; + response.Clear(); + response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; + response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); + response.AddHeader("Content-Length", fileInfo.Length.ToString()); + // 先读取到响应缓冲区再删除临时文件,避免 TransmitFile 异步发送期间文件仍被占用。 + response.BinaryWrite(File.ReadAllBytes(filePath)); + File.Delete(filePath); + response.Flush(); + System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest(); + } + + private static string GetSafeFileName(string fileName) + { + string safeFileName = string.IsNullOrEmpty(fileName) ? "单位工程" : fileName; + foreach (char invalidChar in Path.GetInvalidFileNameChars()) + { + safeFileName = safeFileName.Replace(invalidChar, '_'); + } + return safeFileName; + } + + /// + /// 按树节点获取可加入本次匹配的管线。单位工程节点会展开到其下所有试压包,再套用当前仓库和页面筛选条件。 /// /// 左侧树节点。 /// 符合材料匹配入口条件的管线列表。 @@ -703,13 +806,13 @@ namespace FineUIPro.Web.HJGL.WeldingManage return new List(); } - if (node.CommandName == "管线") + if (node.CommandName == TreeCommandPipeline) { var pipeline = PipelineService.GetPipelineByPipelineId(node.NodeID); return pipeline == null ? new List() : new List { pipeline }; } - if (node.CommandName == "单位工程") + if (node.CommandName == TreeCommandUnitWork) { var testPackageIds = (from x in Funs.DB.PTP_TestPackage where x.ProjectId == this.CurrUser.LoginProjectId @@ -743,7 +846,7 @@ namespace FineUIPro.Web.HJGL.WeldingManage var selectNodes = tvControlItem.GetCheckedNodes(); foreach (var node in selectNodes) { - if (dicSeclectPipeLine.Where(x => x.Key == node.NodeID).Count() == 0 && node.CommandName == "管线") + if (dicSeclectPipeLine.Where(x => x.Key == node.NodeID).Count() == 0 && node.CommandName == TreeCommandPipeline) { dicSeclectPipeLine.Add(node.NodeID, node.Text); addCount++; @@ -978,19 +1081,14 @@ namespace FineUIPro.Web.HJGL.WeldingManage ShowNotify("选中管线中没有已反写材料主编码的可生成任务单焊口!", MessageBoxIcon.Warning); return false; } - var weldingRods = from x in Funs.DB.Base_Consumables where x.ConsumablesType == "2" select x; - var weldingWires = from x in Funs.DB.Base_Consumables where x.ConsumablesType == "1" select x; + var weldingRods = from x in Funs.DB.Base_Consumables where x.ConsumablesType == WeldingRodConsumablesType select x; + var weldingWires = from x in Funs.DB.Base_Consumables where x.ConsumablesType == WeldingWireConsumablesType select x; var selectedWeldJointIdList = selectedWeldJointIds.ToList(); var selectRowId = GetTaskableWeldJointRows(selectedWeldJointIdList); Dictionary unitworkTaskCode = new Dictionary(); Dictionary unitworkSerialNumber = new Dictionary(); - Dictionary matchPipeline = new Dictionary(); - // 生成任务单仍保留管线在匹配结果中的排序,用于任务单列表按管线顺序展示。 - for (int rowIndex = 0; rowIndex < Grid2.Rows.Count; rowIndex++) - { - matchPipeline.Add(rowIndex + 1, Grid2.Rows[rowIndex].RowID); - } + Dictionary matchPipeline = GetMatchPipelineOrder(); if (!selectRowId.Any()) { ShowNotify("未找到可生成任务单的焊口!", MessageBoxIcon.Warning); @@ -998,8 +1096,6 @@ namespace FineUIPro.Web.HJGL.WeldingManage } foreach (var weldjoint in selectRowId) { - string canWeldingRodName = string.Empty; - string canWeldingWireName = string.Empty; Model.HJGL_WeldTask NewTask = new Model.HJGL_WeldTask(); NewTask.ProjectId = this.CurrUser.LoginProjectId; NewTask.UnitWorkId = PipelineService.GetPipelineByPipelineId(weldjoint.PipelineId)?.UnitWorkId; @@ -1038,59 +1134,7 @@ namespace FineUIPro.Web.HJGL.WeldingManage NewTask.PipeLineSortIndex = matchPipeline.FirstOrDefault(x => x.Value == weldJoint.PipelineId).Key; NewTask.WeldingRod = weldJoint.WeldingRod; NewTask.WeldingWire = weldJoint.WeldingWire; - //获取可替代焊丝焊条 - var mat = BLL.Base_MaterialService.GetMaterialByMaterialId(weldJoint.Material1Id); - string matClass = mat.MaterialClass; - var matRod = weldingRods.FirstOrDefault(x => x.ConsumablesId == weldJoint.WeldingRod); - if (matRod != null) - { - foreach (var item in weldingRods) - { - if (matClass == "Fe-1" || matClass == "Fe-3") - { - if (IsCoverClass(matRod.SteelType, item.SteelType)) - { - canWeldingRodName = canWeldingRodName + item.ConsumablesName + ","; - } - } - else - { - if (matRod.SteelType == item.SteelType) - { - canWeldingRodName = canWeldingRodName + item.ConsumablesName + ","; - } - } - } - if (!string.IsNullOrEmpty(canWeldingRodName)) - { - NewTask.CanWeldingRodName = canWeldingRodName.Substring(0, canWeldingRodName.Length - 1); - } - } - var matWire = weldingWires.FirstOrDefault(x => x.ConsumablesId == weldJoint.WeldingWire); - if (matWire != null) - { - foreach (var item in weldingWires) - { - if (matClass == "Fe-1" || matClass == "Fe-3") - { - if (IsCoverClass(matWire.SteelType, item.SteelType)) - { - canWeldingWireName = canWeldingWireName + item.ConsumablesName + ","; - } - } - else - { - if (matWire.SteelType == item.SteelType) - { - canWeldingWireName = canWeldingWireName + item.ConsumablesName + ","; - } - } - } - if (!string.IsNullOrEmpty(canWeldingWireName)) - { - NewTask.CanWeldingWireName = canWeldingWireName.Substring(0, canWeldingWireName.Length - 1); - } - } + PopulateAlternativeConsumables(NewTask, weldJoint, weldingRods, weldingWires); } NewTask.JointAttribute = weldJoint.JointAttribute; @@ -1098,7 +1142,7 @@ namespace FineUIPro.Web.HJGL.WeldingManage NewTask.Tabler = this.CurrUser.PersonId; NewTask.TableDate = DateTime.Now; - weldJoint.WeldingMode = "手动"; + weldJoint.WeldingMode = ManualWeldingMode; BLL.WeldJointService.UpdateWeldJoint(weldJoint); BLL.WeldTaskService.AddWeldTask(NewTask); } @@ -1106,6 +1150,61 @@ namespace FineUIPro.Web.HJGL.WeldingManage return true; } + /// + /// 获取当前管线汇总表中的显示顺序,供任务单保存管线排序使用。 + /// + private Dictionary GetMatchPipelineOrder() + { + var matchPipeline = new Dictionary(); + for (int rowIndex = 0; rowIndex < Grid2.Rows.Count; rowIndex++) + { + matchPipeline.Add(rowIndex + 1, Grid2.Rows[rowIndex].RowID); + } + return matchPipeline; + } + + /// + /// 根据母材类别计算任务单可替代的焊条和焊丝。 + /// + private void PopulateAlternativeConsumables( + Model.HJGL_WeldTask task, + Model.HJGL_WeldJoint weldJoint, + IEnumerable weldingRods, + IEnumerable weldingWires) + { + // 获取可替代焊材时沿用原有母材类别和焊材钢号判断规则。 + var material = BLL.Base_MaterialService.GetMaterialByMaterialId(weldJoint.Material1Id); + string materialClass = material.MaterialClass; + var selectedRod = weldingRods.FirstOrDefault(x => x.ConsumablesId == weldJoint.WeldingRod); + var selectedWire = weldingWires.FirstOrDefault(x => x.ConsumablesId == weldJoint.WeldingWire); + + task.CanWeldingRodName = GetAlternativeConsumableNames(materialClass, selectedRod, weldingRods); + task.CanWeldingWireName = GetAlternativeConsumableNames(materialClass, selectedWire, weldingWires); + } + + /// + /// 返回与当前焊材钢号兼容的候选名称,保持原有逗号分隔格式。 + /// + private string GetAlternativeConsumableNames( + string materialClass, + Model.Base_Consumables selectedConsumable, + IEnumerable candidateConsumables) + { + if (selectedConsumable == null) + { + return null; + } + + bool useCoverClass = materialClass == CoverMaterialClassFe1 || materialClass == CoverMaterialClassFe3; + var names = candidateConsumables + .Where(item => useCoverClass + ? IsCoverClass(selectedConsumable.SteelType, item.SteelType) + : selectedConsumable.SteelType == item.SteelType) + .Select(item => item.ConsumablesName) + .ToList(); + return names.Any() ? string.Join(",", names) : null; + } + /// /// 按任务单实际生成规则过滤可生成任务单的焊口视图数据。 /// @@ -1128,10 +1227,13 @@ namespace FineUIPro.Web.HJGL.WeldingManage && x.WeldTaskId == null && x.WeldingMethodCode != null select x).ToList(); - if (PipeArea == "1") + if (PipeArea == PipelineService.PipeArea_SHOP) { - // 工厂预制材料匹配只允许预制口生成任务单,现场安装页面不套用该限制。 - taskableRows = taskableRows.Where(x => x.JointAttribute == "预制口").ToList(); + taskableRows = taskableRows.Where(x => x.JointAttribute == PrefabricationJointAttribute).ToList(); + } + else if (PipeArea == PipelineService.PipeArea_FIELD) + { + taskableRows = taskableRows.Where(x => x.JointAttribute == InstallationJointAttribute).ToList(); } return taskableRows; @@ -1193,26 +1295,16 @@ namespace FineUIPro.Web.HJGL.WeldingManage /// 能覆盖返回 true,否则返回 false。 private bool IsCoverClass(string wpsClass, string matClass) { - bool isCover = false; - int wpsSn = 0; - int matSn = 0; - if (wpsClass.Length > 2 && matClass.Length > 2) + if (wpsClass.Length <= 2 || matClass.Length <= 2) { - string wpsPre = wpsClass.Substring(0, wpsClass.Length - 2); - string matPre = matClass.Substring(0, matClass.Length - 2); - - string wps = wpsClass.Substring(wpsClass.Length - 1, 1); - wpsSn = Funs.GetNewInt(wps).HasValue ? Funs.GetNewInt(wps).Value : 0; - - string mat = matClass.Substring(matClass.Length - 1, 1); - matSn = Funs.GetNewInt(mat).HasValue ? Funs.GetNewInt(mat).Value : 0; - - if (wpsPre == matPre && matSn >= wpsSn) - { - return true; - } + return false; } - return isCover; + + string wpsPre = wpsClass.Substring(0, wpsClass.Length - 2); + string matPre = matClass.Substring(0, matClass.Length - 2); + int wpsSn = Funs.GetNewInt(wpsClass.Substring(wpsClass.Length - 1, 1)) ?? 0; + int matSn = Funs.GetNewInt(matClass.Substring(matClass.Length - 1, 1)) ?? 0; + return wpsPre == matPre && matSn >= wpsSn; } #endregion 按钮事件 diff --git a/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldMatMatch.aspx.designer.cs b/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldMatMatch.aspx.designer.cs index 5b398b11..a35cbe29 100644 --- a/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldMatMatch.aspx.designer.cs +++ b/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldMatMatch.aspx.designer.cs @@ -140,6 +140,15 @@ namespace FineUIPro.Web.HJGL.WeldingManage /// protected global::FineUIPro.Button btnStatisticsMat; + /// + /// btnExportPartialComponents 控件。 + /// + /// + /// 自动生成的字段。 + /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 + /// + protected global::FineUIPro.Button btnExportPartialComponents; + /// /// tvControlItem 控件。 /// diff --git a/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldReport.aspx b/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldReport.aspx index fc42d2fe..d2663f66 100644 --- a/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldReport.aspx +++ b/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldReport.aspx @@ -78,11 +78,11 @@ --%> diff --git a/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldReport.aspx.cs b/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldReport.aspx.cs index e0b295c3..e3d533f3 100644 --- a/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldReport.aspx.cs +++ b/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldReport.aspx.cs @@ -264,38 +264,6 @@ namespace FineUIPro.Web.HJGL.WeldingManage /// private void BindPendingGrid() { - string strSql = @"SELECT temp.TempDetailId, - temp.WeldJointId, - temp.WeldingDate, - jot.PipelineCode, - jot.WeldJointCode, - coverWelder.WelderCode AS CoverWelderCode, - backingWelder.WelderCode AS BackingWelderCode, - temp.JointAttribute, - location.WeldingLocationCode, - jot.Size, - jot.Dia, - jot.Thickness, - jot.WeldingMethodCode, - submitPerson.PersonName AS SubmitPersonName, - temp.SubmitDate, - beforeAtt.AttachUrl AS BeforePhotoUrl, - afterAtt.AttachUrl AS AfterPhotoUrl - FROM dbo.HJGL_WeldingDailyTempDetail AS temp - LEFT JOIN dbo.View_HJGL_WeldJoint AS jot ON jot.WeldJointId = temp.WeldJointId - LEFT JOIN dbo.SitePerson_Person AS coverWelder ON coverWelder.PersonId = temp.CoverWelderId - LEFT JOIN dbo.SitePerson_Person AS backingWelder ON backingWelder.PersonId = temp.BackingWelderId - LEFT JOIN dbo.Base_WeldingLocation AS location ON location.WeldingLocationId = temp.WeldingLocationId - LEFT JOIN dbo.Person_Persons AS submitPerson ON submitPerson.PersonId = temp.SubmitPersonId - LEFT JOIN dbo.AttachFile AS beforeAtt ON beforeAtt.MenuId = @WeldReportMenuId - AND beforeAtt.ToKeyId = temp.TempDetailId + '#Before' - LEFT JOIN dbo.AttachFile AS afterAtt ON afterAtt.MenuId = @WeldReportMenuId - AND afterAtt.ToKeyId = temp.TempDetailId + '#After' - WHERE temp.ProjectId = @ProjectId AND temp.AuditState = 0"; - List listStr = new List(); - listStr.Add(new SqlParameter("@ProjectId", this.CurrUser.LoginProjectId)); - listStr.Add(new SqlParameter("@WeldReportMenuId", Const.HJGL_WeldReportMenuId)); - var unitWork = BLL.UnitWorkService.getUnitWorkByUnitWorkId(tvControlItem.SelectedNodeID); if (unitWork == null) { @@ -305,31 +273,30 @@ namespace FineUIPro.Web.HJGL.WeldingManage unitWork = BLL.UnitWorkService.getUnitWorkByUnitWorkId(daily.UnitWorkId); } } - if (unitWork != null) - { - strSql += " AND temp.UnitWorkId = @UnitWorkId"; - listStr.Add(new SqlParameter("@UnitWorkId", unitWork.UnitWorkId)); - } + + DateTime? weldingDate = null; if (!string.IsNullOrEmpty(txtPendingWeldingDate.Text.Trim())) { - strSql += " AND temp.WeldingDate >= @WeldingDate AND temp.WeldingDate < @WeldingDateEnd"; - DateTime weldingDate = Convert.ToDateTime(txtPendingWeldingDate.Text.Trim()).Date; - listStr.Add(new SqlParameter("@WeldingDate", weldingDate)); - listStr.Add(new SqlParameter("@WeldingDateEnd", weldingDate.AddDays(1))); + DateTime parsedDate; + if (!DateTime.TryParse(txtPendingWeldingDate.Text.Trim(), out parsedDate)) + { + GridPending.RecordCount = 0; + GridPending.DataSource = null; + GridPending.DataBind(); + Alert.ShowInTop("焊接日期格式不正确!", MessageBoxIcon.Warning); + return; + } + weldingDate = parsedDate.Date; } - if (!string.IsNullOrEmpty(txtPendingPipelineCode.Text.Trim())) - { - strSql += " AND jot.PipelineCode LIKE @PendingPipelineCode"; - listStr.Add(new SqlParameter("@PendingPipelineCode", "%" + txtPendingPipelineCode.Text.Trim() + "%")); - } - if (!string.IsNullOrEmpty(txtPendingWelderCode.Text.Trim())) - { - strSql += " AND (coverWelder.WelderCode LIKE @PendingWelderCode OR backingWelder.WelderCode LIKE @PendingWelderCode)"; - listStr.Add(new SqlParameter("@PendingWelderCode", "%" + txtPendingWelderCode.Text.Trim() + "%")); - } - strSql += " ORDER BY jot.PipelineCode, jot.WeldJointCode"; - DataTable tb = SQLHelper.GetDataTableRunText(strSql, listStr.ToArray()); + // 待审核列表与接口共用同一套查询和字段映射,避免PC端SQL与接口逐渐分叉。 + var pendingItems = BLL.WeldingDailyService.GetWeldingDailyTempDetailList( + this.CurrUser.LoginProjectId, + unitWork == null ? null : unitWork.UnitWorkId, + weldingDate, + txtPendingPipelineCode.Text.Trim(), + txtPendingWelderCode.Text.Trim()); + DataTable tb = this.LINQToDataTable(pendingItems); GridPending.RecordCount = tb.Rows.Count; tb = GetFilteredTable(GridPending.FilteredData, tb); var table = this.GetPagedDataTable(GridPending, tb); diff --git a/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldingConDate.aspx b/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldingConDate.aspx index 25671cc4..a3141cc4 100644 --- a/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldingConDate.aspx +++ b/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldingConDate.aspx @@ -55,7 +55,7 @@ + EnableTextSelection="true" OnNodeExpand="tvControlItem_TreeNodeExpanded" OnNodeCheck="tvControlItem_NodeCheck" EnableCheckBox="true" OnlyLeafCheck="false"> diff --git a/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldingConDate.aspx.cs b/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldingConDate.aspx.cs index 246cf467..ffa181e0 100644 --- a/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldingConDate.aspx.cs +++ b/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldingConDate.aspx.cs @@ -10,7 +10,7 @@ namespace FineUIPro.Web.HJGL.WeldingManage public partial class WeldingConDate : PageBase { public int pageSize = PipelineService.pageSize; - + public List GridWeldJointIdList { get; set; } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) @@ -27,7 +27,7 @@ namespace FineUIPro.Web.HJGL.WeldingManage this.drpPipeArea.DataSource = BLL.PipelineService.GetPipeArea(); this.drpPipeArea.DataBind(); Funs.FineUIPleaseSelect(this.drpPipeArea); - this.InitTreeMenu(); + this.InitTreeMenu(); } } @@ -44,6 +44,7 @@ namespace FineUIPro.Web.HJGL.WeldingManage rootNode1.Text = "建筑工程"; rootNode1.CommandName = "建筑工程"; rootNode1.Selectable = false; + rootNode1.EnableCheckBox = false; this.tvControlItem.Nodes.Add(rootNode1); TreeNode rootNode2 = new TreeNode(); @@ -51,6 +52,7 @@ namespace FineUIPro.Web.HJGL.WeldingManage rootNode2.Text = "安装工程"; rootNode2.CommandName = "安装工程"; rootNode2.Expanded = true; + rootNode2.EnableCheckBox = false; this.tvControlItem.Nodes.Add(rootNode2); var pUnits = (from x in Funs.DB.Project_ProjectUnit where x.ProjectId == this.CurrUser.LoginProjectId select x).ToList(); @@ -121,7 +123,8 @@ namespace FineUIPro.Web.HJGL.WeldingManage tn1.CommandName = 1 + "|" + Funs.GetEndPageNumber(a, pageSize); tn1.EnableExpandEvent = true; tn1.EnableClickEvent = true; - tn1.EnableCheckBox = false; + // 单位工程复选框表示“当前筛选条件下的全部管线”,不能只依赖已加载的分页节点。 + tn1.EnableCheckBox = true; rootNode1.Nodes.Add(tn1); if (a > 0) { @@ -183,7 +186,8 @@ namespace FineUIPro.Web.HJGL.WeldingManage tn2.CommandName = 1 + "|" + Funs.GetEndPageNumber(a, pageSize); tn2.EnableExpandEvent = true; tn2.EnableClickEvent = true; - tn2.EnableCheckBox = false; + // 单位工程复选框表示“当前筛选条件下的全部管线”,不能只依赖已加载的分页节点。 + tn2.EnableCheckBox = true; rootNode2.Nodes.Add(tn2); if (a > 0) { @@ -206,6 +210,14 @@ namespace FineUIPro.Web.HJGL.WeldingManage } } + + /// + /// 单位工程节点允许勾选;不展开分页子节点,批量自动录入时会按当前筛选条件重新查询全部管线。 + /// + protected void tvControlItem_NodeCheck(object sender, TreeCheckEventArgs e) + { + // FineUI 会处理父子节点的视觉状态,这里不强制勾选未加载的子节点,避免分页节点遗漏。 + } private void BindNodes(TreeNode node) { BLL.PipelineService.BindTreeNodes(node, ckNOEdit.Checked, this.txtPipelineCode.Text.Trim(), this.CurrUser.LoginProjectId, pageSize, this.drpPipeArea.SelectedValue); @@ -261,12 +273,18 @@ namespace FineUIPro.Web.HJGL.WeldingManage #region 数据绑定 private void BindGrid() - { + { + GridWeldJointIdList = new List(); + if (string.IsNullOrEmpty(tvControlItem.SelectedNodeID)) + { + return; + + } string strSql = @"SELECT WeldJointId,WeldJointCode,PipelineId,PipelineCode,JointAttribute, IsWelding,IsHotProessStr,Material1Code,Material2Code,WeldTypeCode, Specification,HeartNo1,HeartNo2,Size,Dia,DNDia,Thickness,GrooveTypeCode, WeldingMethodCode,WeldingWireCode,WeldingRodCode,WeldingDate,WeldingDailyCode, - BackingWelderCode,CoverWelderCode,MediumCode ,PreTemperature,JointArea,WPQCode,Remark,CAST(WeldJointCode as int) as WeldJointCodeInt + BackingWelderCode,CoverWelderCode,MediumCode ,PreTemperature,JointArea,WPQCode,Remark,TRY_CAST(WeldJointCode AS INT) AS WeldJointCodeInt FROM View_HJGL_WeldJoint WHERE IsTwoJoint IS NULL "; List listStr = new List { }; @@ -309,7 +327,7 @@ namespace FineUIPro.Web.HJGL.WeldingManage } SqlParameter[] parameter = listStr.ToArray(); System.Data.DataTable dt = SQLHelper.GetDataTableRunText(strSql, parameter); - + GridWeldJointIdList = dt.AsEnumerable().Select(row => row.Field("WeldJointId")).ToList(); // 2.获取当前分页数据 Grid1.RecordCount = dt.Rows.Count; var table = this.GetPagedDataTable(Grid1, dt); @@ -412,58 +430,19 @@ namespace FineUIPro.Web.HJGL.WeldingManage ShowNotify("请选择工艺规程编制单位!", MessageBoxIcon.Warning); return; } - if (!string.IsNullOrEmpty(tvControlItem.SelectedNodeID)) + + // BindGrid() 上一次请求中的赋值不会保留到本次回发,按钮处理前重新查询当前筛选结果。 + BindGrid(); + if (GridWeldJointIdList.Any()) { - var jotList = from x in Funs.DB.HJGL_WeldJoint where x.PipelineId == tvControlItem.SelectedNodeID && x.JointAttribute == drpJointAttribute.SelectedValue select x; - if (jotList.Count() > 0) - { - foreach (var jot in jotList) - { - List wpqList = BLL.WPQListServiceService.GetMatchWPQ(jot, this.CurrUser.LoginProjectId, drpUnit.SelectedValue); - Model.HJGL_WeldJoint newJot = new Model.HJGL_WeldJoint(); - if (wpqList != null) - { - Model.WPQ_WPQList wps = new Model.WPQ_WPQList(); - var a = wpqList.FirstOrDefault(x => x.WeldingMethodId == "feb1234c-a538-476f-99ac-7b3ab15997c1"); //优先匹配GTAW+SMAW的焊评 - if (a == null) - { - wps = BLL.WPQListServiceService.GetWPQById(wpqList.First().WPQId); - } - else - { - wps = BLL.WPQListServiceService.GetWPQById(a.WPQId); - } - - newJot.WPQId = wps.WPQId; - newJot.WeldJointId = jot.WeldJointId; - newJot.WeldingRod = wps.WeldingRod; - newJot.WeldingWire = wps.WeldingWire; - newJot.WeldingMethodId = wps.WeldingMethodId; - newJot.GrooveTypeId = wps.GrooveType; - newJot.PreTemperature = wps.PreTemperature; - newJot.IsHotProess = wps.IsHotProess; - newJot.MatchableWPQ = string.Join(",", wpqList.Select(x => x.WPQCode)); - - - } - else - { - newJot.WPQId = null; - newJot.WeldJointId = jot.WeldJointId; - newJot.WeldingRod = null; - newJot.WeldingWire = null; - newJot.WeldingMethodId = null; - newJot.GrooveTypeId = null; - newJot.PreTemperature = null; - newJot.IsHotProess = null; - newJot.MatchableWPQ = null; - } - BLL.WeldJointService.UpdateConWeldJoint(newJot); - } - } + AutoInputWeldJoints(GridWeldJointIdList); BindGrid(); ShowNotify("该管线焊口已完成自动录入!", MessageBoxIcon.Success); } + else + { + ShowNotify("当前筛选条件下没有可自动录入的焊口!", MessageBoxIcon.Warning); + } } protected void btnAutoInput2_Click(object sender, EventArgs e) { @@ -473,64 +452,23 @@ namespace FineUIPro.Web.HJGL.WeldingManage return; } TreeNode[] nodes = tvControlItem.GetCheckedNodes(); - if (nodes.Length > 0) + var pipelineIds = new List(); + foreach (TreeNode node in nodes) { - foreach (TreeNode node in nodes) + if (node.CommandName == "管线") { - if (!string.IsNullOrEmpty(node.NodeID)) - { - var jotList = from x in Funs.DB.HJGL_WeldJoint where x.PipelineId == node.NodeID && x.JointAttribute == drpJointAttribute.SelectedValue select x; - if (jotList.Count() > 0) - { - foreach (var jot in jotList) - { - List wpqList = BLL.WPQListServiceService.GetMatchWPQ(jot, this.CurrUser.LoginProjectId, drpUnit.SelectedValue); - Model.HJGL_WeldJoint newJot = new Model.HJGL_WeldJoint(); - if (wpqList != null) - { - Model.WPQ_WPQList wps = new Model.WPQ_WPQList(); - var a = wpqList.FirstOrDefault(x => x.WeldingMethodId == "feb1234c-a538-476f-99ac-7b3ab15997c1"); //优先匹配GTAW+SMAW的焊评 - if (a == null) - { - wps = BLL.WPQListServiceService.GetWPQById(wpqList.First().WPQId); - } - else - { - wps = BLL.WPQListServiceService.GetWPQById(a.WPQId); - } - - newJot.WPQId = wps.WPQId; - newJot.WeldJointId = jot.WeldJointId; - newJot.WeldingRod = wps.WeldingRod; - newJot.WeldingWire = wps.WeldingWire; - newJot.WeldingMethodId = wps.WeldingMethodId; - newJot.GrooveTypeId = wps.GrooveType; - newJot.PreTemperature = wps.PreTemperature; - newJot.IsHotProess = wps.IsHotProess; - newJot.MatchableWPQ = string.Join(",", wpqList.Select(x => x.WPQCode)); - - - } - else - { - newJot.WPQId = null; - newJot.WeldJointId = jot.WeldJointId; - newJot.WeldingRod = null; - newJot.WeldingWire = null; - newJot.WeldingMethodId = null; - newJot.GrooveTypeId = null; - newJot.PreTemperature = null; - newJot.IsHotProess = null; - newJot.MatchableWPQ = null; - } - BLL.WeldJointService.UpdateConWeldJoint(newJot); - } - } - - } - + if (!string.IsNullOrEmpty(node.NodeID)) pipelineIds.Add(node.NodeID); } - // BindGrid(); + else if (node.CommandName != null && node.CommandName.Split('|').Length == 2) + { + // 单位工程节点覆盖全部分页数据,不能只取树上当前已经展开的叶子节点。 + pipelineIds.AddRange(GetPipelineIdsByUnitWork(node.NodeID)); + } + } + pipelineIds = pipelineIds.Where(x => !string.IsNullOrEmpty(x)).Distinct().ToList(); + if (pipelineIds.Count > 0) + { + AutoInputWeldJoints(GetAutoInputWeldJoints(pipelineIds)); ShowNotify("该管线焊口已完成自动录入!", MessageBoxIcon.Success); } else @@ -539,6 +477,69 @@ namespace FineUIPro.Web.HJGL.WeldingManage } } + /// + /// 按当前树筛选条件查询单位工程下的全部管线,覆盖分页和未展开节点。 + /// + private List GetPipelineIdsByUnitWork(string unitWorkId) + { + var query = Funs.DB.HJGL_Pipeline.Where(x => x.ProjectId == this.CurrUser.LoginProjectId && x.UnitWorkId == unitWorkId); + if (this.drpPipeArea.SelectedValue != BLL.Const._Null) + { + query = query.Where(x => x.PipeArea == this.drpPipeArea.SelectedValue); + } + if (!string.IsNullOrEmpty(this.txtPipelineCode.Text.Trim())) + { + query = query.Where(x => x.PipelineCode.Contains(this.txtPipelineCode.Text.Trim())); + } + if (ckNOEdit.Checked) + { + query = query.Where(p => Funs.DB.HJGL_WeldJoint.Any(w => w.PipelineId == p.PipelineId && w.IsTwoJoint == null && w.WPQId == null)); + } + return query.Select(x => x.PipelineId).ToList(); + } + + /// + /// “全部”表示不增加焊口属性条件;预制口和安装口仍按选择值精确筛选。 + /// + private List GetAutoInputWeldJoints(IEnumerable pipelineIds) + { + var ids = pipelineIds.Where(x => !string.IsNullOrEmpty(x)).Distinct().ToList(); + var query = Funs.DB.HJGL_WeldJoint.Where(x => ids.Contains(x.PipelineId)); + if (!string.IsNullOrEmpty(drpJointAttribute.SelectedValue)) + { + query = query.Where(x => x.JointAttribute == drpJointAttribute.SelectedValue); + } + return query.Select(x=>x.WeldJointId).ToList(); + } + + private void AutoInputWeldJoints(List weldJoints) + { + foreach (var weldJointId in weldJoints) + { + + List wpqList = BLL.WPQListServiceService.GetMatchWPQ(WeldJointService.GetWeldJointByWeldJointId(weldJointId), this.CurrUser.LoginProjectId, drpUnit.SelectedValue); + Model.HJGL_WeldJoint newJot = new Model.HJGL_WeldJoint { WeldJointId = weldJointId }; + if (wpqList != null && wpqList.Count > 0) + { + // 优先匹配 GTAW+SMAW 的焊评,保持原有业务优先级。 + var match = wpqList.FirstOrDefault(x => x.WeldingMethodId == "feb1234c-a538-476f-99ac-7b3ab15997c1") ?? wpqList.First(); + Model.WPQ_WPQList wps = BLL.WPQListServiceService.GetWPQById(match.WPQId); + if (wps != null) + { + newJot.WPQId = wps.WPQId; + newJot.WeldingRod = wps.WeldingRod; + newJot.WeldingWire = wps.WeldingWire; + newJot.WeldingMethodId = wps.WeldingMethodId; + newJot.GrooveTypeId = wps.GrooveType; + newJot.PreTemperature = wps.PreTemperature; + newJot.IsHotProess = wps.IsHotProess; + newJot.MatchableWPQ = string.Join(",", wpqList.Select(x => x.WPQCode)); + } + } + BLL.WeldJointService.UpdateConWeldJoint(newJot); + } + } + protected void btnEdit_Click(object sender, EventArgs e) { if (BLL.CommonService.GetAllButtonPowerList(this.CurrUser.LoginProjectId, this.CurrUser.PersonId, BLL.Const.HJGL_WeldJointMenuId, BLL.Const.BtnModify)) diff --git a/SGGL/Model/APIItem/HJGL/WeldingDailyTempDetailItem.cs b/SGGL/Model/APIItem/HJGL/WeldingDailyTempDetailItem.cs new file mode 100644 index 00000000..f8b776ff --- /dev/null +++ b/SGGL/Model/APIItem/HJGL/WeldingDailyTempDetailItem.cs @@ -0,0 +1,211 @@ +using System; + +namespace Model +{ + /// + /// 焊接日报待审核明细。 + /// + public class WeldingDailyTempDetailItem + { + /// + /// 待审核明细ID。 + /// + public string TempDetailId { get; set; } + + /// + /// 项目ID。 + /// + public string ProjectId { get; set; } + + /// + /// 单位ID。 + /// + public string UnitId { get; set; } + + /// + /// 单位工程ID。 + /// + public string UnitWorkId { get; set; } + + /// + /// 焊口ID。 + /// + public string WeldJointId { get; set; } + + /// + /// 管线ID。 + /// + public string PipelineId { get; set; } + + /// + /// 管线编号。 + /// + public string PipelineCode { get; set; } + + /// + /// 焊口编号。 + /// + public string WeldJointCode { get; set; } + + /// + /// 焊接日期。 + /// + public DateTime WeldingDate { get; set; } + + /// + /// 盖面焊工ID。 + /// + public string CoverWelderId { get; set; } + + /// + /// 盖面焊工编号。 + /// + public string CoverWelderCode { get; set; } + + /// + /// 打底焊工ID。 + /// + public string BackingWelderId { get; set; } + + /// + /// 打底焊工编号。 + /// + public string BackingWelderCode { get; set; } + + /// + /// 焊口属性。 + /// + public string JointAttribute { get; set; } + + /// + /// 焊接位置ID。 + /// + public string WeldingLocationId { get; set; } + + /// + /// 焊接位置编号。 + /// + public string WeldingLocationCode { get; set; } + + /// + /// 焊接模式。 + /// + public string WeldingMode { get; set; } + + /// + /// 材质1编号。 + /// + public string Material1Code { get; set; } + + /// + /// 材质2编号。 + /// + public string Material2Code { get; set; } + + /// + /// 公称直径字符串。 + /// + public string DNDia { get; set; } + + /// + /// 焊口尺寸。 + /// + public decimal? Size { get; set; } + + /// + /// 外径。 + /// + public decimal? Dia { get; set; } + + /// + /// 壁厚。 + /// + public decimal? Thickness { get; set; } + + /// + /// 焊口类型编号。 + /// + public string WeldTypeCode { get; set; } + + /// + /// 焊接方法编号。 + /// + public string WeldingMethodCode { get; set; } + + /// + /// 焊丝编号。 + /// + public string WeldingWireCode { get; set; } + + /// + /// 焊条编号。 + /// + public string WeldingRodCode { get; set; } + + /// + /// 提交人ID。 + /// + public string SubmitPersonId { get; set; } + + /// + /// 提交人姓名。 + /// + public string SubmitPersonName { get; set; } + + /// + /// 提交时间。 + /// + public DateTime SubmitDate { get; set; } + + /// + /// 焊前照片地址。 + /// + public string BeforePhotoUrl { get; set; } + + /// + /// 焊后照片地址。 + /// + public string AfterPhotoUrl { get; set; } + + /// + /// 明细附件地址。 + /// + public string AttachUrl { get; set; } + + /// + /// 审核状态:0待审核,1已审核。 + /// + public int AuditState { get; set; } + + /// + /// 审核人ID。 + /// + public string AuditMan { get; set; } + + /// + /// 审核时间。 + /// + public DateTime? AuditDate { get; set; } + + /// + /// 审核备注。 + /// + public string AuditRemark { get; set; } + } + + /// + /// 焊接日报待审核批量操作参数。 + /// + public class WeldingDailyTempDetailBatchRequest + { + /// + /// 待审核明细ID集合。 + /// + public string[] TempDetailIds { get; set; } + + /// + /// 审核人ID,批量删除时无需填写。 + /// + public string AuditMan { get; set; } + } +} diff --git a/SGGL/Model/CLGL/Tw_PipeMatMatchOutput.cs b/SGGL/Model/CLGL/Tw_PipeMatMatchOutput.cs index 63b6fa80..e63bfefb 100644 --- a/SGGL/Model/CLGL/Tw_PipeMatMatchOutput.cs +++ b/SGGL/Model/CLGL/Tw_PipeMatMatchOutput.cs @@ -32,6 +32,8 @@ namespace Model public decimal? MatchNum { get; set; } public decimal? MatchRate { get; set; } public string MatchRateString { get; set; } + public decimal? ComponentMatchRate { get; set; } + public string ComponentMatchRateString { get; set; } public int? PipeLineSortIndex { get; set; } } @@ -48,4 +50,23 @@ namespace Model public decimal? MatchRate { get; set; } public string MatchRateString { get; set; } } + + /// + /// 单位工程下部分已焊接组件的导出汇总。 + /// + public class Tw_PartialWeldedComponentOutput + { + public string UnitWorkId { get; set; } + public string UnitWorkName { get; set; } + public string PipelineId { get; set; } + public string PipelineCode { get; set; } + public string PrefabricatedComponents { get; set; } + public string PipeArea { get; set; } + public string PipeAreaText { get; set; } + public int TotalWeldJointCount { get; set; } + public int WeldedWeldJointCount { get; set; } + public int UnweldedWeldJointCount { get; set; } + public decimal? ComponentMatchRate { get; set; } + public string ComponentMatchRateString { get; set; } + } } diff --git a/SGGL/Model/Model.cs b/SGGL/Model/Model.cs index 5fdc5605..416ab46a 100644 --- a/SGGL/Model/Model.cs +++ b/SGGL/Model/Model.cs @@ -101668,6 +101668,8 @@ namespace Model private string _Code; + private string _DesignInstitute; + private EntityRef _Base_Project; private EntitySet _HJGL_PipeLineMat; @@ -101698,6 +101700,8 @@ namespace Model partial void OnBatchNoChanged(); partial void OnCodeChanging(string value); partial void OnCodeChanged(); + partial void OnDesignInstituteChanging(string value); + partial void OnDesignInstituteChanged(); #endregion public HJGL_MaterialCodeLib() @@ -101931,6 +101935,26 @@ namespace Model } } + [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_DesignInstitute", DbType="NVarChar(200)")] + public string DesignInstitute + { + get + { + return this._DesignInstitute; + } + set + { + if ((this._DesignInstitute != value)) + { + this.OnDesignInstituteChanging(value); + this.SendPropertyChanging(); + this._DesignInstitute = value; + this.SendPropertyChanged("DesignInstitute"); + this.OnDesignInstituteChanged(); + } + } + } + [global::System.Data.Linq.Mapping.AssociationAttribute(Name="FK_HJGL_MaterialCodeLib_Base_Project", Storage="_Base_Project", ThisKey="ProjectId", OtherKey="ProjectId", IsForeignKey=true)] public Base_Project Base_Project { @@ -106844,6 +106868,8 @@ namespace Model private string _WeldJointId; private string _MaterialCode2; + + private string _PipeArea; private EntityRef _HJGL_MaterialCodeLib; @@ -106869,6 +106895,8 @@ namespace Model partial void OnWeldJointIdChanged(); partial void OnMaterialCode2Changing(string value); partial void OnMaterialCode2Changed(); + partial void OnPipeAreaChanging(string value); + partial void OnPipeAreaChanged(); #endregion public HJGL_PipeLineMat() @@ -107045,6 +107073,26 @@ namespace Model } } } + + [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_PipeArea", DbType="NChar(1)")] + public string PipeArea + { + get + { + return this._PipeArea; + } + set + { + if ((this._PipeArea != value)) + { + this.OnPipeAreaChanging(value); + this.SendPropertyChanging(); + this._PipeArea = value; + this.SendPropertyChanged("PipeArea"); + this.OnPipeAreaChanged(); + } + } + } [global::System.Data.Linq.Mapping.AssociationAttribute(Name="FK_HJGL_PipeLineMat_HJGL_MaterialCodeLib", Storage="_HJGL_MaterialCodeLib", ThisKey="MaterialCode", OtherKey="MaterialCode", IsForeignKey=true)] public HJGL_MaterialCodeLib HJGL_MaterialCodeLib diff --git a/SGGL/Model/Model.csproj b/SGGL/Model/Model.csproj index edf2293d..4cb6a34b 100644 --- a/SGGL/Model/Model.csproj +++ b/SGGL/Model/Model.csproj @@ -105,6 +105,7 @@ + diff --git a/SGGL/WebAPI/Controllers/HJGL/WeldingManage/PreWeldingDailyController.cs b/SGGL/WebAPI/Controllers/HJGL/WeldingManage/PreWeldingDailyController.cs index c489dc19..5f0b86f5 100644 --- a/SGGL/WebAPI/Controllers/HJGL/WeldingManage/PreWeldingDailyController.cs +++ b/SGGL/WebAPI/Controllers/HJGL/WeldingManage/PreWeldingDailyController.cs @@ -310,5 +310,145 @@ namespace WebAPI.Controllers return responeData; } #endregion + + #region 焊接日报待审核 + /// + /// 获取焊接日报待审核列表。 + /// + /// 项目ID + /// 单位工程ID,可为空 + /// 焊接日期,可为空,格式如 yyyy-MM-dd + /// 管线编号关键字,可为空 + /// 焊工编号关键字,可为空 + /// 页码,从1开始;小于等于0时返回全部记录 + /// 待审核明细列表及总记录数 + [HttpGet] + public Model.ResponeData GetPendingWeldingDailyTempDetailList(string projectId, + string unitWorkId = null, string weldingDate = null, string pipelineCode = null, + string welderCode = null, int pageIndex = 0) + { + var responeData = new Model.ResponeData(); + try + { + if (string.IsNullOrWhiteSpace(projectId)) + { + responeData.code = 0; + responeData.message = "项目ID不能为空"; + return responeData; + } + + var getDataList = APIWeldReportService.GetPendingWeldingDailyTempDetailList( + projectId, unitWorkId, weldingDate, pipelineCode, welderCode); + int pageCount = getDataList.Count; + if (pageCount > 0 && pageIndex > 0) + { + getDataList = getDataList.Skip(Funs.PageSize * (pageIndex - 1)) + .Take(Funs.PageSize).ToList(); + } + + responeData.data = new { pageCount, getDataList }; + } + catch (Exception ex) + { + responeData.code = 0; + responeData.message = ex.Message; + } + + return responeData; + } + + /// + /// 查看单条焊接日报待审核明细。 + /// + /// 待审核明细ID + /// 待审核明细 + [HttpGet] + public Model.ResponeData GetPendingWeldingDailyTempDetail(string tempDetailId) + { + var responeData = new Model.ResponeData(); + try + { + responeData.data = APIWeldReportService.GetPendingWeldingDailyTempDetail(tempDetailId); + } + catch (Exception ex) + { + responeData.code = 0; + responeData.message = ex.Message; + } + + return responeData; + } + + /// + /// 批量审核通过焊接日报待审核明细。 + /// + /// 批量审核参数 + /// 批量处理结果 + [HttpPost] + public Model.ResponeData AuditPendingWeldingDailyTempDetails( + [FromBody] Model.WeldingDailyTempDetailBatchRequest request) + { + var responeData = new Model.ResponeData(); + try + { + if (request == null) + { + responeData.code = 0; + responeData.message = "参数不能为空"; + return responeData; + } + + string errlog = APIWeldReportService.AuditPendingWeldingDailyTempDetails( + request.TempDetailIds, request.AuditMan); + if (!string.IsNullOrEmpty(errlog)) + { + responeData.code = 0; + responeData.message = errlog; + } + } + catch (Exception ex) + { + responeData.code = 0; + responeData.message = ex.Message; + } + + return responeData; + } + + /// + /// 批量删除焊接日报待审核明细。 + /// + /// 批量删除参数 + /// 批量处理结果 + [HttpPost] + public Model.ResponeData DeletePendingWeldingDailyTempDetails( + [FromBody] Model.WeldingDailyTempDetailBatchRequest request) + { + var responeData = new Model.ResponeData(); + try + { + if (request == null) + { + responeData.code = 0; + responeData.message = "参数不能为空"; + return responeData; + } + + string errlog = APIWeldReportService.DeletePendingWeldingDailyTempDetails(request.TempDetailIds); + if (!string.IsNullOrEmpty(errlog)) + { + responeData.code = 0; + responeData.message = errlog; + } + } + catch (Exception ex) + { + responeData.code = 0; + responeData.message = ex.Message; + } + + return responeData; + } + #endregion } } diff --git a/SGGL/WebAPI/WebAPI.csproj b/SGGL/WebAPI/WebAPI.csproj index a8ec9bea..db27a6dd 100644 --- a/SGGL/WebAPI/WebAPI.csproj +++ b/SGGL/WebAPI/WebAPI.csproj @@ -409,4 +409,4 @@ --> - \ No newline at end of file +