帖子
帖子
用户
博客
课程
显示全部楼层
143
帖子
2
勋章
4万+
Y币

案例-审批流扩展案例

[复制链接]
发表于 2023-12-14 21:09:08
本帖最后由 yonyouhmm 于 2024-3-4 14:04 编辑

一、案例说明
    如何在最后一级审批人审批或驳回后做扩展?
    如何在中间环节审批人审批或驳回后做扩展?
    如何使用流程中的脚本活动?
    PC和移动端的监听事件?
二、最后一级审批人审批或驳回后做扩展
    如果项目中只需要最后一级审批人审批或驳回后做扩展,那么就扩展audit和unaudit动作,虽然工作流设计器中的脚本也能使用,但是流程中的脚本执行是异步的,不作为最佳选择。使用此方式扩展在消息中心不打开单据审批,也会触发。下面以扩展audit动作演示,unaudit动作的扩展操作相同
1、创建一个单实体,构建单卡页面,并创建一个工作流
大家实践的时候在实体中增加一个大文本字段

页面:页面编码要和业务对象编码一致

工作流:两级审批,都是发起人审批

2、扩展audit动作
位置

添加自定义规则

新建函数

编辑函数

3、新增数据提交测试
最后一级审批人同意时,执行了我们的脚本

三、中间环节审批人审批或驳回后做扩展
如果项目中需要监听中间环节的审批人的操作,那么目前只能使用工作流中的“脚本”功能,活动节点开启“是否使用函数”,脚本里代码执行是异步的,我们不能以throw new Error()的形式查看,我这里将脚本中接受到的参数更新到一个字段中来查看。
1、工作流设计器中的脚本

2、编写脚本,把方法接受到的参数更新到单据的大文本字段中

3、活动节点开启“是否使用函数”

4、审批同意走的环节结束的方法
重要参数:
processEnd:流程是否结束
businessKey:分割下划线,下划线后面就是单据的id
  1. 环节结束: {
  2.     "processEnd": false,
  3.     "userPhone": "xxx",
  4.     "language": "zh_CN",
  5.     "tenantCode": "developplatform_a2dvwyc8",
  6.     "userName": "xxx",
  7.     "userId": "xxxxxxx",
  8.     "processDefinitionKey": "processcenter_06c8464b",
  9.     "activityId": "approveUserTask_10f39346a3b04fda8df7e438bec4a38d",
  10.     "mainTenantId": "a2dvwyc8",
  11.     "businessKey": "flowBranch_1884269421585760258",
  12.     "userMail": "hu@yonyou.com",
  13.     "tenantId": "a2dvwyc8_developplatform",
  14.     "processInstId": "71f592dc-9a7e-11ee-8281-6295f09f4149",
  15.     "yht_access_token": "bttMGZBTUQwaHh0Vsss02526089183TGTGdccore3iuap-apcom-workbench1e6defefYT",
  16.     "category": "developplatform.flowBranch",
  17.     "appSource": "developplatform"
  18. }
复制代码
5、审批人退回走流程完成的方法

重要参数:
processEnd:流程是否结束
businessKey:分割下划线,下划线后面就是单据的id

  1. 流程完成: {
  2.     "processActionType": "suspension",
  3.     "bpmCallbackRequestId": "20231214719c096548cf478d8c5020411f92e1af",
  4.     "processEnd": false,
  5.     "userPhone": "xxx",
  6.     "canBeArchived": false,
  7.     "language": "zh_CN",
  8.     "source": "developplatform",
  9.     "tenantCode": "developplatform_a2dvwyc8",
  10.     "uuid": "xxx",
  11.     "userCode": "YHT-568838-xxx",
  12.     "processDefinitionKey": "processcenter_06c8464b",
  13.     "msgComment": "不同意",
  14.     "bpmCallbackRequestTs": 1702558166266,
  15.     "userName": "xxxx",
  16.     "userId": "7f8d88ab-1bfxx28abbf803c0f",
  17.     "deleteReason": "REJECTTOSTART",
  18.     "mainTenantId": "a2dvwyc8_developplatform",
  19.     "businessKey": "flowBranch_1884269421585760258",
  20.     "userMail": "hu@yonyou.com",
  21.     "tenantId": "a2dvwyc8_developplatform",
  22.     "processInstId": "3166ab2f-9a7f-11ee-aca9-4a3d4ba2e418",
  23.     "yht_access_token": "bttMGZBTUQwaHh0Vk5HZjx2526089183TGTGdccore3iuap-apcom-workbench1e6defefYT",
  24.     "appSource": "developplatform",
  25.     "category": "developplatform.flowBranch",
  26.     "ts": 1702558166266
  27. }
复制代码

四、工作流中的脚本活动
工作流中的脚本活动的作用,主要是为了满足使用脚本动态设置审批人的场景。
1、创建流程变量
我这里创建两个一个是单值一个是数组

2、添加脚本活动

以数组为例,变量绑定新增的后端函数

3、编辑脚本
这是数组类型的脚本,注意return。如果是单值,就return {userId:"xxxx"},其实对象的key随意
  1. let AbstractTrigger = require('AbstractTrigger');
  2. class MyTrigger extends AbstractTrigger {
  3.   execute(context, param) {
  4.     const userIdArr = [];
  5.     userIdArr.push("7f8d88ab-1bfa-4183-be47-28abbf803c0f");

  6.     return {userId:userIdArr};
  7.   }
  8. }
  9. exports({ entryPoint: MyTrigger });
复制代码
4、活动节点设置流程变量


到这里,就可以正常去审批了!


一个流程脚本实例:迭代查询所有上级部门是否有负责人

let AbstractTrigger = require('AbstractTrigger');
function getDeptPrincipal(deptId) {
  let sql = "select principal,principal.name as name,parent,orgtype from bd.adminOrg.AdminOrgVO where id='" + deptId + "'";
  var res = ObjectStore.queryByYonQL(sql, 'ucf-org-center');
  if (res[0].orgtype != 2) {
    return '1';
  }
  if (res[0].principal) {
    return '0';
  }


  if (res[0].parent) {
    return getDeptPrincipal(res[0].parent);
  }
}
class MyTrigger extends AbstractTrigger {
  execute(context, param) {
    let deptId = param.variablesMap.initiatorDept;
    let flag = getDeptPrincipal(deptId);


    return {flag:flag};
  }
}
exports({ entryPoint: MyTrigger });


五、PC和移动端的监听事件
1、pc端
//打开审批组件前
  1. viewModel.on('beforeWorkflow', ({ params, data }) => {
  2.     // 可以在这里修改传给审批组件的值 data.bussinessKey等
  3.     data.rejectToActivity = true
  4. })
复制代码
//关闭审批组件
  1. viewModel.on('workFlowClose', (callbackData) => {
  2.   debugger;
  3. })
复制代码
//审批组件中点击确定按钮
  1. viewModel.on('afterWorkflowBeforeQueryAsync', (data) => { // 处理逻辑 })
复制代码
//点击确定按钮前
  1. viewModel.on('beforeWorkflowAction', ({ data, resolve }) => {
  2.     // data: 审批流传入的数据
  3.    // resolve: 自己的异步逻辑执行完成之后成功调用 resolve(true) 失败调用 resolve(false)
  4.   if ('成功') {
  5.     resolve(true)
  6.   } else {
  7.    resolve(false)
  8.   }
  9.   return false; // 这个也必须这么写
  10. });
复制代码

2、移动端
//审批加载实例前事件
  1. viewModel.on('beforeWorkflowShow', function(params) {
  2.     // 可以在这里修改审批流传人参数,比如businessKey等
  3. })
复制代码
//审批面板关闭前
  1. viewModel.on('beforeWorkflowClose', function(params) {
  2.     if (params.processStatus) {
  3.     // 点了确定按钮
  4.   } else {
  5.     // 单纯的关闭审批面板
  6.   }
  7. })
复制代码
//点确定按钮前事件
  1. viewModel.on('beforeWorkflowAction', ({ data, resolve }) => {
  2.     // data: 审批流传入的数据
  3.    // resolve: 自己的异步逻辑执行完成之后成功调用 resolve(true) 失败调用 resolve(false)
  4.   if ('成功') {
  5.     resolve(true)
  6.   } else {
  7.    resolve(false)
  8.   }
  9.   return false; // 这个也必须这么写
  10. });
复制代码


本帖子中包含更多资源,您需要 登录 才可以下载或查看,没有帐号?立即注册

X
0
帖子
0
勋章
7
Y币
正好需要撤回时做下推单据处理,老师的资料太及时了
11
帖子
0
勋章
109
Y币
老师,您好,我在活动节点-操作功能下没有找到“是否使用函数”的选项,请问还需要其他特殊处理吗?环境版本:930SP + 1130QP。
143
帖子
2
勋章
4万+
Y币
佛山-蔡鑫 · 2024-2-28 11:19老师,您好,我在活动节点-操作功能下没有找到“是否使用函数”的选项,请问还需要其他特殊处理吗?环境版本:930SP + 1130QP。

私有云的话  要提工单问下
您需要登录后才可以回帖 登录

本版积分规则