1
This commit is contained in:
97
src/App.tsx
97
src/App.tsx
@ -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) ||
|
||||||
|
Reference in New Issue
Block a user