Browse Source

项目管理中工作报告添加和项目列表查询

fuyuhchuan 10 months ago
parent
commit
56ec3cdac9
18 changed files with 1087 additions and 0 deletions
  1. 54 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmProjectController.java
  2. 33 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkContentController.java
  3. 54 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkReportController.java
  4. 113 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/PmProject.java
  5. 94 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/PmWorkContent.java
  6. 109 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/PmWorkReport.java
  7. 18 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/PmProjectMapper.java
  8. 18 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/PmWorkContentMapper.java
  9. 18 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/PmWorkReportMapper.java
  10. 41 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmProjectService.java
  11. 23 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmWorkContentService.java
  12. 35 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmWorkReportService.java
  13. 132 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmProjectServiceImpl.java
  14. 32 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkContentServiceImpl.java
  15. 242 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkReportServiceImpl.java
  16. 26 0
      service-iot/service-iot-biz/src/main/resources/mapper/iot/PmProjectMapper.xml
  17. 22 0
      service-iot/service-iot-biz/src/main/resources/mapper/iot/PmWorkContentMapper.xml
  18. 23 0
      service-iot/service-iot-biz/src/main/resources/mapper/iot/PmWorkReportMapper.xml

+ 54 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmProjectController.java

@@ -0,0 +1,54 @@
+package com.usky.iot.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.security.utils.SecurityUtils;
+import com.usky.iot.domain.PmProject;
+import com.usky.iot.service.PmProjectService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 项目表 前端控制器
+ * </p>
+ *
+ * @author fu
+ * @since 2024-05-20
+ */
+@RestController
+@RequestMapping("/pmProject")
+public class PmProjectController {
+    @Autowired
+    private PmProjectService pmProjectService;
+
+    /**
+     * 查询项目名(下拉框)
+     *
+     * @return
+     */
+    @GetMapping("/projects")
+    public ApiResult<List<PmProject>> queryProjectName() {
+        return ApiResult.success(pmProjectService.queryProject());
+    }
+
+
+    @GetMapping("/page")
+    public ApiResult<CommonPage<PmProject>> pageList(@RequestParam(value = "projectName", required = false, defaultValue = "") String projectName,
+                                                     @RequestParam(value = "projectType", required = false, defaultValue = "0") Integer projectType,
+                                                     @RequestParam(value = "projectStatus", required = false, defaultValue = "0") Integer projectStatus,
+                                                     @RequestParam(value = "projectAscription", required = false) Integer projectAscription,
+                                                     @RequestParam(value = "pageNum", required = false, defaultValue = "1") Integer pageNum,
+                                                     @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize) {
+        return ApiResult.success(pmProjectService.projectList(projectName, projectType, projectStatus, projectAscription, pageNum, pageSize));
+    }
+
+}
+

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

@@ -0,0 +1,33 @@
+package com.usky.iot.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.iot.domain.PmWorkContent;
+import com.usky.iot.service.PmWorkContentService;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 工作内容表 前端控制器
+ * </p>
+ *
+ * @author fu
+ * @since 2024-05-20
+ */
+@RestController
+@RequestMapping("/pmWorkContent")
+public class PmWorkContentController {
+
+}
+

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

@@ -0,0 +1,54 @@
+package com.usky.iot.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.iot.domain.PmWorkReport;
+import com.usky.iot.service.PmWorkReportService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.temporal.TemporalAdjusters;
+import java.util.List;
+
+/**
+ * <p>
+ * 工作报告表 前端控制器
+ * </p>
+ *
+ * @author fu
+ * @since 2024-05-20
+ */
+@RestController
+@RequestMapping("/pmWorkReport")
+public class PmWorkReportController {
+    @Autowired
+    private PmWorkReportService pmWorkReportService;
+
+    /**
+     * 周工作报告查询
+     * @param startDate 开始时间
+     * @param endDate 结束时间
+     * @param id 报告id
+     * @return
+     */
+    @GetMapping("/week")
+    public ApiResult<List<PmWorkReport>> weekWork(@RequestParam(required = false) String startDate,
+                                                  @RequestParam(required = false) String endDate,
+                                                  @RequestParam(required = false, defaultValue = "0") Integer id) {
+
+        return ApiResult.success(pmWorkReportService.weekWork(startDate, endDate, id));
+    }
+
+    /**
+     * 添加工作报告
+     *
+     * @param
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody PmWorkReport pmWorkReport) {
+        pmWorkReportService.addReport(pmWorkReport);
+    }
+}
+

+ 113 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/PmProject.java

@@ -0,0 +1,113 @@
+package com.usky.iot.domain;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+
+import lombok.*;
+
+/**
+ * <p>
+ * 项目表
+ * </p>
+ *
+ * @author fu
+ * @since 2024-05-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class PmProject implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 项目表主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 项目名称
+     */
+    private String projectName;
+
+    /**
+     * 项目开始时间
+     */
+    private LocalDateTime startTime;
+
+    /**
+     * 项目结束时间
+     */
+    private LocalDateTime endTime;
+
+    /**
+     * 项目描述
+     */
+    private String projectDescribe;
+
+    /**
+     * 项目类型(1:人力外包,2:项目研发,3:采购项目,4:过标项目,5:集成项目,6:其他)
+     */
+    private Integer projectType;
+
+    /**
+     * 项目状态(1:未开始;2;进行中;3:已完成;4:已暂停;5:已作废)
+     */
+    private Integer projectStatus;
+
+    /**
+     * 负责人
+     */
+    private Long projectHead;
+
+    /**
+     * 项目成员
+     */
+    private String projectMember;
+
+    /**
+     * 项目工作量(计划人/天)
+     */
+    private BigDecimal projectWorkload;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 部门ID
+     */
+    private Integer deptId;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
+    /**
+     * 删除标识(默认0,已删除1)
+     */
+    private Integer delFlag;
+
+
+
+}

+ 94 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/PmWorkContent.java

@@ -0,0 +1,94 @@
+package com.usky.iot.domain;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.List;
+
+import lombok.*;
+import org.springframework.data.annotation.Transient;
+
+/**
+ * <p>
+ * 工作内容表
+ * </p>
+ *
+ * @author fu
+ * @since 2024-05-20
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class PmWorkContent implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 工作内容表主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 工作报告表主键ID
+     */
+    private Integer reportId;
+
+    /**
+     * 项目ID
+     */
+    private Integer projectId;
+
+    /**
+     * 项目名称
+     */
+    private String projectName;
+
+    /**
+     * 提交人ID
+     */
+    private Long submitterId;
+
+    /**
+     * 工作内容
+     */
+    private String workContent;
+
+    /**
+     * 工时
+     */
+    private BigDecimal workTime;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
+}

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

@@ -0,0 +1,109 @@
+package com.usky.iot.domain;
+
+import java.math.BigDecimal;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import lombok.*;
+import org.springframework.data.annotation.Transient;
+
+/**
+ * <p>
+ * 工作报告表
+ * </p>
+ *
+ * @author fu
+ * @since 2024-05-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class PmWorkReport implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 工作报告表主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 提交人ID
+     */
+    private Long submitterId;
+
+    /**
+     * 报告时间
+     */
+    private LocalDate reportDate;
+
+    /**
+     * 提交时间
+     */
+    private LocalDateTime submitDate;
+
+    /**
+     * 总工时
+     */
+    private BigDecimal totalHours;
+
+    /**
+     * 抄送人
+     */
+    private String ccTo;
+
+    /**
+     * 工作协调
+     */
+    private String coordinateWork;
+
+    /**
+     * 明日计划
+     */
+    private String tomorrowPlan;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
+    /**
+     * 工作报告对应内容
+     */
+    @Transient
+    private List<PmWorkContent> workContents;
+
+
+}

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

@@ -0,0 +1,18 @@
+package com.usky.iot.mapper;
+
+import com.usky.iot.domain.PmProject;
+import com.usky.common.mybatis.core.CrudMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ * 项目表 Mapper 接口
+ * </p>
+ *
+ * @author fu
+ * @since 2024-05-20
+ */
+@Repository
+public interface PmProjectMapper extends CrudMapper<PmProject> {
+
+}

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

@@ -0,0 +1,18 @@
+package com.usky.iot.mapper;
+
+import com.usky.iot.domain.PmWorkContent;
+import com.usky.common.mybatis.core.CrudMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ * 工作内容表 Mapper 接口
+ * </p>
+ *
+ * @author fu
+ * @since 2024-05-20
+ */
+@Repository
+public interface PmWorkContentMapper extends CrudMapper<PmWorkContent> {
+
+}

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

@@ -0,0 +1,18 @@
+package com.usky.iot.mapper;
+
+import com.usky.iot.domain.PmWorkReport;
+import com.usky.common.mybatis.core.CrudMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ * 工作报告表 Mapper 接口
+ * </p>
+ *
+ * @author fu
+ * @since 2024-05-20
+ */
+@Repository
+public interface PmWorkReportMapper extends CrudMapper<PmWorkReport> {
+
+}

+ 41 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmProjectService.java

@@ -0,0 +1,41 @@
+package com.usky.iot.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.iot.domain.PmProject;
+import com.usky.common.mybatis.core.CrudService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 项目表 服务类
+ * </p>
+ *
+ * @author fu
+ * @since 2024-05-20
+ */
+public interface PmProjectService extends CrudService<PmProject> {
+
+     void addProject(PmProject project);
+
+     void delProject(PmProject project);
+
+     void updateProject(PmProject project);
+
+     List<PmProject> queryProject();
+
+     /**
+      * 分页
+      *
+      * @param projectName       项目名
+      * @param projectType       类型
+      * @param projectStatus     状态
+      * @param projectAscription 项目归属类型
+      * @param pageNum           页码
+      * @param pageSize          页大小
+      * @return
+      */
+     CommonPage<PmProject> projectList(String projectName, Integer projectType, Integer projectStatus, Integer projectAscription, Integer pageNum, Integer pageSize);
+
+     List<PmProject> projectName(List<Integer> projectIds);
+}

+ 23 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmWorkContentService.java

@@ -0,0 +1,23 @@
+package com.usky.iot.service;
+
+import com.usky.iot.domain.PmWorkContent;
+import com.usky.common.mybatis.core.CrudService;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 工作内容表 服务类
+ * </p>
+ *
+ * @author fu
+ * @since 2024-05-20
+ */
+public interface PmWorkContentService extends CrudService<PmWorkContent> {
+
+    void deleteContent(Integer reportId);
+
+
+}

+ 35 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmWorkReportService.java

@@ -0,0 +1,35 @@
+package com.usky.iot.service;
+
+import com.usky.iot.domain.PmWorkContent;
+import com.usky.iot.domain.PmWorkReport;
+import com.usky.common.mybatis.core.CrudService;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 工作报告表 服务类
+ * </p>
+ *
+ * @author fu
+ * @since 2024-05-20
+ */
+public interface PmWorkReportService extends CrudService<PmWorkReport> {
+
+    /**
+     * 获取时间内工作报告
+     * @param startDate 开始时间
+     * @param endDate 结束时间
+     * @param reportId 报告id
+     * @return
+     */
+    List<PmWorkReport> weekWork(String startDate, String endDate, Integer reportId);
+
+    /**
+     * 新增、编辑工作报告
+     * @param pmWorkReport 工作报告
+     */
+    void addReport(PmWorkReport pmWorkReport);
+}

+ 132 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmProjectServiceImpl.java

@@ -0,0 +1,132 @@
+package com.usky.iot.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+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.MceSetting;
+import com.usky.iot.domain.PmProject;
+import com.usky.iot.mapper.PmProjectMapper;
+import com.usky.iot.service.PmProjectService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 项目表 服务实现类
+ * </p>
+ *
+ * @author fu
+ * @since 2024-05-20
+ */
+@Service
+public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, PmProject> implements PmProjectService {
+
+    @Autowired
+    private PmProjectMapper pmProjectMapper;
+
+    @Override
+    public void addProject(PmProject project) {
+
+    }
+
+    @Override
+    public void delProject(PmProject project) {
+
+    }
+
+    @Override
+    public void updateProject(PmProject project) {
+
+    }
+
+    /**
+     * 添加工作报告下拉框
+     * 查询当前租户所有项目
+     *
+     * @return 只返回项目id和名称
+     */
+    @Override
+    public List<PmProject> queryProject() {
+        LambdaQueryWrapper<PmProject> wrapper = Wrappers.lambdaQuery();
+        wrapper.select(PmProject::getId, PmProject::getProjectName)
+                .eq(PmProject::getTenantId, SecurityUtils.getTenantId())
+                .eq(PmProject::getDelFlag, 0)
+                .and(qw -> qw
+                        .eq(PmProject::getProjectHead, SecurityUtils.getUserId())
+                        .or()
+                        .apply("FIND_IN_SET('" + SecurityUtils.getUserId() + "', project_member) > 0")
+                )
+                .in(PmProject::getProjectStatus, 1, 2, 3);
+        List<PmProject> list = this.list(wrapper);
+        return list;
+    }
+
+    /**
+     * 分页
+     *
+     * @param projectName       项目名
+     * @param projectType       类型
+     * @param projectStatus     状态
+     * @param projectAscription 项目归属类型
+     * @param pageNum           页码
+     * @param pageSize          页大小
+     * @return
+     */
+    @Override
+    public CommonPage<PmProject> projectList(String projectName, Integer projectType, Integer projectStatus, Integer projectAscription, Integer pageNum, Integer pageSize) {
+        IPage<PmProject> page = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<PmProject> lambdaQuery = Wrappers.lambdaQuery();
+        lambdaQuery.select(PmProject::getId, PmProject::getProjectName, PmProject::getStartTime, PmProject::getEndTime, PmProject::getProjectStatus,
+                PmProject::getProjectType, PmProject::getProjectHead, PmProject::getProjectMember)
+                .eq(PmProject::getTenantId, SecurityUtils.getTenantId())
+                .eq(PmProject::getDelFlag, 0)
+                .orderByDesc(PmProject::getCreateTime);
+        if (projectAscription == 1) {
+            lambdaQuery.eq(PmProject::getProjectHead, SecurityUtils.getUserId());
+        }
+        if (projectAscription == 2) {
+            lambdaQuery.apply("FIND_IN_SET('" + SecurityUtils.getUserId() + "', project_member) > 0");
+        }
+        if (!projectName.isEmpty()) {
+            lambdaQuery.like(PmProject::getProjectName, projectName);
+        }
+        if (projectType != 0) {
+            lambdaQuery.eq(PmProject::getProjectType, projectType);
+        }
+        if (projectStatus != 0) {
+            lambdaQuery.eq(PmProject::getProjectStatus, projectStatus);
+        }
+        page = this.page(page, lambdaQuery);
+        if (page.getRecords() == null && page.getRecords().isEmpty()) {
+            return null;
+        }
+        return new CommonPage<>(page.getRecords(), page.getTotal(), pageSize, pageNum);
+    }
+
+    /**
+     * 查询项目名
+     *
+     * @param projectIds
+     * @return
+     */
+    @Override
+    public List<PmProject> projectName(List<Integer> projectIds) {
+        LambdaQueryWrapper<PmProject> wrapper = Wrappers.lambdaQuery();
+        wrapper.select(PmProject::getId, PmProject::getProjectName)
+                .in(PmProject::getId, projectIds);
+        return pmProjectMapper.selectList(wrapper);
+    }
+
+}

+ 32 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkContentServiceImpl.java

@@ -0,0 +1,32 @@
+package com.usky.iot.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.usky.iot.domain.PmWorkContent;
+import com.usky.iot.mapper.PmWorkContentMapper;
+import com.usky.iot.service.PmWorkContentService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 工作内容表 服务实现类
+ * </p>
+ *
+ * @author fu
+ * @since 2024-05-20
+ */
+@Service
+public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentMapper, PmWorkContent> implements PmWorkContentService {
+
+    @Override
+    public void deleteContent(Integer reportId) {
+        LambdaQueryWrapper<PmWorkContent> deleteWrapper = Wrappers.lambdaQuery();
+        deleteWrapper.eq(PmWorkContent::getReportId,reportId);
+        baseMapper.delete(deleteWrapper);
+    }
+}

+ 242 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkReportServiceImpl.java

@@ -0,0 +1,242 @@
+package com.usky.iot.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.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.service.PmProjectService;
+import com.usky.iot.service.PmWorkContentService;
+import com.usky.iot.service.PmWorkReportService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.temporal.TemporalAdjusters;
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * <p>
+ * 工作报告表 服务实现类
+ * </p>
+ *
+ * @author fu
+ * @since 2024-05-20
+ */
+@Service
+public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMapper, PmWorkReport> implements PmWorkReportService {
+
+    @Autowired
+    private PmWorkContentMapper pmWorkContentMapper;
+
+    @Autowired
+    private PmWorkReportMapper pmWorkReportMapper;
+
+    @Autowired
+    private PmProjectMapper pmProjectMapper;
+
+    @Autowired
+    private PmProjectService pmProjectService;
+
+    @Autowired
+    private PmWorkContentService pmWorkContentService;
+
+    /**
+     * 获取时间内工作报告
+     *
+     * @param startDate 开始时间
+     * @param endDate   结束时间
+     * @param reportId  报告id
+     * @return
+     */
+    @Override
+    public List<PmWorkReport> weekWork(String startDate, String endDate, Integer reportId) {
+        LocalDate startDate1 = null;
+        LocalDate endDate1 = null;
+        if (startDate == null && endDate == null) {
+            startDate1 = LocalDate.now().with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
+            endDate1 = LocalDate.now().with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
+        } else {
+            startDate1 = LocalDate.parse(startDate);
+            endDate1 = LocalDate.parse(endDate);
+        }
+        //固定返回七条数据,没有内容也要设置时间给前端渲染
+        List<LocalDate> dates = new ArrayList<>();
+        while (!startDate1.isAfter(endDate1)) {
+            dates.add(startDate1);
+            startDate1 = startDate1.plusDays(1);
+        }
+        LambdaQueryWrapper<PmWorkReport> queryWrapperR = Wrappers.lambdaQuery();
+        queryWrapperR.select(PmWorkReport::getId, PmWorkReport::getReportDate, PmWorkReport::getTomorrowPlan, PmWorkReport::getCoordinateWork, PmWorkReport::getCcTo)
+                .eq(PmWorkReport::getSubmitterId, SecurityUtils.getUserId())
+                .between(PmWorkReport::getReportDate, startDate, endDate)
+                .orderByAsc(PmWorkReport::getReportDate)
+                .apply(reportId != 0, "id = " + reportId);
+        List<PmWorkReport> reports = this.list(queryWrapperR);
+        if (reports.isEmpty()) {
+            List<PmWorkReport> reports1 = new ArrayList<>();
+            for (int f = 0; f < dates.size(); f++) {
+                List<PmWorkContent> content = new ArrayList<>();
+                PmWorkReport report1 = new PmWorkReport();
+                report1.setReportDate(dates.get(f));
+                report1.setWorkContents(content);
+                reports1.add(report1);
+            }
+            return reports1;
+        }
+        List<Integer> ids = new ArrayList<>();
+        for (PmWorkReport pwr : reports) {
+            ids.add(pwr.getId());
+        }
+        LambdaQueryWrapper<PmWorkContent> queryWrapperC = Wrappers.lambdaQuery();
+        queryWrapperC.select(PmWorkContent::getId, PmWorkContent::getWorkContent, PmWorkContent::getWorkTime, PmWorkContent::getProjectId, PmWorkContent::getProjectName, PmWorkContent::getReportId)
+                .in(PmWorkContent::getReportId, ids)
+                .orderByDesc(PmWorkContent::getWorkTime);
+        List<PmWorkContent> contents = pmWorkContentMapper.selectList(queryWrapperC);
+        int a, b;
+        for (int i = 0; i < reports.size(); i++) {
+            a = reports.get(i).getId();
+            List<PmWorkContent> contentList = new ArrayList<>();
+            for (int j = 0; j < contents.size(); j++) {
+                b = contents.get(j).getReportId();
+                if (b == a) {
+                    contentList.add(contents.get(j));
+                }
+            }
+            reports.get(i).setWorkContents(contentList);
+        }
+        if (reports.size() == 7 || reportId != 0) {
+            return reports;
+        }
+        List<PmWorkReport> reportList = new ArrayList<>();
+        for (int d = 0; d < dates.size(); d++) {
+            boolean matchFound = false;
+            for (int c = 0; c < reports.size(); c++) {
+                if (dates.get(d).isEqual(reports.get(c).getReportDate())) {
+                    reportList.add(reports.get(c));
+                    matchFound = true;
+                    break;
+                }
+            }
+            if (!matchFound) {
+                PmWorkReport newReport = new PmWorkReport();
+                List<PmWorkContent> newContent = new ArrayList<>();
+                newReport.setReportDate(dates.get(d));
+                newReport.setWorkContents(newContent);
+                reportList.add(newReport);
+            }
+        }
+        return reportList;
+    }
+
+    /**
+     * 新增、编辑工作报告
+     */
+    @Override
+    public void addReport(PmWorkReport pmWorkReport) {
+        //计算总工时
+        BigDecimal totalWorkTime = BigDecimal.ZERO;
+        for (PmWorkContent a : pmWorkReport.getWorkContents()) {
+            totalWorkTime = totalWorkTime.add(a.getWorkTime());
+        }
+        //判断总工时是否超过24h
+        BigDecimal noeDay = BigDecimal.valueOf(24);
+        int compareResult = totalWorkTime.compareTo(noeDay);
+        if (compareResult >= 0) {
+            throw new BusinessException("一天24小时都不够你用,请检查当日总工时!");
+        } else if (totalWorkTime == null || totalWorkTime.equals(BigDecimal.ZERO) || totalWorkTime.compareTo(BigDecimal.ZERO) < 0) {
+            throw new BusinessException("工时不能为空!");
+        }
+        //判断是否携带reportId,不写带则为新增报告,携带则为编辑(更新)项目
+        if (pmWorkReport.getId() == null) {
+            PmWorkReport newReport = new PmWorkReport();
+            newReport.setReportDate(pmWorkReport.getReportDate());
+            newReport.setSubmitterId(SecurityUtils.getUserId());
+            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.setTotalHours(totalWorkTime);
+            pmWorkReportMapper.insert(newReport);
+            //获取报告中所有项目id
+            List<Integer> projectIds = new ArrayList<>();
+            for (PmWorkContent b1 : pmWorkReport.getWorkContents()) {
+                projectIds.add(b1.getProjectId());
+            }
+            //查出所有项目id对应项目名
+            List<PmProject> project = pmProjectService.projectName(projectIds);
+            //将项目名重新赋值
+            for (PmWorkContent b : pmWorkReport.getWorkContents()) {
+                for (int c = 0; c < project.size(); c++) {
+                    if (b.getProjectId() == project.get(c).getId()) {
+                        b.setProjectName(project.get(c).getProjectName());
+                    }
+                }
+                PmWorkContent newContent = new PmWorkContent();
+                newContent.setReportId(newReport.getId());
+                newContent.setProjectId(b.getProjectId());
+                projectIds.add(b.getReportId());
+                newContent.setProjectName(b.getProjectName());
+                newContent.setSubmitterId(SecurityUtils.getUserId());
+                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());
+                pmWorkContentMapper.insert(newContent);
+            }
+        } else {
+            PmWorkReport rp = new PmWorkReport();
+            rp.setId(pmWorkReport.getId());
+            rp.setReportDate(pmWorkReport.getReportDate());
+            rp.setSubmitterId(pmWorkReport.getSubmitterId());
+            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.setUpdateBy(SecurityUtils.getUsername());
+            rp.setUpdateTime(LocalDateTime.now());
+            rp.setDeptId(pmWorkReport.getDeptId());
+            rp.setTenantId(pmWorkReport.getTenantId());
+            rp.setUpdateBy(SecurityUtils.getUsername());
+            rp.setUpdateTime(LocalDateTime.now());
+            pmWorkReportMapper.updateById(rp);
+
+            LambdaQueryWrapper<PmWorkContent> queryWrapper = Wrappers.lambdaQuery();
+            queryWrapper.select(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.setUpdateBy(SecurityUtils.getUsername());
+                e.setUpdateTime(LocalDateTime.now());
+                e.setSubmitterId(f.getSubmitterId());
+                e.setCreateTime(f.getCreateTime());
+                e.setCreateBy(f.getCreateBy());
+                e.setDeptId(f.getDeptId());
+                e.setTenantId(f.getTenantId());
+                pmWorkContentMapper.insert(e);
+            }
+        }
+    }
+}

+ 26 - 0
service-iot/service-iot-biz/src/main/resources/mapper/iot/PmProjectMapper.xml

@@ -0,0 +1,26 @@
+<?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.PmProjectMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.iot.domain.PmProject">
+        <id column="id" property="id" />
+        <result column="project_name" property="projectName" />
+        <result column="start_time" property="startTime" />
+        <result column="end_time" property="endTime" />
+        <result column="project_describe" property="projectDescribe" />
+        <result column="project_type" property="projectType" />
+        <result column="project_status" property="projectStatus" />
+        <result column="project_head" property="projectHead" />
+        <result column="project_member" property="projectMember" />
+        <result column="project_workload" property="projectWorkload" />
+        <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="dept_id" property="deptId" />
+        <result column="tenant_id" property="tenantId" />
+        <result column="del_flag" property="delFlag" />
+    </resultMap>
+
+</mapper>

+ 22 - 0
service-iot/service-iot-biz/src/main/resources/mapper/iot/PmWorkContentMapper.xml

@@ -0,0 +1,22 @@
+<?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.PmWorkContentMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.iot.domain.PmWorkContent">
+        <id column="id" property="id" />
+        <result column="report_id" property="reportId" />
+        <result column="project_id" property="projectId" />
+        <result column="project_name" property="projectName" />
+        <result column="submitter_id" property="submitterId" />
+        <result column="work_content" property="workContent" />
+        <result column="work_time" property="workTime" />
+        <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="dept_id" property="deptId" />
+        <result column="tenant_id" property="tenantId" />
+    </resultMap>
+
+</mapper>

+ 23 - 0
service-iot/service-iot-biz/src/main/resources/mapper/iot/PmWorkReportMapper.xml

@@ -0,0 +1,23 @@
+<?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.PmWorkReportMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.iot.domain.PmWorkReport">
+        <id column="id" property="id" />
+        <result column="submitter_id" property="submitterId" />
+        <result column="report_date" property="reportDate" />
+        <result column="submit_date" property="submitDate" />
+        <result column="total_hours" property="totalHours" />
+        <result column="cc_to" property="ccTo" />
+        <result column="coordinate_work" property="coordinateWork" />
+        <result column="tomorrow_plan" property="tomorrowPlan" />
+        <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="dept_id" property="deptId" />
+        <result column="tenant_id" property="tenantId" />
+    </resultMap>
+
+</mapper>