效果图
原始数据:
开启ecode后展示样式:
代码:
注:本代码为半成品,请自行修改
ecodeSDK.overwritePropsFnQueueMapSet('Table', {
fn: (newProps) => {
console.log('!找到组件啦!!!!!!');
// 检查路径是否正确
if (!ecodeSDK.checkLPath('/spa/cube/index.html#/main/cube/search?customid=77')) return;
console.log("路径识别正确!", newProps);
// 数据过滤和排序
const validDataSource = newProps.dataSource.filter(row => row.ny && row.ny !== "未定义");
// 提取所有有效的年月并排序
const nyValues = Array.from(new Set(validDataSource.map(row => row.ny)))
.filter(ny => ny) // 过滤未定义的年月
.sort((a, b) => new Date(a) - new Date(b)); // 按时间升序排序
console.log("有效的年月字段:", nyValues);
// 数据转置处理
const processedData = {};
validDataSource.forEach(row => {
const cswb = row.cswb || "未定义";
const ny = row.ny;
const csxs = row.csxs || 0;
if (!processedData[cswb]) {
processedData[cswb] = { cswb };
}
processedData[cswb][ny] = csxs;
});
// 转换为数组形式,便于表格展示
const transformedData = Object.values(processedData);
// 动态生成新的表头
const dynamicColumns = [
{ title: "测试文本", dataIndex: "cswb", key: "cswb", width: "20%" },
...nyValues.map(ny => ({
title: ny,
dataIndex: ny,
key: ny,
width: "10%"
}))
];
// 更新表格的列配置和数据源
newProps.columns = dynamicColumns;
newProps.dataSource = transformedData;
console.log("处理后的数据:", transformedData);
console.log("处理后的列:", dynamicColumns);
},
});
[Ecology ecode] 建模查询动态列测试(半成品) by https://oneszhang.com/archives/132.html
emmmm这个方案其实不如用泛微自带的报表来的舒服,后续问题会有很多,暂时不会再做完善~只是提供一个沟通妥协下的简单解决方案
关于table动态列 ,我有一个新方案,根据监听列表api的data。
customid: "174031", // 台账列表ID sourceField: "gclxsjsssx", // 原始字段名 targetField: "gcgly", // 目标字段名 displayField: "gcglyspan", // 展示字段名const ledgerConfigs = [
{
},
customid: "174522", sourceField: "gclx", targetField: "jsxmgly", displayField: "jsxmglyspan"{
}
];
// 用于存储每个台账配置的返回数据(例如 getList 接口返回的数据数组)
const ledgerDataMap = {};
ecodeSDK.rewriteApiDataQueueSet({
// 第一阶段:拦截列表接口返回的数据 if (url.indexOf("/api/cube/search/getList") === 0) { // 查找当前请求是否在 ledgerConfigs 中有对应配置 const config = ledgerConfigs.find(cfg => cfg.customid === params.customid); if (config) { // 存储对应配置的数据,后续通过 dataKey 对应 ledgerDataMap[config.customid] = data.datas; } } // 第二阶段:拦截详情数据接口,对应存储的数据进行加工 if (url.indexOf("/api/ec/dev/table/datas") === 0) { // ledgerDataMap 中可能存储了多个台账数据,逐个检查 for (const config of ledgerConfigs) { // 判断当前请求是否针对之前存储的台账数据 // 注意:这里假设 params.dataKey 与之前存储的数组引用一致 if (params.dataKey === ledgerDataMap[config.customid]) { // 收集所有记录中原始字段内的数字信息,数字从形如 "xxx_数字" 中提取 const numbers = data.datas .map(item => item[config.sourceField] .split(',') .map(part => { const match = part.match(/_(\d+)/); return match ? match[1] : null; }) .join(',') ) .join(','); // 调用远程接口,获取对应编号的管理员数据 const fetchParams = { gclx: numbers }; const result = await fetch('https://nest.zwgczx.com/api/v1/zw/getgcAdministrator', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', }, body: JSON.stringify(fetchParams), }); const result1 = await result.json(); if (result1.code != 0) { throw result1.message; } // 遍历每条数据,进行对应字段的加工处理 data.datas.forEach(item => { // 将原始字段内容拆分并提取下划线后的数字 const numberArr = item[config.sourceField] .split(',') .map(part => { const match = part.match(/_(\d+)/); return match ? match[1] : null; }); // 根据提取的数字,获取管理员数据 let adminList = []; numberArr.forEach(num => { if (result1.data[num]) { adminList.push(result1.data[num]); } }); // 去重(利用 JSON 序列化去重,再解析回对象) adminList = Array.from(new Set(adminList.map(item => JSON.stringify(item)))).map(item => JSON.parse(item)); // 将管理员的 userid 拼接成目标字段 item[config.targetField] = adminList.map(admin => admin.userid).join(','); // 将管理员的展示链接拼接成展示字段 item[config.displayField] = adminList .map(admin => `<a href=javaScript:openhrm(${admin.userid}) onclick=pointerXY(event)>${admin.username}</a>`) .join(' '); }); } } } return data;fn: async (url, params, data) => {
}
});
@(吐舌)
话说你这评论区就不能用markdow吗@(汗),每次都代码乱码