feat(hjgl): 增强焊口匹配与任务单打印

焊口台账、材料匹配和任务单打印需要统一到焊口维度处理。
新增焊口查询、匹配保存和打印模板适配,便于按焊口追溯材料和任务。
This commit is contained in:
2026-06-26 00:40:55 +08:00
parent bd9b5a6f4d
commit 02b524b895
14 changed files with 836 additions and 121 deletions
+11 -3
View File
@@ -136,9 +136,11 @@ namespace BLL
foreach (var material in requiredMaterials)
{
material.Id = Guid.NewGuid().ToString();
// 材料导入只保存材料编码 Code,匹配时按 Code 从库存中挑选实际材料主编码 PipeLineMatCode。
var stock = matchByMaterialCodeLibCode
? stockList
.Where(x => x.Code == material.MaterialCode && (x.StockNum ?? 0) > 0)
// 优先选择库存能覆盖本条需求的材料主编码,再按主编码稳定排序,保证匹配结果可复现。
.OrderByDescending(x => (x.StockNum ?? 0) >= (material.NeedNum ?? 0))
.ThenBy(x => x.PipeLineMatCode)
.FirstOrDefault()
@@ -157,8 +159,9 @@ namespace BLL
material.MatchRateString = Math.Round((decimal)(material.MatchRate ?? 0) * 100, 2).ToString() + "%";
}
// 这里保存的是本次计算匹配到的临时材料主编码;是否已反写以 HJGL_PipeLineMat.MaterialCode 为准。
material.MatchMaterialCode = stock?.PipeLineMatCode;
//修改stockList对应的库存数量
// 本轮匹配会连续消耗同一库存快照,防止后续材料重复占用已匹配数量
if (stock != null)
{
stock.StockNum -= material.MatchNum;
@@ -268,7 +271,8 @@ namespace BLL
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()
where z.ProjectId == projectId && pipelineIds.Contains(z.PipelineId) && x.PrefabricatedComponents != "" //x.PrefabricatedComponents!="" 用于筛选非散件材料
// 材料匹配只处理所需量大于0的非散件材料,避免零用量明细占用库存或影响焊口生成任务单判断。
where z.ProjectId == projectId && pipelineIds.Contains(z.PipelineId) && x.PrefabricatedComponents != "" && (x.Number ?? 0) > 0
select new
{
PipeLineMat = x,
@@ -302,18 +306,21 @@ namespace BLL
var requiredMaterials = pipeLineMats.Select(x =>
{
HJGL_MaterialCodeLib lib = null;
// 已反写材料主编码时,优先按 MaterialCode 精确取材料库信息。
if (!string.IsNullOrEmpty(x.PipeLineMat.MaterialCode) && libByMaterialCode.ContainsKey(x.PipeLineMat.MaterialCode))
{
lib = libByMaterialCode[x.PipeLineMat.MaterialCode];
}
// 未反写时只能按导入材料编码 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(),
PipeLineMatId = x.PipeLineMat.PipeLineMatId,
PipelineId = x.PipeLineMat.PipelineId,
@@ -341,6 +348,7 @@ namespace BLL
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
.Where(x => weldJointIds.Contains(x.WeldJointId))