Browse Source

优化项目计划

master
zhouhaibin 2 months ago
parent
commit
1e57cfc8da
  1. 3
      huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouPlaninfofileController.java
  2. 91
      huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/WorkflowController.java
  3. 1
      huzhou/src/main/java/com/easy/admin/modules/huzhou/entity/HuzhouPlaninfofile.java
  4. 4
      huzhou/src/main/java/com/easy/admin/modules/huzhou/listener/UserTaskCompleteListener.java
  5. 2
      huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouPlaninfofileService.java
  6. 7
      huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouPlaninfoServiceImpl.java
  7. 22
      huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouPlaninfofileServiceImpl.java
  8. 17
      huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/WorkflowServiceImpl.java
  9. BIN
      huzhou/src/main/resources/excelTemplate/项目计划模板.xlsx

3
huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouPlaninfofileController.java

@ -72,8 +72,9 @@ public class HuzhouPlaninfofileController {
@RequestParam String flag, @RequestParam String flag,
@RequestParam String planinfoid, @RequestParam String planinfoid,
@RequestParam String comment, @RequestParam String comment,
@RequestParam(value = "modifyNum",required = false) String modifyNum,
@RequestParam(value = "adviceFile",required = false) MultipartFile[] adviceFiles) throws Exception { @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(); return Result.ok();

91
huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/WorkflowController.java

@ -1,10 +1,12 @@
package com.easy.admin.modules.huzhou.controller; 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 cn.hutool.core.util.StrUtil;
import com.alibaba.excel.util.StringUtils; import com.alibaba.excel.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.easy.admin.activiti.constant.ActivitiTaskStatusConst; import com.easy.admin.activiti.constant.ActivitiTaskStatusConst;
@ -355,9 +357,9 @@ public class WorkflowController {
hashMap.put("operateDate", item.getEndTime()); hashMap.put("operateDate", item.getEndTime());
String assignee = item.getAssignee(); String assignee = item.getAssignee();
hashMap.put("operator", assignee); hashMap.put("operator", assignee);
String nickname="";
if(StringUtils.isNotBlank(assignee)){ if(StringUtils.isNotBlank(assignee)){
String nickname = sysUserService.getById(assignee).getNickname(); nickname = sysUserService.getById(assignee).getNickname();
hashMap.put("operator", nickname); hashMap.put("operator", nickname);
}else{ }else{
@ -365,11 +367,29 @@ public class WorkflowController {
} }
hashMap.put("taskName", item.getName()); hashMap.put("taskName", item.getName());
hashMap.put("comment", approvalSuggestion); hashMap.put("comment", approvalSuggestion);
boolean isPut =true;
for (HashMap<String,Object> hash: approvalEntityList) {
String operator = hash.get("operator").toString();
if(StringUtils.isNotBlank(approvalSuggestion)&&approvalSuggestion.contains("撤回")){ if(StringUtils.isNotBlank(approvalSuggestion)&&approvalSuggestion.contains("撤回")){
hashMap.put("taskName",list.get(i-1).getName()); 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);
} }
}
//获取未激活的审批人信息 //获取未激活的审批人信息
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
@ -387,7 +407,8 @@ public class WorkflowController {
} }
} }
for(HashMap<String, Object> lastUser:approvalEntityList){ for(HashMap<String, Object> lastUser:approvalEntityList){
if ("0".equals(lastUser.get("approvalStatue"))) { if(processInstance.getProcessDefinitionKey().equals("createURT")){
if (!"1".equals(lastUser.get("approvalStatue"))) {
continue; continue;
} }
for (int i =0;i<userTaskList.size();i++ ) { for (int i =0;i<userTaskList.size();i++ ) {
@ -404,6 +425,22 @@ public class WorkflowController {
// } // }
// i--; // i--;
} }
}else{
HistoricTaskInstance item = list.get(list.size()-1);
for (int i =0;i<userTaskList.size();i++ ) {
UserTask task=userTaskList.get(i);
// HashMap<String, Object> 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 ) { for (UserTask userTask: userTaskList ) {
@ -461,19 +498,43 @@ public class WorkflowController {
} }
hashMap.put("operator", name); hashMap.put("operator", name);
} }
Boolean isrecall = true;
for (HashMap<String,Object> 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); approvalEntityList.add(hashMap);
} }
} }
List<HashMap<String, Object>> distinctList = approvalEntityList.stream() }
.collect(Collectors.collectingAndThen(
Collectors.toMap( // 使用 Stream 对列表进行排序
map -> map.get("operator"), List<HashMap<String, Object>> sortedList = approvalEntityList.stream()
map -> map, .sorted((o1, o2) -> {
(existing, replacement) -> replacement // 如果重复,最后一个 Date d1 = (Date) o1.get("operateDate");
), Date d2 = (Date) o2.get("operateDate");
map -> new ArrayList<>(map.values())
)); // 如果 d1 是 null 或不存在,排在后面
return Result.OK(distinctList); 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") @GetMapping("/getProcessInstanceIdByProid")
public Result<?> getProcessInstanceIdByProid(String projectid,String stage){ public Result<?> getProcessInstanceIdByProid(String projectid,String stage){

1
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 Long size;
private String status; private String status;
private String modifyNum;
} }

4
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)){ if("1".equals(approved)){
approvedResult.put(userId,"1"); // 审批通过 approvedResult.put(userId,"1"); // 审批通过
}else{ }else if("0".equals(approved)){
approvedResult.put(userId,"0"); // 审批不通过 approvedResult.put(userId,"0"); // 审批不通过
delegateTask.getExecution().setVariable("rejected",true); // 更新审批结果变量 delegateTask.getExecution().setVariable("rejected",true); // 更新审批结果变量
}else{
return;
} }
int size = approvedResult.size(); int size = approvedResult.size();
if(size==7&&!approvedResult.containsValue("0")){ if(size==7&&!approvedResult.containsValue("0")){

2
huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouPlaninfofileService.java

@ -13,7 +13,7 @@ public interface IHuzhouPlaninfofileService extends IService<HuzhouPlaninfofile>
void submitPlanUploadFile(MultipartFile[] files, String planinfoid) throws IOException; 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); String getProcessName(String pid);

7
huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouPlaninfoServiceImpl.java

@ -183,7 +183,7 @@ public class HuzhouPlaninfoServiceImpl extends ServiceImpl<HuzhouPlaninfoMapper,
sdf = new SimpleDateFormat("HH:mm:ss"); sdf = new SimpleDateFormat("HH:mm:ss");
} else if (cell.getCellStyle().getDataFormat() == 22) { } else if (cell.getCellStyle().getDataFormat() == 22) {
sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
} else if (format == 14 || format == 31 || format == 57 || format == 58 } else if (format == 14 || format == 31 || format == 57 || format == 58||format == 164
|| (176<=format && format<=178) || (182<=format && format<=196) || (176<=format && format<=178) || (182<=format && format<=196)
|| (210<=format && format<=213) || (208==format ) ) { // 日期 || (210<=format && format<=213) || (208==format ) ) { // 日期
sdf = new SimpleDateFormat("yyyy-MM-dd"); sdf = new SimpleDateFormat("yyyy-MM-dd");
@ -222,7 +222,10 @@ public class HuzhouPlaninfoServiceImpl extends ServiceImpl<HuzhouPlaninfoMapper,
sdf = new SimpleDateFormat("HH:mm:ss"); sdf = new SimpleDateFormat("HH:mm:ss");
} else if (cell.getCellStyle().getDataFormat() == 22) { } else if (cell.getCellStyle().getDataFormat() == 22) {
sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
} else if (format == 14 || format == 31 || format == 57 || format == 58 // } else if (format == 14 || format == 31 || format == 57 || format == 58
// || (176<=format && format<=178) || (182<=format && format<=196)
// || (210<=format && format<=213) || (208==format ) ) { // 日期
} else if (format == 14 || format == 31 || format == 57 || format == 58 ||format == 164
|| (176<=format && format<=178) || (182<=format && format<=196) || (176<=format && format<=178) || (182<=format && format<=196)
|| (210<=format && format<=213) || (208==format ) ) { // 日期 || (210<=format && format<=213) || (208==format ) ) { // 日期
sdf = new SimpleDateFormat("yyyy-MM-dd"); sdf = new SimpleDateFormat("yyyy-MM-dd");

22
huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouPlaninfofileServiceImpl.java

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.easy.admin.auth.model.SysUser;
import com.easy.admin.auth.service.SysUserService; import com.easy.admin.auth.service.SysUserService;
import com.easy.admin.common.api.vo.Result; import com.easy.admin.common.api.vo.Result;
import com.easy.admin.common.core.exception.EasyException; import com.easy.admin.common.core.exception.EasyException;
@ -50,9 +51,13 @@ public class HuzhouPlaninfofileServiceImpl extends ServiceImpl<HuzhouPlaninfofil
@Autowired @Autowired
private TaskService taskService; private TaskService taskService;
@Autowired @Autowired
private HuzhouPlaninfofileMapper planinfofileMapper;
@Autowired
private HuzhouContractinfoMapper contractinfoMapper; private HuzhouContractinfoMapper contractinfoMapper;
private String[] names ={"可研技术审查报告(初稿)确认","可研技术审查报告(复审稿)确认","可研技术审查报告(终稿)确认","造价评估报告确认","可行性研究报告审批(发改)","合同签订","首付支付","初验阶段","终验阶段","初步设计审批"}; // private String[] names ={"可研技术审查报告(初稿)确认","可研技术审查报告(复审稿)确认","可研技术审查报告(终稿)确认","造价评估报告确认","可行性研究报告审批(发改)","合同签订","首付支付","初验阶段","终验阶段","初步设计审批"};
private String[] tNames ={"可研报告初稿编制","可研报告第二稿编制","初步技术审查","造价评估"}; private String[] names ={"可研技术审查报告(初稿)确认","可研技术审查报告(终稿)确认","造价评估报告确认","可行性研究报告审批(发改)","合同签订","首付支付","初验阶段","终验阶段","初步设计审批"};
private String[] tNames ={"可研报告初稿编制","可研报告终稿编制","造价评估"};
@Override @Override
public Page<HuzhouPlaninfofile> getplanFilePageList(HuzhouPlaninfofile planinfofile,Integer pageNo, Integer pageSize) { public Page<HuzhouPlaninfofile> getplanFilePageList(HuzhouPlaninfofile planinfofile,Integer pageNo, Integer pageSize) {
Page<HuzhouPlaninfofile> page = new Page<>(pageNo,pageSize); Page<HuzhouPlaninfofile> page = new Page<>(pageNo,pageSize);
@ -61,6 +66,10 @@ public class HuzhouPlaninfofileServiceImpl extends ServiceImpl<HuzhouPlaninfofil
queryWrapper.eq(HuzhouPlaninfofile::getStage,planinfofile.getStage()); queryWrapper.eq(HuzhouPlaninfofile::getStage,planinfofile.getStage());
queryWrapper.orderByDesc(BaseEntity::getCreateDate); queryWrapper.orderByDesc(BaseEntity::getCreateDate);
Page<HuzhouPlaninfofile> planinfofilePage = this.page(page, queryWrapper); Page<HuzhouPlaninfofile> planinfofilePage = this.page(page, queryWrapper);
planinfofilePage.getRecords().forEach(item->{
SysUser sysUser = userService.get(item.getCreateUser());
item.setCreateUser(sysUser.getNickname());
});
return planinfofilePage; return planinfofilePage;
} }
@ -247,7 +256,7 @@ public class HuzhouPlaninfofileServiceImpl extends ServiceImpl<HuzhouPlaninfofil
} }
@Override @Override
public void approvePlanFile(MultipartFile[] files, String taskId, String flag, String planinfoid, String comment, MultipartFile[] adviceFiles) throws IOException { public void approvePlanFile(MultipartFile[] files, String taskId, String flag, String planinfoid, String comment, String modifyNum,MultipartFile[] adviceFiles) throws IOException {
WorkFlow workFlow = workflowService.approveProjectInfo(taskId, flag, comment); WorkFlow workFlow = workflowService.approveProjectInfo(taskId, flag, comment);
LambdaQueryWrapper<HuzhouProcessinfo> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<HuzhouProcessinfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(HuzhouProcessinfo::getProjectid,planinfoid); queryWrapper.eq(HuzhouProcessinfo::getProjectid,planinfoid);
@ -271,6 +280,13 @@ public class HuzhouPlaninfofileServiceImpl extends ServiceImpl<HuzhouPlaninfofil
processinfoService.modifyStatusByProjectId(planinfoid,"0",processName); processinfoService.modifyStatusByProjectId(planinfoid,"0",processName);
return ; return ;
} }
if(StringUtils.isNotBlank(modifyNum)&&"1".equals(flag)){
LambdaUpdateWrapper<HuzhouPlaninfofile> 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(); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(workFlow.getProcessInstanceId()).singleResult();
if(processInstance==null&&"1".equals(flag)){ if(processInstance==null&&"1".equals(flag)){
huzhouPlaninfo.setIsfinish("2"); huzhouPlaninfo.setIsfinish("2");

17
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 org.springframework.stereotype.Service;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
@Service @Service
public class WorkflowServiceImpl implements IWorkflowService { public class WorkflowServiceImpl implements IWorkflowService {
@Autowired @Autowired
@ -166,7 +168,7 @@ public class WorkflowServiceImpl implements IWorkflowService {
List<HistoricTaskInstance> list = historyService List<HistoricTaskInstance> list = historyService
.createHistoricTaskInstanceQuery() .createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId) .processInstanceId(processInstanceId)
.orderByTaskCreateTime().finished() .orderByHistoricTaskInstanceEndTime()
.desc() .desc()
.list(); .list();
HistoricTaskInstance taskInstance = null; HistoricTaskInstance taskInstance = null;
@ -193,6 +195,10 @@ public class WorkflowServiceImpl implements IWorkflowService {
String name = userTask.getName(); String name = userTask.getName();
//当前用户id是上一个处理,且上一个处理不是撤回操作,上一个节点不是发起人 //当前用户id是上一个处理,且上一个处理不是撤回操作,上一个节点不是发起人
if(currentLoginuserId.equals(userid)&&!"发起人".equals(name)&&!fullMessage.contains("撤回")){ if(currentLoginuserId.equals(userid)&&!"发起人".equals(name)&&!fullMessage.contains("撤回")){
List<HistoricTaskInstance> 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 select = new Select();
select.setLabel("撤回"); select.setLabel("撤回");
select.setValue("2"); select.setValue("2");
@ -205,6 +211,8 @@ public class WorkflowServiceImpl implements IWorkflowService {
// outRes.put("showApprovalForm",true); // outRes.put("showApprovalForm",true);
workflowActionParamOV.setShowApprovalForm(true); workflowActionParamOV.setShowApprovalForm(true);
} }
}
} }
} }
}else{ }else{
@ -385,6 +393,7 @@ public class WorkflowServiceImpl implements IWorkflowService {
queryWrapper.isNull("art.assignee_") queryWrapper.isNull("art.assignee_")
.eq("ari.type_", "candidate") .eq("ari.type_", "candidate")
.and(i -> i.eq("ari.user_id_", currentUser.getId()).or().in("ari.group_id_", ShiroUtil.getRoleIds(currentUser.getRoleList()).toArray())); .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())) { } else if (ActivitiTaskStatusConst.CLAIMED.equals(activitiTask.getStatus())) {
// 待办任务:签收人或委托人为当前用户 // 待办任务:签收人或委托人为当前用户
queryWrapper.and(i -> i.eq("art.assignee_", currentUser.getId()).or().eq("art.owner_", currentUser.getId())); 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()); 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<ActivitiTask> select = activitiTaskMapper.select(page, queryWrapper); List<ActivitiTask> select = activitiTaskMapper.select(page, queryWrapper);
select.forEach(item->{ select.forEach(item->{
String processInstanceId = item.getProcessInstanceId(); String processInstanceId = item.getProcessInstanceId();

BIN
huzhou/src/main/resources/excelTemplate/项目计划模板.xlsx

Binary file not shown.
Loading…
Cancel
Save