Parcourir la source

发送工作通知

tags/24080901
CMM il y a 1 an
Parent
révision
546e8ff166
11 fichiers modifiés avec 265 ajouts et 217 suppressions
  1. +1
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/entity/ProgressNode.java
  2. +35
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/entity/UserInfoVO.java
  3. +22
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/entity/WorkNoticeInfo.java
  4. +2
    -9
      pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/vo/ProcessProgressDetailVo.java
  5. +9
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/vo/ProgressNodeAuditInfoVo.java
  6. +2
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/todocenter/constant/WorkNotice.java
  7. +157
    -168
      pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java
  8. +0
    -13
      pmapi/src/main/java/com/ningdatech/pmapi/todocenter/zwdd/model/MessageContent.java
  9. +0
    -17
      pmapi/src/main/java/com/ningdatech/pmapi/todocenter/zwdd/model/MessageText.java
  10. +2
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/user/service/IUserInfoService.java
  11. +35
    -6
      pmapi/src/main/java/com/ningdatech/pmapi/user/service/impl/UserInfoServiceImpl.java

+ 1
- 1
pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/entity/ProgressNode.java Voir le fichier

@@ -47,7 +47,7 @@ public class ProgressNode {
/**
* 节点相关人员
*/
private OrgUser user;
private UserInfoVO user;
/**
* 该节点动作操作类型
*/


+ 35
- 0
pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/entity/UserInfoVO.java Voir le fichier

@@ -0,0 +1,35 @@
package com.ningdatech.pmapi.todocenter.bean.entity;

import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* 节点用户相关信息
*
* @author CMM
* @since 2023/02/15 14:28
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserInfoVO {

@ApiModelProperty("用户ID")
private Long userId;

@ApiModelProperty("用户真实姓名")
private String realName;

@ApiModelProperty("浙政钉accountId")
private Long accountId;

@ApiModelProperty("用户部门编号")
private String organizationCode;

@ApiModelProperty("用户部门名称")
private String organizationName;
}

+ 22
- 0
pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/entity/WorkNoticeInfo.java Voir le fichier

@@ -0,0 +1,22 @@
package com.ningdatech.pmapi.todocenter.bean.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* 发送工作通知所需信息
*
* @author CMM
* @since 2023/02/15 13:57
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WorkNoticeInfo {
private Long accountId;
private String organizationCode;
private String organizationName;
private String bizMsgId;
private String receiverUserId;
}

+ 2
- 9
pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/vo/ProcessProgressDetailVo.java Voir le fichier

@@ -3,6 +3,7 @@ package com.ningdatech.pmapi.todocenter.bean.vo;

import com.ningdatech.pmapi.projectlib.model.entity.Project;
import com.ningdatech.pmapi.todocenter.bean.entity.ProgressNode;
import com.ningdatech.pmapi.todocenter.bean.entity.UserInfoVO;
import com.ningdatech.pmapi.user.entity.UserInfo;
import com.wflow.workflow.bean.process.OrgUser;
import com.wflow.workflow.bean.process.form.Form;
@@ -62,15 +63,7 @@ public class ProcessProgressDetailVo {
/**
* 发起人
*/
private OrgUser startTempUser;
/**
* 发起人
*/
private UserInfo startUser;
/**
* 发起人部门
*/
private String startDept;
private UserInfoVO startUser;
/**
* 发起时间
*/


+ 9
- 1
pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/vo/ProgressNodeAuditInfoVo.java Voir le fichier

@@ -1,8 +1,10 @@
package com.ningdatech.pmapi.todocenter.bean.vo;

import com.ningdatech.pmapi.todocenter.bean.entity.ProcessComment;
import com.ningdatech.pmapi.todocenter.bean.entity.UserInfoVO;
import com.ningdatech.pmapi.user.entity.UserInfo;
import com.wflow.workflow.bean.process.OrgUser;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -21,15 +23,21 @@ import java.util.Date;
@AllArgsConstructor
@Builder
public class ProgressNodeAuditInfoVo extends ProcessComment {
@ApiModelProperty("评论ID")
private String id;

@ApiModelProperty("评论")
private String type;

@ApiModelProperty("任务ID")
private String taskId;

@ApiModelProperty("评论类型")
private String commentType;

private UserInfo user;
@ApiModelProperty("评论用户信息")
private UserInfoVO user;

@ApiModelProperty("评论时间")
private Date createTime;
}

+ 2
- 1
pmapi/src/main/java/com/ningdatech/pmapi/todocenter/constant/WorkNotice.java Voir le fichier

@@ -7,7 +7,8 @@ package com.ningdatech.pmapi.todocenter.constant;
public interface WorkNotice {
public final String PASS_MSG_TEMPLATE = "标题:审核任务 内容:【%s】的【%s】需要您审核。";
public final String PASS_MSG_TEMPLATE2 = "【%s】已通过【%s】,请及时开始下一步操作。";
public final String PASS_MSG_TEMPLATE3 = "【%s】的【%s】被退回,请及时处理。";
public final String BACK_MSG_TEMPLATE = "【%s】的【%s】被退回,请及时处理。";
public final String REJECT_MSG_TEMPLATE = "【%s】的【%s】被驳回,请及时处理。";


}

+ 157
- 168
pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java Voir le fichier

@@ -2,27 +2,30 @@ package com.ningdatech.pmapi.todocenter.manage;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ningdatech.basic.enumeration.Status;
import com.ningdatech.basic.exception.BizException;
import com.ningdatech.basic.model.PageVo;
import com.ningdatech.basic.util.NdDateUtils;
import com.ningdatech.pmapi.common.constant.DingConstant;
import com.ningdatech.pmapi.common.enumeration.ExportOptionEnum;
import com.ningdatech.pmapi.common.model.entity.ExcelExportWriter;
import com.ningdatech.pmapi.common.statemachine.event.ProjectStatusChangeEvent;
import com.ningdatech.pmapi.common.statemachine.util.StateMachineUtils;
import com.ningdatech.pmapi.common.util.ExcelDownUtil;
import com.ningdatech.pmapi.organization.model.entity.DingEmployeeInfo;
import com.ningdatech.pmapi.organization.model.entity.DingOrganization;
import com.ningdatech.pmapi.organization.service.IDingEmployeeInfoService;
import com.ningdatech.pmapi.organization.service.IDingOrganizationService;
import com.ningdatech.pmapi.projectlib.enumeration.ProjectStatusEnum;
import com.ningdatech.pmapi.projectlib.model.entity.Project;
import com.ningdatech.pmapi.projectlib.service.IProjectService;
import com.ningdatech.pmapi.todocenter.bean.entity.ProcessComment;
import com.ningdatech.pmapi.todocenter.bean.entity.ProgressNode;
import com.ningdatech.pmapi.todocenter.bean.entity.UserInfoVO;
import com.ningdatech.pmapi.todocenter.bean.entity.WorkNoticeInfo;
import com.ningdatech.pmapi.todocenter.bean.vo.ProcessProgressDetailVo;
import com.ningdatech.pmapi.todocenter.bean.vo.ProgressNodeAuditInfoVo;
import com.ningdatech.pmapi.todocenter.constant.HisProInsEndActId;
@@ -34,11 +37,12 @@ import com.ningdatech.pmapi.todocenter.model.dto.req.ReqProcessHandlerDTO;
import com.ningdatech.pmapi.todocenter.model.dto.req.ReqToBeProcessedDTO;
import com.ningdatech.pmapi.todocenter.model.dto.req.ReqToBeProcessedExportDTO;
import com.ningdatech.pmapi.todocenter.model.dto.res.ResToBeProcessedDTO;
import com.ningdatech.pmapi.todocenter.zwdd.model.MessageContent;
import com.ningdatech.pmapi.todocenter.zwdd.model.MessageText;
import com.ningdatech.pmapi.user.entity.NdUserInfo;
import com.ningdatech.pmapi.user.entity.UserInfo;
import com.ningdatech.pmapi.user.service.INdUserInfoService;
import com.ningdatech.pmapi.user.service.IUserInfoService;
import com.ningdatech.zwdd.client.ZwddClient;
import com.sun.org.apache.bcel.internal.generic.NEW;
import com.wflow.bean.do_.UserDo;
import com.wflow.bean.entity.WflowCcTasks;
import com.wflow.bean.entity.WflowModelHistorys;
@@ -83,8 +87,6 @@ import org.flowable.task.service.history.NativeHistoricTaskInstanceQuery;
import org.flowable.variable.api.history.HistoricVariableInstance;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@@ -116,11 +118,12 @@ public class TodoCenterManage {
private final OrgRepositoryService orgRepositoryService;
private final WflowCcTasksMapper ccTasksMapper;
private final ProcessModelService processModelService;
private final IUserInfoService userInfoService;
private final INdUserInfoService userInfoService;
private final IProjectService projectService;
private final StateMachineUtils stateMachineUtils;

private final ZwddClient zwddClient;
private final IDingEmployeeInfoService dingEmployeeInfoService;
private final IDingOrganizationService dingOrganizationService;

/**
* 待办中心待我处理项目列表查询
@@ -366,24 +369,26 @@ public class TodoCenterManage {

Map<String, Object> var = new HashMap<>(16);
var.put("approve_" + task.getId(), param.getAction());

// 保存审核意见
if (hasComment(param.getAuditInfo())) {
// 执行自定义的保存评论的功能
managementService.executeCommand(new SaveCommentCmd(param.getTaskId(), param.getInstanceId(),
String.valueOf(userId), JSONObject.toJSONString(param.getAuditInfo())));
}

// TODO 中止流程并使项目进入对应状态,给项目创建人、流程发起人发送浙政钉工作通知:【项目名称】的【流程名称】被驳回,请及时处理。

// 获取bpm对象
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
// 获取根节点即流程发起节点
FlowNode rootNode = (FlowNode) bpmnModel.getFlowElement("root");

// TODO 中止流程并使项目进入对应状态,给项目创建人、流程发起人发送浙政钉工作通知:【项目名称】的【流程名称】被驳回,请及时处理。
// sendWorkNoticeToStartUser(task, projectName, rootNode);

// TODO 中止流程并使项目进入对应状态,给项目创建人、
// 流程发起人发送浙政钉工作通知:【项目名称】的【流程名称】被驳回,请及时处理。
String startUserId = getRootUserId(rootNode, task.getProcessInstanceId());
// 获取浙政钉用户ID
NdUserInfo auditUserInfo = userInfoService.getById(Long.valueOf(startUserId));
WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo);
WflowModels wflowModels = getLastWflowModels(task);
String formName = wflowModels.getFormName();
String msg = String.format(REJECT_MSG_TEMPLATE, projectName, formName);
zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg);
// 更新项目状态和流程状态
updateRejectProjectStatus(userId, declaredProject);
taskService.complete(param.getTaskId(), var);
@@ -459,7 +464,6 @@ public class TodoCenterManage {

/**
* 审批任务:通过
*
* @param task 当前任务
* @param userId
* @param param 参数
@@ -492,29 +496,25 @@ public class TodoCenterManage {
Task currentTask = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
// 获取审核人信息,向审核人发送工作通知
String currentUserId = currentTask.getAssignee();
UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(currentUserId));
// TODO 获取浙政钉用户dingKey,向其发送浙政钉工作通知
NdUserInfo auditUserInfo = userInfoService.getById(Long.valueOf(currentUserId));
// 获取发送浙政钉工作通知必要信息
WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo);
String msg = String.format(PASS_MSG_TEMPLATE, null, projectName);
// 构建唯一的消息ID
String bizMsgId = "ZB_URGE_NOTICE_" + "_" + auditUserInfo.getDeptId() + "_" + auditUserInfo.getUserId();
String dingKey = "123";
zwddClient.sendWorkNotice(dingKey,bizMsgId,msg);
zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg);
return;
}
// 获取bpm对象
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
// 若不是被退回项目,传节点定义key 获取当前节点
FlowNode currentNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey());

// TODO 若当前流程是预审流程,需要在提交预审申报的时候,调用状态机判断申报后的项目状态,
// 若是省级部门联审中,要对接外部接口,获取省级部门联审的结果,更新项目状态(预审申报提交的时候处理)

// 需要先通过后才能有下一个节点的信息
taskService.complete(param.getTaskId(), var);
String nextUserId = getNextUserId(currentNode, processInstanceId);
// 获取当前项目状态
Integer status = declaredProject.getStatus();
// 若当前登录用户是最后一个审批人,需更新流程状态为审核完成,项目状态到下个状态
// 并向流程发起人发送浙政钉工作通知:【项目名称】已通过【流程名称】,请及时开始下一步操作。
HistoricProcessInstance instance = historyService
.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId)
@@ -537,22 +537,63 @@ public class TodoCenterManage {
throw new IllegalStateException("Unexpected value: " + status);
}
}
// 若有下一个审核人(当前节点的用户),向其发送浙政钉工作通知:标题:审核任务 内容:【单位名称】的【项目名称】需要您审核。
// 若有下一个审核人(当前节点的用户),
// 向其发送浙政钉工作通知:标题:审核任务 内容:【单位名称】的【项目名称】需要您审核。
String nextUserId = getNextUserId(currentNode, processInstanceId);
if (Objects.nonNull(nextUserId)) {
// UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(nextUserId));
// TODO 获取浙政钉用户dingKey,向其发送浙政钉工作通知
// 获取浙政钉用户ID
NdUserInfo auditUserInfo = userInfoService.getById(Long.valueOf(nextUserId));
WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo);
String msg = String.format(PASS_MSG_TEMPLATE, null, projectName);
// sendWorkNotice(auditUserInfo,msg);
zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg);
} else {
// 若没有,向发起人发送浙政钉工作通知:【项目名称】已通过【流程名称】,请及时开始下一步操作。
// TODO 向其发送浙政钉工作通知 获取根节点的孩子节点(即发起人节点),向其发送浙政钉工作通知
// 获取根节点即流程发起节点
// FlowNode rootNode = (FlowNode) bpmnModel.getFlowElement("root");
// sendPassWorkNoticeToStartUser(task, projectName, rootNode);
FlowNode rootNode = (FlowNode) bpmnModel.getFlowElement("root");
String startUserId = getRootUserId(rootNode, task.getProcessInstanceId());
// 获取浙政钉用户ID
NdUserInfo auditUserInfo = userInfoService.getById(Long.valueOf(startUserId));
WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo);
WflowModels wflowModels = getLastWflowModels(task);
String formName = wflowModels.getFormName();
String msg = String.format(PASS_MSG_TEMPLATE2, projectName, formName);
zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg);
}
}

/**
* 获取发送浙政钉工作通知的信息
* @param auditUserInfo
* @return com.ningdatech.pmapi.todocenter.bean.entity.WorkNoticeInfo
* @author CMM
* @since 2023/02/15 14:04
*/
private WorkNoticeInfo getSendWorkNoticeInfo(NdUserInfo auditUserInfo) {
WorkNoticeInfo workNoticeInfo = new WorkNoticeInfo();
Long accountId = auditUserInfo.getAccountId();
if (Objects.isNull(accountId)){
throw new BizException("该用户没有录入浙政钉信息!");
}
workNoticeInfo.setAccountId(accountId);
// 根据浙政钉用户ID获取部门code
DingEmployeeInfo employeeInfo = dingEmployeeInfoService.getOne(Wrappers.lambdaQuery(DingEmployeeInfo.class)
.eq(DingEmployeeInfo::getId, accountId));
String organizationCode = employeeInfo.getOrganizationCode();
workNoticeInfo.setOrganizationCode(organizationCode);
// 根据部门code获取部门名称
DingOrganization dingOrganization = dingOrganizationService.getOne(Wrappers.lambdaQuery(DingOrganization.class)
.eq(DingOrganization::getOrganizationCode, organizationCode));
String organizationName = dingOrganization.getOrganizationName();
workNoticeInfo.setOrganizationName(organizationName);
// 构建唯一的消息ID
String bizMsgId = "ZD_WORK_NOTICE_" + "_" + organizationCode + "_" + organizationName + accountId;
workNoticeInfo.setBizMsgId(bizMsgId);
String receiverUserId = String.valueOf(accountId);
workNoticeInfo.setReceiverUserId(receiverUserId);
return workNoticeInfo;
}
/**
* 当为通过操作时,更新项目表中项目状态
*
* @param userId
@@ -581,26 +622,6 @@ public class TodoCenterManage {
}

/**
* 给流程发起人发送工作通知
*
* @param task 当前任务
* @param projectName 项目名称
* @param rootNode 流程发起节点
* @return void
* @author CMM
* @since 2023/02/03
*/
private void sendPassWorkNoticeToStartUser(Task task, String projectName, FlowNode rootNode) {
String startUserId = getRootUserId(rootNode, task.getProcessInstanceId());
UserInfo startUserInfo = userInfoService.getById(Long.valueOf(startUserId));
// 从历史表获取最新版本的流程
WflowModels wflowModels = getLastWflowModels(task);
String formName = wflowModels.getFormName();
String msg = String.format(PASS_MSG_TEMPLATE2, projectName, formName);
sendWorkNotice(startUserInfo, msg);
}

/**
* 获取流程发起节点的用户ID
*
* @param rootNode 根节点
@@ -631,7 +652,6 @@ public class TodoCenterManage {
return rootUserId;

}

/**
* 获取当前节点的下一个节点的审核用户ID
*
@@ -681,44 +701,6 @@ public class TodoCenterManage {
}

/**
* 发送浙政钉工作通知
*
* @param auditUserInfo 审核人信息
* @param msg 要发送的工作通知
* @return void
* @author CMM
* @since 2023/02/01
*/
private void sendWorkNotice(UserInfo auditUserInfo, String msg) {
// TODO 获取浙政钉唯一标识
// String dingKey = null;
// IntelligentGetClient intelligentGetClient = client.newIntelligentGetClient(DingConstant.WORKING_NOTICE);
// OapiMessageWorkNotificationRequest request = new OapiMessageWorkNotificationRequest();
// // 消息体(参考下文示例消息格式)
// MessageText messageText = new MessageText();
// messageText.setMsgType("text");
// MessageContent messageContent = new MessageContent();
//
// messageContent.setContent(msg);
// messageText.setText(messageContent);
// request.setMsg(JSONUtil.toJsonStr(messageText));
// // 构建唯一的消息ID
// // String bizMsgId = "ZB_URGE_NOTICE_" + "_" + auditUserInfo.getDeptId() + "_" + auditUserInfo.getUserId();
// // request.setBizMsgId(bizMsgId);
// request.setBizMsgId(null);
// // 租户id
// // request.setTenantId(GovDingProperties.tenantId.toString());
// request.setReceiverIds(dingKey);
// // 获取结果
// OapiMessageWorkNotificationResponse apiResult = intelligentGetClient.get(request);
// if (!apiResult.getSuccess() || !JSONUtil.parseObj(apiResult.getContent()).getBool("success")) {
// log.warn("发送工作通知失败: {}", apiResult.getContent());
// throw new BizException(Status.BAD_REQUEST.toString());
// }

}

/**
* 撤销流程处理
*
* @param handledTaskInstance 已处理的历史任务实例
@@ -823,8 +805,6 @@ public class TodoCenterManage {

}
}


/**
* 当为撤回操作时,更新项目表中的项目状态为前一个状态
*
@@ -865,20 +845,18 @@ public class TodoCenterManage {
Project declaredProject = projectService
.getOne(Wrappers.lambdaQuery(Project.class).eq(Project::getInstCode, task.getProcessInstanceId()));
String projectName = declaredProject.getProjectName();

// 保存审核意见
if (hasComment(param.getAuditInfo())) {
// 执行自定义的保存评论的功能
managementService.executeCommand(new SaveCommentCmd(param.getTaskId(), param.getInstanceId(),
String.valueOf(userId), JSONObject.toJSONString(param.getAuditInfo())));
}

// 获取bpm对象
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
// 传节点定义key 获取根节点即流程发起节点
FlowNode rootNode = (FlowNode) bpmnModel.getFlowElement("root");

// TODO 流程变成【被退回】状态,待我处理中,为流程发起人增加一条待办记录,
// 流程变成【被退回】状态,待我处理中,为流程发起人增加一条待办记录,
// 执行自定义回退逻辑,回退到流程发起人
// 注意:因为审核人有执行退回的权限,且是退回到流程发起人,说明是在同一个流程实例中,所以项目状态不需要更新
managementService.executeCommand(new BackToHisApprovalNodeCmd(runtimeService, bpmnModel, param.getTaskId(), rootNode.getId()));
@@ -893,40 +871,26 @@ public class TodoCenterManage {
declaredProject.setUpdateBy(userId);
projectService.updateById(declaredProject);
// TODO 给项目创建人、流程发起人发送浙政钉工作通知:【项目名称】的【流程名称】被退回,请及时处理。
// sendBackWorkNoticeToStartUser(task, projectName, rootNode);

}

/**
* 给流程发起人发送流程退回工作通知
*
* @param task
* @param projectName
* @param rootNode
* @return void
* @author CMM
* @since 2023/02/14 15:32
*/
private void sendBackWorkNoticeToStartUser(Task task, String projectName, FlowNode rootNode) {
String startUserId = getRootUserId(rootNode, task.getProcessInstanceId());
UserInfo startUserInfo = userInfoService.getById(Long.valueOf(startUserId));
// 从历史表获取最新版本的流程
NdUserInfo auditUserInfo = userInfoService.getById(Long.valueOf(startUserId));
WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo);
WflowModels wflowModels = getLastWflowModels(task);
String formName = wflowModels.getFormName();
String msg = String.format(PASS_MSG_TEMPLATE3, projectName, formName);
sendWorkNotice(startUserInfo, msg);
String msg = String.format(BACK_MSG_TEMPLATE, projectName, formName);
zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg);

}

/**
* 查询流程表单数据及审批的进度步骤
*
* @param nodeId 当前获取流程人员关联的流程节点ID
* @param instanceId 流程实例ID
* @return 流程进度及表单详情
*/
public ProcessProgressDetailVo getProcessDetail(String nodeId, String instanceId) {
HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(instanceId).singleResult();
.processInstanceId(instanceId)
.singleResult();
// 取表单及表单数据
HistoricVariableInstance forms = historyService.createHistoricVariableInstanceQuery()
.processInstanceId(instanceId)
@@ -937,7 +901,9 @@ public class TodoCenterManage {
List<HistoricTaskInstance> historicTaskInstances = historyService.createHistoricTaskInstanceQuery().processInstanceId(instanceId).list();
formDatas = historyService
.createHistoricVariableInstanceQuery()
.executionIds(historicTaskInstances.stream().map(HistoricTaskInstance::getExecutionId).collect(Collectors.toSet()))
.executionIds(historicTaskInstances.stream()
.map(HistoricTaskInstance::getExecutionId)
.collect(Collectors.toSet()))
.processInstanceId(instanceId)
.list();
} else {
@@ -953,15 +919,17 @@ public class TodoCenterManage {
ProcessNode<?> currentNode = null;
if (StrUtil.isNotBlank(nodeId)) {
// 搜索当前版本流程的配置
WflowModelHistorys modelHistory = modelHistorysMapper.selectOne(
new QueryWrapper<>(WflowModelHistorys.builder().processDefId(instance.getProcessDefinitionId())
.version(instance.getProcessDefinitionVersion()).build()));
WflowModelHistorys modelHistory = modelHistorysMapper.selectOne(new QueryWrapper<>(WflowModelHistorys.builder()
.processDefId(instance.getProcessDefinitionId())
.version(instance.getProcessDefinitionVersion())
.build()));
currentNode = nodeCatchService.reloadProcessByStr(modelHistory.getProcess()).get(nodeId);
}
UserDo users = orgRepositoryService.getUserById(instance.getStartUserId());
OrgUser startUser =
OrgUser.builder().id(users.getUserId()).name(users.getUserName()).avatar(users.getAvatar()).build();

NdUserInfo userInfo = userInfoService.getById(Long.valueOf(instance.getStartUserId()));
HashSet<String> userSet = new HashSet<>();
userSet.add(String.valueOf(userInfo.getId()));
Map<Long, UserInfoVO> userMap = userInfoService.getUserMapByIds(userSet);
UserInfoVO userInfoVO = userMap.get(userInfo.getId());
List<ProgressNode> taskRecords = getHisTaskRecords(instanceId, nodePropsValue);
// 获取添加抄送任务
taskRecords.addAll(getCcTaskRecords(instanceId));
@@ -969,27 +937,32 @@ public class TodoCenterManage {
// TODO 下版实现 获取等待中且还未开始的任务,如果存在条件则需要直接解析条件
taskRecords.addAll(getFutureTask(instanceId));
}
taskRecords =
taskRecords.stream().sorted(Comparator.comparing(ProgressNode::getStartTime)).collect(Collectors.toList());
taskRecords.add(0,
ProgressNode.builder().nodeId("root").name("提交申请").user(startUser).nodeType(NodeTypeEnum.ROOT)
.startTime(instance.getStartTime()).finishTime(instance.getStartTime()).taskId("root")
.result(ProcessHandlerEnum.PASS).build());
taskRecords = taskRecords.stream()
.sorted(Comparator.comparing(ProgressNode::getStartTime))
.collect(Collectors.toList());
taskRecords.add(0, ProgressNode.builder()
.nodeId("root")
.name("提交申请")
.user(userInfoVO)
.nodeType(NodeTypeEnum.ROOT)
.startTime(instance.getStartTime())
.finishTime(instance.getStartTime())
.taskId("root")
.result(ProcessHandlerEnum.PASS).build());
// 提取全量表单数据
Map<String, Object> formData =
formDatas.stream().filter(CodeUtil.distinctByKey(HistoricVariableInstance::getVariableName)).collect(
Collectors.toMap(HistoricVariableInstance::getVariableName, HistoricVariableInstance::getValue));
HistoricVariableInstance variableInstance = historyService.createHistoricVariableInstanceQuery()
.processInstanceId(instanceId).variableName("owner").singleResult();
ProcessInstanceUserDto owner = (ProcessInstanceUserDto) variableInstance.getValue();
ProcessProgressDetailVo res = ProcessProgressDetailVo.builder().instanceId(instanceId)
Map<String, Object> formData = formDatas.stream()
.filter(CodeUtil.distinctByKey(HistoricVariableInstance::getVariableName))
.collect(Collectors.toMap(HistoricVariableInstance::getVariableName, HistoricVariableInstance::getValue));
ProcessProgressDetailVo res = ProcessProgressDetailVo.builder()
.instanceId(instanceId)
.version(instance.getProcessDefinitionVersion())
.formItems(formService.filterFormAndDataByPermConfig((List<Form>) forms.getValue(), formData, currentNode))
.formData(formData).processDefName(instance.getProcessDefinitionName()).startTempUser(startUser)
.startDept(null == owner ? null : owner.getOrgName()).result(instance.getEndActivityId())
.startTime(instance.getStartTime()).progress(taskRecords).build();
// UserInfo userInfo = userInfoService.getById(Long.valueOf(instance.getStartUserId()));
// res.setStartUser(userInfo);
.formData(formData).processDefName(instance.getProcessDefinitionName())
.result(instance.getEndActivityId())
.startTime(instance.getStartTime())
.progress(taskRecords)
.build();
res.setStartUser(userInfoVO);
if (Objects.isNull(instance.getEndActivityId())) {
res.setStatus(ProcessStatusEnum.UNDER_REVIEW.name());
} else if (HisProInsEndActId.BACK.equals(instance.getEndActivityId())) {
@@ -1011,16 +984,21 @@ public class TodoCenterManage {
*/
private List<ProgressNode> getCcTaskRecords(String instanceId) {
Set<String> ccUsers = new HashSet<>();
List<ProgressNode> ccList = ccTasksMapper
.selectList(new QueryWrapper<WflowCcTasks>().eq("instance_id", instanceId)).stream().map(task -> {
List<ProgressNode> ccList = ccTasksMapper.selectList(new QueryWrapper<WflowCcTasks>()
.eq("instance_id", instanceId))
.stream()
.map(task -> {
ccUsers.add(task.getUserId());
return ProgressNode.builder().nodeId(task.getNodeId()).nodeType(NodeTypeEnum.CC)
.name(task.getNodeName()).user(OrgUser.builder().id(task.getUserId()).build())
.startTime(task.getCreateTime()).finishTime(task.getCreateTime()).build();
.name(task.getNodeName())
.user(UserInfoVO.builder().userId(Long.valueOf(task.getUserId())).build())
.startTime(task.getCreateTime())
.finishTime(task.getCreateTime())
.build();
}).collect(Collectors.toList());
if (isNotEmpty(ccUsers)) {
Map<String, OrgUser> userMap = userDeptOrLeaderService.getUserMapByIds(ccUsers);
ccList.stream().peek(v -> v.setUser(userMap.get(v.getUser().getId()))).collect(Collectors.toList());
Map<Long, UserInfoVO> userMap = userInfoService.getUserMapByIds(ccUsers);
ccList.stream().peek(v -> v.setUser(userMap.get(v.getUser().getUserId()))).collect(Collectors.toList());
}
return ccList;
}
@@ -1037,20 +1015,25 @@ public class TodoCenterManage {
.processInstanceId(instanceId).orderByHistoricActivityInstanceStartTime().asc().list();
Set<String> userSet = new HashSet<>();
// 获取节点处理结果
Map<String,
ProcessHandlerEnum> varMap = historyService.createHistoricVariableInstanceQuery()
.processInstanceId(instanceId).variableNameLike("approve_%").list().stream().collect(
Collectors.toMap(HistoricVariableInstance::getVariableName, v -> (ProcessHandlerEnum) v.getValue()));
Map<String, ProcessHandlerEnum> varMap = historyService.createHistoricVariableInstanceQuery()
.processInstanceId(instanceId)
.variableNameLike("approve_%")
.list().stream()
.collect(Collectors.toMap(HistoricVariableInstance::getVariableName, v -> (ProcessHandlerEnum) v.getValue()));

Map<String, List<ProgressNodeAuditInfoVo>> commentMap = new HashMap<>();
// 统一处理所有评论数据,省的多次查询
List<ProgressNodeAuditInfoVo> cmvos =
taskService.getProcessInstanceComments(instanceId).stream().map(comment -> {
List<ProgressNodeAuditInfoVo> cmvos = taskService.getProcessInstanceComments(instanceId).stream()
.map(comment -> {
userSet.add(comment.getUserId());
ProgressNodeAuditInfoVo progressNodeAuditInfoVo =
ProgressNodeAuditInfoVo.builder().id(comment.getId()).taskId(comment.getTaskId())
.commentType(comment.getType()).type("COMMENT").createTime(comment.getTime())
.user(UserInfo.builder().id(Long.valueOf(comment.getUserId())).build()).build();
ProgressNodeAuditInfoVo progressNodeAuditInfoVo = ProgressNodeAuditInfoVo.builder()
.id(comment.getId())
.taskId(comment.getTaskId())
.commentType(comment.getType())
.type("COMMENT")
.createTime(comment.getTime())
.user(UserInfoVO.builder().userId(Long.valueOf(comment.getUserId())).build())
.build();
ProcessComment processComment = JSONObject.parseObject(comment.getFullMessage(), ProcessComment.class);
progressNodeAuditInfoVo.setText(processComment.getText());
progressNodeAuditInfoVo.setAttachments(processComment.getAttachments());
@@ -1065,23 +1048,29 @@ public class TodoCenterManage {
// 再将评论按照任务一次构建,方便取出
Map<String, ProgressNodeAuditInfoVo> commentsMap =
cmvos.stream().collect(Collectors.toMap(ProgressNodeAuditInfoVo::getTaskId, c -> c));
List<ProgressNode> progressNodes =
list.stream().filter(his -> ObjectUtil.isNotNull(his.getTaskId())).map(his -> {
List<ProgressNode> progressNodes = list.stream().filter(his -> ObjectUtil.isNotNull(his.getTaskId()))
.map(his -> {
Object props = nodeProps.get(his.getActivityId());
ApprovalModeEnum approvalMode = null;
if (props instanceof ApprovalProps) {
approvalMode = ((ApprovalProps) props).getMode();
}
userSet.add(his.getAssignee());
return ProgressNode.builder().nodeId(his.getActivityId()).name(his.getActivityName())
.nodeType(NodeTypeEnum.APPROVAL).user(OrgUser.builder().id(his.getAssignee()).build())
.startTime(his.getStartTime()).finishTime(his.getEndTime()).taskId(his.getTaskId())
.approvalMode(approvalMode).auditInfo(commentsMap.get(his.getTaskId()))
return ProgressNode.builder()
.nodeId(his.getActivityId())
.name(his.getActivityName())
.nodeType(NodeTypeEnum.APPROVAL)
.user(UserInfoVO.builder().userId(Long.valueOf(his.getAssignee())).build())
.startTime(his.getStartTime())
.finishTime(his.getEndTime())
.taskId(his.getTaskId())
.approvalMode(approvalMode)
.auditInfo(commentsMap.get(his.getTaskId()))
.result(varMap.get("approve_" + his.getTaskId())).build();
}).collect(Collectors.toList());
if (isNotEmpty(userSet)) {
Map<String, OrgUser> map = userDeptOrLeaderService.getUserMapByIds(userSet);
progressNodes.forEach(n -> n.setUser(map.get(n.getUser().getId())));
Map<Long, UserInfoVO> userMap = userInfoService.getUserMapByIds(userSet);
progressNodes.stream().peek(v -> v.setUser(userMap.get(v.getUser().getUserId()))).collect(Collectors.toList());
}
return progressNodes;
}


+ 0
- 13
pmapi/src/main/java/com/ningdatech/pmapi/todocenter/zwdd/model/MessageContent.java Voir le fichier

@@ -1,13 +0,0 @@
package com.ningdatech.pmapi.todocenter.zwdd.model;

import lombok.Data;

/**
* 消息内容
* @author CMM
* @since 2023/02/01 14:54
*/
@Data
public class MessageContent {
private String content;
}

+ 0
- 17
pmapi/src/main/java/com/ningdatech/pmapi/todocenter/zwdd/model/MessageText.java Voir le fichier

@@ -1,17 +0,0 @@
package com.ningdatech.pmapi.todocenter.zwdd.model;

import lombok.Data;

/**
* 文本消息
* @author CMM
* @since 2023/02/01 14:53
*/
@Data
public class MessageText {

private String msgType;

private MessageContent text;

}

+ 2
- 1
pmapi/src/main/java/com/ningdatech/pmapi/user/service/IUserInfoService.java Voir le fichier

@@ -1,5 +1,6 @@
package com.ningdatech.pmapi.user.service;

import com.ningdatech.pmapi.todocenter.bean.entity.UserInfoVO;
import com.ningdatech.pmapi.user.entity.UserInfo;
import com.baomidou.mybatisplus.extension.service.IService;

@@ -16,5 +17,5 @@ import java.util.Set;
*/
public interface IUserInfoService extends IService<UserInfo> {

Map<Long, UserInfo> getUserMapByIds(Set<String> staterUsers);
Map<Long, UserInfoVO> getUserMapByIds(Set<String> staterUsers);
}

+ 35
- 6
pmapi/src/main/java/com/ningdatech/pmapi/user/service/impl/UserInfoServiceImpl.java Voir le fichier

@@ -1,5 +1,12 @@
package com.ningdatech.pmapi.user.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ningdatech.basic.exception.BizException;
import com.ningdatech.pmapi.organization.model.entity.DingEmployeeInfo;
import com.ningdatech.pmapi.organization.model.entity.DingOrganization;
import com.ningdatech.pmapi.organization.service.IDingEmployeeInfoService;
import com.ningdatech.pmapi.organization.service.IDingOrganizationService;
import com.ningdatech.pmapi.todocenter.bean.entity.UserInfoVO;
import com.ningdatech.pmapi.user.entity.UserInfo;
import com.ningdatech.pmapi.user.mapper.UserInfoMapper;
import com.ningdatech.pmapi.user.service.IUserInfoService;
@@ -9,10 +16,7 @@ import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;

/**
@@ -27,9 +31,34 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements IUserInfoService {
private final UserInfoMapper userInfoMapper;

private final IDingEmployeeInfoService dingEmployeeInfoService;

private final IDingOrganizationService dingOrganizationService;
@Override
public Map<Long, UserInfo> getUserMapByIds(Set<String> staterUsers) {
public Map<Long, UserInfoVO> getUserMapByIds(Set<String> staterUsers) {
List<UserInfo> userInfos = userInfoMapper.selectBatchIds(staterUsers);
return userInfos.stream().collect(Collectors.toMap(UserInfo::getId,u -> u ));
List<UserInfoVO> resVos = userInfos.stream().map(u -> {
UserInfoVO userInfoVO = new UserInfoVO();
userInfoVO.setUserId(u.getId());
userInfoVO.setRealName(u.getRealName());
userInfoVO.setAccountId(u.getAccountId());
Long accountId = u.getAccountId();
if (Objects.isNull(accountId)){
throw new BizException("该用户没有录入浙政钉用户信息!");
}
// 根据浙政钉用户ID获取部门code
DingEmployeeInfo employeeInfo = dingEmployeeInfoService.getOne(Wrappers.lambdaQuery(DingEmployeeInfo.class)
.eq(DingEmployeeInfo::getId, accountId));
String organizationCode = employeeInfo.getOrganizationCode();
// 根据部门code获取部门名称
DingOrganization dingOrganization = dingOrganizationService.getOne(Wrappers.lambdaQuery(DingOrganization.class)
.eq(DingOrganization::getOrganizationCode, organizationCode));
String organizationName = dingOrganization.getOrganizationName();
userInfoVO.setOrganizationCode(organizationCode);
userInfoVO.setOrganizationName(organizationName);
return userInfoVO;
}).collect(Collectors.toList());
return resVos.stream().collect(Collectors.toMap(UserInfoVO::getUserId, v -> v));
}
}

Chargement…
Annuler
Enregistrer