金蝶EAS OpenAPI 开发说明文档
目录
- 一、通用说明
- [二、费用报销模块 OpenAPI](#二、费用报销模块 OpenAPI)
- [2.1 接口概述](#2.1 接口概述)
- [2.2 单据导入接口(cpbcOpenAPI_importBill)](#2.2 单据导入接口(cpbcOpenAPI_importBill))
- [2.3 数据类型格式说明](#2.3 数据类型格式说明)
- [2.4 二开扩展](#2.4 二开扩展)
- [2.5 接口调用方式](#2.5 接口调用方式)
- [2.6 OpenAPI 常见问题](#2.6 OpenAPI 常见问题)
- [2.7 测试接口](#2.7 测试接口)
- [三、供应链模块 OpenAPI](#三、供应链模块 OpenAPI)
- [3.1 接口概述](#3.1 接口概述)
- [3.2 支持的版本](#3.2 支持的版本)
- [3.3 接口部署](#3.3 接口部署)
- [3.4 接口请求示例](#3.4 接口请求示例)
- [3.5 导入动态新增的属性](#3.5 导入动态新增的属性)
- [3.6 二次开发导入新单据](#3.6 二次开发导入新单据)
- [3.7 数据类型格式说明](#3.7 数据类型格式说明)
- [3.8 单据导入接口(SCMWebServiceFacade-importBill)](#3.8 单据导入接口(SCMWebServiceFacade-importBill))
- [3.9 即时库存查询接口(InventoryListServiceFacade-getData)](#3.9 即时库存查询接口(InventoryListServiceFacade-getData))
- [3.10 仓库导入接口(WarehouseWebServiceFacade-importData)](#3.10 仓库导入接口(WarehouseWebServiceFacade-importData))
- [四、基础资料导入导出接口(ORMRPC WebService)](#四、基础资料导入导出接口(ORMRPC WebService))
- [4.1 物料相关接口](#4.1 物料相关接口)
- [4.2 客户相关接口](#4.2 客户相关接口)
- [4.3 供应商相关接口](#4.3 供应商相关接口)
- [4.4 国家/地区/省份接口](#4.4 国家/地区/省份接口)
- [4.5 会计科目相关接口](#4.5 会计科目相关接口)
- [4.6 人员与HR组织接口](#4.6 人员与HR组织接口)
- [4.7 组织架构接口](#4.7 组织架构接口)
- [4.8 资产类别接口](#4.8 资产类别接口)
- [五、主数据 OpenAPI(物料、客户、供应商)](#五、主数据 OpenAPI(物料、客户、供应商))
- [5.1 物料模块](#5.1 物料模块)
- [5.2 客户模块](#5.2 客户模块)
- [5.3 供应商模块](#5.3 供应商模块)
- [六、ORMapping 概念与使用](#六、ORMapping 概念与使用)
- [6.1 ORM 概念](#6.1 ORM 概念)
- [6.2 为什么使用 ORM](#6.2 为什么使用 ORM)
- [6.3 ORMapping 职责](#6.3 ORMapping 职责)
- [6.4 ORMapping 主要接口方法](#6.4 ORMapping 主要接口方法)
- [6.5 ORMapping 结构组成](#6.5 ORMapping 结构组成)
- [6.6 ORMapping 与外界交互方式](#6.6 ORMapping 与外界交互方式)
- [6.7 ORMapping 的处理策略](#6.7 ORMapping 的处理策略)
- [6.8 典型持久过程示例](#6.8 典型持久过程示例)
- 七、数据库操作
- [7.1 服务端 SQL 执行](#7.1 服务端 SQL 执行)
- [7.2 客户端 SQL 执行](#7.2 客户端 SQL 执行)
- [八、第三方系统单点登录到 EAS](#八、第三方系统单点登录到 EAS)
- [8.1 修改配置文件](#8.1 修改配置文件)
- [8.2 获取 Ltpa Token](#8.2 获取 Ltpa Token)
- [8.3 单点登录到 EAS](#8.3 单点登录到 EAS)
- [8.4 FAQ](#8.4 FAQ)
- 九、基类继承体系
- [9.1 总体架构设计](#9.1 总体架构设计)
- [9.2 业务对象层继承体系](#9.2 业务对象层继承体系)
- [9.3 服务端对象继承体系](#9.3 服务端对象继承体系)
- [9.4 客户端 UI 层继承体系](#9.4 客户端 UI 层继承体系)
一、通用说明
本文档汇集了金蝶 EAS 二次开发中常用的 OpenAPI 接口、基础资料导入导出、ORMapping 持久化、数据库操作、单点登录以及基类继承体系等内容,供开发人员参考。
二、费用报销模块 OpenAPI
2.1 接口概述
- 适用版本 :EAS 8.5.0 及以上版本(需更新相应补丁)
- 8.5 需更新补丁 PT151074
- 8.6.1 需更新补丁 PT155366
- 功能:支持费用报销模块的单据导入,可导入通过 DEP/BIM 工具动态新增的属性。
2.2 单据导入接口(cpbcOpenAPI_importBill)
接口描述
导入费用报销相关单据。
接口 URL
http://ip:port/easportal/openapi/api?token=?
接口 API 名称
cpbcOpenAPI_importBill
参数说明
| 参数 | 类型 | 含义 |
|---|---|---|
| bosType | String | 单据的 bostype,如费用报销单:4A44F49F。支持单据:费用申请单(E76173AD)、出差申请单(DE853384)、借款单(8110AAB2)、出差借款单(7AE53B38)、费用报销单(4A44F49F)、差旅报销单(C57003BC)、对公报销单(92F938DD)、物品采购报销单(30BD2798)。 |
| data | String | 单据对象数组的 JSON 字符串。需传入单据唯一标识字段(如第三方系统编码),并添加数据库唯一索引防重。 |
| params | String | 参数对象,必须包含属性 actionType,可选值为 submit / save。 |
请求 body 示例
json
{
"api": "cpbcOpenAPI_importBill",
"data": ["4A44F49F", [{"bosType":"4A44F49F","entries":[]}], {"actionType":"submit"}]
}
返回值示例
json
{
"status": 0,
"msg": "信息",
"billErrors": [
{"id": "", "number": "", "errorMsgs": ["", ""]}
]
}
status:0-全部成功,1-全部失败,2-部分成功billErrors:失败单据的错误信息
2.3 数据类型格式说明
| 数据类型 | 说明 | 格式要求 |
|---|---|---|
| ID | 最大 44 位字符串 | "id":"A093893DF" |
| 数值 | 小数值,金额最多 2 位小数 | "amount":23.95 |
| 整数 | 整数值 | "year":2013 |
| 日期 | yyyy-mm-dd | "bizDate":"2013-06-19" |
| 时间 | yyyy-mm-dd HH:MM:SS | "createTime":"2013-06-19 14:58:23" |
| 字符串 | 字符串 | "name":"nokia 手机" |
| 枚举 | 枚举项 | "status":2 |
| 基础数据 | EAS 基础资料,传入编码 | "applier":{"number":"ellen"} |
| 布尔型 | true/false | "isTax":true |
注意:单据模型可通过 DEP 扩展平台或 BOS 开发工具查看。
2.4 二开扩展
- DEP 扩展字段直接加入 data 数据模型中即可自动保存。
- 如需自定义导入处理类,修改
com/kingdee/eas/cp/bc/app/cpbcImporterConfig.properties文件,指定 bostype 对应的处理类(继承自AbstractDefaultImporter或各单据的具体导入实现类)。
2.5 接口调用方式
5.1 HTTP 调用
登录获取 token
-
普通用户密码方式:
http://127.0.0.1:6888/easportal/openapi/login?authPattern=BaseDB&dcName=EAS850BETA3&isEncodePwd=0&language=l2&password=&user=zqtest返回格式:
json{ "data": "{\"token\":\"...\"}", "errCode": 0, "errMsg": "执行成功" } -
LtpaToken 免密码方式(需先生成 LtpaToken):
http://localhost:6888/easportal/openapi/login?user=zj001&dcName=EAS850BETA3&language=l2&password=AAECAz...&authPattern=BaseTrdLtpaToken
调用 API
http://ip:port/easportal/openapi/api?token=xxx
请求 body 同 2.2 节示例。
5.2 Java 程序内调用
java
String ip = "172.17.6.176";
int port = 8080;
String userName = "zj003";
String password = "";
String dcName = "EAS860NEW";
String language = "l2";
EASLoginContext loginCtx = new EASLoginContext.Builder(ip, port,
new CommonLogin.Builder(userName, password, dcName, language)
//.appid("test")
.build())
.https(false)
.build();
OpenApiInfo info = new OpenApiInfo();
info.setApi("cpbcOpenAPI_importBill");
info.setData(data); // data 为符合格式的字符串
OpenApi openApi = OpenApiFactory.getService(loginCtx);
String result = openApi.invoke(info);
依赖包:openapi-server.jar、log4j-1.2.15.jar、fastjson-1.2.58.jar。
2.6 OpenAPI 常见问题
- 参考金蝶云社区文章:OpenAPI用户手册 和 OpenAPI常见问题。
2.7 测试接口
可使用 Postman 测试:
- 获取 token(需加 appid 参数)。
- 调用 API 接口。
三、供应链模块 OpenAPI
3.1 接口概述
- 适用于 EAS 8.5 及以上版本。
- 支持 18 种供应链单据导入:采购申请、采购订单、销售订单、调拨订单、库存调拨单、采购入库、销售出库、其他入库、其他出库、应收单、应付单、采购收货单、生产入库单、调拨入库单、领料申请单、领料出库单、调拨出库单、发货通知单。
- 支持 DEP/BIM 动态新增属性,支持二次开发导入新单据。
3.2 支持的版本
EAS 8.5 及以上版本。
3.3 接口部署
需在 Web 端配置 OpenApi 引入:集成管理 → 接口服务 → OpenApi 管理,确保接口引入服务已启用且配置状态为"提交"。
3.4 接口请求示例
java
public static void invokeByHttp() throws BizException, LoginException, InvokeNetworkException {
String ip = "127.0.0.1";
int port = 6888;
String userName = "zqtest";
String password = "";
String dcName = "EAS860SP1";
String language = "l2";
EASLoginContext loginCtx = new EASLoginContext.Builder(ip, port,
new CommonLogin.Builder(userName, password, dcName, language).build())
.https(false).build();
OpenApiInfo info = new OpenApiInfo();
info.setApi("SCMWebServiceFacade-importBill");
JSONArray array = new JSONArray();
array.add("010"); // 单据类型编码
array.add("引入单据json"); // JSON 数组
array.add(1); // 引入状态(审核态)
info.setData(array.toJSONString());
OpenApi openApi = OpenApiFactory.getService(loginCtx);
String result = openApi.invoke(info);
System.out.println(result);
}
3.5 导入动态新增的属性
在标准 JSON 中直接添加属性即可,例如:
json
"totalPrice": 23.0900,
"parentMaterial": {"number": "2003099N909"}
3.6 二次开发导入新单据
- 在类路径
com/kingdee/eas/scm/ws下增加WSimportclasses_l1.properties文件。 - 开发新单据导入类,实现接口
com.kingdee.eas.scm.ws.app.importbill.IBillSupport。 - 注册格式:
单据类型=Class,如10000=com.kingdee.eas.wg.manufactureOrderSupport(单据类型从 10000 开始)。
3.7 数据类型格式说明
| 数据类型 | 说明 | 格式要求 |
|---|---|---|
| ID | 最大44位字符串 | "id":"A093893DF" |
| 数值 | 金额4位小数,数量/单价8位 | "qty":23.9099 |
| 整数 | "year":2013 |
|
| 日期 | yyyy-mm-dd | "bizDate":"2013-06-19" |
| 时间 | yyyy-mm-dd HH:MM:SS | "createTime":"2013-06-19 14:58:23" |
| 字符串 | "name":"nokia 手机" |
|
| 枚举 | "status":2 |
|
| 基础数据 | 传入编码 | "material":{"number":"W002893"} |
| 布尔型 | true/false | "isTax":true |
| 数组 | "orgs":["a","b"] |
3.8 单据导入接口(SCMWebServiceFacade-importBill)
API 配置
- 编码:
SCMWebServiceFacade-importBill - 方法:
String importBill(String billType, String billDataJSON, int billStatus)
请求参数
billType:单据类型编码(详见下表)billDataJSON:JSON 格式的多个单据对象,如[ {单据1}, {单据2} ]billStatus:导入状态(1-保存态,2-提交态,3-审核态)
| 单据类型 | 编码 | 保存态支持 | 提交态支持 | 审核态支持 |
|---|---|---|---|---|
| 采购申请单 | 001 | EAS750+ | Cloud880+ | Cloud880+ |
| 采购订单 | 002 | EAS750+ | Cloud880+ | Cloud880+ |
| 销售订单 | 003 | EAS750+ | Cloud880+ | Cloud880+ |
| 调拨订单 | 004 | EAS750+ | Cloud880+ | Cloud880+ |
| 库存调拨单 | 005 | EAS750+ | Cloud880+ | Cloud880+ |
| 采购入库 | 006 | EAS750+ | Cloud880+ | Cloud880+ |
| 销售出库 | 007 | EAS750+ | Cloud880+ | Cloud880+ |
| 其他入库 | 008 | EAS750+ | Cloud880+ | Cloud880+ |
| 其他出库 | 009 | EAS750+ | Cloud880+ | Cloud880+ |
| 应收单 | 010 | EAS750+ | Cloud880+ | Cloud880+ |
| 应付单 | 011 | EAS750+ | Cloud880+ | Cloud880+ |
| 采购收货单 | 012 | EAS850+ | Cloud880+ | Cloud880+ |
| 生产入库单 | 013 | EAS850+ | Cloud880+ | Cloud880+ |
| 调拨入库单 | 014 | EAS850+ | Cloud880+ | Cloud880+ |
| 领料申请单 | 015 | EAS850+ | Cloud880+ | Cloud880+ |
| 领料出库单 | 016 | EAS850+ | Cloud880+ | Cloud880+ |
| 调拨出库单 | 017 | EAS850+ | Cloud880+ | Cloud880+ |
| 发货通知单 | 018 | EAS850+ | Cloud880+ | Cloud880+ |
| 采购合同 | 019 | EAS850+ | Cloud880+ | Cloud880+ |
| 要货申请单 | 023 | Cloud880+ | Cloud880+ | Cloud880+ |
| 付款申请单 | 025 | Cloud880+ | X | X |
| 付款单 | 026 | Cloud880+ | X | X |
| 收款单 | 027 | Cloud880+ | X | X |
响应参数
json
{
"status": 0,
"msg": "信息",
"billErrors": [{"id": "", "number": "", "errorMsgs": ["", ""]}, ...]
}
单据字段说明(示例,详细字段列表见原文档)
- 001采购申请单 :头字段包括
number、bizDate、bizType、companyOrgUnit、person等;分录字段包括material、unit、qty、price等。 - 其他单据字段列表过于庞大,此处略,具体可参考原文档中按单据类型列出的详细表格。
3.9 即时库存查询接口(InventoryListServiceFacade-getData)
API 配置
- 编码:
InventoryListServiceFacade-getData - 方法:
String getData(String reqJSON)
请求参数(JSON)
json
{
"start": 0,
"len": 50,
"storageOrgs": ["A", "B"],
"warehouses": ["WH001"],
"materialNumFrom": "001",
"materialNumTo": "999",
...
}
参数说明见原文档。
响应参数
json
{
"list": [{}],
"status": 0,
"msg": null,
"count": 1000
}
3.10 仓库导入接口(WarehouseWebServiceFacade-importData)
API 配置
- 编码:
WarehouseWebServiceFacade-importData - 方法:
String importData(String dataJSON)
请求参数(JSON数组)
json
[{
"storageOrg": "001",
"number": "WH001",
"name": "成品仓",
"region": "CN",
"transState": 1,
"hasLocation": true,
...
}]
响应参数(同导入接口)
四、基础资料导入导出接口(ORMRPC WebService)
本节介绍通过 ORMRPC WebService 导入导出基础资料的方法,包括物料、客户、供应商、国家、地区、会计科目等。接口 URL 一般为 http://ip:port/ormrpc/services,可在浏览器查看所有发布的服务。
4.1 物料相关接口
导入物料分类
- 方法 :
importMaterialGroupData(String xmlData) - Bostype :
C79FC042(物料分类) - XML 结构示例:
xml
<DataInfo bostype="C79FC042" op="4">
<DataHead>
<creator>user</creator>
<createTime>2012-06-11 09:28:46</createTime>
<CU>01</CU>
<number>group01</number>
<name>物料分类01</name>
<description>物料分类01</description>
<groupStandard>BaseGroupStandard</groupStandard>
<deletedStatus>1</deletedStatus>
<IsSynchronous>1</IsSynchronous>
</DataHead>
</DataInfo>
- op:0-修改,1-启用,2-停用,3-保存,4-提交
- 返回 XML :包含
retstatus和errorMessages。
导入物料
- 方法 :
importMaterialData(String xmlData) - Bostype :
4409E7F0 - XML 结构:
xml
<DataInfo bostype="4409E7F0" op="4">
<DataHead>
<creator>user</creator>
<createTime>2020-10-29 16:28:46</createTime>
<CU>01</CU>
<number>MAT001</number>
<name>物料001</name>
<model>M-001</model>
<baseUnit>PCS</baseUnit>
<status>1</status>
<materialGroup>group01</materialGroup>
</DataHead>
<DataEntries>
<entry>
<materialGroupStandard>BaseGroupStandard</materialGroupStandard>
<materialGroup>group01</materialGroup>
</entry>
</DataEntries>
</DataInfo>
分配物料
- 方法 :
assignMaterial(String xmlData)
xml
<AssignData>
<AssignHead>
<sourceCU>01</sourceCU>
<dataNumber>MAT001</dataNumber>
</AssignHead>
<AssignCUS>
<AssignCU><cuNumber>0001</cuNumber></AssignCU>
</AssignCUS>
</AssignData>
导出物料分类/物料
- 方法 :
exportMaterialGroupData(int start, int rows)/exportMaterialData(int start, int rows) - 返回 List 包含 XML 数据。
4.2 客户相关接口
导入客户分类
- 方法 :
importCustomerGroupData(String xmlData) - Bostype :
7A2569A2 - XML 结构类似物料分类。
导入客户
- 方法 :
importCustomerData(String xmlData) - Bostype :
BF0C040E - 示例:
xml
<DataInfo bostype="BF0C040E" op="4">
<DataHead>
<creator>user</creator>
<name>客户001</name>
<number>C001</number>
<usedStatus>0</usedStatus>
<CU>01</CU>
<browseGroup>group01</browseGroup>
<isInternalCompany>0</isInternalCompany>
</DataHead>
<DataEntries>
<entry>
<customerGroupStandard>customerGroupStandard</customerGroupStandard>
<customerGroup>group01</customerGroup>
</entry>
</DataEntries>
</DataInfo>
导入客户财务资料
- 方法 :
importCustomerCompanyData(String xmlData) - Bostype :
7751B8D7
导入客户销售资料
- 方法 :
importCustomerSaleData(String xmlData) - Bostype :
26C00F09
分配客户
- 方法 :
assignCustomer(String xmlData),格式同分配物料。
导出客户分类/客户
exportCustomerGroupData/exportCustomerData
4.3 供应商相关接口
导入供应商分类
- 方法 :
importSupplierGroupData(String xmlData) - Bostype :
7A2569A2(同客户分类?需注意实际可能不同,原文档供应商分类也为 7A2569A2,但一般供应商分类有单独 bostype,此处可能是复制粘贴错误,实际应以元数据为准,通常供应商分类 Bostype 为...,但原文档多处混用,请在实际开发中查阅元数据。)
导入供应商
- 方法 :
importSupplierData(String xmlData) - Bostype :
37C67DFC
导入供应商财务资料
- 方法 :
importSupplierCompanyData(String xmlData) - Bostype :
F26C0EC7
导入供应商采购资料
- 方法 :
importSupplierPurchaseData(String xmlData) - Bostype :
9920F4D3
分配供应商
- 方法 :
assignSupplier(String xmlData)
导出供应商分类/供应商
exportSupplierGroupData/exportSupplierData
4.4 国家/地区/省份接口
国家
- 导入:
importCountryData(String xmlData),Bostype2665126B - 导出:
exportCountryData(int start, int rows)
地区
- 导入:
importAreaData(String xmlData),Bostype0C5D0DD8 - 导出:
exportAreaData(int start, int rows)
省份
- 导入:
importProvinceData(String xmlData),Bostype818DCAFB - 导出:
exportProvinceData(int start, int rows)
4.5 会计科目相关接口
导入会计科目
- 方法 :
importAccountViewData(String xmlData) - Bostype :
9DA99826
导入科目表
- 方法 :
importAccountTableData(String xmlData) - Bostype :
17698E6D
导出会计科目/科目表
exportAccountViewData/exportAccountTableData
4.6 人员与HR组织接口
导入人员
- 方法 :
importPersonData(String xmlData) - Bostype :
80EF7DED
导入 HR 组织
- 方法 :
importHrOrgData(String xmlData) - Bostype :
58B332D9
导出人员/HR组织
exportPersonData/exportHrOrgData
4.7 组织架构接口
- 导入 :
importFullOrgData(String xmlData),BostypeCCE7AED4 - 导出 :
exportFullOrgData(int start, int rows)
4.8 资产类别接口
- 导入 :
importFaCatData(String xmlData),BostypeC542D428 - 导出 :
exportFaCatData(int start, int rows)
五、主数据 OpenAPI(物料、客户、供应商)
本节内容与上一节有重叠,但属于单独整理的 OpenAPI 标准文档,此处按模块简要汇总,详细参数可参考原 PDF。
5.1 物料模块
- 导入物料分类 :
ImportMaterialGroupFacade-importMaterialGroupData(对应 ORMRPC 的importMaterialGroupData) - 导入物料 :
ImportMaterialFacade-importMaterialData - 分配物料 :
AssignMaterialFacade-assignMaterial
5.2 客户模块
- 导入客户分类 :
ImportCustomerGroupFacade-importCustomerGroupData - 导入客户 :
ImportCustomerFacade-importCustomerData - 导入客户财务资料 :
ImportCustomerCompanyFacade-importCustomerCompanyData - 导入客户销售资料 :
ImportCustomerSaleFacade-importCustomerSaleData - 分配客户 :
AssignCustomerFacade-assignCustomer
5.3 供应商模块
- 导入供应商分类 :
ImportSupplierGroupFacade-importSupplierGroupData - 导入供应商 :
ImportSupplierFacade-importSupplierData - 导入供应商财务资料 :
ImportSupplierCompanyFacade-importSupplierCompanyData - 导入供应商采购资料 :
ImportSupplierPurchaseFacade-importSupplierPurchaseData - 分配供应商 :
AssignSupplierFacade-assignSupplier
注意:850 版本需补丁 PT157152,861 版本需补丁 PT158529。
六、ORMapping 概念与使用
6.1 ORM 概念
ORM(Object Relational Mapping)将关系数据库中的数据映射为对象,使开发人员能以面向对象的方式操作数据库。
6.2 为什么使用 ORM
- 提高开发效率,降低学习成本。
- 简化代码,减少 Bug。
- 通过缓存提高性能。
- 隔离数据源,方便切换数据库。
6.3 ORMapping 职责
- 持久化对象数据到数据源。
- 从数据源获取数据组装对象。
- 屏蔽直接数据源操作。
- 提供校验、计算、多语言处理。
6.4 ORMapping 主要接口方法
接口类:com.kingdee.bos.dao.ormapping.IORMappingDAO
实现类:com.kingdee.bos.dao.ormapping.ORMappingDAO
主要方法:
getInstance:获取接口对象getValue:获取单个业务对象getCollection:获取业务对象集合getPKList:获取主键集合getCount:获取满足条件的数据条数update:更新业务对象updatePartial:指定字段更新updateBatch:批量更新delete:删除addnew:新增accept:验证权限exists:验证数据是否存在
6.5 ORMapping 结构组成
ORMapping 通过元数据将业务层数据转换为 KSQL,再转换为 SQL 执行。主要组件:
Context:上下文EntityObjectInfo:元信息描述Connection:数据库连接ObjectValue:值对象EntityViewInfo:包含查询条件、排序、选择字段等
6.6 ORMapping 与外界交互方式
- 传入
Context、EntityObjectInfo、Connection、ObjectValue、EntityViewInfo、IObjectPK。 - 输出
ObjectValue或ObjectValueCollection。
6.7 ORMapping 的处理策略
实体关系的映射
- 继承:支持实继承(共用表或扩展表)、虚继承(一条继承链一张表)。
- 关联:右对象不依赖左对象存在,按需装载。
- 组合:右对象依赖左对象,生命周期一致,同时持久化。
多语言处理
多语言信息在表的列中标记,实体属性不感知。
新增/修改/删除/查询
- 新增:根据依赖关系顺序新增主实体和组合子实体。
- 修改:先更新主实体,再更新组合子实体。
- 删除:从底层组合子实体开始逐层删除。
- 查询:按需查询,默认装载主实体自有属性和组合子对象,关联对象只装一层 ID。
6.8 典型持久过程示例
以 Order 类为例,通过 OrderFactory.getRemoteInstance().addNew(orderInfo) 新增订单。过程:
- 分析 Order 元数据。
- 构造
EntityAccess对象,包含字段值映射。 - 构建 SQL 并执行。
七、数据库操作
EAS 中推荐使用 KSQL,但特殊情况下可使用方言 SQL(加 /*dialect*/ 标记)。
7.1 服务端 SQL 执行
查询
java
// 非参数化
IRowSet rs = com.kingdee.eas.util.app.DbUtil.executeQuery(ctx, sql);
// 分页
IRowSet rs = DbUtil.executeQuery(ctx, sql, start, rows);
// 参数化
IRowSet rs = DbUtil.executeQuery(ctx, sql, params);
增删改
java
// 非参数化
DbUtil.execute(ctx, sql);
// 参数化
DbUtil.execute(ctx, sql, params);
// 批量参数化
DbUtil.executeBatch(ctx, sql, paramsList); // paramsList: List<Object[]>
临时表
java
TempTablePool pool = TempTablePool.getInstance(ctx);
String realTableName = pool.createTempTable(createSQL, oldTableName, oldConstraint);
// 使用 realTableName 操作临时表
pool.releaseTable(realTableName);
7.2 客户端 SQL 执行
客户端需通过 FMIsqlFacade 执行 SQL(服务端提供相应 EJB 服务)。
java
FMIsqlFacade fmisqlFacade = FMIsqlFacadeFactory.getRemoteInstance();
// 查询
IRowSet rs = fmisqlFacade.executeQuery(sql, params);
// 增删改
fmisqlFacade.executeSql(sql, params);
八、第三方系统单点登录到 EAS
8.1 修改配置文件
- ssoClient.properties :
sso.easIsSSOClient=true - autoLoginConfig.properties :
Datacenter:数据中心代码authPattern=BaseTrdLtpaTokenlocale:L1-英文,L2-简体,L3-繁体dbType:0-MS SQL,1-DB2,2-Oracle
- LtpaToken.properties :设置
token.expiration(分钟)和domino.secret(密钥,需与第三方系统一致),文件需在 EAS 和第三方系统中各保存一份。
8.2 获取 Ltpa Token
Java 系统
引入 kingdee_Ltpa.jar 和 LtpaToken.properties,调用:
java
String token = LtpaTokenManager.generate(username, filePath).toString();
非 Java 系统
可通过调用 Java 程序生成 token,或编写中间件。注意安全:获取用户名和生成 token 应在同一接口内完成,避免传递用户名风险。
8.3 单点登录到 EAS
URL 格式:
http://EAS_IP:port/easportal/openapi/login?username=xxx&password=xxx&redirectTo=//
username:用户名password:生成的 LtpaTokenredirectTo:登录成功后跳转地址,//表示首页,也可以是其他编码后的 URL。
若需直接打开指定页面(80 以后版本),需在门户管理中设置菜单编码(以 C- 开头),redirectTo 设为 openpage?num=C-ABC。
8.4 FAQ
- 中文用户名:需对用户名进行 URL 编码。
- 非 Java 系统安全性:不建议直接传递用户名到中转页面,存在安全风险。
- 退出登录跳转 :
- 登录 portal:修改
portal.war/res/js/core/jPortal.core.manager.js中的退出地址。 - 登录 easportal:修改
cp_web.war/logout.jsp。
- 登录 portal:修改
九、基类继承体系
9.1 总体架构设计
EAS 应用框架分为五层:
- 表现层(UI)
- ORM-RPC 协议层(远程调用)
- 业务逻辑层(EJB)
- 持久对象层(ORMapping)
- 数据层(数据库)
9.2 业务对象层继承体系
业务对象类体系
| 类 | 说明 |
|---|---|
| CoreBase | 所有业务对象超类,含 ID |
| ├─ ObjectBase | 普通业务对象 |
| ├─ DataBase | 基础资料类 |
| ├─ TreeBase | 层次数据类(自动维护 level、longNumber) |
| ├─ CoreBillBase | 单据头超类 |
| ├─ BillBase | 财务类单据头 |
| ├─ CoreBillEntryBase | 单据体超类 |
| ├─ BillEntryBase | 财务类单据体 |
核心类职责
- CoreBase:提供 ID 属性及 addNew、update、submit、save、cancel 等方法。
- ObjectBase:增加 CU、creator、createTime、lastUpdateUser、lastUpdateTime。
- DataBase:增加 name、number、description、simpleName,并提供名称/编码查重方法。
- TreeBase:增加 isLeaf、level、longNumber、displayName,提供父子节点维护方法(需子类定义 parent 关联)。
- CoreBillBase:增加 number、handleTime、handler、description、hasEffected、auditor 等,提供审核、冻结、结清、生成凭证等方法。
- BillBase:增加 company(财务组织)。
9.3 服务端对象继承体系
值对象接口/类
IPropertyContainer/PropertyContainer:属性容器IObjectValue/AbstractBaseObjectValue:值对象基类CoreBaseInfo:带 ID 的值对象
ORM 对象接口/类
IORMModel/ORMObject:ORM-RPC 基类IBOSObject/AbstractBOSObject:BOS 运行引擎接口IBizCtrl/AbstractBizCtrl:EJB 调用接口ICoreBase/CoreBase:业务 ORM 对象父类
EJB 组件对象接口/类
SessionBean:无状态会话 BeanAbstractBizControllerBean:会话 Bean 基础实现AbstractEntityControllerBean:ORMapping DAO 封装CoreBaseController/AbstractCoreBaseControllerBean:具体业务 EJB 父类
9.4 客户端 UI 层继承体系
UI 类体系
| 类 | 说明 |
|---|---|
| CoreUI | UI 最高超类,继承 KDPanel |
| ├─ ListUI | 序时簿类 UI,支持通用过滤 |
| │ ├─ CoreBillListUI | 单据序时簿 |
| │ ├─ BillListUI | 财务单据序时簿 |
| │ ├─ TreeListUI | 层次数据序时簿(树+表格) |
| │ ├─ ComboTreeListUI | 带拥有者的层次数据序时簿 |
| │ ├─ TreeDetailListUI | 带分类的层次数据序时簿 |
| │ └─ ComboTreeDetailListUI | 带拥有者和分类的层次数据序时簿 |
| ├─ EditUI | 编辑类 UI |
| ├─ BillEditUI | 单据编辑类 UI |
常用方法(以 ListUI 为例)
getEditUIName():指定关联的编辑 UI 类名。getBizInterface():获取业务接口。getLocateNames():返回可定位的列名。prepareUIContext():向 EditUI 传递参数。getEditUIModal():指定编辑 UI 打开方式(Dialog/Window)。
树形构造
ITreeBuilder接口定义树的构建,LNTreeBuilder是基于长编码的实现。ILNTreeNodeCtrl接口用于获取子节点数据,默认实现DefaultLNTreeNodeCtrl根据 longNumber 过滤。
编辑类 UI 方法
createNewData():新建业务对象并设初值。getBizInterface():获取业务接口。verifyInput():校验输入。loadFields()/storeFields():数据绑定。createNewDetailData():新建单据行(用于 BillEditUI)。afterAddLine()/afterRemoveLine()/afterSelectLine():分录操作后回调。