9d9f582738123dbbfc6a7b91bb16ff4e4bf9f8f2..b0be631d7800b2a35c4dfeb9332877946e361829
2026-04-28 “djh”
新增功能
b0be63 diff | tree
2026-04-28 heheng
复制功能
313499 diff | tree
19 files modified
1 files added
599 ■■■■■ changed files
multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/EnvironmentDemandRiskController.java 25 ●●●●● patch | view | raw | blame | history
multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/QualityController.java 13 ●●●●● patch | view | raw | blame | history
multi-system/src/main/java/com/gkhy/exam/system/domain/CourseEffectiven.java 4 ●●●● patch | view | raw | blame | history
multi-system/src/main/java/com/gkhy/exam/system/domain/ExExamRecord.java 4 ●●●● patch | view | raw | blame | history
multi-system/src/main/java/com/gkhy/exam/system/domain/req/CopyReq.java 16 ●●●●● patch | view | raw | blame | history
multi-system/src/main/java/com/gkhy/exam/system/mapper/RiskMonitorMapper.java 3 ●●●●● patch | view | raw | blame | history
multi-system/src/main/java/com/gkhy/exam/system/service/ExpectDiscrenService.java 3 ●●●●● patch | view | raw | blame | history
multi-system/src/main/java/com/gkhy/exam/system/service/ExpectEvaluateService.java 3 ●●●●● patch | view | raw | blame | history
multi-system/src/main/java/com/gkhy/exam/system/service/FactorDiscernService.java 3 ●●●●● patch | view | raw | blame | history
multi-system/src/main/java/com/gkhy/exam/system/service/QualityService.java 2 ●●●●● patch | view | raw | blame | history
multi-system/src/main/java/com/gkhy/exam/system/service/RiskManageService.java 3 ●●●●● patch | view | raw | blame | history
multi-system/src/main/java/com/gkhy/exam/system/service/impl/ExpectDiscrenServiceImpl.java 92 ●●●●● patch | view | raw | blame | history
multi-system/src/main/java/com/gkhy/exam/system/service/impl/ExpectEvaluateServiceImpl.java 1 ●●●● patch | view | raw | blame | history
multi-system/src/main/java/com/gkhy/exam/system/service/impl/FactorDiscernServiceImpl.java 138 ●●●●● patch | view | raw | blame | history
multi-system/src/main/java/com/gkhy/exam/system/service/impl/QualityServiceImpl.java 135 ●●●●● patch | view | raw | blame | history
multi-system/src/main/java/com/gkhy/exam/system/service/impl/RiskManageServiceImpl.java 137 ●●●●● patch | view | raw | blame | history
multi-system/src/main/resources/mapper/system/CourseEffectivenMapper.xml 3 ●●●●● patch | view | raw | blame | history
multi-system/src/main/resources/mapper/system/ExExamRecordMapper.xml 3 ●●●●● patch | view | raw | blame | history
multi-system/src/main/resources/mapper/system/RiskMonitorMapper.xml 8 ●●●● patch | view | raw | blame | history
multi-system/src/main/resources/mapper/system/TrainPlanMapper.xml 3 ●●●●● patch | view | raw | blame | history
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;
@@ -134,6 +135,12 @@
        return factorControlService.deletedFactorControl(factorControlId,factorDiscrenId);
    }
    @ApiOperation(value = "内外部环境要素识别复制")
    @PostMapping("/factor/discern/copy")
    public CommonResult copyFactorDiscern(@RequestBody CopyReq copyReq){
        return factorDiscernService.copyFactorDiscern(copyReq);
    }
    /**
     * 相关方需求识别
     * @param expectDiscren
@@ -152,6 +159,18 @@
    @GetMapping("/expect/discren/listAll")
    public CommonResult selectExpectDiscrenListAll(ExpectDiscren expectDiscren){
        return expectDiscrenService.selectExpectDiscrenListAll(expectDiscren);
    }
    @ApiOperation(value = "相关方需求和期望识别~评价复制")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", name = "companyId", dataType = "long", required = false, value = "公司id"),
            @ApiImplicitParam(paramType = "query", name = "sourceYear", dataType = "String", required = true, value = "资源年份"),
            @ApiImplicitParam(paramType = "query", name = "sourceMonth", dataType = "targetYear", required = true, value = "目标年份"),
    })
    @GetMapping("/expect/discren/copyExpectDiscren")
    public CommonResult copyExpectDiscren(Long companyId,@RequestParam("sourceYear") String sourceYear, @RequestParam("targetYear")String targetYear){
        return expectDiscrenService.copyExpectDiscren(companyId,sourceYear,targetYear);
    }
@@ -342,4 +361,10 @@
        return riskMonitorService.deletedRiskMonitor(riskMonitorId);
    }
    @ApiOperation(value = "风险管理复制")
    @PostMapping("/risk/manage/copy")
    public CommonResult copyRiskMonitor(@RequestBody CopyReq copyReq){
        return riskManageService.copyRiskMonitor(copyReq);
    }
}
multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/QualityController.java
@@ -66,7 +66,16 @@
    public CommonResult listQualityAll(Quality quality){
        return CommonResult.success(qualityService.selectQualityListAll(quality));
    }
    @ApiOperation(value = "质量目标等复制")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", name = "companyId", dataType = "long", required = false, value = "公司id"),
            @ApiImplicitParam(paramType = "query", name = "sourceYear", dataType = "String", required = true, value = "资源年份"),
            @ApiImplicitParam(paramType = "query", name = "sourceMonth", dataType = "targetYear", required = true, value = "目标年份"),
    })
    @GetMapping("/policy/copyQuality")
    public CommonResult copyQuality(Long companyId,@RequestParam("sourceYear") String sourceYear, @RequestParam("targetYear")String targetYear){
        return qualityService.copyQuality(companyId,sourceYear,targetYear);
    }
    /**
     * 质量目标新增
     * @param qualityTargetReq
@@ -164,6 +173,8 @@
        return CommonResult.success(qualityAccomplishService.selectQualityAccomplishList(qualityReq));
    }
    /**
     * 质量目标完成情况新增
     * @param qualityAccomplish
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;
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;
}
multi-system/src/main/java/com/gkhy/exam/system/domain/req/CopyReq.java
New file
@@ -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;
}
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);
}
multi-system/src/main/java/com/gkhy/exam/system/service/ExpectDiscrenService.java
@@ -16,4 +16,7 @@
    CommonResult selectExpectDiscrenListAll(ExpectDiscren expectDiscren);
    CommonResult copyExpectDiscren(Long companyId,String sourceYear,String targetYear);
}
multi-system/src/main/java/com/gkhy/exam/system/service/ExpectEvaluateService.java
@@ -13,4 +13,7 @@
    CommonResult updateExpectEvaluate(ExpectEvaluate expectEvaluate);
    CommonResult deletedExpectEvaluate(Integer expectEvaluateId);
}
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);
}
multi-system/src/main/java/com/gkhy/exam/system/service/QualityService.java
@@ -16,4 +16,6 @@
    CommonResult deletedQuality(Integer qualityId);
    CommonResult selectQualityListAll(Quality quality);
    CommonResult copyQuality(Long companyId,String sourceYear,String targetYear);
}
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);
}
multi-system/src/main/java/com/gkhy/exam/system/service/impl/ExpectDiscrenServiceImpl.java
@@ -1,5 +1,8 @@
package com.gkhy.exam.system.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.common.api.CommonPage;
import com.gkhy.exam.common.api.CommonResult;
@@ -9,8 +12,10 @@
import com.gkhy.exam.system.domain.ExpectContent;
import com.gkhy.exam.system.domain.ExpectContentMess;
import com.gkhy.exam.system.domain.ExpectDiscren;
import com.gkhy.exam.system.domain.ExpectEvaluate;
import com.gkhy.exam.system.mapper.ExpectContentMapper;
import com.gkhy.exam.system.mapper.ExpectDiscrenMapper;
import com.gkhy.exam.system.mapper.ExpectEvaluateMapper;
import com.gkhy.exam.system.service.ExpectDiscrenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -28,6 +33,9 @@
    @Autowired
    private ExpectContentMapper expectContentMapper;
    @Autowired
    private ExpectEvaluateMapper expectEvaluateMapper;
    @Override
@@ -125,4 +133,88 @@
        }
        return CommonResult.success(expectDiscrens);
    }
    @Override
    @Transactional
    public CommonResult copyExpectDiscren(Long companyId,String sourceYear, String targetYear) {
        if (companyId==null){
         companyId = SecurityUtils.getCompanyId();
        }
        LambdaQueryWrapper<ExpectDiscren> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ExpectDiscren::getCompanyId, companyId)
                .eq(ExpectDiscren::getDelFlag, 1).eq(ExpectDiscren::getYear, targetYear);
        List<ExpectDiscren> expectDiscrensTarget = expectDiscrenMapper.selectList(queryWrapper);
        if (ObjectUtil.isNotEmpty(expectDiscrensTarget)){
            for (ExpectDiscren expectDiscren : expectDiscrensTarget) {
                deletedExpectDiscren(expectDiscren.getId());
                LambdaQueryWrapper<ExpectContent> queryWrapperContent = new LambdaQueryWrapper<>();
                queryWrapperContent.eq(ExpectContent::getExpectDiscrenId, expectDiscren.getId());
                List<ExpectContent> expectContents = expectContentMapper.selectList(queryWrapperContent);
                expectContentMapper.deletedByDiscrenId(expectDiscren.getId());
                if (ObjectUtil.isNotEmpty(expectContents)){
                    expectContentMapper.deletedByConentId(expectDiscren.getId());
                }
                LambdaUpdateWrapper<ExpectEvaluate> updateWrapper = new LambdaUpdateWrapper<>();
                updateWrapper.set(ExpectEvaluate::getDelFlag, 2).set(ExpectEvaluate::getUpdateBy, SecurityUtils.getUsername())
                        .eq(ExpectEvaluate::getUpdateTime, LocalDateTime.now()).eq(ExpectEvaluate::getExpectDiscrenId, expectDiscren.getId());
                expectEvaluateMapper.update(new ExpectEvaluate(), updateWrapper);
            }
        }
        LambdaQueryWrapper<ExpectDiscren> queryWrapperSource = new LambdaQueryWrapper<>();
        queryWrapperSource.eq(ExpectDiscren::getCompanyId, companyId)
                .eq(ExpectDiscren::getDelFlag, 1).eq(ExpectDiscren::getYear, sourceYear);
        List<ExpectDiscren> expectDiscrens = expectDiscrenMapper.selectList(queryWrapperSource);
        if (ObjectUtil.isEmpty(expectDiscrens)){
            return CommonResult.success("无相关数据");
        }
        for (ExpectDiscren expectDiscren : expectDiscrens) {
            Integer oldId = expectDiscren.getId();
            expectDiscren.setId(null);
            expectDiscren.setYear(targetYear);
            expectDiscren.setCreateBy(SecurityUtils.getUsername());
            expectDiscren.setCreateTime(LocalDateTime.now());
            expectDiscren.setUpdateBy(SecurityUtils.getUsername());
            expectDiscren.setUpdateTime(LocalDateTime.now());
            expectDiscren.setFictionTime(LocalDateTime.now());
            expectDiscrenMapper.insert(expectDiscren);
            List<ExpectContent> expectContents = expectContentMapper.selectByDiscrenId(oldId);
            if (ObjectUtil.isNotEmpty(expectContents)){
                for (ExpectContent expectContent : expectContents) {
                    List<ExpectContentMess> expectContentMesses = expectContentMapper.selectByContentId(expectContent.getId());
                    expectContent.setId(null);
                    expectContent.setExpectDiscrenId(expectDiscren.getId());
                    expectContentMapper.insert(expectContent);
                    if (ObjectUtil.isNotEmpty(expectContentMesses)){
                        for (ExpectContentMess expectContentMess : expectContentMesses) {
                            expectContentMess.setId(null);
                            expectContentMess.setExpectContentId(expectContent.getId());
                        }
                        expectContentMapper.insertContentMess(expectContentMesses);
                    }
                }
            }
            LambdaQueryWrapper<ExpectEvaluate> queryWrapper1 = new LambdaQueryWrapper<>();
            queryWrapper1.eq(ExpectEvaluate::getExpectDiscrenId, oldId).eq(ExpectEvaluate::getDelFlag, 1);
            List<ExpectEvaluate> expectEvaluates = expectEvaluateMapper.selectList(queryWrapper1);
            if (ObjectUtil.isNotEmpty(expectEvaluates)){
                for (ExpectEvaluate expectEvaluate : expectEvaluates) {
                    expectEvaluate.setId(null);
                    expectEvaluate.setExpectDiscrenId(expectDiscren.getId());
                    expectEvaluate.setCreateBy(SecurityUtils.getUsername());
                    expectEvaluate.setCreateTime(LocalDateTime.now());
                    expectEvaluate.setUpdateBy(SecurityUtils.getUsername());
                    expectEvaluate.setUpdateTime(LocalDateTime.now());
                    expectEvaluate.setEvaluateTime(LocalDateTime.now());
                    expectEvaluateMapper.insert(expectEvaluate);
                }
            }
        }
        return CommonResult.success();
    }
}
multi-system/src/main/java/com/gkhy/exam/system/service/impl/ExpectEvaluateServiceImpl.java
@@ -90,4 +90,5 @@
        expectEvaluateMapper.updateById(expectEvaluate);
        return CommonResult.success();
    }
}
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){
multi-system/src/main/java/com/gkhy/exam/system/service/impl/QualityServiceImpl.java
@@ -1,5 +1,8 @@
package com.gkhy.exam.system.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.common.api.CommonPage;
import com.gkhy.exam.common.api.CommonResult;
@@ -8,21 +11,16 @@
import com.gkhy.exam.common.exception.ApiException;
import com.gkhy.exam.common.utils.PageUtils;
import com.gkhy.exam.common.utils.SecurityUtils;
import com.gkhy.exam.system.domain.Quality;
import com.gkhy.exam.system.domain.QualityTarget;
import com.gkhy.exam.system.domain.QualityTargetMess;
import com.gkhy.exam.system.domain.SysCompany;
import com.gkhy.exam.system.domain.*;
import com.gkhy.exam.system.domain.req.QualityTargetReq;
import com.gkhy.exam.system.domain.vo.QualityTargetVo;
import com.gkhy.exam.system.mapper.QualityDecomposeMapper;
import com.gkhy.exam.system.mapper.QualityMapper;
import com.gkhy.exam.system.mapper.QualityTargetMapper;
import com.gkhy.exam.system.mapper.SysDeptMapper;
import com.gkhy.exam.system.mapper.*;
import com.gkhy.exam.system.service.QualityService;
import com.gkhy.exam.system.service.SysCompanyService;
import org.springframework.beans.BeanUtils;
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;
@@ -40,6 +38,8 @@
    private SysCompanyService sysCompanyService;
    @Autowired
    private SysDeptMapper sysDeptMapper;
    @Autowired
    private QualityAccomplishMapper qualityAccomplishMapper;
    @Override
    public CommonPage selectQualityList(Quality quality) {
@@ -147,4 +147,123 @@
        }
        return CommonResult.success(qualityTargetVos);
    }
    @Override
    @Transactional
    public CommonResult copyQuality(Long companyId, String sourceYear, String targetYear) {
        if (companyId == null){
            companyId = SecurityUtils.getCompanyId();
        }
        LambdaQueryWrapper<Quality> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Quality::getCompanyId,companyId)
                .eq(Quality::getYear,targetYear).eq(Quality::getDelFlag,1);
        List<Quality> qualitys = qualityMapper.selectList(queryWrapper);
        if (ObjectUtil.isNotEmpty(qualitys)){
            for (Quality quality : qualitys) {
                deletedQuality(quality.getId());
                LambdaQueryWrapper<QualityTarget> queryWrapper1 = new LambdaQueryWrapper<>();
                queryWrapper1.eq(QualityTarget::getQualityId,quality.getId()).eq(QualityTarget::getDelFlag,1);
                List<QualityTarget> qualityTargets = qualityTargetMapper.selectList(queryWrapper1);
                qualityTargetMapper.deleteByQualityIds(quality.getId());
                if (ObjectUtil.isNotEmpty(qualityTargets)){
                    qualityTargetMapper.deletedByQualityTargetId(quality.getId());
                }
                LambdaUpdateWrapper<QualityDecompose> updateWrapper = new LambdaUpdateWrapper<>();
                updateWrapper.eq(QualityDecompose::getQualityId,quality.getId()).eq(QualityDecompose::getDelFlag,1)
                        .set(QualityDecompose::getDelFlag,2).set(QualityDecompose::getUpdateTime,LocalDateTime.now())
                        .set(QualityDecompose::getUpdateBy,SecurityUtils.getUsername());
                qualityDecomposeMapper.update(new QualityDecompose(),updateWrapper);
                LambdaUpdateWrapper<QualityAccomplish> updateWrapper1 = new LambdaUpdateWrapper<>();
                updateWrapper1.eq(QualityAccomplish::getQualityId,quality.getId()).eq(QualityAccomplish::getDelFlag,1)
                        .set(QualityAccomplish::getDelFlag,2).set(QualityAccomplish::getUpdateTime,LocalDateTime.now())
                        .set(QualityAccomplish::getUpdateBy,SecurityUtils.getUsername());
                qualityAccomplishMapper.update(new QualityAccomplish(),updateWrapper1);
            }
        }
        LambdaQueryWrapper<Quality> queryWrapperSource = new LambdaQueryWrapper<>();
        queryWrapperSource.eq(Quality::getCompanyId,companyId)
                .eq(Quality::getYear,sourceYear).eq(Quality::getDelFlag,1);
        List<Quality> qualitys1 = qualityMapper.selectList(queryWrapperSource);
        if (ObjectUtil.isNotEmpty(qualitys1)){
            for (Quality quality : qualitys1) {
                Integer oldId = quality.getId();
                quality.setId( null);
                quality.setYear(targetYear);
                quality.setCreateBy(SecurityUtils.getUsername());
                quality.setCreateTime(LocalDateTime.now());
                quality.setUpdateBy(SecurityUtils.getUsername());
                quality.setUpdateTime(LocalDateTime.now());
                quality.setDelFlag(1);
                quality.setCompilationTime(LocalDateTime.now());
                quality.setQualityTime(LocalDateTime.now());
                qualityMapper.insert(quality);
                List<QualityTarget> qualityTargets = qualityTargetMapper.selectByQualityId(oldId);
                if (ObjectUtil.isNotEmpty(qualityTargets)){
                    for (QualityTarget qualityTarget : qualityTargets) {
                        List<QualityTargetMess> qualityTargetMesses = qualityTargetMapper.selectBYQualityTargetId(qualityTarget.getId());
                        qualityTarget.setId(null);
                        qualityTarget.setQualityId(quality.getId());
                        qualityTarget.setCreateBy(SecurityUtils.getUsername());
                        qualityTarget.setCreateTime(LocalDateTime.now());
                        qualityTarget.setUpdateBy(SecurityUtils.getUsername());
                        qualityTarget.setUpdateTime(LocalDateTime.now());
                        qualityTargetMapper.insert(qualityTarget);
                        if (ObjectUtil.isNotEmpty(qualityTargetMesses)){
                            for (QualityTargetMess qualityTargetMess : qualityTargetMesses) {
                                qualityTargetMess.setId(null);
                                qualityTargetMess.setQualityTargetId(qualityTarget.getId());
                            }
                            qualityTargetMapper.insertQualityTargetMess(qualityTargetMesses);
                        }
                    }
                }
                LambdaQueryWrapper<QualityDecompose> queryWrapper1 = new LambdaQueryWrapper<>();
                queryWrapper1.eq(QualityDecompose::getQualityId,oldId).eq(QualityDecompose::getDelFlag,1);
                List<QualityDecompose> qualityDecomposes = qualityDecomposeMapper.selectList(queryWrapper1);
                if (ObjectUtil.isNotEmpty(qualityDecomposes)){
                    for (QualityDecompose qualityDecompose : qualityDecomposes) {
                        qualityDecompose.setId(null);
                        qualityDecompose.setQualityId(quality.getId());
                        qualityDecompose.setCreateBy(SecurityUtils.getUsername());
                        qualityDecompose.setCreateTime(LocalDateTime.now());
                        qualityDecompose.setUpdateBy(SecurityUtils.getUsername());
                        qualityDecompose.setUpdateTime(LocalDateTime.now());
                        qualityDecompose.setDelFlag(1);
                        qualityDecompose.setCheckTime(LocalDateTime.now());
                        qualityDecompose.setRatifyTime(LocalDateTime.now());
                        qualityDecomposeMapper.insert(qualityDecompose);
                    }
                }
                LambdaQueryWrapper<QualityAccomplish> queryWrapper2 = new LambdaQueryWrapper<>();
                queryWrapper2.eq(QualityAccomplish::getQualityId,oldId).eq(QualityAccomplish::getDelFlag,1);
                List<QualityAccomplish> qualityAccomplishes = qualityAccomplishMapper.selectList(queryWrapper2);
                if (ObjectUtil.isNotEmpty(qualityAccomplishes)){
                    for (QualityAccomplish qualityAccomplish : qualityAccomplishes) {
                        qualityAccomplish.setId(null);
                        qualityAccomplish.setQualityId(quality.getId());
                        qualityAccomplish.setCreateBy(SecurityUtils.getUsername());
                        qualityAccomplish.setCreateTime(LocalDateTime.now());
                        qualityAccomplish.setUpdateBy(SecurityUtils.getUsername());
                        qualityAccomplish.setUpdateTime(LocalDateTime.now());
                        qualityAccomplish.setDelFlag(1);
                        qualityAccomplish.setChargeTime(LocalDateTime.now());
                        qualityAccomplishMapper.insert(qualityAccomplish);
                    }
                }
            }
        }
        return CommonResult.success();
    }
}
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() + "]");
    }
}
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>
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>
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>
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">