本文摘要
针对泛微 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, //流程id
nodeId: 461, //节点id
fileFieldid: 'field9140', //上传附件控件ID
linkfileFieldid: '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调用API
async 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调用API
async 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推广大使) 提供的技术帮助!