调整OA节点管理条件逻辑,增加代理人、候选人与原有流程属性联动

This commit is contained in:
wanggeng 2022-04-06 18:21:57 +08:00
parent 7b8e31d981
commit ae44fe6a2a
6 changed files with 524 additions and 217 deletions

View File

@ -15,14 +15,28 @@ public class AssigneeVO {
@ApiModelProperty(name = "nodeType", value = "节点类型")
private String nodeType;
@ApiModelProperty(name = "assigneeType", value = "代理人类型")
private String assigneeType;
@ApiModelProperty(name = "assigneeCount", value = "代理人数量")
private String assigneeCount;
@ApiModelProperty(name = "assignee", value = "代理人")
private String assignee;
@ApiModelProperty(name = "assigneeName", value = "代理人名称")
private String assigneeName;
@ApiModelProperty(name = "candidates", value = "候选人")
private String candidates;
@ApiModelProperty(name = "candidateNames", value = "候选人名称")
private String candidateNames;
@ApiModelProperty(name = "multipleType", value = "多实例类型")
private String multipleType;
@ApiModelProperty(name = "completeCondition", value = "完成条件")
private String completeCondition;
@ApiModelProperty(name = "completeCount", value = "")
private Integer completeCount;
@ApiModelProperty(name = "multipleAssignees", value = "多实例代理人")
private String multipleAssignees;
@ApiModelProperty(name = "multipleAssigneeNames", value = "多实例代理人名称")
private String multipleAssigneeNames;
@ApiModelProperty(name = "assigneeType", value = "代理人类型")
private String assigneeType;
@ApiModelProperty(name = "autoAssignType", value = "自动方式")
private String autoAssignType;
@ApiModelProperty(name = "departmentType", value = "部门类型")
@ -41,14 +55,6 @@ public class AssigneeVO {
private String positionNames;
@ApiModelProperty(name = "quickAssignee", value = "快速代理人")
private String quickAssignee;
@ApiModelProperty(name = "signType", value = "会签类型")
private String signType;
@ApiModelProperty(name = "signUsers", value = "会签人")
private String signUsers;
@ApiModelProperty(name = "completeCondition", value = "完成条件")
private String completeCondition;
@ApiModelProperty(name = "completeCount", value = "")
private Integer completeCount;
public String getNodeType() {
return nodeType == null ? "" : nodeType.trim();
@ -58,14 +64,6 @@ public class AssigneeVO {
this.nodeType = nodeType;
}
public String getAssigneeType() {
return assigneeType == null ? "" : assigneeType.trim();
}
public void setAssigneeType(String assigneeType) {
this.assigneeType = assigneeType;
}
public String getAssigneeCount() {
return assigneeCount == null ? "" : assigneeCount.trim();
}
@ -90,6 +88,70 @@ public class AssigneeVO {
this.assigneeName = assigneeName;
}
public String getCandidates() {
return candidates == null ? "" : candidates.trim();
}
public void setCandidates(String candidates) {
this.candidates = candidates;
}
public String getCandidateNames() {
return candidateNames == null ? "" : candidateNames.trim();
}
public void setCandidateNames(String candidateNames) {
this.candidateNames = candidateNames;
}
public String getMultipleType() {
return multipleType == null ? "" : multipleType.trim();
}
public void setMultipleType(String multipleType) {
this.multipleType = multipleType;
}
public String getCompleteCondition() {
return completeCondition == null ? "" : completeCondition.trim();
}
public void setCompleteCondition(String completeCondition) {
this.completeCondition = completeCondition;
}
public Integer getCompleteCount() {
return completeCount == null ? 0 : completeCount;
}
public void setCompleteCount(Integer completeCount) {
this.completeCount = completeCount;
}
public String getMultipleAssignees() {
return multipleAssignees == null ? "" : multipleAssignees.trim();
}
public void setMultipleAssignees(String multipleAssignees) {
this.multipleAssignees = multipleAssignees;
}
public String getMultipleAssigneeNames() {
return multipleAssigneeNames == null ? "" : multipleAssigneeNames.trim();
}
public void setMultipleAssigneeNames(String multipleAssigneeNames) {
this.multipleAssigneeNames = multipleAssigneeNames;
}
public String getAssigneeType() {
return assigneeType == null ? "" : assigneeType.trim();
}
public void setAssigneeType(String assigneeType) {
this.assigneeType = assigneeType;
}
public String getAutoAssignType() {
return autoAssignType == null ? "" : autoAssignType.trim();
}
@ -162,49 +224,33 @@ public class AssigneeVO {
this.quickAssignee = quickAssignee;
}
public String getSignType() {
return signType == null ? "" : signType.trim();
}
public void setSignType(String signType) {
this.signType = signType;
}
public String getSignUsers() {
return signUsers == null ? "" : signUsers.trim();
}
public void setSignUsers(String signUsers) {
this.signUsers = signUsers;
}
public String getCompleteCondition() {
return completeCondition == null ? "" : completeCondition.trim();
}
public void setCompleteCondition(String completeCondition) {
this.completeCondition = completeCondition;
}
public Integer getCompleteCount() {
return completeCount == null ? 0 : completeCount;
}
public void setCompleteCount(Integer completeCount) {
this.completeCount = completeCount;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append("\"nodeType\":\"")
.append(nodeType).append('\"');
sb.append(",\"assigneeType\":\"")
.append(assigneeType).append('\"');
sb.append(",\"assigneeCount\":")
.append(assigneeCount);
sb.append(",\"assigneeCount\":\"")
.append(assigneeCount).append('\"');
sb.append(",\"assignee\":\"")
.append(assignee).append('\"');
sb.append(",\"assigneeName\":\"")
.append(assigneeName).append('\"');
sb.append(",\"candidates\":\"")
.append(candidates).append('\"');
sb.append(",\"candidateNames\":\"")
.append(candidateNames).append('\"');
sb.append(",\"multipleType\":\"")
.append(multipleType).append('\"');
sb.append(",\"completeCondition\":\"")
.append(completeCondition).append('\"');
sb.append(",\"completeCount\":")
.append(completeCount);
sb.append(",\"multipleAssignees\":\"")
.append(multipleAssignees).append('\"');
sb.append(",\"multipleAssigneeNames\":\"")
.append(multipleAssigneeNames).append('\"');
sb.append(",\"assigneeType\":\"")
.append(assigneeType).append('\"');
sb.append(",\"autoAssignType\":\"")
.append(autoAssignType).append('\"');
sb.append(",\"departmentType\":\"")
@ -223,14 +269,6 @@ public class AssigneeVO {
.append(positionNames).append('\"');
sb.append(",\"quickAssignee\":\"")
.append(quickAssignee).append('\"');
sb.append(",\"signType\":\"")
.append(signType).append('\"');
sb.append(",\"signUsers\":\"")
.append(signUsers).append('\"');
sb.append(",\"completeCondition\":\"")
.append(completeCondition).append('\"');
sb.append(",\"completeCount\":")
.append(completeCount);
sb.append('}');
return sb.toString();
}

View File

@ -12,10 +12,14 @@
`node_id` char(60) DEFAULT NULL COMMENT '节点ID',
`node_index` int(11) DEFAULT NULL COMMENT '节点下标',
`node_type` varchar(255) DEFAULT NULL COMMENT '节点类型',
`assignee_type` varchar(255) DEFAULT NULL COMMENT '代理人类型',
`assignee_count` varchar(255) DEFAULT NULL COMMENT '代理人数量',
`assignee` varchar(255) DEFAULT NULL COMMENT '代理人',
`assignee_names` varchar(255) DEFAULT NULL COMMENT '代理人名称',
`assignee_name` varchar(255) DEFAULT NULL COMMENT '代理人名称',
`candidates` varchar(255) DEFAULT NULL COMMENT '候选人',
`candidate_names` varchar(255) DEFAULT NULL COMMENT '候选人名称',
`multiple_type` varchar(255) DEFAULT NULL COMMENT '多实例类型',
`complete_condition` varchar(255) DEFAULT NULL COMMENT '完成条件',
`complete_count` int(11) DEFAULT NULL COMMENT '完成人数量',
`auto_assign_type` varchar(255) DEFAULT NULL COMMENT '自动方式',
`department_type` varchar(255) DEFAULT NULL COMMENT '部门类型',
`departments` varchar(255) DEFAULT NULL COMMENT '部门',
@ -25,10 +29,9 @@
`positions` varchar(255) DEFAULT NULL COMMENT '职位',
`position_names` varchar(255) DEFAULT NULL COMMENT '职位名称',
`quick_assignee` varchar(255) DEFAULT NULL COMMENT '快速代理人',
`sign_type` varchar(255) DEFAULT NULL COMMENT '会签类型',
`sign_users` varchar(255) DEFAULT NULL COMMENT '会签人',
`complete_condition` varchar(255) DEFAULT NULL COMMENT '完成条件',
`complete_count` int(11) DEFAULT NULL COMMENT '完成人数量',
`multiple_assignees` varchar(255) DEFAULT NULL COMMENT '多实例候选人',
`assignee_type` varchar(255) DEFAULT NULL COMMENT '代理人类型',
`multiple_assignee_names` varchar(255) DEFAULT NULL COMMENT '多实例候选人名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='节点代理人';
</update>
@ -42,10 +45,17 @@
node_id,
node_index,
node_type,
assignee_type,
assignee_count,
assignee,
assignee_name,
candidates,
candidate_names,
multiple_type,
complete_condition,
complete_count,
multiple_assignees,
multiple_assignee_names,
assignee_type,
auto_assign_type,
department_type,
departments,
@ -54,11 +64,7 @@
role_names,
positions,
position_names,
quick_assignee,
sign_type,
sign_users,
complete_condition,
complete_count
quick_assignee
) VALUES(
#{nodeFieldId},
#{modelId},
@ -66,10 +72,17 @@
#{nodeId},
#{nodeIndex},
#{nodeType},
#{assigneeType},
#{assigneeCount},
#{assignee},
#{assigneeName},
#{candidates},
#{candidateNames},
#{multipleType},
#{completeCondition},
#{completeCount},
#{multipleAssignees},
#{multipleAssigneeNames},
#{assigneeType},
#{autoAssignType},
#{departmentType},
#{departments},
@ -78,11 +91,7 @@
#{roleNames},
#{positions},
#{positionNames},
#{quickAssignee},
#{signType},
#{signUsers},
#{completeCondition},
#{completeCount}
#{quickAssignee}
)
</insert>

View File

@ -1,4 +1,4 @@
var OaNodeManageCtrl = [ '$scope' , '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) {
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',
@ -8,8 +8,8 @@ var OaNodeManageCtrl = [ '$scope' , '$modal', '$timeout', '$translate', function
$modal(opts);
}];
var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $timeout, $http) {
// console.log($scope.selectedItem);
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)
@ -17,6 +17,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
var model = $scope.editor.modelMetaData.model;
var childShapes = model.childShapes;
// 关联到的属性
var assigneeProperty = $scope.selectedItem.properties[13];
var taskListenerProperty = $scope.selectedItem.properties[16];
// 初始化
@ -24,10 +25,17 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
$scope.oaNodeManage = {
assignee: {
nodeType: 'normal',
assigneeType: '',
assigneeCount: 0,
assigneeCount: '',
assignee: '',
assigneeName: '',
candidates: '',
candidateNames: '',
multipleType: 'parallel',
completeCondition: 'allPass',
completeCount: 0,
multipleAssignees: '',
multipleAssigneeNames: '',
assigneeType: '',
autoAssignType: '',
departmentType: '',
departments: '',
@ -37,10 +45,6 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
positions: '',
positionNames: '',
quickAssignee: '',
signType: '',
signUsers: '',
completeCondition: '',
completeCount: 0
},
formId: '',
formFields: [],
@ -65,6 +69,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
delegateExpression: delegateExpression ? delegateExpression : ''
});
}
/**
* 判断监听器是否存在
* @param event
@ -113,7 +118,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
addOaUserTaskListener(event, className, expression, delegateExpression);
}
// 上移用户任务监听器
$scope.moveOaUserTaskListenerUp = function(index) {
$scope.moveOaUserTaskListenerUp = function (index) {
var prevIndex = index - 1;
var temp = $scope.oaNodeManage.oaUserTaskListeners[index];
$scope.oaNodeManage.oaUserTaskListeners.splice(index, 1);
@ -122,7 +127,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
}, 10);
}
// 下移用户任务监听器
$scope.moveOaUserTaskListenerDown = function(index) {
$scope.moveOaUserTaskListenerDown = function (index) {
var nextIndex = index + 1;
var temp = $scope.oaNodeManage.oaUserTaskListeners[index];
$scope.oaNodeManage.oaUserTaskListeners.splice(index, 1);
@ -131,17 +136,17 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
}, 10);
}
// 删除用户任务监听器
$scope.deleteOaUserTaskListener = function(index) {
$scope.deleteOaUserTaskListener = function (index) {
$scope.oaNodeManage.oaUserTaskListeners.splice(index, 1);
}
// 选择用户
$scope.selectUser = function() {
$scope.selectAssignee = function () {
var assignee = $scope.oaNodeManage.assignee;
top.dialog.dialogData.selectedUserIds = assignee.assignee;
top.dialog.dialogData.selectedUserIds = assignee.multipleAssignees;
top.dialog.open({
url: top.restAjax.path('route/department/user/select-user', []),
title: '选择用户',
title: '选择代理人【单选】',
width: '500px',
height: '500px',
closeBtn: 0,
@ -149,12 +154,10 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
var selectedUsers = top.dialog.dialogData.selectedDepartmentUsers;
// 这里写处理逻辑
if (selectedUsers && selectedUsers.length > 0) {
if(selectedUsers.length > 1) {
if (selectedUsers.length > 1) {
top.dialog.msg('只能选择一位代理人');
return;
}
var userId = selectedUsers[0].userId;
var userName = selectedUsers[0].userName;
assignee.assignee = selectedUsers[0].userId;
assignee.assigneeName = selectedUsers[0].userName;
} else {
@ -166,22 +169,92 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
}
})
}
$scope.selectDepartments = function() {
// 选择候选人
$scope.selectCandidates = function () {
var assignee = $scope.oaNodeManage.assignee;
top.dialog.dialogData.checkedIds = !assignee.departments ? [] : assignee.departments.split(',');
top.dialog.dialogData.selectedUserIds = assignee.candidates ? assignee.candidates.replace(/,/g, '_') : '';
top.dialog.open({
url: top.restAjax.path('route/department/user/select-user', []),
title: '选择候选人【多选】',
width: '500px',
height: '500px',
closeBtn: 0,
onClose: function () {
var selectedUsers = top.dialog.dialogData.selectedDepartmentUsers;
// 这里写处理逻辑
if (selectedUsers && selectedUsers.length > 0) {
var candidates = '';
var candidateNames = '';
for (var i = 0, item; item = selectedUsers[i++];) {
if (candidates.length) {
candidates += ',';
candidateNames += ',';
}
candidates += item.userId;
candidateNames += item.userName;
}
assignee.candidates = candidates;
assignee.candidateNames = candidateNames;
} else {
assignee.candidates = '';
assignee.candidateNames = '';
}
top.dialog.dialogData.selectedDepartmentUsers = [];
$scope.$apply();
}
})
}
// 选择多实例代理人
$scope.selectMultipleAssignee = function () {
var assignee = $scope.oaNodeManage.assignee;
top.dialog.dialogData.selectedUserIds = assignee.multipleAssignees ? assignee.multipleAssignees.replace(/,/g, '_') : '';
top.dialog.open({
url: top.restAjax.path('route/department/user/select-user', []),
title: '选择多实例代理人【多选】',
width: '500px',
height: '500px',
closeBtn: 0,
onClose: function () {
var selectedUsers = top.dialog.dialogData.selectedDepartmentUsers;
// 这里写处理逻辑
if (selectedUsers && selectedUsers.length > 0) {
var multipleAssignees = '';
var multipleAssigneeNames = '';
for (var i = 0, item; item = selectedUsers[i++];) {
if (multipleAssignees.length) {
multipleAssignees += ',';
multipleAssigneeNames += ',';
}
multipleAssignees += item.userId;
multipleAssigneeNames += item.userName;
}
assignee.multipleAssignees = multipleAssignees;
assignee.multipleAssigneeNames = multipleAssigneeNames;
} else {
assignee.multipleAssignees = '';
assignee.multipleAssigneeNames = '';
}
top.dialog.dialogData.selectedDepartmentUsers = [];
$scope.$apply();
}
})
}
// 选择部门
$scope.selectDepartments = function () {
var assignee = $scope.oaNodeManage.assignee;
top.dialog.dialogData.checkedDepartmentIds = !assignee.departments ? [] : assignee.departments.split(',');
top.dialog.open({
url: top.restAjax.path('route/department/list-tree-check', []),
title: '选择组织部门',
title: '选择组织部门【多选】',
width: '400px',
height: '400px',
onClose: function() {
var checkedNodes = top.dialog.dialogData.checkedNodes;
if(checkedNodes && checkedNodes.length > 0) {
onClose: function () {
var checkedDepartmentNodes = top.dialog.dialogData.checkedDepartmentNodes;
if (checkedDepartmentNodes && checkedDepartmentNodes.length > 0) {
var departments = '';
var departmentNames = '';
for(var i = 0, item; item = checkedNodes[i++];) {
if(departments.length > 0) {
for (var i = 0, item; item = checkedDepartmentNodes[i++];) {
if (departments.length > 0) {
departments += ',';
departmentNames += ',';
}
@ -194,23 +267,162 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
assignee.departments = '';
assignee.departmentNames = '';
}
top.dialog.dialogData.checkedNodes = [];
top.dialog.dialogData.checkedDepartmentNodes = [];
$scope.$apply();
}
});
}
// 选择角色
$scope.selectRoles = function () {
var assignee = $scope.oaNodeManage.assignee;
top.dialog.dialogData.checkedRoleIds = !assignee.roles ? [] : assignee.roles.split(',');
top.dialog.open({
url: top.restAjax.path('route/role/list-tree-check', []),
title: '选择角色【多选】',
width: '400px',
height: '400px',
onClose: function () {
var checkedRoleNodes = top.dialog.dialogData.checkedRoleNodes;
if (checkedRoleNodes && checkedRoleNodes.length > 0) {
var roles = '';
var roleNames = '';
for (var i = 0, item; item = checkedRoleNodes[i++];) {
if (roles.length > 0) {
roles += ',';
roleNames += ',';
}
roles += item.id;
roleNames += item.name;
}
assignee.roles = roles;
assignee.roleNames = roleNames;
} else {
assignee.roles = '';
assignee.roleNames = '';
}
top.dialog.dialogData.checkedRoleNodes = [];
$scope.$apply();
}
});
}
// 选择职位
$scope.selectPositions = function () {
var assignee = $scope.oaNodeManage.assignee;
top.dialog.dialogData.checkedPositionIds = !assignee.positions ? [] : assignee.positions.split(',');
top.dialog.open({
url: top.restAjax.path('route/position/list-tree-check', []),
title: '选择职位【多选】',
width: '400px',
height: '400px',
onClose: function () {
var checkedPositionNodes = top.dialog.dialogData.checkedPositionNodes;
if (checkedPositionNodes && checkedPositionNodes.length > 0) {
var positions = '';
var positionNames = '';
for (var i = 0, item; item = checkedPositionNodes[i++];) {
if (positions.length > 0) {
positions += ',';
positionNames += ',';
}
positions += item.id;
positionNames += item.name;
}
assignee.positions = positions;
assignee.positionNames = positionNames;
} else {
assignee.positions = '';
assignee.positionNames = '';
}
top.dialog.dialogData.checkedPositionNodes = [];
$scope.$apply();
}
});
}
// Click handler for save button
$scope.save = function () {
// 更新代理人与候选人信息
function updateAssignment() {
// 更新手动指定单选代理人
function updateAssignee() {
assigneeProperty.value = {};
assigneeProperty.value.assignment = {
assignee: $scope.oaNodeManage.assignee.assignee,
candidateUsers: []
}
$scope.updatePropertyInModel(assigneeProperty);
}
$scope.property.value = {};
$scope.property.value = $scope.oaNodeManage;
$scope.updatePropertyInModel($scope.property);
// 更新手动指定多选候选人
function updateCandidate() {
assigneeProperty.value = {};
assigneeProperty.value.assignment = {
candidateUsers: []
};
var candidates = $scope.oaNodeManage.assignee.candidates.split(',');
for (var i = 0, item; item = candidates[i++];) {
if (!item) {
continue;
}
assigneeProperty.value.assignment.candidateUsers.push({
value: item
})
}
}
// 更新任务监听器列表
// 更新手动指定多个候选人
function updateCandidates() {
assigneeProperty.value = {};
assigneeProperty.value.assignment = {
candidateUsers: [{value: '${candidates}'}]
};
}
var assignee = $scope.oaNodeManage.assignee;
// 普通节点
if (assignee.nodeType === 'normal') {
// 手动指定
if (assignee.assigneeType === 'appoint') {
// 单选
if (assignee.assigneeCount === 'single') {
updateAssignee();
return;
}
// 多选
if (assignee.assigneeCount === 'candidate') {
updateCandidate();
return;
}
return;
}
// 自动获取
if (assignee.assigneeType === 'auto') {
updateCandidates();
return;
}
return;
}
}
/**
* 更新任务监听器列表
*/
function updateTaskListener() {
taskListenerProperty.value = {}
taskListenerProperty.value.taskListeners = $scope.oaNodeManage.oaUserTaskListeners;
$scope.updatePropertyInModel(taskListenerProperty);
}
// Click handler for save button
$scope.save = function () {
$scope.property.value = {};
$scope.property.value = $scope.oaNodeManage;
$scope.updatePropertyInModel($scope.property);
console.log($scope.property)
updateAssignment();
updateTaskListener();
$scope.close();
};
@ -220,26 +432,28 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
// Close button handler
$scope.close = function () {
assigneeProperty.mode = 'read';
taskListenerProperty.mode = 'read';
$scope.property.mode = 'read';
$scope.$hide();
};
function initOaNodeManage() {
if($scope.property.value) {
$scope.oaNodeManage = $scope.property.value;
if ($scope.property.value) {
$scope.oaNodeManage = EDITOR.UTIL.deepClone($scope.property.value);
}
}
// 初始化开始节点
function initStartNode() {
for(var i = 0, node; node = childShapes[i++];) {
if(node.stencil.id == 'StartNoneEvent') {
for (var i = 0, node; node = childShapes[i++];) {
if (node.stencil.id == 'StartNoneEvent') {
startNode = node;
break;
}
}
if(!startNode) {
if (!startNode) {
top.dialog.msg('未找到开始节点无法设置OA节点');
$scope.close();
return;
@ -248,7 +462,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
// 初始化oaUserTaskCompleteListener
function initOaUserTaskCompleteListener() {
if($scope.property.value) {
if ($scope.property.value) {
return;
}
var event = 'complete',
@ -265,9 +479,9 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
// 初始化form表单ID
function initFormId(callback) {
$scope.oaNodeManage.formId = startNode.properties.formkeydefinition;
if(!$scope.oaNodeManage.formId) {
if (!$scope.oaNodeManage.formId) {
top.dialog.msg('开始节点未绑定表单无法设置OA节点');
$timeout(function() {
$timeout(function () {
$scope.close();
}, 10)
return;
@ -277,13 +491,13 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
// 初始化form表单
function initFormField() {
$http.get('api/form-field/list/form-id/'+ $scope.oaNodeManage.formId).then(function(response) {
$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++];) {
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) {
for (var j = 0, item; item = $scope.oaNodeManage.formFields[j++];) {
if (formField.fieldId === item.fieldId) {
isVisible = item.isVisible;
isEditable = item.isEditable;
}
@ -299,17 +513,17 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
})
}
$scope.oaNodeManage.formFields = formFields;
}, function(response) {
}, function (response) {
top.dialog.msg(response.data.msg);
})
}
// 初始化
(function() {
(function () {
initOaNodeManage();
initStartNode();
initOaUserTaskCompleteListener();
initFormId(function() {
initFormId(function () {
initFormField();
});
})();

View File

@ -34,21 +34,66 @@
<td>
<div>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.nodeType" type="radio" name="nodeType" value="normal"> 普通节点
<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"> 会签节点
<input ng-model="oaNodeManage.assignee.nodeType" type="radio" name="nodeType" value="multiple"> 多实例节点
</label>
</div>
</td>
</tr>
<!-- 普通节点 start -->
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal'">
<!-- 普通节点 end -->
<!-- 多实例节点 start -->
<tr ng-if="oaNodeManage.assignee.nodeType == 'multiple'">
<td>
<h5>多实例类型</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'multiple'">
<td>
<div>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.multipleType" type="radio" name="multipleType" value="parallel"> 并行
</label>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.multipleType" type="radio" name="multipleType" value="sequential"> 串行
</label>
</div>
</td>
</tr>
<!-- 并行 start -->
<tr ng-if="oaNodeManage.assignee.nodeType == 'multiple' && oaNodeManage.assignee.multipleType == 'parallel'">
<td>
<h5>完成(通过)条件</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'multiple' && oaNodeManage.assignee.multipleType == '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 -->
<!-- 代理人 start -->
<tr>
<td>
<h5>代理人类型</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal'">
<tr>
<td>
<div>
<label class="radio-inline">
@ -60,7 +105,7 @@
</div>
</td>
</tr>
<!-- 手动指定代理人 start -->
<!-- 手动指定单实例代理人 start -->
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'appoint'">
<td>
<h5>代理人数量</h5>
@ -72,31 +117,65 @@
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.assigneeCount" type="radio" name="assigneeCount" value="single"> 单人
</label>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.assigneeCount" type="radio" name="assigneeCount" value="candidate"> 候选人
</label>
</div>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'appoint' && oaNodeManage.assignee.assigneeCount == 'single'">
<td>
<h5>选择代理人</h5>
<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">
<input ng-model="oaNodeManage.assignee.assigneeName" type="hidden" name="assigneeName">
<button type="button" ng-click="selectUser()">选择</button>
<button type="button" ng-click="selectAssignee()">选择</button>
<span>{{oaNodeManage.assignee.assigneeName}}</span>
</td>
</tr>
<!-- 手动指定代理人 end -->
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'appoint' && oaNodeManage.assignee.assigneeCount == 'candidate'">
<td>
<h5>选择候选人列表【多选】</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'appoint' && oaNodeManage.assignee.assigneeCount == 'candidate'">
<td>
<input ng-model="oaNodeManage.assignee.candidates" type="hidden" name="candidates">
<input ng-model="oaNodeManage.assignee.candidateNames" type="hidden" name="candidateNames">
<button type="button" ng-click="selectCandidates()">选择</button>
<span>{{oaNodeManage.assignee.candidateNames}}</span>
</td>
</tr>
<!-- 手动指定单实例代理人 end -->
<!-- 手动指定多实例代理人 start -->
<tr ng-if="oaNodeManage.assignee.nodeType == 'multiple' && oaNodeManage.assignee.assigneeType == 'appoint'">
<td>
<h5>选择(多实例)代理人【多选】</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'multiple' && oaNodeManage.assignee.assigneeType == 'appoint'">
<td>
<input ng-model="oaNodeManage.assignee.multipleAssignees" type="hidden" name="multipleAssignees">
<input ng-model="oaNodeManage.assignee.multipleAssigneeNames" type="hidden" name="multipleAssigneeNames">
<button type="button" ng-click="selectMultipleAssignee()">选择</button>
<span>{{oaNodeManage.assignee.multipleAssigneeNames}}</span>
</td>
</tr>
<!-- 手动指定多实例代理人 end -->
<!-- 自动获取代理人 start -->
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto'">
<tr ng-if="oaNodeManage.assignee.assigneeType == 'auto'">
<td>
<h5>自动方式</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto'">
<tr ng-if="oaNodeManage.assignee.assigneeType == 'auto'">
<td>
<div>
<label class="radio-inline">
@ -109,12 +188,12 @@
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope'">
<tr ng-if="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'">
<tr ng-if="oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope'">
<td>
<div>
<label class="radio-inline">
@ -127,12 +206,12 @@
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope' && oaNodeManage.assignee.departmentType == 'appoint'">
<tr ng-if="oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope' && oaNodeManage.assignee.departmentType == 'appoint'">
<td>
<h5>选择部门</h5>
<h5>选择部门【多选】</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope' && oaNodeManage.assignee.departmentType == 'appoint'">
<tr ng-if="oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope' && oaNodeManage.assignee.departmentType == 'appoint'">
<td>
<input ng-model="oaNodeManage.assignee.departments" type="hidden" name="departments">
<input ng-model="oaNodeManage.assignee.departmentNames" type="hidden" name="departmentNames">
@ -141,38 +220,39 @@
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope'">
<tr ng-if="oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope'">
<td>
<h5>选择角色</h5>
<h5>选择角色【多选】</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope'">
<tr ng-if="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>
<input ng-model="oaNodeManage.assignee.roleNames" type="hidden" name="roleNames">
<button type="button" ng-click="selectRoles()">选择</button>
<span>{{oaNodeManage.assignee.roleNames}}</span>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope'">
<tr ng-if="oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope'">
<td>
<h5>选择职位</h5>
<h5>选择职位【多选】</h5>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope'">
<tr ng-if="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>
<input ng-model="oaNodeManage.assignee.positionNames" type="hidden" name="positionNames">
<button type="button" ng-click="selectPositions()">选择</button>
<span>{{oaNodeManage.assignee.positionNames}}</span>
</td>
</tr>
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'quick'">
<tr ng-if="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'">
<tr ng-if="oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'quick'">
<td>
<div class="radio">
<label>
@ -208,62 +288,6 @@
</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>

View File

@ -43,7 +43,6 @@ KISBPM.TOOLBAR = {
},
listOaNodeManage: function(json) {
var nodes = json.childShapes;
var oaNodeManages = [];
for(var i = 0, item; item = nodes[i++];) {
if(item.stencil.id === 'UserTask') {

View File

@ -130,6 +130,29 @@ EDITOR.UTIL = {
} else {
return undefined;
}
},
/**
* 深拷贝
* @param source
* @returns {{}}
*/
deepClone: function (source) {
var cloneObj;
if (source && typeof (source) === 'object') {
if (source instanceof Array) {
cloneObj = [];
for (var i = 0, item; item = source[i++];) {
cloneObj.push(EDITOR.UTIL.deepClone(item));
}
} else {
cloneObj = {}
for (var k in source) {
cloneObj[k] = EDITOR.UTIL.deepClone(source[k]);
}
}
} else {
cloneObj = source;
}
return cloneObj;
}
};
}