Selaa lähdekoodia

[Fix] EN support on "Stock Ledger Fix" page

do_workbench_fix
Harry Groves 6 päivää sitten
vanhempi
commit
533dd176c1
7 muutettua tiedostoa jossa 606 lisäystä ja 207 poistoa
  1. +12
    -6
      src/app/(main)/settings/stockLedgerFix/page.tsx
  2. +1
    -0
      src/components/Breadcrumb/Breadcrumb.tsx
  3. +295
    -201
      src/components/StockLedgerFix/StockLedgerFixPageClient.tsx
  4. +2
    -0
      src/i18n/en/navigation.json
  5. +147
    -0
      src/i18n/en/stockLedgerFix.json
  6. +2
    -0
      src/i18n/zh/navigation.json
  7. +147
    -0
      src/i18n/zh/stockLedgerFix.json

+ 12
- 6
src/app/(main)/settings/stockLedgerFix/page.tsx Näytä tiedosto

@@ -1,16 +1,22 @@
import { Metadata } from "next";
import PageTitleBar from "@/components/PageTitleBar";
import StockLedgerFixPageClient from "@/components/StockLedgerFix/StockLedgerFixPageClient";
import { getServerI18n, I18nProvider } from "@/i18n";

export const metadata: Metadata = {
title: "Stock Ledger Fix",
};
export async function generateMetadata(): Promise<Metadata> {
const { t } = await getServerI18n("stockLedgerFix");
return { title: t("pageTitle") };
}

const StockLedgerFixPage: React.FC = async () => {
const { t } = await getServerI18n("stockLedgerFix");

const StockLedgerFixPage: React.FC = () => {
return (
<>
<PageTitleBar title="Stock Ledger Fix" className="mb-4" />
<StockLedgerFixPageClient />
<PageTitleBar title={t("pageTitle")} className="mb-4" />
<I18nProvider namespaces={["stockLedgerFix", "navigation", "common"]}>
<StockLedgerFixPageClient />
</I18nProvider>
</>
);
};


+ 1
- 0
src/components/Breadcrumb/Breadcrumb.tsx Näytä tiedosto

@@ -35,6 +35,7 @@ const pathToLabelKey: { [path: string]: string } = {
"/settings/qrCodeHandle": "nav.breadcrumb.qrCodeHandle",
"/settings/deliveryOrderFloor": "nav.breadcrumb.deliveryOrderFloor",
"/settings/masterDataIssues": "nav.breadcrumb.masterDataIssues",
"/settings/stockLedgerFix": "nav.breadcrumb.stockLedgerFix",
"/settings/rss": "nav.breadcrumb.demandForecast",
"/settings/equipment": "nav.breadcrumb.equipment",
"/settings/equipment/MaintenanceEdit": "nav.breadcrumb.equipmentMaintenanceEdit",


+ 295
- 201
src/components/StockLedgerFix/StockLedgerFixPageClient.tsx
File diff suppressed because it is too large
Näytä tiedosto


+ 2
- 0
src/i18n/en/navigation.json Näytä tiedosto

@@ -49,6 +49,8 @@
"nav.settings.demandForecast": "Demand Forecast Setting",
"nav.settings.bomWeighting": "BOM Weighting Score List",
"nav.settings.masterDataIssues": "BOM / Item UOM Issues",
"nav.settings.stockLedgerFix": "Stock Ledger Fix",
"nav.breadcrumb.stockLedgerFix": "Stock Ledger Fix",
"nav.settings.qrCodeHandle": "QR Code Handle",
"nav.settings.importTesting": "Import Testing",
"nav.settings.importExcel": "Import Excel",


+ 147
- 0
src/i18n/en/stockLedgerFix.json Näytä tiedosto

@@ -0,0 +1,147 @@
{
"pageTitle": "Stock Ledger Fix",
"inventory10Title": "1.0 Inventory (Plan A)",
"inventory10Description": "Keeps existing IDs. Adds UOMs that exist on lots but not in inventory. onHand = Σ(in−out) by item+UOM. Rows with no lots become 0. When an item has multiple old rows, only one stock-UOM bucket is kept; the rest are marked deleted=1. Run this while inbound/outbound is paused, then Fix day by day.",
"inventory10LoadError": "Could not load inventory 1.0 preview (ADMIN / TESTING required)",
"inventory10Preview": "Existing inventory: {{rows}} rows; lot item+UOM pairs: {{lotPairs}}; missing: {{missing}}; stockUomId still NULL: {{nullUom}} rows.",
"inventory10Running": "Recalculating…",
"inventory10Run": "Run inventory 1.0 (A)",
"inventory10Confirm": "Plan A: keep existing inventory.id; backfill stockUomId from lots (if the old uomId is stock, revert it to base); insert missing (itemId, stockUomId) rows; recalculate onHand/unavailable from lot in−out. Does not write onHoldQty or change inventory_lot_line. Continue?",
"inventory10Done": "Inventory 1.0 complete: patched stockUomId {{patched}} rows, inserted {{inserted}}, orphans deleted {{orphans}}, recalculated {{updated}}, still missing UOM {{missingAfter}}, still NULL stockUomId {{nullAfter}}",
"inventory10Fail": "Inventory 1.0 failed",
"adjTitle": "2.7 ADJ: set over-issue remain to 0, then align ledger",
"adjDescription": "Choose an ADJ date, then preview. Default is yesterday. For a freeze-dump night you can pick today (e.g. write 31/8 23:17 ADJ onto 31/8). First handle over-issue (line in < out): raise that lot’s inQty to equal outQty (remain=0; trigger recalculates inventory). Then handle miss: if line and ledger differ, write ADJ against the existing lot’s inbound/outbound lines (lot quantities are not changed). One Apply shares one inbound document and one outbound document, with multiple lines under them. Running again on the same ADJ date reuses those two documents. Detail shows at most 20 rows.",
"adjDateLabel": "ADJ date",
"adjDateRequired": "Please enter an ADJ date",
"adjDateFuture": "ADJ date cannot be in the future",
"adjDateAndPreviewRequired": "Please enter an ADJ date and preview first",
"adjTodayFreeze": "Today (freeze night)",
"adjYesterday": "Yesterday",
"adjLoadError": "Could not load ADJ preview (ADMIN / TESTING required)",
"adjPreviewSummary": "ADJ date {{date}}; {{lotCount}} lots can be processed (over-issue remain→0: {{overIssueCount}}, total {{sumOverIssue}}; miss in {{adjInCount}}, out {{adjOutCount}}); missing in total {{sumMissIn}}, missing out total {{sumMissOut}}; SKU net {{skuNet}}{{skuNetNote}}{{revNote}}. Table shows at most 20 rows (over-issue first).",
"adjSkuNetNote": " (non-zero means missing in has no matching missing out)",
"adjRevNote": "; includes reverse ADJ {{count}} lots (ledger over-recorded)",
"adjColLotLineId": "lotLineId",
"adjColItemCode": "itemCode",
"adjColLineInOut": "line in/out",
"adjColLedgerInOut": "ledger in/out",
"adjColMissIn": "Missing in",
"adjColMissOut": "Missing out",
"adjColOverIssue": "Over-issue",
"adjPreviewing": "Previewing…",
"adjPreviewAgain": "Refresh preview",
"adjPreview": "Preview",
"adjApplying": "Writing ADJ…",
"adjApply": "Apply ADJ",
"adjConfirm": "On {{date}}, first patch over-issue remain→0 ({{overIssueCount}} lots, total {{sumOverIssue}}; this changes lot inQty). Then fill miss ADJ: inbound {{adjInCount}}, outbound {{adjOutCount}}. All inbound lines share one inbound document; all outbound lines share one outbound document (miss does not change lot qty). Missing in total {{sumMissIn}}, missing out total {{sumMissOut}}. Continue?",
"adjDone": "ADJ {{date}}: over-issue remain→0 {{overIssuePatched}}, in {{insertedIn}}, out {{insertedOut}}, lotQty {{filledLotQty}}, balance {{filledBalance}}, day close {{dayRowsWritten}}",
"adjFail": "ADJ align failed",
"tabCalendar": "Calendar",
"tabInventory": "Inventory",
"tabLot": "Lot line",
"calendarHint": "Click the title at the top-left to pick year, then month.\nChanging month does not load data; click a day to inspect that day.\nToday can be fixed (freeze-dump night).",
"selectDate": "Select a date",
"dayLoadError": "Could not load the day’s check",
"dayLedgerCount": "{{cnt}} ledger rows that day",
"cannotFixFuture": "Cannot fix a future date",
"cannotFixFutureRange": "Cannot fix a future date (today is allowed for freeze-dump night)",
"pickAtLeastOneStep": "Select at least one step (default runs all of 2.1–2.6)",
"allSteps216": "all 2.1–2.6",
"confirmPartialSteps": "Run only {{steps}} ({{date}}). Unchecked steps will not be recalculated. Continue?",
"fixDayDone": "Fixed {{date}} ({{steps}}): lot {{lot}}, uom {{uom}}, inventory {{inventory}}, lotQty {{lotQty}}, balance {{balance}}, day close {{dayRows}}",
"fixFailed": "Fix failed",
"fixing": "Fixing…",
"fixThisDay": "Fix this day",
"stepsTitle": "Steps (all selected by default)",
"stepsHint": "After applying SQL, if you only need to change inventoryId, tick 2.3 only. Unchecked steps are not recalculated.",
"selectAll": "Select all",
"step21": "2.1 lot",
"step22": "2.2 uom",
"step23": "2.3 inventoryId",
"step24": "2.4 lotQty",
"step25": "2.5 balance",
"step26": "2.6 day close",
"rangeTitle": "Range fix (2.1–2.6 in one run)",
"rangeHint": "Uses the steps ticked above. One API call, but runs day by day (same SQL as a single-day fix, commit per day). Today is allowed (freeze-dump night). Frontend timeout is about 20 minutes; for a large range, export SQL instead.",
"rangeFromRequired": "Please fill range from / to",
"toMustBeGteFrom": "to must be ≥ from",
"fromTooEarly": "from cannot be earlier than {{date}}",
"rangeConfirm": "Fix {{from}} → {{to}} (steps: {{steps}}). Runs day by day (commit each day). Days already finished are kept if it fails mid-way. Continue?",
"rangeProgress": "Range fix {{from}} → {{to}} ({{steps}}) in progress…",
"rangeDone": "Range fix complete {{date}} ({{steps}}): lot {{lot}}, uom {{uom}}, inventory {{inventory}}, lotQty {{lotQty}}, balance {{balance}}, day close {{dayRows}}",
"rangeFail": "Range fix failed",
"rangeRunning": "Range fix in progress…",
"rangeRun": "Range fix",
"from": "from",
"to": "to",
"exportTitle": "Export patched SQL (for the new database)",
"exportHint": "Tick the sections to export (same as day-fix steps). Apply order: 1.0 → ledger (±2.3) → 2.7 inbound/outbound documents + ADJ INSERT → 2.6. A full file (1.0 + 2.3) can skip production 1.0/2.3 when production is frozen and IDs match. Default exports only ledger + day close (legacy behaviour).",
"exportPickAtLeastOne": "Select at least one export section",
"export23Without10": "2.3 inventoryId is ticked but 1.0 inventory is not: if production is missing the new IDs, UPDATE will point at empty rows. Tick 1.0 as well (full file). Export anyway?",
"exportFail": "Export failed",
"exporting": "Exporting…",
"exportSql": "Export .sql",
"exportDefault": "Default",
"exportFull": "Full file",
"exportFromToRequired": "Please fill from / to",
"export10": "1.0 inventory",
"export23": "2.3 inventoryId",
"exportLedger": "ledger lot/uom/lotQty/balance",
"export26": "2.6 day close",
"export27": "2.7 ADJ + inbound/outbound documents",
"invTabHint": "Search by itemCode or inventoryId. Fix recalculates lotQty, day close, and balance for this item’s ledger up to today — no need to click the calendar day by day. If the warehouse is still writing this item during the day, new ledger rows after the fix are still handled by the live writer.",
"invSearchLabel": "itemCode / inventoryId",
"searching": "Searching…",
"search": "Search",
"searchFailed": "Search failed",
"colInventoryId": "inventoryId",
"colItemCode": "itemCode",
"colUomId": "uomId",
"colLedgerRows": "ledger rows",
"invLoadError": "Could not load inventory",
"invScopeSummary": "{{itemCode}} / inventory {{id}} / uom {{uomId}}; {{firstDate}} → {{lastDate}}; {{cnt}} rows; last balance {{lastBalance}}",
"invFixConfirm": "This will recalculate lotQty and day close for all ledger rows of this inventory up to today, plus this item’s balance. Continue?",
"invFixDone": "Fixed inventory {{id}}: lot {{lot}}, uom {{uom}}, inventory {{inventory}}, lotQty {{lotQty}}, balance {{balance}}, day close {{dayRows}}",
"fixThisInventory": "Fix this inventory",
"lotTabHint": "Search by lotNo or inventoryLotLineId. Fix only recalculates this lot’s lotQty and day close; it does not change balance.",
"lotSearchLabel": "lotNo / lot line id",
"colLotLineId": "lot line id",
"colLotNo": "lotNo",
"lotLoadError": "Could not load lot",
"lotScopeSummary": "{{lotNo}} / lot {{id}} / {{itemCode}}; {{firstDate}} → {{lastDate}}; {{cnt}} rows; last lotQtyAfter {{lastLotQtyAfter}}",
"lotFixConfirm": "This only fixes this lot’s lotQty and day close; it will not change the item’s balance. Continue?",
"lotFixDone": "Fixed lot {{id}}: lot {{lot}}, uom {{uom}}, inventory {{inventory}}, lotQty {{lotQty}}, day close {{dayRows}}",
"fixThisLot": "Fix this lot",
"checkItem": "Item",
"checkStatus": "Status",
"checkCorrect": "Correct",
"checkMiss": "Missing",
"checkIncorrect": "Incorrect",
"checkReason": "Reason",
"checkRows": "Rows",
"checkDash": "—",
"canAutoFix": "Can auto-fix (handled by Fix)",
"cannotAutoFix": "Cannot auto-fix (Fix will not clear these: old TKE new lots / true over-issue / no lot source)",
"verdictCorrect": "correct",
"verdictMiss": "miss",
"verdictOverIssue": "over-issue",
"verdictCanFix": "can fix",
"verdictCannotFix": "cannot fix",
"verdictIncorrect": "incorrect",
"part": {
"lot": "inventoryLotLineId",
"uom": "uomId",
"inventory": "inventoryId",
"lotQty": "lotQtyBefore/After (lot already exists)",
"overIssue": "over-issue (lotQty < 0)",
"balance": "balance",
"dayTable": "stock_lot_day",
"fixable21a": "Can fix 2.1a: SIL/SOL already has a lot line",
"fixable21b": "Can fix 2.1b: inventoryLotId has only one line",
"fixableLotQty": "Can fix: lot exists but lotQty is missing",
"cannotNoSource": "Cannot fix: no SIL/SOL lot source",
"cannotMultiLine": "Cannot fix: same lot has multiple warehouse lines",
"earlyTke": "Cannot fix: old TKE opened a new lot (sibling surplus)",
"realOver": "Cannot fix: over-issue is not old TKE (true over-issue / ledger mismatch)"
}
}

+ 2
- 0
src/i18n/zh/navigation.json Näytä tiedosto

@@ -81,6 +81,8 @@
"nav.settings.items": "物品",
"nav.settings.itemDefaultShelfLife": "物品預設保質期",
"nav.settings.masterDataIssues": "BOM / 物料單位問題",
"nav.settings.stockLedgerFix": "庫存帳修復",
"nav.breadcrumb.stockLedgerFix": "庫存帳修復",
"nav.settings.priceInquiry": "價格查詢",
"nav.settings.printer": "列印機",
"nav.settings.qcCategory": "QC 品檢模板",


+ 147
- 0
src/i18n/zh/stockLedgerFix.json Näytä tiedosto

@@ -0,0 +1,147 @@
{
"pageTitle": "庫存帳修復",
"inventory10Title": "1.0 inventory(方案 A)",
"inventory10Description": "保留現有 id;lot 有、inventory 沒有的 UOM 會新增;onHand = Σ(in−out) 按 item+UOM。沒有 lot 的列會變成 0。同一料多顆舊列時只留一顆 stock UOM 桶,其餘 deleted=1。請在進出倉暫停時執行,再逐日 Fix。",
"inventory10LoadError": "無法載入 inventory 1.0 預覽(需要 ADMIN / TESTING)",
"inventory10Preview": "現有 inventory {{rows}} 列;lot 的 item+UOM {{lotPairs}} 組;缺 {{missing}} 組;stockUomId 仍 NULL {{nullUom}} 列。",
"inventory10Running": "重算中…",
"inventory10Run": "Run inventory 1.0 (A)",
"inventory10Confirm": "方案 A:保留現有 inventory.id;從 lot 回填 stockUomId(舊 uomId 是 stock 則改回 base);補缺 (itemId, stockUomId);用 lot 的 in−out 重算 onHand/unavailable。不寫 onHoldQty、不改 inventory_lot_line。確定執行?",
"inventory10Done": "inventory 1.0 完成:回填 stockUomId {{patched}} 列、新增 {{inserted}} 列、殘列 deleted {{orphans}}、重算 {{updated}} 列、之後仍缺 UOM {{missingAfter}}、仍 NULL stockUomId {{nullAfter}}",
"inventory10Fail": "inventory 1.0 失敗",
"adjTitle": "2.7 ADJ:超發 remain→0,再對齊 ledger",
"adjDescription": "請先選 ADJ 日期再預覽。預設昨天;freeze dump 夜可選今天(例如 31/8 23:17 寫 ADJ 到 31/8)。先處理超發(line 入少於出):把該 lot 的 inQty 補到等於 outQty(remain=0,trigger 重算 inventory)。再處理 miss:line 與 ledger 有差就 ADJ,掛既有 lot 的入/出倉行(不改 lot 數量)。一次 Apply 共用一張入倉單、一張出倉單,下面多行;同一 ADJ 日期再跑會沿用這兩張單。明細最多 20 列。",
"adjDateLabel": "ADJ 日期",
"adjDateRequired": "請填 ADJ 日期",
"adjDateFuture": "ADJ 日期不能是未來",
"adjDateAndPreviewRequired": "請填 ADJ 日期並先預覽",
"adjTodayFreeze": "今天(freeze 夜)",
"adjYesterday": "昨天",
"adjLoadError": "無法載入 ADJ 預覽(需要 ADMIN / TESTING)",
"adjPreviewSummary": "ADJ 日期 {{date}};可處理 {{lotCount}} 條 lot(超發 remain→0 {{overIssueCount}}、合計 {{sumOverIssue}};miss 入 {{adjInCount}}、出 {{adjOutCount}});缺入合計 {{sumMissIn}}、缺出合計 {{sumMissOut}};SKU 淨額 {{skuNet}}{{skuNetNote}}{{revNote}}。下列最多 20 列(超發優先)。",
"adjSkuNetNote": "(非 0 表示有缺入沒有對應缺出)",
"adjRevNote": ";含反向 ADJ {{count}} 條(ledger 多記)",
"adjColLotLineId": "lotLineId",
"adjColItemCode": "itemCode",
"adjColLineInOut": "line in/out",
"adjColLedgerInOut": "ledger in/out",
"adjColMissIn": "缺入",
"adjColMissOut": "缺出",
"adjColOverIssue": "超發",
"adjPreviewing": "預覽中…",
"adjPreviewAgain": "重新預覽",
"adjPreview": "預覽",
"adjApplying": "寫入 ADJ 中…",
"adjApply": "Apply ADJ",
"adjConfirm": "會在 {{date}} 先修超發 remain→0({{overIssueCount}} 條 lot,合計 {{sumOverIssue}},會改 lot inQty)。再補 miss ADJ:入向 {{adjInCount}} 筆、出向 {{adjOutCount}} 筆。入向全部掛同一張入倉單、出向全部掛同一張出倉單(miss 不改 lot 數量)。缺入合計 {{sumMissIn}}、缺出合計 {{sumMissOut}}。確定?",
"adjDone": "ADJ {{date}}:超發 remain→0 {{overIssuePatched}}、入 {{insertedIn}}、出 {{insertedOut}}、lotQty {{filledLotQty}}、balance {{filledBalance}}、日結 {{dayRowsWritten}}",
"adjFail": "ADJ 對齊失敗",
"tabCalendar": "日曆",
"tabInventory": "Inventory",
"tabLot": "Lot line",
"calendarHint": "點左上標題可先選年再選月。換月不會查資料;點某一天才檢查當天。今天可修(freeze dump 夜)。",
"selectDate": "請選日期",
"dayLoadError": "無法載入當日檢查",
"dayLedgerCount": "當天 ledger {{cnt}} 列",
"cannotFixFuture": "不能修未來日期",
"cannotFixFutureRange": "不能修未來日期(今天可以,給 freeze dump 夜修)",
"pickAtLeastOneStep": "請至少勾一個步驟(預設全跑 2.1–2.6)",
"allSteps216": "全部 2.1–2.6",
"confirmPartialSteps": "只跑 {{steps}}({{date}})。未勾的步驟不會重算。確定?",
"fixDayDone": "已修 {{date}}({{steps}}):lot {{lot}}、uom {{uom}}、inventory {{inventory}}、lotQty {{lotQty}}、balance {{balance}}、日結 {{dayRows}}",
"fixFailed": "修復失敗",
"fixing": "修復中…",
"fixThisDay": "Fix this day",
"stepsTitle": "步驟(預設全跑)",
"stepsHint": "套 SQL 後只改 inventoryId 時只勾 2.3。只跑部分時未勾的不會重算。",
"selectAll": "全選",
"step21": "2.1 lot",
"step22": "2.2 uom",
"step23": "2.3 inventoryId",
"step24": "2.4 lotQty",
"step25": "2.5 balance",
"step26": "2.6 日結",
"rangeTitle": "區間修(2.1–2.6 一次)",
"rangeHint": "使用上面勾的步驟,一次 API 但改為逐日(與單日修相同 SQL,每天 commit)。可含今天(freeze dump 夜)。前端最長約 20 分鐘;大區間仍建議匯出 SQL。",
"rangeFromRequired": "請填區間修 from / to",
"toMustBeGteFrom": "to 必須 ≥ from",
"fromTooEarly": "from 不能早於 {{date}}",
"rangeConfirm": "一次修 {{from}} → {{to}}(步驟:{{steps}})。改為逐日跑(每天 commit)。中途失敗時已跑完的天會留下。確定?",
"rangeProgress": "區間修 {{from}} → {{to}}({{steps}})進行中…",
"rangeDone": "區間修完成 {{date}}({{steps}}):lot {{lot}}、uom {{uom}}、inventory {{inventory}}、lotQty {{lotQty}}、balance {{balance}}、日結 {{dayRows}}",
"rangeFail": "區間修失敗",
"rangeRunning": "區間修中…",
"rangeRun": "區間修",
"from": "from",
"to": "to",
"exportTitle": "匯出已修 SQL(新庫用)",
"exportHint": "勾選要匯出的段落(同日修步驟)。套檔順序:1.0 → ledger(±2.3)→ 2.7 入出倉單+ADJ INSERT → 2.6。完整檔(含 1.0+2.3)且正式庫 freeze/id 同源時,可跳過正式庫 1.0/2.3。預設只匯 ledger+日結(舊行為)。",
"exportPickAtLeastOne": "請至少勾一個匯出項目",
"export23Without10": "已勾 2.3 inventoryId 但未勾 1.0 inventory:正式庫若缺新 id,UPDATE 會指到空列。建議一併勾 1.0(完整檔)。仍要匯出?",
"exportFail": "匯出失敗",
"exporting": "匯出中…",
"exportSql": "匯出 .sql",
"exportDefault": "預設",
"exportFull": "完整檔",
"exportFromToRequired": "請填 from / to",
"export10": "1.0 inventory",
"export23": "2.3 inventoryId",
"exportLedger": "ledger lot/uom/lotQty/balance",
"export26": "2.6 日結",
"export27": "2.7 ADJ+入出倉單",
"invTabHint": "搜 itemCode 或 inventoryId。Fix 會重算這顆料到今天為止全部流水的 lotQty、日結與 balance,不必逐日點日曆。白天倉還在寫這顆料時,修完後新流水仍由 live writer 接。",
"invSearchLabel": "itemCode / inventoryId",
"searching": "搜尋中…",
"search": "搜尋",
"searchFailed": "搜尋失敗",
"colInventoryId": "inventoryId",
"colItemCode": "itemCode",
"colUomId": "uomId",
"colLedgerRows": "ledger 列",
"invLoadError": "無法載入 inventory",
"invScopeSummary": "{{itemCode}} / inventory {{id}} / uom {{uomId}};{{firstDate}} → {{lastDate}};{{cnt}} 列;最後 balance {{lastBalance}}",
"invFixConfirm": "會重算這顆 inventory 到今天為止全部 ledger 的 lotQty、日結,以及這顆料的 balance。確定?",
"invFixDone": "已修 inventory {{id}}:lot {{lot}}、uom {{uom}}、inventory {{inventory}}、lotQty {{lotQty}}、balance {{balance}}、日結 {{dayRows}}",
"fixThisInventory": "Fix this inventory",
"lotTabHint": "搜 lotNo 或 inventoryLotLineId。Fix 只重算這張 lot 的 lotQty 與日結,不改 balance。",
"lotSearchLabel": "lotNo / lot line id",
"colLotLineId": "lot line id",
"colLotNo": "lotNo",
"lotLoadError": "無法載入 lot",
"lotScopeSummary": "{{lotNo}} / lot {{id}} / {{itemCode}};{{firstDate}} → {{lastDate}};{{cnt}} 列;最後 lotQtyAfter {{lastLotQtyAfter}}",
"lotFixConfirm": "只修這張 lot 的 lotQty 與日結,不會改整顆料的 balance。確定?",
"lotFixDone": "已修 lot {{id}}:lot {{lot}}、uom {{uom}}、inventory {{inventory}}、lotQty {{lotQty}}、日結 {{dayRows}}",
"fixThisLot": "Fix this lot",
"checkItem": "項目",
"checkStatus": "狀態",
"checkCorrect": "正確",
"checkMiss": "缺",
"checkIncorrect": "不正確",
"checkReason": "原因",
"checkRows": "列數",
"checkDash": "—",
"canAutoFix": "可自動修(按 Fix 會處理)",
"cannotAutoFix": "不能自動修(Fix 不會消;舊 TKE 開新批/真超發/沒有 lot 來源)",
"verdictCorrect": "correct",
"verdictMiss": "miss",
"verdictOverIssue": "over-issue",
"verdictCanFix": "可修",
"verdictCannotFix": "不能修",
"verdictIncorrect": "incorrect",
"part": {
"lot": "inventoryLotLineId",
"uom": "uomId",
"inventory": "inventoryId",
"lotQty": "lotQtyBefore/After(lot 已有)",
"overIssue": "over-issue (lotQty < 0)",
"balance": "balance",
"dayTable": "stock_lot_day",
"fixable21a": "可修 2.1a:SIL/SOL 已有 lot line",
"fixable21b": "可修 2.1b:inventoryLotId 僅一條 line",
"fixableLotQty": "可修:lot 已有但缺 lotQty",
"cannotNoSource": "不能修:沒有 SIL/SOL lot 來源",
"cannotMultiLine": "不能修:同一 lot 有多條 warehouse line",
"earlyTke": "不能修:舊 TKE 開新批(sibling 盤盈)",
"realOver": "不能修:over-issue 非舊 TKE(真超發/帳不一致)"
}
}

Ladataan…
Peruuta
Tallenna