From 56d880b45948483f92f1ce4ab337c30cd958f3dd Mon Sep 17 00:00:00 2001 From: wanggeng <450292408@qq.com> Date: Mon, 4 Apr 2022 01:48:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0UserTask=E7=9A=84OA=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E7=AE=A1=E7=90=86=EF=BC=8C=E5=85=B3=E9=97=AD=E6=A8=A1?= =?UTF-8?q?=E6=80=81=E6=A1=86=E7=82=B9=E5=87=BB=E8=83=8C=E6=99=AF=E5=85=B3?= =?UTF-8?q?=E9=97=AD=EF=BC=8C=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=E4=B8=8E?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/OaUserTaskCompleteListener.java | 51 ++- .../activiti/impl/ActivitiServiceImpl.java | 2 +- .../properties-assignment-controller.js | 2 + ...perties-condition-expression-controller.js | 2 + .../properties-event-listeners-controller.js | 2 + ...operties-execution-listeners-controller.js | 2 + .../properties-fields-controller.js | 2 + .../properties-form-properties-controller.js | 2 + .../properties-form-select-controller.js | 2 + .../properties-in-parameters-controller.js | 2 + ...operties-message-definitions-controller.js | 2 + .../properties-oa-node-manage-controller.js | 244 ++++++++++++ ...roperties-sequenceflow-order-controller.js | 2 + ...roperties-signal-definitions-controller.js | 2 + .../properties-task-listeners-controller.js | 191 ++++----- .../editor-app/configuration/properties.js | 4 + .../oa-node-manage-display-template.html | 2 + .../properties/oa-node-manage-popup.html | 362 ++++++++++++++++++ .../oa-node-manage-write-template.html | 1 + .../configuration/toolbar-default-actions.js | 8 +- .../resources/static/editor-app/editor.html | 2 +- .../src/main/resources/static/stencilset.json | 14 + .../resources/templates/activiti/update.html | 3 +- .../api/design/FormFieldController.java | 42 ++ .../service/design/IFormFieldService.java | 9 +- .../design/impl/FormFieldServiceImpl.java | 9 +- 26 files changed, 837 insertions(+), 129 deletions(-) create mode 100644 module-activiti/src/main/resources/static/editor-app/configuration/properties-oa-node-manage-controller.js create mode 100644 module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-display-template.html create mode 100644 module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-popup.html create mode 100644 module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-write-template.html create mode 100644 module-form/src/main/java/ink/wgink/module/form/controller/api/design/FormFieldController.java diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/listener/task/OaUserTaskCompleteListener.java b/module-activiti/src/main/java/ink/wgink/module/activiti/listener/task/OaUserTaskCompleteListener.java index 26712698..c9f91ac7 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/listener/task/OaUserTaskCompleteListener.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/listener/task/OaUserTaskCompleteListener.java @@ -8,11 +8,14 @@ import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.delegate.JavaDelegate; import org.activiti.engine.delegate.TaskListener; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.List; import java.util.Map; /** @@ -29,6 +32,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { @Autowired private RuntimeService runtimeService; + @Autowired private IActivitiModelService activitiModelService; @Autowired @@ -38,11 +42,42 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { public void notify(DelegateTask delegateTask) { LOG.debug(">>>> userTask complete"); Map variables = delegateTask.getVariables(); + + LOG.debug("查询表单数据:variables: {}", variables); UserTask nextUserTask = activitiModelService.getNextUserTask(delegateTask.getTaskDefinitionKey(), delegateTask.getProcessDefinitionId(), variables); - // 1、nrOfInstances 该会签环节中总共有多少个实例 2、nrOfActiveInstances 当前活动的实例的数量,即还没有 完成的实例数量。 3、nrOfCompletedInstances 已经完成的实例的数量 + if (nextUserTask != null) { + if (StringUtils.equals(nextUserTask.getName(), "任务3")) { +// nextUserTask.setAssignee("${signUser}"); +// MultiInstanceLoopCharacteristics characteristics = new MultiInstanceLoopCharacteristics(); +// characteristics.setInputDataItem("signUsers"); +// characteristics.setElementVariable("signUser"); +// characteristics.setSequential(false); +// characteristics.setCompletionCondition("${nrOfCompletedInstances==nrOfInstances}"); +// nextUserTask.setLoopCharacteristics(characteristics); - // 设置会签 + List signUsers = new ArrayList<>(); + signUsers.add("1"); + signUsers.add("e48e9c4a-995e-4061-abcd-a3c260c11333"); + +// runtimeService.setVariable(delegateTask.getExecutionId(), "signUsers", signUsers); + delegateTask.setVariable("signUsers", signUsers); + } else { + nextUserTask.setAssignee("1"); + } + } + + } + + @Override + public void execute(DelegateExecution execution) { + + } + + + // 1、nrOfInstances 该会签环节中总共有多少个实例 2、nrOfActiveInstances 当前活动的实例的数量,即还没有 完成的实例数量。 3、nrOfCompletedInstances 已经完成的实例的数量 + + // 设置会签 // // 获取多实例配置 // MultiInstanceLoopCharacteristics characteristics = new MultiInstanceLoopCharacteristics(); // // 设置集合变量,统一设置成users @@ -57,8 +92,8 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { // userTask.setLoopCharacteristics(characteristics); - // 清空会签 - // 获取多实例配置 + // 清空会签 + // 获取多实例配置 // MultiInstanceLoopCharacteristics characteristics = userTask.getLoopCharacteristics(); // if (characteristics != null) { // // 清空集合 @@ -70,13 +105,5 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { // // 清空条件 // characteristics.setCompletionCondition(""); // } - if (nextUserTask != null) { - nextUserTask.setAssignee("1"); - } - } - @Override - public void execute(DelegateExecution execution) { - - } } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiServiceImpl.java index 09f3b5a7..53eeeb04 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiServiceImpl.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiServiceImpl.java @@ -172,7 +172,7 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti if (formPO == null) { throw new SystemException("表单不存在"); } - List formFieldPOs = formFieldService.listPO(formPO.getFormId()); + List formFieldPOs = formFieldService.listPOByFormId(formPO.getFormId()); if (formFieldPOs.isEmpty()) { throw new SystemException("表单字段为空"); } diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties-assignment-controller.js b/module-activiti/src/main/resources/static/editor-app/configuration/properties-assignment-controller.js index 1939ea0c..4480b65b 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/properties-assignment-controller.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties-assignment-controller.js @@ -25,6 +25,8 @@ var KisBpmAssignmentCtrl = ['$scope', '$modal', function ($scope, $modal) { // Config for the modal window var opts = { template: 'editor-app/configuration/properties/assignment-popup.html?version=' + Date.now(), + backdrop: 'static', + keyboard: false, scope: $scope }; diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties-condition-expression-controller.js b/module-activiti/src/main/resources/static/editor-app/configuration/properties-condition-expression-controller.js index 8370095e..3ad2f2d9 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/properties-condition-expression-controller.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties-condition-expression-controller.js @@ -26,6 +26,8 @@ var KisBpmConditionExpressionCtrl = [ '$scope', '$modal', function($scope, $moda // Config for the modal window var opts = { template: 'static/editor-app/configuration/properties/condition-expression-popup.html?version=' + Date.now(), + backdrop: 'static', + keyboard: false, scope: $scope }; diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties-event-listeners-controller.js b/module-activiti/src/main/resources/static/editor-app/configuration/properties-event-listeners-controller.js index 6bb0face..94b8c6be 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/properties-event-listeners-controller.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties-event-listeners-controller.js @@ -26,6 +26,8 @@ var KisBpmEventListenersCtrl = [ '$scope', '$modal', '$timeout', '$translate', f // Config for the modal window var opts = { template: 'editor-app/configuration/properties/event-listeners-popup.html?version=' + Date.now(), + backdrop: 'static', + keyboard: false, scope: $scope }; diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties-execution-listeners-controller.js b/module-activiti/src/main/resources/static/editor-app/configuration/properties-execution-listeners-controller.js index abe74e53..8023862e 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/properties-execution-listeners-controller.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties-execution-listeners-controller.js @@ -26,6 +26,8 @@ var KisBpmExecutionListenersCtrl = [ '$scope', '$modal', '$timeout', '$translate // Config for the modal window var opts = { template: 'editor-app/configuration/properties/execution-listeners-popup.html?version=' + Date.now(), + backdrop: 'static', + keyboard: false, scope: $scope }; diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties-fields-controller.js b/module-activiti/src/main/resources/static/editor-app/configuration/properties-fields-controller.js index 3066c04f..d829981b 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/properties-fields-controller.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties-fields-controller.js @@ -26,6 +26,8 @@ var KisBpmFieldsCtrl = [ '$scope', '$modal', '$timeout', '$translate', function( // Config for the modal window var opts = { template: 'editor-app/configuration/properties/fields-popup.html', + backdrop: 'static', + keyboard: false, scope: $scope }; diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties-form-properties-controller.js b/module-activiti/src/main/resources/static/editor-app/configuration/properties-form-properties-controller.js index 16f70b10..e06147a5 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/properties-form-properties-controller.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties-form-properties-controller.js @@ -26,6 +26,8 @@ var KisBpmFormPropertiesCtrl = [ '$scope', '$modal', '$timeout', '$translate', f // Config for the modal window var opts = { template: 'editor-app/configuration/properties/form-properties-popup.html?version=' + Date.now(), + backdrop: 'static', + keyboard: false, scope: $scope }; diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties-form-select-controller.js b/module-activiti/src/main/resources/static/editor-app/configuration/properties-form-select-controller.js index 62193594..27e0c7be 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/properties-form-select-controller.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties-form-select-controller.js @@ -23,6 +23,8 @@ var FormSelectWriteController = ['$scope', '$modal', function($scope, $modal) { $modal({ template: 'editor-app/configuration/properties/form-select-template.html?version=' + Date.now(), + backdrop: 'static', + keyboard: false, scope: $scope }); }]; diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties-in-parameters-controller.js b/module-activiti/src/main/resources/static/editor-app/configuration/properties-in-parameters-controller.js index bfb39a75..656d3cd9 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/properties-in-parameters-controller.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties-in-parameters-controller.js @@ -26,6 +26,8 @@ var KisBpmInParametersCtrl = [ '$scope', '$modal', '$timeout', '$translate', fun // Config for the modal window var opts = { template: 'editor-app/configuration/properties/in-parameters-popup.html?version=' + Date.now(), + backdrop: 'static', + keyboard: false, scope: $scope }; diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties-message-definitions-controller.js b/module-activiti/src/main/resources/static/editor-app/configuration/properties-message-definitions-controller.js index 062230eb..6dfccc8a 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/properties-message-definitions-controller.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties-message-definitions-controller.js @@ -26,6 +26,8 @@ angular.module('activitiModeler').controller('ActivitiMessageDefinitionsCtrl', [ // Config for the modal window var opts = { template: 'editor-app/configuration/properties/message-definitions-popup.html?version=' + Date.now(), + backdrop: 'static', + keyboard: false, scope: $scope }; diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties-oa-node-manage-controller.js b/module-activiti/src/main/resources/static/editor-app/configuration/properties-oa-node-manage-controller.js new file mode 100644 index 00000000..70eec6c0 --- /dev/null +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties-oa-node-manage-controller.js @@ -0,0 +1,244 @@ +var OaNodeManageCtrl = [ '$scope' , '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) { + var opts = { + template: 'editor-app/configuration/properties/oa-node-manage-popup.html?version=' + Date.now(), + backdrop: 'static', + keyboard: false, + scope: $scope + }; + $modal(opts); +}]; + +var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $timeout, $http) { + // console.log($scope.selectedItem); + // console.log($scope.editor); + // console.log($scope.editor.modelMetaData.model.childShapes); + // console.log($scope.stencilItemGroups) + // 获取流程中的配置 + var model = $scope.editor.modelMetaData.model; + var childShapes = model.childShapes; + // 关联到的属性 + var taskListenerProperty = $scope.selectedItem.properties[16]; + + // 初始化 + var startNode; + $scope.oaNodeManage = { + assignee: { + nodeType: 'normal', + assigneeType: '', + assigneeCount: 0, + assignee: '', + autoAssignType: '', + departmentType: '', + departments: '', + roles: '', + positions: '', + quickAssignee: '', + signType: '', + signUsers: '', + completeCondition: '', + completeCount: 0 + }, + formId: '', + formFields: [], + oaUserTaskListeners: [] + } + + // 添加用户任务监听器 + function addOaUserTaskListener(event, className, expression, delegateExpression) { + var implementation = ''; + if (className) { + implementation = className; + } else if (expression) { + implementation = expression; + } else if (delegateExpression) { + implementation = delegateExpression; + } + $scope.oaNodeManage.oaUserTaskListeners.push({ + event: event, + implementation: implementation, + className: className ? className : '', + expression: expression ? expression : '', + delegateExpression: delegateExpression ? delegateExpression : '' + }); + } + /** + * 判断监听器是否存在 + * @param event + * @param className + */ + function isListenerExist(event, className) { + for (var i = 0, item; item = $scope.oaNodeManage.oaUserTaskListeners[i++];) { + if (item.event == event && item.className == className) { + return true; + } + } + return false; + } + + $scope.addOaUserTaskCreateListener = function () { + var event = 'create', + className = '', + expression = '', + delegateExpression = '${oaUserTaskCreateListener}'; + if (isListenerExist(event, className)) { + top.dialog.msg('监听器已经存在'); + return; + } + addOaUserTaskListener(event, className, expression, delegateExpression); + } + $scope.addOaUserTaskAssignmentListener = function () { + var event = 'assignment', + className = '', + expression = '', + delegateExpression = '${oaUserTaskAssignmentListener}'; + if (isListenerExist(event, className)) { + top.dialog.msg('监听器已经存在'); + return; + } + addOaUserTaskListener(event, className, expression, delegateExpression); + } + $scope.addOaUserTaskDeleteListener = function () { + var event = 'delete', + className = '', + expression = '', + delegateExpression = '${oaUserTaskDeleteListener}'; + if (isListenerExist(event, className)) { + top.dialog.msg('监听器已经存在'); + return; + } + addOaUserTaskListener(event, className, expression, delegateExpression); + } + // 上移用户任务监听器 + $scope.moveOaUserTaskListenerUp = function(index) { + var prevIndex = index - 1; + var temp = $scope.oaNodeManage.oaUserTaskListeners[index]; + $scope.oaNodeManage.oaUserTaskListeners.splice(index, 1); + $timeout(function () { + $scope.oaNodeManage.oaUserTaskListeners.splice(prevIndex, 0, temp); + }, 10); + } + // 下移用户任务监听器 + $scope.moveOaUserTaskListenerDown = function(index) { + var nextIndex = index + 1; + var temp = $scope.oaNodeManage.oaUserTaskListeners[index]; + $scope.oaNodeManage.oaUserTaskListeners.splice(index, 1); + $timeout(function () { + $scope.oaNodeManage.oaUserTaskListeners.splice(nextIndex, 0, temp); + }, 10); + } + // 删除用户任务监听器 + $scope.deleteOaUserTaskListener = function(index) { + $scope.oaNodeManage.oaUserTaskListeners.splice(index, 1); + } + + // Click handler for save button + $scope.save = function () { + + $scope.property.value = {}; + $scope.property.value = $scope.oaNodeManage; + $scope.updatePropertyInModel($scope.property); + + // 更新任务监听器列表 + taskListenerProperty.value = {} + taskListenerProperty.value.taskListeners = $scope.oaNodeManage.oaUserTaskListeners; + $scope.updatePropertyInModel(taskListenerProperty); + $scope.close(); + }; + + $scope.cancel = function () { + $scope.close(); + }; + + // Close button handler + $scope.close = function () { + taskListenerProperty.mode = 'read'; + $scope.property.mode = 'read'; + $scope.$hide(); + }; + + function initOaNodeManage() { + if($scope.property.value) { + $scope.oaNodeManage = $scope.property.value; + } + } + + // 初始化开始节点 + function initStartNode() { + for(var i = 0, node; node = childShapes[i++];) { + if(node.stencil.id == 'StartNoneEvent') { + startNode = node; + break; + } + } + if(!startNode) { + top.dialog.msg('未找到开始节点,无法设置OA节点'); + $scope.close(); + return; + } + } + + // 初始化form表单ID + function initFormId() { + $scope.oaNodeManage.formId = startNode.properties.formkeydefinition; + if(!$scope.oaNodeManage.formId) { + top.dialog.msg('开始节点未绑定表单,无法设置OA节点'); + $scope.close(); + return; + } + } + + // 初始化form表单 + function initFormField() { + $http.get('api/form-field/list/form-id/'+ $scope.oaNodeManage.formId).then(function(response) { + var formFields = []; + for(var i = 0, formField; formField = response.data[i++];) { + var isVisible = true; + var isEditable = true; + for(var j = 0, item; item = $scope.oaNodeManage.formFields[j++];) { + if(formField.fieldId === item.fieldId) { + isVisible = item.isVisible; + isEditable = item.isEditable; + } + } + formFields.push({ + fieldId: formField.fieldId, + fieldName: formField.fieldName, + fieldExplain: formField.fieldExplain, + fieldTag: formField.fieldTag, + fieldType: formField.fieldType, + isVisible: isVisible, + isEditable: isEditable + }) + } + $scope.oaNodeManage.formFields = formFields; + }, function(response) { + top.dialog.msg(response.data.msg); + }) + } + + // 初始化oaUserTaskCompleteListener + function initOaUserTaskCompleteListener() { + if($scope.property.value) { + return; + } + var event = 'complete', + className = '', + expression = '', + delegateExpression = '${oaUserTaskCompleteListener}'; + if (isListenerExist(event, className)) { + top.dialog.msg('监听器已经存在'); + return; + } + addOaUserTaskListener(event, className, expression, delegateExpression); + } + + // 初始化 + (function() { + initOaNodeManage(); + initStartNode(); + initFormId(); + initFormField(); + initOaUserTaskCompleteListener(); + })(); + +}]; \ No newline at end of file diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties-sequenceflow-order-controller.js b/module-activiti/src/main/resources/static/editor-app/configuration/properties-sequenceflow-order-controller.js index c1a53b00..74dec70a 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/properties-sequenceflow-order-controller.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties-sequenceflow-order-controller.js @@ -26,6 +26,8 @@ var KisBpmSequenceFlowOrderCtrl = [ '$scope', '$modal', '$timeout', '$translate' // Config for the modal window var opts = { template: 'editor-app/configuration/properties/sequenceflow-order-popup.html?version=' + Date.now(), + backdrop: 'static', + keyboard: false, scope: $scope }; diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties-signal-definitions-controller.js b/module-activiti/src/main/resources/static/editor-app/configuration/properties-signal-definitions-controller.js index 55814113..3230d8cf 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/properties-signal-definitions-controller.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties-signal-definitions-controller.js @@ -22,6 +22,8 @@ angular.module('activitiModeler').controller('ActivitiSignalDefinitionsCtrl', [' // Config for the modal window var opts = { template: 'editor-app/configuration/properties/signal-definitions-popup.html?version=' + Date.now(), + backdrop: 'static', + keyboard: false, scope: $scope }; diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties-task-listeners-controller.js b/module-activiti/src/main/resources/static/editor-app/configuration/properties-task-listeners-controller.js index af1003c3..9634fc47 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/properties-task-listeners-controller.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties-task-listeners-controller.js @@ -21,11 +21,13 @@ * Task listeners */ -var KisBpmTaskListenersCtrl = [ '$scope', '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) { +var KisBpmTaskListenersCtrl = ['$scope', '$modal', '$timeout', '$translate', function ($scope, $modal, $timeout, $translate) { // Config for the modal window var opts = { - template: 'editor-app/configuration/properties/task-listeners-popup.html?version=' + Date.now(), + template: 'editor-app/configuration/properties/task-listeners-popup.html?version=' + Date.now(), + backdrop: 'static', + keyboard: false, scope: $scope }; @@ -33,37 +35,28 @@ var KisBpmTaskListenersCtrl = [ '$scope', '$modal', '$timeout', '$translate', fu $modal(opts); }]; -var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', function($scope, $timeout, $q, $translate) { +var KisBpmTaskListenersPopupCtrl = ['$scope', '$timeout', '$q', '$translate', function ($scope, $timeout, $q, $translate) { // Put json representing form properties on scope if ($scope.property.value !== undefined && $scope.property.value !== null && $scope.property.value.taskListeners !== undefined && $scope.property.value.taskListeners !== null) { - - if ($scope.property.value.taskListeners.constructor == String) - { + + if ($scope.property.value.taskListeners.constructor == String) { $scope.taskListeners = JSON.parse($scope.property.value.taskListeners); - } - else - { + } else { // Note that we clone the json object rather then setting it directly, // this to cope with the fact that the user can click the cancel button and no changes should have happened $scope.taskListeners = angular.copy($scope.property.value.taskListeners); } - - for (var i = 0; i < $scope.taskListeners.length; i++) - { + + for (var i = 0; i < $scope.taskListeners.length; i++) { var taskListener = $scope.taskListeners[i]; - if (taskListener.className !== undefined && taskListener.className !== '') - { + if (taskListener.className !== undefined && taskListener.className !== '') { taskListener.implementation = taskListener.className; - } - else if (taskListener.expression !== undefined && taskListener.expression !== '') - { + } else if (taskListener.expression !== undefined && taskListener.expression !== '') { taskListener.implementation = taskListener.expression; - } - else if (taskListener.delegateExpression !== undefined && taskListener.delegateExpression !== '') - { + } else if (taskListener.delegateExpression !== undefined && taskListener.delegateExpression !== '') { taskListener.implementation = taskListener.delegateExpression; } } @@ -75,14 +68,14 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f $scope.selectedListeners = []; $scope.selectedFields = []; $scope.translationsRetrieved = false; - + $scope.labels = {}; - + var eventPromise = $translate('PROPERTY.TASKLISTENERS.EVENT'); var implementationPromise = $translate('PROPERTY.TASKLISTENERS.FIELDS.IMPLEMENTATION'); var namePromise = $translate('PROPERTY.TASKLISTENERS.FIELDS.NAME'); - - $q.all([eventPromise, implementationPromise, namePromise]).then(function(results) { + + $q.all([eventPromise, implementationPromise, namePromise]).then(function (results) { $scope.labels.eventLabel = results[0]; $scope.labels.implementationLabel = results[1]; $scope.labels.nameLabel = results[2]; @@ -94,90 +87,75 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f enableRowReordering: true, headerRowHeight: 28, multiSelect: false, - keepLastSelected : false, + keepLastSelected: false, selectedItems: $scope.selectedListeners, afterSelectionChange: function (rowItem, event) { $scope.selectedFields.length = 0; - if ($scope.selectedListeners.length > 0) - { + if ($scope.selectedListeners.length > 0) { var fields = $scope.selectedListeners[0].fields; - if (fields !== undefined && fields !== null) - { - for (var i = 0; i < fields.length; i++) - { + if (fields !== undefined && fields !== null) { + for (var i = 0; i < fields.length; i++) { var field = fields[i]; - if (field.stringValue !== undefined && field.stringValue !== '') - { + if (field.stringValue !== undefined && field.stringValue !== '') { field.implementation = field.stringValue; - } - else if (field.expression !== undefined && field.expression !== '') - { + } else if (field.expression !== undefined && field.expression !== '') { field.implementation = field.expression; - } - else if (field.string !== undefined && field.string !== '') - { + } else if (field.string !== undefined && field.string !== '') { field.implementation = field.string; } } } } }, - columnDefs: [{ field: 'event', displayName: $scope.labels.eventLabel }, - { field: 'implementation', displayName: $scope.labels.implementationLabel}] + columnDefs: [{field: 'event', displayName: $scope.labels.eventLabel}, + {field: 'implementation', displayName: $scope.labels.implementationLabel}] }; - + // Config for field grid $scope.gridFieldOptions = { data: 'selectedListeners[0].fields', enableRowReordering: true, headerRowHeight: 28, multiSelect: false, - keepLastSelected : false, + keepLastSelected: false, selectedItems: $scope.selectedFields, - columnDefs: [{ field: 'name', displayName: $scope.labels.name }, - { field: 'implementation', displayName: $scope.labels.implementationLabel}] + columnDefs: [{field: 'name', displayName: $scope.labels.name}, + {field: 'implementation', displayName: $scope.labels.implementationLabel}] }; }); - - $scope.listenerDetailsChanged = function() { - if ($scope.selectedListeners[0].className !== '') - { + + $scope.listenerDetailsChanged = function () { + if ($scope.selectedListeners[0].className !== '') { $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].className; - } - else if ($scope.selectedListeners[0].expression !== '') - { + } else if ($scope.selectedListeners[0].expression !== '') { $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].expression; - } - else if ($scope.selectedListeners[0].delegateExpression !== '') - { + } else if ($scope.selectedListeners[0].delegateExpression !== '') { $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].delegateExpression; - } - else - { + } else { $scope.selectedListeners[0].implementation = ''; } }; function addListener(event, className, expression, delegateExpression) { var implementation = ''; - if(className) { + if (className) { implementation = className; - } else if(expression) { + } else if (expression) { implementation = expression; - } else if(delegateExpression) { + } else if (delegateExpression) { implementation = delegateExpression; } $scope.taskListeners.push({ - event : event, - implementation : implementation, - className : className ? className : '', + event: event, + implementation: implementation, + className: className ? className : '', expression: expression ? expression : '', delegateExpression: delegateExpression ? delegateExpression : '' }); } // Click handler for add button - $scope.addNewListener = function() { + $scope.addNewListener = function () { addListener('create'); }; @@ -187,8 +165,8 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f * @param className */ function isListenerExist(event, className) { - for(var i = 0, item; item = $scope.taskListeners[i++]; ) { - if(item.event == event && item.className == className) { + for (var i = 0, item; item = $scope.taskListeners[i++];) { + if (item.event == event && item.className == className) { return true; } } @@ -196,45 +174,45 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f } // quick add listener - $scope.addOaUserTaskCreateListener = function() { + $scope.addOaUserTaskCreateListener = function () { var event = 'create', className = '', expression = '', delegateExpression = '${oaUserTaskCreateListener}'; - if(isListenerExist(event, className)) { + if (isListenerExist(event, className)) { top.dialog.msg('监听器已经存在'); return; } addListener(event, className, expression, delegateExpression); } - $scope.addOaUserTaskCompleteListener = function() { + $scope.addOaUserTaskCompleteListener = function () { var event = 'complete', className = '', expression = '', delegateExpression = '${oaUserTaskCompleteListener}'; - if(isListenerExist(event, className)) { + if (isListenerExist(event, className)) { top.dialog.msg('监听器已经存在'); return; } addListener(event, className, expression, delegateExpression); } - $scope.addOaUserTaskAssignmentListener = function() { + $scope.addOaUserTaskAssignmentListener = function () { var event = 'assignment', className = '', expression = '', delegateExpression = '${oaUserTaskAssignmentListener}'; - if(isListenerExist(event, className)) { + if (isListenerExist(event, className)) { top.dialog.msg('监听器已经存在'); return; } addListener(event, className, expression, delegateExpression); } - $scope.addOaUserTaskDeleteListener = function() { + $scope.addOaUserTaskDeleteListener = function () { var event = 'delete', className = '', expression = '', delegateExpression = '${oaUserTaskDeleteListener}'; - if(isListenerExist(event, className)) { + if (isListenerExist(event, className)) { top.dialog.msg('监听器已经存在'); return; } @@ -242,7 +220,7 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f } // Click handler for remove button - $scope.removeListener = function() { + $scope.removeListener = function () { if ($scope.selectedListeners.length > 0) { var index = $scope.taskListeners.indexOf($scope.selectedListeners[0]); $scope.gridOptions.selectItem(index, false); @@ -258,7 +236,7 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f }; // Click handler for up button - $scope.moveListenerUp = function() { + $scope.moveListenerUp = function () { if ($scope.selectedListeners.length > 0) { var index = $scope.taskListeners.indexOf($scope.selectedListeners[0]); if (index != 0) { // If it's the first, no moving up of course @@ -266,7 +244,7 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f var prevIndex = index - 1; var temp = $scope.taskListeners[index]; $scope.taskListeners.splice(index, 1); - $timeout(function() { + $timeout(function () { $scope.taskListeners.splice(prevIndex, 0, temp); }, 100); } @@ -274,7 +252,7 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f }; // Click handler for down button - $scope.moveListenerDown = function() { + $scope.moveListenerDown = function () { if ($scope.selectedListeners.length > 0) { var index = $scope.taskListeners.indexOf($scope.selectedListeners[0]); if (index != $scope.taskListeners.length - 1) { // If it's the last element, no moving down of course @@ -282,51 +260,44 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f var nextIndex = index + 1; var temp = $scope.taskListeners[index]; $scope.taskListeners.splice(index, 1); - $timeout(function(){ + $timeout(function () { $scope.taskListeners.splice(nextIndex, 0, temp); }, 100); } } }; - - $scope.fieldDetailsChanged = function() { - if ($scope.selectedFields[0].stringValue != '') - { + + $scope.fieldDetailsChanged = function () { + if ($scope.selectedFields[0].stringValue != '') { $scope.selectedFields[0].implementation = $scope.selectedFields[0].stringValue; - } - else if ($scope.selectedFields[0].expression != '') - { + } else if ($scope.selectedFields[0].expression != '') { $scope.selectedFields[0].implementation = $scope.selectedFields[0].expression; - } - else if ($scope.selectedFields[0].string != '') - { + } else if ($scope.selectedFields[0].string != '') { $scope.selectedFields[0].implementation = $scope.selectedFields[0].string; - } - else - { + } else { $scope.selectedFields[0].implementation = ''; } }; // Click handler for add button - $scope.addNewField = function() { - if ($scope.selectedListeners.length > 0) - { - if ($scope.selectedListeners[0].fields == undefined) - { + $scope.addNewField = function () { + if ($scope.selectedListeners.length > 0) { + if ($scope.selectedListeners[0].fields == undefined) { $scope.selectedListeners[0].fields = []; } - $scope.selectedListeners[0].fields.push({ name : 'fieldName', - implementation : '', - stringValue : '', + $scope.selectedListeners[0].fields.push({ + name: 'fieldName', + implementation: '', + stringValue: '', expression: '', - string: ''}); + string: '' + }); } }; // Click handler for remove button - $scope.removeField = function() { + $scope.removeField = function () { if ($scope.selectedFields.length > 0) { var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]); $scope.gridFieldOptions.selectItem(index, false); @@ -342,14 +313,14 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f }; // Click handler for up button - $scope.moveFieldUp = function() { + $scope.moveFieldUp = function () { if ($scope.selectedFields.length > 0) { var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]); if (index != 0) { // If it's the first, no moving up of course // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272 var temp = $scope.selectedListeners[0].fields[index]; $scope.selectedListeners[0].fields.splice(index, 1); - $timeout(function(){ + $timeout(function () { $scope.selectedListeners[0].fields.splice(index + -1, 0, temp); }, 100); @@ -358,14 +329,14 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f }; // Click handler for down button - $scope.moveFieldDown = function() { + $scope.moveFieldDown = function () { if ($scope.selectedFields.length > 0) { var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]); if (index != $scope.selectedListeners[0].fields.length - 1) { // If it's the last element, no moving down of course // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272 var temp = $scope.selectedListeners[0].fields[index]; $scope.selectedListeners[0].fields.splice(index, 1); - $timeout(function(){ + $timeout(function () { $scope.selectedListeners[0].fields.splice(index + 1, 0, temp); }, 100); @@ -374,7 +345,7 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f }; // Click handler for save button - $scope.save = function() { + $scope.save = function () { if ($scope.taskListeners.length > 0) { $scope.property.value = {}; @@ -387,12 +358,12 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f $scope.close(); }; - $scope.cancel = function() { + $scope.cancel = function () { $scope.close(); }; // Close button handler - $scope.close = function() { + $scope.close = function () { $scope.property.mode = 'read'; $scope.$hide(); }; diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties.js b/module-activiti/src/main/resources/static/editor-app/configuration/properties.js index f74535e6..c056821b 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/properties.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties.js @@ -99,5 +99,9 @@ KISBPM.PROPERTY_CONFIG = "formkeydefinition": { "readModeTemplateUrl": "editor-app/configuration/properties/form-select-display-template.html", "writeModeTemplateUrl": "editor-app/configuration/properties/form-select-write-template.html" + }, + "oanodemanage": { + "readModeTemplateUrl": "editor-app/configuration/properties/oa-node-manage-display-template.html", + "writeModeTemplateUrl": "editor-app/configuration/properties/oa-node-manage-write-template.html" } }; diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-display-template.html b/module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-display-template.html new file mode 100644 index 00000000..3847132e --- /dev/null +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-display-template.html @@ -0,0 +1,2 @@ +点击编辑节点信息 +点击设置节点信息 \ No newline at end of file diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-popup.html b/module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-popup.html new file mode 100644 index 00000000..3b2cf096 --- /dev/null +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-popup.html @@ -0,0 +1,362 @@ + \ No newline at end of file diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-write-template.html b/module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-write-template.html new file mode 100644 index 00000000..d2a84744 --- /dev/null +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-write-template.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/toolbar-default-actions.js b/module-activiti/src/main/resources/static/editor-app/configuration/toolbar-default-actions.js index 95fea30b..d058d3d7 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/toolbar-default-actions.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/toolbar-default-actions.js @@ -26,6 +26,7 @@ KISBPM.TOOLBAR = { top.dialog.confirm('确定保存吗?', function (index) { top.dialog.close(index); var json = scope.editor.getJSON(); + console.log(json) if(!json.properties.name) { top.dialog.msg('流程的 元素名称 不能为空'); return; @@ -53,13 +54,16 @@ KISBPM.TOOLBAR = { } // Parse dom to string var svgDOM = DataManager.serialize(svgClone); - var modelMetaData = scope.editor.getModelMetaData(); + + // 构建oaNodeManages管理列表 + var params = { jsonXml: json, svgXml: svgDOM, name: modelMetaData.name, - description: modelMetaData.description + description: modelMetaData.description, + oaNodeManages: [] }; var loadLayerIndex; top.restAjax.put(KISBPM.URL.putModel(modelMetaData.modelId), params, null, function (code, data) { diff --git a/module-activiti/src/main/resources/static/editor-app/editor.html b/module-activiti/src/main/resources/static/editor-app/editor.html index 0d0eb0dc..cdac22e1 100644 --- a/module-activiti/src/main/resources/static/editor-app/editor.html +++ b/module-activiti/src/main/resources/static/editor-app/editor.html @@ -119,7 +119,7 @@ ng-class="{'clear' : $index%2 == 0}"> {{ property.title }} : {{ property.title }} ({{'PROPERTY.REMOVED' | translate}}) : - + diff --git a/module-activiti/src/main/resources/static/stencilset.json b/module-activiti/src/main/resources/static/stencilset.json index 9c96ce6f..356943c1 100644 --- a/module-activiti/src/main/resources/static/stencilset.json +++ b/module-activiti/src/main/resources/static/stencilset.json @@ -199,6 +199,19 @@ } ] }, + { + "name": "oanodemanagepackage", + "properties": [ + { + "id": "oanodemanage", + "type": "oanodemanage", + "title": "OA节点管理", + "value": "", + "description": "OA节点功能管理", + "popular": true + } + ] + }, { "name": "duedatedefinitionpackage", "properties": [ @@ -1078,6 +1091,7 @@ "活动列表" ], "propertyPackages": [ + "oanodemanagepackage", "overrideidpackage", "namepackage", "documentationpackage", diff --git a/module-activiti/src/main/resources/templates/activiti/update.html b/module-activiti/src/main/resources/templates/activiti/update.html index 39eaaa52..dbf8bb9e 100644 --- a/module-activiti/src/main/resources/templates/activiti/update.html +++ b/module-activiti/src/main/resources/templates/activiti/update.html @@ -117,7 +117,8 @@ - + + diff --git a/module-form/src/main/java/ink/wgink/module/form/controller/api/design/FormFieldController.java b/module-form/src/main/java/ink/wgink/module/form/controller/api/design/FormFieldController.java new file mode 100644 index 00000000..c5304379 --- /dev/null +++ b/module-form/src/main/java/ink/wgink/module/form/controller/api/design/FormFieldController.java @@ -0,0 +1,42 @@ +package ink.wgink.module.form.controller.api.design; + +import ink.wgink.common.base.DefaultBaseController; +import ink.wgink.interfaces.consts.ISystemConstant; +import ink.wgink.module.form.pojo.dtos.design.FormFieldDTO; +import ink.wgink.module.form.service.design.IFormFieldService; +import ink.wgink.pojo.result.ErrorResult; +import io.swagger.annotations.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @ClassName: FormController + * @Description: 表单 + * @Author: wanggeng + * @Date: 2022/3/10 7:38 AM + * @Version: 1.0 + */ +@Api(tags = ISystemConstant.API_TAGS_SYSTEM_PREFIX + "表单") +@RestController +@RequestMapping(ISystemConstant.API_PREFIX + "/form-field") +public class FormFieldController extends DefaultBaseController { + + @Autowired + private IFormFieldService formFieldService; + + @ApiOperation(value = "字段列表", notes = "字段列表接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "formId", value = "表单ID", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("list/form-id/{formId}") + public List listByFormId(@PathVariable("formId") String formId) { + return formFieldService.listByFormId(formId); + } + +} diff --git a/module-form/src/main/java/ink/wgink/module/form/service/design/IFormFieldService.java b/module-form/src/main/java/ink/wgink/module/form/service/design/IFormFieldService.java index adffc075..c0a334e4 100644 --- a/module-form/src/main/java/ink/wgink/module/form/service/design/IFormFieldService.java +++ b/module-form/src/main/java/ink/wgink/module/form/service/design/IFormFieldService.java @@ -83,6 +83,13 @@ public interface IFormFieldService { */ List list(Map params); + /** + * 列表 + * @param formId 表单ID + * @return + */ + List listByFormId(String formId); + /** * 列表 * @@ -97,7 +104,7 @@ public interface IFormFieldService { * @param formId * @return */ - List listPO(String formId); + List listPOByFormId(String formId); /** * 分页列表 diff --git a/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormFieldServiceImpl.java b/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormFieldServiceImpl.java index 4b15a475..e9586a7f 100644 --- a/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormFieldServiceImpl.java +++ b/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormFieldServiceImpl.java @@ -86,6 +86,13 @@ public class FormFieldServiceImpl extends DefaultBaseService implements IFormFie return formFieldDao.list(params); } + @Override + public List listByFormId(String formId) { + Map params = getHashMap(2); + params.put("formId", formId); + return list(params); + } + @Override public List listPO(Map params) { params = params == null ? getHashMap(2) : params; @@ -93,7 +100,7 @@ public class FormFieldServiceImpl extends DefaultBaseService implements IFormFie } @Override - public List listPO(String formId) { + public List listPOByFormId(String formId) { Map params = getHashMap(2); params.put("formId", formId); return listPO(params);