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