介绍

AdminEAP框架中集成了Activiti工作流组件,使用了activiti-explorer中的在线流程设计器,其中在选择代理人(审批人)中,原生的操作是输入数据,没有和系统自动关联。同时,原生的在线流程设计器使用AngularJs写的,而框架使用的Jquery,两者之间集成需要注意几点,避免踩坑;

效果

1、Activiti流程设计器

2、选择代理人、候选人、候选组

3、选择代理人(单选)

4、选择候选人(多选)

5、选择候选组(多选)

核心代码

1、修改properties-assignment-controller.js

扩展候选人和候选组对象属性

第47行:$scope.assignment.candidateUsers = [{value: '', name: ''}]; 
第62行:$scope.assignment.candidateGroups = [{value: '', name: ''}]; 
这样在界面上既可以显示用户/用户组的名称,也显示实际存储的ID值

打开选择弹窗,数据回填的核心代码

  //-----------add select User/Group button handler By billJiang--------------//代理人(审批人)/候选人$scope.selectUser = function (multiple) {var title = "选择代理人(单选)"var ids = ($scope.assignment.assignee ? $scope.assignment.assignee : 0);if (multiple == 1) {title = "选择候选人(多选)";//候选人idids = 0;if($scope.assignment.candidateUsers) {var idsArr = [];//alert( $scope.assignment.candidateUsers.length);for (var i = 0; i < $scope.assignment.candidateUsers.length; i++) {if ($scope.assignment.candidateUsers[i].value)idsArr.push($scope.assignment.candidateUsers[i].value);}if (idsArr.length > 0) {ids = idsArr.join(",");}}}modals.openWin({winId: 'userSelectWin',url: basePath + '/activiti/user/select/' + multiple + '/' + ids,width: '800px',title: title})};//候选组$scope.selectGroup = function () {var ids = 0;if($scope.assignment.candidateGroups) {var idsArr = [];for (var i = 0; i < $scope.assignment.candidateGroups.length; i++) {if ($scope.assignment.candidateGroups[i].value)idsArr.push($scope.assignment.candidateGroups[i].value);}if (idsArr.length > 0) {ids = idsArr.join(",");}}modals.openWin({winId: 'groupSelectWin',url: basePath + '/activiti/group/select/' + ids,width: '1200px',title: '选择候选组(多选)'})}//回填受理人$scope.setAssignee = function (assignee, userName) {$scope.assignment.assignee = assignee;$scope.assignment.assigneeName = userName;//jQuery("#assigneeNameField").val(userName);$scope.$apply();};//回填候选人$scope.setCandidateUsers = function (userIds, userNames) {var users = null;if (!userIds) {$scope.assignment.candidateUsers = users;} else {var userIdArr = userIds.split(",");var userNameArr = userNames.split(",");users = [];for (var i = 0; i < userIdArr.length; i++) {var userObj = {};userObj["value"] = userIdArr[i];userObj["name"] = userNameArr[i];users.push(userObj);}$scope.assignment.candidateUsers = users;}$scope.$apply();};//回填候选组$scope.setCandidateGroups = function (groupIds, groupNames) {var groups = null;if (!groupIds) {$scope.assignment.candidateGroups = groups;} else {var groupIdArr = groupIds.split(",");var groupNameArr = groupNames.split(",");groups = [];for (var i = 0; i < groupIdArr.length; i++) {var groupObj = {};groupObj["value"] = groupIdArr[i];groupObj["name"] = groupNameArr[i];groups.push(groupObj);}$scope.assignment.candidateGroups = groups;}//加上这句话回填后界面立即生效$scope.$apply();};//--------------------------------------------------------------------------

以上代码需要注意scope.apply(), 否则回填以后界面双向绑定不能立即生效;

代理人、候选人选择的核心代码

代理人和候选人选择器使用了同一个界面,通过multiple参数值进行区分

var userSelectTable;var ids = "${ids?default(0)}";//回填idsids = ids == 0 ? '' : ids;var multiple = "${multiple?default(0)}";//默认单选//用户选择控制器var userSelectCtrl = {initTable: function () {jQuery("#userIds").val(ids);this.updateSelectedUserNames();var self = this;userSelectTable = new CommonTable("user_select_table", "id_user_list", "searchDiv_user_select");//回调选中userSelectTable.serverCallback = function () {self.setCheckBoxState();}},//查询 换页选择框回填setCheckBoxState: function () {var selectUserIds = jQuery("#userIds").val();if (selectUserIds) {var userIdArr = selectUserIds.split(",");//选中增加的用户jQuery.each(userIdArr, function (index, userId) {if (userSelectTable.table.$("#" + userId).length > 0) {userSelectTable.table.$("#" + userId).find(":checkbox.checkbox_user").prop("checked", true);}});//删除已经选中的userSelectTable.table.$("tr").find(":checkbox.checkbox_user:checked").each(function () {var curUserId = jQuery(this).parents("tr").attr("id");//找不到,已经被删除if (selectUserIds.indexOf(curUserId) == -1) {userSelectTable.table.$("#" + curUserId).find(":checkbox.checkbox_user").prop("checked", false);}});} else {jQuery(":checkbox.checkbox_user").prop("checked", false);}},//绑定用户选择事件bindSelectUserEvent: function () {jQuery("#selectUser").click(function () {var controllerScope = jQuery('div[ng-controller="KisBpmAssignmentPopupCtrl"]').scope();  // Get controller's scopevar userIds = jQuery("#userIds").val();var userNames = jQuery("#userNames").val();if (multiple == 0) {controllerScope.setAssignee(userIds, userNames);} else {controllerScope.setCandidateUsers(userIds, userNames);}modals.hideWin("userSelectWin");})},selectThis: function (obj) {var isChecked = jQuery(obj).is(":checked");//单选var userIds = jQuery("#userIds").val();if (userIds && userIds.split(',').length == 1 && multiple == 0 && isChecked) {alert("只能选择一个用户");jQuery(obj).attr("checked", false);return;}var value = jQuery(obj).parents("tr").eq(0).attr("id");var userArr = this.getSelectedUserArr(userIds, value, isChecked);jQuery("#userIds").val(userArr.join(","));this.updateSelectedUserNames();},updateSelectedUserNames: function () {var userIds = jQuery("#userIds").val();if (userIds == 0 || !userIds) {jQuery("#userNames").val("");} else {ajaxPost(basePath + "/activiti/user/names", {ids: userIds}, function (map) {jQuery("#userNames").val(map.name);});}},getSelectedUserArr: function (userIdss, curValue, isChecked) {var userArr = [];if (userIdss)userArr = userIdss.split(",");if (isChecked) {var flag = true;for (var i = 0; i < userArr.length; i++) {if (userArr[i] == curValue) {flag = false;break;}}if (flag)userArr.push(curValue);} else {for (var i = 0; i < userArr.length; i++) {var userIdValue = userArr[i];if (userIdValue == curValue) {userArr.splice(i, 1);break;}}}return userArr;}}function fnRenderSelectUser(value) {return "<input type='checkbox' value='1' class='checkbox_user' onchange='userSelectCtrl.selectThis(this)'>";}//方法入口jQuery(function () {userSelectCtrl.initTable();userSelectCtrl.bindSelectUserEvent();})

以上代码有三点需要特别注意 
(1)使用jQuery选择器时,使用jQuery而不用,否则报(…)未定义的异常,因为弹出的选择器窗口依然在angularJs的域中,不能识别$。 
(2)数据回填时,使用controllerScope = jQuery('div[ng-controller="KisBpmAssignmentPopupCtrl"]').scope() 获取回填于对象,然后执行相关操作 
(3)因为modeler.html中引用了prototype-1.5.1.js,在使用JSON.stringify时,会调用Array的toJSON方法,从而导致带有数组的JSON格式的字符串参数到后台后无法转换为相应的对象。所以使用了以下toJSONString()对JSON对象进行字符串化。

  CommonTable.prototype.toJSONString = function (value) {var _array_tojson = Array.prototype.toJSON;delete Array.prototype.toJSON;var r = JSON.stringify(value);Array.prototype.toJSON = _array_tojson;return r;}
版权声明:本文为博主原创文章,未经博主允许不得转载。

activiti自定义代理人、候选人、候选组选择相关推荐

  1. activiti自定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建         (2)创建流程模型:activiti自定义流程之Sprin ...

  2. activiti自定义_在Activiti中执行自定义查询

    activiti自定义 (这可能最终会出现在Activiti 5.15版本的用户指南中,但是我已经想要共享它了) Activiti API允许使用高级API与数据库进行交互. 例如,对于检索数据,查询 ...

  3. Activiti 自定义流程图颜色

    Activiti 自定义流程图颜色 流程图执行的为绿色,待执行为红色. 绘制流程图 package org.jeecg.common.config;/*** activiti6流程图绘制** @aut ...

  4. Activiti,自定义表单,外置表单,工作流,微服务,子系统

    百度,csdn找了半个月,没有一篇文章将 Activiti 外置表单 讲透彻的,无奈,自己亲手写了一套, 祭出这套大杀器,开放给广大网友. 点击极速体验 账号密码:admin admin123 系统功 ...

  5. flowable 候选人候选组同时使用

    目录 前言 一.流程xml 二.测试流程 1.部署流程 2.启动流程 3.获取任务 总结 前言 本文主要演示候选组和和候选人同时使用的场景. 一.流程xml <?xml version=&quo ...

  6. java代码制作activiti会签_工作流 activiti 自定义下一审批人和多人会签的简单实现...

    1.动态指定下一审批人 在这里我使用的是监听器模式 首先看整体的流程图 在需要动态指定审批人的节点上添加一个任务监听器 这是已经添加好的监听器 选择create  然后将需要使用的监听器路径写上. j ...

  7. 工作流 activiti 自定义下一审批人和多人会签的简单实现

    1.动态指定下一审批人 在这里我使用的是监听器模式 首先看整体的流程图 在需要动态指定审批人的节点上添加一个任务监听器 这是已经添加好的监听器 选择create  然后将需要使用的监听器路径写上. j ...

  8. activiti自定义流程之整合(六):获取我的申请任务

    流程启动后,流程节点便进入到了任务相关的部分.可以看到我之前的做法是在启动节点就绑定了form表单,启动时就填写相关的数据.实际上在之前我的做法是不对开始节点做任何操作,知道任务节点的时候再填写相关的 ...

  9. 4.1 任务办理人,任务候选人,任务候选组

    1.定义描述 1.1 任务办理人:assignee 办理人只能指定一个人,不能使用逗号分隔. 默认执行签收操作taskService.claim(taskId, currentUserId); 在AC ...

最新文章

  1. 对象存在性检测集中管理
  2. 人工智能的2020:泡沫破灭?还是最后的狂欢?
  3. 走向ASP.NET架构设计-第六章-服务层设计(中篇)
  4. 【深度学习】医学图像处理之视杯视盘分割调研分析
  5. 自己封装js组件 - 中级
  6. 指南:如何运用谷歌Google Shopping和Product Listing Ads
  7. 用JavaScript访问SAP云平台上的服务遇到跨域问题该怎么办
  8. 有抱负/初级开发人员的良好习惯-避免使用的习惯
  9. 产品经理如何避免被程序员打?
  10. 阿里开源自研语音识别模型 DFSMN,准确率高达96.04%
  11. python3.7怎么安装tensorflow_gpu_(更新版)python3.7 Windows10 tensorflow-GPU 安装
  12. C++之构造函数、(构造)函数重载探究
  13. 屏幕录制生成gif文件神器和相关操作 GifCam
  14. 计算机一级考试题库基础知识,计算机一级考试题库(含答案)
  15. FxFactory pro for mac(视觉特效插件包)含破解码教程
  16. 三年级优秀书籍推荐_三年级好书推荐
  17. Shell学习笔记:#*、%*字符串掐头去尾方法
  18. JAVA版B2B2C商城源码多商户入驻商城
  19. vscode修改快捷键为idea的快捷键
  20. 如何判断您是否需要新的iPhone电池

热门文章

  1. 记录解决 <应用程序无法正常启动(0xc0000142) > 的过程
  2. 史上最细,Charles抓包工具的基本配置、查找接口的方法、爬取中国大学Mooc整门课程
  3. pca 累积方差贡献率公式_累计方差贡献率和方差贡献率是什么关系SPSS中~~
  4. 小米手环app android,小米健康官方app
  5. 关于安装appium 时 cnpm不是内部命令的解决(¥61)
  6. python创建游戏代码_用Python类创建纸牌游戏
  7. python上怎么改字体颜色_在python2.7中更改字体颜色
  8. 这个车还不错,优势在于外观个性,内饰做工精湛,底盘延续了雪铁龙家族的拿手活。
  9. 移位法实现单片机I/O口输出控制8个LED灯循环点亮。
  10. 面试了字节、美团、腾讯等30几家公司后,才知道软件测试面试全是这个套路......