大家好,今天记录一下泛微OA通过流方式进行附件传输到金碟的ERP系统的操作流程~
1、金碟ERP接收附件的接口
接口参数:
请求报文 | 参数说明 | |
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;如果分多次上传,首次上传后,必填 SendByte:Base64 后的文件字节流,必填 |
返回参数:
返回格式 | 参数说明 | |
Result | ResponseStatus":{"IsSuccess":true,"Errors":[],"SuccessEntitys":[{"Id":470257,"Number":null,"DIndex":0}],"SuccessMessages":[],"MsgCode":0},"FileId":"23d8a447a9254a788f2d12a499898755","Message":""} | IsSuccess:操作是否成功, |
调用参考:
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传输到第三方系统,这算是一个比较简单的操作吧~~~