MENU

[Ecology ecode] 建模查询动态列测试(半成品)

• 2025 年 01 月 15 日 • 阅读: 861 • OA

效果图

原始数据:

image.png

开启ecode后展示样式:

2025-01-15T06:40:27.png

代码:

注:本代码为半成品,请自行修改

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);
  },
});
添加新评论

已有 3 条评论
  1. emmmm这个方案其实不如用泛微自带的报表来的舒服,后续问题会有很多,暂时不会再做完善~只是提供一个沟通妥协下的简单解决方案

  2. wintsa wintsa

    关于table动态列 ,我有一个新方案,根据监听列表api的data。
    const ledgerConfigs = [
    {

    customid: "174031", // 台账列表ID sourceField: "gclxsjsssx", // 原始字段名 targetField: "gcgly", // 目标字段名 displayField: "gcglyspan", // 展示字段名

    },
    {

    customid: "174522", sourceField: "gclx", targetField: "jsxmgly", displayField: "jsxmglyspan"

    }
    ];

    // 用于存储每个台账配置的返回数据(例如 getList 接口返回的数据数组)
    const ledgerDataMap = {};

    ecodeSDK.rewriteApiDataQueueSet({
    fn: async (url, params, data) => {

    // 第一阶段:拦截列表接口返回的数据 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;

    }
    });
    @(吐舌)

  3. wintsa wintsa

    话说你这评论区就不能用markdow吗@(汗),每次都代码乱码