Эх сурвалжийг харах

短信提醒业务代码提交

jingyuanchao 1 жил өмнө
parent
commit
b50987abd9

+ 20 - 3
project_data/sql/0.0.8/soc/soc.sql

@@ -50,6 +50,11 @@ create table if not exists core_reminder_schedule(
     schedule_id    bigint        not null comment '任务ID'
         primary key,
     config_id      bigint        not null comment '关联的提醒配置ID',
+    reminder_type  int           null comment '提醒类型(0:逾期提醒、1:临期提醒)',
+    send_module    varchar(36)   null comment '发送模块',
+    task_id        varchar(125)  null comment '任务id',
+    task_name      varchar(225)  null comment '任务名称',
+    recipient_name varchar(125)  not null comment '目标接收者名称',
     recipient      varchar(50)   not null comment '目标接收者(手机号码或用户ID)',
     scheduled_time datetime      null comment '计划发送时间',
     status         varchar(20)   not null comment '任务状态(未发送、已发送、发送失败等)',
@@ -71,10 +76,22 @@ create table if not exists core_reminder_template(
 
 
 -- 新增短信提醒配置菜单
-delete from sys_menu where id = 1778733750137446402;
-INSERT INTO sys_menu (id,menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, platform_type, icon, image_path, create_by, create_time, update_by, update_time, remark) VALUES (1778733750137446402,'短信提醒配置', 1, 50, 'reminder', 'core/reminder/index', null, 1, 0, 'C', '0', '0', 'system:reminder:list', '1', 'email', null, null, now(), null, now(), null);
-DELETE from sys_role_menu WHERE menu_id in (1778733750137446402);
+delete from sys_menu where id in (1778733750137446402,1780414461203460097,1780414537732730882,1780414574810378241,1780414761414963201,1780414968466780162);
+DELETE from sys_role_menu WHERE menu_id in (1778733750137446402,1780414461203460097,1780414537732730882,1780414574810378241,1780414761414963201,1780414968466780162);
+INSERT INTO sys_menu (id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, platform_type, icon, image_path, create_by, create_time, update_by, update_time, remark) VALUES (1778733750137446402,'短信提醒配置', 1, 50, 'reminder', 'core/reminder/index', null, 1, 0, 'C', '0', '0', 'system:reminder:list', '1', 'email', null, null, now(), null, now(), null);
+INSERT INTO sys_menu (id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, platform_type, icon, image_path, create_by, create_time, update_by, update_time, remark) VALUES (1780414461203460097, '查询短信提醒配置', 1778733750137446402, 0, '', null, null, 1, 0, 'F', '0', '0', 'core:reminder:list', '1', null, null, '超级管理员', '2024-04-17 09:55:07', '', null, '');
+INSERT INTO sys_menu (id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, platform_type, icon, image_path, create_by, create_time, update_by, update_time, remark) VALUES (1780414537732730882, '新增短信提醒配置', 1778733750137446402, 1, '', null, null, 1, 0, 'F', '0', '0', 'core:reminder:edit', '1', null, null, '超级管理员', '2024-04-17 09:55:26', '', null, '');
+INSERT INTO sys_menu (id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, platform_type, icon, image_path, create_by, create_time, update_by, update_time, remark) VALUES (1780414574810378241, '编辑短信提醒配置', 1778733750137446402, 2, '', null, null, 1, 0, 'F', '0', '0', 'core:reminder:edit', '1', null, null, '超级管理员', '2024-04-17 09:55:35', '', null, '');
+INSERT INTO sys_menu (id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, platform_type, icon, image_path, create_by, create_time, update_by, update_time, remark) VALUES (1780414761414963201, '查看短信提醒配置', 1778733750137446402, 3, '', null, null, 1, 0, 'F', '0', '0', 'core:reminder:detail', '1', null, null, '超级管理员', '2024-04-17 09:56:19', '', null, '');
+INSERT INTO sys_menu (id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, platform_type, icon, image_path, create_by, create_time, update_by, update_time, remark) VALUES (1780414968466780162, '删除短信提醒配置', 1778733750137446402, 4, '', null, null, 1, 0, 'F', '0', '0', 'core:reminder:remove', '1', null, null, '超级管理员', '2024-04-17 09:57:08', '', null, '');
 INSERT into sys_role_menu SELECT id ,1778733750137446402 from sys_role WHERE sys_role.org_type in(1,3);
+INSERT into sys_role_menu SELECT id ,1780414461203460097 from sys_role WHERE sys_role.org_type in(1,3);
+INSERT into sys_role_menu SELECT id ,1780414537732730882 from sys_role WHERE sys_role.org_type in(1,3);
+INSERT into sys_role_menu SELECT id ,1780414574810378241 from sys_role WHERE sys_role.org_type in(1,3);
+INSERT into sys_role_menu SELECT id ,1780414761414963201 from sys_role WHERE sys_role.org_type in(1,3);
+INSERT into sys_role_menu SELECT id ,1780414968466780162 from sys_role WHERE sys_role.org_type in(1,3);
+
+
 
 -- 新增提醒类型字典
 delete from sys_dict_type where dict_type = 'reminder_type';

+ 23 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/reminder/domain/CoreReminderSchedule.java

@@ -35,6 +35,29 @@ public class CoreReminderSchedule implements Serializable {
     @TableField("config_id")
     private Long configId;
 
+    @ApiModelProperty(value = "提醒类型(0:逾期提醒、1:临期提醒)")
+    @TableField("reminder_type")
+    private Integer reminderType;
+
+    /**
+     * @see com.xunmei.common.core.enums.BusinessPlanType
+     */
+    @ApiModelProperty(value = "发送模块")
+    @TableField("send_module")
+    private String sendModule;
+
+    @ApiModelProperty(value = "任务id")
+    @TableField("task_id")
+    private String taskId;
+
+    @ApiModelProperty(value = "任务名称")
+    @TableField("task_name")
+    private String taskName;
+
+    @ApiModelProperty(value = "目标接收者名称")
+    @TableField("recipient_name")
+    private String recipientName;
+
     @ApiModelProperty(value = "目标接收者(手机号码或用户ID)")
     @TableField("recipient")
     private String recipient;

+ 4 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/reminder/dto/CoreReminderUserQueryDto.java

@@ -1,13 +1,17 @@
 package com.xunmei.common.core.domain.reminder.dto;
 
 
+import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.util.List;
 
 @Data
 @Builder
+@AllArgsConstructor
+@NoArgsConstructor
 public class CoreReminderUserQueryDto {
 
     private List<Long> orgIdList;

+ 48 - 25
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/access/service/impl/TMonitoringRetrievalPlanServiceImpl.java

@@ -46,6 +46,7 @@ import com.xunmei.core.compense.dto.CompensateDto;
 import com.xunmei.core.compense.interfaces.CompensateService;
 import com.xunmei.core.registerbook.service.ICoreRegisterBookPdfService;
 import com.xunmei.core.reminder.service.ICoreReminderConfigurationService;
+import com.xunmei.core.reminder.service.ICoreReminderScheduleService;
 import com.xunmei.core.retrieval.mapper.CoreMonitoringRetrievalTaskMapper;
 import com.xunmei.core.retrieval.service.ICoreMonitoringRetrievalTaskBuilderService;
 import com.xunmei.core.retrieval.service.ICoreMonitoringRetrievalTaskService;
@@ -124,7 +125,8 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
     @Autowired
     @Lazy
     private ICoreReminderConfigurationService reminderConfigurationService;
-
+    @Autowired
+    ICoreReminderScheduleService reminderScheduleService;
     @Override
     public TableDataInfo selectPage(TMonitoringRetrievalPlan tMonitoringRetrievalPlan) {
         //未删除
@@ -1780,8 +1782,10 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
 
     @Override
     public List<CoreReminderSchedule> findTaskAndBuildReminderSchedule(List<CoreReminderConfigurationFullVo> configurationList) {
+        List<CoreReminderSchedule> exitTaskList = reminderScheduleService.findBySendModule(BusinessPlanType.MONITORING_RETRIEVAL.getCode());
         List<CoreReminderSchedule> scheduleArrayList = new ArrayList<>();
         for (CoreReminderConfigurationFullVo configuration : configurationList) {
+            List<CoreReminderSchedule> exitTaskBySendModule = exitTaskList.stream().filter(r -> ObjectUtil.equal(r.getSendModule(), configuration.getSendModule())).collect(Collectors.toList());
             Long planId = configuration.getPlanId();
             //此计划可能是省联社或者行社创建的父计划
             TMonitoringRetrievalPlan plan = getById(planId);
@@ -1809,21 +1813,20 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
 
                 list = iCoreMonitoringRetrievalTaskService.selectTaskByHsPlanIdList(allHsPlanIdList, startTime, endTime);
 
-                if (ObjectUtil.isEmpty(list)) {
-                    continue;
-                }
-                continue;
-            }
-            //走到此处说明计划是行社创建的
-            Date startTime = DateUtil.beginOfDay(new Date());
-            Date endTime = DateUtil.endOfDay(new Date());
-            if (CycleCommonEnum.NONE.getCode().equals(plan.getPlanCycle())) {
+
+            } else {
+                //走到此处说明计划是行社创建的
                 CycleCommonEnum commonEnum = CycleCommonEnum.getEnum(Integer.parseInt(plan.getPlanCycle()));
                 DateRange startAndEnd = DateUtils.getStartAndEnd(new Date(), commonEnum);
-                startTime = startAndEnd.getStartTime();
-                endTime = startAndEnd.getEndTime();
+                Date startTime = startAndEnd.getStartTime();
+                Date endTime = startAndEnd.getEndTime();
+                if (CycleCommonEnum.NONE.getCode().equals(plan.getPlanCycle())) {
+                    startTime = DateUtil.beginOfDay(new Date());
+                    endTime = DateUtil.endOfDay(new Date());
+                }
+                list = iCoreMonitoringRetrievalTaskService.selectTaskByHsPlanIdList(Lists.newArrayList(plan.getId()), startTime, endTime);
             }
-            list = iCoreMonitoringRetrievalTaskService.selectTaskByHsPlanIdList(Lists.newArrayList(plan.getId()), startTime, endTime);
+
             if (ObjectUtil.isEmpty(list)) {
                 continue;
             }
@@ -1831,23 +1834,43 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
             if (ObjectUtil.isEmpty(notificationUser)) {
                 continue;
             }
+            List<SysOrgVO> cacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
             Map<Long, List<SysUser>> userMap = notificationUser.stream().collect(Collectors.groupingBy(SysUser::getOrgId));
+            for (Map.Entry<Long, List<SysUser>> userEntry : userMap.entrySet()) {
+                Long orgId = userEntry.getKey();
+                List<SysUser> userList = userEntry.getValue();
+                Optional<SysOrgVO> first = cacheList.stream().filter(org -> org.getId().equals(orgId)).findFirst();
+                if (!first.isPresent()){
+                    continue;
+                }
+                String path = first.get().getPath();
+                List<CoreMonitoringRetrievalTask> taskList = list.stream().filter(task -> task.getOrgPath().contains(path)).collect(Collectors.toList());
 
-            for (CoreMonitoringRetrievalTask task : list) {
-                List<SysUser> userList = userMap.get(task.getOrgId());
-                if (ObjectUtil.isEmpty(userList)) {
+                if (ObjectUtil.isEmpty(taskList)) {
                     continue;
                 }
                 for (SysUser sysUser : userList) {
-                    //找到每个任务的提醒时间
-                    Date notificationTime = reminderConfigurationService.getNotificationTime(task.getPlanStartTime(), task.getPlanEndTime(), configuration);
-                    CoreReminderSchedule schedule = new CoreReminderSchedule();
-                    schedule.setConfigId(configuration.getConfigId());
-                    schedule.setScheduledTime(DateUtils.toLocalDateTime(notificationTime));
-                    schedule.setStatus(0);
-                    schedule.setRecipient(sysUser.getPhone());
-                    schedule.setScheduleId(IdWorker.getId());
-                    scheduleArrayList.add(schedule);
+                    for (CoreMonitoringRetrievalTask task : taskList) {
+                        boolean exit = exitTaskBySendModule.stream().anyMatch(t -> ObjectUtil.equal(t.getTaskId(),  String.valueOf(task.getId())));
+                        if (exit){
+                            //说明任务已经存在短信提醒任务
+                            continue;
+                        }
+                        //找到每个任务的提醒时间
+                        Date notificationTime = reminderConfigurationService.getNotificationTime(task.getPlanStartTime(), task.getPlanEndTime(), configuration);
+                        CoreReminderSchedule schedule = new CoreReminderSchedule();
+                        schedule.setConfigId(configuration.getConfigId());
+                        schedule.setReminderType(configuration.getReminderType());
+                        schedule.setSendModule(configuration.getSendModule());
+                        schedule.setTaskId(task.getId().toString());
+                        schedule.setTaskName(task.getTaskName());
+                        schedule.setScheduledTime(DateUtils.toLocalDateTime(notificationTime));
+                        schedule.setStatus(0);
+                        schedule.setRecipientName(sysUser.getName());
+                        schedule.setRecipient(sysUser.getPhone());
+                        schedule.setScheduleId(IdWorker.getId());
+                        scheduleArrayList.add(schedule);
+                    }
                 }
             }
 

+ 56 - 34
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/impl/CoreDrillPlanServiceImpl.java

@@ -56,6 +56,7 @@ import com.xunmei.core.drill.service.ICoreDrillPlanToRoleService;
 import com.xunmei.core.drill.service.ICoreDrillTaskService;
 import com.xunmei.core.registerbook.service.ICoreRegisterBookPdfService;
 import com.xunmei.core.reminder.service.ICoreReminderConfigurationService;
+import com.xunmei.core.reminder.service.ICoreReminderScheduleService;
 import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.domain.SysUser;
@@ -118,7 +119,8 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
     @Autowired
     @Lazy
     private ICoreReminderConfigurationService reminderConfigurationService;
-
+    @Autowired
+    ICoreReminderScheduleService reminderScheduleService;
     @Override
     public TableDataInfo<CoreDrillPlanPageVo> selectPage(CoreDrillPlanPageDto request) {
         //下穿
@@ -1031,6 +1033,7 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
 
 
     private static final Set<OrgTypeEnum> INVALID_ORG_TYPES = Sets.newHashSet(OrgTypeEnum.SHEGN_LIAN_SHE, OrgTypeEnum.BAN_SHI_CHU, OrgTypeEnum.DIQU_HANG_SHE);
+
     private void deducePlanAndBuildTask(CoreDrillPlan drillPlan, List<Long> orgIdList, List<SysOrgVO> orgCacheList) {
         List<SysOrgVO> orgList = orgCacheList.stream().filter(org -> orgIdList.contains(org.getId())).collect(toList());
         if (orgList.isEmpty()) {
@@ -1054,7 +1057,7 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
             Map<String, Object> map = getHsOrg(orgCacheList, orgList, orgTypeEnum);
             List<Long> hsPlanIdList = allHsPlanList.stream().map(CoreDrillPlan::getId).collect(toList());
             List<Long> hsOrgIdList = ((List<SysOrgVO>) map.get("list")).stream().map(SysOrgVO::getId).collect(toList());
-            if (ObjectUtil.hasEmpty(hsPlanIdList, hsOrgIdList)){
+            if (ObjectUtil.hasEmpty(hsPlanIdList, hsOrgIdList)) {
                 return;
             }
             List<CoreDrillPlan> reallyPlanIdList = findReallyPlanIdList(hsPlanIdList, hsOrgIdList);
@@ -1077,6 +1080,7 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
         }
 
     }
+
     private void create(CoreDrillPlan plan, List<Long> idList) {
         Long planId = plan.getId();
         Date planStartDate = plan.getPlanStartDate();
@@ -1085,7 +1089,7 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
         run(() -> {
             CoreDrillPlanDataVo detailPlanData = getCoreDrillPlanDataVo(planId);
             coreDrillTaskService.createTaskForNow(detailPlanData, planStartDate, planEndDate, idList);
-        },threadPoolTaskExecutor);
+        }, threadPoolTaskExecutor);
     }
 
     private List<CoreDrillPlan> findReallyPlanIdList(List<Long> planIdList, List<Long> orgIdList) {
@@ -1155,11 +1159,11 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
     }
 
     @Override
-    public List<Map<String,String>> queryPlanBySendModule() {
-        LambdaQueryWrapper<CoreDrillPlan> wrapper=new LambdaQueryWrapper<>();
-        wrapper.eq(CoreDrillPlan::getPlanStatus,DrillPlanStatus.USING.getCode());
-        wrapper.eq(CoreDrillPlan::getDeleted,0);
-        wrapper.eq(CoreDrillPlan::getStandard,1);
+    public List<Map<String, String>> queryPlanBySendModule() {
+        LambdaQueryWrapper<CoreDrillPlan> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(CoreDrillPlan::getPlanStatus, DrillPlanStatus.USING.getCode());
+        wrapper.eq(CoreDrillPlan::getDeleted, 0);
+        wrapper.eq(CoreDrillPlan::getStandard, 1);
         List<CoreDrillPlan> eduTrainingPlans = baseMapper.selectList(wrapper);
         List<Map<String, String>> list = new ArrayList<Map<String, String>>();
         for (CoreDrillPlan plan : eduTrainingPlans) {
@@ -1173,8 +1177,10 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
 
     @Override
     public List<CoreReminderSchedule> findTaskAndBuildReminderSchedule(List<CoreReminderConfigurationFullVo> configurationList) {
+        List<CoreReminderSchedule> exitTaskList = reminderScheduleService.findBySendModule(BusinessPlanType.DRILL.getCode());
         List<CoreReminderSchedule> scheduleArrayList = new ArrayList<>();
         for (CoreReminderConfigurationFullVo configuration : configurationList) {
+            List<CoreReminderSchedule> exitTaskBySendModule = exitTaskList.stream().filter(r -> ObjectUtil.equal(r.getSendModule(), configuration.getSendModule())).collect(Collectors.toList());
             Long planId = configuration.getPlanId();
             //此计划可能是省联社或者行社创建的父计划
             CoreDrillPlan plan = getById(planId);
@@ -1200,22 +1206,19 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
                 List<Long> allHsPlanIdList = allHsPlanList.stream().map(CoreDrillPlan::getId).collect(Collectors.toList());
 
                 list = coreDrillTaskService.selectTaskByHsPlanIdList(allHsPlanIdList, startTime, endTime);
-
-                if (ObjectUtil.isEmpty(list)) {
-                    continue;
-                }
-                continue;
-            }
-            //走到此处说明计划是行社创建的
-            Date startTime = DateUtil.beginOfDay(new Date());
-            Date endTime = DateUtil.endOfDay(new Date());
-            if (CycleCommonEnum.NONE.getCode().equals(plan.getPlanCycle())) {
+            } else {
+                //走到此处说明计划是行社创建的
                 CycleCommonEnum commonEnum = CycleCommonEnum.getEnum(plan.getPlanCycle());
                 DateRange startAndEnd = DateUtils.getStartAndEnd(new Date(), commonEnum);
-                startTime = startAndEnd.getStartTime();
-                endTime = startAndEnd.getEndTime();
+                Date startTime = startAndEnd.getStartTime();
+                Date endTime = startAndEnd.getEndTime();
+                if (CycleCommonEnum.NONE.getCode().equals(plan.getPlanCycle())) {
+                    startTime = DateUtil.beginOfDay(new Date());
+                    endTime = DateUtil.endOfDay(new Date());
+                }
+                list = coreDrillTaskService.selectTaskByHsPlanIdList(Lists.newArrayList(plan.getId()), startTime, endTime);
             }
-            list = coreDrillTaskService.selectTaskByHsPlanIdList(Lists.newArrayList(plan.getId()), startTime, endTime);
+
             if (ObjectUtil.isEmpty(list)) {
                 continue;
             }
@@ -1223,26 +1226,45 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
             if (ObjectUtil.isEmpty(notificationUser)) {
                 continue;
             }
+            List<SysOrgVO> cacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
             Map<Long, List<SysUser>> userMap = notificationUser.stream().collect(Collectors.groupingBy(SysUser::getOrgId));
+            for (Map.Entry<Long, List<SysUser>> userEntry : userMap.entrySet()) {
+                Long orgId = userEntry.getKey();
+                List<SysUser> userList = userEntry.getValue();
+                Optional<SysOrgVO> first = cacheList.stream().filter(org -> org.getId().equals(orgId)).findFirst();
+                if (!first.isPresent()){
+                    continue;
+                }
+                String path = first.get().getPath();
+                List<CoreDrillTask> taskList = list.stream().filter(task -> task.getOrgPath().contains(path)).collect(Collectors.toList());
 
-            for (CoreDrillTask task : list) {
-                List<SysUser> userList = userMap.get(task.getOrgId());
-                if (ObjectUtil.isEmpty(userList)) {
+                if (ObjectUtil.isEmpty(taskList)) {
                     continue;
                 }
                 for (SysUser sysUser : userList) {
-                    //找到每个任务的提醒时间
-                    Date notificationTime = reminderConfigurationService.getNotificationTime(task.getStartDate(),task.getEndDate(), configuration);
-                    CoreReminderSchedule schedule = new CoreReminderSchedule();
-                    schedule.setConfigId(configuration.getConfigId());
-                    schedule.setScheduledTime(DateUtils.toLocalDateTime(notificationTime));
-                    schedule.setStatus(0);
-                    schedule.setRecipient(sysUser.getPhone());
-                    schedule.setScheduleId(IdWorker.getId());
-                    scheduleArrayList.add(schedule);
+                    for (CoreDrillTask task : taskList) {
+                        boolean exit = exitTaskBySendModule.stream().anyMatch(t -> ObjectUtil.equal(t.getTaskId(),  String.valueOf(task.getId())));
+                        if (exit){
+                            //说明任务已经存在短信提醒任务
+                            continue;
+                        }
+                        //找到每个任务的提醒时间
+                        Date notificationTime = reminderConfigurationService.getNotificationTime(task.getStartDate(), task.getEndDate(), configuration);
+                        CoreReminderSchedule schedule = new CoreReminderSchedule();
+                        schedule.setConfigId(configuration.getConfigId());
+                        schedule.setReminderType(configuration.getReminderType());
+                        schedule.setSendModule(configuration.getSendModule());
+                        schedule.setTaskId(task.getId().toString());
+                        schedule.setTaskName(task.getTitle());
+                        schedule.setScheduledTime(DateUtils.toLocalDateTime(notificationTime));
+                        schedule.setStatus(0);
+                        schedule.setRecipientName(sysUser.getName());
+                        schedule.setRecipient(sysUser.getPhone());
+                        schedule.setScheduleId(IdWorker.getId());
+                        scheduleArrayList.add(schedule);
+                    }
                 }
             }
-
         }
         return scheduleArrayList;
     }

+ 65 - 42
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/edu/service/impl/CoreEduTrainingPlanServiceImpl.java

@@ -60,6 +60,7 @@ import com.xunmei.core.edu.service.ICoreEduTrainingPlanToRoleService;
 import com.xunmei.core.edu.service.ICoreEduTrainingTaskService;
 import com.xunmei.core.registerbook.service.ICoreRegisterBookPdfService;
 import com.xunmei.core.reminder.service.ICoreReminderConfigurationService;
+import com.xunmei.core.reminder.service.ICoreReminderScheduleService;
 import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.domain.SysUser;
@@ -120,7 +121,8 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
     @Autowired
     @Lazy
     private ICoreReminderConfigurationService reminderConfigurationService;
-
+    @Autowired
+    ICoreReminderScheduleService reminderScheduleService;
     @Override
     public TableDataInfo selectPage(CoreEduTrainingPlanPageDto request) throws InterruptedException {
 
@@ -644,12 +646,11 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
 
     }
 
-    private void checkPlanIsCreatingTask(Long planId,String msg)
-    {
-        String redisKey="Edu_Creating_Task" + planId;
+    private void checkPlanIsCreatingTask(Long planId, String msg) {
+        String redisKey = "Edu_Creating_Task" + planId;
         Boolean hasKey = RedisUtils.hasKey(redisKey);
         if (hasKey) {
-            throw new ServiceException("该任务正在生成中,现在不能被"+msg+",请稍后再试。");
+            throw new ServiceException("该任务正在生成中,现在不能被" + msg + ",请稍后再试。");
         }
     }
 
@@ -662,7 +663,7 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void deleteCoreEduTrainingPlanByIds(Long id) {
-        checkPlanIsCreatingTask(id,"删除");
+        checkPlanIsCreatingTask(id, "删除");
         List<Long> list = baseMapper.selectIdByParentId(id);
         if (ObjectUtil.isEmpty(list)) {
             //说明没有下发,还是草稿状态
@@ -681,12 +682,12 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
         } else {
             //计划下有已完成:删除本轮次及以后的所有任务,计划本身做逻辑删除。
             final CoreEduTrainingPlan plan = getById(id);
-            Date date=null;
+            Date date = null;
             if (plan.getPlanCycle().equals(EduTrainingPlanCycleEnum.NONE.getCode())) {
-                date=DateUtil.beginOfDay(new Date());
+                date = DateUtil.beginOfDay(new Date());
             } else {
                 final DateRange range = DateUtils.getStartAndEnd(new Date(), plan.getPlanCycle());
-                date=DateUtil.beginOfDay(range.getStartTime());
+                date = DateUtil.beginOfDay(range.getStartTime());
             }
             final List<Long> del = coreEduTrainingTaskService.delByStartTimeAndEndTimeAndPlanIdList(list, date, null);
             for (Long taskId : del) {
@@ -776,11 +777,11 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
         }, threadPoolTaskExecutor);
 
         planListFuture.thenAcceptAsync((result) -> {
-            String redisKey="Edu_Creating_Task" + planId;
+            String redisKey = "Edu_Creating_Task" + planId;
             RedisUtils.deleteObject(redisKey);
             Boolean hasKey = RedisUtils.hasKey(redisKey);
             if (!hasKey) {
-                RedisUtils.setCacheObject(redisKey, planId, Duration.ofMillis(1000 * 60*5));
+                RedisUtils.setCacheObject(redisKey, planId, Duration.ofMillis(1000 * 60 * 5));
             }
             for (CoreEduTrainingPlan eduPlan : result) {
                 if (checkCanBuildTaskNow(eduPlan)) {
@@ -911,7 +912,7 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Integer revocationPlan(Long planId) {
-        checkPlanIsCreatingTask(planId,"撤回");
+        checkPlanIsCreatingTask(planId, "撤回");
         List<Long> list = coreEduTrainingPlanMapper.selectIdByParentId(planId);
         Integer isExecute = coreEduTrainingTaskMapper.selectCount(new LambdaQueryWrapper<CoreEduTrainingTask>()
                         .in(CoreEduTrainingTask::getPlanId, list)
@@ -1003,6 +1004,7 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
     }
 
     private static final Set<OrgTypeEnum> INVALID_ORG_TYPES = Sets.newHashSet(OrgTypeEnum.SHEGN_LIAN_SHE, OrgTypeEnum.BAN_SHI_CHU, OrgTypeEnum.DIQU_HANG_SHE);
+
     private void deducePlanAndBuildTask(CoreEduTrainingPlan trainingPlan, List<Long> orgIdList, List<SysOrgVO> orgCacheList) {
         List<SysOrgVO> orgList = orgCacheList.stream().filter(org -> orgIdList.contains(org.getId())).collect(toList());
         if (orgList.isEmpty()) {
@@ -1026,7 +1028,7 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
             Map<String, Object> map = getHsOrg(orgCacheList, orgList, orgTypeEnum);
             List<Long> hsPlanIdList = allHsPlanList.stream().map(CoreEduTrainingPlan::getId).collect(toList());
             List<Long> hsOrgIdList = ((List<SysOrgVO>) map.get("list")).stream().map(SysOrgVO::getId).collect(toList());
-            if (ObjectUtil.hasEmpty(hsPlanIdList, hsOrgIdList)){
+            if (ObjectUtil.hasEmpty(hsPlanIdList, hsOrgIdList)) {
                 return;
             }
             List<CoreEduTrainingPlan> reallyPlanIdList = findReallyPlanIdList(hsPlanIdList, hsOrgIdList);
@@ -1049,6 +1051,7 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
         }
 
     }
+
     private void create(CoreEduTrainingPlan plan, List<Long> idList, ThreadPoolTaskExecutor executor) {
         Long planId = plan.getId();
         Date planStartDate = plan.getStartDate();
@@ -1120,17 +1123,18 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
         map.put("underHsOrgType", underHsOrgType);
         return map;
     }
+
     @Override
     public void run(Runnable runnable, ThreadPoolTaskExecutor threadPoolTaskExecutor) {
         CompletableFuture.runAsync(runnable, threadPoolTaskExecutor);
     }
 
     @Override
-    public List<Map<String,String>> queryPlanBySendModule() {
-        LambdaQueryWrapper<CoreEduTrainingPlan> wrapper=new LambdaQueryWrapper<>();
-        wrapper.eq(CoreEduTrainingPlan::getPlanStatus,DrillPlanStatus.USING.getCode());
-        wrapper.eq(CoreEduTrainingPlan::getDeleted,0);
-        wrapper.eq(CoreEduTrainingPlan::getStandard,1);
+    public List<Map<String, String>> queryPlanBySendModule() {
+        LambdaQueryWrapper<CoreEduTrainingPlan> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(CoreEduTrainingPlan::getPlanStatus, DrillPlanStatus.USING.getCode());
+        wrapper.eq(CoreEduTrainingPlan::getDeleted, 0);
+        wrapper.eq(CoreEduTrainingPlan::getStandard, 1);
         List<CoreEduTrainingPlan> eduTrainingPlans = baseMapper.selectList(wrapper);
         List<Map<String, String>> list = new ArrayList<Map<String, String>>();
         for (CoreEduTrainingPlan plan : eduTrainingPlans) {
@@ -1144,8 +1148,10 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
 
     @Override
     public List<CoreReminderSchedule> findTaskAndBuildReminderSchedule(List<CoreReminderConfigurationFullVo> configurationList) {
+        List<CoreReminderSchedule> exitTaskList = reminderScheduleService.findBySendModule(BusinessPlanType.EDU_TRAINING.getCode());
         List<CoreReminderSchedule> scheduleArrayList = new ArrayList<>();
         for (CoreReminderConfigurationFullVo configuration : configurationList) {
+            List<CoreReminderSchedule> exitTaskBySendModule = exitTaskList.stream().filter(r -> ObjectUtil.equal(r.getSendModule(), configuration.getSendModule())).collect(Collectors.toList());
             Long planId = configuration.getPlanId();
             //此计划可能是省联社或者行社创建的父计划
             CoreEduTrainingPlan plan = getById(planId);
@@ -1172,21 +1178,18 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
 
                 list = coreEduTrainingTaskService.selectTaskByHsPlanIdList(allHsPlanIdList, startTime, endTime);
 
-                if (ObjectUtil.isEmpty(list)) {
-                    continue;
-                }
-                continue;
-            }
-            //走到此处说明计划是行社创建的
-            Date startTime = DateUtil.beginOfDay(new Date());
-            Date endTime = DateUtil.endOfDay(new Date());
-            if (CycleCommonEnum.NONE.getCode().equals(plan.getPlanCycle())) {
+            } else {
                 CycleCommonEnum commonEnum = CycleCommonEnum.getEnum(plan.getPlanCycle());
                 DateRange startAndEnd = DateUtils.getStartAndEnd(new Date(), commonEnum);
-                startTime = startAndEnd.getStartTime();
-                endTime = startAndEnd.getEndTime();
+                Date startTime = startAndEnd.getStartTime();
+                Date endTime = startAndEnd.getEndTime();
+                //走到此处说明计划是行社创建的
+                if (CycleCommonEnum.NONE.getCode().equals(plan.getPlanCycle())) {
+                    startTime = DateUtil.beginOfDay(new Date());
+                    endTime = DateUtil.endOfDay(new Date());
+                }
+                list = coreEduTrainingTaskService.selectTaskByHsPlanIdList(Lists.newArrayList(plan.getId()), startTime, endTime);
             }
-            list = coreEduTrainingTaskService.selectTaskByHsPlanIdList(Lists.newArrayList(plan.getId()), startTime, endTime);
             if (ObjectUtil.isEmpty(list)) {
                 continue;
             }
@@ -1194,23 +1197,43 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
             if (ObjectUtil.isEmpty(notificationUser)) {
                 continue;
             }
+            List<SysOrgVO> cacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
             Map<Long, List<SysUser>> userMap = notificationUser.stream().collect(Collectors.groupingBy(SysUser::getOrgId));
+            for (Map.Entry<Long, List<SysUser>> userEntry : userMap.entrySet()) {
+                Long orgId = userEntry.getKey();
+                List<SysUser> userList = userEntry.getValue();
+                Optional<SysOrgVO> first = cacheList.stream().filter(org -> org.getId().equals(orgId)).findFirst();
+                if (!first.isPresent()){
+                    continue;
+                }
+                String path = first.get().getPath();
+                List<CoreEduTrainingTask> taskList = list.stream().filter(task -> task.getOrgPath().contains(path)).collect(Collectors.toList());
 
-            for (CoreEduTrainingTask task : list) {
-                List<SysUser> userList = userMap.get(task.getOrgId());
-                if (ObjectUtil.isEmpty(userList)) {
+                if (ObjectUtil.isEmpty(taskList)) {
                     continue;
                 }
                 for (SysUser sysUser : userList) {
-                    //找到每个任务的提醒时间
-                    Date notificationTime = reminderConfigurationService.getNotificationTime(task.getStartDate(),task.getEndDate(), configuration);
-                    CoreReminderSchedule schedule = new CoreReminderSchedule();
-                    schedule.setConfigId(configuration.getConfigId());
-                    schedule.setScheduledTime(DateUtils.toLocalDateTime(notificationTime));
-                    schedule.setStatus(0);
-                    schedule.setRecipient(sysUser.getPhone());
-                    schedule.setScheduleId(IdWorker.getId());
-                    scheduleArrayList.add(schedule);
+                    for (CoreEduTrainingTask task : taskList) {
+                        boolean exit = exitTaskBySendModule.stream().anyMatch(t -> ObjectUtil.equal(t.getTaskId(),  String.valueOf(task.getId())));
+                        if (exit){
+                            //说明任务已经存在短信提醒任务
+                            continue;
+                        }
+                        //找到每个任务的提醒时间
+                        Date notificationTime = reminderConfigurationService.getNotificationTime(task.getStartDate(), task.getEndDate(), configuration);
+                        CoreReminderSchedule schedule = new CoreReminderSchedule();
+                        schedule.setConfigId(configuration.getConfigId());
+                        schedule.setReminderType(configuration.getReminderType());
+                        schedule.setSendModule(configuration.getSendModule());
+                        schedule.setTaskId(task.getId().toString());
+                        schedule.setTaskName(task.getTitle());
+                        schedule.setScheduledTime(DateUtils.toLocalDateTime(notificationTime));
+                        schedule.setStatus(0);
+                        schedule.setRecipientName(sysUser.getName());
+                        schedule.setRecipient(sysUser.getPhone());
+                        schedule.setScheduleId(IdWorker.getId());
+                        scheduleArrayList.add(schedule);
+                    }
                 }
             }
 

+ 2 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/reminder/service/ICoreReminderScheduleService.java

@@ -18,4 +18,6 @@ public interface ICoreReminderScheduleService extends IService<CoreReminderSched
     void deleteByConfigId(Long configId);
 
     void saveDataBatch(List<CoreReminderSchedule> scheduleList);
+
+    List<CoreReminderSchedule> findBySendModule(String sendModule);
 }

+ 5 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/reminder/service/impl/CoreReminderScheduleServiceImpl.java

@@ -41,4 +41,9 @@ public class CoreReminderScheduleServiceImpl extends ServiceImpl<CoreReminderSch
             scheduleService.saveBatch(scheduleList);
         }
     }
+
+    @Override
+    public List<CoreReminderSchedule> findBySendModule(String sendModule) {
+       return lambdaQuery().eq(CoreReminderSchedule::getSendModule,sendModule).list();
+    }
 }

+ 56 - 33
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/AppPlanServiceImpl.java

@@ -38,6 +38,7 @@ import com.xunmei.core.question.service.IQuestionService;
 import com.xunmei.core.registerbook.mapper.CoreRegisterBookPdfMapper;
 import com.xunmei.core.registerbook.service.ICoreRegisterBookPdfService;
 import com.xunmei.core.reminder.service.ICoreReminderConfigurationService;
+import com.xunmei.core.reminder.service.ICoreReminderScheduleService;
 import com.xunmei.core.resumption.domain.*;
 import com.xunmei.core.resumption.dto.DistributeDto;
 import com.xunmei.core.resumption.dto.DistributeStatusDto;
@@ -128,7 +129,8 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
     @Autowired
     @Lazy
     private ICoreReminderConfigurationService reminderConfigurationService;
-
+    @Autowired
+    ICoreReminderScheduleService reminderScheduleService;
     @Override
     public List<Long> selectItemIdsByPlanId(Long id) {
         return appPlanToItemMapper.selectItemIdsByPlanId(id);
@@ -1662,10 +1664,14 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
         return list;
     }
 
+
+
     @Override
     public List<CoreReminderSchedule> findTaskAndBuildReminderSchedule(List<CoreReminderConfigurationFullVo> configurationList) {
+        List<CoreReminderSchedule> exitTaskList = reminderScheduleService.findBySendModule(BusinessPlanType.RESUMPTION.getCode());
         List<CoreReminderSchedule> scheduleArrayList = new ArrayList<>();
         for (CoreReminderConfigurationFullVo configuration : configurationList) {
+            List<CoreReminderSchedule> exitTaskBySendModule = exitTaskList.stream().filter(r -> ObjectUtil.equal(r.getSendModule(), configuration.getSendModule())).collect(Collectors.toList());
             Long planId = configuration.getPlanId();
             //此计划可能是省联社或者行社创建的父计划
             AppPlan appPlan = getById(planId);
@@ -1679,34 +1685,33 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
                 }
                 Integer planCycle = allHsPlanList.get(0).getPlanCycle();
 
-                Date startTime = DateUtil.beginOfDay(new Date());
-                Date endTime = DateUtil.endOfDay(new Date());
+                CycleCommonEnum commonEnum = CycleCommonEnum.getEnum(planCycle);
+                DateRange startAndEnd = DateUtils.getStartAndEnd(new Date(), commonEnum);
+                Date startTime = startAndEnd.getStartTime();
+                Date endTime = startAndEnd.getEndTime();
+
                 if (CycleCommonEnum.NONE.getCode().equals(planCycle)) {
-                    CycleCommonEnum commonEnum = CycleCommonEnum.getEnum(planCycle);
-                    DateRange startAndEnd = DateUtils.getStartAndEnd(new Date(), commonEnum);
-                    startTime = startAndEnd.getStartTime();
-                    endTime = startAndEnd.getEndTime();
+                    startTime = DateUtil.beginOfDay(new Date());
+                    endTime = DateUtil.endOfDay(new Date());
                 }
 
                 List<Long> allHsPlanIdList = allHsPlanList.stream().map(AppPlan::getId).collect(Collectors.toList());
 
                 list = resumptionTaskBusiness.selectTaskByHsPlanIdList(allHsPlanIdList, startTime, endTime);
 
-                if (ObjectUtil.isEmpty(list)) {
-                    continue;
-                }
-                continue;
-            }
-            //走到此处说明计划是行社创建的
-            Date startTime = DateUtil.beginOfDay(new Date());
-            Date endTime = DateUtil.endOfDay(new Date());
-            if (CycleCommonEnum.NONE.getCode().equals(appPlan.getPlanCycle())) {
+            } else {
+                //走到此处说明计划是行社创建的
                 CycleCommonEnum commonEnum = CycleCommonEnum.getEnum(appPlan.getPlanCycle());
                 DateRange startAndEnd = DateUtils.getStartAndEnd(new Date(), commonEnum);
-                startTime = startAndEnd.getStartTime();
-                endTime = startAndEnd.getEndTime();
+                Date startTime = startAndEnd.getStartTime();
+                Date endTime = startAndEnd.getEndTime();
+                if (CycleCommonEnum.NONE.getCode().equals(appPlan.getPlanCycle())) {
+                    startTime = DateUtil.beginOfDay(new Date());
+                    endTime = DateUtil.endOfDay(new Date());
+                }
+                list = resumptionTaskBusiness.selectTaskByHsPlanIdList(Lists.newArrayList(appPlan.getId()), startTime, endTime);
             }
-            list = resumptionTaskBusiness.selectTaskByHsPlanIdList(Lists.newArrayList(appPlan.getId()), startTime, endTime);
+
             if (ObjectUtil.isEmpty(list)) {
                 continue;
             }
@@ -1714,27 +1719,45 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
             if (ObjectUtil.isEmpty(notificationUser)) {
                 continue;
             }
+            List<SysOrgVO> cacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
             Map<Long, List<SysUser>> userMap = notificationUser.stream().collect(Collectors.groupingBy(SysUser::getOrgId));
+            for (Map.Entry<Long, List<SysUser>> userEntry : userMap.entrySet()) {
+                Long orgId = userEntry.getKey();
+                List<SysUser> userList = userEntry.getValue();
+                Optional<SysOrgVO> first = cacheList.stream().filter(org -> org.getId().equals(orgId)).findFirst();
+                if (!first.isPresent()) {
+                    continue;
+                }
+                String path = first.get().getPath();
+                List<Resumption> taskList = list.stream().filter(task -> task.getOrgPath().contains(path)).collect(Collectors.toList());
 
-            //todo 待确认 任务与提醒人的对应关系, A机构共有100条任务,提醒人三个, 需要确定每个人100条任务的短信共计三百条, 还是100条汇总成一条,一个人一条提醒
-            for (Resumption resumption : list) {
-                List<SysUser> userList = userMap.get(resumption.getOrgId());
-                if (ObjectUtil.isEmpty(userList)) {
+                if (ObjectUtil.isEmpty(taskList)) {
                     continue;
                 }
                 for (SysUser sysUser : userList) {
-                    //找到每个任务的提醒时间
-                    Date notificationTime = reminderConfigurationService.getNotificationTime(resumption.getPlanStartTime(),resumption.getPlanEndTime(), configuration);
-                    CoreReminderSchedule schedule = new CoreReminderSchedule();
-                    schedule.setConfigId(configuration.getConfigId());
-                    schedule.setScheduledTime(DateUtils.toLocalDateTime(notificationTime));
-                    schedule.setStatus(0);
-                    schedule.setRecipient(sysUser.getPhone());
-                    schedule.setScheduleId(IdWorker.getId());
-                    scheduleArrayList.add(schedule);
+                    for (Resumption task : taskList) {
+                        boolean exit = exitTaskBySendModule.stream().anyMatch(t -> ObjectUtil.equal(t.getTaskId(), String.valueOf(task.getId())));
+                        if (exit){
+                            //说明任务已经存在短信提醒任务
+                            continue;
+                        }
+                        //找到每个任务的提醒时间
+                        Date notificationTime = reminderConfigurationService.getNotificationTime(task.getPlanStartTime(), task.getPlanEndTime(), configuration);
+                        CoreReminderSchedule schedule = new CoreReminderSchedule();
+                        schedule.setConfigId(configuration.getConfigId());
+                        schedule.setReminderType(configuration.getReminderType());
+                        schedule.setSendModule(configuration.getSendModule());
+                        schedule.setTaskId(task.getId().toString());
+                        schedule.setTaskName(task.getName());
+                        schedule.setScheduledTime(DateUtils.toLocalDateTime(notificationTime));
+                        schedule.setStatus(0);
+                        schedule.setRecipientName(sysUser.getName());
+                        schedule.setRecipient(sysUser.getPhone());
+                        schedule.setScheduleId(IdWorker.getId());
+                        scheduleArrayList.add(schedule);
+                    }
                 }
             }
-
         }
         return scheduleArrayList;
     }

+ 48 - 24
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/impl/CoreSafecheckPlanServiceImpl.java

@@ -39,6 +39,7 @@ import com.xunmei.core.question.QuestionSrcType;
 import com.xunmei.core.question.service.IQuestionService;
 import com.xunmei.core.registerbook.service.ICoreRegisterBookPdfService;
 import com.xunmei.core.reminder.service.ICoreReminderConfigurationService;
+import com.xunmei.core.reminder.service.ICoreReminderScheduleService;
 import com.xunmei.core.resumption.dto.DistributeDto;
 import com.xunmei.core.resumption.dto.DistributeStatusDto;
 import com.xunmei.core.safetyCheck.domain.*;
@@ -125,6 +126,8 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
     @Autowired
     @Lazy
     private ICoreReminderConfigurationService reminderConfigurationService;
+    @Autowired
+    ICoreReminderScheduleService reminderScheduleService;
 
     @Override
     public TableDataInfo<CoreSafecheckPlan> selectPage(CoreSafecheckPlan coreSafecheckPlan) {
@@ -1312,8 +1315,11 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
 
     @Override
     public List<CoreReminderSchedule> findTaskAndBuildReminderSchedule(List<CoreReminderConfigurationFullVo> configurationList) {
+
+        List<CoreReminderSchedule> exitTaskList = reminderScheduleService.findBySendModule(BusinessPlanType.SAFETY_CHECK.getCode());
         List<CoreReminderSchedule> scheduleArrayList = new ArrayList<>();
         for (CoreReminderConfigurationFullVo configuration : configurationList) {
+            List<CoreReminderSchedule> exitTaskBySendModule = exitTaskList.stream().filter(r -> ObjectUtil.equal(r.getSendModule(), configuration.getSendModule())).collect(Collectors.toList());
             Long planId = configuration.getPlanId();
             //此计划可能是省联社或者行社创建的父计划
             CoreSafecheckPlan safeCheckPlan = getById(planId);
@@ -1340,21 +1346,19 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
 
                 list = safetyTaskService.selectTaskByHsPlanIdList(allHsPlanIdList, startTime, endTime);
 
-                if (ObjectUtil.isEmpty(list)) {
-                    continue;
-                }
-                continue;
-            }
-            //走到此处说明计划是行社创建的
-            Date startTime = DateUtil.beginOfDay(new Date());
-            Date endTime = DateUtil.endOfDay(new Date());
-            if (CycleCommonEnum.NONE.getCode().equals(safeCheckPlan.getPlanCycle())) {
+            } else {
+                //走到此处说明计划是行社创建的
                 CycleCommonEnum commonEnum = CycleCommonEnum.getEnum(safeCheckPlan.getPlanCycle());
                 DateRange startAndEnd = DateUtils.getStartAndEnd(new Date(), commonEnum);
-                startTime = startAndEnd.getStartTime();
-                endTime = startAndEnd.getEndTime();
+                Date startTime = startAndEnd.getStartTime();
+                Date endTime = startAndEnd.getEndTime();
+                if (CycleCommonEnum.NONE.getCode().equals(safeCheckPlan.getPlanCycle())) {
+                    startTime = DateUtil.beginOfDay(new Date());
+                    endTime = DateUtil.endOfDay(new Date());
+                }
+                list = safetyTaskService.selectTaskByHsPlanIdList(Lists.newArrayList(safeCheckPlan.getId()), startTime, endTime);
             }
-            list = safetyTaskService.selectTaskByHsPlanIdList(Lists.newArrayList(safeCheckPlan.getId()), startTime, endTime);
+
             if (ObjectUtil.isEmpty(list)) {
                 continue;
             }
@@ -1362,23 +1366,43 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
             if (ObjectUtil.isEmpty(notificationUser)) {
                 continue;
             }
+            List<SysOrgVO> cacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
             Map<Long, List<SysUser>> userMap = notificationUser.stream().collect(Collectors.groupingBy(SysUser::getOrgId));
+            for (Map.Entry<Long, List<SysUser>> userEntry : userMap.entrySet()) {
+                Long orgId = userEntry.getKey();
+                List<SysUser> userList = userEntry.getValue();
+                Optional<SysOrgVO> first = cacheList.stream().filter(org -> org.getId().equals(orgId)).findFirst();
+                if (!first.isPresent()){
+                    continue;
+                }
+                String path = first.get().getPath();
+                List<CoreSafetyTask> taskList = list.stream().filter(task -> task.getOrgPath().contains(path)).collect(Collectors.toList());
 
-            for (CoreSafetyTask coreSafetyTask : list) {
-                List<SysUser> userList = userMap.get(coreSafetyTask.getOrgId());
-                if (ObjectUtil.isEmpty(userList)) {
+                if (ObjectUtil.isEmpty(taskList)) {
                     continue;
                 }
                 for (SysUser sysUser : userList) {
-                    //找到每个任务的提醒时间
-                    Date notificationTime = reminderConfigurationService.getNotificationTime(coreSafetyTask.getPlanStartTime(), coreSafetyTask.getPlanEndTime(), configuration);
-                    CoreReminderSchedule schedule = new CoreReminderSchedule();
-                    schedule.setConfigId(configuration.getConfigId());
-                    schedule.setScheduledTime(DateUtils.toLocalDateTime(notificationTime));
-                    schedule.setStatus(0);
-                    schedule.setRecipient(sysUser.getPhone());
-                    schedule.setScheduleId(IdWorker.getId());
-                    scheduleArrayList.add(schedule);
+                    for (CoreSafetyTask task : taskList) {
+                        boolean exit = exitTaskBySendModule.stream().anyMatch(t -> ObjectUtil.equal(t.getTaskId(), String.valueOf(task.getId())));
+                        if (exit){
+                            //说明任务已经存在短信提醒任务
+                            continue;
+                        }
+                        //找到每个任务的提醒时间
+                        Date notificationTime = reminderConfigurationService.getNotificationTime(task.getPlanStartTime(), task.getPlanEndTime(), configuration);
+                        CoreReminderSchedule schedule = new CoreReminderSchedule();
+                        schedule.setConfigId(configuration.getConfigId());
+                        schedule.setReminderType(configuration.getReminderType());
+                        schedule.setSendModule(configuration.getSendModule());
+                        schedule.setTaskId(task.getId().toString());
+                        schedule.setTaskName(task.getTitle());
+                        schedule.setScheduledTime(DateUtils.toLocalDateTime(notificationTime));
+                        schedule.setStatus(0);
+                        schedule.setRecipientName(sysUser.getName());
+                        schedule.setRecipient(sysUser.getPhone());
+                        schedule.setScheduleId(IdWorker.getId());
+                        scheduleArrayList.add(schedule);
+                    }
                 }
             }
 

+ 14 - 16
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysUserController.java

@@ -113,6 +113,7 @@ public class SysUserController extends BaseController {
         TableDataInfo<SysUser> sysUserTableDataInfo = userService.userSelectorList(user);
         return success(sysUserTableDataInfo);
     }
+
     @RequiresPermissions("system:user:list")
     @GetMapping("/dictionlist")
     public R<List<SysUser>> list2(SysUser user) {
@@ -192,7 +193,7 @@ public class SysUserController extends BaseController {
         SysUser user = userService.selectUserById(SecurityUtils.getUserId());
         SysOrg org = orgMapper.selectOne(new LambdaQueryWrapper<SysOrg>()
                 .eq(SysOrg::getId, user.getOrgId())
-                .select(SysOrg::getType, SysOrg::getShortName,SysOrg::getPath));
+                .select(SysOrg::getType, SysOrg::getShortName, SysOrg::getPath));
         if (ObjectUtil.isNotEmpty(org)) {
             user.setOrgType(org.getType());
             user.setOrgShortName(org.getShortName());
@@ -211,23 +212,20 @@ public class SysUserController extends BaseController {
         ajax.put("permissions", permissions);
 
         // 获取当前登录账号是否存在 关联子账号
-        List<SysMasterSubUserVO> subUser =new ArrayList<>();
-        if(ObjectUtil.isNotEmpty(SecurityUtils.getMasterUserId()))
-        {
-            subUser =userService.selectSwitchUserList(SecurityUtils.getMasterUserId(),user.getId());
-        }
-        else {
-            subUser =userService.selectSwitchUserList(user.getId(),null);
+        List<SysMasterSubUserVO> subUser = new ArrayList<>();
+        if (ObjectUtil.isNotEmpty(SecurityUtils.getMasterUserId())) {
+            subUser = userService.selectSwitchUserList(SecurityUtils.getMasterUserId(), user.getId());
+        } else {
+            subUser = userService.selectSwitchUserList(user.getId(), null);
         }
 
-        ajax.put("subUserList",subUser);
-        ajax.put("masterUserId",SecurityUtils.getMasterUserId());
-        ajax.put("masterUserName",SecurityUtils.getMasterUsername());
+        ajax.put("subUserList", subUser);
+        ajax.put("masterUserId", SecurityUtils.getMasterUserId());
+        ajax.put("masterUserName", SecurityUtils.getMasterUsername());
         return ajax;
     }
 
 
-
     /**
      * 用户关联子用户
      */
@@ -245,8 +243,8 @@ public class SysUserController extends BaseController {
 //    @RequiresPermissions("system:user:mapperUser")
     @Log(title = "关联子用户", businessType = BusinessType.OTHER)
     @GetMapping("/mapperlist/{userId}")
-    public  R<List<SysMasterSubUserVO>> mapperUser(@PathVariable(value = "userId") Long userId) {
-        return R.ok(userService.selectSwitchUserList(userId,null));
+    public R<List<SysMasterSubUserVO>> mapperUser(@PathVariable(value = "userId") Long userId) {
+        return R.ok(userService.selectSwitchUserList(userId, null));
     }
 
 
@@ -656,7 +654,7 @@ public class SysUserController extends BaseController {
 
     @InnerAuth
     @GetMapping("/selectUserRoleMenu")
-    List<Long> selectUserRoleMenu(Long userId){
+    List<Long> selectUserRoleMenu(Long userId) {
         return userService.selectUserRoleMenu(userId);
     }
 
@@ -758,7 +756,7 @@ public class SysUserController extends BaseController {
     @ApiOperation(value = "通过角色和机构获取用户")
     @InnerAuth
     @PostMapping("/findReminderUser")
-    public   List<SysUser> findReminderUser(@RequestBody CoreReminderUserQueryDto userQueryDto) {
+    public List<SysUser> findReminderUser(@RequestBody CoreReminderUserQueryDto userQueryDto) {
         return userService.findReminderUser(userQueryDto);
     }
 }