From b0be631d7800b2a35c4dfeb9332877946e361829 Mon Sep 17 00:00:00 2001
From: “djh” <“3298565835@qq.com”>
Date: Tue, 28 Apr 2026 17:18:56 +0800
Subject: [PATCH] 新增功能

---
 multi-system/src/main/java/com/gkhy/exam/system/service/FactorDiscernService.java                 |    3 
 multi-system/src/main/java/com/gkhy/exam/system/mapper/RiskMonitorMapper.java                     |    3 
 multi-system/src/main/java/com/gkhy/exam/system/domain/ExExamRecord.java                          |    4 
 multi-system/src/main/resources/mapper/system/TrainPlanMapper.xml                                 |    3 
 multi-system/src/main/java/com/gkhy/exam/system/service/RiskManageService.java                    |    3 
 multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/EnvironmentDemandRiskController.java |   13 ++
 multi-system/src/main/resources/mapper/system/RiskMonitorMapper.xml                               |    8 +
 multi-system/src/main/resources/mapper/system/CourseEffectivenMapper.xml                          |    3 
 multi-system/src/main/java/com/gkhy/exam/system/service/impl/RiskManageServiceImpl.java           |  137 ++++++++++++++++++++++
 multi-system/src/main/resources/mapper/system/ExExamRecordMapper.xml                              |    3 
 multi-system/src/main/java/com/gkhy/exam/system/service/impl/FactorDiscernServiceImpl.java        |  138 +++++++++++++++++++++++
 multi-system/src/main/java/com/gkhy/exam/system/domain/CourseEffectiven.java                      |    4 
 multi-system/src/main/java/com/gkhy/exam/system/domain/req/CopyReq.java                           |   16 ++
 13 files changed, 337 insertions(+), 1 deletions(-)

diff --git a/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/EnvironmentDemandRiskController.java b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/EnvironmentDemandRiskController.java
index 189f5c0..6fc2d1f 100644
--- a/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/EnvironmentDemandRiskController.java
+++ b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/EnvironmentDemandRiskController.java
@@ -2,6 +2,7 @@
 
 import com.gkhy.exam.common.api.CommonResult;
 import com.gkhy.exam.system.domain.*;
+import com.gkhy.exam.system.domain.req.CopyReq;
 import com.gkhy.exam.system.service.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -132,6 +133,12 @@
     @GetMapping("/factor/control/deleted")
     public CommonResult deletedFactorControl(@RequestParam("factorControlId") Integer factorControlId,@RequestParam("factorDiscrenId") Integer factorDiscrenId){
         return factorControlService.deletedFactorControl(factorControlId,factorDiscrenId);
+    }
+
+    @ApiOperation(value = "内外部环境要素识别复制")
+    @PostMapping("/factor/discern/copy")
+    public CommonResult copyFactorDiscern(@RequestBody CopyReq copyReq){
+        return factorDiscernService.copyFactorDiscern(copyReq);
     }
 
     /**
@@ -354,4 +361,10 @@
         return riskMonitorService.deletedRiskMonitor(riskMonitorId);
     }
 
+    @ApiOperation(value = "风险管理复制")
+    @PostMapping("/risk/manage/copy")
+    public CommonResult copyRiskMonitor(@RequestBody CopyReq copyReq){
+        return riskManageService.copyRiskMonitor(copyReq);
+    }
+
 }
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/domain/CourseEffectiven.java b/multi-system/src/main/java/com/gkhy/exam/system/domain/CourseEffectiven.java
index df1176e..8f186b2 100644
--- a/multi-system/src/main/java/com/gkhy/exam/system/domain/CourseEffectiven.java
+++ b/multi-system/src/main/java/com/gkhy/exam/system/domain/CourseEffectiven.java
@@ -57,6 +57,10 @@
     @JsonFormat(pattern = "yyyy-MM-dd")
     private LocalDate openTime;
 
+    @ApiModelProperty(value = "开课年份")
+    @TableField(exist = false)
+    private String openYear;
+
     @ApiModelProperty(value = "员工")
     @TableField("staffs")
     private String staffs;
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/domain/ExExamRecord.java b/multi-system/src/main/java/com/gkhy/exam/system/domain/ExExamRecord.java
index 7a90fa3..8a4979e 100644
--- a/multi-system/src/main/java/com/gkhy/exam/system/domain/ExExamRecord.java
+++ b/multi-system/src/main/java/com/gkhy/exam/system/domain/ExExamRecord.java
@@ -118,4 +118,8 @@
     @TableField(exist = false)
     private List<RecordFile> files;
 
+    @ApiModelProperty("计划年份")
+    @TableField(exist = false)
+    private String planYear;
+
 }
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/domain/req/CopyReq.java b/multi-system/src/main/java/com/gkhy/exam/system/domain/req/CopyReq.java
new file mode 100644
index 0000000..497bc32
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/domain/req/CopyReq.java
@@ -0,0 +1,16 @@
+package com.gkhy.exam.system.domain.req;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CopyReq {
+    @ApiModelProperty(value = "目标企业ID", required = true)
+    private Integer companyId;
+    @ApiModelProperty(value = "选择年份", required = true)
+    private String copyYear;
+    @ApiModelProperty(value = "目标年份", required = true)
+    private String targetYear;
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/mapper/RiskMonitorMapper.java b/multi-system/src/main/java/com/gkhy/exam/system/mapper/RiskMonitorMapper.java
index d9e0050..8f210e2 100644
--- a/multi-system/src/main/java/com/gkhy/exam/system/mapper/RiskMonitorMapper.java
+++ b/multi-system/src/main/java/com/gkhy/exam/system/mapper/RiskMonitorMapper.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.gkhy.exam.system.domain.RiskMonitor;
+import org.apache.ibatis.annotations.Param;
 import org.mapstruct.Mapper;
 
 import java.util.List;
@@ -11,4 +12,6 @@
     List<RiskMonitor> selectMonitorList(RiskMonitor riskMonitor);
 
     List<RiskMonitor> selectMonitor(RiskMonitor riskMonitor);
+
+    void deletedByManageIds(@Param("collect") List<Integer> collect);
 }
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/FactorDiscernService.java b/multi-system/src/main/java/com/gkhy/exam/system/service/FactorDiscernService.java
index 52d325b..0d3788a 100644
--- a/multi-system/src/main/java/com/gkhy/exam/system/service/FactorDiscernService.java
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/FactorDiscernService.java
@@ -4,6 +4,7 @@
 import com.gkhy.exam.common.api.CommonPage;
 import com.gkhy.exam.common.api.CommonResult;
 import com.gkhy.exam.system.domain.FactorDiscern;
+import com.gkhy.exam.system.domain.req.CopyReq;
 
 public interface FactorDiscernService extends IService<FactorDiscern> {
     CommonPage selectFactorDiscernList(FactorDiscern factorDiscern);
@@ -15,4 +16,6 @@
     CommonResult deletedFactorDiscern(Integer factorDiscrenId);
 
     CommonResult selectFactorDiscernListAll(FactorDiscern factorDiscern);
+
+    CommonResult copyFactorDiscern(CopyReq copyReq);
 }
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/RiskManageService.java b/multi-system/src/main/java/com/gkhy/exam/system/service/RiskManageService.java
index f601a97..0351c5d 100644
--- a/multi-system/src/main/java/com/gkhy/exam/system/service/RiskManageService.java
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/RiskManageService.java
@@ -4,6 +4,7 @@
 import com.gkhy.exam.common.api.CommonPage;
 import com.gkhy.exam.common.api.CommonResult;
 import com.gkhy.exam.system.domain.RiskManage;
+import com.gkhy.exam.system.domain.req.CopyReq;
 
 public interface RiskManageService extends IService<RiskManage> {
     CommonPage selectRiskManageList(RiskManage riskManage);
@@ -15,4 +16,6 @@
     CommonResult updateRiskManage(RiskManage riskManage);
 
     CommonResult deletedRiskManage(Integer riskManageId);
+
+    CommonResult copyRiskMonitor(CopyReq copyReq);
 }
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/FactorDiscernServiceImpl.java b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/FactorDiscernServiceImpl.java
index e1d739a..6fe5fee 100644
--- a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/FactorDiscernServiceImpl.java
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/FactorDiscernServiceImpl.java
@@ -1,5 +1,6 @@
 package com.gkhy.exam.system.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.gkhy.exam.common.api.CommonPage;
 import com.gkhy.exam.common.api.CommonResult;
@@ -7,8 +8,11 @@
 import com.gkhy.exam.common.utils.PageUtils;
 import com.gkhy.exam.common.utils.SecurityUtils;
 import com.gkhy.exam.system.domain.FactorContent;
+import com.gkhy.exam.system.domain.FactorControl;
 import com.gkhy.exam.system.domain.FactorDiscern;
+import com.gkhy.exam.system.domain.req.CopyReq;
 import com.gkhy.exam.system.mapper.FactorContentMapper;
+import com.gkhy.exam.system.mapper.FactorControlMapper;
 import com.gkhy.exam.system.mapper.FactorDiscernMapper;
 import com.gkhy.exam.system.service.FactorDiscernService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -16,7 +20,9 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 public class FactorDiscernServiceImpl extends ServiceImpl<FactorDiscernMapper, FactorDiscern> implements FactorDiscernService {
@@ -26,6 +32,9 @@
 
     @Autowired
     private FactorContentMapper factorContentMapper;
+
+    @Autowired
+    private FactorControlMapper factorControlMapper;
 
 
     @Override
@@ -56,6 +65,135 @@
 
     @Override
     @Transactional
+    public CommonResult copyFactorDiscern(CopyReq copyReq) {
+        // 参数校验
+        if (copyReq.getCompanyId() == null) {
+            throw new ApiException("企业ID不能为空");
+        }
+        if (copyReq.getCopyYear() == null || copyReq.getCopyYear().isEmpty()) {
+            throw new ApiException("选择年份不能为空");
+        }
+        if (copyReq.getTargetYear() == null || copyReq.getTargetYear().isEmpty()) {
+            throw new ApiException("目标年份不能为空");
+        }
+
+        // 查询源数据:根据企业ID和选择年份查询要素识别记录
+        FactorDiscern queryParam = new FactorDiscern();
+        queryParam.setCompanyId(Long.valueOf(copyReq.getCompanyId()));
+        queryParam.setYear(copyReq.getCopyYear());
+
+        List<FactorDiscern> sourceFactorDiscerns = factorDiscernMapper.selectFactorDiscernList(queryParam);
+
+        if (sourceFactorDiscerns == null || sourceFactorDiscerns.isEmpty()) {
+            throw new ApiException("未找到源年份[" + copyReq.getCopyYear() + "]的要素识别数据");
+        }
+
+        // 检查目标年份是否已存在数据
+        FactorDiscern targetCheck = new FactorDiscern();
+        targetCheck.setCompanyId(Long.valueOf(copyReq.getCompanyId()));
+        targetCheck.setYear(copyReq.getTargetYear());
+        List<FactorDiscern> existingTargetData = factorDiscernMapper.selectFactorDiscernList(targetCheck);
+
+        if (existingTargetData != null && !existingTargetData.isEmpty()) {
+            // 收集所有需要删除的ID
+            List<Integer> deleteIds = existingTargetData.stream()
+                    .map(FactorDiscern::getId)
+                    .collect(Collectors.toList());
+
+            // 批量逻辑删除这些ID对应的要素识别记录
+            FactorDiscern updateEntity = new FactorDiscern();
+            updateEntity.setDelFlag(2);
+            updateEntity.setUpdateTime(LocalDateTime.now());
+            updateEntity.setUpdateBy(SecurityUtils.getUsername());
+
+            UpdateWrapper<FactorDiscern> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.in("id", deleteIds);
+            factorDiscernMapper.update(updateEntity, updateWrapper);
+
+            // 同时删除这些要素识别下的所有内容记录
+//            UpdateWrapper<FactorContent> contentWrapper = new UpdateWrapper<>();
+//            contentWrapper.in("factor_discern_id", deleteIds);
+//            factorContentMapper.delete(contentWrapper);
+            //删除要素识别控制对应数据
+            FactorControl factorControl = new FactorControl();
+            factorControl.setDelFlag(2);
+            factorControl.setUpdateTime(LocalDateTime.now());
+            factorControl.setUpdateBy(SecurityUtils.getUsername());
+
+            factorControlMapper.update(factorControl, new UpdateWrapper<FactorControl>().in("factor_discern_id", deleteIds));
+
+        }
+
+        // 遍历源数据进行复制
+        for (FactorDiscern sourceDiscern : sourceFactorDiscerns) {
+            // 创建新的要素识别记录
+            FactorDiscern newFactorDiscern = new FactorDiscern();
+            newFactorDiscern.setCompanyId(sourceDiscern.getCompanyId());
+            newFactorDiscern.setDeptId(sourceDiscern.getDeptId());
+            newFactorDiscern.setYear(copyReq.getTargetYear());
+            newFactorDiscern.setFictionId(sourceDiscern.getFictionId());
+            newFactorDiscern.setCheckId(sourceDiscern.getCheckId());
+            newFactorDiscern.setRatifyId(sourceDiscern.getRatifyId());
+            newFactorDiscern.setFictionTime(sourceDiscern.getFictionTime());
+            newFactorDiscern.setDelFlag(1);
+            newFactorDiscern.setCreateBy(SecurityUtils.getUsername());
+            newFactorDiscern.setCreateTime(LocalDateTime.now());
+
+            // 插入新的要素识别记录
+            factorDiscernMapper.insert(newFactorDiscern);
+
+            // 查询源要素识别的内容
+            List<FactorContent> sourceContents = factorContentMapper.selectByFactorId(sourceDiscern.getId());
+            //添加要素识别控制
+            List<FactorControl> factorControls = factorControlMapper.selectFactorDiscernId(sourceDiscern.getId());
+            for (FactorControl factorControl : factorControls) {
+                FactorControl newControl = new FactorControl();
+                newControl.setCompanyId(factorControl.getCompanyId());
+                newControl.setFactorDiscernId(newFactorDiscern.getId());
+                newControl.setNumber(factorControl.getNumber());
+                newControl.setFrequency(factorControl.getFrequency());
+                newControl.setFictionId(factorControl.getFictionId());
+                newControl.setCheckId(factorControl.getCheckId());
+                newControl.setRatifyId(factorControl.getRatifyId());
+                newControl.setDelFlag(1);
+                newControl.setCreateBy(SecurityUtils.getUsername());
+                newControl.setCreateTime(LocalDateTime.now());
+                factorControlMapper.insert(newControl);
+            }
+
+            if (sourceContents != null && !sourceContents.isEmpty()) {
+                List<FactorContent> newContents = new ArrayList<>();
+
+                // 遍历内容进行复制
+                for (FactorContent sourceContent : sourceContents) {
+                    FactorContent newContent = new FactorContent();
+                    newContent.setFactorDiscernId(newFactorDiscern.getId());
+                    newContent.setFactorName(sourceContent.getFactorName());
+                    newContent.setFactorMess(sourceContent.getFactorMess());
+                    newContent.setInfluence(sourceContent.getInfluence());
+                    newContent.setMonitorMethod(sourceContent.getMonitorMethod());
+                    newContent.setReview(sourceContent.getReview());
+                    newContent.setSolutions(sourceContent.getSolutions());
+                    newContent.setResult(sourceContent.getResult());
+                    newContent.setRemark(sourceContent.getRemark());
+                    newContent.setType(sourceContent.getType());
+
+                    newContents.add(newContent);
+                }
+
+                // 批量插入内容记录
+                if (!newContents.isEmpty()) {
+                    factorContentMapper.insertBatch(newContents);
+                }
+            }
+        }
+
+        return CommonResult.success("成功从年份[" + copyReq.getCopyYear() + "]复制到年份[" + copyReq.getTargetYear() + "]");
+    }
+
+
+    @Override
+    @Transactional
     public CommonResult insertFactorDiscern(FactorDiscern factorDiscern) {
         List<FactorDiscern> factorDiscerns = factorDiscernMapper.selectByCompanyIdAndDeptId(factorDiscern);
         if (factorDiscerns.size()>0){
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/RiskManageServiceImpl.java b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/RiskManageServiceImpl.java
index 22092ba..32ce76e 100644
--- a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/RiskManageServiceImpl.java
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/RiskManageServiceImpl.java
@@ -1,5 +1,6 @@
 package com.gkhy.exam.system.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.gkhy.exam.common.api.CommonPage;
 import com.gkhy.exam.common.api.CommonResult;
@@ -9,8 +10,11 @@
 import com.gkhy.exam.system.domain.RiskContent;
 import com.gkhy.exam.system.domain.RiskContentMess;
 import com.gkhy.exam.system.domain.RiskManage;
+import com.gkhy.exam.system.domain.RiskMonitor;
+import com.gkhy.exam.system.domain.req.CopyReq;
 import com.gkhy.exam.system.mapper.RiskContentMapper;
 import com.gkhy.exam.system.mapper.RiskManageMapper;
+import com.gkhy.exam.system.mapper.RiskMonitorMapper;
 import com.gkhy.exam.system.service.RiskManageService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -19,6 +23,7 @@
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 public class RiskManageServiceImpl extends ServiceImpl<RiskManageMapper, RiskManage> implements RiskManageService {
@@ -28,6 +33,9 @@
 
     @Autowired
     private RiskContentMapper riskContentMapper;
+
+    @Autowired
+    private RiskMonitorMapper riskMonitorMapper;
 
 
     @Override
@@ -120,4 +128,133 @@
         riskManageMapper.updateById(riskManage);
         return CommonResult.success();
     }
+
+    @Override
+    @Transactional
+    public CommonResult copyRiskMonitor(CopyReq copyReq) {
+        // 参数校验
+        if (copyReq.getCompanyId() == null) {
+            throw new ApiException("企业ID不能为空");
+        }
+        if (copyReq.getCopyYear() == null || copyReq.getCopyYear().isEmpty()) {
+            throw new ApiException("选择年份不能为空");
+        }
+        if (copyReq.getTargetYear() == null || copyReq.getTargetYear().isEmpty()) {
+            throw new ApiException("目标年份不能为空");
+        }
+
+        // 查询源数据:根据企业ID和选择年份查询风险管理记录
+        RiskManage queryParam = new RiskManage();
+        queryParam.setCompanyId(Long.valueOf(copyReq.getCompanyId()));
+        queryParam.setYear(copyReq.getCopyYear());
+
+        List<RiskManage> sourceRiskManages = riskManageMapper.selectRiskManageList(queryParam);
+
+        if (sourceRiskManages == null || sourceRiskManages.isEmpty()) {
+            throw new ApiException("未找到源年份[" + copyReq.getCopyYear() + "]的风险管理数据");
+        }
+
+        // 检查目标年份是否已存在数据
+        RiskManage targetCheck = new RiskManage();
+        targetCheck.setCompanyId(Long.valueOf(copyReq.getCompanyId()));
+        targetCheck.setYear(copyReq.getTargetYear());
+        List<RiskManage> existingTargetData = riskManageMapper.selectRiskManageList(targetCheck);
+
+        if (existingTargetData != null && !existingTargetData.isEmpty()) {
+            RiskManage updateEntity = new RiskManage();
+            updateEntity.setDelFlag(2);
+            updateEntity.setUpdateTime(LocalDateTime.now());
+            updateEntity.setUpdateBy(SecurityUtils.getUsername());
+            UpdateWrapper<RiskManage> objectUpdateWrapper = new UpdateWrapper<>();
+            objectUpdateWrapper.eq("company_id", targetCheck.getCompanyId())
+                    .eq("year", targetCheck.getYear());
+            riskManageMapper.update(updateEntity, objectUpdateWrapper);
+
+            List<Integer> collect = existingTargetData.stream().map(RiskManage::getId).collect(Collectors.toList());
+            riskMonitorMapper.deletedByManageIds(collect);
+        }
+
+        // 遍历源数据进行复制
+        for (RiskManage sourceManage : sourceRiskManages) {
+            // 创建新的风险管理记录
+            RiskManage newRiskManage = new RiskManage();
+            newRiskManage.setCompanyId(sourceManage.getCompanyId());
+            newRiskManage.setDeptId(sourceManage.getDeptId());
+            newRiskManage.setYear(copyReq.getTargetYear());
+            newRiskManage.setDocument(sourceManage.getDocument());
+            newRiskManage.setFictionId(sourceManage.getFictionId());
+            newRiskManage.setCheckId(sourceManage.getCheckId());
+            newRiskManage.setRatifyId(sourceManage.getRatifyId());
+            newRiskManage.setDelFlag(1);
+            newRiskManage.setCreateBy(SecurityUtils.getUsername());
+            newRiskManage.setCreateTime(LocalDateTime.now());
+
+            // 插入新的风险管理记录
+            riskManageMapper.insert(newRiskManage);
+
+            // 查询源风险管理的内容
+            List<RiskContent> sourceContents = riskContentMapper.selectRiskContent(sourceManage.getId());
+            RiskMonitor riskMonitor = new RiskMonitor();
+            riskMonitor.setRiskManageId(sourceManage.getId());
+            List<RiskMonitor> riskMonitors = riskMonitorMapper.selectMonitor(riskMonitor);
+            for (RiskMonitor monitor : riskMonitors) {
+                RiskMonitor newMonitor = new RiskMonitor();
+                newMonitor.setRiskManageId(newRiskManage.getId());
+                newMonitor.setCompanyId(monitor.getCompanyId());
+                newMonitor.setFictionId(monitor.getFictionId());
+                newMonitor.setCheckId(monitor.getCheckId());
+                newMonitor.setRatifyId(monitor.getRatifyId());
+                newMonitor.setCheckTime(monitor.getCheckTime());
+                newMonitor.setCreateBy(SecurityUtils.getUsername());
+                newMonitor.setCreateTime(LocalDateTime.now());
+                riskMonitorMapper.insert(newMonitor);
+            }
+
+            if (sourceContents != null && !sourceContents.isEmpty()) {
+                List<RiskContentMess> allContentMesses = new ArrayList<>();
+
+                // 遍历风险内容进行复制
+                for (RiskContent sourceContent : sourceContents) {
+                    // 创建新的风险内容
+                    RiskContent newContent = new RiskContent();
+                    newContent.setRiskManageId(newRiskManage.getId());
+                    newContent.setProcess(sourceContent.getProcess());
+
+                    // 插入新的风险内容
+                    riskContentMapper.insert(newContent);
+
+                    // 查询源风险内容的详细信息
+                    List<RiskContentMess> sourceMesses = riskContentMapper.selectContentMess(sourceContent.getId());
+
+                    if (sourceMesses != null && !sourceMesses.isEmpty()) {
+                        // 复制详细信息并关联到新的风险内容
+                        for (RiskContentMess sourceMess : sourceMesses) {
+                            RiskContentMess newMess = new RiskContentMess();
+                            newMess.setRiskContentId(newContent.getId());
+                            newMess.setRiskEvent(sourceMess.getRiskEvent());
+                            newMess.setRiskConsequence(sourceMess.getRiskConsequence());
+                            newMess.setSeverity(sourceMess.getSeverity());
+                            newMess.setFrequency(sourceMess.getFrequency());
+                            newMess.setRpn(sourceMess.getRpn());
+                            newMess.setRiskLevel(sourceMess.getRiskLevel());
+                            newMess.setMeasures(sourceMess.getMeasures());
+                            newMess.setChargeUser(sourceMess.getChargeUser());
+                            newMess.setMonitorTime(sourceMess.getMonitorTime());
+                            newMess.setReview(sourceMess.getReview());
+
+                            allContentMesses.add(newMess);
+                        }
+                    }
+                }
+
+                // 批量插入风险详细内容
+                if (!allContentMesses.isEmpty()) {
+                    riskContentMapper.insertRiskContentMess(allContentMesses);
+                }
+            }
+        }
+
+        return CommonResult.success("成功从年份[" + copyReq.getCopyYear() + "]复制到年份[" + copyReq.getTargetYear() + "]");
+    }
+
 }
diff --git a/multi-system/src/main/resources/mapper/system/CourseEffectivenMapper.xml b/multi-system/src/main/resources/mapper/system/CourseEffectivenMapper.xml
index 436cb15..d0704b1 100644
--- a/multi-system/src/main/resources/mapper/system/CourseEffectivenMapper.xml
+++ b/multi-system/src/main/resources/mapper/system/CourseEffectivenMapper.xml
@@ -39,6 +39,9 @@
             <if test="companyId!=null">
                 and ce.company_id = #{companyId}
             </if>
+            <if test="openYear != null and openYear != ''">
+                AND YEAR(ce.open_time) = #{openYear}
+            </if>
         ORDER BY
             ce.create_time DESC
     </select>
diff --git a/multi-system/src/main/resources/mapper/system/ExExamRecordMapper.xml b/multi-system/src/main/resources/mapper/system/ExExamRecordMapper.xml
index d4f59f0..d99142e 100644
--- a/multi-system/src/main/resources/mapper/system/ExExamRecordMapper.xml
+++ b/multi-system/src/main/resources/mapper/system/ExExamRecordMapper.xml
@@ -58,6 +58,9 @@
             <if test="companyId!=null">
                 and a.company_id = #{companyId}
             </if>
+            <if test="planYear != null and planYear != ''">
+                AND YEAR(a.plan_date) = #{planYear}
+            </if>
         </where>
         order by a.id desc
     </select>
diff --git a/multi-system/src/main/resources/mapper/system/RiskMonitorMapper.xml b/multi-system/src/main/resources/mapper/system/RiskMonitorMapper.xml
index a699eb5..aaea174 100644
--- a/multi-system/src/main/resources/mapper/system/RiskMonitorMapper.xml
+++ b/multi-system/src/main/resources/mapper/system/RiskMonitorMapper.xml
@@ -1,6 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.gkhy.exam.system.mapper.RiskMonitorMapper">
+    <update id="deletedByManageIds">
+        UPDATE `risk_monitor` SET del_flag = 2 WHERE risk_manage_id IN
+        <foreach item="item" collection="collect" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </update>
 
     <select id="selectMonitorList" resultType="com.gkhy.exam.system.domain.RiskMonitor">
         SELECT
@@ -32,7 +38,7 @@
                 LEFT JOIN sys_user su2 ON rm.check_id = su2.id
                 LEFT JOIN sys_user su3 ON rm.ratify_id = su3.id
                 LEFT JOIN sys_dept sd ON rm2.dept_id = sd.dept_id
-        WHERE rm.del_flag = 1
+        WHERE rm.del_flag = 1 and rm2.del_flag = 1
         <if test="companyId!=null">
             and rm.company_id =#{companyId}
         </if>
diff --git a/multi-system/src/main/resources/mapper/system/TrainPlanMapper.xml b/multi-system/src/main/resources/mapper/system/TrainPlanMapper.xml
index 2d7f146..254b666 100644
--- a/multi-system/src/main/resources/mapper/system/TrainPlanMapper.xml
+++ b/multi-system/src/main/resources/mapper/system/TrainPlanMapper.xml
@@ -30,6 +30,9 @@
           <if test="companyId!=null">
               and tp.company_id = #{companyId}
           </if>
+        <if test="trainTime != null and trainTime != ''">
+            and YEAR(tp.train_time) = #{trainTime}
+        </if>
         ORDER BY tp.create_time ASC
     </select>
     <select id="selectByCompanyId" resultType="com.gkhy.exam.system.domain.TrainPlan">

--
Gitblit v1.9.2