Lius
2025-01-09 2c24f787f28e85af3a7f89e4277063e9a2523909
两网融合部分
已添加23个文件
已修改16个文件
1924 ■■■■■ 文件已修改
lxzn-boot-base-core/pom.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentRunningSectionController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEquipmentRunningSectionDto.java 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/LogTable.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/ExportToXmlJob.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/ImportXmlToDataJob.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/TransferTableDataJob.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/LogTableMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentStatisticalInfoMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/LogTableMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRunningSectionMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentStatisticalInfoMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/ILogTableService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRunningSectionService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentStatisticalInfoService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/LogTableServiceImpl.java 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/util/DateUtils.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/util/FileClient.java 227 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/util/SqlExecutor.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/util/SyslogClient.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/test/java/org/lxzn/TestOne.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/api/controller/SystemApiController.java 345 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/MdcPassLog.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcPassLogMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcPassLogMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcPassLogService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcPassLogServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/util/FileUtils.java 195 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/util/JwTUtil.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/util/SM3Util.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/vo/FileDetail.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/vo/PostParams.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/vo/RespData.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/vo/SysLogTypeObjectDto.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/vo/TokenResp.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-boot-base-core/pom.xml
@@ -219,6 +219,18 @@
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-module-kotlin</artifactId>
        </dependency>
        <!--国密算法加密-->
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15to18</artifactId>
            <version>1.64</version>
        </dependency>
        <!--日志系统-->
        <dependency>
            <groupId>org.graylog2</groupId>
            <artifactId>syslog4j</artifactId>
            <version>0.9.60</version>
        </dependency>
    </dependencies>
</project>
lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
@@ -98,6 +98,8 @@
        filterChainDefinitionMap.put("/sys/getLoginQrcode/**", "anon"); //登录二维码
        filterChainDefinitionMap.put("/sys/getQrcodeToken/**", "anon"); //监听扫码
        filterChainDefinitionMap.put("/sys/checkAuth", "anon"); //授权接口排除
        filterChainDefinitionMap.put("/sys/api/appAuth", "anon"); //网闸认证接口排除
        filterChainDefinitionMap.put("/sys/api/fileUpload", "anon"); //网闸上传文件接口排除
        filterChainDefinitionMap.put("/", "anon");
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentRunningSectionController.java
@@ -4,11 +4,14 @@
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.mdc.dto.EquipmentMachingDto;
import org.jeecg.modules.mdc.dto.MdcEquipmentRunningSectionDto;
import org.jeecg.modules.mdc.entity.MdcEquipmentRunningSection;
import org.jeecg.modules.mdc.entity.MdcNoplanClose;
import org.jeecg.modules.mdc.service.IMdcEquipmentRunningSectionService;
import org.jeecg.modules.mdc.service.IMdcEquipmentWorkLineService;
import org.jeecg.modules.mdc.vo.MdcEquipmentRunningSectionVo;
@@ -16,8 +19,10 @@
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
@@ -56,6 +61,11 @@
        }
    }
    @RequestMapping(value = "/exportLogXls")
    public ModelAndView exportXls(HttpServletRequest request, MdcEquipmentRunningSectionVo equipmentRunningSectionVo) {
        return equipmentRunningSectionService.exportXls(equipmentRunningSectionVo);
    }
    @ApiOperation(value = "设备日志-历史查询", notes = "设备日志-历史查询")
    @GetMapping("/logCharts")
    public Result<List<Map<String, Object>>> logCharts(MdcEquipmentRunningSectionVo equipmentRunningSectionVo){
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEquipmentRunningSectionDto.java
@@ -1,6 +1,10 @@
package org.jeecg.modules.mdc.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.jeecg.modules.mdc.util.DateUtils;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@@ -13,20 +17,41 @@
    /*序号*/
    private String id;
    /*状态,0:关机,1:开机,2:待机,3:工作,22:报警*/
    @Excel(name = "状态", width = 15, replace={"关机_0","开机_1","待机_2","工作_3","报警_22"})
    private Integer status;
    /*开始时间*/
    @Excel(name = "开始时间", width = 24, format = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
    private Date startTime;
    /*结束时间*/
    @Excel(name = "结束时间", width = 24, format = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date endTime;
    /*持续时间*/
    @Excel(name = "持续时间", width = 24, exportConvert = true)
    private Long duration;
    //程序号
    @Excel(name = "程序号", width = 20)
    private String sequenceNumber;
    /*设备*/
    private String equipmentId;
    /*开始时间*/
    private Date startTime;
    /*结束时间*/
    private Date endTime;
    /*时长*/
    private Long duration;
    /*状态,0:关机,1:开机,2:待机,3:工作,22:报警*/
    private Integer status;
    /*报警*/
    private String alarm;
    /*伪列 æŠ¥è­¦å†…容*/
    private String alarmContent;
    //程序号
    private String sequenceNumber;
    public String convertgetDuration(){
        return DateUtils.secondsToTime(this.duration.intValue());
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/LogTable.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package org.jeecg.modules.mdc.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
 * @author Lius
 * @date 2024/12/18 14:19
 */
@Data
@TableName("log_table")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "log_table对象", description = "sql记录表")
public class LogTable implements Serializable {
    private static final long serialVersionUID = 953864495681756550L;
    /**
     * æ“ä½œç±»åž‹ï¼ˆINSERT / UPDATE / DELETE)
     */
    private String action;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private Date createTime;
    /**
     * sql记录
     */
    private String sqlLog;
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/ExportToXmlJob.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package org.jeecg.modules.mdc.job;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.util.DateUtils;
import org.jeecg.modules.mdc.service.ILogTableService;
import org.jeecg.modules.mdc.util.ThrowableUtil;
import org.jeecg.modules.quartz.entity.QuartzJob;
import org.jeecg.modules.quartz.entity.SysQuartzLog;
import org.jeecg.modules.quartz.service.IQuartzJobService;
import org.jeecg.modules.quartz.service.ISysQuartzLogService;
import org.jeecg.modules.system.service.ISysAnnouncementService;
import org.quartz.*;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
/**
 * å¯¼å‡ºsql记录到xml文件任务
 * @author Lius
 * @date 2024/12/18 14:53
 */
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
@Slf4j
public class ExportToXmlJob implements Job {
    @Resource
    private ISysQuartzLogService sysQuartzLogService;
    @Resource
    private IQuartzJobService quartzJobService;
    @Resource
    private ISysAnnouncementService sysAnnouncementService;
    @Resource
    private ILogTableService logTableService;
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        SysQuartzLog quartzLog = new SysQuartzLog();
        quartzLog.setCreateTime(new Date());
        List<QuartzJob> byJobClassName = this.quartzJobService.findByJobClassName(this.getClass().getName());
        if (byJobClassName != null && !byJobClassName.isEmpty()) {
            quartzLog.setJobId(byJobClassName.get(0).getId());
        }
        log.info("定时导出同步数据表sql任务 ExportToXmlJob start!  æ—¶é—´:" + DateUtils.now());
        long startTime = System.currentTimeMillis();
        try {
            logTableService.exportDataToXml();
            quartzLog.setIsSuccess(0);
        } catch (Exception e) {
            quartzLog.setIsSuccess(-1);
            quartzLog.setExceptionDetail(ThrowableUtil.getStackTrace(e));
            // å‘送消息通知
            sysAnnouncementService.jobSendMessage("定时导出同步数据表sql任务", quartzLog.getExceptionDetail());
        }
        long endTime = System.currentTimeMillis();
        quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
        sysQuartzLogService.save(quartzLog);
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/ImportXmlToDataJob.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package org.jeecg.modules.mdc.job;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.util.DateUtils;
import org.jeecg.modules.mdc.service.ILogTableService;
import org.jeecg.modules.mdc.util.ThrowableUtil;
import org.jeecg.modules.quartz.entity.QuartzJob;
import org.jeecg.modules.quartz.entity.SysQuartzLog;
import org.jeecg.modules.quartz.service.IQuartzJobService;
import org.jeecg.modules.quartz.service.ISysQuartzLogService;
import org.jeecg.modules.system.service.ISysAnnouncementService;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
/**
 * @author Lius
 * @date 2024/12/19 16:43
 */
@Slf4j
public class ImportXmlToDataJob implements Job {
    @Resource
    private ISysQuartzLogService sysQuartzLogService;
    @Resource
    private IQuartzJobService quartzJobService;
    @Resource
    private ISysAnnouncementService sysAnnouncementService;
    @Resource
    private ILogTableService logTableService;
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        SysQuartzLog quartzLog = new SysQuartzLog();
        quartzLog.setCreateTime(new Date());
        List<QuartzJob> byJobClassName = this.quartzJobService.findByJobClassName(this.getClass().getName());
        if (byJobClassName != null && !byJobClassName.isEmpty()) {
            quartzLog.setJobId(byJobClassName.get(0).getId());
        }
        log.info("定时导入sql数据任务 ImportXmlToDataJob start!  æ—¶é—´:" + DateUtils.now());
        long startTime = System.currentTimeMillis();
        try {
            logTableService.importXmlToData();
            quartzLog.setIsSuccess(0);
        } catch (Exception e) {
            quartzLog.setIsSuccess(-1);
            quartzLog.setExceptionDetail(ThrowableUtil.getStackTrace(e));
            // å‘送消息通知
            sysAnnouncementService.jobSendMessage("定时导入sql数据任务", quartzLog.getExceptionDetail());
        }
        long endTime = System.currentTimeMillis();
        quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
        sysQuartzLogService.save(quartzLog);
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/TransferTableDataJob.java
@@ -62,11 +62,8 @@
                    if (StringUtils.isNotBlank(tableName)) {
                        String backupTableName = equipmentService.checkTableExists(equipment.getSavetablename() + "_backup");
                        if (StringUtils.isNotBlank(backupTableName)) {
                            Integer num = equipmentService.checkTableDataNum(equipment.getSavetablename(), day);
                            if (num > 0) {
                                equipmentService.insertTableData(backupTableName, tableName, day);
                                equipmentService.deleteTableData(tableName, day);
                            }
                            equipmentService.insertTableData(backupTableName, tableName, day);
                            equipmentService.deleteTableData(tableName, day);
                        } else {
                            //备份表不存在创建备份表并迁移数据
                            equipmentService.insertNoTableData(tableName + "_backup", tableName, day);
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/LogTableMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package org.jeecg.modules.mdc.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.jeecg.modules.mdc.entity.LogTable;
/**
 * @author Lius
 * @date 2024/12/18 14:24
 */
public interface LogTableMapper extends BaseMapper<LogTable>  {
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentStatisticalInfoMapper.java
@@ -25,4 +25,6 @@
     * @return
     */
    Integer selectProcessLong(@Param("equipmentId") String equipmentId, @Param("validDate") String validDate);
    MdcEquipmentStatisticalInfo findMdcEquipmentStatisticalInfo(@Param("equipmentId") String equipmentId, @Param("data") String data);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/LogTableMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
<?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="org.jeecg.modules.mdc.mapper.LogTableMapper">
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRunningSectionMapper.xml
@@ -38,6 +38,7 @@
            mdc_equipment_running_section
        WHERE
            equipment_id = #{ equipmentId }
            AND status <![CDATA[ <> ]]> '22'
            AND  (start_long &lt;= #{ endLong } AND end_long &gt;= #{ startLong })
        ORDER BY
            start_time
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentStatisticalInfoMapper.xml
@@ -12,4 +12,8 @@
    <select id="selectProcessLong" resultType="java.lang.Integer">
        SELECT TOP 1 process_long FROM mdc_equipment_statistical_info WHERE equipment_id = #{equipmentId} AND the_date = #{validDate}
    </select>
    <select id="findMdcEquipmentStatisticalInfo" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalInfo">
        SELECT TOP 1 * FROM mdc_equipment_statistical_info WHERE equipment_id = #{equipmentId} AND the_date = #{data}
    </select>
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/ILogTableService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package org.jeecg.modules.mdc.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.mdc.entity.LogTable;
/**
 * @author Lius
 * @date 2024/12/18 14:29
 */
public interface ILogTableService extends IService<LogTable> {
    /**
     * å¯¼å‡ºåŒæ­¥æ•°æ®è¡¨sql到xml文件上传到网闸服务器
     */
    void exportDataToXml();
    /**
     * å¯¼å…¥åŒæ­¥æ•°æ®sql执行到数据库
     */
    void importXmlToData();
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRunningSectionService.java
@@ -6,6 +6,7 @@
import org.jeecg.modules.mdc.entity.MdcEquipmentRunningSection;
import org.jeecg.modules.mdc.vo.MdcAlarmAnalyzeQueryVo;
import org.jeecg.modules.mdc.vo.MdcEquipmentRunningSectionVo;
import org.springframework.web.servlet.ModelAndView;
import java.util.Date;
import java.util.List;
@@ -88,4 +89,9 @@
    List<Integer> getDataList(String equipmentId, Date date);
    /**
     * å¯¼å‡º
     */
    ModelAndView exportXls(MdcEquipmentRunningSectionVo equipmentRunningSectionVo);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentStatisticalInfoService.java
@@ -26,4 +26,13 @@
     * @return
     */
    Integer selectProcessLong(String equipmentId, String validDate);
    /**
     * æ ¹æ®è®¾å¤‡ç¼–号和日期查询运行数据
     *
     * @param equipmentId
     * @param date
     * @return
     */
    MdcEquipmentStatisticalInfo findMdcEquipmentStatisticalInfo(String equipmentId, String date);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/LogTableServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,219 @@
package org.jeecg.modules.mdc.service.impl;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.io.file.FileWriter;
import cn.hutool.core.net.NetUtil;
import cn.hutool.crypto.SmUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import me.zhyd.oauth.log.Log;
import org.apache.commons.lang.StringUtils;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.modules.mdc.util.SqlExecutor;
import org.jeecg.modules.system.vo.SysLogTypeObjectDto;
import org.jeecg.modules.mdc.entity.LogTable;
import org.jeecg.modules.system.entity.MdcPassLog;
import org.jeecg.modules.mdc.mapper.LogTableMapper;
import org.jeecg.modules.mdc.service.ILogTableService;
import org.jeecg.modules.system.service.IMdcPassLogService;
import org.jeecg.modules.mdc.util.DateUtils;
import org.jeecg.modules.mdc.util.FileClient;
import org.jeecg.modules.system.util.FileUtils;
import org.jeecg.modules.mdc.util.SyslogClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.File;
import java.net.InetAddress;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @author Lius
 * @date 2024/12/18 14:29
 */
@Service
public class LogTableServiceImpl extends ServiceImpl<LogTableMapper, LogTable> implements ILogTableService {
    @Value("${fileService.localFilePath}")
    private String localFilePath;
    @Value("${fileService.servicePath}")
    private String servicePath;
    @Value("${fileService.host}")
    private String host;
    @Value("${fileService.port}")
    private String port;
    @Value("${fileService.username}")
    private String username;
    @Value("${fileService.pwd}")
    private String pwd;
    @Value("${fileService.addressToken}")
    private String addressToken;
    @Value("${fileService.addressUploadFile}")
    private String addressUploadFile;
    @Value("${fileService.logIp}")
    private String logIp;
    @Value("${fileService.logPort}")
    private String logPort;
    @Value("${fileService.newFilePath}")
    private String newFilePath;
    @Resource
    private IMdcPassLogService mdcPassLogService;
    private static final String TYPE = "01";
    @Resource
    private SqlExecutor sqlExecutor;
    /**
     * å¯¼å‡ºåŒæ­¥æ•°æ®è¡¨sql到xml文件
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void exportDataToXml() {
        // step.1 æŸ¥è¯¢æœ€æ–°æ•°æ® æ—¶é—´æ­£åºæŽ’列
        List<LogTable> logTables = this.baseMapper.selectList(new LambdaQueryWrapper<LogTable>().orderByAsc(LogTable::getCreateTime));
        if (logTables != null && !logTables.isEmpty()) {
            // step.2 å¤„理数据
            List<String> sqlList = logTables.stream().map(LogTable::getSqlLog).collect(Collectors.toList());
            // step.3 å†™å…¥æ–‡ä»¶
            // step.3.1 æ–‡ä»¶å‘½å
            String today = DateUtils.format(DateUtils.getNow(), DateUtils.STRDATE);
            MdcPassLog mdcPassLogLast = mdcPassLogService.selectTodayLast(today);
            int sequenceNumber = 1;
            if (mdcPassLogLast != null) {
                sequenceNumber = mdcPassLogLast.getSequenceNumber() + 1;
            }
            // æ–‡ä»¶è·¯å¾„
            String locFilePath = localFilePath + TYPE + today + String.format("%06d", sequenceNumber) + ".xml";
            FileWriter writer = new FileWriter(locFilePath);
            writer.writeLines(sqlList);
            // step.4 æŽ¨é€ç½‘é—¸
            // step.4.1 æµ‹è¯•服务器连通性
            boolean ping = NetUtil.ping(host + ":" + port);
            if (!ping) {
                FileUtil.del(locFilePath);
                throw new JeecgBootException("服务器连接: " + host + ":" + port + " å¼‚常!");
            }
            // step.4.2 èŽ·å–token
            String token = "";
            try {
                token = FileClient.getToken(host, port, username, pwd, addressToken);
            } catch (Throwable e) {
                throw new JeecgBootException("获取token失败!");
            }
            // step 4.3 è°ƒç”¨æ–‡ä»¶ä¸Šä¼ æŽ¥å£
            if (StringUtils.isNotBlank(token)) {
                try {
                    File[] files = FileUtil.ls(localFilePath);
                    for (File file : files) {
                        if (file.isFile()) {
                            SysLogTypeObjectDto objectName = new SysLogTypeObjectDto();
                            objectName.setDateTime(DateUtils.format(DateUtils.getNow(), DateUtils.STR_DATE_TIME_SMALL));
                            objectName.setFileName(file.getName());
                            objectName.setFileSize(FileUtils.changeFileFormatKb(String.valueOf(new File(localFilePath).length())));
                            objectName.setSourceAddress(localFilePath);
                            String sm3 = SmUtil.sm3(file);
                            objectName.setAbstract1(sm3);
                            //顺序号
                            String fileName = file.getName();
                            String sequenceOrder = fileName.substring(fileName.length() - 10, fileName.length() - 4);
                            String dayTime = fileName.substring(fileName.length() - 18, fileName.length() - 10);
                            int sequenceNum = Integer.parseInt(sequenceOrder);
                            objectName.setFileNum(Integer.toString(sequenceNum));
                            // æ’入传输日志
                            MdcPassLog mdcPassLog = new MdcPassLog();
                            mdcPassLog.setPassLogFileName(file.getAbsolutePath());
                            mdcPassLog.setPassName(fileName);
                            mdcPassLog.setDayTime(dayTime);
                            mdcPassLog.setSequenceNumber(sequenceNum);
                            mdcPassLog.setSequenceOrder(sequenceOrder);
                            mdcPassLogService.save(mdcPassLog);
                            String ip = InetAddress.getLocalHost().getHostAddress();
                            if (StringUtils.isBlank(ip)) {
                                objectName.setSourceAddress("10.118.10.62");
                                objectName.setAddress("10.118.10.62");
                            } else {
                                objectName.setSourceAddress(ip);
                                objectName.setAddress(ip);
                            }
                            objectName.setDestination(host);
                            objectName.setResult("失败");
                            // æœ¬åœ°æ–‡ä»¶è·¯å¾„
                            String loFilePath = localFilePath + "\\" + file.getName();
                            // ç›®æ ‡æ–‡ä»¶è·¯å¾„
                            String servicePathName = servicePath + "\\" + file.getName();
                            String result = FileClient.uploadFile(host, port, token, file.getName(), servicePathName, loFilePath, addressUploadFile);
                            if ("成功".equals(result)) {
                                FileUtil.del(loFilePath);
                                objectName.setResult("成功");
                                SyslogClient.sendClient(logIp, Integer.valueOf(logPort), objectName.toString());
                            } else {
                                objectName.setResult(result);
                                objectName.setTypes("error");
                                SyslogClient.sendClient(logIp, Integer.valueOf(logPort), objectName.toString());
                            }
                        }
                    }
                } catch (Throwable e) {
                    throw new JeecgBootException("调用文件上传接口失败!");
                }
            }
            // step.5 åˆ é™¤å·²ç»å†™å…¥æ–‡ä»¶å¹¶å‘送至网闸的数据
            // step.5.1 åˆ é™¤æ•°æ®åº“数据
            this.baseMapper.delete(new LambdaQueryWrapper<LogTable>().le(LogTable::getCreateTime, logTables.get(logTables.size() - 1).getCreateTime()));
        }
    }
    /**
     * å¯¼å…¥åŒæ­¥æ•°æ®sql执行到数据库
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void importXmlToData() {
        File[] files = FileUtil.ls(localFilePath);
        for (File file : files) {
            if (file.isFile()) {
                String loFilePath = localFilePath + "\\" + file.getName();
                FileReader fileReader = new FileReader(loFilePath);
                String sqlList = fileReader.readString();
                try {
                    sqlExecutor.execute(sqlList);
                } catch (Exception e) {
                    throw new JeecgBootException("执行sql失败!");
                }
                // å¤‡ä»½
                FileUtil.move(new File(loFilePath), new File(newFilePath + "\\" + file.getName()), true);
            }
        }
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java
@@ -54,6 +54,9 @@
    @Resource
    private IMdcEquipmentRunningSectionService mdcEquipmentRunningSectionService;
    @Resource
    private IMdcEquipmentStatisticalInfoService mdcEquipmentStatisticalInfoService;
    /**
     * åˆ©ç”¨çŽ‡æŠ¥è¡¨
     *
@@ -1696,10 +1699,7 @@
                    List<MdcUtilizationResultDto> list = new ArrayList<>();
                    for (String date : dateList) {
                        Date startTime = DateUtils.toDate(date + " 00:00:00", DateUtils.STR_DATE_TIME_SMALL);
                        Date endTime = DateUtils.toDate(date + " 00:00:00", DateUtils.STR_DATE_TIME_SMALL);
                        endTime = DateUtils.addDays(endTime, 1);
                        list.add(this.utilizationRate(mdcEquDepDto.getEquipmentId(), mdcEquDepDto.getEquipmentName(), mdcEquDepDto.getEquipmentType(), startTime, endTime, date, mdcUtilizationRateList));
                        list.add(this.utilizationRateTrend(mdcEquDepDto.getEquipmentId(), mdcEquDepDto.getEquipmentName(), mdcEquDepDto.getEquipmentType(), date, mdcUtilizationRateList));
                    }
                    mdcEfficiencyListDto.setDataList(list);
                    listDtos.add(mdcEfficiencyListDto);
@@ -1716,10 +1716,7 @@
                    mdcEfficiencyListDto.setEquipmentType(mdcEquProDto.getEquipmentType());
                    List<MdcUtilizationResultDto> list = new ArrayList<>();
                    for (String date : dateList) {
                        Date startTime = DateUtils.toDate(date + " 00:00:00", DateUtils.STR_DATE_TIME_SMALL);
                        Date endTime = DateUtils.toDate(date + " 00:00:00", DateUtils.STR_DATE_TIME_SMALL);
                        endTime = DateUtils.addDays(endTime, 1);
                        list.add(this.utilizationRate(mdcEquProDto.getEquipmentId(), mdcEquProDto.getEquipmentName(), mdcEquProDto.getEquipmentType(), startTime, endTime, date, mdcUtilizationRateList));
                        list.add(this.utilizationRateTrend(mdcEquProDto.getEquipmentId(), mdcEquProDto.getEquipmentName(), mdcEquProDto.getEquipmentType(), date, mdcUtilizationRateList));
                    }
                    mdcEfficiencyListDto.setDataList(list);
                    listDtos.add(mdcEfficiencyListDto);
@@ -1731,6 +1728,30 @@
        return result;
    }
    private MdcUtilizationResultDto utilizationRateTrend(String equipmentId, String equipmentName, String equipmentType, String date, List<MdcUtilizationRate> mdcUtilizationRateList) {
        MdcUtilizationResultDto dto = new MdcUtilizationResultDto();
        dto.setEquipmentId(equipmentId);
        dto.setEquipmentName(equipmentName);
        dto.setEquipmentType(equipmentType);
        dto.setTheDate(date);
        MdcEquipmentStatisticalInfo mdcEquipmentStatisticalInfo = mdcEquipmentStatisticalInfoService.findMdcEquipmentStatisticalInfo(equipmentId, date);
        if (mdcEquipmentStatisticalInfo != null) {
            dto.setUtilizationRate(mdcEquipmentStatisticalInfo.getProcessLong().divide(new BigDecimal("86400"), 6, RoundingMode.HALF_UP));
        } else {
            dto.setUtilizationRate(new BigDecimal("0"));
        }
        long rate = dto.getUtilizationRate().multiply(new BigDecimal("100")).longValue();
        for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
            if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) {
                dto.setColor(mdcUtilizationRate.getRateParameterColor());
            }
        }
        if (StringUtils.isBlank(dto.getColor())) {
            dto.setColor(mdcUtilizationRateList.get(mdcUtilizationRateList.size() - 1).getRateParameterColor());
        }
        return dto;
    }
    @Override
    public List<BigDecimal> getEfficiencyRate(String equipmentId, String date) {
        return mdcEfficiencyReportMapper.getEfficiencyRate(equipmentId, date);
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java
@@ -3,7 +3,9 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.system.vo.DictModel;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.mdc.dto.EquipmentMachingDto;
import org.jeecg.modules.mdc.dto.MdcAlarmListDto;
import org.jeecg.modules.mdc.dto.MdcEquipmentRunningSectionDto;
@@ -15,9 +17,13 @@
import org.jeecg.modules.mdc.vo.MdcAlarmAnalyzeQueryVo;
import org.jeecg.modules.mdc.vo.MdcEquipmentRunningSectionVo;
import org.jeecg.modules.system.service.ISysDictService;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import java.util.*;
@@ -99,17 +105,6 @@
                        }
                    }
                }
//                Set<TmpEquipmentAlarm> set = entity.getTmpEquipmentAlarmSet();
//                if (entity.getStatus() == 22 && set != null && !set.isEmpty()) {
//                    Iterator<TmpEquipmentAlarm> iterator = entity.getTmpEquipmentAlarmSet().iterator();
//                    //获取报警编号相同的报警信息
//                    while (iterator.hasNext()) {
//                        TmpEquipmentAlarm next = iterator.next();
//                        if (StringUtils.isNotBlank(next.getAlarmNo()) && next.getAlarmNo().equals(entity.getStatus())) {
//                            dto.setAlarmContent(next.getAlarmContent());
//                        }
//                    }
//                }
                dtos.add(dto);
            }
        }
@@ -136,7 +131,7 @@
            if (!a.getStatus().equals(b.getStatus()) && a.getEndTime().equals(b.getStartTime())) {
                result.add(dtos.get(dtos.size() - 1));
            }
        } else if (dtos.size() == 1){
        } else if (dtos.size() == 1) {
            result.addAll(dtos);
        }
@@ -570,6 +565,7 @@
    /**
     * æ•°æ®åŒæ­¥å¤„理
     *
     * @param list
     * @param errorList
     */
@@ -740,6 +736,22 @@
        return this.baseMapper.getDataList(equipmentId, date);
    }
    /**
     * å¯¼å‡º
     */
    @Override
    public ModelAndView exportXls(MdcEquipmentRunningSectionVo equipmentRunningSectionVo) {
        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
        List<MdcEquipmentRunningSectionDto> mdcEquipmentRunningSectionDtos = this.logList(equipmentRunningSectionVo);
        // å¯¼å‡ºæ–‡ä»¶åç§°
        mv.addObject(NormalExcelConstants.FILE_NAME, "设备日志");
        mv.addObject(NormalExcelConstants.CLASS, MdcEquipmentRunningSectionDto.class);
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("设备日志列表数据", "导出人:" + user.getRealname(), "设备日志"));
        mv.addObject(NormalExcelConstants.DATA_LIST, mdcEquipmentRunningSectionDtos);
        return mv;
    }
    private Map<String, List<MdcEquipmentRunningSectionDto>> logCharts(MdcEquipmentRunningSectionVo equipmentRunningSectionVo, String date) {
        Map<String, List<MdcEquipmentRunningSectionDto>> map = new HashMap<>();
        List<MdcEquipmentRunningSectionDto> normal = new ArrayList<>();
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java
@@ -94,6 +94,11 @@
        }
    }
    @Override
    public MdcEquipmentStatisticalInfo findMdcEquipmentStatisticalInfo(String equipmentId, String date) {
        return this.baseMapper.findMdcEquipmentStatisticalInfo(equipmentId, date.replaceAll("-", ""));
    }
    private List<EquipmentStatisticalInfo> dataHandle(List<MdcEquipmentStatisticalInfo> list) {
        List<EquipmentStatisticalInfo> result = new ArrayList<>();
        list.forEach(item -> {
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/util/DateUtils.java
@@ -1079,4 +1079,23 @@
        return dateString;
    }
    /**
     * ç§’转化为时分秒
     *
     * @param seconds
     * @return
     */
    public static String secondsToTime(int seconds) {
        int hours = seconds / 3600;
        int minutes = (seconds % 3600) / 60;
        int sec = seconds % 60;
        // å°†å°æ—¶ã€åˆ†é’Ÿå’Œç§’转换为两位数格式
        String formattedHours = String.format("%02d", hours);
        String formattedMinutes = String.format("%02d", minutes);
        String formattedSeconds = String.format("%02d", sec);
        return formattedHours + "小时" + formattedMinutes + "分" + formattedSeconds + "秒";
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/util/FileClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,227 @@
package org.jeecg.modules.mdc.util;
import cn.hutool.crypto.SmUtil;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.FileEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.jeecg.modules.system.util.SM3Util;
import java.io.File;
import java.net.URLEncoder;
/**
 * @author clown
 * * @date 2023/11/14
 */
@Slf4j
public class FileClient {
    public static String getToken(String host, String port, String userName, String pwd,String address) throws Exception, Throwable {
        CloseableHttpClient client = null;
        CloseableHttpResponse response = null;
        try {
            ObjectMapper objectMapper = new ObjectMapper();
            JSONObject jsonObject = new JSONObject();
            //构造请求参数appId和password
            jsonObject.put("appId", userName);
            //将密码通过SM3加密
            jsonObject.put("password", SM3Util.encrypt(pwd));
            String str = objectMapper.writeValueAsString(jsonObject);
            StringEntity stringEntity = new StringEntity(str);
            //构造http请求
            String url = "http" + "://" + host + ":" + port + "/" + address;
            HttpPost httpPost = new HttpPost(url);
            //设置Content-Type
            httpPost.setHeader(HTTP.CONTENT_TYPE, "application/json");
            //Content-length会在请求自动自动加上
            //将构造好的参数放入请求中
            httpPost.setEntity(stringEntity);
            //设置请求超时时间
            RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectTimeout(5000).setConnectionRequestTimeout(5000)
                    .setSocketTimeout(5000).build();
            httpPost.setConfig(requestConfig);
            //发起请求
            client = HttpClients.createDefault();
            response = client.execute(httpPost);
            //解析请求的response
            if (response.getStatusLine().getStatusCode() == 200) {
                HttpEntity entity = response.getEntity();
                String result = EntityUtils.toString(entity, "UTF-8");
                JSONObject jobject = JSONObject.parseObject(result);
                int code = jobject.getIntValue("code");
                String token = jobject.getString("token");
                String message = jobject.getString("msg");
                if (200 != code) {
                    throw new Exception("appAuth Error,code[" + code + "],message[" + message + "]");
                } else {
                    //若请求成功,返回token
                    return token;
                }
            } else {
                throw new Exception("appAuth Error:" + response.getStatusLine().toString());
            }
        } catch (Throwable e) {
            throw e;
        } finally {
            if (response != null) {
                try {
                    response.close();
                } catch (Throwable t) {
                }
            }
            if (client != null) {
                try {
                    client.close();
                } catch (Throwable t) {
                }
            }
        }
    }
    //uploadFile()
    /**
     *
     * @param host
     * @param port
     * @param token
     * @param remoteFilePath
     * @param localFilePath
     * @param addressUploadFile
     * @return
     * @throws Exception
     * @throws Throwable
     */
    public static String uploadFile(String host, String port, String token,String fileName, String remoteFilePath, String localFilePath,String addressUploadFile) throws Exception, Throwable {
        CloseableHttpClient client = null;
        CloseableHttpResponse response = null;
        try {
            //拼接请求的url
            String url = "http" + "://" + host + ":" + port + "/" + addressUploadFile;
            //构造请求
            HttpPost httpPost = new HttpPost(url);
            //设置Content-Type为文件流格式
            httpPost.setHeader(HTTP.CONTENT_TYPE, "application/octet-stream");
            //设置header的请求参数
            httpPost.addHeader("Accept", "*/*");
            httpPost.addHeader("Accept-Encoding", "UTF-8");
            httpPost.setHeader("Token", token);
            //FileName需要经过URLEncoder加码,防止中文乱码
            httpPost.setHeader("FileName", URLEncoder.encode(remoteFilePath, "UTF-8"));
            /*文件大小*/
            httpPost.setHeader("WenjianqIcaoren", URLEncoder.encode("谭政", "UTF-8"));
            httpPost.setHeader("Shenpiren", URLEncoder.encode("陈海波", "UTF-8"));
            httpPost.setHeader("Miji", URLEncoder.encode("内部", "UTF-8"));
            httpPost.addHeader("Baomiqixian", "10,12,30");
            httpPost.addHeader("Qianfaren", URLEncoder.encode("陈海波", "UTF-8"));
            File file = new File(localFilePath);
            if (!file.exists()){
                httpPost.addHeader("Wenjiansanliezhi", "1");
            } else {
                String sm3 = SmUtil.sm3(file);
                httpPost.addHeader("Wenjiansanliezhi", sm3);
            }
            httpPost.addHeader("Beizhu", URLEncoder.encode("无", "UTF-8"));
            //将对应上传的本地文件解析成文件流放入body
            httpPost.setEntity(new FileEntity(new File(localFilePath)));
            //根据文件大小设置超时时间
            int timeout = (int) ((new File(localFilePath).length() / (1000)) * 2 + 2000);
            //设置超时时间
            RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectTimeout(5000).setConnectionRequestTimeout(5000)
                    .setSocketTimeout(timeout).build();
            httpPost.setConfig(requestConfig);
            //请求构造完成,发起请求
            client = HttpClients.createDefault();
            response = client.execute(httpPost);
            //解析response
            if (response.getStatusLine().getStatusCode() == 200) {
                HttpEntity entity = response.getEntity();
                // log.info(entity);
                String result = EntityUtils.toString(entity, "UTF-8");
                JSONObject jobject = JSONObject.parseObject(result);
                int code = jobject.getIntValue("code");
                String message = jobject.getString("msg");
                if (200 != code) {
                    //
                    log.info( "code: "+ code +"  message: " + message);
                    if (response != null) {
                        try {
                            response.close();
                        } catch (Throwable t) {
                        }
                    }
                    if (client != null) {
                        try {
                            client.close();
                        } catch (Throwable t) {
                        }
                    }
                    return "失败";
                }
                return "成功";
            } else {
                //
                log.info( response.getStatusLine().toString());
                if (response != null) {
                    try {
                        response.close();
                    } catch (Throwable t) {
                    }
                }
                if (client != null) {
                    try {
                        client.close();
                    } catch (Throwable t) {
                    }
                }
                return "失败";
            }
        } catch (Throwable e) {
            //throw e;
            System.out.println( e.toString());
            if (response != null) {
                try {
                    response.close();
                } catch (Throwable t) {
                }
            }
            if (client != null) {
                try {
                    client.close();
                } catch (Throwable t) {
                }
            }
            return "失败";
        } finally {
            if (response != null) {
                try {
                    response.close();
                } catch (Throwable t) {
                }
            }
            if (client != null) {
                try {
                    client.close();
                } catch (Throwable t) {
                }
            }
        }
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/util/SqlExecutor.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package org.jeecg.modules.mdc.util;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.jdbc.SqlRunner;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
 * @author Lius
 * @date 2025/1/3 13:26
 */
@Component
public class SqlExecutor {
    @Resource
    private SqlSessionFactory sqlSessionFactory;
    public void execute(String sql) {
        try (SqlSession sqlSession = sqlSessionFactory.openSession(true)) {
            SqlRunner runner = new SqlRunner(sqlSession.getConnection());
            runner.run(sql);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("Error executing SQL: " + sql, e);
        }
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/util/SyslogClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package org.jeecg.modules.mdc.util;
import lombok.extern.slf4j.Slf4j;
import org.graylog2.syslog4j.Syslog;
import org.graylog2.syslog4j.SyslogIF;
import java.net.URLDecoder;
/**
 * @author clown
 * * @date 2023/12/17
 */
@Slf4j
public class SyslogClient {
    private static final String MESSAGE = "charset=utf-8 logType=通知 instanceName=实例1 taskName=任务2" +
            " logLevel=告警 objectName=对象1 desc=明细1 result=成功 date=2023-10-30 00:21:00";
    public static void send(String ip, Integer port) {
        try {
            // èŽ·å–syslog的操作类,使用udp协议。syslog支持"udp", "tcp"协议
            SyslogIF syslog = Syslog.getInstance("udp");
            // è®¾ç½®syslog服务器端地址和端口
            syslog.getConfig().setHost(ip);
            syslog.getConfig().setPort(port);
            //发送信息到服务器,2表示日志级别 èŒƒå›´ä¸º0~7的数字编码,表示了事件的严重程度。0最高,7最低
            syslog.log(0, URLDecoder.decode(MESSAGE, "utf-8"));
            log.info("发送成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static Boolean sendClient(String ip, Integer port, String messageClient) {
        try {
            log.info(messageClient);
            // èŽ·å–syslog的操作类,使用udp协议。syslog支持"udp", "tcp"协议
            SyslogIF syslog = Syslog.getInstance("tcp");
            // è®¾ç½®syslog服务器端地址和端口
            syslog.getConfig().setHost(ip);
            syslog.getConfig().setPort(port);
            //发送信息到服务器,2表示日志级别 èŒƒå›´ä¸º0~7的数字编码,表示了事件的严重程度。0最高,7最低
            syslog.log(0, URLDecoder.decode(messageClient, "utf-8"));
            log.info("发送成功");
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}
lxzn-module-mdc/src/test/java/org/lxzn/TestOne.java
@@ -1,8 +1,15 @@
package org.lxzn;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.io.file.FileWriter;
import org.apache.commons.lang.StringUtils;
import org.jeecg.modules.mdc.util.DateUtils;
import org.jeecg.modules.system.util.SM3Util;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.*;
@@ -388,4 +395,76 @@
        System.out.println(startDate);
    }
    @Test
    public void test45() {
        List<Integer> list= new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        int i = 2;
        for (Integer integer : list) {
            if (integer == i) {
                continue;
            }
            System.out.println(integer);
        }
    }
    @Test
    public void test46() {
        String date = LocalDate.now().minusDays(1).toString();
        System.out.println(date);
    }
    @Test
    public void test47() {
        String date = LocalDate.now().minusDays(1).toString();
        String replace = date.replace("-", "");
        System.out.println(replace);
    }
    @Test
    public void test48() throws IOException {
        List<String> list = new ArrayList<>();
        list.add("test1");
        list.add("test2");
        FileWriter writer = new FileWriter("D:\\data\\test.xml");
        writer.writeLines(list);
    }
    @Test
    public void test49() {
        String token = "";
        if (StringUtils.isNotBlank(token)) {
            System.out.println("不为空");
        } else {
            System.out.println("为空");
        }
    }
    @Test
    public void test50() {
        String fileName = "0120241224000001.xml";
        String substring = fileName.substring(fileName.length() - 10, fileName.length() - 4);
        String substring2 = fileName.substring(fileName.length() - 18, fileName.length() - 10);
        System.out.println(substring);
        System.out.println(substring2);
    }
    @Test
    public void test51() {
        String pwd = "123";
        String encrypt = SM3Util.encrypt(pwd);
        System.out.println(encrypt);
    }
    @Test
    public void test52() {
        String loFilePath = "D:\\data\\0120241226000001.xml";
        FileReader fileReader = new FileReader(loFilePath);
        String s1 = fileReader.readString();
        System.out.println(s1);
    }
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/api/controller/SystemApiController.java
@@ -2,18 +2,33 @@
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.jeecg.common.api.dto.DataLogDTO;
import org.jeecg.common.api.dto.OnlineAuthDTO;
import org.jeecg.common.api.dto.message.*;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.vo.*;
import org.jeecg.common.util.SqlInjectionUtil;
import org.jeecg.modules.system.entity.MdcPassLog;
import org.jeecg.modules.system.security.DictQueryBlackListHandler;
import org.jeecg.modules.system.service.IMdcPassLogService;
import org.jeecg.modules.system.service.ISysUserService;
import org.jeecg.modules.system.service.impl.SysBaseApiImpl;
import org.jeecg.modules.system.util.JwTUtil;
import org.jeecg.modules.system.util.SM3Util;
import org.jeecg.modules.system.vo.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -21,12 +36,19 @@
/**
 * æœåŠ¡åŒ– system模块 å¯¹å¤–接口请求类
 *
 * @author: jeecg-boot
 */
@Slf4j
@RestController
@RequestMapping("/sys/api")
public class SystemApiController {
    @Value("${fileService.username}")
    private String username;
    @Value("${fileService.pwd}")
    private String pwd;
    @Autowired
    private SysBaseApiImpl sysBaseApi;
@@ -36,50 +58,58 @@
    @Autowired
    private DictQueryBlackListHandler dictQueryBlackListHandler;
    @Resource
    private IMdcPassLogService mdcPassLogService;
    /**
     * å‘送系统消息
     *
     * @param message ä½¿ç”¨æž„造器赋值参数 å¦‚果不设置category(消息类型)则默认为2 å‘送系统消息
     */
    @PostMapping("/sendSysAnnouncement")
    public void sendSysAnnouncement(@RequestBody MessageDTO message){
    public void sendSysAnnouncement(@RequestBody MessageDTO message) {
        sysBaseApi.sendSysAnnouncement(message);
    }
    /**
     * å‘送消息 é™„带业务参数
     *
     * @param message ä½¿ç”¨æž„造器赋值参数
     */
    @PostMapping("/sendBusAnnouncement")
    public void sendBusAnnouncement(@RequestBody BusMessageDTO message){
    public void sendBusAnnouncement(@RequestBody BusMessageDTO message) {
        sysBaseApi.sendBusAnnouncement(message);
    }
    /**
     * é€šè¿‡æ¨¡æ¿å‘送消息
     *
     * @param message ä½¿ç”¨æž„造器赋值参数
     */
    @PostMapping("/sendTemplateAnnouncement")
    public void sendTemplateAnnouncement(@RequestBody TemplateMessageDTO message){
    public void sendTemplateAnnouncement(@RequestBody TemplateMessageDTO message) {
        sysBaseApi.sendTemplateAnnouncement(message);
    }
    /**
     * é€šè¿‡æ¨¡æ¿å‘送消息 é™„带业务参数
     *
     * @param message ä½¿ç”¨æž„造器赋值参数
     */
    @PostMapping("/sendBusTemplateAnnouncement")
    public void sendBusTemplateAnnouncement(@RequestBody BusTemplateMessageDTO message){
    public void sendBusTemplateAnnouncement(@RequestBody BusTemplateMessageDTO message) {
        sysBaseApi.sendBusTemplateAnnouncement(message);
    }
    /**
     * é€šè¿‡æ¶ˆæ¯ä¸­å¿ƒæ¨¡æ¿ï¼Œç”ŸæˆæŽ¨é€å†…容
     *
     * @param templateDTO ä½¿ç”¨æž„造器赋值参数
     * @return
     */
    @PostMapping("/parseTemplateByCode")
    public String parseTemplateByCode(@RequestBody TemplateDTO templateDTO){
    public String parseTemplateByCode(@RequestBody TemplateDTO templateDTO) {
        return sysBaseApi.parseTemplateByCode(templateDTO);
    }
@@ -87,85 +117,94 @@
     * æ ¹æ®ä¸šåŠ¡ç±»åž‹busType及业务busId修改消息已读
     */
    @GetMapping("/updateSysAnnounReadFlag")
    public void updateSysAnnounReadFlag(@RequestParam("busType") String busType, @RequestParam("busId")String busId){
    public void updateSysAnnounReadFlag(@RequestParam("busType") String busType, @RequestParam("busId") String busId) {
        sysBaseApi.updateSysAnnounReadFlag(busType, busId);
    }
    /**
     * æ ¹æ®ç”¨æˆ·è´¦å·æŸ¥è¯¢ç”¨æˆ·ä¿¡æ¯
     *
     * @param username
     * @return
     */
    @GetMapping("/getUserByName")
    public LoginUser getUserByName(@RequestParam("username") String username){
    public LoginUser getUserByName(@RequestParam("username") String username) {
        return sysBaseApi.getUserByName(username);
    }
    /**
     * æ ¹æ®ç”¨æˆ·id查询用户信息
     *
     * @param id
     * @return
     */
    @GetMapping("/getUserById")
    LoginUser getUserById(@RequestParam("id") String id){
    LoginUser getUserById(@RequestParam("id") String id) {
        return sysBaseApi.getUserById(id);
    }
    /**
     * é€šè¿‡ç”¨æˆ·è´¦å·æŸ¥è¯¢è§’色集合
     *
     * @param username
     * @return
     */
    @GetMapping("/getRolesByUsername")
    List<String> getRolesByUsername(@RequestParam("username") String username){
    List<String> getRolesByUsername(@RequestParam("username") String username) {
        return sysBaseApi.getRolesByUsername(username);
    }
    /**
     * é€šè¿‡ç”¨æˆ·è´¦å·æŸ¥è¯¢éƒ¨é—¨é›†åˆ
     *
     * @param username
     * @return éƒ¨é—¨ id
     */
    @GetMapping("/getDepartIdsByUsername")
    List<String> getDepartIdsByUsername(@RequestParam("username") String username){
    List<String> getDepartIdsByUsername(@RequestParam("username") String username) {
        return sysBaseApi.getDepartIdsByUsername(username);
    }
    /**
     * é€šè¿‡ç”¨æˆ·è´¦å·æŸ¥è¯¢éƒ¨é—¨ name
     *
     * @param username
     * @return éƒ¨é—¨ name
     */
    @GetMapping("/getDepartNamesByUsername")
    List<String> getDepartNamesByUsername(@RequestParam("username") String username){
    List<String> getDepartNamesByUsername(@RequestParam("username") String username) {
        return sysBaseApi.getDepartNamesByUsername(username);
    }
    /**
     * èŽ·å–æ•°æ®å­—å…¸
     *
     * @param code
     * @return
     */
    @GetMapping("/queryDictItemsByCode")
    List<DictModel> queryDictItemsByCode(@RequestParam("code") String code){
    List<DictModel> queryDictItemsByCode(@RequestParam("code") String code) {
        return sysBaseApi.queryDictItemsByCode(code);
    }
    /**
     * èŽ·å–æœ‰æ•ˆçš„æ•°æ®å­—å…¸
     *
     * @param code
     * @return
     */
    @GetMapping("/queryEnableDictItemsByCode")
    List<DictModel> queryEnableDictItemsByCode(@RequestParam("code") String code){
    List<DictModel> queryEnableDictItemsByCode(@RequestParam("code") String code) {
        return sysBaseApi.queryEnableDictItemsByCode(code);
    }
    /** æŸ¥è¯¢æ‰€æœ‰çš„父级字典,按照create_time排序 */
    /**
     * æŸ¥è¯¢æ‰€æœ‰çš„父级字典,按照create_time排序
     */
    @GetMapping("/queryAllDict")
    List<DictModel> queryAllDict(){
    List<DictModel> queryAllDict() {
//        try{
//            //睡10秒,gateway网关5秒超时,会触发熔断降级操作
//            Thread.sleep(10000);
@@ -179,63 +218,69 @@
    /**
     * æŸ¥è¯¢æ‰€æœ‰åˆ†ç±»å­—å…¸
     *
     * @return
     */
    @GetMapping("/queryAllSysCategory")
    List<SysCategoryModel> queryAllSysCategory(){
    List<SysCategoryModel> queryAllSysCategory() {
        return sysBaseApi.queryAllSysCategory();
    }
    /**
     * æŸ¥è¯¢æ‰€æœ‰éƒ¨é—¨ ä½œä¸ºå­—典信息 id -->value,departName -->text
     *
     * @return
     */
    @GetMapping("/queryAllDepartBackDictModel")
    List<DictModel> queryAllDepartBackDictModel(){
    List<DictModel> queryAllDepartBackDictModel() {
        return sysBaseApi.queryAllDepartBackDictModel();
    }
    /**
     * èŽ·å–æ‰€æœ‰è§’è‰² å¸¦å‚
     * roleIds é»˜è®¤é€‰ä¸­è§’色
     *
     * @return
     */
    @GetMapping("/queryAllRole")
    public List<ComboModel> queryAllRole(@RequestParam(name = "roleIds",required = false)String[] roleIds){
        if(roleIds==null || roleIds.length==0){
    public List<ComboModel> queryAllRole(@RequestParam(name = "roleIds", required = false) String[] roleIds) {
        if (roleIds == null || roleIds.length == 0) {
            return sysBaseApi.queryAllRole();
        }else{
        } else {
            return sysBaseApi.queryAllRole(roleIds);
        }
    }
    /**
     * é€šè¿‡ç”¨æˆ·è´¦å·æŸ¥è¯¢è§’色Id集合
     *
     * @param username
     * @return
     */
    @GetMapping("/getRoleIdsByUsername")
    public List<String> getRoleIdsByUsername(@RequestParam("username")String username){
    public List<String> getRoleIdsByUsername(@RequestParam("username") String username) {
        return sysBaseApi.getRoleIdsByUsername(username);
    }
    /**
     * é€šè¿‡éƒ¨é—¨ç¼–号查询部门id
     *
     * @param orgCode
     * @return
     */
    @GetMapping("/getDepartIdsByOrgCode")
    public String getDepartIdsByOrgCode(@RequestParam("orgCode")String orgCode){
    public String getDepartIdsByOrgCode(@RequestParam("orgCode") String orgCode) {
        return sysBaseApi.getDepartIdsByOrgCode(orgCode);
    }
    /**
     * æŸ¥è¯¢æ‰€æœ‰éƒ¨é—¨
     *
     * @return
     */
    @GetMapping("/getAllSysDepart")
    public List<SysDepartModel> getAllSysDepart(){
    public List<SysDepartModel> getAllSysDepart() {
        return sysBaseApi.getAllSysDepart();
    }
@@ -246,29 +291,30 @@
     * @return
     */
    @GetMapping("/getDynamicDbSourceById")
    DynamicDataSourceModel getDynamicDbSourceById(@RequestParam("dbSourceId")String dbSourceId){
    DynamicDataSourceModel getDynamicDbSourceById(@RequestParam("dbSourceId") String dbSourceId) {
        return sysBaseApi.getDynamicDbSourceById(dbSourceId);
    }
    /**
     * æ ¹æ®éƒ¨é—¨Id获取部门负责人
     *
     * @param deptId
     * @return
     */
    @GetMapping("/getDeptHeadByDepId")
    public List<String> getDeptHeadByDepId(@RequestParam("deptId") String deptId){
    public List<String> getDeptHeadByDepId(@RequestParam("deptId") String deptId) {
        return sysBaseApi.getDeptHeadByDepId(deptId);
    }
    /**
     * æŸ¥æ‰¾çˆ¶çº§éƒ¨é—¨
     *
     * @param departId
     * @return
     */
    @GetMapping("/getParentDepartId")
    public DictModel getParentDepartId(@RequestParam("departId")String departId){
    public DictModel getParentDepartId(@RequestParam("departId") String departId) {
        return sysBaseApi.getParentDepartId(departId);
    }
@@ -279,17 +325,18 @@
     * @return
     */
    @GetMapping("/getDynamicDbSourceByCode")
    public DynamicDataSourceModel getDynamicDbSourceByCode(@RequestParam("dbSourceCode") String dbSourceCode){
    public DynamicDataSourceModel getDynamicDbSourceByCode(@RequestParam("dbSourceCode") String dbSourceCode) {
        return sysBaseApi.getDynamicDbSourceByCode(dbSourceCode);
    }
    /**
     * ç»™æŒ‡å®šç”¨æˆ·å‘消息
     *
     * @param userIds
     * @param cmd
     */
    @GetMapping("/sendWebSocketMsg")
    public void sendWebSocketMsg(String[] userIds, String cmd){
    public void sendWebSocketMsg(String[] userIds, String cmd) {
        sysBaseApi.sendWebSocketMsg(userIds, cmd);
    }
@@ -297,71 +344,77 @@
    /**
     * æ ¹æ®id获取所有参与用户
     * userIds
     *
     * @return
     */
    @GetMapping("/queryAllUserByIds")
    public List<LoginUser> queryAllUserByIds(@RequestParam("userIds") String[] userIds){
    public List<LoginUser> queryAllUserByIds(@RequestParam("userIds") String[] userIds) {
        return sysBaseApi.queryAllUserByIds(userIds);
    }
    /**
     * æŸ¥è¯¢æ‰€æœ‰ç”¨æˆ· è¿”回ComboModel
     *
     * @return
     */
    @GetMapping("/queryAllUserBackCombo")
    public List<ComboModel> queryAllUserBackCombo(){
    public List<ComboModel> queryAllUserBackCombo() {
        return sysBaseApi.queryAllUserBackCombo();
    }
    /**
     * åˆ†é¡µæŸ¥è¯¢ç”¨æˆ· è¿”回JSONObject
     *
     * @return
     */
    @GetMapping("/queryAllUser")
    public JSONObject queryAllUser(@RequestParam(name="userIds",required=false)String userIds, @RequestParam(name="pageNo",required=false) Integer pageNo,@RequestParam(name="pageSize",required=false) int pageSize){
    public JSONObject queryAllUser(@RequestParam(name = "userIds", required = false) String userIds, @RequestParam(name = "pageNo", required = false) Integer pageNo, @RequestParam(name = "pageSize", required = false) int pageSize) {
        return sysBaseApi.queryAllUser(userIds, pageNo, pageSize);
    }
    /**
     * å°†ä¼šè®®ç­¾åˆ°ä¿¡æ¯æŽ¨åŠ¨åˆ°é¢„è§ˆ
     * userIds
     * @return
     *
     * @param userId
     * @return
     */
    @GetMapping("/meetingSignWebsocket")
    public void meetingSignWebsocket(@RequestParam("userId")String userId){
    public void meetingSignWebsocket(@RequestParam("userId") String userId) {
        sysBaseApi.meetingSignWebsocket(userId);
    }
    /**
     * æ ¹æ®name获取所有参与用户
     * userNames
     *
     * @return
     */
    @GetMapping("/queryUserByNames")
    public List<LoginUser> queryUserByNames(@RequestParam("userNames")String[] userNames){
    public List<LoginUser> queryUserByNames(@RequestParam("userNames") String[] userNames) {
        return sysBaseApi.queryUserByNames(userNames);
    }
    /**
     * èŽ·å–ç”¨æˆ·çš„è§’è‰²é›†åˆ
     *
     * @param username
     * @return
     */
    @GetMapping("/getUserRoleSet")
    public Set<String> getUserRoleSet(@RequestParam("username")String username){
    public Set<String> getUserRoleSet(@RequestParam("username") String username) {
        return sysBaseApi.getUserRoleSet(username);
    }
    /**
     * èŽ·å–ç”¨æˆ·çš„æƒé™é›†åˆ
     *
     * @param username
     * @return
     */
    @GetMapping("/getUserPermissionSet")
    public Set<String> getUserPermissionSet(@RequestParam("username") String username){
    public Set<String> getUserPermissionSet(@RequestParam("username") String username) {
        return sysBaseApi.getUserPermissionSet(username);
    }
@@ -369,32 +422,35 @@
    /**
     * åˆ¤æ–­æ˜¯å¦æœ‰online访问的权限
     *
     * @param onlineAuthDTO
     * @return
     */
    @PostMapping("/hasOnlineAuth")
    public boolean hasOnlineAuth(@RequestBody OnlineAuthDTO onlineAuthDTO){
    public boolean hasOnlineAuth(@RequestBody OnlineAuthDTO onlineAuthDTO) {
        return sysBaseApi.hasOnlineAuth(onlineAuthDTO);
    }
    /**
     * æŸ¥è¯¢ç”¨æˆ·è§’色信息
     *
     * @param username
     * @return
     */
    @GetMapping("/queryUserRoles")
    public Set<String> queryUserRoles(@RequestParam("username") String username){
    public Set<String> queryUserRoles(@RequestParam("username") String username) {
        return sysUserService.getUserRolesSet(username);
    }
    /**
     * æŸ¥è¯¢ç”¨æˆ·æƒé™ä¿¡æ¯
     *
     * @param username
     * @return
     */
    @GetMapping("/queryUserAuths")
    public Set<String> queryUserAuths(@RequestParam("username") String username){
    public Set<String> queryUserAuths(@RequestParam("username") String username) {
        return sysUserService.getUserPermissionsSet(username);
    }
@@ -402,109 +458,122 @@
     * é€šè¿‡éƒ¨é—¨id获取部门全部信息
     */
    @GetMapping("/selectAllById")
    public SysDepartModel selectAllById(@RequestParam("id") String id){
    public SysDepartModel selectAllById(@RequestParam("id") String id) {
        return sysBaseApi.selectAllById(id);
    }
    /**
     * æ ¹æ®ç”¨æˆ·id查询用户所属公司下所有用户ids
     *
     * @param userId
     * @return
     */
    @GetMapping("/queryDeptUsersByUserId")
    public List<String> queryDeptUsersByUserId(@RequestParam("userId") String userId){
    public List<String> queryDeptUsersByUserId(@RequestParam("userId") String userId) {
        return sysBaseApi.queryDeptUsersByUserId(userId);
    }
    /**
     * æŸ¥è¯¢æ•°æ®æƒé™
     *
     * @return
     */
    @GetMapping("/queryPermissionDataRule")
    public List<SysPermissionDataRuleModel> queryPermissionDataRule(@RequestParam("component") String component, @RequestParam("requestPath")String requestPath, @RequestParam("username") String username){
    public List<SysPermissionDataRuleModel> queryPermissionDataRule(@RequestParam("component") String component, @RequestParam("requestPath") String requestPath, @RequestParam("username") String username) {
        return sysBaseApi.queryPermissionDataRule(component, requestPath, username);
    }
    /**
     * æŸ¥è¯¢ç”¨æˆ·ä¿¡æ¯
     *
     * @param username
     * @return
     */
    @GetMapping("/getCacheUser")
    public SysUserCacheInfo getCacheUser(@RequestParam("username") String username){
    public SysUserCacheInfo getCacheUser(@RequestParam("username") String username) {
        return sysBaseApi.getCacheUser(username);
    }
    /**
     * æ™®é€šå­—典的翻译
     *
     * @param code
     * @param key
     * @return
     */
    @GetMapping("/translateDict")
    public String translateDict(@RequestParam("code") String code, @RequestParam("key") String key){
    public String translateDict(@RequestParam("code") String code, @RequestParam("key") String key) {
        return sysBaseApi.translateDict(code, key);
    }
    /**
     * 36根据多个用户账号(逗号分隔),查询返回多个用户信息
     *
     * @param usernames
     * @return
     */
    @RequestMapping("/queryUsersByUsernames")
    List<JSONObject> queryUsersByUsernames(@RequestParam("usernames") String usernames){
    List<JSONObject> queryUsersByUsernames(@RequestParam("usernames") String usernames) {
        return this.sysBaseApi.queryUsersByUsernames(usernames);
    }
    /**
     * 37根据多个用户id(逗号分隔),查询返回多个用户信息
     *
     * @param ids
     * @return
     */
    @RequestMapping("/queryUsersByIds")
    List<JSONObject> queryUsersByIds(@RequestParam("ids") String ids){
    List<JSONObject> queryUsersByIds(@RequestParam("ids") String ids) {
        return this.sysBaseApi.queryUsersByIds(ids);
    }
    /**
     * 38根据多个部门编码(逗号分隔),查询返回多个部门信息
     *
     * @param orgCodes
     * @return
     */
    @GetMapping("/queryDepartsByOrgcodes")
    List<JSONObject> queryDepartsByOrgcodes(@RequestParam("orgCodes") String orgCodes){
    List<JSONObject> queryDepartsByOrgcodes(@RequestParam("orgCodes") String orgCodes) {
        return this.sysBaseApi.queryDepartsByOrgcodes(orgCodes);
    }
    /**
     * 39根据多个部门ID(逗号分隔),查询返回多个部门信息
     *
     * @param ids
     * @return
     */
    @GetMapping("/queryDepartsByIds")
    List<JSONObject> queryDepartsByIds(@RequestParam("ids") String ids){
    List<JSONObject> queryDepartsByIds(@RequestParam("ids") String ids) {
        return this.sysBaseApi.queryDepartsByIds(ids);
    }
    /**
     * 40发送邮件消息
     *
     * @param email
     * @param title
     * @param content
     */
    @GetMapping("/sendEmailMsg")
    public void sendEmailMsg(@RequestParam("email")String email,@RequestParam("title")String title,@RequestParam("content")String content){
         this.sysBaseApi.sendEmailMsg(email,title,content);
    };
    public void sendEmailMsg(@RequestParam("email") String email, @RequestParam("title") String title, @RequestParam("content") String content) {
        this.sysBaseApi.sendEmailMsg(email, title, content);
    }
    ;
    /**
     * 41 èŽ·å–å…¬å¸ä¸‹çº§éƒ¨é—¨å’Œå…¬å¸ä¸‹æ‰€æœ‰ç”¨æˆ·ä¿¡æ¯
     *
     * @param orgCode
     */
    @GetMapping("/getDeptUserByOrgCode")
    List<Map> getDeptUserByOrgCode(@RequestParam("orgCode")String orgCode){
       return this.sysBaseApi.getDeptUserByOrgCode(orgCode);
    List<Map> getDeptUserByOrgCode(@RequestParam("orgCode") String orgCode) {
        return this.sysBaseApi.getDeptUserByOrgCode(orgCode);
    }
    /**
@@ -527,7 +596,7 @@
     */
    @GetMapping("/loadDictItem")
    public List<String> loadDictItem(@RequestParam("dictCode") String dictCode, @RequestParam("keys") String keys) {
        if(!dictQueryBlackListHandler.isPass(dictCode)){
        if (!dictQueryBlackListHandler.isPass(dictCode)) {
            log.error(dictQueryBlackListHandler.getError());
            return null;
        }
@@ -543,7 +612,7 @@
     */
    @GetMapping("/getDictItems")
    public List<DictModel> getDictItems(@RequestParam("dictCode") String dictCode) {
        if(!dictQueryBlackListHandler.isPass(dictCode)){
        if (!dictQueryBlackListHandler.isPass(dictCode)) {
            log.error(dictQueryBlackListHandler.getError());
            return null;
        }
@@ -571,7 +640,7 @@
     */
    @GetMapping("/loadDictItemByKeyword")
    public List<DictModel> loadDictItemByKeyword(@RequestParam("dictCode") String dictCode, @RequestParam("keyword") String keyword, @RequestParam(value = "pageSize", required = false) Integer pageSize) {
        if(!dictQueryBlackListHandler.isPass(dictCode)){
        if (!dictQueryBlackListHandler.isPass(dictCode)) {
            log.error(dictQueryBlackListHandler.getError());
            return null;
        }
@@ -580,27 +649,29 @@
    /**
     * 48 æ™®é€šå­—典的翻译,根据多个dictCode和多条数据,多个以逗号分割
     *
     * @param dictCodes
     * @param keys
     * @return
     */
    @GetMapping("/translateManyDict")
    public Map<String, List<DictModel>> translateManyDict(@RequestParam("dictCodes") String dictCodes, @RequestParam("keys") String keys){
    public Map<String, List<DictModel>> translateManyDict(@RequestParam("dictCodes") String dictCodes, @RequestParam("keys") String keys) {
        return this.sysBaseApi.translateManyDict(dictCodes, keys);
    }
    /**
     * èŽ·å–è¡¨æ•°æ®å­—å…¸ ã€æŽ¥å£ç­¾åéªŒè¯ã€‘
     *
     * @param table
     * @param text
     * @param code
     * @return
     */
    @GetMapping("/queryTableDictItemsByCode")
    List<DictModel> queryTableDictItemsByCode(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code){
        String str = table+","+text+","+code;
        if(!dictQueryBlackListHandler.isPass(str)){
    List<DictModel> queryTableDictItemsByCode(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code) {
        String str = table + "," + text + "," + code;
        if (!dictQueryBlackListHandler.isPass(str)) {
            log.error(dictQueryBlackListHandler.getError());
            return null;
        }
@@ -609,6 +680,7 @@
    /**
     * æŸ¥è¯¢è¡¨å­—å…¸ æ”¯æŒè¿‡æ»¤æ•°æ® ã€æŽ¥å£ç­¾åéªŒè¯ã€‘
     *
     * @param table
     * @param text
     * @param code
@@ -616,9 +688,9 @@
     * @return
     */
    @GetMapping("/queryFilterTableDictInfo")
    List<DictModel> queryFilterTableDictInfo(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("filterSql") String filterSql){
        String str = table+","+text+","+code;
        if(!dictQueryBlackListHandler.isPass(str)){
    List<DictModel> queryFilterTableDictInfo(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("filterSql") String filterSql) {
        String str = table + "," + text + "," + code;
        if (!dictQueryBlackListHandler.isPass(str)) {
            log.error(dictQueryBlackListHandler.getError());
            return null;
        }
@@ -631,6 +703,7 @@
    /**
     * ã€æŽ¥å£ç­¾åéªŒè¯ã€‘
     * æŸ¥è¯¢æŒ‡å®štable的 text code èŽ·å–å­—å…¸ï¼ŒåŒ…å«text和value
     *
     * @param table
     * @param text
     * @param code
@@ -639,9 +712,9 @@
     */
    @Deprecated
    @GetMapping("/queryTableDictByKeys")
    public List<String> queryTableDictByKeys(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("keyArray") String[] keyArray){
        String str = table+","+text+","+code;
        if(!dictQueryBlackListHandler.isPass(str)){
    public List<String> queryTableDictByKeys(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("keyArray") String[] keyArray) {
        String str = table + "," + text + "," + code;
        if (!dictQueryBlackListHandler.isPass(str)) {
            log.error(dictQueryBlackListHandler.getError());
            return null;
        }
@@ -651,6 +724,7 @@
    /**
     * å­—典表的 ç¿»è¯‘【接口签名验证】
     *
     * @param table
     * @param text
     * @param code
@@ -658,9 +732,9 @@
     * @return
     */
    @GetMapping("/translateDictFromTable")
    public String translateDictFromTable(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("key") String key){
        String str = table+","+text+","+code;
        if(!dictQueryBlackListHandler.isPass(str)){
    public String translateDictFromTable(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("key") String key) {
        String str = table + "," + text + "," + code;
        if (!dictQueryBlackListHandler.isPass(str)) {
            log.error(dictQueryBlackListHandler.getError());
            return null;
        }
@@ -682,8 +756,8 @@
     */
    @GetMapping("/translateDictFromTableByKeys")
    public List<DictModel> translateDictFromTableByKeys(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("keys") String keys) {
        String str = table+","+text+","+code;
        if(!dictQueryBlackListHandler.isPass(str)){
        String str = table + "," + text + "," + code;
        if (!dictQueryBlackListHandler.isPass(str)) {
            log.error(dictQueryBlackListHandler.getError());
            return null;
        }
@@ -692,57 +766,64 @@
    /**
     * å‘送模板信息
     *
     * @param message
     */
    @PostMapping("/sendTemplateMessage")
    public void sendTemplateMessage(@RequestBody MessageDTO message){
    public void sendTemplateMessage(@RequestBody MessageDTO message) {
        sysBaseApi.sendTemplateMessage(message);
    }
    /**
     * èŽ·å–æ¶ˆæ¯æ¨¡æ¿å†…å®¹
     *
     * @param code
     * @return
     */
    @GetMapping("/getTemplateContent")
    public String getTemplateContent(@RequestParam("code") String code){
    public String getTemplateContent(@RequestParam("code") String code) {
        return this.sysBaseApi.getTemplateContent(code);
    }
    /**
     * ä¿å­˜æ•°æ®æ—¥å¿—
     *
     * @param dataLogDto
     */
    @PostMapping("/saveDataLog")
    public void saveDataLog(@RequestBody DataLogDTO dataLogDto){
    public void saveDataLog(@RequestBody DataLogDTO dataLogDto) {
        this.sysBaseApi.saveDataLog(dataLogDto);
    }
    @PostMapping("/addSysFiles")
    public void addSysFiles(@RequestBody SysFilesModel sysFilesModel){this.sysBaseApi.addSysFiles(sysFilesModel);}
    public void addSysFiles(@RequestBody SysFilesModel sysFilesModel) {
        this.sysBaseApi.addSysFiles(sysFilesModel);
    }
    @GetMapping("/getFileUrl")
    public String getFileUrl(@RequestParam(name="fileId") String fileId){
    public String getFileUrl(@RequestParam(name = "fileId") String fileId) {
        return this.sysBaseApi.getFileUrl(fileId);
    }
    /**
     * æ›´æ–°å¤´åƒ
     *
     * @param loginUser
     * @return
     */
    @PutMapping("/updateAvatar")
    public void updateAvatar(@RequestBody LoginUser loginUser){
    public void updateAvatar(@RequestBody LoginUser loginUser) {
        this.sysBaseApi.updateAvatar(loginUser);
    }
    /**
     * å‘app端 websocket推送聊天刷新消息
     *
     * @param userId
     * @return
     */
    @GetMapping("/sendAppChatSocket")
    public void sendAppChatSocket(@RequestParam(name="userId") String userId){
    public void sendAppChatSocket(@RequestParam(name = "userId") String userId) {
        this.sysBaseApi.sendAppChatSocket(userId);
    }
@@ -750,18 +831,116 @@
    /**
     * VUEN-2584【issue】平台sql注入漏洞几个问题
     * éƒ¨åˆ†ç‰¹æ®Šå‡½æ•° å¯ä»¥å°†æŸ¥è¯¢ç»“果混夹在错误信息中,导致数据库的信息暴露
     *
     * @param e
     * @return
     */
    @ExceptionHandler(java.sql.SQLException.class)
    public Result<?> handleSQLException(Exception e){
    public Result<?> handleSQLException(Exception e) {
        String msg = e.getMessage();
        String extractvalue = "extractvalue";
        String updatexml = "updatexml";
        if(msg!=null && (msg.toLowerCase().indexOf(extractvalue)>=0 || msg.toLowerCase().indexOf(updatexml)>=0)){
        if (msg != null && (msg.toLowerCase().indexOf(extractvalue) >= 0 || msg.toLowerCase().indexOf(updatexml) >= 0)) {
            return Result.error("校验失败,sql解析异常!");
        }
        return Result.error("校验失败,sql解析异常!" + msg);
    }
    /**
     * ç½‘闸认证
     *
     * @param postParams
     * @return
     */
    @PostMapping(value = "/appAuth")
    public TokenResp getToken(@RequestBody PostParams postParams) {
        //获取请求头中传入的appId和password
        String appId = postParams.getAppId();
        String password = postParams.getPassword();
        //用于校验的正确的appId和password(根据业务调整)
        //校验appId和paaword,由于测试用的明文密码,SM3Util.verify()先将铭文密码SM3加密后再与传入password对比
        if (username.equals(appId)) {
            //校验通过,生成token签名
            if (SM3Util.verify(pwd, password)) {
                String token = JwTUtil.sign(appId, pwd);
                return new TokenResp("200", "认证成功", token);
            } else {
                return new TokenResp("", "密码错误", null);
            }
        } else {
            return new TokenResp("", "账号错误", null);
        }
    }
    @PostMapping(value = "/fileUpload")
    public RespData uploadFiles(HttpServletRequest request) {
        FileDetail fileDetail = new FileDetail();
        try {
            request.setCharacterEncoding("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        //获取FileName
        if (request.getHeader("FileName") != null) {
            try {
                fileDetail.setFileName(URLDecoder.decode(request.getHeader("FileName"), "utf-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        //获取Content-Length
        if (request.getHeader("Content-Length") != null) {
            try {
                fileDetail.setContentLength(URLDecoder.decode(request.getHeader("Content-Length"), "utf-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        //获取文件流
        ServletInputStream inputStream = null;
        try {
            inputStream = request.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //操作文件流,上传文件
        FileOutputStream fileOut = null;
        try {
            fileOut = new FileOutputStream(fileDetail.getFileName()); // è¿™é‡Œå¯ä»¥æ”¹è·¯å¾„
            IOUtils.copy(inputStream, fileOut);
            fileOut.flush();
            //不记录数据量
            MdcPassLog mdcPassLog = new MdcPassLog();
            File file = new File(fileDetail.getFileName());
            String fileName = file.getName();
            String sequenceOrder = fileName.substring(fileName.length() - 10, fileName.length() - 4);
            String dayTime = fileName.substring(fileName.length() - 18, fileName.length() - 10);
            mdcPassLog.setPassLogFileName(file.getAbsolutePath());
            int sequenceNum = Integer.parseInt(sequenceOrder);
            mdcPassLog.setPassName(fileName);
            mdcPassLog.setDayTime(dayTime);
            mdcPassLog.setSequenceNumber(sequenceNum);
            mdcPassLog.setSequenceOrder(sequenceOrder);
            mdcPassLogService.save(mdcPassLog);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
                if (fileOut != null) {
                    fileOut.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return new RespData("200", "文件上传成功");
    }
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/MdcPassLog.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package org.jeecg.modules.system.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;
/**
 * @author clown
 * * @date 2023/12/12
 */
@Data
@TableName("mdc_pass_log")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "mdc_pass_log对象", description = "发送文件日志表")
public class MdcPassLog implements Serializable {
    private static final long serialVersionUID = -9138730240370211497L;
    @TableId(type = IdType.ASSIGN_ID)
    private String id;
    /**
     * åç§°
     */
    private String passName;
    /**
     * åºå·
     */
    private String sequenceOrder;
    /**
     * æ—¶é—´
     */
    private String dayTime;
    /**
     * ç±»åž‹
     */
    private String passType;
    /**
     * æ–‡ä»¶åç§°
     */
    private String passLogFileName;
    /**
     * é¡ºåºå·
     */
    private Integer sequenceNumber;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private Date createTime;
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcPassLogMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package org.jeecg.modules.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.system.entity.MdcPassLog;
/**
 * @author Lius
 * @date 2024/12/23 14:59
 */
public interface MdcPassLogMapper extends BaseMapper<MdcPassLog> {
    /**
     * æŸ¥è¯¢ä»Šæ—¥æœ€æ–°ä¸€æ¡ä¼ è¾“日志
     *
     * @param date
     * @return
     */
    MdcPassLog selectTodayLast(@Param("date") String date);
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcPassLogMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
<?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="org.jeecg.modules.system.mapper.MdcPassLogMapper">
    <select id="selectTodayLast" resultType="org.jeecg.modules.system.entity.MdcPassLog">
        SELECT TOP 1 * FROM mdc_pass_log WHERE day_time = #{date} ORDER BY create_time DESC
    </select>
</mapper>
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcPassLogService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package org.jeecg.modules.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.system.entity.MdcPassLog;
/**
 * @author Lius
 * @date 2024/12/23 15:00
 */
public interface IMdcPassLogService extends IService<MdcPassLog> {
    /**
     * æŸ¥è¯¢ä»Šæ—¥æœ€æ–°ä¸€æ¡ä¼ è¾“日志
     *
     * @param date
     * @return
     */
    MdcPassLog selectTodayLast(String date);
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcPassLogServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package org.jeecg.modules.system.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.modules.system.entity.MdcPassLog;
import org.jeecg.modules.system.mapper.MdcPassLogMapper;
import org.jeecg.modules.system.service.IMdcPassLogService;
import org.springframework.stereotype.Service;
/**
 * @author Lius
 * @date 2024/12/23 15:00
 */
@Service
public class MdcPassLogServiceImpl extends ServiceImpl<MdcPassLogMapper, MdcPassLog> implements IMdcPassLogService {
    /**
     * æŸ¥è¯¢ä»Šæ—¥æœ€æ–°ä¸€æ¡ä¼ è¾“日志
     *
     * @param date
     * @return
     */
    @Override
    public MdcPassLog selectTodayLast(String date) {
        return this.baseMapper.selectTodayLast(date);
    }
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/util/FileUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,195 @@
package org.jeecg.modules.system.util;
import cn.hutool.core.date.DateUtil;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.math.BigDecimal;
import java.util.Date;
/**
 * Created by YangBin on 2017/9/15.
 */
public class FileUtils {
    private static final long MAX_FILE_SIZE = 10 * 1024 * 1024;
    /**
     * èŽ·å–æœåŠ¡å™¨ä¸´æ—¶è·¯å¾„
     *
     * @param request
     * @return
     */
    public static String serverTempPath(HttpServletRequest request) {
        String fsep = System.getProperty("file.separator");
        String path = request.getSession().getServletContext().getRealPath("");
        if (path.lastIndexOf(fsep) == path.length() - 1) {
            path += "upload" + fsep + "voucher" + fsep;
        } else {
            path += fsep + "upload" + fsep + "voucher" + fsep;
        }
        return path;
    }
    public static String serverTempPathIntactReg(HttpServletRequest request) {
        String fsep = System.getProperty("file.separator");
        String path = request.getSession().getServletContext().getRealPath("");
        if (path.lastIndexOf(fsep) == path.length() - 1) {
            path += "upload" + fsep + "log" + fsep + "error" + fsep;
        } else {
            path += fsep + "upload" + fsep + "log" + fsep + "error" + fsep;
        }
        return path;
    }
    public static String serverTempPathProcess(HttpServletRequest request) {
        String fsep = System.getProperty("file.separator");
        String path = request.getSession().getServletContext().getRealPath("");
        if (path.lastIndexOf(fsep) == path.length() - 1) {
            path += "upload" + fsep + "process" + fsep;
        } else {
            path += fsep + "upload" + fsep + "process" + fsep;
        }
        return path;
    }
    public static String changeFileFormatKb(String flow) {
        BigDecimal flows = new BigDecimal(flow);
        if (flows.compareTo(new BigDecimal(0)) > 0 && flows.compareTo(new BigDecimal(1024)) < 0) {//小于1M
            return flows.toString() + "B";
        } else if (flows.compareTo(new BigDecimal(1024)) >= 0) {
            BigDecimal result = flows.divide(new BigDecimal(1024), 2, BigDecimal.ROUND_HALF_UP);
            return result.toString() + "KB";
        } else {
            return "0";
        }
    }
    /**
     * å¾—到项目根目录下的绝对路径(磁盘的物理路径)
     *
     * @param request
     * @param newPath
     * @return
     */
    public static String getFilePath(HttpServletRequest request, String newPath) {
        String fsep = System.getProperty("file.separator");
        String path = request.getSession().getServletContext().getRealPath("/upload");
        path += fsep + newPath;
        return path;
    }
    /**
     * å¾—到项目根目录下的相对路径 ï¼ˆç›¸å¯¹äºŽé¡¹ç›®ä¸ºæ ¹è·¯å¾„)
     *
     * @param newPath
     * @return
     */
    public static String getRelativePath(String newPath) {
        return "/upload/" + newPath;
    }
    /**
     * æ–¹æ³•一:使用 FileWriter å†™æ–‡ä»¶
     *
     * @param filepath æ–‡ä»¶ç›®å½•
     * @param content  å¾…写入内容
     * @throws IOException
     */
    public static void fileWriterSql(String filepath, String content) throws IOException {
        OutputStreamWriter outputStreamWriter = null;
        try {
            File file = new File(filepath);
            if (!file.exists()) {
                file.createNewFile();
            }
            FileOutputStream outputStream = new FileOutputStream(file);
            if (outputStream != null) {
                outputStreamWriter = new OutputStreamWriter(outputStream, "utf-8");
                outputStreamWriter.write(content);
                outputStreamWriter.flush();
            }
        } catch (IOException e) {
            e.getMessage();
        } finally {
            try {
                if (outputStreamWriter != null) {
                    outputStreamWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        /*
        File file=new File(filepath);
        Writer writer = new OutputStreamWriter(new FileOutputStream(file.getAbsoluteFile()), "UTF-8");
        writer.append(content);
         */
    }
    /**
     * æ–‡ä»¶å¤§å°æ™ºèƒ½è½¬æ¢
     * ä¼šå°†æ–‡ä»¶å¤§å°è½¬æ¢ä¸ºæœ€å¤§æ»¡è¶³å•位
     *
     * @param size(文件大小,单位为B)
     * @return æ–‡ä»¶å¤§å°
     */
    public static String formatFileSize(Long size) {
        String sizeName = null;
        if (1024 * 1024 > size && size >= 1024) {
            sizeName = String.format("%.2f", size.doubleValue() / 1024) + "KB";
        } else if (1024 * 1024 * 1024 > size && size >= 1024 * 1024) {
            sizeName = String.format("%.2f", size.doubleValue() / (1024 * 1024)) + "MB";
        } else if (size >= 1024 * 1024 * 1024) {
            sizeName = String.format("%.2f", size.doubleValue() / (1024 * 1024 * 1024)) + "GB";
        } else {
            sizeName = size.toString() + "B";
        }
        return sizeName;
    }
    /**
     * ä¸Šä¼ æ–‡ä»¶å·¥å…·ç±»
     *
     * @param userPic
     * @param path
     * @param fileName
     * @return
     */
    public static boolean uploadFile(MultipartFile userPic, String path, String fileName) {
        Long fileSize = userPic.getSize();
        if (fileSize > MAX_FILE_SIZE) {
            return false;
        }
        File targetFile = new File(path, fileName);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        }
        try {
            userPic.transferTo(targetFile);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    /**
     * é‡å‘½åæ–‡ä»¶å åŠ å…¥æ—¶é—´æˆ³
     *
     * @param fileName
     * @return
     */
    public static String newFileName(String fileName) {
        String suffix = fileName.substring(fileName.lastIndexOf('.'));
        String dateStr = "_" + DateUtil.now();
        String nameFile = fileName.substring(0, fileName.indexOf("."));
        //新文件名
        return nameFile + dateStr + suffix;
    }
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/util/JwTUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package org.jeecg.modules.system.util;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.Date;
/**
 * @author clown
 * * @date 2023/11/23
 */
public class JwTUtil {
    /**
     * ä»Žtoken中解密出用户名
     */
    public static String getUsername(String token) {
        try {
            DecodedJWT jwt = JWT.decode(token);
            return jwt.getClaim("username").asString();
        } catch (JWTDecodeException e) {
            return null;
        }
    }
    /**
     * åˆ¤æ–­æ˜¯å¦è¿‡æœŸ
     */
    public static boolean isExpired(String token) {
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getExpiresAt().before(new Date());
    }
    /**
     * ç”Ÿæˆç­¾å
     */
    public static String sign(String username, String secret) {
        Algorithm algorithm = Algorithm.HMAC256(secret);
        // 30分钟后过期
        Date date = new Date(System.currentTimeMillis() + 60 * 60 * 1000);
        // é™„带username信息(只要你愿意,可以附带Map、List等)
        return JWT.create().withClaim("username", username).withExpiresAt(date).sign(algorithm);
    }
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/util/SM3Util.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,71 @@
package org.jeecg.modules.system.util;
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import java.io.UnsupportedEncodingException;
import java.security.Security;
import java.util.Arrays;
/**
 * @author clown
 * * @date 2023/11/23
 */
public class SM3Util {
    /**
     * ç¼–码格式
     */
    private static final String ENCODING = "UTF-8";
    static{
        Security.addProvider(new BouncyCastleProvider());
    }
    /**
     *
     * @param paramStr è¦sm3加密的内容
     * @return sm3加密后密文
     */
    public static String encrypt(String paramStr){
        String resultHexString = "";
        try {
            byte[] srcData = paramStr.getBytes(ENCODING);
            byte[] hash = hash(srcData);
            resultHexString = ByteUtils.toHexString(hash);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return resultHexString;
    }
    public static byte[] hash(byte[] srcData){
        SM3Digest sm3Digest = new SM3Digest();
        sm3Digest.update(srcData,0,srcData.length);
        byte[] bytes = new byte[sm3Digest.getDigestSize()];
        sm3Digest.doFinal(bytes,0);
        return bytes;
    }
    /**
     *
     * @param str æ˜Žæ–‡
     * @param hexString å¯†æ–‡
     * @return æ˜Žæ–‡å¯†æ–‡å¯¹æ¯”结果
     */
    public static boolean verify(String str,String hexString){
        boolean flag = false;
        try {
            byte[] srcData = str.getBytes(ENCODING);
            byte[] sm3Hash = ByteUtils.fromHexString(hexString);
            byte[] hash = hash(srcData);
            if (Arrays.equals(hash,sm3Hash)){
                flag = true;
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return flag;
    }
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/vo/FileDetail.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package org.jeecg.modules.system.vo;
import lombok.Data;
/**
 * @author clown
 * * @date 2023/11/28
 */
@Data
public class FileDetail {
    private String fileName;
    private String contentLength;
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/vo/PostParams.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package org.jeecg.modules.system.vo;
import lombok.Data;
/**
 * @author clown
 * * @date 2023/11/23
 */
@Data
public class PostParams {
    private String appId;
    private String password;
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/vo/RespData.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package org.jeecg.modules.system.vo;
import lombok.Data;
import lombok.ToString;
/**
 * @author clown
 * * @date 2023/11/28
 */
@Data
public class RespData {
    private String code;
    private String msg;
    public RespData(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/vo/SysLogTypeObjectDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package org.jeecg.modules.system.vo;
import lombok.Data;
/**
 * @author clown
 * * @date 2023/12/19
 */
@Data
public class SysLogTypeObjectDto {
    /**
     * ç³»ç»Ÿåç§°
     */
    private String systemName = "MDC";
    /**
     * æ—¶é—´
     */
    private String dateTime;
    /**
     * åœ°ç‚¹
     */
    private String location = "成发工业园";
    /**
     * ç±»åž‹  Info/error
     */
    private String types = "info";
    /**
     * æ–‡ä»¶åºå·
     */
    private String fileNum;
    /**
     * æ–‡ä»¶å
     */
    private String fileName;
    /**
     * æ–‡ä»¶å¤§å°
     */
    private String fileSize;
    /**
     * ä¸šåŠ¡ç³»ç»Ÿip
     */
    private String address = "10.118.10.62";
    /**
     * æ–‡ä»¶æ‘˜è¦
     */
    private String abstract1;
    /**
     * æºåœ°å€
     */
    private String sourceAddress;
    /**
     * ç›®çš„地址
     */
    private String destination;
    /**
     * ç»“æžœ
     */
    private String result;
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/vo/TokenResp.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package org.jeecg.modules.system.vo;
import lombok.Data;
import lombok.ToString;
/**
 * @author clown
 * * @date 2023/11/23
 */
@Data
public class TokenResp {
    private String code;
    private String token;
    private String msg;
    public TokenResp(String code, String token, String msg) {
        this.code = code;
        this.token = token;
        this.msg = msg;
    }
}