fix(migration): дизамбигуация повторяющихся номеров приёмок (МойСклад дублирует по годам)
Номера МойСклада повторяются по годам, а у нас (OrganizationId, Number) уникален → дубли роняли импорт. Сохраняем оригинальный номер где можно, при коллизии — «<номер>-<год>[-N]». Оригинал всегда в MoySkladExternalId. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
955c3f5e77
commit
025d468492
|
|
@ -70,6 +70,16 @@ private static DateTime MomentToUtc(string? moment)
|
||||||
.Select(p => new { p.Id, p.MoySkladExternalId }).ToDictionaryAsync(x => x.MoySkladExternalId!, x => x.Id, ct);
|
.Select(p => new { p.Id, p.MoySkladExternalId }).ToDictionaryAsync(x => x.MoySkladExternalId!, x => x.Id, ct);
|
||||||
var done = (await _db.Supplies.Where(s => s.MoySkladExternalId != null)
|
var done = (await _db.Supplies.Where(s => s.MoySkladExternalId != null)
|
||||||
.Select(s => s.MoySkladExternalId!).ToListAsync(ct)).ToHashSet();
|
.Select(s => s.MoySkladExternalId!).ToListAsync(ct)).ToHashSet();
|
||||||
|
// Номера приёмок МойСклада ПОВТОРЯЮТСЯ по годам, а у нас (OrganizationId, Number)
|
||||||
|
// уникален. Сохраняем оригинальный номер где можно, при коллизии добавляем год/счётчик.
|
||||||
|
var usedNumbers = (await _db.Supplies.Select(s => s.Number).ToListAsync(ct)).ToHashSet(StringComparer.OrdinalIgnoreCase);
|
||||||
|
string UniqueNumber(string baseName, int year)
|
||||||
|
{
|
||||||
|
if (usedNumbers.Add(baseName)) return baseName;
|
||||||
|
var withYear = $"{baseName}-{year}";
|
||||||
|
if (usedNumbers.Add(withYear)) return withYear;
|
||||||
|
for (var n = 2; ; n++) { var cand = $"{baseName}-{year}-{n}"; if (usedNumbers.Add(cand)) return cand; }
|
||||||
|
}
|
||||||
|
|
||||||
// expand=positions (НЕ positions.assortment — это раскрывает весь товар и делает
|
// expand=positions (НЕ positions.assortment — это раскрывает весь товар и делает
|
||||||
// страницу гигантской/зависающей). assortment.meta.href в позиции есть и так — из него
|
// страницу гигантской/зависающей). assortment.meta.href в позиции есть и так — из него
|
||||||
|
|
@ -86,10 +96,11 @@ private static DateTime MomentToUtc(string? moment)
|
||||||
: fallbackSupplier ?? throw new InvalidOperationException("Нет контрагента-поставщика");
|
: fallbackSupplier ?? throw new InvalidOperationException("Нет контрагента-поставщика");
|
||||||
var momentUtc = MomentToUtc(d.Moment);
|
var momentUtc = MomentToUtc(d.Moment);
|
||||||
var posted = d.Applicable;
|
var posted = d.Applicable;
|
||||||
|
var baseNumber = string.IsNullOrWhiteSpace(d.Name) ? $"МС-{d.Id[..8]}" : d.Name!;
|
||||||
var supply = new foodmarket.Domain.Purchases.Supply
|
var supply = new foodmarket.Domain.Purchases.Supply
|
||||||
{
|
{
|
||||||
OrganizationId = orgId,
|
OrganizationId = orgId,
|
||||||
Number = string.IsNullOrWhiteSpace(d.Name) ? $"МС-{d.Id[..8]}" : d.Name!,
|
Number = UniqueNumber(baseNumber, momentUtc.Year),
|
||||||
Date = momentUtc,
|
Date = momentUtc,
|
||||||
Status = posted ? foodmarket.Domain.Purchases.SupplyStatus.Posted : foodmarket.Domain.Purchases.SupplyStatus.Draft,
|
Status = posted ? foodmarket.Domain.Purchases.SupplyStatus.Posted : foodmarket.Domain.Purchases.SupplyStatus.Draft,
|
||||||
SupplierId = supplierId,
|
SupplierId = supplierId,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue