diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/entity/ProgressNode.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/entity/ProgressNode.java index 8af91ed..2a58ad6 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/entity/ProgressNode.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/entity/ProgressNode.java @@ -47,7 +47,7 @@ public class ProgressNode { /** * 节点相关人员 */ - private OrgUser user; + private UserInfoVO user; /** * 该节点动作操作类型 */ diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/entity/UserInfoVO.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/entity/UserInfoVO.java new file mode 100644 index 0000000..758a220 --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/entity/UserInfoVO.java @@ -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; +} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/entity/WorkNoticeInfo.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/entity/WorkNoticeInfo.java new file mode 100644 index 0000000..af2498e --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/entity/WorkNoticeInfo.java @@ -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; +} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/vo/ProcessProgressDetailVo.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/vo/ProcessProgressDetailVo.java index 4fb8d53..b393858 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/vo/ProcessProgressDetailVo.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/vo/ProcessProgressDetailVo.java @@ -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; /** * 发起时间 */ diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/vo/ProgressNodeAuditInfoVo.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/vo/ProgressNodeAuditInfoVo.java index b1ced2d..c57d5b3 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/vo/ProgressNodeAuditInfoVo.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/bean/vo/ProgressNodeAuditInfoVo.java @@ -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; } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/constant/WorkNotice.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/constant/WorkNotice.java index 5b60ea6..3e63563 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/constant/WorkNotice.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/constant/WorkNotice.java @@ -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】被驳回,请及时处理。"; } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java index 9edf7d4..1aa9cf8 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java @@ -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 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 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 userSet = new HashSet<>(); + userSet.add(String.valueOf(userInfo.getId())); + Map userMap = userInfoService.getUserMapByIds(userSet); + UserInfoVO userInfoVO = userMap.get(userInfo.getId()); List 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 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 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
) 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 getCcTaskRecords(String instanceId) { Set ccUsers = new HashSet<>(); - List ccList = ccTasksMapper - .selectList(new QueryWrapper().eq("instance_id", instanceId)).stream().map(task -> { + List ccList = ccTasksMapper.selectList(new QueryWrapper() + .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 userMap = userDeptOrLeaderService.getUserMapByIds(ccUsers); - ccList.stream().peek(v -> v.setUser(userMap.get(v.getUser().getId()))).collect(Collectors.toList()); + Map 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 userSet = new HashSet<>(); // 获取节点处理结果 - Map varMap = historyService.createHistoricVariableInstanceQuery() - .processInstanceId(instanceId).variableNameLike("approve_%").list().stream().collect( - Collectors.toMap(HistoricVariableInstance::getVariableName, v -> (ProcessHandlerEnum) v.getValue())); + Map varMap = historyService.createHistoricVariableInstanceQuery() + .processInstanceId(instanceId) + .variableNameLike("approve_%") + .list().stream() + .collect(Collectors.toMap(HistoricVariableInstance::getVariableName, v -> (ProcessHandlerEnum) v.getValue())); Map> commentMap = new HashMap<>(); // 统一处理所有评论数据,省的多次查询 - List cmvos = - taskService.getProcessInstanceComments(instanceId).stream().map(comment -> { + List 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 commentsMap = cmvos.stream().collect(Collectors.toMap(ProgressNodeAuditInfoVo::getTaskId, c -> c)); - List progressNodes = - list.stream().filter(his -> ObjectUtil.isNotNull(his.getTaskId())).map(his -> { + List 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 map = userDeptOrLeaderService.getUserMapByIds(userSet); - progressNodes.forEach(n -> n.setUser(map.get(n.getUser().getId()))); + Map userMap = userInfoService.getUserMapByIds(userSet); + progressNodes.stream().peek(v -> v.setUser(userMap.get(v.getUser().getUserId()))).collect(Collectors.toList()); } return progressNodes; } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/zwdd/model/MessageContent.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/zwdd/model/MessageContent.java deleted file mode 100644 index 167ae02..0000000 --- a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/zwdd/model/MessageContent.java +++ /dev/null @@ -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; -} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/zwdd/model/MessageText.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/zwdd/model/MessageText.java deleted file mode 100644 index 4c84252..0000000 --- a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/zwdd/model/MessageText.java +++ /dev/null @@ -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; - -} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/user/service/IUserInfoService.java b/pmapi/src/main/java/com/ningdatech/pmapi/user/service/IUserInfoService.java index f93880c..e8515ba 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/user/service/IUserInfoService.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/user/service/IUserInfoService.java @@ -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 { - Map getUserMapByIds(Set staterUsers); + Map getUserMapByIds(Set staterUsers); } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/user/service/impl/UserInfoServiceImpl.java b/pmapi/src/main/java/com/ningdatech/pmapi/user/service/impl/UserInfoServiceImpl.java index 19ae598..e65976e 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/user/service/impl/UserInfoServiceImpl.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/user/service/impl/UserInfoServiceImpl.java @@ -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 implements IUserInfoService { private final UserInfoMapper userInfoMapper; + + private final IDingEmployeeInfoService dingEmployeeInfoService; + + private final IDingOrganizationService dingOrganizationService; @Override - public Map getUserMapByIds(Set staterUsers) { + public Map getUserMapByIds(Set staterUsers) { List userInfos = userInfoMapper.selectBatchIds(staterUsers); - return userInfos.stream().collect(Collectors.toMap(UserInfo::getId,u -> u )); + List 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)); } }