工作记录:泛微OA附件通过Base64流方式传输到第三方系统

大家好,今天记录一下泛微OA通过流方式进行附件传输到金碟的ERP系统的操作流程~

1、金碟ERP接收附件的接口

服务地址:http://ServerIP/K3Cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.AttachmentUpLoad.common.kdsvc

接口参数:

请求报文参数说明
data      

" {\"FileName\": \"0616.txt\",\"FormId\": \"PUR_PurchaseOrder\",\"IsLast\": true,\"InterId\": \"100723\",\"BillNO\": \"CGDD000198\",\"AliasFileName\": \"test\",\"SendByte\": \"文件字节数组转base64后的字符串\"}"

FileNamer文件名,必填

FormId 表单标识,必填

IsLast是否最后一次上传,必填

InterId单据内码,必填

Entrykey单据体标识,上传单据体附件时候填写所述单据体的标识

EntryinterId分录内码,如果是单据头附件,要么不填,要么填-1

BillNO单据编号,必填

AliasFileNamer附件别名

FileId文件 id;如果分多次上传,首次上传后,必填

SendByteBase64 后的文件字节流,必填

返回参数:

返回格式参数说明
ResultResponseStatus":{"IsSuccess":true,"Errors":[],"SuccessEntitys":[{"Id":470257,"Number":null,"DIndex":0}],"SuccessMessages":[],"MsgCode":0},"FileId":"23d8a447a9254a788f2d12a499898755","Message":""}

IsSuccess:操作是否成功,
FileId:文件id
Message:错误提示信息

SuccessEntitys.Id:附件内码

调用参考:

1)SDK辅助类示例(引用Kingdee.BOS.WebAPI.Client.dll)(下文引用的是这种方法)

object[] paramInfo = new object[] {
                   "{\" FileName\":\"Test.txt\","+
                    "\"FormId\":\"PUR_PurchaseOrder\","+
"\"IsLast\":true,"+
"\"InterId\":\"100123\","+
"\"Entrykey\":\"FPOOrderEntry\","+
"\"EntryinterId\":\"101300\","+
"\"BillNO\":\"CGDD10001\","+
"\"AliasFileName\":\"test2\","+
"\"SendByte\":\"77u/MTIzNA==\""                
};                
var result  = client.Execute<String>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.AttachmentUpLoad", paramInfo);

2)无引用组件示例(不引用金蝶的组件):

HttpClient httpClient = new HttpClient();
 httpClient.Url = "http://192.168.66.60/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.AttachmentUpLoad.common.kdsvc";
object[] paramInfo = new object[] {
                   "{\" FileName\":\"Test.txt\","+
                    "\"FormId\":\"PUR_PurchaseOrder\","+
"\"IsLast\":true,"+
"\"InterId\":\"100123\","+
"\"Entrykey\":\"FPOOrderEntry\","+
"\"EntryinterId\":\"101300\","+
"\"BillNO\":\"CGDD10001\","+
"\"AliasFileName\":\"test2\","+
"\"SendByte\":\"77u/MTIzNA==\""                
};        
httpClient.Content = JsonConvert.SerializeObject(paramInfo);
var result = httpClient.AsyncRequest();

2、OA代码调用

由于金碟的附件接口接收的是Base64 后的文件字节流,所以我们需要对OA上传上来的附件进行一个转换,在单据上上传上来的附件,后台获取到的是一个id,我们的思路是通过这个id来找到文件存放的路径,通过流的方法读取并转换成Base64,再调用接口,以下是具体的实现过程:

1)编写附件id转换成base64编码的字节流:

    //通过fjid查询附件的路径,并且通过流方式读取转换成base64,存放数组中
    public static JSONArray getFjUrl(String fjids) {
        RecordSet rs = new RecordSet();
        JSONArray jsonArray = new JSONArray();
        try {
            if (StringUtils.isBlank(fjids)) return null;
            if (fjids.contains(",")) {
                //多个附件
                String[] split = fjids.split(",");
                for (int i = 0; i < split.length; i++) {
                    //通过附件id查询存放路径
                    rs.execute("select IMAGEFILEID from docimagefile where docid = " + split[i]);
                    while (rs.next()) {
                        //直接用hutool工具类直接将流转成base64, 其中ImageFileManager.getInputStreamById() 这个方法是OA系统内部方法,用来将系统的imagefileid转成文件流
                        //转成流后,直接放到数组中,直接返回
                        jsonArray.add(Base64.encode(ImageFileManager.getInputStreamById(rs.getInt("IMAGEFILEID"))));
                    }
                }
            } else {
                //一个附件
                int number = Integer.parseInt(fjids);
                //通过附件id查询存放路径
                rs.execute("select IMAGEFILEID from docimagefile where docid = " + number);
                while (rs.next()) {
                    jsonArray.add(Base64.encode(ImageFileManager.getInputStreamById(rs.getInt("IMAGEFILEID"))));
                }

            }
            return jsonArray;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

2)通过Base64字节流调用金碟ERP附件接口

//推送附件
                        JSONArray fjbases = CommonTools.getFjUrl(fjsc);
                        String[] splitfjid = fjsc.split(",");
                        for(int i = 0; i<fjbases.size();i++){

                            //通过附件id查询取出附件名称
                            String fjsql = "select imagefilename from docimagefile where docid = ?";
                            rs.executeQuery(fjsql,splitfjid[i]);
                            rs.next();
                            String imagefilename = rs.getString(1);
                            String aliasFileName = null;
                            int dotIndex = imagefilename.lastIndexOf('.');
                            if (dotIndex != -1) {
                                aliasFileName = imagefilename.substring(0, dotIndex);
                            } else {
                                aliasFileName = imagefilename;
                            }
                            String json = null;
                            json = String.format("{\n" +
                                    "\t\"FileName\": \"%s\",\n" +
                                    "\t\"FormId\": \"ER_ExpenseRequest\",\n" +
                                    "\t\"IsLast\": true,\n" +
                                    "\t\"InterId\": \"%s\",\n" +
                                    "\t\"BillNO\": \"%s\",\n" +
                                    "\t\"AliasFileName\": \"%s\",\n" +
                                    "\t\"SendByte\": \"%s\"\n" +
                                    "}",imagefilename,id,billNo,aliasFileName,fjbases.get(i));
                            Object[] paramInfo = new Object[] {json};
                            String execute = client.execute("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.AttachmentUpLoad", paramInfo);
                            //解析JSON
                            PRRepoRet Result = new PRRepoRet();
                            //解析JSON结果
                            Result = commonTools.resultEntity(Result, execute);
                            if (!Result.getIsSuccess())
                            {
                                rs.writeLog(info + "编号:" + billNo + "附件上传失败");
                                rs.writeLog(info + "附件请求报文:"+json);
                            }else{
                                rs.writeLog(info + "编号:" + billNo + "附件上传成功");
                            }
                        }
                    }

3、总结

通过附件的id查询到存放的路径,知道路径我们便可用字节流来进行对文件读取,进而转换Base64传输到第三方系统,这算是一个比较简单的操作吧~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值