团队项目计划会议博客1.0

团队计划backlog:
Backlog:安全管理子系统

  1. 安全风险项点模块
    • 任务 1.1:支持手动录入安全风险项点
    o 描述:实现手动录入安全风险项点功能,支持录入字段包括编号、责任部门/工区、风险编码等。
    o 优先级:高
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
    • 任务 1.2:支持批量导入安全风险项点
    o 描述:实现批量导入功能,支持从文件中导入安全风险项点数据。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
    • 任务 1.3:自动判断风险库中相似内容
    o 描述:在录入过程中,自动判断风险库中是否有相似内容,并提示合并。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
    • 任务 1.4:支持数据筛选功能
    o 描述:支持通过责任部门/工区、录入日期等字段进行数据筛选。
    o 优先级:高
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
    • 任务 1.5:支持查询、编辑、删除、审核、导出功能
    o 描述:实现查询、添加、编辑、删除、审核、导出等基础功能。
    o 优先级:高
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
  2. 安全风险维护模块
    • 任务 2.1:支持风险项历史版本追溯与对比
    o 描述:实现历史版本的记录与对比功能,记录更新人、更新时间、原值/新值等信息。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
  3. 安全风险统计模块
    • 任务 3.1:从公司、部门、工区、班组四个层面展示风险数据
    o 描述:实现从不同层面展示风险总数、重大安全风险数等数据。
    o 优先级:高
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
    • 任务 3.2:按多维度展示相关数据
    o 描述:支持按“风险等级”、“管控进度”等维度展示数据。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
    • 任务 3.3:定期自动生成《安全风险分级管控态势分析报告》
    o 描述:实现定期生成报告功能,包含同比、环比分析。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
  4. 安全隐患项点模块
    • 任务 4.1:支持手动录入安全隐患项点
    o 描述:实现手动录入安全隐患项点功能,支持录入字段包括编号、责任部门/工区、隐患类别等。
    o 优先级:高
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
    • 任务 4.2:支持批量导入安全隐患项点
    o 描述:实现批量导入功能,支持从文件中导入安全隐患项点数据。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
    • 任务 4.3:自动判断隐患库中相似内容
    o 描述:在录入过程中,自动判断隐患库中是否有相似内容,并提示合并。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
    • 任务 4.4:支持数据筛选功能
    o 描述:支持通过责任部门/工区、录入日期等字段进行数据筛选。
    o 优先级:高
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
    • 任务 4.5:支持查询、编辑、删除、审核、销号、导出功能
    o 描述:实现查询、添加、编辑、删除、审核、销号、导出等基础功能。
    o 优先级:高
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
  5. 安全隐患维护模块
    • 任务 5.1:支持隐患项历史版本追溯与对比 -述 :实现历史版本的记录与对比功能,记录更新人、更新时间、原值/新值等信息。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
  6. 安全隐患统计模块
    • 任务 6.1:从公司、部门、工区、班组四个层面展示隐患数据
    o 描述:实现从不同层面展示隐患总数、一般安全隐患数等数据。
    o 优先级:高
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
    • 任务 6.2:按多维度展示相关数据
    o 描述:支持按“隐患类别”、“隐患等级”、“销号状态”等维度展示数据。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
    • 任务 6.3:定期自动生成《安全隐患排查治理态势分析报告》
    o 描述:实现定期生成报告功能,包含同比、环比分析。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
  7. 上级安全检查模块
    • 任务 7.1:支持手动录入检查信息
    o 描述:实现检查人手动录入检查日期、陪同人员、检查地点等内容。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
    • 任务 7.2:支持办理人录入整改信息
    o 描述:实现办理人手动录入完成日期、整改措施及整改照片等内容。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
  8. 公司安全检查模块
    • 任务 8.1:支持定期发送现场安全检查任务
    o 描述:实现定期发送检查任务功能。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
    • 任务 8.2:支持手动录入检查信息
    o 描述:实现检查人手动录入检查日期、陪同人员、检查地点等内容。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
    • 任务 8.3:支持办理人录入整改信息
    o 描述:实现办理人手动录入完成日期、整改措施及整改照片等内容。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
  9. 星级评估管理模块
    • 任务 9.1:支持员工查看星级评估结果
    o 描述:实现员工查看每季度星级评估考核结果功能。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
    • 任务 9.2:支持历史成绩对比
    o 描述:实现员工历史成绩对比功能,包含同比、环比分析。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
  10. 安全管理考核模块
    • 任务 10.1:支持创建、编辑员工考核信息
    o 描述:实现创建、编辑员工考核信息功能。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试
    • 任务 10.2:支持记录加、减分考核信息
    o 描述:实现记录员工加、减分考核信息功能。
    o 优先级:中
    o 开发阶段:需求分析 → 设计 → 开发 → 测试

以下是任务看板照片


会议照片:

package com.example.riskmanagement.controller;

import com.example.riskmanagement.entity.RiskManagement;
import com.example.riskmanagement.service.RiskManagementService;
import com.example.riskmanagement.vo.ResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/api/risk")
public class RiskManagementController {

@Autowired
private RiskManagementService riskService;

// 添加风险项
@PostMapping
public ResultVO<String> addRisk(@RequestBody RiskManagement risk) {
    String warning = riskService.addRiskWithCheck(risk);
    if (warning != null) {
        return ResultVO.success(warning);
    }
    return ResultVO.success("风险项添加成功");
}

// 多条件查询
@GetMapping
public ResultVO<List<RiskManagement>> queryRisks(
        @RequestParam(required = false) String department,
        @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
        @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate,
        @RequestParam(required = false) String system,
        @RequestParam(required = false) String category,
        @RequestParam(required = false) String level,
        @RequestParam(required = false) String harmDegree) {
    List<RiskManagement> risks = riskService.queryRisks(
            department, startDate, endDate, system, category, level, harmDegree);
    return ResultVO.success(risks);
}

// 获取风险统计
@GetMapping("/statistics/department")
public ResultVO<List<Map<String, Object>>> getDepartmentStatistics() {
    return ResultVO.success(riskService.getRiskStatisticsByDepartment());
}

// 获取风险趋势
@GetMapping("/statistics/trend")
public ResultVO<List<Map<String, Object>>> getRiskTrend() {
    return ResultVO.success(riskService.getRiskTrendAnalysis());
}

// 批量导入
@PostMapping("/import")
public ResultVO<Integer> importRisks(@RequestParam("file") MultipartFile file) {
    // 实际项目中需要解析Excel文件为RiskManagement列表
    // List<RiskManagement> risks = parseExcel(file);
    // int count = riskService.batchImport(risks);
    // return ResultVO.success(count);
    return ResultVO.success(0);
}

// 批量导出
@GetMapping("/export")
public void exportRisks(
        @RequestParam(required = false) String department,
        @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
        @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate,
        HttpServletResponse response) throws IOException {
    riskService.exportRisks(response, department, startDate, endDate);
}

// 审核风险项
@PutMapping("/{id}/audit")
public ResultVO<Boolean> auditRisk(
        @PathVariable String id,
        @RequestParam String status) {
    int result = riskService.auditRisk(id, status);
    return ResultVO.success(result > 0);
}

// 更新风险项
@PutMapping("/{id}")
public ResultVO<Boolean> updateRisk(
        @PathVariable String id,
        @RequestBody RiskManagement risk) {
    risk.setId(id);
    int result = riskService.updateRisk(risk);
    return ResultVO.success(result > 0);
}

// 删除风险项
@DeleteMapping("/{id}")
public ResultVO<Boolean> deleteRisk(@PathVariable String id) {
    int result = riskService.deleteRisk(id);
    return ResultVO.success(result > 0);
}

}

package com.example.riskmanagement.service.impl;

import com.example.riskmanagement.entity.RiskManagement;
import com.example.riskmanagement.mapper.RiskManagementMapper;
import com.example.riskmanagement.service.RiskManagementService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Service
public class RiskManagementServiceImpl implements RiskManagementService {

@Autowired
private RiskManagementMapper riskManagementMapper;

@Override
public String checkSimilarRisks(RiskManagement risk) {
    List<RiskManagement> similarRisks = riskManagementMapper.findSimilarRisks(
            risk.getRiskProject(), risk.getRiskPoint());

    if (!similarRisks.isEmpty()) {
        StringBuilder sb = new StringBuilder("本次录入内容与风险库中以下内容相似或接近,建议进行合并:");
        for (RiskManagement similar : similarRisks) {
            sb.append("\n编号 ").append(similar.getId())
                    .append(": ").append(similar.getRiskProject());
        }
        return sb.toString();
    }
    return null;
}

@Override
@Transactional
public String addRiskWithCheck(RiskManagement risk) {
    String warning = checkSimilarRisks(risk);
    risk.setEntryDate(new Date());
    risk.setAuditStatus("待审核");
    riskManagementMapper.insert(risk);
    return warning;
}

@Override
public List<RiskManagement> queryRisks(String department, Date startDate, Date endDate,
                                       String system, String category, String level,
                                       String harmDegree) {
    return riskManagementMapper.findByConditions(
            department, startDate, endDate, system, category, level, harmDegree);
}

@Override
public List<Map<String, Object>> getRisksNeedUpdate(int days, String riskLevel) {
    return riskManagementMapper.findRisksNeedUpdate(days, riskLevel);
}

@Override
@Transactional
public int batchImport(List<RiskManagement> risks) {
    int count = 0;
    for (RiskManagement risk : risks) {
        if (risk.getRiskProject() == null || risk.getRiskProject().isEmpty() ||
                risk.getRiskPoint() == null || risk.getRiskPoint().isEmpty()) {
            continue;
        }

        if (risk.getEntryDate() == null) {
            risk.setEntryDate(new Date());
        }
        if (risk.getAuditStatus() == null || risk.getAuditStatus().isEmpty()) {
            risk.setAuditStatus("待审核");
        }

        riskManagementMapper.insert(risk);
        count++;
    }
    return count;
}

@Override
public void exportRisks(HttpServletResponse response, String department,
                        Date startDate, Date endDate) throws IOException {
    List<RiskManagement> risks = riskManagementMapper.findByConditions(
            department, startDate, endDate, null, null, null, null);

    response.setContentType("application/vnd.ms-excel");
    response.setCharacterEncoding("utf-8");
    String fileName = URLEncoder.encode("风险数据导出", "UTF-8");
    response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".csv");

    try (PrintWriter writer = response.getWriter()) {
        writer.println("编号,责任部门,风险编码,专业系统,风险类别,风险项目,风险项点,风险等级,危害程度,管控措施,管控岗位,管控人员,量化要求,录入日期,审核状态,审核日期");

        for (RiskManagement risk : risks) {
            writer.println(String.join(",",
                    risk.getId(),
                    risk.getResponsibleDepartment(),
                    risk.getRiskCode(),
                    risk.getProfessionalSystem(),
                    risk.getRiskCategory(),
                    risk.getRiskProject(),
                    risk.getRiskPoint(),
                    risk.getRiskLevel(),
                    risk.getHarmDegree(),
                    risk.getControlMeasures(),
                    risk.getControlPosition(),
                    risk.getControlPerson(),
                    risk.getQuantitativeRequirements(),
                    new SimpleDateFormat("yyyy-MM-dd").format(risk.getEntryDate()),
                    risk.getAuditStatus(),
                    risk.getAuditDate() != null ? new SimpleDateFormat("yyyy-MM-dd").format(risk.getAuditDate()) : ""
            ));
        }
    }
}

@Override
public List<Map<String, Object>> getRiskStatisticsByDepartment() {
    return riskManagementMapper.countByDepartment();
}

@Override
public List<Map<String, Object>> getRiskTrendAnalysis() {
    return riskManagementMapper.trendAnalysis();
}

@Override
public RiskManagement getById(String id) {
    // 需要先在mapper中添加此方法
    return riskManagementMapper.selectById(id);
}

@Override
@Transactional
public int updateRisk(RiskManagement risk) {
    return riskManagementMapper.update(risk);
}

@Override
@Transactional
public int deleteRisk(String id) {
    return riskManagementMapper.delete(id);
}

@Override
@Transactional
public int auditRisk(String id, String status) {
    return riskManagementMapper.updateAuditStatus(id, status);
}

}

posted @ 2025-04-14 19:37  鱼一直摸  阅读(9)  评论(0)    收藏  举报