This commit is contained in:
2025-06-27 19:56:50 +08:00
parent 7512c76c04
commit d33a62c30a

View File

@ -33,15 +33,28 @@ interface ProcessConfigItem {
} }
// 常量定义 // 常量定义
const POS_TABLE_ID = 'tblubooNX1JQKg4l'; const POS_TABLE_NAME = "pos_订单基础信息明细"; // 替换为你的实际POS表名
const PROCESS_TABLE_ID = 'tbl9Uh2nqhIBvQTY'; const PROCESS_TABLE_NAME = "订单流程表"; // 替换为你的实际流程配置表名
let POS_TABLE_ID = "";
let PROCESS_TABLE_ID = "";
async function initTableIds() {
const posTable = await bitable.base.getTableByName(POS_TABLE_NAME);
POS_TABLE_ID = posTable.id;
const processTable = await bitable.base.getTableByName(PROCESS_TABLE_NAME);
PROCESS_TABLE_ID = processTable.id;
}
// 在应用初始化或需要用到表ID前调用
initTableIds();
const POS_LINK_FIELD_ID_IN_PROCESS_TABLE = 'fldoG0YGGB';
const PROCESS_NAME_FIELD_NAME = '流程名称'; const PROCESS_NAME_FIELD_NAME = '流程名称';
const PROCESS_ORDER_FIELD_NAME = '流程顺序'; const PROCESS_ORDER_FIELD_NAME = '流程顺序';
const PROCESS_NODE_FIELD_ID = 'fld7uf58lq'; const POS_LINK_FIELD_NAME_IN_PROCESS_TABLE = 'POS表recordid';
const FIELD_ID_FIELD_ID = 'fldOqrKaDz'; const PROCESS_NODE_FIELD_NAME = '流程节点';
const FIELD_ID_FIELD_NAME = '字段ID';
const PROCESS_NODE_EXPECT_TIME = '预计完成时间'; const PROCESS_NODE_EXPECT_TIME = '预计完成时间';
const PROCESS_NODE_ACTUAL_TIME = '实际完成时间'; const PROCESS_NODE_ACTUAL_TIME = '实际完成时间';
@ -463,7 +476,7 @@ export default function App() {
return; return;
} }
const processTable = await bitable.base.getTableById(PROCESS_TABLE_ID); const processTable = await bitable.base.getTableByName(PROCESS_TABLE_NAME);
// 优化批量获取所有字段元数据减少API调用 // 优化批量获取所有字段元数据减少API调用
const allFields = await processTable.getFieldMetaList(); const allFields = await processTable.getFieldMetaList();
@ -471,27 +484,21 @@ export default function App() {
setFieldMetadataCache(fieldMap); setFieldMetadataCache(fieldMap);
// 验证字段是否存在 - 使用优化后的字段映射 // 验证字段是否存在 - 使用优化后的字段映射
const requiredFieldIds = [ const requiredFieldNames = [
POS_LINK_FIELD_ID_IN_PROCESS_TABLE, POS_LINK_FIELD_NAME_IN_PROCESS_TABLE,
PROCESS_NODE_FIELD_ID, PROCESS_NODE_FIELD_NAME,
FIELD_ID_FIELD_ID FIELD_ID_FIELD_NAME,
PROCESS_NAME_FIELD_NAME,
PROCESS_ORDER_FIELD_NAME
]; ];
const requiredFieldNames = [PROCESS_NAME_FIELD_NAME, PROCESS_ORDER_FIELD_NAME];
// 检查必需字段是否存在 // 检查必需字段是否存在
const missingFields: string[] = []; const missingFields: string[] = [];
requiredFieldIds.forEach(id => {
if (!fieldMap.has(id)) {
missingFields.push(`字段ID: ${id}`);
}
});
requiredFieldNames.forEach(name => { requiredFieldNames.forEach(name => {
const field = allFields.find(f => f.name === name); const field = allFields.find(f => f.name === name);
if (!field) { if (!field) {
missingFields.push(`字段名: ${name}`); missingFields.push(`字段名: ${name}`);
} }
}); });
if (missingFields.length > 0) { if (missingFields.length > 0) {
const errorMsg = `订单流程表中缺少关键字段: ${missingFields.join(', ')}`; const errorMsg = `订单流程表中缺少关键字段: ${missingFields.join(', ')}`;
console.error(errorMsg); console.error(errorMsg);
@ -499,11 +506,9 @@ export default function App() {
setProcessConfigLoading(false); setProcessConfigLoading(false);
return; return;
} }
// 使用更高效的分页获取记录 // 使用更高效的分页获取记录
const allRecords: IRecord[] = []; const allRecords: IRecord[] = [];
let pageToken: string | undefined; let pageToken: string | undefined;
do { do {
const response = await processTable.getRecords({ const response = await processTable.getRecords({
pageSize: 5000, // 最大页大小 pageSize: 5000, // 最大页大小
@ -512,55 +517,49 @@ export default function App() {
allRecords.push(...response.records); allRecords.push(...response.records);
pageToken = response.pageToken; pageToken = response.pageToken;
} while (pageToken); } while (pageToken);
console.log(`Fetched ${allRecords.length} process config records`); console.log(`Fetched ${allRecords.length} process config records`);
const allConfigs: ProcessConfigItem[] = []; const allConfigs: ProcessConfigItem[] = [];
// 获取字段对象
// 优化:使用高效的字段访问方式处理记录 const posLinkField = allFields.find(f => f.name === POS_LINK_FIELD_NAME_IN_PROCESS_TABLE);
const processNodeField = allFields.find(f => f.name === PROCESS_NODE_FIELD_NAME);
const fieldIdField = allFields.find(f => f.name === FIELD_ID_FIELD_NAME);
for (const record of allRecords) { for (const record of allRecords) {
const fields = record.fields; const fields = record.fields;
const recordId = record.recordId; const recordId = record.recordId;
// 处理POS链接字段
// 处理POS链接字段 - 优化文本提取逻辑
let posLinkText = ''; let posLinkText = '';
const posLinkFieldValue = fields[POS_LINK_FIELD_ID_IN_PROCESS_TABLE]; const posLinkFieldValue = fields[posLinkField?.id ?? ''];
if (Array.isArray(posLinkFieldValue)) { if (Array.isArray(posLinkFieldValue)) {
posLinkText = (posLinkFieldValue[0] as IOpenSegment)?.text?.trim() || ''; posLinkText = (posLinkFieldValue[0] as IOpenSegment)?.text?.trim() || '';
} else if (typeof posLinkFieldValue === 'object' && posLinkFieldValue) { } else if (typeof posLinkFieldValue === 'object' && posLinkFieldValue) {
posLinkText = (posLinkFieldValue as IOpenSegment).text?.trim() || ''; posLinkText = (posLinkFieldValue as IOpenSegment).text?.trim() || '';
} }
// 处理流程名称字段 - 使用字段ID直接访问 // 处理流程名称字段 - 使用字段ID直接访问
const processNameField = allFields.find(f => f.name === PROCESS_NAME_FIELD_NAME); const processNameField = allFields.find(f => f.name === PROCESS_NAME_FIELD_NAME);
let processName = ''; let processName = '';
if (processNameField) { if (processNameField) {
const fieldValue = fields[processNameField.id]; const fieldValue = fields[processNameField.id];
processName = Array.isArray(fieldValue) processName = Array.isArray(fieldValue)
? (fieldValue[0] as IOpenSegment)?.text?.trim() || '' ? (fieldValue[0] as IOpenSegment)?.text?.trim() || ''
: (fieldValue as IOpenSegment)?.text?.trim() || ''; : (fieldValue as IOpenSegment)?.text?.trim() || '';
} }
// 处理顺序字段 // 处理顺序字段
const processOrderField = allFields.find(f => f.name === PROCESS_ORDER_FIELD_NAME); const processOrderField = allFields.find(f => f.name === PROCESS_ORDER_FIELD_NAME);
const order = processOrderField const order = processOrderField
? (fields[processOrderField.id] as number | undefined) || 0 ? (fields[processOrderField.id] as number | undefined) || 0
: 0; : 0;
// 处理流程节点字段 // 处理流程节点字段
const processNodeValue = fields[PROCESS_NODE_FIELD_ID] const processNodeValue = fields[processNodeField?.id ?? '']
? (Array.isArray(fields[PROCESS_NODE_FIELD_ID]) ? (Array.isArray(fields[processNodeField.id])
? (fields[PROCESS_NODE_FIELD_ID][0] as IOpenSegment)?.text?.trim() || '' ? (fields[processNodeField.id][0] as IOpenSegment)?.text?.trim() || ''
: (fields[PROCESS_NODE_FIELD_ID] as IOpenSegment)?.text?.trim() || '') : (fields[processNodeField.id] as IOpenSegment)?.text?.trim() || '')
: ''; : '';
// 处理时间字段ID字段 // 处理时间字段ID字段
const timeFieldId = fields[FIELD_ID_FIELD_ID] const timeFieldId = fields[fieldIdField?.id ?? '']
? (Array.isArray(fields[FIELD_ID_FIELD_ID]) ? (Array.isArray(fields[fieldIdField.id])
? (fields[FIELD_ID_FIELD_ID][0] as IOpenSegment)?.text?.trim() || '' ? (fields[fieldIdField.id][0] as IOpenSegment)?.text?.trim() || ''
: (fields[FIELD_ID_FIELD_ID] as IOpenSegment)?.text?.trim() || '') : (fields[fieldIdField.id] as IOpenSegment)?.text?.trim() || '')
: ''; : '';
allConfigs.push({ allConfigs.push({
processName, processName,
order, order,
@ -691,7 +690,7 @@ export default function App() {
console.log('Loading process steps from cached configs...'); console.log('Loading process steps from cached configs...');
try { try {
const posTable = await bitable.base.getTableById(POS_TABLE_ID); const posTable = await bitable.base.getTableByName(POS_TABLE_NAME);
// 从缓存中快速筛选当前记录的配置 // 从缓存中快速筛选当前记录的配置
const filteredConfigs = configsByPosLink.get(currentPosRecordId) || const filteredConfigs = configsByPosLink.get(currentPosRecordId) ||