实现原料入场条码与批次号生成逻辑,离线时支持本地兜底;并在后续处理前补充入场记录必要标识校验。
This commit is contained in:
@@ -5,6 +5,7 @@ using System.Text;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Nodes;
|
||||
using System.Text.Json.Serialization;
|
||||
using System.Globalization;
|
||||
using System.Web;
|
||||
using Prism.Events;
|
||||
using YY.Admin.Core;
|
||||
@@ -151,6 +152,7 @@ public class RawMaterialEntryService : IRawMaterialEntryService, ISingletonDepen
|
||||
if (!entry.TenantId.HasValue || entry.TenantId.Value <= 0) entry.TenantId = DefaultTenantId;
|
||||
var local = Clone(entry);
|
||||
if (string.IsNullOrWhiteSpace(local.Id)) local.Id = $"local-{Guid.NewGuid():N}";
|
||||
EnsureBarcodeAndBatchNo(local);
|
||||
|
||||
if (_networkMonitor.IsOnline)
|
||||
{
|
||||
@@ -228,6 +230,11 @@ public class RawMaterialEntryService : IRawMaterialEntryService, ISingletonDepen
|
||||
|
||||
public async Task<string?> GenerateBarcodeAsync(string materialCode, CancellationToken ct = default)
|
||||
{
|
||||
if (!_networkMonitor.IsOnline)
|
||||
{
|
||||
return GenerateLocalBarcode(materialCode);
|
||||
}
|
||||
|
||||
var url = $"{BaseUrl}/xslmes/mesXslRawMaterialEntry/anon/generateBarcode?materialCode={Uri.EscapeDataString(materialCode ?? "")}";
|
||||
try
|
||||
{
|
||||
@@ -243,7 +250,46 @@ public class RawMaterialEntryService : IRawMaterialEntryService, ISingletonDepen
|
||||
{
|
||||
_logger.Warning($"[原料入场] 生成条码失败: {ex.Message}");
|
||||
}
|
||||
return null;
|
||||
return GenerateLocalBarcode(materialCode);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 桌面端离线兜底产号:保持与服务端一致的格式 QH + 物料编码 + yyMMdd + 3位流水。
|
||||
/// 流水号口径与服务端一致:按当前前缀匹配条码计数 + 1(非 max+1)。
|
||||
/// </summary>
|
||||
private string GenerateLocalBarcode(string materialCode)
|
||||
{
|
||||
var normalizedCode = (materialCode ?? string.Empty).Trim();
|
||||
var dateStr = DateTime.Now.ToString("yyMMdd", CultureInfo.InvariantCulture);
|
||||
var prefix = $"QH{normalizedCode}{dateStr}";
|
||||
|
||||
int sequence;
|
||||
lock (_cacheLock)
|
||||
{
|
||||
var snapshot = ApplyPendingOpsSnapshotUnsafe(_localCache.Select(Clone).ToList());
|
||||
var count = snapshot.Count(x =>
|
||||
!string.IsNullOrWhiteSpace(x.Barcode) &&
|
||||
x.Barcode!.StartsWith(prefix, StringComparison.OrdinalIgnoreCase));
|
||||
sequence = count + 1;
|
||||
}
|
||||
return $"{prefix}{sequence:000}";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 新增入场记录时保证条码和批次号本地可用:
|
||||
/// 条码为空时本地生成,批次号为空时回填为条码。
|
||||
/// </summary>
|
||||
private void EnsureBarcodeAndBatchNo(MesXslRawMaterialEntry entry)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(entry.Barcode))
|
||||
{
|
||||
entry.Barcode = GenerateLocalBarcode(entry.MaterialCode ?? string.Empty);
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(entry.BatchNo))
|
||||
{
|
||||
entry.BatchNo = entry.Barcode;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<(string templateJson, string printDataJson, string? errorMessage)> PrepareNativePrintAsync(string id, CancellationToken ct = default)
|
||||
|
||||
Reference in New Issue
Block a user