0%

java整合金蝶云

1 Java整合

1.1 获取第三方授权

首页-OpenAPI

进入金蝶云首页,点击开发指南,快速入门,有对应的教程

步骤一较为详细,可以参考

遇到的问题:测试时,只有集成的用户登录,才可以调用api进行修改。否则调用接口返回的链接会显示(会话信息已丢失,请重新登录)

解决方法:设置二次验权密码(后发现即使提出请重新登录,也可以修改数据)

1
2
3
4
5
6
X-KDApi-AcctID =6304ba61219bf5
X-KDApi-AppID=225649_7ZbM6dDO0qrVXXUKX/Xs09wH2u5d4rLE
X-KDApi-AppSec =2bb1d972f3574a46aebee03cdc80aeae
X-KDApi-UserName =demo
X-KDApi-LCID=2052
X-KDApi-ServerUrl=https://apiexp.open.kingdee.com/k3cloud/

1.2 下载使用SDK

SDK中心-OpenAPI

找到想要的jdk版本解压后即可,有一个demo可以测试

创建一个libs/kingdee目录,把jar包放入

创建一个kdwebapi.properties文件,写入登录授权获取到的数据

pom里面导入依赖

1
2
3
4
5
6
7
8
9
10
11
12
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.kingdee</groupId>
<artifactId>k3cloud-webapi</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/kingdee/k3cloud-webapi-8.2.0.jar</systemPath>
</dependency>

测试

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static void main(String[] args) {
K3CloudApi client = new K3CloudApi();
String jsonData = "{\"FormId\":\"\",\"FieldKeys\":\"\",\"FilterString\":\"\"," +
"\"OrderString\":\"\",\"TopRowCount\":0,\"StartRow\":0,\"Limit\":0}";
JSONObject jsonObject = JSONObject.parseObject(jsonData);
//组织机构查询接口ID
jsonObject.put("FormId", "ORG_Organizations");
//需要获得的字段信息
jsonObject.put("FieldKeys", "FNumber,FName,FDescription,FAcctOrgType,FContact");
jsonObject.put("Limit", 10);
try {
List<List<Object>> result = client.executeBillQuery(jsonObject.toJSONString());
for (List<Object> obj : result) {
System.out.println(obj.toString());
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}

整合完毕

参考文章:Java Maven项目对接金蝶SDK_kdwebapi.properties-CSDN博客

2 api的使用

官方接口文档

API文档-OpenAPI

2.1 查询

此处以委托单为例

先查到单据编号FBillNo,再通过单据编号查到整个单据的结构,再根据自己的业务需求获取到对应的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class JinDieYunApi {

//获取检验单编号
//每种单据类型都有对应的FormId,可在api文档查看
//FieldKeys为要查询的类型
//查询条件0代表所有的
//json格式一定要注意!
public static List<JSONObject> Codes() throws Exception {
var api = new K3CloudApi();
String json = "{\n" +
" \"FormId\": \"QM_InspectBill\",\n" + // 检验单 FormId
" \"FieldKeys\": \"FBillNo\", \n" + //
" \"FilterString\": \"\", \n" +
" \"OrderString\": \"\", \n" +
" \"TopRowCount\": 0, \n" +
" \"StartRow\": 0, \n" +
" \"Limit\": 0, \n" +
" \"SubSystemId\": \"\" \n" +
"}";

String result = api.billQuery(json);
System.out.println("检验单查询接口: " + result);

List<JSONObject> jsonArrays = JSON.parseArray(result, JSONObject.class);

return jsonArrays;
}
}

实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
@Data
public class Fbill extends BaseEntity
{
private static final long serialVersionUID = 1L;

/** $column.columnComment */
private Long id;

/** 单据主键 */
private String fid;

/** 单据状态 */
private String status;


/** 单据编号 */
private String fBillno;


/** 物料id */
private String fMaterialId;

/** 物料名称 */
private String fMaterialName;

/** 物料编码 */
private String fMaterialNumber;

/** 检验数量 */
private String fInspectQty;

/** 合格数 */
private String fQualifiedQty;

/** 不合格数 */
private String fUnqualifiedQty;

/** 物料码 */
private String fCode;

/** 删除标识 */
private String delFlag;

/** 内部批次号 */
private String fEntityId;

/** 合格数id */
private String qualifiedId;

/** 不合格数id */
private String unqualifiedId;

/** 描述 */
private String fDescription;

/** 创建时间 */
private Date createTime;

}

api.view用于查看表的结构,获取自己想要的数据,可以添加到自己的数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116

import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.kingdee.bos.webapi.sdk.K3CloudApi;
import org.junit.Test;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
public class Demo {
@Test
public void test() throws Exception {
List<JSONObject> codes = JinDieYunApi.Codes();

K3CloudApi api = new K3CloudApi();

for (JSONObject obj : codes) {
System.out.println(obj.toString());
String formId = "QM_InspectBill";
String FBillNo = obj.getString("FBillNo"); // 表单标识:检验单
String aa = "{" +
"\"CreateOrgId\": 0," +
"\"Number\": \"" + FBillNo + "\"," +
"\"Id\": \"\"" +
"}";

String json = api.view(formId, aa); //查看整个表的结构

ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(json);

JsonNode resultNode = root.path("Result").path("Result");
int size = root.path("Result").path("Result").path("Entity").size();

for (int i = 0; i < size; i++) {
Fbill fbill = new Fbill();
//获取单据的信息
JsonNode Entity = root.path("Result").path("Result").path("Entity").get(i);
JsonNode PolicyDetail = root.path("Result").path("Result").path("Entity").get(i).path("PolicyDetail");
int PolicyDetailSize = root.path("Result").path("Result").path("Entity").get(i).path("PolicyDetail").size();

JsonNode MaterialId = root.path("Result").path("Result").path("Entity").get(i).path("MaterialId");
JsonNode name = root.path("Result").path("Result").path("Entity").get(i).path("MaterialId").path("Name").get(0);

String createDate = resultNode.path("CreateDate").asText();
String billNo = resultNode.path("BillNo").asText();
String description = resultNode.path("Description").asText();
String fid = resultNode.path("Id").asText();
String entityId = Entity.path("Id").asText();
String materialId = Entity.path("MaterialId_Id").asText();
String inspectQty = Entity.path("InspectQty").asText();
String qualifiedQty = Entity.path("QualifiedQty").asText();
String unqualifiedQty = Entity.path("UnqualifiedQty").asText();
String materialNumber = MaterialId.path("Number").asText();
String materialName = name.path("Value").asText();

System.out.println(PolicyDetailSize);
for (int j = 0; j < PolicyDetailSize; j++) {
String status = PolicyDetail.get(j).path("PolicyStatus").asText();
if ("1".equals(status)) {
String qualifiedId = PolicyDetail.get(j).path("Id").asText();
System.out.println("合格数id:" + qualifiedId);
fbill.setQualifiedId(qualifiedId);
}
if ("2".equals(status)) {
String unqualifiedId = PolicyDetail.get(j).path("Id").asText();
System.out.println("不合格数id:" + unqualifiedId);
fbill.setUnqualifiedId(unqualifiedId);
}

}


// 1. 解析 ISO 时间格式
LocalDateTime localDateTime = LocalDateTime.parse(createDate);

// 2. 转为 java.util.Date
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());

fbill.setCreateTime(date);
fbill.setFid(fid);
fbill.setfBillno(billNo);
fbill.setfMaterialId(materialId);
fbill.setfMaterialName(materialName);
fbill.setfDescription(description);
fbill.setfInspectQty(inspectQty);
fbill.setfQualifiedQty(qualifiedQty);
fbill.setfUnqualifiedQty(unqualifiedQty);
fbill.setfEntityId(entityId);
fbill.setfMaterialNumber(materialNumber);

System.out.println("转换后的 Date 对象:" + date);
System.out.println("创建时间:" + createDate);
System.out.println("单据编号:" + billNo);
System.out.println("wuliaoid:" + materialId);
System.out.println("Id:" + fid);
System.out.println("物料实体id:" + entityId);
System.out.println("物料编码:" + materialNumber);
System.out.println("MaterialName:" + materialName);
System.out.println("描述:" + description);
System.out.println("检验数量:" + inspectQty);
System.out.println("合格数量:" + qualifiedQty);
System.out.println("不合格数量:" + unqualifiedQty);

System.out.println("-------------------------------");

System.out.println("-------------------------------");


}
}
}
}

2.2 修改

此处展示了两种写法,推荐第二种。一定注意格式

这里的业务展示的是对检验单合格数与不合格数的修改,委托单里有两个及以上收料通知单的话,必须要把全部的收料通知单的数据都写上,(金蝶云是把原来的都删除,再新增,如果只修改一个,其余的数据都会被覆盖)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
public  void firstUpdateDocument(Fbill firstBill) throws Exception {
var api = new K3CloudApi();

Fbill fbill = new Fbill();
fbill.setFid(firstBill.getFid());
List<Fbill> fbills = fbillMapper.selectFbillList(fbill);

if (fbills.isEmpty()){
return ;
}

JSONArray entityArray = new JSONArray();
JSONObject model = new JSONObject();
model.put("FID", firstBill.getFid());
model.put("FDescription", firstBill.getfDescription());
//遍历所有的编号
for (Fbill bill:fbills){
JSONObject entry = new JSONObject();
entry.put("FEntryID", Integer.parseInt(bill.getfEntityId()));
entry.put("FInspectQty", Double.parseDouble(bill.getfInspectQty()));
if (bill.getfEntityId().equals(firstBill.getfEntityId())){
entry.put("FQualifiedQty", Double.parseDouble(firstBill.getfQualifiedQty()));
entry.put("FUnqualifiedQty", Double.parseDouble(firstBill.getfUnqualifiedQty()));
}else {
entry.put("FQualifiedQty", Double.parseDouble(bill.getfQualifiedQty()));
entry.put("FUnqualifiedQty", Double.parseDouble(bill.getfUnqualifiedQty()));
}

entityArray.add(entry);
}

model.put("FEntity", entityArray);

JSONObject request = new JSONObject();
request.put("NeedUpDateFields", Arrays.asList("FDescription", "FQualifiedQty", "FInspectQty", "FUnqualifiedQty"));
request.put("IsAutoAdjustField", true);
request.put("Model", model);

String json = request.toJSONString();
System.out.println("构建的JSON: " + json);

String result = api.save("QM_InspectBill", json);
System.out.println(result);


}




public viod updateDocument(Fbill updateFbill) throws Exception {
var api = new K3CloudApi();

Fbill fbill = new Fbill();
fbill.setFid(updateFbill.getFid());
List<Fbill> fbills = fbillMapper.selectFbillList(fbill);

if (fbills.isEmpty()) {
return ;
}

StringBuilder entityBuilder = new StringBuilder();
for (int i = 0; i < fbills.size(); i++) {
Fbill bill = fbills.get(i);

StringBuilder policyDetailBuilder = new StringBuilder();
if (bill.getfEntityId().equals(updateFbill.getfEntityId())){
if ("0".equals(updateFbill.getfQualifiedQty())){
updateFbill.setQualifiedId(null);
}
if ("0".equals(updateFbill.getfUnqualifiedQty())){
updateFbill.setUnqualifiedId(null);
}
if (updateFbill.getQualifiedId() != null) {
policyDetailBuilder.append("{")
.append("\"FDetailID\": ").append(updateFbill.getQualifiedId()).append(", ")
.append("\"FPolicyQty\": ").append(updateFbill.getfQualifiedQty()).append(", ")
.append("\"FPolicyType\": \"1\"")
.append("},");
}
if (updateFbill.getUnqualifiedId() != null) {
policyDetailBuilder.append("{")
.append("\"FDetailID\": ").append(updateFbill.getUnqualifiedId()).append(", ")
.append("\"FPolicyQty\": ").append(updateFbill.getfUnqualifiedQty()).append(", ")
.append("\"FPolicyType\": \"2\"")
.append("},");
}
}else {
if (bill.getQualifiedId() != null) {
policyDetailBuilder.append("{")
.append("\"FDetailID\": ").append(bill.getQualifiedId()).append(", ")
.append("\"FPolicyQty\": ").append(bill.getfQualifiedQty()).append(", ")
.append("\"FPolicyType\": \"1\"")
.append("},");
}
if (bill.getUnqualifiedId() != null) {
policyDetailBuilder.append("{")
.append("\"FDetailID\": ").append(bill.getUnqualifiedId()).append(", ")
.append("\"FPolicyQty\": ").append(bill.getfUnqualifiedQty()).append(", ")
.append("\"FPolicyType\": \"2\"")
.append("},");
}
}


// 移除最后一个逗号
if (policyDetailBuilder.length() > 0 && policyDetailBuilder.charAt(policyDetailBuilder.length() - 1) == ',') {
policyDetailBuilder.setLength(policyDetailBuilder.length() - 1);
}

entityBuilder.append("{")
.append("\"FEntryID\": ").append(bill.getfEntityId()).append(", ")
.append("\"FPolicyDetail\": [").append(policyDetailBuilder).append("]")
.append("}");

if (i != fbills.size() - 1) {
entityBuilder.append(",");
}
}

// 拼接最终 JSON
String json = "{" +
"\"NeedUpDateFields\": [\"FDescription\", \"FQualifiedQty\", \"FPolicyQty\"]," +
"\"IsAutoAdjustField\": true," +
"\"Model\": {" +
"\"FID\": " + updateFbill.getFid() + "," +
"\"FDescription\": \"" + updateFbill.getfDescription() + "\"," +
"\"FEntity\": [" + entityBuilder + "]" +
"}" +
"}";

System.out.println("最终构建JSON: " + json);

String result = api.save("QM_InspectBill", json);
System.out.println("第一次调用结果: " + result);


}