智能办公如何创建e10流程
配置e10流程前,您要做的事情:
- 1、进入e10管理后台,创建应用,开放接口权限;
- 2、进入e10管理后台,配置千里聆套件,配置同步人员;
- 3、进入千里聆系统,进行“外联系统认证配置”;
- 4、进入e10系统,找到对应的表单信息;
- 5、进入千里聆系统,AI办公管理->文本结构化处理引擎,创建“必填字段表单”,创建表单字段关联的“词典”;
- 6、然后,进入意图智能化处理引擎,创建意图,并且关联上步中的表单;
- 7、最后,把创建的意图(编辑菜单时可以看到“权限”入口),赋权,所有人使用。
当然第4、5、6步骤可以省略,在“添加意图”中找到“意图云市场”,点击进入后,搜索“请假”,找到含有标签"e10"的意图执行安装,
然后编辑意图和表单。
参考接口文档地址:https://weapp.eteams.cn/sp/opendoc/freepass/10.0.2506.01/zh_cn/949862795428020225
1、流程梳理
1.1、 e10表单引擎字段管理


- 找到
字段名称、字段类型,创建表单 - 记录
数据key, 用于创建意图; - 找到
下拉、浏览类型数据,创建词典
2、创建词典
小e词典对应了oa系统中表单字段类型有下拉选项、浏览框、自定义多选(单选)等。
- 根据下拉选项值,配置小e词典,参考下图:

2.1、 人员词典
- 请求地址:
/api/hrm/restful/queryEmployee - 请求方式:
POST - 请求类型:
application/json
| 参数名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| access_token | String | 必填 | 调用接口凭证 |
| current | Integer | 必填 | 分页-当前页 |
| pageSize | Integer | 必填 | 分页-页大小(最大1000) |
| nameLikeList | Arryay | 非必填 | 名称模糊查询 |
| containEmployeeExtend | Boolean | 非必填 | 加载基本信息自定义 |
| containUserInfoExtend | Boolean | 非必填 | 加载个人信息自定义(这个参数为true;必然提供个人信息内容) |
| containUserInfo | Boolean | 非必填 | 加载个人信息 |
参数示例
{
"access_token": "9b981cc58b484212a9923c768acaee75",
"current": 1,
"pageSize": 20,
"nameLikeList": ["zhang"],
"containEmployeeExtend":true,
"containUserInfoExtend":true,
"containUserInfo":true
}
返回结果
直接复制到词典配置结果中!
{
"message": {
"errcode": "0",
"errmsg": "success"
},
"data": {
"current": 1,
"total": 1,
"data": [
{
"employeeExtend": {
"802830263522590723": {
"title": "单行文本",
"value": "aassff"
}
},
"education": {
"id": "767257884333465620",
"name": "高中及以下"
},
"accumfundaccount": "sss",
"nation": {
"id": "767257884333465630",
"name": "汉族"
},
"residence_place": "1122",
"modifier": "2226184113539534645",
"active_date": "2022-12-12",
"type": "inside",
"bankid": "798795283734192129",
"id_no": "342401198802051876",
"bank_accountname": "aass",
"id": "805851627118034951",
"bank_account": "aaas",
"created": "2022-12-12",
"degree": {
"id": "767257884333465627",
"name": "博士"
},
"first_work_date": "2022-12-17",
"work_year": 0,
"formdata": "807746708413734913",
"login_status": "invited",
"native_place": "安徽省",
"last_update_time": "2022-12-17",
"pinyin": "anbang,anbeng",
"user_id": "2227082695389976109",
"child_status": "ffss",
"birthday": "1988-02-05",
"tenant_key": "t7emfkqmmm",
"family_contact": "3344",
"sec_level": 0,
"update_time": "2022-12-17",
"job_num": "RYGH5612",
"department": "2226184113543634646",
"logogram": "ab",
"personnel_status": "5",
"im_uid": "805851627118034951",
"household_type": {
"id": "767257884333465611",
"name": "本市城镇"
},
"graduate_school": "aaass",
"marital_status": "married",
"politics_status": {
"id": "767257884333465615",
"name": "党员(含预备党员)"
},
"age": 34,
"username": "安蚌"
}
],
"pageSize": 100
}
}
下面时图片示例:



2.2、 智能推荐会议室
- 请求地址:
/api/meeting/meetingOpenApi/getRecommendRoomEvents - 请求方式:
POST - 请求类型:
application/json
| 参数名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| access_token | String | 必填 | 调用接口凭证 |
| userid | Long | 必填 | 用户ID |
| totalMember | Integer | 非必填 | 参会人数 |
| size | Integer | 必填 | 推荐的数据个数(最多只能返回10个) |
| start | String | 非必填 | 开始时间,格式为(yy-MM-dd HH:mm:ss) |
| end | String | 非必填 | 结束时间,格式为(yy-MM-dd HH:mm:ss) |
| keyWords | List | 非必填 | 模糊查询得关键词数组[“泛微”,“的”,“茶室”] |
参数示例
{
"access_token": "b9758709a445ad918c1ff362ab236c28",
"userid": "5115992169571507219",
"totalMember": 5,
"start": "2023-08-10 11:30:00",
"end": "2023-08-23 11:30:00",
"size": 2,
"keyWords": ["测试"]
}
返回结果
直接复制到词典配置结果中!
{
"code": 0,
"msg": "success",
"status": true,
"data": [
{
"start": "2023-09-10 08:30:00",
"end": "2023-09-10 23:30:00",
"permission": 0,
"room": {
"id": "761695987479191552",
"name": "测试会议室",
"roomDesc": "",
"status": 1,
"equipments": ""
}
}
],
"fail": false
}
下面时图片示例:



注意
参数totalNumber、start、end这3个参数还没有使用!!!
当这个词典被表单的字段使用后,在使用这3个参数!
-
首先,表单关联会议室词典

-
然后,找到会议室词典

-
其次,添加剩余参数
totalNumber、start、end

- totalMember 参数

function run(object) { var total = ""; var tmp = object.field_1791414335218679810; if(tmp != null && tmp.value != null && tmp.value.length > 0){ total = tmp.value[0]; } if(startTime.length == 0){ total = "2"; } return total; } - start 参数

function run(object) { var startTime = ""; var tmp = object.field_1791414335214485505; if(tmp != null && tmp.value != null && tmp.value.length > 0){ startTime = tmp.value[0]; } if(startTime.length == 0){ startTime = ""; } return startTime; } - end 参数

function run(object) { var end = ""; var tmp = object.field_1791414335214485506; if(tmp != null && tmp.value != null && tmp.value.length > 0){ end = tmp.value[0]; } if(startTime.length == 0){ end = ""; } return end; }
- totalMember 参数
3、创建表单

3.1、 表单字段
3.1.1、 附件上传

- 请求地址:
/api/file/v2/common/upload - 请求方式:
POST - 请求类型:
multipart/form-data
| 参数名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| access_token | String | 必填 | 调用接口凭证 |
| file | File | 必填 | 上传文件 |
| name | String | 必填 | 文件名称 |
| userid | Long | 必填 | 用户ID |
返回结果
直接复制到配置结果中!
{
"message": {
"errcode": "0",
"errmsg": "success"
},
"data": {
"fileid": "744652681173368833",
"name": "test.jpeg",
"size": 69500,
"sizeUnit": "B",
"extName": "jpeg",
"type": "image/jpeg",
"img": true,
"uploadUser": "5111916321074015321",
"uploadUserName": "代娟娟",
"uploadTime": 1656577963664,
"ban": false,
"docId": "8515657796377515961"
}
}
下面是图片示例:



4、创建流程
4.1、 参考创建流程文档

如上图,我们可以得到相关信息:
- 请求地址:
/api/workflow/core/paService/v1/doCreateRequest - 请求方式:
POST - 请求类型:
application/json
| 参数名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| access_token | String | 必填 | 调用接口凭证 |
| userid | Long | 必填 | 用户ID |
| requestName | String | 必填 | 流程标题 |
| workflowId | String | 必填 | 流程id |
otherParams | Json | 非必填 | 扩展参数,通过脚本配置,参数格式示例:{“isnextflow”:1}isnextflow: 是否进行流转,0-否,1-是 |
| formData | Json | 必填 | 表单字段参数,通过脚本配置 |
参数示例
{
"access_token": "9b981cc58b484212a9923c768acaee75",
"userid": "8614739288664195939",
"workflowId": "100003460000001155",
"otherParams": {
"isnextflow": 1
},
"formData":{}
}
返回结果
直接复制到意图配置结果中!
{
"message": {
"errcode": "0",
"errmsg": "success",
"requestId": "746802982236315648"
}
}
4.2、配置意图




按照上图配置相关请求信息即可!
4.3 、配置意图参数说明
参数 access_token
参数选择access_token,下拉选择全局变量, 下拉选择accessToken
参数 userid
参数选择userid,下拉选择系统值, 下拉选择当前用户id
参数 workflowId
参数选择workflowId,下拉选择固定值, 输入e10流程id
参数 requestName
在参数配置中,有两种实现方式,任意选择一个:
- 参数选择
requestName,下拉选择固定值, 输入框填写 . - 参数选择
requestName, 下拉选择脚本,脚本配置为:

requestName脚本示例:
function run(object) {
// 当前日期
var time= $_CURRENT_DATE_$;
// 当前用户名称
var userName = $_CURRENT_USER_NAME_$;
// 格式:请假_2025-01-01-张三
return "请假_" + time + "_" + userName;
}
参数 otherParams
otherParams.isnextflow值的表示状态:
| 值 | 说明 |
|---|---|
| 0 | 不流转节点 |
| 1 | 创建流程是否自动流转下一个节点 |
在参数配置中,有两种实现方式,任意选择一个:
- 参数选择
otherParams, 下拉选择脚本,脚本配置为:function run(object){ // return {"isnextflow":0}; return {"isnextflow":1}; } - 参数选择
otherParams.isnextflow,下拉选择固定值, 输入框填写1.
参数 formData

表数据示例格式:
function run(object) {
// 默认系统值,用于表单中的人员和部门信息
var userId = $_CURRENT_USER_ID_$;
var userName = $_CURRENT_USER_NAME_$;
var deptId = $_CURRENT_DEPT_ID_$;
var deptName = $_CURRENT_DEPT_NAME_$;
var formData = {
"dataDetails": [],
// "formId": "100003669000000968", // e10 或者 eteams 表单id
"module": "workflow"
};
// 一、主表字段
// 1、普通字段: 日期、原因, 数字,字符串格式数据
// object.field_1863792674960646145,这里是智能小e自己创建的主表中的一个字段
// 天数(ts) eteams 表单字段名称
formData.dataDetails.push(getSimpleWithKey(object.field_1863792674960646145, "ts"));
// 2、下拉词典类型: 请假类型字段,人员
// object.field_1869557469645627300,这里是智能小e自己创建的主表中的一个字段,例如 请假类型
formData.dataDetails.push(getFormOptionWithKey(object.field_1869557469645627300, "sqr" ));
// 3、附件: 结婚证明、出生证明
// object.field_1863793461187125250,这里是智能小e自己创建的主表中的一个字段,例如 结婚证明
formData.dataDetails.push(getFormFileWithKey(object.field_1863793461187125250, "fj"));
// 4、默认字段: 申请人、申请部门
formData.dataDetails.push({
"content": userId , "dataKey": "sqr" // e10 或者 eteams 表单字段名称
});
formData.dataDetails.push({
"content": deptId , "dataKey": "sqbm" // e10 或者 eteams 表单字段名称
});
// 二、下面是明细表
var arrs = [];
// 第一个明细表
var subFormId1 ="100003690000000829"; // 明细表id
// 第一个明细表普通字段:补打卡理由
arrs = getDetailSimpleLineWithKey(
object.sc_1826901249786830850.field_1826901347786743810,
subFormId1, "reason" // eteams数据库字段名称
);
for(var i = 0; i < arrs.length; i++){
formData.dataDetails.push(arrs[i]);
}
// 第一个明细表下拉词典类型: 请假类型字段,人员
arrs = getDetailOptionLineWithKey(
object.sc_1826901249786830850.field_1826901347786743811,
subFormId1, "person" // eteams数据库字段名称
);
for(var i = 0; i < arrs.length; i++){
formData.dataDetails.push(arrs[i]);
}
// 第一个明细表附件: 结婚证明、出生证明
arrs = getDetailFileLineWithKey(
object.sc_1826901249786830850.field_1826901347786743812,
subFormId1, "jhzm" // jhzm数据库字段名称
);
for(var i = 0; i < arrs.length; i++){
formData.dataDetails.push(arrs[i]);
}
// todo 第二个明细表
var subFormId2 ="100003690000000830"; // 明细表id
// 第一个明细表普通字段:时间
arrs = getDetailSimpleLineWithKey(
object.sc_1826901249786830850.field_1826901347786743810,
subFormId2, "reason" // eteams数据库字段名称
);
for(var i = 0; i < arrs.length; i++){
formData.dataDetails.push(arrs[i]);
}
// ... ...
return formData;
}
function getFormValue(tmp){
if(null != tmp && null!=tmp.value && tmp.value.length > 0){
return tmp.value[0];
}
return "";
}
function getSimpleWithKey(tmp, dataKey){
return {
"content": getFormValue(tmp),
"dataKey": dataKey // e10 或者 eteams 表单字段名称
};
}
function getFormOptionWithKey(tmp, dataKey){
var demo={
"dataOptions": [],
"dataKey": dataKey // e10 或者 eteams 表单字段key
}
if(null != tmp && null != tmp.value && tmp.value.length > 0) {
for(var i = 0; i < tmp.value.length; i ++){
var op_id = tmp.value[i];
demo.dataOptions.push({
"optionId": op_id,
"content": tmp.option[op_id]
});
}
}
return demo;
}
function getFormFileWithKey(tmp, dataKey){
var demo={
"dataOptions": [],
"dataKey": dataKey // e10 或者 eteams 表单字段key
}
if(null != tmp && null != tmp.value && tmp.value.length > 0) {
for(var i = 0; i < tmp.value.length; i ++){
var op_id = tmp.value[i];
var item = tmp.option[op_id];
demo.dataOptions.push({
"optionId": op_id ,
"content": item.optionName,
"type": "file"
});
}
}
return demo;
}
function getDetailSimpleLineWithKey(tmp, subFormId, dataKey){
var arr = [];
if(null != tmp){
for(var i = 0; i < tmp.length; i ++){
var demo = {
"content": "",
"dataIndex": i + 1, // 表示明细表的行
"subFormId": subFormId, // e10明细表的表单id
"dataKey": dataKey // 明细表的字段id
};
var r = tmp[i];
if(null != r && null != r.value && r.value.length > 0){
demo.content = r.value[0];
}
arr.push(demo);
}
}
return arr;
}
function getDetailOptionLineWithKey(ttf , subFormId, dataKey){
var arr = [];
if(null != ttf && null!=ttf&& ttf.length > 0){
for(var i = 0; i < ttf.length; i ++){
var demo = {
"dataOptions": [],
"dataIndex": i + 1, // 表示明细表的行
"subFormId": subFormId, // e10明细表的表单id
"dataKey": dataKey // 明细表的字段id
};
var r = ttf[i];
if(null != r && null != r.value && r.value.length > 0){
for(var j = 0; j < r.value.length; j++){
var op_id = r.value[j];
var opObj = {
"optionId": op_id,
"content": r.option[op_id]
};
demo.dataOptions.push(opObj);
}
}
arr.push(demo);
}
}
return arr;
}
function getDetailFileLineWithKey(ttf , subFormId, dataKey){
var arr = [];
if(null != ttf && null!=ttf&& ttf.length > 0){
for(var i = 0; i < ttf.length; i ++){
var demo = {
"dataOptions": [],
"dataIndex": i + 1, // 表示明细表的行
"subFormId": subFormId, // e10明细表的表单id
"dataKey": dataKey // 明细表的字段id
};
var r = ttf[i];
if(null != r && null != r.value && r.value.length > 0){
for(var j = 0; j < r.value.length; j++){
var op_id = r.value[j];
var opObj = {
"optionId": op_id,
"content": r.option[op_id],
"type": "file"
};
demo.dataOptions.push(opObj);
}
}
arr.push(demo);
}
}
return arr;
}
4.4、脚本函数
提供两个风格函数,两者选一种使用:
- 1、“数据库名称”
- 2、表单字段id
4.4.1 “数据库名称”
提供两个风格函数,两者选一种使用:
// 获取小e表单填写的数据
function getFormValue(tmp){
if(null != tmp && null!=tmp.value && tmp.value.length > 0){
return tmp.value[0];
}
return "";
}
// 1.1 构造 普通字段: 日期、原因, 数字,字符串格式数据
function getSimpleWithKey(tmp, dataKey){
return {
"content": getFormValue(tmp),
"dataKey": dataKey // e10 或者 eteams 表单字段名称
};
}
// 2.1 构造 浏览类型数据
function getFormOptionWithKey(tmp, dataKey){
var demo={
"dataOptions": [],
"dataKey": dataKey // e10 或者 eteams 表单字段key
}
if(null != tmp && null != tmp.value && tmp.value.length > 0) {
for(var i = 0; i < tmp.value.length; i ++){
var op_id = tmp.value[i];
demo.dataOptions.push({
"optionId": op_id,
"content": tmp.option[op_id]
});
}
}
return demo;
}
// 3.1 构造 附件字段类型数据
function getFormFileWithKey(tmp, dataKey){
var demo={
"dataOptions": [],
"dataKey": dataKey // e10 或者 eteams 表单字段key
}
if(null != tmp && null != tmp.value && tmp.value.length > 0) {
for(var i = 0; i < tmp.value.length; i ++){
var op_id = tmp.value[i];
var item = tmp.option[optionId];
demo.dataOptions.push({
"optionId": op_id ,
"content": item.optionName,
"type": "file"
});
}
}
return demo;
}
// 明细表,获取基础字段所有行 数据
function getDetailSimpleLineWithKey(tmp, subFormId, dataKey){
var arr = [];
if(null != tmp){
for(var i = 0; i < tmp.length; i ++){
var demo = {
"content": "",
"dataIndex": i + 1, // 表示明细表的行
"subFormId": subFormId, // e10明细表的表单id
"dataKey": dataKey // 明细表的字段id
};
var r = tmp[i];
if(null != r && null != r.value && r.value.length > 0){
demo.content = r.value[0];
}
arr.push(demo);
}
}
return arr;
}
// 明细表,获取浏览字段所有行 数据
function getDetailOptionLineWithKey(ttf , subFormId, dataKey){
var arr = [];
if(null != ttf && null!=ttf&& ttf.length > 0){
for(var i = 0; i < ttf.length; i ++){
var demo = {
"dataOptions": [],
"dataIndex": i + 1, // 表示明细表的行
"subFormId": subFormId, // e10明细表的表单id
"dataKey": dataKey // 明细表的字段id
};
var r = ttf[i];
if(null != r && null != r.value && r.value.length > 0){
for(var j = 0; j < r.value.length; j++){
var op_id = r.value[j];
var opObj = {
"optionId": op_id,
"content": r.option[op_id]
};
demo.dataOptions.push(opObj);
}
}
arr.push(demo);
}
}
return arr;
}
// 明细表,获取上传附件所有行 数据
function getDetailFileLineWithKey(ttf , subFormId, dataKey){
var arr = [];
if(null != ttf && null!=ttf&& ttf.length > 0){
for(var i = 0; i < ttf.length; i ++){
var demo = {
"dataOptions": [],
"dataIndex": i + 1, // 表示明细表的行
"subFormId": subFormId, // e10明细表的表单id
"dataKey": dataKey // 明细表的字段id
};
var r = ttf[i];
if(null != r && null != r.value && r.value.length > 0){
for(var j = 0; j < r.value.length; j++){
var op_id = r.value[j];
var opObj = {
"optionId": op_id,
"content": r.option[op_id],
"type": "file"
};
demo.dataOptions.push(opObj);
}
}
arr.push(demo);
}
}
return arr;
}
4.4.2 “表单字段id”
// 获取小e表单填写的数据
function getFormValue(tmp){
if(null != tmp && null!=tmp.value && tmp.value.length > 0){
return tmp.value[0];
}
return "";
}
// 1.1 构造 普通字段: 日期、原因, 数字,字符串格式数据
function getSimpleWithId(tmp, id){
return {
"content": getFormValue(tmp),
"fieldId": id// e10 或者 eteams 表单字段id
};
}
// 2.1 构造 浏览类型数据
function getFormOptionWithId(tmp, fieldId){
var demo={
"dataOptions": [],
"fieldId": fieldId // e10 或者 eteams 表单字段id
}
if(null != tmp && null != tmp.value && tmp.value.length > 0) {
for(var i = 0; i < tmp.value.length; i ++){
var op_id = tmp.value[i];
demo.dataOptions.push({
"optionId": op_id,
"content": tmp.option[op_id]
});
}
}
return demo;
}
// 3.1 构造 附件字段类型数据
function getFormFileWithId(tmp, fieldId){
var demo={
"dataOptions": [],
"fieldId": fieldId // e10 或者 eteams 表单字段id
}
if(null != tmp && null != tmp.value && tmp.value.length > 0) {
for(var i = 0; i < tmp.value.length; i ++){
var op_id = tmp.value[i];
var item = tmp.option[optionId];
demo.dataOptions.push({
"optionId": op_id ,
"content": item.optionName,
"type": "file"
});
}
}
return demo;
}
5、流程案例
5.1、在智能小e中完成表单填写,不执行提交,在oa中可以直接查看表单内容,手动提交
通过配置,2个步骤即可实现:
- 修改参数配置:找到
otherParams,编辑 {“isnextflow”:1} 为 {“isnextflow”:0} ,从流转到不流转。 - 修改返回结果,
- 修改
无字段匹配配置变成有字段匹配配置

- 开启
去设置,编辑脚本

示例脚本
function run(object, index) { // 获取流程id var reqId = object.message.requestId; // 获取pc系统域名,$_CURRENT_WEB_DOMAIN_$是外联系统的访问地址,这里注意不一样要修改 // var pcdomain = "https://cloud.qianliling.com"; var pcdomain = $_CURRENT_WEB_DOMAIN_$; // 获取移动端系统域名,$_CURRENT_WEB_DOMAIN_$是外联系统的访问地址,这里注意不一样要修改 var appdomain = $_CURRENT_WEB_DOMAIN_$; // 是PC端跳转地址 var link = pcdomain + "/sp/workflow/flowpage/view/" + reqId; // 移动端跳转地址, var mobileLink = appdomain + "/mobile/workflow/flowpage/view/"+ reqId; // 提示标签,content-表示显示内容,color-表示颜色:purple、warning、error var tag = {"content": "", "color": ""}; return { "link": link, "mobileLink": mobileLink, "tag": tag, "fieldValue":"点击查看" }; } - 修改

43

被折叠的 条评论
为什么被折叠?



