diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouPlaninfofileController.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouPlaninfofileController.java index 3e5cf4d..67e1a13 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouPlaninfofileController.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouPlaninfofileController.java @@ -72,8 +72,9 @@ public class HuzhouPlaninfofileController { @RequestParam String flag, @RequestParam String planinfoid, @RequestParam String comment, + @RequestParam(value = "modifyNum",required = false) String modifyNum, @RequestParam(value = "adviceFile",required = false) MultipartFile[] adviceFiles) throws Exception { - planinfofileService.approvePlanFile(files,taskId,flag,planinfoid,comment,adviceFiles); + planinfofileService.approvePlanFile(files,taskId,flag,planinfoid,comment,modifyNum,adviceFiles); return Result.ok(); diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/WorkflowController.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/WorkflowController.java index d6bd4f5..9996369 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/WorkflowController.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/WorkflowController.java @@ -1,10 +1,12 @@ package com.easy.admin.modules.huzhou.controller; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.excel.util.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; +import cn.hutool.core.date.BetweenFormatter.Level; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.easy.admin.activiti.constant.ActivitiTaskStatusConst; @@ -355,9 +357,9 @@ public class WorkflowController { hashMap.put("operateDate", item.getEndTime()); String assignee = item.getAssignee(); hashMap.put("operator", assignee); - + String nickname=""; if(StringUtils.isNotBlank(assignee)){ - String nickname = sysUserService.getById(assignee).getNickname(); + nickname = sysUserService.getById(assignee).getNickname(); hashMap.put("operator", nickname); }else{ @@ -365,10 +367,28 @@ public class WorkflowController { } hashMap.put("taskName", item.getName()); hashMap.put("comment", approvalSuggestion); - if(StringUtils.isNotBlank(approvalSuggestion)&&approvalSuggestion.contains("撤回")){ - hashMap.put("taskName",list.get(i-1).getName()); + boolean isPut =true; + for (HashMap hash: approvalEntityList) { + String operator = hash.get("operator").toString(); + if(StringUtils.isNotBlank(approvalSuggestion)&&approvalSuggestion.contains("撤回")){ + if(operator.equals(nickname)&&hash.get("approvalStatue").equals("1")){ + hashMap.put("taskName",hash.get("taskName")); + } + } + //是否重复 + Date operateDate = (Date) hash.get("operateDate"); + Date endTime = item.getEndTime(); + if(endTime!=null&&operateDate!=null){ + long between = DateUtil.between(operateDate, endTime, DateUnit.SECOND); + if(operator.equals(nickname)&& between<5){ + isPut =false; + } + } + + } + if(isPut){ + approvalEntityList.add(hashMap); } - approvalEntityList.add(hashMap); } //获取未激活的审批人信息 @@ -387,23 +407,40 @@ public class WorkflowController { } } for(HashMap lastUser:approvalEntityList){ - if ("0".equals(lastUser.get("approvalStatue"))) { - continue; - } - for (int i =0;i lastUser = approvalEntityList.get(approvalEntityList.size() - 1);//获取最后一个 - Object taskName = lastUser.get("taskName"); - boolean match = task.getName().equals(taskName); - if(match){ - userTaskList.remove(task); + if(processInstance.getProcessDefinitionKey().equals("createURT")){ + if (!"1".equals(lastUser.get("approvalStatue"))) { + continue; } + for (int i =0;i lastUser = approvalEntityList.get(approvalEntityList.size() - 1);//获取最后一个 + Object taskName = lastUser.get("taskName"); + boolean match = task.getName().equals(taskName); + if(match){ + userTaskList.remove(task); + } // else{ // userTaskList.remove(task); // break; // } // i--; + } + }else{ + HistoricTaskInstance item = list.get(list.size()-1); + for (int i =0;i lastUser = approvalEntityList.get(approvalEntityList.size() - 1);//获取最后一个 + Object taskName = item.getName(); + boolean match = task.getName().equals(taskName); + if(!match){ + userTaskList.remove(task); + } + else { + break; + } + } } + } for (UserTask userTask: userTaskList ) { @@ -461,19 +498,43 @@ public class WorkflowController { } hashMap.put("operator", name); } - approvalEntityList.add(hashMap); + Boolean isrecall = true; + for (HashMap hash: approvalEntityList) { + String operator = hash.get("operator").toString(); + String nickname = hashMap.get("operator").toString(); + if(operator.equals(nickname)&&hash.get("operateDate")==null){ + isrecall = false; + } + } + if(isrecall){ + approvalEntityList.add(hashMap); + } } } - List> distinctList = approvalEntityList.stream() - .collect(Collectors.collectingAndThen( - Collectors.toMap( - map -> map.get("operator"), - map -> map, - (existing, replacement) -> replacement // 如果重复,最后一个 - ), - map -> new ArrayList<>(map.values()) - )); - return Result.OK(distinctList); + + // 使用 Stream 对列表进行排序 + List> sortedList = approvalEntityList.stream() + .sorted((o1, o2) -> { + Date d1 = (Date) o1.get("operateDate"); + Date d2 = (Date) o2.get("operateDate"); + + // 如果 d1 是 null 或不存在,排在后面 + if (d1 == null && d2 != null) { + return 1; + } + // 如果 d2 是 null 或不存在,排在后面 + if (d1 != null && d2 == null) { + return -1; + } + // 如果两者都为 null 或两者都不为 null,按照日期排序 + if (d1 == null && d2 == null) { + return 0; + } + return d1.compareTo(d2); + }) + .collect(Collectors.toList()); + + return Result.OK(sortedList); } @GetMapping("/getProcessInstanceIdByProid") public Result getProcessInstanceIdByProid(String projectid,String stage){ diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/entity/HuzhouPlaninfofile.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/entity/HuzhouPlaninfofile.java index 217e892..5af2b59 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/entity/HuzhouPlaninfofile.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/entity/HuzhouPlaninfofile.java @@ -43,6 +43,7 @@ public class HuzhouPlaninfofile extends BaseEntity implements Serializable { */ private Long size; private String status; + private String modifyNum; } diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/listener/UserTaskCompleteListener.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/listener/UserTaskCompleteListener.java index 63ed0e6..7eccd36 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/listener/UserTaskCompleteListener.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/listener/UserTaskCompleteListener.java @@ -20,9 +20,11 @@ public class UserTaskCompleteListener implements TaskListener { } if("1".equals(approved)){ approvedResult.put(userId,"1"); // 审批通过 - }else{ + }else if("0".equals(approved)){ approvedResult.put(userId,"0"); // 审批不通过 delegateTask.getExecution().setVariable("rejected",true); // 更新审批结果变量 + }else{ + return; } int size = approvedResult.size(); if(size==7&&!approvedResult.containsValue("0")){ diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouPlaninfofileService.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouPlaninfofileService.java index 7dd5e17..f0c6a72 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouPlaninfofileService.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouPlaninfofileService.java @@ -13,7 +13,7 @@ public interface IHuzhouPlaninfofileService extends IService void submitPlanUploadFile(MultipartFile[] files, String planinfoid) throws IOException; - void approvePlanFile(MultipartFile[] files, String taskId, String flag, String planinfoid, String comment, MultipartFile[] adviceFiles) throws IOException; + void approvePlanFile(MultipartFile[] files, String taskId, String flag, String planinfoid, String comment, String modifyNum,MultipartFile[] adviceFiles) throws IOException; String getProcessName(String pid); diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouPlaninfoServiceImpl.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouPlaninfoServiceImpl.java index b317136..cda51b8 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouPlaninfoServiceImpl.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouPlaninfoServiceImpl.java @@ -183,7 +183,7 @@ public class HuzhouPlaninfoServiceImpl extends ServiceImpl getplanFilePageList(HuzhouPlaninfofile planinfofile,Integer pageNo, Integer pageSize) { Page page = new Page<>(pageNo,pageSize); @@ -61,6 +66,10 @@ public class HuzhouPlaninfofileServiceImpl extends ServiceImpl planinfofilePage = this.page(page, queryWrapper); + planinfofilePage.getRecords().forEach(item->{ + SysUser sysUser = userService.get(item.getCreateUser()); + item.setCreateUser(sysUser.getNickname()); + }); return planinfofilePage; } @@ -247,7 +256,7 @@ public class HuzhouPlaninfofileServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(HuzhouProcessinfo::getProjectid,planinfoid); @@ -271,6 +280,13 @@ public class HuzhouPlaninfofileServiceImpl extends ServiceImpl updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(HuzhouPlaninfofile::getPlaninfoid,planinfoid); + updateWrapper.eq(HuzhouPlaninfofile::getStatus,"1"); + updateWrapper.set(HuzhouPlaninfofile::getModifyNum,modifyNum); + planinfofileMapper.update(null,updateWrapper); + } ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(workFlow.getProcessInstanceId()).singleResult(); if(processInstance==null&&"1".equals(flag)){ huzhouPlaninfo.setIsfinish("2"); diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/WorkflowServiceImpl.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/WorkflowServiceImpl.java index a4bb655..cc1a9a9 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/WorkflowServiceImpl.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/WorkflowServiceImpl.java @@ -56,6 +56,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; +import java.util.stream.Collectors; + @Service public class WorkflowServiceImpl implements IWorkflowService { @Autowired @@ -166,7 +168,7 @@ public class WorkflowServiceImpl implements IWorkflowService { List list = historyService .createHistoricTaskInstanceQuery() .processInstanceId(processInstanceId) - .orderByTaskCreateTime().finished() + .orderByHistoricTaskInstanceEndTime() .desc() .list(); HistoricTaskInstance taskInstance = null; @@ -193,17 +195,23 @@ public class WorkflowServiceImpl implements IWorkflowService { String name = userTask.getName(); //当前用户id是上一个处理,且上一个处理不是撤回操作,上一个节点不是发起人 if(currentLoginuserId.equals(userid)&&!"发起人".equals(name)&&!fullMessage.contains("撤回")){ - Select select = new Select(); - select.setLabel("撤回"); - select.setValue("2"); + List filteredList = list.stream() + .filter(taskl -> taskl.getAssignee() != null && !taskl.getAssignee().equals(currentLoginuserId)&&taskl.getDeleteReason()==null) + .collect(Collectors.toList()); + if(filteredList.size()==0){ + Select select = new Select(); + select.setLabel("撤回"); + select.setValue("2"); // HashMap hashMap = new HashMap<>(); // hashMap.put("label","撤回"); // hashMap.put("value","2"); - actionButtons.add(select); - workflowActionParamOV.setButtons(actionButtons); + actionButtons.add(select); + workflowActionParamOV.setButtons(actionButtons); // outRes.put("buttons",actionButtons); // outRes.put("showApprovalForm",true); - workflowActionParamOV.setShowApprovalForm(true); + workflowActionParamOV.setShowApprovalForm(true); + } + } } } @@ -385,6 +393,7 @@ public class WorkflowServiceImpl implements IWorkflowService { queryWrapper.isNull("art.assignee_") .eq("ari.type_", "candidate") .and(i -> i.eq("ari.user_id_", currentUser.getId()).or().in("ari.group_id_", ShiroUtil.getRoleIds(currentUser.getRoleList()).toArray())); + queryWrapper.and(qw -> qw.notExists("SELECT 1 FROM act_ru_task actr WHERE actr.proc_inst_id_ = art.proc_inst_id_ AND actr.name_=art.name_ and actr.assignee_='"+currentUser.getId()+"'")); } else if (ActivitiTaskStatusConst.CLAIMED.equals(activitiTask.getStatus())) { // 待办任务:签收人或委托人为当前用户 queryWrapper.and(i -> i.eq("art.assignee_", currentUser.getId()).or().eq("art.owner_", currentUser.getId())); @@ -395,7 +404,11 @@ public class WorkflowServiceImpl implements IWorkflowService { } // 待签、待办中只查询激活流程实例数据,已挂起的不查询 queryWrapper.eq("arp.suspension_state_", ActivitiSuspensionStatus.ACTIVATION.getCode()); - page.setDefaultDesc("art.id_"); + queryWrapper.and(qw -> + qw.notExists("SELECT 1 FROM act_ru_task actr WHERE actr.proc_inst_id_ = art.proc_inst_id_ AND actr.name_='发起人'") + .or().eq("art.name_", "发起人") + ); +// page.setDefaultDesc("MAX(art.id_)"); List select = activitiTaskMapper.select(page, queryWrapper); select.forEach(item->{ String processInstanceId = item.getProcessInstanceId(); diff --git a/huzhou/src/main/resources/excelTemplate/项目计划模板.xlsx b/huzhou/src/main/resources/excelTemplate/项目计划模板.xlsx index dc49864..5e2f2dd 100644 Binary files a/huzhou/src/main/resources/excelTemplate/项目计划模板.xlsx and b/huzhou/src/main/resources/excelTemplate/项目计划模板.xlsx differ