提交 36181925 authored 作者: kxjia's avatar kxjia

初始项目代码

上级 2a2daa29
差异被折叠。
{"username":"admin","password":"admin123"}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
<relativePath/>
</parent>
<groupId>com.bcms</groupId>
<artifactId>bcms-backend</artifactId>
<version>1.0.0</version>
<name>bcms-backend</name>
<description>金融机构业务连续性管理系统</description>
<properties>
<java.version>17</java.version>
<mybatis-plus.version>3.5.5</mybatis-plus.version>
<jwt.version>0.12.3</jwt.version>
<knife4j.version>4.3.0</knife4j.version>
</properties>
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Starter Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- Spring Boot Starter Validation -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- MyBatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- MySQL Driver -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- JWT -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>${jwt.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>${jwt.version}</version>
<scope>runtime</scope>
</dependency>
<!-- Knife4j API Documentation -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- Hutool工具类 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.23</version>
</dependency>
<!-- Apache Commons -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!-- Spring Boot Starter Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Spring Security Test -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
package com.bcms;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 金融机构业务连续性管理系统启动类
*/
@SpringBootApplication
@MapperScan("com.bcms.mapper")
public class BcmsApplication {
public static void main(String[] args) {
SpringApplication.run(BcmsApplication.class, args);
}
}
package com.bcms.common;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 分页结果类
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageResult<T> implements Serializable {
private static final long serialVersionUID = 1L;
private List<T> records;
private Long total;
private Long size;
private Long current;
private Long pages;
/**
* 从MyBatis Plus Page转换
*/
public static <T> PageResult<T> of(Page<T> page) {
return new PageResult<>(
page.getRecords(),
page.getTotal(),
page.getSize(),
page.getCurrent(),
page.getPages()
);
}
/**
* 创建分页结果
*/
public static <T> PageResult<T> of(List<T> records, Long total, Long size, Long current) {
long pages = size > 0 ? (total + size - 1) / size : 0;
return new PageResult<>(records, total, size, current, pages);
}
}
package com.bcms.common;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 统一响应结果类
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> implements Serializable {
private static final long serialVersionUID = 1L;
private Integer code;
private String message;
private T data;
private Long timestamp;
/**
* 成功响应
*/
public static <T> Result<T> success() {
return new Result<>(200, "操作成功", null, System.currentTimeMillis());
}
/**
* 成功响应(带数据)
*/
public static <T> Result<T> success(T data) {
return new Result<>(200, "操作成功", data, System.currentTimeMillis());
}
/**
* 成功响应(带消息和数据)
*/
public static <T> Result<T> success(String message, T data) {
return new Result<>(200, message, data, System.currentTimeMillis());
}
/**
* 失败响应
*/
public static <T> Result<T> error(String message) {
return new Result<>(500, message, null, System.currentTimeMillis());
}
/**
* 失败响应(带状态码)
*/
public static <T> Result<T> error(Integer code, String message) {
return new Result<>(code, message, null, System.currentTimeMillis());
}
/**
* 自定义响应
*/
public static <T> Result<T> of(Integer code, String message, T data) {
return new Result<>(code, message, data, System.currentTimeMillis());
}
}
package com.bcms.common.exception;
import lombok.Getter;
/**
* 全局业务异常类
*/
@Getter
public class GlobalException extends RuntimeException {
private static final long serialVersionUID = 1L;
private final Integer code;
public GlobalException(String message) {
super(message);
this.code = 500;
}
public GlobalException(Integer code, String message) {
super(message);
this.code = code;
}
public GlobalException(String message, Throwable cause) {
super(message, cause);
this.code = 500;
}
// 常见异常便捷方法
public static GlobalException notFound(String message) {
return new GlobalException(404, message);
}
public static GlobalException badRequest(String message) {
return new GlobalException(400, message);
}
public static GlobalException unauthorized(String message) {
return new GlobalException(401, message);
}
public static GlobalException forbidden(String message) {
return new GlobalException(403, message);
}
public static GlobalException serverError(String message) {
return new GlobalException(500, message);
}
}
package com.bcms.common.exception;
import com.bcms.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
/**
* 全局异常处理器
*/
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 处理业务异常
*/
@ExceptionHandler(GlobalException.class)
public Result<Void> handleGlobalException(GlobalException e) {
log.error("业务异常: {}", e.getMessage());
return Result.error(e.getCode(), e.getMessage());
}
/**
* 处理参数校验异常
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result<Map<String, String>> handleValidationException(MethodArgumentNotValidException e) {
Map<String, String> errors = new HashMap<>();
e.getBindingResult().getAllErrors().forEach(error -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
log.error("参数校验异常: {}", errors);
return Result.error(400, "参数校验失败");
}
/**
* 处理绑定异常
*/
@ExceptionHandler(BindException.class)
public Result<Map<String, String>> handleBindException(BindException e) {
Map<String, String> errors = new HashMap<>();
e.getFieldErrors().forEach(error -> {
errors.put(error.getField(), error.getDefaultMessage());
});
log.error("绑定异常: {}", errors);
return Result.error(400, "参数绑定失败");
}
/**
* 处理其他异常
*/
@ExceptionHandler(Exception.class)
public Result<Void> handleException(Exception e) {
log.error("系统异常: ", e);
return Result.error("系统繁忙,请稍后再试");
}
}
package com.bcms.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* MyBatis Plus配置类
*/
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
package com.bcms.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* Redis配置类
*/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 使用StringRedisSerializer来序列化和反序列化redis的key值
StringRedisSerializer stringSerializer = new StringRedisSerializer();
template.setKeySerializer(stringSerializer);
template.setHashKeySerializer(stringSerializer);
// 使用GenericJackson2JsonRedisSerializer来序列化和反序列化redis的value值
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
template.setValueSerializer(genericJackson2JsonRedisSerializer);
template.setHashValueSerializer(genericJackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
package com.bcms.config;
import com.bcms.config.security.JwtAuthenticationFilter;
import com.bcms.config.security.JwtAuthenticationEntryPoint;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import java.util.Arrays;
import java.util.List;
/**
* 安全配置类
*/
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig {
private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;
public SecurityConfig(JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint) {
this.jwtAuthenticationEntryPoint = jwtAuthenticationEntryPoint;
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http, JwtAuthenticationFilter jwtAuthenticationFilter) throws Exception {
http
// 禁用CSRF
.csrf(AbstractHttpConfigurer::disable)
// 启用CORS
.cors(cors -> cors.configurationSource(corsConfigurationSource()))
// 禁用Session
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
// 配置异常处理
.exceptionHandling(exception -> exception.authenticationEntryPoint(jwtAuthenticationEntryPoint))
// 配置请求授权
.authorizeHttpRequests(auth -> auth
// 放行登录相关接口
.requestMatchers("/sys/user/login", "/sys/user/register").permitAll()
// 放行静态资源
.requestMatchers("/swagger-ui/**", "/v3/api-docs/**", "/swagger-resources/**", "/webjars/**").permitAll()
// 放行Knife4j文档
.requestMatchers("/doc.html", "/knife4j/**").permitAll()
// 所有请求都需要认证
.anyRequest().authenticated()
)
// 添加JWT过滤器
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
return http.build();
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOriginPatterns(List.of("*"));
configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
configuration.setAllowedHeaders(List.of("*"));
configuration.setAllowCredentials(true);
configuration.setMaxAge(3600L);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig) throws Exception {
return authConfig.getAuthenticationManager();
}
}
package com.bcms.config.security;
import com.bcms.common.Result;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
* 认证失败处理类
*/
@Component
public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException {
response.setContentType("application/json;charset=UTF-8");
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
Result<Object> result = Result.error(401, "未授权访问,请先登录");
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(result);
response.getWriter().write(json);
}
}
package com.bcms.config.security;
import com.bcms.entity.sys.User;
import com.bcms.service.sys.UserService;
import com.bcms.util.JwtUtil;
import com.bcms.util.RedisUtil;
import io.jsonwebtoken.Claims;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
/**
* JWT认证过滤器
*/
@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
private final JwtUtil jwtUtil;
private final RedisUtil redisUtil;
private final UserService userService;
public JwtAuthenticationFilter(JwtUtil jwtUtil, RedisUtil redisUtil, UserService userService) {
this.jwtUtil = jwtUtil;
this.redisUtil = redisUtil;
this.userService = userService;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
// 获取请求头中的token
String token = getTokenFromRequest(request);
if (StringUtils.hasText(token)) {
// 验证token
Claims claims = jwtUtil.parseToken(token);
if (claims != null) {
String username = claims.getSubject();
// 检查token是否在黑名单中
String blackKey = "token:blacklist:" + token;
if (redisUtil.hasKey(blackKey)) {
filterChain.doFilter(request, response);
return;
}
// 获取用户信息
User user = userService.getUserByUsername(username);
if (user != null) {
// 获取用户角色
List<String> roles = userService.getUserRoles(user.getId());
List<SimpleGrantedAuthority> authorities = roles.stream()
.map(role -> new SimpleGrantedAuthority("ROLE_" + role))
.collect(Collectors.toList());
// 创建认证信息
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(user, null, authorities);
authentication.setDetails(request);
// 设置到安全上下文中
SecurityContextHolder.getContext().setAuthentication(authentication);
}
}
}
filterChain.doFilter(request, response);
}
private String getTokenFromRequest(HttpServletRequest request) {
String bearerToken = request.getHeader("Authorization");
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
return bearerToken.substring(7);
}
return null;
}
}
package com.bcms.controller.bia;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.common.PageResult;
import com.bcms.common.Result;
import com.bcms.dto.BiaDTO;
import com.bcms.entity.bia.*;
import com.bcms.service.bia.BiaService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* BIA控制器
*/
@Tag(name = "BIA业务影响分析")
@RestController
@RequestMapping("/bia")
public class BiaController {
private final BiaService biaService;
public BiaController(BiaService biaService) {
this.biaService = biaService;
}
// ==================== 业务单元 ====================
@Operation(summary = "分页查询业务单元")
@GetMapping("/unit/page")
@PreAuthorize("hasAuthority('bia:unit:list')")
public Result<PageResult<BusinessUnit>> getUnitPage(
@RequestParam(defaultValue = "1") Long current,
@RequestParam(defaultValue = "10") Long size,
@RequestParam(required = false) String unitName,
@RequestParam(required = false) Integer status) {
Page<BusinessUnit> page = biaService.getUnitPage(current, size, unitName, status);
return Result.success(PageResult.of(page));
}
@Operation(summary = "获取业务单元树")
@GetMapping("/unit/tree")
public Result<List<BusinessUnit>> getUnitTree() {
return Result.success(biaService.getUnitTree());
}
@Operation(summary = "创建业务单元")
@PostMapping("/unit")
@PreAuthorize("hasAuthority('bia:unit:add')")
public Result<Void> createUnit(@RequestBody BusinessUnit unit) {
biaService.createUnit(unit);
return Result.success();
}
@Operation(summary = "更新业务单元")
@PutMapping("/unit")
@PreAuthorize("hasAuthority('bia:unit:edit')")
public Result<Void> updateUnit(@RequestBody BusinessUnit unit) {
biaService.updateUnit(unit);
return Result.success();
}
@Operation(summary = "删除业务单元")
@DeleteMapping("/unit/{id}")
@PreAuthorize("hasAuthority('bia:unit:delete')")
public Result<Void> deleteUnit(@PathVariable Long id) {
biaService.deleteUnit(id);
return Result.success();
}
// ==================== 业务功能 ====================
@Operation(summary = "分页查询业务功能")
@GetMapping("/func/page")
@PreAuthorize("hasAuthority('bia:func:list')")
public Result<PageResult<BusinessFunc>> getFuncPage(
@RequestParam(defaultValue = "1") Long current,
@RequestParam(defaultValue = "10") Long size,
@RequestParam(required = false) Long unitId,
@RequestParam(required = false) String funcName,
@RequestParam(required = false) Integer bizCategory) {
Page<BusinessFunc> page = biaService.getFuncPage(current, size, unitId, funcName, bizCategory);
return Result.success(PageResult.of(page));
}
@Operation(summary = "创建业务功能")
@PostMapping("/func")
@PreAuthorize("hasAuthority('bia:func:add')")
public Result<Void> createFunc(@RequestBody BusinessFunc func) {
biaService.createFunc(func);
return Result.success();
}
@Operation(summary = "更新业务功能")
@PutMapping("/func")
@PreAuthorize("hasAuthority('bia:func:edit')")
public Result<Void> updateFunc(@RequestBody BusinessFunc func) {
biaService.updateFunc(func);
return Result.success();
}
@Operation(summary = "删除业务功能")
@DeleteMapping("/func/{id}")
@PreAuthorize("hasAuthority('bia:func:delete')")
public Result<Void> deleteFunc(@PathVariable Long id) {
biaService.deleteFunc(id);
return Result.success();
}
// ==================== BIA分析 ====================
@Operation(summary = "分页查询BIA分析")
@GetMapping("/analysis/page")
@PreAuthorize("hasAuthority('bia:analysis:list')")
public Result<PageResult<BiaAnalysis>> getAnalysisPage(
@RequestParam(defaultValue = "1") Long current,
@RequestParam(defaultValue = "10") Long size,
@RequestParam(required = false) Long funcId,
@RequestParam(required = false) Integer priority,
@RequestParam(required = false) Integer reviewStatus) {
Page<BiaAnalysis> page = biaService.getAnalysisPage(current, size, funcId, priority, reviewStatus);
return Result.success(PageResult.of(page));
}
@Operation(summary = "创建BIA分析")
@PostMapping("/analysis")
@PreAuthorize("hasAuthority('bia:analysis:add')")
public Result<Void> createAnalysis(@RequestBody BiaDTO dto) {
biaService.createAnalysis(dto);
return Result.success();
}
@Operation(summary = "更新BIA分析")
@PutMapping("/analysis")
@PreAuthorize("hasAuthority('bia:analysis:edit')")
public Result<Void> updateAnalysis(@RequestBody BiaDTO dto) {
biaService.updateAnalysis(dto);
return Result.success();
}
@Operation(summary = "提交审核")
@PostMapping("/analysis/{id}/submit")
@PreAuthorize("hasAuthority('bia:analysis:submit')")
public Result<Void> submitForReview(@PathVariable Long id) {
biaService.submitForReview(id);
return Result.success();
}
@Operation(summary = "批准分析")
@PostMapping("/analysis/{id}/approve")
@PreAuthorize("hasAuthority('bia:analysis:approve')")
public Result<Void> approveAnalysis(@PathVariable Long id, @RequestParam(required = false) String comment) {
biaService.approveAnalysis(id, comment);
return Result.success();
}
@Operation(summary = "生成分析报告")
@GetMapping("/analysis/{id}/report")
@PreAuthorize("hasAuthority('bia:analysis:report')")
public Result<Map<String, Object>> getAnalysisReport(@PathVariable Long id) {
return Result.success(biaService.getAnalysisReport(id));
}
// ==================== 依赖关系 ====================
@Operation(summary = "获取依赖关系列表")
@GetMapping("/dependency/{funcId}")
public Result<List<BusinessDependency>> getDependencies(@PathVariable Long funcId) {
return Result.success(biaService.getDependencies(funcId));
}
@Operation(summary = "创建依赖关系")
@PostMapping("/dependency")
@PreAuthorize("hasAuthority('bia:dependency:add')")
public Result<Void> createDependency(@RequestBody BusinessDependency dependency) {
biaService.createDependency(dependency);
return Result.success();
}
@Operation(summary = "更新依赖关系")
@PutMapping("/dependency")
@PreAuthorize("hasAuthority('bia:dependency:edit')")
public Result<Void> updateDependency(@RequestBody BusinessDependency dependency) {
biaService.updateDependency(dependency);
return Result.success();
}
@Operation(summary = "删除依赖关系")
@DeleteMapping("/dependency/{id}")
@PreAuthorize("hasAuthority('bia:dependency:delete')")
public Result<Void> deleteDependency(@PathVariable Long id) {
biaService.deleteDependency(id);
return Result.success();
}
// ==================== 统计报表 ====================
@Operation(summary = "获取仪表盘统计")
@GetMapping("/dashboard")
public Result<Map<String, Object>> getDashboardStats() {
return Result.success(biaService.getDashboardStats());
}
}
package com.bcms.controller.drill;
import com.bcms.common.PageResult;
import com.bcms.common.Result;
import com.bcms.entity.drill.DrillIssue;
import com.bcms.entity.drill.DrillPlan;
import com.bcms.entity.drill.DrillRecord;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.service.drill.DrillService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
@Tag(name = "演练管理")
@RestController
@RequestMapping("/drill")
public class DrillController {
private final DrillService drillService;
public DrillController(DrillService drillService) {
this.drillService = drillService;
}
// ==================== 演练计划 ====================
@Operation(summary = "分页查询演练计划")
@GetMapping("/plan/page")
@PreAuthorize("hasAuthority('drill:plan:list')")
public Result<PageResult<DrillPlan>> getPlanPage(
@RequestParam(defaultValue = "1") Long current,
@RequestParam(defaultValue = "10") Long size,
@RequestParam(required = false) String drillName,
@RequestParam(required = false) Integer drillType,
@RequestParam(required = false) Integer status) {
Page<DrillPlan> page = drillService.getPlanPage(current, size, drillName, drillType, status);
return Result.success(PageResult.of(page));
}
@Operation(summary = "获取演练计划详情")
@GetMapping("/plan/{id}")
public Result<DrillPlan> getPlanById(@PathVariable Long id) {
return Result.success(drillService.getPlanById(id));
}
@Operation(summary = "创建演练计划")
@PostMapping("/plan")
@PreAuthorize("hasAuthority('drill:plan:add')")
public Result<Void> createPlan(@RequestBody DrillPlan plan) {
drillService.createPlan(plan);
return Result.success();
}
@Operation(summary = "更新演练计划")
@PutMapping("/plan")
@PreAuthorize("hasAuthority('drill:plan:edit')")
public Result<Void> updatePlan(@RequestBody DrillPlan plan) {
drillService.updatePlan(plan);
return Result.success();
}
@Operation(summary = "删除演练计划")
@DeleteMapping("/plan/{id}")
@PreAuthorize("hasAuthority('drill:plan:delete')")
public Result<Void> deletePlan(@PathVariable Long id) {
drillService.deletePlan(id);
return Result.success();
}
@Operation(summary = "启动演练")
@PostMapping("/plan/{id}/start")
@PreAuthorize("hasAuthority('drill:plan:start')")
public Result<Void> startDrill(@PathVariable Long id) {
drillService.startDrill(id);
return Result.success();
}
@Operation(summary = "完成演练")
@PostMapping("/plan/{id}/complete")
@PreAuthorize("hasAuthority('drill:plan:complete')")
public Result<Void> completeDrill(@PathVariable Long id, @RequestBody DrillRecord record) {
drillService.completeDrill(id, record);
return Result.success();
}
// ==================== 演练记录 ====================
@Operation(summary = "分页查询演练记录")
@GetMapping("/record/page")
@PreAuthorize("hasAuthority('drill:record:list')")
public Result<PageResult<DrillRecord>> getRecordPage(
@RequestParam(defaultValue = "1") Long current,
@RequestParam(defaultValue = "10") Long size) {
Page<DrillRecord> page = drillService.getRecordPage(current, size);
return Result.success(PageResult.of(page));
}
// ==================== 演练问题 ====================
@Operation(summary = "分页查询演练问题")
@GetMapping("/issue/page")
@PreAuthorize("hasAuthority('drill:issue:list')")
public Result<PageResult<DrillIssue>> getIssuePage(
@RequestParam(defaultValue = "1") Long current,
@RequestParam(defaultValue = "10") Long size,
@RequestParam(required = false) Integer fixStatus,
@RequestParam(required = false) Integer severity) {
Page<DrillIssue> page = drillService.getIssuePage(current, size, fixStatus, severity);
return Result.success(PageResult.of(page));
}
@Operation(summary = "更新问题整改状态")
@PutMapping("/issue/{id}/fix")
@PreAuthorize("hasAuthority('drill:issue:fix')")
public Result<Void> fixIssue(@PathVariable Long id, @RequestBody DrillIssue issue) {
drillService.fixIssue(id, issue);
return Result.success();
}
}
package com.bcms.controller.incident;
import com.bcms.common.PageResult;
import com.bcms.common.Result;
import com.bcms.entity.incident.Incident;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.service.incident.IncidentService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
@Tag(name = "事件管理")
@RestController
@RequestMapping("/incident")
public class IncidentController {
private final IncidentService incidentService;
public IncidentController(IncidentService incidentService) {
this.incidentService = incidentService;
}
@Operation(summary = "分页查询事件")
@GetMapping("/page")
@PreAuthorize("hasAuthority('incident:list')")
public Result<PageResult<Incident>> getPage(
@RequestParam(defaultValue = "1") Long current,
@RequestParam(defaultValue = "10") Long size,
@RequestParam(required = false) String incidentName,
@RequestParam(required = false) Integer incidentType,
@RequestParam(required = false) Integer incidentLevel,
@RequestParam(required = false) Integer status) {
Page<Incident> page = incidentService.getPage(current, size, incidentName, incidentType, incidentLevel, status);
return Result.success(PageResult.of(page));
}
@Operation(summary = "获取事件详情")
@GetMapping("/{id}")
public Result<Incident> getById(@PathVariable Long id) {
return Result.success(incidentService.getById(id));
}
@Operation(summary = "创建事件")
@PostMapping
@PreAuthorize("hasAuthority('incident:add')")
public Result<Void> create(@RequestBody Incident incident) {
incidentService.create(incident);
return Result.success();
}
@Operation(summary = "更新事件")
@PutMapping
@PreAuthorize("hasAuthority('incident:edit')")
public Result<Void> update(@RequestBody Incident incident) {
incidentService.update(incident);
return Result.success();
}
@Operation(summary = "删除事件")
@DeleteMapping("/{id}")
@PreAuthorize("hasAuthority('incident:delete')")
public Result<Void> delete(@PathVariable Long id) {
incidentService.delete(id);
return Result.success();
}
@Operation(summary = "更新事件状态")
@PutMapping("/{id}/status")
@PreAuthorize("hasAuthority('incident:status')")
public Result<Void> updateStatus(@PathVariable Long id, @RequestParam Integer status) {
incidentService.updateStatus(id, status);
return Result.success();
}
@Operation(summary = "关闭事件")
@PostMapping("/{id}/close")
@PreAuthorize("hasAuthority('incident:close')")
public Result<Void> close(@PathVariable Long id, @RequestBody Incident incident) {
incidentService.close(id, incident);
return Result.success();
}
@Operation(summary = "获取事件统计")
@GetMapping("/stats")
public Result<Object> getStats() {
return Result.success(incidentService.getStats());
}
@Operation(summary = "生成事件编号")
@GetMapping("/generate-no")
public Result<String> generateNo() {
return Result.success(incidentService.generateIncidentNo());
}
}
package com.bcms.controller.plan;
import com.bcms.common.PageResult;
import com.bcms.common.Result;
import com.bcms.entity.plan.Bcp;
import com.bcms.entity.plan.Drp;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.service.plan.PlanService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
@Tag(name = "计划管理")
@RestController
@RequestMapping("/plan")
public class PlanController {
private final PlanService planService;
public PlanController(PlanService planService) {
this.planService = planService;
}
// ==================== BCP管理 ====================
@Operation(summary = "分页查询BCP")
@GetMapping("/bcp/page")
@PreAuthorize("hasAuthority('plan:bcp:list')")
public Result<PageResult<Bcp>> getBcpPage(
@RequestParam(defaultValue = "1") Long current,
@RequestParam(defaultValue = "10") Long size,
@RequestParam(required = false) String planName,
@RequestParam(required = false) Integer status) {
Page<Bcp> page = planService.getBcpPage(current, size, planName, status);
return Result.success(PageResult.of(page));
}
@Operation(summary = "获取BCP详情")
@GetMapping("/bcp/{id}")
public Result<Bcp> getBcpById(@PathVariable Long id) {
return Result.success(planService.getBcpById(id));
}
@Operation(summary = "创建BCP")
@PostMapping("/bcp")
@PreAuthorize("hasAuthority('plan:bcp:add')")
public Result<Void> createBcp(@RequestBody Bcp bcp) {
planService.createBcp(bcp);
return Result.success();
}
@Operation(summary = "更新BCP")
@PutMapping("/bcp")
@PreAuthorize("hasAuthority('plan:bcp:edit')")
public Result<Void> updateBcp(@RequestBody Bcp bcp) {
planService.updateBcp(bcp);
return Result.success();
}
@Operation(summary = "删除BCP")
@DeleteMapping("/bcp/{id}")
@PreAuthorize("hasAuthority('plan:bcp:delete')")
public Result<Void> deleteBcp(@PathVariable Long id) {
planService.deleteBcp(id);
return Result.success();
}
@Operation(summary = "发布BCP")
@PostMapping("/bcp/{id}/publish")
@PreAuthorize("hasAuthority('plan:bcp:publish')")
public Result<Void> publishBcp(@PathVariable Long id) {
planService.publishBcp(id);
return Result.success();
}
// ==================== DRP管理 ====================
@Operation(summary = "分页查询DRP")
@GetMapping("/drp/page")
@PreAuthorize("hasAuthority('plan:drp:list')")
public Result<PageResult<Drp>> getDrpPage(
@RequestParam(defaultValue = "1") Long current,
@RequestParam(defaultValue = "10") Long size,
@RequestParam(required = false) String planName,
@RequestParam(required = false) Integer status) {
Page<Drp> page = planService.getDrpPage(current, size, planName, status);
return Result.success(PageResult.of(page));
}
@Operation(summary = "获取DRP详情")
@GetMapping("/drp/{id}")
public Result<Drp> getDrpById(@PathVariable Long id) {
return Result.success(planService.getDrpById(id));
}
@Operation(summary = "创建DRP")
@PostMapping("/drp")
@PreAuthorize("hasAuthority('plan:drp:add')")
public Result<Void> createDrp(@RequestBody Drp drp) {
planService.createDrp(drp);
return Result.success();
}
@Operation(summary = "更新DRP")
@PutMapping("/drp")
@PreAuthorize("hasAuthority('plan:drp:edit')")
public Result<Void> updateDrp(@RequestBody Drp drp) {
planService.updateDrp(drp);
return Result.success();
}
@Operation(summary = "删除DRP")
@DeleteMapping("/drp/{id}")
@PreAuthorize("hasAuthority('plan:drp:delete')")
public Result<Void> deleteDrp(@PathVariable Long id) {
planService.deleteDrp(id);
return Result.success();
}
@Operation(summary = "发布DRP")
@PostMapping("/drp/{id}/publish")
@PreAuthorize("hasAuthority('plan:drp:publish')")
public Result<Void> publishDrp(@PathVariable Long id) {
planService.publishDrp(id);
return Result.success();
}
}
package com.bcms.controller.risk;
import com.bcms.common.PageResult;
import com.bcms.common.Result;
import com.bcms.entity.risk.Risk;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.service.risk.RiskService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Tag(name = "风险评估管理")
@RestController
@RequestMapping("/risk")
public class RiskController {
private final RiskService riskService;
public RiskController(RiskService riskService) {
this.riskService = riskService;
}
@Operation(summary = "分页查询风险")
@GetMapping("/page")
@PreAuthorize("hasAuthority('risk:list')")
public Result<PageResult<Risk>> getPage(
@RequestParam(defaultValue = "1") Long current,
@RequestParam(defaultValue = "10") Long size,
@RequestParam(required = false) String riskName,
@RequestParam(required = false) Integer riskType,
@RequestParam(required = false) Integer riskLevel,
@RequestParam(required = false) Integer status) {
Page<Risk> page = riskService.getPage(current, size, riskName, riskType, riskLevel, status);
return Result.success(PageResult.of(page));
}
@Operation(summary = "获取风险详情")
@GetMapping("/{id}")
public Result<Risk> getById(@PathVariable Long id) {
return Result.success(riskService.getById(id));
}
@Operation(summary = "创建风险")
@PostMapping
@PreAuthorize("hasAuthority('risk:add')")
public Result<Void> create(@RequestBody Risk risk) {
riskService.create(risk);
return Result.success();
}
@Operation(summary = "更新风险")
@PutMapping
@PreAuthorize("hasAuthority('risk:edit')")
public Result<Void> update(@RequestBody Risk risk) {
riskService.update(risk);
return Result.success();
}
@Operation(summary = "删除风险")
@DeleteMapping("/{id}")
@PreAuthorize("hasAuthority('risk:delete')")
public Result<Void> delete(@PathVariable Long id) {
riskService.delete(id);
return Result.success();
}
@Operation(summary = "获取风险统计")
@GetMapping("/stats")
public Result<Object> getStats() {
return Result.success(riskService.getStats());
}
}
package com.bcms.controller.sys;
import com.bcms.common.Result;
import com.bcms.entity.sys.Menu;
import com.bcms.service.sys.MenuService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/system/menu")
@Tag(name = "菜单管理")
public class MenuController {
@Autowired
private MenuService menuService;
@GetMapping("/tree")
@Operation(summary = "获取菜单树")
public Result<List<Menu>> getTree() {
return Result.success(menuService.getTree());
}
@GetMapping("/list")
@Operation(summary = "获取菜单列表")
public Result<List<Menu>> getList() {
return Result.success(menuService.getList());
}
@GetMapping("/{id}")
@Operation(summary = "获取菜单详情")
public Result<Menu> getById(@PathVariable Long id) {
return Result.success(menuService.getById(id));
}
@PostMapping
@Operation(summary = "新增菜单")
public Result<?> create(@RequestBody Menu menu) {
menuService.create(menu);
return Result.success();
}
@PutMapping
@Operation(summary = "更新菜单")
public Result<?> update(@RequestBody Menu menu) {
menuService.update(menu);
return Result.success();
}
@DeleteMapping("/{id}")
@Operation(summary = "删除菜单")
public Result<?> delete(@PathVariable Long id) {
menuService.delete(id);
return Result.success();
}
}
package com.bcms.controller.sys;
import com.bcms.common.Result;
import com.bcms.entity.sys.Role;
import com.bcms.service.sys.RoleService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api/system/role")
@Tag(name = "角色管理")
public class RoleController {
@Autowired
private RoleService roleService;
@GetMapping("/page")
@Operation(summary = "分页查询角色")
public Result<?> getPage(
@RequestParam(defaultValue = "1") Long current,
@RequestParam(defaultValue = "10") Long size,
@RequestParam(required = false) String roleName,
@RequestParam(required = false) Integer status) {
return Result.success(roleService.getPage(current, size, roleName, status));
}
@GetMapping("/list")
@Operation(summary = "获取角色列表")
public Result<List<Role>> getList() {
return Result.success(roleService.getList());
}
@GetMapping("/{id}")
@Operation(summary = "获取角色详情")
public Result<Role> getById(@PathVariable Long id) {
return Result.success(roleService.getById(id));
}
@PostMapping
@Operation(summary = "新增角色")
public Result<?> create(@RequestBody Role role) {
roleService.create(role);
return Result.success();
}
@PutMapping
@Operation(summary = "更新角色")
public Result<?> update(@RequestBody Role role) {
roleService.update(role);
return Result.success();
}
@DeleteMapping("/{id}")
@Operation(summary = "删除角色")
public Result<?> delete(@PathVariable Long id) {
roleService.delete(id);
return Result.success();
}
@GetMapping("/{roleId}/permissions")
@Operation(summary = "获取角色权限")
public Result<List<Long>> getPermissions(@PathVariable Long roleId) {
return Result.success(roleService.getPermissions(roleId));
}
@PostMapping("/{roleId}/permissions")
@Operation(summary = "分配角色权限")
public Result<?> assignPermissions(
@PathVariable Long roleId,
@RequestBody Map<String, List<Long>> body) {
List<Long> permissionIds = body.get("permissionIds");
roleService.assignPermissions(roleId, permissionIds);
return Result.success();
}
}
package com.bcms.controller.sys;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.common.PageResult;
import com.bcms.common.Result;
import com.bcms.dto.LoginDTO;
import com.bcms.dto.UserDTO;
import com.bcms.entity.sys.User;
import com.bcms.service.sys.UserService;
import com.bcms.vo.LoginVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* 用户管理控制器
*/
@Tag(name = "用户管理")
@RestController
@RequestMapping("/sys/user")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@Operation(summary = "用户登录")
@PostMapping("/login")
public Result<LoginVO> login(@Validated @RequestBody LoginDTO loginDTO) {
LoginVO loginVO = userService.login(loginDTO);
return Result.success(loginVO);
}
@Operation(summary = "用户登出")
@PostMapping("/logout")
public Result<Void> logout() {
// 后续实现
return Result.success();
}
@Operation(summary = "获取当前用户信息")
@GetMapping("/info")
public Result<User> getUserInfo() {
User user = userService.getCurrentUser();
user.setPassword(null);
return Result.success(user);
}
@Operation(summary = "获取用户菜单树")
@GetMapping("/menus")
public Result<List<Object>> getUserMenus() {
List<Object> menus = userService.getUserMenuTree();
return Result.success(menus);
}
@Operation(summary = "分页查询用户")
@GetMapping("/page")
@PreAuthorize("hasAuthority('sys:user:list')")
public Result<PageResult<User>> getUserPage(
@RequestParam(defaultValue = "1") Long current,
@RequestParam(defaultValue = "10") Long size,
@RequestParam(required = false) String username,
@RequestParam(required = false) Integer status,
@RequestParam(required = false) Long deptId) {
Page<User> page = userService.getUserPage(current, size, username, status, deptId);
return Result.success(PageResult.of(page));
}
@Operation(summary = "获取用户列表")
@GetMapping("/list")
@PreAuthorize("hasAuthority('sys:user:list')")
public Result<List<User>> getUserList() {
return Result.success(userService.list());
}
@Operation(summary = "创建用户")
@PostMapping
@PreAuthorize("hasAuthority('sys:user:add')")
public Result<Void> createUser(@Validated @RequestBody UserDTO userDTO) {
userService.createUser(userDTO);
return Result.success();
}
@Operation(summary = "更新用户")
@PutMapping
@PreAuthorize("hasAuthority('sys:user:edit')")
public Result<Void> updateUser(@Validated @RequestBody UserDTO userDTO) {
userService.updateUser(userDTO);
return Result.success();
}
@Operation(summary = "删除用户")
@DeleteMapping("/{id}")
@PreAuthorize("hasAuthority('sys:user:delete')")
public Result<Void> deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
return Result.success();
}
@Operation(summary = "重置密码")
@PutMapping("/{id}/reset-password")
@PreAuthorize("hasAuthority('sys:user:resetPassword')")
public Result<Void> resetPassword(@PathVariable Long id, @RequestBody Map<String, String> params) {
String newPassword = params.get("newPassword");
userService.resetPassword(id, newPassword);
return Result.success();
}
@Operation(summary = "修改密码")
@PutMapping("/change-password")
public Result<Void> changePassword(@RequestBody Map<String, String> params) {
String oldPassword = params.get("oldPassword");
String newPassword = params.get("newPassword");
userService.changePassword(oldPassword, newPassword);
return Result.success();
}
@Operation(summary = "分配用户角色")
@PutMapping("/{id}/roles")
@PreAuthorize("hasAuthority('sys:user:assignRole')")
public Result<Void> assignRoles(@PathVariable Long id, @RequestBody List<Long> roleIds) {
userService.assignRoles(id, roleIds);
return Result.success();
}
@Operation(summary = "获取用户角色列表")
@GetMapping("/{id}/roles")
public Result<List<String>> getUserRoles(@PathVariable Long id) {
List<String> roles = userService.getUserRoles(id);
return Result.success(roles);
}
}
package com.bcms.dto;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* BIA分析DTO
*/
@Data
public class BiaDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Long businessFuncId;
private String version;
private Integer priority;
private Integer mtpd;
private Integer rto;
private Integer rpo;
private BigDecimal financialImpact;
private Integer customerImpact;
private Integer regulatoryImpact;
private Integer reputationImpact;
private String conclusion;
private String recommendations;
private String analyst;
private LocalDateTime analysisDate;
}
package com.bcms.dto;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* 登录DTO
*/
@Data
public class LoginDTO implements Serializable {
private static final long serialVersionUID = 1L;
@NotBlank(message = "用户名不能为空")
private String username;
@NotBlank(message = "密码不能为空")
private String password;
private String captcha;
private String captchaId;
}
package com.bcms.dto;
import lombok.Data;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import java.io.Serializable;
import java.util.List;
/**
* 用户DTO
*/
@Data
public class UserDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
@NotBlank(message = "用户名不能为空")
@Size(min = 3, max = 20, message = "用户名长度在3-20个字符之间")
private String username;
@Size(min = 6, max = 20, message = "密码长度在6-20个字符之间")
private String password;
@NotBlank(message = "真实姓名不能为空")
private String realName;
@Email(message = "邮箱格式不正确")
private String email;
private String phone;
private String avatar;
private Long deptId;
private Integer status;
private List<Long> roleIds;
private String remark;
}
package com.bcms.entity.bia;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* BIA分析记录实体
*/
@Data
@TableName("bcm_bia_analysis")
public class BiaAnalysis implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Long id;
/**
* 业务功能ID
*/
private Long businessFuncId;
/**
* 分析版本
*/
private String version;
/**
* 业务优先级(1-5级,1最高)
*/
private Integer priority;
/**
* 最大可容忍中断时间(分钟)MTPD
*/
private Integer mtpd;
/**
* 恢复时间目标(分钟)RTO
*/
private Integer rto;
/**
* 恢复点目标(分钟)RPO
*/
private Integer rpo;
/**
* 财务影响(每小时,元)
*/
private BigDecimal financialImpact;
/**
* 客户影响等级(1-5级)
*/
private Integer customerImpact;
/**
* 监管影响等级(1-5级)
*/
private Integer regulatoryImpact;
/**
* 声誉影响等级(1-5级)
*/
private Integer reputationImpact;
/**
* 综合影响评分
*/
private BigDecimal totalImpactScore;
/**
* 分析结论
*/
private String conclusion;
/**
* 建议措施
*/
private String recommendations;
/**
* 分析人员
*/
private String analyst;
/**
* 分析日期
*/
private LocalDateTime analysisDate;
/**
* 审核状态(0待审核 1已审核 2已批准)
*/
private Integer reviewStatus;
/**
* 审核人
*/
private String reviewer;
/**
* 审核日期
*/
private LocalDateTime reviewDate;
/**
* 审核意见
*/
private String reviewComment;
@TableLogic
private Integer deleted;
private String createBy;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
private String updateBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
package com.bcms.entity.bia;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 业务依赖关系实体
*/
@Data
@TableName("bcm_dependency")
public class BusinessDependency implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Long id;
/**
* 业务功能ID
*/
private Long businessFuncId;
/**
* 依赖类型(1内部业务 2外部系统 3IT系统 4供应商 5人员)
*/
private Integer dependencyType;
/**
* 依赖对象名称
*/
private String dependencyName;
/**
* 依赖对象编码
*/
private String dependencyCode;
/**
* 依赖程度(1Critical关键 2High高 3Medium中 4Low低)
*/
private Integer dependencyLevel;
/**
* 是否单点故障
*/
private Boolean isSinglePoint;
/**
* 描述
*/
private String description;
/**
* 备注
*/
private String remark;
@TableLogic
private Integer deleted;
private String createBy;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
private String updateBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
package com.bcms.entity.bia;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 业务功能实体
*/
@Data
@TableName("bcm_business_func")
public class BusinessFunc implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Long id;
/**
* 业务单元ID
*/
private Long businessUnitId;
/**
* 功能名称
*/
private String funcName;
/**
* 功能编码
*/
private String funcCode;
/**
* 功能描述
*/
private String description;
/**
* 业务类别(1核心业务 2重要业务 3一般业务)
*/
private Integer bizCategory;
/**
* 日交易量
*/
private Long dailyTransaction;
/**
* 日交易金额
*/
private BigDecimal dailyAmount;
/**
* 用户数量
*/
private Long userCount;
/**
* SLA要求(服务等级协议)
*/
private String slaRequirement;
/**
* 合规要求
*/
private String complianceReq;
/**
* 负责人
*/
private String leader;
/**
* 联系电话
*/
private String phone;
/**
* 状态(0禁用 1正常)
*/
private Integer status;
@TableLogic
private Integer deleted;
private String createBy;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
private String updateBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
package com.bcms.entity.bia;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
/**
* 业务单元实体
*/
@Data
@TableName("bcm_business_unit")
public class BusinessUnit implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Long id;
/**
* 业务单元名称
*/
private String unitName;
/**
* 业务单元编码
*/
private String unitCode;
/**
* 父级ID
*/
private Long parentId;
/**
* 负责人
*/
private String leader;
/**
* 联系电话
*/
private String phone;
/**
* 描述
*/
private String description;
/**
* 状态(0禁用 1正常)
*/
private Integer status;
/**
* 排序
*/
private Integer sort;
@TableLogic
private Integer deleted;
private String createBy;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
private String updateBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 子业务单元列表(非数据库字段)
*/
@TableField(exist = false)
private List<BusinessUnit> children;
}
package com.bcms.entity.drill;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 演练发现问题实体
*/
@Data
@TableName("bcm_drill_issue")
public class DrillIssue implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Long id;
/** 演练记录ID */
private Long drillRecordId;
/** 问题描述 */
private String description;
/** 问题类型 */
private String issueType;
/** 严重程度(1严重 2较高 3一般 4轻微) */
private Integer severity;
/** 所属领域 */
private String domain;
/** 整改责任人 */
private String responsiblePerson;
/** 整改期限 */
private LocalDateTime dueDate;
/** 整改措施 */
private String correctiveAction;
/** 整改状态(0待整改 1整改中 2已整改 3验收通过) */
private Integer fixStatus;
/** 验证人 */
private String verifier;
/** 验证日期 */
private LocalDateTime verificationDate;
/** 验证意见 */
private String verificationComment;
@TableLogic
private Integer deleted;
private String createBy;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
private String updateBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
package com.bcms.entity.drill;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 演练计划实体
*/
@Data
@TableName("bcm_drill_plan")
public class DrillPlan implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Long id;
/** 演练名称 */
private String drillName;
/** 演练编码 */
private String drillCode;
/** 演练类型(1功能演练 2桌面演练 3全面演练 4专项演练) */
private Integer drillType;
/** 关联BCP/DRP ID */
private Long planId;
/** 计划类型(1BCP 2DRP) */
private Integer planType;
/** 演练目的 */
private String purpose;
/** 演练范围 */
private String scope;
/** 参与部门 */
private String Departments;
/** 演练日期 */
private LocalDateTime drillDate;
/** 预计时长(分钟) */
private Integer estimatedDuration;
/** 负责人 */
private String leader;
/** 联系电话 */
private String phone;
/** 演练脚本 */
private String script;
/** 评估标准 */
private String evaluationCriteria;
/** 预算 */
private Double budget;
/** 状态(0待执行 1进行中 2已完成 3已取消) */
private Integer status;
@TableLogic
private Integer deleted;
private String createBy;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
private String updateBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
package com.bcms.entity.drill;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 演练记录实体
*/
@Data
@TableName("bcm_drill_record")
public class DrillRecord implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Long id;
/** 演练计划ID */
private Long drillPlanId;
/** 实际开始时间 */
private LocalDateTime actualStartTime;
/** 实际结束时间 */
private LocalDateTime actualEndTime;
/** 实际时长 */
private Integer actualDuration;
/** 参与人数 */
private Integer participantCount;
/** 演练状态 */
private Integer status;
/** 整体评估(1优秀 2良好 3合格 4不合格) */
private Integer overallRating;
/** 演练结果描述 */
private String resultDescription;
/** 达到目标情况 */
private String goalAchievement;
/** 发现问题数 */
private Integer issueCount;
/** 改进建议 */
private String suggestions;
/** 演练主持人 */
private String moderator;
/** 演练记录人 */
private String recorder;
/** 附件 */
private String attachment;
@TableLogic
private Integer deleted;
private String createBy;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
private String updateBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
package com.bcms.entity.incident;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 事件实体
*/
@Data
@TableName("bcm_incident")
public class Incident implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Long id;
/** 事件编号 */
private String incidentNo;
/** 事件名称 */
private String incidentName;
/** 事件类型(1系统故障 2数据泄露 3自然灾害 4网络安全 5业务中断 6其他) */
private Integer incidentType;
/** 事件级别(1特别重大 2重大 3较大 4一般) */
private Integer incidentLevel;
/** 影响业务 */
private String affectedBusiness;
/** 影响范围 */
private String affectedScope;
/** 影响时长(分钟) */
private Integer affectedDuration;
/** 预估损失 */
private BigDecimal estimatedLoss;
/** 发生时间 */
private LocalDateTime occurrenceTime;
/** 发现时间 */
private LocalDateTime discoveryTime;
/** 报告人 */
private String reporter;
/** 事件状态(0新建 1处理中 2已控制 3已解决 4已关闭) */
private Integer status;
/** 根本原因 */
private String rootCause;
/** 处置措施 */
private String handlingMeasures;
/** 处置结果 */
private String handlingResult;
/** 关闭时间 */
private LocalDateTime closeTime;
/** 关闭人 */
private String closer;
/** 经验教训 */
private String lessonsLearned;
/** 附件 */
private String attachment;
@TableLogic
private Integer deleted;
private String createBy;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
private String updateBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
package com.bcms.entity.plan;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* BCP业务连续性计划实体
*/
@Data
@TableName("bcm_bcp")
public class Bcp implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Long id;
/** 计划名称 */
private String planName;
/** 计划编码 */
private String planCode;
/** 关联业务功能ID */
private Long businessFuncId;
/** 计划版本 */
private String version;
/** 计划状态(0草稿 1待审核 2已发布 3已废弃) */
private Integer status;
/** 适用范围 */
private String scope;
/** 触发条件 */
private String triggerCondition;
/** 恢复策略 */
private String recoveryStrategy;
/** 关键步骤 */
private String keySteps;
/** 责任人 */
private String responsiblePerson;
/** 联系电话 */
private String phone;
/** 演练要求 */
private String drillRequirement;
/** 发布日期 */
private LocalDateTime publishDate;
/** 下次评审日期 */
private LocalDateTime nextReviewDate;
/** 评审周期(月) */
private Integer reviewCycle;
/** 附件 */
private String attachment;
@TableLogic
private Integer deleted;
private String createBy;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
private String updateBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
package com.bcms.entity.plan;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* DRP灾难恢复计划实体
*/
@Data
@TableName("bcm_drp")
public class Drp implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Long id;
/** 计划名称 */
private String planName;
/** 计划编码 */
private String planCode;
/** 关联BCP ID */
private Long bcpId;
/** 系统名称 */
private String systemName;
/** 系统等级(1关键 2重要 3一般) */
private Integer systemLevel;
/** 恢复级别 */
private String recoveryLevel;
/** 计划版本 */
private String version;
/** 计划状态 */
private Integer status;
/** RTO目标(分钟) */
private Integer rtoTarget;
/** RPO目标(分钟) */
private Integer rpoTarget;
/** 灾备站点 */
private String backupSite;
/** 恢复步骤 */
private String recoverySteps;
/** 数据恢复方案 */
private String dataRecoveryPlan;
/** 网络切换方案 */
private String networkSwitchPlan;
/** 验证方案 */
private String verificationPlan;
/** 责任人 */
private String responsiblePerson;
/** 发布日期 */
private LocalDateTime publishDate;
@TableLogic
private Integer deleted;
private String createBy;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
private String updateBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
package com.bcms.entity.risk;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 风险实体
*/
@Data
@TableName("bcm_risk")
public class Risk implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Long id;
/** 风险名称 */
private String riskName;
/** 风险编码 */
private String riskCode;
/** 风险类型(1操作风险 2技术风险 3自然灾害 4供应链风险 5人员风险 6外部风险) */
private Integer riskType;
/** 关联业务功能ID */
private Long businessFuncId;
/** 风险描述 */
private String description;
/** 威胁来源 */
private String threatSource;
/** 威胁可能性(1-5) */
private Integer likelihood;
/** 影响程度(1-5) */
private Integer impact;
/** 风险值 */
private BigDecimal riskValue;
/** 风险等级(1高 2中 3低) */
private Integer riskLevel;
/** 现有控制措施 */
private String existingControls;
/** 残余风险 */
private BigDecimal residualRisk;
/** 风险应对策略 */
private String responseStrategy;
/** 风险处理计划 */
private String treatmentPlan;
/** 责任人 */
private String responsiblePerson;
/** 监督人 */
private String supervisor;
/** 下次评审日期 */
private LocalDateTime nextReviewDate;
/** 状态(0识别 1评估中 2处理中 3已接受 4已消除) */
private Integer status;
@TableLogic
private Integer deleted;
private String createBy;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
private String updateBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
package com.bcms.entity.sys;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 部门实体类
*/
@Data
@TableName("sys_dept")
public class Dept implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 部门ID
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 父部门ID
*/
private Long parentId;
/**
* 部门名称
*/
private String deptName;
/**
* 部门编码
*/
private String deptCode;
/**
* 负责人
*/
private String leader;
/**
* 联系电话
*/
private String phone;
/**
* 邮箱
*/
private String email;
/**
* 排序
*/
private Integer sort;
/**
* 状态(0禁用 1正常)
*/
private Integer status;
/**
* 是否删除(0未删除 1已删除)
*/
@TableLogic
private Integer deleted;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
package com.bcms.entity.sys;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 操作日志实体类
*/
@Data
@TableName("sys_log")
public class Log implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 日志ID
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 用户名
*/
private String username;
/**
* 操作类型(登录、登出、操作)
*/
private String operationType;
/**
* 请求方法
*/
private String method;
/**
* 请求路径
*/
private String url;
/**
* 请求参数
*/
private String params;
/**
* 返回结果
*/
private String result;
/**
* 状态(0失败 1成功)
*/
private Integer status;
/**
* 错误信息
*/
private String errorMsg;
/**
* IP地址
*/
private String ip;
/**
* 用户代理
*/
private String userAgent;
/**
* 操作时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime operationTime;
}
package com.bcms.entity.sys;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Data
@TableName("sys_menu")
public class Menu {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private Long parentId;
private String menuName;
private String menuType; // M: 目录, C: 菜单, F: 按钮
private String path;
private String component;
private String perms;
private String icon;
private Integer sort;
private Integer status; // 0: 禁用, 1: 正常
@TableField(fill = FieldFill.INSERT)
private String createBy;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableLogic
private Integer deleted;
@TableField(exist = false)
private List<Menu> children;
}
package com.bcms.entity.sys;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 权限实体类
*/
@Data
@TableName("sys_permission")
public class Permission implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 权限ID
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 权限名称
*/
private String permissionName;
/**
* 权限编码
*/
private String permissionCode;
/**
* 权限类型(1菜单 2按钮 3接口)
*/
private Integer permissionType;
/**
* 父权限ID
*/
private Long parentId;
/**
* 路径
*/
private String path;
/**
* 组件路径
*/
private String component;
/**
* 图标
*/
private String icon;
/**
* 排序
*/
private Integer sort;
/**
* 状态(0禁用 1正常)
*/
private Integer status;
/**
* 是否删除(0未删除 1已删除)
*/
@TableLogic
private Integer deleted;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
package com.bcms.entity.sys;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 角色实体类
*/
@Data
@TableName("sys_role")
public class Role implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 角色ID
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 角色名称
*/
private String roleName;
/**
* 角色编码
*/
private String roleCode;
/**
* 角色描述
*/
private String description;
/**
* 状态(0禁用 1正常)
*/
private Integer status;
/**
* 是否删除(0未删除 1已删除)
*/
@TableLogic
private Integer deleted;
/**
* 创建者
*/
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新者
*/
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
package com.bcms.entity.sys;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 用户实体类
*/
@Data
@TableName("sys_user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 真实姓名
*/
private String realName;
/**
* 邮箱
*/
private String email;
/**
* 手机号
*/
private String phone;
/**
* 头像
*/
private String avatar;
/**
* 部门ID
*/
private Long deptId;
/**
* 状态(0禁用 1正常)
*/
private Integer status;
/**
* 是否删除(0未删除 1已删除)
*/
@TableLogic
private Integer deleted;
/**
* 创建者
*/
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新者
*/
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 备注
*/
private String remark;
}
package com.bcms.mapper.bia;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.entity.bia.BiaAnalysis;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* BIA分析Mapper
*/
@Mapper
public interface BiaAnalysisMapper extends BaseMapper<BiaAnalysis> {
IPage<BiaAnalysis> selectAnalysisPage(Page<BiaAnalysis> page, @Param("funcId") Long funcId,
@Param("priority") Integer priority, @Param("reviewStatus") Integer reviewStatus);
List<BiaAnalysis> selectByFuncId(@Param("funcId") Long funcId);
BiaAnalysis selectLatestByFuncId(@Param("funcId") Long funcId);
}
package com.bcms.mapper.bia;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bcms.entity.bia.BusinessDependency;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 业务依赖关系Mapper
*/
@Mapper
public interface BusinessDependencyMapper extends BaseMapper<BusinessDependency> {
List<BusinessDependency> selectByFuncId(@Param("funcId") Long funcId);
}
package com.bcms.mapper.bia;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.entity.bia.BusinessFunc;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 业务功能Mapper
*/
@Mapper
public interface BusinessFuncMapper extends BaseMapper<BusinessFunc> {
IPage<BusinessFunc> selectFuncPage(Page<BusinessFunc> page, @Param("unitId") Long unitId,
@Param("funcName") String funcName, @Param("bizCategory") Integer bizCategory);
List<BusinessFunc> selectByUnitId(@Param("unitId") Long unitId);
}
package com.bcms.mapper.bia;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.entity.bia.BusinessUnit;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 业务单元Mapper
*/
@Mapper
public interface BusinessUnitMapper extends BaseMapper<BusinessUnit> {
IPage<BusinessUnit> selectUnitPage(Page<BusinessUnit> page, @Param("unitName") String unitName, @Param("status") Integer status);
List<BusinessUnit> selectAll();
List<BusinessUnit> selectChildren(@Param("parentId") Long parentId);
}
package com.bcms.mapper.drill;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.entity.drill.DrillIssue;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface DrillIssueMapper extends BaseMapper<DrillIssue> {
IPage<DrillIssue> selectDrillIssuePage(Page<DrillIssue> page, @Param("fixStatus") Integer fixStatus,
@Param("severity") Integer severity);
}
package com.bcms.mapper.drill;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.entity.drill.DrillPlan;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface DrillPlanMapper extends BaseMapper<DrillPlan> {
IPage<DrillPlan> selectDrillPlanPage(Page<DrillPlan> page, @Param("drillName") String drillName,
@Param("drillType") Integer drillType, @Param("status") Integer status);
}
package com.bcms.mapper.drill;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.entity.drill.DrillRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface DrillRecordMapper extends BaseMapper<DrillRecord> {
IPage<DrillRecord> selectDrillRecordPage(Page<DrillRecord> page);
}
package com.bcms.mapper.incident;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.entity.incident.Incident;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface IncidentMapper extends BaseMapper<Incident> {
IPage<Incident> selectIncidentPage(Page<Incident> page, @Param("incidentName") String incidentName,
@Param("incidentType") Integer incidentType,
@Param("incidentLevel") Integer incidentLevel,
@Param("status") Integer status);
}
package com.bcms.mapper.plan;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.entity.plan.Bcp;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface BcpMapper extends BaseMapper<Bcp> {
IPage<Bcp> selectBcpPage(Page<Bcp> page, @Param("planName") String planName, @Param("status") Integer status);
}
package com.bcms.mapper.plan;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.entity.plan.Drp;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface DrpMapper extends BaseMapper<Drp> {
IPage<Drp> selectDrpPage(Page<Drp> page, @Param("planName") String planName, @Param("status") Integer status);
}
package com.bcms.mapper.risk;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.entity.risk.Risk;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface RiskMapper extends BaseMapper<Risk> {
IPage<Risk> selectRiskPage(Page<Risk> page, @Param("riskName") String riskName,
@Param("riskType") Integer riskType, @Param("riskLevel") Integer riskLevel,
@Param("status") Integer status);
}
package com.bcms.mapper.sys;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.entity.sys.Dept;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 部门Mapper接口
*/
@Mapper
public interface DeptMapper extends BaseMapper<Dept> {
/**
* 分页查询部门
*/
IPage<Dept> selectDeptPage(Page<Dept> page, @Param("deptName") String deptName,
@Param("status") Integer status);
/**
* 查询所有部门(树形结构)
*/
@Select("SELECT * FROM sys_dept WHERE deleted = 0 ORDER BY sort ASC")
List<Dept> selectAllDepts();
/**
* 根据父ID查询子部门
*/
@Select("SELECT * FROM sys_dept WHERE parent_id = #{parentId} AND deleted = 0 ORDER BY sort ASC")
List<Dept> selectChildrenByParentId(@Param("parentId") Long parentId);
}
package com.bcms.mapper.sys;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.entity.sys.Log;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 日志Mapper接口
*/
@Mapper
public interface LogMapper extends BaseMapper<Log> {
/**
* 分页查询日志
*/
IPage<Log> selectLogPage(Page<Log> page, @Param("username") String username,
@Param("operationType") String operationType,
@Param("startTime") String startTime,
@Param("endTime") String endTime);
}
package com.bcms.mapper.sys;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bcms.entity.sys.Menu;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface MenuMapper extends BaseMapper<Menu> {
List<Menu> selectMenuTree();
List<Menu> selectByParentId(@Param("parentId") Long parentId);
List<Long> selectIdsByRoleId(@Param("roleId") Long roleId);
void deleteByRoleId(@Param("roleId") Long roleId);
void insertBatchRoleMenu(@Param("roleId") Long roleId, @Param("menuIds") List<Long> menuIds);
}
package com.bcms.mapper.sys;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bcms.entity.sys.Permission;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 权限Mapper接口
*/
@Mapper
public interface PermissionMapper extends BaseMapper<Permission> {
/**
* 查询所有菜单权限
*/
@Select("SELECT * FROM sys_permission WHERE permission_type IN (1, 2) AND deleted = 0 ORDER BY sort ASC")
List<Permission> selectAllMenus();
/**
* 查询角色已分配的权限ID列表
*/
List<Long> selectByRoleId(@Param("roleId") Long roleId);
/**
* 根据角色ID删除权限关系
*/
void deleteByRoleId(@Param("roleId") Long roleId);
/**
* 批量插入角色权限关系
*/
void insertBatch(@Param("roleId") Long roleId, @Param("permissionIds") List<Long> permissionIds);
/**
* 查询用户的菜单树
*/
@Select("SELECT DISTINCT p.* FROM sys_permission p " +
"INNER JOIN sys_role_permission rp ON p.id = rp.permission_id " +
"INNER JOIN sys_user_role ur ON rp.role_id = ur.role_id " +
"WHERE ur.user_id = #{userId} AND p.permission_type = 1 AND p.deleted = 0 " +
"ORDER BY p.sort ASC")
List<Permission> selectMenuTreeByUserId(@Param("userId") Long userId);
/**
* 根据父ID查询子权限
*/
@Select("SELECT * FROM sys_permission WHERE parent_id = #{parentId} AND deleted = 0 ORDER BY sort ASC")
List<Permission> selectChildrenByParentId(@Param("parentId") Long parentId);
}
package com.bcms.mapper.sys;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.entity.sys.Role;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 角色Mapper接口
*/
@Mapper
public interface RoleMapper extends BaseMapper<Role> {
/**
* 分页查询角色
*/
IPage<Role> selectRolePage(Page<Role> page, @Param("roleName") String roleName,
@Param("status") Integer status);
/**
* 查询所有角色
*/
@Select("SELECT * FROM sys_role WHERE status = 1 AND deleted = 0 ORDER BY sort ASC")
List<Role> selectAllActiveRoles();
/**
* 查询用户已分配的角色ID列表
*/
@Select("SELECT role_id FROM sys_user_role WHERE user_id = #{userId}")
List<Long> selectRoleIdsByUserId(@Param("userId") Long userId);
}
package com.bcms.mapper.sys;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.entity.sys.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 用户Mapper接口
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {
/**
* 根据用户名查询用户
*/
@Select("SELECT * FROM sys_user WHERE username = #{username} AND deleted = 0")
User selectByUsername(@Param("username") String username);
/**
* 分页查询用户
*/
IPage<User> selectUserPage(Page<User> page, @Param("username") String username,
@Param("status") Integer status, @Param("deptId") Long deptId);
/**
* 查询用户角色列表
*/
@Select("SELECT r.* FROM sys_role r " +
"INNER JOIN sys_user_role ur ON r.id = ur.role_id " +
"WHERE ur.user_id = #{userId} AND r.deleted = 0")
List<String> selectUserRoles(@Param("userId") Long userId);
/**
* 查询用户权限列表
*/
@Select("SELECT DISTINCT p.permission_code FROM sys_permission p " +
"INNER JOIN sys_role_permission rp ON p.id = rp.permission_id " +
"INNER JOIN sys_user_role ur ON rp.role_id = ur.role_id " +
"WHERE ur.user_id = #{userId} AND p.deleted = 0 AND p.status = 1")
List<String> selectUserPermissions(@Param("userId") Long userId);
/**
* 删除用户角色关联
*/
void deleteUserRoles(@Param("userId") Long userId);
/**
* 批量插入用户角色关联
*/
void insertUserRoles(@Param("userId") Long userId, @Param("roleIds") List<Long> roleIds);
}
package com.bcms.service.bia;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.dto.BiaDTO;
import com.bcms.entity.bia.*;
import java.util.List;
import java.util.Map;
/**
* BIA服务接口
*/
public interface BiaService {
// 业务单元管理
Page<BusinessUnit> getUnitPage(Long current, Long size, String unitName, Integer status);
void createUnit(BusinessUnit unit);
void updateUnit(BusinessUnit unit);
void deleteUnit(Long id);
List<BusinessUnit> getUnitTree();
// 业务功能管理
Page<BusinessFunc> getFuncPage(Long current, Long size, Long unitId, String funcName, Integer bizCategory);
void createFunc(BusinessFunc func);
void updateFunc(BusinessFunc func);
void deleteFunc(Long id);
// BIA分析管理
Page<BiaAnalysis> getAnalysisPage(Long current, Long size, Long funcId, Integer priority, Integer reviewStatus);
void createAnalysis(BiaDTO dto);
void updateAnalysis(BiaDTO dto);
void deleteAnalysis(Long id);
void submitForReview(Long id);
void approveAnalysis(Long id, String comment);
Map<String, Object> getAnalysisReport(Long analysisId);
// 依赖关系管理
List<BusinessDependency> getDependencies(Long funcId);
void createDependency(BusinessDependency dependency);
void updateDependency(BusinessDependency dependency);
void deleteDependency(Long id);
// 统计报表
Map<String, Object> getDashboardStats();
}
package com.bcms.service.drill;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.entity.drill.DrillIssue;
import com.bcms.entity.drill.DrillPlan;
import com.bcms.entity.drill.DrillRecord;
public interface DrillService {
// 演练计划
Page<DrillPlan> getPlanPage(Long current, Long size, String drillName, Integer drillType, Integer status);
DrillPlan getPlanById(Long id);
void createPlan(DrillPlan plan);
void updatePlan(DrillPlan plan);
void deletePlan(Long id);
void startDrill(Long id);
void completeDrill(Long id, DrillRecord record);
// 演练记录
Page<DrillRecord> getRecordPage(Long current, Long size);
// 演练问题
Page<DrillIssue> getIssuePage(Long current, Long size, Integer fixStatus, Integer severity);
void fixIssue(Long id, DrillIssue issue);
}
package com.bcms.service.impl.bia;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bcms.dto.BiaDTO;
import com.bcms.entity.bia.*;
import com.bcms.mapper.bia.*;
import com.bcms.service.bia.BiaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class BiaServiceImpl implements BiaService {
@Autowired
private BusinessUnitMapper unitMapper;
@Autowired
private BusinessFuncMapper funcMapper;
@Autowired
private BiaAnalysisMapper analysisMapper;
@Autowired
private BusinessDependencyMapper dependencyMapper;
// ==================== 业务单元管理 ====================
@Override
public Page<BusinessUnit> getUnitPage(Long current, Long size, String unitName, Integer status) {
Page<BusinessUnit> page = new Page<>(current, size);
LambdaQueryWrapper<BusinessUnit> wrapper = new LambdaQueryWrapper<>();
if (unitName != null && !unitName.isEmpty()) {
wrapper.like(BusinessUnit::getUnitName, unitName);
}
if (status != null) {
wrapper.eq(BusinessUnit::getStatus, status);
}
wrapper.orderByAsc(BusinessUnit::getSort);
return unitMapper.selectPage(page, wrapper);
}
@Override
@Transactional
public void createUnit(BusinessUnit unit) {
unit.setCreateTime(LocalDateTime.now());
unit.setUpdateTime(LocalDateTime.now());
unitMapper.insert(unit);
}
@Override
@Transactional
public void updateUnit(BusinessUnit unit) {
unit.setUpdateTime(LocalDateTime.now());
unitMapper.updateById(unit);
}
@Override
@Transactional
public void deleteUnit(Long id) {
unitMapper.deleteById(id);
}
@Override
public List<BusinessUnit> getUnitTree() {
List<BusinessUnit> allUnits = unitMapper.selectList(null);
return buildUnitTree(allUnits, 0L);
}
private List<BusinessUnit> buildUnitTree(List<BusinessUnit> all, Long parentId) {
return all.stream()
.filter(u -> Objects.equals(u.getParentId(), parentId))
.peek(u -> u.setChildren(buildUnitTree(all, u.getId())))
.collect(Collectors.toList());
}
// ==================== 业务功能管理 ====================
@Override
public Page<BusinessFunc> getFuncPage(Long current, Long size, Long unitId, String funcName, Integer bizCategory) {
Page<BusinessFunc> page = new Page<>(current, size);
LambdaQueryWrapper<BusinessFunc> wrapper = new LambdaQueryWrapper<>();
if (unitId != null) {
wrapper.eq(BusinessFunc::getBusinessUnitId, unitId);
}
if (funcName != null && !funcName.isEmpty()) {
wrapper.like(BusinessFunc::getFuncName, funcName);
}
if (bizCategory != null) {
wrapper.eq(BusinessFunc::getBizCategory, bizCategory);
}
wrapper.orderByAsc(BusinessFunc::getStatus);
return funcMapper.selectPage(page, wrapper);
}
@Override
@Transactional
public void createFunc(BusinessFunc func) {
func.setCreateTime(LocalDateTime.now());
func.setUpdateTime(LocalDateTime.now());
funcMapper.insert(func);
}
@Override
@Transactional
public void updateFunc(BusinessFunc func) {
func.setUpdateTime(LocalDateTime.now());
funcMapper.updateById(func);
}
@Override
@Transactional
public void deleteFunc(Long id) {
funcMapper.deleteById(id);
}
// ==================== BIA分析管理 ====================
@Override
public Page<BiaAnalysis> getAnalysisPage(Long current, Long size, Long funcId, Integer priority, Integer reviewStatus) {
Page<BiaAnalysis> page = new Page<>(current, size);
LambdaQueryWrapper<BiaAnalysis> wrapper = new LambdaQueryWrapper<>();
if (funcId != null) {
wrapper.eq(BiaAnalysis::getBusinessFuncId, funcId);
}
if (priority != null) {
wrapper.eq(BiaAnalysis::getPriority, priority);
}
if (reviewStatus != null) {
wrapper.eq(BiaAnalysis::getReviewStatus, reviewStatus);
}
wrapper.orderByDesc(BiaAnalysis::getCreateTime);
return analysisMapper.selectPage(page, wrapper);
}
@Override
@Transactional
public void createAnalysis(BiaDTO dto) {
BiaAnalysis analysis = new BiaAnalysis();
analysis.setId(dto.getId());
analysis.setBusinessFuncId(dto.getBusinessFuncId());
analysis.setVersion(dto.getVersion());
analysis.setPriority(dto.getPriority());
analysis.setMtpd(dto.getMtpd());
analysis.setRto(dto.getRto());
analysis.setRpo(dto.getRpo());
analysis.setFinancialImpact(dto.getFinancialImpact());
analysis.setCustomerImpact(dto.getCustomerImpact());
analysis.setRegulatoryImpact(dto.getRegulatoryImpact());
analysis.setReputationImpact(dto.getReputationImpact());
analysis.setConclusion(dto.getConclusion());
analysis.setRecommendations(dto.getRecommendations());
analysis.setAnalyst(dto.getAnalyst());
analysis.setAnalysisDate(dto.getAnalysisDate());
analysis.setCreateTime(LocalDateTime.now());
analysis.setUpdateTime(LocalDateTime.now());
analysisMapper.insert(analysis);
}
@Override
@Transactional
public void updateAnalysis(BiaDTO dto) {
BiaAnalysis analysis = new BiaAnalysis();
analysis.setId(dto.getId());
analysis.setBusinessFuncId(dto.getBusinessFuncId());
analysis.setVersion(dto.getVersion());
analysis.setPriority(dto.getPriority());
analysis.setMtpd(dto.getMtpd());
analysis.setRto(dto.getRto());
analysis.setRpo(dto.getRpo());
analysis.setFinancialImpact(dto.getFinancialImpact());
analysis.setCustomerImpact(dto.getCustomerImpact());
analysis.setRegulatoryImpact(dto.getRegulatoryImpact());
analysis.setReputationImpact(dto.getReputationImpact());
analysis.setConclusion(dto.getConclusion());
analysis.setRecommendations(dto.getRecommendations());
analysis.setAnalyst(dto.getAnalyst());
analysis.setAnalysisDate(dto.getAnalysisDate());
analysis.setUpdateTime(LocalDateTime.now());
analysisMapper.updateById(analysis);
}
@Override
@Transactional
public void deleteAnalysis(Long id) {
analysisMapper.deleteById(id);
}
@Override
@Transactional
public void submitForReview(Long id) {
BiaAnalysis analysis = analysisMapper.selectById(id);
if (analysis != null) {
analysis.setReviewStatus(1); // 审核中
analysis.setUpdateTime(LocalDateTime.now());
analysisMapper.updateById(analysis);
}
}
@Override
@Transactional
public void approveAnalysis(Long id, String comment) {
BiaAnalysis analysis = analysisMapper.selectById(id);
if (analysis != null) {
analysis.setReviewStatus(2); // 已审核
analysis.setReviewComment(comment);
analysis.setReviewDate(LocalDateTime.now());
analysis.setUpdateTime(LocalDateTime.now());
analysisMapper.updateById(analysis);
}
}
@Override
public Map<String, Object> getAnalysisReport(Long analysisId) {
BiaAnalysis analysis = analysisMapper.selectById(analysisId);
Map<String, Object> report = new HashMap<>();
report.put("analysis", analysis);
// 可以添加更多统计数据
return report;
}
// ==================== 依赖关系管理 ====================
@Override
public List<BusinessDependency> getDependencies(Long funcId) {
LambdaQueryWrapper<BusinessDependency> wrapper = new LambdaQueryWrapper<>();
if (funcId != null) {
wrapper.eq(BusinessDependency::getBusinessFuncId, funcId);
}
return dependencyMapper.selectList(wrapper);
}
@Override
@Transactional
public void createDependency(BusinessDependency dependency) {
dependency.setCreateTime(LocalDateTime.now());
dependency.setUpdateTime(LocalDateTime.now());
dependencyMapper.insert(dependency);
}
@Override
@Transactional
public void updateDependency(BusinessDependency dependency) {
dependency.setUpdateTime(LocalDateTime.now());
dependencyMapper.updateById(dependency);
}
@Override
@Transactional
public void deleteDependency(Long id) {
dependencyMapper.deleteById(id);
}
// ==================== 统计报表 ====================
@Override
public Map<String, Object> getDashboardStats() {
Map<String, Object> stats = new HashMap<>();
// 业务单元数量
stats.put("unitCount", unitMapper.selectCount(null));
// 业务功能数量
stats.put("funcCount", funcMapper.selectCount(null));
// BIA分析数量
stats.put("analysisCount", analysisMapper.selectCount(null));
// 依赖关系数量
stats.put("dependencyCount", dependencyMapper.selectCount(null));
return stats;
}
}
package com.bcms.service.impl.drill;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.entity.drill.DrillIssue;
import com.bcms.entity.drill.DrillPlan;
import com.bcms.entity.drill.DrillRecord;
import com.bcms.mapper.drill.DrillIssueMapper;
import com.bcms.mapper.drill.DrillPlanMapper;
import com.bcms.mapper.drill.DrillRecordMapper;
import com.bcms.service.drill.DrillService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
@Service
public class DrillServiceImpl implements DrillService {
private final DrillPlanMapper drillPlanMapper;
private final DrillRecordMapper drillRecordMapper;
private final DrillIssueMapper drillIssueMapper;
public DrillServiceImpl(DrillPlanMapper drillPlanMapper, DrillRecordMapper drillRecordMapper,
DrillIssueMapper drillIssueMapper) {
this.drillPlanMapper = drillPlanMapper;
this.drillRecordMapper = drillRecordMapper;
this.drillIssueMapper = drillIssueMapper;
}
// ==================== 演练计划 ====================
@Override
public Page<DrillPlan> getPlanPage(Long current, Long size, String drillName, Integer drillType, Integer status) {
Page<DrillPlan> page = new Page<>(current, size);
return (Page<DrillPlan>) drillPlanMapper.selectDrillPlanPage(page, drillName, drillType, status);
}
@Override
public DrillPlan getPlanById(Long id) {
return drillPlanMapper.selectById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void createPlan(DrillPlan plan) {
plan.setStatus(0);
drillPlanMapper.insert(plan);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updatePlan(DrillPlan plan) {
drillPlanMapper.updateById(plan);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deletePlan(Long id) {
drillPlanMapper.deleteById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void startDrill(Long id) {
DrillPlan plan = drillPlanMapper.selectById(id);
if (plan != null) {
plan.setStatus(1); // 进行中
drillPlanMapper.updateById(plan);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void completeDrill(Long id, DrillRecord record) {
DrillPlan plan = drillPlanMapper.selectById(id);
if (plan != null) {
plan.setStatus(2); // 已完成
drillPlanMapper.updateById(plan);
record.setDrillPlanId(id);
record.setActualStartTime(plan.getDrillDate());
record.setActualEndTime(LocalDateTime.now());
if (record.getActualStartTime() != null) {
long minutes = java.time.Duration.between(record.getActualStartTime(), record.getActualEndTime()).toMinutes();
record.setActualDuration((int) minutes);
}
drillRecordMapper.insert(record);
}
}
// ==================== 演练记录 ====================
@Override
public Page<DrillRecord> getRecordPage(Long current, Long size) {
Page<DrillRecord> page = new Page<>(current, size);
return (Page<DrillRecord>) drillRecordMapper.selectDrillRecordPage(page);
}
// ==================== 演练问题 ====================
@Override
public Page<DrillIssue> getIssuePage(Long current, Long size, Integer fixStatus, Integer severity) {
Page<DrillIssue> page = new Page<>(current, size);
return (Page<DrillIssue>) drillIssueMapper.selectDrillIssuePage(page, fixStatus, severity);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void fixIssue(Long id, DrillIssue issue) {
DrillIssue existingIssue = drillIssueMapper.selectById(id);
if (existingIssue != null) {
existingIssue.setFixStatus(issue.getFixStatus());
existingIssue.setCorrectiveAction(issue.getCorrectiveAction());
if (issue.getFixStatus() == 3) { // 验收通过
existingIssue.setVerifier(issue.getVerifier());
existingIssue.setVerificationDate(LocalDateTime.now());
existingIssue.setVerificationComment(issue.getVerificationComment());
}
drillIssueMapper.updateById(existingIssue);
}
}
}
package com.bcms.service.impl.incident;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bcms.entity.incident.Incident;
import com.bcms.mapper.incident.IncidentMapper;
import com.bcms.service.incident.IncidentService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
@Service
public class IncidentServiceImpl extends ServiceImpl<IncidentMapper, Incident> implements IncidentService {
@Override
public Page<Incident> getPage(Long current, Long size, String incidentName, Integer incidentType,
Integer incidentLevel, Integer status) {
Page<Incident> page = new Page<>(current, size);
baseMapper.selectIncidentPage(page, incidentName, incidentType, incidentLevel, status);
return page;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(Incident incident) {
if (incident.getIncidentNo() == null || incident.getIncidentNo().isEmpty()) {
incident.setIncidentNo(generateIncidentNo());
}
incident.setStatus(0);
save(incident);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(Incident incident) {
updateById(incident);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
removeById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateStatus(Long id, Integer status) {
Incident incident = getById(id);
if (incident != null) {
incident.setStatus(status);
updateById(incident);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void close(Long id, Incident incident) {
Incident existingIncident = getById(id);
if (existingIncident != null) {
existingIncident.setStatus(4); // 已关闭
existingIncident.setCloseTime(LocalDateTime.now());
existingIncident.setCloser(incident.getCloser());
existingIncident.setRootCause(incident.getRootCause());
existingIncident.setHandlingMeasures(incident.getHandlingMeasures());
existingIncident.setHandlingResult(incident.getHandlingResult());
existingIncident.setLessonsLearned(incident.getLessonsLearned());
updateById(existingIncident);
}
}
@Override
public Map<String, Object> getStats() {
Map<String, Object> stats = new HashMap<>();
long total = count(new LambdaQueryWrapper<Incident>().eq(Incident::getDeleted, 0));
long pending = count(new LambdaQueryWrapper<Incident>().in(Incident::getStatus, 0, 1).eq(Incident::getDeleted, 0));
long closed = count(new LambdaQueryWrapper<Incident>().eq(Incident::getStatus, 4).eq(Incident::getDeleted, 0));
long level1 = count(new LambdaQueryWrapper<Incident>().eq(Incident::getIncidentLevel, 1).eq(Incident::getDeleted, 0));
stats.put("total", total);
stats.put("pending", pending);
stats.put("closed", closed);
stats.put("level1Count", level1);
return stats;
}
@Override
public String generateIncidentNo() {
String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
long count = count(new LambdaQueryWrapper<Incident>()
.likeRight(Incident::getIncidentNo, "INC" + date)) + 1;
return "INC" + date + String.format("%04d", count);
}
}
package com.bcms.service.impl.plan;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bcms.entity.plan.Bcp;
import com.bcms.entity.plan.Drp;
import com.bcms.mapper.plan.BcpMapper;
import com.bcms.mapper.plan.DrpMapper;
import com.bcms.service.plan.PlanService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
@Service
public class PlanServiceImpl implements PlanService {
private final BcpMapper bcpMapper;
private final DrpMapper drpMapper;
public PlanServiceImpl(BcpMapper bcpMapper, DrpMapper drpMapper) {
this.bcpMapper = bcpMapper;
this.drpMapper = drpMapper;
}
// ==================== BCP管理 ====================
@Override
public Page<Bcp> getBcpPage(Long current, Long size, String planName, Integer status) {
Page<Bcp> page = new Page<>(current, size);
return (Page<Bcp>) bcpMapper.selectBcpPage(page, planName, status);
}
@Override
public Bcp getBcpById(Long id) {
return bcpMapper.selectById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void createBcp(Bcp bcp) {
bcp.setStatus(0); // 草稿状态
bcpMapper.insert(bcp);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateBcp(Bcp bcp) {
bcpMapper.updateById(bcp);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteBcp(Long id) {
bcpMapper.deleteById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void publishBcp(Long id) {
Bcp bcp = bcpMapper.selectById(id);
if (bcp != null) {
bcp.setStatus(2); // 已发布
bcp.setPublishDate(LocalDateTime.now());
bcpMapper.updateById(bcp);
}
}
// ==================== DRP管理 ====================
@Override
public Page<Drp> getDrpPage(Long current, Long size, String planName, Integer status) {
Page<Drp> page = new Page<>(current, size);
return (Page<Drp>) drpMapper.selectDrpPage(page, planName, status);
}
@Override
public Drp getDrpById(Long id) {
return drpMapper.selectById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void createDrp(Drp drp) {
drp.setStatus(0);
drpMapper.insert(drp);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateDrp(Drp drp) {
drpMapper.updateById(drp);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteDrp(Long id) {
drpMapper.deleteById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void publishDrp(Long id) {
Drp drp = drpMapper.selectById(id);
if (drp != null) {
drp.setStatus(2);
drp.setPublishDate(LocalDateTime.now());
drpMapper.updateById(drp);
}
}
}
package com.bcms.service.impl.risk;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bcms.entity.risk.Risk;
import com.bcms.mapper.risk.RiskMapper;
import com.bcms.service.risk.RiskService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
@Service
public class RiskServiceImpl extends ServiceImpl<RiskMapper, Risk> implements RiskService {
@Override
public Page<Risk> getPage(Long current, Long size, String riskName, Integer riskType, Integer riskLevel, Integer status) {
Page<Risk> page = new Page<>(current, size);
return (Page<Risk>) baseMapper.selectRiskPage(page, riskName, riskType, riskLevel, status);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(Risk risk) {
// 计算风险值
if (risk.getLikelihood() != null && risk.getImpact() != null) {
risk.setRiskValue(BigDecimal.valueOf(risk.getLikelihood() * risk.getImpact()));
// 计算风险等级
int value = risk.getLikelihood() * risk.getImpact();
if (value >= 15) {
risk.setRiskLevel(1); // 高风险
} else if (value >= 8) {
risk.setRiskLevel(2); // 中风险
} else {
risk.setRiskLevel(3); // 低风险
}
}
risk.setStatus(0); // 默认为识别状态
save(risk);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(Risk risk) {
// 重新计算风险值
if (risk.getLikelihood() != null && risk.getImpact() != null) {
risk.setRiskValue(BigDecimal.valueOf(risk.getLikelihood() * risk.getImpact()));
int value = risk.getLikelihood() * risk.getImpact();
if (value >= 15) {
risk.setRiskLevel(1);
} else if (value >= 8) {
risk.setRiskLevel(2);
} else {
risk.setRiskLevel(3);
}
}
updateById(risk);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
removeById(id);
}
@Override
public Map<String, Object> getStats() {
Map<String, Object> stats = new HashMap<>();
// 统计各风险等级数量
long highRisk = count(new LambdaQueryWrapper<Risk>().eq(Risk::getRiskLevel, 1).eq(Risk::getDeleted, 0));
long mediumRisk = count(new LambdaQueryWrapper<Risk>().eq(Risk::getRiskLevel, 2).eq(Risk::getDeleted, 0));
long lowRisk = count(new LambdaQueryWrapper<Risk>().eq(Risk::getRiskLevel, 3).eq(Risk::getDeleted, 0));
stats.put("highRisk", highRisk);
stats.put("mediumRisk", mediumRisk);
stats.put("lowRisk", lowRisk);
stats.put("total", highRisk + mediumRisk + lowRisk);
return stats;
}
}
package com.bcms.service.impl.sys;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bcms.entity.sys.Menu;
import com.bcms.mapper.sys.MenuMapper;
import com.bcms.service.sys.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements MenuService {
@Autowired
private MenuMapper menuMapper;
@Override
public List<Menu> getTree() {
List<Menu> allMenus = menuMapper.selectMenuTree();
return buildTree(allMenus, 0L);
}
@Override
public List<Menu> getList() {
return menuMapper.selectList(null);
}
@Override
public List<Menu> getByRoleId(Long roleId) {
List<Long> menuIds = menuMapper.selectIdsByRoleId(roleId);
if (menuIds == null || menuIds.isEmpty()) {
return List.of();
}
return menuMapper.selectBatchIds(menuIds);
}
@Override
@Transactional
public void create(Menu menu) {
menu.setCreateTime(LocalDateTime.now());
menu.setUpdateTime(LocalDateTime.now());
menuMapper.insert(menu);
}
@Override
@Transactional
public void update(Menu menu) {
menu.setUpdateTime(LocalDateTime.now());
menuMapper.updateById(menu);
}
@Override
@Transactional
public void delete(Long id) {
menuMapper.deleteById(id);
}
private List<Menu> buildTree(List<Menu> all, Long parentId) {
return all.stream()
.filter(m -> Objects.equals(m.getParentId(), parentId))
.peek(m -> m.setChildren(buildTree(all, m.getId())))
.collect(Collectors.toList());
}
}
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论