核心服务
  版本: 1.0 | 发布日期: 14/8/2018
# 实体的 CRUD Web 服务
一个实体是指 aiM18 模块中的一条记录,aiM18提供了以下与实体相关的Web服务:
- 创建
 - 读取
 - 更新
 - 删除
 
# 创建实体
获取一个特定模块的空SqlEntity
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/entity/create/employee?menuCode=employee")
  .post()
  .addHeader("authorization", "Bearer MjZhZGNjMDctODVhZS00MmE0LWI3ZmEtNzRhMTQwZGZiNTY0")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
POST http://[server]/jsf/rfws/entity/create/[module]?menuCode=[menuCode]
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | String(Header) |  必填. 通过 OAuth 获取的访问令牌 | 
| client_id | String(Header) |  必填. 在aiM18 [授权应用列表]中的Client ID | 
| module | String(Path) |  必填. 模块类型,可以在数据字典里找到 | 
| menuCode | String(Query) |  必填. 菜单编号,例如‘员工’,可以在数据字典中找到 | 
| param | json String(Query) |  特殊操作的附加参数 | 
# 结果
如果 API 运行成功,响应状态码将为 200,然后它将返回一个空的 SqlEntity。 如果 API 运行失败,响应状态码将是 400,然后将返回 CheckMsg。你可以在响应头中,从关键字为 “error_info ”中获取一个 CheckMsg JSON 数组。
| 类型 | 位置 | 说明 | 
|---|---|---|
success |  Body | 一个空的SqlEntity | 
fail |  Header(error_id=1) | 采用JSON数组格式描述的多种错误 | 
fail |  Header(error_info) | 一个CheckMsg JSON 数组 | 
# 读取实体
获取特定模块的现有 SQLEntity。
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/entity/read/employee?menuCode=employee&id=1")
  .get()
  .addHeader("authorization", "Bearer MjZhZGNjMDctODVhZS00MmE0LWI3ZmEtNzRhMTQwZGZiNTY0")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
GET http://[server]/jsf/rfws/entity/read/[module]?menuCode=[menuCode]&id=[id]
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | String(Header) |  必填. 通过 OAuth 获取的访问令牌 | 
| client_id | String(Header) |  必填. 在aiM18 [授权应用列表]中的Client ID | 
| module | String(Path) |  必填. 模块类型,例如‘员工’,可以在数据字典中找到 | 
| menuCode | String(Query) |  必填. 菜单编号,例如‘员工’,可以在数据字典中找到 | 
| id | long(Query) |  必填. 实体的id | 
| param | json String(Query) |  特殊操作的附加参数 | 
| iRev | int(Query) |  如果要读取实体的旧版本,请设定此值。如果要读取一个已删除实体,请设定该实体的 id 和 iRev。 | 
# 结果
如果 API 运行成功,响应状态码将是 200,然后它将返回该模块的一个正确 SqlEntity。 如果 API 运行失败,响应状态码将是 400,然后将返回 CheckMsg。你可以在响应头中,从关键字为 “error_info ”中获取一个 CheckMsg JSON 数组。
| 类型 | 位置 | 说明 | 
|---|---|---|
success |  Body | 一个正确的SqlEntity | 
fail |  Header(error_id=1) | 采用JSON数组格式描述的多种错误 | 
fail |  Header(error_info) | 一个 CheckMsg JSON 数组 | 
# 保存实体
将 SqlEntity 保存到特定模块。
OkHttpClient client = new OkHttpClient();
MediaType jsonMT = MediaType.parse("application/json; charset=utf-8");
RequestBody rb = RequestBody.create(jsonMT, 
                 "[Simplified Entity JSON]" or "array of [Simplified Entity JSON]");
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/entity/s/save/employee?menuCode=employee")
  .put(formBody)
  .addHeader("authorization", "Bearer MjZhZGNjMDctODVhZS00MmE0LWI3ZmEtNzRhMTQwZGZiNTY0")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
PUT http://[server]/jsf/rfws/entity/s/save/[module]?menuCode=[menuCode]
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | String(Header) |  必填. 通过 OAuth 获取的访问令牌 | 
| client_id | String(Header) |  必填. 在aiM18 [授权应用列表]中的Client ID | 
| module | String(Path) |  必填. 模块类型,例如‘员工’,可以在数据字典中找到 | 
| menuCode | String(Query) |  必填. 菜单编号,例如‘员工’,可以在数据字典中找到 | 
| param | jsonString(Query) |  特殊操作的附加参数 | 
| entity | jsonString(Query) |  简化的实体 JSON,结构请参考下文。请注意,JSON需要使用 URL 编码. | 
| entitys_in_entity | String(Body) |  简化的实体 JSON,结构请参考下文。建议在请求体中传实体 JSON。如果要处理多个实体,请传一个简化的实体 JSON 数组。 | 
| autoSubmit | boolean(Query) |  是否允许自动送批,值为TRUE时自动送批 | 
| templateCode | string(Query) |  模板编号可在模块的模板对话框中找到。 | 
| footerMergeMode | string(Query) |  适用于使用了模板,且Entity数据中某个Footer不为空。默认值为"override",如果值为"override"时,以Entity数据为准,直接覆盖。值为"append"时,保留模板数据。 | 
| footerUseTemplateIfMissing | boolean(Query) |  适用于使用了模板,但传入的Entity没有某个Footer,或有该Footer但数据为空。默认值为"true",如果为true,使用模板数据。为false时,忽略模板数据。 | 
# 简化的实体JSON
{
	"employeepic": {
		"values": []
	},
	"employee_attach": {
		"values": []
	},
	"employee": {
		"values": [
          {"code": "000171","desc": "abcd"}
        ]
	}
}
- JSON 包含模块中不同表的对象,每个表都包含一个 “values ”JSON 数组,用于指定表中每个字段的值。
 - 模块的主表是必要的。关于哪个表是主表,用户可以参考数据字典。
 - 如果未提供表格或字段值,则不会保存。
 
# 结果
如果 API 运行成功,响应状态码将是 200,然后它将返回此 SqlEntity 的正确 ID。 如果 API 运行失败,响应状态码将是 400,然后将返回 CheckMsg。你可以在响应头中,从关键字为 “error_info ”中获取一个 CheckMsg JSON 数组。
| 类型 | 位置 | 说明 | 
|---|---|---|
success |  Body | 所保存的SqlEntity的ID | 
fail |  Header(error_id=1) | 采用JSON数组格式描述的多种错误 | 
fail |  Header(error_info) | 一个CheckMsg JSON 数组 | 
# 删除实体
从特定模块删除 SqlEntity。
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/entity/delete/employee?menuCode=employee&id=1")
  .delete()
  .addHeader("authorization", "Bearer MjZhZGNjMDctODVhZS00MmE0LWI3ZmEtNzRhMTQwZGZiNTY0")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
DELETE http://[server]/jsf/rfws/entity/delete/[module]?menuCode=[menuCode]&id=[id]
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | String(Header) |  必填. 通过 OAuth 获取的访问令牌 | 
| client_id | String(Header) |  必填. 在aiM18 [授权应用列表]中的Client ID | 
| module | String(Path) |  必填. 模块类型,例如‘员工’,可以在数据字典中找到 | 
| menuCode | String(Query) |  必填. 菜单编号,例如‘员工’,可以在数据字典中找到 | 
| id | long(Query) |  必填. 实体的id | 
| param | json String(Query) |  特殊操作的附加参数 | 
# 结果
如果 API 运行成功,响应状态码将是 200。 如果 API 运行失败,响应状态码将是 400,然后将返回 CheckMsg。你可以在响应头中,从关键字为 “error_info ”中获取一个 CheckMsg JSON 数组。
| 类型 | 位置 | 说明 | 
|---|---|---|
success |  Status | 状态码是 200 | 
fail |  Header(error_id=1) | 采用JSON数组格式描述的多种错误 | 
fail |  Header(error_info) | 一个CheckMsg JSON 数组 | 
# 通过编号获取ID的Web服务
通过用模块中的单据编号获取实体 ID.
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/entity/getIdByCode/employee?menuCode=employee&code=001")
  .get()
  .addHeader("authorization", "Bearer MjZhZGNjMDctODVhZS00MmE0LWI3ZmEtNzRhMTQwZGZiNTY0")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
GET http://[server]/jsf/rfws/entity/getIdByCode/[module]?menuCode=[menuCode]&code=[record code]
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | String(Header) |  必填. 通过 OAuth 获取的访问令牌 | 
| client_id | String(Header) |  必填. 在aiM18 [授权应用列表]中的Client ID | 
| module | String(Path) |  必填. 模块类型,例如‘员工’,可以在数据字典中找到 | 
| menuCode | String(Query) |  模块的菜单编号,可在数据字典中找到 | 
| code | string(Query) |  必填. 单据的编号 | 
| beId | int(Query) |  如果模块是特定BE的,则需要提供 beID。BE 在 aiM18 中指企业法人,即勾选 BE 复选框的[部门]记录。 | 
# 结果
如果 API 运行成功,响应状态码将是 200,然后会返回一个 JSON 对象。JSON 对象包括 id、withRight 和 withMulti。id 的类型是 long。withRight 和 withMulti 的类型是布尔型。withRight 为 true 时,表示当前用户可以访问此单据。withMulti 为 true 时,表示有两个或更多单据使用此编号。
如果 API 运行失败,响应状态码将是 400,然后将返回 CheckMsg。你可以在响应头中,从关键字为 “error_info ”中获取一个 CheckMsg JSON 数组。
| 类型 | 位置 | 说明 | 
|---|---|---|
success |  Body | 一个JSON 对象包括 id、withRight 和 withMulti。 | 
fail |  Header(error_id=1) | 采用JSON数组格式描述的多种错误 | 
fail |  Header(error_info) | 一个CheckMsg JSON 数组 | 
# 数据搜索Web服务
使用lookup类型在 aiM18 中搜索数据。
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/search/search?stSearch=employee&startRow=1&endRow=10")
  .get()
  .addHeader("authorization", "Bearer MjZhZGNjMDctODVhZS00MmE0LWI3ZmEtNzRhMTQwZGZiNTY0")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
GET http://[server]/jsf/rfws/search/search?stSearch=[stSearchName]&startRow=[startRow]&endRow=[endRow]
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | String(Header) |  必填. 通过 OAuth 获取的访问令牌 | 
| client_id | String(Header) |  必填. 在aiM18 [授权应用列表]中的Client ID | 
| stSearch | String(Query) |  必填. Lookup 类型,例如‘员工’,可以在数据字典或UDF Lookup中找到。 | 
| startRow | int(Query) |  搜索的起始行 | 
| endRow | int(Query) |  搜索的结束行 | 
| beId | long(Query) |  如果搜索是特定BE的,则 beId 需要填写 | 
| formatId | long(Query) |  搜索格式 ID | 
| conds | String(Query) |  请查看 条件详情 | 
| sorts | String(Query) |  排序字段,用“; ”分隔。如果不是升序,请使用“!”;示例:"code;!desc” | 
| resultFields | String(Query) |  如果要返回某些字段值,请使用此参数。 | 
| lookupField | boolean(Query) |  如果值为 true,则结果数据将是没失效、没锁定和已批准的。 | 
| quickSearchStr | String(Query) |  如果要使用快速搜索,请设定此值。 | 
| fieldDesc | boolean(Query) |  如果值为 true,将返回字段的名称和mess值。 | 
| viewDeleted | boolean(Query) |  如果要搜索已删除的数据,请设置此值为 true。 | 
# 条件详情
Conds 格式:
Id=lessThan=5=and=id=largerOrEqual=3=or=(name=contains =ss=or=name=contains=bb)
意思是:
Id<5 and id >=3 or (name like ‘%ss%’ or name like ‘%bb%’)
请使用这些格式来编写 conds:
("equal", "="),
("unequal", "<>"),
("largerThan", ">"),
("lessThan", "<"),
("largerOrEqual", ">="),
("lessOrEqual", "<="),
("contains", "like"),
("doseNotContain", "notlike"),
("in", "in"),
("notIn", "notin"),
("startWith", "like"),
("endWith", "like");
# 结果
如果 API 运行成功,响应状态码将是 200,然后会返回一个SqlTable。 如果 API 运行失败,响应状态码将是 400,然后将返回 CheckMsg。你可以在响应头中,从关键字为 “error_info ”中获取一个 CheckMsg JSON 数组。
| 类型 | 位置 | 说明 | 
|---|---|---|
success |  Body | 一个SqlTable | 
fail |  Header(error_info) | 一个CheckMsg JSON数组 | 
# 附件Web服务
# 获取附件列表
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/attach/getAttach?module=dept&stSearch=dept&code=ADMIN")
  .get()
  .addHeader("authorization", "Bearer OGFiZmU2ZTktMzYzMS00NjIwLWJhNGYtYWU2OGQyNTZhMmNi")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
GET http://127.0.0.1:8080/jsf/rfws/attach/getAttach?module=[module Name]&stSearch=[stSearch code]&code=[recod's code]
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | string(Header) |  必填. 通过 OAuth2 获取的访问令牌 | 
| client_id | string(Header) |  必填. 在[授权应用列表]中注册时,由 aiM18 生成 | 
| module | string(Query) |  必填. 目标 FM/交易单据的模块编号 | 
| code | string(Query) |  必填. 目标 FM/交易单据的编号 | 
| stSearch | string(Query) |  默认 = 模块,StSearchinfo,供系统使用 | 
| beId | long(Query) |  如果模块是特定BE的,则需要提供 beID。BE 在 aiM18 中指企业法人,即勾选 BE 复选框的[部门]记录。 | 
# 结果
| 类型 | 位置(error_id) | 说明 | 
|---|---|---|
success |  Body | 一个 json 数组 | 
json 数组示例
[
	{"needPassword":"false",
	"code":"M18_GZWZ2017050801-FIXED.docx",
	"fileSize":823092.0,
	"author":"admin",
	"createUser":"admin",
	"remark":"",
	"id":9,
	"createUid":5,
	"desc":"M18_GZWZ2017050801-FIXED",
	"createDate":"2017/07/04 10:52:25",
	"tags":""},
	{"needPassword":"true",
	"code":"M18_GZWZ2017051801.docx",
	"fileSize":108683.0,
	"author":"admin",
	"createUser":"admin",
	"remark":"",
	"id":10,
	"createUid":5,
	"desc":"M18_GZWZ2017051801",
	"createDate":"2017/07/04 10:52:25",
	"tags":""}
]
| 参数名称 | 含义 | 
|---|---|
| id | 附件ID | 
| code | 附件编号 | 
| desc | 附件标题 | 
| fileSize | 附件的文件大小 | 
| author | 附件的作者 | 
| tags | 附件的标签 | 
| remark | 附件的备注 | 
| createUser | 创建附件的用户名 | 
| createUid | 创建附件的用户ID | 
| createDate | 附件的创建日期 | 
| needPassword | 文件是否用密码加密 | 
# 获取附件文件
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/attach/getFile?module=dept&stSearch=dept&code=ADMIN&id=10")
  .get()
  .addHeader("authorization", "Bearer OGFiZmU2ZTktMzYzMS00NjIwLWJhNGYtYWU2OGQyNTZhMmNi")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
GET http://127.0.0.1:8080/jsf/rfws/attach/getFile?module=[module Name]&stSearch=[stSearch code]&code=[recod's code]&id=[Attachment ID]
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | string(Header) |  必填. 通过 OAuth2 获取的访问令牌 | 
| client_id | string(Header) |  必填. 在[授权应用列表]中注册时,由 aiM18 生成 | 
| module | string(Query) |  必填. 目标 FM/交易单据的模块编号 | 
| stSearch | string(Query) |  默认 = 模块, StSearchinfo,供系统使用 | 
| code | string(Query) |  目标 FM/交易单据的编号 | 
| Id | string(Query) |  必填. 附件ID | 
| password | string(Query) |  文件使用密码加密时必须填写。附件的密码。此密码需要加密。 | 
# 结果
如果 API 运行成功,响应状态码将是 200,然后会返回一个文件。 如果 API 运行失败,响应状态码将是 400,然后将返回 CheckMsg。你可以在响应头中,从关键字为 “error_info ”中获取一个 CheckMsg JSON 数组。
| 类型 | 位置 | 说明 | 
|---|---|---|
success |  Body | 一个文件 | 
fail |  Header(error_info) | 一个CheckMsg JSON数组 | 
# 上传附件文件
OkHttpClient client = new OkHttpClient();
File file = new File("C:\\script.txt");
MediaType mt = MediaType.parse("application/octet-stream");
RequestBody rb = RequestBody.create(mt, file);
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/attach/upload?module=dept&stSearch=dept&code=ADMIN&fileName=script.text&title=attachment&author=aa&tags=program;aiM18;script&remark=aabbcc")
  .post(rb)
  .addHeader("authorization", "Bearer OGFiZmU2ZTktMzYzMS00NjIwLWJhNGYtYWU2OGQyNTZhMmNi")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
POST http://127.0.0.1:8080/jsf/rfws/attach/upload?module=[module Name]&stSearch=[stSearch code]&code=[recod's code]&fileName=[Attachment’s filename]&title=[file name]&author=[user name]&tags=[tags]&remark=[remark]
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | string(Header) |  必填. 通过 OAuth2 获取的访问令牌 | 
| client_id | string(Header) |  必填. 在[授权应用列表]中注册时,由 aiM18 生成 | 
| module | string(Query) |  必填. 目标 FM/交易单据的模块编号 | 
| stSearch | string(Query) |  默认 = 模块, StSearchinfo,供系统使用 | 
| code | string(Query) |  目标 FM/交易单据的编号 | 
| fileName | string(Query) |  必填. 附件的文件名称 | 
| title | string(Query) |  必填. 文件名(将用作附件编号,与当前系统逻辑相同) | 
| author | string(Query) |  默认 = 当前用户的用户名。附件作者 | 
| tags | string(Query) |  附件标签 | 
| remark | string(Query) |  附件备注 | 
| overwrite | boolean(Query) |  是否替换记录中第一个文件名相同的附件。如果设置为 “true”,将搜索当前附件列表,并替换第一个匹配的具有相同附件编号的附件。如果设为 false,则会一直追加到附件列表中。 | 
| password | string(Query) |  密码是否需要加密 | 
| beId | long(Query) |  如果模块是特定BE的,则需要提供 beID。BE 在 aiM18 中指企业法人,即勾选 BE 复选框的[部门]记录。 | 
# 结果
如果 API 运行成功,响应状态码将是 200。 如果 API 运行失败,响应状态码将是 400,然后将返回 CheckMsg。你可以在响应头中,从关键字为 “error_info ”中获取一个 CheckMsg JSON 数组。
| 类型 | 位置 | 说明 | 
|---|---|---|
success |  Body | 状态码200 | 
fail |  Header(error_info) | 一个CheckMsg | 
# 传输文件密码的方法
请注意,附件模块支持对文件进行密码加密。如果用户想通过密码对文件进行加密或解密,为了安全起见,用户需要先对密码进行加密。我们的系统使用 AES 模式对Web服务传输的密码进行加密。
以下是示例代码:
	private static Key aesKey = new SecretKeySpec("Mac02017Dms02017".getBytes(), "AES");
	public static String encryptDmsTransferPassword(String password) {
		try {
			Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
			// encrypt the text
			cipher.init(Cipher.ENCRYPT_MODE, aesKey);
			byte[] encrypted = cipher.doFinal(password.getBytes());
			return DatatypeConverter.printHexBinary(encrypted);
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}
# 通知Web服务
# 获取通知列表
获取系统通知列表
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/sysAlert/getList?rowLimit=10&page=1&readMode=2")
  .get()
  .addHeader("authorization", "Bearer MjZhZGNjMDctODVhZS00MmE0LWI3ZmEtNzRhMTQwZGZiNTY0")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
GET http://[server]/jsf/rfws/sysAlert/getList?rowLimit=[no. of row]&page=[pagination]&readMode=[readMode]
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | String(Header) |  必填. 通过 OAuth2 获取的访问令牌 | 
| client_id | String(Header) |  必填. 在[授权应用列表]中注册时,由 aiM18 生成 | 
| rowLimit | int(Query) |  行数,默认 = 5 | 
| page | int(Query) |  通知列表的分页,默认 = 1 | 
| readMode | int(Query) |  读取状态 0 = 全部, 1 = 已读, 2 = 未读 | 
| count | boolean(Query) |  如果 count 为 true,则返回通知的计数 | 
# 通过用户ID获取通知列表
通过用户ID获取系统通知列表
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/sysAlert/getAlertList?uid=1&rowLimit=10&page=1")
  .post()
  .addHeader("authorization", "Bearer MjZhZGNjMDctODVhZS00MmE0LWI3ZmEtNzRhMTQwZGZiNTY0")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
POST http://[server]/jsf/rfws/sysAlert/getAlertList?uid=[uid]&rowLimit=[no. of row]&page=[pagination]&readMode=[readMode]
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | String(Header) |  必填. 通过 OAuth2 获取的访问令牌 | 
| client_id | String(Header) |  必填. 在[授权应用列表]中注册时,由 aiM18 生成 | 
| uid | long(Query) |  必填. 用户ID | 
| rowLimit | int(Query) |  行数,默认 = 5 | 
| page | int(Query) |  通知列表的分页,默认 = 1 | 
| readMode | int(Query) |  读取状态 0 = 全部, 1 = 已读, 2 = 未读 | 
| count | boolean(Query) |  如果 count 为 true,则返回通知的计数 | 
# 结果
如果 API 运行成功,将返回一个 SqlTable。如果 count 为 true,则将返回通知的计数。
| 位置 | 说明 | 
|---|---|
| Body | 一个sqlTable json string | 
| Header | 如果 count 为 true,返回通知的计数 | 
# 获取通知
获取系统通知
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/sysAlert/get?alertId=1")
  .get()
  .addHeader("authorization", "Bearer MjZhZGNjMDctODVhZS00MmE0LWI3ZmEtNzRhMTQwZGZiNTY0")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
GET http://[server]/jsf/rfws/sysAlert/getList?alertId=[id of alert record]
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | String(Header) |  必填. 通过 OAuth2 获取的访问令牌 | 
| client_id | String(Header) |  必填. 在[授权应用列表]中注册时,由 aiM18 生成 | 
| alertId | long(Path) |  必填. 通知记录的id | 
# 结果
如果 API 运行成功,它将返回一个 SqlTable。
| 位置 | 说明 | 
|---|---|
| Body | 一个 SqlTable JSON string | 
# 公告 Web 服务
# 获取公告列表
获取系统公告列表
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/ancm/getAncmList?page=1&pageSize=50&orderField=ancmDate&orderAsc=DESC&readMode=0")
  .get()
  .addHeader("authorization", "Bearer MjZhZGNjMDctODVhZS00MmE0LWI3ZmEtNzRhMTQwZGZiNTY0")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
GET http://[server]/jsf/rfws/ancm/getAncmList?page=[pagination]&pageSize=[pageSize]&orderField=[order field]&orderAsc=[order type]&readMode=[read mode]
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | String(Header) |  必填. 通过 OAuth2 获取的访问令牌 | 
| client_id | String(Header) |  必填. 在[授权应用列表]中注册时,由 aiM18 生成 | 
| pageSize | int(Path) |  必填. 页面大小 | 
| page | int(Query) |  必填. 公告列表的分页 | 
| readMode | int(Query) |  读取状态 0 = 全部, 1 = 已读, 2 = 未读 | 
| orderField | string(Query) |  使用哪个字段进行排序。 | 
| orderAsc | String(Query) |  排序类型,值可以是 ASC 或 DESC。默认为 DESC。 | 
| excludeIds | String(Query) |  使用此值排除某些公告。可以是一个 id,也可以是多个 id。如果是两个或多个 id,id 之间必须用 ,分隔。 | 
| getCount | boolean(Query) |  如果 getCount 为 true,则返回公告的计数 | 
| quickSearch | String(Query) |  如果该值不为空,则可用于搜索标题、公开日期和重要性 | 
# 结果
如果 API 运行成功,它将返回一个 SqlTable。如果 getCount 为 true,则将返回公告列表的计数。如果 getCount 为 false,则将返回公告列表的信息。
| 位置 | 说明 | 
|---|---|
| Body | 一个 SqlTable JSON string | 
# 获取公告
获取系统公告
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/ancm/read?ancmId=1")
  .get()
  .addHeader("authorization", "Bearer MjZhZGNjMDctODVhZS00MmE0LWI3ZmEtNzRhMTQwZGZiNTY0")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
GET http://[server]/jsf/rfws/ancm/read?ancmId=[id of announcementrecord]
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | String(Header) |  必填. 通过 OAuth2 获取的访问令牌 | 
| client_id | String(Header) |  必填. 在[授权应用列表]中注册时,由 aiM18 生成 | 
| ancmId | long(Path) |  必填. 公告记录的id | 
# 结果
如果 API 运行成功,响应状态码将是 200,然后会返回一个SqlEntity。 如果 API 运行失败,响应状态码将是 400,然后将返回 CheckMsg。你可以在响应头中,从关键字为 “error_info ”中获取一个 CheckMsg JSON 数组。
| 类型 | 位置 | 说明 | 
|---|---|---|
success |  Body | 一个 SqlEntity JSON string | 
fail |  Header(error_info) | 一个 CheckMsg JSON 数组 | 
# 一查到底 - 获取相关记录
给定一条记录,返回与该记录相关的所有其他记录。
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/telescope/getRelatedRecord/user/2")
  .get()
  .addHeader("authorization", "Bearer MjZhZGNjMDctODVhZS00MmE0LWI3ZmEtNzRhMTQwZGZiNTY0")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
GET http://[server]/jsf/rfws/telescope/getRelatedRecord/{lookupType}/{recordId}
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | String(Header) |  必填. 通过 OAuth2 获取的访问令牌 | 
| client_id | String(Header) |  必填. 在[授权应用列表]中注册时,由 aiM18 生成 | 
| lookupType | String(Path) |  必填. 搜索类型 | 
| recordId | long(Path) |  必填. 源记录id | 
# 结果
如果 API 运行成功,响应状态码将是 200,然后会返回一个JSON。 如果 API 运行失败,响应状态码将是 400,然后将返回 CheckMsg。你可以在响应头中,从关键字为 “error_info ”中获取一个 CheckMsg JSON 数组。
[
    {
        "ids": [
            1,
            114
        ],
        "lastModifyDate": 1553229061000,
        "module": "dept",
        "moduleDisplay": "Department"
    },
    {
        "ids": [
            182,
            120
        ],
        "lastModifyDate": 1555925150000,
        "module": "employee",
        "moduleDisplay": "Employee"
    }
]
| 类型 | 位置 | 说明 | 
|---|---|---|
success |  Body | 一个SqlEntity JSON string | 
fail |  Header(error_info) | 一个CheckMsg JSON 数组 | 
# 一查到底 - 通过语音指令获取结果
一查到底 NPL 触发器,根据移动应用程序设置返回匹配的一查到底结果。
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/telescope/telescopeNlp?tags=staff&tags=Jacky")
  .get()
  .addHeader("authorization", "Bearer MjZhZGNjMDctODVhZS00MmE0LWI3ZmEtNzRhMTQwZGZiNTY0")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
GET http://[server]/jsf/rfws/telescope/telescopeNlp?tags={keyword}
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | String(Header) |  必填. 通过 OAuth2 获取的访问令牌 | 
| client_id | String(Header) |  必填. 在[授权应用列表]中注册时,由 aiM18 生成 | 
| tags | String(Query) |  必填. 搜索关键词 | 
# 结果
如果 API 运行成功,响应状态码将是 200,然后会返回一个JSON。 如果 API 运行失败,响应状态码将是 400,然后将返回 CheckMsg。你可以在响应头中,从关键字为 “error_info ”中获取一个 CheckMsg JSON 数组。
{
    "stSearch": "employee",
    "formatFieldDesc": {
        "code": "",
        "desc__lang": "Name(Current Language)",
        "iRev": "Inner Version",
        "lastModifyDate": "Last Modified Time",
        "employee.lastModifyUid.simpleUser.desc__lang": "Last Modified By(Current Language)",
        "id": "",
        "desc": ""
    },
    "size": 2,
    "stSearchDisplay": "Employee",
    "values": [
        {
            "code": "Havid0012",
            "desc__lang": "Raindrop_en",
            "iRev": 11,
            "lastModifyDate": "2019-04-22 17:27:57",
            "employee.lastModifyUid.simpleUser.desc__lang": "Raindrop_en",
            "id": 382,
            "desc": "Raindrop_en",
            "st_desc": "Raindrop_en",
            "st_id": 382,
            "st_code": "Havid0012"
        },
        {
            "code": "Havid0018",
            "desc__lang": "B",
            "iRev": 8,
            "lastModifyDate": "2019-04-22 17:27:57",
            "employee.lastModifyUid.simpleUser.desc__lang": "Raindrop_en",
            "id": 398,
            "desc": "B",
            "st_desc": "B",
            "st_id": 398,
            "st_code": "Havid0018"
        }
    ],
    "fieldDesc": {
        "code": "Code",
        "st_id": "st_id",
        "st_code": "st_code",
        "desc__lang": "Name(Current Language)",
        "st_desc": "st_desc",
        "employee.lastModifyUid.simpleUser.desc__lang": "Name(Current Language)",
        "iRev": "Inner Version",
        "id": "Key ID",
        "lastModifyDate": "Last Modified Time",
        "desc": "Name"
    }
}
| 类型 | 位置 | 说明 | 
|---|---|---|
success |  Body | 一个 SqlEntity JSON string | 
fail |  Header(error_info) | 一个 CheckMsg JSON 数组 | 
# 文件打印Web服务
# 获取PDF 文件
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/jrPrint/fetchPdf?menuCode=employee&recId=1")
  .post()
  .addHeader("authorization", "Bearer OGFiZmU2ZTktMzYzMS00NjIwLWJhNGYtYWU2OGQyNTZhMmNi")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
POST http://127.0.0.1:8080/jsf/rfws/jrPrint/fetchPdf?menuCode=[Menu code]&recId=[Record Id]
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | string(Header) |  必填. 通过 OAuth2 获取的访问令牌 | 
| client_id | string(Header) |  必填. 在[授权应用列表]中注册时,由 aiM18 生成 | 
| menuCode | string(Query) |  必填. 菜单编号,如 “员工”,可在数据字典中找到 | 
| recId | long(Query) |  必填. 实体的id | 
| printOptionId | long(Query) |  打印选项id | 
# 结果
如果 API 运行成功,响应状态码将是 200,然后会返回一个文件。 如果 API 运行失败,响应状态码将是 400,然后将返回 CheckMsg。你可以在响应头中,从关键字为 “error_info ”中获取一个 CheckMsg JSON 数组。
| 类型 | 位置 | 说明 | 
|---|---|---|
success |  Body | 一个文件 | 
fail |  Header(error_info) | 一个CheckMsg JSON 数组 | 
# 上传图片 Web服务
OkHttpClient client = new OkHttpClient();
File file = new File("C:\\Sample.jpg");
MediaType mt = MediaType.parse("application/jpg");
RequestBody rb = RequestBody.create(mt, file);
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/image/uploadImage?imgName=Sample.jpg")
  .post(rb)
  .addHeader("authorization", "Bearer OGFiZmU2ZTktMzYzMS00NjIwLWJhNGYtYWU2OGQyNTZhMmNi")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
POST http://127.0.0.1:8080/jsf/rfws/image/uploadImage?imgName=[Image Name]
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | string(Header) |  必填. 通过 OAuth2 获取的访问令牌 | 
| client_id | string(Header) |  必填. 在[授权应用列表]中注册时,由 aiM18 生成 | 
| imgName | string(Query) |  图片名字 | 
# 结果
如果 API 运行成功,响应状态码将是 200,然后会返回 imgCode。 如果 API 运行失败,响应状态码将是 400,然后将返回 CheckMsg。你可以在响应头中,从关键字为 “error_info ”中获取一个 CheckMsg JSON 数组。
| 类型 | 位置 | 说明 | 
|---|---|---|
success |  Body | imgCode | 
fail |  Header(error_info) | 一个CheckMsg JSON 数组 | 
# 保存草稿 Web 服务
保存草稿.
OkHttpClient client = new OkHttpClient();
MediaType jsonMT = MediaType.parse("application/json; charset=utf-8");
RequestBody rb = RequestBody.create(jsonMT, 
                 "[Simplified Entity JSON]" or "array of [Simplified Entity JSON]");
Request request = new Request.Builder()
  .url("http://127.0.0.1:8080/jsf/rfws/draft/s/save/employee?menuCode=employee")
  .put(rb)
  .addHeader("authorization", "Bearer MjZhZGNjMDctODVhZS00MmE0LWI3ZmEtNzRhMTQwZGZiNTY0")
  .addHeader("client_id", "C-SGF2aWQncyBhcHBsaWNhdGlvbjIwMTctMDItMTAxNjc=")
  .addHeader("cache-control", "no-cache")
  .build();
Response response = client.newCall(request).execute();
# HTTP 请求
PUT http://[server]/jsf/rfws/draft/s/save/[module]?menuCode=[menuCode]&beId=[beId]&templateCode=[templateCode]&entity=[entity]
# 参数
| 名字 | 类型 | 说明 | 
|---|---|---|
| authorization | String(Header) |  必填. 通过 OAuth 获取的访问令牌 | 
| client_id | String(Header) |  必填. 在aiM18 [授权应用列表]中的Client ID | 
| module | string(Path) |  必填. 模块类型,例如‘员工’,可以在数据字典中找到 | 
| menuCode | string(Query) |  必填. 菜单编号,例如‘员工’,可以在数据字典中找到 | 
| beId | int(Query) |  如果模块是特定BE的,则需要提供 beID。BE 在 aiM18 中指企业法人,即勾选 BE 复选框的[部门]记录。 | 
| templateCode | string(Query) |  模板编号可在模块的模板对话框中找到。 | 
| entity | jsonString(Query) |  简化的实体 JSON,结构请参考下文。请注意,JSON需要使用URL 编码。 | 
| entity_in_entity | jsonString(Body) |  简化的实体 JSON,结构请参考下文。建议在请求体中传实体 JSON。如果要处理多个实体,请传一个简化的实体 JSON 数组。 | 
| footerMergeMode | string(Query) |  适用于使用了模板,且Entity数据中某个Footer不为空。默认值为"override",如果值为"override"时,以Entity数据为准,直接覆盖。值为"append"时,保留模板数据。 | 
| footerUseTemplateIfMissing | boolean(Query) |  适用于使用了模板,但传入的Entity没有某个Footer,或有该Footer但数据为空。默认值为"true",如果为true,使用模板数据。为false时,忽略模板数据。 | 
# 简化的实体JSON
{
    "employeepic": {
        "values": []
    },
    "employee_attach": {
        "values": []
    },
    "employee": {
        "values": [
          {"code": "000171","desc": "abcd"}
        ]
    }
}
- JSON 包含模块中不同表的对象,每个表都包含一个 “values ”JSON 数组,用于指定表中每个字段的值。
 - 模块的主表是必要的。关于哪个表是主表,用户可以参考数据字典。
 - 如果未提供表格或字段值,则不会保存。
 
# 结果
如果 API 运行成功,响应状态码将是 200,则会返回已保存草稿的编号。如果 API 运行失败,响应状态码将是 400,然后将返回 CheckMsg。你可以在响应头中,从关键字为 “error_info ”中获取一个 CheckMsg JSON 数组。
| 类型 | 位置 | 说明 | 
|---|---|---|
success |  Body | 所保存的草稿的编号 | 
fail |  Header(error_id=1) | 采用JSON数组格式描述的多种错误 | 
fail |  Header(error_info) | 一个CheckMsg JSON 数组 |