From 14285c6a1da3afd3043f67ed75a47f3dc23f5a66 Mon Sep 17 00:00:00 2001 From: mairuiming Date: Tue, 17 Mar 2026 17:46:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20src/App.tsx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 155 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 148 insertions(+), 7 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index b551a54..25e7889 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -232,6 +232,10 @@ export default function App() { const [batchCurrentRowInfo, setBatchCurrentRowInfo] = useState<{ index: number; foreignId: string; style: string; color: string } | null>(null); const batchAbortRef = useRef(false); const lastBufferDeficitRef = useRef(0); + const [omsVersionModalVisible, setOmsVersionModalVisible] = useState(false); + const [omsVersionLoading, setOmsVersionLoading] = useState(false); + const [omsVersionList, setOmsVersionList] = useState([]); + const [omsPlanText, setOmsPlanText] = useState(''); // 删除未使用的 deliveryRecords 状态 const [selectedDeliveryRecordId, setSelectedDeliveryRecordId] = useState(''); // 从货期记录读取到的record_ids(用于保存回写) @@ -2439,6 +2443,85 @@ export default function App() { return text ? text : null; }; + const extractUserNames = (val: any): string => { + if (!val) return ''; + if (Array.isArray(val)) { + const names = val.map(item => { + if (!item) return ''; + if (typeof item === 'string') return item.trim(); + if (typeof item === 'object') { + const name = item.name || item.text || item.value || item.id || ''; + return String(name || '').trim(); + } + return String(item).trim(); + }).filter(Boolean); + return names.join(','); + } + if (typeof val === 'string') return val.trim(); + if (typeof val === 'object') { + const name = (val as any).name || (val as any).text || (val as any).value || (val as any).id; + return name ? String(name).trim() : ''; + } + return String(val || '').trim(); + }; + + const parseTimestampFromField = (val: any): number | null => { + if (typeof val === 'number' && Number.isFinite(val)) return val; + if (Array.isArray(val) && val.length > 0 && typeof val[0] === 'number') return val[0]; + const raw = extractText(val); + if (!raw) return null; + const parsed = new Date(raw); + if (!isNaN(parsed.getTime())) return parsed.getTime(); + return null; + }; + + const parseVersionLabel = (raw: any): string => { + if (typeof raw === 'number' && Number.isFinite(raw)) return `V${raw}`; + const text = extractText(raw); + if (!text) return ''; + if (/^v\d+/i.test(text.trim())) return text.trim(); + const m = text.match(/\d+(?:\.\d+)?/); + return m ? `V${m[0]}` : text.trim(); + }; + + const fetchOmsDeliveryVersions = async (omsRecordId: string): Promise => { + if (!omsRecordId) return []; + const omsTable = await bitable.base.getTable(OMS_BOARD_TABLE_ID); + const omsRecord = await omsTable.getRecordById(omsRecordId); + const planText = extractText(omsRecord?.fields?.[OMS_PLAN_TEXT_FIELD_ID])?.trim(); + if (!planText) { + if (bitable.ui.showToast) { + await bitable.ui.showToast({ toastType: ToastType.warning, message: 'OMS看板记录缺少货期计划' }); + } + return []; + } + setOmsPlanText(planText); + const deliveryTable = await bitable.base.getTable(DELIVERY_RECORD_TABLE_ID); + const filter: any = { + conjunction: 'and', + conditions: [{ fieldId: DELIVERY_RECORD_IDS_FIELD_ID, operator: 'is', value: planText }] + }; + const sort = DELIVERY_CREATE_TIME_FIELD_ID + ? [{ fieldId: DELIVERY_CREATE_TIME_FIELD_ID, desc: true }] + : undefined; + const recs = await fetchAllRecordsByPage(deliveryTable, { filter, sort }); + return recs.map((r: any) => { + const fields = r?.fields || {}; + const expectedTs = parseTimestampFromField(fields?.[DELIVERY_EXPECTED_DATE_FIELD_ID]); + const createdTs = parseTimestampFromField(fields?.[DELIVERY_CREATE_TIME_FIELD_ID]); + const expectedDate = expectedTs ? formatDate(new Date(expectedTs), 'DISPLAY_DATE_ONLY') : (extractText(fields?.[DELIVERY_EXPECTED_DATE_FIELD_ID]) || ''); + const createdAt = createdTs ? formatDate(new Date(createdTs)) : (extractText(fields?.[DELIVERY_CREATE_TIME_FIELD_ID]) || ''); + return { + recordId: r?.recordId || r?.id || '', + po: extractText(fields?.[DELIVERY_PO_FIELD_ID]) || '', + expectedDate, + version: parseVersionLabel(fields?.[DELIVERY_VERSION_FIELD_ID]), + creator: extractUserNames(fields?.[DELIVERY_CREATOR_FIELD_ID]), + createdAt + }; + }).filter((row: any) => row.recordId); + }; + // 初始化起始时间:从货期记录表获取,新记录则使用当前时间 const initializeStartTime = async () => { try { @@ -6151,6 +6234,37 @@ export default function App() { }, ]; + + +const omsVersionColumns = [ + { title: 'PO', dataIndex: 'po', key: 'po', width: 180 }, + { title: '预计交付日期', dataIndex: 'expectedDate', key: 'expectedDate', width: 140 }, + { title: '版本号', dataIndex: 'version', key: 'version', width: 110 }, + { title: '创建人', dataIndex: 'creator', key: 'creator', width: 160 }, + { title: '生成时间', dataIndex: 'createdAt', key: 'createdAt', width: 170 }, + { + title: '操作', + key: 'action', + render: (_: any, row: any) => ( + + ) + } + ]; + return (
{/* 入口选择弹窗 */} @@ -6276,6 +6390,27 @@ export default function App() {
+ { setOmsVersionModalVisible(false); setOmsVersionList([]); }} + footer={ + + + + } + maskClosable={false} + > + + + {mode === 'generate' && (