用途#
保存或提交流程前,根据附件文件名里的关键字,把一个来源附件字段里的文件拆分到多个目标附件字段。
这段代码里:
scoahtmb是来源附件字段。sfsybzmb是控制字段,值为0时才执行拆分。- 文件名包含
经销协议时,写入htfj附件字段。 - 文件名包含
奖励协议时,写入xyfj附件字段。 - 通过
/api/doc/save/getAccListForEdit获取附件的完整显示数据,再用specialobj.filedatas写回附件字段。
代码#
<script>
jQuery(document).ready(function () {
var sourceField = WfForm.convertFieldNameToId("scoahtmb");
var controlField = WfForm.convertFieldNameToId("sfsybzmb");
var rules = [
{ keyword: "经销协议", targetField: WfForm.convertFieldNameToId("htfj") },
{ keyword: "奖励协议", targetField: WfForm.convertFieldNameToId("xyfj") }
];
function getFieldRealValue(fieldMark) {
var v = "";
try {
v = WfForm.getFieldValue(fieldMark);
} catch (e) {}
if (!v) {
v = jQuery("#" + fieldMark).val();
}
return v || "";
}
function canSplitAttach() {
return String(getFieldRealValue(controlField)) === "0";
}
function getAttachInfo(docid, callback) {
jQuery.ajax({
url: "/api/doc/save/getAccListForEdit",
type: "GET",
dataType: "json",
data: { id: docid },
success: function (res) {
var item = null;
if (res && res.dataList && res.dataList.length > 0) {
item = res.dataList[0];
}
callback(item);
},
error: function () {
callback(null);
}
});
}
function buildFileData(item) {
return {
fileExtendName: item.fileExtendName || "",
fileid: item.id,
filelink: item.filelink || "",
filename: item.filename || "",
filesize: item.filesize || "",
imgSrc: item.imgSrc || "/images/filetypeicons/txt_wev8.png",
loadlink: item.loadlink || "",
showLoad: true,
showDelete: true,
isImg: item.isImg || false,
imagefileid: item.fileid || "",
secretLevel: item.secretLevel || "4",
secretLevelValidity: item.secretLevelValidity || "",
secretLevelValidityValue: item.secretLevelValidityValue || ""
};
}
function setAttachField(fieldMark, fileDatas) {
var ids = [];
for (var i = 0; i < fileDatas.length; i++) {
ids.push(fileDatas[i].fileid);
}
var value = ids.join(",");
WfForm.changeFieldValue(fieldMark, {
value: value,
specialobj: {
filedatas: fileDatas,
showBatchLoad: false
}
});
jQuery("#" + fieldMark).val(value);
}
function splitAttachByName(callback) {
if (!canSplitAttach()) {
if (callback) {
callback();
}
return;
}
var sourceValue = getFieldRealValue(sourceField);
if (!sourceValue) {
if (callback) {
callback();
}
return;
}
var docids = sourceValue.split(",");
var realDocids = [];
for (var i = 0; i < docids.length; i++) {
var id = jQuery.trim(docids[i]);
if (id !== "") {
realDocids.push(id);
}
}
if (realDocids.length === 0) {
if (callback) {
callback();
}
return;
}
var finished = 0;
var matchedMap = {};
for (var r = 0; r < rules.length; r++) {
matchedMap[r] = [];
}
for (var j = 0; j < realDocids.length; j++) {
getAttachInfo(realDocids[j], function (item) {
finished++;
if (item) {
var fileData = buildFileData(item);
var filename = fileData.filename || "";
for (var k = 0; k < rules.length; k++) {
if (filename.indexOf(rules[k].keyword) > -1) {
matchedMap[k].push(fileData);
}
}
}
if (finished === realDocids.length) {
for (var m = 0; m < rules.length; m++) {
setAttachField(rules[m].targetField, matchedMap[m]);
}
if (callback) {
callback();
}
}
});
}
}
WfForm.registerCheckEvent(WfForm.OPER_SAVE + "," + WfForm.OPER_SUBMIT, function (callback) {
splitAttachByName(function () {
callback();
});
});
});
</script>调整位置#
- 改来源附件字段:修改
sourceField对应的字段名。 - 改是否启用拆分:修改
controlField和canSplitAttach()里的判断值。 - 改拆分规则:在
rules里维护keyword和目标附件字段。 - 增加更多目标字段:继续往
rules数组里追加配置。 - 如果附件接口返回结构变化,只需要调整
getAttachInfo()和buildFileData()。
注意点#
- 这段逻辑挂在
OPER_SAVE和OPER_SUBMIT上,必须在异步附件信息全部取完后再执行callback()。 - 目标附件字段会按匹配结果整体重写;没有匹配到文件时会被写成空附件。
- 同一个文件名如果命中多个关键字,会同时进入多个目标附件字段。
