MENU

[泛微ecode] 一键重置流程转数据字段映射

• 2024 年 03 月 29 日 • 阅读: 667 • 泛微OA

A.引言

还记得去年某天我在讨论群里问清空字段映射的操作,今晚实现啦

回想那天,我还正面对着屏幕上的几百个字段映射在发愁。

做这个功能主要是为了练手,好久没写ecode了;

如果你正巧需要,这能减轻你的运维工作量,那便更有意义了!

如果你还在学习路上,配合泛微 EC9 之 ecodeSDK API 文档食用更佳~

B.功能演示

C.曲折过程

很烦!遇到了坑!

这个页面的数据字段下拉框,竟然不能通过Select或WeaSelect组件复写!!!
一开始我做这个需求的时候,还感觉很简单,喵的,不就是个下拉框嘛,分分钟!
令我没想到的是,怎么查也没查到组件名。。。。
最终还是靠我的泛微 ecode 开发辅助 - ecode 组件全局检索
发现竟然用的非标准Select组件,而是,一整个Table组件!!!

ecodeSDK.overwritePropsFnQueueMapSet('Select', {
    fn: (newProps) => {
        if (window.location.hash.indexOf('#/workflowengine/path/pathSet/pathDetail/advanceSet/workflowToMode') < 0) return;
        console.log('"Select newProps":', newProps);
        console.log('!找到Select组件啦!!!!!!');
    },
});

ecodeSDK.overwritePropsFnQueueMapSet('WeaSelect', {
    fn: (newProps) => {
        if (window.location.hash.indexOf('#/workflowengine/path/pathSet/pathDetail/advanceSet/workflowToMode') < 0) return;
        console.log('"WeaSelect newProps":', newProps);
        console.log('!找到WeaSelect组件啦!!!!!!');
    },
});

再看Table组件,好家伙,这个组件没有存值!

好好好,改DOM结构试试!也不行!

a~~ 怎么办呢?思索片刻,行!我直接‘迂回策略’~复写请求!,开搞!

D.最终代码

V1版本(历史):只清空/重置全部字段映射

let isClearButtonClicked = false;

ecodeSDK.overwritePropsFnQueueMapSet('WeaDialog', {
    fn: (newProps) => {
        if (window.location.hash.indexOf('#/workflowengine/path/pathSet/pathDetail/advanceSet/workflowToMode') < 0) return;

        if (newProps.title && newProps.title.includes('流程转数据:')) {
            const { Tooltip, Button } = antd;
            newProps.buttons.unshift(
                <Tooltip placement="topLeft" title="(注:第一个字段映射为空时,将初始化为自动映射,不为空则清空所有字段映射)">
                    <Button key="clearMapping" onClick={handleClearMapping}>
                        重置字段映射
                    </Button>
                </Tooltip>
            );

            function handleClearMapping() {
                if (window.antd && window.antd.Modal) {
                    window.antd.Modal.warning({
                        title: '风险提示',
                        content: '即将重置字段映射配置,请谨慎操作!',
                        okText: '确认重置',
                        cancelText: '取消操作',
                        onOk: () => {
                            isClearButtonClicked = true;
                            const saveButton = newProps.buttons.find(button => button.props.children === "保存");
                            if (saveButton && saveButton.props.onClick) {
                                saveButton.props.onClick();
                            }
                        },
                    });
                }
            }
        }
    },
});

ecodeSDK.rewriteApiParamsQueueSet({
    fn: (url, method, params) => {
        if (isClearButtonClicked && url.indexOf("/api/cube/mode/mode/saveWorkflowToMode") !== -1) {
            Object.keys(params).forEach(key => {
                if (key.startsWith('wffieldid') && key !== 'wffieldid_0_0') {
                    params[key] = '';
                }
            });
        }

        return {
            url: url,
            method: method,
            params: params
        };
    }
});

2024年3月29日 15:10:54 丸子根据今日收到的需求,感觉比较合理,所以更新了第二版本
更新内容如下:

  • 增加选择清空表功能————可以根据情况,选择自己需要清空的表
  • 修复点击重置字段映射按钮后没有取消重置状态的BUG
  • 修改为只在字段映射页签显示按钮

选择清空表

emmmm增加选择表功能后,其实可以通过逻辑来处理掉 需要选择主表第一个字段映射的问题,但是,嘿嘿,我就不,略略略!

let isClearButtonClicked = false;
let mainActiveKey = '';
let selectOptions = '';
let selectValue = '';
let clearButton = '';

ecodeSDK.overwritePropsFnQueueMapSet('WeaDialog', {
    fn: (newProps) => {
        if (window.location.hash.indexOf('#/workflowengine/path/pathSet/pathDetail/advanceSet/workflowToMode') < 0) return;

        if (newProps.title && newProps.title.includes('流程转数据:')) {
            const { Tooltip, Button,Select } = antd;
            newProps.buttons.unshift(
                <Tooltip placement="topLeft" title="(注:重置全部映射时,若主表第一个字段映射为空,将初始化为自动映射)">
                    <Button key="clearMapping" onClick={handleClearMapping} className="clear-button" >
                        重置字段映射
                    </Button>
                </Tooltip>
            );

            function handleClearMapping() {
                if (window.antd && window.antd.Modal) {
                    console.log("selectValue 默认值为:", selectValue); 
                    const content = (
                        <div>
                            <div>重置字段映射配置,请谨慎操作!</div>
                            <div>即将清空以下字段映射:</div>
                            <Select defaultValue={selectOptions.map(option => option.key)} multiple style={{ width: '100%' }} onChange={value => { selectValue = value; }}>
                                {selectOptions.map(option => (
                                    <Select.Option key={option.key} value={option.key}>{option.value}</Select.Option>
                                ))}
                            </Select>
                        </div>
                    );
                    window.antd.Modal.warning({
                        title: '风险提示',
                        content: content,
                        okText: '确认重置',
                        cancelText: '取消操作',
                        onOk: () => {
                            isClearButtonClicked = true;
                            const saveButton = newProps.buttons.find(button => button.props.children === "保存");
                            if (saveButton && saveButton.props.onClick) {
                                saveButton.props.onClick();
                            }
                        },
                    });
                }
            }
        }
    },
});

ecodeSDK.rewriteApiParamsQueueSet({
    fn: (url, method, params) => {
        if (isClearButtonClicked && url.indexOf("/api/cube/mode/mode/saveWorkflowToMode") !== -1) {
            Object.keys(params).forEach(key => {
                if (key.startsWith('wffieldid') && key !== 'wffieldid_0_0') {
                    if (selectValue.includes(key.split('_')[1])) {
                        params[key] = '';
                    }
                }
            });
            isClearButtonClicked = false;
        }

        return {
            url: url,
            method: method,
            params: params
        };
    }
});

ecodeSDK.overwritePropsFnQueueMapSet('Tabs', {
    fn: (newProps) => {
        if (window.location.hash.indexOf('#/workflowengine/path/pathSet/pathDetail/advanceSet/workflowToMode') < 0) return;
        if (newProps.children && newProps.children.length > 0 && newProps.children[0].props.tab === '基础信息') {
            mainActiveKey = newProps.activeKey;
            clearButton = clearButton || document.querySelector('.clear-button');
            clearButton && (clearButton.style.display = mainActiveKey !== '2' ? "none" : "");
        }

        if (newProps.children && newProps.children.length > 0 && newProps.children[0].props.tab === '主表') {
            selectOptions = newProps.children.map(child => ({
                key: child.key,
                value: child.props.tab
            }));
            selectValue = selectOptions.map(option => option.key);
        }
    },
});

成功的关键在于不断探索和尝试,直到找到解决问题的方法。

最后编辑于: 2024 年 07 月 08 日
返回文章列表 打赏
本页链接的二维码
打赏二维码
添加新评论

已有 1 条评论
  1. GaryYou GaryYou

    这么好用的功能,值得所有交付和运维的兄弟使用。大家可以推广使用起来,丸子牛逼