From 8a6220cac4cced5f71b771217d7b6b54569f83c4 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Fri, 13 Jun 2025 19:24:04 +0800 Subject: [PATCH] 'commit' --- Doc/错误日志.txt | 164 +++++++++++++ .../com/dsideal/base/Tools/AiGenerate.java | 23 +- .../com/dsideal/base/Tools/PptGenerator.java | 230 ++++++++++++------ ...源对比分析报告_20250613_183737.docx | Bin 4257 -> 0 bytes 4 files changed, 335 insertions(+), 82 deletions(-) create mode 100644 Doc/错误日志.txt delete mode 100644 教育资源对比分析报告_20250613_183737.docx diff --git a/Doc/错误日志.txt b/Doc/错误日志.txt new file mode 100644 index 00000000..b540279d --- /dev/null +++ b/Doc/错误日志.txt @@ -0,0 +1,164 @@ +D:\JDK21\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2025.1\lib\idea_rt.jar=1786" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\dsWork\YunNanDsBase\target\classes;D:\apache-maven\MavenRepository\com\jfinal\jfinal\5.2.3\jfinal-5.2.3.jar;D:\apache-maven\MavenRepository\com\jfinal\jfinal-undertow\3.6\jfinal-undertow-3.6.jar;D:\apache-maven\MavenRepository\io\undertow\undertow-core\2.2.33.Final\undertow-core-2.2.33.Final.jar;D:\apache-maven\MavenRepository\org\jboss\logging\jboss-logging\3.4.1.Final\jboss-logging-3.4.1.Final.jar;D:\apache-maven\MavenRepository\org\jboss\xnio\xnio-api\3.8.16.Final\xnio-api-3.8.16.Final.jar;D:\apache-maven\MavenRepository\org\wildfly\common\wildfly-common\1.5.4.Final\wildfly-common-1.5.4.Final.jar;D:\apache-maven\MavenRepository\org\wildfly\client\wildfly-client-config\1.0.1.Final\wildfly-client-config-1.0.1.Final.jar;D:\apache-maven\MavenRepository\org\jboss\xnio\xnio-nio\3.8.16.Final\xnio-nio-3.8.16.Final.jar;D:\apache-maven\MavenRepository\org\jboss\threads\jboss-threads\3.1.0.Final\jboss-threads-3.1.0.Final.jar;D:\apache-maven\MavenRepository\io\undertow\undertow-servlet\2.2.33.Final\undertow-servlet-2.2.33.Final.jar;D:\apache-maven\MavenRepository\javax\servlet\javax.servlet-api\4.0.1\javax.servlet-api-4.0.1.jar;D:\apache-maven\MavenRepository\com\jfinal\cos\2022.2\cos-2022.2.jar;D:\apache-maven\MavenRepository\cn\idev\excel\fastexcel\1.1.0\fastexcel-1.1.0.jar;D:\apache-maven\MavenRepository\cn\idev\excel\fastexcel-core\1.1.0\fastexcel-core-1.1.0.jar;D:\apache-maven\MavenRepository\org\apache\commons\commons-csv\1.11.0\commons-csv-1.11.0.jar;D:\apache-maven\MavenRepository\org\ehcache\ehcache\3.9.11\ehcache-3.9.11.jar;D:\apache-maven\MavenRepository\cn\idev\excel\fastexcel-support\0.0.1\fastexcel-support-0.0.1.jar;D:\apache-maven\MavenRepository\com\alibaba\dashscope-sdk-java\2.16.9\dashscope-sdk-java-2.16.9.jar;D:\apache-maven\MavenRepository\io\reactivex\rxjava2\rxjava\2.2.21\rxjava-2.2.21.jar;D:\apache-maven\MavenRepository\org\reactivestreams\reactive-streams\1.0.3\reactive-streams-1.0.3.jar;D:\apache-maven\MavenRepository\org\jetbrains\kotlin\kotlin-stdlib-jdk8\1.8.21\kotlin-stdlib-jdk8-1.8.21.jar;D:\apache-maven\MavenRepository\org\jetbrains\kotlin\kotlin-stdlib-jdk7\1.8.21\kotlin-stdlib-jdk7-1.8.21.jar;D:\apache-maven\MavenRepository\com\squareup\okio\okio\3.6.0\okio-3.6.0.jar;D:\apache-maven\MavenRepository\com\squareup\okhttp3\logging-interceptor\4.12.0\logging-interceptor-4.12.0.jar;D:\apache-maven\MavenRepository\com\squareup\okhttp3\okhttp-sse\4.12.0\okhttp-sse-4.12.0.jar;D:\apache-maven\MavenRepository\com\github\victools\jsonschema-generator\4.31.1\jsonschema-generator-4.31.1.jar;D:\apache-maven\MavenRepository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;D:\apache-maven\MavenRepository\com\squareup\okhttp3\okhttp\4.10.0\okhttp-4.10.0.jar;D:\apache-maven\MavenRepository\com\squareup\okio\okio-jvm\3.0.0\okio-jvm-3.0.0.jar;D:\apache-maven\MavenRepository\org\jetbrains\kotlin\kotlin-stdlib-common\1.5.31\kotlin-stdlib-common-1.5.31.jar;D:\apache-maven\MavenRepository\org\jetbrains\kotlin\kotlin-stdlib\1.6.20\kotlin-stdlib-1.6.20.jar;D:\apache-maven\MavenRepository\org\jetbrains\annotations\13.0\annotations-13.0.jar;D:\apache-maven\MavenRepository\cn\smallbun\screw\screw-core\1.0.5\screw-core-1.0.5.jar;D:\apache-maven\MavenRepository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;D:\apache-maven\MavenRepository\org\freemarker\freemarker\2.3.30\freemarker-2.3.30.jar;D:\apache-maven\MavenRepository\mysql\mysql-connector-java\8.0.28\mysql-connector-java-8.0.28.jar;D:\apache-maven\MavenRepository\com\google\protobuf\protobuf-java\3.11.4\protobuf-java-3.11.4.jar;D:\apache-maven\MavenRepository\io\minio\minio\8.5.12\minio-8.5.12.jar;D:\apache-maven\MavenRepository\com\carrotsearch\thirdparty\simple-xml-safe\2.7.1\simple-xml-safe-2.7.1.jar;D:\apache-maven\MavenRepository\com\google\guava\guava\33.0.0-jre\guava-33.0.0-jre.jar;D:\apache-maven\MavenRepository\com\google\guava\failureaccess\1.0.2\failureaccess-1.0.2.jar;D:\apache-maven\MavenRepository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;D:\apache-maven\MavenRepository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;D:\apache-maven\MavenRepository\org\checkerframework\checker-qual\3.41.0\checker-qual-3.41.0.jar;D:\apache-maven\MavenRepository\com\google\errorprone\error_prone_annotations\2.23.0\error_prone_annotations-2.23.0.jar;D:\apache-maven\MavenRepository\com\google\j2objc\j2objc-annotations\2.8\j2objc-annotations-2.8.jar;D:\apache-maven\MavenRepository\com\fasterxml\jackson\core\jackson-annotations\2.16.1\jackson-annotations-2.16.1.jar;D:\apache-maven\MavenRepository\org\bouncycastle\bcprov-jdk18on\1.78\bcprov-jdk18on-1.78.jar;D:\apache-maven\MavenRepository\org\apache\commons\commons-compress\1.26.0\commons-compress-1.26.0.jar;D:\apache-maven\MavenRepository\commons-codec\commons-codec\1.16.1\commons-codec-1.16.1.jar;D:\apache-maven\MavenRepository\org\xerial\snappy\snappy-java\1.1.10.5\snappy-java-1.1.10.5.jar;D:\apache-maven\MavenRepository\io\github\yedaxia\japidocs\1.4.4\japidocs-1.4.4.jar;D:\apache-maven\MavenRepository\com\github\javaparser\javaparser-core\3.6.16\javaparser-core-3.6.16.jar;D:\apache-maven\MavenRepository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;D:\apache-maven\MavenRepository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;D:\apache-maven\MavenRepository\javax\activation\activation\1.1.1\activation-1.1.1.jar;D:\apache-maven\MavenRepository\org\glassfish\jaxb\jaxb-runtime\2.3.3\jaxb-runtime-2.3.3.jar;D:\apache-maven\MavenRepository\jakarta\xml\bind\jakarta.xml.bind-api\2.3.3\jakarta.xml.bind-api-2.3.3.jar;D:\apache-maven\MavenRepository\org\glassfish\jaxb\txw2\2.3.3\txw2-2.3.3.jar;D:\apache-maven\MavenRepository\com\sun\istack\istack-commons-runtime\3.0.11\istack-commons-runtime-3.0.11.jar;D:\apache-maven\MavenRepository\com\sun\activation\jakarta.activation\1.2.2\jakarta.activation-1.2.2.jar;D:\apache-maven\MavenRepository\org\xerial\sqlite-jdbc\3.43.2.0\sqlite-jdbc-3.43.2.0.jar;D:\apache-maven\MavenRepository\org\slf4j\slf4j-api\2.0.16\slf4j-api-2.0.16.jar;D:\apache-maven\MavenRepository\net\sf\json-lib\json-lib\2.4\json-lib-2.4-jdk15.jar;D:\apache-maven\MavenRepository\commons-beanutils\commons-beanutils\1.8.0\commons-beanutils-1.8.0.jar;D:\apache-maven\MavenRepository\commons-collections\commons-collections\3.2.1\commons-collections-3.2.1.jar;D:\apache-maven\MavenRepository\net\sf\ezmorph\ezmorph\1.0.6\ezmorph-1.0.6.jar;D:\apache-maven\MavenRepository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\apache-maven\MavenRepository\log4j\log4j\1.2.17\log4j-1.2.17.jar;D:\apache-maven\MavenRepository\org\slf4j\slf4j-log4j12\1.7.25\slf4j-log4j12-1.7.25.jar;D:\apache-maven\MavenRepository\ch\qos\logback\logback-classic\1.5.6\logback-classic-1.5.6.jar;D:\apache-maven\MavenRepository\ch\qos\logback\logback-core\1.5.6\logback-core-1.5.6.jar;D:\apache-maven\MavenRepository\cn\hutool\hutool-all\5.8.29\hutool-all-5.8.29.jar;D:\apache-maven\MavenRepository\com\alibaba\fastjson\2.0.52\fastjson-2.0.52.jar;D:\apache-maven\MavenRepository\com\alibaba\fastjson2\fastjson2-extension\2.0.52\fastjson2-extension-2.0.52.jar;D:\apache-maven\MavenRepository\com\alibaba\fastjson2\fastjson2\2.0.52\fastjson2-2.0.52.jar;D:\apache-maven\MavenRepository\org\jsoup\jsoup\1.17.2\jsoup-1.17.2.jar;D:\apache-maven\MavenRepository\com\google\code\gson\gson\2.10.1\gson-2.10.1.jar;D:\apache-maven\MavenRepository\commons-io\commons-io\2.14.0\commons-io-2.14.0.jar;D:\apache-maven\MavenRepository\org\apache\commons\commons-email\1.5\commons-email-1.5.jar;D:\apache-maven\MavenRepository\com\sun\mail\javax.mail\1.5.6\javax.mail-1.5.6.jar;D:\apache-maven\MavenRepository\org\apache\commons\commons-lang3\3.12.0\commons-lang3-3.12.0.jar;D:\apache-maven\MavenRepository\org\dom4j\dom4j\2.1.4\dom4j-2.1.4.jar;D:\apache-maven\MavenRepository\jaxen\jaxen\1.1.6\jaxen-1.1.6.jar;D:\apache-maven\MavenRepository\redis\clients\jedis\5.1.0\jedis-5.1.0.jar;D:\apache-maven\MavenRepository\org\apache\commons\commons-pool2\2.12.0\commons-pool2-2.12.0.jar;D:\apache-maven\MavenRepository\org\json\json\20231013\json-20231013.jar;D:\apache-maven\MavenRepository\org\apache\httpcomponents\httpmime\4.5.14\httpmime-4.5.14.jar;D:\apache-maven\MavenRepository\org\apache\httpcomponents\httpclient\4.5.14\httpclient-4.5.14.jar;D:\apache-maven\MavenRepository\org\apache\httpcomponents\httpcore\4.4.16\httpcore-4.4.16.jar;D:\apache-maven\MavenRepository\org\apache\logging\log4j\log4j-core\2.20.0\log4j-core-2.20.0.jar;D:\apache-maven\MavenRepository\org\apache\logging\log4j\log4j-api\2.20.0\log4j-api-2.20.0.jar;D:\apache-maven\MavenRepository\com\fasterxml\jackson\core\jackson-core\2.17.2\jackson-core-2.17.2.jar;D:\apache-maven\MavenRepository\com\fasterxml\jackson\core\jackson-databind\2.17.2\jackson-databind-2.17.2.jar;D:\apache-maven\MavenRepository\com\github\mwiede\jsch\0.2.19\jsch-0.2.19.jar;D:\apache-maven\MavenRepository\com\zaxxer\HikariCP\5.1.0\HikariCP-5.1.0.jar;D:\apache-maven\MavenRepository\com\alibaba\druid\1.2.23\druid-1.2.23.jar;D:\apache-maven\MavenRepository\org\yaml\snakeyaml\2.3\snakeyaml-2.3.jar;D:\apache-maven\MavenRepository\io\jsonwebtoken\jjwt\0.7.0\jjwt-0.7.0.jar;D:\apache-maven\MavenRepository\com\zendesk\mysql-binlog-connector-java\0.30.1\mysql-binlog-connector-java-0.30.1.jar;D:\apache-maven\MavenRepository\com\github\luben\zstd-jni\1.5.0-2\zstd-jni-1.5.0-2.jar;D:\apache-maven\MavenRepository\org\apache\poi\poi\5.2.5\poi-5.2.5.jar;D:\apache-maven\MavenRepository\org\apache\commons\commons-collections4\4.4\commons-collections4-4.4.jar;D:\apache-maven\MavenRepository\org\apache\commons\commons-math3\3.6.1\commons-math3-3.6.1.jar;D:\apache-maven\MavenRepository\com\zaxxer\SparseBitSet\1.3\SparseBitSet-1.3.jar;D:\apache-maven\MavenRepository\org\apache\poi\poi-ooxml\5.2.5\poi-ooxml-5.2.5.jar;D:\apache-maven\MavenRepository\org\apache\poi\poi-ooxml-lite\5.2.5\poi-ooxml-lite-5.2.5.jar;D:\apache-maven\MavenRepository\org\apache\xmlbeans\xmlbeans\5.2.0\xmlbeans-5.2.0.jar;D:\apache-maven\MavenRepository\com\github\virtuald\curvesapi\1.08\curvesapi-1.08.jar;D:\apache-maven\MavenRepository\org\apache\poi\poi-scratchpad\5.2.5\poi-scratchpad-5.2.5.jar com.dsideal.base.Tools.AiGenerate +19:16:34,395 |-INFO in ch.qos.logback.classic.LoggerContext[default] - This is logback-classic version 1.5.6 +19:16:34,397 |-INFO in ch.qos.logback.classic.util.ContextInitializer@3c3d9b6b - No custom configurators were discovered as a service. +19:16:34,397 |-INFO in ch.qos.logback.classic.util.ContextInitializer@3c3d9b6b - Trying to configure with ch.qos.logback.classic.joran.SerializedModelConfigurator +19:16:34,398 |-INFO in ch.qos.logback.classic.util.ContextInitializer@3c3d9b6b - Constructed configurator of type class ch.qos.logback.classic.joran.SerializedModelConfigurator +19:16:34,399 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.scmo] +19:16:34,399 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.scmo] +19:16:34,404 |-INFO in ch.qos.logback.classic.util.ContextInitializer@3c3d9b6b - ch.qos.logback.classic.joran.SerializedModelConfigurator.configure() call lasted 2 milliseconds. ExecutionStatus=INVOKE_NEXT_IF_ANY +19:16:34,404 |-INFO in ch.qos.logback.classic.util.ContextInitializer@3c3d9b6b - Trying to configure with ch.qos.logback.classic.util.DefaultJoranConfigurator +19:16:34,405 |-INFO in ch.qos.logback.classic.util.ContextInitializer@3c3d9b6b - Constructed configurator of type class ch.qos.logback.classic.util.DefaultJoranConfigurator +19:16:34,405 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml] +19:16:34,406 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/D:/dsWork/YunNanDsBase/target/classes/logback.xml] +19:16:34,550 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler - Processing appender named [STDOUT] +19:16:34,550 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender] +19:16:34,588 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler - Processing appender named [FILE] +19:16:34,588 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender] +19:16:34,599 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@2044215423 - No compression will be used +19:16:34,601 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@2044215423 - Will use the pattern /usr/local/tomcat8/logs/dsBase.log.%d{yyyy-MM-dd}.log for the active file +19:16:34,627 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - The date pattern is 'yyyy-MM-dd' from file name pattern '/usr/local/tomcat8/logs/dsBase.log.%d{yyyy-MM-dd}.log'. +19:16:34,627 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Roll-over at midnight. +19:16:34,638 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Setting initial period to 2025-06-13T11:13:40.372Z +19:16:34,644 |-WARN in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - A triggering policy of type TimeBasedRollingPolicy was already set. +19:16:34,644 |-WARN in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - Note that TimeBasedRollingPolicy doubles as a RollingPolicy +19:16:34,644 |-WARN in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - See also http://logback.qos.ch/codes.html#rfa_reset_rp_or_tp +19:16:34,644 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - Active log file name: /usr/local/tomcat8/logs/dsBase.log +19:16:34,644 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - File property is set to [/usr/local/tomcat8/logs/dsBase.log] +19:16:34,645 |-INFO in ch.qos.logback.classic.model.processor.RootLoggerModelHandler - Setting level of ROOT logger to DEBUG +19:16:34,645 |-INFO in ch.qos.logback.core.model.processor.AppenderRefModelHandler - Attaching appender named [STDOUT] to Logger[ROOT] +19:16:34,645 |-INFO in ch.qos.logback.core.model.processor.AppenderRefModelHandler - Attaching appender named [FILE] to Logger[ROOT] +19:16:34,646 |-INFO in ch.qos.logback.classic.model.processor.LoggerModelHandler - Setting level of logger [com.dsideal] to DEBUG +19:16:34,648 |-INFO in ch.qos.logback.classic.model.processor.LoggerModelHandler - Setting additivity of logger [com.dsideal] to false +19:16:34,648 |-INFO in ch.qos.logback.core.model.processor.DefaultProcessor@5fbe4146 - End of configuration. +19:16:34,649 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@1e66f1f5 - Registering current configuration as safe fallback point +19:16:34,649 |-INFO in ch.qos.logback.classic.util.ContextInitializer@3c3d9b6b - ch.qos.logback.classic.util.DefaultJoranConfigurator.configure() call lasted 244 milliseconds. ExecutionStatus=DO_NOT_INVOKE_NEXT_IF_ANY + +2025-06-13 19:16:35.224 [main] INFO com.alibaba.druid.pool.DruidDataSource + - {dataSource-1} inited +2025-06-13 19:16:35.301 [main] INFO com.alibaba.druid.pool.DruidDataSource + - {dataSource-2} inited +配置初始化完成 +=== 开始数据收集 === +=== 开始AI分析和Word文档生成 === +开始调用DeepSeek进行数据分析... +文山州与楚雄州教育资源配置对比分析报告 + +1. 执行摘要 +文山州和楚雄州均面临人口持续下降趋势,但两州在教育资源配置上存在显著差异。文山州人口下降速度较快,乡村人口减少明显,教育资源需求总体呈下降趋势,但区域性、结构性短缺问题突出。楚雄州人口下降趋势相对平缓,城乡人口结构调整对教育资源布局提出新挑战。两州均需关注城镇化进程中教育资源优化配置问题。 + +2. 数据概览 +文山州总人口从2022年起预计年均下降0.93%,2035年降至303.5万人;楚雄州常住人口年均下降约2.54万人。文山州学前教育至高中阶段教职工需求和学校占地面积基本满足需求,但存在结构性短缺;楚雄州各学段教职工和占地面积需求均呈平缓下降趋势。文山州乡村在校生占比大但下降明显;楚雄州镇区在校生占比大且相对稳定。 + +3. 详细对比分析 +3.1 教育资源配置水平对比 +文山州各学段教育资源总量充足,但乡村资源利用率将随人口减少而降低;楚雄州资源配置与人口变化匹配度较高,但需关注城区资源承载压力。文山州小学乡村在校生占比达50%以上,楚雄州镇区初中在校生占比超60%。 + +3.2 发展趋势分析 +两州均呈现"城区稳中有升、乡村快速下降"的在校生变化趋势。文山州2035年小学在校生预计减少12.1%,初中减少12.1%;楚雄州相应减少11.5%和11.4%。高中阶段文山州在校生减少12.1%,楚雄州减少14.9%。 + +3.3 优势与不足 +文山州优势在于教育资源总量充足,不足在于乡村资源闲置风险;楚雄州优势在于资源配置精准度较高,不足在于城区教育资源扩容压力。 + +4. 问题识别 +4.1 结构性矛盾突出 +两州均存在教职工学科结构不合理问题,乡村音体美等学科教师短缺。文山州区域性短缺更明显。 + +4.2 城乡资源配置失衡 +乡村教育资源利用率持续走低,城区教育资源承载压力增大,特别是楚雄州城区学前教育资源紧张。 + +4.3 人口变化响应滞后 +教育资源调整速度落后于人口变化速度,楚雄州高中阶段资源冗余风险显现。 + +5. 建议与对策 +5.1 动态调整机制 +建立学龄人口预警系统,文山州重点监测乡村学校撤并时机,楚雄州关注城区学校扩容需求。 + +5.2 优化资源配置 +文山州推进乡村小规模学校整合,楚雄州加强城区教育用地储备。两州均应建立教师流动机制。 + +5.3 提升资源效益 +文山州可试点乡村校舍多功能改造,楚雄州应优化高中阶段普职资源配比。建议两州建立教育资源动态监测平台。 + +6. 结论 +两州教育资源配置需适应人口结构性变化,文山州应着重解决资源结构性矛盾,楚雄州需防范城区教育资源紧张问题。未来应建立"总量控制、结构优化、效益优先"的资源配置机制,推动城乡教育均衡发展。建议省级层面建立跨州市教育资源协调机制,促进区域教育协同发展。 + +=== Word文档分析完成 === +Word分析报告已保存到: 教育资源对比分析报告_20250613_191635.docx + + +=== 开始生成PPT === +API响应状态码: 200 +PPT生成成功! +生成的内容: ``` +# 文山州与楚雄州教育资源配置对比分析报告 + +## 报告信息 + +- **生成时间**: 2025年06月13日 19:17:06 +- **分析工具**: DeepSeek AI + +--- + +文山州与楚雄州教育资源配置对比分析报告 + + +## 1. 执行摘要 + +- 文山州和楚雄州的教育资源配置存在显著差异,两州都面临人口下降的挑战。文山州的乡村人口流失严重,导致教育资源需求的结构性短缺。相较之下,楚雄州的人口下降更为平缓,并面临城乡教育资源布局新的挑战。在未来的城镇化进程中,两州急需寻求优化教育资源的配置策略。 + +## 2. 数据概览 + +- 根据预测,文山州总人口将持续减少,至2035年预计下降至303.5万人,年均下降0.93%。在教育资源方面,文山州的学前教育到高中阶段在教师和学校占地方面基本满足需求,但仍存在明显的结构性短缺。而楚雄州的常住人口年均减少约2.54万人,各学段的资源需求相对平稳,乡村在校生的占比持续下降。 + +## 3. 详细对比分析 + +## 3.1 教育资源配置水平对比 + +- 文山州教育资源丰富,但随着乡村人口减少,资源的利用率也将逐渐降低。楚雄州的资源配置相对合理,能够较好地适应人口变化,需特别关注城区学校应对资源承载能力的挑戰。在小学校阶段,文山州乡村在校生占比超过50%,而楚雄州镇区初中在校生比例则超过60%。 + +## 3.2 发展趋势分析 + +- 两州在校生的变化趋势呈现出“城区稳中有升,乡村快速下降”的特点。文山州预计到2035年,小学和初中的在校生人数将分别减少12.1%。同样,楚雄州也会出现类似的下滑,具体为小学减少11.5%,初中减少11.4%。在高中阶段,文山州的在校生人数将减少12.1%,楚雄州则更为显著,降幅达到14.9%。 + +## 3.3 优势与不足 + +- 文山州在教育资源总量上具有相对优势,但乡村地区的资源闲置风险显著;而楚雄州的优势在于精准的资源配置,但也面临城区教育资源扩容的巨大压力。两州的教育资源配置策略均需针对各自的短板进行调整与优化。 + +## 4. 问题识别 + +## 4.1 结构性矛盾突出 + +- 两州都存在教职工学科结构不合理的问题,特别是乡村地区在音体美等学科教师的短缺尤为明显。文山州在这方面的区域性短缺问题更加突出,这对乡村教育质量构成了挑战。 + +## 4.2 城乡资源配置失衡 + +- 随着乡村在校生人数的持续下降,乡村教育资源的利用效率也呈现下降趋势;同时,楚雄州城区面临更大的教育资源承载压力,尤其是在学前教育领域,资源紧张的局面愈加明显。 + +## 4.3 人口变化响应滞后 + +- 教育资源的调整速度远远滞后于人口变化,楚雄州在高中阶段出现了资源冗余的风险。这不仅影响了教育的可持续发展,也使得资源配置更加复杂化。 + +## 5. 建议与对策 + +## 5.1 动态调整机制 + +- 建立学龄人口预警系统,对教育资源的需求变动给予前瞻性分析。文山州要重点监测乡村学校撤并的时机,而楚雄州应关注城区学校扩容的实际需求。 + +## 5.2 优化资源配置 + +- 文山州应推进乡村小规模学校的整合,以提升资源的使用效率;楚雄州则需要增强城区教育用地的储备能力。两州均应当建立灵活的教师流动机制,以提高教育资源的有效使用。 + +## 5.3 提升资源效益 + +- 文山州可以试点乡村校舍的多功能改造,以提升资源的使用效率;楚雄州则需优化高中阶段普职教育的资源配比,确保教育资源能够更合理地满足不同类型学生的需求,同时建议两州建立教育资源的动态监测平台。 + +## 6. 结论 + +- 两州的教育资源配置必须适应当前的人口结构变化,文山州亟需解决资源的结构性矛盾,而楚雄州则需高度警惕城区教育资源面临的紧张状况。未来,两州应建立“总量控制、结构优化、效益优先”的资源配置机制,以推动城乡教育的均衡发展。建议省级层面建立跨州市的教育资源协调机制,从而促进区域内教育的协调与协同发展。 + +--- + +**报告结束** +``` + +进程已结束,退出代码为 0 diff --git a/src/main/java/com/dsideal/base/Tools/AiGenerate.java b/src/main/java/com/dsideal/base/Tools/AiGenerate.java index 9557c173..f7d1a36f 100644 --- a/src/main/java/com/dsideal/base/Tools/AiGenerate.java +++ b/src/main/java/com/dsideal/base/Tools/AiGenerate.java @@ -5,6 +5,7 @@ import com.dsideal.base.DataEase.Model.DataEaseModel; import com.dsideal.base.Plugin.YamlProp; import com.dsideal.base.Tools.Util.CallDeepSeek; import com.dsideal.base.Tools.Util.LocalMysqlConnectUtil; +import com.dsideal.base.Tools.Util.PptAIKit; import java.text.SimpleDateFormat; import java.util.Date; @@ -19,25 +20,25 @@ public class AiGenerate { try { // 初始化配置 initializeConfiguration(); - + // 定义对比地区 String[] regions = {"文山州", "楚雄州"}; - + // 第一步:数据获取 System.out.println("=== 开始数据收集 ==="); String dataContent = DataCollector.collectEducationData(regions); String analysisPrompt = DataCollector.createAnalysisPrompt(dataContent, regions); - + // 第二步:AI分析并生成Word文档 System.out.println("=== 开始AI分析和Word文档生成 ==="); generateWordReport(analysisPrompt, regions); - + } catch (Exception e) { System.err.println("程序执行出错: " + e.getMessage()); e.printStackTrace(); } } - + /** * 初始化配置 */ @@ -47,7 +48,7 @@ public class AiGenerate { LocalMysqlConnectUtil.Init(); System.out.println("配置初始化完成"); } - + /** * 生成Word报告 */ @@ -55,7 +56,7 @@ public class AiGenerate { // 生成输出文件路径 String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String outputPath = "教育资源对比分析报告_" + timestamp + ".docx"; - + System.out.println("开始调用DeepSeek进行数据分析..."); // 调用DeepSeek进行分析 @@ -78,9 +79,11 @@ public class AiGenerate { WordGenerator.generateWordDocument(fullResponse.toString(), outputPath, regions); System.out.println("Word分析报告已保存到: " + outputPath); -// // 第三步:生成PPT -// System.out.println("\n\n=== 开始生成PPT ==="); -// PptGenerator.generatePptPresentation(fullResponse.toString(), regions); + // 第三步:生成PPT + System.out.println("\n\n=== 开始生成PPT ==="); + String uid = "dsideal"; + String apiToken = PptAIKit.createApiToken(uid, null); + PptGenerator.generatePptPresentation(fullResponse.toString(), regions, apiToken); } catch (Exception e) { System.err.println("保存文件时出错: " + e.getMessage()); diff --git a/src/main/java/com/dsideal/base/Tools/PptGenerator.java b/src/main/java/com/dsideal/base/Tools/PptGenerator.java index 9e7f671b..eefa83d1 100644 --- a/src/main/java/com/dsideal/base/Tools/PptGenerator.java +++ b/src/main/java/com/dsideal/base/Tools/PptGenerator.java @@ -1,55 +1,40 @@ package com.dsideal.base.Tools; import com.alibaba.fastjson.JSONObject; -import com.dsideal.base.Tools.Util.CallDeepSeek; -import com.dsideal.base.Tools.Util.PptAIKit; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; /** * PPT生成器 - 负责生成分析报告的PPT演示文稿 */ -public class PptGenerator extends PptAIKit { +public class PptGenerator { + + private static final String PPT_API_URL = "https://open.docmee.cn/api/ppt/generatePptx"; /** * 生成PPT演示文稿 - * @param analysisContent 分析内容 + * @param analysisContent 分析内容(与Word文档相同的内容) * @param regions 对比地区 + * @param token API访问令牌 */ - public static void generatePptPresentation(String analysisContent, String[] regions) { + public static void generatePptPresentation(String analysisContent, String[] regions, String token) { try { - String uid = "test"; + // 将分析内容转换为Markdown格式 + String markdownContent = convertToMarkdown(analysisContent, regions); + + // 调用docmee API生成PPT + String pptFileUrl = callDocmeeApi(markdownContent, token); - // 生成简化的PPT提示词 - String simplifiedPptPrompt = createPptPrompt(analysisContent, regions); - if (simplifiedPptPrompt == null) { - System.err.println("无法生成PPT提示词,跳过PPT生成"); - return; + if (pptFileUrl != null && !pptFileUrl.trim().isEmpty()) { + System.out.println("PPT生成成功!"); + System.out.println("PPT文件下载地址: " + pptFileUrl); + } else { + System.err.println("PPT生成失败"); } - - // 创建API token - String apiToken = PptAIKit.createApiToken(uid, null); - System.out.println("api token: " + apiToken); - - // 生成大纲 - System.out.println("\n\n========== 正在生成大纲 =========="); - System.out.println("提示词长度: " + simplifiedPptPrompt.length()); - String outline = PptAIKit.generateOutline(apiToken, null, null, simplifiedPptPrompt); - - // 生成大纲内容 - System.out.println("\n\n========== 正在生成大纲内容 =========="); - String markdown = PptAIKit.generateContent(apiToken, outline, null, simplifiedPptPrompt); - - // 随机选择模板 - System.out.println("\n\n========== 随机选择模板 =========="); - String templateId = PptAIKit.randomOneTemplateId(apiToken); - System.out.println("模板ID: " + templateId); - - // 生成PPT - System.out.println("\n\n========== 正在生成PPT =========="); - JSONObject pptInfo = PptAIKit.generatePptx(apiToken, templateId, markdown, false); - String pptId = pptInfo.getString("id"); - System.out.println("pptId: " + pptId); - System.out.println("ppt主题:" + pptInfo.getString("subject")); - System.out.println("ppt封面:" + pptInfo.getString("coverUrl") + "?token=" + apiToken); } catch (Exception e) { System.err.println("生成PPT时出错: " + e.getMessage()); @@ -58,55 +43,156 @@ public class PptGenerator extends PptAIKit { } /** - * 创建PPT生成提示词 - * @param dataContent 数据内容 + * 将分析内容转换为Markdown格式 + * @param analysisContent 分析内容 * @param regions 对比地区 - * @return PPT提示词 + * @return Markdown格式的内容 + */ + private static String convertToMarkdown(String analysisContent, String[] regions) { + StringBuilder markdown = new StringBuilder(); + + // 添加标题 + String title = generateReportTitle(regions); + markdown.append("# ").append(title).append("\n\n"); + + // 处理分析内容 + String[] lines = analysisContent.split("\n"); + + for (String line : lines) { + if (line.trim().isEmpty()) { + markdown.append("\n"); + } else if (isTitle(line)) { + // 根据标题级别添加Markdown标题 + if (line.matches("^\\d+\\..+")) { + markdown.append("## ").append(line).append("\n\n"); + } else if (line.matches("^\\d+\\.\\d+.+")) { + markdown.append("### ").append(line).append("\n\n"); + } else if (line.matches("^\\d+\\.\\d+\\.\\d+.+")) { + markdown.append("#### ").append(line).append("\n\n"); + } else { + markdown.append("## ").append(line).append("\n\n"); + } + } else { + // 普通内容,处理列表项 + if (line.trim().startsWith("-") || line.trim().startsWith("•")) { + markdown.append("- ").append(line.trim().substring(1).trim()).append("\n"); + } else { + markdown.append(line).append("\n\n"); + } + } + } + + return markdown.toString(); + } + + /** + * 生成报告标题 + */ + private static String generateReportTitle(String[] regions) { + if (regions != null && regions.length >= 2) { + return String.join("与", regions) + "教育资源配置对比分析报告"; + } else { + return "教育资源配置对比分析报告"; + } + } + + /** + * 判断是否为标题行 + */ + private static boolean isTitle(String line) { + return line.matches("^\\d+\\..+") || + line.matches("^\\d+\\.\\d+.+") || + line.matches("^\\d+\\.\\d+\\.\\d+.+") || + line.trim().matches("^(执行摘要|数据概览|详细对比分析|问题识别|建议与对策|结论).*"); + } + + /** + * 调用docmee API生成PPT + * @param markdownContent Markdown内容 + * @param token API令牌 + * @return PPT文件下载URL */ - private static String createPptPrompt(String dataContent, String[] regions) { + private static String callDocmeeApi(String markdownContent, String token) { try { - // 构建给DeepSeek的精简提示词 - String deepseekPrompt = "你是一位专业的教育数据分析专家,请将以下教育资源配置数据进行精简总结," + - "提取关键信息和对比要点,控制在300字以内,重点突出" + String.join("与", regions) + "的对比差异:\n\n" + - dataContent; + URL url = new URL(PPT_API_URL); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + + // 设置请求方法和头部 + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestProperty("token", token); + connection.setDoOutput(true); - System.out.println("正在调用 DeepSeek 精简数据..."); + // 构建请求体 + JSONObject requestBody = new JSONObject(); + requestBody.put("outlineContentMarkdown", markdownContent); + requestBody.put("pptxProperty", false); // 不返回PPT数据结构 + // templateId 和 notes 为非必填,可以根据需要添加 + + // 发送请求 + try (OutputStream os = connection.getOutputStream()) { + byte[] input = requestBody.toJSONString().getBytes(StandardCharsets.UTF_8); + os.write(input, 0, input.length); + } - // 调用DeepSeek获取精简内容 - String simplifiedContent = CallDeepSeek.callDeepSeek(deepseekPrompt); + // 读取响应 + int responseCode = connection.getResponseCode(); + System.out.println("API响应状态码: " + responseCode); - if (simplifiedContent != null && !simplifiedContent.trim().isEmpty()) { - System.out.println("DeepSeek 精简完成,精简后长度: " + simplifiedContent.length()); + if (responseCode >= 200 && responseCode < 300) { + StringBuilder response = new StringBuilder(); - // 使用精简后的内容构建PPT提示词 - return buildPptPrompt(regions, simplifiedContent); + try (BufferedReader br = new BufferedReader( + new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) { + String line; + while ((line = br.readLine()) != null) { + response.append(line); + } + } + + // 解析响应JSON + JSONObject responseJson = JSONObject.parseObject(response.toString()); + + if (responseJson.getIntValue("code") == 0) { + JSONObject data = responseJson.getJSONObject("data"); + if (data != null) { + JSONObject pptInfo = data.getJSONObject("pptInfo"); + if (pptInfo != null) { + String fileUrl = pptInfo.getString("fileUrl"); + String coverUrl = pptInfo.getString("coverUrl"); + String pptId = pptInfo.getString("id"); + + System.out.println("PPT ID: " + pptId); + System.out.println("PPT封面: " + coverUrl); + + return fileUrl; + } + } + } else { + System.err.println("API返回错误: " + responseJson.getString("message")); + } + + return null; } else { - System.out.println("DeepSeek 调用失败,使用基础提示词"); + // 读取错误响应 + StringBuilder errorResponse = new StringBuilder(); + try (BufferedReader br = new BufferedReader( + new InputStreamReader(connection.getErrorStream(), StandardCharsets.UTF_8))) { + String line; + while ((line = br.readLine()) != null) { + errorResponse.append(line); + } + } + + System.err.println("API调用失败,状态码: " + responseCode); + System.err.println("错误信息: " + errorResponse.toString()); return null; } } catch (Exception e) { - System.err.println("调用 DeepSeek 精简数据时出错: " + e.getMessage()); + System.err.println("调用docmee API时出错: " + e.getMessage()); e.printStackTrace(); return null; } } - - /** - * 构建PPT提示词 - */ - private static String buildPptPrompt(String[] regions, String simplifiedContent) { - return "请基于以下教育资源配置数据,为" + String.join("与", regions) + - "教育资源配置对比分析创建一个专业的PPT大纲。\n\n" + - "PPT应包含以下主要部分:\n" + - "1. 封面 - 标题和基本信息\n" + - "2. 目录 - 分析框架\n" + - "3. 数据概览 - 关键指标对比\n" + - "4. 详细分析 - 各维度深入对比\n" + - "5. 问题识别 - 存在的主要问题\n" + - "6. 建议方案 - 改进措施\n" + - "7. 总结 - 结论和展望\n\n" + - "请确保内容简洁明了,适合PPT展示。\n\n" + - "=== 精简后的关键数据 ===\n" + simplifiedContent; - } } \ No newline at end of file diff --git a/教育资源对比分析报告_20250613_183737.docx b/教育资源对比分析报告_20250613_183737.docx deleted file mode 100644 index 5989b4e17112ac0a6777fe01a7fb44ad1e4dc7cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4257 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:=SUgk_{lL<|D_aMKJyO0LWkff|3CZxoW$?x=b8KW^d!=MvGqJpe@{P8firsl3SR1e mCj0M|&d=uW2f0M^uS(|$WTZ<*e)cjT;c6w|J4o0B0Q?Ums5egl