|
本帖最后由 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
|