重新处理oa代理人逻辑
This commit is contained in:
parent
cd7a73a445
commit
9a9936fb02
@ -81,7 +81,10 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
|
|||||||
ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId);
|
ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId);
|
||||||
String deploymentId = processDefinition.getDeploymentId();
|
String deploymentId = processDefinition.getDeploymentId();
|
||||||
|
|
||||||
Map<String, Object> variables = delegateTask.getVariables();
|
LOG.debug("清空流程变量中的 代理人列表");
|
||||||
|
delegateTask.removeVariable(IActivitiModelService.ASSIGNEE_LIST);
|
||||||
|
|
||||||
|
Map<String, Object> variables = delegateTask.getVariablesLocal();
|
||||||
LOG.debug("查询表单数据:variables: {}", variables);
|
LOG.debug("查询表单数据:variables: {}", variables);
|
||||||
LOG.debug("获取下一节点");
|
LOG.debug("获取下一节点");
|
||||||
UserTask nextUserTask = activitiModelService.getNextUserTask(delegateTask.getTaskDefinitionKey(), delegateTask.getProcessDefinitionId(), variables);
|
UserTask nextUserTask = activitiModelService.getNextUserTask(delegateTask.getTaskDefinitionKey(), delegateTask.getProcessDefinitionId(), variables);
|
||||||
@ -147,7 +150,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
|
|||||||
throw new OaNodeException("多实例代理人不存在");
|
throw new OaNodeException("多实例代理人不存在");
|
||||||
}
|
}
|
||||||
List<String> existUserIds = ArrayListUtil.listBeanStringIdValue(userDTOs, "userId", UserDTO.class);
|
List<String> existUserIds = ArrayListUtil.listBeanStringIdValue(userDTOs, "userId", UserDTO.class);
|
||||||
delegateTask.setVariable(IActivitiModelService.MULTI_INSTANCE_COLLECTION_NAME, existUserIds);
|
delegateTask.setVariable(IActivitiModelService.ASSIGNEE_LIST, existUserIds);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (StringUtils.equals(oaNodeAssigneePO.getAssigneeType(), AssigneeTypeEnum.AUTO.getValue())) {
|
if (StringUtils.equals(oaNodeAssigneePO.getAssigneeType(), AssigneeTypeEnum.AUTO.getValue())) {
|
||||||
@ -185,12 +188,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
|
|||||||
if (StringUtils.isBlank(candidates)) {
|
if (StringUtils.isBlank(candidates)) {
|
||||||
throw new OaNodeException("下节点候选人未设置");
|
throw new OaNodeException("下节点候选人未设置");
|
||||||
}
|
}
|
||||||
List<UserDTO> userDTOs = userBaseService.listByUserIds(Arrays.asList(candidates.split(",")));
|
setNextUserTaskAssignees(delegateTask, userTask, Arrays.asList(candidates.split(",")), NodeTypeEnum.NORMAL);
|
||||||
if (userDTOs.isEmpty()) {
|
|
||||||
throw new OaNodeException("下节点候选人不存在");
|
|
||||||
}
|
|
||||||
LOG.debug("设置候选人");
|
|
||||||
userTask.setCandidateUsers(ArrayListUtil.listBeanStringIdValue(userDTOs, "userId", UserDTO.class));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -288,7 +286,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
|
|||||||
LOG.debug("候选人用户列表");
|
LOG.debug("候选人用户列表");
|
||||||
userTask.setCandidateUsers(existParentPositionUserIds);
|
userTask.setCandidateUsers(existParentPositionUserIds);
|
||||||
} else {
|
} else {
|
||||||
delegateTask.setVariable(IActivitiModelService.MULTI_INSTANCE_COLLECTION_NAME, existParentPositionUserIds);
|
delegateTask.setVariable(IActivitiModelService.ASSIGNEE_LIST, existParentPositionUserIds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -327,7 +325,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
|
|||||||
LOG.debug("设置候选人列表");
|
LOG.debug("设置候选人列表");
|
||||||
userTask.setCandidateUsers(existChildPositionUserIds);
|
userTask.setCandidateUsers(existChildPositionUserIds);
|
||||||
} else {
|
} else {
|
||||||
delegateTask.setVariable(IActivitiModelService.MULTI_INSTANCE_COLLECTION_NAME, existChildPositionUserIds);
|
delegateTask.setVariable(IActivitiModelService.ASSIGNEE_LIST, existChildPositionUserIds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -366,7 +364,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
|
|||||||
LOG.debug("设置候选人列表");
|
LOG.debug("设置候选人列表");
|
||||||
userTask.setCandidateUsers(existParentPositionUserIds);
|
userTask.setCandidateUsers(existParentPositionUserIds);
|
||||||
} else {
|
} else {
|
||||||
delegateTask.setVariable(IActivitiModelService.MULTI_INSTANCE_COLLECTION_NAME, existParentPositionUserIds);
|
delegateTask.setVariable(IActivitiModelService.ASSIGNEE_LIST, existParentPositionUserIds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,7 +393,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
|
|||||||
LOG.debug("设置候选人列表");
|
LOG.debug("设置候选人列表");
|
||||||
userTask.setCandidateUsers(existChildPositionUserIds);
|
userTask.setCandidateUsers(existChildPositionUserIds);
|
||||||
} else {
|
} else {
|
||||||
delegateTask.setVariable(IActivitiModelService.MULTI_INSTANCE_COLLECTION_NAME, existChildPositionUserIds);
|
delegateTask.setVariable(IActivitiModelService.ASSIGNEE_LIST, existChildPositionUserIds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -415,7 +413,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
|
|||||||
if (NodeTypeEnum.NORMAL.equals(nodeType)) {
|
if (NodeTypeEnum.NORMAL.equals(nodeType)) {
|
||||||
userTask.setAssignee(assignee);
|
userTask.setAssignee(assignee);
|
||||||
} else {
|
} else {
|
||||||
delegateTask.setVariable(IActivitiModelService.MULTI_INSTANCE_COLLECTION_NAME, Arrays.asList(assignee));
|
delegateTask.setVariable(IActivitiModelService.ASSIGNEE_LIST, Arrays.asList(assignee));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -484,7 +482,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
|
|||||||
setRoleCandidateUser(delegateTask, userTask, roleUserIds, positionIds, nodeType);
|
setRoleCandidateUser(delegateTask, userTask, roleUserIds, positionIds, nodeType);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setCandidateUsers(delegateTask, userTask, departmentUserIds, nodeType);
|
setNextUserTaskAssignees(delegateTask, userTask, departmentUserIds, nodeType);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -503,7 +501,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
|
|||||||
setPositionCandidateUser(delegateTask, userTask, positionUserIds, nodeType);
|
setPositionCandidateUser(delegateTask, userTask, positionUserIds, nodeType);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setCandidateUsers(delegateTask, userTask, roleUserIds, nodeType);
|
setNextUserTaskAssignees(delegateTask, userTask, roleUserIds, nodeType);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -515,18 +513,18 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
|
|||||||
* @param nodeType
|
* @param nodeType
|
||||||
*/
|
*/
|
||||||
private void setPositionCandidateUser(DelegateTask delegateTask, UserTask userTask, List<String> positionUserIds, NodeTypeEnum nodeType) {
|
private void setPositionCandidateUser(DelegateTask delegateTask, UserTask userTask, List<String> positionUserIds, NodeTypeEnum nodeType) {
|
||||||
setCandidateUsers(delegateTask, userTask, positionUserIds, nodeType);
|
setNextUserTaskAssignees(delegateTask, userTask, positionUserIds, nodeType);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置候选人用户
|
* 设置下个用户任务代理人清单
|
||||||
*
|
*
|
||||||
* @param delegateTask
|
* @param delegateTask
|
||||||
* @param userTask
|
* @param userTask
|
||||||
* @param userIds
|
* @param userIds
|
||||||
* @param nodeType
|
* @param nodeType
|
||||||
*/
|
*/
|
||||||
private void setCandidateUsers(DelegateTask delegateTask, UserTask userTask, List<String> userIds, NodeTypeEnum nodeType) {
|
private void setNextUserTaskAssignees(DelegateTask delegateTask, UserTask userTask, List<String> userIds, NodeTypeEnum nodeType) {
|
||||||
List<UserDTO> userDTOs = userBaseService.listByUserIds(userIds);
|
List<UserDTO> userDTOs = userBaseService.listByUserIds(userIds);
|
||||||
if (userDTOs.isEmpty()) {
|
if (userDTOs.isEmpty()) {
|
||||||
throw new OaNodeException("下节点候选人不存在");
|
throw new OaNodeException("下节点候选人不存在");
|
||||||
@ -534,11 +532,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
|
|||||||
LOG.debug("设置候选人");
|
LOG.debug("设置候选人");
|
||||||
List<String> existUserIds = ArrayListUtil.listBeanStringIdValue(userDTOs, "userId", UserDTO.class);
|
List<String> existUserIds = ArrayListUtil.listBeanStringIdValue(userDTOs, "userId", UserDTO.class);
|
||||||
clearUserIdsCurrentTaskAssignee(existUserIds, delegateTask.getAssignee());
|
clearUserIdsCurrentTaskAssignee(existUserIds, delegateTask.getAssignee());
|
||||||
if (NodeTypeEnum.NORMAL.equals(nodeType)) {
|
delegateTask.setVariable(IActivitiModelService.ASSIGNEE_LIST, existUserIds);
|
||||||
userTask.setCandidateUsers(existUserIds);
|
|
||||||
} else {
|
|
||||||
delegateTask.setVariable(IActivitiModelService.MULTI_INSTANCE_COLLECTION_NAME, existUserIds);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -41,11 +41,11 @@ public interface IActivitiModelService {
|
|||||||
/**
|
/**
|
||||||
* 多实例集合名称
|
* 多实例集合名称
|
||||||
*/
|
*/
|
||||||
String MULTI_INSTANCE_COLLECTION_NAME = "assigneeList";
|
String ASSIGNEE_LIST = "assigneeList";
|
||||||
/**
|
/**
|
||||||
* 多实例集合
|
* 多实例集合
|
||||||
*/
|
*/
|
||||||
String MULTI_INSTANCE_COLLECTION = "${" + MULTI_INSTANCE_COLLECTION_NAME + "}";
|
String MULTI_INSTANCE_COLLECTION = "${" + ASSIGNEE_LIST + "}";
|
||||||
/**
|
/**
|
||||||
* 多实例变量
|
* 多实例变量
|
||||||
*/
|
*/
|
||||||
|
@ -1,14 +1,20 @@
|
|||||||
package ink.wgink.module.activiti.service.oa.impl;
|
package ink.wgink.module.activiti.service.oa.impl;
|
||||||
|
|
||||||
import ink.wgink.common.base.DefaultBaseService;
|
import ink.wgink.common.base.DefaultBaseService;
|
||||||
|
import ink.wgink.exceptions.SearchException;
|
||||||
|
import ink.wgink.interfaces.user.IUserBaseService;
|
||||||
|
import ink.wgink.module.activiti.service.activiti.IActivitiModelService;
|
||||||
import ink.wgink.module.activiti.service.oa.IOaFormReportRouteService;
|
import ink.wgink.module.activiti.service.oa.IOaFormReportRouteService;
|
||||||
import ink.wgink.module.form.service.report.IFormReportRouteService;
|
import ink.wgink.module.form.service.report.IFormReportRouteService;
|
||||||
|
import org.activiti.engine.TaskService;
|
||||||
|
import org.activiti.engine.task.Task;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import javax.servlet.http.HttpSession;
|
import javax.servlet.http.HttpSession;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -21,8 +27,12 @@ import java.util.Map;
|
|||||||
@Service
|
@Service
|
||||||
public class OaFormReportRouteServiceImpl extends DefaultBaseService implements IOaFormReportRouteService {
|
public class OaFormReportRouteServiceImpl extends DefaultBaseService implements IOaFormReportRouteService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private TaskService taskService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private IFormReportRouteService formReportRouteService;
|
private IFormReportRouteService formReportRouteService;
|
||||||
|
@Autowired
|
||||||
|
private IUserBaseService userBaseService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void save(String processDefinitionId, String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
|
public void save(String processDefinitionId, String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
|
||||||
@ -33,9 +43,17 @@ public class OaFormReportRouteServiceImpl extends DefaultBaseService implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(String taskId, String formCode, Integer formVersion, Integer isNeedClaim, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
|
public void update(String taskId, String formCode, Integer formVersion, Integer isNeedClaim, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
|
||||||
|
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
|
||||||
|
if (task == null) {
|
||||||
|
throw new SearchException("任务不存在");
|
||||||
|
}
|
||||||
|
List<String> assigneeList = (List<String>) task.getProcessVariables().get(IActivitiModelService.ASSIGNEE_LIST);
|
||||||
|
|
||||||
Map<String, Object> model = getHashMap(10);
|
Map<String, Object> model = getHashMap(10);
|
||||||
model.put("taskId", taskId);
|
model.put("taskId", taskId);
|
||||||
model.put("isNeedClaim", isNeedClaim);
|
model.put("isNeedClaim", isNeedClaim);
|
||||||
|
// 设置代理人
|
||||||
|
model.put("assigneeList", assigneeList);
|
||||||
formReportRouteService.update(formCode, formVersion, httpSession, httpServletRequest, httpServletResponse, model);
|
formReportRouteService.update(formCode, formVersion, httpSession, httpServletRequest, httpServletResponse, model);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,4 +67,86 @@
|
|||||||
top: 0;
|
top: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 用户选择 */
|
||||||
|
.select-user {
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.select-user .list {
|
||||||
|
width: 316px;
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
|
max-height: 356px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select-user .list .item {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
margin: 0 5px;
|
||||||
|
padding: 5px;
|
||||||
|
border-top: 1px solid;
|
||||||
|
border-left: 1px solid;
|
||||||
|
border-right: 1px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select-user .list .item {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
margin: 0 5px;
|
||||||
|
padding: 5px;
|
||||||
|
border-top: 1px dotted;
|
||||||
|
border-left: 1px dotted;
|
||||||
|
border-right: 1px dotted;
|
||||||
|
border-color: silver;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select-user .list .item:hover {
|
||||||
|
background-color: #f1f1f1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select-user .list .item:last-child {
|
||||||
|
margin-bottom: 40px;
|
||||||
|
border-bottom: 1px dotted silver;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select-user .list .item .avatar {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select-user .list .item .avatar img {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select-user .list .item .info {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select-user .list .item .info .text {
|
||||||
|
width: 200px;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select-user .list .item .checkbox {
|
||||||
|
margin-left: 5px;
|
||||||
|
font-size: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select-user .foot {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
padding: 5px 0;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
background-color: #FFF;
|
||||||
|
}
|
||||||
|
@ -483,12 +483,53 @@ function FormUtil(layui, viewer) {
|
|||||||
*/
|
*/
|
||||||
this.clearUploadField = function (formData) {
|
this.clearUploadField = function (formData) {
|
||||||
var fileInputs = $(formData.form).find('input[type="file"]');
|
var fileInputs = $(formData.form).find('input[type="file"]');
|
||||||
if(fileInputs.length == 0) {
|
if (fileInputs.length == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$.each(fileInputs, function(index, item) {
|
$.each(fileInputs, function (index, item) {
|
||||||
delete formData.field[item.name];
|
delete formData.field[item.name];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.selectUsers = function (inputId, users) {
|
||||||
|
function initDom() {
|
||||||
|
var itemHtml = '';
|
||||||
|
for (var i = 0, user; user = users[i++];) {
|
||||||
|
itemHtml += '<div class="item" data-user-id="' + user.userId + '">';
|
||||||
|
itemHtml += '<div class="avatar">';
|
||||||
|
if (user.avatar) {
|
||||||
|
itemHtml += '<img src="route/file/download/true/' + user.avatar + '"/>';
|
||||||
|
} else {
|
||||||
|
itemHtml += '<img src="assets/images/profile-photo.jpg"/>';
|
||||||
|
}
|
||||||
|
itemHtml += '</div>';
|
||||||
|
itemHtml += '<div class="info">';
|
||||||
|
itemHtml += '<div class="text">' + user.userUsername + '</div>';
|
||||||
|
itemHtml += '<div class="text">' + user.username + '</div>';
|
||||||
|
itemHtml += '</div>';
|
||||||
|
itemHtml += '<div class="checkbox">';
|
||||||
|
itemHtml += '<i class="fa fa-check-square-o"></i>';
|
||||||
|
itemHtml += '</div>';
|
||||||
|
itemHtml += '</div>';
|
||||||
|
}
|
||||||
|
layer.open({
|
||||||
|
type: 1,
|
||||||
|
area: ['300px', '400px'],
|
||||||
|
closeBtn: 0,
|
||||||
|
title: '选择候选人',
|
||||||
|
shadeClose: true,
|
||||||
|
scrollbar: false,
|
||||||
|
content: '<div class="select-user" class="select-user">' +
|
||||||
|
'<div class="list">'
|
||||||
|
+ itemHtml +
|
||||||
|
'</div>' +
|
||||||
|
'<div class="foot">'+
|
||||||
|
'<button type="button" class="layui-btn layui-btn-sm">确定</button>'+
|
||||||
|
'</div>'+
|
||||||
|
'</div>',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
initDom();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -143,7 +143,7 @@
|
|||||||
{field:'opition', width:210, title: '操作', fixed:'right', align:'center',
|
{field:'opition', width:210, title: '操作', fixed:'right', align:'center',
|
||||||
templet: function(item) {
|
templet: function(item) {
|
||||||
return '<div class="layui-btn-group">' +
|
return '<div class="layui-btn-group">' +
|
||||||
'<button type="button" class="layui-btn layui-btn-xs" lay-event="showFormEvent">上报列表</button>'+
|
'<button type="button" class="layui-btn layui-btn-xs" lay-event="showFormEvent">数据列表</button>'+
|
||||||
'<button type="button" class="layui-btn layui-btn-xs layui-btn-normal" lay-event="formFieldEvent">字段列表</button>'+
|
'<button type="button" class="layui-btn layui-btn-xs layui-btn-normal" lay-event="formFieldEvent">字段列表</button>'+
|
||||||
'<button type="button" class="layui-btn layui-btn-xs layui-btn-danger" lay-event="deleteEvent" title="该操作将连同物理表(无数据)一并删除">物理删除</button>'+
|
'<button type="button" class="layui-btn layui-btn-xs layui-btn-danger" lay-event="deleteEvent" title="该操作将连同物理表(无数据)一并删除">物理删除</button>'+
|
||||||
'</div>';
|
'</div>';
|
||||||
|
Loading…
Reference in New Issue
Block a user