泛微E9二次开发,对接金蝶云星空
泛微E9二次开发,对接金蝶云星空,可以同步采购订单,付款申请单,收料通知单等等:
泛微E9二次开发,对接金蝶云星空,数据同步,表单同步。超详细,需要的jar包文档,可以在我的主页找到资源下载。
一、搭建开发环境,引入相关依赖
可以按照此链接步骤操作:ecology后端开发环境搭建
一、创建项目
1、新建项目:File->New->Project
2、选择java项目
3、下一步:Next
4、继续下一步:Next,并输入项目名字之后点击Finish
二、配置javaSDK
ecology开发推荐使用idea
1、进入项目设置File-Project Structure
2、点击SDKs->+,添加jdk1.8(e9依赖的版本)
3、点击project,分别选择Project SDK为1.8、、Project language level为SDK default 8
三、配置项目依赖
1、进入项目设置:File->Project Structure
2、添加依赖库:Libaries->±>java
3、找到要调试的ecology demo环境,分别引入以下路径的包
ecology/classbean
ecology/web-inf/lib
resin4/lib
注:可以去服务器上找到相关的依赖
4、添加完之后点击Apply
四、编写测试代码
1、点击src右键->new->Package
2、右键点击包名->new->Java,注意包名带有impl层级,才可支持无侵入注解解析
3、测试代码如下:
package com.api.cs.test20200529.service.impl;
import com.weaverboot.frame.ioc.anno.classAnno.WeaIocReplaceComponent;
import com.weaverboot.frame.ioc.anno.methodAnno.WeaReplaceAfter;
import com.weaverboot.frame.ioc.anno.methodAnno.WeaReplaceBefore;
import com.weaverboot.frame.ioc.handler.replace.weaReplaceParam.impl.WeaAfterReplaceParam;
import com.weaverboot.frame.ioc.handler.replace.weaReplaceParam.impl.WeaBeforeReplaceParam;
import com.weaverboot.tools.logTools.LogTools;
@WeaIocReplaceComponent
public class Test {
@WeaReplaceBefore(value = "/api/workflow/reqlist/splitPageKey",order = 1,description = "测试拦截前置")
public void beforeTest(WeaBeforeReplaceParam weaBeforeReplaceParam){
//一顿操作
LogTools.info("before:/api/workflow/reqlist/splitPageKey");
}
@WeaReplaceAfter(value = "/api/workflow/reqlist/splitPageKey",order = 1,description = "测试拦截后置")
public String after(WeaAfterReplaceParam weaAfterReplaceParam){
String data = weaAfterReplaceParam.getData();//这个就是接口执行完的报文
LogTools.info("after:/api/workflow/reqlist/splitPageKey");
// LogTools.info(data);
return data;
}
}
五、配置编译
1、进入项目设置:File->Project Structure
2、进入Artifacts->±>JAR->Empty
3、修改Name,这里要注意的是如果要支持无侵入注解解析,jar包名称必须包含下划线前缀,类似示例的写法
4、修改jar包输出目录(output directory)到以下目录
ecology/web-inf/lib
5、添加src输出内容到jar包,点击Apply
6、选择build->Build Artifacts
7、点击build,即可完成编译
8、到系统中查看编译结果
六、resin远程debug配置
ecology开发推荐使用idea,idea版权归属:JetBrains
特别提示:调试模式禁止使用到生产系统,必须是开发环境
1、进入resin配置文件:resin4/config/resin.properties 修改jvm_args
jvm_args : -Xdebug -Xrunjdwp:transport=dt_socket,address=9081,server=y,suspend=n -Dcom.sun.management.jmxremote -Xloggc:/var/log/gc.log -Xmx1550m -Xms1550m -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+DisableExplicitGC
jvm_mode : -server
2、添加中间件连接
3、添加±>Resin->Remote远程服务,分别输入ec服务地址URL、远程Resin调试端口Port
4、选择configure,选择resin home
5、添加jar包
6、选择之前定义的Artifacts,点击Apply保存
7、如果是同一个系统内,选择
8、切换Startup/Connection,修改Debug->port为resin的远程调试端口
9、services中启动debug
10、到指定页面刷新(本示例是待办页面),成功进入断点,debug配置成功
二、开发部署
1.编写自定义方法, 必须实现 必须实现接口weaver.interfaces.workflow.action方法public String execute(RequestInfo request);
注: 写好的类需要编译为class 文件;
2.将文件上传至服务器D:\WEAVER\ecology\classbean\weaver\interfaces\workflow\action目录;
3.在后台,新增自定义接口;
3.1 接口动作类文件填写 classbean 下文件路径;
在后台 集成中心-流程流转集成, 注册自定义接口;
4.在后台 流程引擎-路径管理-路径设置, 找到对应流程,选中流程;
4.1. 在右侧 流转设置-节点信息, 点击对应节点的 节点前后附加操作按钮;
4.2 弹出窗口中, 选择 外部接口tab, 接口来源 选择 自定义创建的接口;
4.3 点击确定 保存;
5.代码更新操作
5.1 重新编译文件;
5.2 将编译后的class 文件上传至服务器对应路径;
三、代码示例
1.流程自定义接口动作(action)
一、接口说明
该接口主要实现在流程的流转当中,实时通过自定义的动作去操作异构系统的数据或者处理其他一些特定的业务,在流程的节点后、出口和节点前都可以定义这样的自定义动作。
二、实现方法&步骤
实现weaver.interfaces.workflow.action. Action接口即可
//接口定义如下:
import weaver.soa.workflow.request.RequestInfo;
public interface Action {
public static final String SUCCESS="1";
/**
* 失败信息,返回此信息,如果是节点前附加操作,将会阻止流程提交
*/
public static final String FAILURE_AND_CONTINUE = "0";
public String execute(RequestInfo request);
}
2.自定义Action Demo
代码如下(示例):
package test.service.impl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import kingdee.bos.webapi.client.K3CloudApiClient;
import weaver.general.BaseBean;
import weaver.general.Util;
import weaver.interfaces.workflow.action.Action;
import weaver.soa.workflow.request.*;
import weaver.hrm.User;
public class DemoAction implements Action {
private Log log = LogFactory.getLog(DemoAction.class.getName());
private String p1; // 自定义参数1
private String p2; // 自定义参数2
public String getP1() {
return p1;
}
public void setP1(String p1) {
this.p1 = p1;
}
public String getP2() {
return p2;
}
public void setP2(String p2) {
this.p2 = p2;
}
public Log getLog() {
return log;
}
public void setLog(Log log) {
this.log = log;
}
public String execute(RequestInfo requestinfo) {
System.out.println("进入Action requestid=" + requestinfo.getRequestid());
String requestid = requestinfo.getRequestid();// 请求ID
String requestlevel = requestinfo.getRequestlevel();// 请求紧急程度
String src = requestinfo.getRequestManager().getSrc(); // 当前操作类型 submit:提交/reject:退回
String workflowid = requestinfo.getWorkflowid();// 流程路径ID
String tablename = requestinfo.getRequestManager().getBillTableName();// 表单主表名称
int billid = requestinfo.getRequestManager().getBillid();// 表单数据ID
User usr = requestinfo.getRequestManager().getUser();// 获取当前操作用户对象
String requestname = requestinfo.getRequestManager().getRequestname();// 请求标题
String remark = requestinfo.getRequestManager().getRemark();// 当前用户提交时的签字意见
int formid = requestinfo.getRequestManager().getFormid();// 表单ID
int isbill = requestinfo.getRequestManager().getIsbill();// 是否是自定义表单
//取主表数据
Property[] properties = requestinfo.getMainTableInfo().getProperty();// 获取表单主字段信息
for (int i = 0; i < properties.length; i++) {
String name = properties[i].getName();// 主字段名称
String value = Util.null2String(properties[i].getValue());// 主字段对应的值
System.out.println(name + " " + value);
log.info(name + " " + value);
}
// 取明细数据
DetailTable[] detailtable = requestinfo.getDetailTableInfo()
.getDetailTable();// 获取所有明细表
if (detailtable.length > 0) {
for (int i = 0; i < detailtable.length; i++) {
DetailTable dt = detailtable[i];// 指定明细表
Row[] s = dt.getRow();// 当前明细表的所有数据,按行存储
for (int j = 0; j < s.length; j++) {
Row r = s[j];// 指定行
Cell c[] = r.getCell();// 每行数据再按列存储
for (int k = 0; k < c.length; k++) {
Cell c1 = c[k];// 指定列
String name = c1.getName();// 明细字段名称
String value = c1.getValue();// 明细字段的值
System.out.println(name + " " + value);
log.info(name + " " + value);
}
}
}
}
// 调用ERP接口 单元测试代码
// public static void main(String[] args) {
// String res = "";
// Boolean loginResult = false;
// K3CloudApiClient client = new K3CloudApiClient("http://119.23.xx.xx/k3cloud/");
// try {
// loginResult = client.login("612112883069f0","134xxxx0349","JG2xxxxx10",2xxx);
// res = client.view("BD_Currency","{\"CreateOrgId\":0,\"Number\":\"PRE001\"}");
// } catch (Exception e) {
// e.printStackTrace();
// }
//
// System.out.println("test202201174_1" + client);
// System.out.println("test202201174_2" + loginResult);
// System.out.println(res.getClass().getSimpleName());
// System.out.println("test202201174_3" + res);
//
// }
//控制流程流转,增加以下两行,流程不会向下流转,表单上显示返回的自定义错误信息,这个控制只支持节点后附加操作
requestinfo.getRequestManager().setMessageid("错误信息编号");//126221
requestinfo.getRequestManager().setMessagecontent("返回自定义的错误信息");
System.out.println("Action执行完成 传入参数p1=" + this.getP1() + " p2=" + this.getP2());
log.info("Action执行完成 传入参数p1=" + this.getP1() + " p2=" + this.getP2());
return SUCCESS;// return返回固定返回`SUCCESS`
// //如果E8的版本是1604,也可以使用下面的代码进行控制,支持节点后、节点前、出口,注意必须返回 FAILURE_AND_CONTINUE;
// requestinfo.getRequestManager().setMessagecontent("返回自定义的错误信息");
// return FAILURE_AND_CONTINUE;
}
}
3.采购申请单的同步
代码如下(示例):
package weaver.interfaces.workflow.action;
import com.google.gson.Gson;
import kingdee.bos.webapi.client.K3CloudApiClient;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import weaver.general.BaseBean;
import weaver.general.Util;
import weaver.soa.workflow.request.*;
import java.util.*;
/**
* QDT自定义(资产采购申请单)/(维修改造采购申请单)action接口
*/
public class ActionQDT_ZCCGSQD extends BaseBean implements Action {
@Override
public String execute(RequestInfo requestInfo) {
ActionQDT_ZCCGSQD actionQDT_zccgsqd = new ActionQDT_ZCCGSQD();
//设置初始值默认同步成功
String action = SUCCESS;
// 获取主表信息
Property[] properties = requestInfo.getMainTableInfo().getProperty();
//定义一个hashMap集合 存储主表的数据。 key存E-COS数据库字段名称 Value存E-cos字段值
HashMap<String, String> mainTable = new HashMap<>();
for (int i = 0; i < properties.length; i++) {
String name = Util.null2String(properties[i].getName());// 主字段名称
String value = Util.null2String(properties[i].getValue());// 主字段对应的值
mainTable.put(name,value);
}
//取到主表的“单据类型” //单据类型
int DocumentType = Integer.parseInt(mainTable.get("djlx"));
//0:标准资产采购申请单
//如果单据类型是 “标准资产采购申请单”
if (DocumentType==0) {
//定义list集合存储明细表json字符串
List<String> list_json1 = new ArrayList<String>();
//定义一个集合存储明细表的数据
List<Map<String,String>> detailTable1=new ArrayList<>();
// 获取所有明细表
DetailTable[] detailtable = requestInfo.getDetailTableInfo().getDetailTable();
if (detailtable.length > 0) {
//循环所有的明细表 【此单据只有一个明细表】
for (int i = 0; i < detailtable.length; i++) {
DetailTable dt = detailtable[i];// 指定明细表
Row[] s = dt.getRow();// 当前明细表的所有数据,按行存储
for (int j = 0; j < s.length; j++) {
Row r = s[j];// 指定行
Cell c[] = r.getCell();// 每行数据再按列存储
Map<String,String> map=new HashMap<>();
for (int k = 0; k < c.length; k++) {
Cell c1 = c[k];// 指定列
String name = c1.getName();// 明细字段名称
String value = c1.getValue();// 明细字段的值
map.put(name,value);
}
//把明细表的每一行数据都插入集合中
detailTable1.add(map);
}
}
}
//循环遍历明细表中的数据,将数据拼接添加到list_json1中
for (Map<String, String> detailMap : detailTable1) {
String json_main = " \n{\n" +
" \"FMaterialId\": {\n" + //物料编码(固定资产类别)
" \"FNumber\": \"" + detailMap.get("gdzclb") + "\"\n" +
" },\n" +
" \"F_RCZU_NBXMH\": {\n" + //内部项目号(从主表获取)
" \"FNumber\": \"" + mainTable.get("xmh") + "\"\n" +
" },\n" +
" \"FEntryNote\":\"" + detailMap.get("bz") + "\",\n" + //备注
" \"FMaterialDesc\":\"" + detailMap.get("zcmc") + "\",\n" + //物料说明 (资产名称)
" \"FRemarksHWMS\": \"" + detailMap.get("sbxh") + "\",\n" + //物料描述 (设备型号)
" \"F_RCZU_Text1\": \"" + detailMap.get("syr") + "\",\n" + //使用人
" \"FArrivalDate\": \"" + detailMap.get("xqrq") + "\",\n" + //到货日期(需求日期)
" \"F_RCZU_YT\": \"" + detailMap.get("yt") + "\",\n" + //用途
" \"FReqQty\":" + detailMap.get("sl") + ",\n" + //申请数量
" \"FTAXPRICE\":\"" + detailMap.get("dj") + "\"\n" + //含税单价
" }";
list_json1.add(json_main);
}
String json = "{\n" +
" \"IsAutoSubmitAndAudit\": \"true\",\n" + //是否自动提交审核
" \"NeedUpDateFields\": [],\n" + //需要更新的字段
" \"NeedReturnFields\": [],\n" + //需返回结果的字段集合
" \"IsDeleteEntry\": true,\n" + //是否删除已存在的分录
" \"SubSystemId\": \"\",\n" + //表单所在的子系统内码
" \"IsVerifyBaseDataField\": false,\n" + //是否验证所有的基础资料有效性
" \"IsEntryBatchFill\": true,\n" + //是否批量填充分录
" \"ValidateFlag\": true,\n" + //是否验证数据合法性标志
" \"NumberSearch\": true,\n" + //是否用编码搜索基础资料
" \"IsAutoAdjustField\": true,\n" + //是否自动调整JSON字段顺序
" \"InterationFlags\": \"\",\n" + //交互标志集合
" \"IgnoreInterationFlag\": \"\",\n" + //是否允许忽略交互
" \"IsControlPrecision\": false,\n" + //是否控制精度
" \"ValidateRepeatJson\": false,\n" + //校验Json数据包是否重复传入
" \"Model\":{\n" +
" \"FApplicationOrgId\":{\n" + //申请组织(所属公司)
" \"FNumber\":\"" + mainTable.get("szgs") + "\"\n" +
" },\n" +
" \"FApplicationDeptId\": {\n" + //ERP申请部门
" \"FNumber\": \"" + mainTable.get("erpsqbm") + "\"\n" +
" },\n" +
" \"FApplicationDate\":\"" + mainTable.get("zdrq") + "\",\n" + //申请日期(制单日期)
" \"F_RCZU_Base\": {\n" + //ERP使用部门
" \"FNUMBER\": \"" + mainTable.get("erpsybm") + "\"\n" +
" },\n" +
" \"F_RCZU_mindep\": {\n" + //ERP归口管理部门
" \"FNUMBER\": \"" + mainTable.get("erpgkglbm") + "\"\n" +
" },\n" +
" \"F_RCZU_Combo\": \"" + mainTable.get("cslb") + "\",\n" + //厂商类别(下拉列表)
/* " \"F_RCZU_Assistant2\": {\n" + //在建项目
" \"FNumber\": \"" + Util.null2String(properties[0].getValue()) + "\"\n" +
" },\n" +*/
" \"F_RCZU_ECOS1\": \"" + mainTable.get("lcbh") + "\",\n" + //E-COS流程编号
/* " \"F_RCZU_Base1\": {\n" + //技术负责人
" \"FSTAFFNUMBER\": \"" + Util.null2String(properties[19].getValue()) + "\"\n" +
" },\n" +*/
" \"FBillTypeID\":{\n" + //单据类型
" \"FNumber\":\"CGSQD03_SYS\"\n" +
" },\n" +
" \"FNote\":\"" + mainTable.get("ytsm") + "\",\n" + //备注(用途说明)
" \"FEntity\":" + list_json1.toString()+" \n" + //单据体
" }\n" +
"}";
action = actionQDT_zccgsqd.login_save(json);
}
//1:维修改造采购申请单
else if (DocumentType==1){
//定义list集合存储明细表json字符串
List<String> list_json1 = new ArrayList<String>();
//定义一个集合存储明细表的数据
List<Map<String,String>> detailTable1=new ArrayList<>();
// 获取所有明细表
DetailTable[] detailtable = requestInfo.getDetailTableInfo().getDetailTable();
if (detailtable.length > 0) {
//循环所有的明细表 【此单据只有一个明细表】
for (int i = 0; i < detailtable.length; i++) {
DetailTable dt = detailtable[i];// 指定明细表
Row[] s = dt.getRow();// 当前明细表的所有数据,按行存储
for (int j = 0; j < s.length; j++) {
Row r = s[j];// 指定行
Cell c[] = r.getCell();// 每行数据再按列存储
Map<String,String> map=new HashMap<>();
for (int k = 0; k < c.length; k++) {
Cell c1 = c[k];// 指定列
String name = c1.getName();// 明细字段名称
String value = c1.getValue();// 明细字段的值
map.put(name,value);
}
//把明细表的每一行数据都插入集合中
detailTable1.add(map);
}
}
}
//循环遍历明细表中的数据,将数据拼接添加到list_json1中
for (Map<String, String> detailMap : detailTable1) {
String json_main = " \n{\n" +
" \"FMaterialId\": {\n" + //物料编码(物料编码)(维修费/改造费)
" \"FNumber\": \"" + detailMap.get("wlbm") + "\"\n" +
" },\n" +
" \"F_RCZU_NBXMH\": {\n" + //内部项目号(从主表获取)
" \"FNumber\": \"" + mainTable.get("xmh") + "\"\n" +
" },\n" +
" \"FEntryNote\":\"" + detailMap.get("bz") + "\",\n" + //备注
/*
" \"FMaterialDesc\":\"" + Util.null2String(c[8].getValue()) + "\",\n" + //物料说明 (资产名称)
*/
" \"FRemarksHWMS\": \"" + detailMap.get("sbxh") + "\",\n" + //物料描述 (设备型号)
/* " \"F_RCZU_Text1\": \"" + Util.null2String(c[3].getValue()) + "\",\n" + //使用人
" \"F_RCZU_YT\": \"" + Util.null2String(c[4].getValue()) + "\",\n" + //用途*/
" \"F_RCZU_Base2\": {\n" + //卡片编码(资产编码)
" \"FNUMBER\": \"" + detailMap.get("zcbm") + "\"\n" +
" },\n"+
" \"FReqQty\":" + detailMap.get("sl") + ",\n" + //申请数量
" \"FArrivalDate\": \"" + detailMap.get("xqrq") + "\",\n" + //到货日期(需求日期)
" \"FTAXPRICE\":\"" + detailMap.get("dj") + "\"\n" + //含税单价(预估单价)
" }";
list_json1.add(json_main);
}
String json = "{\n" +
" \"IsAutoSubmitAndAudit\": \"true\",\n" + //是否自动提交审核
" \"NeedUpDateFields\": [],\n" + //需要更新的字段
" \"NeedReturnFields\": [],\n" + //需返回结果的字段集合
" \"IsDeleteEntry\": true,\n" + //是否删除已存在的分录
" \"SubSystemId\": \"\",\n" + //表单所在的子系统内码
" \"IsVerifyBaseDataField\": false,\n" + //是否验证所有的基础资料有效性
" \"IsEntryBatchFill\": true,\n" + //是否批量填充分录
" \"ValidateFlag\": true,\n" + //是否验证数据合法性标志
" \"NumberSearch\": true,\n" + //是否用编码搜索基础资料
" \"IsAutoAdjustField\": true,\n" + //是否自动调整JSON字段顺序
" \"InterationFlags\": \"\",\n" + //交互标志集合
" \"IgnoreInterationFlag\": \"\",\n" + //是否允许忽略交互
" \"IsControlPrecision\": false,\n" + //是否控制精度
" \"ValidateRepeatJson\": false,\n" + //校验Json数据包是否重复传入
" \"Model\":{\n" +
" \"FApplicationOrgId\":{\n" + //申请组织(所属公司)
" \"FNumber\":\"" + mainTable.get("szgs") + "\"\n" +
" },\n" +
" \"FApplicationDeptId\": {\n" + //ERP申请部门
" \"FNumber\": \"" + mainTable.get("erpsqbm") + "\"\n" +
" },\n" +
" \"FApplicationDate\":\"" + mainTable.get("zdrq") + "\",\n" + //申请日期(制单日期)
" \"F_RCZU_Base\": {\n" + //ERP使用部门
" \"FNUMBER\": \"" + mainTable.get("erpsybm") + "\"\n" +
" },\n" +
/* " \"FApplicantId\": {\n" + //申请人
" \"FNUMBER\": \"" + mainTable.get("") + "\"\n" +
" },\n" +*/
" \"F_RCZU_mindep\": {\n" + //ERP归口管理部门
" \"FNUMBER\": \"" + mainTable.get("erpgkglbm") + "\"\n" +
" },\n" +
/* " \"F_RCZU_Combo\": \"" + mainTable.get("") + "\",\n" + //厂商类别(下拉列表)
" \"F_RCZU_Assistant2\": {\n" + //在建项目
" \"FNumber\": \"" + mainTable.get("") + "\"\n" +
" },\n" +*/
" \"F_RCZU_ECOS1\": \"" + mainTable.get("lcbh") + "\",\n" + //E-COS流程编号
/* " \"F_RCZU_Base1\": {\n" + //技术负责人
" \"FSTAFFNUMBER\": \"" + mainTable.get("") + "\"\n" +
" },\n" +*/
" \"FBillTypeID\":{\n" + //单据类型
" \"FNumber\":\"CGSQD07_SYS\"\n" +
" },\n" +
" \"FNote\":\"" + mainTable.get("ytsm") + "\",\n" + //备注(用途说明)
" \"FEntity\":\n" + //单据体
list_json1.toString() +
" \n" +
" }\n" +
"}";
action = actionQDT_zccgsqd.login_save(json);
}
return action;
}
public String login_save(String json){
//设置初始值默认同步成功
String action;
// 日志
Log log = LogFactory.getLog(this.getClass());
//解析json字符串
Gson gson = new Gson();
// 调用ERP接口
String resultJson = "";
//初始值登录失败
Boolean loginResult = false;
//拆分后生产环境
K3CloudApiClient client = new K3CloudApiClient("http://xx.xxx.xx.xx:x/k3cloud/");
try {
loginResult = client.login("6xxxxxxxd", "账号", "密码", 2052);
// 判断登录成功就调用ERP相应方法
if (loginResult) {
//调用保存的方法 保存 付款申请单
// 具体参数和调用方法参见 https://openapi.open.kingdee.com/ApiCenterDoc
resultJson = client.save("PUR_Requisition", json);
//解析金蝶调用接口后返回的json数据
HashMap<String,Object> map = gson.fromJson(resultJson, HashMap.class);
LinkedHashMap<String,Object> sec= gson.fromJson(map.get("Result").toString(),LinkedHashMap.class) ;
LinkedHashMap<String,Object> thr=gson.fromJson(sec.get("ResponseStatus").toString(),LinkedHashMap.class) ;
Boolean isSuccess = (Boolean) thr.get("IsSuccess");
//对返回结果进行解析和校验
if (isSuccess) {
log.info("QDP采购申请单同步结果: 同步成功"+resultJson);
action = SUCCESS;
} else {
log.info("QDP采购申请单同步结果: 同步失败"+resultJson);
log.info("QDP采购申请单json数据:"+json);
action = FAILURE_AND_CONTINUE;
}
} else {
log.info("QDP采购申请单登录失败"+loginResult);
action = FAILURE_AND_CONTINUE;
}
} catch (Exception e) {
action = FAILURE_AND_CONTINUE;
log.info("QDP采购申请单同步结果: 同步失败"+resultJson);
log.info("QDP采购申请单json数据:"+json);
log.info("错误信息:" + e);
e.printStackTrace();
}
return action;
}
}
3.ERP对接
云星空文档: 金蝶API文档
或者登录管理员账号,搜索WebAPI;
3.1引入 K3CloudApiClient 包;
3.2实例化 client;
3.3执行登录动作;
3.4判断登录经过为 true , 执行余下动作;
Demo
// 查看
client.View("BD_Account","{"CreateOrgId":0,"Number":"","Id":""}");
// 保存
client.Save("BD_Account","{"NeedUpDateFields":[],"NeedReturnFields")
// 审核
client.ExcuteOperation("BD_Account","Forbid","{"CreateOrgId":0,"Numbers":[],"Ids":"","PkEntryIds":[],"NetworkCtrl":""}");
// 反审
client.UnAudit("BD_Account","{"CreateOrgId":0,"Numbers":[],"Ids":"","InterationFlags":"","NetworkCtrl":"","IsVerifyProcInst":""}");
...
更多执行参见 金蝶云星空官方文档 https://openapi.open.kingdee.com/ApiCenterDoc
或者登录管理员账号,搜索WebAPI
总结
以上就是泛微E9对接金蝶云星空的方法,同步表单,注意如果同步多张表单到金蝶ERP中,注意ERP中的表单关联关系。