Pārlūkot izejas kodu

新增定时发送逻辑、优化部分接口代码

fuyuhchuan 9 mēneši atpakaļ
vecāks
revīzija
e8ef432d37

+ 1 - 6
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/api/PmTimedSendingApi.java

@@ -6,8 +6,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.time.temporal.ChronoUnit;
 
 /**
  * <p>
@@ -24,9 +22,6 @@ public class PmTimedSendingApi implements RemotePmService {
     @Override
     public void executeTimedSending() {
         LocalDateTime now = LocalDateTime.now();
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
-        String formattedDateTime = now.format(formatter);
-        LocalDateTime parsedDateTime = LocalDateTime.parse(formattedDateTime, formatter);
-        pmWorkReportService.timedSending(parsedDateTime);
+        pmWorkReportService.timedSending(now);
     }
 }

+ 12 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkReportController.java

@@ -9,6 +9,7 @@ import com.usky.iot.service.PmWorkReportService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
 
@@ -63,4 +64,15 @@ public class PmWorkReportController {
     public ApiResult<List<Map<String, Object>>> weekWork() {
         return ApiResult.success(pmWorkReportService.countTime());
     }
+
+    /**
+     * 测试定时发送
+     *
+     * @param
+     */
+    @GetMapping("/ScheduledTasks")
+    public void add(){
+        LocalDateTime now = LocalDateTime.now();
+        pmWorkReportService.timedSending(now);
+    }
 }

+ 2 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/PmWorkReport.java

@@ -11,6 +11,7 @@ import java.time.LocalDateTime;
 import java.io.Serializable;
 import java.util.List;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.*;
 import org.springframework.data.annotation.Transient;
 
@@ -119,6 +120,7 @@ public class PmWorkReport implements Serializable {
     /**
      * 定时时间
      */
+    //@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime timingTime;
 
     /**

+ 17 - 40
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/config/DingTalkAndMessage.java

@@ -17,14 +17,11 @@ import com.usky.common.core.bean.ApiResult;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.iot.constant.dingTalkConstant;
 import com.usky.iot.domain.MceMbuser;
-import com.usky.iot.domain.PmReceive;
 import com.usky.iot.domain.PmWorkContent;
 import com.usky.iot.domain.PmWorkReport;
 import com.usky.iot.mapper.MceMbuserMapper;
-import com.usky.iot.mapper.PmReceiveMapper;
 import com.usky.iot.mapper.PmWorkReportMapper;
 import com.usky.iot.mapper.SysUserMapper;
-import com.usky.iot.service.PmWorkContentService;
 import com.usky.system.RemoteMceService;
 import com.usky.system.domain.SysUser;
 import lombok.extern.slf4j.Slf4j;
@@ -54,12 +51,6 @@ public class DingTalkAndMessage {
     @Autowired
     private RemoteMceService remoteMceService;
 
-    @Autowired
-    private PmWorkContentService pmWorkContentService;
-
-    @Autowired
-    private PmReceiveMapper pmReceiveMapper;
-
     @Autowired
     private MceMbuserMapper mceMbuserMapper;
 
@@ -95,7 +86,7 @@ public class DingTalkAndMessage {
         try {
             client = createClient();
         } catch (Exception e) {
-            e.printStackTrace();
+            log.error("获取钉钉token异常:" + e);
         }
         com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest getAccessTokenRequest = new com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest()
                 .setAppKey(dingTalkConstant.DING_TALK_CLIENT_ID)
@@ -104,12 +95,12 @@ public class DingTalkAndMessage {
             responseBody = client.getAccessToken(getAccessTokenRequest);
         } catch (TeaException err) {
             if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
-                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                log.error("获取钉钉token异常:" + err.code + err.message);
             }
         } catch (Exception _err) {
             TeaException err = new TeaException(_err.getMessage(), _err);
             if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
-                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                log.error("获取钉钉token异常:" + err.code + err.message);
             }
         }
         return responseBody.getBody().accessToken;
@@ -170,11 +161,12 @@ public class DingTalkAndMessage {
 
     @Async("asyncServiceExecutor")//异步发送
     public void sendDingTalkDailyReport(PmWorkReport workReport, List<PmWorkContent> workContents) {
+        String userName = workReport.getCreateBy();
+        log.info(userName + "的工作报告开始发送钉钉-----------------------------------");
         String ccToStr = workReport.getCcTo();
         String[] items = ccToStr.split(",");
         try {
             List<Long> userIds = new ArrayList<>();
-            //Thread.sleep(30000);
             for (String item : items) {
                 long number = Long.parseLong(item.trim());
                 userIds.add(number);
@@ -202,7 +194,7 @@ public class DingTalkAndMessage {
                 String workContent = content.getWorkContent();
                 StringBuilder markdown = new StringBuilder();
                 markdown.append("#### ").append(projectName).append(" ").append(workTime).append("h\n\n");
-                markdown.append("<span style=\"font-size: 18px;\">").append(workContent).append("\n").append("</span>");
+                markdown.append("<span style=\"font-size: 8px;\">").append(workContent).append("\n").append("</span>");
                 contentBuilder.append(markdown);
             }
             String completedWork = contentBuilder.toString();
@@ -236,7 +228,7 @@ public class DingTalkAndMessage {
             obj1.setTemplateId(dingTalkConstant.DING_TALK_DAILY_REPORT_TEMPLATE_ID);
             obj1.setToChat(dingTalkConstant.DING_TALK_DAILY_REPORT_TO_CHAT);
             obj1.setDdFrom(dingTalkConstant.DING_TALK_CORP_ID);
-            obj1.setUserid(getDingTalkUserId(SecurityUtils.getUserId()));
+            obj1.setUserid(getDingTalkUserId(workReport.getSubmitterId()));
             //obj1.setToCids(dingTalkConstant.DING_TALK_DAILY_REPORT_TO_CIDS);//发送到群,群id
             req.setCreateReportParam(obj1);
             OapiReportCreateResponse rsp = client.execute(req, getDingTalkToken());
@@ -250,11 +242,15 @@ public class DingTalkAndMessage {
         } catch (Exception e) {
             log.error("钉钉报告发送消息时发生异常", e);
         }
+        log.info(userName + "的工作报告发送钉钉结束-----------------------------------");
     }
 
 
     @Async("asyncServiceExecutor")
     public void sendAsyncMessage(PmWorkReport newReport) {
+        String username = newReport.getCreateBy();
+        Long submitterId = newReport.getSubmitterId();
+        log.info(username + "的工作报告开始发送消息中心-----------------------------------");
         List<Long> userId = new ArrayList<>();
         if (!newReport.getCcTo().isEmpty()) {
             userId = Optional.ofNullable(newReport.getCcTo())
@@ -263,9 +259,13 @@ public class DingTalkAndMessage {
                             .collect(Collectors.toList()))
                     .orElse(Collections.emptyList());
         }
+        LambdaQueryWrapper<SysUser> nickNameQuery = Wrappers.lambdaQuery();
+        nickNameQuery.select(SysUser::getNickName)
+                .eq(SysUser::getUserId, submitterId);
+        SysUser nickName = sysUserMapper.selectOne(nickNameQuery);
         JSONObject jsonObject = new JSONObject();
         jsonObject.put("infoTitle", INFO_TITLE);
-        jsonObject.put("infoContent", SecurityUtils.getLoginUser().getSysUser().getNickName() + INFO_CONTENT);
+        jsonObject.put("infoContent", nickName + INFO_CONTENT);
         jsonObject.put("infoType", INFO_TYPE);
         jsonObject.put("id", newReport.getId());
         jsonObject.put("infoTypeName", INFO_TITLE);
@@ -278,36 +278,13 @@ public class DingTalkAndMessage {
 
             if (voidApiResult.isSuccess()) {
                 log.info("报告消息发送成功!");
-                //存入消息接收表
-                receiveMessages(userId, newReport.getId());
             } else {
                 log.error("报告消息发送失败!");
             }
         } catch (Exception e) {
             log.error("报告发送消息时发生异常", e);
         }
-    }
-
-    private void receiveMessages(List<Long> ids, Integer reportId) {
-        List<SysUser> users = pmWorkContentService.nickNames(ids);
-        if (ids.size() > 0) {
-            for (Long id : ids) {
-                PmReceive pmReceive = new PmReceive();
-                pmReceive.setReceiverId(id);
-                pmReceive.setReportId(reportId);
-                pmReceive.setTenantId(SecurityUtils.getTenantId());
-                pmReceive.setDeptId(SecurityUtils.getLoginUser().getSysUser().getDeptId());
-                pmReceive.setCreateBy(SecurityUtils.getUsername());
-                pmReceive.setCreateTime(LocalDateTime.now());
-                for (SysUser user : users) {
-                    if (user.getUserId().equals(id)) {
-                        pmReceive.setReceiverName(user.getUserName());
-                    }
-                }
-                pmReceive.setReadFlag(0);
-                pmReceiveMapper.insert(pmReceive);
-            }
-        }
+        log.info(username + "的工作报告发送消息中心完成-----------------------------------");
     }
 }
 

+ 104 - 52
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkReportServiceImpl.java

@@ -13,7 +13,9 @@ import com.usky.iot.service.PmWorkReportService;
 import com.usky.common.mybatis.core.AbstractCrudService;
 import com.usky.iot.service.config.DingTalkAndMessage;
 import com.usky.iot.service.vo.PmProjectWorkTimeVo;
+import com.usky.system.domain.SysUser;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -23,7 +25,6 @@ import java.math.RoundingMode;
 import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -57,6 +58,9 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
     @Autowired
     private DingTalkAndMessage dingTalkAndMessage;
 
+    @Autowired
+    private PmReceiveMapper pmReceiveMapper;
+
     /**
      * 获取时间内工作报告
      *
@@ -101,9 +105,7 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
         }
         //固定返回七条数据,没有内容也要设置时间给前端渲染
         LambdaQueryWrapper<PmWorkReport> queryWrapperR = Wrappers.lambdaQuery();
-        queryWrapperR.select(PmWorkReport::getId, PmWorkReport::getReportDate, PmWorkReport::getSubmitDate, PmWorkReport::getUpdateTime,
-                PmWorkReport::getTomorrowPlan, PmWorkReport::getCoordinateWork, PmWorkReport::getCcTo, PmWorkReport::getSendDingTalk)
-                .eq(PmWorkReport::getSubmitterId, SecurityUtils.getUserId())
+        queryWrapperR.eq(PmWorkReport::getSubmitterId, SecurityUtils.getUserId())
                 .between(PmWorkReport::getReportDate, startDate1, endDate1)
                 .orderByAsc(PmWorkReport::getReportDate)
                 .apply(reportId != 0, "id = " + reportId);
@@ -197,11 +199,10 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
         String userName = SecurityUtils.getUsername();
         Long userId = SecurityUtils.getUserId();
         Integer tenantId = SecurityUtils.getTenantId();
-        LocalDateTime dateTime = LocalDateTime.now();
         BigDecimal totalWorkTime = BigDecimal.ZERO; //计算总工时
-        int minutesToAdd = 5;
+        LocalDateTime dateTime = LocalDateTime.now();
         LocalDateTime timingTime = pmWorkReport.getTimingTime();
-        LocalDateTime currentTimePlusMinutes = dateTime.plusMinutes(minutesToAdd);
+        LocalDateTime currentTimePlusMinutes = dateTime.plusMinutes(5);
 
         if (pmWorkReport.getWorkContents() == null) {
             throw new BusinessException("报告内容不能为空,请检查!");
@@ -244,13 +245,13 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
             newReport.setTenantId(tenantId);
             newReport.setTotalHours(totalWorkTime);
             newReport.setSendDingTalk(pmWorkReport.getSendDingTalk());
-            if (pmWorkReport.getIsRegularlySend() != 0) {
-                if (timingTime != null && timingTime.isBefore(currentTimePlusMinutes)) {
+            if (pmWorkReport.getIsRegularlySend() == 1 && timingTime != null) {
+                if (timingTime.isAfter(currentTimePlusMinutes)) {
                     newReport.setIsRegularlySend(pmWorkReport.getIsRegularlySend());
                     newReport.setTimingTime(timingTime);
                     newReport.setReportStatus(0);
                 } else {
-                    throw new BusinessException("定时时间需大于五分钟!");
+                    throw new BusinessException("定时时间需提前至少五分钟!");
                 }
             }
             try {
@@ -269,6 +270,7 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
             //查出所有项目id对应项目名
             List<PmProject> project = pmProjectService.projectName(projectIds);
             //将项目名重新赋值
+            List<PmWorkContent> pmWorkContents = new ArrayList<>();
             for (PmWorkContent b : pmWorkReport.getWorkContents()) {
                 for (int c = 0; c < project.size(); c++) {
                     if (b.getProjectId() == project.get(c).getId()) {
@@ -288,62 +290,99 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
                 newContent.setDeptId(deptId);
                 newContent.setTenantId(tenantId);
                 pmWorkContentMapper.insert(newContent);
+                pmWorkContents.add(newContent);
             }
-            //非定时发送
-            if (timingTime == null) {
-                //推送消息中心
-                dingTalkAndMessage.sendAsyncMessage(newReport);
+            //抄送人不为空,非定时发送
+            if (StringUtils.isNotEmpty(pmWorkReport.getCcTo())) {
+                if (timingTime == null) {
+                    //推送消息中心
+                    dingTalkAndMessage.sendAsyncMessage(newReport);
 
-                //是否同步钉钉
-                if (pmWorkReport.getSendDingTalk() == 1) {
-                    dingTalkAndMessage.sendDingTalkDailyReport(newReport, pmWorkReport.getWorkContents());
+                    //是否同步钉钉
+                    if (pmWorkReport.getSendDingTalk() == 1) {
+                        dingTalkAndMessage.sendDingTalkDailyReport(newReport, pmWorkContents);
+                    }
                 }
+                //存入报告消息表
+                List<Long> longList = Arrays.stream(pmWorkReport.getCcTo().split(","))
+                        .map(Long::parseLong)
+                        .collect(Collectors.toList());
+                receiveMessages(longList, newReport.getId());
             }
-
         } else if (repeat.size() > 0) {
             PmWorkReport rp = new PmWorkReport();
             rp.setId(pmWorkReport.getId());
-            rp.setReportDate(pmWorkReport.getReportDate());
+            //rp.setReportDate(pmWorkReport.getReportDate());
             rp.setSubmitterId(pmWorkReport.getSubmitterId());
-            rp.setSubmitDate(pmWorkReport.getSubmitDate());
+            //rp.setSubmitDate(pmWorkReport.getSubmitDate());
             rp.setCcTo(pmWorkReport.getCcTo());
             rp.setCoordinateWork(pmWorkReport.getCoordinateWork());
             rp.setTomorrowPlan(pmWorkReport.getTomorrowPlan());
             rp.setCreateBy(pmWorkReport.getCreateBy());
-            rp.setCreateTime(pmWorkReport.getCreateTime());
-            rp.setUpdateTime(dateTime);
-            rp.setDeptId(pmWorkReport.getDeptId());
-            rp.setTenantId(pmWorkReport.getTenantId());
+            //rp.setCreateTime(pmWorkReport.getCreateTime());
+            //rp.setDeptId(pmWorkReport.getDeptId());
+            //rp.setTenantId(pmWorkReport.getTenantId());
             rp.setUpdateBy(userName);
             rp.setUpdateTime(dateTime);
             rp.setTotalHours(totalWorkTime);
-            if (pmWorkReport.getIsRegularlySend() != 0) {
-                if (timingTime != null && timingTime.isBefore(currentTimePlusMinutes)) {
-                    rp.setIsRegularlySend(pmWorkReport.getIsRegularlySend());
+            if (pmWorkReport.getIsRegularlySend() == 1) {
+                if (timingTime != null && timingTime.isAfter(currentTimePlusMinutes)) {
                     rp.setTimingTime(timingTime);
-                    rp.setReportStatus(0);
                 } else {
                     throw new BusinessException("定时时间需大于五分钟!");
                 }
+            } else {
+                rp.setIsRegularlySend(0);
+            }
+            //rp.setReportStatus(pmWorkReport.getReportStatus());
+            rp.setSendDingTalk(pmWorkReport.getSendDingTalk());
+            pmWorkReportMapper.updateById(rp);
+            LambdaQueryWrapper<PmWorkContent> queryWrapper = Wrappers.lambdaQuery();
+            queryWrapper.select(PmWorkContent::getReportId, PmWorkContent::getSubmitterId, PmWorkContent::getCreateBy, PmWorkContent::getCreateTime, PmWorkContent::getDeptId, PmWorkContent::getTenantId)
+                    .eq(PmWorkContent::getReportId, pmWorkReport.getId())
+                    .last("LIMIT 1");
+            PmWorkContent f = pmWorkContentMapper.selectOne(queryWrapper);
+            pmWorkContentService.deleteContent(pmWorkReport.getId());
+            List<PmWorkContent> contents = pmWorkReport.getWorkContents();
+            List<PmWorkContent> contentsList = new ArrayList<>();
+            for (PmWorkContent e : contents) {
+                e.setReportId(f.getReportId());
+                e.setUpdateBy(userName);
+                e.setUpdateTime(dateTime);
+                e.setSubmitterId(f.getSubmitterId());
+                e.setCreateTime(f.getCreateTime());
+                e.setCreateBy(f.getCreateBy());
+                e.setDeptId(f.getDeptId());
+                e.setTenantId(f.getTenantId());
+                pmWorkContentMapper.insert(e);
+                contentsList.add(e);
+            }
+            if (pmWorkReport.getSendDingTalk().equals(1)) {
+                dingTalkAndMessage.sendDingTalkDailyReport(rp, contentsList);
+                rp.setReportStatus(1);
                 pmWorkReportMapper.updateById(rp);
-                LambdaQueryWrapper<PmWorkContent> queryWrapper = Wrappers.lambdaQuery();
-                queryWrapper.select(PmWorkContent::getReportId, PmWorkContent::getSubmitterId, PmWorkContent::getCreateBy, PmWorkContent::getCreateTime, PmWorkContent::getDeptId, PmWorkContent::getTenantId)
-                        .eq(PmWorkContent::getReportId, pmWorkReport.getId())
-                        .last("LIMIT 1");
-                PmWorkContent f = pmWorkContentMapper.selectOne(queryWrapper);
-                pmWorkContentService.deleteContent(pmWorkReport.getId());
-                List<PmWorkContent> contents = pmWorkReport.getWorkContents();
-                for (PmWorkContent e : contents) {
-                    e.setReportId(f.getReportId());
-                    e.setUpdateBy(userName);
-                    e.setUpdateTime(dateTime);
-                    e.setSubmitterId(f.getSubmitterId());
-                    e.setCreateTime(f.getCreateTime());
-                    e.setCreateBy(f.getCreateBy());
-                    e.setDeptId(f.getDeptId());
-                    e.setTenantId(f.getTenantId());
-                    pmWorkContentMapper.insert(e);
+            }
+        }
+    }
+
+    private void receiveMessages(List<Long> ids, Integer reportId) {
+        List<SysUser> users = pmWorkContentService.nickNames(ids);
+        if (ids.size() > 0) {
+            for (Long id : ids) {
+                PmReceive pmReceive = new PmReceive();
+                pmReceive.setReceiverId(id);
+                pmReceive.setReportId(reportId);
+                pmReceive.setTenantId(SecurityUtils.getTenantId());
+                pmReceive.setDeptId(SecurityUtils.getLoginUser().getSysUser().getDeptId());
+                pmReceive.setCreateBy(SecurityUtils.getUsername());
+                pmReceive.setCreateTime(LocalDateTime.now());
+                for (SysUser user : users) {
+                    if (user.getUserId().equals(id)) {
+                        pmReceive.setReceiverName(user.getUserName());
+                    }
                 }
+                pmReceive.setReadFlag(0);
+                pmReceiveMapper.insert(pmReceive);
             }
         }
     }
@@ -435,9 +474,10 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
     @Transactional
     @Override
     public void timedSending(LocalDateTime time) {
+        log.info("定时报告任务开始---------------------------");
         LambdaQueryWrapper<PmWorkReport> reports = Wrappers.lambdaQuery();
-        reports.eq(PmWorkReport::getIsRegularlySend, 1)
-                .eq(PmWorkReport::getReportStatus, 0)
+        reports.eq(PmWorkReport::getReportStatus, 0)
+                .eq(PmWorkReport::getIsRegularlySend, 1)
                 .le(PmWorkReport::getTimingTime, time)
                 .orderByAsc(PmWorkReport::getTimingTime);
         List<PmWorkReport> reportList = pmWorkReportMapper.selectList(reports);
@@ -454,16 +494,28 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
                 List<PmWorkContent> workContents = new ArrayList<>();
                 for (PmWorkContent content : pmWorkContentList) {
                     Integer reportId = content.getReportId();
-                    if (reportId == id) {
+                    if (reportId.equals(id)) {
                         workContents.add(content);
                     }
                 }
-                dingTalkAndMessage.sendDingTalkDailyReport(report, workContents);
-                dingTalkAndMessage.sendAsyncMessage(report);
+                try {
+                    dingTalkAndMessage.sendAsyncMessage(report);
+                } catch (Exception e) {
+                    log.error("定时报告" + report.getId() + "调用消息中心异常" + e);
+                }
+                if (report.getSendDingTalk() == 1) {
+                    try {
+                        dingTalkAndMessage.sendDingTalkDailyReport(report, workContents);
+                    } catch (Exception e) {
+                        log.error("定时报告" + report.getId() + "发送钉钉异常" + e);
+                    }
+                }
+
+                report.setReportStatus(1);
+                pmWorkReportMapper.updateById(report);
             }
         }
-
-
+        log.info("定时报告任务结束---------------------------");
     }