增加UserTask的OA节点管理,关闭模态框点击背景关闭,处理逻辑与问题

This commit is contained in:
wanggeng 2022-04-04 01:48:50 +08:00
parent bce7a083a1
commit 56d880b459
26 changed files with 837 additions and 129 deletions

View File

@ -8,11 +8,14 @@ import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.JavaDelegate; import org.activiti.engine.delegate.JavaDelegate;
import org.activiti.engine.delegate.TaskListener; import org.activiti.engine.delegate.TaskListener;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
@ -29,6 +32,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
@Autowired @Autowired
private RuntimeService runtimeService; private RuntimeService runtimeService;
@Autowired @Autowired
private IActivitiModelService activitiModelService; private IActivitiModelService activitiModelService;
@Autowired @Autowired
@ -38,11 +42,42 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
public void notify(DelegateTask delegateTask) { public void notify(DelegateTask delegateTask) {
LOG.debug(">>>> userTask complete"); LOG.debug(">>>> userTask complete");
Map<String, Object> variables = delegateTask.getVariables(); Map<String, Object> variables = delegateTask.getVariables();
LOG.debug("查询表单数据variables: {}", variables); LOG.debug("查询表单数据variables: {}", variables);
UserTask nextUserTask = activitiModelService.getNextUserTask(delegateTask.getTaskDefinitionKey(), delegateTask.getProcessDefinitionId(), variables); UserTask nextUserTask = activitiModelService.getNextUserTask(delegateTask.getTaskDefinitionKey(), delegateTask.getProcessDefinitionId(), variables);
// 1nrOfInstances 该会签环节中总共有多少个实例 2nrOfActiveInstances 当前活动的实例的数量即还没有 完成的实例数量 3nrOfCompletedInstances 已经完成的实例的数量 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<String> 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) {
}
// 1nrOfInstances 该会签环节中总共有多少个实例 2nrOfActiveInstances 当前活动的实例的数量即还没有 完成的实例数量 3nrOfCompletedInstances 已经完成的实例的数量
// 设置会签
// // 获取多实例配置 // // 获取多实例配置
// MultiInstanceLoopCharacteristics characteristics = new MultiInstanceLoopCharacteristics(); // MultiInstanceLoopCharacteristics characteristics = new MultiInstanceLoopCharacteristics();
// // 设置集合变量统一设置成users // // 设置集合变量统一设置成users
@ -57,8 +92,8 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
// userTask.setLoopCharacteristics(characteristics); // userTask.setLoopCharacteristics(characteristics);
// 清空会签 // 清空会签
// 获取多实例配置 // 获取多实例配置
// MultiInstanceLoopCharacteristics characteristics = userTask.getLoopCharacteristics(); // MultiInstanceLoopCharacteristics characteristics = userTask.getLoopCharacteristics();
// if (characteristics != null) { // if (characteristics != null) {
// // 清空集合 // // 清空集合
@ -70,13 +105,5 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
// // 清空条件 // // 清空条件
// characteristics.setCompletionCondition(""); // characteristics.setCompletionCondition("");
// } // }
if (nextUserTask != null) {
nextUserTask.setAssignee("1");
}
}
@Override
public void execute(DelegateExecution execution) {
}
} }

View File

@ -172,7 +172,7 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti
if (formPO == null) { if (formPO == null) {
throw new SystemException("表单不存在"); throw new SystemException("表单不存在");
} }
List<FormFieldPO> formFieldPOs = formFieldService.listPO(formPO.getFormId()); List<FormFieldPO> formFieldPOs = formFieldService.listPOByFormId(formPO.getFormId());
if (formFieldPOs.isEmpty()) { if (formFieldPOs.isEmpty()) {
throw new SystemException("表单字段为空"); throw new SystemException("表单字段为空");
} }

View File

@ -25,6 +25,8 @@ var KisBpmAssignmentCtrl = ['$scope', '$modal', function ($scope, $modal) {
// Config for the modal window // Config for the modal window
var opts = { var opts = {
template: 'editor-app/configuration/properties/assignment-popup.html?version=' + Date.now(), template: 'editor-app/configuration/properties/assignment-popup.html?version=' + Date.now(),
backdrop: 'static',
keyboard: false,
scope: $scope scope: $scope
}; };

View File

@ -26,6 +26,8 @@ var KisBpmConditionExpressionCtrl = [ '$scope', '$modal', function($scope, $moda
// Config for the modal window // Config for the modal window
var opts = { var opts = {
template: 'static/editor-app/configuration/properties/condition-expression-popup.html?version=' + Date.now(), template: 'static/editor-app/configuration/properties/condition-expression-popup.html?version=' + Date.now(),
backdrop: 'static',
keyboard: false,
scope: $scope scope: $scope
}; };

View File

@ -26,6 +26,8 @@ var KisBpmEventListenersCtrl = [ '$scope', '$modal', '$timeout', '$translate', f
// Config for the modal window // Config for the modal window
var opts = { var opts = {
template: 'editor-app/configuration/properties/event-listeners-popup.html?version=' + Date.now(), template: 'editor-app/configuration/properties/event-listeners-popup.html?version=' + Date.now(),
backdrop: 'static',
keyboard: false,
scope: $scope scope: $scope
}; };

View File

@ -26,6 +26,8 @@ var KisBpmExecutionListenersCtrl = [ '$scope', '$modal', '$timeout', '$translate
// Config for the modal window // Config for the modal window
var opts = { var opts = {
template: 'editor-app/configuration/properties/execution-listeners-popup.html?version=' + Date.now(), template: 'editor-app/configuration/properties/execution-listeners-popup.html?version=' + Date.now(),
backdrop: 'static',
keyboard: false,
scope: $scope scope: $scope
}; };

View File

@ -26,6 +26,8 @@ var KisBpmFieldsCtrl = [ '$scope', '$modal', '$timeout', '$translate', function(
// Config for the modal window // Config for the modal window
var opts = { var opts = {
template: 'editor-app/configuration/properties/fields-popup.html', template: 'editor-app/configuration/properties/fields-popup.html',
backdrop: 'static',
keyboard: false,
scope: $scope scope: $scope
}; };

View File

@ -26,6 +26,8 @@ var KisBpmFormPropertiesCtrl = [ '$scope', '$modal', '$timeout', '$translate', f
// Config for the modal window // Config for the modal window
var opts = { var opts = {
template: 'editor-app/configuration/properties/form-properties-popup.html?version=' + Date.now(), template: 'editor-app/configuration/properties/form-properties-popup.html?version=' + Date.now(),
backdrop: 'static',
keyboard: false,
scope: $scope scope: $scope
}; };

View File

@ -23,6 +23,8 @@
var FormSelectWriteController = ['$scope', '$modal', function($scope, $modal) { var FormSelectWriteController = ['$scope', '$modal', function($scope, $modal) {
$modal({ $modal({
template: 'editor-app/configuration/properties/form-select-template.html?version=' + Date.now(), template: 'editor-app/configuration/properties/form-select-template.html?version=' + Date.now(),
backdrop: 'static',
keyboard: false,
scope: $scope scope: $scope
}); });
}]; }];

View File

@ -26,6 +26,8 @@ var KisBpmInParametersCtrl = [ '$scope', '$modal', '$timeout', '$translate', fun
// Config for the modal window // Config for the modal window
var opts = { var opts = {
template: 'editor-app/configuration/properties/in-parameters-popup.html?version=' + Date.now(), template: 'editor-app/configuration/properties/in-parameters-popup.html?version=' + Date.now(),
backdrop: 'static',
keyboard: false,
scope: $scope scope: $scope
}; };

View File

@ -26,6 +26,8 @@ angular.module('activitiModeler').controller('ActivitiMessageDefinitionsCtrl', [
// Config for the modal window // Config for the modal window
var opts = { var opts = {
template: 'editor-app/configuration/properties/message-definitions-popup.html?version=' + Date.now(), template: 'editor-app/configuration/properties/message-definitions-popup.html?version=' + Date.now(),
backdrop: 'static',
keyboard: false,
scope: $scope scope: $scope
}; };

View File

@ -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();
})();
}];

View File

@ -26,6 +26,8 @@ var KisBpmSequenceFlowOrderCtrl = [ '$scope', '$modal', '$timeout', '$translate'
// Config for the modal window // Config for the modal window
var opts = { var opts = {
template: 'editor-app/configuration/properties/sequenceflow-order-popup.html?version=' + Date.now(), template: 'editor-app/configuration/properties/sequenceflow-order-popup.html?version=' + Date.now(),
backdrop: 'static',
keyboard: false,
scope: $scope scope: $scope
}; };

View File

@ -22,6 +22,8 @@ angular.module('activitiModeler').controller('ActivitiSignalDefinitionsCtrl', ['
// Config for the modal window // Config for the modal window
var opts = { var opts = {
template: 'editor-app/configuration/properties/signal-definitions-popup.html?version=' + Date.now(), template: 'editor-app/configuration/properties/signal-definitions-popup.html?version=' + Date.now(),
backdrop: 'static',
keyboard: false,
scope: $scope scope: $scope
}; };

View File

@ -21,11 +21,13 @@
* Task listeners * 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 // Config for the modal window
var opts = { 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 scope: $scope
}; };
@ -33,37 +35,28 @@ var KisBpmTaskListenersCtrl = [ '$scope', '$modal', '$timeout', '$translate', fu
$modal(opts); $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 // Put json representing form properties on scope
if ($scope.property.value !== undefined && $scope.property.value !== null if ($scope.property.value !== undefined && $scope.property.value !== null
&& $scope.property.value.taskListeners !== undefined && $scope.property.value.taskListeners !== undefined
&& $scope.property.value.taskListeners !== null) { && $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); $scope.taskListeners = JSON.parse($scope.property.value.taskListeners);
} } else {
else
{
// Note that we clone the json object rather then setting it directly, // 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 // 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); $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]; var taskListener = $scope.taskListeners[i];
if (taskListener.className !== undefined && taskListener.className !== '') if (taskListener.className !== undefined && taskListener.className !== '') {
{
taskListener.implementation = taskListener.className; taskListener.implementation = taskListener.className;
} } else if (taskListener.expression !== undefined && taskListener.expression !== '') {
else if (taskListener.expression !== undefined && taskListener.expression !== '')
{
taskListener.implementation = taskListener.expression; taskListener.implementation = taskListener.expression;
} } else if (taskListener.delegateExpression !== undefined && taskListener.delegateExpression !== '') {
else if (taskListener.delegateExpression !== undefined && taskListener.delegateExpression !== '')
{
taskListener.implementation = taskListener.delegateExpression; taskListener.implementation = taskListener.delegateExpression;
} }
} }
@ -82,7 +75,7 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f
var implementationPromise = $translate('PROPERTY.TASKLISTENERS.FIELDS.IMPLEMENTATION'); var implementationPromise = $translate('PROPERTY.TASKLISTENERS.FIELDS.IMPLEMENTATION');
var namePromise = $translate('PROPERTY.TASKLISTENERS.FIELDS.NAME'); 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.eventLabel = results[0];
$scope.labels.implementationLabel = results[1]; $scope.labels.implementationLabel = results[1];
$scope.labels.nameLabel = results[2]; $scope.labels.nameLabel = results[2];
@ -94,36 +87,28 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f
enableRowReordering: true, enableRowReordering: true,
headerRowHeight: 28, headerRowHeight: 28,
multiSelect: false, multiSelect: false,
keepLastSelected : false, keepLastSelected: false,
selectedItems: $scope.selectedListeners, selectedItems: $scope.selectedListeners,
afterSelectionChange: function (rowItem, event) { afterSelectionChange: function (rowItem, event) {
$scope.selectedFields.length = 0; $scope.selectedFields.length = 0;
if ($scope.selectedListeners.length > 0) if ($scope.selectedListeners.length > 0) {
{
var fields = $scope.selectedListeners[0].fields; var fields = $scope.selectedListeners[0].fields;
if (fields !== undefined && fields !== null) if (fields !== undefined && fields !== null) {
{ for (var i = 0; i < fields.length; i++) {
for (var i = 0; i < fields.length; i++)
{
var field = fields[i]; var field = fields[i];
if (field.stringValue !== undefined && field.stringValue !== '') if (field.stringValue !== undefined && field.stringValue !== '') {
{
field.implementation = field.stringValue; field.implementation = field.stringValue;
} } else if (field.expression !== undefined && field.expression !== '') {
else if (field.expression !== undefined && field.expression !== '')
{
field.implementation = field.expression; field.implementation = field.expression;
} } else if (field.string !== undefined && field.string !== '') {
else if (field.string !== undefined && field.string !== '')
{
field.implementation = field.string; field.implementation = field.string;
} }
} }
} }
} }
}, },
columnDefs: [{ field: 'event', displayName: $scope.labels.eventLabel }, columnDefs: [{field: 'event', displayName: $scope.labels.eventLabel},
{ field: 'implementation', displayName: $scope.labels.implementationLabel}] {field: 'implementation', displayName: $scope.labels.implementationLabel}]
}; };
// Config for field grid // Config for field grid
@ -132,52 +117,45 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f
enableRowReordering: true, enableRowReordering: true,
headerRowHeight: 28, headerRowHeight: 28,
multiSelect: false, multiSelect: false,
keepLastSelected : false, keepLastSelected: false,
selectedItems: $scope.selectedFields, selectedItems: $scope.selectedFields,
columnDefs: [{ field: 'name', displayName: $scope.labels.name }, columnDefs: [{field: 'name', displayName: $scope.labels.name},
{ field: 'implementation', displayName: $scope.labels.implementationLabel}] {field: 'implementation', displayName: $scope.labels.implementationLabel}]
}; };
}); });
$scope.listenerDetailsChanged = function() { $scope.listenerDetailsChanged = function () {
if ($scope.selectedListeners[0].className !== '') if ($scope.selectedListeners[0].className !== '') {
{
$scope.selectedListeners[0].implementation = $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; $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; $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].delegateExpression;
} } else {
else
{
$scope.selectedListeners[0].implementation = ''; $scope.selectedListeners[0].implementation = '';
} }
}; };
function addListener(event, className, expression, delegateExpression) { function addListener(event, className, expression, delegateExpression) {
var implementation = ''; var implementation = '';
if(className) { if (className) {
implementation = className; implementation = className;
} else if(expression) { } else if (expression) {
implementation = expression; implementation = expression;
} else if(delegateExpression) { } else if (delegateExpression) {
implementation = delegateExpression; implementation = delegateExpression;
} }
$scope.taskListeners.push({ $scope.taskListeners.push({
event : event, event: event,
implementation : implementation, implementation: implementation,
className : className ? className : '', className: className ? className : '',
expression: expression ? expression : '', expression: expression ? expression : '',
delegateExpression: delegateExpression ? delegateExpression : '' delegateExpression: delegateExpression ? delegateExpression : ''
}); });
} }
// Click handler for add button // Click handler for add button
$scope.addNewListener = function() { $scope.addNewListener = function () {
addListener('create'); addListener('create');
}; };
@ -187,8 +165,8 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f
* @param className * @param className
*/ */
function isListenerExist(event, className) { function isListenerExist(event, className) {
for(var i = 0, item; item = $scope.taskListeners[i++]; ) { for (var i = 0, item; item = $scope.taskListeners[i++];) {
if(item.event == event && item.className == className) { if (item.event == event && item.className == className) {
return true; return true;
} }
} }
@ -196,45 +174,45 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f
} }
// quick add listener // quick add listener
$scope.addOaUserTaskCreateListener = function() { $scope.addOaUserTaskCreateListener = function () {
var event = 'create', var event = 'create',
className = '', className = '',
expression = '', expression = '',
delegateExpression = '${oaUserTaskCreateListener}'; delegateExpression = '${oaUserTaskCreateListener}';
if(isListenerExist(event, className)) { if (isListenerExist(event, className)) {
top.dialog.msg('监听器已经存在'); top.dialog.msg('监听器已经存在');
return; return;
} }
addListener(event, className, expression, delegateExpression); addListener(event, className, expression, delegateExpression);
} }
$scope.addOaUserTaskCompleteListener = function() { $scope.addOaUserTaskCompleteListener = function () {
var event = 'complete', var event = 'complete',
className = '', className = '',
expression = '', expression = '',
delegateExpression = '${oaUserTaskCompleteListener}'; delegateExpression = '${oaUserTaskCompleteListener}';
if(isListenerExist(event, className)) { if (isListenerExist(event, className)) {
top.dialog.msg('监听器已经存在'); top.dialog.msg('监听器已经存在');
return; return;
} }
addListener(event, className, expression, delegateExpression); addListener(event, className, expression, delegateExpression);
} }
$scope.addOaUserTaskAssignmentListener = function() { $scope.addOaUserTaskAssignmentListener = function () {
var event = 'assignment', var event = 'assignment',
className = '', className = '',
expression = '', expression = '',
delegateExpression = '${oaUserTaskAssignmentListener}'; delegateExpression = '${oaUserTaskAssignmentListener}';
if(isListenerExist(event, className)) { if (isListenerExist(event, className)) {
top.dialog.msg('监听器已经存在'); top.dialog.msg('监听器已经存在');
return; return;
} }
addListener(event, className, expression, delegateExpression); addListener(event, className, expression, delegateExpression);
} }
$scope.addOaUserTaskDeleteListener = function() { $scope.addOaUserTaskDeleteListener = function () {
var event = 'delete', var event = 'delete',
className = '', className = '',
expression = '', expression = '',
delegateExpression = '${oaUserTaskDeleteListener}'; delegateExpression = '${oaUserTaskDeleteListener}';
if(isListenerExist(event, className)) { if (isListenerExist(event, className)) {
top.dialog.msg('监听器已经存在'); top.dialog.msg('监听器已经存在');
return; return;
} }
@ -242,7 +220,7 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f
} }
// Click handler for remove button // Click handler for remove button
$scope.removeListener = function() { $scope.removeListener = function () {
if ($scope.selectedListeners.length > 0) { if ($scope.selectedListeners.length > 0) {
var index = $scope.taskListeners.indexOf($scope.selectedListeners[0]); var index = $scope.taskListeners.indexOf($scope.selectedListeners[0]);
$scope.gridOptions.selectItem(index, false); $scope.gridOptions.selectItem(index, false);
@ -258,7 +236,7 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f
}; };
// Click handler for up button // Click handler for up button
$scope.moveListenerUp = function() { $scope.moveListenerUp = function () {
if ($scope.selectedListeners.length > 0) { if ($scope.selectedListeners.length > 0) {
var index = $scope.taskListeners.indexOf($scope.selectedListeners[0]); var index = $scope.taskListeners.indexOf($scope.selectedListeners[0]);
if (index != 0) { // If it's the first, no moving up of course 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 prevIndex = index - 1;
var temp = $scope.taskListeners[index]; var temp = $scope.taskListeners[index];
$scope.taskListeners.splice(index, 1); $scope.taskListeners.splice(index, 1);
$timeout(function() { $timeout(function () {
$scope.taskListeners.splice(prevIndex, 0, temp); $scope.taskListeners.splice(prevIndex, 0, temp);
}, 100); }, 100);
} }
@ -274,7 +252,7 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f
}; };
// Click handler for down button // Click handler for down button
$scope.moveListenerDown = function() { $scope.moveListenerDown = function () {
if ($scope.selectedListeners.length > 0) { if ($scope.selectedListeners.length > 0) {
var index = $scope.taskListeners.indexOf($scope.selectedListeners[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 if (index != $scope.taskListeners.length - 1) { // If it's the last element, no moving down of course
@ -282,7 +260,7 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f
var nextIndex = index + 1; var nextIndex = index + 1;
var temp = $scope.taskListeners[index]; var temp = $scope.taskListeners[index];
$scope.taskListeners.splice(index, 1); $scope.taskListeners.splice(index, 1);
$timeout(function(){ $timeout(function () {
$scope.taskListeners.splice(nextIndex, 0, temp); $scope.taskListeners.splice(nextIndex, 0, temp);
}, 100); }, 100);
@ -290,43 +268,36 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f
} }
}; };
$scope.fieldDetailsChanged = function() { $scope.fieldDetailsChanged = function () {
if ($scope.selectedFields[0].stringValue != '') if ($scope.selectedFields[0].stringValue != '') {
{
$scope.selectedFields[0].implementation = $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; $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; $scope.selectedFields[0].implementation = $scope.selectedFields[0].string;
} } else {
else
{
$scope.selectedFields[0].implementation = ''; $scope.selectedFields[0].implementation = '';
} }
}; };
// Click handler for add button // Click handler for add button
$scope.addNewField = function() { $scope.addNewField = function () {
if ($scope.selectedListeners.length > 0) if ($scope.selectedListeners.length > 0) {
{ if ($scope.selectedListeners[0].fields == undefined) {
if ($scope.selectedListeners[0].fields == undefined)
{
$scope.selectedListeners[0].fields = []; $scope.selectedListeners[0].fields = [];
} }
$scope.selectedListeners[0].fields.push({ name : 'fieldName', $scope.selectedListeners[0].fields.push({
implementation : '', name: 'fieldName',
stringValue : '', implementation: '',
stringValue: '',
expression: '', expression: '',
string: ''}); string: ''
});
} }
}; };
// Click handler for remove button // Click handler for remove button
$scope.removeField = function() { $scope.removeField = function () {
if ($scope.selectedFields.length > 0) { if ($scope.selectedFields.length > 0) {
var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]); var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]);
$scope.gridFieldOptions.selectItem(index, false); $scope.gridFieldOptions.selectItem(index, false);
@ -342,14 +313,14 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f
}; };
// Click handler for up button // Click handler for up button
$scope.moveFieldUp = function() { $scope.moveFieldUp = function () {
if ($scope.selectedFields.length > 0) { if ($scope.selectedFields.length > 0) {
var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]); var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]);
if (index != 0) { // If it's the first, no moving up of course 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 // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
var temp = $scope.selectedListeners[0].fields[index]; var temp = $scope.selectedListeners[0].fields[index];
$scope.selectedListeners[0].fields.splice(index, 1); $scope.selectedListeners[0].fields.splice(index, 1);
$timeout(function(){ $timeout(function () {
$scope.selectedListeners[0].fields.splice(index + -1, 0, temp); $scope.selectedListeners[0].fields.splice(index + -1, 0, temp);
}, 100); }, 100);
@ -358,14 +329,14 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f
}; };
// Click handler for down button // Click handler for down button
$scope.moveFieldDown = function() { $scope.moveFieldDown = function () {
if ($scope.selectedFields.length > 0) { if ($scope.selectedFields.length > 0) {
var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[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 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 // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
var temp = $scope.selectedListeners[0].fields[index]; var temp = $scope.selectedListeners[0].fields[index];
$scope.selectedListeners[0].fields.splice(index, 1); $scope.selectedListeners[0].fields.splice(index, 1);
$timeout(function(){ $timeout(function () {
$scope.selectedListeners[0].fields.splice(index + 1, 0, temp); $scope.selectedListeners[0].fields.splice(index + 1, 0, temp);
}, 100); }, 100);
@ -374,7 +345,7 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f
}; };
// Click handler for save button // Click handler for save button
$scope.save = function() { $scope.save = function () {
if ($scope.taskListeners.length > 0) { if ($scope.taskListeners.length > 0) {
$scope.property.value = {}; $scope.property.value = {};
@ -387,12 +358,12 @@ var KisBpmTaskListenersPopupCtrl = [ '$scope', '$timeout', '$q', '$translate', f
$scope.close(); $scope.close();
}; };
$scope.cancel = function() { $scope.cancel = function () {
$scope.close(); $scope.close();
}; };
// Close button handler // Close button handler
$scope.close = function() { $scope.close = function () {
$scope.property.mode = 'read'; $scope.property.mode = 'read';
$scope.$hide(); $scope.$hide();
}; };

View File

@ -99,5 +99,9 @@ KISBPM.PROPERTY_CONFIG =
"formkeydefinition": { "formkeydefinition": {
"readModeTemplateUrl": "editor-app/configuration/properties/form-select-display-template.html", "readModeTemplateUrl": "editor-app/configuration/properties/form-select-display-template.html",
"writeModeTemplateUrl": "editor-app/configuration/properties/form-select-write-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"
} }
}; };

View File

@ -0,0 +1,2 @@
<span ng-if="property.value">点击编辑节点信息</span>
<span ng-if="!property.value">点击设置节点信息</span>

View File

@ -0,0 +1,362 @@
<div class="modal" ng-controller="OaNodeManagePopupCtrl">
<div class="modal-dialog modal-wide">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
<h2>OA节点管理</h2>
</div>
<div class="modal-body">
<ul class="nav nav-tabs" role="tablist">
<li class="active">
<a href="#nodeConfig" aria-controls="home" role="tab" data-toggle="tab"><h5>代理人配置</h5></a>
</li>
<li>
<a href="#buttonConfig" aria-controls="profile" role="tab" data-toggle="tab"><h5>按钮配置</h5></a>
</li>
<li>
<a href="#formFieldConfig" aria-controls="profile" role="tab" data-toggle="tab"><h5>表单字段配置</h5></a>
</li>
<li>
<a href="#listenerConfig" aria-controls="profile" role="tab" data-toggle="tab"><h5>监听器配置</h5></a>
</li>
</ul>
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="nodeConfig" style="padding: 15px 0;">
<table class="table table-bordered table-hover">
<tbody>
<tr>
<td>
<h5>节点类型</h5>
</td>
</tr>
<tr>
<td>
<div>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.nodeType" type="radio" name="nodeType" value="normal"> 普通节点
</label>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.nodeType" type="radio" name="nodeType" value="sign"> 会签节点
</label>
</div>
</td>
</tr>
<!-- 普通节点 start -->
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal'">
<td>
<h5>代理人类型</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal'">
<td>
<div>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.assigneeType" type="radio" name="assigneeType" value="appoint"> 手动指定
</label>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.assigneeType" type="radio" name="assigneeType" value="auto"> 自动获取
</label>
</div>
</td>
</tr>
<!-- 手动指定代理人 start -->
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'appoint'">
<td>
<h5>代理人数量</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'appoint'">
<td>
<div>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.assigneeCount" type="radio" name="assigneeCount" value="single"> 单人
</label>
</div>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'appoint' && oaNodeManage.assignee.assigneeCount == 'single'">
<td>
<h5>选择代理人</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'appoint' && oaNodeManage.assignee.assigneeCount == 'single'">
<td>
<input ng-model="oaNodeManage.assignee.assignee" type="hidden" name="assignee">
<button type="button">选择</button>
<span>用户1</span>
</td>
</tr>
<!-- 手动指定代理人 end -->
<!-- 自动获取代理人 start -->
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto'">
<td>
<h5>自动方式</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto'">
<td>
<div>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.autoAssignType" type="radio" name="autoAssignType" value="scope"> 范围指定
</label>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.autoAssignType" type="radio" name="autoAssignType" value="quick"> 快捷指定
</label>
</div>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope'">
<td>
<h5>部门类型</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope'">
<td>
<div>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.departmentType" type="radio" name="departmentType" value="appoint"> 指定
</label>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.departmentType" type="radio" name="departmentType" value="belong"> 所在部门
</label>
</div>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope' && oaNodeManage.assignee.departmentType == 'appoint'">
<td>
<h5>选择部门</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope' && oaNodeManage.assignee.departmentType == 'appoint'">
<td>
<input ng-model="oaNodeManage.assignee.departments" type="hidden" name="departments">
<button type="button">选择</button>
<span>部门</span>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope'">
<td>
<h5>选择角色</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope'">
<td>
<input ng-model="oaNodeManage.assignee.roles" type="hidden" name="roles">
<button type="button">选择</button>
<span>角色1</span>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope'">
<td>
<h5>选择职位</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope'">
<td>
<input ng-model="oaNodeManage.assignee.positions" type="hidden" name="positions">
<button type="button">选择</button>
<span>职位1</span>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'quick'">
<td>
<h5>快捷代理人</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'quick'">
<td>
<div class="radio">
<label>
<input ng-model="oaNodeManage.assignee.quickAssignee" type="radio" name="quickAssignee" value="starter">
发起人
</label>
</div>
<div class="radio">
<label>
<input ng-model="oaNodeManage.assignee.quickAssignee" type="radio" name="quickAssignee" value="starterSuperiorPosition"> 发起人上级岗位
</label>
</div>
<div class="radio">
<label>
<input ng-model="oaNodeManage.assignee.quickAssignee" type="radio" name="quickAssignee" value="previousStepAssigneeSubordinatePosition"> 上一步代理人下级岗位
</label>
</div>
<div class="radio">
<label>
<input ng-model="oaNodeManage.assignee.quickAssignee" type="radio" name="quickAssignee" value="previousStepAssigneeSuperiorPosition"> 上一步代理人上级岗位
</label>
</div>
<div class="radio">
<label>
<input ng-model="oaNodeManage.assignee.quickAssignee" type="radio" name="quickAssignee" value="previousStepAssigneeSameDepartment"> 上一步代理人同部门
</label>
</div>
<div class="radio">
<label>
<input ng-model="oaNodeManage.assignee.quickAssignee" type="radio" name="quickAssignee" value="previousNStepAssigneeSubordinatePosition"><input type="number" step="1" name="previousNStep" ng-disabled="oaNodeManage.assignee.quickAssignee != 'previousNStepAssigneeSubordinatePosition'"> 步代理人
</label>
</div>
</td>
</tr>
<!-- 自动获取代理人 end -->
<!-- 普通节点 end -->
<!-- 会签节点 start -->
<tr ng-if="oaNodeManage.assignee.nodeType == 'sign'">
<td>
<h5>会签类型</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'sign'">
<td>
<div>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.signType" type="radio" name="signType" value="parallel"> 并行
</label>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.signType" type="radio" name="signType" value="sequential"> 串行
</label>
</div>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'sign' && oaNodeManage.assignee.signType == 'parallel'">
<td>
<h5>会签人列表</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'sign' && oaNodeManage.assignee.signType == 'parallel'">
<td>
<input ng-model="oaNodeManage.assignee.signUsers" type="hidden" name="signUsers">
<button type="button">选择</button>
<span>用户1,用户2</span>
</td>
</tr>
<!-- 并行 start -->
<tr ng-if="oaNodeManage.assignee.nodeType == 'sign' && oaNodeManage.assignee.signType == 'parallel'">
<td>
<h5>完成(通过)条件</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'sign' && oaNodeManage.assignee.signType == 'parallel'">
<td>
<div>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.completeCondition" type="radio" name="completeCondition" value="allPass" checked> 全部通过
</label>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.completeCondition" type="radio" name="completeCondition" value="singlePass"> 单人通过
</label>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.completeCondition" type="radio" name="completeCondition" value="customPass"> 通过
</label>
<input ng-model="oaNodeManage.assignee.completeCount" type="number" step="1" name="completeCount" ng-disabled="oaNodeManage.assignee.completeCondition != 'customPass'">
</div>
</td>
</tr>
<!-- 并行 end -->
<!-- 会签节点 end -->
</tbody>
</table>
</div>
<div role="tabpanel" class="tab-pane" id="buttonConfig" style="padding: 15px 0;"></div>
<div role="tabpanel" class="tab-pane" id="formFieldConfig" style="padding: 15px 0;">
<table class="table table-bordered table-hover">
<colgroup>
<col width="60">
<col>
<col>
<col>
<col>
<col width="60">
<col width="60">
</colgroup>
<thead>
<tr>
<th class="text-center">序号</th>
<th>字段名</th>
<th>字段描述</th>
<th>字段标签</th>
<th>字段类型</th>
<th class="text-center">可见</th>
<th class="text-center">可操作</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="formField in oaNodeManage.formFields">
<td class="text-center">{{$index + 1}}</td>
<td>{{formField.fieldName}}</td>
<td>{{formField.fieldExplain}}</td>
<td>{{formField.fieldTag}}</td>
<td>{{formField.fieldType}}</td>
<td class="text-center">
<input type="checkbox" ng-model="formField.isVisible">
</td>
<td class="text-center">
<input type="checkbox" ng-model="formField.isEditable">
</td>
</tr>
</tbody>
</table>
</div>
<div role="tabpanel" class="tab-pane" id="listenerConfig" style="padding: 15px 0;">
<table class="table table-bordered table-hover" style="margin-bottom: -1px;">
<tbody>
<tr>
<td>
<span class="btn btn-primary btn-sm" ng-click="addOaUserTaskCreateListener()">任务创建</span>
<span class="btn btn-success btn-sm" ng-click="addOaUserTaskAssignmentListener()">代理人设置</span>
<span class="btn btn-warning btn-sm" ng-click="addOaUserTaskDeleteListener()">任务删除</span>
</td>
</tr>
</tbody>
</table>
<table class="table table-bordered table-hover">
<colgroup>
<col width="100">
<col width="200">
<col>
<col width="115">
</colgroup>
<thead>
<tr>
<th>事件名称</th>
<th>事件类型</th>
<th>业务类</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="oaUserTaskListener in oaNodeManage.oaUserTaskListeners">
<td ng-if="oaUserTaskListener.event == 'create'">任务创建</td>
<td ng-if="oaUserTaskListener.event == 'complete'">代理人设置</td>
<td ng-if="oaUserTaskListener.event == 'assignment'">任务完成</td>
<td ng-if="oaUserTaskListener.event == 'delete'">任务删除</td>
<td>{{oaUserTaskListener.event}}</td>
<td>{{oaUserTaskListener.delegateExpression}}</td>
<td>
<span class="btn btn-primary btn-xs" ng-click="moveOaUserTaskListenerUp($index)"><i class="glyphicon glyphicon-arrow-up"></i></span>
<span class="btn btn-primary btn-xs" ng-click="moveOaUserTaskListenerDown($index)"><i class="glyphicon glyphicon-arrow-down"></i></span>
<span class="btn btn-danger btn-xs" ng-click="deleteOaUserTaskListener($index)" ng-if="oaUserTaskListener.event != 'complete'"><i class="glyphicon glyphicon-minus"></i></span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="modal-footer">
<button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
<button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1 @@
<span ng-controller="OaNodeManageCtrl"></span>

View File

@ -26,6 +26,7 @@ KISBPM.TOOLBAR = {
top.dialog.confirm('确定保存吗?', function (index) { top.dialog.confirm('确定保存吗?', function (index) {
top.dialog.close(index); top.dialog.close(index);
var json = scope.editor.getJSON(); var json = scope.editor.getJSON();
console.log(json)
if(!json.properties.name) { if(!json.properties.name) {
top.dialog.msg('流程的 元素名称 不能为空'); top.dialog.msg('流程的 元素名称 不能为空');
return; return;
@ -53,13 +54,16 @@ KISBPM.TOOLBAR = {
} }
// Parse dom to string // Parse dom to string
var svgDOM = DataManager.serialize(svgClone); var svgDOM = DataManager.serialize(svgClone);
var modelMetaData = scope.editor.getModelMetaData(); var modelMetaData = scope.editor.getModelMetaData();
// 构建oaNodeManages管理列表
var params = { var params = {
jsonXml: json, jsonXml: json,
svgXml: svgDOM, svgXml: svgDOM,
name: modelMetaData.name, name: modelMetaData.name,
description: modelMetaData.description description: modelMetaData.description,
oaNodeManages: []
}; };
var loadLayerIndex; var loadLayerIndex;
top.restAjax.put(KISBPM.URL.putModel(modelMetaData.modelId), params, null, function (code, data) { top.restAjax.put(KISBPM.URL.putModel(modelMetaData.modelId), params, null, function (code, data) {

View File

@ -199,6 +199,19 @@
} }
] ]
}, },
{
"name": "oanodemanagepackage",
"properties": [
{
"id": "oanodemanage",
"type": "oanodemanage",
"title": "OA节点管理",
"value": "",
"description": "OA节点功能管理",
"popular": true
}
]
},
{ {
"name": "duedatedefinitionpackage", "name": "duedatedefinitionpackage",
"properties": [ "properties": [
@ -1078,6 +1091,7 @@
"活动列表" "活动列表"
], ],
"propertyPackages": [ "propertyPackages": [
"oanodemanagepackage",
"overrideidpackage", "overrideidpackage",
"namepackage", "namepackage",
"documentationpackage", "documentationpackage",

View File

@ -117,6 +117,7 @@
<script src="editor-app/configuration/properties-message-definitions-controller.js" type="text/javascript"></script> <script src="editor-app/configuration/properties-message-definitions-controller.js" type="text/javascript"></script>
<script src="editor-app/configuration/properties-message-scope-controller.js" type="text/javascript"></script> <script src="editor-app/configuration/properties-message-scope-controller.js" type="text/javascript"></script>
<script src="editor-app/configuration/properties-form-select-controller.js" type="text/javascript"></script> <script src="editor-app/configuration/properties-form-select-controller.js" type="text/javascript"></script>
<script src="editor-app/configuration/properties-oa-node-manage-controller.js" type="text/javascript"></script>
<script src="editor-app/configuration/toolbar.js" type="text/javascript"></script> <script src="editor-app/configuration/toolbar.js" type="text/javascript"></script>
<script src="editor-app/configuration/toolbar-custom-actions.js" type="text/javascript"></script> <script src="editor-app/configuration/toolbar-custom-actions.js" type="text/javascript"></script>

View File

@ -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<FormFieldDTO> listByFormId(@PathVariable("formId") String formId) {
return formFieldService.listByFormId(formId);
}
}

View File

@ -83,6 +83,13 @@ public interface IFormFieldService {
*/ */
List<FormFieldDTO> list(Map<String, Object> params); List<FormFieldDTO> list(Map<String, Object> params);
/**
* 列表
* @param formId 表单ID
* @return
*/
List<FormFieldDTO> listByFormId(String formId);
/** /**
* 列表 * 列表
* *
@ -97,7 +104,7 @@ public interface IFormFieldService {
* @param formId * @param formId
* @return * @return
*/ */
List<FormFieldPO> listPO(String formId); List<FormFieldPO> listPOByFormId(String formId);
/** /**
* 分页列表 * 分页列表

View File

@ -86,6 +86,13 @@ public class FormFieldServiceImpl extends DefaultBaseService implements IFormFie
return formFieldDao.list(params); return formFieldDao.list(params);
} }
@Override
public List<FormFieldDTO> listByFormId(String formId) {
Map<String, Object> params = getHashMap(2);
params.put("formId", formId);
return list(params);
}
@Override @Override
public List<FormFieldPO> listPO(Map<String, Object> params) { public List<FormFieldPO> listPO(Map<String, Object> params) {
params = params == null ? getHashMap(2) : params; params = params == null ? getHashMap(2) : params;
@ -93,7 +100,7 @@ public class FormFieldServiceImpl extends DefaultBaseService implements IFormFie
} }
@Override @Override
public List<FormFieldPO> listPO(String formId) { public List<FormFieldPO> listPOByFormId(String formId) {
Map<String, Object> params = getHashMap(2); Map<String, Object> params = getHashMap(2);
params.put("formId", formId); params.put("formId", formId);
return listPO(params); return listPO(params);