From aaaeee46bf6d408e68cfddebea146bf382977ac9 Mon Sep 17 00:00:00 2001
From: Lius <Lius2225@163.com>
Date: 星期二, 24 六月 2025 09:36:40 +0800
Subject: [PATCH] mdc两网数据交互

---
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/ExportToXmlJob.java                                       |   63 ++++
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcPassLogService.java         |   19 +
 lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml                                       |    3 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/LogTableServiceImpl.java                         |   96 ++++++
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/util/FileUtils.java                     |  194 +++++++++++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcPassLogService.java                               |   19 +
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcPassLogMapper.xml         |    8 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/ILogTableService.java                                 |   17 +
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcPassLogMapper.java            |   20 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/LogTableMapper.java                                    |   11 
 lxzn-module-system/lxzn-system-start/src/main/java/org/jeecg/codegenerate/CreateTrigger.java                      |  199 ++++++++++++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/LogTable.java                                          |   39 ++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/LogTableMapper.xml                                 |    5 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/MdcPassLog.java                  |   58 ++++
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java                                    |    4 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcPassLogServiceImpl.java |   26 +
 16 files changed, 779 insertions(+), 2 deletions(-)

diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java
index 65bbe03..201770d 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java
@@ -24,7 +24,7 @@
 
     @Override
     public void onStart(FileAlterationObserver observer) {
-        log.info("寮�濮嬬洃鍚洰褰�: {}", observer.getDirectory().getAbsolutePath());
+//        log.info("寮�濮嬬洃鍚洰褰�: {}", observer.getDirectory().getAbsolutePath());
     }
 
     @Override
@@ -66,6 +66,6 @@
 
     @Override
     public void onStop(FileAlterationObserver observer) {
-        log.info("缁撴潫鐩戝惉鐩綍: {}", observer.getDirectory().getAbsolutePath());
+//        log.info("缁撴潫鐩戝惉鐩綍: {}", observer.getDirectory().getAbsolutePath());
     }
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/LogTable.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/LogTable.java
new file mode 100644
index 0000000..d522be5
--- /dev/null
+++ b/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;
+
+    /**
+     * 鎿嶄綔绫诲瀷锛圛NSERT / UPDATE / DELETE锛�
+     */
+    private String action;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * sql璁板綍
+     */
+    private String sqlLog;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/ExportToXmlJob.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/ExportToXmlJob.java
new file mode 100644
index 0000000..544d4f1
--- /dev/null
+++ b/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璁板綍鍒皒ml鏂囦欢浠诲姟
+ * @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("瀹氭椂瀵煎嚭鍚屾鏁版嵁琛╯ql浠诲姟 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("瀹氭椂瀵煎嚭鍚屾鏁版嵁琛╯ql浠诲姟", quartzLog.getExceptionDetail());
+        }
+        long endTime = System.currentTimeMillis();
+        quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
+        sysQuartzLogService.save(quartzLog);
+    }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/LogTableMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/LogTableMapper.java
new file mode 100644
index 0000000..98cc17f
--- /dev/null
+++ b/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>  {
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/LogTableMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/LogTableMapper.xml
new file mode 100644
index 0000000..3d79dd7
--- /dev/null
+++ b/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>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/ILogTableService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/ILogTableService.java
new file mode 100644
index 0000000..51eec72
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/ILogTableService.java
@@ -0,0 +1,17 @@
+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> {
+
+    /**
+     * 瀵煎嚭鍚屾鏁版嵁琛╯ql鍒皒ml鏂囦欢涓婁紶鍒扮綉闂告湇鍔″櫒
+     */
+    void exportDataToXml();
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcPassLogService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcPassLogService.java
new file mode 100644
index 0000000..508b386
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcPassLogService.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.mdc.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);
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/LogTableServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/LogTableServiceImpl.java
new file mode 100644
index 0000000..b3cd919
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/LogTableServiceImpl.java
@@ -0,0 +1,96 @@
+package org.jeecg.modules.mdc.service.impl;
+
+import cn.hutool.core.io.FileUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.modules.mdc.entity.LogTable;
+import org.jeecg.modules.mdc.mapper.LogTableMapper;
+import org.jeecg.modules.mdc.service.ILogTableService;
+import org.jeecg.modules.mdc.util.DateUtils;
+import org.jeecg.modules.system.entity.MdcPassLog;
+import org.jeecg.modules.system.service.IMdcPassLogService;
+import org.jeecg.modules.system.util.FileUtils;
+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.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author Lius
+ * @date 2024/12/18 14:29
+ */
+@Service
+@Slf4j
+public class LogTableServiceImpl extends ServiceImpl<LogTableMapper, LogTable> implements ILogTableService {
+
+    @Value("${fileService.localFilePath}")
+    private String localFilePath;
+
+    @Resource
+    private IMdcPassLogService mdcPassLogService;
+
+    private static final String TYPE = "18";
+
+    /**
+     * 瀵煎嚭鍚屾鏁版嵁琛╯ql鍒皒ml鏂囦欢
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void exportDataToXml() {
+        // step.1 鏌ヨ鏈�鏂版暟鎹� 鏃堕棿姝e簭鎺掑垪
+        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";
+            String listSql = String.join("\n", sqlList);
+            try {
+                FileUtils.fileWriterSql(locFilePath, listSql);
+            } catch (Exception e) {
+                throw new JeecgBootException("鏁版嵁鍐欏叆鏂囦欢澶辫触锛�");
+            }
+
+            File[] files = FileUtil.ls(localFilePath);
+            for (File file : files) {
+                if (file.isFile()) {
+                    //椤哄簭鍙�
+                    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);
+                    // 鎻掑叆浼犺緭鏃ュ織
+                    MdcPassLog mdcPassLog = new MdcPassLog();
+                    mdcPassLog.setPassLogFileName(file.getAbsolutePath());
+                    mdcPassLog.setPassName(fileName);
+                    mdcPassLog.setDayTime(dayTime);
+                    mdcPassLog.setSequenceNumber(sequenceNum);
+                    mdcPassLog.setSequenceOrder(sequenceOrder);
+                    mdcPassLogService.save(mdcPassLog);
+                }
+            }
+            // step.5 鍒犻櫎宸茬粡鍐欏叆鏂囦欢骞跺彂閫佽嚦缃戦椄鐨勬暟鎹�
+            // step.5.1 鍒犻櫎鏁版嵁搴撴暟鎹�
+            this.baseMapper.delete(new LambdaQueryWrapper<LogTable>().le(LogTable::getCreateTime, logTables.get(logTables.size() - 1).getCreateTime()));
+
+        }
+    }
+
+}
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/MdcPassLog.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/MdcPassLog.java
new file mode 100644
index 0000000..f97cb96
--- /dev/null
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/MdcPassLog.java
@@ -0,0 +1,58 @@
+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 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;
+
+}
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcPassLogMapper.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcPassLogMapper.java
new file mode 100644
index 0000000..579d8c5
--- /dev/null
+++ b/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);
+}
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcPassLogMapper.xml b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcPassLogMapper.xml
new file mode 100644
index 0000000..7cd9e3a
--- /dev/null
+++ b/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>
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcPassLogService.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcPassLogService.java
new file mode 100644
index 0000000..e531182
--- /dev/null
+++ b/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);
+}
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcPassLogServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcPassLogServiceImpl.java
new file mode 100644
index 0000000..eb9fd10
--- /dev/null
+++ b/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);
+    }
+}
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/util/FileUtils.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/util/FileUtils.java
new file mode 100644
index 0000000..ba6c022
--- /dev/null
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/util/FileUtils.java
@@ -0,0 +1,194 @@
+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;
+
+/**
+ * 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锛堟枃浠跺ぇ灏忥紝鍗曚綅涓築锛�
+     * @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;
+    }
+}
diff --git a/lxzn-module-system/lxzn-system-start/src/main/java/org/jeecg/codegenerate/CreateTrigger.java b/lxzn-module-system/lxzn-system-start/src/main/java/org/jeecg/codegenerate/CreateTrigger.java
new file mode 100644
index 0000000..fe0682d
--- /dev/null
+++ b/lxzn-module-system/lxzn-system-start/src/main/java/org/jeecg/codegenerate/CreateTrigger.java
@@ -0,0 +1,199 @@
+package org.jeecg.codegenerate;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-06-23
+ * @Description: SQL Server 瑙﹀彂鍣ㄧ敓鎴愬伐鍏�
+ */
+public class CreateTrigger {
+
+    // 鏁版嵁搴撹繛鎺ヤ俊鎭�
+    private static final String JDBC_URL = "jdbc:sqlserver://192.168.1.118:1433;databaseName=LXZN_TEST_HANGYU_GK";
+    private static final String USERNAME = "sa";
+    private static final String PASSWORD = "123";
+
+    public static void main(String[] args) {
+        String schemaName = "dbo"; // SQL Server 榛樿鏋舵瀯
+        String logTableName = "log_table"; // 鏃ュ織琛ㄥ悕
+
+        try (Connection connection = DriverManager.getConnection(JDBC_URL, USERNAME, PASSWORD)) {
+            // 鑾峰彇鎸囧畾鏋舵瀯涓嬬殑鎵�鏈夎〃
+            List<String> tables = getTables(connection, schemaName);
+
+            // 鐢熸垚瑙﹀彂鍣� SQL 骞朵繚瀛樺埌鏂囦欢
+            generateTriggersForTables(connection, schemaName, logTableName, tables);
+
+        } catch (SQLException | IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 鑾峰彇鎸囧畾鏋舵瀯涓嬬殑鎵�鏈夎〃
+     */
+    private static List<String> getTables(Connection connection, String schemaName) throws SQLException {
+        List<String> tables = new ArrayList<>();
+        DatabaseMetaData metaData = connection.getMetaData();
+
+        try (ResultSet resultSet = metaData.getTables(null, schemaName, null, new String[]{"TABLE"})) {
+            while (resultSet.next()) {
+                String tableName = resultSet.getString("TABLE_NAME");
+                tables.add(tableName);
+            }
+        }
+
+        return tables;
+    }
+
+    /**
+     * 鑾峰彇琛ㄧ殑瀛楁鍒楄〃
+     */
+    private static List<String> getTableColumns(Connection connection, String schemaName, String tableName) throws SQLException {
+        List<String> columns = new ArrayList<>();
+        DatabaseMetaData metaData = connection.getMetaData();
+
+        try (ResultSet resultSet = metaData.getColumns(null, schemaName, tableName, null)) {
+            while (resultSet.next()) {
+                String columnName = resultSet.getString("COLUMN_NAME");
+                columns.add(columnName);
+            }
+        }
+
+        return columns;
+    }
+
+    /**
+     * 鑾峰彇琛ㄧ殑涓婚敭鍒�
+     */
+    private static String getPrimaryKeyColumn(Connection connection, String schemaName, String tableName) throws SQLException {
+        DatabaseMetaData metaData = connection.getMetaData();
+        try (ResultSet resultSet = metaData.getPrimaryKeys(null, schemaName, tableName)) {
+            if (resultSet.next()) {
+                return resultSet.getString("COLUMN_NAME");
+            }
+        }
+        return "id"; // 榛樿浣跨敤id浣滀负涓婚敭锛屽鏋滄病鏈夋壘鍒颁富閿�
+    }
+
+    /**
+     * 涓烘墍鏈夎〃鐢熸垚瑙﹀彂鍣�
+     */
+    private static void generateTriggersForTables(Connection connection, String schemaName, String logTableName, List<String> tables) throws SQLException, IOException {
+        try (FileWriter writer = new FileWriter("triggers.sql")) {
+            for (String tableName : tables) {
+                // 鑾峰彇琛ㄧ粨鏋勪俊鎭�
+                List<String> columns = getTableColumns(connection, schemaName, tableName);
+                String primaryKey = getPrimaryKeyColumn(connection, schemaName, tableName);
+
+                // 鐢熸垚瑙﹀彂鍣� SQL
+                String triggerSQL = generateTriggerSQL(schemaName, tableName, logTableName, columns, primaryKey);
+
+                // 灏嗙敓鎴愮殑瑙﹀彂鍣� SQL 鍐欏叆鏂囦欢
+                writer.write("-- 瑙﹀彂鍣ㄨ〃: " + tableName + "\n");
+                writer.write(triggerSQL);
+                writer.write("\n\n");
+
+                // 濡傛灉闇�瑕侊紝鍙互鐩存帴鍦ㄦ暟鎹簱涓垱寤鸿Е鍙戝櫒
+                // createTrigger(connection, triggerSQL);
+            }
+            System.out.println("鎴愬姛鐢熸垚瑙﹀彂鍣ㄥ苟淇濆瓨鍒癟riggers.sql涓�!");
+        }
+    }
+
+    /**
+     * 鐢熸垚 SQL Server 瑙﹀彂鍣� SQL
+     */
+    private static String generateTriggerSQL(String schemaName, String tableName, String logTableName, List<String> columns, String primaryKey) {
+        StringBuilder triggerSQL = new StringBuilder();
+
+        // 瑙﹀彂鍣ㄥご閮�
+        triggerSQL.append("CREATE TRIGGER [")
+                .append(tableName)
+                .append("_trigger]\n")
+                .append("ON [")
+                .append(schemaName)
+                .append("].[").append(tableName).append("]\n")
+                .append("AFTER INSERT, UPDATE, DELETE\n")
+                .append("AS\n")
+                .append("BEGIN\n")
+                .append("    SET NOCOUNT ON;\n\n");
+
+        // 鎻掑叆鎿嶄綔
+        triggerSQL.append("    -- 鎻掑叆鎿嶄綔\n")
+                .append("    IF EXISTS (SELECT * FROM inserted) AND NOT EXISTS (SELECT * FROM deleted)\n")
+                .append("    BEGIN\n")
+                .append("        INSERT INTO [").append(logTableName).append("] (action, create_time, sql_log)\n")
+                .append("        SELECT 'INSERT', GETDATE(), 'INSERT INTO [").append(tableName).append("] (");
+
+        // 鎷兼帴瀛楁鍚�
+        for (int i = 0; i < columns.size(); i++) {
+            triggerSQL.append("[").append(columns.get(i)).append("]");
+            if (i < columns.size() - 1) {
+                triggerSQL.append(", ");
+            }
+        }
+
+        triggerSQL.append(") VALUES (''' + ");
+
+        // 鎷兼帴瀛楁鍊�
+        for (int i = 0; i < columns.size(); i++) {
+            triggerSQL.append("ISNULL(CAST(i.").append(columns.get(i)).append(" AS NVARCHAR(MAX)), '') + '''");
+            if (i < columns.size() - 1) {
+                triggerSQL.append(", ''' + ");
+            }
+        }
+
+        triggerSQL.append(");'\n")
+                .append("        FROM inserted i;\n")
+                .append("    END\n\n");
+
+        // 鏇存柊鎿嶄綔
+        triggerSQL.append("    -- 鏇存柊鎿嶄綔\n")
+                .append("    IF EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted)\n")
+                .append("    BEGIN\n")
+                .append("        INSERT INTO [").append(logTableName).append("] (action, create_time, sql_log)\n")
+                .append("        SELECT 'UPDATE', GETDATE(), 'UPDATE [").append(tableName).append("] SET ");
+
+        // 鎷兼帴鏇存柊瀛楁
+        for (int i = 0; i < columns.size(); i++) {
+            triggerSQL.append("[").append(columns.get(i)).append("] = ''' + ISNULL(CAST(i.").append(columns.get(i)).append(" AS NVARCHAR(MAX)), '') + '''");
+            if (i < columns.size() - 1) {
+                triggerSQL.append(", ");
+            }
+        }
+
+        triggerSQL.append(" WHERE [").append(primaryKey).append("] = ''' + ISNULL(CAST(d.").append(primaryKey).append(" AS NVARCHAR(MAX)), '') + ''';'\n")
+                .append("        FROM inserted i\n")
+                .append("        INNER JOIN deleted d ON i.").append(primaryKey).append(" = d.").append(primaryKey).append(";\n")
+                .append("    END\n\n");
+
+        // 鍒犻櫎鎿嶄綔
+        triggerSQL.append("    -- 鍒犻櫎鎿嶄綔\n")
+                .append("    IF NOT EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted)\n")
+                .append("    BEGIN\n")
+                .append("        INSERT INTO [").append(logTableName).append("] (action, create_time, sql_log)\n")
+                .append("        SELECT 'DELETE', GETDATE(), 'DELETE FROM [").append(tableName).append("] WHERE [").append(primaryKey).append("] = ''' + ISNULL(CAST(d.").append(primaryKey).append(" AS NVARCHAR(MAX)), '') + ''';'\n")
+                .append("        FROM deleted d;\n")
+                .append("    END\n\n");
+
+        triggerSQL.append("END;\n");
+
+        return triggerSQL.toString();
+    }
+
+//    /**
+//     * 鍦ㄦ暟鎹簱涓垱寤鸿Е鍙戝櫒
+//     */
+//    private static void createTrigger(Connection connection, String triggerSQL) throws SQLException {
+//        try (Statement statement = connection.createStatement()) {
+//            statement.execute(triggerSQL);
+//            System.out.println("Trigger created successfully!");
+//        }
+//    }
+}
\ No newline at end of file
diff --git a/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml b/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
index 686fd74..55b1f1f 100644
--- a/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
+++ b/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
@@ -328,3 +328,6 @@
 
 security:
   encryption-key: 1234567890abcdef
+#mdc鏂囦欢璺緞閰嶇疆
+fileService:
+  localFilePath: D:/data/sql/     #鏈湴鏂囦欢璺緞
\ No newline at end of file

--
Gitblit v1.9.3