diff --git a/src/main/java/com/jsl/oa/controllers/ProjectDailyController.java b/src/main/java/com/jsl/oa/controllers/ProjectDailyController.java new file mode 100644 index 0000000..88d12ba --- /dev/null +++ b/src/main/java/com/jsl/oa/controllers/ProjectDailyController.java @@ -0,0 +1,64 @@ +package com.jsl.oa.controllers; + + +import com.jsl.oa.model.vodata.ProjectDailyAddVO; +import com.jsl.oa.services.ProjectDailyService; +import com.jsl.oa.utils.BaseResponse; +import com.jsl.oa.utils.ErrorCode; +import com.jsl.oa.utils.Processing; +import com.jsl.oa.utils.ResultUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; + +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; + + +/** + * 项目日报(ProjectDaily)表控制层 + * + * @author zrx + * @since 2024-04-18 11:40:52 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +public class ProjectDailyController { + /** + * 服务对象 + */ + + private final ProjectDailyService projectDailyService; + + /** + * 新增日报 + * + * @param projectDailyAddVO 日报添加实体 + * @return 新增结果 + */ + @PostMapping("/daily/add") + public BaseResponse add(@RequestBody @Validated ProjectDailyAddVO projectDailyAddVO, + @NotNull BindingResult bindingResult, + HttpServletRequest request) { + // 判断是否有参数错误 + if (bindingResult.hasErrors()) { + return ResultUtil.error(ErrorCode.PARAMETER_ERROR, Processing.getValidatedErrorList(bindingResult)); + } + + return projectDailyService.addDaily(projectDailyAddVO, request); + } + + + @GetMapping("/daily/getMyDaily") + public BaseResponse getMyDaily(HttpServletRequest request) { + return projectDailyService.getMyDaily(request); + } + +} + + + diff --git a/src/main/java/com/jsl/oa/dao/ProjectDailyDAO.java b/src/main/java/com/jsl/oa/dao/ProjectDailyDAO.java new file mode 100644 index 0000000..ad6805d --- /dev/null +++ b/src/main/java/com/jsl/oa/dao/ProjectDailyDAO.java @@ -0,0 +1,77 @@ +package com.jsl.oa.dao; +/* + 张睿相 Java +*/ + +import com.jsl.oa.mapper.ProjectDailyMapper; +import com.jsl.oa.mapper.ProjectMapper; +import com.jsl.oa.model.dodata.ProjectDO; +import com.jsl.oa.model.dodata.ProjectDailyDO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + + +/** + * ProjectDailyDAO + *
+ * 用于处理日报相关的请求, 包括获取日报、添加日报信息、编辑日报信息等 + * + * @author zrx_hhh + * @version v1.0.0 + * @since v1.0.0-SNAPSHOT + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ProjectDailyDAO { + + private final ProjectDailyMapper projectDailyMapper; + private final ProjectMapper projectMapper; + + + public void addProjectDaily(ProjectDailyDO projectDailyDO) { + projectDailyMapper.insert(projectDailyDO); + } + + + public List getMyProjectDaily(Long userId) { + +// 日报数据数组 + List projectDailyDOList = new ArrayList<>(); + +// 先获取我负责的项目下的日报数据 + //获取我负责的项目 + List projectDOS = projectMapper.getAllProjectByUserId(userId); + //获取项目下对应日报 + for (ProjectDO projectDO:projectDOS) { + List dailyFromProject = projectDailyMapper.getProjectDailyByProject(projectDO.getId()); + projectDailyDOList.addAll(dailyFromProject); + } + +// 在获取本人的发布日报 + List myProjectDaily = projectDailyMapper.getProjectDailyByUser(userId); + projectDailyDOList.addAll(myProjectDaily); + +// 去除重复的日报信息 + projectDailyDOList = projectDailyDOList.stream() + // 根据 id 属性进行去重 + .collect(Collectors.toMap(ProjectDailyDO::getId, + Function.identity(), (existing, replacement) -> existing)) + .values().stream() + .collect(Collectors.toList()); + + return projectDailyDOList; + } + + + + +} + + diff --git a/src/main/java/com/jsl/oa/dao/ReviewDAO.java b/src/main/java/com/jsl/oa/dao/ReviewDAO.java index 012825b..90f4055 100644 --- a/src/main/java/com/jsl/oa/dao/ReviewDAO.java +++ b/src/main/java/com/jsl/oa/dao/ReviewDAO.java @@ -58,6 +58,11 @@ public class ReviewDAO { result); } + public List getReviewByUser(Long uid) { + return reviewMapper.selectReviewByUser(uid); + } + + public void addReview(ReviewDO reviewDO) { reviewMapper.addReview(reviewDO); diff --git a/src/main/java/com/jsl/oa/mapper/ProjectDailyMapper.java b/src/main/java/com/jsl/oa/mapper/ProjectDailyMapper.java new file mode 100644 index 0000000..3425a7e --- /dev/null +++ b/src/main/java/com/jsl/oa/mapper/ProjectDailyMapper.java @@ -0,0 +1,29 @@ +package com.jsl.oa.mapper; + + +import com.jsl.oa.model.dodata.ProjectDailyDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + + +/** + * 项目日报(ProjectDaily)表数据库访问层 + * + * @author zrx + * @since 2024-04-18 11:40:56 + */ +@Mapper +public interface ProjectDailyMapper { + + + void insert(ProjectDailyDO projectDailyDO); + + List getProjectDailyByUser(Long uid); + + List getProjectDailyByProject(Long pid); + +} + + + diff --git a/src/main/java/com/jsl/oa/mapper/ReviewMapper.java b/src/main/java/com/jsl/oa/mapper/ReviewMapper.java index 0561dda..aa6a2e9 100644 --- a/src/main/java/com/jsl/oa/mapper/ReviewMapper.java +++ b/src/main/java/com/jsl/oa/mapper/ReviewMapper.java @@ -43,4 +43,8 @@ public interface ReviewMapper { @Select("SELECT * FROM organize_oa.oa_review WHERE name = #{name} AND is_delete = 0") List selectReviewByName(String name); + + @Select("SELECT * FROM organize_oa.oa_review WHERE sender_id = #{uid} AND " + + "is_delete = 0") + List selectReviewByUser(Long uid); } diff --git a/src/main/java/com/jsl/oa/model/dodata/ProjectDailyDO.java b/src/main/java/com/jsl/oa/model/dodata/ProjectDailyDO.java new file mode 100644 index 0000000..4df4917 --- /dev/null +++ b/src/main/java/com/jsl/oa/model/dodata/ProjectDailyDO.java @@ -0,0 +1,55 @@ +package com.jsl.oa.model.dodata; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; + + +/** + * 项目日报(ProjectDaily)实体类 + * + * @author zrx + * @since 2024-04-18 11:40:56 + */ +@Data +@Accessors(chain = true) +public class ProjectDailyDO { + + /** + * 日报主键 自增 + */ + private Long id; + /** + * 用户id + */ + private Long userId; + /** + * 项目id + */ + private Long projectId; + /** + * 日报内容 + */ + private String content; + /** + * 日志发布时间 + */ + private Date dailyTime; + /** + * 创建时间 + */ + private Date createdAt; + /** + * 修改时间 + */ + private Date updatedAt; + /** + * 是否删除 + */ + private Integer isDelete; + +} + + + diff --git a/src/main/java/com/jsl/oa/model/vodata/ProjectDailyAddVO.java b/src/main/java/com/jsl/oa/model/vodata/ProjectDailyAddVO.java new file mode 100644 index 0000000..ab4114e --- /dev/null +++ b/src/main/java/com/jsl/oa/model/vodata/ProjectDailyAddVO.java @@ -0,0 +1,21 @@ +package com.jsl.oa.model.vodata; + + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + + +@Data +public class ProjectDailyAddVO { + + @NotNull(message = "项目id不能为空") + private Long projectId; + + @NotBlank(message = "日报内容不能为空") + private String content; + +} + + diff --git a/src/main/java/com/jsl/oa/model/vodata/ProjectDailyVO.java b/src/main/java/com/jsl/oa/model/vodata/ProjectDailyVO.java new file mode 100644 index 0000000..9bc827e --- /dev/null +++ b/src/main/java/com/jsl/oa/model/vodata/ProjectDailyVO.java @@ -0,0 +1,16 @@ +package com.jsl.oa.model.vodata; +/* + 张睿相 Java +*/ + +/** + * 总体描述 + *

创建时间:2024/4/18 13:50

+ * + * @author 张睿相 + * @since v1.0 + */ +public class ProjectDailyVO { +} + + diff --git a/src/main/java/com/jsl/oa/model/vodata/ReviewDataVO.java b/src/main/java/com/jsl/oa/model/vodata/ReviewDataVO.java index 7700711..6a45106 100644 --- a/src/main/java/com/jsl/oa/model/vodata/ReviewDataVO.java +++ b/src/main/java/com/jsl/oa/model/vodata/ReviewDataVO.java @@ -8,7 +8,11 @@ import java.util.List; @Data public class ReviewDataVO { - private Integer dataTotal; + private Integer totalCount; + + private Integer currentPage; + + private Integer pageSize; private List reviews; } diff --git a/src/main/java/com/jsl/oa/services/ProjectDailyService.java b/src/main/java/com/jsl/oa/services/ProjectDailyService.java new file mode 100644 index 0000000..3d6fad9 --- /dev/null +++ b/src/main/java/com/jsl/oa/services/ProjectDailyService.java @@ -0,0 +1,26 @@ +package com.jsl.oa.services; + + + +import com.jsl.oa.model.vodata.ProjectDailyAddVO; +import com.jsl.oa.utils.BaseResponse; + +import javax.servlet.http.HttpServletRequest; + + + +/** + * 项目日报(ProjectDaily)表服务接口 + * + * @author zrx + * @since 2024-04-18 11:40:53 + */ +public interface ProjectDailyService { + + + BaseResponse addDaily(ProjectDailyAddVO projectDailyAddVO, HttpServletRequest request); + + BaseResponse getMyDaily(HttpServletRequest request); +} + + diff --git a/src/main/java/com/jsl/oa/services/impl/ProjectDailyServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/ProjectDailyServiceImpl.java new file mode 100644 index 0000000..8194080 --- /dev/null +++ b/src/main/java/com/jsl/oa/services/impl/ProjectDailyServiceImpl.java @@ -0,0 +1,84 @@ +package com.jsl.oa.services.impl; +/* + 张睿相 Java +*/ + +import com.jsl.oa.dao.ProjectDAO; +import com.jsl.oa.dao.ProjectDailyDAO; +import com.jsl.oa.exception.BusinessException; +import com.jsl.oa.model.dodata.ProjectDailyDO; +import com.jsl.oa.model.vodata.ProjectDailyAddVO; +import com.jsl.oa.services.ProjectDailyService; +import com.jsl.oa.utils.BaseResponse; +import com.jsl.oa.utils.ErrorCode; +import com.jsl.oa.utils.Processing; +import com.jsl.oa.utils.ResultUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; +import java.util.Date; +import java.util.List; + +/** + *

日志服务层实现类

+ *
+ * 用于日志服务层的实现类 + * + * @author xiao_lfeng | 176yunxuan | xiangZr-hhh + * @version v1.1.0 + * @see com.jsl.oa.services.ProjectService + * @since v1.1.0 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class ProjectDailyServiceImpl implements ProjectDailyService { + + private final ProjectDAO projectDAO; + + private final ProjectDailyDAO projectDailyDAO; + + + @Override + public BaseResponse addDaily(ProjectDailyAddVO projectDailyAddVO, HttpServletRequest request) { + +// 获取用户id + Long userId = Processing.getAuthHeaderToUserId(request); +// 从请求体中获取项目id + Long projectId = projectDailyAddVO.getProjectId(); +// 检查项目是否存在 + if (!projectDAO.isExistProjectById(projectId)) { + throw new BusinessException(ErrorCode.PROJECT_NOT_EXIST); + } + +// 赋值数据库表实体类相关属性 + ProjectDailyDO projectDailyDO = new ProjectDailyDO(); + Processing.copyProperties(projectDailyAddVO, projectDailyDO); + projectDailyDO.setUserId(userId) + .setDailyTime(new Date()); + +// 向数据库添加数据 + projectDailyDAO.addProjectDaily(projectDailyDO); + + return ResultUtil.success(); + } + + @Override + public BaseResponse getMyDaily(HttpServletRequest request) { + +// 获取用户id + Long userId = Processing.getAuthHeaderToUserId(request); +// 获取 我发布的及自己负责的项目下 的日报 + List projectDailyDOList = + projectDailyDAO.getMyProjectDaily(userId); + + return ResultUtil.success(projectDailyDOList); + + } + + +} + + diff --git a/src/main/java/com/jsl/oa/services/impl/ReviewServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/ReviewServiceImpl.java index b537ee8..cc6c4d7 100644 --- a/src/main/java/com/jsl/oa/services/impl/ReviewServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/ReviewServiceImpl.java @@ -5,6 +5,7 @@ import com.jsl.oa.common.constant.ReviewConstants; import com.jsl.oa.dao.ProjectDAO; import com.jsl.oa.dao.ReviewDAO; import com.jsl.oa.dao.UserDAO; +import com.jsl.oa.exception.BusinessException; import com.jsl.oa.mapper.ProjectMapper; import com.jsl.oa.mapper.UserMapper; import com.jsl.oa.model.dodata.ProjectChildDO; @@ -155,6 +156,11 @@ public class ReviewServiceImpl implements ReviewService { reviewData.addAll(reviewDOS); } +// 获取自己的审核记录 + List myReviewDO = reviewDAO.getReviewByUser(userId); + reviewData.addAll(myReviewDO); + + //根据id进行去重 reviewData = reviewData.stream() .collect(Collectors.toMap(ReviewDO::getId, review -> review, (existing, replacement) -> existing)) @@ -186,6 +192,24 @@ public class ReviewServiceImpl implements ReviewService { //获取用户 Long userId = Processing.getAuthHeaderToUserId(request); + //检查对应项目,子系统,子模块是否存在 + if (!projectDAO.isExistProjectById(reviewAddVO.getProjectId())) { + throw new BusinessException(ErrorCode.PROJECT_NOT_EXIST); + } + + if (projectMapper.getProjectChildById( + Math.toIntExact(reviewAddVO.getProjectChildId())) != null) { + throw new BusinessException(ErrorCode.PROJECT_CHILD_NOT_EXIST); + } + +// 子模块id不为空时查询,否则直接跳过 + if (reviewAddVO.getProjectModuleId() != null) { + if (projectMapper.getModuleById( + Math.toIntExact(reviewAddVO.getProjectModuleId())) != null) { + throw new BusinessException(ErrorCode.MODULE_NOT_EXIST); + } + } + //定义要添加的审核实体类 ReviewDO reviewDO = new ReviewDO(); //现将属性相同的值拷贝 @@ -232,7 +256,6 @@ public class ReviewServiceImpl implements ReviewService { } - @Override public BaseResponse searchReview(String content, Short statue, @@ -414,6 +437,9 @@ public class ReviewServiceImpl implements ReviewService { reviewData.addAll(reviewDOS); } + // 获取自己的审核记录 + List myReviewDO = reviewDAO.getReviewByUser(userId); + reviewData.addAll(myReviewDO); //根据id进行去重 reviewData = reviewData.stream() @@ -443,7 +469,9 @@ public class ReviewServiceImpl implements ReviewService { List reviewsOnPage = allReviews.subList(startIndex, endIndex); reviewDataVO.setReviews(reviewsOnPage); - reviewDataVO.setDataTotal(total); + reviewDataVO.setTotalCount(allReviews.size()); + reviewDataVO.setPageSize(pageSize); + reviewDataVO.setCurrentPage(page); return reviewDataVO; } diff --git a/src/main/java/com/jsl/oa/utils/ErrorCode.java b/src/main/java/com/jsl/oa/utils/ErrorCode.java index 05e988d..8bb67cc 100755 --- a/src/main/java/com/jsl/oa/utils/ErrorCode.java +++ b/src/main/java/com/jsl/oa/utils/ErrorCode.java @@ -53,6 +53,8 @@ public enum ErrorCode { PROJECT_USER_NOT_EXIST("ProjectUserNotExist", 40018, "用户项目表无对应记录"), PROJECT_FILE_JSON_ERROR("ProjectFileJsonError", 40019, "项目文件json格式错误"), PROJECT_NOT_USER("ProjectNotUser", 40020, "项目无此用户"), + PROJECT_CHILD_NOT_EXIST("ProjectChildNotExist", 40021, "子系统不存在"), + MODULE_NOT_EXIST("ModuleNotExist", 40022, "模块不存在"), REVIEW_NOT_EXIST("ReviewNotExit", 40101, "未找到对应审核信息"); diff --git a/src/main/resources/com/jsl/oa/mapper/ProjectDailyMapper.xml b/src/main/resources/com/jsl/oa/mapper/ProjectDailyMapper.xml new file mode 100644 index 0000000..bc48bd9 --- /dev/null +++ b/src/main/resources/com/jsl/oa/mapper/ProjectDailyMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + insert into oa_project_daily + + user_id, + project_id, + content, + daily_time, + created_at + + values + + #{userId}, + #{projectId}, + #{content}, + #{dailyTime}, + NOW() + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mysql/oa_review.sql b/src/main/resources/mysql/oa_review.sql index c2bd1ff..e8bdd59 100644 --- a/src/main/resources/mysql/oa_review.sql +++ b/src/main/resources/mysql/oa_review.sql @@ -27,9 +27,4 @@ create table oa_review create index oa_review_project_id_oa_project_id_fk on oa_review (project_id); -create index oa_review_project_project_submodule_id_oa_project_work_id_fk - on oa_review (project_module_id); - -create index oa_review_project_subsystem_id_oa_project_work_id_fk - on oa_review (project_child_id); diff --git a/src/main/resources/mysql/organize_oa.sql b/src/main/resources/mysql/organize_oa.sql index 8d09fa0..253153a 100755 --- a/src/main/resources/mysql/organize_oa.sql +++ b/src/main/resources/mysql/organize_oa.sql @@ -203,6 +203,44 @@ CREATE TABLE `oa_user` DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT ='用户表'; +-- -------------------------------------------------------- + +-- +-- 表的结构 `oa_review` +-- + + +create table oa_review +( + id bigint unsigned auto_increment comment '主键' + primary key, + name varchar(255) not null comment '申请名称', + content longtext not null comment '申请理由', + sender_id bigint unsigned not null comment '申请者用户id', + recipient_id bigint unsigned null comment '审核者用户id', + category tinyint default 1 null comment '审核类别(0:子系统;1:子模块)', + project_id bigint unsigned not null comment '申请的项目id', + project_child_id bigint unsigned not null comment '申请的子系统id', + project_module_id bigint unsigned null comment '申请的子模块id', + application_time datetime default CURRENT_TIMESTAMP not null comment '申请时间', + review_time datetime null comment '审核时间', + review_result tinyint default 2 not null comment '审核结果(0:未通过;1:通过;2:未审批)', + is_delete tinyint default 0 not null comment '是否删除(0:未删除;1:已删除)', + created_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_time datetime null comment '更新时间', + constraint oa_review_recipient_id_oa_user_id_fk + foreign key (recipient_id) references oa_user (id) + on update cascade on delete cascade, + constraint oa_review_sender_id_oa_user_id_fk + foreign key (sender_id) references oa_user (id) + on update cascade on delete cascade +); + +create index oa_review_project_id_oa_project_id_fk + on oa_review (project_id); + + + -- -- 转储表的索引 --