feat(hjgl): 增强焊口匹配与任务单打印
焊口台账、材料匹配和任务单打印需要统一到焊口维度处理。 新增焊口查询、匹配保存和打印模板适配,便于按焊口追溯材料和任务。
This commit is contained in:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user