diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/controller/CcdiProjectController.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/controller/CcdiProjectController.java new file mode 100644 index 0000000..ca46633 --- /dev/null +++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/controller/CcdiProjectController.java @@ -0,0 +1,89 @@ +package com.ruoyi.info.collection.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.PageDomain; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.page.TableSupport; +import com.ruoyi.info.collection.domain.dto.CcdiProjectQueryDTO; +import com.ruoyi.info.collection.domain.dto.CcdiProjectSaveDTO; +import com.ruoyi.info.collection.domain.vo.CcdiProjectVO; +import com.ruoyi.info.collection.service.ICcdiProjectService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 纪检初核项目管理Controller + * + * @author ruoyi + */ +@RestController +@RequestMapping("/ccdi/project") +@Tag(name = "纪检初核项目管理") +public class CcdiProjectController extends BaseController { + + @Resource + private ICcdiProjectService projectService; + + /** + * 创建项目 + */ + @PostMapping + @Operation(summary = "创建项目") + @PreAuthorize("@ss.hasPermi('ccdi:project:add')") + public AjaxResult createProject(@Validated @RequestBody CcdiProjectSaveDTO dto) { + CcdiProjectVO vo = projectService.createProject(dto); + return AjaxResult.success("项目创建成功", vo); + } + + /** + * 更新项目 + */ + @PutMapping + @Operation(summary = "更新项目") + @PreAuthorize("@ss.hasPermi('ccdi:project:edit')") + public AjaxResult updateProject(@Validated @RequestBody CcdiProjectSaveDTO dto) { + CcdiProjectVO vo = projectService.updateProject(dto); + return AjaxResult.success("项目更新成功", vo); + } + + /** + * 删除项目 + */ + @DeleteMapping("/{projectId}") + @Operation(summary = "删除项目") + @PreAuthorize("@ss.hasPermi('ccdi:project:remove')") + public AjaxResult deleteProject(@PathVariable Long projectId) { + boolean success = projectService.deleteProject(projectId); + return success ? AjaxResult.success("项目删除成功") : AjaxResult.error("项目删除失败"); + } + + /** + * 查询项目详情 + */ + @GetMapping("/{projectId}") + @Operation(summary = "查询项目详情") + @PreAuthorize("@ss.hasPermi('ccdi:project:query')") + public AjaxResult getProject(@PathVariable Long projectId) { + CcdiProjectVO vo = projectService.getProjectById(projectId); + return AjaxResult.success(vo); + } + + /** + * 查询项目列表(分页) + */ + @GetMapping("/list") + @Operation(summary = "查询项目列表") + @PreAuthorize("@ss.hasPermi('ccdi:project:list')") + public TableDataInfo listProject(CcdiProjectQueryDTO queryDTO) { + PageDomain pageDomain = TableSupport.buildPageRequest(); + Page page = new Page<>(pageDomain.getPageNum(), pageDomain.getPageSize()); + Page result = projectService.selectProjectPage(page, queryDTO); + return getDataTable(result.getRecords(), result.getTotal()); + } +} diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/CcdiProject.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/CcdiProject.java new file mode 100644 index 0000000..88c6c94 --- /dev/null +++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/CcdiProject.java @@ -0,0 +1,75 @@ +package com.ruoyi.info.collection.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 纪检初核项目实体类 + * + * @author ruoyi + */ +@Data +@TableName("ccdi_project") +public class CcdiProject implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** 项目ID */ + @TableId(type = IdType.AUTO) + private Long projectId; + + /** 项目名称 */ + private String projectName; + + /** 项目描述 */ + private String description; + + /** 配置方式:default-全局默认,custom-自定义 */ + private String configType; + + /** 项目状态:0-进行中,1-已完成,2-已归档 */ + private String status; + + /** 是否归档:0-未归档,1-已归档 */ + private Integer isArchived; + + /** 目标人数 */ + private Integer targetCount; + + /** 高风险人数 */ + private Integer highRiskCount; + + /** 中风险人数 */ + private Integer mediumRiskCount; + + /** 低风险人数 */ + private Integer lowRiskCount; + + /** 删除标志:0-存在,2-删除 */ + @TableLogic + private String delFlag; + + /** 创建者 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 创建时间 */ + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** 更新者 */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private String updateBy; + + /** 更新时间 */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** 备注 */ + private String remark; +} diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiProjectQueryDTO.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiProjectQueryDTO.java new file mode 100644 index 0000000..de8ce5e --- /dev/null +++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiProjectQueryDTO.java @@ -0,0 +1,17 @@ +package com.ruoyi.info.collection.domain.dto; + +import lombok.Data; + +/** + * 项目查询DTO + * + * @author ruoyi + */ +@Data +public class CcdiProjectQueryDTO { + /** 项目名称 */ + private String projectName; + + /** 项目状态 */ + private String status; +} diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiProjectSaveDTO.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiProjectSaveDTO.java new file mode 100644 index 0000000..0882745 --- /dev/null +++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiProjectSaveDTO.java @@ -0,0 +1,27 @@ +package com.ruoyi.info.collection.domain.dto; + +import lombok.Data; + +import jakarta.validation.constraints.NotBlank; +import org.hibernate.validator.constraints.Length; + +/** + * 项目保存DTO + * + * @author ruoyi + */ +@Data +public class CcdiProjectSaveDTO { + /** 项目名称(必填) */ + @NotBlank(message = "项目名称不能为空") + @Length(max = 200, message = "项目名称长度不能超过200个字符") + private String projectName; + + /** 项目描述(可选) */ + @Length(max = 500, message = "项目描述长度不能超过500个字符") + private String description; + + /** 配置方式(必填):default-全局默认,custom-自定义 */ + @NotBlank(message = "配置方式不能为空") + private String configType; +} diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/CcdiProjectVO.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/CcdiProjectVO.java new file mode 100644 index 0000000..c9fc5a9 --- /dev/null +++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/CcdiProjectVO.java @@ -0,0 +1,49 @@ +package com.ruoyi.info.collection.domain.vo; + +import lombok.Data; + +import java.util.Date; + +/** + * 项目VO + * + * @author ruoyi + */ +@Data +public class CcdiProjectVO { + /** 项目ID */ + private Long projectId; + + /** 项目名称 */ + private String projectName; + + /** 项目描述 */ + private String description; + + /** 配置方式 */ + private String configType; + + /** 项目状态 */ + private String status; + + /** 是否归档:0-未归档,1-已归档 */ + private Integer isArchived; + + /** 目标人数 */ + private Integer targetCount; + + /** 高风险人数 */ + private Integer highRiskCount; + + /** 中风险人数 */ + private Integer mediumRiskCount; + + /** 低风险人数 */ + private Integer lowRiskCount; + + /** 创建时间 */ + private Date createTime; + + /** 创建者 */ + private String createBy; +} diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/mapper/CcdiProjectMapper.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/mapper/CcdiProjectMapper.java new file mode 100644 index 0000000..57a254a --- /dev/null +++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/mapper/CcdiProjectMapper.java @@ -0,0 +1,26 @@ +package com.ruoyi.info.collection.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.info.collection.domain.CcdiProject; +import com.ruoyi.info.collection.domain.dto.CcdiProjectQueryDTO; +import com.ruoyi.info.collection.domain.vo.CcdiProjectVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 项目Mapper接口 + * + * @author ruoyi + */ +@Mapper +public interface CcdiProjectMapper extends BaseMapper { + /** + * 分页查询项目列表 + * + * @param page 分页对象 + * @param queryDTO 查询条件 + * @return 分页结果 + */ + Page selectProjectPage(Page page, @Param("queryDTO") CcdiProjectQueryDTO queryDTO); +} diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/service/ICcdiProjectService.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/service/ICcdiProjectService.java new file mode 100644 index 0000000..e3ccf3f --- /dev/null +++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/service/ICcdiProjectService.java @@ -0,0 +1,54 @@ +package com.ruoyi.info.collection.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.info.collection.domain.dto.CcdiProjectQueryDTO; +import com.ruoyi.info.collection.domain.dto.CcdiProjectSaveDTO; +import com.ruoyi.info.collection.domain.vo.CcdiProjectVO; + +/** + * 项目Service接口 + * + * @author ruoyi + */ +public interface ICcdiProjectService { + /** + * 创建项目 + * + * @param dto 项目保存DTO + * @return 项目VO + */ + CcdiProjectVO createProject(CcdiProjectSaveDTO dto); + + /** + * 更新项目 + * + * @param dto 项目更新DTO + * @return 项目VO + */ + CcdiProjectVO updateProject(CcdiProjectSaveDTO dto); + + /** + * 删除项目 + * + * @param projectId 项目ID + * @return 是否成功 + */ + boolean deleteProject(Long projectId); + + /** + * 查询项目详情 + * + * @param projectId 项目ID + * @return 项目VO + */ + CcdiProjectVO getProjectById(Long projectId); + + /** + * 分页查询项目列表 + * + * @param page 分页对象 + * @param queryDTO 查询条件 + * @return 分页结果 + */ + Page selectProjectPage(Page page, CcdiProjectQueryDTO queryDTO); +} diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/service/impl/CcdiProjectServiceImpl.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/service/impl/CcdiProjectServiceImpl.java new file mode 100644 index 0000000..21e0fb0 --- /dev/null +++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/service/impl/CcdiProjectServiceImpl.java @@ -0,0 +1,71 @@ +package com.ruoyi.info.collection.service.impl; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.info.collection.domain.CcdiProject; +import com.ruoyi.info.collection.domain.dto.CcdiProjectQueryDTO; +import com.ruoyi.info.collection.domain.dto.CcdiProjectSaveDTO; +import com.ruoyi.info.collection.domain.vo.CcdiProjectVO; +import com.ruoyi.info.collection.mapper.CcdiProjectMapper; +import com.ruoyi.info.collection.service.ICcdiProjectService; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +/** + * 项目Service实现类 + * + * @author ruoyi + */ +@Service +public class CcdiProjectServiceImpl implements ICcdiProjectService { + + @Resource + private CcdiProjectMapper projectMapper; + + @Override + public CcdiProjectVO createProject(CcdiProjectSaveDTO dto) { + CcdiProject project = new CcdiProject(); + BeanUtils.copyProperties(dto, project); + + // 设置默认值 + project.setStatus("0"); // 进行中 + project.setIsArchived(0); // 未归档 + project.setTargetCount(0); + project.setHighRiskCount(0); + project.setMediumRiskCount(0); + project.setLowRiskCount(0); + + projectMapper.insert(project); + + CcdiProjectVO vo = new CcdiProjectVO(); + BeanUtils.copyProperties(project, vo); + return vo; + } + + @Override + public CcdiProjectVO updateProject(CcdiProjectSaveDTO dto) { + // TODO: 实现更新逻辑 + return null; + } + + @Override + public boolean deleteProject(Long projectId) { + return projectMapper.deleteById(projectId) > 0; + } + + @Override + public CcdiProjectVO getProjectById(Long projectId) { + CcdiProject project = projectMapper.selectById(projectId); + if (project == null) { + return null; + } + CcdiProjectVO vo = new CcdiProjectVO(); + BeanUtils.copyProperties(project, vo); + return vo; + } + + @Override + public Page selectProjectPage(Page page, CcdiProjectQueryDTO queryDTO) { + return projectMapper.selectProjectPage(page, queryDTO); + } +} diff --git a/ccdi-info-collection/src/main/resources/mapper/info/collection/CcdiProjectMapper.xml b/ccdi-info-collection/src/main/resources/mapper/info/collection/CcdiProjectMapper.xml new file mode 100644 index 0000000..0e9cb45 --- /dev/null +++ b/ccdi-info-collection/src/main/resources/mapper/info/collection/CcdiProjectMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/sql/ccdi_project.sql b/sql/ccdi_project.sql new file mode 100644 index 0000000..38bfde8 --- /dev/null +++ b/sql/ccdi_project.sql @@ -0,0 +1,82 @@ +-- ---------------------------- +-- 1. 删除旧表(如果存在) +-- ---------------------------- +DROP TABLE IF EXISTS `ccdi_project`; + +-- ---------------------------- +-- 2. 创建项目表 +-- ---------------------------- +CREATE TABLE `ccdi_project` ( + `project_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '项目ID', + `project_name` VARCHAR(200) NOT NULL COMMENT '项目名称', + `description` VARCHAR(500) DEFAULT NULL COMMENT '项目描述', + `config_type` VARCHAR(20) NOT NULL DEFAULT 'default' COMMENT '配置方式:default-全局默认,custom-自定义', + `status` CHAR(1) NOT NULL DEFAULT '0' COMMENT '项目状态:0-进行中,1-已完成,2-已归档', + `is_archived` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否归档:0-未归档,1-已归档', + `target_count` INT NOT NULL DEFAULT 0 COMMENT '目标人数', + `high_risk_count` INT NOT NULL DEFAULT 0 COMMENT '高风险人数', + `medium_risk_count` INT NOT NULL DEFAULT 0 COMMENT '中风险人数', + `low_risk_count` INT NOT NULL DEFAULT 0 COMMENT '低风险人数', + `del_flag` CHAR(1) DEFAULT '0' COMMENT '删除标志:0-存在,2-删除', + `create_by` VARCHAR(64) DEFAULT '' COMMENT '创建者', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` VARCHAR(64) DEFAULT '' COMMENT '更新者', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `remark` VARCHAR(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`project_id`), + INDEX `idx_project_name` (`project_name`), + INDEX `idx_status` (`status`), + INDEX `idx_is_archived` (`is_archived`), + INDEX `idx_del_flag` (`del_flag`), + INDEX `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='纪检初核项目表'; + +-- ---------------------------- +-- 3. 插入项目状态字典 +-- ---------------------------- +INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark) +VALUES ('项目状态', 'ccdi_project_status', '0', 'admin', NOW(), '纪检初核项目状态'); + +INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) +VALUES +(1, '进行中', '0', 'ccdi_project_status', '', 'primary', 'Y', '0', 'admin', NOW()), +(2, '已完成', '1', 'ccdi_project_status', '', 'success', 'N', '0', 'admin', NOW()), +(3, '已归档', '2', 'ccdi_project_status', '', 'info', 'N', '0', 'admin', NOW()); + +-- ---------------------------- +-- 4. 插入配置方式字典 +-- ---------------------------- +INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark) +VALUES ('配置方式', 'ccdi_config_type', '0', 'admin', NOW(), '项目配置方式'); + +INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) +VALUES +(1, '全局默认配置', 'default', 'ccdi_config_type', '', 'primary', 'Y', '0', 'admin', NOW()), +(2, '自定义配置', 'custom', 'ccdi_config_type', '', 'warning', 'N', '0', 'admin', NOW()); + +-- ---------------------------- +-- 5. 插入菜单权限 +-- ---------------------------- +INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, menu_type, visible, status, perms, icon, create_by, create_time) +VALUES ('纪检初核管理', 0, 1, 'ccdi', NULL, 'M', '0', '0', '', 'star', 'admin', NOW()); + +SET @parent_id = LAST_INSERT_ID(); + +INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, menu_type, visible, status, perms, icon, create_by, create_time) +VALUES ('项目管理', @parent_id, 1, 'project', 'ccdiProject/index', 'C', '0', '0', 'ccdi:project:list', 'table', 'admin', NOW()); + +SET @menu_id = LAST_INSERT_ID(); + +INSERT INTO sys_menu (menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time) +VALUES +('创建项目', @menu_id, 1, 'F', '0', '0', 'ccdi:project:add', 'admin', NOW()), +('编辑项目', @menu_id, 2, 'F', '0', '0', 'ccdi:project:edit', 'admin', NOW()), +('删除项目', @menu_id, 3, 'F', '0', '0', 'ccdi:project:remove', 'admin', NOW()), +('查询项目', @menu_id, 4, 'F', '0', '0', 'ccdi:project:query', 'admin', NOW()), +('导出项目', @menu_id, 5, 'F', '0', '0', 'ccdi:project:export', 'admin', NOW()); + +-- ---------------------------- +-- 6. 为管理员角色分配权限 +-- ---------------------------- +INSERT INTO sys_role_menu (role_id, menu_id) +SELECT 1, menu_id FROM sys_menu WHERE perms LIKE 'ccdi:project:%' OR perms = 'ccdi:project:list';