diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/listener/task/OaUserTaskCompleteListener.java b/module-activiti/src/main/java/ink/wgink/module/activiti/listener/task/OaUserTaskCompleteListener.java index a8833d33..552d5532 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/listener/task/OaUserTaskCompleteListener.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/listener/task/OaUserTaskCompleteListener.java @@ -81,7 +81,10 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); String deploymentId = processDefinition.getDeploymentId(); - Map variables = delegateTask.getVariables(); + LOG.debug("清空流程变量中的 代理人列表"); + delegateTask.removeVariable(IActivitiModelService.ASSIGNEE_LIST); + + Map variables = delegateTask.getVariablesLocal(); LOG.debug("查询表单数据:variables: {}", variables); LOG.debug("获取下一节点"); UserTask nextUserTask = activitiModelService.getNextUserTask(delegateTask.getTaskDefinitionKey(), delegateTask.getProcessDefinitionId(), variables); @@ -147,7 +150,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { throw new OaNodeException("多实例代理人不存在"); } List existUserIds = ArrayListUtil.listBeanStringIdValue(userDTOs, "userId", UserDTO.class); - delegateTask.setVariable(IActivitiModelService.MULTI_INSTANCE_COLLECTION_NAME, existUserIds); + delegateTask.setVariable(IActivitiModelService.ASSIGNEE_LIST, existUserIds); return; } if (StringUtils.equals(oaNodeAssigneePO.getAssigneeType(), AssigneeTypeEnum.AUTO.getValue())) { @@ -185,12 +188,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { if (StringUtils.isBlank(candidates)) { throw new OaNodeException("下节点候选人未设置"); } - List userDTOs = userBaseService.listByUserIds(Arrays.asList(candidates.split(","))); - if (userDTOs.isEmpty()) { - throw new OaNodeException("下节点候选人不存在"); - } - LOG.debug("设置候选人"); - userTask.setCandidateUsers(ArrayListUtil.listBeanStringIdValue(userDTOs, "userId", UserDTO.class)); + setNextUserTaskAssignees(delegateTask, userTask, Arrays.asList(candidates.split(",")), NodeTypeEnum.NORMAL); return; } } @@ -288,7 +286,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { LOG.debug("候选人用户列表"); userTask.setCandidateUsers(existParentPositionUserIds); } 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("设置候选人列表"); userTask.setCandidateUsers(existChildPositionUserIds); } 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("设置候选人列表"); userTask.setCandidateUsers(existParentPositionUserIds); } 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("设置候选人列表"); userTask.setCandidateUsers(existChildPositionUserIds); } 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)) { userTask.setAssignee(assignee); } 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); 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); return; } - setCandidateUsers(delegateTask, userTask, roleUserIds, nodeType); + setNextUserTaskAssignees(delegateTask, userTask, roleUserIds, nodeType); } /** @@ -515,18 +513,18 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { * @param nodeType */ private void setPositionCandidateUser(DelegateTask delegateTask, UserTask userTask, List positionUserIds, NodeTypeEnum nodeType) { - setCandidateUsers(delegateTask, userTask, positionUserIds, nodeType); + setNextUserTaskAssignees(delegateTask, userTask, positionUserIds, nodeType); } /** - * 设置候选人用户 + * 设置下个用户任务代理人清单 * * @param delegateTask * @param userTask * @param userIds * @param nodeType */ - private void setCandidateUsers(DelegateTask delegateTask, UserTask userTask, List userIds, NodeTypeEnum nodeType) { + private void setNextUserTaskAssignees(DelegateTask delegateTask, UserTask userTask, List userIds, NodeTypeEnum nodeType) { List userDTOs = userBaseService.listByUserIds(userIds); if (userDTOs.isEmpty()) { throw new OaNodeException("下节点候选人不存在"); @@ -534,11 +532,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { LOG.debug("设置候选人"); List existUserIds = ArrayListUtil.listBeanStringIdValue(userDTOs, "userId", UserDTO.class); clearUserIdsCurrentTaskAssignee(existUserIds, delegateTask.getAssignee()); - if (NodeTypeEnum.NORMAL.equals(nodeType)) { - userTask.setCandidateUsers(existUserIds); - } else { - delegateTask.setVariable(IActivitiModelService.MULTI_INSTANCE_COLLECTION_NAME, existUserIds); - } + delegateTask.setVariable(IActivitiModelService.ASSIGNEE_LIST, existUserIds); } /** diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java index 4206e839..c4181248 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java @@ -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 + "}"; /** * 多实例变量 */ diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/OaFormReportRouteServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/OaFormReportRouteServiceImpl.java index 214e6cad..0af94267 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/OaFormReportRouteServiceImpl.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/OaFormReportRouteServiceImpl.java @@ -1,14 +1,20 @@ package ink.wgink.module.activiti.service.oa.impl; 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.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.stereotype.Service; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import java.util.List; import java.util.Map; /** @@ -21,8 +27,12 @@ import java.util.Map; @Service public class OaFormReportRouteServiceImpl extends DefaultBaseService implements IOaFormReportRouteService { + @Autowired + private TaskService taskService; @Autowired private IFormReportRouteService formReportRouteService; + @Autowired + private IUserBaseService userBaseService; @Override 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 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 assigneeList = (List) task.getProcessVariables().get(IActivitiModelService.ASSIGNEE_LIST); + Map model = getHashMap(10); model.put("taskId", taskId); model.put("isNeedClaim", isNeedClaim); + // 设置代理人 + model.put("assigneeList", assigneeList); formReportRouteService.update(formCode, formVersion, httpSession, httpServletRequest, httpServletResponse, model); } diff --git a/module-form/src/main/resources/static/form/css/form.css b/module-form/src/main/resources/static/form/css/form.css index c777efc5..bdd75f6f 100644 --- a/module-form/src/main/resources/static/form/css/form.css +++ b/module-form/src/main/resources/static/form/css/form.css @@ -67,4 +67,86 @@ top: 0; right: 0; margin: 0; -} \ No newline at end of file +} + +/* 用户选择 */ +.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; +} diff --git a/module-form/src/main/resources/static/form/js/form-util.js b/module-form/src/main/resources/static/form/js/form-util.js index 29f6b08b..c025fa5b 100644 --- a/module-form/src/main/resources/static/form/js/form-util.js +++ b/module-form/src/main/resources/static/form/js/form-util.js @@ -483,12 +483,53 @@ function FormUtil(layui, viewer) { */ this.clearUploadField = function (formData) { var fileInputs = $(formData.form).find('input[type="file"]'); - if(fileInputs.length == 0) { + if (fileInputs.length == 0) { return; } - $.each(fileInputs, function(index, item) { + $.each(fileInputs, function (index, item) { delete formData.field[item.name]; }); } + this.selectUsers = function (inputId, users) { + function initDom() { + var itemHtml = ''; + for (var i = 0, user; user = users[i++];) { + itemHtml += '
'; + itemHtml += '
'; + if (user.avatar) { + itemHtml += ''; + } else { + itemHtml += ''; + } + itemHtml += '
'; + itemHtml += '
'; + itemHtml += '
' + user.userUsername + '
'; + itemHtml += '
' + user.username + '
'; + itemHtml += '
'; + itemHtml += '
'; + itemHtml += ''; + itemHtml += '
'; + itemHtml += '
'; + } + layer.open({ + type: 1, + area: ['300px', '400px'], + closeBtn: 0, + title: '选择候选人', + shadeClose: true, + scrollbar: false, + content: '
' + + '
' + + itemHtml + + '
' + + '
'+ + ''+ + '
'+ + '
', + }) + } + initDom(); + } + } \ No newline at end of file diff --git a/module-form/src/main/resources/templates/form/list.html b/module-form/src/main/resources/templates/form/list.html index a58ae420..51d8266e 100644 --- a/module-form/src/main/resources/templates/form/list.html +++ b/module-form/src/main/resources/templates/form/list.html @@ -143,7 +143,7 @@ {field:'opition', width:210, title: '操作', fixed:'right', align:'center', templet: function(item) { return '
' + - ''+ + ''+ ''+ ''+ '
';