lxp
2025-03-18 059b188fd49c5127b75a38408d12e26d2363fbab
cans问题修复1.0
已修改12个文件
已添加2个文件
462 ■■■■ 文件已修改
cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRiskAssessmentResultsServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodSearchNewController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/dto/InconsistentDistributionProportionDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodSearchNewDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodSearchNewExcel.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodSearchNewImport.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/pojo/InconsistentDistributionDetail.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/service/impl/InconsistentDistributionServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewServiceImpl.java 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessReportServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/resources/mapper/ProcessMethodSearchNewMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRiskAssessmentResultsServiceImpl.java
@@ -7,6 +7,7 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.Pictures;
import com.ruoyi.common.utils.DateImageUtil;
import com.ruoyi.framework.exception.ErrorException;
@@ -21,6 +22,7 @@
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
@@ -86,10 +88,24 @@
            detailedDto.setIndex(index);
            index++;
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/risk-factor-identification-risk.docx");
        String finalExamineUrl = examineUrl;
        String finalRatifyUrl = ratifyUrl;
        File file = new File(imgUrl + File.separator + writeUrl);
        File examine = new File(imgUrl + File.separator + finalExamineUrl);
        File ratify = new File(imgUrl + File.separator + finalRatifyUrl);
        if(!file.exists()){
            throw new ErrorException("找不到检验人的签名");
        }
        if(!examine.exists()){
            throw new ErrorException("找不到复核人的签名");
        }
        if(!ratify.exists()){
            throw new ErrorException("找不到批准人的签名");
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/risk-factor-identification-risk.docx");
        Configure configure = Configure.builder()
                .bind("trainingDetailedList", new HackLoopTableRenderPolicy())
                .build();
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java
@@ -27,6 +27,7 @@
import com.ruoyi.personnel.service.PersonTrainingDetailedService;
import com.ruoyi.personnel.service.PersonTrainingRecordService;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -214,7 +215,7 @@
    @Override
    public void outOfFocusPreservation(PersonTrainingRecord personTrainingRecord) {
        int userId = SecurityUtils.getUserId().intValue();
        int userId = Integer.parseInt(SecurityUtils.getUserId().toString());
        // åŸ¹è®­é€šè¿‡äº†ï¼ŒåŸ¹è®­è¯¾æ—¶è®¡å…¥åˆ°å½“天的辅助工时 (辅助工时 ä»¥åŠ æ ¸å‡†å·¥æ—¶éƒ½æ·»åŠ )
        baseMapper.updateById(personTrainingRecord);
        PersonTrainingDetailed personTrainingDetailed = personTrainingDetailedMapper.selectById(personTrainingRecord.getCourseId());
@@ -224,71 +225,94 @@
            if(StringUtils.isEmpty(trainingDateTwo)) {
                throw new ErrorException("没有设置培训日期无法添加辅助工时");
            }
            AuxiliaryWorkingHoursDay auxiliaryWorkingHoursDay = auxiliaryWorkingHoursDayService.selectAuxiliaryWorkingHoursByNumber("401");
            // æ˜¯å¦ä»¥åŠæ·»åŠ è¿‡äº†
            List<AuxiliaryWorkingHoursDay> auxiliaryWorkingHoursDays = auxiliaryWorkingHoursDayMapper.selectList(new LambdaQueryWrapper<AuxiliaryWorkingHoursDay>()
                    .eq(AuxiliaryWorkingHoursDay::getNameUser, personTrainingRecord.getUserId())
                    .eq(AuxiliaryWorkingHoursDay::getAuxiliaryProject, personTrainingDetailed.getTrainingContent())
                    .eq(AuxiliaryWorkingHoursDay::getCreateUser, userId)
                    .eq(AuxiliaryWorkingHoursDay::getAuxiliaryProject,auxiliaryWorkingHoursDay.getAuxiliaryProject())
                    .eq(AuxiliaryWorkingHoursDay::getDateTime, trainingDateTwo + " 00:00:00"));
            // å¦‚果有数据 åˆæ ¼å°±ä¸åšå¤„理   ä¸åˆæ ¼å°±åˆ é™¤
            if(CollectionUtils.isNotEmpty(auxiliaryWorkingHoursDays)) {
                if(personTrainingRecord.getExaminationResults().equals("不合格")) {
                    auxiliaryWorkingHoursDayMapper.delete(new LambdaQueryWrapper<AuxiliaryWorkingHoursDay>()
                            .eq(AuxiliaryWorkingHoursDay::getNameUser, personTrainingRecord.getUserId())
                            .eq(AuxiliaryWorkingHoursDay::getAuxiliaryProject, personTrainingDetailed.getTrainingContent())
                            .eq(AuxiliaryWorkingHoursDay::getCreateUser, userId)
                            .eq(AuxiliaryWorkingHoursDay::getAuxiliaryProject, auxiliaryWorkingHoursDay.getAuxiliaryProject())
                            .eq(AuxiliaryWorkingHoursDay::getDateTime, trainingDateTwo + " 00:00:00"));
                }
            }
            // å¦‚果是检测办的人就不用加
            User user = userMapper.selectById(personTrainingRecord.getUserId());
            if(user.getDepartLimsId().contains("22")) {
                return;
            }
            // ä¸€èŠ‚è¯¾45分钟 å·¥æ—¶60分钟
            BigDecimal minute = BigDecimal.valueOf(classHour).multiply(new BigDecimal("45")); // å…·ä½“分钟
            BigDecimal divide = minute.divide(new BigDecimal("60"),4, RoundingMode.HALF_UP); // å·¥æ—¶
            // æ·»åŠ æ•°æ®
            AuxiliaryWorkingHoursDay a = new AuxiliaryWorkingHoursDay();
            a.setNameUser(personTrainingRecord.getUserId()); // å§“名id
            // é¡¹ç›®åç§°
            a.setRemarks(personTrainingDetailed.getTrainingContent()); //  è¾…助说明
            a.setNumber("401"); // ç¼–号
            a.setAuxiliaryProject(auxiliaryWorkingHoursDay.getAuxiliaryProject()); // è¾…助项目名称
            a.setNonproductiveTime(Double.parseDouble(divide.toString())); // è¾…助工时
            a.setApprovedWorkingHour(auxiliaryWorkingHoursDay.getApprovedWorkingHour()); // æ ¸å‡†å·¥æ—¶
            a.setAmount(Double.parseDouble(divide.toString())); // æ•°é‡
            String year = trainingDateTwo.split("-")[0];
            a.setYear(year); // å¹´
            a.setCreateTime(LocalDateTime.now());
            a.setUpdateTime(LocalDateTime.now());
            a.setCreateUser(userId); // åˆ›å»ºäººid
            a.setUpdateUser(userId); // ä¿®æ”¹äººid
            a.setState("已提交"); // çŠ¶æ€
            a.setDateTime(trainingDateTwo + " 00:00:00"); // æ—¥æœŸ
            // èŽ·å–å½“å‰æ—¥æœŸ
            LocalDate today = LocalDate.now();
            // èŽ·å–å½“å‰æ—¥æœŸçš„å‘¨æ¬¡ï¼ˆä¸€å¹´ä¸­çš„ç¬¬å‡ å‘¨ï¼‰
            TemporalField weekOfYear = WeekFields.of(Locale.getDefault()).weekOfYear();
            int weekNumber = today.get(weekOfYear);
            // èŽ·å–å½“å‰æ—¥æœŸçš„æ˜ŸæœŸï¼ˆä¸€å‘¨ä¸­çš„ç¬¬å‡ å¤©ï¼‰
            DayOfWeek dayOfWeek = today.getDayOfWeek();
            int dayOfWeekNumber = dayOfWeek.getValue();
            LocalDate now = LocalDate.now();
            LocalTime parse = LocalTime.parse("00:00:00");
            LocalDateTime of = LocalDateTime.of(now, parse);
            PerformanceShift performanceShift = shiftMapper.selectOne(new LambdaQueryWrapper<PerformanceShift>().eq(PerformanceShift::getWorkTime, of)
                    .eq(PerformanceShift::getUserId, personTrainingRecord.getUserId()));
            if(Objects.nonNull(performanceShift)) {
                a.setShift(performanceShift.getShift()); // ç­æ¬¡
            }
            a.setWeek(weekNumber+""); // å‘¨æ¬¡
            a.setWeekDay(dayOfWeekNumber == 7 ? 0+"" : dayOfWeekNumber+""); // æ˜ŸæœŸ
            // æ˜¯å¦é€šè¿‡
            if(personTrainingRecord.getExaminationResults().equals("合格") && CollectionUtils.isEmpty(auxiliaryWorkingHoursDays)) {
                // å¦‚果是检测办的人就不用加
                User user = userMapper.selectById(personTrainingRecord.getUserId());
                if(user.getDepartLimsId().contains("22")) {
                    return;
                }
                // ä¸€èŠ‚è¯¾45分钟 å·¥æ—¶60分钟
                BigDecimal minute = BigDecimal.valueOf(classHour).multiply(new BigDecimal("45")); // å…·ä½“分钟
                BigDecimal divide = minute.divide(new BigDecimal("60"),4, RoundingMode.HALF_UP); // å·¥æ—¶
                // æ·»åŠ æ•°æ®
                AuxiliaryWorkingHoursDay a = new AuxiliaryWorkingHoursDay();
                a.setNameUser(personTrainingRecord.getUserId()); // å§“名id
                // é¡¹ç›®åç§°
                a.setRemarks(personTrainingDetailed.getTrainingContent()); //  è¾…助说明
                a.setNumber("401"); // ç¼–号
                AuxiliaryWorkingHoursDay auxiliaryWorkingHoursDay = auxiliaryWorkingHoursDayService.selectAuxiliaryWorkingHoursByNumber("401");
                a.setAuxiliaryProject(auxiliaryWorkingHoursDay.getAuxiliaryProject()); // è¾…助项目名称
                a.setNonproductiveTime(Double.parseDouble(divide.toString())); // è¾…助工时
                a.setApprovedWorkingHour(auxiliaryWorkingHoursDay.getApprovedWorkingHour()); // æ ¸å‡†å·¥æ—¶
                a.setAmount(Double.parseDouble(divide.toString())); // æ•°é‡
                String year = trainingDateTwo.split("-")[0];
                a.setYear(year); // å¹´
                a.setCreateTime(LocalDateTime.now());
                a.setUpdateTime(LocalDateTime.now());
                a.setCreateUser(userId); // åˆ›å»ºäººid
                a.setUpdateUser(userId); // ä¿®æ”¹äººid
                a.setState("已提交"); // çŠ¶æ€
                a.setDateTime(trainingDateTwo + " 00:00:00"); // æ—¥æœŸ
                // èŽ·å–å½“å‰æ—¥æœŸ
                LocalDate today = LocalDate.now();
                // èŽ·å–å½“å‰æ—¥æœŸçš„å‘¨æ¬¡ï¼ˆä¸€å¹´ä¸­çš„ç¬¬å‡ å‘¨ï¼‰
                TemporalField weekOfYear = WeekFields.of(Locale.getDefault()).weekOfYear();
                int weekNumber = today.get(weekOfYear);
                // èŽ·å–å½“å‰æ—¥æœŸçš„æ˜ŸæœŸï¼ˆä¸€å‘¨ä¸­çš„ç¬¬å‡ å¤©ï¼‰
                DayOfWeek dayOfWeek = today.getDayOfWeek();
                int dayOfWeekNumber = dayOfWeek.getValue();
                LocalDate now = LocalDate.now();
                LocalTime parse = LocalTime.parse("00:00:00");
                LocalDateTime of = LocalDateTime.of(now, parse);
                PerformanceShift performanceShift = shiftMapper.selectOne(new LambdaQueryWrapper<PerformanceShift>().eq(PerformanceShift::getWorkTime, of)
                        .eq(PerformanceShift::getUserId, personTrainingRecord.getUserId()));
                if(Objects.nonNull(performanceShift)) {
                    a.setShift(performanceShift.getShift()); // ç­æ¬¡
                }
                a.setWeek(weekNumber+""); // å‘¨æ¬¡
                a.setWeekDay(dayOfWeekNumber == 7 ? 0+"" : dayOfWeekNumber+""); // æ˜ŸæœŸ
                auxiliaryWorkingHoursDayMapper.insert(a);
            }
            // åŸ¹è®­è®²å¸ˆä¹Ÿè¦åŠ ä¸Šç›¸åº”çš„å·¥æ—¶
            String trainingLecturerId = personTrainingDetailed.getTrainingLecturerId();
            String[] split = trainingLecturerId.split(",");
            for (String name : split) {
                if(StringUtils.isNotEmpty(name)) {
                    User user1 = userMapper.selectList(new LambdaQueryWrapper<User>().like(User::getName, name)).get(0);
                    if(user1.getDepartLimsId().contains("22")) {
                        continue;
                    }
                    // æ·»åŠ è¿‡äº†å°±ä¸å†æ·»åŠ 
                    List<AuxiliaryWorkingHoursDay> list = auxiliaryWorkingHoursDayMapper.selectList(new LambdaQueryWrapper<AuxiliaryWorkingHoursDay>()
                            .eq(AuxiliaryWorkingHoursDay::getNameUser, user1.getId())
                            .eq(AuxiliaryWorkingHoursDay::getAuxiliaryProject, auxiliaryWorkingHoursDay.getAuxiliaryProject())
                            .eq(AuxiliaryWorkingHoursDay::getDateTime, trainingDateTwo + " 00:00:00"));
                    if(CollectionUtils.isNotEmpty(list)) {
                        continue;
                    }
                    AuxiliaryWorkingHoursDay auxiliaryWorkingHoursDay1 = new AuxiliaryWorkingHoursDay(); // ç”¨äºŽæ·»åŠ åŸ¹è®­è®²å¸ˆ
                    BeanUtils.copyProperties(a,auxiliaryWorkingHoursDay1);
                    auxiliaryWorkingHoursDay1.setNameUser(user1.getId());
                    auxiliaryWorkingHoursDay1.setId(null);
                    auxiliaryWorkingHoursDayMapper.insert(auxiliaryWorkingHoursDay1);
                }
            }
        }
    }
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodSearchNewController.java
@@ -84,7 +84,8 @@
    @ApiOperation(value = "导入标准查新")
    @PostMapping("/importMethodSearchNew")
    public Result importMethodSearchNew(MultipartFile file) {
        return Result.success(processMethodSearchNewService.importMethodSearchNew(file));
        processMethodSearchNewService.importMethodSearchNew(file);
        return Result.success();
    }
    /**
@@ -93,7 +94,7 @@
     * @return
     */
    @ApiOperation(value = "删除标准查新")
    @DeleteMapping("/deleteById")
    @GetMapping("/deleteById")
    public Result deleteByMethodSearchNewId(@RequestParam("methodSearchNewId")Integer methodSearchNewId) {
        processMethodSearchNewService.removeById(methodSearchNewId);
        return Result.success("删除成功");
cnas-process/src/main/java/com/ruoyi/process/dto/InconsistentDistributionProportionDto.java
@@ -40,6 +40,6 @@
    private Integer total;
    @ApiModelProperty("占比")
    private BigDecimal proportion;
    private String proportion;
}
cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodSearchNewDto.java
@@ -59,4 +59,6 @@
    @ExcelProperty(value = {"序号", "序号"}, index = 0)
    @ApiModelProperty("序号")
    private Integer index;
    private Boolean isThisYear;
}
cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodSearchNewExcel.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.ruoyi.process.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ProcessMethodSearchNewExcel {
    @ExcelProperty(value = {"标准名称", "标准名称"}, index = 1)
    private String methodName;
    @ExcelProperty(value = {"标准号", "标准号"}, index = 2)
    @ApiModelProperty("标准号")
    private String standardNo;
    @ExcelProperty(value = {"文件编号", "文件编号"}, index = 3)
    @ApiModelProperty("文件编号")
    private String fileNo;
    @ExcelProperty(value = "是否是更新标准", index = 4)
    @ApiModelProperty("是否有更新标准")
    private String isNewStandardString;
    @ExcelProperty(value = {"新标准名称", "新标准名称"}, index = 5)
    @ApiModelProperty("新标准名称")
    private String newMethodName;
    @ExcelProperty(value = {"新标准号", "新标准号"}, index =6)
    @ApiModelProperty("新标准号")
    private String newStandardNo;
    @ExcelProperty(value = {"查新记录来源", "标准网"}, index = 7)
    @ApiModelProperty("标准网")
    private String standardNet;
    @ExcelProperty(value = {"查新记录来源", "委托情报所"}, index = 8)
    @ApiModelProperty("委托情报所")
    private String informationOffices;
    @ExcelProperty(value = {"查新记录来源", "标准书店"}, index = 9)
    @ApiModelProperty("标准书店")
    private String standardBookstore;
    @ExcelProperty(value = {"查新记录来源", "其他"}, index = 10)
    @ApiModelProperty("其他")
    private String other;
    @ExcelProperty(value = {"备注", "备注"}, index = 11)
    @ApiModelProperty("备注")
    private String remarkString;
    @ExcelProperty(value = {"序号", "序号"}, index = 0)
    @ApiModelProperty("序号")
    private String index;
}
cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodSearchNewImport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.ruoyi.process.dto;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.ruoyi.process.service.impl.ProcessMethodSearchNewServiceImpl;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
@Slf4j
public class ProcessMethodSearchNewImport extends AnalysisEventListener<ProcessMethodSearchNewExcel> {
    private static final int BATCH_COUNT = 500;
    private static List<ProcessMethodSearchNewExcel> list = new ArrayList<>();
    private ProcessMethodSearchNewServiceImpl service;
    public ProcessMethodSearchNewImport(ProcessMethodSearchNewServiceImpl service) {
        this.service = service;
    }
    @Override
    public void invoke(ProcessMethodSearchNewExcel processMethodSearchNewExcel, AnalysisContext analysisContext) {
        log.info("解析到一条数据:{}", processMethodSearchNewExcel);
        if(list.size() > BATCH_COUNT) {
            save(list);
            list.clear();
        } else {
            list.add(processMethodSearchNewExcel);
        }
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        log.info("所有数据解析完成!:{}条数据", list.size());
        save(list);
    }
    public void  save(List<ProcessMethodSearchNewExcel> list) {
        log.info("{}条数据,开始存储数据库!", list.size());
        service.save(list);
        log.info("存储数据库成功!");
    }
}
cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewMapper.java
@@ -28,7 +28,7 @@
     * @param endDate
     * @return
     */
    IPage<ProcessMethodSearchNew> pageMethodSearchNew(@Param("page") Page page, @Param("ew") QueryWrapper<ProcessMethodSearchNewDto> processMethodSearchNewDtoQueryWrapper, @Param("beginDate") String beginDate, @Param("endDate") String endDate);
    IPage<ProcessMethodSearchNew> pageMethodSearchNew(@Param("page") Page page, @Param("ew") QueryWrapper<ProcessMethodSearchNew> processMethodSearchNewDtoQueryWrapper, @Param("beginDate") String beginDate, @Param("endDate") String endDate);
    /**
     * æŸ¥è¯¢æ ‡å‡†æŸ¥è¯¢
cnas-process/src/main/java/com/ruoyi/process/pojo/InconsistentDistributionDetail.java
@@ -70,5 +70,5 @@
    @ApiModelProperty("占比")
    @TableField(select = false,exist = false)
    private BigDecimal proportion;
    private String proportion;
}
cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewService.java
@@ -44,6 +44,6 @@
     * @param file
     * @return
     */
    boolean importMethodSearchNew(MultipartFile file);
    void importMethodSearchNew(MultipartFile file);
}
cnas-process/src/main/java/com/ruoyi/process/service/impl/InconsistentDistributionServiceImpl.java
@@ -153,7 +153,7 @@
                    + (distributionDetail.getTesting() != null ? distributionDetail.getTesting() : 0);
            distributionDetail.setTotal(total);
            // å æ¯”
            distributionDetail.setProportion(calculatePercentage(total, sum));
            distributionDetail.setProportion(calculatePercentage(total, sum)+"%");
        }
        // æ·»åŠ æœ€åŽä¸€è¡Œå æ¯”å¯¹è±¡
        InconsistentDistributionProportionDto proportionDto = new InconsistentDistributionProportionDto();
@@ -199,6 +199,7 @@
    public void exportInconsistentDistribution(Integer distributionId, HttpServletResponse response) {
        InconsistentDistributionDto inconsistentDistributionOne = getInconsistentDistributionOne(distributionId);
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/inconsistent-distribution.docx");
        Configure configure = Configure.builder()
cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewServiceImpl.java
@@ -1,23 +1,26 @@
package com.ruoyi.process.service.impl;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.util.FileUtils;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.process.dto.ProcessMethodSearchNewDto;
import com.ruoyi.process.dto.ProcessMethodSearchNewExcel;
import com.ruoyi.process.dto.ProcessMethodSearchNewImport;
import com.ruoyi.process.mapper.ProcessMethodSearchNewMapper;
import com.ruoyi.process.pojo.ProcessMethodSearchNew;
import com.ruoyi.process.service.ProcessMethodSearchNewService;
import com.ruoyi.process.utils.UserUtils;
import org.apache.poi.hslf.util.LocaleDateFormat;
import org.springframework.beans.BeanUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;
@@ -30,10 +33,13 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
@@ -45,6 +51,7 @@
@Service
public class ProcessMethodSearchNewServiceImpl extends ServiceImpl<ProcessMethodSearchNewMapper, ProcessMethodSearchNew> implements ProcessMethodSearchNewService {
    private final Set<String> importedFileHashes = ConcurrentHashMap.newKeySet();
    /**
     * æ–°å¢žæ ‡å‡†æŸ¥æ–°
     *
@@ -87,7 +94,16 @@
        String endDate = processMethodSearchNew.getEndDate();
        processMethodSearchNew.setBeginDate(null);
        processMethodSearchNew.setEndDate(null);
        return baseMapper.pageMethodSearchNew(page, QueryWrappers.queryWrappers(processMethodSearchNew), beginDate, endDate);
        // åŽ†å²è®°å½•çš„è¯ å°±è¦åŠ æ—¶é—´
        if(!processMethodSearchNew.getIsThisYear()) {
            LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now().getYear(), 1, 1, 0, 0, 0);
            endDate = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(localDateTime);
        }
        ProcessMethodSearchNew processMethodSearchNew1 = new ProcessMethodSearchNew();
        BeanUtils.copyProperties(processMethodSearchNew, processMethodSearchNew1);
        return baseMapper.pageMethodSearchNew(page, QueryWrappers.queryWrappers(processMethodSearchNew1), beginDate, endDate);
    }
    /**
@@ -139,20 +155,23 @@
                    methodSearchNew.setRemarkString("作废");
                }
            }
            switch (methodSearchNew.getSearchNewSource()) {
                case 0:
                    methodSearchNew.setStandardNet("√");
                    break;
                case 1:
                    methodSearchNew.setInformationOffices("√");
                    break;
                case 2:
                    methodSearchNew.setStandardBookstore("√");
                    break;
                case 3:
                    methodSearchNew.setOther("√");
                    break;
            if(Objects.nonNull(methodSearchNew.getSearchNewSource())) {
                switch (methodSearchNew.getSearchNewSource()) {
                    case 0:
                        methodSearchNew.setStandardNet("√");
                        break;
                    case 1:
                        methodSearchNew.setInformationOffices("√");
                        break;
                    case 2:
                        methodSearchNew.setStandardBookstore("√");
                        break;
                    case 3:
                        methodSearchNew.setOther("√");
                        break;
                    default:
                        break;
                }
            }
            methodSearchNew.setIndex(index);
            index++;
@@ -236,63 +255,78 @@
     * @return
     */
    @Override
    public boolean importMethodSearchNew(MultipartFile file) {
        List<ProcessMethodSearchNewDto> searchNewDtoList = new ArrayList<>();
    public void importMethodSearchNew(MultipartFile file) {
        try {
            // excel解析
            EasyExcel.read(file.getInputStream(), ProcessMethodSearchNewDto.class, new AnalysisEventListener<ProcessMethodSearchNewDto>() {
                @Override
                public void invoke(ProcessMethodSearchNewDto searchNewDto, AnalysisContext analysisContext) {
                    searchNewDtoList.add(searchNewDto);
                }
            // 1. è®¡ç®—文件的 MD5 å“ˆå¸Œå€¼
            String fileHash = calculateFileHash(file);
                @Override
                public void doAfterAllAnalysed(AnalysisContext analysisContext) {
            // 2. æ£€æŸ¥æ˜¯å¦å·²å­˜åœ¨ç›¸åŒæ–‡ä»¶
            if (!importedFileHashes.add(fileHash)) {
                return; // å·²å­˜åœ¨ï¼Œç›´æŽ¥è·³è¿‡
            }
            // 3. è¯»å–并处理文件
            try (InputStream inputStream = file.getInputStream()) {
                EasyExcel.read(inputStream, ProcessMethodSearchNewExcel.class, new ProcessMethodSearchNewImport(this))
                        .sheet()
                        .doRead();
            }
                }
            }).sheet().doRead();
            // æ ¼å¼åŒ–查新对象
            List<ProcessMethodSearchNew> collect = searchNewDtoList.stream().map(searchNewDto -> {
                ProcessMethodSearchNew searchNew = new ProcessMethodSearchNew();
                BeanUtils.copyProperties(searchNewDto, searchNew);
                // æ˜¯å¦æ˜¯æ›´æ–°
                if (StringUtils.isNotBlank(searchNewDto.getIsNewStandardString())) {
                    if (searchNewDto.getIsNewStandardString().equals("是")) {
                        searchNew.setIsNewStandard(1);
                    } else {
                        searchNew.setIsNewStandard(0);
                    }
                }
                // æŸ¥æ–°è®°å½•
                if (StringUtils.isNotBlank(searchNewDto.getStandardNet())) {
                    searchNew.setSearchNewSource(0);
                } else if (StringUtils.isNotBlank(searchNewDto.getInformationOffices())) {
                    searchNew.setSearchNewSource(1);
                } else if (StringUtils.isNotBlank(searchNewDto.getIsNewStandardString())) {
                    searchNew.setSearchNewSource(2);
                } else if (StringUtils.isNotBlank(searchNewDto.getOther())) {
                    searchNew.setSearchNewSource(3);
                }
                // å¤‡æ³¨
                if (StringUtils.isNotBlank(searchNewDto.getRemarkString())) {
                    if (searchNewDto.getRemarkString().equals("替换")) {
                        searchNew.setRemark(1);
                    } else if (searchNewDto.getRemarkString().equals("作废")) {
                        searchNew.setRemark(0);
                    }
                }
                return searchNew;
            }).collect(Collectors.toList());
            this.saveBatch(collect);
        } catch (IOException e) {
            // 4. è®°å½•文件哈希值(标记为已导入)
            importedFileHashes.add(fileHash);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return true;
    }
    public void save (List<ProcessMethodSearchNewExcel> list) {
        if(CollectionUtils.isNotEmpty(list)) {
            for (ProcessMethodSearchNewExcel a : list) {
                if(NumberUtil.isNumber(a.getIndex())) {
                    ProcessMethodSearchNew processMethodSearchNew = new ProcessMethodSearchNew();
                    BeanUtils.copyProperties(a, processMethodSearchNew);
                    processMethodSearchNew.setIsNewStandard(a.getIsNewStandardString() == "是" ? 1 : 0); // æ˜¯å¦æ˜¯æ–°æ ‡å‡†
                    // æŸ¥æ–°è®°å½• 0 æ ‡å‡†ç½‘  1 å§”托情报 2 æ ‡å‡†æ•°  3 å…¶ä»–
                    if(StringUtils.isNotEmpty(a.getStandardNet())) {
                        processMethodSearchNew.setSearchNewSource(0);
                    } else if(StringUtils.isNotEmpty(a.getInformationOffices())) {
                        processMethodSearchNew.setSearchNewSource(1);
                    } else if(StringUtils.isNotEmpty(a.getStandardBookstore())) {
                        processMethodSearchNew.setSearchNewSource(2);
                    } else if(StringUtils.isNotEmpty(a.getOther())) {
                        processMethodSearchNew.setSearchNewSource(3);
                    }
                    // ç¼–制人
                    baseMapper.insert(processMethodSearchNew);
                }
            }
        }
    }
    // è®¡ç®—文件的 MD5 å“ˆå¸Œå€¼
    private String calculateFileHash(MultipartFile file) throws Exception {
        try (InputStream is = file.getInputStream()) {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] buffer = new byte[8192];
            int bytesRead;
            while ((bytesRead = is.read(buffer)) != -1) {
                md.update(buffer, 0, bytesRead);
            }
            byte[] hashBytes = md.digest();
            // å°†å­—节数组转换为十六进制字符串
            return bytesToHex(hashBytes);
        }
    }
    private static String bytesToHex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }
}
cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessReportServiceImpl.java
@@ -28,10 +28,7 @@
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -77,9 +74,11 @@
        List<ProcessReport> processReports = processReportMapper.getIds(ids);
        for (ProcessReport processReport : processReports) {
            List<String> name = new ArrayList<>();
            for (String s : processReport.getSignatory().split(",")) {
                User user = userMapper.selectById(Integer.parseInt(s));
                name.add(user.getName());
            if(StringUtils.isNotEmpty(processReport.getSignatory())) {
                for (String s : processReport.getSignatory().split(",")) {
                    User user = userMapper.selectById(Integer.parseInt(s));
                    name.add(user.getName());
                }
            }
            String signatoryName = name.stream().collect(Collectors.joining(","));
            processReport.setSignatoryName(signatoryName);
@@ -293,7 +292,11 @@
                            }
                            else if (j == 6) {
                                try{
                                    textRenderData.setText(processReports.get((i-1) + (index1 - 1) * 20).getSendTime()+"");
                                    String text = "";
                                    if(Objects.nonNull(processReports.get((i-1) + (index1 - 1) * 20).getSendTime())) {
                                        text = processReports.get((i-1) + (index1 - 1) * 20).getSendTime() + "";
                                    }
                                    textRenderData.setText(text);
                                } catch (Exception e) {
                                    textRenderData.setText("");
                                }
cnas-process/src/main/resources/mapper/ProcessMethodSearchNewMapper.xml
@@ -11,6 +11,9 @@
            <if test="beginDate != null and beginDate != '' and endDate != null and endDate != ''">
                and create_time between #{beginDate} and #{endDate}
            </if>
        <if test="endDate != '' and  endDate != null">
            and create_time &lt; #{endDate}
        </if>
        </where>
        order by create_time desc
        ) a