本文摘要
针对泛微 Ecology 流程中附件字段联动的需求,文章给出基于 ecode 的实现思路:覆写 WeaUpload 组件并调用接口获取附件数据,再绑定字段变化事件回填到目标附件字段。V3 版本调整配置结构,支持同一节点下多组附件字段联动,同时提醒泛微官方已在 KB9002307 中提供标准功能。
🚨 警告
本文由丸子原创,尊重原创,转载请注明出处! 作者:oneszhang 原文:https://oneszhang.com/archives/48.html
丸子近期较忙,暂不梳理该小项目过程,且暂不提供帮助,以下代码回复可见,有问题请留言或一起在下面讨论区交流。
✅ 泛微官方已于KB9002307中解决该问题!
泛微官方已于 2023年8月 发布新包 KB900230701 编号:2076641 流程引擎字段联动带出附件的需求,在该包中解决了这项问题!现在你可以使用标准功能实现附件联动了!
- 修复的问题:同一流程节点下无法多个附件字段联动。
- 更新了配置信息数组结构,支持一个
nodeId下配置多个fileFieldid与linkfileFieldid的对应关系,使配置更加灵活。
旧版
附件联动功能 V2版本(旧版)
// 全局变量let enable = true;let nodeid = null;let workflowId = null;let fileFieldid = null;let linkfileFieldid = null;
// 配置信息数组const configInfo = [{workflowId: 87, //流程idnodeId: 461, //节点idfileFieldid: 'field9140', //上传附件控件IDlinkfileFieldid: 'field9297' //附件联动控件ID(文本框,请先配置联动信息)}];
// 设置节点ID对应的配置信息function setConfigInfoForNodeId(nodeId) {console.log("进入了获取联动信息函数");const configInfoItem = configInfo.find(item => item.nodeId === nodeId);console.log(configInfoItem);if (configInfoItem) {workflowId = configInfoItem.workflowId;fileFieldid = configInfoItem.fileFieldid;linkfileFieldid = configInfoItem.linkfileFieldid;}}
// 使用ID调用APIasync function callApiWithId(id) {const options = {url: '/api/doc/save/getAccListForEdit',method: 'GET',params: { id },type: 'json',deep: true,checkCode: false};const ApiResponse = await window.weaJs.callApi(options);return ApiResponse;}
// 检查条件是否满足const checkConditions = () => {const { hash } = window.location;if (!hash.startsWith('#/main/workflow/req') || !WfForm) return false;
const baseInfo = WfForm.getBaseInfo();({ nodeid } = baseInfo);
const isNodeIdAllowed = configInfo.some(item => item.nodeId === nodeid);return isNodeIdAllowed;};
// 覆写 WeaUpload 组件ecodeSDK.overwritePropsFnQueueMapSet('WeaUpload', {fn: async (newProps) => {
if (!enable || !checkConditions()) return;
console.log("条件已满足!");
setConfigInfoForNodeId(nodeid);
async function processIds(idArray) {const fileLinkdatas = [];
for (const id of idArray) {const ApiResponse = await callApiWithId(parseInt(id, 10));console.log("请求 id 的 API:", id);console.log("ApiResponse:", JSON.stringify(ApiResponse));
if (ApiResponse.dataList && ApiResponse.dataList.length > 0) {const dataListItem = ApiResponse.dataList[0];
const fileData = {fileExtendName: dataListItem.fileExtendName,fileid: dataListItem.id,filelink: dataListItem.filelink,filename: dataListItem.filename,filesize: dataListItem.filesize,imgSrc: "/images/filetypeicons/txt_wev8.png",loadlink: dataListItem.loadlink,showLoad: true,showDelete: true,isImg: false,imagefileid: dataListItem.fileid,secretLevel: "4",secretLevelValidity: "",secretLevelValidityValue: "",};
fileLinkdatas.push(fileData);}
}console.log("构建后的 fileLinkdatas:", fileLinkdatas);return Promise.resolve(fileLinkdatas);}
async function startProcessing(idArray, value) {const fileLinkdatas = await processIds(idArray);
console.log("processIds 执行完毕,开始设置字段值");
const fileFieldValueObj = {"value": value,"specialobj": {"filedatas": fileLinkdatas,"showBatchLoad": false}};console.log("构建的 fileFieldValueObj:", fileFieldValueObj);WfForm.changeFieldValue(fileFieldid, fileFieldValueObj);}
console.log("linkfileFieldid:", linkfileFieldid);WfForm.bindFieldChangeEvent(linkfileFieldid, function (obj, id, value) {console.log("字段变化触发 startProcessing 调用,值为:", value);
var idArray = value.split(',');startProcessing(idArray, value);});
},order: 1,desc: '附件联动功能 V2'});附件联动功能 V3版本
// 全局变量let enable = true;let nodeid = null;let workflowId = null;
// 更新后的配置信息数组,支持一个nodeId下多个fileFieldid与linkfileFieldid的对应const configInfo = [ { workflowId: 87, nodeId: 461, fields: [ { fileFieldid: 'field9140', linkfileFieldid: 'field9297' }, ] }, { workflowId: 146, nodeId: 832, fields: [ { fileFieldid: 'field11483', linkfileFieldid: 'field11882' }, { fileFieldid: 'field11482', linkfileFieldid: 'field11883' }, ] }];
// 设置节点ID对应的配置信息function getConfigsForNodeId(nodeId) { console.log("进入了获取联动信息函数"); const config = configInfo.find(item => item.nodeId === nodeId); console.log(config); return config ? config.fields : [];}
// 使用ID调用APIasync function callApiWithId(id) { const options = { url: '/api/doc/save/getAccListForEdit', method: 'GET', params: { id }, type: 'json', deep: true, checkCode: false }; const ApiResponse = await window.weaJs.callApi(options); return ApiResponse;}
// 检查条件是否满足const checkConditions = () => { const { hash } = window.location; if (!hash.startsWith('#/main/workflow/req') || !WfForm) return false;
const baseInfo = WfForm.getBaseInfo(); ({ nodeid } = baseInfo);
const isNodeIdAllowed = configInfo.some(item => item.nodeId === nodeid); return isNodeIdAllowed;};
// 覆写 WeaUpload 组件ecodeSDK.overwritePropsFnQueueMapSet('WeaUpload', { fn: async (newProps) => {
if (!enable || !checkConditions()) return;
console.log("条件已满足!");
const fieldConfigs = getConfigsForNodeId(nodeid);
fieldConfigs.forEach(config => { const { fileFieldid, linkfileFieldid } = config;
async function processIds(idArray) { const fileLinkdatas = [];
for (const id of idArray) { const ApiResponse = await callApiWithId(parseInt(id, 10)); console.log("请求 id 的 API:", id); console.log("ApiResponse:", JSON.stringify(ApiResponse));
if (ApiResponse.dataList && ApiResponse.dataList.length > 0) { const dataListItem = ApiResponse.dataList[0];
const fileData = { fileExtendName: dataListItem.fileExtendName, fileid: dataListItem.id, filelink: dataListItem.filelink, filename: dataListItem.filename, filesize: dataListItem.filesize, imgSrc: "/images/filetypeicons/txt_wev8.png", loadlink: dataListItem.loadlink, showLoad: true, showDelete: true, isImg: false, imagefileid: dataListItem.fileid, secretLevel: "4", secretLevelValidity: "", secretLevelValidityValue: "", };
fileLinkdatas.push(fileData); } } console.log("构建后的 fileLinkdatas:", fileLinkdatas); return Promise.resolve(fileLinkdatas); }
async function startProcessing(idArray, value) { const fileLinkdatas = await processIds(idArray);
console.log("processIds 执行完毕,开始设置字段值");
const fileFieldValueObj = { "value": value, "specialobj": { "filedatas": fileLinkdatas, "showBatchLoad": false } }; console.log("构建的 fileFieldValueObj:", fileFieldValueObj); WfForm.changeFieldValue(fileFieldid, fileFieldValueObj); }
console.log("linkfileFieldid:", linkfileFieldid); WfForm.bindFieldChangeEvent(linkfileFieldid, function (obj, id, value) { console.log("字段变化触发 startProcessing 调用,值为:", value);
var idArray = value.split(','); startProcessing(idArray, value); }); }); }, order: 1, desc: '附件联动功能 V3'});在此,感谢交流群中每一位盆友的帮助,特别鸣谢大佬:eVER(JSP推广大使) 提供的技术帮助!