金蝶附件上传接口开发思路

news2024/11/16 17:49:42
1️⃣

需求描述:需要通过调用金蝶API接口实现指定单据的附件上传。本文以收料通知单为例,以Java代码示例进行讲解。
tips:阅读本文开始前,希望你是一名开发者同时阅读过:
https://vip.kingdee.com/article/87232573931076096
https://vip.kingdee.com/article/183394

2️⃣

首先我们需要了解金蝶附件上传接口是哪一个,如果不清楚,我们可以通过抓包的方式进行查看,但是如果看过上面的文章,我们可以找到上传接口: 你的服务器地址/FileUpLoadServices/FileService.svc/upload2attachment/?fileName=上传文件名称&fileId=&token=登录返回的token&last=true&dbid=数据中心id
请求体具体就是字节流的方式放入请求体,不同编程语言具体写法不一致,本文以Java为例最后会附上相关代码。

3️⃣

这样我们可以通过查询

SELECT * from T_BAS_FileServerFileInfo where ffilename='你上传的文件名'

可以查看到你上传的文件(使用的是文件服务器存储到服务器地址)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
1

上传成功了,肯定有一个疑问,这仅仅上传了文件,但是并没有在具体单据显示啊,其实看了第一个tips的能发现,附件是通过T_BAS_Attachment表与实际业务关联起来的。所以下面需要通过保存api将附件信息关联起来。

4️⃣

下面就和保存一样,请求url其实就是保存的。通过分析分析官方的url我们可以得出请求json格式:

{
	"parameters": [
		"BOS_Attachmen",
		{
			"NeedReturnFields": [],
			"IsAutoSubmitAndAudi": "false",
			"Creator": "",
			"NeedUpDateFields": [],
			"IsVerifyBaseDataField": "false",
			"IsEntryBatchFill": "false",
			"NumberSearch": "true",
			"InterationFlags": "",
			"ValidateFlag": "true",
			"SubSystemId": "",
			"IsDeleteEntry": "false",
			"Model": {
				"FInterID": "单据的fid",
				"FEntryKey": " 单据体标识(如果是单据头,则传一个空格)",
				"FEntryInterID": -1 单据体分录主键,单据头传-1,
				"FBillNo": "单据体编号",
				"FBillType": "你要上传附件表单",
				"FAttachmentName": "上传文件的名字",
				"FAttachmentSize": "上传文件的大小",
				"FExtName": "拓展名",
				"FAttachmentDes": "描述",
				"FAttachmen": "",
				"FFILEID": "通过步骤三返回的fileid",
				"FCREATEMEN": " { "FUSERID", 10086}",
				"FCreateTime": "上传时间"
			}
		}
	]
}

然后进行保存就可以了通过查询

SELECT * from T_BAS_Attachment where fbillno in('你上传附件的单号')

在这里插入图片描述

然后通过前端附件就可以进行查看到上传的文件了
在这里插入图片描述

5️⃣

最后附上Java相关代码

public ResultVO upload(String token,String cookie, MultipartFile content, String formId,String fbillno) throws IOException {
        System.out.println("cookie"+cookie);
        ResultVO rv = new ResultVO();
        List<ArrayList>fidList=new ArrayList<>();
        String fid=null;
        String fileName=null;
        String fileId=null;
        fileName=content.getOriginalFilename();
        String jsonFormat = getExecuteBillQueryJsonFormatNew(formId,"FID", "FBillNo in('"+fbillno+"')");
        //json格式化
        JSONObject obj = JSON.parseObject(jsonFormat);
        rv = executeBillQuery(cookie, obj);
        if (rv != null) {
            String[] l = JSON.parseObject(rv.getData().toString(), String[].class);
            String[] n=JSON.parseObject(l[0], String[].class);
            fid=n[0];
        }
        byte[] bytes=content.getBytes();
        InputStream in = new ByteArrayInputStream(bytes);
        Date date = new Date();
        SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        String url= "http://你的服务器地址/k3cloud/FileUpLoadServices/FileService.svc/upload2attachment/?filename="+fileName+"&fileid=&last=true&dbid="+kdCloundConfig.getAcctID()+"&token="+token+"";
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("data",in);
        String result2 = HttpRequest.post(url)
                .form(paramMap)//表单内容
                .timeout(20000)//超时,毫秒
                .execute().body();
        System.out.println("result2"+result2);
      //  System.out.println("FileId"+ JsonPath.read(result2, "$.Upload2AttachmentResult.FileId"));
        fileId=JsonPath.read(result2, "$.Upload2AttachmentResult.FileId");
        String saveurl = kdCloundConfig.getUrl() + kdCloundConfig.getSave();
        //业务数据内码FInterID
        //-1 FEntryInterID代码单据头附件,单据体附件需指定具体业务数据单据体内码,
        //FBillNo 业务数据编码
        //PUR_ReceiveBill 附件关联的业务对象Id
        System.out.println("fid"+fid+"fbillno"+fbillno+"formId"+formId+"fileName"+fileName+content.getSize()+content.getOriginalFilename().substring(content.getOriginalFilename().lastIndexOf("."))+dateFormat.format(date));
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("FUSERID",643384);
        String data="{\n" +
                "\t\"parameters\": [\n" +
                "\t\t\"BOS_Attachment\",\n" +
                "\t\t{\n" +
                "\t\t\t\"NeedReturnFields\": [],\n" +
                "\t\t\t\"IsAutoSubmitAndAudit\": \"false\",\n" +
                "\t\t\t\"Creator\": \"\",\n" +
                "\t\t\t\"NeedUpDateFields\": [],\n" +
                "\t\t\t\"IsVerifyBaseDataField\": \"false\",\n" +
                "\t\t\t\"IsEntryBatchFill\": \"false\",\n" +
                "\t\t\t\"NumberSearch\": \"true\",\n" +
                "\t\t\t\"InterationFlags\": \"\",\n" +
                "\t\t\t\"ValidateFlag\": \"true\",\n" +
                "\t\t\t\"SubSystemId\": \"\",\n" +
                "\t\t\t\"IsDeleteEntry\": \"false\",\n" +
                "\t\t\t\"Model\": {\n" +
                "\t\t\t\t\"FInterID\": "+fid+",\n" +
                "\t\t\t\t\"FEntryKey\": \" \",\n" +
                "\t\t\t\t\"FEntryInterID\": -1,\n" +
                "\t\t\t\t\"FBillNo\": \""+fbillno+"\",\n" +
                "\t\t\t\t\"FBillType\": \""+formId+"\",\n" +
                "\t\t\t\t\"FAttachmentName\": \""+fileName+"\",\n" +
                "\t\t\t\t\"FAttachmentSize\": "+ (double)(Math.round(content.getSize()/1024))+",\n" +
                "\t\t\t\t\"FExtName\": \""+content.getOriginalFilename().substring(content.getOriginalFilename().lastIndexOf("."))+"\",\n" +
                "\t\t\t\t\"FAttachmentDes\": \"地磅上传\",\n" +
                "\t\t\t\t\"FAttachment\": \"\",\n" +
                "\t\t\t\t\"FFILEID\": \""+fileId+"\",\n" +
                "\t\t\t\t\"FCREATEMEN\": "+jsonObject.toJSONString()+",\n" +
                "\t\t\t\t\"FCreateTime\": \""+dateFormat.format(date)+"\"\n" +
                "\t\t\t}\n" +
                "\t\t}\n" +
                "\t]\n" +
                "}";
        Map<String, Object> header = new HashMap<>();
        header.put("Cookie", cookie);
        String result = HttpUtil.httpPost(saveurl, header, data);
        rv.setCode(ResultEnumErrorCode.SUCCESS.getCode());
        rv.setMessage(ResultEnumErrorCode.SUCCESS.getMsg());
        rv.setData(result);
        logger.info("upload:formId:{}执行结果:{}", formId, result);
        if (ObjectUtil.isEmpty(rv)) {
            rv.setCode(ResultEnumErrorCode.SYSTEM_ERROR_B0001.getCode());
            rv.setMessage(ResultEnumErrorCode.SYSTEM_ERROR_B0001.getMsg());
            logger.error("upload:formId:{}系统执行出错!", formId);
        }


        return rv;
    }

最后本文提供了上传思路,实际业务还需要根据实际情况调整。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/138038.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【小知识点】为爬虫训练场项目添加 Bootstrap5 时间轴

爬虫训练场建站时间轴&#xff1a;https://pachong.vip/timeline 背景 为了便于记录爬虫训练场项目更新日志&#xff0c;所以集成该功能&#xff0c;实现效果如下所示。 特别备注一下&#xff0c;时间轴是什么&#xff1f; 时间轴是一种常用的网站布局元素&#xff0c;通常用…

Forexclub:特斯拉四季度交付车辆创纪录,你认为2023年特斯拉销量如何

周一特斯拉宣布其2022年第四季度交付了创纪录的405278辆汽车。这一数字创下了该公司的纪录&#xff0c;但低于华尔街的估计。据报道&#xff0c;报告中对交付量的普遍估计为420760。特斯拉称&#xff1a;“2022年&#xff0c;汽车交付量同比增长40%&#xff0c;达到131万辆。”…

基于Vue和SpringBoot的论文检测系统的设计与实现

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

【信息论与编码 沈连丰】第七章:信息率失真理论及其应用

【信息论与编码 沈连丰】第七章&#xff1a;信息率失真理论及其应用第七章 信息率失真理论及其应用7.1 失真函数和平均失真度7.2 信息率失真函数7.3 信息率失真函数R(D)的计算7.4 保真度准则下的信源编码定理7.5 信息率失真函数与信息价值第七章 信息率失真理论及其应用 香农第…

网工、运维必备的免费在线画图工具,真的很好用!

都说一图胜千言&#xff0c;一个IT工程师如果能画的一手好图&#xff0c;无论是在方案选项、还是技术交流&#xff0c;都能快速表达自己的想法&#xff0c;让你的思路更加的直观明了&#xff1b;市面上的制图工具有很多&#xff0c;下面就推荐几款好用且免费的工具&#xff0c;…

SaaS服务最大的优势是哪些?(附免费试用)

SaaS服务十大优势 近些年来&#xff0c;SaaS&#xff08;Software-as-a-Service&#xff09;成为整个IT领域中最受欢迎的业务模型之一。由于SaaS的市场每年以近60&#xff05;的速度增长&#xff0c;因此它正在取代更传统的应用市场&#xff0c;并将在未来几年内成为主导模式。…

【非侵入式负载监测】低采样率电动汽车充电的无训练非侵入式负载监测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

一、TTY子系统介绍

个人主页&#xff1a;董哥聊技术我是董哥&#xff0c;嵌入式领域新星创作者创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01;文章目录1、TTY介绍2、控制台终端2.1 系统控制台2.2 当前控制台2.3 虚拟控制台3、伪终端4、串口终端5. 其它类型…

《移动安全》(10)Frida第一篇之环境搭建

0x00 前言 Frida是一款轻量级HOOK框架&#xff0c;我们在电脑上安装Frida环境后&#xff0c;还需要将frida-server上传到目标机器上运行&#xff08;需要Root&#xff09;&#xff0c;通过它来注入进程完成hook操作。本文主要讲述Frida环境的搭建。 0x01 Frida环境搭建 &…

node.js创建网站实例3

node.js访问mysql数据库并把查询结果返回给前端 1.cmd中运行&#xff1a;npm install mysql -s 2.修改api.js的代码 // 1.先引入express模块&#xff0c;express是一个函数 var express require("express") //2.执行express函数&#xff1b;用变量接收express函数…

概论_第2章_重点_随机变量函数的概率分布___定理法和分布函数法的应用

一 定义 概括地说&#xff1a; 随机变量Y是随机变量X的函数。 设g(x) 是一给定的连续函数&#xff0c; 称Yg(X) 为随机变量X的一个函数&#xff0c; Y也是一个随机变量。当X取值 时&#xff0c;Y取值 . ~~~~~~~~~~~~~~ 本文讨论连续型随机变量函数。 定理1: 设X为连续型…

【3.2】Eureka-搭建注册中心/服务注册/服务发现

【3.2】Eureka-搭建注册中心/服务注册/服务发现1 搭建EurekaServer1.1 详细步骤1.2 搭建EurekaServer小结2 服务注册2.1 详细步骤&#xff08;踩坑点&#xff01;解决&#xff09;2.2 模拟多实例部署2.3 服务注册小结3 服务发现3.1 详细步骤4 总结1 搭建EurekaServer 搭建Eure…

2022年,我每天都会用的linux常用命令

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.Linux常用命令 1.Linux命令概述 2.Linux命令的分类 &#…

科研 | 学生研究方向指导 | 技术路线 | 相关学习资源

1. AI某领域 1.1 Python基础 慕课教程&#xff1a;Python 入门语法教程 哔哩哔哩&#xff1a;3小时快速入门Python 1.2 机器学习框架 sklearn框架&#xff1a;菜菜的机器学习sklearn 1.3 深度学习框架 慕课教程&#xff1a;TensorFlow 入门教程 PyTorch官方教程中文版 不…

【回答问题】ChatGPT上线了!给我推荐20个比较流行的AI作画模型!

目录给我推荐20个比较流行的AI作画模型给我推荐20个比较流行的AI作画模型代码给我推荐20个比较流行的AI作画模型 好的&#xff0c;下面是20个比较流行的AI作画模型&#xff1a; DALL-E GAN Deep Dream CycleGAN StyleGAN pix2pix SketchRNN BigGAN ProGAN ESRGAN SPADE BigVA…

Vue+Leaflet.PM插件实现创建和编辑几何图形(点、线、面、圆等)

场景VueLeaflet实现加载OSM显示地图&#xff1a;https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/122317394在上面加载显示OSM的基础上&#xff0c;使用Leaflet.pm插件实现在页面上绘制、编辑、剪切、移动几何元素。Leaflet.pm插件用于创建和编辑几何图层的插件可绘…

如何避免无效外贸邮件营销?

如何避免无效的邮件营销&#xff0c;米贸搜为您整理如下&#xff0c;希望对您有所帮助:1 .和邮件正文一样重视主题主题对于电子邮件就像标题对于文章或博客一样重要。即使你有全宇宙最吸引人的散文诗&#xff0c;或者最吸引人的求婚&#xff0c;如果根本没有人打开这封邮件&…

CSS 中各种居中你真的玩明白了么

前言 页面布局中最常见的需求就是元素或者文字居中了&#xff0c;但是根据场景的不同&#xff0c;居中也有简单到复杂各种不同的实现方式&#xff0c;有的特定场景下可能还有一些稀奇古怪的bug&#xff0c;本篇就带大家一起了解下&#xff0c;各种场景下&#xff0c;该如何使用…

72、【哈希表】leetcode——454. 四数相加 II(C++版本)

题目描述 原题链接&#xff1a;454. 四数相加 II 解题思路 本题构建Hash表的关键是确定Value的含义&#xff0c;因为目标是找到四个集合中各种情况为0的情况之和&#xff0c;因此不需要对相同情况去重&#xff0c;Value设置为满足某种对应情况的出现次数。当找到一次满足nums…

实验室小分子PEG衍生物之Aminoxy-PEG2-azide 1043426-13-6异双功能PEG

Aminoxy-PEG2-azide异双功能PEG接头可交联官能团 中文名称&#xff1a;氨氧基-二聚乙二醇-叠氮化物 英文名称&#xff1a;Aminoxy-PEG2-azide 分子式&#xff1a;C6H14N4O3 分子量&#xff1a;190.2 CAS&#xff1a;1043426-13-6 外观&#xff1a;粘稠液体或者固体粉末&#x…