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

案例-附件相关扩展开发

[复制链接]
发表于 2023-12-7 18:20:56
本帖最后由 yonyouhmm 于 2024-3-21 20:08 编辑

一、说明
    应用构建中的附件字段,存储的是前端生成的uuid,附件信息是绑定在这个uuid上的,就是附件字段的存储的值。前端框架中window对象中预制有文件服务提供的操作附件的js方法
二、生命周期函数
//附件组件初始化

  1. viewModel.on('beforeCreateAttachmentData', ({ data, config }) => {
  2.   debugger;
  3.   //data.objectId = 'xxxxx'; // 可以自己修改objectId
  4. });
复制代码
//附件组件渲染前

  1. viewModel.on('beforeRenderFileComponent', (obj) => {
  2.   debugger;
  3.   obj.authId = '';
  4. });
复制代码
//附件组件创建

  1. viewModel.on(`filelistnew2DidMount`, function ({ ecsuiteComponent }) {
  2.   debugger;
  3.   ecsuiteComponent.then(function (ecsuiteApi) {
  4.     //控制是否可上传、删除、下载
  5.     //如果对mode有要求就增加viewModel.getParams().mode的判断。ecsuiteComponent是个promise对象 也可以先赋值给一个变量  modeChange中直接使用
  6.     ecsuiteApi.updateAuth({
  7.       auth: {
  8.         canDownload: true,
  9.         canDelete: true,
  10.         canUpload: true,
  11.       },
  12.     });
  13.   });
  14. });
复制代码
//上传前

  1. viewModel.on('beforeFileListUpload', function ({ fileData, ...obj }) {
  2.   debugger;
  3. });
复制代码
//监听上传和删除

  1. viewModel.on('ecsuiteFileChange', function ({ viewModel, data, file, type, childrenFieldId, cItemName, objectId, objectName }) {
  2.   debugger;
  3.   // 通过type区分是上传还是删除 upload 上传 delete 删除
  4. });
复制代码
//上传成功后

  1. viewModel.get('new2').on('afterFileUploadSuccess', function ({ file }) {
  2.   debugger;
  3. });
复制代码
//删除附件前

  1. viewModel.on('beforeDeleteCallBack', function (data) {
  2.   debugger;
  3. });
复制代码
//删除成功后

  1. viewModel.get('new2').on('afterFileDeleteSuccess', () => {
  2.   debugger;
  3. });
复制代码
//预览前
  1. viewModel.on('beforePreviewCallBack', function ({ fileData, params }) {
  2.   debugger;
  3. });
复制代码
//下载前
  1. viewModel.on('beforeDownloadCallBack', (obj) => {
  2.   debugger;
  3.   obj.zipName = 'dddddd'; // 将附件下载的名称修改为dddddd
  4. });
复制代码
//批量下载前
  1. viewModel.on('beforeBatchDownload', (obj, filesInformation) => {
  2.   debugger;
  3. });
复制代码
//子表行附件 弹窗保存时触发 beforeTableAttachmentHandleOk
  1. viewModel.on('beforeTableAttachmentHandleOk', ({ uploadList, deleteList, data }) => {
  2.   debugger;
  3. });
复制代码
三、文件服务js方法

1、可以批量获取 根据多个单据的附件字段的值 批量获取附件信息列表
2、脚本以获取一个单据的演示 获取一个附件字段的附件信息列表
3、按照fileId删除附件
4、获取预览地址
5、获取单个文件下载链接
6、批量获取文件下载链接
7、拷贝附件 把一个单据中的附件都拷贝到另一个单据的附件字段
8、上传附件


//附件操作
viewModel.get('button27yk').on('click', (args) => {
  window.YYCooperationBridge.ready(() => {
    let objectId = viewModel.get('new2').getValue();
    //1、根据附件字段存的值 获取附件信息列表
    //也可以批量获取 根据多个单据的附件字段的值 这是批量获取的方式
    window.YYCooperationBridge.YYFormFileGetAllListByObjectIdV2({
      searchList: [
        { businessId: '附件字段存的值', objectName: 'iuap-yonbuilder-runtime' },
        { businessId: '附件字段存的值', objectName: 'iuap-yonbuilder-runtime' },
      ],
      extraParams: { authId: 'xxx' },
    }).then((data) => {
      console.log(data);
    });
    //2、获取一个附件字段的附件信息列表
    window.YYCooperationBridge.YYGetFileListV2({
      objectName: 'iuap-yonbuilder-runtime',
      objectId: objectId,
      ts: Date.now(),
      pageSize: 10,
      extraParams: { authId: 'xx' },
    }).then((data) => {
      console.log(data);
      //3、按照fileId删除附件
      let fileId = data.data[0].fileId;
      window.YYCooperationBridge.YYDeleteFileV2({
        fileId: fileId,
        fileSign: '', //删除签名 可以不传
        checkUser: true, //是否验证用户 如果为true只能删除本人上传的附件
        extraParams: { authId: '' }, //其他参数 不传也可以
      }).then((args) => {
        console.log(args);
      });
      //4、获取预览地址
      window.YYCooperationBridge.YYPreviewFileByIdV2({
        fileId: fileId,
        open: true, //如果为true就直接在浏览器打开新页签预览了
        extraParams: { authId: 'xx' },
      }).then((data) => {
        console.log(data);
      });
      //5、获取单个文件下载链接
      window.YYCooperationBridge.YYGetDownloadUrlV2({
        fileId: fileId,
        extraParams: { authId: 'xx' },
      }).then((res) => {
        console.log(res);
        let file = null;
        getFileFromUrl(res, 'test', '.text').then((response) => {
          file = response.file;
          //8、上传附件
          YYCooperationBridge.YYUploadFiles({
            files: [file],
            appCode: 'iuap-yonbuilder-runtime',
            businessId: objectId,
            beforeUpload: (file) => {
              if (file.name.includes('副本')) {
                return Promise.reject(false);
              }
            },
            onFailed: (file, error) => {
              console.log('onFailed', file, error);
            },
            onSuccess: (file) => {
              console.log('onSuccess', file);
            },
            onProgress: (file) => {
              console.log('onProgress', file);
            },
          });
        });
      });
      //6、批量获取文件下载链接
      window.YYCooperationBridge.YYGetBatchDownloadUrlV2({
        fileId: [fileId], //字符串数组
        zipName: 'test', //下载下来的zip文件名
        extraParams: { authId: 'xx' },
      }).then((data) => {
        console.log(data);
      });
    });
  });
});


//7、拷贝附件 把一个单据中的附件都拷贝到另一个单据的附件字段
viewModel.get('button40zi')?.on('click', (args) => {
  window.YYCooperationBridge.ready(() => {
    window.YYCooperationBridge.YYFormFilesCopyAllV2({
      copyList: [
        {
          sourceObjectId: '08eb78cc-94e7-48f4-ba97-c4d85d32b846', //附件字段存储的值
          sourceObjectName: 'iuap-yonbuilder-runtime',
          targetObjectName: 'iuap-yonbuilder-runtime',
          targetObjectId: '65b40e68-6321-4715-87c0-aa16884adee0', //目标附件字段存储的值
        },
      ],
      extraParams: { authId: 'xxx' },
    });
  });
});
四、客开需要同步校验的脚本示例
async function processPromise(objectId, returnPromise) {
  let promise = window.YYCooperationBridge.YYGetFileListV2({
    objectName: 'iuap-yonbuilder-runtime',
    objectId: objectId,
    ts: Date.now(),
    pageSize: 10,
    extraParams: { authId: '' },
  });
  const result = await promise;
  debugger;
  if (result.count == 0) {
    cb.utils.alert("附件不能为空");
    return returnPromise.reject();
  } else {
    return returnPromise.resolve();
  }
}

viewModel.on('beforeSubmit', (args) => {
  var returnPromise = new cb.promise();
  let objectId = viewModel.get('new2').getValue();
  let result = processPromise(objectId, returnPromise);
  return returnPromise;
});


五、一个附件相关的案例-发送附件

viewModel.get('button40ai').on('click', (args) => {
  window.YYCooperationBridge.ready(() => {
    let objectId = viewModel.get('new2').getValue();
    window.YYCooperationBridge.YYGetFileListV2({
      objectName: 'iuap-yonbuilder-runtime',
      objectId: objectId,
      ts: Date.now(),
      pageSize: 10,
      extraParams: { authId: 'xx' },
    }).then((fileRes) => {
      console.log(fileRes);
      const fileId = fileRes.data[0].id; //这里获取到了fileId 多个文件自行处理
      var fileName = fileRes.data[0].fileName;
      var fileExtension = fileRes.data[0].fileExtension;
      //获取下载链接 下载后转为base64发送
      window.YYCooperationBridge.YYGetDownloadUrlV2({
        fileId: fileId,
        extraParams: { authId: 'xx' },
      }).then((res) => {
        let file = null;
        getFileFromUrl(res,fileName,fileExtension).then((response) => {
          file = response.file;
          var reader = new FileReader();
          reader.readAsDataURL(file);
          reader.onload = function () {
            console.log(reader.result);
            debugger;
            cb.rest.invokeFunction('AT18EBC2523EB80008.backDesignerFunction.sendFile', {fileExtension: fileExtension, fileName: fileName, filePath: reader.result }, function (err, res) {
              debugger;
            });
            //这里测试把base64下载下来
            //downloadFileByBase64(reader.result,fileName);
          };
        });
      });
    });
  });
});


function getFileFromUrl(url,fileName, fileExtension) {
  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 fullName = fileName + fileExtension;
      debugger;
      //可以自己判断附件类型
      let file = new File([blob], fullName, { type: 'image/png' });
      // 返回结果
      resolve({ file: file, fileName: fullName });
    };
    xhr.onerror = (e) => {
      reject(e);
    };
    // 发送
    xhr.send();
  });
}

获取下载地址后,如何将附件下载并上传到其他单据(调用开放平台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 dataURLtoBlob(dataurl) {
  var arr = dataurl.split(','),
    mime = arr[0].match(/.*?);/)[1],
    bstr = atob(arr[1]),
    n = bstr.length,
    u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], { type: mime });
}
//下载方法
function downloadFile(url, name) {
  var a = document.createElement('a');
  a.setAttribute('href', url);
  a.setAttribute('download', name);
  a.setAttribute('target', '_blank');
  let clickEvent = document.createEvent('MouseEvents');
  clickEvent.initEvent('click', true, true);
  a.dispatchEvent(clickEvent);
}


function downloadFileByBase64(base64, name) {
  var myBlob = dataURLtoBlob(base64);
  var myUrl = URL.createObjectURL(myBlob);
  downloadFile(myUrl, name);
}







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

本版积分规则