新增密炼物料皮重策略功能,包括相关实体、服务、控制器及接口,支持桌面端免密CRUD操作,优化打印记录与原料入场记录的衍生字段填充逻辑,提升用户体验。

This commit is contained in:
geht
2026-06-02 16:28:51 +08:00
parent 37239e1b0a
commit fef7d25e3c
75 changed files with 4407 additions and 170 deletions

View File

@@ -113,18 +113,15 @@ public class WeightRecordService : IWeightRecordService, ISingletonDependency
var filtered = ApplyFilters(source, filterBillNo, filterPlateNumber, filterInoutDirection, filterDriverName, filterMixerMaterialName);
var total = filtered.Count;
var records = filtered.Skip(Math.Max(0, (pageNo - 1) * pageSize)).Take(pageSize).ToList();
// 当前页结果按本地入场记录缓存,按 BillNo 实时累计「已入场重量」(与后端口径一致)。
// 放在分页之后做:避免对全量 source 做不必要的计算。
FillEnteredWeightFromLocalEntries(records);
// 当前页结果按本地入场记录缓存,按 BillNo 实时累计「已入场重量」「货物皮重」(与后端口径一致)。
FillEntryDerivedFieldsFromLocalEntries(records);
return new WeightRecordPageResult(records, total, pageNo, pageSize);
}
/// <summary>
/// 给一批磅单记录批量填充「已入场重量」
/// 数据来源:本地 RawMaterialEntry 缓存的拆码明细字段totalPortions / portionWeight
/// 与后端 sumEnteredWeightByBillNos 同口径,确保离线场景也能正确显示。
/// 给一批磅单记录批量填充由原料入场记录衍生的 transient 字段
/// </summary>
private void FillEnteredWeightFromLocalEntries(List<MesXslWeightRecord> records)
private void FillEntryDerivedFieldsFromLocalEntries(List<MesXslWeightRecord> records)
{
if (records.Count == 0)
{
@@ -137,22 +134,38 @@ public class WeightRecordService : IWeightRecordService, ISingletonDependency
.ToList();
if (billNos.Count == 0)
{
// 全部磅单都没有 BillNo保留服务端返回值若有避免无端置 0。
foreach (var r in records)
{
ApplyRawMaterialWeight(r);
}
return;
}
var entries = _rawMaterialEntryService.GetCachedSnapshot();
var sumMap = EnteredWeightCalculator.SumByBillNos(entries, billNos!);
var enteredMap = EnteredWeightCalculator.SumByBillNos(entries, billNos!);
var cargoTareMap = CargoTareWeightCalculator.SumByBillNos(entries, billNos!);
foreach (var r in records)
{
if (string.IsNullOrWhiteSpace(r.BillNo))
{
r.EnteredWeight = 0d;
r.CargoTareWeight = 0d;
ApplyRawMaterialWeight(r);
continue;
}
r.EnteredWeight = sumMap.TryGetValue(r.BillNo, out var v) ? v : 0d;
r.EnteredWeight = enteredMap.TryGetValue(r.BillNo, out var entered) ? entered : 0d;
r.CargoTareWeight = cargoTareMap.TryGetValue(r.BillNo, out var cargoTare) ? cargoTare : 0d;
ApplyRawMaterialWeight(r);
}
}
/// <summary>原料重量 = 净重 - 货物皮重(不落库)</summary>
private static void ApplyRawMaterialWeight(MesXslWeightRecord record)
{
record.RawMaterialWeight = record.NetWeight.HasValue
? record.NetWeight.Value - (record.CargoTareWeight ?? 0d)
: null;
}
public async Task<MesXslWeightRecord?> GetByIdAsync(string id, CancellationToken ct = default)
{
MesXslWeightRecord? record = null;
@@ -190,7 +203,7 @@ public class WeightRecordService : IWeightRecordService, ISingletonDependency
if (record != null)
{
FillEnteredWeightFromLocalEntries(new List<MesXslWeightRecord> { record });
FillEntryDerivedFieldsFromLocalEntries(new List<MesXslWeightRecord> { record });
}
return record;
}
@@ -725,8 +738,10 @@ public class WeightRecordService : IWeightRecordService, ISingletonDependency
GrossWeight = input.GrossWeight,
TareWeight = input.TareWeight,
NetWeight = input.NetWeight,
// 「已入场重量」由实时聚合写入,Clone 也要原样传递,避免本地缓存 / Pending 重放后被抹掉
// transient 聚合字段:Clone 原样传递,避免本地缓存 / Pending 重放后被抹掉
EnteredWeight = input.EnteredWeight,
CargoTareWeight = input.CargoTareWeight,
RawMaterialWeight = input.RawMaterialWeight,
DriverName = input.DriverName,
DriverPhone = input.DriverPhone,
BillType = input.BillType,