From 4610578ccf4b5e00d534cc50d0ecca5a4ed16798 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Fri, 3 Jan 2025 15:02:54 +0800 Subject: [PATCH 01/13] 'commit' --- .../com/dsideal/base/Tools/ExportExcel.java | 23 +++++ src/main/resources/Sql/ExportExcel.sql | 98 +++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 src/main/java/com/dsideal/base/Tools/ExportExcel.java create mode 100644 src/main/resources/Sql/ExportExcel.sql diff --git a/src/main/java/com/dsideal/base/Tools/ExportExcel.java b/src/main/java/com/dsideal/base/Tools/ExportExcel.java new file mode 100644 index 00000000..c4026e69 --- /dev/null +++ b/src/main/java/com/dsideal/base/Tools/ExportExcel.java @@ -0,0 +1,23 @@ +package com.dsideal.base.Tools; + +import com.dsideal.base.Tools.Util.LocalMysqlConnectUtil; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Record; +import com.jfinal.plugin.activerecord.SqlPara; + +import java.util.List; + +import static com.dsideal.base.DataEase.Model.DataEaseModel.DB_NAME; + +public class ExportExcel { + public static void main(String[] args) { + LocalMysqlConnectUtil.Init(); + + SqlPara sqlPara = Db.getSqlPara("exportExcel.Xqry"); + List list = Db.use(DB_NAME).find(sqlPara); + + for (Record record : list) { + System.out.println(record); + } + } +} diff --git a/src/main/resources/Sql/ExportExcel.sql b/src/main/resources/Sql/ExportExcel.sql new file mode 100644 index 00000000..d77778a7 --- /dev/null +++ b/src/main/resources/Sql/ExportExcel.sql @@ -0,0 +1,98 @@ +#namespace("exportExcel") + -- 学前入园幼儿入园总量 + #sql("Xqry") + (SELECT + 行政区划, + 上级行政区划, + '总入园数' as 分类, + MAX(IF(年份 = 2023, 总量数值, NULL)) as '2023', + MAX(IF(年份 = 2024, 总量数值, NULL)) as '2024', + MAX(IF(年份 = 2025, 总量数值, NULL)) as '2025', + MAX(IF(年份 = 2026, 总量数值, NULL)) as '2026', + MAX(IF(年份 = 2027, 总量数值, NULL)) as '2027', + MAX(IF(年份 = 2028, 总量数值, NULL)) as '2028', + MAX(IF(年份 = 2029, 总量数值, NULL)) as '2029', + MAX(IF(年份 = 2030, 总量数值, NULL)) as '2030', + MAX(IF(年份 = 2031, 总量数值, NULL)) as '2031', + MAX(IF(年份 = 2032, 总量数值, NULL)) as '2032', + MAX(IF(年份 = 2033, 总量数值, NULL)) as '2033', + MAX(IF(年份 = 2034, 总量数值, NULL)) as '2034' + FROM excel_学前幼儿入园总量_b25b1b09b0 + WHERE 总量分类 = '总入园数' + GROUP BY 行政区划, 上级行政区划) + + UNION ALL + + (SELECT + 行政区划, + 上级行政区划, + '城区' as 分类, + MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', + MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', + MAX(IF(年份 = 2025, 区域数值, NULL)) as '2025', + MAX(IF(年份 = 2026, 区域数值, NULL)) as '2026', + MAX(IF(年份 = 2027, 区域数值, NULL)) as '2027', + MAX(IF(年份 = 2028, 区域数值, NULL)) as '2028', + MAX(IF(年份 = 2029, 区域数值, NULL)) as '2029', + MAX(IF(年份 = 2030, 区域数值, NULL)) as '2030', + MAX(IF(年份 = 2031, 区域数值, NULL)) as '2031', + MAX(IF(年份 = 2032, 区域数值, NULL)) as '2032', + MAX(IF(年份 = 2033, 区域数值, NULL)) as '2033', + MAX(IF(年份 = 2034, 区域数值, NULL)) as '2034' + FROM excel_学前幼儿入园总量_b25b1b09b0 + WHERE 区域分类 = '城区' + GROUP BY 行政区划, 上级行政区划) + + UNION ALL + + (SELECT + 行政区划, + 上级行政区划, + '镇区' as 分类, + MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', + MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', + MAX(IF(年份 = 2025, 区域数值, NULL)) as '2025', + MAX(IF(年份 = 2026, 区域数值, NULL)) as '2026', + MAX(IF(年份 = 2027, 区域数值, NULL)) as '2027', + MAX(IF(年份 = 2028, 区域数值, NULL)) as '2028', + MAX(IF(年份 = 2029, 区域数值, NULL)) as '2029', + MAX(IF(年份 = 2030, 区域数值, NULL)) as '2030', + MAX(IF(年份 = 2031, 区域数值, NULL)) as '2031', + MAX(IF(年份 = 2032, 区域数值, NULL)) as '2032', + MAX(IF(年份 = 2033, 区域数值, NULL)) as '2033', + MAX(IF(年份 = 2034, 区域数值, NULL)) as '2034' + FROM excel_学前幼儿入园总量_b25b1b09b0 + WHERE 区域分类 = '镇区' + GROUP BY 行政区划, 上级行政区划) + + UNION ALL + + (SELECT + 行政区划, + 上级行政区划, + '乡村' as 分类, + MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', + MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', + MAX(IF(年份 = 2025, 区域数值, NULL)) as '2025', + MAX(IF(年份 = 2026, 区域数值, NULL)) as '2026', + MAX(IF(年份 = 2027, 区域数值, NULL)) as '2027', + MAX(IF(年份 = 2028, 区域数值, NULL)) as '2028', + MAX(IF(年份 = 2029, 区域数值, NULL)) as '2029', + MAX(IF(年份 = 2030, 区域数值, NULL)) as '2030', + MAX(IF(年份 = 2031, 区域数值, NULL)) as '2031', + MAX(IF(年份 = 2032, 区域数值, NULL)) as '2032', + MAX(IF(年份 = 2033, 区域数值, NULL)) as '2033', + MAX(IF(年份 = 2034, 区域数值, NULL)) as '2034' + FROM excel_学前幼儿入园总量_b25b1b09b0 + WHERE 区域分类 = '乡村' + GROUP BY 行政区划, 上级行政区划) + + ORDER BY 上级行政区划, 行政区划, + CASE 分类 + WHEN '总入园数' THEN 1 + WHEN '城区' THEN 2 + WHEN '镇区' THEN 3 + WHEN '乡村' THEN 4 + END + #end +#end \ No newline at end of file From 1ad8c63ddb46c59b623417188f4e7d8c55b3f2e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Fri, 3 Jan 2025 15:45:49 +0800 Subject: [PATCH 02/13] 'commit' --- Excel/幼儿入园.xlsx | Bin 0 -> 11452 bytes .../com/dsideal/base/Tools/ExportExcel.java | 121 +++++++++++++++++- src/main/resources/Sql/ExportExcel.sql | 117 +++++++++++++++-- 3 files changed, 224 insertions(+), 14 deletions(-) create mode 100644 Excel/幼儿入园.xlsx diff --git a/Excel/幼儿入园.xlsx b/Excel/幼儿入园.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d3cbadc8d9a5d20ecdbbe59971e1a1fc7c0204ab GIT binary patch literal 11452 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

{*2fRaD@zzb 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 literal 0 HcmV?d00001 diff --git a/src/main/java/com/dsideal/base/Tools/ExportExcel.java b/src/main/java/com/dsideal/base/Tools/ExportExcel.java index c4026e69..2e6c0a57 100644 --- a/src/main/java/com/dsideal/base/Tools/ExportExcel.java +++ b/src/main/java/com/dsideal/base/Tools/ExportExcel.java @@ -4,20 +4,135 @@ import com.dsideal.base.Tools.Util.LocalMysqlConnectUtil; import com.jfinal.plugin.activerecord.Db; import com.jfinal.plugin.activerecord.Record; import com.jfinal.plugin.activerecord.SqlPara; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import java.io.FileOutputStream; import java.util.List; import static com.dsideal.base.DataEase.Model.DataEaseModel.DB_NAME; public class ExportExcel { + static String excelFileName = "D:\\dsWork\\YunNanDsBase\\Excel\\幼儿入园.xlsx"; + + public static void exportToExcel(List records, String filePath) { + try (Workbook workbook = new XSSFWorkbook()) { + Sheet sheet = workbook.createSheet("数据统计"); + + // 创建标题行样式 + CellStyle headerStyle = workbook.createCellStyle(); + // 设置边框 + headerStyle.setBorderTop(BorderStyle.THIN); + headerStyle.setBorderBottom(BorderStyle.THIN); + headerStyle.setBorderLeft(BorderStyle.THIN); + headerStyle.setBorderRight(BorderStyle.THIN); + // 设置背景色 + headerStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex()); + headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + // 设置对齐方式 + headerStyle.setAlignment(HorizontalAlignment.CENTER); + headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); + // 设置字体 + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerFont.setFontName("黑体"); + headerFont.setFontHeightInPoints((short) 12); + headerStyle.setFont(headerFont); + + // 创建数据行样式 + CellStyle dataStyle = workbook.createCellStyle(); + // 设置边框 + dataStyle.setBorderTop(BorderStyle.THIN); + dataStyle.setBorderBottom(BorderStyle.THIN); + dataStyle.setBorderLeft(BorderStyle.THIN); + dataStyle.setBorderRight(BorderStyle.THIN); + // 设置背景色 + dataStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex()); + dataStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + // 设置对齐方式 + dataStyle.setAlignment(HorizontalAlignment.CENTER); + dataStyle.setVerticalAlignment(VerticalAlignment.CENTER); + + // 创建表头 + Row headerRow = sheet.createRow(0); + // 设置行高 + headerRow.setHeight((short) (28 * 20)); // 28像素 ≈ 28 * 20 缇 + String[] headers = {"行政区划", "分类", "2023", "2024", "2025", "2026", + "2027", "2028", "2029", "2030", "2031", "2032", "2033", "2034"}; + for (int i = 0; i < headers.length; i++) { + Cell cell = headerRow.createCell(i); + cell.setCellValue(headers[i]); + cell.setCellStyle(headerStyle); + sheet.setColumnWidth(i, 3500); // 设置列宽 + } + + // 写入数据并处理合并单元格 + int rowNum = 1; + String lastDistrict = ""; + int mergeStartRow = 1; + + for (Record record : records) { + Row row = sheet.createRow(rowNum); + // 设置行高 + row.setHeight((short) (28 * 20)); // 28像素 ≈ 28 * 20 缇 + + String currentDistrict = record.getStr("行政区划"); + + // 填充数据 + for (int i = 0; i < headers.length; i++) { + Cell cell = row.createCell(i); + cell.setCellStyle(dataStyle); + + if (i == 0) { + cell.setCellValue(currentDistrict); + } else if (i == 1) { + cell.setCellValue(record.getStr("分类")); + } else { + Double value = record.getDouble(headers[i]); + if (value != null) { + cell.setCellValue(value); + } + } + } + + // 处理合并单元格 + if (!currentDistrict.equals(lastDistrict)) { + if (rowNum > mergeStartRow) { + // 合并行政区划列 + sheet.addMergedRegion(new CellRangeAddress( + mergeStartRow, rowNum - 1, 0, 0)); + } + mergeStartRow = rowNum; + } + + lastDistrict = currentDistrict; + rowNum++; + } + + // 处理最后一组合并 + if (rowNum > mergeStartRow) { + sheet.addMergedRegion(new CellRangeAddress( + mergeStartRow, rowNum - 1, 0, 0)); + sheet.addMergedRegion(new CellRangeAddress( + mergeStartRow, rowNum - 1, 1, 1)); + } + + // 保存文件 + try (FileOutputStream fileOut = new FileOutputStream(filePath)) { + workbook.write(fileOut); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } public static void main(String[] args) { LocalMysqlConnectUtil.Init(); SqlPara sqlPara = Db.getSqlPara("exportExcel.Xqry"); List list = Db.use(DB_NAME).find(sqlPara); - for (Record record : list) { - System.out.println(record); - } + exportToExcel(list, excelFileName); } } diff --git a/src/main/resources/Sql/ExportExcel.sql b/src/main/resources/Sql/ExportExcel.sql index d77778a7..6bf7989b 100644 --- a/src/main/resources/Sql/ExportExcel.sql +++ b/src/main/resources/Sql/ExportExcel.sql @@ -1,9 +1,10 @@ #namespace("exportExcel") -- 学前入园幼儿入园总量 #sql("Xqry") - (SELECT + -- 入园总量数据查询 + (SELECT 行政区划, - 上级行政区划, + '入园数' as 类型, '总入园数' as 分类, MAX(IF(年份 = 2023, 总量数值, NULL)) as '2023', MAX(IF(年份 = 2024, 总量数值, NULL)) as '2024', @@ -19,13 +20,13 @@ MAX(IF(年份 = 2034, 总量数值, NULL)) as '2034' FROM excel_学前幼儿入园总量_b25b1b09b0 WHERE 总量分类 = '总入园数' - GROUP BY 行政区划, 上级行政区划) + GROUP BY 行政区划) UNION ALL (SELECT 行政区划, - 上级行政区划, + '入园数' as 类型, '城区' as 分类, MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', @@ -41,13 +42,13 @@ MAX(IF(年份 = 2034, 区域数值, NULL)) as '2034' FROM excel_学前幼儿入园总量_b25b1b09b0 WHERE 区域分类 = '城区' - GROUP BY 行政区划, 上级行政区划) + GROUP BY 行政区划) UNION ALL (SELECT 行政区划, - 上级行政区划, + '入园数' as 类型, '镇区' as 分类, MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', @@ -63,13 +64,13 @@ MAX(IF(年份 = 2034, 区域数值, NULL)) as '2034' FROM excel_学前幼儿入园总量_b25b1b09b0 WHERE 区域分类 = '镇区' - GROUP BY 行政区划, 上级行政区划) + GROUP BY 行政区划) UNION ALL (SELECT 行政区划, - 上级行政区划, + '入园数' as 类型, '乡村' as 分类, MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', @@ -85,14 +86,108 @@ MAX(IF(年份 = 2034, 区域数值, NULL)) as '2034' FROM excel_学前幼儿入园总量_b25b1b09b0 WHERE 区域分类 = '乡村' - GROUP BY 行政区划, 上级行政区划) + GROUP BY 行政区划) + + UNION ALL + + -- 在园总量数据查询 + (SELECT + 行政区划, + '在园数' as 类型, + '总在园数' as 分类, + MAX(IF(年份 = 2023, 总量数值, NULL)) as '2023', + MAX(IF(年份 = 2024, 总量数值, NULL)) as '2024', + MAX(IF(年份 = 2025, 总量数值, NULL)) as '2025', + MAX(IF(年份 = 2026, 总量数值, NULL)) as '2026', + MAX(IF(年份 = 2027, 总量数值, NULL)) as '2027', + MAX(IF(年份 = 2028, 总量数值, NULL)) as '2028', + MAX(IF(年份 = 2029, 总量数值, NULL)) as '2029', + MAX(IF(年份 = 2030, 总量数值, NULL)) as '2030', + MAX(IF(年份 = 2031, 总量数值, NULL)) as '2031', + MAX(IF(年份 = 2032, 总量数值, NULL)) as '2032', + MAX(IF(年份 = 2033, 总量数值, NULL)) as '2033', + MAX(IF(年份 = 2034, 总量数值, NULL)) as '2034' + FROM excel_学前幼儿在园总量_c04222fd74 + WHERE 总量分类 = '总在园数' + GROUP BY 行政区划) + + UNION ALL + + (SELECT + 行政区划, + '在园数' as 类型, + '城区' as 分类, + MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', + MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', + MAX(IF(年份 = 2025, 区域数值, NULL)) as '2025', + MAX(IF(年份 = 2026, 区域数值, NULL)) as '2026', + MAX(IF(年份 = 2027, 区域数值, NULL)) as '2027', + MAX(IF(年份 = 2028, 区域数值, NULL)) as '2028', + MAX(IF(年份 = 2029, 区域数值, NULL)) as '2029', + MAX(IF(年份 = 2030, 区域数值, NULL)) as '2030', + MAX(IF(年份 = 2031, 区域数值, NULL)) as '2031', + MAX(IF(年份 = 2032, 区域数值, NULL)) as '2032', + MAX(IF(年份 = 2033, 区域数值, NULL)) as '2033', + MAX(IF(年份 = 2034, 区域数值, NULL)) as '2034' + FROM excel_学前幼儿在园总量_c04222fd74 + WHERE 区域分类 = '城区' + GROUP BY 行政区划) + + UNION ALL + + (SELECT + 行政区划, + '在园数' as 类型, + '镇区' as 分类, + MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', + MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', + MAX(IF(年份 = 2025, 区域数值, NULL)) as '2025', + MAX(IF(年份 = 2026, 区域数值, NULL)) as '2026', + MAX(IF(年份 = 2027, 区域数值, NULL)) as '2027', + MAX(IF(年份 = 2028, 区域数值, NULL)) as '2028', + MAX(IF(年份 = 2029, 区域数值, NULL)) as '2029', + MAX(IF(年份 = 2030, 区域数值, NULL)) as '2030', + MAX(IF(年份 = 2031, 区域数值, NULL)) as '2031', + MAX(IF(年份 = 2032, 区域数值, NULL)) as '2032', + MAX(IF(年份 = 2033, 区域数值, NULL)) as '2033', + MAX(IF(年份 = 2034, 区域数值, NULL)) as '2034' + FROM excel_学前幼儿在园总量_c04222fd74 + WHERE 区域分类 = '镇区' + GROUP BY 行政区划) + + UNION ALL + + (SELECT + 行政区划, + '在园数' as 类型, + '乡村' as 分类, + MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', + MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', + MAX(IF(年份 = 2025, 区域数值, NULL)) as '2025', + MAX(IF(年份 = 2026, 区域数值, NULL)) as '2026', + MAX(IF(年份 = 2027, 区域数值, NULL)) as '2027', + MAX(IF(年份 = 2028, 区域数值, NULL)) as '2028', + MAX(IF(年份 = 2029, 区域数值, NULL)) as '2029', + MAX(IF(年份 = 2030, 区域数值, NULL)) as '2030', + MAX(IF(年份 = 2031, 区域数值, NULL)) as '2031', + MAX(IF(年份 = 2032, 区域数值, NULL)) as '2032', + MAX(IF(年份 = 2033, 区域数值, NULL)) as '2033', + MAX(IF(年份 = 2034, 区域数值, NULL)) as '2034' + FROM excel_学前幼儿在园总量_c04222fd74 + WHERE 区域分类 = '乡村' + GROUP BY 行政区划) - ORDER BY 上级行政区划, 行政区划, + ORDER BY 行政区划, + CASE 类型 + WHEN '入园数' THEN 1 + WHEN '在园数' THEN 2 + END, CASE 分类 WHEN '总入园数' THEN 1 + WHEN '总在园数' THEN 1 WHEN '城区' THEN 2 WHEN '镇区' THEN 3 WHEN '乡村' THEN 4 - END + END; #end #end \ No newline at end of file From 0aadbe24ba795428080bd8efa3becedd438fd6ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Fri, 3 Jan 2025 15:47:30 +0800 Subject: [PATCH 03/13] 'commit' --- Excel/幼儿入园.xlsx | Bin 11452 -> 11459 bytes .../com/dsideal/base/Tools/ExportExcel.java | 1 + 2 files changed, 1 insertion(+) diff --git a/Excel/幼儿入园.xlsx b/Excel/幼儿入园.xlsx index d3cbadc8d9a5d20ecdbbe59971e1a1fc7c0204ab..a544c5c9efecd52b1460be07ed0857152a4d4eff 100644 GIT binary patch delta 1056 zcmdlJc{q|gz?+#xgn@&DgW>5$?rKKHr<>auWr5V>rA!xqWErzs{avpk1_EyJOP}nU zyCpQ-`L^p6R>#7FqDOa6=*ivqQ?aw``&-}FQI31PKh3rD*_X99-1$@Ex$kb*RnBX8 z25>7^-@W#vaJ%Pu&qvJHC-J)_`|`awxoc%h>LH6eR>>DzfK(?!MZekfkDAZ=625+w~l)Bd1;C*tt~&SGl8kVq1CG5 z#Acbg8x4Lx>)D^BD1P4;zoJlP^Ts(lcLegCFW=7p`BUcl<@>o+d`m-&A5LJO;wiGB zV8g~q@1LyPv+G{2NAQJ5CQB>5PRqt_oGiLnTwnChtobeR>5pffj__zd`R!lYqiIUd zx&B?bQ^OSC&Caor;hQKsBLl-mAVvzg&AVClfWoYTO`(2osCV9N1Ccx8FJw9137_nn zysUA_0^SFUUN3RjzQx1S<)@&B)r6w%MaMO(X6IFP+fACZl*J%vhnxAM#|3FWejM>H zyY1O1H*;gmY8m}=!96pyOrNeg_i=jr*PEvMbnopux#l(N?tF=24v|yOb`-AL>nRj% z<|9f20v0$#fYshl?1>!tFLOMK?7Q(H^KrdF+v=?k7C61nth zi%ua+*BQHo?n(-#^QA9%>27h13A|=F>v49!rcz|eUBQFqZS3|+J6|a8`QmV*q^I#wJ+@37Cw~fnsC4R zd;@>ebuXj&ALlG9cbGVFVv|(v4`H64yVtTbNWPiRdi=EHBkjwf?7IJ6J$WfVH`nNo zUB@!{@HIbxnTnl5%ckor0}}(oFE-SqvX(;&l*?{#%7Cb^Ty^rmgj1sB03^3+Spdm* zTDF`|Yn7wGX>GEJwi!??TU(ZKX>A#x`WHa;D<`w*$SHu- ur@vmb;wn&?3D7xG$jTY6a87>7DKj}ihX<%BS4WodcxhIl4z?+#xgn@&DgJI)F?rKKHjhovUWr5V>rA!xqWErzs{Y9_C1|n_os!#UW zX1)$_x~+K1Awb4rW`+2q^Zw~gy!O=d>{4gJfQcFp z9%dw~-aol-$G)4n8FM$+Ox>W9c(gC}!)8(auIWN`XZ;VY-(2`LRA-6nrrI5IcRW?x z*ceSUy9JBMCy=LI%K28NA5j1+L2_ps~%1z9DVLjBs%(|LCkMDB*4vRC-VX*{`o z(uuMwZnIXsUJ|su=b)JuKlh9i=i)>D&RJD|+4uh<@eRlQmIS)J%sKP4;M~KaN{ijE zr?~jvu}UoIo1V_yvqO(pc-Og)*N=aFX}V9_&o1TM_eu69bE;Xm-WJ`dxPMRR(Wy4= zSLb|AoA!hp(|WZqyFU9-)M?FP$0aI}x?dP!RV{#;Aewd{2IuNxL01cTm*6}Acor09OFpBKHijZf;) z@qJG%uetG?P5jO_JMj14%}f72?0Uh!=GVW}n|euiPxzFtSZo}$;c?VE?@!NOSiURo z;mvt)EP`!&;+;d@HcqZ;l}{b>T<^AAn{6h;{&;VofPrK7;*~tYJzX1FwYtPP&iOKn zKXCB-R2MAysmj-CU3AQ+|Ne$70Z;2EdH)oMxW6iP<@A78>zrO@{y21Kb;F^xQqDK# zEBctN6#nx(?__ma^*_DnE1}l^YhOKGVmE)azMAQxTxoV(s2bmcdL>Q34hRGAOm2E(3kgeoJR>F`AbVNmtesM`&>(P*pZs21mT}Q!UL850^*TDTOlLVKf8dnSK~V%WU+@9zQFD0)hNYT} Y3=$~jzv7zA%Plo|t&RX&x)w+V02lYy7XSbN diff --git a/src/main/java/com/dsideal/base/Tools/ExportExcel.java b/src/main/java/com/dsideal/base/Tools/ExportExcel.java index 2e6c0a57..f24cd9c4 100644 --- a/src/main/java/com/dsideal/base/Tools/ExportExcel.java +++ b/src/main/java/com/dsideal/base/Tools/ExportExcel.java @@ -39,6 +39,7 @@ public class ExportExcel { headerFont.setFontName("黑体"); headerFont.setFontHeightInPoints((short) 12); headerStyle.setFont(headerFont); + headerStyle.setFillForegroundColor(IndexedColors.LIME.getIndex()); // 创建数据行样式 CellStyle dataStyle = workbook.createCellStyle(); From dc334ca60d0f635eb112bd961e93f1d2dbecc333 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Fri, 3 Jan 2025 16:07:55 +0800 Subject: [PATCH 04/13] 'commit' --- Excel/幼儿入园.xlsx | Bin 11459 -> 12028 bytes .../com/dsideal/base/Tools/ExportExcel.java | 58 ++++++++++++----- src/main/resources/Sql/ExportExcel.sql | 60 +++++++++--------- 3 files changed, 72 insertions(+), 46 deletions(-) diff --git a/Excel/幼儿入园.xlsx b/Excel/幼儿入园.xlsx index a544c5c9efecd52b1460be07ed0857152a4d4eff..f2ca507559b3778814cbe5fa32c67a0937c452f3 100644 GIT binary patch delta 9645 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 delta 9036 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 mergeStartRow) { - // 合并行政区划列 + // 处理上一个行政区划的最后一组类型合并 + if (rowNum > typeMergeStartRow) { + sheet.addMergedRegion(new CellRangeAddress( + typeMergeStartRow, rowNum - 1, 1, 1)); + } + + // 处理行政区划合并 + if (rowNum > districtMergeStartRow) { + sheet.addMergedRegion(new CellRangeAddress( + districtMergeStartRow, rowNum - 1, 0, 0)); + } + districtMergeStartRow = rowNum; + typeMergeStartRow = rowNum; + } + // 在同一个行政区划内,处理类型的合并 + else if (!currentType.equals(lastType)) { + if (rowNum > typeMergeStartRow) { sheet.addMergedRegion(new CellRangeAddress( - mergeStartRow, rowNum - 1, 0, 0)); + typeMergeStartRow, rowNum - 1, 1, 1)); } - mergeStartRow = rowNum; + typeMergeStartRow = rowNum; } lastDistrict = currentDistrict; + lastType = currentType; rowNum++; } // 处理最后一组合并 - if (rowNum > mergeStartRow) { + // 先处理最后一组类型合并 + if (rowNum > typeMergeStartRow) { sheet.addMergedRegion(new CellRangeAddress( - mergeStartRow, rowNum - 1, 0, 0)); + typeMergeStartRow, rowNum - 1, 1, 1)); + } + // 再处理最后一组行政区划合并 + if (rowNum > districtMergeStartRow) { sheet.addMergedRegion(new CellRangeAddress( - mergeStartRow, rowNum - 1, 1, 1)); + districtMergeStartRow, rowNum - 1, 0, 0)); } // 保存文件 @@ -128,6 +155,7 @@ public class ExportExcel { e.printStackTrace(); } } + public static void main(String[] args) { LocalMysqlConnectUtil.Init(); diff --git a/src/main/resources/Sql/ExportExcel.sql b/src/main/resources/Sql/ExportExcel.sql index 6bf7989b..b632bf31 100644 --- a/src/main/resources/Sql/ExportExcel.sql +++ b/src/main/resources/Sql/ExportExcel.sql @@ -2,28 +2,6 @@ -- 学前入园幼儿入园总量 #sql("Xqry") -- 入园总量数据查询 - (SELECT - 行政区划, - '入园数' as 类型, - '总入园数' as 分类, - MAX(IF(年份 = 2023, 总量数值, NULL)) as '2023', - MAX(IF(年份 = 2024, 总量数值, NULL)) as '2024', - MAX(IF(年份 = 2025, 总量数值, NULL)) as '2025', - MAX(IF(年份 = 2026, 总量数值, NULL)) as '2026', - MAX(IF(年份 = 2027, 总量数值, NULL)) as '2027', - MAX(IF(年份 = 2028, 总量数值, NULL)) as '2028', - MAX(IF(年份 = 2029, 总量数值, NULL)) as '2029', - MAX(IF(年份 = 2030, 总量数值, NULL)) as '2030', - MAX(IF(年份 = 2031, 总量数值, NULL)) as '2031', - MAX(IF(年份 = 2032, 总量数值, NULL)) as '2032', - MAX(IF(年份 = 2033, 总量数值, NULL)) as '2033', - MAX(IF(年份 = 2034, 总量数值, NULL)) as '2034' - FROM excel_学前幼儿入园总量_b25b1b09b0 - WHERE 总量分类 = '总入园数' - GROUP BY 行政区划) - - UNION ALL - (SELECT 行政区划, '入园数' as 类型, @@ -90,11 +68,10 @@ UNION ALL - -- 在园总量数据查询 - (SELECT + (SELECT 行政区划, - '在园数' as 类型, - '总在园数' as 分类, + '入园数' as 类型, + '总数' as 分类, MAX(IF(年份 = 2023, 总量数值, NULL)) as '2023', MAX(IF(年份 = 2024, 总量数值, NULL)) as '2024', MAX(IF(年份 = 2025, 总量数值, NULL)) as '2025', @@ -107,15 +84,16 @@ MAX(IF(年份 = 2032, 总量数值, NULL)) as '2032', MAX(IF(年份 = 2033, 总量数值, NULL)) as '2033', MAX(IF(年份 = 2034, 总量数值, NULL)) as '2034' - FROM excel_学前幼儿在园总量_c04222fd74 - WHERE 总量分类 = '总在园数' + FROM excel_学前幼儿入园总量_b25b1b09b0 + WHERE 总量分类 = '总入园数' GROUP BY 行政区划) UNION ALL + -- 在园总量数据查询 (SELECT 行政区划, - '在园数' as 类型, + '在园幼儿数' as 类型, '城区' as 分类, MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', @@ -137,7 +115,7 @@ (SELECT 行政区划, - '在园数' as 类型, + '在园幼儿数' as 类型, '镇区' as 分类, MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', @@ -159,7 +137,7 @@ (SELECT 行政区划, - '在园数' as 类型, + '在园幼儿数' as 类型, '乡村' as 分类, MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', @@ -175,6 +153,26 @@ MAX(IF(年份 = 2034, 区域数值, NULL)) as '2034' FROM excel_学前幼儿在园总量_c04222fd74 WHERE 区域分类 = '乡村' + GROUP BY 行政区划) + UNION ALL + (SELECT + 行政区划, + '在园幼儿数' as 类型, + '总数' as 分类, + MAX(IF(年份 = 2023, 总量数值, NULL)) as '2023', + MAX(IF(年份 = 2024, 总量数值, NULL)) as '2024', + MAX(IF(年份 = 2025, 总量数值, NULL)) as '2025', + MAX(IF(年份 = 2026, 总量数值, NULL)) as '2026', + MAX(IF(年份 = 2027, 总量数值, NULL)) as '2027', + MAX(IF(年份 = 2028, 总量数值, NULL)) as '2028', + MAX(IF(年份 = 2029, 总量数值, NULL)) as '2029', + MAX(IF(年份 = 2030, 总量数值, NULL)) as '2030', + MAX(IF(年份 = 2031, 总量数值, NULL)) as '2031', + MAX(IF(年份 = 2032, 总量数值, NULL)) as '2032', + MAX(IF(年份 = 2033, 总量数值, NULL)) as '2033', + MAX(IF(年份 = 2034, 总量数值, NULL)) as '2034' + FROM excel_学前幼儿在园总量_c04222fd74 + WHERE 总量分类 = '总在园数' GROUP BY 行政区划) ORDER BY 行政区划, From 2ab5c6683499cd5ee427649a55860c0436c30386 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Fri, 3 Jan 2025 16:13:44 +0800 Subject: [PATCH 05/13] 'commit' --- Excel/幼儿入园.xlsx | Bin 12028 -> 12026 bytes .../com/dsideal/base/Tools/ExportExcel.java | 10 + src/main/resources/Sql/ExportExcel.sql | 347 +++++++++--------- 3 files changed, 184 insertions(+), 173 deletions(-) diff --git a/Excel/幼儿入园.xlsx b/Excel/幼儿入园.xlsx index f2ca507559b3778814cbe5fa32c67a0937c452f3..8ed27ec9e1894b6dae912bb327b284194ba3b940 100644 GIT binary patch delta 9406 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 Date: Fri, 3 Jan 2025 16:39:43 +0800 Subject: [PATCH 06/13] 'commit' --- src/main/java/com/dsideal/base/Tools/ExportExcel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/dsideal/base/Tools/ExportExcel.java b/src/main/java/com/dsideal/base/Tools/ExportExcel.java index 980afcd5..ffdcf64e 100644 --- a/src/main/java/com/dsideal/base/Tools/ExportExcel.java +++ b/src/main/java/com/dsideal/base/Tools/ExportExcel.java @@ -67,7 +67,7 @@ public class ExportExcel { cell.setCellStyle(headerStyle); sheet.setColumnWidth(i, 3500); // 设置列宽 } -// 写入数据并处理合并单元格 + // 写入数据并处理合并单元格 int rowNum = 1; String lastDistrict = ""; String lastType = ""; From 89dfadc97eccf462a4f2a3c13295f72088799385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Fri, 3 Jan 2025 16:39:56 +0800 Subject: [PATCH 07/13] 'commit' --- .../133个县区数据表.xls | Bin 0 -> 52736 bytes .../16个州市数据表.xls | Bin 0 -> 49664 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Doc/客户提出的EXCEL要求/133个县区数据表.xls create mode 100644 Doc/客户提出的EXCEL要求/16个州市数据表.xls diff --git a/Doc/客户提出的EXCEL要求/133个县区数据表.xls b/Doc/客户提出的EXCEL要求/133个县区数据表.xls new file mode 100644 index 0000000000000000000000000000000000000000..39ef2bdb65375c54fd15d7fe16e6e5ef6762626a GIT binary patch literal 52736 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 RIp+C!nd3j0#`G!t{(oMWl=A=p literal 0 HcmV?d00001 diff --git a/Doc/客户提出的EXCEL要求/16个州市数据表.xls b/Doc/客户提出的EXCEL要求/16个州市数据表.xls new file mode 100644 index 0000000000000000000000000000000000000000..d7847af6c3529041f4e413d265bfb4c880825a79 GIT binary patch literal 49664 zcmeHQ32(@C13e&6}udFS5q z?)DIb5Z;yU_TBTJ^Pm6x=RfEE|GoG9<3BW?{oEI4{UD#qC@!b7ha}LDLqm=oqyA>%cj{jp_S9H3_zzS@J)3mGGj<&<~3x=jtJBdT9rr*6hk{+(QUG!NH#_Tr6bS(p|%&IZa%6c_Z z^EX*C|7>+Y8lXP%71X^A}gH(^~AQH@u=w_es5N)7weddg`m1=3h0kN=;Qi z1LeqF4^g?*y(;5<;@X{CiT~T%gcp(XIQ4bi<^1`x+?=W`mv~ru^3xEKp7=!(_?nP% znZB~zS?XKBjU1F3<6VsAzX{EMNEvBN(4}}4QmV{tsv1JAqe`C|nomYekElggBwi`i z_Ly>~MC8*QA*F^0yg4MFY)rZ1LefhsRPs-}$w@yayA=Ikit^gj>mzMyo@&QBPpwoN zlpuT5G9Nl8+l5XrBP{u~Y6m*=jj-(DgllzQt0-qV%8DvYuFc6_45gY=S*9V4FWF>r zlUkxWl(%2yOAIc-k*zQB4H$a-SA%sAOVI}Dv}r1#E$ZVr+1+X}{&Znc#So7wfY+k3 zz7tJ!L3BN&x?#Kq3yV%C1$V3Nka`_dOVMRR>g8rvS-Y?laYd~_pPi<>J*p6BrNwBa zJ!%nFKfVXjo|9b<&72iZVs#{ncmqa)^IT%Xba<(9Rm#2;CFkSF<2bMxoyF+D<>w<9 zPs_{cJaNz9Z8Bg~(}ROA%za_5%8Hy@%6N0L;8L%t27g6Cdy3`!n+^U(Nv}%f zR@O`OYFtG62^h)3^r12zk=q0q?XdLJeAC~xo|pJ(jKC}Nm-d|%k-oBhMb9Uh^rxDe zTgJDbUr2o`^Ott4%x6tR`%3;3P5zFYCt#2Wlfz7t-f6E&enj8O?IP)+22uTSeFUG9 z5AQ6r{9jQAAb*Ha@)-l%<9!Den@dJ;9%_4)Z*KOt7w@fg`gJ8dkRI8t45qI)=}$68 zEP?dUiu(jM{P0Yd`%Ew&!NKSA%^vu{sh>}cH^F-5gE;bkhLl_+z2(2uFG~DWi!(

UaQWZ{uC(RBSss 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 VAokamj(NVXbo^_7$9b2I{~tGOCv5-# literal 0 HcmV?d00001 From 87284d90719e25ab3c02f5de159ca45bca1feed7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Thu, 9 Jan 2025 10:04:57 +0800 Subject: [PATCH 08/13] 'commit' --- .../Controller/DataEaseController.java | 21 +++++++++++++++++++ src/main/resources/application.yaml | 4 ++++ 2 files changed, 25 insertions(+) diff --git a/src/main/java/com/dsideal/base/DataEase/Controller/DataEaseController.java b/src/main/java/com/dsideal/base/DataEase/Controller/DataEaseController.java index ed2e2e5a..8f7cf5e2 100644 --- a/src/main/java/com/dsideal/base/DataEase/Controller/DataEaseController.java +++ b/src/main/java/com/dsideal/base/DataEase/Controller/DataEaseController.java @@ -44,6 +44,27 @@ public class DataEaseController extends Controller { !!!必须发布后访问才能做到进入此接口,否则浏览器就走缓存,不进来这个接口了!!! */ + //http://10.10.14.203/#/de-link/mOFfS3Ot?area_id=[区域] + //http://10.10.21.20:9000/dsBase/dataease/YxRoute?area_name=南关区 + //http://10.10.14.14:9000/dsBase/dataease/YxRoute?area_name=南关区 + /** + * 长春云校的路由 + * @param area_name 区域名称 + */ + @Before({GET.class}) + @EmptyInterface({"area_name"}) + public void YxRoute(String area_name) { + //发布的地址 + String publish_url = BaseApplication.PropKit.get("YunXiao.publish_url"); + //拼接一下URL的最终地址 + JSONObject jo = new JSONObject(); + jo.put("area_name", area_name); + String base64Str = Base64.encode(jo.toString()); + //跳转 + redirect(publish_url + "?attachParams=" + base64Str); + } + + /** * 省级路由 * diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 7eb6f695..c916d113 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -42,6 +42,10 @@ dataEase: AreaBottom_url: /#/de-link/j3vwbtKm AreaRight_url: /#/de-link/ufRSlWmB # ============================================================== +# 长春云校配置 +YunXiao: + publish_url: http://10.10.14.203:8100/#/de-link/mOFfS3Ot + excel: # 导出excel 的模板配置路径 From 4ea65bc2c85848a6a14e24d544dd7e0f2d324ea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Tue, 14 Jan 2025 09:07:27 +0800 Subject: [PATCH 09/13] 'commit' --- Doc/长春云校大数据部署情况.txt | 88 +++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 Doc/长春云校大数据部署情况.txt diff --git a/Doc/长春云校大数据部署情况.txt b/Doc/长春云校大数据部署情况.txt new file mode 100644 index 00000000..18ee562f --- /dev/null +++ b/Doc/长春云校大数据部署情况.txt @@ -0,0 +1,88 @@ +#RockyLinux 9.5 +IP:10.10.200.31 +root +DsideaL4r5t6y7u +端口:22 + +#Windows操作机 +IP:10.10.200.33 +Administrator +dsideal + +ToDesk +755 640 600 +密码: +DsideaL4r5t6y7u@123 + + +#公网IP: +222.161.203.183 +对外映射的三个端口: +8100 --> DataEase + +原始密码:admin DataEase@123456 +黄海修改过的密码:admin Dsideal4r5t6y7u!@# + +8200 -->MaxKB +admin Dsideal4r5t6y7u!@# + +9000 -->QingLong + +利用OpenResty反代两个项目 +8080:MaxKB ---> OpenResty ---> http://222.161.203.183:8200 +9100:YunNanDsBase--->OpenResty--->http://222.161.203:8200/dsBase/html/login.html + +利用端口映射直通两个项目 +8100:DataEase --->8100 ---> http://222.161.203.183:8100/dataease +9000:QingLong ---->9000 ---> http://222.161.203.183:9000/QingLong/login.html + + +http://222.161.203.183:9000/QingLong/yx/LessonConstructionInfoByXzqhSchool?type_id=1 + +### 错误: +(1)java.lang.RuntimeException: java.lang.UnsatisfiedLinkError: /usr/local/jdk21/lib/libfontmanager.so: libfreetype.so.6: cannot open shared object file: No such file or directory + +yum install freetype -y + +(2)java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration + +yum install fontconfig dejavu-sans-fonts -y + +(3) java+pdf导出后,中文显示方框 +yum install -y fontconfig mkfontscale + +I 将C:\Windows\Fonts 下所有文件的打成一个压缩包:Fonts.zip +II 将Fonts.zip上传到 /usr/share/fonts/ + +cd /usr/share/fonts/ +unzip Fonts.zip +rm -rf Fonts.zip +rm -rf ./*.fon #这种字体是安装不上的 +mkfontscale +mkfontdir +fc-cache + + +# 部署的程序 +1、YunNanDsBase +目的:配合DataEase进行工作,起到路由或者修改数据的目的。使用了Mysql数据库ds_db,部署到DataEase的mysql实例中 +用户名:root +密码:Password123@mysql +端口:3306 +数据库名称:ds_db + +2、QingLong +目的:配合MaxKB进行工作,起到下载EXCEL,按个人创建知识库等功能(暂未上线) +用户名:root +密码:Password123@postgres +端口:5432 +数据库名称:szjz_db + +注意:由于我们开发环境10.10.14.71使用的是PG16,而MaxKB使用的是PG15.8,直接用Navicat进行PSC备份还原会失改,黄海的办法是导出SQL文件,然后再到目标机导入,成功创建表。 + + +# 更新的SQL语句 +update paragraph set content=replace(content,'10.10.21.20:9000','222.161.203.183:9000') + +# 演示的地址 +http://222.161.203.183:8200/ui/chat/a21c842f2eeffaa2 \ No newline at end of file From d6d5037a6d7303b08f541a662f3368049a8ef545 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Tue, 14 Jan 2025 11:02:07 +0800 Subject: [PATCH 10/13] 'commit' --- .../Controller/DataEaseController.java | 28 +++++++++++++++++++ .../base/DataEase/Model/DataEaseModel.java | 19 +++++++++++++ src/main/resources/application.yaml | 6 ++++ 3 files changed, 53 insertions(+) diff --git a/src/main/java/com/dsideal/base/DataEase/Controller/DataEaseController.java b/src/main/java/com/dsideal/base/DataEase/Controller/DataEaseController.java index 8f7cf5e2..262d22a4 100644 --- a/src/main/java/com/dsideal/base/DataEase/Controller/DataEaseController.java +++ b/src/main/java/com/dsideal/base/DataEase/Controller/DataEaseController.java @@ -47,8 +47,10 @@ public class DataEaseController extends Controller { //http://10.10.14.203/#/de-link/mOFfS3Ot?area_id=[区域] //http://10.10.21.20:9000/dsBase/dataease/YxRoute?area_name=南关区 //http://10.10.14.14:9000/dsBase/dataease/YxRoute?area_name=南关区 + /** * 长春云校的路由 + * * @param area_name 区域名称 */ @Before({GET.class}) @@ -60,6 +62,32 @@ public class DataEaseController extends Controller { JSONObject jo = new JSONObject(); jo.put("area_name", area_name); String base64Str = Base64.encode(jo.toString()); + //记录最后一次操作的是哪个县区 + dm.writeYxLastArea(area_name); + //跳转 + redirect(publish_url + "?attachParams=" + base64Str); + } + + /** + * 云校仪表盘路由 + * @param type_id 类型id + */ + //http://10.10.14.14:9000/dsBase/dataease/routeYxPage?type_id=1 + @Before({GET.class}) + public void routeYxPage(int type_id) { + //最后一次操作的区域名称 + String area_name = dm.getLastYxArea(); + //发布的地址 + String publish_url = BaseApplication.PropKit.get("dataEase.publish_url"); + //拼接一下URL的最终地址 + JSONObject jo = new JSONObject(); + jo.put("area_name", area_name); + String base64Str = Base64.encode(jo.toString()); + if(type_id == 1){ + publish_url = publish_url + BaseApplication.PropKit.get("dataEase.YxAreaClassStudentTeacher"); + }else if(type_id == 2){ + publish_url = publish_url + BaseApplication.PropKit.get("dataEase.YxKeCheng"); + } //跳转 redirect(publish_url + "?attachParams=" + base64Str); } diff --git a/src/main/java/com/dsideal/base/DataEase/Model/DataEaseModel.java b/src/main/java/com/dsideal/base/DataEase/Model/DataEaseModel.java index 5a0822db..d778c569 100644 --- a/src/main/java/com/dsideal/base/DataEase/Model/DataEaseModel.java +++ b/src/main/java/com/dsideal/base/DataEase/Model/DataEaseModel.java @@ -518,6 +518,16 @@ public class DataEaseModel { Db.update(sql, area_name); } + /** + * 记录云校最后一次操作的是哪个县区 + * + * @param area_name + */ + public void writeYxLastArea(String area_name) { + String sql = "update t_dataease_yx_last_area set area_name=? where id=1"; + Db.update(sql, area_name); + } + /** * 获取最后一次操作的是哪个区域 @@ -529,6 +539,15 @@ public class DataEaseModel { return Db.findFirst(sql).getStr("area_name"); } + /** + * 云校最后一次操作的是哪个县区 + * @return + */ + public String getLastYxArea() { + String sql = "select area_name from t_dataease_yx_last_area where id=1"; + return Db.findFirst(sql).getStr("area_name"); + } + /** * 获取云南教科院项目的根节点 * diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index c916d113..cd6c4349 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -41,6 +41,12 @@ dataEase: AreaLeft_url: /#/de-link/WTtaPIn6 AreaBottom_url: /#/de-link/j3vwbtKm AreaRight_url: /#/de-link/ufRSlWmB + + # 云校 + # 区县-班级学生教师应用统计 + YxAreaClassStudentTeacher: /#/de-link/KuuuHsMp + # 区县-课程应用统计 + YxKeCheng: /#/de-link/vO7gtJmw # ============================================================== # 长春云校配置 YunXiao: From f1004f10d3538207af69e7f5163a8681c50f85ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Tue, 14 Jan 2025 14:25:52 +0800 Subject: [PATCH 11/13] 'commit' --- src/main/resources/application.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index cd6c4349..b11cdacd 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -44,7 +44,7 @@ dataEase: # 云校 # 区县-班级学生教师应用统计 - YxAreaClassStudentTeacher: /#/de-link/KuuuHsMp + YxAreaClassStudentTeacher: /#/de-link/h15XBsLH # 区县-课程应用统计 YxKeCheng: /#/de-link/vO7gtJmw # ============================================================== From be9ed26aa33b710cbedb0807e817c104c19a2911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Tue, 14 Jan 2025 16:19:21 +0800 Subject: [PATCH 12/13] 'commit' --- .../com/dsideal/base/BaseApplication.java | 3 + .../Tools/YunXiao/YunXiao_DataSetInit.java | 20 ++ .../YunXiao/Controller/YunXiaoController.java | 74 +++++ .../base/YunXiao/Model/YunXiaoModel.java | 259 ++++++++++++++++++ 4 files changed, 356 insertions(+) create mode 100644 src/main/java/com/dsideal/base/Tools/YunXiao/YunXiao_DataSetInit.java create mode 100644 src/main/java/com/dsideal/base/YunXiao/Controller/YunXiaoController.java create mode 100644 src/main/java/com/dsideal/base/YunXiao/Model/YunXiaoModel.java diff --git a/src/main/java/com/dsideal/base/BaseApplication.java b/src/main/java/com/dsideal/base/BaseApplication.java index 9a6ce8fe..546c688d 100644 --- a/src/main/java/com/dsideal/base/BaseApplication.java +++ b/src/main/java/com/dsideal/base/BaseApplication.java @@ -19,6 +19,7 @@ import com.dsideal.base.StudentYd.Controller.StudentYdController; import com.dsideal.base.Teacher.Controller.TeacherController; import com.dsideal.base.TeacherYd.Controller.TeacherYdController; import com.dsideal.base.Tools.Controller.excelConvertController; +import com.dsideal.base.YunXiao.Controller.YunXiaoController; import com.dsideal.base.Util.FileUtil; import com.dsideal.base.Util.LogBackLogFactory; import com.dsideal.base.Util.PkUtil; @@ -97,6 +98,8 @@ public class BaseApplication extends JFinalConfig { me.add("/dataease", DataEaseController.class); //资源管理 me.add("/res", ResourceController.class); + //云校 + me.add("/yx",YunXiaoController.class); } @Override diff --git a/src/main/java/com/dsideal/base/Tools/YunXiao/YunXiao_DataSetInit.java b/src/main/java/com/dsideal/base/Tools/YunXiao/YunXiao_DataSetInit.java new file mode 100644 index 00000000..025e3838 --- /dev/null +++ b/src/main/java/com/dsideal/base/Tools/YunXiao/YunXiao_DataSetInit.java @@ -0,0 +1,20 @@ +package com.dsideal.base.Tools.YunXiao; + +import com.dsideal.base.Tools.Util.LocalMysqlConnectUtil; +import com.dsideal.base.YunXiao.Model.YunXiaoModel; + +import java.io.IOException; + +public class YunXiao_DataSetInit { + public static YunXiaoModel ym = new YunXiaoModel(); + + public static void main(String[] args) throws IOException { + LocalMysqlConnectUtil.Init(); + //1、添加到数据集表中 + ym.collectDataSet(false); + //2、加上主键 + ym.addPrimaryKey(); + //3、将所有非空列去掉不允许为空的限制 + ym.updateNotNullColumns(); + } +} diff --git a/src/main/java/com/dsideal/base/YunXiao/Controller/YunXiaoController.java b/src/main/java/com/dsideal/base/YunXiao/Controller/YunXiaoController.java new file mode 100644 index 00000000..fc79f27c --- /dev/null +++ b/src/main/java/com/dsideal/base/YunXiao/Controller/YunXiaoController.java @@ -0,0 +1,74 @@ +package com.dsideal.base.YunXiao.Controller; + +import com.dsideal.base.Interceptor.IsLoginInterface; +import com.dsideal.base.Interceptor.IsNumericInterface; +import com.dsideal.base.Util.CommonUtil; +import com.dsideal.base.Util.SqlInjectionUtils; +import com.dsideal.base.YunXiao.Model.YunXiaoModel; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; +import com.jfinal.ext.interceptor.GET; +import com.jfinal.ext.interceptor.POST; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; +import io.github.yedaxia.apidocs.ApiDoc; + +import java.util.List; + +@ApiDoc +public class YunXiaoController extends Controller { + + YunXiaoModel ym = new YunXiaoModel(); + + /** + * 可以维护的数据集名称 + */ + @Before({GET.class}) + @IsLoginInterface({}) + public void getDataSet() { + List list = ym.getDataSet(); + renderJson(CommonUtil.renderJsonForLayUI(list)); + } + + + /** + * 获取数据集下的数据表 + * + * @param id 数据集id + * @param pageNumber 第几页 + * @param keyword 关键字 + * @param pageSize 每页多少条数据 + */ + @Before(GET.class) + @IsLoginInterface({}) + @IsNumericInterface({"id"}) + public void getDataSetContent(int id, String keyword, int pageNumber, int pageSize) { + if (StrKit.isBlank(keyword)) keyword = ""; + if (pageNumber == 0) pageNumber = 1; + if (pageSize == 0) pageSize = 20; + if (SqlInjectionUtils.hasSqlInjectionRisk(keyword)) { + renderJson("输入的查询关键字存在SQL注入攻击,无法执行!"); + return; + } + + Page pageList = ym.getDataSetContent(id, keyword, pageNumber, pageSize); + renderJson(CommonUtil.renderJsonForLayUI(pageList)); + } + + /** + * 保存数据集下的数据表 + * + * @param dataset_id 数据集id + * @param id 数据集下的数据表的id + * @param field 字段名 + * @param value 值 + */ + @Before(POST.class) + @IsLoginInterface({}) + public void saveDataSet(int dataset_id, int id, String field, String value) { + ym.saveDataSet(dataset_id, id, field, value); + renderJson(CommonUtil.returnMessageJson(true, "保存成功")); + } + +} diff --git a/src/main/java/com/dsideal/base/YunXiao/Model/YunXiaoModel.java b/src/main/java/com/dsideal/base/YunXiao/Model/YunXiaoModel.java new file mode 100644 index 00000000..30fadf5d --- /dev/null +++ b/src/main/java/com/dsideal/base/YunXiao/Model/YunXiaoModel.java @@ -0,0 +1,259 @@ +package com.dsideal.base.YunXiao.Model; + +import com.jfinal.kit.Kv; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; +import com.jfinal.plugin.activerecord.SqlPara; + +import java.util.*; + + +public class YunXiaoModel { + //DataEase数据库名称 + public static String DB_NAME = "dataease"; + + /** + * 获取当前人员可以看到哪些数据集 + * + * @return 数据集列表 + */ + public List getDataSet() { + String sql = "select t1.* from t_dp_yx_dataset as t1 where t1.b_use=1 order by t1.dataset_group_id"; + List list = Db.find(sql); + for (Record record : list) { + String table_name = record.getStr("table_name"); + sql = "select count(1) as c from `" + table_name + "`"; + int cnt = Db.use(DB_NAME).queryInt(sql); + record.set("fill_count", cnt); + } + return list; + } + + /** + * 获取数据集的表名 + * + * @param dataset_group_id 数据集的id + * @return 表名 + */ + public String getTableName(String dataset_group_id) { + Kv kv = Kv.by("dataset_group_id", dataset_group_id); + SqlPara sqlPara = Db.getSqlPara("DataEase.getTableName", kv); + Record record = Db.findFirst(sqlPara); + if (record == null) { + System.out.println("数据集不存在" + dataset_group_id); + return null; + } + return Db.findFirst(sqlPara).getStr("table_name"); + } + + + /** + * 将数据集填充到数据库表中,用于配置此数据集让谁来维护 + * + * @param parent_name 数据集的父名称 + * @param table_name 表名 + * @param dataset_name 数据集名 + */ + public void collectDataSet(String parent_name, String table_name, String dataset_name, long dataset_group_id) { + String sql = "select count(1) from t_dp_yx_dataset where dataset_group_id=?"; + if (Db.queryInt(sql, dataset_group_id) > 0) { + System.out.println("数据集已经存在,无需再次添加"); + return; + } + Record record = new Record(); + record.set("parent_name", parent_name.replace("-", "")); + record.set("table_name", table_name); + record.set("dataset_name", dataset_name); + if (parent_name.contains("省")) { + record.set("owner_id", 1); + } else if (parent_name.contains("市") || parent_name.contains("州")) { + record.set("owner_id", 2); + } else if (parent_name.contains("县")) { + record.set("owner_id", 3); + } + record.set("dataset_group_id", dataset_group_id); + Db.save("t_dp_yx_dataset", "id", record); + //System.out.println("添加数据集成功,parent_name=" + parent_name + ",table_name=" + table_name + ",dataset_name=" + dataset_name); + } + + /** + * 获取表中不允许为空的列名 + * + * @param tableName 表名 + * @return 列名列表 + */ + public List getNotNullColumns(String tableName) { + List columns = new ArrayList<>(); + String sql = "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? AND IS_NULLABLE = 'NO'"; + List results = Db.find(sql, YunXiaoModel.DB_NAME, tableName); + for (Record result : results) { + columns.add(result.get("COLUMN_NAME").toString()); + } + return columns; + } + + // 检查表是否存在主键 + public boolean hasPrimaryKey(String tableName) { + String sql = "SELECT COUNT(*) as c FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? AND CONSTRAINT_TYPE = 'PRIMARY KEY'"; + return Db.use("dataease").queryInt(sql, YunXiaoModel.DB_NAME, tableName) > 0; + } + + // 添加主键列,并设置为主键 + public void addPrimaryKey(String tableName) { + // 添加 id 列 + String sql = "ALTER TABLE `" + tableName + "` ADD COLUMN `id` int(11) primary key auto_increment first"; + Db.use(YunXiaoModel.DB_NAME).update(sql); + } + + /** + * 获取所有以 excel_ 开头的表 + * + * @return + */ + public List getExcelTable() { + // 查询所有以 excel_ 开头的表 + String sql = "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'dataease' AND TABLE_NAME LIKE 'excel\\_%'"; + return Db.use(YunXiaoModel.DB_NAME).find(sql); + } + + /** + * 添加主键 + */ + public void addPrimaryKey() { + // 查询所有以 excel_ 开头的表 + List tables = getExcelTable(); + for (Record table : tables) { + String tableName = table.getStr("TABLE_NAME"); + //没有主键的表,添加上主键 + if (!hasPrimaryKey(tableName)) { + System.out.println("表" + tableName + "没有主键,正在添加主键..."); + addPrimaryKey(tableName); + System.out.println("添加主键成功"); + } + } + } + + /** + * 将Excel表中不允许为空的列改为允许为空 + */ + public void updateNotNullColumns() { + // 查询所有以 excel_ 开头的表 + List tables = getExcelTable(); + for (Record table : tables) { + String tableName = table.getStr("TABLE_NAME"); + //获取非空列 + List cols = getNotNullColumns(tableName); + + for (String col : cols) { + if (!col.equals("id")) { + System.out.println("列" + col + "非空,正在去掉不允许为空的限制..."); + //去掉不允许为空的限制 + String sql = "ALTER TABLE `" + tableName + "` MODIFY `" + col + "` VARCHAR(255) NULL"; + Db.use(YunXiaoModel.DB_NAME).update(sql); + System.out.println("去掉不允许为空的限制成功"); + } + } + } + } + + /** + * 将数据集添加到数据库中 + */ + public void collectDataSet(boolean clear) { + //1、获取树根 + String sql = "select * from dataease.core_dataset_group where name='长春云校'"; + Record rRoot = Db.findFirst(sql); + long rootId = rRoot.getLong("id"); + + if (clear) { + //清空数据集表 + sql = "truncate table t_dp_yx_dataset"; + Db.update(sql); + } + + //2、查询有哪些数据集 + Kv kv = Kv.by("id", rootId); + kv.set("dataset", true); + SqlPara sqlPara = Db.getSqlPara("DataEase.getAllDataSet", kv); + List list = Db.find(sqlPara); + + for (Record record : list) { + long dataset_group_id = record.getLong("id"); + //数据集父名称 + String parent_name = record.getStr("parent_name"); + //数据集名称 + String dataset_name = record.getStr("name"); + //对应的表名 + String table_name = getTableName(String.valueOf(dataset_group_id)); + if (!StrKit.isBlank(table_name)) { + //将这些数据集扫描到表中,然后标识这个数据集由谁来维护 + collectDataSet(parent_name, table_name, dataset_name, dataset_group_id); + } + } + } + + /** + * 获取指定id的行政区划 + * + * @param id + * @return + */ + public Record getAreaById(String id) { + String sql = "select * from t_dm_area where id=?"; + return Db.findFirst(sql, id); + } + + + /** + * 递归获取所有子节点 + * + * @param id 节点id + * @return + */ + public List getChildren(long id) { + List list = new ArrayList<>(); + list.add(id); + String sql = "select * from data_visualization_info where pid=?"; + List children = Db.use(DB_NAME).find(sql, id); + for (Record r : children) { + list.addAll(getChildren(r.getLong("id"))); + } + return list; + } + + /** + * 获取数据集对应的表 + * + * @param id 数据集id + * @return + */ + public Page getDataSetContent(int id, String keyword, int pageNumber, int pageSize) { + Record record = Db.findById("t_dp_yx_dataset", "id", id); + String tableName = record.getStr("table_name"); + Page p = Db.paginate(pageNumber, pageSize, + "SELECT *", "from " + DB_NAME + ".`" + tableName + "` where `行政区划` like '%" + keyword + "%'"); + return p; + } + + + /** + * 保存数据集对应的表 + */ + public void saveDataSet(int dataset_id, int id, String field, String value) { + Record record = Db.findById("t_dp_yx_dataset", "id", dataset_id); + String tableName = record.getStr("table_name"); + String sql = "update `" + tableName + "` set `" + field + "`=? where id=?"; + Db.use(DB_NAME).update(sql, value, id); + } + + public String getCityNameByAreaName(String areaName) { + String sql = "select id,parent_id from t_dm_area where area_name=?"; + Record record = Db.findFirst(sql, areaName); + if (record == null) return null; + String parent_id = record.getStr("parent_id"); + if (parent_id == null) return null; + return getAreaById(parent_id).getStr("area_name"); + } +} From 6f4491f1b03772aa81f5e39300ca33e003355b45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Tue, 14 Jan 2025 16:20:33 +0800 Subject: [PATCH 13/13] 'commit' --- .../com/dsideal/base/YunXiao/Controller/YunXiaoController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/dsideal/base/YunXiao/Controller/YunXiaoController.java b/src/main/java/com/dsideal/base/YunXiao/Controller/YunXiaoController.java index fc79f27c..521e9958 100644 --- a/src/main/java/com/dsideal/base/YunXiao/Controller/YunXiaoController.java +++ b/src/main/java/com/dsideal/base/YunXiao/Controller/YunXiaoController.java @@ -24,6 +24,7 @@ public class YunXiaoController extends Controller { /** * 可以维护的数据集名称 */ + // http://10.10.21.20:9000/dsBase/yx/getDataSet @Before({GET.class}) @IsLoginInterface({}) public void getDataSet() { @@ -31,7 +32,6 @@ public class YunXiaoController extends Controller { renderJson(CommonUtil.renderJsonForLayUI(list)); } - /** * 获取数据集下的数据表 *