↓ 跳过正文
  1. 工作笔记/
  2. E9 Ecode/

按附件名称拆分到不同附件字段

·452 字·3 分钟· ·
泛微 E9 Ecode 代码块 附件字段 WfForm
作者
molefool
目录

用途
#

保存或提交流程前,根据附件文件名里的关键字,把一个来源附件字段里的文件拆分到多个目标附件字段。

这段代码里:

  • 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()。
  • 目标附件字段会按匹配结果整体重写;没有匹配到文件时会被写成空附件。
  • 同一个文件名如果命中多个关键字,会同时进入多个目标附件字段。

相关文章