|
|
@@ -2,16 +2,38 @@ package com.xunmei.core.reminder.service.impl;
|
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.xunmei.common.core.domain.reminder.domain.CoreReminderConfiguration;
|
|
|
import com.xunmei.common.core.domain.reminder.domain.CoreReminderSchedule;
|
|
|
+import com.xunmei.common.core.domain.reminder.dto.ReminderScheduleMsgDto;
|
|
|
+import com.xunmei.common.core.domain.reminder.vo.ReminderScheduleMsgVo;
|
|
|
+import com.xunmei.common.core.enums.BusinessPlanType;
|
|
|
+import com.xunmei.common.core.enums.TimeUnitEnum;
|
|
|
+import com.xunmei.common.core.thread.ThreadPoolConfig;
|
|
|
+import com.xunmei.core.drill.service.ICoreDrillTaskService;
|
|
|
+import com.xunmei.core.edu.service.ICoreEduTrainingTaskService;
|
|
|
import com.xunmei.core.reminder.mapper.CoreReminderScheduleMapper;
|
|
|
+import com.xunmei.core.reminder.service.ICoreReminderConfigurationService;
|
|
|
+import com.xunmei.core.reminder.service.ICoreReminderLogService;
|
|
|
import com.xunmei.core.reminder.service.ICoreReminderScheduleService;
|
|
|
+import com.xunmei.core.resumption.task.ResumptionTaskBusiness;
|
|
|
+import com.xunmei.core.retrieval.service.ICoreMonitoringRetrievalTaskService;
|
|
|
+import com.xunmei.core.safetyCheck.service.ICoreSafetyTaskService;
|
|
|
+import com.xunmei.system.api.RemoteSmsService;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
import org.springframework.context.annotation.Lazy;
|
|
|
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Propagation;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.concurrent.CompletableFuture;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* <p>
|
|
|
@@ -27,6 +49,26 @@ public class CoreReminderScheduleServiceImpl extends ServiceImpl<CoreReminderSch
|
|
|
@Autowired
|
|
|
@Lazy
|
|
|
private ICoreReminderScheduleService scheduleService;
|
|
|
+ @Autowired
|
|
|
+ private ICoreReminderConfigurationService configurationService;
|
|
|
+ @Autowired
|
|
|
+ private ICoreReminderLogService reminderLogService;
|
|
|
+ @Autowired
|
|
|
+ private RemoteSmsService remoteSmsService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ICoreSafetyTaskService safetyTaskService;
|
|
|
+ @Autowired
|
|
|
+ ResumptionTaskBusiness resumptionTaskBusiness;
|
|
|
+ @Autowired
|
|
|
+ ICoreEduTrainingTaskService eduTrainingTaskService;
|
|
|
+ @Autowired
|
|
|
+ ICoreDrillTaskService drillTaskService;
|
|
|
+ @Autowired
|
|
|
+ private ICoreMonitoringRetrievalTaskService iCoreMonitoringRetrievalTaskService;
|
|
|
+ @Autowired
|
|
|
+ @Qualifier(ThreadPoolConfig.SOC_EXECUTOR)
|
|
|
+ private ThreadPoolTaskExecutor threadPoolTaskExecutor;
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@@ -35,7 +77,7 @@ public class CoreReminderScheduleServiceImpl extends ServiceImpl<CoreReminderSch
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
|
|
|
+ @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
|
|
|
public void saveDataBatch(List<CoreReminderSchedule> scheduleList) {
|
|
|
if (ObjectUtil.isNotEmpty(scheduleList)) {
|
|
|
scheduleService.saveBatch(scheduleList);
|
|
|
@@ -44,6 +86,128 @@ public class CoreReminderScheduleServiceImpl extends ServiceImpl<CoreReminderSch
|
|
|
|
|
|
@Override
|
|
|
public List<CoreReminderSchedule> findBySendModule(String sendModule) {
|
|
|
- return lambdaQuery().eq(CoreReminderSchedule::getSendModule,sendModule).list();
|
|
|
+ return lambdaQuery().eq(CoreReminderSchedule::getSendModule, sendModule).list();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void findAndSendMsg() {
|
|
|
+
|
|
|
+ List<CoreReminderSchedule> list = lambdaQuery()
|
|
|
+ .eq(CoreReminderSchedule::getStatus, 0)
|
|
|
+ .le(CoreReminderSchedule::getScheduledTime, LocalDateTime.now())
|
|
|
+ .list();
|
|
|
+
|
|
|
+ Map<String, List<CoreReminderSchedule>> listMap = list.stream().collect(Collectors.groupingBy(CoreReminderSchedule::getSendModule));
|
|
|
+
|
|
|
+ List<ReminderScheduleMsgDto> dtoList = new ArrayList<>();
|
|
|
+
|
|
|
+ List<CoreReminderSchedule> reallyScheduleList = new ArrayList<>();
|
|
|
+ for (CoreReminderSchedule schedule : list) {
|
|
|
+ String sendModule = schedule.getSendModule();
|
|
|
+ BusinessPlanType type = BusinessPlanType.getBusinessPlanType(sendModule);
|
|
|
+ switch (type) {
|
|
|
+ case RESUMPTION:
|
|
|
+ List<CoreReminderSchedule> scheduleList = listMap.get(type.getCode());
|
|
|
+ if (ObjectUtil.isEmpty(scheduleList)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ List<String> allResumptopnIdList = scheduleList.stream().map(CoreReminderSchedule::getTaskId).distinct().collect(Collectors.toList());
|
|
|
+ List<String> exitResumptionIdList = resumptionTaskBusiness.checkTaskExit(allResumptopnIdList);
|
|
|
+ scheduleList.removeIf(schedule1 -> !exitResumptionIdList.contains(schedule1.getTaskId()));
|
|
|
+ reallyScheduleList.addAll(scheduleList);
|
|
|
+ break;
|
|
|
+ case SAFETY_CHECK:
|
|
|
+ List<CoreReminderSchedule> safetyScheduleList = listMap.get(type.getCode());
|
|
|
+ if (ObjectUtil.isEmpty(safetyScheduleList)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ List<String> allSafetyCheckIdList = safetyScheduleList.stream().map(CoreReminderSchedule::getTaskId).distinct().collect(Collectors.toList());
|
|
|
+ List<String> exitSafetyCheckIdList = safetyTaskService.checkTaskExit(allSafetyCheckIdList);
|
|
|
+ safetyScheduleList.removeIf(schedule1 -> !exitSafetyCheckIdList.contains(schedule1.getTaskId()));
|
|
|
+ reallyScheduleList.addAll(safetyScheduleList);
|
|
|
+
|
|
|
+ break;
|
|
|
+ case EDU_TRAINING:
|
|
|
+ List<CoreReminderSchedule> eduScheduleList = listMap.get(type.getCode());
|
|
|
+ if (ObjectUtil.isEmpty(eduScheduleList)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ List<String> allEduTrainingIdList = eduScheduleList.stream().map(CoreReminderSchedule::getTaskId).distinct().collect(Collectors.toList());
|
|
|
+ List<String> exitEduTrainingIdList = eduTrainingTaskService.checkTaskExit(allEduTrainingIdList);
|
|
|
+ eduScheduleList.removeIf(schedule1 -> !exitEduTrainingIdList.contains(schedule1.getTaskId()));
|
|
|
+ reallyScheduleList.addAll(eduScheduleList);
|
|
|
+ break;
|
|
|
+ case DRILL:
|
|
|
+ List<CoreReminderSchedule> drillScheduleList = listMap.get(type.getCode());
|
|
|
+ if (ObjectUtil.isEmpty(drillScheduleList)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ List<String> allDrillIdList = drillScheduleList.stream().map(CoreReminderSchedule::getTaskId).distinct().collect(Collectors.toList());
|
|
|
+ List<String> exitDrillIdList = drillTaskService.checkTaskExit(allDrillIdList);
|
|
|
+ drillScheduleList.removeIf(schedule1 -> !exitDrillIdList.contains(schedule1.getTaskId()));
|
|
|
+ reallyScheduleList.addAll(drillScheduleList);
|
|
|
+ break;
|
|
|
+ case MONITORING_RETRIEVAL:
|
|
|
+ List<CoreReminderSchedule> monitoringScheduleList = listMap.get(type.getCode());
|
|
|
+ if (ObjectUtil.isEmpty(monitoringScheduleList)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ List<String> allMonitoringIdList = monitoringScheduleList.stream().map(CoreReminderSchedule::getTaskId).distinct().collect(Collectors.toList());
|
|
|
+ List<String> exitMonitoringIdList = iCoreMonitoringRetrievalTaskService.checkTaskExit(allMonitoringIdList);
|
|
|
+ monitoringScheduleList.removeIf(schedule1 -> !exitMonitoringIdList.contains(schedule1.getTaskId()));
|
|
|
+ reallyScheduleList.addAll(monitoringScheduleList);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Map<Long, CoreReminderConfiguration> hashmap = new HashMap<>();
|
|
|
+ for (CoreReminderSchedule schedule : reallyScheduleList) {
|
|
|
+ ReminderScheduleMsgDto msgDto = new ReminderScheduleMsgDto();
|
|
|
+ msgDto.setScheduleId(schedule.getScheduleId());
|
|
|
+ msgDto.setPhone(schedule.getRecipient());
|
|
|
+ msgDto.setOrgGuid(schedule.getOrgGuid());
|
|
|
+ msgDto.setMsgContent(getMsgContent(schedule, hashmap));
|
|
|
+ schedule.setMsgContent(msgDto.getMsgContent());
|
|
|
+ dtoList.add(msgDto);
|
|
|
+ }
|
|
|
+ CompletableFuture.runAsync(() -> reminderLogService.writeSendMsgLog(reallyScheduleList), threadPoolTaskExecutor);
|
|
|
+ List<ReminderScheduleMsgVo> sentReminderSms = null;
|
|
|
+ try {
|
|
|
+ sentReminderSms = remoteSmsService.sendReminderSms(dtoList);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("发送任务提醒短信失败", e);
|
|
|
+ }
|
|
|
+ if (sentReminderSms == null || sentReminderSms.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ List<Long> collect = sentReminderSms.stream().map(ReminderScheduleMsgVo::getScheduleId).collect(Collectors.toList());
|
|
|
+ lambdaUpdate()
|
|
|
+ .in(CoreReminderSchedule::getScheduleId, collect)
|
|
|
+ .set(CoreReminderSchedule::getStatus, 2)
|
|
|
+ .update();
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getMsgContent(CoreReminderSchedule schedule, Map<Long, CoreReminderConfiguration> hashmap) {
|
|
|
+ CoreReminderConfiguration configuration = getReminderConfiguration(schedule.getConfigId(), hashmap);
|
|
|
+ StringBuilder sb = new StringBuilder("您有任务" + configuration.getPlanName());
|
|
|
+ if (schedule.getReminderType() == 0) {
|
|
|
+ sb.append("已逾期").append(configuration.getReminderTime()).append(TimeUnitEnum.getTimeUnitEnum(configuration.getTimeUnit()).getName());
|
|
|
+ } else {
|
|
|
+ sb.append("将于").append(configuration.getReminderTime()).append(TimeUnitEnum.getTimeUnitEnum(configuration.getTimeUnit()).getName()).append("开始,请按时完成任务!");
|
|
|
+ }
|
|
|
+ return sb.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ private CoreReminderConfiguration getReminderConfiguration(Long configId, Map<Long, CoreReminderConfiguration> hashmap) {
|
|
|
+ if (hashmap.containsKey(configId)) {
|
|
|
+ return hashmap.get(configId);
|
|
|
+ }
|
|
|
+
|
|
|
+ CoreReminderConfiguration configuration = configurationService.getById(configId);
|
|
|
+ hashmap.put(configId, configuration);
|
|
|
+ return configuration;
|
|
|
}
|
|
|
}
|