From 5337f7e768ad8aed774c204c636d1cf244a8a3dc Mon Sep 17 00:00:00 2001 From: cuikaidong <ckd2942379034@163.com> Date: 星期一, 15 九月 2025 16:03:08 +0800 Subject: [PATCH] 定时生成csv文件参数 --- lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/quartz/job/SampleJob.java | 5 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/iot/entity/EquipmentCsvData.java | 72 +++++++ lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/iot/service/IEquipmentService.java | 7 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/iot/service/impl/EquipmentServiceImpl.java | 7 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/quartz/job/ParameterCsvJob.java | 471 +++++++++++++++++++++++++++++++++++++++++++++++ pom.xml | 5 6 files changed, 562 insertions(+), 5 deletions(-) diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/iot/entity/EquipmentCsvData.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/iot/entity/EquipmentCsvData.java new file mode 100644 index 0000000..3a455fd --- /dev/null +++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/iot/entity/EquipmentCsvData.java @@ -0,0 +1,72 @@ +package org.jeecg.modules.iot.entity; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description: 璁惧鍗曡〃鐢熸垚csv鏂囦欢 + * @Author: cuikaidong + * @Date: 2025-9-15 + * @Version: V1.0 + */ +@Data +public class EquipmentCsvData implements Serializable { + private static final long serialVersionUID = 1L; + + private String k_device; + private String k_ts; + private String IsConnected; + private String Status; + private String ThreeColorIndicatorState; + private String ProgramName; + private String ProgramNo; + private String SubProgramNo; + private String SpindleOverride; + private String FeedrateOverride; + private String AlarmCode; + private String AlarmMessage; + private String SpindleLoad; + private String SpindleSpeed; + private String FeedRate; + private String CurrentExecutionLine; + private String ExecutingCode; + private String ToolNo; + private String XmechanicalCoordinate; + private String YmechanicalCoordinate; + private String ZmechanicalCoordinate; + private String AmechanicalCoordinateA; + private String BmechanicalCoordinateB; + private String XabsoluteCoordinate; + private String YabsoluteCoordinate; + private String ZabsoluteCoordinate; + private String AabsoluteCoordinate; + private String BabsoluteCoordinate; + private String VTVersion; + private String SerialNumber; + private String Temperature; + private String XaccelerationRMS; + private String YaccelerationRMS; + private String ZaccelerationRMS; + private String XvelocityRMS; + private String YvelocityRMS; + private String ZvelocityRMS; + private String XdisplacementRMS; + private String YdisplacementRMS; + private String ZdisplacementRMS; + private String XvelocityMax; + private String YvelocityMax; + private String ZvelocityMax; + private String XaccelerationMax; + private String YaccelerationMax; + private String ZaccelerationMax; + private String XdisplacementMax; + private String YdisplacementMax; + private String ZdisplacementMax; + private String AccelerationHrate; + private String AccelerationLrate; + private String VelocityHrate; + private String VelocityLrate; + private String DisplacementHrate; + private String DisplacementLrate; +} \ No newline at end of file diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/iot/service/IEquipmentService.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/iot/service/IEquipmentService.java index 90300cf..a711fbc 100644 --- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/iot/service/IEquipmentService.java +++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/iot/service/IEquipmentService.java @@ -121,4 +121,11 @@ * @return */ void insertMySqlData(String tableName, String[] columns, Object[] values); + + /** + * 鏌ヨ鎵�鏈夎櫄璁惧 + * + * @return + */ + List<Equipment> findEquipmentByTypeList(); } diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/iot/service/impl/EquipmentServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/iot/service/impl/EquipmentServiceImpl.java index 47680dd..5ddb4d9 100644 --- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/iot/service/impl/EquipmentServiceImpl.java +++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/iot/service/impl/EquipmentServiceImpl.java @@ -513,4 +513,11 @@ throw new RuntimeException("MySQL鎻掑叆鏁版嵁澶辫触", e); } } + + @Override + public List<Equipment> findEquipmentByTypeList() { + return new LambdaQueryChainWrapper<>(baseMapper) + .eq(Equipment::getEquipmentType, 0) + .list(); + } } diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/quartz/job/ParameterCsvJob.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/quartz/job/ParameterCsvJob.java new file mode 100644 index 0000000..5f86a30 --- /dev/null +++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/quartz/job/ParameterCsvJob.java @@ -0,0 +1,471 @@ +package org.jeecg.modules.quartz.job; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVPrinter; +import org.jeecg.modules.iot.entity.Equipment; +import org.jeecg.modules.iot.entity.EquipmentCsvData; +import org.jeecg.modules.iot.service.IEquipmentService; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.datasource.DataSourceUtils; + +import javax.sql.DataSource; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.lang.reflect.Method; +import java.sql.*; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 瀹氭椂鐢熸垚csv鏂囦欢 + * + * @Author Scott + */ +@Slf4j +public class ParameterCsvJob implements Job { + + @Autowired + private IEquipmentService equipmentService; + @Autowired + private DataSource dataSource; + // CSV鏂囦欢淇濆瓨璺緞 + private static final String CSV_FILE_PATH = "D:/iot/"; + private static final Map<String, String> FIELD_MAPPING = new HashMap<>(); + + static { + // 鍒濆鍖栧瓧娈垫槧灏勶細key鏄暟鎹簱瀛楁鍚嶏紝value鏄疌SV/瀹炰綋绫诲瓧娈靛悕 + FIELD_MAPPING.put("CollectTime", "k_ts"); + FIELD_MAPPING.put("EquipmentID", "k_device"); + FIELD_MAPPING.put("ProgramNo", "ProgramNumber"); + // 鍙互娣诲姞鍏朵粬闇�瑕佹槧灏勭殑瀛楁 + } + + private static final List<DateTimeFormatter> INPUT_FORMATTERS = Arrays.asList( + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"), // 鏍囧噯鏍煎紡锛堢洰鏍囨牸寮忥級 + DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"), // 鏂滄潬鍒嗛殧 + DateTimeFormatter.ofPattern("yyyy-M-d H:m:s"), // 涓嶈ˉ闆舵牸寮� + DateTimeFormatter.ofPattern("yyyy/MM/d HH:mm:ss"), // 娣峰悎鏍煎紡 + DateTimeFormatter.ISO_LOCAL_DATE_TIME // 甯鐨勬牸寮忥紙濡�2025-09-15T10:21:11锛� + ); + + // 杈撳嚭鏍煎紡锛氫弗鏍兼寚瀹氫负yyyy-MM-dd HH:mm:ss锛堣ˉ闆�+杩炲瓧绗︼級 + private static final DateTimeFormatter OUTPUT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + // 鏌ヨ鎵�鏈夎櫄璁惧 + List<Equipment> equipmentByTypeList = equipmentService.findEquipmentByTypeList(); + if (CollectionUtils.isNotEmpty(equipmentByTypeList)) { + // 閬嶅巻铏氳澶� + equipmentByTypeList.forEach(eq -> { + String tableName = eq.getControlSystem() + "_" + eq.getEqptCode().replace('-', '_'); + if (doesTheTableExist(tableName)) { + queryLastHourDataAndExportToCsv(tableName); + } + }); + } + } + + // 楠岃瘉鏄惁瀛樺湪 + Boolean doesTheTableExist(String tableName) { + boolean tableExists = false; + // 鑾峰彇鏁版嵁搴撹繛鎺� + try (Connection connection = dataSource.getConnection()) { + // 鏌ヨ铏氳澶囨槸鍚︽湁鍗曡〃 + // 鑾峰彇鏁版嵁搴撲骇鍝佸悕绉颁互鍖哄垎鏁版嵁搴撶被鍨� + String databaseProductName = connection.getMetaData().getDatabaseProductName(); + // 琛ㄥ悕杞崲 + if (databaseProductName.contains("MySQL")) { + // MySQL: 鏌ヨinformation_schema搴� + String sql = "SELECT COUNT(*) FROM information_schema.tables " + + "WHERE table_schema = DATABASE() AND table_name = ?"; + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + stmt.setString(1, tableName); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + tableExists = rs.getInt(1) > 0; + } + } + } + } else if (databaseProductName.contains("SQL Server")) { + // SQL Server: 鏌ヨsys.tables + String sql = "SELECT COUNT(*) FROM sys.tables WHERE name = ?"; + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + stmt.setString(1, tableName); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + tableExists = rs.getInt(1) > 0; + } + } + } + } else { + log.info("涓嶆敮鎸佺殑鏁版嵁搴撶被鍨�: " + databaseProductName); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return tableExists; + } + + public void queryLastHourDataAndExportToCsv(String tableName) { + LocalDateTime now = LocalDateTime.now(); + LocalDateTime lastHourStart = now.truncatedTo(ChronoUnit.HOURS).minusHours(1); + LocalDateTime lastHourEnd = lastHourStart.plusHours(1).minusSeconds(1); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String startTimeStr = lastHourStart.format(formatter); + String endTimeStr = lastHourEnd.format(formatter); + log.info("鏌ヨ鏃堕棿鑼冨洿锛歿} ~ {}", startTimeStr, endTimeStr); + + String sql = String.format("SELECT * FROM %s WHERE CollectTime BETWEEN ? AND ?", tableName); + List<EquipmentCsvData> dataList = new ArrayList<>(); + + try (Connection conn = DataSourceUtils.getConnection(dataSource); + PreparedStatement pstmt = conn.prepareStatement(sql)) { + pstmt.setString(1, startTimeStr); + pstmt.setString(2, endTimeStr); + + try (ResultSet rs = pstmt.executeQuery()) { + ResultSetMetaData metaData = rs.getMetaData(); + int columnCount = metaData.getColumnCount(); + log.debug("鏁版嵁搴撹繑鍥炲瓧娈垫�绘暟锛歿}锛屽瓧娈靛垪琛細{}", columnCount, getColumnNames(metaData)); + + // 楠岃瘉鍏抽敭瀛楁鏄惁瀛樺湪 + boolean hasCollectTime = false; + boolean hasEquipmentID = false; + for (int i = 1; i <= columnCount; i++) { + String colName = metaData.getColumnName(i); + if ("CollectTime".equals(colName)) hasCollectTime = true; + if ("EquipmentID".equals(colName)) hasEquipmentID = true; + } + log.info("鏁版嵁搴撴槸鍚﹀寘鍚獵ollectTime锛歿}锛屾槸鍚﹀寘鍚獷quipmentID锛歿}", hasCollectTime, hasEquipmentID); + + int totalCount = 0; + while (rs.next()) { + totalCount++; + EquipmentCsvData csvData = new EquipmentCsvData(); + + // 鎵嬪姩澶勭悊鍏抽敭瀛楁锛堢‘淇濇槧灏勭敓鏁堬級 + handleCriticalFields(csvData, rs); + + // 澶勭悊鍏朵粬瀛楁 + for (int i = 1; i <= columnCount; i++) { + String dbColName = metaData.getColumnName(i); + // 璺宠繃宸叉墜鍔ㄥ鐞嗙殑瀛楁 + if ("CollectTime".equals(dbColName) || "EquipmentID".equals(dbColName)) { + continue; + } + Object value = rs.getObject(i); + setFieldValue(csvData, dbColName, value); + } + + dataList.add(csvData); + log.debug("绗瑊}鏉℃暟鎹細k_device={}, k_ts={}", + totalCount, csvData.getK_device(), csvData.getK_ts()); + } + log.info("鏌ヨ瀹屾垚锛屽叡{}鏉℃暟鎹�", totalCount); + } + } catch (SQLException e) { + log.error("鏌ヨ澶辫触", e); + return; + } + + if (!dataList.isEmpty()) { + String fileName = CSV_FILE_PATH + tableName + "_" + + lastHourStart.format(DateTimeFormatter.ofPattern("yyyyMMddHH")) + ".csv"; + exportToCsv(dataList, fileName); + } else { + log.info("鏃犳暟鎹鍑�"); + } + } + + // 鎵嬪姩澶勭悊鍏抽敭瀛楁锛堥伩鍏嶅弽灏勫け璐ワ級 + private void handleCriticalFields(EquipmentCsvData csvData, ResultSet rs) throws SQLException { + // 鏈虹粍鐘舵�� + Object status = rs.getObject("Oporation"); + if (status != null) { + String statusStr = status.toString().trim(); + // 鐘舵�佸�艰浆鎹㈡槧灏� + switch (statusStr) { + case "0": + csvData.setStatus("3"); + break; + case "2": + csvData.setStatus("6"); + break; + case "3": + csvData.setStatus("10"); + break; + } + // 鏈虹粍鐘舵�� + Object isAlarm = rs.getObject("lsAlarm"); + if (isAlarm != null && status.toString().trim().equals("True")) { + csvData.setStatus("16"); + } + } + // 璁惧鐘舵�� + Object oporation = rs.getObject("Oporation"); + if (oporation != null) { + csvData.setThreeColorIndicatorState(oporation.toString().trim()); + } + // 澶勭悊EquipmentID鈫択_device锛堜繚鎸佷笉鍙橈級 + Object equipmentId = rs.getObject("EquipmentID"); + if (equipmentId != null) { + csvData.setK_device(equipmentId.toString().trim()); + } + // 绋嬪簭缂栧彿 + Object programNumber = rs.getObject("ProgramNumber"); + if (programNumber != null) { + csvData.setProgramNo(programNumber.toString().trim()); + } + // 杩涚粰鍊嶇巼 + Object feedOverride = rs.getObject("FeedOverride"); + if (feedOverride != null) { + csvData.setFeedrateOverride(feedOverride.toString().trim()); + } + // 鎶ヨ浠g爜 + Object alarmNo = rs.getObject("AlarmNo"); + if (alarmNo != null) { + csvData.setAlarmCode(alarmNo.toString().trim()); + } + // 鎶ヨ鍐呭 + Object alarmInfo = rs.getObject("AlarmInfo"); + if (alarmInfo != null) { + csvData.setAlarmMessage(alarmInfo.toString().trim()); + } + // 涓昏酱杞�� + Object actualSpindleSpeed = rs.getObject("ActualSpindleSpeed"); + if (actualSpindleSpeed != null) { + csvData.setSpindleSpeed(actualSpindleSpeed.toString().trim()); + } + // 杩涚粰閫熷害 + Object actualFeedRate = rs.getObject("ActualFeedRate"); + if (actualSpindleSpeed != null) { + csvData.setFeedRate(actualFeedRate.toString().trim()); + } + // 褰撳墠鎵ц琛屽彿 + Object executingCode = rs.getObject("ExecutingCode"); + if (executingCode != null) { + csvData.setCurrentExecutionLine(executingCode.toString().trim()); + } + // 鏈烘鍧愭爣 + Object xmachine = rs.getObject("Xmachine"); + if (xmachine != null) { + csvData.setXmechanicalCoordinate(xmachine.toString().trim()); + } + // 鏈烘鍧愭爣 + Object ymachine = rs.getObject("Ymachine"); + if (ymachine != null) { + csvData.setYmechanicalCoordinate(ymachine.toString().trim()); + } + // 鏈烘鍧愭爣 + Object zmachine = rs.getObject("Zmachine"); + if (zmachine != null) { + csvData.setZmechanicalCoordinate(zmachine.toString().trim()); + } + // 鏈烘鍧愭爣 + Object amachine = rs.getObject("Amachine"); + if (amachine != null) { + csvData.setAmechanicalCoordinateA(amachine.toString().trim()); + } + // 鏈烘鍧愭爣 + Object bmachine = rs.getObject("Bmachine"); + if (bmachine != null) { + csvData.setBmechanicalCoordinateB(bmachine.toString().trim()); + } + // 缁濆鍧愭爣 + Object aabsolute = rs.getObject("Aabsolute"); + if (aabsolute != null) { + csvData.setAabsoluteCoordinate(aabsolute.toString().trim()); + } + // 缁濆鍧愭爣 + Object babsolute = rs.getObject("Babsolute"); + if (babsolute != null) { + csvData.setBabsoluteCoordinate(babsolute.toString().trim()); + } + // 缁濆鍧愭爣 + Object xabsolute = rs.getObject("Xabsolute"); + if (xabsolute != null) { + csvData.setXabsoluteCoordinate(xabsolute.toString().trim()); + } + // 缁濆鍧愭爣 + Object yabsolute = rs.getObject("Yabsolute"); + if (babsolute != null) { + csvData.setYabsoluteCoordinate(yabsolute.toString().trim()); + } + // 缁濆鍧愭爣 + Object zabsolute = rs.getObject("Zabsolute"); + if (zabsolute != null) { + csvData.setZabsoluteCoordinate(zabsolute.toString().trim()); + } + // 鐩稿鍧愭爣 + Object arelative = rs.getObject("Arelative"); + if (zabsolute != null) { + csvData.setZabsoluteCoordinate(arelative.toString().trim()); + } + // 澶勭悊CollectTime鈫択_ts锛堜娇鐢ㄦ敼杩涚殑杞崲鏂规硶锛� + Object collectTimeObj = rs.getObject("CollectTime"); + if (collectTimeObj != null) { + String formattedTime = convertTimeFormat(collectTimeObj.toString()); + csvData.setK_ts(formattedTime); + } + } + + // 澶勭悊鍏朵粬瀛楁鐨勯�氱敤鏂规硶 + private void setFieldValue(EquipmentCsvData csvData, String dbColName, Object value) { + if (value == null) return; + + String fieldName = FIELD_MAPPING.getOrDefault(dbColName, dbColName); + fieldName = fieldName.replaceAll("[^a-zA-Z0-9]", ""); + + try { + String setterName = "set" + + fieldName.substring(0, 1).toUpperCase() + + fieldName.substring(1); + Method setter = EquipmentCsvData.class.getMethod(setterName, String.class); + setter.invoke(csvData, value.toString()); + } catch (Exception e) { + log.debug("瀛楁{}璁剧疆澶辫触锛堝彲蹇界暐锛�", fieldName); + } + } + + private void exportToCsv(List<EquipmentCsvData> dataList, String filePath) { + File file = new File(filePath); + File parent = file.getParentFile(); + if (parent != null && !parent.exists()) { + parent.mkdirs(); + } + + try (FileWriter writer = new FileWriter(file); + CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT + .withHeader("k_device", "k_ts", "IsConnected", "Status", + "ThreeColorIndicatorState", "ProgramName", "ProgramNo", + "SubProgramNo", "SpindleOverride", "FeedrateOverride", + "AlarmCode", "AlarmMessage", "SpindleLoad", "SpindleSpeed", + "FeedRate", "CurrentExecutionLine", "ExecutingCode", + "ToolNo", "XmechanicalCoordinate", "YmechanicalCoordinate", + "ZmechanicalCoordinate", "AmechanicalCoordinateA", + "BmechanicalCoordinateB", "XabsoluteCoordinate", + "YabsoluteCoordinate", "ZabsoluteCoordinate", + "AabsoluteCoordinate", "BabsoluteCoordinate", "VTVersion", + "SerialNumber", "Temperature", "XaccelerationRMS", + "YaccelerationRMS", "ZaccelerationRMS", "XvelocityRMS", + "YvelocityRMS", "ZvelocityRMS", "XdisplacementRMS", + "YdisplacementRMS", "ZdisplacementRMS", "XvelocityMax", + "YvelocityMax", "ZvelocityMax", "XaccelerationMax", + "YaccelerationMax", "ZaccelerationMax", "XdisplacementMax", + "YdisplacementMax", "ZdisplacementMax", "AccelerationHrate", + "AccelerationLrate", "VelocityHrate", "VelocityLrate", + "DisplacementHrate", "DisplacementLrate"))) { + + for (EquipmentCsvData data : dataList) { + csvPrinter.printRecord( + data.getK_device(), + data.getK_ts(), + data.getIsConnected(), + data.getStatus(), + data.getThreeColorIndicatorState(), + data.getProgramName(), + data.getProgramNo(), + data.getSubProgramNo(), + data.getSpindleOverride(), + data.getFeedrateOverride(), + data.getAlarmCode(), + data.getAlarmMessage(), + data.getSpindleLoad(), + data.getSpindleSpeed(), + data.getFeedRate(), + data.getCurrentExecutionLine(), + data.getExecutingCode(), + data.getToolNo(), + data.getXmechanicalCoordinate(), + data.getYmechanicalCoordinate(), + data.getZmechanicalCoordinate(), + data.getAmechanicalCoordinateA(), + data.getBmechanicalCoordinateB(), + data.getXabsoluteCoordinate(), + data.getYabsoluteCoordinate(), + data.getZabsoluteCoordinate(), + data.getAabsoluteCoordinate(), + data.getBabsoluteCoordinate(), + data.getVTVersion(), + data.getSerialNumber(), + data.getTemperature(), + data.getXaccelerationRMS(), + data.getYaccelerationRMS(), + data.getZaccelerationRMS(), + data.getXvelocityRMS(), + data.getYvelocityRMS(), + data.getZvelocityRMS(), + data.getXdisplacementRMS(), + data.getYdisplacementRMS(), + data.getZdisplacementRMS(), + data.getXvelocityMax(), + data.getYvelocityMax(), + data.getZvelocityMax(), + data.getXaccelerationMax(), + data.getYaccelerationMax(), + data.getZaccelerationMax(), + data.getXdisplacementMax(), + data.getYdisplacementMax(), + data.getZdisplacementMax(), + data.getAccelerationHrate(), + data.getAccelerationLrate(), + data.getVelocityHrate(), + data.getVelocityLrate(), + data.getDisplacementHrate(), + data.getDisplacementLrate() + ); + } + log.info("CSV瀵煎嚭鎴愬姛锛歿}", filePath); + } catch (IOException e) { + log.error("CSV瀵煎嚭澶辫触", e); + } + } + + private String getColumnNames(ResultSetMetaData metaData) throws SQLException { + StringBuilder sb = new StringBuilder(); + for (int i = 1; i <= metaData.getColumnCount(); i++) { + sb.append(metaData.getColumnName(i)).append(","); + } + return sb.toString(); + } + + // 鏃堕棿鏍煎紡杞崲鏍稿績鏂规硶 + private String convertTimeFormat(String originalTime) { + if (originalTime == null || originalTime.trim().isEmpty()) { + log.warn("鍘熷鏃堕棿涓虹┖"); + return ""; + } + + // 鍘婚櫎鍘熷鏃堕棿涓殑澶氫綑绌烘牸 + String trimmedTime = originalTime.trim().replaceAll("\\s+", " "); + + // 灏濊瘯鎵�鏈夊彲鑳界殑杈撳叆鏍煎紡杩涜瑙f瀽 + for (DateTimeFormatter formatter : INPUT_FORMATTERS) { + try { + LocalDateTime dateTime = LocalDateTime.parse(trimmedTime, formatter); + // 寮哄埗杞崲涓虹洰鏍囨牸寮� + String formattedTime = dateTime.format(OUTPUT_FORMATTER); + log.debug("鏃堕棿杞崲鎴愬姛锛歿} 鈫� {}", trimmedTime, formattedTime); + return formattedTime; + } catch (DateTimeParseException e) { + // 灏濊瘯涓嬩竴绉嶆牸寮� + continue; + } + } + + // 鎵�鏈夋牸寮忛兘瑙f瀽澶辫触鏃讹紝璁板綍璀﹀憡骞惰繑鍥炲師濮嬪�硷紙閬垮厤鐮村潖鏁版嵁锛� + log.warn("鏃犳硶杞崲鏃堕棿鏍煎紡涓簓yyy-MM-dd HH:mm:ss锛屽師濮嬪�硷細{}", trimmedTime); + return trimmedTime; + } + +} diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/quartz/job/SampleJob.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/quartz/job/SampleJob.java index b51176e..30d18ba 100644 --- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/quartz/job/SampleJob.java +++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/quartz/job/SampleJob.java @@ -49,10 +49,5 @@ } }); } - - // 鏌ヨ铏氳澶囦笅鍙傛暟瀛樺湪oporation鐨勮櫄璁惧鍒楄〃 - List<ServerDeploy> serverDeploy = serverDeployService.list(); - // 鏌ヨ鏄惁瀛樺湪璁惧鐘舵�� - } } diff --git a/pom.xml b/pom.xml index 4b29992..61ee649 100644 --- a/pom.xml +++ b/pom.xml @@ -99,6 +99,11 @@ <dependencies> <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-csv</artifactId> + <version>1.9.0</version> + </dependency> + <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.3.8</version> -- Gitblit v1.9.3