feat: 年度制修订-标准化发起

This commit is contained in:
2023-10-30 10:29:34 +08:00
parent 7c7da33a6d
commit a1c21dab0e
8 changed files with 457 additions and 12 deletions
@@ -5,7 +5,11 @@ import com.jero.common.aspect.annotation.AutoLog;
import com.jero.common.aspect.annotation.Translation;
import com.jero.common.constant.enums.YesOrNoEnum;
import com.jero.modules.activiti.process.esAnnualInit.entity.vo.AnnualInitDataVO;
import com.jero.modules.activiti.process.esAnnualInit.service.ProcessEsAnnualInitService;
import com.jero.modules.activiti.process.esInitChange.entity.ProcessEsInitChange;
import com.jero.modules.activiti.process.esInitChange.entity.vo.InitChangeDataVO;
import com.jero.modules.laws.common.constant.FieldCommon;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.utils.IOUtils;
@@ -18,6 +22,7 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
@@ -34,6 +39,71 @@ public class ESAnnualInitController {
@Resource
private ProcessEsAnnualInitService annualInitService;
/**
* 新增立项变更申请
*
* @param annualInitData
*/
@AutoLog(value = "企标年度制修订标准化发起流程-发起立项变更申请")
@ApiOperation(value="企标年度制修订标准化发起流程-发起立项变更申请", notes="企标年度制修订标准化发起流程-发起立项变更申请")
@PostMapping("/start")
public Result<?> startProcess(@RequestBody AnnualInitDataVO annualInitData) {
annualInitService.startProcess(annualInitData);
return Result.OK();
}
/**
* 保存到待办
* @param annualInitData
*/
@AutoLog(value = "企标年度制修订标准化发起流程-保存")
@ApiOperation(value="企标年度制修订标准化发起流程-保存", notes="企标年度制修订标准化发起流程-保存")
@PostMapping("/save")
public Result<?> save(@RequestBody AnnualInitDataVO annualInitData) {
annualInitService.saveToDraft(annualInitData);
return Result.OK();
}
/**
* 保存到待办
* @param taskId
*/
@AutoLog(value = "企标年度制修订标准化发起流程-办理")
@ApiOperation(value="企标年度制修订标准化发起流程-办理", notes="企标年度制修订标准化发起流程-办理")
@GetMapping("/handle/{taskId}")
@Translation
public Result<?> handle(@PathVariable("taskId") String taskId) {
return Result.OK(annualInitService.getHandleData(taskId));
}
/**
* 同意
*
* @param annualInitData
*/
@AutoLog(value = "企标年度制修订标准化发起流程-同意")
@ApiOperation(value="企标年度制修订标准化发起流程-同意", notes="企标年度制修订标准化发起流程-同意")
@PostMapping("/agree")
public Result<?> agree(@RequestBody AnnualInitDataVO annualInitData) {
annualInitService.approvalInitChange(annualInitData, true);
return Result.OK();
}
/**
* 驳回
*
* @param annualInitData
*/
@AutoLog(value = "企标年度制修订标准化发起流程-驳回")
@ApiOperation(value="企标年度制修订标准化发起流程-驳回", notes="企标年度制修订标准化发起流程-驳回")
@PostMapping("/reject")
public Result<?> reject(@RequestBody AnnualInitDataVO annualInitData) {
annualInitService.approvalInitChange(annualInitData, false);
return Result.OK();
}
/**
* 导入模板下载
*/
@@ -308,6 +308,20 @@ public class ProcessEsAnnualInit implements Serializable {
@ApiModelProperty(value = "联络人")
private String contactUser;
/**
* 流程中的主起草人
*/
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@ApiModelProperty(value = "流程中的主起草人")
private String prcMainDraftUser;
/**
* 驳回标识
*/
@ApiModelProperty(value = "驳回标识")
@Dict(dicCode = "YN")
private String rejectFlag;
/**
* 审批人
*/
@@ -0,0 +1,17 @@
package com.jero.modules.activiti.process.esAnnualInit.entity.constant;
/**
* @author: Mzaxd
* @Date: 2023/10/27 7:32
*/
public class AnnualInitTaskNameConstant {
public static final String STANDARD_ENGINEER_INIT = "标准化工程师发起,填写新法规";
public static final String CONTACT_USER_EDIT = "部所联络人 选取审批人 调整完成时间";
public static final String STANDARD_ENGINEER_EDIT = "标准化工程师修改调整";
public static final String MAIN_DRAFT_LEADER_APPROVAL = "主起草单位主管审批";
public static final String MAIN_DRAFT_WRITE = "主起草人填写信息";
public static final String CONTACT_USER_COLLECT = "部所联络人 汇总";
public static final String MAIN_DRAFT_LEADER_LEADER_APPROVAL = "主起草单位主管级领导审批";
public static final String STANDARD_ENGINEER_COLLECT = "标准化工程师归档";
}
@@ -0,0 +1,28 @@
package com.jero.modules.activiti.process.esAnnualInit.entity.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.jero.modules.activiti.process.common.entity.CommonVO;
import com.jero.modules.activiti.process.esAnnualInit.entity.ProcessEsAnnualInit;
import com.jero.modules.activiti.process.esAnnualReport.entity.ProcessEsAnnualReport;
import com.jero.modules.activiti.process.esAnnualReport.entity.vo.AnnualReportFlowUserVO;
import lombok.Data;
import java.util.List;
/**
* @author: Mzaxd
* @Date: 2023/10/26 17:28
*/
@Data
public class AnnualInitDataVO {
@JsonProperty("common")
private CommonVO commonVO;
@JsonProperty("dataList")
private List<ProcessEsAnnualInit> dataList;
@JsonProperty("flowUser")
private AnnualInitFlowUserVO flowUser;
}
@@ -0,0 +1,54 @@
package com.jero.modules.activiti.process.esAnnualInit.entity.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.jero.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author: Mzaxd
* @Date: 2023/10/26 17:29
*/
@Data
public class AnnualInitFlowUserVO {
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@ApiModelProperty("标准化工程师")
private String standardEngineer;
// 部所联络人
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@ApiModelProperty("各部所联络人")
private String contactUser;
// 部所联络人
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@ApiModelProperty("各部所联络人集合")
@JsonIgnore
private List<String> contactUserList;
// 主起草单位主管
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@ApiModelProperty("主起草单位主管")
private String approvalUser;
// 主起草单位主管
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@ApiModelProperty("主起草单位主管集合")
private List<String> approvalUserList;
// 主起草人
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@ApiModelProperty("主起草人")
private String mainDraftUser;
// 主起草人
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@ApiModelProperty("主起草人集合")
@JsonIgnore
private List<String> mainDraftUserList;
}
@@ -2,6 +2,7 @@ package com.jero.modules.activiti.process.esAnnualInit.service;
import com.jero.modules.activiti.process.esAnnualInit.entity.ProcessEsAnnualInit;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jero.modules.activiti.process.esAnnualInit.entity.vo.AnnualInitDataVO;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
@@ -20,4 +21,12 @@ public interface ProcessEsAnnualInitService extends IService<ProcessEsAnnualInit
* @return
*/
Map<String, Object> importData(MultipartFile file);
void startProcess(AnnualInitDataVO annualInitData);
void saveToDraft(AnnualInitDataVO annualInitData);
AnnualInitDataVO getHandleData(String taskId);
void approvalInitChange(AnnualInitDataVO annualInitData, boolean b);
}
@@ -5,18 +5,35 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jero.common.api.CommonAPI;
import com.jero.common.constant.enums.YesOrNoEnum;
import com.jero.common.exception.JeroBootException;
import com.jero.common.system.vo.SysDictItemCore;
import com.jero.modules.activiti.entity.ProcessAll;
import com.jero.modules.activiti.entity.ProcessNode;
import com.jero.modules.activiti.process.common.entity.CommonVO;
import com.jero.modules.activiti.process.common.enums.ProcessType;
import com.jero.modules.activiti.process.common.service.ActFlowCommonService;
import com.jero.modules.activiti.process.esAnnualInit.entity.ProcessEsAnnualInit;
import com.jero.modules.activiti.process.esAnnualInit.entity.vo.AnnualInitDataVO;
import com.jero.modules.activiti.process.esAnnualInit.entity.vo.AnnualInitFlowUserVO;
import com.jero.modules.activiti.process.esAnnualInit.service.ProcessEsAnnualInitService;
import com.jero.modules.activiti.process.esAnnualInit.mapper.ProcessEsAnnualInitMapper;
import com.jero.modules.activiti.process.esInitChange.entity.enums.ESPProjectType;
import com.jero.modules.activiti.service.ProcessAllService;
import com.jero.modules.activiti.service.ProcessNodeLinkService;
import com.jero.modules.activiti.service.ProcessNodeService;
import com.jero.modules.activiti.util.ExcelUtils;
import com.jero.modules.laws.standard.entity.LawsEnterpriseStandard;
import com.jero.modules.laws.standard.service.ILawsEnterpriseStandardService;
import com.jero.modules.sys.utils.UserUtils;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
@@ -24,12 +41,15 @@ import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
import static com.jero.modules.activiti.process.esAnnualInit.entity.constant.AnnualInitTaskNameConstant.*;
/**
* @author ThinkBook
* @description 针对表【process_es_annual_init(企标立项变更流程)】的数据库操作Service实现
* @createDate 2023-10-18 10:01:44
*/
@Slf4j
@Transactional(rollbackFor = JeroBootException.class)
@Service
public class ProcessEsAnnualInitServiceImpl extends ServiceImpl<ProcessEsAnnualInitMapper, ProcessEsAnnualInit>
implements ProcessEsAnnualInitService {
@@ -43,6 +63,251 @@ public class ProcessEsAnnualInitServiceImpl extends ServiceImpl<ProcessEsAnnualI
@Resource
private ILawsEnterpriseStandardService enterpriseStandardService;
@Resource
private ActFlowCommonService actFlowCommonService;
@Resource
private ProcessNodeService processNodeService;
@Resource
private ProcessNodeLinkService processNodeLinkService;
@Resource
private ProcessAllService processAllService;
@Resource
private RuntimeService runtimeService;
@Resource
private TaskService taskService;
@Override
public void startProcess(AnnualInitDataVO annualInitData) {
// 执行流程发起前的操作
this.startRunTask(annualInitData);
// 流程Key
String processDefinitionKey = ProcessType.ES_ANNUAL_REPORT.getProcessKey();
List<ProcessEsAnnualInit> annualReportList = annualInitData.getDataList();
// 当前用户Id
String userId = UserUtils.getUserId();
// 设置流程变量
Map<String, Object> variables = this.setVariables(annualInitData);
// 启动流程
ProcessInstance processInstance = actFlowCommonService.startProcess(processDefinitionKey, variables);
// 获取流程实例ID
String processDefinitionId = processInstance.getProcessDefinitionId();
String processInstanceId = processInstance.getId();
// 手动设置所有流程变量
actFlowCommonService.setProcessVariables(processInstanceId, variables);
// 自动完成第一个任务
actFlowCommonService.autoCompleteFirstTask(userId, processInstanceId, processDefinitionId);
// 设置流程实例Id
annualReportList.forEach(annualReport -> annualReport.setProcessInstanceId(processInstanceId));
// 保存到业务流程表
saveBatch(annualReportList);
// 保存选人信息
processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, this.getUserMap(variables));
// 根据流程实例id更新流程总表
String prcName = annualInitData.getCommonVO().getPrcName();
String prcMes = annualInitData.getCommonVO().getPrcMes();
Date dueTime = annualInitData.getCommonVO().getDueTime();
actFlowCommonService.updateProcessAll(processInstanceId, userId, prcName, prcMes, dueTime);
}
public void startRunTask(AnnualInitDataVO annualInitData) {
// do nothing now
}
public Map<String, Object> setVariables(AnnualInitDataVO annualInitData) {
AnnualInitFlowUserVO annualInitFlowUserVO = annualInitData.getFlowUser();
List<ProcessEsAnnualInit> dataList = annualInitData.getDataList();
List<String> contactUserList = new ArrayList<>();
dataList.forEach(item -> contactUserList.add(item.getContactUser()));
annualInitFlowUserVO.setContactUserList(contactUserList);
// 设置流程中各个节点的人
return new HashMap<>(this.setUserVariables(annualInitFlowUserVO));
}
public Map<String, Object> setUserVariables(AnnualInitFlowUserVO userVO) {
HashMap<String, Object> map = new HashMap<>();
// 使用一个通用方法来只在不为空时添加键值对
actFlowCommonService.putIfNotNull(map, "standardEngineer", userVO.getStandardEngineer());
actFlowCommonService.putIfNotNull(map, "contactUserList", userVO.getContactUserList());
actFlowCommonService.putIfNotNull(map, "approvalUserList", userVO.getApprovalUserList());
actFlowCommonService.putIfNotNull(map, "mainDraftUserList", userVO.getMainDraftUserList());
return map;
}
private Map<String, Object> getUserMap(Map<String, Object> variables) {
// 转成逗号拼接
variables.put("contactUserList", Optional.ofNullable((List<String>) variables.get("contactUserList"))
.map(list -> String.join(",", list))
.orElse(""));
variables.put("approvalUserList", Optional.ofNullable((List<String>) variables.get("approvalUserList"))
.map(list -> String.join(",", list))
.orElse(""));
variables.put("mainDraftUserList", Optional.ofNullable((List<String>) variables.get("mainDraftUserList"))
.map(list -> String.join(",", list))
.orElse(""));
return variables;
}
@Override
public void saveToDraft(AnnualInitDataVO annualInitData) {
}
@Override
public AnnualInitDataVO getHandleData(String taskId) {
String userId = UserUtils.getUserId();
if (!actFlowCommonService.taskExists(taskId)) {
throw new JeroBootException("任务不存在");
}
AnnualInitDataVO annualInitDataVO = new AnnualInitDataVO();
// 使用流程引擎根据taskId找到流程实例Id
String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
String processDefinitionId = actFlowCommonService.getProcessDefId(processInstanceId);
// 获取流程通用数据
ProcessAll process = processAllService.getByProcessInstanceId(processInstanceId);
CommonVO commonVO = new CommonVO();
commonVO.setPrcName(process.getPrcName());
commonVO.setTaskId(process.getTaskId());
commonVO.setPrcMes(process.getPrcMes());
commonVO.setDueTime(process.getDueTime());
annualInitDataVO.setCommonVO(commonVO);
// 获取流程实例数据
LambdaQueryWrapper<ProcessEsAnnualInit> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ProcessEsAnnualInit::getProcessInstanceId, processInstanceId);
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
String taskName = task.getName();
switch (taskName) {
case STANDARD_ENGINEER_INIT:
// do nothing now
break;
case CONTACT_USER_EDIT:
wrapper.eq(ProcessEsAnnualInit::getContactUser, userId);
break;
case STANDARD_ENGINEER_EDIT:
wrapper.eq(ProcessEsAnnualInit::getRejectFlag, YesOrNoEnum.YES.getValue());
break;
case MAIN_DRAFT_LEADER_APPROVAL:
wrapper.eq(ProcessEsAnnualInit::getApprovalUser, userId);
break;
case MAIN_DRAFT_WRITE:
wrapper.eq(ProcessEsAnnualInit::getPrcMainDraftUser, userId);
break;
case CONTACT_USER_COLLECT:
wrapper.eq(ProcessEsAnnualInit::getContactUser, userId);
break;
case MAIN_DRAFT_LEADER_LEADER_APPROVAL:
wrapper.eq(ProcessEsAnnualInit::getContactUser, userId);
break;
case STANDARD_ENGINEER_COLLECT:
// do nothing now
break;
}
// 选人组件内容填充
annualInitDataVO.setFlowUser(this.getProcessUserInfo(processDefinitionId, processInstanceId));
return annualInitDataVO;
}
private AnnualInitFlowUserVO getProcessUserInfo(String processDefinitionId, String processInstanceId) {
//TODO 每个节点返回的人员信息应该是不同的
List<ProcessNode> nodeList = processNodeService.getNodeList(processDefinitionId, processInstanceId);
AnnualInitFlowUserVO annualInitFlowUserVO = new AnnualInitFlowUserVO();
Map<String, ProcessNode> userMap = nodeList.stream().collect(Collectors.toMap(ProcessNode::getVariableName, node -> node));
// annualInitFlowUserVO.setStandardEngineer(userMap.get("standardEngineer").getLinkUserIds());
// annualInitFlowUserVO.setContactUserList(userMap.get("contactUserList").getLinkUserIds());
// annualInitFlowUserVO.setWorkGroupUserList(userMap.get("workGroupUserList").getLinkUserIds());
// annualInitFlowUserVO.setCollectUserLeader(userMap.get("collectUserLeader").getLinkUserIds());
// annualInitFlowUserVO.setContactUserLeaderLeader(userMap.get("contactUserLeaderLeader").getLinkUserIds());
return annualInitFlowUserVO;
}
@Override
public void approvalInitChange(AnnualInitDataVO annualInitData, boolean pass) {
String userId = UserUtils.getUserId();
CommonVO commonVO = annualInitData.getCommonVO();
AnnualInitFlowUserVO flowUserVO = annualInitData.getFlowUser();
List<ProcessEsAnnualInit> dataList = annualInitData.getDataList();
String taskId = commonVO.getTaskId();
// 获取task
if (StrUtil.isBlank(taskId) && !actFlowCommonService.taskExists(taskId)) {
throw new JeroBootException("taskId为空或任务不存在");
}
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
String taskName = task.getName();
String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
String processDefinitionId = actFlowCommonService.getProcessDefId(processInstanceId);
switch (taskName) {
case CONTACT_USER_EDIT:
// 处理驳回
if (pass) {
dataList.forEach(d -> d.setRejectFlag(YesOrNoEnum.NO.getValue()));
} else {
dataList.forEach(d -> d.setRejectFlag(YesOrNoEnum.YES.getValue()));
}
saveOrUpdateBatch(dataList);
// 设置本地变量
List<String> approvalUserList = new ArrayList<>();
dataList.forEach(d -> approvalUserList.add(d.getApprovalUser()));
flowUserVO.setApprovalUserList(approvalUserList);
taskService.setVariableLocal(taskId, "approvalUserList", approvalUserList);
break;
case STANDARD_ENGINEER_EDIT:
dataList.forEach(d -> d.setRejectFlag(YesOrNoEnum.NO.getValue()));
saveOrUpdateBatch(dataList);
// 设置流程变量
List<String> contactUserList = new ArrayList<>();
dataList.forEach(d -> contactUserList.add(d.getContactUser()));
flowUserVO.setApprovalUserList(contactUserList);
runtimeService.setVariable(processInstanceId, "contactUserList", contactUserList);
break;
case MAIN_DRAFT_LEADER_APPROVAL:
// 如果不驳回
if (!pass) {
dataList.forEach(d -> d.setRejectFlag(YesOrNoEnum.NO.getValue()));
saveOrUpdateBatch(dataList);
// 设置本地变量
List<String> mainDraftUserList = new ArrayList<>();
dataList.forEach(d -> mainDraftUserList.add(d.getPrcMainDraftUser()));
flowUserVO.setApprovalUserList(mainDraftUserList);
taskService.setVariableLocal(taskId, "mainDraftUserList", mainDraftUserList);
}
break;
case MAIN_DRAFT_WRITE:
saveOrUpdateBatch(dataList);
break;
case CONTACT_USER_COLLECT:
saveOrUpdateBatch(dataList);
break;
case MAIN_DRAFT_LEADER_LEADER_APPROVAL:
break;
case STANDARD_ENGINEER_COLLECT:
// 根据流程ID删除所有数据后新增
LambdaQueryWrapper<ProcessEsAnnualInit> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ProcessEsAnnualInit::getProcessInstanceId, processInstanceId);
remove(wrapper);
saveOrUpdateBatch(dataList);
break;
}
if (pass) {
if (flowUserVO != null) {
Map<String, Object> userMap = new HashMap<>(this.setUserVariables(flowUserVO));
processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, userMap);
}
runtimeService.setVariable(processInstanceId, "pass", true);
} else {
// 设置流程变量
runtimeService.setVariable(processInstanceId, "pass", false);
}
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(commonVO, taskId, pass);
// 审批节点
actFlowCommonService.completeTask(taskId, userId);
}
@Override
public Map<String, Object> importData(MultipartFile file) {
List<SysDictItemCore> listDict = commonAPI.getDictItemAll();
@@ -120,18 +120,6 @@ public class ProcessESInitChangeController {
return Result.OK();
}
/**
* 转办
*
*/
@AutoLog(value = "企标立项变更流程-转办")
@ApiOperation(value="企标立项变更流程-转办", notes="企标立项变更流程-转办")
@PostMapping(value = "/transfer")
public Result<?> transfer(@RequestBody TransferVO transferVO) {
initChangeService.transfer(transferVO.getTaskId(), transferVO.getUserId());
return Result.OK();
}
/**
* 选择企标编号带出数据
*