refactor(intake): extract first quality helpers

This commit is contained in:
WuYongJie 2026-06-08 19:54:31 +08:00
parent 8faa646bb0
commit d5b5668154
2 changed files with 91 additions and 80 deletions

View File

@ -551,6 +551,13 @@ import {
type ProductFinishedSampleShipmentDisplayRow,
type ProductSampleMeasurementDisplayRow,
} from "./sampleWorkflowHelpers";
import {
buildFirstQualityRows,
hasFirstQualityRowContent,
isFirstQualityRowComplete,
normalizeFirstQualityRowsForPayload,
type ProductFirstQualityDisplayRow,
} from "./firstQualityHelpers";
import {
MATERIAL_TYPE_OPTIONS,
PLANNING_LAYOUT_AUDIENCE_OPTIONS,
@ -4276,86 +4283,6 @@ function buildNoModificationFinishedSampleShipmentRows(
}));
}
type ProductFirstQualityDisplayRow = NonIntegratedFirstQualityRow & {
image: string;
model: string;
skuCode: string;
barcode: string;
setCount: string;
specName: string;
size: string;
color: string;
material: string;
supplierName: string;
batchNo: number;
};
function createFirstQualityRowFromSku(
sku: NonIntegratedSkuItem,
existingRow?: NonIntegratedFirstQualityRow,
): ProductFirstQualityDisplayRow {
return {
skuId: sku.id,
image: sku.image.trim(),
model: sku.model.trim(),
skuCode: sku.skuCode.trim(),
barcode: sku.barcode.trim(),
setCount: sku.setCount.trim() || "1",
specName: sku.specName.trim(),
size: sku.size.trim(),
color: sku.color.trim(),
material: sku.material.trim(),
supplierName: sku.manufacturer.trim(),
batchNo: sku.batchNo || 1,
qualityBatch: existingRow?.qualityBatch?.trim() ?? "",
conclusion: existingRow?.conclusion?.trim() || "待检",
detail: existingRow?.detail?.trim() ?? "",
};
}
function buildFirstQualityRows(
skuItems: NonIntegratedSkuItem[],
savedRows: NonIntegratedFirstQualityRow[],
): ProductFirstQualityDisplayRow[] {
const rowBySkuId = new Map(savedRows.map((row) => [row.skuId, row]));
return skuItems.map((sku) =>
createFirstQualityRowFromSku(sku, rowBySkuId.get(sku.id)),
);
}
function normalizeFirstQualityRowsForPayload(
rows: NonIntegratedFirstQualityRow[],
): NonIntegratedFirstQualityRow[] {
return rows
.map((row) => ({
skuId: row.skuId,
qualityBatch: row.qualityBatch.trim(),
conclusion: row.conclusion.trim(),
detail: row.detail.trim(),
}))
.filter(
(row) =>
row.skuId &&
hasFirstQualityRowContent(row),
);
}
function isFirstQualityRowComplete(row: NonIntegratedFirstQualityRow) {
return [row.qualityBatch, row.conclusion, row.detail].every((value) =>
value.trim(),
);
}
function hasFirstQualityRowContent(row: NonIntegratedFirstQualityRow) {
const conclusion = row.conclusion.trim();
return Boolean(
row.qualityBatch.trim() ||
row.detail.trim() ||
(conclusion && conclusion !== "待检"),
);
}
function createFormValuesFromProduct(
product: NonIntegratedProductRecord | null,
): FormValues {

View File

@ -0,0 +1,84 @@
import type {
NonIntegratedFirstQualityRow,
NonIntegratedSkuItem,
} from "./nonIntegratedStorage";
export type ProductFirstQualityDisplayRow = NonIntegratedFirstQualityRow & {
image: string;
model: string;
skuCode: string;
barcode: string;
setCount: string;
specName: string;
size: string;
color: string;
material: string;
supplierName: string;
batchNo: number;
};
export function createFirstQualityRowFromSku(
sku: NonIntegratedSkuItem,
existingRow?: NonIntegratedFirstQualityRow,
): ProductFirstQualityDisplayRow {
return {
skuId: sku.id,
image: sku.image.trim(),
model: sku.model.trim(),
skuCode: sku.skuCode.trim(),
barcode: sku.barcode.trim(),
setCount: sku.setCount.trim() || "1",
specName: sku.specName.trim(),
size: sku.size.trim(),
color: sku.color.trim(),
material: sku.material.trim(),
supplierName: sku.manufacturer.trim(),
batchNo: sku.batchNo || 1,
qualityBatch: existingRow?.qualityBatch?.trim() ?? "",
conclusion: existingRow?.conclusion?.trim() || "待检",
detail: existingRow?.detail?.trim() ?? "",
};
}
export function buildFirstQualityRows(
skuItems: NonIntegratedSkuItem[],
savedRows: NonIntegratedFirstQualityRow[],
): ProductFirstQualityDisplayRow[] {
const rowBySkuId = new Map(savedRows.map((row) => [row.skuId, row]));
return skuItems.map((sku) =>
createFirstQualityRowFromSku(sku, rowBySkuId.get(sku.id)),
);
}
export function normalizeFirstQualityRowsForPayload(
rows: NonIntegratedFirstQualityRow[],
): NonIntegratedFirstQualityRow[] {
return rows
.map((row) => ({
skuId: row.skuId,
qualityBatch: row.qualityBatch.trim(),
conclusion: row.conclusion.trim(),
detail: row.detail.trim(),
}))
.filter(
(row) =>
row.skuId &&
hasFirstQualityRowContent(row),
);
}
export function isFirstQualityRowComplete(row: NonIntegratedFirstQualityRow) {
return [row.qualityBatch, row.conclusion, row.detail].every((value) =>
value.trim(),
);
}
export function hasFirstQualityRowContent(row: NonIntegratedFirstQualityRow) {
const conclusion = row.conclusion.trim();
return Boolean(
row.qualityBatch.trim() ||
row.detail.trim() ||
(conclusion && conclusion !== "待检"),
);
}