1,添加数据源
2,JS代码
/**
* 获取所有数据并设置数据源
* @param {string} formUuid 数据源表单id
* @param {string} dataSourceFieldId 数据源中取值的组件id
* @param {string} fieldId 当前页面要设置数据源的组件id
* @param {Object} [searchField] 搜索条件
* @param {number} [pageSize=100] 单次查询数据量,默认100,最大100
* @param {Object} [dynamicOrder] 排序条件
* @param {string} [dataSourceName='searchFormDatas'] 页面中数据源名称
* @returns {Promise<void>}
*/
export async function getDataAndSetDataSource({
formUuid,
dataSourceFieldId,
fieldId,
searchField = {},
pageSize = 100,
dataSourceName = 'searchFormDatas',
}) {
class TokenBucket {
constructor(capacity, fillRate) {
this.capacity = capacity;
this.fillRate = fillRate;
this.tokens = capacity;
this.lastFill = Date.now();
}
take() {
return new Promise(resolve => {
const tryTake = () => {
this.fill();
if (this.tokens < 1) {
setTimeout(tryTake, 1000 / this.fillRate);
} else {
this.tokens -= 1;
resolve();
}
};
tryTake();
});
}
fill() {
const now = Date.now();
const deltaTime = now - this.lastFill;
const filledTokens = deltaTime * this.fillRate / 1000;
this.tokens = Math.min(this.capacity, this.tokens + filledTokens);
this.lastFill = now;
}
}
let values = []
const bucket = new TokenBucket(15, 10);
const getData = (currentPage) => {
return new Promise(async (resolve, reject) => {
try {
await bucket.take()
const response = await this.dataSourceMap[dataSourceName].load({
formUuid, searchFieldJson: JSON.stringify(searchField), currentPage, pageSize
})
resolve(response)
} catch (e) {
reject(e)
}
})
}
const res = await getData(1)
values.push(res)
if (res.totalCount > pageSize) {
const tasks = []
for (let i = 2; i <= Math.ceil(res.totalCount / pageSize); i++) {
tasks.push(getData(i))
}
values.push(...await Promise.all(tasks))
}
values = values.map(i => i.data).flat() // 结果降维
values = values.map(i => i.formData[dataSourceFieldId]) // 取目标字段
console.log('原始数据', values)
// const sorter = new Intl.Collator('zh-Hans-CN', {sensitivity: 'accent'})
const sorter = new Intl.Collator('zh-Hans-CN', {sensitivity: 'accent', numeric: true})
values.sort(sorter.compare)
console.log('排序数据', values)
this.$(fieldId).set('dataSource', values.map(i => new Object({text: i, value: i})))
}
3,didMount调用 this.getDataAndSetDataSource({
formUuid: 'FORM-D2FEFDEC742C4EF5A2EC19FE0578EA99Z75D',
fieldId: 'selectField_lr4aisg9',
dataSourceFieldId: 'textField_lqlvvy6u'
})
发表评论 取消回复