Lijy 1 month ago
parent
commit
362c1698a0
20 changed files with 554 additions and 22 deletions
  1. 6 6
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TaskController.java
  2. 21 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TaskRemindController.java
  3. 89 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/TaskRemind.java
  4. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/TaskMapper.java
  5. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/TaskRemindMapper.java
  6. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/TaskRemindService.java
  7. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskRemindServiceImpl.java
  8. 183 4
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  9. 71 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/VisitPlanServiceImpl.java
  10. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  11. 53 4
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/task/TimingTask.java
  12. 24 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/TaskMapper.xml
  13. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/TaskRemindMapper.xml
  14. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  15. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectDeptRelateMapper.java
  16. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  17. 16 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  18. 4 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  19. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  20. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectDeptRelateMapper.xml

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

+ 21 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TaskRemindController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2025-03-31
+ */
+@RestController
+@RequestMapping("/task-remind")
+public class TaskRemindController {
+
+}
+

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

@@ -0,0 +1,89 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2025-03-31
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class TaskRemind extends Model<TaskRemind> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 任务id
+     */
+    @TableField("task_id")
+    private Integer taskId;
+
+    /**
+     * 任务名称
+     */
+    @TableField("task_name")
+    private String taskName;
+
+    /**
+     * 执行人id
+     */
+    @TableField("executor_id")
+    private String executorId;
+
+    /**
+     * 执行人名称
+     */
+    @TableField("executor_name")
+    private String executorName;
+
+    /**
+     * 提醒日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField("remind_date")
+    private LocalDateTime remindDate;
+
+    /**
+     * 微信openid
+     */
+    @TableField("wx_openid")
+    private String wxOpenid;
+
+    /**
+     * 企业微信openid
+     */
+    @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<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> 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);
 }
 }

+ 16 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/TaskRemindMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.TaskRemind;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2025-03-31
+ */
+public interface TaskRemindMapper extends BaseMapper<TaskRemind> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/TaskRemindService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.TaskRemind;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2025-03-31
+ */
+public interface TaskRemindService extends IService<TaskRemind> {
+
+}

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.TaskRemind;
+import com.management.platform.mapper.TaskRemindMapper;
+import com.management.platform.service.TaskRemindService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2025-03-31
+ */
+@Service
+public class TaskRemindServiceImpl extends ServiceImpl<TaskRemindMapper, TaskRemind> implements TaskRemindService {
+
+}

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

@@ -14,6 +14,11 @@ import com.management.platform.mapper.*;
 import com.management.platform.service.*;
 import com.management.platform.service.*;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.HttpRespMsg;
+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.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.CellType;
 import org.apache.poi.ss.usermodel.CellType;
@@ -132,6 +137,16 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
     @Resource
     @Resource
     private CompanyMapper companyMapper;
     private CompanyMapper companyMapper;
 
 
+    @Resource
+    private TaskRemindService taskRemindService;
+
+    @Value("${wx.template_report_fill}")
+    public String TEMPLATE_REPORT_FILL;
+    @Value("${wx.app_id}")
+    public String appId;
+    @Value("${wx.app_secret}")
+    public String appSecret;
+
 
 
     @Override
     @Override
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
@@ -207,15 +222,117 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                         .setCompanyId(user.getCompanyId());
                         .setCompanyId(user.getCompanyId());
                 taskExecutorMapper.insert(taskExecutor);
                 taskExecutorMapper.insert(taskExecutor);
                 information.setUserId(executorId);
                 information.setUserId(executorId);
+
+                if (task.getStartDate()!=null) {
+                    if (task.getIsRepeat() != null && task.getIsRepeat() == 1) {
+                        ArrayList<TaskRemind> taskRemindList = new ArrayList<>();
+                        LocalDateTime startDate = task.getStartDate();
+                        Integer repeatEndCount=0;//重复几次
+                        LocalDate repeatEndDate=null;//重复到某个日期
+                        //repeatType  重复类型 :每天:0、每周:1、每月:2、自定义周期:3、自定义日期:4
+                        if (task.getRepeatType() != null && task.getRepeatType() <= 3) {
+                            Integer repeatType = task.getRepeatType();
+                            Integer repeatDesignSameday = task.getRepeatDesignSameday();
+                            //重复结束在几次之后
+                            if (task.getRepeatEndCount()!=null&&task.getRepeatEndCount()>0) {
+                                repeatEndCount = task.getRepeatEndCount();
+                            } else if (task.getRepeatEndDate()!=null) {
+                                repeatEndDate=task.getRepeatEndDate();
+                            }
+
+                            if (repeatEndCount!=null) {
+                                for (int i = 1; i <= repeatEndCount; i++) {
+                                    LocalDateTime repeatDate=null;
+                                    TaskRemind taskRemind = new TaskRemind();
+                                    taskRemind.setTaskId(task.getId());
+                                    taskRemind.setTaskName(task.getTaskName());
+                                    taskRemind.setExecutorId(executorId);
+                                    taskRemind.setExecutorName(selectedUser.getName());
+                                    taskRemind.setWxOpenid(selectedUser.getWxOpenid());
+                                    taskRemind.setCorpwxUserid(selectedUser.getCorpwxUserid());
+                                    if (repeatType==0) {
+                                        repeatDate = startDate.plusDays(i);
+                                    } else if (repeatType==1) {
+                                        repeatDate = startDate.plusWeeks(i);
+                                    } else if (repeatType==2) {
+                                        repeatDate = startDate.plusMonths(i);
+                                    } else if (repeatType==3&&repeatDesignSameday!=null) {
+                                        repeatDate = startDate.plusDays((long) i *repeatDesignSameday);
+                                    }
+                                    taskRemind.setRemindDate(repeatDate);
+                                    taskRemind.setDept(selectedUser.getDepartmentId());
+                                    taskRemindList.add(taskRemind);
+                                }
+                            }
+                            if (repeatEndDate!=null) {
+                                LocalDateTime repeatDate=startDate;
+                                while (repeatDate.toLocalDate().isBefore(repeatEndDate)){
+                                    TaskRemind taskRemind = new TaskRemind();
+                                    taskRemind.setTaskId(task.getId());
+                                    taskRemind.setTaskName(task.getTaskName());
+                                    taskRemind.setExecutorId(executorId);
+                                    taskRemind.setExecutorName(selectedUser.getName());
+                                    taskRemind.setWxOpenid(selectedUser.getWxOpenid());
+                                    taskRemind.setCorpwxUserid(selectedUser.getCorpwxUserid());
+                                    if (repeatType==0) {
+                                        repeatDate = repeatDate.plusDays(1L);
+                                    } else if (repeatType==1) {
+                                        repeatDate = repeatDate.plusWeeks(1L);
+                                    } else if (repeatType==2) {
+                                        repeatDate = repeatDate.plusMonths(1L);
+                                    } else if (repeatType==3&&repeatDesignSameday!=null) {
+                                        repeatDate = repeatDate.plusDays((long) repeatDesignSameday);
+                                    }
+                                    taskRemind.setRemindDate(repeatDate);
+                                    taskRemind.setDept(selectedUser.getDepartmentId());
+                                    taskRemindList.add(taskRemind);
+                                }
+                            }
+                        }
+                        else if (task.getRepeatType() != null && task.getRepeatType() ==4) {
+
+                            String repeatDesignDay = task.getRepeatDesignDay();
+                            if (StringUtils.isNotEmpty(repeatDesignDay)) {
+                                String[] strings = repeatDesignDay.split(",");
+                                List<String> list = Arrays.asList(strings);
+                                for (String s : list) {
+                                    LocalDateTime repeatDate=null;
+                                    TaskRemind taskRemind = new TaskRemind();
+                                    taskRemind.setTaskId(task.getId());
+                                    taskRemind.setTaskName(task.getTaskName());
+                                    taskRemind.setExecutorId(executorId);
+                                    taskRemind.setExecutorName(selectedUser.getName());
+                                    taskRemind.setWxOpenid(selectedUser.getWxOpenid());
+                                    taskRemind.setCorpwxUserid(selectedUser.getCorpwxUserid());
+                                    repeatDate=startDate.plusDays(Integer.parseInt(s));
+                                    taskRemind.setRemindDate(repeatDate);
+                                    taskRemind.setDept(selectedUser.getDepartmentId());
+                                    taskRemindList.add(taskRemind);
+                                }
+                            }
+
+                        }
+
+                        taskRemindService.saveBatch(taskRemindList);
+                    }
+                }
+                //发送企业微信信息
+                if (wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    wxCorpInfoService.sendWXCorpMsg(wxCorpInfo,selectedUser.getCorpwxUserid(),"你有新的任务",null, WxCorpInfoServiceImpl.TEXT_CARD_MSG_TASK);
+                }
+                //发送微信信息
+                else if (StringUtils.isNotEmpty(selectedUser.getWxOpenid())) {
+                    pushWxMsg(selectedUser.getWxOpenid(),task.getTaskName());
+                }
             }
             }
             information.setTime(new Date()).setChecked(0).setMsg("你有新的任务").setPath("/tasks");
             information.setTime(new Date()).setChecked(0).setMsg("你有新的任务").setPath("/tasks");
             informationArrayList.add(information);
             informationArrayList.add(information);
             informationService.saveBatch(informationArrayList);
             informationService.saveBatch(informationArrayList);
-            if (wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                wxCorpInfoService.sendWXCorpMsg(wxCorpInfo,user.getCorpwxUserid(),"你有新的任务",null, WxCorpInfoServiceImpl.TEXT_CARD_MSG_TASK);
-            }
+
         }
         }
 
 
+
+
         //添加任务编译记录
         //添加任务编译记录
         TaskLog taskLog = new TaskLog();
         TaskLog taskLog = new TaskLog();
         taskLog.setTaskId(task.getId());
         taskLog.setTaskId(task.getId());
@@ -245,6 +362,34 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         return httpRespMsg;
         return httpRespMsg;
     }
     }
 
 
+    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();
+        }
+
+    }
+
     @Override
     @Override
     public HttpRespMsg pageTask(TaskDto taskDto, HttpServletRequest request) {
     public HttpRespMsg pageTask(TaskDto taskDto, HttpServletRequest request) {
         String token = String.valueOf(request.getHeader("Token"));
         String token = String.valueOf(request.getHeader("Token"));
@@ -1895,7 +2040,41 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
             executor=user.getId();
             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) {
         /*if (type==1||type==2) {
             // 使用LinkedHashMap保持日期顺序
             // 使用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;
 package com.management.platform.service.impl;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 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.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.*;
 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.entity.vo.*;
 import com.management.platform.mapper.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.SysFunctionService;
 import com.management.platform.service.SysFunctionService;
+import com.management.platform.service.TaskRemindService;
 import com.management.platform.service.VisitPlanService;
 import com.management.platform.service.VisitPlanService;
 import com.management.platform.util.DateTimeUtil;
 import com.management.platform.util.DateTimeUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.HttpRespMsg;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDate;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.*;
 import java.util.regex.Pattern;
 import java.util.regex.Pattern;
@@ -65,6 +70,8 @@ public class VisitPlanServiceImpl extends ServiceImpl<VisitPlanMapper, VisitPlan
     private TaskLogMapper taskLogMapper;
     private TaskLogMapper taskLogMapper;
     @Resource
     @Resource
     private TaskExecutorMapper taskExecutorMapper;
     private TaskExecutorMapper taskExecutorMapper;
+    @Resource
+    private TaskRemindService taskRemindService;
 
 
     @Override
     @Override
     public HttpRespMsg addOrUpdateVisitPlan(VisitPlan visitPlan, HttpServletRequest request) {
     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 startDateParse = LocalDateTime.parse(calenderDate + " 00:00", formatter);
         LocalDateTime endDateParse = startDateParse.plusDays(1L);
         LocalDateTime endDateParse = startDateParse.plusDays(1L);
         List<TaskDto> taskList = taskMapper.getTaskListByStartAndEnd(startDateParse, endDateParse, departmentId, executor, companyId);
         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<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));
         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 parseStartDate = startDate.atStartOfDay(); // 获取开始时间
         LocalDateTime parseEndDate = parseStartDate.plusMonths(1L);// 获取结束时间
         LocalDateTime parseEndDate = parseStartDate.plusMonths(1L);// 获取结束时间
         List<TaskDto> taskList = taskMapper.getTaskListByStartAndEnd(parseStartDate, parseEndDate, departmentId, executor, companyId);
         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<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));
         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_AGREE = 21;//费用报销审核通过
     public static final int TEXT_CARD_MSG_EXPENSE_DENY = 22;//费用报销审核驳回
     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;//文件异步下载
     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;
 package com.management.platform.task;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.mapper.*;
 import com.management.platform.service.OperationRecordService;
 import com.management.platform.service.OperationRecordService;
+import com.management.platform.service.TaskRemindService;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.RedisUtil;
 import com.management.platform.util.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
 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.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.EnableScheduling;
@@ -19,7 +22,9 @@ import org.springframework.web.client.RestTemplate;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.io.File;
 import java.io.File;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executor;
@@ -80,6 +85,9 @@ public class TimingTask {
     @Resource
     @Resource
     private WxCorpInfoService wxCorpInfoService;
     private WxCorpInfoService wxCorpInfoService;
 
 
+    @Resource
+    private TaskRemindService remindService;
+
 
 
     private static final List<Integer> VALID_TOKEN_CHARS = new ArrayList<>();
     private static final List<Integer> VALID_TOKEN_CHARS = new ArrayList<>();
     static {
     static {
@@ -134,6 +142,47 @@ public class TimingTask {
                 wxCorpInfoService.sendWXCorpMsg(wxCorpInfo,corpUserid,stringBuilder.toString(),"task",null);
                 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>
         </where>
         order by task.create_date desc
         order by task.create_date desc
     </select>
     </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 id="updateRepeatConfig">
         update task
         update task

+ 20 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/TaskRemindMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.TaskRemindMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.TaskRemind">
+        <id column="id" property="id" />
+        <result column="task_id" property="taskId" />
+        <result column="task_name" property="taskName" />
+        <result column="executor_id" property="executorId" />
+        <result column="executor_name" property="executorName" />
+        <result column="remind_date" property="remindDate" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, task_id, task_name, executor_id, executor_name, remind_date
+    </sql>
+
+</mapper>

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -743,8 +743,8 @@ public class ProjectController {
         return projectService.exportWaitingReviewList(request,stateKey,userId,startDate,endDate);
         return projectService.exportWaitingReviewList(request,stateKey,userId,startDate,endDate);
     }
     }
     @RequestMapping("/batchSetParticipation")
     @RequestMapping("/batchSetParticipation")
-    public HttpRespMsg batchSetParticipation(HttpServletRequest request,String projectIdArray,String userIds){
-        return projectService.batchSetParticipation(request,projectIdArray,userIds);
+    public HttpRespMsg batchSetParticipation(HttpServletRequest request,String projectIdArray,String userIds,String deptIds){
+        return projectService.batchSetParticipation(request,projectIdArray,userIds,deptIds);
     }
     }
     @RequestMapping("/changeCurrentStage")
     @RequestMapping("/changeCurrentStage")
     public HttpRespMsg changeCurrentStage(Integer projectId,Integer currentStageId,String currentStageName){
     public HttpRespMsg changeCurrentStage(Integer projectId,Integer currentStageId,String currentStageName){

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

@@ -8,4 +8,6 @@ import java.util.List;
 
 
 public interface ProjectDeptRelateMapper  extends BaseMapper<ProjectDeptRelate> {
 public interface ProjectDeptRelateMapper  extends BaseMapper<ProjectDeptRelate> {
     void insertBatch(@Param("projectId") Integer projectId,@Param("deptList") List<String> deptList);
     void insertBatch(@Param("projectId") Integer projectId,@Param("deptList") List<String> deptList);
+
+    void insertBatchList(@Param("toAddList") List<ProjectDeptRelate> toAddList);
 }
 }

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java

@@ -176,7 +176,7 @@ public interface ProjectService extends IService<Project> {
 
 
     HttpRespMsg exportWaitingReviewList(HttpServletRequest request, Integer stateKey, String userId,String startDate,String endDate);
     HttpRespMsg exportWaitingReviewList(HttpServletRequest request, Integer stateKey, String userId,String startDate,String endDate);
 
 
-    HttpRespMsg batchSetParticipation(HttpServletRequest request,String projectIdArray , String userIds);
+    HttpRespMsg batchSetParticipation(HttpServletRequest request,String projectIdArray , String userIds,String deptIds);
 
 
     HttpRespMsg suspendProject(Integer id);
     HttpRespMsg suspendProject(Integer id);
 
 

+ 16 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -10234,11 +10234,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     }
     }
 
 
     @Override
     @Override
-    public HttpRespMsg batchSetParticipation(HttpServletRequest request,String  projectIdArray,String userIds) {
+    public HttpRespMsg batchSetParticipation(HttpServletRequest request,String  projectIdArray,String userIds,String deptIds) {
         HttpRespMsg msg=new HttpRespMsg();
         HttpRespMsg msg=new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("token"));
         User user = userMapper.selectById(request.getHeader("token"));
         List<Integer> array = JSONArray.parseArray(projectIdArray, Integer.class);
         List<Integer> array = JSONArray.parseArray(projectIdArray, Integer.class);
         List<String> userIdList = JSONArray.parseArray(userIds, String.class);
         List<String> userIdList = JSONArray.parseArray(userIds, String.class);
+        List<Integer> deptArray = JSONArray.parseArray(deptIds, Integer.class);
+        List<ProjectDeptRelate> toAddList = new ArrayList<>();
+
         List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", user.getCompanyId()).in("id",array));
         List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", user.getCompanyId()).in("id",array));
         List<Participation> list=new ArrayList<>();
         List<Participation> list=new ArrayList<>();
         for (Project project : projectList) {
         for (Project project : projectList) {
@@ -10261,6 +10264,18 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     .setOperationTime(LocalDateTime.now())
                     .setOperationTime(LocalDateTime.now())
                     .setContent("批量添加项目参与人");
                     .setContent("批量添加项目参与人");
             operationRecordService.save(operationRecord);
             operationRecordService.save(operationRecord);
+            if(CollectionUtils.isNotEmpty(deptArray)){
+                for (Integer deptId : deptArray) {
+                    ProjectDeptRelate tmpRelate = new ProjectDeptRelate();
+                    tmpRelate.setProjectId(project.getId());
+                    tmpRelate.setDepartmentId(deptId);
+                    toAddList.add(tmpRelate);
+                }
+            }
+
+        }
+        if(CollectionUtils.isNotEmpty(toAddList)){
+            projectDeptRelateMapper.insertBatchList(toAddList);
         }
         }
         participationService.saveBatch(list);
         participationService.saveBatch(list);
         return msg;
         return msg;

+ 4 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -1752,7 +1752,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                         }
                         }
                         if (showLog) System.out.println("工作时长==" + workHours);
                         if (showLog) System.out.println("工作时长==" + workHours);
 
 
-                        if (corpInfo.getCompanyId() == 481 || corpInfo.getCompanyId() == 469) {
+                        if (corpInfo.getCompanyId() == 481) {
                             //给盛立安元和赛元微电子0.5单位进位
                             //给盛立安元和赛元微电子0.5单位进位
                             ct.setWorkHours(DateTimeUtil.getHalfHoursFromDouble(workHours));
                             ct.setWorkHours(DateTimeUtil.getHalfHoursFromDouble(workHours));
                         } else {
                         } else {
@@ -1826,12 +1826,13 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                         JSONObject otInfo = jsonObject.getJSONObject("ot_info");
                         JSONObject otInfo = jsonObject.getJSONObject("ot_info");
                         if (otInfo != null && otInfo.getIntValue("ot_duration") > 0 && otInfo.getIntValue("ot_status") == 1) {
                         if (otInfo != null && otInfo.getIntValue("ot_duration") > 0 && otInfo.getIntValue("ot_status") == 1) {
                             double otTime = DateTimeUtil.getHoursFromSeconds(otInfo.getIntValue("ot_duration"));
                             double otTime = DateTimeUtil.getHoursFromSeconds(otInfo.getIntValue("ot_duration"));
-                            ct.setWorkHours(otTime);
+                            double hourValue = DateTimeUtil.getHoursFromDouble(otTime);
+                            ct.setWorkHours(hourValue);
                             ct.setCardTime(0.0);
                             ct.setCardTime(0.0);
                             ct.setAskLeaveTime(0.0);
                             ct.setAskLeaveTime(0.0);
                             ct.setOutdoorTime(0.0);
                             ct.setOutdoorTime(0.0);
                             ct.setOtStatus(1);
                             ct.setOtStatus(1);
-                            ct.setOtTime(otTime);
+                            ct.setOtTime(hourValue);
                             JSONArray holidayItems = jsonObject.getJSONArray("holiday_infos");
                             JSONArray holidayItems = jsonObject.getJSONArray("holiday_infos");
                             for (int t = 0; t < holidayItems.size(); t++) {
                             for (int t = 0; t < holidayItems.size(); t++) {
                                 JSONObject holiday = holidayItems.getJSONObject(t);
                                 JSONObject holiday = holidayItems.getJSONObject(t);

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -1352,6 +1352,7 @@ public class TimingTask {
         }
         }
     }
     }
 
 
+    //每天下午五点到七点,每半小时获取一次当天考勤记录
     @Scheduled(cron = "0 30,0/5 17-19 * * ?")
     @Scheduled(cron = "0 30,0/5 17-19 * * ?")
     public void  getClockRecordWithCorpWx(){
     public void  getClockRecordWithCorpWx(){
         if(isDev) return;
         if(isDev) return;

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectDeptRelateMapper.xml

@@ -9,4 +9,10 @@
             (#{projectId},#{deptId})
             (#{projectId},#{deptId})
         </foreach>
         </foreach>
     </insert>
     </insert>
+    <insert id="insertBatchList">
+        insert into project_dept_relate(project_id, department_id) VALUES
+        <foreach collection="toAddList" item="item" separator=",">
+            (#{item.projectId},#{item.departmentId})
+        </foreach>
+    </insert>
 </mapper>
 </mapper>