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()); } } 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/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/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/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> { /** * 导åºåæ¥æ°æ®è¡¨sqlå°xmlæä»¶ä¸ä¼ å°ç½é¸æå¡å¨ */ void exportDataToXml(); } 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); } 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"; /** * 导åºåæ¥æ°æ®è¡¨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"; 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())); } } } 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; } 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,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ï¼æä»¶å¤§å°ï¼åä½ä¸º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-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("æåçæè§¦åå¨å¹¶ä¿åå°Triggers.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!"); // } // } } 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/ #æ¬å°æä»¶è·¯å¾