feat: 企标制修订流程流程流转相关代码

This commit is contained in:
2024-09-24 14:40:52 +08:00
parent 8ff06e4c27
commit 54dce5847a
5 changed files with 128 additions and 195 deletions
@@ -6,8 +6,6 @@ package com.jero.modules.activiti.process.esRevisionAdvice.common;
*/
public class RevisionTaskNodeIdConstant {
/** 主起草人分发 */
public static final String MAIN_DRAFT_USER_DISTRIBUTE = "Activity_0v98tow";
/** 法规工程师确认是否开启征求意见 */
public static final String CONFIRM_ADVISE = "Activity_1siuksf";
/** 设计工程师填写意见 */
@@ -16,5 +14,8 @@ public class RevisionTaskNodeIdConstant {
public static final String ADVICE_COLLECT = "Activity_1riqzkp";
/** 法规工程师派号 */
public static final String SET_STANDARD_NUMBER = "Activity_1ralk8e";
/** 征求意见人员 */
public static final String ADVICE_USER_LIST = "adviceUserList";
/** 开启征求意见 */
public static final String OPEN = "open";
}
@@ -103,19 +103,25 @@ public class EsRevisionAdvice implements Serializable {
@Dict(dicCode = "consultation_opinion")
private String handleAdvice;
/**
* 0无意见 1有意见
*/
@ApiModelProperty(value = "0无意见 1有意见")
@Dict(dicCode = "yn")
private String haveNoOpinion;
/**
* 理由
*/
@ApiModelProperty(value = "理由")
private String reason;
/**
* 轮数
*/
@ApiModelProperty(value = "轮数")
@Dict(dicCode = "batch_num")
private Integer batchNum;
/**
* 标准Id
*/
@ApiModelProperty(value = "标准Id")
private String standardId;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -1,11 +1,28 @@
package com.jero.modules.activiti.process.esRevisionAdvice.listener;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.jero.modules.activiti.process.common.enums.StandardStateEnum;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.EsRevisionAdvice;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.ProcessEsRevision;
import com.jero.modules.activiti.process.esRevisionAdvice.service.EsRevisionAdviceService;
import com.jero.modules.activiti.process.esRevisionAdvice.service.EsRevisionService;
import com.jero.modules.laws.common.constant.FieldCommon;
import com.jero.modules.laws.common.service.ILawsCommonService;
import com.jero.modules.laws.enterprise.entity.EnterpriseStandardPlan;
import com.jero.modules.laws.enterprise.service.EnterpriseStandardPlanService;
import com.jero.modules.tag.enums.TableNameEnum;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import static com.jero.modules.laws.common.constant.FieldCommon.MAIN_DRAFT_USER;
/**
* @author: Mzaxd
@@ -17,91 +34,59 @@ public class ProcessESRevisionEndListener implements ExecutionListener {
@Resource
private EnterpriseStandardPlanService espService;
// @Resource
// private EsRevisionService esRevisionService;
//
// @Resource
// private EnterpriseStandardReviewMeetingRecordService rmrService;
//
// @Resource
// private EnterpriseStandardRmrEvaluateDetailService rmrDetailService;
//
// @Resource
// private ILawsCommonService lawsCommonService;
//
// @Resource
// private IBusProcessModelHisService busProcessModelHisService;
@Resource
private EsRevisionService esRevisionService;
@Resource
private EsRevisionAdviceService esAdviceService;
@Resource
private ILawsCommonService lawsCommonService;
@Override
public void notify(DelegateExecution delegateExecution) {
// 获取流程实例Id
String processInstanceId = delegateExecution.getProcessInstanceId();
// 根据流程Id获取业务数据
// LambdaQueryWrapper<ProcessEsRevision> revisionWrapper = new LambdaQueryWrapper<>();
// revisionWrapper.eq(ProcessEsRevision::getProcessInstanceId, processInstanceId);
// // 获取企标相关数据
// ProcessEsRevision data = esRevisionService.getOne(revisionWrapper);
// Map<String, Object> variables = JSON.parseObject(data.getBusinessJson(), Map.class);
// String inspectContentJson = data.getInspectContentJson();
// List<LinkedHashMap<String, Object>> inspectContentList;
// if (StrUtil.isNotBlank(inspectContentJson)) {
// inspectContentList =
// JSON.parseObject(inspectContentJson, new TypeReference<List<LinkedHashMap<String, Object>>>() {});
// variables.put(FieldCommon.CHECK_LIST, inspectContentList);
// }
// // 将标准号进行拆分后填充字段
// String standardNumber = (String) variables.get(FieldCommon.STANDARD_NUMBER);
// if (StringUtils.isNotBlank(standardNumber)) {
// Map<String, String> map = EnterpriseStandardUtil.splitStandardNumber(standardNumber);
// variables.putAll(map);
// // 如果没有主起草人,则需要填充主起草人
// }
// // 主起草人
// String mainDraftUser = (String) variables.get(FieldCommon.MAIN_DRAFTING_USER);
// if (StringUtils.isBlank(mainDraftUser)) {
// variables.put(FieldCommon.MAIN_DRAFTING_USER, data.getMainDraftUser());
// }
// // 标准状态
// variables.put(FieldCommon.STANDARD_STATE, StandardStateEnum.RELEASE.getStateValue());
// String tryFlag = (String) variables.get(FieldCommon.TRY_FLAG);
// if (tryFlag != null) {
// if (tryFlag.equals(YesOrNoEnum.YES.getValue())) {
// variables.put(FieldCommon.STANDARD_STATE, StandardStateEnum.TRIAL_OPERATION.getStateValue());
// }
// }
// variables.put(FieldCommon.RELEASE_DATE, data.getReleaseDate());
// variables.put(FieldCommon.IMPLEMENTATION_DATE, data.getImplementDate());
// variables.put(FieldCommon.MAIN_DRAFTING_UNIT_RESPONSIBLE_PERSON, data.getApprovalUser());
// variables.put(FieldCommon.MODULE, TableNameEnum.ENTERPRISE_STANDARDS.getValue());
// variables.put(FieldCommon.AUTH_DEPT, data.getAuthDept());
// String standardId = IdWorker.getIdStr();
// variables.put(FieldCommon.ID, standardId);
// // minio上传在线编辑文件
// String onEditFile = data.getOnEditFile();
// if (StringUtils.isNotBlank(onEditFile)) {
// String fileId = busProcessModelHisService.saveProcessFileToOss(onEditFile);
// variables.put(FieldCommon.FILE_PUBLISH_OF_ORIGINAL, fileId);
// }
// // 发布企标
// lawsCommonService.commonAdd(variables);
// String espId = data.getEspId();
// EnterpriseStandardPlan esp = espService.getById(espId);
// // 保存评审会记录
// EnterpriseStandardReviewMeetingRecord esRmr = new EnterpriseStandardReviewMeetingRecord();
// esRmr.setStandardId(standardId);
// esRmr.setPlanId(esp.getId());
// esRmr.setReviewDate(data.getReviewDate());
// esRmr.setReviewUser(data.getReviewUser());
// rmrService.save(esRmr);
// // 保存评审会评审结果
// List<ReviewMeetingDetailVO> reviewMeetingDetailVOS = data.parseReviewMeetingDetails();
// List<EnterpriseStandardRmrEvaluateDetail> rmrEvaluateDetails =
// BeanCopyUtils.copyBeanList(reviewMeetingDetailVOS, EnterpriseStandardRmrEvaluateDetail.class);
// rmrEvaluateDetails.forEach(r -> r.setReviewMeetingId(esRmr.getId()));
// rmrDetailService.saveBatch(rmrEvaluateDetails);
// // 更新企标计划状态
// espService.updateById(esp);
LambdaQueryWrapper<ProcessEsRevision> revisionWrapper = new LambdaQueryWrapper<>();
revisionWrapper.eq(ProcessEsRevision::getProcessInstanceId, processInstanceId);
// 获取企标相关数据
ProcessEsRevision data = esRevisionService.getOne(revisionWrapper);
// 将数据转换为Map
Map<String, Object> variables = transMap(data);
// 发布企标
String esId = lawsCommonService.commonAdd(variables);
// 所有意见设置标准Id
LambdaQueryWrapper<EsRevisionAdvice> adviceWrapper = new LambdaQueryWrapper<>();
adviceWrapper.eq(EsRevisionAdvice::getProcessInstanceId, processInstanceId);
List<EsRevisionAdvice> list = esAdviceService.list(adviceWrapper);
if (!list.isEmpty()) {
list.forEach(item -> item.setStandardId(esId));
}
// 更新企标计划状态
String espId = data.getEspId();
EnterpriseStandardPlan esp = espService.getById(espId);
espService.updateById(esp);
}
private Map<String, Object> transMap(ProcessEsRevision data) {
Map<String, Object> variables;
// 转换 创建 ObjectMapper 实例并设置命名策略
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
// 将对象转换为 Map<String, Object>
variables = objectMapper.convertValue(data, Map.class);
variables.put(FieldCommon.MODULE, TableNameEnum.ENTERPRISE_STANDARDS.getValue());
// 主起草人
String mainDraftUser = (String) variables.get(MAIN_DRAFT_USER);
variables.put(FieldCommon.MAIN_DRAFTING_USER, mainDraftUser);
// 标准状态
variables.put(FieldCommon.STANDARD_STATE, StandardStateEnum.CURRENTLY_EFFECTIVE.getStateValue());
String standardId = IdWorker.getIdStr();
variables.put(FieldCommon.ID, standardId);
String onEditFile = data.getOnEditFile();
// 发布稿
variables.put(FieldCommon.FILE_PUBLISH_OF_ORIGINAL, onEditFile);
return variables;
}
}
@@ -1,22 +1,18 @@
package com.jero.modules.activiti.process.esRevisionAdvice.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jero.common.api.SendMessageAPI;
import com.jero.common.api.dto.message.SendMessageDTO;
import com.jero.common.api.vo.ResultCommon;
import com.jero.common.aspect.TranslationAspect;
import com.jero.common.constant.enums.YesOrNoEnum;
import com.jero.common.exception.JeroBootException;
import com.jero.modules.activiti.entity.ProcessAll;
import com.jero.modules.activiti.entity.ProcessApprovalRecord;
import com.jero.modules.activiti.enums.ProcessStatusEnum;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.common.enums.ProcessType;
import com.jero.modules.activiti.process.common.service.ActFlowCommonService;
import com.jero.modules.activiti.process.common.service.ProcessDraftService;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.EsRevisionAdvice;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.HandleAdviceEnum;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.ProcessEsRevision;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.vo.ProcessRevisionVO;
import com.jero.modules.activiti.process.esRevisionAdvice.mapper.EsRevisionMapper;
@@ -27,15 +23,13 @@ import com.jero.modules.activiti.process.fb.dto.BasicTaskInfoDTO;
import com.jero.modules.activiti.process.fb.service.IProcessHandleService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.service.ProcessAllService;
import com.jero.modules.activiti.service.ProcessApprovalRecordService;
import com.jero.modules.activiti.service.ProcessNodeLinkService;
import com.jero.modules.laws.common.constant.FieldCommon;
import com.jero.modules.laws.common.constant.MessageTemplateCodeCommon;
import com.jero.modules.laws.enterprise.entity.ESPProjectStatus;
import com.jero.modules.laws.enterprise.entity.EnterpriseStandardPlan;
import com.jero.modules.laws.enterprise.service.EnterpriseStandardPlanService;
import com.jero.modules.laws.system.service.ILawsContactManageService;
import com.jero.modules.sys.utils.UserUtils;
import com.jero.modules.system.service.ISysUserDepartService;
import com.jero.modules.system.service.ISysUserService;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
@@ -48,7 +42,6 @@ import java.util.*;
import java.util.stream.Collectors;
import static com.jero.modules.activiti.common.ActivitiCommon.MAIN_INSTANCE_ID;
import static com.jero.modules.activiti.common.ActivitiCommon.PASS;
import static com.jero.modules.activiti.process.esRevisionAdvice.common.RevisionTaskNodeIdConstant.*;
/**
@@ -87,25 +80,7 @@ public class EsRevisionServiceImpl extends ServiceImpl<EsRevisionMapper, Process
private EsRevisionAdviceService adviceService;
@Resource
private TranslationAspect translationAspect;
@Resource
private ISysUserDepartService sysUserDepartService;
// @Resource
// private SendMessageAPI sendMessageAPI;
@Resource
private ILawsContactManageService contactManageService;
@Resource
private ProcessApprovalRecordService parService;
@Resource
private ISysUserService userService;
@Resource
private ProcessDraftService prcDraftService;
private SendMessageAPI sendMessageAPI;
@Override
public void startProcess(ProcessInfoVO<ProcessRevisionVO> processInfoVO) {
@@ -193,35 +168,24 @@ public class EsRevisionServiceImpl extends ServiceImpl<EsRevisionMapper, Process
if (Objects.nonNull(data)) {
detailQueryWrapper.eq(EsRevisionAdvice::getProcessInstanceId, processInstanceId);
adviceList = adviceService.list(detailQueryWrapper);
// 筛选出最新一轮
if (!adviceList.isEmpty()) {
Map<Integer, List<EsRevisionAdvice>> map = adviceList.stream().collect(Collectors.groupingBy(EsRevisionAdvice::getBatchNum));
// 获取轮数最大的轮数
Integer maxNum = this.calculateAdviceBatchNum(adviceList);
adviceList = map.get(maxNum);
}
}
// 获取当前流程
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
String processDefinitionId = processInstance.getProcessDefinitionId();
String xmlNodeId = record.getNodeId();
// 设置流程信息
switch (xmlNodeId) {
case CONFIRM_ADVISE:
// 判断是否开启征求意见子流程 设置流程变量
// boolean adviceFlag = !data.getAdviceFlag().equals(YesOrNoEnum.NO.getValue());
// if (adviceFlag) {
// List<String> adviceUserList = Arrays.asList(data.getAdviceUsers().split(","));
// taskService.setVariable(taskId, "adviceUserList", adviceUserList);
// taskService.setVariable(taskId, "open", true);
// // 保存流程数据
// saveOrUpdate(data);
// userMap.put("mainDraftCollectUser", mainDraftUser);
// userMap.put("contactUser", data.getContactUser());
// processNodeLinkService.incrementSaveNodeUserLink(processDefinitionId, processInstanceId, userMap);
// } else {
// taskService.setVariable(taskId, "open", false);
// }
break;
case ADVICE:
case ADVICE_COLLECT:
case SET_STANDARD_NUMBER:
break;
case ADVICE_COLLECT:
processVo.setAdviceList(adviceList);
}
// 设置流程变量等相关信息
processVo.setProcessInfo(data);
@@ -255,30 +219,42 @@ public class EsRevisionServiceImpl extends ServiceImpl<EsRevisionMapper, Process
// 获取流程实例ID
String processDefinitionId = processInstance.getProcessDefinitionId();
Map<String, Object> userMap = new HashMap<>();
LambdaQueryWrapper<EsRevisionAdvice> detailQueryWrapper = new LambdaQueryWrapper<>();
detailQueryWrapper.eq(EsRevisionAdvice::getProcessInstanceId, processInstanceId);
List<EsRevisionAdvice> dbAdviceList = adviceService.list(detailQueryWrapper);
// 筛选出最新一轮
Integer maxBatchNum = this.calculateAdviceBatchNum(dbAdviceList);
switch (xmlNodeId) {
case CONFIRM_ADVISE:
// 判断是否开启征求意见子流程 设置流程变量
boolean adviceFlag = !data.getAdviceFlag().equals(YesOrNoEnum.NO.getValue());
if (adviceFlag) {
List<String> adviceUserList = Arrays.asList(data.getAdviceUsers().split(","));
taskService.setVariable(taskId, "adviceUserList", adviceUserList);
taskService.setVariable(taskId, "open", true);
taskService.setVariable(taskId, ADVICE_USER_LIST, adviceUserList);
taskService.setVariable(taskId, OPEN, true);
// 保存流程数据
saveOrUpdate(data);
// userMap.put("mainDraftCollectUser", mainDraftUser);
// userMap.put("contactUser", data.getContactUser());
processNodeLinkService.incrementSaveNodeUserLink(processDefinitionId, processInstanceId, userMap);
userMap.put(ADVICE_USER_LIST, data.getAdviceUsers());
processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, userMap);
} else {
taskService.setVariable(taskId, "open", false);
taskService.setVariable(taskId, OPEN, false);
}
break;
case ADVICE:
// 保存意见数据
adviceList.forEach(advice -> advice.setProcessInstanceId(processInstanceId));
adviceList.forEach(advice -> advice.setBatchNum(maxBatchNum));
adviceService.saveBatch(adviceList);
case ADVICE_COLLECT:
// 保存数据
adviceService.updateBatchById(adviceList);
// 给主起草人发消息
String mainDraftUser = (String) taskService.getVariable(taskId, FieldCommon.MAIN_DRAFT_USER);
this.sendMessageToMainDraftUser(mainDraftUser, processInstanceId, maxBatchNum);
case SET_STANDARD_NUMBER:
// 保存数据
updateById(data);
}
runtimeService.setVariable(processInstanceId, PASS, true);
// 审批节点
actFlowCommonService.completeTask(taskId, curUserId);
// 更新审批表为完成,填充数据
@@ -289,56 +265,20 @@ public class EsRevisionServiceImpl extends ServiceImpl<EsRevisionMapper, Process
processHandleService.saveToSnapshot(processInfoVO, curUserId);
}
private void sendMessageToMainDraftUser(ProcessEsRevision revision, String processInstanceId) {
ProcessAll processAll = processAllService.getByProcessInstanceId(processInstanceId);
List<EsRevisionAdvice> advices = revision.getAdvices();
Map<String, List<EsRevisionAdvice>> adviceMap = advices.stream()
.collect(Collectors.groupingBy(EsRevisionAdvice::getCreateUserId));
// 按照Map的Key遍历
for (String userId : adviceMap.keySet()) {
List<EsRevisionAdvice> adviceList = adviceMap.get(userId);
// 只有未被采纳和部分采纳才发消息
if (adviceList.stream().allMatch(advice -> HandleAdviceEnum.AGREE.getValue().equals(advice.getHandleAdvice()))) {
continue;
}
SendMessageDTO sendMessageDTO = new SendMessageDTO();
// sendMessageDTO.setTemplateCode(MessageTemplateCodeCommon.ES_REVISION_ADVICE);
sendMessageDTO.setToUserId(userId);
Map<String, String> sendMap = new HashMap<>();
sendMap.put("prcNum", processAll.getPrcNum());
sendMap.put("prcName", processAll.getPrcName());
StringBuilder msg = new StringBuilder();
for (EsRevisionAdvice advice : adviceList) {
// 采纳的不发消息
if (HandleAdviceEnum.AGREE.getValue().equals(advice.getHandleAdvice())) {
continue;
}
msg.append(advice.getClauseNum()).append(" ").append(advice.getClauseName());
if (HandleAdviceEnum.DISAGREE.getValue().equals(advice.getHandleAdvice())) {
msg.append(" 未被采纳,");
} else {
msg.append(" 被部分采纳,");
}
msg.append("理由为:").append(advice.getReason()).append("");
}
// 去除最后一个分号
if (StrUtil.isNotBlank(msg)) {
msg.deleteCharAt(msg.length() - 1);
}
sendMap.put("msg", msg.toString());
sendMessageDTO.setMap(sendMap);
// sendMessageAPI.sendMessage(sendMessageDTO);
}
private Integer calculateAdviceBatchNum(List<EsRevisionAdvice> adviceList) {
return adviceList.stream().mapToInt(EsRevisionAdvice::getBatchNum).max().orElse(0);
}
// @Override
public void updateAllPlanDate() {
// 从流程主表找到所有企标制修订流程
List<ProcessAll> processAlls = processAllService.list(new LambdaQueryWrapper<ProcessAll>()
// .eq(ProcessAll::getPrcType, ProcessTypeEnum.ES_REVISION.getValue())
.ne(ProcessAll::getPrcStatus, ProcessStatusEnum.WITHDRAWN.getValue()));
// this.updatePlanDateByProcessInstanceId(processAlls);
private void sendMessageToMainDraftUser(String mainDraftUser, String processInstanceId, Integer maxBatchNum) {
ProcessAll processAll = processAllService.getByProcessInstanceId(processInstanceId);
SendMessageDTO sendMessageDTO = new SendMessageDTO();
sendMessageDTO.setTemplateCode(MessageTemplateCodeCommon.ES_REVISION_ADVICE);
sendMessageDTO.setToUserId(mainDraftUser);
Map<String, String> sendMap = new HashMap<>();
sendMap.put("prcNum", processAll.getPrcNum());
sendMap.put("batchNum", maxBatchNum.toString());
sendMessageDTO.setMap(sendMap);
sendMessageAPI.sendMessage(sendMessageDTO);
}
}
@@ -14,6 +14,7 @@ public class MessageTemplateCodeCommon {
public static final String URGING = "urging"; // 催办
public static final String REPLACE_STANDARD_NEW = "replace_standard_new"; // 当前标准引用的标准有新版本标准
public static final String IMPLEMENTATION_DATE_NEW_STANDARD = "implementation_date_new_standard"; // 代替标准到实施日期
public static final String ES_REVISION_ADVICE = "es_revision_advice"; // 代替标准到实施日期
}