Browse Source

日历展示重复提醒

yusm 1 month ago
parent
commit
c56fd95740

+ 6 - 6
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TaskController.java

@@ -224,7 +224,7 @@ public class TaskController {
                         if (LocalDate.now().isAfter(task.getRepeatEndDate())){
                             continue;
                         }
-                        int between = (int) ChronoUnit.DAYS.between(LocalDateTime.now(), task.getRepeatEndDate());
+                        int between = (int) ChronoUnit.DAYS.between(LocalDate.now(), task.getRepeatEndDate());
                         saveInformationListWithCount(task, taskInformation, between, executorIdList);
                     }
                 }
@@ -244,7 +244,7 @@ public class TaskController {
                             if (LocalDate.now().isAfter(task.getRepeatEndDate())){
                                 continue;
                             }
-                            int between = (int) ChronoUnit.DAYS.between(LocalDateTime.now(), task.getRepeatEndDate());
+                            int between = (int) ChronoUnit.DAYS.between(LocalDate.now(), task.getRepeatEndDate());
                             between=between/7;
                             saveInformationListWithCount(task, taskInformation, between, executorIdList);
                         }
@@ -268,7 +268,7 @@ public class TaskController {
                             if (LocalDate.now().isAfter(task.getRepeatEndDate())){
                                 continue;
                             }
-                            int between = (int) ChronoUnit.DAYS.between(LocalDateTime.now(), task.getRepeatEndDate());
+                            int between = (int) ChronoUnit.DAYS.between(LocalDate.now(), task.getRepeatEndDate());
                             between=between/30;
                             saveInformationListWithCount(task, taskInformation, between, executorIdList);
                         }
@@ -280,7 +280,7 @@ public class TaskController {
                 else if (task.getRepeatType() != null && task.getRepeatType() == 3 && task.getRepeatDesignSameday()!=null) {
                     //获取任务重复结束 重复永不结束   1:勾选
                     //每月一号才执行
-                    int num = (int) ChronoUnit.DAYS.between(LocalDateTime.now(), task.getCreateDate());
+                    int num = (int) ChronoUnit.DAYS.between(LocalDate.now(), task.getCreateDate());
                     if (num%task.getRepeatDesignSameday()==0){
                         if (task.getRepeatEndNever()!=null&&task.getRepeatEndNever()==1){
                             saveInformationListAndSendMsg(executorIdList,task);
@@ -293,7 +293,7 @@ public class TaskController {
                             if (LocalDate.now().isAfter(task.getRepeatEndDate())){
                                 continue;
                             }
-                            int between = (int) ChronoUnit.DAYS.between(LocalDateTime.now(), task.getRepeatEndDate());
+                            int between = (int) ChronoUnit.DAYS.between(LocalDate.now(), task.getRepeatEndDate());
                             between=between/task.getRepeatDesignSameday();
                             saveInformationListWithCount(task, taskInformation, between, executorIdList);
                         }
@@ -304,7 +304,7 @@ public class TaskController {
                 //自定义日期
                 else if (task.getRepeatType() != null && task.getRepeatType() == 4 && !StringUtils.isEmpty(task.getRepeatDesignDay())) {
                     //获取任务重复结束 重复永不结束   1:勾选
-                    int num = (int) ChronoUnit.DAYS.between(LocalDateTime.now(), task.getCreateDate());
+                    int num = (int) ChronoUnit.DAYS.between(LocalDate.now(), task.getCreateDate());
                     if (task.getRepeatDesignDay().contains(num+"")){
                         saveInformationListAndSendMsg(executorIdList,task);
                     }else {

+ 6 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/TaskRemind.java

@@ -75,6 +75,12 @@ public class TaskRemind extends Model<TaskRemind> {
     @TableField("corpwx_userid")
     private String corpwxUserid;
 
+    /**
+     * 部门
+     */
+    @TableField("dept")
+    private Integer dept;
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 2 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/TaskMapper.java

@@ -71,4 +71,6 @@ public interface TaskMapper extends BaseMapper<Task> {
     List<TasKVo> getPageListTaskByPin(TaskDto taskDto);
 
     List<TaskDto> getTaskListByStartAndEnd(@Param("startDate") LocalDateTime startDate, @Param("endDate") LocalDateTime endDate, @Param("departmentId") Integer departmentId, @Param("executor") String executor, @Param("companyId")Integer companyId);
+
+    List<TaskDto> selectListByIds(@Param("list") List<Integer> list);
 }

+ 38 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java

@@ -260,6 +260,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                                         repeatDate = startDate.plusDays((long) i *repeatDesignSameday);
                                     }
                                     taskRemind.setRemindDate(repeatDate);
+                                    taskRemind.setDept(selectedUser.getDepartmentId());
                                     taskRemindList.add(taskRemind);
                                 }
                             }
@@ -283,6 +284,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                                         repeatDate = repeatDate.plusDays((long) repeatDesignSameday);
                                     }
                                     taskRemind.setRemindDate(repeatDate);
+                                    taskRemind.setDept(selectedUser.getDepartmentId());
                                     taskRemindList.add(taskRemind);
                                 }
                             }
@@ -304,6 +306,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                                     taskRemind.setCorpwxUserid(selectedUser.getCorpwxUserid());
                                     repeatDate=startDate.plusDays(Integer.parseInt(s));
                                     taskRemind.setRemindDate(repeatDate);
+                                    taskRemind.setDept(selectedUser.getDepartmentId());
                                     taskRemindList.add(taskRemind);
                                 }
                             }
@@ -2037,7 +2040,41 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
             executor=user.getId();
 
         }
-        List<TaskDto> taskDtoList= taskMapper.getTaskListByStartAndEnd(parseStartDate,parseEndDate,departmentId,executor,companyId);
+        List<TaskDto> taskDtoList = taskMapper.getTaskListByStartAndEnd(parseStartDate, parseEndDate, departmentId, executor, companyId);
+
+
+        List<TaskRemind> remindList = taskRemindService.list(new QueryWrapper<TaskRemind>()
+                .between("remind_date", parseStartDate, parseEndDate)
+                .eq(StringUtils.isNotEmpty(executor),"executor_id",executor)
+                .eq(departmentId!=null,"dept",departmentId)
+                .groupBy("task_id", "remind_date"));
+        if (!remindList.isEmpty()) {
+            List<Integer> collect = remindList.stream()
+                    .distinct()
+                    .map(TaskRemind::getTaskId)
+                    .collect(Collectors.toList());
+
+            List<TaskDto> taskDtoListCollect = taskMapper.selectListByIds(collect);
+
+            ArrayList<TaskDto> taskDtos = new ArrayList<>();
+            for (TaskRemind remind : remindList) {
+                TaskDto taskDto = new TaskDto();
+                Optional<TaskDto> first = taskDtoListCollect.stream().filter(t -> t.getId().equals(remind.getTaskId())).findFirst();
+                if (first.isPresent()){
+                    BeanUtils.copyProperties(first.get(),taskDto);
+                    LocalDateTime remindDate = remind.getRemindDate();
+                    taskDto.setStartDate(remindDate);
+                    LocalDate date = remindDate.toLocalDate(); // 获取日期部分
+                    LocalDateTime eveningNine = LocalDateTime.of(date, LocalTime.of(21, 0));
+                    taskDto.setEndDate(eveningNine);
+                    taskDto.setId(null);
+                    taskDto.setTaskName(taskDto.getTaskName()+"(重复提醒)");
+                    taskDtos.add(taskDto);
+                }
+            }
+            taskDtoList.addAll(taskDtos);
+        }
+
 
         /*if (type==1||type==2) {
             // 使用LinkedHashMap保持日期顺序

+ 71 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/VisitPlanServiceImpl.java

@@ -1,6 +1,7 @@
 package com.management.platform.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.*;
@@ -9,16 +10,20 @@ import com.management.platform.entity.dto.TaskDto;
 import com.management.platform.entity.vo.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.SysFunctionService;
+import com.management.platform.service.TaskRemindService;
 import com.management.platform.service.VisitPlanService;
 import com.management.platform.util.DateTimeUtil;
 import com.management.platform.util.HttpRespMsg;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.regex.Pattern;
@@ -65,6 +70,8 @@ public class VisitPlanServiceImpl extends ServiceImpl<VisitPlanMapper, VisitPlan
     private TaskLogMapper taskLogMapper;
     @Resource
     private TaskExecutorMapper taskExecutorMapper;
+    @Resource
+    private TaskRemindService taskRemindService;
 
     @Override
     public HttpRespMsg addOrUpdateVisitPlan(VisitPlan visitPlan, HttpServletRequest request) {
@@ -389,6 +396,38 @@ public class VisitPlanServiceImpl extends ServiceImpl<VisitPlanMapper, VisitPlan
         LocalDateTime startDateParse = LocalDateTime.parse(calenderDate + " 00:00", formatter);
         LocalDateTime endDateParse = startDateParse.plusDays(1L);
         List<TaskDto> taskList = taskMapper.getTaskListByStartAndEnd(startDateParse, endDateParse, departmentId, executor, companyId);
+        //将有重复提醒的任务也返回
+        List<TaskRemind> remindList = taskRemindService.list(new QueryWrapper<TaskRemind>()
+                .between("remind_date", startDateParse, endDateParse)
+                .eq(StringUtils.isNotEmpty(executor),"executor_id",executor)
+                .eq(departmentId!=null,"dept",departmentId)
+                .groupBy("task_id", "remind_date"));
+        if (!remindList.isEmpty()) {
+            List<Integer> collect = remindList.stream()
+                    .distinct()
+                    .map(TaskRemind::getTaskId)
+                    .collect(Collectors.toList());
+
+            List<TaskDto> taskDtoListCollect = taskMapper.selectListByIds(collect);
+
+            ArrayList<TaskDto> taskDtos = new ArrayList<>();
+            for (TaskRemind remind : remindList) {
+                TaskDto taskDto = new TaskDto();
+                Optional<TaskDto> first = taskDtoListCollect.stream().filter(t -> t.getId().equals(remind.getTaskId())).findFirst();
+                if (first.isPresent()){
+                    BeanUtils.copyProperties(first.get(),taskDto);
+                    LocalDateTime remindDate = remind.getRemindDate();
+                    taskDto.setStartDate(remindDate);
+                    LocalDate date = remindDate.toLocalDate(); // 获取日期部分
+                    LocalDateTime eveningNine = LocalDateTime.of(date, LocalTime.of(21, 0));
+                    taskDto.setEndDate(eveningNine);
+                    taskDto.setId(null);
+                    taskDto.setTaskName(taskDto.getTaskName()+"(重复提醒)");
+                    taskDtos.add(taskDto);
+                }
+            }
+            taskList.addAll(taskDtos);
+        }
         List<TaskExecutor> taskExecutorList = taskExecutorMapper.selectList(new LambdaQueryWrapper<TaskExecutor>().eq(TaskExecutor::getCompanyId,user.getCompanyId()));
         List<TaskLog> taskLogList = taskLogMapper.selectList(new LambdaQueryWrapper<TaskLog>().eq(TaskLog::getCompanyId,user.getCompanyId()).orderByDesc(TaskLog::getModTime));
 
@@ -492,6 +531,38 @@ public class VisitPlanServiceImpl extends ServiceImpl<VisitPlanMapper, VisitPlan
         LocalDateTime parseStartDate = startDate.atStartOfDay(); // 获取开始时间
         LocalDateTime parseEndDate = parseStartDate.plusMonths(1L);// 获取结束时间
         List<TaskDto> taskList = taskMapper.getTaskListByStartAndEnd(parseStartDate, parseEndDate, departmentId, executor, companyId);
+        //将有重复提醒的任务也返回
+        List<TaskRemind> remindList = taskRemindService.list(new QueryWrapper<TaskRemind>()
+                .between("remind_date", parseStartDate, parseEndDate)
+                .eq(StringUtils.isNotEmpty(executor),"executor_id",executor)
+                .eq(departmentId!=null,"dept",departmentId)
+                .groupBy("task_id", "remind_date"));
+        if (!remindList.isEmpty()) {
+            List<Integer> collect = remindList.stream()
+                    .distinct()
+                    .map(TaskRemind::getTaskId)
+                    .collect(Collectors.toList());
+
+            List<TaskDto> taskDtoListCollect = taskMapper.selectListByIds(collect);
+
+            ArrayList<TaskDto> taskDtos = new ArrayList<>();
+            for (TaskRemind remind : remindList) {
+                TaskDto taskDto = new TaskDto();
+                Optional<TaskDto> first = taskDtoListCollect.stream().filter(t -> t.getId().equals(remind.getTaskId())).findFirst();
+                if (first.isPresent()){
+                    BeanUtils.copyProperties(first.get(),taskDto);
+                    LocalDateTime remindDate = remind.getRemindDate();
+                    taskDto.setStartDate(remindDate);
+                    LocalDate date = remindDate.toLocalDate(); // 获取日期部分
+                    LocalDateTime eveningNine = LocalDateTime.of(date, LocalTime.of(21, 0));
+                    taskDto.setEndDate(eveningNine);
+                    taskDto.setId(null);
+                    taskDto.setTaskName(taskDto.getTaskName()+"(重复提醒)");
+                    taskDtos.add(taskDto);
+                }
+            }
+            taskList.addAll(taskDtos);
+        }
         List<TaskExecutor> taskExecutorList = taskExecutorMapper.selectList(new LambdaQueryWrapper<TaskExecutor>().eq(TaskExecutor::getCompanyId,user.getCompanyId()));
         List<TaskLog> taskLogList = taskLogMapper.selectList(new LambdaQueryWrapper<TaskLog>().eq(TaskLog::getCompanyId,user.getCompanyId()).orderByDesc(TaskLog::getModTime));
 

+ 1 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -87,7 +87,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
 
     public static final int TEXT_CARD_MSG_EXPENSE_AGREE = 21;//费用报销审核通过
     public static final int TEXT_CARD_MSG_EXPENSE_DENY = 22;//费用报销审核驳回
-    public static final int TEXT_CARD_MSG_TASK = 23;//费用报销审核驳回
+    public static final int TEXT_CARD_MSG_TASK = 23;//任务提醒
 
     public static final int TEXT_CARD_MSG__ASYNC_DWONLOAD = 23;//文件异步下载
 

+ 53 - 4
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/task/TimingTask.java

@@ -1,15 +1,18 @@
 package com.management.platform.task;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.management.platform.entity.Task;
-import com.management.platform.entity.TaskExecutor;
-import com.management.platform.entity.User;
-import com.management.platform.entity.WxCorpInfo;
+import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.OperationRecordService;
+import com.management.platform.service.TaskRemindService;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
+import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
+import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.EnableScheduling;
@@ -19,7 +22,9 @@ import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
 import java.io.File;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.Executor;
@@ -80,6 +85,9 @@ public class TimingTask {
     @Resource
     private WxCorpInfoService wxCorpInfoService;
 
+    @Resource
+    private TaskRemindService remindService;
+
 
     private static final List<Integer> VALID_TOKEN_CHARS = new ArrayList<>();
     static {
@@ -134,6 +142,47 @@ public class TimingTask {
                 wxCorpInfoService.sendWXCorpMsg(wxCorpInfo,corpUserid,stringBuilder.toString(),"task",null);
             }
         }
+
+        LocalDate today = LocalDate.now();
+        LocalDateTime startOfDay = today.atStartOfDay(); // 当前日期的开始时间
+        LocalDateTime endOfDay = today.atTime(LocalTime.MAX); // 当前日期的结束时间
+
+        QueryWrapper<TaskRemind> queryWrapper = new QueryWrapper<>();
+        queryWrapper.between("remind_date", startOfDay, endOfDay);
+        List<TaskRemind> remindList = remindService.list(queryWrapper);
+        for (TaskRemind taskRemind : remindList) {
+            pushWxMsg(taskRemind.getWxOpenid(),taskRemind.getTaskName());
+        }
+
+    }
+
+
+    public void pushWxMsg(String toOpenId,String taskName) {
+        //1,配置
+        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
+        wxStorage.setAppId(appId);
+        wxStorage.setSecret(appSecret);
+        WxMpService wxMpService = new WxMpServiceImpl();
+        wxMpService.setWxMpConfigStorage(wxStorage);
+
+        //2,推送消息
+        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
+                .toUser(toOpenId)//要推送的用户openid
+                .templateId(TEMPLATE_REPORT_FILL)//模版id
+                .url("http://mob.ttkuaiban.com/")//点击模版消息要访问的网址
+                .build();
+        //3,如果是正式版发送模版消息,这里需要配置你的信息
+        //templateMessage.addData(new WxMpTemplateData("first", "您今天的工时填报还未完成", "#FF00FF"));
+        templateMessage.addData(new WxMpTemplateData("first", "您有任务信息提醒:", "#FF00FF"));
+        //templateMessage.addData(new WxMpTemplateData("keyword1", "屈跃庭", "#000000"));
+        templateMessage.addData(new WxMpTemplateData("keyword1",taskName, "#000000"));
+        try {
+            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
+        } catch (Exception e) {
+            System.out.println("推送失败:" + e.getMessage());
+            e.printStackTrace();
+        }
+
     }
 
 }

+ 24 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/TaskMapper.xml

@@ -538,6 +538,30 @@
         </where>
         order by task.create_date desc
     </select>
+    <select id="selectListByIds" resultType="com.management.platform.entity.dto.TaskDto">
+        select task.* ,
+        custom.custom_name,
+        business_opportunity.name businessName,
+        `sales_order`.order_name ,
+        clue.clue_name,
+        contacts.name contacts_name ,contacts.phone contacts_phone
+        from task
+        left join  custom on task.custom_id=custom.id
+        left join  business_opportunity on task.business_opportunity_id=business_opportunity.id
+        left join  `sales_order` on task.order_id=`sales_order`.id
+        left join  clue on task.clue_id=clue.id
+        left join  contacts on task.contacts_id=contacts.id
+        <where>
+            and 1=1 and task.is_delete=0
+            <if test="list !=null and list.size()>0">
+            and task.id in
+                <foreach collection="list" separator="," open="(" close=")" item="item">
+                   #{item}
+                </foreach>
+            </if>
+        </where>
+
+    </select>
 
     <update id="updateRepeatConfig">
         update task