Merge branch 'refs/heads/develop'
All checks were successful
代码检查 / 代码检查 (push) Successful in 22s

This commit is contained in:
筱锋xiao_lfeng 2024-04-19 15:50:57 +08:00
commit 00b0ff49d1
Signed by: XiaoLFeng
GPG Key ID: F693AA12AABBFA87
16 changed files with 200 additions and 54 deletions

View File

@ -177,6 +177,14 @@
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>9</source>
<target>9</target>
</configuration>
</plugin>
</plugins> </plugins>
<resources> <resources>

View File

@ -23,22 +23,22 @@ public class PermissionList {
permissionList.add(new PermissionVO("info:get_header_image", "获取头部图片")); permissionList.add(new PermissionVO("info:get_header_image", "获取头部图片"));
permissionList.add(new PermissionVO("info:edit_header_image", "编辑头部图片")); permissionList.add(new PermissionVO("info:edit_header_image", "编辑头部图片"));
permissionList.add(new PermissionVO("info:delete_header_image", "删除头部图片")); permissionList.add(new PermissionVO("info:delete_header_image", "删除头部图片"));
permissionPrincipal.add(new PermissionVO("project:child:add", "增加子系统")); permissionList.add(new PermissionVO("project:child_add", "增加子系统"));
permissionPrincipal.add(new PermissionVO("project:module:add", "增加子模块")); permissionList.add(new PermissionVO("project:module_add", "增加子模块"));
permissionPrincipal.add(new PermissionVO("auth:change_password", "修改密码")); permissionPrincipal.add(new PermissionVO("auth:change_password", "修改密码"));
permissionPrincipal.add(new PermissionVO("info:get_header_image", "获取头部图片")); permissionPrincipal.add(new PermissionVO("info:get_header_image", "获取头部图片"));
permissionPrincipal.add(new PermissionVO("info:edit_header_image", "编辑头部图片")); permissionPrincipal.add(new PermissionVO("info:edit_header_image", "编辑头部图片"));
permissionPrincipal.add(new PermissionVO("info:delete_header_image", "删除头部图片")); permissionPrincipal.add(new PermissionVO("info:delete_header_image", "删除头部图片"));
permissionPrincipal.add(new PermissionVO("project:add", "增加项目")); permissionPrincipal.add(new PermissionVO("project:add", "增加项目"));
permissionPrincipal.add(new PermissionVO("project:child:add", "增加子系统")); permissionPrincipal.add(new PermissionVO("project:child_add", "增加子系统"));
permissionPrincipal.add(new PermissionVO("project:module:add", "增加子模块")); permissionPrincipal.add(new PermissionVO("project:module_add", "增加子模块"));
permissionDeveloper.add(new PermissionVO("auth:change_password", "修改密码")); permissionDeveloper.add(new PermissionVO("auth:change_password", "修改密码"));
permissionDeveloper.add(new PermissionVO("info:get_header_image", "获取头部图片")); permissionDeveloper.add(new PermissionVO("info:get_header_image", "获取头部图片"));
permissionDeveloper.add(new PermissionVO("info:edit_header_image", "编辑头部图片")); permissionDeveloper.add(new PermissionVO("info:edit_header_image", "编辑头部图片"));
permissionDeveloper.add(new PermissionVO("info:delete_header_image", "删除头部图片")); permissionDeveloper.add(new PermissionVO("info:delete_header_image", "删除头部图片"));
permissionPrincipal.add(new PermissionVO("project:child:add", "增加子系统")); permissionDeveloper.add(new PermissionVO("project:child_add", "增加子系统"));
permissionPrincipal.add(new PermissionVO("project:module:add", "增加子模块")); permissionDeveloper.add(new PermissionVO("project:module_add", "增加子模块"));
} }
} }

View File

@ -1,9 +1,9 @@
package com.jsl.oa.controllers; package com.jsl.oa.controllers;
import com.jsl.oa.annotations.NeedPermission; import com.jsl.oa.annotations.NeedPermission;
import com.jsl.oa.model.vodata.ProjectChildAddVO;
import com.jsl.oa.model.vodata.ProjectEditVO; import com.jsl.oa.model.vodata.ProjectEditVO;
import com.jsl.oa.model.vodata.ProjectInfoVO; import com.jsl.oa.model.vodata.ProjectInfoVO;
import com.jsl.oa.model.vodata.ProjectChildAddVO;
import com.jsl.oa.model.vodata.ProjectModuleAddVO; import com.jsl.oa.model.vodata.ProjectModuleAddVO;
import com.jsl.oa.model.vodata.business.info.ProjectShowVO; import com.jsl.oa.model.vodata.business.info.ProjectShowVO;
import com.jsl.oa.services.ProjectService; import com.jsl.oa.services.ProjectService;
@ -227,7 +227,7 @@ public class ProjectController {
* @return * @return
*/ */
@PostMapping("/project/module/add") @PostMapping("/project/module/add")
@NeedPermission("project:module:add") @NeedPermission("project:module_add")
public BaseResponse projectModuleAdd( public BaseResponse projectModuleAdd(
@RequestBody @Validated ProjectModuleAddVO projectModuleAddVO, @RequestBody @Validated ProjectModuleAddVO projectModuleAddVO,
@NotNull BindingResult bindingResult, @NotNull BindingResult bindingResult,
@ -248,7 +248,7 @@ public class ProjectController {
* @return {@link BaseResponse} * @return {@link BaseResponse}
*/ */
@PostMapping("/project/child/add") @PostMapping("/project/child/add")
@NeedPermission("project:child:add") @NeedPermission("project:child_add")
public BaseResponse projectChildAdd( public BaseResponse projectChildAdd(
HttpServletRequest request, HttpServletRequest request,
@RequestBody @Validated ProjectChildAddVO projectChildAddVO, @RequestBody @Validated ProjectChildAddVO projectChildAddVO,

View File

@ -16,6 +16,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.Date;
/** /**
@ -54,10 +55,23 @@ public class ProjectDailyController {
@GetMapping("/daily/getMyDaily") @GetMapping("/daily/getMyDaily")
public BaseResponse getMyDaily(HttpServletRequest request) { public BaseResponse getMyDaily(@RequestParam Integer page,
return projectDailyService.getMyDaily(request); @RequestParam Integer pageSize,
HttpServletRequest request) {
return projectDailyService.getMyDaily(page, pageSize, request);
} }
@GetMapping("/daily/search")
public BaseResponse searchMyDaily(@RequestParam Integer page,
@RequestParam Integer pageSize,
Date beginTime,
Date endTime,
HttpServletRequest request) {
return projectDailyService.searchMyDaily(page, pageSize, beginTime, endTime, request);
}
} }

View File

@ -1,5 +1,6 @@
package com.jsl.oa.model.dodata; package com.jsl.oa.model.dodata;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
@ -35,14 +36,17 @@ public class ProjectDailyDO {
/** /**
* 日志发布时间 * 日志发布时间
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dailyTime; private Date dailyTime;
/** /**
* 创建时间 * 创建时间
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createdAt; private Date createdAt;
/** /**
* 修改时间 * 修改时间
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updatedAt; private Date updatedAt;
/** /**
* 是否删除 * 是否删除

View File

@ -27,7 +27,7 @@ public class ReviewDO {
//申请理由 //申请理由
private String content; private String content;
//申请者用户id //申请者用户id
private Long senderId; private Integer senderId;
//审核者用户id //审核者用户id
private Long recipientId; private Long recipientId;
//审核类别0子系统1子模块 //审核类别0子系统1子模块

View File

@ -1,21 +1,27 @@
package com.jsl.oa.model.vodata; package com.jsl.oa.model.vodata;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.Date;
@Data @Data
public class ProjectDailyAddVO { public class ProjectDailyAddVO {
@NotNull(message = "项目id不能为空") @NotNull(message = "项目id不能为空")
private Long projectId; private Integer projectId;
@NotBlank(message = "日报内容不能为空") @NotBlank(message = "日报内容不能为空")
private String content; private String content;
@NotNull(message = "工作时间不能为空")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dailyTime;
} }

View File

@ -0,0 +1,24 @@
package com.jsl.oa.model.vodata;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ProjectDailyDataVO {
private Integer totalCount;
private Integer currentPage;
private Integer pageSize;
private List<ProjectDailyVO> list;
}

View File

@ -1,16 +1,38 @@
package com.jsl.oa.model.vodata; package com.jsl.oa.model.vodata;
/*
张睿相 Java
*/
/** import com.fasterxml.jackson.annotation.JsonFormat;
* 总体描述 import lombok.Data;
* <p>创建时间2024/4/18 13:50</p> import lombok.experimental.Accessors;
*
* @author 张睿相 import java.util.Date;
* @since v1.0
*/
@Data
@Accessors(chain = true)
public class ProjectDailyVO { public class ProjectDailyVO {
private Long id;
private Long userId;
private String userName;
private Long projectId;
private String projectName;
private String content;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dailyTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createdAt;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updatedAt;
} }

View File

@ -17,12 +17,12 @@ public class ReviewAddVO {
private String content; private String content;
//申请的项目id //申请的项目id
@NotNull(message = "项目id不能为空") @NotNull(message = "项目id不能为空")
private Long projectId; private Integer projectId;
//申请的子系统id //申请的子系统id
@NotNull(message = "子系统id不能为空") @NotNull(message = "子系统id不能为空")
private Long projectChildId; private Integer projectChildId;
//申请的子模块id //申请的子模块id
private Long projectModuleId; private Integer projectModuleId;
} }

View File

@ -6,7 +6,7 @@ import com.jsl.oa.model.vodata.ProjectDailyAddVO;
import com.jsl.oa.utils.BaseResponse; import com.jsl.oa.utils.BaseResponse;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.Date;
/** /**
@ -20,7 +20,13 @@ public interface ProjectDailyService {
BaseResponse addDaily(ProjectDailyAddVO projectDailyAddVO, HttpServletRequest request); BaseResponse addDaily(ProjectDailyAddVO projectDailyAddVO, HttpServletRequest request);
BaseResponse getMyDaily(HttpServletRequest request); BaseResponse getMyDaily(Integer page, Integer pageSize, HttpServletRequest request);
BaseResponse searchMyDaily(Integer page,
Integer pageSize,
Date beginTime,
Date endTime,
HttpServletRequest request);
} }

View File

@ -5,9 +5,11 @@ package com.jsl.oa.services.impl;
import com.jsl.oa.dao.ProjectDAO; import com.jsl.oa.dao.ProjectDAO;
import com.jsl.oa.dao.ProjectDailyDAO; import com.jsl.oa.dao.ProjectDailyDAO;
import com.jsl.oa.exception.BusinessException; import com.jsl.oa.dao.UserDAO;
import com.jsl.oa.model.dodata.ProjectDailyDO; import com.jsl.oa.model.dodata.ProjectDailyDO;
import com.jsl.oa.model.vodata.ProjectDailyAddVO; import com.jsl.oa.model.vodata.ProjectDailyAddVO;
import com.jsl.oa.model.vodata.ProjectDailyDataVO;
import com.jsl.oa.model.vodata.ProjectDailyVO;
import com.jsl.oa.services.ProjectDailyService; import com.jsl.oa.services.ProjectDailyService;
import com.jsl.oa.utils.BaseResponse; import com.jsl.oa.utils.BaseResponse;
import com.jsl.oa.utils.ErrorCode; import com.jsl.oa.utils.ErrorCode;
@ -18,6 +20,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -37,7 +40,7 @@ import java.util.List;
public class ProjectDailyServiceImpl implements ProjectDailyService { public class ProjectDailyServiceImpl implements ProjectDailyService {
private final ProjectDAO projectDAO; private final ProjectDAO projectDAO;
private final UserDAO userDAO;
private final ProjectDailyDAO projectDailyDAO; private final ProjectDailyDAO projectDailyDAO;
@ -47,17 +50,17 @@ public class ProjectDailyServiceImpl implements ProjectDailyService {
// 获取用户id // 获取用户id
Long userId = Processing.getAuthHeaderToUserId(request); Long userId = Processing.getAuthHeaderToUserId(request);
// 从请求体中获取项目id // 从请求体中获取项目id
Long projectId = projectDailyAddVO.getProjectId(); Integer projectId = projectDailyAddVO.getProjectId();
// 检查项目是否存在 // 检查项目是否存在
if (!projectDAO.isExistProjectById(projectId)) { if (!projectDAO.isExistProjectById(Long.valueOf(projectId))) {
throw new BusinessException(ErrorCode.PROJECT_NOT_EXIST); return ResultUtil.error(ErrorCode.PROJECT_NOT_EXIST);
} }
// 赋值数据库表实体类相关属性 // 赋值数据库表实体类相关属性
ProjectDailyDO projectDailyDO = new ProjectDailyDO(); ProjectDailyDO projectDailyDO = new ProjectDailyDO();
Processing.copyProperties(projectDailyAddVO, projectDailyDO); Processing.copyProperties(projectDailyAddVO, projectDailyDO);
projectDailyDO.setUserId(userId) projectDailyDO.setUserId(userId);
.setDailyTime(new Date());
// 向数据库添加数据 // 向数据库添加数据
projectDailyDAO.addProjectDaily(projectDailyDO); projectDailyDAO.addProjectDaily(projectDailyDO);
@ -65,19 +68,62 @@ public class ProjectDailyServiceImpl implements ProjectDailyService {
return ResultUtil.success(); return ResultUtil.success();
} }
@Override @Override
public BaseResponse getMyDaily(HttpServletRequest request) { public BaseResponse getMyDaily(Integer page, Integer pageSize, HttpServletRequest request) {
// 获取用户id // 获取用户id
Long userId = Processing.getAuthHeaderToUserId(request); Long userId = Processing.getAuthHeaderToUserId(request);
// 获取 我发布的及自己负责的项目下 的日报 // 获取 我发布的及自己负责的项目下 的日报
List<ProjectDailyDO> projectDailyDOList = List<ProjectDailyDO> projectDailyDOList =
projectDailyDAO.getMyProjectDaily(userId); projectDailyDAO.getMyProjectDaily(userId);
// 进行分页
List<ProjectDailyDO> dailyPage = Processing.getPage(projectDailyDOList, page, pageSize);
// 封装结果类
List<ProjectDailyVO> projectDailyVOS = encapsulateArrayClass(dailyPage);
ProjectDailyDataVO projectDailyDataVO =
new ProjectDailyDataVO(projectDailyDOList.size(), page, pageSize, projectDailyVOS);
return ResultUtil.success(projectDailyDOList); return ResultUtil.success(projectDailyDataVO);
}
}
@Override
public BaseResponse searchMyDaily(Integer page,
Integer pageSize,
Date beginTime,
Date endTime,
HttpServletRequest request) {
// 获取用户id
Long userId = Processing.getAuthHeaderToUserId(request);
// 获取 我发布的及自己负责的项目下 的日报
List<ProjectDailyDO> projectDailyDOList =
projectDailyDAO.getMyProjectDaily(userId);
return null;
}
public List<ProjectDailyVO> encapsulateArrayClass(List<ProjectDailyDO>
projectDailyDOList) {
// 定义封装结果数组
List<ProjectDailyVO> projectDailyVOS = new ArrayList<>();
// 遍历原始数据依次封装
for (ProjectDailyDO projectDailyDO : projectDailyDOList) {
// 定义一个封装结果类
ProjectDailyVO projectDailyVO = new ProjectDailyVO();
// 复制相同的属性值
Processing.copyProperties(projectDailyDO, projectDailyVO);
// 赋值其他需查询的属性
projectDailyVO.setProjectName(
projectDAO.getProjectById(projectDailyVO.getProjectId()).getName())
.setUserName(userDAO.getUserById(projectDailyDO.getUserId()).getNickname());
// 结果封装类数组 添加对应 日报封装类
projectDailyVOS.add(projectDailyVO);
}
return projectDailyVOS;
}
} }

View File

@ -5,7 +5,6 @@ import com.jsl.oa.common.constant.ReviewConstants;
import com.jsl.oa.dao.ProjectDAO; import com.jsl.oa.dao.ProjectDAO;
import com.jsl.oa.dao.ReviewDAO; import com.jsl.oa.dao.ReviewDAO;
import com.jsl.oa.dao.UserDAO; import com.jsl.oa.dao.UserDAO;
import com.jsl.oa.exception.BusinessException;
import com.jsl.oa.mapper.ProjectMapper; import com.jsl.oa.mapper.ProjectMapper;
import com.jsl.oa.mapper.UserMapper; import com.jsl.oa.mapper.UserMapper;
import com.jsl.oa.model.dodata.ProjectChildDO; import com.jsl.oa.model.dodata.ProjectChildDO;
@ -190,23 +189,23 @@ public class ReviewServiceImpl implements ReviewService {
public BaseResponse addReview(ReviewAddVO reviewAddVO, HttpServletRequest request) { public BaseResponse addReview(ReviewAddVO reviewAddVO, HttpServletRequest request) {
//获取用户 //获取用户
Long userId = Processing.getAuthHeaderToUserId(request); Integer userId = Math.toIntExact(Processing.getAuthHeaderToUserId(request));
//检查对应项目子系统子模块是否存在 //检查对应项目子系统子模块是否存在
if (!projectDAO.isExistProjectById(reviewAddVO.getProjectId())) { if (!projectDAO.isExistProjectById(Long.valueOf(reviewAddVO.getProjectId()))) {
throw new BusinessException(ErrorCode.PROJECT_NOT_EXIST); return ResultUtil.error(ErrorCode.PROJECT_NOT_EXIST);
} }
if (projectMapper.getProjectChildById( if (projectMapper.getProjectChildById(
Math.toIntExact(reviewAddVO.getProjectChildId())) != null) { Math.toIntExact(reviewAddVO.getProjectChildId())) == null) {
throw new BusinessException(ErrorCode.PROJECT_CHILD_NOT_EXIST); return ResultUtil.error(ErrorCode.PROJECT_CHILD_NOT_EXIST);
} }
// 子模块id不为空时查询否则直接跳过 // 子模块id不为空时查询否则直接跳过
if (reviewAddVO.getProjectModuleId() != null) { if (reviewAddVO.getProjectModuleId() != null) {
if (projectMapper.getModuleById( if (projectMapper.getModuleById(
Math.toIntExact(reviewAddVO.getProjectModuleId())) != null) { Math.toIntExact(reviewAddVO.getProjectModuleId())) == null) {
throw new BusinessException(ErrorCode.MODULE_NOT_EXIST); return ResultUtil.error(ErrorCode.MODULE_NOT_EXIST);
} }
} }
@ -370,7 +369,7 @@ public class ReviewServiceImpl implements ReviewService {
Processing.copyProperties(reviewDO, reviewVO); Processing.copyProperties(reviewDO, reviewVO);
// 赋值其他非空属性 // 赋值其他非空属性
reviewVO.setCategory(Processing.turnReviewCategory(reviewDO.getCategory())) reviewVO.setCategory(Processing.turnReviewCategory(reviewDO.getCategory()))
.setSenderName(userMapper.getUserById(reviewDO.getSenderId()).getNickname()) .setSenderName(userMapper.getUserById(Long.valueOf(reviewDO.getSenderId())).getNickname())
.setProjectName(projectDAO.getProjectById(reviewDO.getProjectId()).getName()) .setProjectName(projectDAO.getProjectById(reviewDO.getProjectId()).getName())
.setProjectChildName(projectMapper.getProjectChildById( .setProjectChildName(projectMapper.getProjectChildById(
Math.toIntExact(reviewDO.getProjectChildId())).getName()) Math.toIntExact(reviewDO.getProjectChildId())).getName())
@ -466,8 +465,10 @@ public class ReviewServiceImpl implements ReviewService {
int total = allReviews.size(); int total = allReviews.size();
int startIndex = (page - 1) * pageSize; int startIndex = (page - 1) * pageSize;
int endIndex = Math.min(startIndex + pageSize, total); int endIndex = Math.min(startIndex + pageSize, total);
List<ReviewVO> reviewsOnPage = allReviews.subList(startIndex, endIndex); List<ReviewVO> reviewsOnPage = new ArrayList<>();
if (startIndex <= allReviews.size()) {
reviewsOnPage = allReviews.subList(startIndex, endIndex);
}
reviewDataVO.setReviews(reviewsOnPage); reviewDataVO.setReviews(reviewsOnPage);
reviewDataVO.setTotalCount(allReviews.size()); reviewDataVO.setTotalCount(allReviews.size());
reviewDataVO.setPageSize(pageSize); reviewDataVO.setPageSize(pageSize);
@ -475,6 +476,8 @@ public class ReviewServiceImpl implements ReviewService {
return reviewDataVO; return reviewDataVO;
} }
} }

View File

@ -394,4 +394,19 @@ public class Processing {
} }
/**
* @Description: list分页方法
* @Date: 2024/4/18
* @Param list:
* @Param pageNumber: 当前页码
* @Param pageSize: 每页几条
**/
public static <T> List<T> getPage(List<T> list, int pageNumber, int pageSize) {
int fromIndex = (pageNumber - 1) * pageSize;
if (fromIndex >= list.size()) {
return new ArrayList<>(); // 返回空列表表示超出范围
}
int toIndex = Math.min(fromIndex + pageSize, list.size());
return list.subList(fromIndex, toIndex);
}
} }

View File

@ -31,7 +31,7 @@
and is_delete = 0 and is_delete = 0
</select> </select>
<select id="getProjectDailyByProject" parameterType="java.lang.Integer" <select id="getProjectDailyByProject" parameterType="java.lang.Long"
resultType="com.jsl.oa.model.dodata.ProjectDailyDO"> resultType="com.jsl.oa.model.dodata.ProjectDailyDO">
select * from oa_project_daily where user_id = #{pid} select * from oa_project_daily where user_id = #{pid}
and is_delete = 0 and is_delete = 0

View File

@ -6,16 +6,14 @@ create table oa_project_modules
name varchar(100) not null comment '模块名称', name varchar(100) not null comment '模块名称',
principal_id bigint unsigned not null comment '模块负责人', principal_id bigint unsigned not null comment '模块负责人',
description json null comment '项目描述(技术选择,描述)', description json null comment '项目描述(技术选择,描述)',
cycle int unsigned null comment '模块周期',
work_load int unsigned default '1' not null comment '工作量(人天)', work_load int unsigned default '1' not null comment '工作量(人天)',
complete_time datetime null comment '完成时间', complete_time datetime null comment '完成时间',
created_at timestamp default CURRENT_TIMESTAMP not null comment '创建时间', created_at timestamp default CURRENT_TIMESTAMP not null comment '创建时间',
updated_at timestamp null comment '更新时间', updated_at timestamp null comment '更新时间',
is_delete tinyint(1) default 0 not null comment '项目是否删除', is_delete tinyint(1) default 0 not null comment '项目是否删除',
dead_line timestamp not null comment '子模块的截止时间',
status varchar(8) default 'progress' not null comment '模块状态draft: 草稿progress: 进行pause: 暂停abnormal: 异常complete: 完成)',
constraint oa_project_modules_oa_user_id_fk constraint oa_project_modules_oa_user_id_fk
foreign key (principal_id) references oa_user (id) foreign key (principal_id) references oa_user (id)
on update cascade on update cascade
) )
comment '模块表'; comment '模块表';