فهرست منبع

添加报告状态(已读未读);修复问题代码;优化字符串拼接

fuyuhchuan 9 ماه پیش
والد
کامیت
cb99f32bc4

+ 35 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmReceiveController.java

@@ -0,0 +1,35 @@
+package com.usky.iot.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.iot.service.PmReceiveService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 报告接收表 前端控制器
+ * </p>
+ *
+ * @author han
+ * @since 2024-07-09
+ */
+@RestController
+@RequestMapping("/pmReceive")
+public class PmReceiveController {
+
+    @Autowired
+    private PmReceiveService pmReceiveService;
+
+    @GetMapping("/updateReadFlag")
+    public void updateReadFlag(Integer reportId){
+        pmReceiveService.updateReadFlag(reportId);
+    }
+
+}
+

+ 15 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkContentController.java

@@ -2,6 +2,7 @@ package com.usky.iot.controller.web;
 
 
 import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
 import com.usky.iot.domain.PmWorkContent;
 import com.usky.iot.domain.PmWorkReport;
 import com.usky.iot.service.PmWorkContentService;
@@ -55,6 +56,20 @@ public class PmWorkContentController {
         return ApiResult.success(pmWorkContentService.workReportQuery(startDate, endDate, projectName, projectAscription, reportId));
     }
 
+    /**
+     * APP报告详情分页列表
+     * @param projectAscription 1:我负责;2:我收到;3:我发出
+     * @param pageNum 页数
+     * @param pageSize 页大小
+     * @return
+     */
+    @GetMapping("/page")
+    public ApiResult<CommonPage<PmWorkReport>> page(@RequestParam(value = "projectAscription", required = false, defaultValue = "2") Integer projectAscription,
+                                                    @RequestParam(value = "pageNum") Integer pageNum,
+                                                    @RequestParam(value = "pageSize") Integer pageSize){
+        return ApiResult.success(pmWorkContentService.reportPage(projectAscription, pageNum, pageSize));
+    }
+
     @GetMapping("/workHourStatistic")
     public ApiResult<List<Object>> workHourStatistic(@RequestParam(value = "userId", required = false) Long userId,
                                                      @RequestParam(value = "projectId", required = false) Integer projectId,

+ 82 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/PmReceive.java

@@ -0,0 +1,82 @@
+package com.usky.iot.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 报告接收表
+ * </p>
+ *
+ * @author han
+ * @since 2024-07-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class PmReceive implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 接收人ID
+     */
+    private Long receiverId;
+
+    /**
+     * 接收人
+     */
+    private String receiverName;
+
+    /**
+     * 报告id
+     */
+    private Integer reportId;
+
+
+    /**
+     * 租户号
+     */
+    private Integer tenantId;
+
+    /**
+     * 组织机构ID
+     */
+    private Long deptId;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新人
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 是否已读;0、未读,1、已读
+     */
+    private Integer readFlag;
+
+
+}

+ 5 - 1
service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/PmWorkReport.java

@@ -105,5 +105,9 @@ public class PmWorkReport implements Serializable {
     @TableField(exist = false)
     private List<PmWorkContent> workContents;
 
-
+    /**
+     * 已/未读标识
+     */
+    @TableField(exist = false)
+    private Integer readFlag;
 }

+ 18 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/PmReceiveMapper.java

@@ -0,0 +1,18 @@
+package com.usky.iot.mapper;
+
+import com.usky.iot.domain.PmReceive;
+import com.usky.common.mybatis.core.CrudMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ * 报告接收表 Mapper 接口
+ * </p>
+ *
+ * @author han
+ * @since 2024-07-09
+ */
+@Repository
+public interface PmReceiveMapper extends CrudMapper<PmReceive> {
+
+}

+ 27 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmReceiveService.java

@@ -0,0 +1,27 @@
+package com.usky.iot.service;
+
+import com.usky.iot.domain.PmReceive;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * 报告接收表 服务类
+ * </p>
+ *
+ * @author han
+ * @since 2024-07-09
+ */
+public interface PmReceiveService extends CrudService<PmReceive> {
+
+    /**
+     * 新增接收记录
+     */
+    void add(PmReceive receive);
+
+    /**
+     * 已/未读状态更新
+     */
+    void updateReadFlag(Integer reportId);
+
+
+}

+ 18 - 2
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmWorkContentService.java

@@ -1,8 +1,11 @@
 package com.usky.iot.service;
 
+import com.usky.common.core.bean.CommonPage;
 import com.usky.iot.domain.PmWorkContent;
 import com.usky.common.mybatis.core.CrudService;
 import com.usky.iot.domain.PmWorkReport;
+import com.usky.system.domain.SysUser;
+
 import java.util.List;
 
 /**
@@ -28,7 +31,7 @@ public interface PmWorkContentService extends CrudService<PmWorkContent> {
      * @param startDate         开始时间
      * @param endDate           结束时间
      * @param projectName       项目名
-     * @param projectAscription 查询标识(1:我负责的;2:抄送我的)
+     * @param projectAscription 查询标识(1:我负责的;2:抄送我的,3:我发出的
      * @return
      */
     List<PmWorkContent> projectQuery(String startDate, String endDate, String projectName, Integer projectAscription, Integer reportId);
@@ -39,11 +42,24 @@ public interface PmWorkContentService extends CrudService<PmWorkContent> {
      * @param startDate         开始时间
      * @param endDate           结束时间
      * @param projectName       项目名
-     * @param projectAscription 查询标识(1:我负责的;2:抄送我的)
+     * @param projectAscription 查询标识(1:我负责的;2:抄送我的;3;我发出
      * @return
      */
     List<PmWorkReport> workReportQuery(String startDate, String endDate, String projectName, Integer projectAscription, Integer reportId);
 
+    List<SysUser> nickNames(List<Long> userIds);
+
+    List<SysUser> allNickName();
+
+    /**
+     * APP报告详情分页列表
+     * @param projectAscription 1:我负责;2:我收到;3:我发出
+     * @param pageNum 页数
+     * @param pageSize 页大小
+     * @return
+     */
+    CommonPage<PmWorkReport> reportPage(Integer projectAscription, Integer pageNum, Integer pageSize);
+
     /** 工时统计页面
      * @param userId          用户id
      * @param filter          是否过滤0工时(默认1:不过滤;2:过滤)

+ 47 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmReceiveServiceImpl.java

@@ -0,0 +1,47 @@
+package com.usky.iot.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.usky.common.security.utils.SecurityUtils;
+import com.usky.iot.domain.PmReceive;
+import com.usky.iot.mapper.PmReceiveMapper;
+import com.usky.iot.service.PmReceiveService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 报告接收表 服务实现类
+ * </p>
+ *
+ * @author han
+ * @since 2024-07-09
+ */
+@Service
+public class PmReceiveServiceImpl extends AbstractCrudService<PmReceiveMapper, PmReceive> implements PmReceiveService {
+
+    @Autowired
+    private PmReceiveMapper pmReceiveMapper;
+
+    @Override
+    public void add(PmReceive receive) {
+
+    }
+
+    @Override
+    public void updateReadFlag(Integer reportId) {
+        Long userId = SecurityUtils.getUserId();
+        LambdaUpdateWrapper<PmReceive> updateWrapper = Wrappers.lambdaUpdate();
+        updateWrapper
+                .set(PmReceive::getReadFlag, 1)
+                .set(PmReceive::getUpdateBy, SecurityUtils.getUsername())
+                .set(PmReceive::getUpdateTime, LocalDateTime.now())
+                .eq(PmReceive::getReportId, reportId)
+                .eq(PmReceive::getReceiverId, userId);
+        pmReceiveMapper.update(null, updateWrapper);
+    }
+}

+ 145 - 12
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkContentServiceImpl.java

@@ -1,16 +1,15 @@
 package com.usky.iot.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.common.core.bean.CommonPage;
 import com.usky.common.security.utils.SecurityUtils;
-import com.usky.iot.domain.PmProject;
+import com.usky.iot.domain.PmReceive;
 import com.usky.iot.domain.PmWorkContent;
 import com.usky.iot.domain.PmWorkReport;
-import com.usky.iot.mapper.PmProjectMapper;
-import com.usky.iot.mapper.PmWorkContentMapper;
-import com.usky.iot.mapper.PmWorkReportMapper;
-import com.usky.iot.mapper.SysUserMapper;
+import com.usky.iot.mapper.*;
 import com.usky.iot.service.PmProjectService;
 import com.usky.iot.service.PmWorkContentService;
 import com.usky.common.mybatis.core.AbstractCrudService;
@@ -47,6 +46,9 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
     @Autowired
     private PmProjectService pmProjectService;
 
+    @Autowired
+    private PmReceiveMapper pmReceiveMapper;
+
     @Override
     public void deleteContent(Integer reportId) {
         LambdaQueryWrapper<PmWorkContent> deleteWrapper = Wrappers.lambdaQuery();
@@ -68,6 +70,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         LocalDate end = LocalDate.parse(endDate);
         String subQueryReports = "SELECT id FROM pm_work_report WHERE report_date BETWEEN '" + start + "' AND '" + end + "' AND tenant_id = " + SecurityUtils.getTenantId();
         String subQueryReport = "SELECT id FROM pm_work_report WHERE FIND_IN_SET('" + SecurityUtils.getUserId() + "', cc_to) > 0 AND tenant_id = " + SecurityUtils.getTenantId();
+        String sentOut = "SELECT id FROM pm_work_report WHERE create_by = '" + SecurityUtils.getUsername() + "' AND tenant_id = " + SecurityUtils.getTenantId();
         String subQueryProjects = "SELECT id FROM pm_project WHERE project_head = '" + SecurityUtils.getUserId() + "' AND tenant_id = " + SecurityUtils.getTenantId();
         LambdaQueryWrapper<PmWorkContent> contentLambdaQuery = Wrappers.lambdaQuery();
         contentLambdaQuery.select(PmWorkContent::getProjectId, PmWorkContent::getProjectName)
@@ -79,6 +82,8 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
             contentLambdaQuery.inSql(PmWorkContent::getProjectId, subQueryProjects);
         } else if (projectAscription == 2) {
             contentLambdaQuery.inSql(PmWorkContent::getReportId, subQueryReport);
+        } else if (projectAscription == 3) {
+            contentLambdaQuery.inSql(PmWorkContent::getReportId, sentOut);
         }
         contentLambdaQuery.groupBy(PmWorkContent::getProjectId, PmWorkContent::getProjectName);
         List<PmWorkContent> pmWorkContentList = this.list(contentLambdaQuery);
@@ -120,14 +125,14 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
                 contentLambdaQuery.inSql(PmWorkContent::getProjectId, subQueryProjects);
             } else if (projectAscription == 2) {
                 contentLambdaQuery.inSql(PmWorkContent::getReportId, subQueryReport);
-            } else if(projectAscription==3){
+            } else if (projectAscription == 3) {
                 contentLambdaQuery.inSql(PmWorkContent::getReportId, sentOut);
             }
             if (StringUtils.isNotBlank(projectName)) {
                 contentLambdaQuery.inSql(PmWorkContent::getReportId, reportIdList);
             }
             pmWorkContentList = this.list(contentLambdaQuery);
-            if (pmWorkContentList == null || pmWorkContentList.size() == 0) {
+            if (pmWorkContentList.isEmpty()) {
                 return reportList;
             }
             List<Integer> reportIds = new ArrayList<>();
@@ -140,21 +145,147 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
                     .in(PmWorkReport::getId, reportIds)
                     .orderByDesc(PmWorkReport::getCreateTime);
             reportList = pmWorkReportMapper.selectList(reportQuery);
+            LambdaQueryWrapper<PmReceive> statusQuery = Wrappers.lambdaQuery();
+            statusQuery.select(PmReceive::getReportId, PmReceive::getReadFlag)
+                    .eq(PmReceive::getReceiverId, SecurityUtils.getUserId())
+                    .eq(PmReceive::getTenantId, SecurityUtils.getTenantId())
+                    .in(PmReceive::getReportId, reportIds);
+            List<PmReceive> receiveList = pmReceiveMapper.selectList(statusQuery);
             for (PmWorkReport c : reportList) {
                 List<PmWorkContent> contents = new ArrayList<>();
                 for (PmWorkContent b : pmWorkContentList) {
-                    if (b.getReportId() == c.getId()) {
+                    if (b.getReportId().equals(c.getId())) {
                         contents.add(b);
                     }
                 }
                 c.setWorkContents(contents);
+                if (!receiveList.isEmpty()) {
+                    for (PmReceive receive : receiveList) {
+                        if (receive.getReportId().equals(c.getId())) {
+                            c.setReadFlag(receive.getReadFlag());
+                        }
+                    }
+                }
                 userIds.add(c.getSubmitterId());
             }
         }
+        List<SysUser> nickNames = nickNames(userIds);
+        for (PmWorkReport d : reportList) {
+            for (SysUser e : nickNames) {
+                if (e.getUserId().equals(d.getSubmitterId())) {
+                    d.setCreateBy(e.getNickName());
+                }
+            }
+            List<Long> ids = Optional.ofNullable(d.getCcTo())
+                    .map(ccTo -> Arrays.stream(ccTo.split(","))
+                            .map(Long::parseLong)
+                            .collect(Collectors.toList()))
+                    .orElse(Collections.emptyList());
+            List<SysUser> nickNameList = nickNames(ids);
+            StringBuilder ccToBuilder = new StringBuilder();
+            Set<Long> addedUserIds = new HashSet<>();
+            for (Long id : ids) {
+                for (SysUser user : nickNameList) {
+                    if (user.getUserId().equals(id) && !addedUserIds.contains(id)) {
+                        if (ccToBuilder.length() > 0) {
+                            ccToBuilder.append(", ");
+                        }
+                        ccToBuilder.append(user.getNickName());
+                        addedUserIds.add(id);
+                        break;
+                    }
+                }
+            }
+            String ccTo = ccToBuilder.toString();
+            d.setCcTo(ccTo);
+        }
+        return reportList;
+    }
+
+    @Override
+    public List<SysUser> nickNames(List<Long> userIds) {
         LambdaQueryWrapper<SysUser> usersQuery = Wrappers.lambdaQuery();
-        usersQuery.select(SysUser::getUserId, SysUser::getNickName)
+        usersQuery.select(SysUser::getUserId, SysUser::getNickName, SysUser::getUserName)
+                .eq(SysUser::getTenantId, SecurityUtils.getTenantId())
+                .eq(SysUser::getDelFlag, 0)
                 .in(SysUser::getUserId, userIds);
-        List<SysUser> nickNames = sysUserMapper.selectList(usersQuery);
+        return sysUserMapper.selectList(usersQuery);
+    }
+
+    @Override
+    public List<SysUser> allNickName() {
+        LambdaQueryWrapper<SysUser> usersQuery = Wrappers.lambdaQuery();
+        usersQuery.select(SysUser::getUserId, SysUser::getNickName, SysUser::getUserName)
+                .eq(SysUser::getTenantId, SecurityUtils.getTenantId())
+                .eq(SysUser::getDelFlag, 0);
+        return sysUserMapper.selectList(usersQuery);
+    }
+
+    @Override
+    public CommonPage<PmWorkReport> reportPage(Integer projectAscription, Integer pageNum, Integer pageSize) {
+        Integer tenantId = SecurityUtils.getTenantId();
+        Long userId = SecurityUtils.getUserId();
+        List<Long> userIds = new ArrayList<>();
+
+        LambdaQueryWrapper<PmWorkContent> contentLambdaQuery = Wrappers.lambdaQuery();
+        contentLambdaQuery.select(PmWorkContent::getReportId, PmWorkContent::getWorkContent, PmWorkContent::getWorkTime, PmWorkContent::getProjectName)
+                .apply("report_id IN (SELECT id FROM pm_work_report WHERE tenant_id = '" + tenantId + "')")
+                .apply("tenant_id = '" + tenantId + "'");
+
+        switch (projectAscription) {
+            case 1:
+                contentLambdaQuery.apply("project_id IN (SELECT id FROM pm_project WHERE project_head = '" + userId + "' AND tenant_id = '" + tenantId + "')");
+                break;
+            case 2:
+                contentLambdaQuery.apply("report_id IN (SELECT id FROM pm_work_report WHERE FIND_IN_SET('" + userId + "', cc_to) > 0 AND tenant_id = '" + tenantId + "')");
+                break;
+            case 3:
+                contentLambdaQuery.apply("create_by ='" + userId + "' AND tenant_id = '" + tenantId + "'");
+                break;
+        }
+
+        List<PmWorkContent> pmWorkContentList = this.list(contentLambdaQuery);
+        Set<Integer> reportIds = pmWorkContentList.stream().map(PmWorkContent::getReportId).collect(Collectors.toSet());
+
+        if (reportIds.isEmpty()) {
+            return new CommonPage<>(new ArrayList<>(), 0, pageSize, pageNum);
+        }
+
+        LambdaQueryWrapper<PmWorkReport> reportQuery = Wrappers.lambdaQuery();
+        reportQuery.select(PmWorkReport::getId, PmWorkReport::getCoordinateWork, PmWorkReport::getTomorrowPlan, PmWorkReport::getCcTo, PmWorkReport::getSubmitterId,
+                PmWorkReport::getCreateTime, PmWorkReport::getReportDate)
+                .in(PmWorkReport::getId, reportIds)
+                .orderByDesc(PmWorkReport::getCreateTime);
+
+        List<PmWorkReport> reportList = pmWorkReportMapper.selectList(reportQuery);
+
+        LambdaQueryWrapper<PmReceive> statusQuery = Wrappers.lambdaQuery();
+        statusQuery.select(PmReceive::getReportId, PmReceive::getReadFlag)
+                .eq(PmReceive::getReceiverId, userId)
+                .eq(PmReceive::getTenantId, tenantId)
+                .in(PmReceive::getReportId, reportIds);
+
+        List<PmReceive> receiveList = pmReceiveMapper.selectList(statusQuery);
+
+        for (PmWorkReport c : reportList) {
+            List<PmWorkContent> contents = new ArrayList<>();
+            for (PmWorkContent b : pmWorkContentList) {
+                if (b.getReportId().equals(c.getId())) {
+                    contents.add(b);
+                }
+            }
+            c.setWorkContents(contents);
+            userIds.add(c.getSubmitterId());
+            if (!receiveList.isEmpty()) {
+                for (PmReceive receive : receiveList) {
+                    if (receive.getReportId().equals(c.getId())) {
+                        c.setReadFlag(receive.getReadFlag());
+                    }
+                }
+            }
+        }
+
+        List<SysUser> nickNames = nickNames(userIds);
         for (PmWorkReport d : reportList) {
             for (SysUser e : nickNames) {
                 if (e.getUserId().equals(d.getSubmitterId())) {
@@ -162,9 +293,11 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
                 }
             }
         }
-        return reportList;
+
+        return new CommonPage<>(reportList, reportList.size(), pageSize, pageNum);
     }
 
+
     @Override
     public List<Object> workHourStatistic(Long userId, Integer projectId, Integer filter, String startDate, String endDate, Integer workerOrProject) {
         List<ProjectWorkTimeVO> projectWorkTime = new ArrayList<>();

+ 92 - 53
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkReportServiceImpl.java

@@ -6,8 +6,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.usky.common.core.exception.BusinessException;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.iot.domain.PmProject;
+import com.usky.iot.domain.PmReceive;
 import com.usky.iot.domain.PmWorkContent;
 import com.usky.iot.domain.PmWorkReport;
+import com.usky.iot.mapper.PmReceiveMapper;
 import com.usky.iot.mapper.PmWorkContentMapper;
 import com.usky.iot.mapper.PmWorkReportMapper;
 import com.usky.iot.service.PmProjectService;
@@ -16,6 +18,7 @@ import com.usky.iot.service.PmWorkReportService;
 import com.usky.common.mybatis.core.AbstractCrudService;
 import com.usky.iot.service.vo.PmProjectWorkTimeVo;
 import com.usky.system.RemoteMceService;
+import com.usky.system.domain.SysUser;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -42,6 +45,10 @@ import java.util.stream.Collectors;
 @Service
 public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMapper, PmWorkReport> implements PmWorkReportService {
 
+    private static final String INFO_TITLE = "报告提醒";
+    private static final String INFO_CONTENT = "的报告";
+    private static final int INFO_TYPE = 5;
+
     @Autowired
     private PmWorkContentMapper pmWorkContentMapper;
 
@@ -57,6 +64,9 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
     @Autowired
     private RemoteMceService remoteMceService;
 
+    @Autowired
+    private PmReceiveMapper pmReceiveMapper;
+
     /**
      * 获取时间内工作报告
      *
@@ -92,11 +102,13 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
                 .orderByDesc(PmWorkReport::getSubmitDate)
                 .last("LIMIT 1");
         report = baseMapper.selectList(wrapper2);
-        Integer pId = report.get(0).getId();
-        LambdaQueryWrapper<PmWorkContent> wrapper = Wrappers.lambdaQuery();
-        wrapper.eq(PmWorkContent::getReportId, pId);
-        List<PmWorkContent> contents1 = pmWorkContentMapper.selectList(wrapper);
-        report.get(0).setWorkContents(contents1);
+        if (!report.isEmpty()) {
+            Integer pId = report.get(0).getId();
+            LambdaQueryWrapper<PmWorkContent> wrapper = Wrappers.lambdaQuery();
+            wrapper.eq(PmWorkContent::getReportId, pId);
+            List<PmWorkContent> contents1 = pmWorkContentMapper.selectList(wrapper);
+            report.get(0).setWorkContents(contents1);
+        }
         //固定返回七条数据,没有内容也要设置时间给前端渲染
         LambdaQueryWrapper<PmWorkReport> queryWrapperR = Wrappers.lambdaQuery();
         queryWrapperR.select(PmWorkReport::getId, PmWorkReport::getReportDate, PmWorkReport::getSubmitDate, PmWorkReport::getUpdateTime, PmWorkReport::getTomorrowPlan, PmWorkReport::getCoordinateWork, PmWorkReport::getCcTo)
@@ -190,25 +202,31 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
     @Transactional
     @Override
     public void addReport(PmWorkReport pmWorkReport) {
+        Long deptId = SecurityUtils.getLoginUser().getSysUser().getDeptId();
+        String userName = SecurityUtils.getUsername();
+        Long userId = SecurityUtils.getUserId();
+        Integer tenantId = SecurityUtils.getTenantId();
+        LocalDateTime dateTime = LocalDateTime.now();
         BigDecimal totalWorkTime = BigDecimal.ZERO; //计算总工时
-        int size = pmWorkReport.getWorkContents().size();
-        for (int p = 0; p < size; p++) {
-            for (int q = p + 1; q < size; q++) {
-                if (pmWorkReport.getWorkContents().get(p).getProjectId() == pmWorkReport.getWorkContents().get(q).getProjectId()) {
-                    throw new BusinessException("存在重复项目,请检查!");
-                }
+        if (pmWorkReport.getWorkContents() == null) {
+            throw new BusinessException("报告内容不能为空,请检查!");
+        }
+        Set<Integer> projectIds2 = new HashSet<>();
+        for (PmWorkContent workContent : pmWorkReport.getWorkContents()) {
+            if (!projectIds2.add(workContent.getProjectId())) {
+                throw new BusinessException("存在重复项目,请检查!");
             }
         }
         for (PmWorkContent a : pmWorkReport.getWorkContents()) {
             totalWorkTime = totalWorkTime.add(a.getWorkTime());
         }
         //判断总工时是否超过24h
-        BigDecimal noeDay = BigDecimal.valueOf(24);
-        int compareResult = totalWorkTime.compareTo(noeDay);
-        if (compareResult >= 0) {
+        BigDecimal maxWorkTimePerDay = BigDecimal.valueOf(24);
+        if (totalWorkTime.compareTo(maxWorkTimePerDay) >= 0) {
             throw new BusinessException("一天24小时都不够你用,请检查当日总工时!");
-        } else if (totalWorkTime == null || totalWorkTime.equals(BigDecimal.ZERO) || totalWorkTime.compareTo(BigDecimal.ZERO) < 0) {
-            throw new BusinessException("工时不能为空!");
+        }
+        if (totalWorkTime.compareTo(BigDecimal.ZERO) <= 0) {
+            throw new BusinessException("工时必须大于零!");
         }
         LambdaQueryWrapper<PmWorkReport> reportWrapper = Wrappers.lambdaQuery();
         reportWrapper.select(PmWorkReport::getId)
@@ -219,38 +237,24 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
         if (pmWorkReport.getId() == null) {
             PmWorkReport newReport = new PmWorkReport();
             newReport.setReportDate(pmWorkReport.getReportDate());
-            newReport.setSubmitterId(SecurityUtils.getUserId());
+            newReport.setSubmitterId(userId);
             newReport.setSubmitDate(LocalDateTime.now());
             newReport.setCcTo(pmWorkReport.getCcTo());
             newReport.setCoordinateWork(pmWorkReport.getCoordinateWork());
             newReport.setTomorrowPlan(pmWorkReport.getTomorrowPlan());
-            newReport.setCreateBy(SecurityUtils.getUsername());
-            newReport.setCreateTime(LocalDateTime.now());
-            newReport.setDeptId(SecurityUtils.getLoginUser().getSysUser().getDeptId());
-            newReport.setTenantId(SecurityUtils.getTenantId());
+            newReport.setCreateBy(userName);
+            newReport.setCreateTime(dateTime);
+            newReport.setDeptId(deptId);
+            newReport.setTenantId(tenantId);
             newReport.setTotalHours(totalWorkTime);
             pmWorkReportMapper.insert(newReport);
             //推送消息中心
-            String nickName = SecurityUtils.getLoginUser().getSysUser().getNickName();
-            String infoContent = nickName + "的报告";
-            List<Long> ids = Arrays.stream(newReport.getCcTo().split(","))
-                    .map(Long::parseLong)
-                    .collect(Collectors.toList());
-            JSONObject jsonObject = new JSONObject();
-            jsonObject.put("infoTitle", "报告提醒");
-            jsonObject.put("infoContent", infoContent);
-            jsonObject.put("infoType", 5);
-            jsonObject.put("id", newReport.getId());
-            jsonObject.put("userIds", ids);
-            // 异步发送消息
-            CompletableFuture.runAsync(() -> {
-                try {
-                    // 推送消息中心
-                    remoteMceService.addMce(jsonObject.toString());
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            });
+            List<Long> ids = Optional.ofNullable(newReport.getCcTo())
+                    .map(ccTo -> Arrays.stream(ccTo.split(","))
+                            .map(Long::parseLong)
+                            .collect(Collectors.toList()))
+                    .orElse(Collections.emptyList());
+            sendAsyncMessage(newReport, ids);
             //获取报告中所有项目id
             List<Integer> projectIds = new ArrayList<>();
             for (PmWorkContent b1 : pmWorkReport.getWorkContents()) {
@@ -258,6 +262,8 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
             }
             //查出所有项目id对应项目名
             List<PmProject> project = pmProjectService.projectName(projectIds);
+            //查username
+            List<SysUser> usersName = pmWorkContentService.nickNames(ids);
             //将项目名重新赋值
             for (PmWorkContent b : pmWorkReport.getWorkContents()) {
                 for (int c = 0; c < project.size(); c++) {
@@ -270,15 +276,32 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
                 newContent.setProjectId(b.getProjectId());
                 projectIds.add(b.getReportId());
                 newContent.setProjectName(b.getProjectName());
-                newContent.setSubmitterId(SecurityUtils.getUserId());
+                newContent.setSubmitterId(userId);
                 newContent.setWorkContent(b.getWorkContent());
                 newContent.setWorkTime(b.getWorkTime());
-                newContent.setCreateBy(SecurityUtils.getUsername());
-                newContent.setCreateTime(LocalDateTime.now());
-                newContent.setDeptId(SecurityUtils.getLoginUser().getSysUser().getDeptId());
-                newContent.setTenantId(SecurityUtils.getTenantId());
+                newContent.setCreateBy(userName);
+                newContent.setCreateTime(dateTime);
+                newContent.setDeptId(deptId);
+                newContent.setTenantId(tenantId);
                 pmWorkContentMapper.insert(newContent);
             }
+
+            for (Long id : ids) {
+                PmReceive pmReceive = new PmReceive();
+                pmReceive.setReceiverId(id);
+                for (SysUser user : usersName) {
+                    if (id == user.getUserId()){
+                        pmReceive.setReceiverName(user.getUserName());
+                    }
+                }
+                pmReceive.setReportId(newReport.getId());
+                pmReceive.setTenantId(tenantId);
+                pmReceive.setDeptId(deptId);
+                pmReceive.setCreateBy(userName);
+                pmReceive.setCreateTime(dateTime);
+                pmReceive.setReadFlag(0);
+                pmReceiveMapper.insert(pmReceive);
+            }
         } else if (repeat.size() > 0) {
             PmWorkReport rp = new PmWorkReport();
             rp.setId(pmWorkReport.getId());
@@ -290,15 +313,13 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
             rp.setTomorrowPlan(pmWorkReport.getTomorrowPlan());
             rp.setCreateBy(pmWorkReport.getCreateBy());
             rp.setCreateTime(pmWorkReport.getCreateTime());
-            rp.setUpdateBy(SecurityUtils.getUsername());
-            rp.setUpdateTime(LocalDateTime.now());
+            rp.setUpdateTime(dateTime);
             rp.setDeptId(pmWorkReport.getDeptId());
             rp.setTenantId(pmWorkReport.getTenantId());
-            rp.setUpdateBy(SecurityUtils.getUsername());
-            rp.setUpdateTime(LocalDateTime.now());
+            rp.setUpdateBy(userName);
+            rp.setUpdateTime(dateTime);
             rp.setTotalHours(totalWorkTime);
             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())
@@ -308,8 +329,8 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
             List<PmWorkContent> contents = pmWorkReport.getWorkContents();
             for (PmWorkContent e : contents) {
                 e.setReportId(f.getReportId());
-                e.setUpdateBy(SecurityUtils.getUsername());
-                e.setUpdateTime(LocalDateTime.now());
+                e.setUpdateBy(userName);
+                e.setUpdateTime(dateTime);
                 e.setSubmitterId(f.getSubmitterId());
                 e.setCreateTime(f.getCreateTime());
                 e.setCreateBy(f.getCreateBy());
@@ -320,6 +341,24 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
         }
     }
 
+    private void sendAsyncMessage(PmWorkReport newReport, List<Long> userId) {
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("infoTitle", INFO_TITLE);
+        jsonObject.put("infoContent", SecurityUtils.getLoginUser().getSysUser().getNickName() + INFO_CONTENT);
+        jsonObject.put("infoType", INFO_TYPE);
+        jsonObject.put("id", newReport.getId());
+        jsonObject.put("userIds", userId);
+        // 异步发送消息
+        CompletableFuture.runAsync(() -> {
+            try {
+                // 推送消息中心
+                remoteMceService.addMce(jsonObject.toString());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        });
+    }
+
     @Override
     public List<Map<String, Object>> countTime() {
         int scale = 2;

+ 20 - 0
service-iot/service-iot-biz/src/main/resources/mapper/iot/PmReceiveMapper.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.usky.iot.mapper.PmReceiveMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.iot.domain.PmReceive">
+        <id column="id" property="id" />
+        <result column="receiver_id" property="receiverId" />
+        <result column="receiver_name" property="receiverName" />
+        <result column="report_id" property="reportId" />
+        <result column="tenant_id" property="tenantId" />
+        <result column="dept_id" property="deptId" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="read_flag" property="readFlag" />
+    </resultMap>
+
+</mapper>