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 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,25 +517,23 @@ 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 = '';
@ -540,27 +543,23 @@ export default function App() {
? (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;
// 处理流程节点字段
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) ||