|
@@ -0,0 +1,1227 @@
|
|
|
+package com.dragonsoft.dcuc.approve.service.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
+import cn.hutool.core.date.DateUnit;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.util.EnumUtil;
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.dragonsoft.approve.common.ErrorCode;
|
|
|
+import com.dragonsoft.dcuc.approve.componet.DcucHelper;
|
|
|
+import com.dragonsoft.dcuc.approve.config.ApproveConfig;
|
|
|
+import com.dragonsoft.dcuc.approve.config.KafkaConfig;
|
|
|
+import com.dragonsoft.dcuc.approve.enumresources.ApproveWorkFlowOprationEnum;
|
|
|
+import com.dragonsoft.dcuc.approve.enumresources.OperateOptionEnum;
|
|
|
+import com.dragonsoft.dcuc.approve.enumresources.YesNoEnum;
|
|
|
+import com.dragonsoft.dcuc.approve.mapper.ApprovalInfoMapper;
|
|
|
+import com.dragonsoft.dcuc.approve.mapper.ApprovalResourceInfoMapper;
|
|
|
+import com.dragonsoft.dcuc.approve.model.ApprovalInfo;
|
|
|
+import com.dragonsoft.dcuc.approve.model.ApprovalResourceInfo;
|
|
|
+import com.dragonsoft.dcuc.approve.model.ApproveTaskRequestVo;
|
|
|
+import com.dragonsoft.dcuc.approve.model.IdEntity;
|
|
|
+import com.dragonsoft.dcuc.approve.model.req.AgentDTO;
|
|
|
+import com.dragonsoft.dcuc.approve.model.req.ApprovalInfoDTO;
|
|
|
+import com.dragonsoft.dcuc.approve.model.req.ApprovalInfoUpdateDTO;
|
|
|
+import com.dragonsoft.dcuc.approve.model.resp.*;
|
|
|
+import com.dragonsoft.dcuc.approve.service.IApproveService;
|
|
|
+import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
|
|
|
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
|
|
|
+import com.dragonsoft.duceap.base.entity.security.BaseSecurityUser;
|
|
|
+import com.dragonsoft.duceap.base.exception.ApplicationException;
|
|
|
+import com.dragonsoft.duceap.base.utils.UserContextUtils;
|
|
|
+import com.dragonsoft.duceap.commons.util.UUIDUtils;
|
|
|
+import com.dragonsoft.duceap.commons.util.date.DateConst;
|
|
|
+import com.dragonsoft.duceap.commons.util.date.DateUtils;
|
|
|
+import com.dragonsoft.duceap.commons.util.enums.EnumUtils;
|
|
|
+import com.dragonsoft.duceap.commons.util.kafkaServer.KafkaServer;
|
|
|
+import com.dragonsoft.duceap.core.context.ContextUtils;
|
|
|
+import com.dragonsoft.duceap.core.entity.page.PageImpl;
|
|
|
+import com.dragonsoft.duceap.core.entity.page.PageRequest;
|
|
|
+import com.dragonsoft.duceap.core.search.Searchable;
|
|
|
+import com.dragonsoft.duceap.core.search.enums.SearchOperator;
|
|
|
+import com.dragonsoft.duceap.duwf.api.enums.StateTypeEnum;
|
|
|
+import com.dragonsoft.duceap.duwf.api.model.ActivityNodeInfoVo;
|
|
|
+import com.dragonsoft.duceap.duwf.api.model.*;
|
|
|
+import com.dragonsoft.duceap.workflow.client.WorkflowClientFactory;
|
|
|
+import com.dragonsoft.duceap.workflow.enums.WorkFlowOprationEnum;
|
|
|
+import com.dragonsoft.mq.client.model.entity.MessageInfoVo;
|
|
|
+import com.dragonsoft.mq.client.model.entity.RequestVo;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.data.domain.Page;
|
|
|
+import org.springframework.data.domain.Sort;
|
|
|
+import org.springframework.scheduling.annotation.EnableAsync;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.text.ParseException;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 代码千万行,注释第一行,编码不规范,同事两行泪
|
|
|
+ *
|
|
|
+ * @author huang(jy)
|
|
|
+ * @version 1.0
|
|
|
+ * @date 2021/2/3 19:43
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@Transactional
|
|
|
+@EnableAsync
|
|
|
+public class ApproveService implements IApproveService {
|
|
|
+
|
|
|
+ private static final Logger logger = LoggerFactory.getLogger(ApproveService.class);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 结束字符串
|
|
|
+ */
|
|
|
+ private static final String endStr = "END";
|
|
|
+ /**
|
|
|
+ * 页面
|
|
|
+ */
|
|
|
+ private static final String myRequestPage = "request";
|
|
|
+ /**
|
|
|
+ * 审批类型(待办中心用于区分应用、服务等审批类型)
|
|
|
+ */
|
|
|
+ private static final String businessType = "auth-update-apply";
|
|
|
+ private static final String businessSystem = "dcuc-approve";
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private WorkflowClientFactory workflowClientFactory;
|
|
|
+ @Autowired
|
|
|
+ private ApprovalInfoMapper approvalInfoMapper;
|
|
|
+ @Autowired
|
|
|
+ private ApprovalResourceInfoMapper approvalResourceInfoMapper;
|
|
|
+ @Autowired
|
|
|
+ private DcucHelper dcucHelper;
|
|
|
+ @Autowired
|
|
|
+ private KafkaServer kafkaService;
|
|
|
+ @Autowired
|
|
|
+ private KafkaConfig kafkaConfig;
|
|
|
+ @Autowired
|
|
|
+ private ApproveConfig approveConfig;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 工作流审批流程类型编码
|
|
|
+ */
|
|
|
+ @Value("${approve.workflow.processTypeCode:approve}")
|
|
|
+ private String approveProcessTypeCode;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 我的请求列表
|
|
|
+ *
|
|
|
+ * @param searchable
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Page<ApprovalInfoVo> queryUserApproveList(Searchable searchable) {
|
|
|
+ searchable.addSearchFilter("createUser", SearchOperator.eq, getCurrentUserId());
|
|
|
+ searchable.addSort(Sort.Direction.DESC, "createTime");
|
|
|
+ //获取我的申请列表
|
|
|
+ Page<ApprovalInfo> applyInfoPage = approvalInfoMapper.pagingBySearchable(searchable);
|
|
|
+ List<ApprovalInfoVo> approvalInfoVoList = new ArrayList<>();
|
|
|
+ for (ApprovalInfo approvalInfo : applyInfoPage.getContent()) {
|
|
|
+ ApprovalInfoVo approvalInfoVo = this.fillTaskInfoToApplyInfo(approvalInfo);
|
|
|
+ approvalInfoVoList.add(approvalInfoVo);
|
|
|
+ }
|
|
|
+ return new PageImpl(approvalInfoVoList, applyInfoPage.getPageable(), applyInfoPage.getTotalElements());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 待办/已办列表
|
|
|
+ *
|
|
|
+ * @param searchable
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Page<TaskVo> queryApproveList(Searchable searchable) {
|
|
|
+ Page<TaskHistoryDetailVo> page = workflowClientFactory.getWorkflowTaskClient().queryTaskDetailPageByUserId(searchable, getCurrentUserId());
|
|
|
+ List<TaskVo> list = new ArrayList<>();
|
|
|
+ //设置流程类型名称
|
|
|
+ for (TaskHistoryDetailVo taskDetailVo : page.getContent()) {
|
|
|
+ TaskVo taskVo = new TaskVo();
|
|
|
+ BeanUtils.copyProperties(taskDetailVo, taskVo);
|
|
|
+ //获取申请信息填充
|
|
|
+ LambdaQueryWrapper<ApprovalInfo> where = new LambdaQueryWrapper<>();
|
|
|
+ where.eq(ApprovalInfo::getProcessInstanceId,taskDetailVo.getProcessInstanceId());
|
|
|
+ taskVo.setProcessName(taskDetailVo.getProcessDefinitionName());
|
|
|
+ ApprovalInfo approvalInfo = approvalInfoMapper.selectOne(where);
|
|
|
+ if(approvalInfo != null){
|
|
|
+ taskVo.setProcessTitle(approvalInfo.getProcessTitle());
|
|
|
+ taskVo.setApplicantName(approvalInfo.getApplicantName());
|
|
|
+ taskVo.setProcessType(approvalInfo.getProcessType());
|
|
|
+ taskVo.setBusinessId(approvalInfo.getId());
|
|
|
+ //重新设置候选人
|
|
|
+ String state = searchable.getSearchFilterByKey("state_eq").getValue().toString();
|
|
|
+ if("finish".equals(state)){
|
|
|
+ if(!endStr.equals(approvalInfo.getTaskId())){
|
|
|
+ TaskHistoryDetailVo nextTaskDetailVo = workflowClientFactory.getWorkflowTaskClient().queryTaskDetail(approvalInfo.getTaskId());
|
|
|
+ taskVo.setUnOperateUsers(this.getUnOperateUsersFromAssiginerMap(nextTaskDetailVo.getCandidateVo()));
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ taskVo.setUnOperateUsers(this.getUnOperateUsersFromAssiginerMap(taskDetailVo.getCandidateVo()));
|
|
|
+ }
|
|
|
+ taskVo.setTaskName(approvalInfo.getTaskName());
|
|
|
+ taskVo.setProcessTypeName(approvalInfo.getProcessTypeName());
|
|
|
+ }
|
|
|
+ list.add(taskVo);
|
|
|
+ }
|
|
|
+ return new PageImpl(list, page.getPageable(), page.getTotalElements());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 表单申请提交/保存
|
|
|
+ *
|
|
|
+ * @param approvalInfoDTO
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseStatus save(ApprovalInfoDTO approvalInfoDTO) {
|
|
|
+ approvalInfoDTO.setEndTime(this.parseEndTime(approvalInfoDTO.getEndTime()));
|
|
|
+ logger.info("====申请单请求体为:{}====",JSONObject.toJSON(approvalInfoDTO));
|
|
|
+ //获取流程类型详情
|
|
|
+ WorkflowProcesstypeVo workflowProcesstypeVo = null;
|
|
|
+ try {
|
|
|
+ workflowProcesstypeVo = queryProcessType(approvalInfoDTO.getProcessType());
|
|
|
+ }catch (ApplicationException e){
|
|
|
+ logger.info("流程类型标识码-Exception:【{}】", approvalInfoDTO.getProcessType());
|
|
|
+ throw new ApplicationException(ErrorCode.WORKFLOW_EXCEPTION.getCode(), ErrorCode.WORKFLOW_EXCEPTION.getMsg());
|
|
|
+ }
|
|
|
+ if (null == workflowProcesstypeVo){
|
|
|
+ logger.info("流程类型标识码:【{}】", approvalInfoDTO.getProcessType());
|
|
|
+ throw new ApplicationException(ErrorCode.WORKFLOW_TYPE_NOT_EXIST.getCode(), ErrorCode.WORKFLOW_TYPE_NOT_EXIST.getMsg());
|
|
|
+ }
|
|
|
+ approvalInfoDTO.setProcessTypeName(workflowProcesstypeVo.getName());
|
|
|
+ //获取流程信息
|
|
|
+ WorkflowProcessVo workflowProcessVo = null;
|
|
|
+ try {
|
|
|
+ workflowProcessVo = workflowClientFactory.getWorkflowProcessClient().queryWorkflowProcessByBusinessCode(approvalInfoDTO.getBusinessCode());
|
|
|
+ }catch (ApplicationException e){
|
|
|
+ logger.info("流程类型标识码-Exception:【{}】", approvalInfoDTO.getProcessType());
|
|
|
+ throw new ApplicationException(ErrorCode.WORKFLOW_EXCEPTION.getCode(), ErrorCode.WORKFLOW_EXCEPTION.getMsg());
|
|
|
+ }
|
|
|
+ if (null == workflowProcessVo){
|
|
|
+ logger.info("流程标识码:【{}】", approvalInfoDTO.getBusinessCode());
|
|
|
+ throw new ApplicationException(ErrorCode.WORKFLOW_NOT_EXIST.getCode(), ErrorCode.WORKFLOW_NOT_EXIST.getMsg());
|
|
|
+ }
|
|
|
+ approvalInfoDTO.setProcessName(workflowProcessVo.getName());
|
|
|
+ ApprovalInfo approvalInfo = buildApprovalInfo(approvalInfoDTO);
|
|
|
+ logger.info("构建申请单信息");
|
|
|
+ approvalInfo.setApplyContent(JSON.toJSON(approvalInfoDTO.getResourceInfoDTO()).toString());
|
|
|
+ approvalInfo.setId(UUIDUtils.getUUID());
|
|
|
+ ApprovalResourceInfo approvalResourceInfo = buildApprovalResourceInfo(approvalInfoDTO, approvalInfo.getId());
|
|
|
+ //判断是否需要提交
|
|
|
+ if (ApprovalInfoDTO.applyAndCommitStr.equals(approvalInfoDTO.getOperateType())) {
|
|
|
+ //提交,更新申请单的实例ID和当前的任务ID和任务代码
|
|
|
+ logger.info("===开始提交===");
|
|
|
+ //构建申请的taskRequest
|
|
|
+ TaskRequest<ApproveTaskRequestVo> taskRequest = new TaskRequest<>();
|
|
|
+ taskRequest.setData(this.buildTaskRequestVo(approvalInfo));
|
|
|
+ String userId = getCurrentUserId(approvalInfoDTO.getApplicantIdcard());
|
|
|
+ logger.info("===提交的用户是:{}===",userId);
|
|
|
+ ProcessInstanceVO vo = workflowClientFactory.getWorkflowTaskClient().startTaskByCode(approvalInfoDTO.getBusinessCode(),
|
|
|
+ "", taskRequest, userId);
|
|
|
+ approvalInfo.setProcessInstanceId(vo.getProcessInstanceId());
|
|
|
+ //构建流转的taskRequest
|
|
|
+ taskRequest = new TaskRequest<>();
|
|
|
+ this.buildTaskRequest(taskRequest,approvalInfo);
|
|
|
+ boolean sendMessageFlag = true;
|
|
|
+ if(CollectionUtils.isNotEmpty(vo.getTaskRunDetailVos())){
|
|
|
+ for(TaskHistoryDetailVo taskDetailVo: vo.getTaskRunDetailVos()){
|
|
|
+ vo = baseApproveOperate(taskDetailVo.getId(), ApproveWorkFlowOprationEnum.COMPLETE_AGREE, taskRequest, approvalInfo);
|
|
|
+ if(CollectionUtils.isNotEmpty(vo.getTaskRunDetailVos())){
|
|
|
+ sendMessageFlag = false;
|
|
|
+ }
|
|
|
+ logger.info("工作流申请流程:【{}】,taskId:【{}】", JSON.toJSONString(vo),taskDetailVo.getId());
|
|
|
+ }
|
|
|
+ logger.info("===发送消息标志:{}",sendMessageFlag);
|
|
|
+ if(sendMessageFlag){
|
|
|
+ sendApproveResultMessage(vo.getProcessInstanceId(),approvalInfo.getMessageId(),ApproveWorkFlowOprationEnum.COMPLETE_AGREE);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ approvalInfo = this.buildTaskInfoByProcessInstanceId(approvalInfo, vo.getTaskRunDetailVos());
|
|
|
+ logger.info("===保存表单信息====");
|
|
|
+ approvalInfoMapper.insert(approvalInfo);
|
|
|
+ }else {
|
|
|
+ logger.info("===保存表单信息====");
|
|
|
+ approvalInfoMapper.insert(approvalInfo);
|
|
|
+ }
|
|
|
+ approvalResourceInfoMapper.insert(approvalResourceInfo);
|
|
|
+ return ResponseDTO.newInstance(approvalInfo.getProcessInstanceId());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建资源对象
|
|
|
+ * @param approvalInfoDTO
|
|
|
+ * @param approvalInfoId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private ApprovalResourceInfo buildApprovalResourceInfo(ApprovalInfoDTO approvalInfoDTO, String approvalInfoId) {
|
|
|
+ ApprovalResourceInfo approvalResourceInfo = new ApprovalResourceInfo();
|
|
|
+ BeanUtil.copyProperties(approvalInfoDTO.getResourceInfoDTO(),approvalResourceInfo);
|
|
|
+ approvalResourceInfo.setApprovalId(approvalInfoId);
|
|
|
+ return approvalResourceInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建申请表单数据
|
|
|
+ * @param approvalInfoDTO
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private ApprovalInfo buildApprovalInfo(ApprovalInfoDTO approvalInfoDTO) {
|
|
|
+ ApprovalInfo approvalInfo = new ApprovalInfo();
|
|
|
+ BeanUtil.copyProperties(approvalInfoDTO, approvalInfo);
|
|
|
+ approvalInfo.setIsDeleted(YesNoEnum.NO.getValue());
|
|
|
+ approvalInfo.setCreateUser(StringUtils.isNotEmpty(approvalInfoDTO.getApplicantIdcard()) ? approvalInfoDTO.getApplicantIdcard() : getCurrentUserId());
|
|
|
+ approvalInfo.setId(UUIDUtils.getUUID());
|
|
|
+ approvalInfo.setCreateTime(new Date());
|
|
|
+ //流程标题
|
|
|
+ approvalInfo.setProcessTitle(approvalInfo.getProcessName() + "-" + approvalInfo.getApplicantName() + "-" + DateUtils.getTimeStr(approvalInfo.getCreateTime(), DateConst.HYPHEN_DISPLAY_DATE));
|
|
|
+ return approvalInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改
|
|
|
+ * @param approvalInfoUpdateDTO
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseStatus update(ApprovalInfoUpdateDTO approvalInfoUpdateDTO) {
|
|
|
+ ApprovalInfoDTO approvalInfoDTO = new ApprovalInfoDTO();
|
|
|
+ BeanUtils.copyProperties(approvalInfoUpdateDTO, approvalInfoDTO);
|
|
|
+ ApprovalInfo approvalInfo = new ApprovalInfo();
|
|
|
+ String instanceId = approvalInfoDTO.getProcessInstanceId();
|
|
|
+ //判断实例id是否存在,不存在的话,原本为草稿状态
|
|
|
+ if (StringUtils.isEmpty(instanceId)){
|
|
|
+
|
|
|
+ String approvalId = approvalInfoDTO.getId();
|
|
|
+ if(StringUtils.isNotEmpty(approvalId)){
|
|
|
+ logger.info("====删除草稿信息====");
|
|
|
+ //有草稿信息
|
|
|
+ approvalInfoMapper.deleteById(approvalId);
|
|
|
+ //删除资源信息
|
|
|
+ LambdaQueryWrapper<ApprovalResourceInfo> deleteWrapper = new LambdaQueryWrapper<>();
|
|
|
+ deleteWrapper.eq(ApprovalResourceInfo::getApprovalId,approvalId);
|
|
|
+ approvalResourceInfoMapper.delete(deleteWrapper);
|
|
|
+ }
|
|
|
+ return save(approvalInfoDTO);
|
|
|
+ }else {
|
|
|
+ String approvalId = approvalInfoDTO.getId();
|
|
|
+ approvalInfo = approvalInfoMapper.selectById(approvalId);
|
|
|
+ approvalInfo.setApplyReason(approvalInfoDTO.getApplyReason());
|
|
|
+ approvalInfo.setApplyContent(approvalInfoDTO.getApplyContent());
|
|
|
+ approvalInfo.setApplicantPhoneNo(approvalInfoDTO.getApplicantPhoneNo());
|
|
|
+ approvalInfo.setPermissionValidType(approvalInfoDTO.getPermissionValidType());
|
|
|
+ approvalInfo.setStartTime(approvalInfoDTO.getStartTime());
|
|
|
+ approvalInfo.setEndTime(this.parseEndTime(approvalInfoDTO.getEndTime()));
|
|
|
+ approvalInfo.setUpdateTime(approvalInfoDTO.getEndTime());
|
|
|
+ approvalInfo.setUpdateUser(getCurrentUserId());
|
|
|
+ approvalInfo.setApplyContent(JSON.toJSON(approvalInfoDTO.getResourceInfoDTO()).toString());
|
|
|
+ //approvalInfoMapper.updateById(approvalInfo);
|
|
|
+ this.updateApprovalById(approvalInfo);
|
|
|
+ //修改资源表
|
|
|
+ //删除资源信息
|
|
|
+ LambdaQueryWrapper<ApprovalResourceInfo> deleteWrapper = new LambdaQueryWrapper<>();
|
|
|
+ deleteWrapper.eq(ApprovalResourceInfo::getApprovalId,approvalId);
|
|
|
+ approvalResourceInfoMapper.delete(deleteWrapper);
|
|
|
+ ApprovalResourceInfo approvalResourceInfo = buildApprovalResourceInfo(approvalInfoDTO, approvalId);
|
|
|
+ approvalResourceInfoMapper.insert(approvalResourceInfo);
|
|
|
+
|
|
|
+ //判断实例id是否存在,存在的话,原本为非草稿状态
|
|
|
+ //原本为非草稿状态,点击保存并提交,需要
|
|
|
+ if (ApprovalInfoDTO.applyAndCommitStr.equals(approvalInfoDTO.getOperateType())) {
|
|
|
+ List<TaskHistoryDetailVo> list = workflowClientFactory.getWorkflowProcessClient().queryTaskDetailByProcessInstanceId(approvalInfo.getProcessInstanceId());
|
|
|
+ TaskRequest<Map> taskRequest = new TaskRequest<>();
|
|
|
+ this.buildTaskRequest(taskRequest,approvalInfo);
|
|
|
+ boolean sendMessageFlag = true;
|
|
|
+ for(TaskHistoryDetailVo taskDetailVo: list){
|
|
|
+ ProcessInstanceVO vo = baseApproveOperate(taskDetailVo.getId(), ApproveWorkFlowOprationEnum.COMPLETE_AGREE, taskRequest, approvalInfo);
|
|
|
+ if(CollectionUtils.isNotEmpty(vo.getTaskRunDetailVos())){
|
|
|
+ sendMessageFlag = false;
|
|
|
+ }
|
|
|
+ logger.info("工作流申请流程:【{}】,taskId:【{}】", JSON.toJSONString(vo),taskDetailVo.getId());
|
|
|
+ approvalInfo = this.buildTaskInfoByProcessInstanceId(approvalInfo, vo.getTaskRunDetailVos());
|
|
|
+ }
|
|
|
+ logger.info("====发送结果标志:{}",sendMessageFlag);
|
|
|
+ if(sendMessageFlag){
|
|
|
+ sendApproveResultMessage(approvalInfo.getProcessInstanceId(),approvalInfo.getMessageId(),ApproveWorkFlowOprationEnum.COMPLETE_AGREE);
|
|
|
+ }
|
|
|
+ logger.info("===保存表单信息====");
|
|
|
+ //approvalInfoMapper.updateById(approvalInfo);
|
|
|
+ this.updateApprovalById(approvalInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return ResponseDTO.newInstance(approvalInfo.getProcessInstanceId());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断当前登录人是否为科信人员
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Boolean judgeCurrentType(String idCard) {
|
|
|
+ //默认非科信人员
|
|
|
+ Boolean kxPeople = false;
|
|
|
+ //TODO 判断当前登录人是否为科信人员,目前采取配置身份证号验证(按需求要求)
|
|
|
+ String kxList = approveConfig.getKxPeopleList();
|
|
|
+ logger.info("config kxList is :{}",kxList);
|
|
|
+ if(StringUtils.isEmpty(kxList)){
|
|
|
+ return kxPeople;
|
|
|
+ }
|
|
|
+ String[] users = kxList.split(",");
|
|
|
+ for(String user:users){
|
|
|
+ if(idCard.equalsIgnoreCase(user)){
|
|
|
+ kxPeople = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return kxPeople;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建工作流请求体
|
|
|
+ * @param taskRequest
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private TaskRequest buildTaskRequest(TaskRequest taskRequest,ApprovalInfo approvalInfo) {
|
|
|
+ String idCard = "";
|
|
|
+ if(null != approvalInfo && StringUtils.isNotEmpty(approvalInfo.getApplicantIdcard())){
|
|
|
+ idCard = approvalInfo.getApplicantIdcard();
|
|
|
+ }else {
|
|
|
+ idCard = getCurrentUserId();
|
|
|
+ }
|
|
|
+ Boolean kxPeople = judgeCurrentType(idCard);
|
|
|
+ logger.info("====是否为科信人员判断结果:{}",kxPeople);
|
|
|
+ if (taskRequest == null){
|
|
|
+ taskRequest = new TaskRequest();
|
|
|
+ }
|
|
|
+ ApproveTaskRequestVo approveTaskRequestVo = new ApproveTaskRequestVo();
|
|
|
+ approveTaskRequestVo.setKxPeople(kxPeople);
|
|
|
+ if(approvalInfo!=null){
|
|
|
+ approveTaskRequestVo.setBusinessKey(approvalInfo.getId());
|
|
|
+ approveTaskRequestVo.setApplyTitle(approvalInfo.getProcessTitle());
|
|
|
+ approveTaskRequestVo.setApplyContent(approvalInfo.getApplyContent());
|
|
|
+ }
|
|
|
+ approveTaskRequestVo.setBusinessSystem(businessSystem);
|
|
|
+ approveTaskRequestVo.setBusinessType(approvalInfo!=null?approvalInfo.getBusinessCode():businessType);
|
|
|
+ BaseSecurityUser userInfo = ContextUtils.getUserInfo();
|
|
|
+ approveTaskRequestVo.setHandleUser(userInfo == null?getCurrentUserId():userInfo.getIdcard());
|
|
|
+ approveTaskRequestVo.setHandleUserName(userInfo == null?getCurrentUserId():userInfo.getUserName());
|
|
|
+ taskRequest.setData(approveTaskRequestVo);
|
|
|
+ return taskRequest;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 审批操作(审批通过、审批不通过、退回、撤回)
|
|
|
+ *
|
|
|
+ * @param taskId 任务id
|
|
|
+ * @param approveWorkFlowOprationEnum
|
|
|
+ * @param taskRequest
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseStatus approveOperate(String taskId,String processInstanceId, ApproveWorkFlowOprationEnum
|
|
|
+ approveWorkFlowOprationEnum, TaskRequest taskRequest) {
|
|
|
+ ApprovalInfo approvalInfo = null;
|
|
|
+ LambdaQueryWrapper<ApprovalInfo> where = null;
|
|
|
+ if(approvalInfo == null){
|
|
|
+ where = new LambdaQueryWrapper<>();
|
|
|
+ if(StringUtils.isNotEmpty(processInstanceId)){
|
|
|
+ where.eq(ApprovalInfo::getProcessInstanceId,processInstanceId);
|
|
|
+ }else {
|
|
|
+ where.eq(ApprovalInfo::getTaskId,taskId);
|
|
|
+ }
|
|
|
+ approvalInfo = approvalInfoMapper.selectOne(where);
|
|
|
+ }
|
|
|
+ String operateType = approveWorkFlowOprationEnum.getValue();
|
|
|
+ if(operateType.equalsIgnoreCase(ApproveWorkFlowOprationEnum.RECALL.getValue())
|
|
|
+ || operateType.equalsIgnoreCase(ApproveWorkFlowOprationEnum.BACK.getValue())){
|
|
|
+ if(StringUtils.isEmpty(processInstanceId)){
|
|
|
+ return ResponseDTO.fail("退回撤回必须带入流程实例ID");
|
|
|
+ }
|
|
|
+ TaskHistoryDetailVo taskHistoryDetailVo = workflowClientFactory.getWorkflowTaskClient().queryTaskDetail(taskId);
|
|
|
+ boolean isEnable = false;
|
|
|
+ if(operateType.equalsIgnoreCase(ApproveWorkFlowOprationEnum.RECALL.getValue())){
|
|
|
+ isEnable = this.checkOperateOptionOfCurrentStep(taskId,taskHistoryDetailVo.getProcessInstanceId(),taskHistoryDetailVo.getTaskCode(),OperateOptionEnum._BTN_WITH_DRAW_COMMIT);
|
|
|
+ }else {
|
|
|
+ isEnable = this.checkOperateOptionOfCurrentStep(taskId,taskHistoryDetailVo.getProcessInstanceId(),taskHistoryDetailVo.getTaskCode(),OperateOptionEnum._BTN_BACK_COMMIT);
|
|
|
+ }
|
|
|
+ logger.info("=====节点的{}操作权限判断结果为:{}======",operateType,isEnable);
|
|
|
+ /*where = new LambdaQueryWrapper<>();
|
|
|
+ where.eq(ApprovalInfo::getProcessInstanceId,processInstanceId);
|
|
|
+ approvalInfo = approvalInfoMapper.selectOne(where);*/
|
|
|
+ if(!isEnable || approvalInfo.getTaskId().equalsIgnoreCase(endStr)){
|
|
|
+ return ResponseDTO.fail("该节点不支持此项操作");
|
|
|
+ }
|
|
|
+ if(approvalInfo != null){
|
|
|
+ if(StringUtils.isNotEmpty(approvalInfo.getTaskId())){
|
|
|
+ taskId = approvalInfo.getTaskId();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.buildTaskRequest(taskRequest,approvalInfo);
|
|
|
+ ProcessInstanceVO processInstanceVO= baseApproveOperate(taskId,approveWorkFlowOprationEnum,taskRequest, approvalInfo);
|
|
|
+ boolean sendMessageFlag = true;
|
|
|
+ if(CollectionUtils.isNotEmpty(processInstanceVO.getTaskRunDetailVos())){
|
|
|
+ sendMessageFlag = false;
|
|
|
+ }
|
|
|
+ logger.info("====是否发送消息标志位:{}====",sendMessageFlag);
|
|
|
+ if(sendMessageFlag){
|
|
|
+ sendApproveResultMessage(processInstanceVO.getProcessInstanceId(),approvalInfo.getMessageId(),ApproveWorkFlowOprationEnum.COMPLETE_AGREE);
|
|
|
+ }
|
|
|
+ /* where = new LambdaQueryWrapper<>();
|
|
|
+ where.eq(ApprovalInfo::getProcessInstanceId,processInstanceVO.getProcessInstanceId());
|
|
|
+ approvalInfo = approvalInfoMapper.selectOne(where);*/
|
|
|
+ this.buildTaskInfoByProcessInstanceId(approvalInfo, processInstanceVO.getTaskRunDetailVos());
|
|
|
+ logger.info("====当前任务详情:{}====",JSONObject.toJSON(processInstanceVO.getTaskRunDetailVos()));
|
|
|
+ logger.info("====开始更新审批单信息====");
|
|
|
+ this.updateApprovalById(approvalInfo);
|
|
|
+ //approvalInfoMapper.updateById(approvalInfo);
|
|
|
+ return ResponseDTO.success();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 基础提交
|
|
|
+ * @param taskId 任务ID
|
|
|
+ * @param approveWorkFlowOprationEnum 提交类型
|
|
|
+ * @param taskRequest 请求体
|
|
|
+ * @param approvalInfo
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public ProcessInstanceVO baseApproveOperate(String taskId, ApproveWorkFlowOprationEnum
|
|
|
+ approveWorkFlowOprationEnum, TaskRequest taskRequest, ApprovalInfo approvalInfo) {
|
|
|
+ taskRequest = buildTaskRequest(taskRequest,approvalInfo);
|
|
|
+ if (null == taskRequest.getApproveMessage()) {
|
|
|
+ ApproveMessage approveMessage = new ApproveMessage();
|
|
|
+ approveMessage.setApproveState(approveWorkFlowOprationEnum.getValue());
|
|
|
+ approveMessage.setMessage("");
|
|
|
+ taskRequest.setApproveMessage(approveMessage);
|
|
|
+ }
|
|
|
+
|
|
|
+ ProcessInstanceVO vo = null;
|
|
|
+ switch (approveWorkFlowOprationEnum) {
|
|
|
+ case COMPLETE_AGREE:
|
|
|
+ vo = workflowClientFactory.getWorkflowTaskClient().commitTask(taskId, taskRequest, WorkFlowOprationEnum.COMPLETE_AGREE, getCurrentUserId(approvalInfo.getApplicantIdcard()));
|
|
|
+ break;
|
|
|
+ case COMPLETE_DISAGREE:
|
|
|
+ vo = workflowClientFactory.getWorkflowTaskClient().commitTask(taskId, taskRequest, WorkFlowOprationEnum.COMPLETE_DISAGREE, getCurrentUserId(approvalInfo.getApplicantIdcard()));
|
|
|
+ break;
|
|
|
+ case BACK:
|
|
|
+ vo = workflowClientFactory.getWorkflowTaskClient().backTask(taskId,taskRequest, getCurrentUserId(approvalInfo.getApplicantIdcard()));
|
|
|
+ break;
|
|
|
+ case RECALL:
|
|
|
+ vo = workflowClientFactory.getWorkflowTaskClient().recallTask(taskId ,taskRequest, getCurrentUserId(approvalInfo.getApplicantIdcard()));
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 任务转办
|
|
|
+ * @param agentDTO
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void agent(AgentDTO agentDTO) {
|
|
|
+ WorkflowRequestData workflowRequestData = new WorkflowRequestData();
|
|
|
+ ApproveMessage approveMessage = new ApproveMessage();
|
|
|
+ workflowRequestData.setApproveMessage(approveMessage);
|
|
|
+ //转办接口
|
|
|
+ workflowClientFactory.getWorkflowTaskClient().taskOperationAssign(agentDTO.getTaskId(),agentDTO.getAssigneeUser(),getCurrentUserId(),workflowRequestData);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseStatus approveComments(String processInstanceId) {
|
|
|
+ if(StringUtils.isEmpty(processInstanceId) || processInstanceId.equalsIgnoreCase("undefined")){
|
|
|
+ return ResponseDTO.newInstance(new ArrayList<>());
|
|
|
+ }
|
|
|
+ //step1 列出任务操作历史信息
|
|
|
+ HashMap<String, WorkFlowApproveVo> hisTaskMap = this.getProcessPath(processInstanceId);
|
|
|
+ //step2 查询流程的所有节点
|
|
|
+ List<ApproveCommentVo> processDefPath = this.getProcessDefPath(processInstanceId);
|
|
|
+ for(ApproveCommentVo approveCommentVo:processDefPath){
|
|
|
+ WorkFlowApproveVo flowApproveVo = hisTaskMap.get(approveCommentVo.getId());
|
|
|
+ if(flowApproveVo!=null){
|
|
|
+ approveCommentVo.setApproveMessage(flowApproveVo.getApproveMessage());
|
|
|
+ approveCommentVo.setApproveTime(flowApproveVo.getCreateTime());
|
|
|
+ approveCommentVo.setApproveState(flowApproveVo.getApproveState());
|
|
|
+ approveCommentVo.setAssignee(flowApproveVo.getAssigneeName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ResponseDTO.newInstance(processDefPath.stream().sorted(Comparator.comparing(ApproveCommentVo::getSort)).collect(Collectors.toList()));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 流程图信息接口
|
|
|
+ *
|
|
|
+ * @param proInsId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TraceProcessAndOverVo processPic(String proInsId) {
|
|
|
+ TraceProcessAndOverVo traceProcessAndOverVo = workflowClientFactory.getWorkflowProcessClient().queryTraceProcessAndOver(proInsId);
|
|
|
+ return traceProcessAndOverVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取流程图节点详情
|
|
|
+ * @param proInsId
|
|
|
+ * @param statusType
|
|
|
+ * @param taskDefinitionId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ActivityNodeInfoVo processPicDetail(String proInsId, String statusType, String taskDefinitionId) {
|
|
|
+ ActivityNodeInfoVo activityNodeInfoVo = workflowClientFactory.getWorkflowTaskClient().historyDiagramDetail(proInsId, taskDefinitionId, EnumUtil.likeValueOf(StateTypeEnum.class, statusType));
|
|
|
+ return activityNodeInfoVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取流程类型列表
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<ApproveWorkflowProcessTypeVo> queryProcessTypeList() {
|
|
|
+ //根据流程类别code获取流程类别信息
|
|
|
+ WorkflowProcesstypeVo workflowProcesstypeVo = queryProcessType(approveProcessTypeCode);
|
|
|
+ List<ApproveWorkflowProcessTypeVo> result = new ArrayList<>();
|
|
|
+ if (null != workflowProcesstypeVo) {
|
|
|
+ //根据流程类别id查询子类别
|
|
|
+ Searchable searchable = Searchable.newSearchable();
|
|
|
+ searchable.addSearchFilter("upProcess",SearchOperator.eq,workflowProcesstypeVo.getId());
|
|
|
+ List<WorkflowProcesstypeVo> list = workflowClientFactory.getWorkflowProcessDefTypeClient().list(searchable);
|
|
|
+ //循环获取每个子类别下的所有定义流程
|
|
|
+ for (WorkflowProcesstypeVo processtypeVo: list){
|
|
|
+ ApproveWorkflowProcessTypeVo approveWorkflowProcessTypeVo = new ApproveWorkflowProcessTypeVo();
|
|
|
+ BeanUtils.copyProperties(processtypeVo, approveWorkflowProcessTypeVo);
|
|
|
+ searchable = Searchable.newSearchable();
|
|
|
+ searchable.setPage(new PageRequest(0, 999));
|
|
|
+ searchable.addSearchFilter("processType",SearchOperator.eq,processtypeVo.getId());
|
|
|
+ Page<WorkflowProcessVo> processVoPage = workflowClientFactory.getWorkflowProcessClient().queryWorkflowProcessPage(searchable);
|
|
|
+ List<WorkflowProcessVo> activeDataList = new ArrayList<>();
|
|
|
+ for(WorkflowProcessVo workFlowApproveVo:processVoPage.getContent()){
|
|
|
+ if(workFlowApproveVo.getStatus().equalsIgnoreCase("1")){
|
|
|
+ activeDataList.add(workFlowApproveVo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ approveWorkflowProcessTypeVo.setWorkflowProcessVoList(activeDataList);
|
|
|
+ result.add(approveWorkflowProcessTypeVo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取流程类别详情
|
|
|
+ * @param processTypeCode 流程类别code
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public WorkflowProcesstypeVo queryProcessType(String processTypeCode) {
|
|
|
+ //获取流程类别详情
|
|
|
+ return workflowClientFactory.getWorkflowProcessDefTypeClient().findOneByCode(processTypeCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查看代办/已办数量
|
|
|
+ * 已办:finish
|
|
|
+ * 待办:unfinish
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Integer queryApproveQty(Searchable searchable) {
|
|
|
+ Page<TaskHistoryDetailVo> page = workflowClientFactory.getWorkflowTaskClient().queryTaskDetailPageByUserId(searchable, getCurrentUserId());
|
|
|
+ return (int)page.getTotalElements();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取我的请求数量
|
|
|
+ *
|
|
|
+ * @param searchable
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Integer queryMyRequestQty(Searchable searchable) {
|
|
|
+ LambdaQueryWrapper<ApprovalInfo> where = Wrappers.lambdaQuery();
|
|
|
+ where.eq(ApprovalInfo::getCreateUser, getCurrentUserId());
|
|
|
+ return approvalInfoMapper.selectCount(where);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据申请ID删除流程实例
|
|
|
+ *
|
|
|
+ * @param id 申请单ID
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseStatus deleteProcessInstance(String id) {
|
|
|
+ LambdaQueryWrapper<ApprovalInfo> where = new LambdaQueryWrapper<>();
|
|
|
+ where.eq(IdEntity::getId,id);
|
|
|
+ ApprovalInfo approvalInfo = approvalInfoMapper.selectOne(where);
|
|
|
+ approvalInfoMapper.selectList(where);
|
|
|
+ if (approvalInfo == null) {
|
|
|
+ return ResponseDTO.fail("申请单不存在");
|
|
|
+ }
|
|
|
+ if(StringUtils.isNotEmpty(approvalInfo.getTaskId())){
|
|
|
+ if(approvalInfo.getTaskId().equalsIgnoreCase(endStr)){
|
|
|
+ return ResponseDTO.fail("流程已结束,不允许删除");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ boolean callBackEnableFlag = false;
|
|
|
+ //判断是否是草稿状态
|
|
|
+ if(StringUtils.isNotEmpty(approvalInfo.getProcessInstanceId())){
|
|
|
+ /**
|
|
|
+ * 1. 获取当前结点可以操作的类型
|
|
|
+ * 2. 判断是否可以执行撤销操作,若可以执行撤销,否则返回错误信息
|
|
|
+ * 3. 将流程实例信息(审批端)的删除标志置1
|
|
|
+ */
|
|
|
+ String taskIds = approvalInfo.getTaskId();
|
|
|
+ String taskCodes = approvalInfo.getApproveTaskIdentifier();
|
|
|
+ String[] arrTaskId = taskIds.split(",");
|
|
|
+ String[] arrTaskCode = taskCodes.split(",");
|
|
|
+ int index = 0;
|
|
|
+ for(String taskId:arrTaskId){
|
|
|
+ logger.info("====检验当前结点是否支持撤销操作====");
|
|
|
+ callBackEnableFlag = this.checkOperateOptionOfCurrentStep(taskId, approvalInfo.getProcessInstanceId(), arrTaskCode[index++], OperateOptionEnum._BTN_REDO_COMMIT);
|
|
|
+ if(callBackEnableFlag){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //判断并执行撤销操作
|
|
|
+ if(callBackEnableFlag){
|
|
|
+ TaskRequest taskRequest = this.buildTaskRequest(null, approvalInfo);
|
|
|
+ for(String taskId : arrTaskId){
|
|
|
+ //执行流程撤销操作,撤销会删除流程
|
|
|
+ workflowClientFactory.getWorkflowTaskClient().handleTaskForRedo(taskId,getCurrentUserId());
|
|
|
+ //workflowClientFactory.getWorkflowTaskClient().recallTask(taskId ,taskRequest, getCurrentUserId());
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ return ResponseDTO.fail("当前节点不允许删除操作");
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ callBackEnableFlag = true;
|
|
|
+ }
|
|
|
+ if(callBackEnableFlag){
|
|
|
+ //执行逻辑删除
|
|
|
+ LambdaUpdateWrapper<ApprovalInfo> updateWrapper = new LambdaUpdateWrapper<>();
|
|
|
+ updateWrapper.eq(IdEntity::getId,id);
|
|
|
+ updateWrapper.set(ApprovalInfo::getIsDeleted,YesNoEnum.YES.getValue());
|
|
|
+ approvalInfoMapper.update(null,updateWrapper);
|
|
|
+ }
|
|
|
+ return ResponseDTO.success();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 申请详情
|
|
|
+ *
|
|
|
+ * @param id
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseStatus queryApproveDetail(String id) {
|
|
|
+ ApprovalInfo approvalInfo = approvalInfoMapper.selectById(id);
|
|
|
+ if(approvalInfo == null){
|
|
|
+ return ResponseStatus.fail("申请表单不存在");
|
|
|
+ }
|
|
|
+ ApprovalInfoVo approvalInfoVo = new ApprovalInfoVo();
|
|
|
+ BeanUtil.copyProperties(approvalInfo, approvalInfoVo);
|
|
|
+ LambdaQueryWrapper<ApprovalResourceInfo> where = Wrappers.lambdaQuery();
|
|
|
+ where.eq(ApprovalResourceInfo::getApprovalId, approvalInfo.getId());
|
|
|
+ //填充资源信息
|
|
|
+ ApprovalResourceInfo approvalResourceInfo = approvalResourceInfoMapper.selectOne(where);
|
|
|
+ ResourceInfoVo resourceInfoVo = new ResourceInfoVo();
|
|
|
+ BeanUtil.copyProperties(approvalResourceInfo, resourceInfoVo);
|
|
|
+ approvalInfoVo.setResourceInfoVo(resourceInfoVo);
|
|
|
+ return ResponseDTO.newInstance(approvalInfoVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 设置是否显示撤回按钮
|
|
|
+ * @param taskOperateVo
|
|
|
+ * @param taskId
|
|
|
+ * @param processInstanceId
|
|
|
+ */
|
|
|
+ private void appendShowBack(TaskOperateVo taskOperateVo, String taskId, String processInstanceId,OutgoingVo outgoingVo,String pageType) {
|
|
|
+ ApprovalInfo approvalInfo = this.findApprovalInfo(processInstanceId, "");
|
|
|
+ if(approvalInfo.getTaskId().equalsIgnoreCase(endStr)){
|
|
|
+ //流程结束不能撤回
|
|
|
+ taskOperateVo.setShowBack(false);
|
|
|
+ return;
|
|
|
+ }else {
|
|
|
+ String HistoryTaskDefinitionKey = "";
|
|
|
+ if (pageType.equalsIgnoreCase(myRequestPage)) {
|
|
|
+ Map<String, String> out = outgoingVo.getOutgoingTransitions();
|
|
|
+ Set<String> strings = out.keySet();
|
|
|
+ String next = strings.iterator().next();
|
|
|
+ HistoryTaskDefinitionKey = next;
|
|
|
+ }else {
|
|
|
+ TaskHistoryDetailVo currentTask = workflowClientFactory.getWorkflowTaskClient().queryTaskDetail(taskId);
|
|
|
+ HistoryTaskDefinitionKey = currentTask.getTaskDefinitionKey();
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 1. 判断是否为第一个节点,是则不能撤回
|
|
|
+ * 2. 不是第一个节点,且当前流程的上一个节点为撤回人的处理节点,a->b->c->d 只有c能撤回节点才能撤回
|
|
|
+ * 3. 判断当前节点是否有配置撤回的功能
|
|
|
+ */
|
|
|
+ //1.判断是否为第一个节点,是则不能撤回
|
|
|
+ TaskHistoryDetailVo taskHistoryDetailVo = workflowClientFactory.getWorkflowTaskClient().queryTaskDetail(approvalInfo.getTaskId());
|
|
|
+ String taskDefinitionKey = taskHistoryDetailVo.getTaskDefinitionKey();
|
|
|
+ if(outgoingVo.getOutgoingTransitions().containsKey(taskDefinitionKey)){
|
|
|
+ taskOperateVo.setShowBack(false);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ /*//2. 判断节点的位置
|
|
|
+ //step1 列出任务操作历史信息
|
|
|
+ Searchable searchable = Searchable.newSearchable();
|
|
|
+ //暂时未提供不分页查询接口,先定时30条
|
|
|
+ searchable.setPage(0, 30);
|
|
|
+ //task1,task2,同一个节点如果执行了两次
|
|
|
+ Page<WorkFlowApproveVo> vo = workflowClientFactory.getWorkflowProcessClient().queryWorkFlowApprovePage(searchable, processInstanceId);
|
|
|
+ //判断流程的当前节点和
|
|
|
+ if(vo.getContent().size()<1){
|
|
|
+ taskOperateVo.setShowBack(false);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //taskId(已办)是不是所有审批节点的倒数第二个节点
|
|
|
+ int size = vo.getContent().size();
|
|
|
+ if(vo.getContent().get(size-2).getTaskId().equalsIgnoreCase(taskId)){
|
|
|
+ //3. 判断当前节点是否有撤回按钮
|
|
|
+ //boolean back = this.checkOperateOptionOfCurrentStep(taskId, taskHistoryDetailVo.getProcessInstanceId(), taskHistoryDetailVo.getTaskCode(), OperateOptionEnum._BTN_WITH_DRAW_COMMIT);
|
|
|
+ taskOperateVo.setShowBack(true);
|
|
|
+ return;
|
|
|
+ }*/
|
|
|
+ List<ApproveCommentVo> processDefPath = this.getProcessDefPath(processInstanceId);
|
|
|
+ //当前活动节点任务在流程中的位置
|
|
|
+ int currentTaskIndexPosition = 0;
|
|
|
+ //已完成的节点在流程中的位置
|
|
|
+ int finishTaskIndexPosition = 0;
|
|
|
+ //游标
|
|
|
+ int index = 0;
|
|
|
+ for(ApproveCommentVo approveCommentVo:processDefPath){
|
|
|
+ if(approveCommentVo.getId().equalsIgnoreCase(taskDefinitionKey)){
|
|
|
+ finishTaskIndexPosition = index;
|
|
|
+ }
|
|
|
+ if(approveCommentVo.getId().equalsIgnoreCase(HistoryTaskDefinitionKey)){
|
|
|
+ currentTaskIndexPosition = index;
|
|
|
+ }
|
|
|
+ index++;
|
|
|
+ }
|
|
|
+ //已完成的任务节点位置在当前任务节点位置的上一个位置,则可以撤回
|
|
|
+ if((finishTaskIndexPosition) == (currentTaskIndexPosition+1)){
|
|
|
+ taskOperateVo.setShowBack(true);
|
|
|
+ }else {
|
|
|
+ taskOperateVo.setShowBack(false);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseStatus approveStatus(String processInstanceId) {
|
|
|
+ List<ApproveCommentVo> processDefPath = this.getProcessDefPath(processInstanceId);
|
|
|
+ HashMap<String, WorkFlowApproveVo> processPath = this.getProcessPath(processInstanceId);
|
|
|
+ TraceProcessAndOverVo traceProcessAndOverVo = workflowClientFactory.getWorkflowProcessClient().queryTraceProcessAndOver(processInstanceId);
|
|
|
+ List<TarceVo> traceData = traceProcessAndOverVo.getData();
|
|
|
+ Map<String,TarceVo> tarceVoMap = new HashMap<>();
|
|
|
+ for(TarceVo traceVo:traceData){
|
|
|
+ tarceVoMap.put(traceVo.getId(),traceVo);
|
|
|
+ }
|
|
|
+ List<ProcessStatusVo> list = new ArrayList<>();
|
|
|
+ for(ApproveCommentVo approveCommentVo:processDefPath){
|
|
|
+ ProcessStatusVo processStatusVo = new ProcessStatusVo();
|
|
|
+ Set<ProcessStatusDetailVo> taskVos = new HashSet<>();
|
|
|
+ processStatusVo.setNodeName(approveCommentVo.getNodeName());
|
|
|
+ if(processPath.containsKey(approveCommentVo.getId())){
|
|
|
+ ActivityNodeInfoVo activityNodeInfoVo = tarceVoMap.get(approveCommentVo.getId()).getActivityNodeInfoVo();
|
|
|
+ WorkFlowApproveVo workFlowApproveVo = processPath.get(approveCommentVo.getId());
|
|
|
+ ProcessStatusDetailVo detailVo = new ProcessStatusDetailVo();
|
|
|
+ detailVo.setAssignee(workFlowApproveVo.getAssignee());
|
|
|
+ detailVo.setAssigneeName(workFlowApproveVo.getAssigneeName());
|
|
|
+ detailVo.setOperateState(EnumUtils.enumOf(ApproveWorkFlowOprationEnum.class, workFlowApproveVo.getApproveState()).getLabel());
|
|
|
+ detailVo.setReceiveTime(activityNodeInfoVo.getActStartTime());
|
|
|
+ detailVo.setHandleTime(activityNodeInfoVo.getActEndTime());
|
|
|
+ long between = DateUtil.between(activityNodeInfoVo.getActStartTime()==null?new Date():activityNodeInfoVo.getActStartTime(),
|
|
|
+ activityNodeInfoVo.getActEndTime()==null?new Date():activityNodeInfoVo.getActEndTime(), DateUnit.SECOND);
|
|
|
+ long hours = between/3600;
|
|
|
+ long minute = (between-hours*3600)/60;
|
|
|
+ long second = between%60;
|
|
|
+ detailVo.setCostTime(String.format("%d时%d分%d秒",hours,minute,second));
|
|
|
+ taskVos.add(detailVo);
|
|
|
+ }
|
|
|
+ processStatusVo.setTaskVos(taskVos);
|
|
|
+ processStatusVo.setFinishOperatorSummary(taskVos.size());
|
|
|
+ processStatusVo.setOperatorSummary(taskVos.size());
|
|
|
+ processStatusVo.setSort(approveCommentVo.getSort());
|
|
|
+ list.add(processStatusVo);
|
|
|
+ }
|
|
|
+ return ResponseDTO.newInstance(list.stream().sorted(Comparator.comparing(ProcessStatusVo::getSort)).collect(Collectors.toList()));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseStatus queryPoliceList(String userToken, String appToken, int page, int size) {
|
|
|
+ Map<String, Object> paramMap = new HashMap<>();
|
|
|
+ paramMap.put("page",page);
|
|
|
+ paramMap.put("size",size);
|
|
|
+
|
|
|
+ return ResponseDTO.newInstance(dcucHelper.getPoliceList(userToken, appToken, paramMap));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取任务支持的操作对象信息
|
|
|
+ * @param taskId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TaskOperateVo taskOperate(String taskId,String pageType) {
|
|
|
+ TaskOperateVo taskOperateVo = new TaskOperateVo();
|
|
|
+ if (!endStr.equals(taskId)){
|
|
|
+ TaskHistoryDetailVo taskHistoryDetailVo = workflowClientFactory.getWorkflowTaskClient().queryTaskDetail(taskId);
|
|
|
+ //退回
|
|
|
+ boolean recallFlag = this.checkOperateOptionOfCurrentStep(taskId, taskHistoryDetailVo.getProcessInstanceId(), taskHistoryDetailVo.getTaskCode(), OperateOptionEnum._BTN_BACK_COMMIT);
|
|
|
+ taskOperateVo.setShowRecall(recallFlag);
|
|
|
+ //流程出口信息
|
|
|
+ OutgoingVo outgoingVo = workflowClientFactory.getWorkflowTaskClient().queryStartOutgoing(taskHistoryDetailVo.getProcessDefinitionId());
|
|
|
+ //设置是否显示撤回
|
|
|
+ appendShowBack(taskOperateVo, taskId, taskHistoryDetailVo.getProcessInstanceId(),outgoingVo,pageType);
|
|
|
+ //设置是否显示编辑
|
|
|
+ appendShowEdit(taskOperateVo, outgoingVo, taskHistoryDetailVo.getTaskDefinitionKey());
|
|
|
+ }
|
|
|
+ return taskOperateVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断是否为第一个节点,是则允许编辑
|
|
|
+ * @param taskOperateVo
|
|
|
+ * @param outgoingVo
|
|
|
+ * @param taskDefinitionKey
|
|
|
+ */
|
|
|
+ private void appendShowEdit(TaskOperateVo taskOperateVo, OutgoingVo outgoingVo, String taskDefinitionKey) {
|
|
|
+ Boolean showEdit = outgoingVo.getOutgoingTransitions().get(taskDefinitionKey) != null;
|
|
|
+ taskOperateVo.setShowEdit(showEdit);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取当前用户信息
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String getCurrentUserId() {
|
|
|
+ return (null == UserContextUtils.getCurrentUser()) ? "" : UserContextUtils.getCurrentUser().getIdcard();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据当前是否存在登录人来获取当前人员
|
|
|
+ * @param idCard
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String getCurrentUserId(String idCard){
|
|
|
+ BaseSecurityUser currentUser = UserContextUtils.getCurrentUser();
|
|
|
+ if(currentUser == null){
|
|
|
+ return idCard;
|
|
|
+ }else {
|
|
|
+ return currentUser.getIdcard();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 设置我的请求当前结点和未操作者信息
|
|
|
+ *
|
|
|
+ * @param approvalInfo
|
|
|
+ */
|
|
|
+ private ApprovalInfoVo fillTaskInfoToApplyInfo(ApprovalInfo approvalInfo) {
|
|
|
+ ApprovalInfoVo approvalInfoVo = new ApprovalInfoVo();
|
|
|
+ BeanUtil.copyProperties(approvalInfo, approvalInfoVo);
|
|
|
+ try {
|
|
|
+ //查询当前任务详情
|
|
|
+ TaskHistoryDetailVo taskDetailVo = workflowClientFactory.getWorkflowTaskClient().queryTaskDetail(approvalInfo.getTaskId());
|
|
|
+ if (taskDetailVo == null) {
|
|
|
+ return approvalInfoVo;
|
|
|
+ }
|
|
|
+ approvalInfoVo.setTaskId(taskDetailVo.getId());
|
|
|
+ String unOperateUsers = "";
|
|
|
+ //approvalInfoVo.setTaskName(taskDetailVo.getName());
|
|
|
+ //重新设置候选人信息
|
|
|
+ unOperateUsers = this.getUnOperateUsersFromAssiginerMap(taskDetailVo.getCandidateVo());
|
|
|
+ approvalInfoVo.setUnOperateUsers(unOperateUsers);
|
|
|
+ }catch (Exception e){
|
|
|
+ logger.info("调用工作流接口报错,报错信息未:{}", e.getMessage());
|
|
|
+ }
|
|
|
+ return approvalInfoVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据未操作人map获取字符串
|
|
|
+ *
|
|
|
+ * @param candidateVo
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String getUnOperateUsersFromAssiginerMap(CandidateVo candidateVo) {
|
|
|
+ String unOperateUsers = "";
|
|
|
+
|
|
|
+ Map<String, String> result = new HashMap<>();
|
|
|
+ if (candidateVo.getCandidateUsers() != null){
|
|
|
+ result.putAll(candidateVo.getCandidateUsers());
|
|
|
+ }
|
|
|
+ if (candidateVo.getCandidateGroupsOrg() != null){
|
|
|
+ result.putAll(candidateVo.getCandidateGroupsOrg());
|
|
|
+ }
|
|
|
+ if (candidateVo.getCandidateGroups() != null){
|
|
|
+ result.putAll(candidateVo.getCandidateGroups());
|
|
|
+ }
|
|
|
+ if (candidateVo.getAssignee() != null){
|
|
|
+ result.putAll(candidateVo.getAssignee());
|
|
|
+ }
|
|
|
+ Iterator<Map.Entry<String, String>> iterator = result.entrySet().iterator();
|
|
|
+ while (iterator.hasNext()) {
|
|
|
+ unOperateUsers += iterator.next().getValue() + ",";
|
|
|
+ }
|
|
|
+
|
|
|
+ return StringUtils.isNotEmpty(unOperateUsers) ? unOperateUsers.substring(0, unOperateUsers.length() - 1) : unOperateUsers;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 更新当前结点任务
|
|
|
+ * @param approvalInfo
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private ApprovalInfo buildTaskInfoByProcessInstanceId(ApprovalInfo approvalInfo, List<TaskHistoryDetailVo> list){
|
|
|
+ String taskId = "",taskCode = "",taskName = "";
|
|
|
+ if(CollectionUtils.isNotEmpty(list)){
|
|
|
+ for(TaskHistoryDetailVo taskDetailVo : list){
|
|
|
+ taskId += taskDetailVo.getId();
|
|
|
+ if(StringUtils.isNotEmpty(taskDetailVo.getId())){
|
|
|
+ taskId += ",";
|
|
|
+ }
|
|
|
+ taskCode += taskDetailVo.getTaskCode();
|
|
|
+ if(StringUtils.isNotEmpty(taskDetailVo.getTaskCode())){
|
|
|
+ taskCode += ",";
|
|
|
+ }
|
|
|
+ taskName += taskDetailVo.getName();
|
|
|
+ if(StringUtils.isNotEmpty(taskDetailVo.getName())){
|
|
|
+ taskName += ",";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(taskCode.length()>0){
|
|
|
+ taskCode = taskCode.substring(0,taskCode.length()-1);
|
|
|
+ }
|
|
|
+ if(taskName.length()>0){
|
|
|
+ taskName = taskName.substring(0,taskName.length()-1);
|
|
|
+ }
|
|
|
+ if(taskId.length()>0){
|
|
|
+ taskId = taskId.substring(0,taskId.length()-1);
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ taskCode = endStr;
|
|
|
+ taskId = endStr;
|
|
|
+ taskName = "结束";
|
|
|
+ }
|
|
|
+ approvalInfo.setTaskId(taskId);
|
|
|
+ approvalInfo.setTaskName(taskName);
|
|
|
+ approvalInfo.setApproveTaskIdentifier(taskCode);
|
|
|
+ approvalInfo.setUpdateTime(new Date());
|
|
|
+ approvalInfo.setUpdateUser(getCurrentUserId());
|
|
|
+ return approvalInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据任务ID查看当前节点允许的操作类型
|
|
|
+ * @param taskId
|
|
|
+ * @param operateOptionEnum
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public boolean checkOperateOptionOfCurrentStep(String taskId, String processInstanceId, String taskNode, OperateOptionEnum operateOptionEnum){
|
|
|
+ TaskHistoryDetailVo taskDetailVo = workflowClientFactory.getWorkflowTaskClient().queryTaskDetail(taskId);
|
|
|
+ String taskDefinitionKey = taskDetailVo.getTaskDefinitionKey();
|
|
|
+ //根据流程实例ID和任务定义ID返回表单操作类型
|
|
|
+ FromAndOperationVo fromAndOperationVo = workflowClientFactory.getWorkflowProcessClient().queryFormMetadataByProInsId(processInstanceId, taskDefinitionKey,taskNode);
|
|
|
+ List<OperationVo> operation = fromAndOperationVo.getOperation();
|
|
|
+ if(CollectionUtils.isNotEmpty(operation)){
|
|
|
+ for(OperationVo operationVo:operation){
|
|
|
+ if(operationVo.getBtnId().equalsIgnoreCase(operateOptionEnum.getValue())){
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据流程实例完成的节点
|
|
|
+ * @param processInstanceId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private HashMap<String,WorkFlowApproveVo> getProcessPath(String processInstanceId){
|
|
|
+ HashMap<String,WorkFlowApproveVo> hisTaskMap = new HashMap<>();
|
|
|
+ //step1 列出任务操作历史信息
|
|
|
+ Searchable searchable = Searchable.newSearchable();
|
|
|
+ searchable.setPage(0, 30);
|
|
|
+ Page<WorkFlowApproveVo> vo = workflowClientFactory.getWorkflowProcessClient().queryWorkFlowApprovePage(searchable, processInstanceId);
|
|
|
+ List<WorkFlowApproveVo> content = vo.getContent();
|
|
|
+ for(WorkFlowApproveVo workFlowApproveVo:content){
|
|
|
+ String taskKey = workFlowApproveVo.getTaskKey();
|
|
|
+ hisTaskMap.put(taskKey,workFlowApproveVo);
|
|
|
+ }
|
|
|
+ return hisTaskMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据流程实例获取流程的定义任务集合
|
|
|
+ * @param processInstanceId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<ApproveCommentVo> getProcessDefPath(String processInstanceId){
|
|
|
+ TraceProcessAndOverVo traceProcessAndOverVo = workflowClientFactory.getWorkflowProcessClient().queryTraceProcessAndOver(processInstanceId);
|
|
|
+ JSONObject data = JSONObject.parseObject(traceProcessAndOverVo.getJson());
|
|
|
+ JSONArray jsonArray = JSONArray.parseArray(data.getString("nodeDataArray"));
|
|
|
+ List<ApproveCommentVo> approveCommentVos = new ArrayList<>();
|
|
|
+ for(int m=0;m<jsonArray.size();m++){
|
|
|
+ JSONObject nodeData = jsonArray.getJSONObject(m);
|
|
|
+ if(nodeData.getString("category").equalsIgnoreCase("activity")){
|
|
|
+ ApproveCommentVo approveCommentVo = new ApproveCommentVo();
|
|
|
+ approveCommentVo.setNodeName(nodeData.getString("text"));
|
|
|
+ String assignee = nodeData.getString("assignee");
|
|
|
+ approveCommentVo.setAssignee(assignee);
|
|
|
+ approveCommentVo.setId(nodeData.getString("id"));
|
|
|
+ approveCommentVo.setSort(m);
|
|
|
+ approveCommentVos.add(approveCommentVo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return approveCommentVos;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建任务请求VO
|
|
|
+ * @param approvalInfo
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private ApproveTaskRequestVo buildTaskRequestVo(ApprovalInfo approvalInfo){
|
|
|
+ ApproveTaskRequestVo taskRequestVo = new ApproveTaskRequestVo();
|
|
|
+ taskRequestVo.setApplyTitle(approvalInfo.getProcessTitle());
|
|
|
+ taskRequestVo.setApplyContent(approvalInfo.getApplyContent());
|
|
|
+ taskRequestVo.setBusinessId(approvalInfo.getId());
|
|
|
+ taskRequestVo.setBusinessKey(approvalInfo.getId());
|
|
|
+ taskRequestVo.setBusinessSystem(businessSystem);
|
|
|
+ taskRequestVo.setBusinessType(approvalInfo.getBusinessCode());
|
|
|
+ taskRequestVo.setApplyUser(approvalInfo.getApplicantIdcard());
|
|
|
+ taskRequestVo.setApplyUserName(approvalInfo.getApplicantName());
|
|
|
+ return taskRequestVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 审批完成后发送消息
|
|
|
+ * @param approveWorkFlowOprationEnum
|
|
|
+ *
|
|
|
+ */
|
|
|
+ private void sendApproveResultMessage(String processInstanceId,String messageId, ApproveWorkFlowOprationEnum approveWorkFlowOprationEnum){
|
|
|
+ logger.info("====任务结束,开始发送消息====");
|
|
|
+ //流程结束且是同意操作才发消息
|
|
|
+ if(approveWorkFlowOprationEnum.getValue().equalsIgnoreCase(ApproveWorkFlowOprationEnum.COMPLETE_AGREE.getValue())){
|
|
|
+ RequestVo requestVo = new RequestVo();
|
|
|
+ MessageInfoVo messageInfoVo = new MessageInfoVo();
|
|
|
+ Map map = new HashMap();
|
|
|
+ map.put("processInstanceId", processInstanceId);
|
|
|
+ map.put("approveResult",approveWorkFlowOprationEnum.getValue());
|
|
|
+ map.put("messageId",messageId);
|
|
|
+ List<Map<String,String>> infoSet = new ArrayList<>();
|
|
|
+ infoSet.add(map);
|
|
|
+ messageInfoVo.setTitle("审批系统-权限申请审批");
|
|
|
+ messageInfoVo.setCreateTime(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));
|
|
|
+ messageInfoVo.setInfoSet(infoSet);
|
|
|
+ messageInfoVo.setContent(processInstanceId);
|
|
|
+ messageInfoVo.setUserSystem("审批系统");
|
|
|
+ messageInfoVo.setUserSystemCode(businessSystem);
|
|
|
+ messageInfoVo.setUserName("审批系统");
|
|
|
+ messageInfoVo.setMessageId(UUIDUtils.getUUID());
|
|
|
+ messageInfoVo.setInfoType(kafkaConfig.getAuthServiceApplyTopic());
|
|
|
+ List<MessageInfoVo> messageInfoVos = new ArrayList<>();
|
|
|
+ messageInfoVos.add(messageInfoVo);
|
|
|
+ //设置消息
|
|
|
+ requestVo.setMessages(messageInfoVos);
|
|
|
+ requestVo.setTopic(kafkaConfig.getAuthServiceApplyTopic());
|
|
|
+ requestVo.setAppKey(kafkaConfig.getAppKey());
|
|
|
+ requestVo.setAppSecret(kafkaConfig.getAppSecret());
|
|
|
+ logger.info("====kafka开始推送结果,实例ID{}====", processInstanceId);
|
|
|
+ kafkaService.send(requestVo, kafkaConfig.getKafkaServers());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void updateApprovalById(ApprovalInfo approvalInfo){
|
|
|
+ LambdaUpdateWrapper<ApprovalInfo> update = new LambdaUpdateWrapper<>();
|
|
|
+ update.eq(IdEntity::getId,approvalInfo.getId());
|
|
|
+ update.set(ApprovalInfo::getProcessTitle,approvalInfo.getProcessTitle());
|
|
|
+ update.set(ApprovalInfo::getProcessType,approvalInfo.getProcessType());
|
|
|
+ update.set(ApprovalInfo::getProcessTypeName,approvalInfo.getProcessTypeName());
|
|
|
+ update.set(ApprovalInfo::getBusinessCode,approvalInfo.getBusinessCode());
|
|
|
+ update.set(ApprovalInfo::getProcessName,approvalInfo.getProcessName());
|
|
|
+ update.set(ApprovalInfo::getApplyReason,approvalInfo.getApplyReason());
|
|
|
+ update.set(ApprovalInfo::getApplyContent,approvalInfo.getApplyContent());
|
|
|
+ update.set(ApprovalInfo::getApplicantIdcard,approvalInfo.getApplicantIdcard());
|
|
|
+ update.set(ApprovalInfo::getApplicantName,approvalInfo.getApplicantName());
|
|
|
+ update.set(ApprovalInfo::getApplicantOrgCode,approvalInfo.getApplicantOrgCode());
|
|
|
+ update.set(ApprovalInfo::getApplicantOrgName,approvalInfo.getApplicantOrgName());
|
|
|
+ update.set(ApprovalInfo::getApplicantPhoneNo,approvalInfo.getApplicantPhoneNo());
|
|
|
+ update.set(ApprovalInfo::getProcessInstanceId,approvalInfo.getProcessInstanceId());
|
|
|
+ update.set(ApprovalInfo::getApproveTaskIdentifier,approvalInfo.getApproveTaskIdentifier());
|
|
|
+ update.set(ApprovalInfo::getTaskId,approvalInfo.getTaskId());
|
|
|
+ update.set(ApprovalInfo::getTaskName,approvalInfo.getTaskName());
|
|
|
+ update.set(ApprovalInfo::getPermissionValidType,approvalInfo.getPermissionValidType());
|
|
|
+ update.set(ApprovalInfo::getStartTime,approvalInfo.getStartTime());
|
|
|
+ update.set(ApprovalInfo::getEndTime,approvalInfo.getEndTime());
|
|
|
+ update.set(ApprovalInfo::getMessageId,approvalInfo.getMessageId());
|
|
|
+ update.set(ApprovalInfo::getIsDeleted,approvalInfo.getIsDeleted());
|
|
|
+ update.set(ApprovalInfo::getUpdateUser,approvalInfo.getUpdateUser());
|
|
|
+ update.set(ApprovalInfo::getUpdateTime,new Date());
|
|
|
+ approvalInfoMapper.update(approvalInfo,update);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据任务ID或实例ID查询审批单信息
|
|
|
+ * @param processInstanceId
|
|
|
+ * @param taskId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private ApprovalInfo findApprovalInfo(String processInstanceId,String taskId){
|
|
|
+ LambdaQueryWrapper<ApprovalInfo> where = new LambdaQueryWrapper<>();
|
|
|
+ if(StringUtils.isNotEmpty(processInstanceId)){
|
|
|
+ where.eq(ApprovalInfo::getProcessInstanceId,processInstanceId);
|
|
|
+ }
|
|
|
+ if(StringUtils.isNotEmpty(taskId)){
|
|
|
+ where.eq(ApprovalInfo::getTaskId,taskId);
|
|
|
+ }
|
|
|
+ ApprovalInfo approvalInfo = approvalInfoMapper.selectOne(where);
|
|
|
+ return approvalInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换结束时间
|
|
|
+ * @param endTime
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Date parseEndTime(Date endTime){
|
|
|
+ if(endTime!=null){
|
|
|
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ String strEndTime = simpleDateFormat.format(endTime);
|
|
|
+ strEndTime += " 23:59:59";
|
|
|
+ try {
|
|
|
+ simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ endTime = simpleDateFormat.parse(strEndTime);
|
|
|
+ } catch (ParseException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return endTime;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|