feat(hjgl): 完善检测结果导入与焊接质量管理
通过批量导入、标准化打印和材料导出,减少检测结果及材料信息的人工整理,确保检测单、委托状态和焊口质量资料保持一致。
This commit is contained in:
+2
-1
@@ -432,6 +432,7 @@
|
||||
<Compile Include="HJGL\LeakVacuum\LeakVacuumAuditService.cs" />
|
||||
<Compile Include="HJGL\LeakVacuum\LeakVacuumEditService.cs" />
|
||||
<Compile Include="HJGL\LeakVacuum\LV_ItemEndCheckService.cs" />
|
||||
<Compile Include="HJGL\NDT\Batch_NDEImportService.cs" />
|
||||
<Compile Include="HJGL\NDT\Batch_NDEItemService.cs" />
|
||||
<Compile Include="HJGL\NDT\Batch_NDEService.cs" />
|
||||
<Compile Include="HJGL\PersonManage\CheckerService.cs" />
|
||||
@@ -920,4 +921,4 @@
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
</Project>
|
||||
|
||||
@@ -3553,6 +3553,17 @@ namespace BLL
|
||||
/// </summary>
|
||||
public const string NDTBatchTemplateUrl = "File\\Excel\\DataIn\\管道焊口检测结果通知单导入模板.xlsx";
|
||||
|
||||
/// <summary>
|
||||
/// 检测结果批量导入空白模板
|
||||
/// </summary>
|
||||
public const string NDTBatchUnitImportTemplateUrl = "File\\Excel\\DataIn\\检测结果导入模板.xlsx";
|
||||
|
||||
/// <summary>
|
||||
/// 管道焊接接头报检/检查记录打印模板
|
||||
/// </summary>
|
||||
public const string WeldAppearanceCheckReportTemplateUrl =
|
||||
"File\\Fastreport\\管道焊接接头报检\\检查记录.frx";
|
||||
|
||||
#endregion
|
||||
|
||||
#region 初始化上传路径
|
||||
|
||||
@@ -0,0 +1,170 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace BLL
|
||||
{
|
||||
/// <summary>
|
||||
/// 单位工程级检测结果导入行
|
||||
/// </summary>
|
||||
public class UnitWorkNDEImportItem
|
||||
{
|
||||
public int RowNumber { get; set; }
|
||||
|
||||
public string TrustBatchId { get; set; }
|
||||
|
||||
public string TrustBatchCode { get; set; }
|
||||
|
||||
public string TrustBatchItemId { get; set; }
|
||||
|
||||
public string PipelineCode { get; set; }
|
||||
|
||||
public string WeldJointCode { get; set; }
|
||||
|
||||
public string WelderCode { get; set; }
|
||||
|
||||
public int TotalFilm { get; set; }
|
||||
|
||||
public int PassFilm { get; set; }
|
||||
|
||||
public string CheckResult { get; set; }
|
||||
|
||||
public string CheckResultText { get; set; }
|
||||
|
||||
public string JudgeGrade { get; set; }
|
||||
|
||||
public string CheckDefects { get; set; }
|
||||
|
||||
public string CheckDefectsText { get; set; }
|
||||
|
||||
public string RepairLocation { get; set; }
|
||||
|
||||
public string Remark { get; set; }
|
||||
|
||||
public DateTime? FilmDate { get; set; }
|
||||
|
||||
public DateTime? ReportDate { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 单位工程级检测结果批量导入
|
||||
/// </summary>
|
||||
public static class Batch_NDEImportService
|
||||
{
|
||||
/// <summary>
|
||||
/// 一次性保存检测单主表、明细和委托检测状态
|
||||
/// </summary>
|
||||
public static void Import(string projectId, string unitWorkId, string personId, IList<UnitWorkNDEImportItem> importItems)
|
||||
{
|
||||
if (importItems == null || importItems.Count == 0)
|
||||
{
|
||||
throw new InvalidOperationException("没有可导入的数据!");
|
||||
}
|
||||
|
||||
Model.SGGLDB db = Funs.DB;
|
||||
bool isValidUnitWork = db.WBS_UnitWork.Any(x => x.UnitWorkId == unitWorkId
|
||||
&& x.ProjectId == projectId
|
||||
&& x.SuperUnitWork == null);
|
||||
if (!isValidUnitWork)
|
||||
{
|
||||
throw new InvalidOperationException("单位工程不存在或不属于当前项目!");
|
||||
}
|
||||
|
||||
List<string> trustBatchIds = importItems.Select(x => x.TrustBatchId).Distinct().ToList();
|
||||
List<string> trustBatchItemIds = importItems.Select(x => x.TrustBatchItemId).Distinct().ToList();
|
||||
|
||||
List<Model.HJGL_Batch_BatchTrust> trusts = db.HJGL_Batch_BatchTrust
|
||||
.Where(x => trustBatchIds.Contains(x.TrustBatchId)
|
||||
&& x.ProjectId == projectId
|
||||
&& x.UnitWorkId == unitWorkId)
|
||||
.ToList();
|
||||
if (trusts.Count != trustBatchIds.Count)
|
||||
{
|
||||
throw new InvalidOperationException("导入数据包含不属于当前单位工程的委托单,请重新审核文件!");
|
||||
}
|
||||
|
||||
if (trustBatchItemIds.Count != importItems.Count)
|
||||
{
|
||||
throw new InvalidOperationException("导入数据包含重复的委托明细,请重新审核文件!");
|
||||
}
|
||||
|
||||
List<Model.HJGL_Batch_BatchTrustItem> trustItems = db.HJGL_Batch_BatchTrustItem
|
||||
.Where(x => trustBatchItemIds.Contains(x.TrustBatchItemId)
|
||||
&& trustBatchIds.Contains(x.TrustBatchId))
|
||||
.ToList();
|
||||
if (trustItems.Count != trustBatchItemIds.Count
|
||||
|| importItems.Any(x => !trustItems.Any(y => y.TrustBatchItemId == x.TrustBatchItemId
|
||||
&& y.TrustBatchId == x.TrustBatchId)))
|
||||
{
|
||||
throw new InvalidOperationException("导入数据包含无效的委托明细,请重新审核文件!");
|
||||
}
|
||||
|
||||
List<string> importedTrustBatchIds = db.HJGL_Batch_NDE
|
||||
.Where(x => trustBatchIds.Contains(x.TrustBatchId))
|
||||
.Select(x => x.TrustBatchId)
|
||||
.ToList();
|
||||
if (importedTrustBatchIds.Count > 0)
|
||||
{
|
||||
string codes = string.Join("、", importItems
|
||||
.Where(x => importedTrustBatchIds.Contains(x.TrustBatchId))
|
||||
.Select(x => x.TrustBatchCode)
|
||||
.Distinct());
|
||||
throw new InvalidOperationException("委托单[" + codes + "]已存在检测结果,不能重复导入!");
|
||||
}
|
||||
|
||||
List<Model.HJGL_Batch_NDE> ndeList = new List<Model.HJGL_Batch_NDE>();
|
||||
List<Model.HJGL_Batch_NDEItem> ndeItemList = new List<Model.HJGL_Batch_NDEItem>();
|
||||
DateTime submitDate = DateTime.Now;
|
||||
|
||||
foreach (IGrouping<string, UnitWorkNDEImportItem> group in importItems.GroupBy(x => x.TrustBatchId))
|
||||
{
|
||||
Model.HJGL_Batch_BatchTrust trust = trusts.First(x => x.TrustBatchId == group.Key);
|
||||
string ndeId = SQLHelper.GetNewID(typeof(Model.HJGL_Batch_NDE));
|
||||
|
||||
// 检测流水号沿用检测单编辑页的委托编号转换规则。
|
||||
string ndeCode = trust.TrustType == "R"
|
||||
? trust.TrustBatchCode.Replace("-FXWT-", "-FXJC-")
|
||||
: trust.TrustBatchCode.Replace("-WT-", "-JC-");
|
||||
ndeList.Add(new Model.HJGL_Batch_NDE
|
||||
{
|
||||
NDEID = ndeId,
|
||||
TrustBatchId = trust.TrustBatchId,
|
||||
ProjectId = projectId,
|
||||
UnitId = trust.UnitId,
|
||||
UnitWorkId = unitWorkId,
|
||||
NDEUnit = trust.NDEUnit,
|
||||
NDECode = ndeCode,
|
||||
NDEMan = personId
|
||||
});
|
||||
|
||||
foreach (UnitWorkNDEImportItem importItem in group)
|
||||
{
|
||||
ndeItemList.Add(new Model.HJGL_Batch_NDEItem
|
||||
{
|
||||
NDEItemID = SQLHelper.GetNewID(typeof(Model.HJGL_Batch_NDEItem)),
|
||||
NDEID = ndeId,
|
||||
TrustBatchItemId = importItem.TrustBatchItemId,
|
||||
DetectionTypeId = trust.DetectionTypeId,
|
||||
TotalFilm = importItem.TotalFilm,
|
||||
PassFilm = importItem.PassFilm,
|
||||
CheckResult = importItem.CheckResult,
|
||||
JudgeGrade = importItem.JudgeGrade,
|
||||
CheckDefects = importItem.CheckDefects,
|
||||
RepairLocation = importItem.RepairLocation,
|
||||
Remark = importItem.Remark,
|
||||
FilmDate = importItem.FilmDate,
|
||||
ReportDate = importItem.ReportDate,
|
||||
SubmitDate = submitDate
|
||||
});
|
||||
}
|
||||
|
||||
trust.IsCheck = true;
|
||||
}
|
||||
|
||||
// 同一 DataContext 只提交一次,保证主表、明细和委托状态要么全部成功,要么全部失败。
|
||||
db.HJGL_Batch_NDE.InsertAllOnSubmit(ndeList);
|
||||
db.HJGL_Batch_NDEItem.InsertAllOnSubmit(ndeItemList);
|
||||
db.SubmitChanges();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,7 @@ namespace BLL
|
||||
/// 分页查询焊缝外观检测记录。
|
||||
/// </summary>
|
||||
/// <param name="projectId">项目ID。</param>
|
||||
/// <param name="checkCode">检测编号。</param>
|
||||
/// <param name="pipelineCode">管线号查询条件。</param>
|
||||
/// <param name="weldJointCode">焊口号查询条件。</param>
|
||||
/// <param name="qualified">合格状态,1为合格,0为不合格,空为全部。</param>
|
||||
@@ -20,7 +21,7 @@ namespace BLL
|
||||
/// <param name="pageSize">每页记录数。</param>
|
||||
/// <returns>外观检测记录及总记录数。</returns>
|
||||
public static Tuple<List<Model.WeldAppearanceCheckItem>, int> GetList(string projectId,
|
||||
string pipelineCode, string weldJointCode, string qualified, int pageIndex, int pageSize)
|
||||
string checkCode, string pipelineCode, string weldJointCode, string qualified, int pageIndex, int pageSize)
|
||||
{
|
||||
var db = Funs.DB;
|
||||
var query = from c in db.HJGL_WeldAppearanceCheck
|
||||
@@ -30,6 +31,10 @@ namespace BLL
|
||||
where string.IsNullOrEmpty(projectId) || c.ProjectId == projectId
|
||||
select new { c, w, CheckPersonName = p == null ? string.Empty : p.PersonName };
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(checkCode))
|
||||
{
|
||||
query = query.Where(x => x.c.CheckCode == checkCode);
|
||||
}
|
||||
if (!string.IsNullOrWhiteSpace(pipelineCode))
|
||||
{
|
||||
query = query.Where(x => x.w.PipelineCode.Contains(pipelineCode));
|
||||
@@ -71,10 +76,93 @@ namespace BLL
|
||||
InterpassTemperature = x.c.InterpassTemperature,
|
||||
CreateTime = x.c.CreateTime
|
||||
}).ToList();
|
||||
PopulateReportFields(data);
|
||||
PopulateAttachUrls(data);
|
||||
return Tuple.Create(data, total);
|
||||
}
|
||||
|
||||
private static void PopulateReportFields(List<Model.WeldAppearanceCheckItem> data)
|
||||
{
|
||||
List<string> weldJointIds = data.Select(x => x.WeldJointId).Distinct().ToList();
|
||||
if (weldJointIds.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var details = Funs.DB.View_HJGL_WeldJoint
|
||||
.Where(x => weldJointIds.Contains(x.WeldJointId))
|
||||
.Select(x => new
|
||||
{
|
||||
x.WeldJointId,
|
||||
x.UnitWorkId,
|
||||
x.UnitWorkName,
|
||||
x.WelderCode,
|
||||
x.Specification,
|
||||
x.MaterialCode,
|
||||
x.WeldingLocationCode,
|
||||
x.WeldingMethodCode,
|
||||
x.WeldingRod,
|
||||
x.WeldingRodCode,
|
||||
x.WeldingWire,
|
||||
x.WeldingWireCode
|
||||
}).ToList();
|
||||
|
||||
List<string> consumablesIds = details
|
||||
.SelectMany(x => new[] { x.WeldingWire, x.WeldingRod })
|
||||
.Where(x => !string.IsNullOrWhiteSpace(x))
|
||||
.Distinct()
|
||||
.ToList();
|
||||
var consumablesById = new Dictionary<string, string>();
|
||||
if (consumablesIds.Count > 0)
|
||||
{
|
||||
consumablesById = Funs.DB.Base_Consumables
|
||||
.Where(x => consumablesIds.Contains(x.ConsumablesId))
|
||||
.ToDictionary(x => x.ConsumablesId, x => x.ConsumablesName);
|
||||
}
|
||||
|
||||
foreach (Model.WeldAppearanceCheckItem item in data)
|
||||
{
|
||||
var detail = details.FirstOrDefault(x => x.WeldJointId == item.WeldJointId);
|
||||
if (detail == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
item.UnitWorkId = detail.UnitWorkId;
|
||||
item.UnitWorkName = detail.UnitWorkName;
|
||||
item.WelderCode = detail.WelderCode;
|
||||
item.Specification = detail.Specification;
|
||||
item.MaterialCode = detail.MaterialCode;
|
||||
item.WeldingLocation = detail.WeldingLocationCode;
|
||||
item.WeldingMethodCode = detail.WeldingMethodCode;
|
||||
item.WeldingRodCode = detail.WeldingRodCode;
|
||||
item.WeldingWireCode = detail.WeldingWireCode;
|
||||
string wireName;
|
||||
string rodName;
|
||||
consumablesById.TryGetValue(detail.WeldingWire ?? string.Empty, out wireName);
|
||||
consumablesById.TryGetValue(detail.WeldingRod ?? string.Empty, out rodName);
|
||||
// 焊材牌号使用焊丝、焊条在耗材基础表中的名称,按既有报表口径以“+”合并并去重。
|
||||
item.WeldingMaterial = string.Join("+", new[] { wireName, rodName }
|
||||
.Where(x => !string.IsNullOrWhiteSpace(x)).Distinct());
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询当前项目可用于筛选和打印的检测编号。
|
||||
/// </summary>
|
||||
/// <param name="projectId">项目ID。</param>
|
||||
/// <returns>检测编号列表。</returns>
|
||||
public static List<string> GetCheckCodes(string projectId)
|
||||
{
|
||||
return Funs.DB.HJGL_WeldAppearanceCheck
|
||||
.Where(x => (string.IsNullOrEmpty(projectId) || x.ProjectId == projectId)
|
||||
&& x.CheckCode != null && x.CheckCode != string.Empty)
|
||||
.Select(x => x.CheckCode)
|
||||
.Distinct()
|
||||
.OrderByDescending(x => x)
|
||||
.ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 分页查询当前项目中已焊接的焊口。
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user