帖子
帖子
用户
博客
课程
显示全部楼层
143
帖子
2
勋章
4万+
Y币

客开-附件专题

[复制链接]
发表于 2023-8-30 12:16:24
本帖最后由 YonJiao 于 2024-1-23 19:18 编辑

一、基础说明

1、应用构建单据中的附件字段是如何存储的?

如图,单据中的new1字段是附件类型字段,在点击新增按钮后,前端框架会自动给new1字段赋值,后续上传的附件文件是绑定到new1存储的uuid上。new1字段存储的这个id我们通常称为businessId。对附件的操作都是基于businessId。
2、客开层面如何在脚本中操作附件?
目前开放平台提供文件上传和文件删除的接口,我们可以直接在脚本中调用。

除了开放平台api,前端框架内部集成有操作附件的js,我们可以在前端函数中使用,获取附件信息、获取附件下载地址等。
关于上述操作,我们在下文具体说明。

二、开放平台(文件上传、文件删除)接口介绍
首先,自建单据中我们上传一个附件并保存,然后观察网络请求。注意图片中对businessId、businessType和fid文字说明。这三个参数就是这样获取




1、文件上传
现在我们通过api测试工具,给上述单据上传一个附件

2、文件删除
现在我们通过api测试工具,删除上一步上传的附件

三、前端函数对附件的操作
页面加载完成后,框架会在window对象中挂载YYCooperationBridge,对附件的前端操作都是基于此对象。pc和手机端不同,注意区别。

1、pc、移动通用获取附件信息  返回值中有fileId
window.YYCooperationBridge.YYFormFileGetAllListByObjectId([{"objectId":"7411422b-62ad-4d9b-93f1-b906d01bc355","objectName":"iuap-yonbuilder-runtime"}], false, '', '', '', '', '')

2、pc  获取下载地址
window.YYCooperationBridge.YYGetDownloadUrlV2({
fileId: '64e4554ff54cd12b92bf1409'
}).then(res=>{console.log(res)})

3、pc  获取预览地址
window.YYCooperationBridge.YYPreviewFileByIdV2({
fileId: '64e4554ff54cd12b92bf1409',
open: true
}).then(res=>{console.log(res)})

4、mobile  获取下载地址使用此方式
window.YYFileServiceSDK.getDownloadUrlWithFileId({data:{fileId:'64ddb7ac2e462674bbdc24d4'}}).then((res)=>{console.log(res)})
//引入的js修改
loadjs(
'https://c2.yonyoucloud.com/iuap-apcom-file/ucf-wh/fileservice/base/fileservice-base.min.js'
);

function loadjs(params) {
var headobj = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = params;
headobj.appendChild(script);
}

5、获取下载地址后,如何将附件下载并上传到其他单据(调用开放平台api上传
getFileFromUrl(res).then((response) => {
    file = response.file;
    //目标单据销售订单的businessType  businessId是单据id
    let businessType = 'yonbip-scm-scmsa';
    let businessId = '69ee6045-edc4-4544-990d-8e60f4249048';
    //获取token
    let result = cb.rest.invokeFunction(
            'PU.backFunc.fileToSaleOrder', {},
            function (err, res) {},
            viewModel, {
            async: false
        });
    let access_token = result.result.access_token;
    const FD = new FormData();
    FD.enctype = 'multipart/form-data';
    FD.append('files', file);
    let url = 'https://c3.yonyoucloud.com/iuap-api-gateway/yonbip/uspace/iuap-apcom-file/rest/v1/file?access_token=' + access_token + '&businessType=' + businessType + '&businessId=' + businessId;
    cb.rest.ajax(url, {
        method: 'post',
        uniform: false,
        mask: false,
        dateType: 'file',
        domainKey: 'upu',
        params: FD,
        callback: (err, res) => {
            debugger;
            if (err) {
                console.log(err);
            } else {
                console.log(res);
            }
        }
    });
});

function getFileFromUrl(url) {
    return new Promise((resolve, reject) => {
        var blob = null;
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url);
        //xhr.setRequestHeader('Accept', 'application/octet-stream');
        xhr.responseType = 'blob';
        // 加载时处理
        xhr.onload = (args) => {
            // 获取返回结果
            blob = xhr.response;
            // let attachName = decodeURI(xhr.getResponseHeader('content-disposition'));
            // let fileName = attachName.slice(22, -1);
            debugger;
            let file = new File([blob], 'test', {
                type: 'txt/plain'
            });
            // 返回结果
            resolve({
                file: file
            });
        };
        xhr.onerror = (e) => {
            reject(e);
        };
        // 发送
        xhr.send();
    });
}

6、获取下载地址后,如何将附件下载并上传到其他单据(使用js上传 后面补充

四、附件相关的生命周期事件
1、附件组件渲染前
viewModel.on('beforeCreateAttachmentData', function ({ data, config }) {
  // 可以修改data里的objectId为其他单据的,但是不建议这么做,列表页也要处理
  const { objectId } = data;
  data.objectId = "531242ac-6d88-474b-b439-62fff3942bac";
});


2、附件组件mount
viewModel.on(`filelist{附件字段编码}DidMount`, async ({ecsuiteComponent}) => {
  debugger;
  this.ecsuiteComponent = await ecsuiteComponent;
})



3、删除附件后

viewModel.get('new1').on('afterFileDeleteSuccess',()=>{
  debugger;
})

4、上传附件后
viewModel.get('new1').on('afterFileUploadSuccess',()=>{
  debugger;
})

五、附件的其他操作
1、把一个自建单据1的附件如何同步给自建单据2?
如果要求两个单据的附件字段中的附件完全一致,优先考虑使用业务流,也可以使用后端函数更新单据2中的附件字段,其他情况就要使用脚本上传了。

var object = {id:"1806195368653750275",new1:"531242ac-6d88-474b-b439-62fff3942bac"};
var res = ObjectStore.updateById("AT18EBC2523EB80008.AT18EBC2523EB80008.fileDemo",object);
2、自建单据和原厂单据、原厂单据和原厂单据的附件同步?
暂时只能使用脚本去上传






本帖子中包含更多资源,您需要 登录 才可以下载或查看,没有帐号?立即注册

X
您需要登录后才可以回帖 登录

本版积分规则