消息提醒和待办

master
zhaokai 2026-03-20 09:11:26 +08:00
parent b8e9aa5a3a
commit e411227d44
4 changed files with 127 additions and 11 deletions

View File

@ -49,6 +49,11 @@
<artifactId>web-infrastructure</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>

View File

@ -21,6 +21,9 @@
<groupId>com.zcloud.domain</groupId>
<artifactId>web-infrastructure</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -1,7 +1,12 @@
package com.zcloud.domain.command;
import cn.hutool.json.JSONUtil;
import com.alibaba.cola.dto.SingleResponse;
import com.alibaba.cola.exception.BizException;
import com.jjb.saas.framework.auth.utils.AuthContext;
import com.jjb.saas.message.client.message.facede.MessageFacade;
import com.jjb.saas.message.client.message.request.MessageSendCmd;
import com.jjb.saas.message.client.message.request.MessageTargetCmd;
import com.zcloud.domain.domain.enums.CommonFlagEnum;
import com.zcloud.domain.domain.enums.ScoreStatusEnum;
import com.zcloud.domain.domain.gateway.ProjectTaskScoreInfoGateway;
@ -9,18 +14,27 @@ import com.zcloud.domain.domain.model.CorpInfoE;
import com.zcloud.domain.domain.model.ProjectTaskScoreInfoE;
import com.zcloud.domain.dto.ProjectTaskScoreInfoUpdateCmd;
import com.zcloud.domain.dto.ProjectTaskSetScoreCmd;
import com.zcloud.domain.persistence.dataobject.ProjectTaskGroupUserDO;
import com.zcloud.domain.persistence.dataobject.ProjectTaskScoreInfoDO;
import com.zcloud.domain.persistence.repository.CorpInfoRepository;
import com.zcloud.domain.persistence.repository.ProjectTaskGroupUserRepository;
import com.zcloud.domain.persistence.repository.ProjectTaskRepository;
import com.zcloud.domain.persistence.repository.ProjectTaskScoreInfoRepository;
import com.zcloud.gbscommon.todolistmq.TodoListEventPusherUtil;
import com.zcloud.gbscommon.todolistmq.event.TodoListDeleteEvent;
import com.zcloud.gbscommon.utils.UuidUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@ -31,11 +45,16 @@ import java.util.List;
*/
@Component
@AllArgsConstructor
@Slf4j
public class ProjectTaskScoreInfoUpdateExe {
private final ProjectTaskScoreInfoGateway projectTaskScoreInfoGateway;
private final ProjectTaskScoreInfoRepository projectTaskScoreInfoRepository;
private final ProjectTaskRepository projectTaskRepository;
private final CorpInfoRepository corpInfoRepository;
private final ProjectTaskGroupUserRepository projectTaskGroupUserRepository;
@DubboReference
private final MessageFacade messageFacade;
private final TodoListEventPusherUtil todoListEventPusherUtil;
@Transactional(rollbackFor = Exception.class)
public void execute(ProjectTaskScoreInfoUpdateCmd projectTaskScoreInfoUpdateCmd) {
@ -66,13 +85,14 @@ public class ProjectTaskScoreInfoUpdateExe {
//判断是否所有人都评分完成,如果完成则修改任务状态为完成
List<ProjectTaskScoreInfoDO> listByTaskId = projectTaskScoreInfoRepository.getListByTaskId(info.getProjectTaskId());
Boolean finish = false;
BigDecimal averageScore = null;
if(listByTaskId.size()==listByTaskId.stream().filter(item -> item.getScore() != null).count()){
BigDecimal totalScore = listByTaskId.stream()
.map(ProjectTaskScoreInfoDO::getScore)
.reduce(BigDecimal.ZERO, BigDecimal::add);
// 计算平均分并保留两位小数
BigDecimal averageScore = totalScore.divide(new BigDecimal(listByTaskId.size()),2,RoundingMode.HALF_UP);
averageScore = totalScore.divide(new BigDecimal(listByTaskId.size()),2,RoundingMode.HALF_UP);
projectTaskRepository.updateScoreStatus(info.getProjectTaskId(), ScoreStatusEnum.SCORED.getCode(),averageScore);
finish = true;
@ -80,10 +100,36 @@ public class ProjectTaskScoreInfoUpdateExe {
//修改为评分中
projectTaskRepository.updateScoreStatus(info.getProjectTaskId(), ScoreStatusEnum.SCOREING.getCode(),null);
}
if(finish){
//删除对应待办
TodoListDeleteEvent event2 = new TodoListDeleteEvent();
event2.setForeignSubsidiaryKey(info.getId());// 业务附表ID 没有附表时为foreignKey的值
todoListEventPusherUtil.sendMessageDeleteEvent(event2);
if(finish && averageScore !=null){
//完成后,发送消息通知
List<ProjectTaskGroupUserDO> projectTaskGroupUserDOList = projectTaskGroupUserRepository.getListByTaskId(info.getProjectTaskId());
for (ProjectTaskGroupUserDO projectTaskGroupUserDO : projectTaskGroupUserDOList) {
MessageSendCmd messageSendCmd = new MessageSendCmd();
messageSendCmd.setBusinessId(UuidUtil.get32UUID());
MessageTargetCmd messageTargetCmd = new MessageTargetCmd();
messageTargetCmd.setUserId(projectTaskGroupUserDO.getUserId());
messageSendCmd.setTargetCmd(messageTargetCmd);
messageSendCmd.setSourceCode("");
messageSendCmd.setNeedTokenEnum(false);
Map<String, Object> sendParams = new HashMap<String, Object>();
// sendParams.put("FirefightinglistName", info.getFireCheckName());
// sendParams.put("checkPeriod", info.getFireCheckTypeName());
messageSendCmd.setParams(sendParams);
try{
log.info("评分完成消息提醒发送消息参数:messageSendCmd: {}", JSONUtil.toJsonStr(messageSendCmd));
SingleResponse<Boolean> d = messageFacade.send(messageSendCmd);
log.info("评分完成消息提醒发送消息结果:d: {}", JSONUtil.toJsonStr(d));
}catch (Exception e) {
log.error("评分完成消息提醒发送消息异常:messageSendCmd: {}", JSONUtil.toJsonStr(messageSendCmd), e);
}
}
}
}

View File

@ -1,7 +1,13 @@
package com.zcloud.domain.command;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.cola.dto.SingleResponse;
import com.alibaba.cola.exception.BizException;
import com.alibaba.fastjson.JSONObject;
import com.jjb.saas.message.client.message.facede.MessageFacade;
import com.jjb.saas.message.client.message.request.MessageSendCmd;
import com.jjb.saas.message.client.message.request.MessageTargetCmd;
import com.zcloud.domain.command.convertor.ProjectTaskGroupUserCoConvertor;
import com.zcloud.domain.command.convertor.ProjectTaskInfoCoConvertor;
import com.zcloud.domain.command.convertor.ProjectTaskScoreInfoCoConvertor;
@ -17,18 +23,20 @@ import com.zcloud.domain.persistence.dataobject.ProjectTaskDO;
import com.zcloud.domain.persistence.dataobject.ProjectTaskGroupUserDO;
import com.zcloud.domain.persistence.dataobject.ProjectTaskInfoDO;
import com.zcloud.domain.persistence.dataobject.ProjectTaskScoreInfoDO;
import com.zcloud.domain.persistence.repository.ProjectTaskGroupUserRepository;
import com.zcloud.domain.persistence.repository.ProjectTaskInfoRepository;
import com.zcloud.domain.persistence.repository.ProjectTaskRepository;
import com.zcloud.domain.persistence.repository.ProjectTaskScoreInfoRepository;
import com.zcloud.domain.persistence.repository.*;
import com.zcloud.gbscommon.todolistmq.TodoListEventPusherUtil;
import com.zcloud.gbscommon.todolistmq.event.TodoListAddBatchEvent;
import com.zcloud.gbscommon.todolistmq.event.TodoListAddEvent;
import com.zcloud.gbscommon.utils.Tools;
import com.zcloud.gbscommon.utils.UuidUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
@ -40,6 +48,7 @@ import java.util.stream.Collectors;
*/
@Component
@AllArgsConstructor
@Slf4j
public class ProjectTaskUpdateExe {
private final ProjectTaskGateway projectTaskGateway;
private final ProjectTaskRepository projectTaskRepository;
@ -49,6 +58,9 @@ public class ProjectTaskUpdateExe {
private final ProjectTaskInfoRepository projectTaskInfoRepository;
private final ProjectTaskScoreInfoRepository projectTaskScoreInfoRepository;
private final ProjectTaskScoreInfoCoConvertor projectTaskScoreInfoCoConvertor;
private final TodoListEventPusherUtil todoListEventPusherUtil;
@DubboReference
private MessageFacade messageFacade;
@Transactional(rollbackFor = Exception.class)
public void execute(ProjectTaskUpdateCmd projectTaskUpdateCmd) {
@ -155,13 +167,63 @@ public class ProjectTaskUpdateExe {
//评分状态
List<ProjectTaskDO> projectTaskDOExecutingList =projectTaskRepository.getExecutingList();
if(CollUtil.isNotEmpty(projectTaskDOExecutingList)){
projectTaskDOExecutingList.forEach(info->{
info.setExecuteStatus(ProjectTaskExecuteStatusEnum.FINISHED.getCode());
});
List<Long> idFinishedList = projectTaskDOExecutingList.stream().map(ProjectTaskDO::getId).collect(Collectors.toList());
projectTaskRepository.updateExecuteStatusBatchById(ProjectTaskExecuteStatusEnum.FINISHED.getCode(),idFinishedList);
//每一个都需要 消息提醒和待办
for (ProjectTaskDO projectTaskDO : projectTaskDOExecutingList) {
try{
List<TodoListAddEvent> todoListAddEventList = new ArrayList<>();
List<ProjectTaskScoreInfoDO> projectTaskScoreInfoDOList = projectTaskScoreInfoRepository.getListByTaskId(projectTaskDO.getProjectTaskId());
for (ProjectTaskScoreInfoDO projectTaskScoreInfoDO : projectTaskScoreInfoDOList) {
//发送消息
MessageSendCmd messageSendCmd = new MessageSendCmd();
messageSendCmd.setBusinessId(UuidUtil.get32UUID());
MessageTargetCmd messageTargetCmd = new MessageTargetCmd();
messageTargetCmd.setUserId(projectTaskScoreInfoDO.getUserId());
messageSendCmd.setTargetCmd(messageTargetCmd);
messageSendCmd.setSourceCode("");
messageSendCmd.setNeedTokenEnum(false);
Map<String, Object> sendParams = new HashMap<String, Object>();
// sendParams.put("FirefightinglistName", info.getFireCheckName());
// sendParams.put("checkPeriod", info.getFireCheckTypeName());
messageSendCmd.setParams(sendParams);
try{
log.info("任务结束消息提醒发送消息参数:messageSendCmd: {}", JSONUtil.toJsonStr(messageSendCmd));
SingleResponse<Boolean> d = messageFacade.send(messageSendCmd);
log.info("任务结束消息提醒发送消息结果:d: {}", JSONUtil.toJsonStr(d));
}catch (Exception e) {
log.error("任务结束消息提醒发送消息异常:messageSendCmd: {}", JSONUtil.toJsonStr(messageSendCmd), e);
}
//待排查 待办
TodoListAddEvent event = new TodoListAddEvent();
event.setTitle(projectTaskScoreInfoDO.getUserName() + "-课题评分");
// event.setContent("您有一条[" + cmd.getFireCheckName() + "(" + cmd.getFireCheckTypeName() + ")】待检查,请您及时排查,避免超期。");
event.setContent("["+projectTaskDO.getProjectName()+"]已结束,请及时对本次课题任务进行评分");
event.setForeignKey(projectTaskDO.getId()); // 业务表ID -申请
event.setForeignSubsidiaryKey(projectTaskScoreInfoDO.getId()); // 业务附表ID 没有附表时为foreignKey的值
event.setReceiveUser(projectTaskScoreInfoDO.getUserId());// user表ID
event.setPcFlag(1); // 是否PC端待办 1是 0否
event.setAppFlag(1); // 是否APP端待办 1是 0否
event.setOtherParams(new JSONObject());
todoListAddEventList.add(event);
}
TodoListAddBatchEvent event3 = new TodoListAddBatchEvent();
event3.setTodoListAddEventList(todoListAddEventList);
todoListEventPusherUtil.sendMessageAddBatchEvent(event3);
}catch (Exception e){
log.error("发送待办消息失败",e);
}
}
}