From da431c25dfe5122e4ed70372da36ede3e4eaec4a Mon Sep 17 00:00:00 2001 From: feiyu02 <risaku@163.com> Date: 星期五, 31 五月 2024 17:43:41 +0800 Subject: [PATCH] 1. 新增自动报告生成功能 --- src/main/kotlin/com/flightfeather/uav/biz/dataprocess/PreData.kt | 210 + src/main/kotlin/com/flightfeather/uav/biz/dataprocess/AvgPair.kt | 2 src/main/kotlin/com/flightfeather/uav/common/utils/DateUtil.kt | 1 src/main/kotlin/com/flightfeather/uav/common/exception/BizException.kt | 2 src/main/kotlin/com/flightfeather/uav/common/utils/ImageUtil.kt | 47 src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImplTest.kt | 15 src/main/kotlin/com/flightfeather/uav/lightshare/service/EPWModelService.kt | 1 src/main/kotlin/com/flightfeather/uav/lightshare/web/MissionController.kt | 7 src/main/resources/application-pro.yml | 10 src/main/kotlin/com/flightfeather/uav/common/location/LocationRoadNearby.kt | 47 src/main/kotlin/com/flightfeather/uav/lightshare/web/BaseResPack.kt | 4 src/main/kotlin/com/flightfeather/uav/socket/decoder/DataUnitDecoder.kt | 3 src/main/kotlin/com/flightfeather/uav/biz/dataprocess/DataProcess.kt | 27 src/test/kotlin/com/flightfeather/uav/Test.kt | 14 src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/ExceptionSetting.kt | 31 src/main/kotlin/com/flightfeather/uav/common/pdf/DynamicParam.kt | 19 src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt | 18 src/main/kotlin/com/flightfeather/uav/common/chart/DataToChartUtil.kt | 26 src/test/kotlin/com/flightfeather/uav/biz/dataprocess/DataProcessTest.kt | 10 src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/exceptiontype/ExceptionValueMutation.kt | 47 src/main/kotlin/com/flightfeather/uav/common/utils/ExcelUtil.kt | 35 src/main/resources/mapper/MissionMapper.xml | 3 src/main/kotlin/com/flightfeather/uav/domain/repository/SceneInfoRep.kt | 44 src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt | 122 + src/main/kotlin/com/flightfeather/uav/biz/dataprocess/AverageUtil.kt | 2 src/main/kotlin/com/flightfeather/uav/lightshare/bean/AreaVo.kt | 24 src/main/resources/application-test.yml | 8 src/main/kotlin/com/flightfeather/uav/lightshare/web/SceneController.kt | 27 src/test/kotlin/com/flightfeather/uav/model/epw/EPWDataPrepTest.kt | 5 src/main/kotlin/com/flightfeather/uav/lightshare/service/MissionService.kt | 3 src/main/kotlin/com/flightfeather/uav/domain/entity/SceneInfo.java | 502 ++++ src/main/resources/templates/report-underway.ftl | 3707 ++++++++++++++++++++++++++++++++++ src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/MissionServiceImpl.kt | 11 src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt | 10 src/main/kotlin/com/flightfeather/uav/common/location/CoordinateUtil.kt | 35 src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/DataAnalysisConfig.kt | 20 src/main/kotlin/com/flightfeather/uav/domain/repository/RealTimeDataRep.kt | 76 src/main/kotlin/com/flightfeather/uav/lightshare/service/SceneService.kt | 11 src/main/kotlin/com/flightfeather/uav/lightshare/bean/ElectricDailyInfo.kt | 1 src/main/kotlin/com/flightfeather/uav/common/utils/FileExchange.kt | 76 src/main/kotlin/com/flightfeather/uav/model/epw/WeightType.kt | 16 src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SceneServiceImpl.kt | 24 src/main/kotlin/com/flightfeather/uav/socket/processor/UnderwayProcessor.kt | 3 src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/MissionServiceImplTest.kt | 28 pom.xml | 47 src/main/kotlin/com/flightfeather/uav/common/pdf/GeneratePdfUtil.kt | 173 + src/main/kotlin/com/flightfeather/uav/domain/entity/Mission.java | 17 src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/exceptiontype/ExceptionDataExceed.kt | 33 src/main/resources/generator/generatorConfig.xml | 10 src/main/kotlin/com/flightfeather/uav/common/chart/ChartUtil.kt | 44 src/main/kotlin/com/flightfeather/uav/biz/dataprocess/ElectricDailyAnalysis.kt | 2 src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/ExceptionResult.kt | 33 src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuousSingle.kt | 39 src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionAnalysis.kt | 82 src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt | 42 src/main/resources/mapper/SceneInfoMapper.xml | 47 src/main/kotlin/com/flightfeather/uav/model/epw/EPWDataPrep.kt | 103 src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/ExceptionType.kt | 13 src/main/kotlin/com/flightfeather/uav/biz/report/MissionReport.kt | 155 + src/main/kotlin/com/flightfeather/uav/repository/impl/AirDataRepositoryImpl.kt | 2 src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/ExceptionAnalysisController.kt | 52 src/main/kotlin/com/flightfeather/uav/domain/mapper/SceneInfoMapper.kt | 8 src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ElectricityServiceImpl.kt | 6 src/main/kotlin/com/flightfeather/uav/config/CorsConfig.kt | 2 /dev/null | 143 - src/main/kotlin/com/flightfeather/uav/domain/repository/MissionRep.kt | 15 src/main/kotlin/com/flightfeather/uav/config/Swagger2Configuration.kt | 2 src/main/kotlin/com/flightfeather/uav/biz/report/ReportTemplate.kt | 26 src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseDataAnalysis.kt | 27 69 files changed, 6,199 insertions(+), 258 deletions(-) diff --git a/pom.xml b/pom.xml index 6634aee..c6f7fd6 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,7 @@ <properties> <java.version>1.8</java.version> <kotlin.version>1.5.0</kotlin.version> + <itext.version>7.2.2</itext.version> <!-- tk.mybatis --> <mapper.plugin>tk.mybatis.mapper.generator.MapperPlugin</mapper.plugin> <mapper.Mapper>tk.mybatis.mapper.common.Mapper</mapper.Mapper> @@ -164,6 +165,52 @@ <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency> + + <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker --> + <dependency> + <groupId>org.freemarker</groupId> + <artifactId>freemarker</artifactId> + <version>2.3.31</version> + </dependency> + + <!-- https://mvnrepository.com/artifact/com.itextpdf/html2pdf --> + <dependency> + <groupId>com.itextpdf</groupId> + <artifactId>html2pdf</artifactId> + <version>4.0.2</version> + </dependency> + <dependency> + <groupId>com.itextpdf</groupId> + <artifactId>font-asian</artifactId> + <version>${itext.version}</version> + <scope>test</scope> + </dependency> + <!-- 鏀寔css鏍峰紡娓叉煋 --> + <dependency> + <groupId>org.xhtmlrenderer</groupId> + <artifactId>flying-saucer-pdf-itext5</artifactId> + <version>9.1.16</version> + </dependency> + <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --> + <dependency> + <groupId>org.apache.pdfbox</groupId> + <artifactId>pdfbox</artifactId> + <version>2.0.26</version> + </dependency> + + <!-- echarts--> + <dependency> + <groupId>org.icepear.echarts</groupId> + <artifactId>echarts-java</artifactId> + <version>1.0.7</version> + </dependency> + + <!-- JFreeChart--> + <dependency> + <groupId>org.jfree</groupId> + <artifactId>jfreechart</artifactId> + <version>1.5.3</version> + </dependency> </dependencies> <build> diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseDataAnalysis.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseDataAnalysis.kt new file mode 100644 index 0000000..50fe9f5 --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseDataAnalysis.kt @@ -0,0 +1,27 @@ +package com.flightfeather.uav.biz.dataanalysis + +/** + * 鏁版嵁鍒嗘瀽鍩虹被 + */ +abstract class BaseDataAnalysis<T, V, Y>(val config: V) { + + //鍒嗘瀽缁撴灉 + val resultList = mutableListOf<Y>() + + /** + * 閰嶇疆鍒濆鍖� + */ + open fun init(){ + resultList.clear() + } + + /** + * 鎺ユ敹涓嬩竴涓椂闂寸偣鐨勬暟鎹� + */ + abstract fun onNextData(data: T) + + /** + * 鏁版嵁寰幆缁撴潫 + */ + abstract fun onDone() +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionAnalysis.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionAnalysis.kt new file mode 100644 index 0000000..94d782f --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionAnalysis.kt @@ -0,0 +1,82 @@ +package com.flightfeather.uav.biz.dataanalysis + +import com.flightfeather.uav.biz.dataanalysis.model.DataAnalysisConfig +import com.flightfeather.uav.biz.dataanalysis.model.ExceptionResult +import com.flightfeather.uav.biz.dataanalysis.model.ExceptionType +import com.flightfeather.uav.common.utils.DateUtil +import com.flightfeather.uav.domain.entity.BaseRealTimeData +import com.flightfeather.uav.socket.eunm.FactorType +import java.time.Duration + +/** + * 鐩戞祴鏁版嵁寮傚父鍒嗘瀽鍩虹被 + */ +abstract class BaseExceptionAnalysis(config: DataAnalysisConfig) : + BaseDataAnalysis<BaseRealTimeData, DataAnalysisConfig, ExceptionResult>(config) { + + /** + * 纭畾寮傚父绫诲瀷 + */ + abstract fun getExceptionType(): ExceptionType + + /** + * 鍒ゆ柇鐩搁偦鏁版嵁鏄惁杩炵画 + */ + open fun isContinuous(d1: BaseRealTimeData?, d2: BaseRealTimeData?): Boolean { + if (d1 == null || d2 == null) return true + + val t1 = d1.dataTime + val t2 = d2.dataTime + return Duration.between(t1?.toInstant(), t2?.toInstant()).toMillis() <= (20 * 1000) + } + + /** + * 鐢熸垚涓�鏉″紓甯稿垎鏋愮粨鏋� + */ + open fun newResult( + start: BaseRealTimeData, end: BaseRealTimeData?, factorIndex: Int, + exceptionData: List<BaseRealTimeData>, + ): ExceptionResult { + val eType = getExceptionType() + val factorType = FactorType.getByIndex(factorIndex) + return ExceptionResult().apply { + missionCode = config.mission.missionCode + deviceCode = start.deviceCode + exception = eType.des + exceptionType = eType.value + factorId = factorType?.value + factorName = factorType?.des + startTime = DateUtil.instance.dateToString(start.dataTime, DateUtil.DateStyle.HH_MM_SS) + endTime = DateUtil.instance.dateToString(end?.dataTime, DateUtil.DateStyle.HH_MM_SS) ?: startTime + startData = start.getByFactorIndex(factorIndex) + endData = end?.getByFactorIndex(factorIndex) ?: startData + + val s = dataSummary(exceptionData, factorIndex) + avg = s.first + min = s.second + max = s.third + + exceptionData.forEach { dataList.add(it) } + } + } + + fun dataSummary(exceptionData: List<BaseRealTimeData?>, factorIndex: Int): Triple<Float, Float, Float> { + var min = -1f + var max = -1f + var total = 0f + var count = 0 + exceptionData.forEach { + val value = it?.getByFactorIndex(factorIndex) ?: return@forEach + if (min == -1f || min > value) { + min = value + } + if (max == -1f || max < value) { + max = value + } + total += value + count++ + } + val avg = if (count == 0) 0f else total / count + return Triple(avg, min, max) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt new file mode 100644 index 0000000..9177f77 --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt @@ -0,0 +1,122 @@ +package com.flightfeather.uav.biz.dataanalysis + +import com.flightfeather.uav.biz.dataanalysis.model.DataAnalysisConfig +import com.flightfeather.uav.domain.entity.BaseRealTimeData + +/** + * 杩炵画绫诲瀷鐨勫紓甯稿垎鏋愬熀绫�,閫傜敤浜庡綋鍓嶆暟鎹笌鐩搁偦鏁版嵁涔嬮棿鏈夊叧鑱斿叧绯荤殑鎯呭喌 + */ +abstract class BaseExceptionContinuous(config: DataAnalysisConfig) : BaseExceptionAnalysis(config) { + + companion object { + // 璁板綍寮傚父鏁版嵁娈垫椂锛屽垎鍒悜璧峰鍓嶅拰鏈熬鍚庨澶栬褰曠殑鏁版嵁涓暟鍋忕Щ閲� + private const val OFFSET = 10 + } + + // 璧峰鏁版嵁涓嬫爣 + protected var sIndex = mutableListOf<Int>() + + // 璧峰鏁版嵁瀵硅薄 + protected var startData = mutableListOf<BaseRealTimeData?>() + + // 鏈熬鏁版嵁涓嬫爣 + protected var eIndex = mutableListOf<Int>() + + // 鏈熬鏁版嵁瀵硅薄 + protected var lastData: BaseRealTimeData? = null + + // 寮傚父鏁版嵁娈� + protected var exceptionData = mutableListOf<MutableList<BaseRealTimeData>>() + + // 璧峰鏁版嵁涓庢湯灏炬暟鎹棿闅� + open var durationCount = 1 + protected var existException = mutableListOf<Boolean>() + + /** + * 鍒ゆ柇鏄惁婊¤冻寮傚父鏉′欢 + */ + abstract fun judgeException(p: BaseRealTimeData?, n: BaseRealTimeData): List<Boolean> + + /** + * 鍒ゆ柇寮傚父鍑虹幇鐨勮繛缁椂闀挎槸鍚︽弧瓒虫潯浠� + */ + abstract fun judgeDuration(sIndex: Int, eIndex: Int): Boolean + + override fun init() { + super.init() + lastData = null + repeat(config.factorCount) { + startData.add(null) + sIndex.add(0) + eIndex.add(-1) + existException.add(false) + exceptionData.add(mutableListOf()) + } + } + + override fun onNextData(data: BaseRealTimeData) { + val isContinue = isContinuous(lastData, data) + val hasException = judgeException(lastData, data) + repeat(config.factorCount) { i -> + eIndex[i]++ + // 璧峰鏁版嵁 + if (lastData == null) { + refreshAfterCheckResult(i, data) + } + // 鍒ゆ柇鐩搁偦鏁版嵁鏄惁杩炵画骞朵笖鏄惁婊¤冻寮傚父鍒ゆ柇 + if (!isContinue) { + checkResult() + // 鏁版嵁涓嶈繛缁椂锛岃褰曞紓甯告儏鍐� + if (eIndex[i] - sIndex[i] >= durationCount) { + refreshAfterCheckResult(i, data) + } + } else { + if (hasException[i]) { + existException[i] = true + exceptionData[i].add(data) + } else { + // 寮傚父涓嶅啀閲嶅鍑虹幇鏃讹紝璁板綍寮傚父鎯呭喌 + checkResult() + if (eIndex[i] - sIndex[i] >= durationCount) { + refreshAfterCheckResult(i, data) + } + } + } + } + lastData = data + } + + override fun onDone() { + checkResult() + } + + fun refreshAfterCheckResult(i:Int, data: BaseRealTimeData) { + sIndex[i] = eIndex[i] + startData[i] = data + exceptionData[i].clear() + exceptionData[i].add(data) + } + + /** + * 妫�鏌ヨ繛缁紓甯哥粨鏉熸椂锛屾槸鍚︾鍚堝紓甯稿瓨鍌ㄦ潯浠� + */ + open fun checkResult(index: Int? = null) { + if (index != null) { + if (existException[index] && judgeDuration(sIndex[index], eIndex[index])) { + startData[index]?.let { + resultList.add(newResult(it, lastData, index, exceptionData[index])) + } + existException[index] = false + } + } else { + repeat(config.factorCount) { i -> + if (existException[i] && judgeDuration(sIndex[i], eIndex[i])) { + startData[i]?.let { + resultList.add(newResult(it, lastData, i, exceptionData[i])) + } + existException[i] = false + } + } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuousSingle.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuousSingle.kt new file mode 100644 index 0000000..027f57d --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuousSingle.kt @@ -0,0 +1,39 @@ +package com.flightfeather.uav.biz.dataanalysis + +import com.flightfeather.uav.biz.dataanalysis.model.DataAnalysisConfig +import com.flightfeather.uav.domain.entity.BaseRealTimeData + +/** + * 杩炵画绫诲瀷鐨勫紓甯稿垎鏋愬熀绫�,鍖哄埆浜庣埗绫荤殑鍦版柟鍦ㄤ簬姝ょ寮傚父鍙拰鍗曚釜鏁版嵁鏈韩鏈夊叧,涓庣浉閭绘暟鎹棤鍏� + */ +abstract class BaseExceptionContinuousSingle(config: DataAnalysisConfig) : BaseExceptionContinuous(config) { + + override fun onNextData(data: BaseRealTimeData) { + val isContinue = isContinuous(lastData, data) + val hasException = judgeException(lastData, data) + repeat(config.factorCount) { i -> + eIndex[i]++ + if (lastData == null) { + startData[i] = data + } + // 鍒ゆ柇鐩搁偦鏁版嵁鏄惁杩炵画骞朵笖鏄惁婊¤冻寮傚父鍒ゆ柇 + if (!isContinue) { + checkResult() + sIndex[i] = eIndex[i] + startData[i] = data + } else { + if (hasException[i]) { + // 淇敼浜嗚捣濮嬫暟鎹殑浣嶇疆,鍙樻洿涓哄嚭鐜板紓甯哥殑璇ュ��,鑰屼笉鏄師鏉ョ殑鍑虹幇寮傚父鐨勬暟鎹殑鍓嶄竴涓�� + if (!existException[i]) { + sIndex[i] = eIndex[i] + startData[i] = data + } + existException[i] = true + } else { + checkResult() + } + } + } + lastData = data + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/ExceptionAnalysisController.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/ExceptionAnalysisController.kt new file mode 100644 index 0000000..1a5c06f --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/ExceptionAnalysisController.kt @@ -0,0 +1,52 @@ +package com.flightfeather.uav.biz.dataanalysis + +import com.flightfeather.uav.biz.dataanalysis.exceptiontype.ExceptionDataExceed +import com.flightfeather.uav.biz.dataanalysis.exceptiontype.ExceptionValueMutation +import com.flightfeather.uav.biz.dataanalysis.model.DataAnalysisConfig +import com.flightfeather.uav.biz.dataanalysis.model.ExceptionResult +import com.flightfeather.uav.biz.dataanalysis.model.ExceptionSetting +import com.flightfeather.uav.domain.entity.Mission +import com.flightfeather.uav.domain.repository.RealTimeDataRep +import org.springframework.stereotype.Component + +/** + * 鏁版嵁寮傚父鍒嗘瀽鎺у埗鍣� + */ +@Component +class ExceptionAnalysisController( + private val realTimeDataRep: RealTimeDataRep, +) { + + var running = false + + private val taskList = mutableListOf<BaseExceptionAnalysis>() + + private fun initTask(config: DataAnalysisConfig) { + taskList.clear() + taskList.apply { + add(ExceptionDataExceed(config)) + add(ExceptionValueMutation(config)) + } + } + + fun run(mission: Mission): List<ExceptionResult> { + running = true + val config = DataAnalysisConfig(mission, ExceptionSetting(), 8) + initTask(config) + + val result = mutableListOf<ExceptionResult>() + taskList.forEach { it.init() } + // 杞鏁版嵁锛岃绠楀悇涓紓甯� + realTimeDataRep.fetchData(mission.deviceCode, mission.startTime, mission.endTime).forEach { d -> + taskList.forEach { it.onNextData(d) } + } + // 鍚勪釜寮傚父鍒嗘瀽鍒嗗埆缁撴潫 + taskList.forEach { it.onDone() } + // 瀛樺偍鍒嗘瀽缁撴灉 + taskList.forEach { + result.addAll(it.resultList) + } + running = false + return result + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/exceptiontype/ExceptionDataExceed.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/exceptiontype/ExceptionDataExceed.kt new file mode 100644 index 0000000..24decf6 --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/exceptiontype/ExceptionDataExceed.kt @@ -0,0 +1,33 @@ +package com.flightfeather.uav.biz.dataanalysis.exceptiontype + +import com.flightfeather.uav.biz.dataanalysis.BaseExceptionContinuousSingle +import com.flightfeather.uav.biz.dataanalysis.model.DataAnalysisConfig +import com.flightfeather.uav.biz.dataanalysis.model.ExceptionType +import com.flightfeather.uav.domain.entity.BaseRealTimeData + +/** + * 鏁版嵁瓒呮爣寮傚父鍒嗘瀽 + */ +class ExceptionDataExceed(config: DataAnalysisConfig) : BaseExceptionContinuousSingle(config) { + + override fun getExceptionType(): ExceptionType = ExceptionType.TYPE2 + + override fun judgeException(p: BaseRealTimeData?, n: BaseRealTimeData): List<Boolean> { + val res = mutableListOf<Boolean>() + repeat(config.factorCount) { i -> + val data = n.getByFactorIndex(i) + val limit = config.exceptionSetting.getByFactorIndex(i) + val bool = if (data != null && limit != null) { + data >= limit + } else { + false + } + res.add(bool) + } + return res + } + + override fun judgeDuration(sIndex: Int, eIndex: Int): Boolean { + return true + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/exceptiontype/ExceptionValueMutation.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/exceptiontype/ExceptionValueMutation.kt new file mode 100644 index 0000000..f9da13a --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/exceptiontype/ExceptionValueMutation.kt @@ -0,0 +1,47 @@ +package com.flightfeather.uav.biz.dataanalysis.exceptiontype + +import com.flightfeather.uav.biz.dataanalysis.BaseExceptionContinuous +import com.flightfeather.uav.biz.dataanalysis.model.DataAnalysisConfig +import com.flightfeather.uav.biz.dataanalysis.model.ExceptionType +import com.flightfeather.uav.domain.entity.BaseRealTimeData +import kotlin.math.abs + +/** + * 閲忕骇绐佸彉寮傚父鍒嗘瀽 + */ +class ExceptionValueMutation(config: DataAnalysisConfig) : BaseExceptionContinuous(config) { + + /** + * 鏈紓甯哥殑杩炵画鍙戠敓娆℃暟浼氭牴鎹紓甯哥殑绋嬪害鍙樺寲 + * 褰撶獊鍙樼殑閲忕骇瓒呰繃璁惧畾鍊�1鍊嶆椂,杩炵画鍙戠敓娆℃暟瑕佹眰鍑忓皯1鍊� + */ + private var special = false + + override fun getExceptionType(): ExceptionType = ExceptionType.TYPE4 + + override fun judgeException(p: BaseRealTimeData?, n: BaseRealTimeData): List<Boolean> { + val res = mutableListOf<Boolean>() + repeat(config.factorCount) { i-> + if (p?.getByFactorIndex(i) == null || n.getByFactorIndex(i) == null) { + res.add(false) + return@repeat + } + val pValue = p.getByFactorIndex(i)!! + val nValue = n.getByFactorIndex(i)!! + val r = abs((pValue - nValue) / pValue) + val b1 = r >= (2 * config.mutationRate) + val b2 = r >= config.mutationRate + if (b1) special = true + res.add(b1 || b2) + } + + return res + } + + override fun judgeDuration(sIndex: Int, eIndex: Int): Boolean { + val b1 = special && (eIndex - sIndex) >= (config.mutationNum / 2) + val b2 = (eIndex - sIndex) >= config.mutationNum + special = false + return b1 || b2 + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/DataAnalysisConfig.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/DataAnalysisConfig.kt new file mode 100644 index 0000000..ff7522d --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/DataAnalysisConfig.kt @@ -0,0 +1,20 @@ +package com.flightfeather.uav.biz.dataanalysis.model + +import com.flightfeather.uav.domain.entity.Mission + +/** + * 鏁版嵁鍒嗘瀽閰嶇疆鍙傛暟 + */ +data class DataAnalysisConfig( + // 璧拌埅浠诲姟淇℃伅 + val mission: Mission, + // 鏁版嵁寮傚父閰嶇疆 + val exceptionSetting: ExceptionSetting, + // 娑夊強鐩戞祴鍥犲瓙鏁伴噺 + val factorCount: Int, +){ + // 杩炵画绐佸彉鏁版嵁涓暟 + var mutationNum = 6 + // 绐佸彉鐜� + var mutationRate = .5 +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/ExceptionResult.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/ExceptionResult.kt new file mode 100644 index 0000000..8ae9ffa --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/ExceptionResult.kt @@ -0,0 +1,33 @@ +package com.flightfeather.uav.biz.dataanalysis.model + +import com.flightfeather.uav.domain.entity.BaseRealTimeData +import java.math.BigDecimal + +/** + * 寮傚父缁撴灉 + */ +open class ExceptionResult { + var missionCode: String? = null + var deviceCode: String? = null + var exception: String? = null + var exceptionType: Int? = null + var exceptionValue: Float? = null + var factorId: Int? = null + var factorName: String? = null + var startTime: String? = null + var endTime: String? = null + var startData: Float? = null + var endData: Float? = null + var avg: Float? = null + var min: Float? = null + var max: Float? = null + // 涓績鐐圭粡绾害 + var longitude: BigDecimal? = null + var latitude: BigDecimal? = null + // 鐩稿叧浼佷笟id锛圛D涔嬮棿;鍒嗛殧锛� + var relatedSceneId: List<String>? = null + // 鐩稿叧浼佷笟鍚嶇О锛堝悕绉颁箣闂�;鍒嗛殧锛� + var relatedSceneName: List<String>? = null + // 寮傚父鏁版嵁锛屽ご灏惧彲鑳藉寘鍚竴瀹氶噺鐨勫亸绉� + var dataList: MutableList<BaseRealTimeData> = mutableListOf() +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/ExceptionSetting.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/ExceptionSetting.kt new file mode 100644 index 0000000..ab7193e --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/ExceptionSetting.kt @@ -0,0 +1,31 @@ +package com.flightfeather.uav.biz.dataanalysis.model + +/** + * 璧拌埅鏁版嵁寮傚父鏍囧噯 + */ +class ExceptionSetting { + + // 瓒呮爣鐣岄檺 + val no2 = 200f + var co = 5000f + var h2s = 500f + var so2 = 500f + var o3 = 200f + var pm25 = 75f + var pm10 = 150f + var voc = 600f + + fun getByFactorIndex(i: Int): Float? { + return when (i) { + 0 -> no2 + 1 -> co + 2 -> h2s + 3 -> so2 + 4 -> o3 + 5 -> pm25 + 6 -> pm10 + 7 -> voc + else -> null + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/ExceptionType.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/ExceptionType.kt new file mode 100644 index 0000000..4e8a1f6 --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/ExceptionType.kt @@ -0,0 +1,13 @@ +package com.flightfeather.uav.biz.dataanalysis.model + +enum class ExceptionType(val value:Int, val des:String) { + TYPE0(0, "鏁版嵁缂哄け寮傚父"), + TYPE1(1, "鏁版嵁瓒呬綆寮傚父"), + TYPE2(2, "鏁版嵁瓒呮爣"), + TYPE3(3, "鏁版嵁闀挎椂娈垫棤娉㈠姩"), + TYPE4(4, "閲忕骇绐佸彉寮傚父"), + TYPE5(5, "涓磋繎瓒呮爣寮傚父"), + TYPE6(6, "鍗曟棩瓒呮爣娆℃暟涓磋繎澶勭綒寮傚父"), + TYPE7(7, "婊戝姩骞冲潎鍊肩獊鍙樺紓甯�"), + TYPE8(8, "鏈夋晥鐜囧紓甯�"), +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/dataprocess/AverageUtil.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/AverageUtil.kt similarity index 97% rename from src/main/kotlin/com/flightfeather/uav/dataprocess/AverageUtil.kt rename to src/main/kotlin/com/flightfeather/uav/biz/dataprocess/AverageUtil.kt index 8c93f62..2cf4a48 100644 --- a/src/main/kotlin/com/flightfeather/uav/dataprocess/AverageUtil.kt +++ b/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/AverageUtil.kt @@ -1,4 +1,4 @@ -package com.flightfeather.uav.dataprocess +package com.flightfeather.uav.biz.dataprocess /** * 鍧囧�艰绠楀伐鍏凤紝灏嗕竴缁勮繛缁暟鎹浆鎹负鑷畾涔夊懆鏈熺殑鍧囧�兼暟鎹� diff --git a/src/main/kotlin/com/flightfeather/uav/dataprocess/AvgPair.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/AvgPair.kt similarity index 86% rename from src/main/kotlin/com/flightfeather/uav/dataprocess/AvgPair.kt rename to src/main/kotlin/com/flightfeather/uav/biz/dataprocess/AvgPair.kt index aa27311..d0c4e75 100644 --- a/src/main/kotlin/com/flightfeather/uav/dataprocess/AvgPair.kt +++ b/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/AvgPair.kt @@ -1,4 +1,4 @@ -package com.flightfeather.uav.dataprocess +package com.flightfeather.uav.biz.dataprocess import kotlin.math.round diff --git a/src/main/kotlin/com/flightfeather/uav/dataprocess/DataProcess.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/DataProcess.kt similarity index 86% rename from src/main/kotlin/com/flightfeather/uav/dataprocess/DataProcess.kt rename to src/main/kotlin/com/flightfeather/uav/biz/dataprocess/DataProcess.kt index 3f39b6a..307defb 100644 --- a/src/main/kotlin/com/flightfeather/uav/dataprocess/DataProcess.kt +++ b/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/DataProcess.kt @@ -1,14 +1,13 @@ -package com.flightfeather.uav.dataprocess +package com.flightfeather.uav.biz.dataprocess -import com.flightfeather.uav.common.utils.DateUtil import com.flightfeather.uav.common.utils.ExcelUtil import com.flightfeather.uav.lightshare.bean.DataVo +import com.flightfeather.uav.socket.eunm.FactorType import org.apache.poi.xssf.streaming.SXSSFWorkbook import org.apache.poi.xssf.usermodel.XSSFWorkbook import java.io.File import java.io.FileInputStream import java.io.FileOutputStream -import java.util.* /** * 鏁版嵁澶勭悊 @@ -22,7 +21,21 @@ companion object { const val SHEET1 = "灏忔椂鏁版嵁" const val SHEET2 = "鏃ユ暟鎹�" - const val SHEET3 = "鏃ュ彉鍖�" + const val SHEET3 = "鏃ュ彉鍖�"//闇�瑕佽绠楃殑椤圭洰 + val needFactor: List<FactorType> = listOf( + FactorType.NO2, + FactorType.CO, + FactorType.H2S, + FactorType.SO2, + FactorType.O3, + FactorType.PM25, + FactorType.PM10, + FactorType.VOC + ) + val items = listOf( + "璁板綍鏁�", "鍧囧��", "鏍囧噯宸�", "鏈�灏忓��", "鏈�澶у��", "10%鍒嗕綅鍊�", "25%鍒嗕綅鍊�", "50%鍒嗕綅鍊�", "75%鍒嗕綅鍊�", "90%鍒嗕綅鍊�" + ) + } //姣忔棩灏忔椂鏁版嵁 private val dateData = mutableMapOf<String?, PreData>() @@ -73,7 +86,7 @@ dayData[day]?.add(it) if (!dailyVariationData.containsKey(hour)) { - dailyVariationData[hour] = PreData(hour, false) + dailyVariationData[hour] = PreData(hour, needQuartile = false) } dailyVariationData[hour]?.add(it) } @@ -92,12 +105,12 @@ //绗竴琛屼负鏃堕棿浠ュ強鐩戞祴鍥犲瓙鍚嶇О锛屽苟涓旈渶瑕佹牴鎹笅涓�琛岀殑缁熻椤瑰悎骞跺垪 val firstRow = mutableListOf<ExcelUtil.MyCell>() firstRow.add(ExcelUtil.MyCell("鏃堕棿", 2)) - PreData.needFactor.forEach { firstRow.add(ExcelUtil.MyCell(it.des, colSpan = PreData.items.size)) } + needFactor.forEach { firstRow.add(ExcelUtil.MyCell(it.des, colSpan = items.size)) } contents.add(firstRow.toTypedArray()) //绗簩琛屼负姣忕鐩戞祴鍥犲瓙瀵瑰簲鐨勭粺璁¢」锛屽叿浣撲负璁板綍鏁般�佸潎鍊笺�佹爣鍑嗗樊銆佹渶灏忓�笺�佹渶澶у�笺��10/25/50/75/90%鍒嗕綅鍊硷紝姣忕鐩戞祴鍥犲瓙鏈�10鍒� val secondRow = mutableListOf<String>() secondRow.add("") - repeat(PreData.needFactor.size) { secondRow.addAll(PreData.items) } + repeat(needFactor.size) { secondRow.addAll(items) } contents.add(secondRow.toTypedArray()) //鍒唖heet寤虹珛鏍囬 sheetRow.forEach { (s, i) -> diff --git a/src/main/kotlin/com/flightfeather/uav/dataprocess/ElectricDailyAnalysis.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/ElectricDailyAnalysis.kt similarity index 98% rename from src/main/kotlin/com/flightfeather/uav/dataprocess/ElectricDailyAnalysis.kt rename to src/main/kotlin/com/flightfeather/uav/biz/dataprocess/ElectricDailyAnalysis.kt index e6e9ebc..6e4e6d8 100644 --- a/src/main/kotlin/com/flightfeather/uav/dataprocess/ElectricDailyAnalysis.kt +++ b/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/ElectricDailyAnalysis.kt @@ -1,4 +1,4 @@ -package com.flightfeather.uav.dataprocess +package com.flightfeather.uav.biz.dataprocess import com.flightfeather.uav.common.utils.DateUtil import com.flightfeather.uav.domain.entity.CompanyDevice diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/PreData.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/PreData.kt new file mode 100644 index 0000000..d985b2a --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/PreData.kt @@ -0,0 +1,210 @@ +package com.flightfeather.uav.biz.dataprocess + +import com.flightfeather.uav.lightshare.bean.DataVo +import com.flightfeather.uav.socket.eunm.FactorType +import java.math.BigDecimal +import kotlin.math.max +import kotlin.math.min +import kotlin.math.round +import kotlin.math.sqrt + +/** + * 棰勫鐞嗘暟鎹� + * 缁熻鏁版嵁鐨�"璁板綍鏁�", "鍧囧��", "鏍囧噯宸�", "鏈�灏忓��", "鏈�澶у��", "10%鍒嗕綅鍊�", "25%鍒嗕綅鍊�", "50%鍒嗕綅鍊�", "75%鍒嗕綅鍊�", "90%鍒嗕綅鍊�" + * @Date 2022.2.5 + */ +class PreData( + //缁熻鏃堕棿 + private val time: String?, + //闇�瑕佺粺璁$殑鐩戞祴鍥犲瓙 + private val needFactor: List<FactorType> = listOf( + FactorType.NO2, + FactorType.CO, + FactorType.H2S, + FactorType.SO2, + FactorType.O3, + FactorType.PM25, + FactorType.PM10, + FactorType.VOC + ), + //鏄惁闇�瑕佽绠楀垎浣嶅�� + private val needQuartile: Boolean = true, +) { + + inner class TempData { + //鏁版嵁骞虫柟鍜岋紙鐢ㄤ簬璁$畻鏍囧噯宸級 + var sumOfSquares: BigDecimal = BigDecimal.ZERO + //鏁版嵁鍜� + var total: BigDecimal = BigDecimal.ZERO + + //璁℃暟 + var count: Int = 0 + var minV: Double = Double.MAX_VALUE + var maxV: Double = Double.MIN_VALUE + + //鏁版嵁鍊艰褰曪紝鎸夌収鍗囧簭鎺掑垪锛岀敤浜庤幏鍙栧垎浣嶅�� + // "10%鍒嗕綅鍊�", + // "25%鍒嗕綅鍊�", + // "50%鍒嗕綅鍊�", + // "75%鍒嗕綅鍊�", + // "90%鍒嗕綅鍊�" + val dataList = mutableListOf<Double>() + } + + inner class ResultData { + var count: Int = 0 + var avg: Double? = null + // 鏍囧噯宸� + var std: Double? = null + var min: Double? = null + var max: Double? = null + var q10: Double? = null + var q25: Double? = null + var q50: Double? = null + var q75: Double? = null + var q90: Double? = null + } + + //鎸夌収姣忕鐩戞祴鍥犲瓙璁板綍褰撳墠鏃堕棿涓嬬殑缁熻涓棿鏁版嵁 + private val dataMap = mutableMapOf<String?, TempData>() + + fun add(data: DataVo) { + data.values?.forEach { + if (!dataMap.containsKey(it.factorName)) { + dataMap[it.factorName] = TempData() + } + dataMap[it.factorName]?.apply { + sumOfSquares = sumOfSquares.plus(BigDecimal.valueOf( + (it.factorData ?: .0) * (it.factorData ?: .0) + )) + total = total.plus(BigDecimal.valueOf(it.factorData ?: .0)) + count++ + minV = min(minV, it.factorData?: .0) + maxV = max(maxV, it.factorData?: .0) + + if (needQuartile) { + dataList.add(it.factorData ?: .0) + } + } + } + } + + /** + * 杈撳嚭褰撳墠缁熻鏃堕棿涓嬬殑涓�琛岀粺璁℃暟鎹� + */ + fun getOutPutContent(): Array<Any> { + //姣忕鐩戞祴鍥犲瓙閮芥湁瀵瑰簲鐨勪竴绯诲垪缁熻椤� + val content = mutableListOf<Any>() + //绗竴鍒楁槸缁熻鏃堕棿 + content.add(time ?: "閿欒鏃堕棿") + needFactor.forEach { + dataMap[it.name]?.let {t -> + content.apply { + //"璁板綍鏁�", + val c = BigDecimal("${t.count}") + add(t.count) + // "鍧囧��", + val avg = t.total.div(c) + add(avg.toString()) + // "鏍囧噯宸�", + add( + sqrt( + t.sumOfSquares.minus( + avg.times(BigDecimal(2)).times(t.total) + ).plus( + avg.times(avg).times(c) + ).div(c).toDouble() + ).toString() + ) + // "鏈�灏忓��", + add(t.minV) + // "鏈�澶у��", + add(t.maxV) + //鍒嗕綅鍊� + if (needQuartile) { + t.dataList.sortBy { d -> d } + val size = t.dataList.size + // "10%鍒嗕綅鍊�", + add(t.dataList[round(size * .1).toInt()]) + // "25%鍒嗕綅鍊�", + add(t.dataList[round(size * .25).toInt()]) + // "50%鍒嗕綅鍊�", + add(t.dataList[round(size * .5).toInt()]) + // "75%鍒嗕綅鍊�", + add(t.dataList[round(size * .75).toInt()]) + // "90%鍒嗕綅鍊�" + add(t.dataList[round(size * .9).toInt()]) + } else { + add("") + add("") + add("") + add("") + add("") + } + } + } + } + + clear() + return content.toTypedArray() + } + + /** + * 璁$畻鏁版嵁鐨勫悇椤圭粺璁″�� + */ + fun calculate(): Map<FactorType, ResultData> { + //姣忕鐩戞祴鍥犲瓙閮芥湁瀵瑰簲鐨勪竴绯诲垪缁熻椤� + val resMap = mutableMapOf<FactorType, ResultData>() + needFactor.forEach { + dataMap[it.name]?.let {t -> + if (!resMap.containsKey(it)) { + resMap[it] = ResultData() + } + resMap[it]?.apply { + //"璁板綍鏁�", + val c = BigDecimal("${t.count}") + count = t.count + // "鍧囧��", + avg = if (c == BigDecimal.ZERO) .0 else t.total.div(c).toDouble() + // "鏍囧噯宸�", + std = sqrt( + t.sumOfSquares.minus( + BigDecimal(avg!!).times(BigDecimal(2)).times(t.total) + ).plus( + BigDecimal(avg!!).times(BigDecimal(avg!!)).times(c) + ).div(c).toDouble() + ) + // "鏈�灏忓��", + min = t.minV + // "鏈�澶у��", + max = t.maxV + //鍒嗕綅鍊� + if (needQuartile) { + t.dataList.sortBy { d -> d } + val size = t.dataList.size + // "10%鍒嗕綅鍊�", + q10 = t.dataList[round(size * .1).toInt()] + // "25%鍒嗕綅鍊�", + q25 = t.dataList[round(size * .25).toInt()] + // "50%鍒嗕綅鍊�", + q50 = t.dataList[round(size * .5).toInt()] + // "75%鍒嗕綅鍊�", + q75 = t.dataList[round(size * .75).toInt()] + // "90%鍒嗕綅鍊�" + q90 = t.dataList[round(size * .9).toInt()] + } + } + } + } + + clear() + return resMap + } + + /** + * 閲婃斁鍐呭瓨 + */ + private fun clear() { + dataMap.clear() + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/biz/report/MissionReport.kt b/src/main/kotlin/com/flightfeather/uav/biz/report/MissionReport.kt new file mode 100644 index 0000000..0a497c4 --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/biz/report/MissionReport.kt @@ -0,0 +1,155 @@ +package com.flightfeather.uav.biz.report + +import com.flightfeather.uav.biz.dataanalysis.ExceptionAnalysisController +import com.flightfeather.uav.biz.dataanalysis.model.ExceptionResult +import com.flightfeather.uav.biz.dataprocess.PreData +import com.flightfeather.uav.common.chart.ChartUtil +import com.flightfeather.uav.common.chart.DataToChartUtil +import com.flightfeather.uav.common.exception.BizException +import com.flightfeather.uav.common.pdf.GeneratePdfUtil +import com.flightfeather.uav.common.utils.DateUtil +import com.flightfeather.uav.common.utils.ImageUtil +import com.flightfeather.uav.domain.entity.Mission +import com.flightfeather.uav.domain.repository.MissionRep +import com.flightfeather.uav.domain.repository.RealTimeDataRep +import com.flightfeather.uav.socket.eunm.FactorType +import org.springframework.beans.BeanUtils +import org.springframework.beans.factory.annotation.Value +import org.springframework.stereotype.Component +import java.time.LocalDateTime +import java.time.ZoneId +import java.time.format.DateTimeFormatter + +/** + * 璧拌埅浠诲姟鎶ュ憡 + */ +@Component +class MissionReport( + private val exceptionAnalysisController: ExceptionAnalysisController, + private val missionRep: MissionRep, + private val realTimeDataRep: RealTimeDataRep, + @Value("\${filePath}") + private val filePath: String, +) { + data class Param( + val district: String, + val town: String, + val year: Int, + val month: Int, + val day: Int, + val first_party: String, + val start_time: String, + val end_time: String, + ) { + var factor_names: String = "" + var summary: List<Summary> = emptyList() + set(value) { + factor_names = value.map { it.factor }.joinToString("銆�") + field = value + } + var exceptions: List<ExceptionChart> = emptyList() + + /** + * 浼犲叆鏁版嵁寮傚父闆嗗悎锛岃嚜鍔ㄤ负姣忔潯寮傚父鐢熸垚鎶樼嚎鍥� + */ + fun addExceptions(exceptions: List<ExceptionResult>) { + this.exceptions = exceptions.map { + val byteArray = DataToChartUtil.lineToByteArray(FactorType.getByValue(it.factorId!!), it.dataList) + val base64Str = ImageUtil.compressImage2(byteArray, 400, needPrefix = false) + val c = ExceptionChart() + BeanUtils.copyProperties(it, c) + c.pict = base64Str + return@map c + } + } + } + + /** + * 鏁版嵁缁熻 + */ + class Summary { + var id: String? = null + var factor: String? = null + var avg: Double? = null + var min: Double? = null + var max: Double? = null + + // 鏁版嵁鎶樼嚎鍥綛ase64缂栫爜 + var pict: String? = null + } + + /** + * 鏁版嵁寮傚父鎵�鍦ㄦ椂娈电殑鎶樼嚎鍥� + */ + class ExceptionChart : ExceptionResult() { + // 鏁版嵁鎶樼嚎鍥綛ase64缂栫爜 + var pict: String? = null + } + + private val templateName = "report-underway.ftl" + + private val dateFormatter = DateTimeFormatter.ofPattern("HH:mm") + + // 鑾峰彇寮傚父鍒嗘瀽缁撴灉 + fun exceptionAnalysis(mission: Mission): List<ExceptionResult> { + return exceptionAnalysisController.run(mission) + } + + // 璁$畻鍧囧�煎拰鏁版嵁鑼冨洿 + fun dataSummary(mission: Mission): List<Summary> { + val preData = PreData(DateUtil.instance.dateToString(mission.startTime, DateUtil.DateStyle.YYYY_MM_DD)) + val realTimeData = realTimeDataRep.fetchData(mission) + realTimeData.forEach { + preData.add(it.toDataVo()) + } + val resMap = preData.calculate() + + val summaries = mutableListOf<Summary>() + resMap.forEach { (t, u) -> + summaries.add(Summary().apply { + id = t.value.toString() + factor = t.des + avg = u.avg + min = u.min + max = u.max + + val byteArray = DataToChartUtil.lineToByteArray(t, realTimeData) + val base64Str = ImageUtil.compressImage2(byteArray, 400, needPrefix = false) + pict = base64Str + }) + } + return summaries + } + + // 鐢熸垚鍙傛暟 + // 鏍规嵁鎶ュ憡妯℃澘鐢熸垚瀵瑰簲鎶ュ憡 + fun execute(missionCode: String): String { + // 1. 浠诲姟鍚堟硶鎬ф鏌� + val mission = missionRep.findOne(missionCode) ?: throw BizException("璇ヤ换鍔$紪鍙蜂笉瀛樺湪") + // 2. 鑾峰彇鏁版嵁寮傚父缁熻缁撴灉 + val exceptions = exceptionAnalysis(mission) + // 3. 鑾峰彇鍧囧�笺�佽寖鍥寸瓑缁熻鏁版嵁 + val summaries = dataSummary(mission) + // 4. 鐢熸垚鎶ュ憡 + val fileName = "report/" + "${mission.districtName}璧拌埅鐩戞祴鎶ュ憡-${ + DateUtil.instance.dateToString(mission.startTime, DateUtil.DateStyle.YYYY_MM_DD) + }.doc" + val reportTemplate = ReportTemplate(templateName, filePath, fileName) + val param = getParam(mission, exceptions, summaries) + val params = reportTemplate.getParam(param) + GeneratePdfUtil.generateWord(params) + return fileName + } + + private fun getParam(mission: Mission, exceptions: List<ExceptionResult>, summaries: List<Summary>): Param { + val startTime = LocalDateTime.ofInstant(mission.startTime.toInstant(), ZoneId.systemDefault()) + val endTime = LocalDateTime.ofInstant(mission.endTime.toInstant(), ZoneId.systemDefault()) + return Param( + mission.districtName, "", startTime.year, startTime.monthValue, startTime.dayOfMonth, "", + startTime.format(dateFormatter), endTime.format(dateFormatter) + ).apply { + summary = summaries + addExceptions(exceptions) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/biz/report/ReportTemplate.kt b/src/main/kotlin/com/flightfeather/uav/biz/report/ReportTemplate.kt new file mode 100644 index 0000000..8033507 --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/biz/report/ReportTemplate.kt @@ -0,0 +1,26 @@ +package com.flightfeather.uav.biz.report + +import com.flightfeather.uav.common.pdf.DynamicParam + +/** + * 璧拌埅鎶ュ憡妯℃澘 + */ +class ReportTemplate( + private val templateName:String, + private val outPath:String, + private val outName:String, +) { + // 纭畾妯℃澘璺緞 + private val templatePath = (Thread.currentThread().contextClassLoader?.getResource("/")?.path ?: "src/main/resources") + "/templates/" + + // 纭畾杈撳叆鍙傛暟 + fun getParam(obj: Any): DynamicParam { + val params = mutableMapOf<String, Any>() + val clz = obj.javaClass + clz.declaredFields.forEach {f-> + f.isAccessible = true + params[f.name] = f.get(obj) + } + return DynamicParam(templatePath, templateName, outPath, outName, params) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/common/chart/ChartUtil.kt b/src/main/kotlin/com/flightfeather/uav/common/chart/ChartUtil.kt new file mode 100644 index 0000000..4c30e1d --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/common/chart/ChartUtil.kt @@ -0,0 +1,44 @@ +package com.flightfeather.uav.common.chart + +import org.jfree.chart.ChartFactory +import org.jfree.chart.ChartUtils +import org.jfree.chart.JFreeChart +import org.jfree.chart.title.TextTitle +import org.jfree.data.category.DefaultCategoryDataset +import java.awt.Font +import java.io.ByteArrayOutputStream + +/** + * 鍥捐〃鐢熸垚 + * @date 2024/5/31 + * @author feiyu02 + */ +object ChartUtil { + + data class ChartValue(val x: String?, val y: Number) + + fun line(title: String, dataset: DefaultCategoryDataset): JFreeChart { + val line = ChartFactory.createLineChart(title, "鏃堕棿", "娴撳害", dataset) + line.categoryPlot.domainAxis.labelFont = Font("瀹嬩綋", Font.PLAIN, 12) + line.categoryPlot.rangeAxis.labelFont = Font("瀹嬩綋", Font.PLAIN, 12) + return line + } + + fun lineToByteArray(title: String, dataset: DefaultCategoryDataset):ByteArray { + val chart = line(title, dataset) + val output = ByteArrayOutputStream() + ChartUtils.writeChartAsPNG(output, chart, 600, 400) + val byteArray = output.toByteArray() + output.flush() + output.close() + return byteArray + } + + fun newDataset(dataList:List<ChartValue>, seriesName:String): DefaultCategoryDataset { + val dataset = DefaultCategoryDataset() + dataList.forEach { + dataset.setValue(it.y, seriesName, it.x) + } + return dataset + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/common/chart/DataToChartUtil.kt b/src/main/kotlin/com/flightfeather/uav/common/chart/DataToChartUtil.kt new file mode 100644 index 0000000..2170aa9 --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/common/chart/DataToChartUtil.kt @@ -0,0 +1,26 @@ +package com.flightfeather.uav.common.chart + +import com.flightfeather.uav.common.utils.DateUtil +import com.flightfeather.uav.domain.entity.BaseRealTimeData +import com.flightfeather.uav.socket.eunm.FactorType + +/** + * 璧拌埅鏁版嵁鐢熸垚鍥捐〃 + * @date 2024/5/31 + * @author feiyu02 + */ +object DataToChartUtil { + + fun lineToByteArray(type: FactorType?, data: List<BaseRealTimeData>): ByteArray { + val title = type?.des ?: "鏈煡鐩戞祴鍥犲瓙" + val seriesName = type?.des ?: "鏈煡绯诲垪" + val dataList = data.map { d -> + ChartUtil.ChartValue( + DateUtil.instance.dateToString(d.dataTime, DateUtil.DateStyle.HH_MM_SS), + d.getByFactorType(type) ?: 0f + ) + } + val dataset = ChartUtil.newDataset(dataList, seriesName) + return ChartUtil.lineToByteArray(title, dataset) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/common/exception/ResponseErrorException.kt b/src/main/kotlin/com/flightfeather/uav/common/exception/BizException.kt similarity index 91% rename from src/main/kotlin/com/flightfeather/uav/common/exception/ResponseErrorException.kt rename to src/main/kotlin/com/flightfeather/uav/common/exception/BizException.kt index bf8dd9e..a0198cd 100644 --- a/src/main/kotlin/com/flightfeather/uav/common/exception/ResponseErrorException.kt +++ b/src/main/kotlin/com/flightfeather/uav/common/exception/BizException.kt @@ -3,7 +3,7 @@ /** * 鍏佽鎺ュ彛杩斿洖鐨勪笟鍔″眰闈㈢殑閿欒 */ -class ResponseErrorException : Exception { +class BizException : Exception { constructor():super() constructor(message: String) : super(message) constructor(message: String, cause: Throwable) : super(message, cause) diff --git a/src/main/kotlin/com/flightfeather/uav/common/location/CoordinateUtil.kt b/src/main/kotlin/com/flightfeather/uav/common/location/CoordinateUtil.kt new file mode 100644 index 0000000..227c76e --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/common/location/CoordinateUtil.kt @@ -0,0 +1,35 @@ +package com.flightfeather.uav.common.location + +import kotlin.math.PI +import kotlin.math.cos +import kotlin.math.sin + +object CoordinateUtil { + + private const val Ea = 6378137 //璧ら亾鍗婂緞 + private const val Eb = 6356725 //鏋佸崐寰� + + /** + * 鏍规嵁鍧愭爣鐐广�佽窛绂诲拰瑙掑害锛岃幏鍙栧彟涓�涓潗鏍� + * @param pos 鍧愭爣鐐� + * @param len 璺濈锛堢背锛� + * @param radian 寮у害 + */ + fun getPointByLen(pos: Pair<Double, Double>, len: Double, radian: Double): Pair<Double, Double> { + val dx = len * sin(radian) + val dy = len * cos(radian) + val ec = Eb + (Ea - Eb) * (90.0 - pos.second) / 90.0 + val ed = ec * cos(pos.second * PI / 180) + val lng = (dx / ed + pos.first * PI / 180.0) * 180.0 / PI + val lat = (dy / ec + pos.second * PI / 180.0) * 180.0 / PI + return Pair(lng, lat) + } + + /** + * 绾害鐩稿悓鏃� + * 璺濈杞崲涓虹粡搴� + */ + fun disToLng(distance: Double): Double { + return distance * 0.00001 + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/common/location/LocationRoadNearby.kt b/src/main/kotlin/com/flightfeather/uav/common/location/LocationRoadNearby.kt new file mode 100644 index 0000000..f11848b --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/common/location/LocationRoadNearby.kt @@ -0,0 +1,47 @@ +package com.flightfeather.uav.common.location + +import com.flightfeather.uav.domain.entity.SceneInfo +import com.flightfeather.uav.domain.repository.SceneInfoRep +import org.springframework.stereotype.Component +import tk.mybatis.mapper.entity.Example +import kotlin.math.PI + +/** + * 璺鍛ㄨ竟鏌ヨ + */ +@Component +class LocationRoadNearby(private val sceneInfoRep: SceneInfoRep) { + + data class BasePlace( + val name: String, + val sP: Pair<Double, Double>, + val eP: Pair<Double, Double>, + ) + + /** + * 鏍规嵁鍦嗗績鍜屽崐寰勬煡璇㈣寖鍥村唴鐩戞祴鐐癸紙褰撳墠绠�鍖栨搷浣滐紝鏀逛负浠ョ洿寰勪负杈归暱鐨勬鏂瑰舰鑼冨洿锛� + * @param center 鍦嗗績 + * @param radius 鍗婂緞锛堝崟浣嶏細绫筹級 + * @return 鍦烘櫙鍒楄〃 + */ + fun searchByRadius(center: Pair<Double, Double>, radius: Double): List<SceneInfo?> { + // 姹傜粡搴︾殑鏈�灏忓�� + val minLng = CoordinateUtil.getPointByLen(center, radius, PI * 1.5).first + // 姹傜粡搴︾殑鏈�澶у�� + val maxLng = CoordinateUtil.getPointByLen(center, radius, PI * 0.5).first + // 姹傜含搴︾殑鏈�灏忓�� + val minLat = CoordinateUtil.getPointByLen(center, radius, PI).second + // 姹傜含搴︾殑鏈�澶у�� + val maxLat = CoordinateUtil.getPointByLen(center, radius, .0).second + + val list = listOf(minLng, maxLng, minLat, maxLat) + return getSceneFromDb(list) + } + + /** + * 鏍规嵁闄愬畾鐭╁舰鑼冨洿浠庢暟鎹簱鑾峰彇绗﹀悎鏉′欢鐨勭偣浣� + */ + private fun getSceneFromDb(range: List<Double>): List<SceneInfo?> { + return sceneInfoRep.findByCoordinateRange(range) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/common/pdf/DynamicParam.kt b/src/main/kotlin/com/flightfeather/uav/common/pdf/DynamicParam.kt new file mode 100644 index 0000000..17b6c04 --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/common/pdf/DynamicParam.kt @@ -0,0 +1,19 @@ +package com.flightfeather.uav.common.pdf + +/** + * @Description: 鐢熸垚PDF鍙傛暟 + * @author lgd + * @date 2022骞�4鏈�27鏃� 涓嬪崍6:04:56 + */ +data class DynamicParam( + // 妯$増璺緞 + val templatePath: String, + // 妯℃澘鏂囦欢鍚�(.ftl缁撳熬) + val templateName: String, + // 鐢熸垚璺緞 + val outPath: String, + // 鐢熸垚鏂囦欢鍚�(.pdf缁撳熬) + val outName: String, + // 鎵�闇�鏂囨湰鍙傛暟 + val param: Map<String, Any> +) \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/common/pdf/GeneratePdfUtil.kt b/src/main/kotlin/com/flightfeather/uav/common/pdf/GeneratePdfUtil.kt new file mode 100644 index 0000000..7c40908 --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/common/pdf/GeneratePdfUtil.kt @@ -0,0 +1,173 @@ +package com.flightfeather.uav.common.pdf + +import com.itextpdf.html2pdf.ConverterProperties +import com.itextpdf.html2pdf.HtmlConverter +import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider +import com.itextpdf.io.font.PdfEncodings +import com.itextpdf.kernel.font.PdfFontFactory +import com.itextpdf.layout.font.FontProvider +import freemarker.template.Configuration +import org.apache.pdfbox.pdmodel.PDDocument +import org.apache.pdfbox.rendering.PDFRenderer +import java.io.* +import javax.imageio.ImageIO +import javax.servlet.http.HttpServletResponse + + +/** + * @Description: 鐢熸垚PDF宸ュ叿绫� + */ +object GeneratePdfUtil { + private val TEMPORARY_CONTRACT_HTML = (Thread.currentThread().contextClassLoader?.getResource("/")?.path + ?: "src/main/resources/") + "templates/temporary.html" + + private val SIMSUN_FILE = + (Thread.currentThread().contextClassLoader?.getResource("/")?.path ?: "src/main/resources/") + "font/" + + private var cfg: Configuration? = null + + @Throws(Exception::class) + fun generateContract(param: DynamicParam): String { + // 鐢熸垚html + generateHTML(param.templatePath, param.templateName, param.param) + // 鏍规嵁html鐢熸垚pdf + generatePDF(param.outPath + param.outName) + // 鏍规嵁pdf鐢熸垚鍥剧墖 +// val picPaths = generatePic(param.outPath + param.outName) + // 鍒犻櫎涓存椂html + removeFile(TEMPORARY_CONTRACT_HTML) + return param.outPath + param.outName + } + + fun generateWord(param: DynamicParam) { + generateHTML(param.templatePath, param.templateName, param.param, param.outPath + param.outName) + } + + /** + * @Description 鐢熸垚html鏍煎紡 + */ + @Throws(Exception::class) + private fun generateHTML( + templatePath: String, templateName: String, paramMap: Map<String, Any>, + outFilePath: String? = null, + ) { + if (cfg == null) { + cfg = Configuration(Configuration.VERSION_2_3_31) + cfg?.defaultEncoding = "UTF-8" + /** + * 1.setClassForTemplateLoading(this.getClass(), "/HttpWeb"); + * 鍩轰簬绫昏矾寰勶紝HttpWeb鍖呬笅鐨刦ramemaker.ftl鏂囦欢 + * 2.setDirectoryForTemplateLoading(new File("/template")); + * 鍩轰簬鏂囦欢绯荤粺,template鐩綍涓嬬殑鏂囦欢 + * 3.setServletContextForTemplateLoading(request.getSession().getServletContext(), "/template"); + * 鍩轰簬Servlet Context锛屾寚鐨勬槸鍩轰簬WebRoot涓嬬殑template涓嬬殑framemaker.ftl鏂囦欢 + */ + val file = File(templatePath) + if (!file.exists()) { + file.mkdirs() + } + cfg?.setDirectoryForTemplateLoading(file) + } + + // templateName.ftl涓鸿瑁呰浇鐨勬ā鏉� + val template = cfg?.getTemplate(templateName) + val outHtmFile = File(outFilePath ?: TEMPORARY_CONTRACT_HTML) + if (!outHtmFile.parentFile.exists()) { + outHtmFile.parentFile.mkdirs() + } + val out: Writer = BufferedWriter(OutputStreamWriter(FileOutputStream(outHtmFile), "utf-8")) + // 灏嗗弬鏁拌緭鍑哄埌妯$増锛屽苟鎿嶄綔鍒癏TML涓� +// val env = template?.createProcessingEnvironment(paramMap, out) +// env?.outputEncoding = "utf-8" +// env?.process() + template?.process(paramMap, out) + out.close() + } + + /** + * @Description 鏍规嵁html鐢熸垚pdf + */ + @Throws(Exception::class) + private fun generatePDF(pdfUrl: String) { + val htmFile = File(TEMPORARY_CONTRACT_HTML) + val pdfFile = File(pdfUrl) + if (!pdfFile.parentFile.exists()) { + pdfFile.parentFile.mkdirs() + } + println(pdfUrl) +// val url = htmFile.toURI() +// val os: OutputStream = FileOutputStream(pdfFile) +// val renderer = ITextRenderer() +// renderer.setDocument(url) +// val fontResolver = renderer.fontResolver +// // 瑙e喅涓枃鏀寔闂 +// fontResolver.addFont(SIMSUM_FILE, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED) +// renderer.layout() +// renderer.createPDF(os) +// os.close() + val p = ConverterProperties() + println("------------------------------>>>>>>>${SIMSUN_FILE}") +// p.charset = "UTF-8" + p.fontProvider = FontProvider().apply { +// addStandardPdfFonts() +// addDirectory(SIMSUN_FILE) + addSystemFonts() + } + HtmlConverter.convertToPdf(htmFile, pdfFile, p) + } + + /** + * @Description 鏍规嵁pdf鐢熸垚鍥剧墖 + */ + @Throws(Exception::class) + private fun generatePic(pdfUrl: String): List<String> { + val picPaths = mutableListOf<String>() + + val pdfFile = File(pdfUrl) + if (!pdfFile.exists()) { + throw FileNotFoundException("$pdfUrl 鏂囦欢涓嶅瓨鍦�") + } + val doc = PDDocument.load(pdfFile) + val renderer = PDFRenderer(doc) + val pageCount = doc.numberOfPages + for (i in 0 until pageCount) { + val outputPath = pdfUrl.replace(".pdf", "(${i}).jpg"); + val outputFile = File(outputPath) + picPaths.add(outputPath) + // dpi锛屽浘鐗囧儚绱犵偣锛宒pi瓒婇珮鍥剧墖浣撶Н瓒婂ぇ锛�216寰堟竻鏅帮紝105浣撶Н绋冲畾 + val image = renderer.renderImageWithDPI(i, 216f) + // 鏍煎紡涓篔PG + ImageIO.write(image, "jpg", outputFile) + } + + doc.close() + + return picPaths + } + + /** + * @Description 绉婚櫎鏂囦欢 + */ + private fun removeFile(fileUrl: String) { + val file = File(fileUrl) + file.delete() + } + + @Throws(Exception::class) + fun returnPdfStream(response: HttpServletResponse, pathName: String?) { + response.contentType = "application/pdf" + val file = File(pathName) + if (file.exists()) { + val `in` = FileInputStream(file) + val out: OutputStream = response.outputStream + val b = ByteArray(1024 * 5) + var n: Int + while (`in`.read(b).also { n = it } != -1) { + out.write(b, 0, n) + } + out.flush() + `in`.close() + out.close() + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/common/utils/DateUtil.kt b/src/main/kotlin/com/flightfeather/uav/common/utils/DateUtil.kt index 2534ed9..0e26e93 100644 --- a/src/main/kotlin/com/flightfeather/uav/common/utils/DateUtil.kt +++ b/src/main/kotlin/com/flightfeather/uav/common/utils/DateUtil.kt @@ -726,6 +726,7 @@ YYYY_MM_DD_HH("yyyyMMddHH", false), YYYY_MM_DD_HH_MM("yyyy-MM-dd HH:mm", false), YYYY_MM_DD_HH_MM_SS("yyyy-MM-dd HH:mm:ss", false), + YYYY_MM_DD_HH_MM_SS_M("yyyy-MM-dd HH:mm:ss.sss", false), YYYY_MM_EN("yyyy/MM", false), YYYY_MM_DD_EN("yyyy/MM/dd", false), diff --git a/src/main/kotlin/com/flightfeather/uav/common/utils/ExcelUtil.kt b/src/main/kotlin/com/flightfeather/uav/common/utils/ExcelUtil.kt index 6d598ef..c73f36b 100644 --- a/src/main/kotlin/com/flightfeather/uav/common/utils/ExcelUtil.kt +++ b/src/main/kotlin/com/flightfeather/uav/common/utils/ExcelUtil.kt @@ -1,14 +1,13 @@ package com.flightfeather.uav.common.utils -import com.flightfeather.uav.common.exception.ResponseErrorException +import com.flightfeather.uav.common.exception.BizException +import org.apache.poi.hssf.usermodel.HSSFRow import org.apache.poi.hssf.usermodel.HSSFWorkbook import org.apache.poi.ss.usermodel.Row import org.apache.poi.ss.util.CellRangeAddress import org.apache.poi.xssf.streaming.SXSSFWorkbook import org.apache.poi.xssf.usermodel.XSSFRow import org.apache.poi.xssf.usermodel.XSSFWorkbook -import org.jetbrains.kotlin.incremental.isJavaFile -import java.io.ByteArrayInputStream import java.io.File import java.io.FileInputStream import java.io.InputStream @@ -37,15 +36,18 @@ * @param headerCheck 鏂囦欢棣栬妫�鏌ュ洖璋� * @param onRow 鍗曡鍐呭鍥炶皟锛屼粠绗簩琛屽紑濮� */ - fun read(file: File, headerCheck: (header: XSSFRow) -> Boolean, onRow: (row: Row) -> Unit): Boolean { - if (!file.exists() || !file.isFile) throw ResponseErrorException("it's not a normal file!") + fun readXLXS(file: File, headerCheck: (header: XSSFRow) -> Boolean, onRow: (row: Row) -> Unit): Boolean { + if (!file.exists() || !file.isFile) throw BizException("it's not a normal file!") if (!file.extension.equals("xls", ignoreCase = true) || !file.extension.equals("xlsx", ignoreCase = true)) { - throw ResponseErrorException("file's extension name should be xls or xlsx!") + throw BizException("file's extension name should be xls or xlsx!") } - return read(FileInputStream(file), headerCheck, onRow) + return readXLXS(FileInputStream(file), headerCheck, onRow) } - fun read(input: InputStream, headerCheck: (header: XSSFRow) -> Boolean, onRow: (row: Row) -> Unit): Boolean { + /** + * 鍖呮嫭 .xlsx 鏂囦欢 + */ + fun readXLXS(input: InputStream, headerCheck: (header: XSSFRow) -> Boolean, onRow: (row: Row) -> Unit): Boolean { val workbook = XSSFWorkbook(input) val sheet1 = workbook.getSheetAt(0) val header = sheet1.getRow(sheet1.topRow.toInt()) @@ -60,6 +62,23 @@ } /** + * 鍖呮嫭 .xls .csv 鏂囦欢 + */ + fun readXLS(input: InputStream, headerCheck: (header: HSSFRow) -> Boolean, onRow: (row: Row) -> Unit): Boolean { + val workbook = HSSFWorkbook(input) + val sheet1 = workbook.getSheetAt(0) + val header = sheet1.getRow(sheet1.topRow.toInt()) + return if (headerCheck(header)) { + // 鑾峰彇杩唬鍣ㄥ苟鍘婚櫎绗竴琛屾爣棰� + val iterator = sheet1.rowIterator().also { it.next() } + iterator.forEach { onRow(it) } + true + } else { + false + } + } + + /** * 鑷姩澶勭悊琛屽悎骞舵暟鎹� */ fun write2(heads: List<String>, contents: List<Array<Any>>, workbook: SXSSFWorkbook, sheetName: String) { diff --git a/src/main/kotlin/com/flightfeather/uav/common/utils/FileExchange.kt b/src/main/kotlin/com/flightfeather/uav/common/utils/FileExchange.kt index c2cde2f..ea62b09 100644 --- a/src/main/kotlin/com/flightfeather/uav/common/utils/FileExchange.kt +++ b/src/main/kotlin/com/flightfeather/uav/common/utils/FileExchange.kt @@ -1,7 +1,7 @@ package com.flightfeather.uav.common.utils import com.alibaba.fastjson.JSONObject -import com.flightfeather.uav.common.exception.ResponseErrorException +import com.flightfeather.uav.common.exception.BizException import com.flightfeather.uav.domain.entity.RealTimeData import com.flightfeather.uav.domain.entity.RealTimeDataVehicle import com.flightfeather.uav.socket.bean.AirData @@ -29,7 +29,73 @@ private val format = SimpleDateFormat("yyyy-MM-dd HH:mm:ss") } + /** + * 杞崲闈欏畨鍖鸿溅杞借蛋鑸暟鎹� + */ fun exchangeJinanData(deviceCode: String, file: InputStream): List<RealTimeDataVehicle> { + val headers = listOf( + "PostTime", + "Lon", + "Lat", + "PM25", + "PM10", + "Temperature", + "Humidity", + "Speed", + ) + val result = mutableListOf<RealTimeDataVehicle>() + try { + ExcelUtil.readXLXS(file, headerCheck = { + val cellIterator = it.cellIterator() + val headIterator = headers.iterator() + while (headIterator.hasNext()) { + val head = headIterator.next() + if (cellIterator.hasNext()) { + val cellText = cellIterator.next().stringCellValue + if (!cellText.equals(head)) { + throw BizException("鏂囦欢鏍煎紡閿欒, 琛ㄥご[${head}]搴旇涓篬${cellText}]") + } + } else { + throw BizException("鏂囦欢鏍煎紡閿欒, 琛ㄥご[${head}]缂哄け") + } + } + true + }, onRow = { + val data = RealTimeDataVehicle().apply { + this.deviceCode = deviceCode + dataTime = DateUtil.instance.StringToDate( + it.getCell(0)?.stringCellValue?.trim()?.split(".")?.get(0) + ) + longitude = it.getCell(1)?.stringCellValue?.trim()?.toBigDecimal() + latitude = it.getCell(2)?.stringCellValue?.trim()?.toBigDecimal() + pm25 = it.getCell(3)?.stringCellValue?.trim()?.toFloat()?: 0F + pm10 = it.getCell(4)?.stringCellValue?.trim()?.toFloat()?: 0F + temperature = it.getCell(5)?.stringCellValue?.trim()?.toFloat()?: 0F + humidity = it.getCell(6)?.stringCellValue?.trim()?.toFloat()?: 0F + velocity = it.getCell(7)?.stringCellValue?.trim()?.toFloat()?: 0F + no2 = 0F + co = 0F + h2s = 0F + so2 = 0F + o3 = 0F + voc = 0F + noi = 0F + windSpeed = 0F + windDirection = 0F + } + result.add(data) + }) + } catch (e: Exception) { + e.printStackTrace() + throw BizException("excel鏂囦欢鍐呭閿欒锛屾暟鎹浆鎹㈠け璐ワ紒", e) + } + return result + } + + /** + * 杞崲杞﹁浇璧拌埅鏁版嵁 + */ + fun exchangeVehicleData(deviceCode: String, file: InputStream): List<RealTimeDataVehicle> { val headers = listOf( "data_time", "longitude", @@ -51,7 +117,7 @@ ) val result = mutableListOf<RealTimeDataVehicle>() try { - ExcelUtil.read(file, headerCheck = { + ExcelUtil.readXLXS(file, headerCheck = { val cellIterator = it.cellIterator() val headIterator = headers.iterator() while (headIterator.hasNext()) { @@ -59,10 +125,10 @@ if (cellIterator.hasNext()) { val cellText = cellIterator.next().stringCellValue if (!cellText.equals(head)) { - throw ResponseErrorException("鏂囦欢鏍煎紡閿欒, 琛ㄥご[${head}]搴旇涓篬${cellText}]") + throw BizException("鏂囦欢鏍煎紡閿欒, 琛ㄥご[${head}]搴旇涓篬${cellText}]") } } else { - throw ResponseErrorException("鏂囦欢鏍煎紡閿欒, 琛ㄥご[${head}]缂哄け") + throw BizException("鏂囦欢鏍煎紡閿欒, 琛ㄥご[${head}]缂哄け") } } true @@ -91,7 +157,7 @@ }) } catch (e: Exception) { e.printStackTrace() - throw ResponseErrorException("excel鏂囦欢鍐呭閿欒锛屾暟鎹浆鎹㈠け璐ワ紒", e) + throw BizException("excel鏂囦欢鍐呭閿欒锛屾暟鎹浆鎹㈠け璐ワ紒", e) } return result } diff --git a/src/main/kotlin/com/flightfeather/uav/common/utils/ImageUtil.kt b/src/main/kotlin/com/flightfeather/uav/common/utils/ImageUtil.kt new file mode 100644 index 0000000..9dd086c --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/common/utils/ImageUtil.kt @@ -0,0 +1,47 @@ +package com.flightfeather.uav.common.utils + +import java.awt.Image +import java.awt.image.BufferedImage +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream +import java.util.* +import javax.imageio.ImageIO + +/** + * 鍥剧墖澶勭悊宸ュ叿 + * @date 2024/5/31 + * @author feiyu02 + */ +object ImageUtil { + private const val SCHEME_PNG = "data:image/{format};base64," + + fun prefix(formatName: String): String { + return SCHEME_PNG.replace("{format}", formatName) + } + + /** + * 鎸夌収鍥哄畾瀹藉害鍘嬬缉鍥剧墖鑷砨ase64褰㈠紡 + * @param bytes 鍥剧墖浜岃繘鍒舵祦 + * @param w 杞崲鍚庡浘鐗囧搴� + * @param formatName 鍥剧墖鏍煎紡 + * @param needPrefix 鏄惁娣诲姞鍓嶇紑 + */ + fun compressImage2(bytes: ByteArray, w: Int, formatName: String = "png", needPrefix: Boolean = true): String { + val input = ByteArrayInputStream(bytes) + val srcImg = ImageIO.read(input) + val srcW = srcImg.width + val scale = w.toFloat() / srcW + val h = (srcImg.height * scale).toInt() + + val buffImg = BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB) + buffImg.graphics.drawImage(srcImg.getScaledInstance(w, h, Image.SCALE_SMOOTH), 0, 0, null) + val out = ByteArrayOutputStream() + ImageIO.write(buffImg, formatName, out) + + return if (needPrefix) { + prefix(formatName) + Base64.getEncoder().encodeToString(out.toByteArray()) + } else { + Base64.getEncoder().encodeToString(out.toByteArray()) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/common/config/CorsConfig.kt b/src/main/kotlin/com/flightfeather/uav/config/CorsConfig.kt similarity index 94% rename from src/main/kotlin/com/flightfeather/uav/common/config/CorsConfig.kt rename to src/main/kotlin/com/flightfeather/uav/config/CorsConfig.kt index 746592c..ec82a03 100644 --- a/src/main/kotlin/com/flightfeather/uav/common/config/CorsConfig.kt +++ b/src/main/kotlin/com/flightfeather/uav/config/CorsConfig.kt @@ -1,4 +1,4 @@ -package com.flightfeather.uav.common.config +package com.flightfeather.uav.config import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/src/main/kotlin/com/flightfeather/uav/common/config/Swagger2Configuration.kt b/src/main/kotlin/com/flightfeather/uav/config/Swagger2Configuration.kt similarity index 96% rename from src/main/kotlin/com/flightfeather/uav/common/config/Swagger2Configuration.kt rename to src/main/kotlin/com/flightfeather/uav/config/Swagger2Configuration.kt index 9f81f98..d485339 100644 --- a/src/main/kotlin/com/flightfeather/uav/common/config/Swagger2Configuration.kt +++ b/src/main/kotlin/com/flightfeather/uav/config/Swagger2Configuration.kt @@ -1,4 +1,4 @@ -package com.flightfeather.uav.common.config +package com.flightfeather.uav.config import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean diff --git a/src/main/kotlin/com/flightfeather/uav/dataprocess/PreData.kt b/src/main/kotlin/com/flightfeather/uav/dataprocess/PreData.kt deleted file mode 100644 index 8a8d0cb..0000000 --- a/src/main/kotlin/com/flightfeather/uav/dataprocess/PreData.kt +++ /dev/null @@ -1,143 +0,0 @@ -package com.flightfeather.uav.dataprocess - -import com.flightfeather.uav.lightshare.bean.DataVo -import com.flightfeather.uav.socket.eunm.FactorType -import java.math.BigDecimal -import kotlin.math.max -import kotlin.math.min -import kotlin.math.round -import kotlin.math.sqrt - -/** - * 棰勫鐞嗘暟鎹� - */ -class PreData( - //缁熻鏃堕棿 - private val time: String?, - //鏄惁闇�瑕佽绠楀垎浣嶅�� - private val needQuartile: Boolean = true -) { - - inner class TempData { - //鏁版嵁骞虫柟鍜岋紙鐢ㄤ簬璁$畻鏍囧噯宸級 - var sumOfSquares: BigDecimal = BigDecimal.ZERO - //鏁版嵁鍜� - var total: BigDecimal = BigDecimal.ZERO - - //璁℃暟 - var count: Int = 0 - var minV: Double = Double.MAX_VALUE - var maxV: Double = Double.MIN_VALUE - - //鏁版嵁鍊艰褰曪紝鎸夌収鍗囧簭鎺掑垪锛岀敤浜庤幏鍙栧垎浣嶅�� - // "10%鍒嗕綅鍊�", - // "25%鍒嗕綅鍊�", - // "50%鍒嗕綅鍊�", - // "75%鍒嗕綅鍊�", - // "90%鍒嗕綅鍊�" - val dataList = mutableListOf<Double>() - } - - companion object { - //闇�瑕佺粺璁$殑鐩戞祴鍥犲瓙 - val needFactor = listOf( -// FactorType.NO2, FactorType.CO, FactorType.H2S, FactorType.SO2, FactorType.O3, FactorType.PM25, FactorType.PM10, - FactorType.VOC - ) - //闇�瑕佽绠楃殑椤圭洰 - val items = listOf( - "璁板綍鏁�", "鍧囧��", "鏍囧噯宸�", "鏈�灏忓��", "鏈�澶у��", "10%鍒嗕綅鍊�", "25%鍒嗕綅鍊�", "50%鍒嗕綅鍊�", "75%鍒嗕綅鍊�", "90%鍒嗕綅鍊�" - ) - } - - //鎸夌収姣忕鐩戞祴鍥犲瓙璁板綍褰撳墠鏃堕棿涓嬬殑缁熻涓棿鏁版嵁 - private val dataMap = mutableMapOf<String?, TempData>() - - fun add(data: DataVo) { - data.values?.forEach { - if (!dataMap.containsKey(it.factorName)) { - dataMap[it.factorName] = TempData() - } - dataMap[it.factorName]?.apply { - sumOfSquares = sumOfSquares.plus(BigDecimal.valueOf( - (it.factorData ?: .0) * (it.factorData ?: .0) - )) - total = total.plus(BigDecimal.valueOf(it.factorData ?: .0)) - count++ - minV = min(minV, it.factorData?: .0) - maxV = max(maxV, it.factorData?: .0) - - if (needQuartile) { - dataList.add(it.factorData ?: .0) - } - } - } - } - - /** - * 杈撳嚭褰撳墠缁熻鏃堕棿涓嬬殑涓�琛岀粺璁℃暟鎹� - */ - fun getOutPutContent(): Array<Any> { - //姣忕鐩戞祴鍥犲瓙閮芥湁瀵瑰簲鐨勪竴绯诲垪缁熻椤� - val content = mutableListOf<Any>() - //绗竴鍒楁槸缁熻鏃堕棿 - content.add(time ?: "閿欒鏃堕棿") - needFactor.forEach { - dataMap[it.name]?.let {t -> - content.apply { - //"璁板綍鏁�", - val c = BigDecimal("${t.count}") - add(t.count) - // "鍧囧��", - val avg = t.total.div(c) - add(avg.toString()) - // "鏍囧噯宸�", - add( - sqrt( - t.sumOfSquares.minus( - avg.times(BigDecimal(2)).times(t.total) - ).plus( - avg.times(avg).times(c) - ).div(c).toDouble() - ).toString() - ) - // "鏈�灏忓��", - add(t.minV) - // "鏈�澶у��", - add(t.maxV) - //鍒嗕綅鍊� - if (needQuartile) { - t.dataList.sortBy { d -> d } - val size = t.dataList.size - // "10%鍒嗕綅鍊�", - add(t.dataList[round(size * .1).toInt()]) - // "25%鍒嗕綅鍊�", - add(t.dataList[round(size * .25).toInt()]) - // "50%鍒嗕綅鍊�", - add(t.dataList[round(size * .5).toInt()]) - // "75%鍒嗕綅鍊�", - add(t.dataList[round(size * .75).toInt()]) - // "90%鍒嗕綅鍊�" - add(t.dataList[round(size * .9).toInt()]) - } else { - add("") - add("") - add("") - add("") - add("") - } - } - } - } - - clear() - return content.toTypedArray() - } - - /** - * 閲婃斁鍐呭瓨 - */ - private fun clear() { - dataMap.clear() - } -} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt b/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt index 2c6cc71..8c9f9df 100644 --- a/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt +++ b/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt @@ -1,14 +1,13 @@ package com.flightfeather.uav.domain.entity import com.flightfeather.uav.common.utils.DateUtil -import com.flightfeather.uav.dataprocess.AvgPair +import com.flightfeather.uav.biz.dataprocess.AvgPair import com.flightfeather.uav.lightshare.bean.DataVo import com.flightfeather.uav.socket.bean.AirData import com.flightfeather.uav.socket.eunm.FactorType import java.math.BigDecimal import java.time.LocalDateTime import java.time.ZoneId -import java.time.ZoneOffset import java.util.* import javax.persistence.Column import javax.persistence.Id @@ -108,6 +107,45 @@ add(AirData().apply { setData(FactorType.HEIGHT, height) }) } } + + fun getByFactorIndex(i: Int): Float? { + return when (i) { + 0 -> no2 + 1 -> co + 2 -> h2s + 3 -> so2 + 4 -> o3 + 5 -> pm25 + 6 -> pm10 + 7 -> voc + else -> null + } + } + + fun getByFactorType(type: FactorType?): Float? { + return when (type) { + FactorType.NO2 -> no2 + FactorType.CO -> co + FactorType.H2S -> h2s + FactorType.SO2 -> so2 + FactorType.O3 -> o3 + FactorType.PM25 -> pm25 + FactorType.PM10 -> pm10 + FactorType.TEMPERATURE -> temperature + FactorType.HUMIDITY -> humidity + FactorType.VOC -> voc + FactorType.NOI -> noi + FactorType.LNG -> longitude?.toFloat() + FactorType.LAT -> latitude?.toFloat() + FactorType.VELOCITY -> velocity +// FactorType.TIME -> noi + FactorType.WIND_SPEED -> windSpeed + FactorType.WIND_DIRECTION -> windDirection + FactorType.HEIGHT -> height + else -> null + } + } + } fun List<BaseRealTimeData>.avg(): RealTimeDataGridMin { diff --git a/src/main/kotlin/com/flightfeather/uav/domain/entity/Mission.java b/src/main/kotlin/com/flightfeather/uav/domain/entity/Mission.java index e5a55f1..1af716d 100644 --- a/src/main/kotlin/com/flightfeather/uav/domain/entity/Mission.java +++ b/src/main/kotlin/com/flightfeather/uav/domain/entity/Mission.java @@ -20,6 +20,9 @@ @Column(name = "end_time") private Date endTime; + @Column(name = "district_name") + private String districtName; + /** * @return mission_code */ @@ -89,4 +92,18 @@ public void setEndTime(Date endTime) { this.endTime = endTime; } + + /** + * @return district_name + */ + public String getDistrictName() { + return districtName; + } + + /** + * @param districtName + */ + public void setDistrictName(String districtName) { + this.districtName = districtName == null ? null : districtName.trim(); + } } \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/domain/entity/SceneInfo.java b/src/main/kotlin/com/flightfeather/uav/domain/entity/SceneInfo.java new file mode 100644 index 0000000..716dede --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/domain/entity/SceneInfo.java @@ -0,0 +1,502 @@ +package com.flightfeather.uav.domain.entity; + +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.*; + +@Table(name = "scene_info") +public class SceneInfo { + @Id + @Column(name = "GUID") + private String guid; + + @Column(name = "Name") + private String name; + + @Column(name = "Type_ID") + private Byte typeId; + + @Column(name = "Type") + private String type; + + @Column(name = "Subtype_ID") + private Byte subtypeId; + + @Column(name = "Subtype") + private String subtype; + + @Column(name = "Location") + private String location; + + @Column(name = "Longitude") + private BigDecimal longitude; + + @Column(name = "Latitude") + private BigDecimal latitude; + + @Column(name = "Province_Code") + private String provinceCode; + + @Column(name = "Province_Name") + private String provinceName; + + @Column(name = "City_Code") + private String cityCode; + + @Column(name = "City_Name") + private String cityName; + + @Column(name = "District_Code") + private String districtCode; + + @Column(name = "District_Name") + private String districtName; + + @Column(name = "Town_Code") + private String townCode; + + @Column(name = "Town_Name") + private String townName; + + @Column(name = "Contacts_T") + private String contactsT; + + @Column(name = "Contacts_WX") + private String contactsWx; + + @Column(name = "Contacts") + private String contacts; + + @Column(name = "Create_Date") + private Date createDate; + + @Column(name = "Update_Date") + private Date updateDate; + + @Column(name = "Extension1") + private String extension1; + + @Column(name = "Extension2") + private String extension2; + + @Column(name = "Remark") + private String remark; + + @Column(name = "Area_Code") + private String areaCode; + + @Column(name = "Area") + private String area; + + @Column(name = "Management_Company_Id") + private String managementCompanyId; + + @Column(name = "Management_Company") + private String managementCompany; + + /** + * @return GUID + */ + public String getGuid() { + return guid; + } + + /** + * @param guid + */ + public void setGuid(String guid) { + this.guid = guid == null ? null : guid.trim(); + } + + /** + * @return Name + */ + public String getName() { + return name; + } + + /** + * @param name + */ + public void setName(String name) { + this.name = name == null ? null : name.trim(); + } + + /** + * @return Type_ID + */ + public Byte getTypeId() { + return typeId; + } + + /** + * @param typeId + */ + public void setTypeId(Byte typeId) { + this.typeId = typeId; + } + + /** + * @return Type + */ + public String getType() { + return type; + } + + /** + * @param type + */ + public void setType(String type) { + this.type = type == null ? null : type.trim(); + } + + /** + * @return Subtype_ID + */ + public Byte getSubtypeId() { + return subtypeId; + } + + /** + * @param subtypeId + */ + public void setSubtypeId(Byte subtypeId) { + this.subtypeId = subtypeId; + } + + /** + * @return Subtype + */ + public String getSubtype() { + return subtype; + } + + /** + * @param subtype + */ + public void setSubtype(String subtype) { + this.subtype = subtype == null ? null : subtype.trim(); + } + + /** + * @return Location + */ + public String getLocation() { + return location; + } + + /** + * @param location + */ + public void setLocation(String location) { + this.location = location == null ? null : location.trim(); + } + + /** + * @return Longitude + */ + public BigDecimal getLongitude() { + return longitude; + } + + /** + * @param longitude + */ + public void setLongitude(BigDecimal longitude) { + this.longitude = longitude; + } + + /** + * @return Latitude + */ + public BigDecimal getLatitude() { + return latitude; + } + + /** + * @param latitude + */ + public void setLatitude(BigDecimal latitude) { + this.latitude = latitude; + } + + /** + * @return Province_Code + */ + public String getProvinceCode() { + return provinceCode; + } + + /** + * @param provinceCode + */ + public void setProvinceCode(String provinceCode) { + this.provinceCode = provinceCode == null ? null : provinceCode.trim(); + } + + /** + * @return Province_Name + */ + public String getProvinceName() { + return provinceName; + } + + /** + * @param provinceName + */ + public void setProvinceName(String provinceName) { + this.provinceName = provinceName == null ? null : provinceName.trim(); + } + + /** + * @return City_Code + */ + public String getCityCode() { + return cityCode; + } + + /** + * @param cityCode + */ + public void setCityCode(String cityCode) { + this.cityCode = cityCode == null ? null : cityCode.trim(); + } + + /** + * @return City_Name + */ + public String getCityName() { + return cityName; + } + + /** + * @param cityName + */ + public void setCityName(String cityName) { + this.cityName = cityName == null ? null : cityName.trim(); + } + + /** + * @return District_Code + */ + public String getDistrictCode() { + return districtCode; + } + + /** + * @param districtCode + */ + public void setDistrictCode(String districtCode) { + this.districtCode = districtCode == null ? null : districtCode.trim(); + } + + /** + * @return District_Name + */ + public String getDistrictName() { + return districtName; + } + + /** + * @param districtName + */ + public void setDistrictName(String districtName) { + this.districtName = districtName == null ? null : districtName.trim(); + } + + /** + * @return Town_Code + */ + public String getTownCode() { + return townCode; + } + + /** + * @param townCode + */ + public void setTownCode(String townCode) { + this.townCode = townCode == null ? null : townCode.trim(); + } + + /** + * @return Town_Name + */ + public String getTownName() { + return townName; + } + + /** + * @param townName + */ + public void setTownName(String townName) { + this.townName = townName == null ? null : townName.trim(); + } + + /** + * @return Contacts_T + */ + public String getContactsT() { + return contactsT; + } + + /** + * @param contactsT + */ + public void setContactsT(String contactsT) { + this.contactsT = contactsT == null ? null : contactsT.trim(); + } + + /** + * @return Contacts_WX + */ + public String getContactsWx() { + return contactsWx; + } + + /** + * @param contactsWx + */ + public void setContactsWx(String contactsWx) { + this.contactsWx = contactsWx == null ? null : contactsWx.trim(); + } + + /** + * @return Contacts + */ + public String getContacts() { + return contacts; + } + + /** + * @param contacts + */ + public void setContacts(String contacts) { + this.contacts = contacts == null ? null : contacts.trim(); + } + + /** + * @return Create_Date + */ + public Date getCreateDate() { + return createDate; + } + + /** + * @param createDate + */ + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + /** + * @return Update_Date + */ + public Date getUpdateDate() { + return updateDate; + } + + /** + * @param updateDate + */ + public void setUpdateDate(Date updateDate) { + this.updateDate = updateDate; + } + + /** + * @return Extension1 + */ + public String getExtension1() { + return extension1; + } + + /** + * @param extension1 + */ + public void setExtension1(String extension1) { + this.extension1 = extension1 == null ? null : extension1.trim(); + } + + /** + * @return Extension2 + */ + public String getExtension2() { + return extension2; + } + + /** + * @param extension2 + */ + public void setExtension2(String extension2) { + this.extension2 = extension2 == null ? null : extension2.trim(); + } + + /** + * @return Remark + */ + public String getRemark() { + return remark; + } + + /** + * @param remark + */ + public void setRemark(String remark) { + this.remark = remark == null ? null : remark.trim(); + } + + /** + * @return Area_Code + */ + public String getAreaCode() { + return areaCode; + } + + /** + * @param areaCode + */ + public void setAreaCode(String areaCode) { + this.areaCode = areaCode == null ? null : areaCode.trim(); + } + + /** + * @return Area + */ + public String getArea() { + return area; + } + + /** + * @param area + */ + public void setArea(String area) { + this.area = area == null ? null : area.trim(); + } + + /** + * @return Management_Company_Id + */ + public String getManagementCompanyId() { + return managementCompanyId; + } + + /** + * @param managementCompanyId + */ + public void setManagementCompanyId(String managementCompanyId) { + this.managementCompanyId = managementCompanyId == null ? null : managementCompanyId.trim(); + } + + /** + * @return Management_Company + */ + public String getManagementCompany() { + return managementCompany; + } + + /** + * @param managementCompany + */ + public void setManagementCompany(String managementCompany) { + this.managementCompany = managementCompany == null ? null : managementCompany.trim(); + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/domain/mapper/SceneInfoMapper.kt b/src/main/kotlin/com/flightfeather/uav/domain/mapper/SceneInfoMapper.kt new file mode 100644 index 0000000..9d3b7cb --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/domain/mapper/SceneInfoMapper.kt @@ -0,0 +1,8 @@ +package com.flightfeather.uav.domain.mapper + +import com.flightfeather.uav.domain.MyMapper +import com.flightfeather.uav.domain.entity.SceneInfo +import org.apache.ibatis.annotations.Mapper + +@Mapper +interface SceneInfoMapper : MyMapper<SceneInfo?> \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/domain/repository/MissionRep.kt b/src/main/kotlin/com/flightfeather/uav/domain/repository/MissionRep.kt new file mode 100644 index 0000000..54901b9 --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/domain/repository/MissionRep.kt @@ -0,0 +1,15 @@ +package com.flightfeather.uav.domain.repository + +import com.flightfeather.uav.domain.entity.Mission +import com.flightfeather.uav.domain.mapper.MissionMapper +import org.springframework.stereotype.Repository + +@Repository +class MissionRep( + private val missionMapper: MissionMapper, +) { + + fun findOne(missionCode:String?): Mission? { + return missionMapper.selectByPrimaryKey(missionCode) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/domain/repository/RealTimeDataRep.kt b/src/main/kotlin/com/flightfeather/uav/domain/repository/RealTimeDataRep.kt new file mode 100644 index 0000000..7f573b2 --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/domain/repository/RealTimeDataRep.kt @@ -0,0 +1,76 @@ +package com.flightfeather.uav.domain.repository + +import com.flightfeather.uav.domain.entity.* +import com.flightfeather.uav.domain.mapper.RealTimeDataGridMapper +import com.flightfeather.uav.domain.mapper.RealTimeDataGridMinMapper +import com.flightfeather.uav.domain.mapper.RealTimeDataUavMapper +import com.flightfeather.uav.domain.mapper.RealTimeDataVehicleMapper +import com.flightfeather.uav.socket.eunm.UWDeviceType +import com.github.pagehelper.PageHelper +import org.springframework.stereotype.Repository +import tk.mybatis.mapper.entity.Example +import java.util.* + +/** + * 瀹炴椂璧拌埅鏁版嵁鏁版嵁搴撶浉鍏虫搷浣� + */ +@Repository +class RealTimeDataRep( + private val realTimeDataVehicleMapper: RealTimeDataVehicleMapper, + private val realTimeDataUavMapper: RealTimeDataUavMapper, + private val realTimeDataGridMapper: RealTimeDataGridMapper, + private val realTimeDataGridMinMapper: RealTimeDataGridMinMapper, +) { + + private fun getSecondDataExample(example: Example, deviceCode: String?, sTime: Date?, eTime: Date?) { + example.createCriteria().apply { + deviceCode?.let { andEqualTo("deviceCode", it) } + sTime?.let { andGreaterThanOrEqualTo("dataTime", it) } + eTime?.let { andLessThanOrEqualTo("dataTime", it) } + } + example.orderBy("dataTime").apply { + // 褰撹姹傛帴鍙d笉浼犻�掕捣濮嬫椂闂达紝榛樿鑾峰彇鏈�鏂扮殑鏁版嵁 + if (sTime == null && eTime == null) { + desc() + } + } + } + + fun fetchData( + deviceCode: String, + sTime: Date?, + eTime: Date?, + type: Int? = 0, + ): List<BaseRealTimeData> { + var result = listOf<BaseRealTimeData>() + when (UWDeviceType.getType(deviceCode)) { + UWDeviceType.VEHICLE -> { + result = realTimeDataVehicleMapper.selectByExample(Example(RealTimeDataVehicle::class.java).apply { + getSecondDataExample(this, deviceCode, sTime, eTime) + }) + } + UWDeviceType.UAV -> { + result = realTimeDataUavMapper.selectByExample(Example(RealTimeDataUav::class.java).apply { + getSecondDataExample(this, deviceCode, sTime, eTime) + }) + } + UWDeviceType.GRID -> { + // 缃戞牸鍖栫洃娴嬬绾у�� + result = if (type == null || type == 0) { + realTimeDataGridMapper.selectByExample(Example(RealTimeDataGrid::class.java).apply { + getSecondDataExample(this, deviceCode, sTime, eTime) + }) + } + // 缃戞牸鍖栫洃娴嬪垎閽熷�� + else { + realTimeDataGridMinMapper.selectByExample(Example(RealTimeDataGridMin::class.java).apply { + getSecondDataExample(this, deviceCode, sTime, eTime) + }) + } + } + } + return result + } + + fun fetchData(mission: Mission) = fetchData(mission.deviceCode, mission.startTime, mission.endTime) +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/domain/repository/SceneInfoRep.kt b/src/main/kotlin/com/flightfeather/uav/domain/repository/SceneInfoRep.kt new file mode 100644 index 0000000..e38cd28 --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/domain/repository/SceneInfoRep.kt @@ -0,0 +1,44 @@ +package com.flightfeather.uav.domain.repository + +import com.flightfeather.uav.domain.entity.SceneInfo +import com.flightfeather.uav.domain.mapper.SceneInfoMapper +import com.flightfeather.uav.lightshare.bean.AreaVo +import org.springframework.stereotype.Repository +import tk.mybatis.mapper.entity.Example + +/** + * 鍦烘櫙淇℃伅鏁版嵁搴撶浉鍏虫搷浣� + */ +@Repository +class SceneInfoRep(private val sceneInfoMapper: SceneInfoMapper) { + + fun findByArea(areaVo: AreaVo): List<SceneInfo?> { + return sceneInfoMapper.selectByExample(Example(SceneInfo::class.java).apply { + createCriteria().andEqualTo("provinceCode", areaVo.provinceCode) + .andEqualTo("provinceName", areaVo.provinceName) + .andEqualTo("cityCode", areaVo.cityCode) + .andEqualTo("cityName", areaVo.cityName) + .andEqualTo("districtCode", areaVo.districtCode) + .andEqualTo("districtName", areaVo.districtName) + .andEqualTo("townCode", areaVo.townCode) + .andEqualTo("townName", areaVo.townName) + .andEqualTo("areaCode", areaVo.areaCode) + .andEqualTo("area", areaVo.area) + .andEqualTo("managementCompanyId", areaVo.managementCompanyId) + .andEqualTo("managementCompany", areaVo.managementCompany) + .andEqualTo("typeId", areaVo.sceneTypeId) + }) + } + + /** + * 鏍规嵁缁忕含搴﹁寖鍥寸瓫閫夊満鏅� + */ + fun findByCoordinateRange(range: List<Double>):List<SceneInfo?>{ + return sceneInfoMapper.selectByExample(Example(SceneInfo::class.java).apply { + createCriteria().andGreaterThanOrEqualTo("longitude", range[0]) + .andLessThanOrEqualTo("longitude", range[1]) + .andGreaterThanOrEqualTo("latitude", range[2]) + .andLessThanOrEqualTo("latitude", range[3]) + }) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/bean/AreaVo.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/bean/AreaVo.kt new file mode 100644 index 0000000..42dd35f --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/bean/AreaVo.kt @@ -0,0 +1,24 @@ +package com.flightfeather.uav.lightshare.bean + +import com.fasterxml.jackson.annotation.JsonInclude + +/** + * 鍖哄煙鏉′欢 + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +open class AreaVo{ + // 琛屾斂鍖哄垝 + var provinceCode: String? = null + var provinceName: String? = null + var cityCode: String? = null + var cityName: String? = null + var districtCode: String? = null + var districtName: String? = null + var townCode: String? = null + var townName: String? = null + var areaCode: String? = null + var area: String? = null + var managementCompanyId: String? = null + var managementCompany: String? = null + var sceneTypeId: String? = null +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/bean/ElectricDailyInfo.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/bean/ElectricDailyInfo.kt index 720c349..9bef607 100644 --- a/src/main/kotlin/com/flightfeather/uav/lightshare/bean/ElectricDailyInfo.kt +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/bean/ElectricDailyInfo.kt @@ -1,7 +1,6 @@ package com.flightfeather.uav.lightshare.bean import com.flightfeather.uav.common.utils.DateUtil -import com.flightfeather.uav.dataprocess.ElectricDailyAnalysis import com.flightfeather.uav.domain.entity.CompanyDevice import com.flightfeather.uav.domain.entity.ElectricMinuteValue import com.flightfeather.uav.lightshare.eunm.ElectricityStatus diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/EPWModelService.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/EPWModelService.kt index 041686d..fe26894 100644 --- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/EPWModelService.kt +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/EPWModelService.kt @@ -9,7 +9,6 @@ /** * 缃戞牸鍒嗘瀽 * 鎸夌収鍥哄畾鐨勬�婚潰绉紝鏍规嵁缁欏畾鐨勭綉鏍艰竟闀匡紝鍔ㄦ�佺敓鎴愬搴旀暟閲忕殑缃戞牸 - * @param type 鏁版嵁婧愮被鍨� @see [UWDeviceType], 0a,0b,0c,0d * @param len 缃戞牸闀垮害 */ fun getEpwModelResult(deviceCode: String, startTime: String, endTime: String, len: Double): BaseResponse<List<GridVo>> diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/MissionService.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/MissionService.kt index 8151dd8..1a83248 100644 --- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/MissionService.kt +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/MissionService.kt @@ -2,6 +2,7 @@ import com.flightfeather.uav.domain.entity.Mission import com.flightfeather.uav.lightshare.bean.BaseResponse +import javax.servlet.http.HttpServletResponse interface MissionService { @@ -12,4 +13,6 @@ fun deleteMission(missionCode: String): BaseResponse<Boolean> fun deleteMissionAndData(missionCode: String): Boolean + + fun getReport(missionCode: String, response: HttpServletResponse) } \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/SceneService.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/SceneService.kt new file mode 100644 index 0000000..719a3ef --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/SceneService.kt @@ -0,0 +1,11 @@ +package com.flightfeather.uav.lightshare.service + +import com.flightfeather.uav.domain.entity.SceneInfo +import com.flightfeather.uav.lightshare.bean.AreaVo + +interface SceneService { + + fun searchScene(areaVo: AreaVo, page: Int?, perPage: Int?): List<SceneInfo?> + + fun searchByCoordinate(lng: Double, lat: Double, radius: Double): List<SceneInfo?> +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ElectricityServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ElectricityServiceImpl.kt index 28cd86f..39e9f5e 100644 --- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ElectricityServiceImpl.kt +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ElectricityServiceImpl.kt @@ -1,7 +1,7 @@ package com.flightfeather.uav.lightshare.service.impl import com.flightfeather.uav.common.utils.DateUtil -import com.flightfeather.uav.dataprocess.ElectricDailyAnalysis +import com.flightfeather.uav.biz.dataprocess.ElectricDailyAnalysis import com.flightfeather.uav.domain.entity.CompanyDevice import com.flightfeather.uav.domain.entity.ElectricMinuteValue import com.flightfeather.uav.domain.entity.toAirData @@ -10,18 +10,14 @@ import com.flightfeather.uav.lightshare.bean.* import com.flightfeather.uav.lightshare.eunm.ElectricityType import com.flightfeather.uav.lightshare.service.ElectricityService -import com.flightfeather.uav.socket.bean.AirData import com.github.pagehelper.PageHelper -import org.springframework.format.annotation.DateTimeFormat import org.springframework.stereotype.Service import tk.mybatis.mapper.entity.Example import java.text.SimpleDateFormat -import java.time.LocalDate import java.time.LocalDateTime import java.time.ZoneId import java.time.format.DateTimeFormatter import java.time.format.DateTimeParseException -import kotlin.math.round @Service class ElectricityServiceImpl( diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/MissionServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/MissionServiceImpl.kt index d9cffe4..340cdc2 100644 --- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/MissionServiceImpl.kt +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/MissionServiceImpl.kt @@ -1,6 +1,7 @@ package com.flightfeather.uav.lightshare.service.impl -import com.flightfeather.uav.common.exception.ResponseErrorException +import com.flightfeather.uav.biz.report.MissionReport +import com.flightfeather.uav.common.exception.BizException import com.flightfeather.uav.domain.entity.Mission import com.flightfeather.uav.domain.entity.RealTimeDataVehicle import com.flightfeather.uav.domain.mapper.MissionMapper @@ -11,11 +12,13 @@ import com.github.pagehelper.PageHelper import org.springframework.stereotype.Service import tk.mybatis.mapper.entity.Example +import javax.servlet.http.HttpServletResponse @Service class MissionServiceImpl( private val missionMapper: MissionMapper, private val realTimeDataVehicleMapper: RealTimeDataVehicleMapper, + private val missionReport: MissionReport, ) : MissionService { override fun getMission(type: String?, page: Int?, perPage: Int?): BaseResponse<List<Mission>> { val _perPage = perPage ?: 60 @@ -47,7 +50,7 @@ } override fun deleteMissionAndData(missionCode: String): Boolean { - val mission = missionMapper.selectByPrimaryKey(missionCode) ?: throw ResponseErrorException("浠诲姟涓嶅瓨鍦�") + val mission = missionMapper.selectByPrimaryKey(missionCode) ?: throw BizException("浠诲姟涓嶅瓨鍦�") missionMapper.deleteByPrimaryKey(missionCode) realTimeDataVehicleMapper.deleteByExample(Example(RealTimeDataVehicle::class.java).apply { createCriteria().andEqualTo("deviceCode", mission.deviceCode) @@ -55,4 +58,8 @@ }) return true } + + override fun getReport(missionCode: String, response: HttpServletResponse) { + missionReport.execute(missionCode) + } } \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt index ae74aed..7e541ff 100644 --- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt @@ -1,19 +1,17 @@ package com.flightfeather.uav.lightshare.service.impl -import com.flightfeather.uav.common.exception.ResponseErrorException +import com.flightfeather.uav.common.exception.BizException import com.flightfeather.uav.common.scaleMap import com.flightfeather.uav.common.utils.DateUtil import com.flightfeather.uav.common.utils.ExcelUtil import com.flightfeather.uav.common.utils.FileExchange -import com.flightfeather.uav.common.utils.GsonUtils -import com.flightfeather.uav.dataprocess.AverageUtil +import com.flightfeather.uav.biz.dataprocess.AverageUtil import com.flightfeather.uav.domain.entity.* import com.flightfeather.uav.domain.mapper.* import com.flightfeather.uav.lightshare.bean.* import com.flightfeather.uav.lightshare.service.RealTimeDataService import com.flightfeather.uav.model.epw.EPWDataPrep import com.flightfeather.uav.repository.AirDataRepository -import com.flightfeather.uav.socket.bean.AirData import com.flightfeather.uav.socket.eunm.UWDeviceType import com.github.pagehelper.PageHelper import org.apache.poi.xssf.streaming.SXSSFWorkbook @@ -30,7 +28,6 @@ import java.time.format.DateTimeFormatter import java.util.* import javax.servlet.http.HttpServletResponse -import javax.swing.text.DateFormatter import kotlin.math.sqrt @Service @@ -194,6 +191,7 @@ override fun importJinanData(code: String, file: MultipartFile): DataImportResult { val f = ByteArrayInputStream(file.bytes) +// val result = fileExchange.exchangeVehicleData(code, f) val result = fileExchange.exchangeJinanData(code, f) if (result.isNotEmpty()) { val first = result.first() @@ -205,7 +203,7 @@ deviceType = UWDeviceType.getType(code)?.value deviceCode = code } - missionMapper.selectOne(mission)?.run { throw ResponseErrorException("璇ヨ澶囪鏃舵浠诲姟宸插瓨鍦紝鏃犳硶閲嶅瀵煎叆") } + missionMapper.selectOne(mission)?.run { throw BizException("璇ヨ澶囪鏃舵浠诲姟宸插瓨鍦紝鏃犳硶閲嶅瀵煎叆") } mission.apply { startTime = first.dataTime endTime = last.dataTime diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SceneServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SceneServiceImpl.kt new file mode 100644 index 0000000..25e45ec --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SceneServiceImpl.kt @@ -0,0 +1,24 @@ +package com.flightfeather.uav.lightshare.service.impl + +import com.flightfeather.uav.common.location.LocationRoadNearby +import com.flightfeather.uav.domain.entity.SceneInfo +import com.flightfeather.uav.domain.repository.SceneInfoRep +import com.flightfeather.uav.lightshare.bean.AreaVo +import com.flightfeather.uav.lightshare.service.SceneService +import org.springframework.stereotype.Service + +@Service +class SceneServiceImpl( + private val locationRoadNearby: LocationRoadNearby, + private val sceneInfoRep: SceneInfoRep, +) : SceneService { + + override fun searchScene(areaVo: AreaVo, page: Int?, perPage: Int?): List<SceneInfo?> { + // FIXME: 2024/5/13 鍥犱负鏌ヨ缁撴灉鐢ㄤ簬鍦板浘鐐逛綅鏍囪锛岄渶瑕佷竴娆℃�у叏閮ㄥ睍绀猴紝鍥犳鏆備笉浣跨敤鍒嗛〉 + return sceneInfoRep.findByArea(areaVo) + } + + override fun searchByCoordinate(lng: Double, lat: Double, radius: Double): List<SceneInfo?> { + return locationRoadNearby.searchByRadius(Pair(lng, lat), radius) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/web/BaseResPack.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/web/BaseResPack.kt index c0fb761..f9687d8 100644 --- a/src/main/kotlin/com/flightfeather/uav/lightshare/web/BaseResPack.kt +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/web/BaseResPack.kt @@ -1,6 +1,6 @@ package com.flightfeather.uav.lightshare.web -import com.flightfeather.uav.common.exception.ResponseErrorException +import com.flightfeather.uav.common.exception.BizException import com.flightfeather.uav.lightshare.bean.BaseResponse import com.flightfeather.uav.lightshare.bean.DataHead @@ -21,7 +21,7 @@ } else { BaseResponse(true, data = res) } - } catch (e: ResponseErrorException) { + } catch (e: BizException) { BaseResponse(false, message = e.message ?: "") } } \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/web/MissionController.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/web/MissionController.kt index 4b0060f..4af2908 100644 --- a/src/main/kotlin/com/flightfeather/uav/lightshare/web/MissionController.kt +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/web/MissionController.kt @@ -4,6 +4,7 @@ import com.flightfeather.uav.lightshare.service.MissionService import io.swagger.annotations.Api import org.springframework.web.bind.annotation.* +import javax.servlet.http.HttpServletResponse @Api(tags = ["璧拌埅鐩戞祴浠诲姟API鎺ュ彛"]) @RestController @@ -31,4 +32,10 @@ fun deleteMissionAndData( @RequestParam("missionCode") missionCode: String ) = resPack { missionService.deleteMissionAndData(missionCode) } + + @GetMapping("/report") + fun getReport( + @RequestParam missionCode: String, + response: HttpServletResponse, + ) = missionService.getReport(missionCode, response) } \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/web/SceneController.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/web/SceneController.kt new file mode 100644 index 0000000..a74ebe7 --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/web/SceneController.kt @@ -0,0 +1,27 @@ +package com.flightfeather.uav.lightshare.web + +import com.flightfeather.uav.lightshare.bean.AreaVo +import com.flightfeather.uav.lightshare.service.SceneService +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import org.springframework.web.bind.annotation.* + +@Api(tags = ["SceneController"], description = "鍦烘櫙API鎺ュ彛") +@RestController +@RequestMapping("/scene") +class SceneController(val sceneService: SceneService) { + @PostMapping("/find") + fun searchScene( + @RequestBody areaVo: AreaVo, + @RequestParam("page", required = false) page: Int?, + @RequestParam("per_page", required = false) perPage: Int? + ) = resPack { sceneService.searchScene(areaVo, page, perPage) } + + @ApiOperation(value = "鏍规嵁鍦嗗績鍜屽崐寰勬壘鍒拌寖鍥村唴鐨勫満鏅�") + @PostMapping("/find/radius") + fun searchByCoordinate( + @RequestParam("lng") lng: Double, + @RequestParam("lat") lat: Double, + @RequestParam("radius") radius: Double, + ) = resPack { sceneService.searchByCoordinate(lng, lat, radius) } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/model/epw/EPWDataPrep.kt b/src/main/kotlin/com/flightfeather/uav/model/epw/EPWDataPrep.kt index 2af8a49..c17296d 100644 --- a/src/main/kotlin/com/flightfeather/uav/model/epw/EPWDataPrep.kt +++ b/src/main/kotlin/com/flightfeather/uav/model/epw/EPWDataPrep.kt @@ -1,37 +1,52 @@ package com.flightfeather.uav.model.epw import com.flightfeather.uav.common.utils.DateUtil -import com.flightfeather.uav.common.utils.GsonUtils -import com.flightfeather.uav.lightshare.bean.CompanySOP import com.flightfeather.uav.lightshare.bean.DataVo import com.flightfeather.uav.model.BaseDataPrep import com.flightfeather.uav.model.BaseSOP import com.flightfeather.uav.socket.bean.AirData import com.flightfeather.uav.socket.bean.AirDataPackage import com.flightfeather.uav.socket.eunm.FactorType +import com.flightfeather.uav.socket.eunm.UWDeviceType import kotlin.math.max import kotlin.math.min import kotlin.math.round import kotlin.math.sqrt -class EPWDataPrep : BaseDataPrep<DataVo, BaseSOP>() { +/** + * 鏁版嵁骞虫粦棰勫鐞� + * 瀵逛簬鏈�鏂扮殑涓�缁勬暟鎹紝鏍规嵁鍏朵箣鍓嶈繛缁殑鑻ュ共鏁版嵁锛岃繘琛屾暟鎹钩婊戝鐞� + * @Date 2024.5.16 + */ +class EPWDataPrep(val deviceType: UWDeviceType? = UWDeviceType.GRID) : BaseDataPrep<DataVo, BaseSOP>() { // 鍚戝墠妫�绱㈢殑鏁版嵁璁板綍鏁� private val ncal = 15 + // 鏍囧噯宸�嶆暟鍙傛暟 private val nstd = 3 + // 鍧囧�煎�嶆暟鍙傛暟 private val xratio = 3 + + // 杩炵画鏁版嵁鐨勫悎鐞嗘渶澶у闀垮�嶇巼 + private val multiplier = 20 + // 闇�瑕佸鐞嗙殑鍥犲瓙绫诲瀷 - private val calTypes = -// emptyList<String>() - WeightType.prep + private var calTypes = when (deviceType) { + UWDeviceType.VEHICLE, + UWDeviceType.UAV, + UWDeviceType.BOAT, + -> WeightType.prepUnderWay + UWDeviceType.GRID -> WeightType.prepFixed + else -> WeightType.prepFixed + } private val lastData = mutableListOf<DataVo>() override fun mDataPrep(mDataList: List<DataVo>): List<DataVo> { mDataList.forEach { - it.values?.forEach v@{a -> + it.values?.forEach v@{ a -> if (!calTypes.contains(a.factorName)) return@v val range = FactorType.getRange(a.factorName) ?: return@v @@ -41,11 +56,6 @@ } } } - -// val newDataList = mutableListOf<DataVo>() -// mDataList.forEach { -// newDataList.add(it.copy()) -// } var i = ncal if (lastData.isNotEmpty()) { @@ -61,7 +71,7 @@ if (it.factorData!! > vMax) { val lastDataIndex = i - val thisIndex = if (i-ncal<0) 0 else i - ncal + val thisIndex = if (i - ncal < 0) 0 else i - ncal val list = mutableListOf<DataVo>() if (lastDataIndex < lastData.size) { list.addAll(lastData.subList(lastDataIndex, lastData.lastIndex + 1)) @@ -104,11 +114,18 @@ return sopList } + + /** + * 瀹炴椂鏁版嵁骞虫粦澶勭悊 + */ fun mDataPrep2(dataPackage: AirDataPackage): List<DataVo> { val vo = dataPackage.toDataVo() return mDataPrep2(listOf(vo)) } + /** + * 瀹炴椂鏁版嵁骞虫粦澶勭悊 + */ fun mDataPrep2(mDataList: List<DataVo>): List<DataVo> { var i = ncal if (lastData.isNotEmpty()) { @@ -117,14 +134,12 @@ while (i < mDataList.size) { for (y in mDataList[i].values?.indices ?: 0..0) { val it = mDataList[i].values?.get(y) ?: continue - - if (!calTypes.contains(it.factorName)) continue val vMax = FactorType.getVMax(it.factorName) ?: continue -// it.factorData ?: continue + it.factorData ?: continue if (it.factorData!! > vMax) { val lastDataIndex = i - val thisIndex = if (i-ncal<0) 0 else i - ncal + val thisIndex = if (i - ncal < 0) 0 else i - ncal val list = mutableListOf<DataVo>() if (lastDataIndex < lastData.size) { list.addAll(lastData.subList(lastDataIndex, lastData.lastIndex + 1)) @@ -140,14 +155,22 @@ // 鍚堢悊鏈�灏忓�� val min = min(avg.first - std * nstd, avg.first / (1 + xratio)) - // 鏁版嵁涓嶅浜庡悎鐞嗚寖鍥村苟涓旀湁鏁堜釜鏁拌揪鏍囨椂锛岄噰鐢ㄨ绠楁墍寰楀潎鍊间唬鏇垮師濮嬪�� - if (avg.second > max(ncal / 5, 2) - && (it.factorData!! < min || it.factorData!! > max) - ) { - // 鍘熷鏁版嵁 -// it.factorData = null - it.factorData = avg.first + // 鍒ゆ柇鐩戞祴鍥犲瓙鏄惁闇�瑕佽繘琛屽钩婊戝鐞嗭紝 + // 鑻ヤ笉闇�瑕侊紝鍒欏垽鏂噺绾ф槸鍚﹀湪鍚堢悊鑼冨洿鍐呬互鍙婂彉鍖栧�嶇巼鏄惁鍦ㄥ悎鐞嗚寖鍥村唴 + if (!calTypes.contains(it.factorName)) { + if (isInRange(it) != true || excessiveChange(it) == true) { + // 閲囩敤璁$畻鎵�寰楀潎鍊间唬鏇垮師濮嬪�� + it.factorData = avg.first + } + } else { + // 鏁版嵁涓嶅浜庡悎鐞嗚寖鍥村苟涓旀湁鏁堜釜鏁拌揪鏍囨椂锛岄噰鐢ㄨ绠楁墍寰楀潎鍊间唬鏇垮師濮嬪�� + if (avg.second > max(ncal / 5, 2) + && (it.factorData!! < min || it.factorData!! > max) + ) { + it.factorData = avg.first + } } + } } } @@ -183,7 +206,7 @@ * @param list 鐩戞祴鏁版嵁 * @return 鍧囧�煎拰鏈夋晥鏁版嵁涓暟 */ - private fun average(list: List<DataVo>, factorName:String?): Pair<Double, Int>? { + private fun average(list: List<DataVo>, factorName: String?): Pair<Double, Int>? { var t = 0.0 var c = 0 list.forEach { @@ -192,7 +215,7 @@ if (f?.factorName == factorName) { val range = FactorType.getRange(f?.factorName) ?: continue //鍒ゆ柇鏁版嵁鏄惁鍦ㄥ悎鐞嗚寖鍥村唴 - if (f?.factorData ?: 0.0 in range.first..range.second) { + if ((f?.factorData ?: 0.0) in range.first..range.second) { t += f?.factorData!! c++ } @@ -240,4 +263,32 @@ sqrt(t / (c - 1)) } } + + /** + * 鍒ゆ柇鏁版嵁鏄惁鍦ㄦ甯搁噺绋嬪唴 + */ + private fun isInRange(airData: AirData): Boolean? { + val range = FactorType.getRange(airData.factorName) ?: return null + //鍒ゆ柇鏁版嵁鏄惁鍦ㄥ悎鐞嗚寖鍥村唴 + return (airData.factorData ?: 0.0) in range.first..range.second + } + + /** + * 鍒ゆ柇杩炵画鐨勬暟鎹噺绾т笂鍗囧箙搴︽槸鍚﹁繃澶� + */ + private fun excessiveChange(airData: AirData): Boolean? { + airData.factorData ?: return null + if (lastData.isEmpty()) return false + val latestData = lastData.last() + // 缁撴灉鍊嶇巼 + var m = 1.0 + for (i in latestData.values?.indices ?: 0..0) { + val f = latestData.values?.get(i) + if (f?.factorName == airData.factorName) { + m = airData.factorData!!.div(f?.factorData ?: airData.factorData!!) + break + } + } + return m > multiplier + } } \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/model/epw/WeightType.kt b/src/main/kotlin/com/flightfeather/uav/model/epw/WeightType.kt index 0211d8b..6353389 100644 --- a/src/main/kotlin/com/flightfeather/uav/model/epw/WeightType.kt +++ b/src/main/kotlin/com/flightfeather/uav/model/epw/WeightType.kt @@ -4,7 +4,21 @@ object WeightType { - val prep = listOf( + // 璧拌埅鐩戞祴 + val prepUnderWay = listOf( + FactorType.NO2.des, + FactorType.CO.des, + FactorType.H2S.des, + FactorType.SO2.des, + FactorType.O3.des, +// FactorType.PM25.des, +// FactorType.PM10.des, + FactorType.VOC.des, + FactorType.WIND_SPEED.des + ) + + // 瀹氱偣鐩戞祴 + val prepFixed = listOf( FactorType.NO2.des, FactorType.CO.des, FactorType.H2S.des, diff --git a/src/main/kotlin/com/flightfeather/uav/repository/impl/AirDataRepositoryImpl.kt b/src/main/kotlin/com/flightfeather/uav/repository/impl/AirDataRepositoryImpl.kt index fe05963..0826636 100644 --- a/src/main/kotlin/com/flightfeather/uav/repository/impl/AirDataRepositoryImpl.kt +++ b/src/main/kotlin/com/flightfeather/uav/repository/impl/AirDataRepositoryImpl.kt @@ -136,7 +136,7 @@ val d = RealTimeDataVehicle() dataTransform(vo, d) /***************************************************************************************************/ - // FIXME: 2021/10/27 杞﹁浇鐩戞祴閮ㄥ垎鍥犲瓙閲忕骇璋冩暣锛歂O2*0.6锛孒2S*0.3, SO2*0.2, O3*0.5锛屽叾浠栬绱犱笉鍙� + // FIXME: 2021/10/27 杞﹁浇鐩戞祴閮ㄥ垎鍥犲瓙閲忕骇璋冩暣 calibration(d, UWDeviceType.VEHICLE) /***************************************************************************************************/ realTimeDataVehicleMapper.insert(d) diff --git a/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataUnitDecoder.kt b/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataUnitDecoder.kt index 6b848c4..2961874 100644 --- a/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataUnitDecoder.kt +++ b/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataUnitDecoder.kt @@ -5,7 +5,6 @@ import com.flightfeather.uav.socket.eunm.FactorType import org.slf4j.LoggerFactory import java.text.SimpleDateFormat -import java.util.* /** * uav 绗簩灞傛暟鎹崟鍏冭В鐮佸櫒 @@ -24,7 +23,7 @@ fun getAirConfirmData(b: List<String>, deviceCode: String?): List<AirTypeData> { val resultList = mutableListOf<AirTypeData>() b.forEach { - FactorType.getByIndex(it.toInt(16))?.let { f-> + FactorType.getByValue(it.toInt(16))?.let { f-> resultList.add(AirTypeData(f)) } } diff --git a/src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt b/src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt index 81c0d6f..0c934b4 100644 --- a/src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt +++ b/src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt @@ -1,5 +1,7 @@ package com.flightfeather.uav.socket.eunm +import com.flightfeather.uav.biz.dataanalysis.BaseExceptionAnalysis + /** * @author riku * Date: 2020/6/10 @@ -26,7 +28,23 @@ companion object { + /** + * 閫氳繃绱㈠紩鑾峰彇鏋氫妇绫诲瀷锛岀敤浜庢暟鎹垎鏋� + * @see [BaseExceptionAnalysis] + */ fun getByIndex(index: Int): FactorType? = when (index) { + 0 -> NO2 + 1 -> CO + 2 -> H2S + 3 -> SO2 + 4 -> O3 + 5 -> PM25 + 6 -> PM10 + 7 -> VOC + else -> null + } + + fun getByValue(value: Int): FactorType? = when (value) { NO2.value -> NO2 CO.value -> CO H2S.value -> H2S diff --git a/src/main/kotlin/com/flightfeather/uav/socket/processor/UnderwayProcessor.kt b/src/main/kotlin/com/flightfeather/uav/socket/processor/UnderwayProcessor.kt index ef5d308..48ac7bb 100644 --- a/src/main/kotlin/com/flightfeather/uav/socket/processor/UnderwayProcessor.kt +++ b/src/main/kotlin/com/flightfeather/uav/socket/processor/UnderwayProcessor.kt @@ -69,7 +69,8 @@ instance.airDataRepository.saveAirData(dataPackage) // 杩涜棰勫鐞嗗悗锛屽瓨鍌ㄨ嚦瀵瑰簲鏁版嵁琛� if (!dataProcessMap.containsKey(dataPackage.deviceCode)) { - dataProcessMap[dataPackage.deviceCode] = EPWDataPrep()// 姣忓彴璁惧鏈夊崟鐙殑鏁版嵁棰勫鐞嗗璞� + // 姣忓彴璁惧鏈夊崟鐙殑鏁版嵁棰勫鐞嗗璞� + dataProcessMap[dataPackage.deviceCode] = EPWDataPrep(UWDeviceType.getType(dataPackage.deviceCode)) } dataProcessMap[dataPackage.deviceCode]?.run { val list = this.mDataPrep2(dataPackage)// 鏁版嵁骞虫粦澶勭悊 diff --git a/src/main/resources/application-pro.yml b/src/main/resources/application-pro.yml index 70c9859..5236afe 100644 --- a/src/main/resources/application-pro.yml +++ b/src/main/resources/application-pro.yml @@ -1,15 +1,15 @@ spring: datasource: # 绾夸笂鏈嶅姟鍣� 47 -# url: jdbc:mysql://localhost:3306/dronemonitor?serverTimezone=Asia/Shanghai&prepStmtCacheSize=517&cachePrepStmts=true&autoReconnect=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false -# username: dronemonitor -# password: dronemonitor_hackxrnomxm - - # 绾夸笂鏈嶅姟鍣� 114 url: jdbc:mysql://localhost:3306/dronemonitor?serverTimezone=Asia/Shanghai&prepStmtCacheSize=517&cachePrepStmts=true&autoReconnect=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false username: dronemonitor password: dronemonitor_hackxrnomxm + # 绾夸笂鏈嶅姟鍣� 114 +# url: jdbc:mysql://localhost:3306/dronemonitor?serverTimezone=Asia/Shanghai&prepStmtCacheSize=517&cachePrepStmts=true&autoReconnect=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false +# username: dronemonitor +# password: dronemonitor_hackxrnomxm + springfox: documentation: swagger: diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index f9faddd..243bc45 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -11,11 +11,15 @@ username: remoteU1 password: eSoF8DnzfGTlhAjE +# url: jdbc:mysql://114.215.109.124:3306/dronemonitor?serverTimezone=Asia/Shanghai&prepStmtCacheSize=517&cachePrepStmts=true&autoReconnect=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false +# username: remoteU1 +# password: feiyu2024 + springfox: documentation: swagger: v2: enabled: true -imgPath: D:/02product/10underway/images/ -filePath: D:/02product/10underway/files/ \ No newline at end of file +imgPath: C:/02product/10underway/images/ +filePath: C:/02product/10underway/files/ \ No newline at end of file diff --git a/src/main/resources/generator/generatorConfig.xml b/src/main/resources/generator/generatorConfig.xml index 258b953..ef5ed18 100644 --- a/src/main/resources/generator/generatorConfig.xml +++ b/src/main/resources/generator/generatorConfig.xml @@ -4,7 +4,8 @@ "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <!-- 鏁版嵁搴撻┍鍔�:閫夋嫨浣犵殑鏈湴纭洏涓婇潰鐨勬暟鎹簱椹卞姩鍖�--> - <classPathEntry location="C:\Users\feiyu\.m2\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar"/> +<!-- <classPathEntry location="C:\Users\feiyu\.m2\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar"/>--> + <classPathEntry location="C:\Users\feiyu02\.m2\repository\mysql\mysql-connector-java\8.0.21\mysql-connector-java-8.0.21.jar"/> <!--defaultModelType{ conditional:杩欎釜妯″瀷涓巋ierarchical妯″瀷鐩镐技,闄や簡濡傛灉涓�涓疄浣撶被鍙寘鍚竴涓瓧娈�,鍒欎笉浼氬崟鐙敓鎴愭瀹炰綋绫汇�傚洜姝�,濡傛灉涓�涓〃鐨勪富閿彧鏈変竴涓瓧娈�,閭d箞涓嶄細涓鸿瀛楁鐢熸垚鍗曠嫭鐨勫疄浣撶被,浼氬皢璇ュ瓧娈靛悎骞跺埌鍩烘湰瀹炰綋绫讳腑銆� flat:璇ユā鍨嬩负姣忎竴寮犺〃鍙敓鎴愪竴涓疄浣撶被銆傝繖涓疄浣撶被鍖呭惈琛ㄤ腑鐨勬墍鏈夊瓧娈点�� @@ -24,7 +25,7 @@ <property name="suppressAllComments" value="true"/> </commentGenerator> <!--鏁版嵁搴撻摼鎺RL锛岀敤鎴峰悕銆佸瘑鐮� --> - <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://47.100.191.150:3306/dronemonitor" + <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://47.100.191.150:3306/dronemonitor?serverTimezone=Asia/Shanghai" userId="remoteU1" password="eSoF8DnzfGTlhAjE"> </jdbcConnection> @@ -46,7 +47,7 @@ </javaClientGenerator> <!-- 瑕佺敓鎴愮殑琛� tableName鏄暟鎹簱涓殑琛ㄥ悕鎴栬鍥惧悕 domainObjectName鏄疄浣撶被鍚�--> <!-- <table tableName="air_real_time_data" domainObjectName="RealTimeData" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>--> -<!-- <table tableName="mission" domainObjectName="Mission" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>--> + <table tableName="mission" domainObjectName="Mission" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> <!-- <table tableName="el_minutevalue" domainObjectName="ElectricMinuteValue" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>--> <!-- <table tableName="el_company_device" domainObjectName="CompanyDevice" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>--> <!-- <table tableName="co_complaint" domainObjectName="Complaint" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>--> @@ -57,6 +58,7 @@ <!-- <table tableName="device_info" domainObjectName="DeviceInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>--> <!-- <table tableName="factor_calibration" domainObjectName="FactorCalibration" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>--> <!-- <table tableName="real_time_data_grid_min" domainObjectName="RealTimeDataGridMin" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>--> - <table tableName="real_time_data_grid_opt" domainObjectName="RealTimeDataGridOpt" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> +<!-- <table tableName="real_time_data_grid_opt" domainObjectName="RealTimeDataGridOpt" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>--> +<!-- <table tableName="scene_info" domainObjectName="SceneInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>--> </context> </generatorConfiguration> \ No newline at end of file diff --git a/src/main/resources/mapper/MissionMapper.xml b/src/main/resources/mapper/MissionMapper.xml index f2b8507..eb104a7 100644 --- a/src/main/resources/mapper/MissionMapper.xml +++ b/src/main/resources/mapper/MissionMapper.xml @@ -10,11 +10,12 @@ <result column="device_code" jdbcType="VARCHAR" property="deviceCode" /> <result column="start_time" jdbcType="TIMESTAMP" property="startTime" /> <result column="end_time" jdbcType="TIMESTAMP" property="endTime" /> + <result column="district_name" jdbcType="VARCHAR" property="districtName" /> </resultMap> <sql id="Base_Column_List"> <!-- WARNING - @mbg.generated --> - mission_code, device_type, device_code, start_time, end_time + mission_code, device_type, device_code, start_time, end_time, district_name </sql> </mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/SceneInfoMapper.xml b/src/main/resources/mapper/SceneInfoMapper.xml new file mode 100644 index 0000000..b151b44 --- /dev/null +++ b/src/main/resources/mapper/SceneInfoMapper.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.flightfeather.uav.domain.mapper.SceneInfoMapper"> + <resultMap id="BaseResultMap" type="com.flightfeather.uav.domain.entity.SceneInfo"> + <!-- + WARNING - @mbg.generated + --> + <id column="GUID" jdbcType="VARCHAR" property="guid" /> + <result column="Name" jdbcType="VARCHAR" property="name" /> + <result column="Type_ID" jdbcType="TINYINT" property="typeId" /> + <result column="Type" jdbcType="VARCHAR" property="type" /> + <result column="Subtype_ID" jdbcType="TINYINT" property="subtypeId" /> + <result column="Subtype" jdbcType="VARCHAR" property="subtype" /> + <result column="Location" jdbcType="VARCHAR" property="location" /> + <result column="Longitude" jdbcType="DECIMAL" property="longitude" /> + <result column="Latitude" jdbcType="DECIMAL" property="latitude" /> + <result column="Province_Code" jdbcType="VARCHAR" property="provinceCode" /> + <result column="Province_Name" jdbcType="VARCHAR" property="provinceName" /> + <result column="City_Code" jdbcType="VARCHAR" property="cityCode" /> + <result column="City_Name" jdbcType="VARCHAR" property="cityName" /> + <result column="District_Code" jdbcType="VARCHAR" property="districtCode" /> + <result column="District_Name" jdbcType="VARCHAR" property="districtName" /> + <result column="Town_Code" jdbcType="VARCHAR" property="townCode" /> + <result column="Town_Name" jdbcType="VARCHAR" property="townName" /> + <result column="Contacts_T" jdbcType="VARCHAR" property="contactsT" /> + <result column="Contacts_WX" jdbcType="VARCHAR" property="contactsWx" /> + <result column="Contacts" jdbcType="VARCHAR" property="contacts" /> + <result column="Create_Date" jdbcType="TIMESTAMP" property="createDate" /> + <result column="Update_Date" jdbcType="TIMESTAMP" property="updateDate" /> + <result column="Extension1" jdbcType="VARCHAR" property="extension1" /> + <result column="Extension2" jdbcType="VARCHAR" property="extension2" /> + <result column="Remark" jdbcType="VARCHAR" property="remark" /> + <result column="Area_Code" jdbcType="VARCHAR" property="areaCode" /> + <result column="Area" jdbcType="VARCHAR" property="area" /> + <result column="Management_Company_Id" jdbcType="VARCHAR" property="managementCompanyId" /> + <result column="Management_Company" jdbcType="VARCHAR" property="managementCompany" /> + </resultMap> + <sql id="Base_Column_List"> + <!-- + WARNING - @mbg.generated + --> + GUID, Name, Type_ID, Type, Subtype_ID, Subtype, Location, Longitude, Latitude, Province_Code, + Province_Name, City_Code, City_Name, District_Code, District_Name, Town_Code, Town_Name, + Contacts_T, Contacts_WX, Contacts, Create_Date, Update_Date, Extension1, Extension2, + Remark, Area_Code, Area, Management_Company_Id, Management_Company + </sql> +</mapper> \ No newline at end of file diff --git a/src/main/resources/templates/report-underway.ftl b/src/main/resources/templates/report-underway.ftl new file mode 100644 index 0000000..3b39b2d --- /dev/null +++ b/src/main/resources/templates/report-underway.ftl @@ -0,0 +1,3707 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<?mso-application progid="Word.Document"?> +<pkg:package xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage"> + <pkg:part pkg:name="/_rels/.rels" + pkg:contentType="application/vnd.openxmlformats-package.relationships+xml"> + <pkg:xmlData> + <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> + <Relationship Id="rId4" + Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" + Target="word/document.xml" /> + <Relationship Id="rId2" + Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" + Target="docProps/core.xml" /> + <Relationship Id="rId1" + Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" + Target="docProps/app.xml" /> + <Relationship Id="rId3" + Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties" + Target="docProps/custom.xml" /> + </Relationships> + </pkg:xmlData> + </pkg:part> + <pkg:part pkg:name="/word/_rels/document.xml.rels" + pkg:contentType="application/vnd.openxmlformats-package.relationships+xml"> + <pkg:xmlData> + <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> + <#list exceptions as item> + <Relationship Id="imageId_${item_index}" + Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" + Target="media/image_${item_index}.png" /> + </#list> + <#list summary as item> + <Relationship Id="imageId2_${item_index}" + Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" + Target="media/image2_${item_index}.png" /> + </#list> + <Relationship Id="rId7" + Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable" + Target="fontTable.xml" /> + <Relationship Id="rId6" + Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering" + Target="numbering.xml" /> + <Relationship Id="rId5" + Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml" + Target="../customXml/item1.xml" /> + <Relationship Id="rId4" + Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" + Target="theme/theme1.xml" /> + <Relationship Id="rId3" + Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer" + Target="footer1.xml" /> + <Relationship Id="rId2" + Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings" + Target="settings.xml" /> + <Relationship Id="rId1" + Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" + Target="styles.xml" /> + </Relationships> + </pkg:xmlData> + </pkg:part> + <pkg:part pkg:name="/word/document.xml" + pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"> + <pkg:xmlData> + <w:document + xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:o="urn:schemas-microsoft-com:office:office" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" + xmlns:v="urn:schemas-microsoft-com:vml" + xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" + xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" + xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" + xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" + xmlns:w10="urn:schemas-microsoft-com:office:word" + xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" + xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" + xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" + xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" + xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" + xmlns:wpsCustomData="http://www.wps.cn/officeDocument/2013/wpsCustomData" + mc:Ignorable="w14 w15 wp14"> + <w:body> + <w:p> + <w:pPr> + <w:jc w:val="center" /> + <w:rPr> + <w:b /> + <w:bCs /> + <w:sz w:val="44" /> + <w:szCs w:val="52" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:b /> + <w:bCs /> + <w:sz w:val="44" /> + <w:szCs w:val="52" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${district}${town}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:b /> + <w:bCs /> + <w:sz w:val="44" /> + <w:szCs w:val="52" /> + </w:rPr> + <w:t>璧拌埅鐩戞祴鎯呭喌</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:b /> + <w:bCs /> + <w:sz w:val="44" /> + <w:szCs w:val="52" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>涓�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:b /> + <w:bCs /> + <w:sz w:val="44" /> + <w:szCs w:val="52" /> + </w:rPr> + <w:t>鎶�</w:t> + </w:r> + </w:p> + <w:p> + <w:pPr> + <w:jc w:val="center" /> + <w:rPr> + <w:b /> + <w:bCs /> + <w:sz w:val="28" /> + <w:szCs w:val="36" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:b /> + <w:bCs /> + <w:sz w:val="28" /> + <w:szCs w:val="36" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${year?c}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:b /> + <w:bCs /> + <w:sz w:val="28" /> + <w:szCs w:val="36" /> + </w:rPr> + <w:t>骞�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:b /> + <w:bCs /> + <w:sz w:val="28" /> + <w:szCs w:val="36" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${month?c}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:b /> + <w:bCs /> + <w:sz w:val="28" /> + <w:szCs w:val="36" /> + </w:rPr> + <w:t>鏈�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:b /> + <w:bCs /> + <w:sz w:val="28" /> + <w:szCs w:val="36" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${day?c}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:b /> + <w:bCs /> + <w:sz w:val="28" /> + <w:szCs w:val="36" /> + </w:rPr> + <w:t>鏃�</w:t> + </w:r> + </w:p> + <w:p> + <w:pPr> + <w:pStyle w:val="2" /> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + </w:rPr> + <w:t>涓�銆佸熀鏈儏鍐�</w:t> + </w:r> + </w:p> + <w:p> + <w:pPr> + <w:ind w:firstLine="560" w:firstLineChars="200" /> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>涓婃捣椋炵窘鐜繚绉戞妧鏈夐檺鍏徃鍙�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:highlight w:val="cyan" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>璇峰~鍐欏鎵樻柟</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>濮旀墭锛屼緷鎹墽娉曟�婚槦缂栧埗鐨勩�婅蛋鑸洃娴嬪贰鏌ユ墽娉曞伐浣滄柟妗堛�嬶紙涓嬫枃绠�绉板伐浣滄柟妗堬級锛屼簬</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${year?c}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>骞�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${month}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>鏈�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${day}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>鏃ワ紙</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${start_time}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>-</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${end_time}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>锛夊宸ヤ綔鏂规涓秹鍙婄殑鎵�鏈夎矾绾垮紑灞曚簡杞婚噺绾ц蛋鑸洃娴嬨��</w:t> + </w:r> + </w:p> + <w:p> + <w:pPr> + <w:ind w:firstLine="560" /> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>鏈璧拌埅鐩戞祴锛岄噰鐢ㄤ簡杞﹁浇寮忓ぇ姘斿鍙傛暟鏅鸿兘璧拌埅鐩戞祴绯荤粺锛團F-SMART-T10锛夛紝寮�灞曢珮棰戣蛋鑸洃娴嬶紙姣�4绉掑弽棣堜竴缁勬暟鎹級锛屽疄鏃惰幏鍙朧OCs锛圥ID鍘熺悊浼犳劅鍣級銆丠</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:vertAlign w:val="subscript" /> + </w:rPr> + <w:t>2</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>S銆丳M</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:vertAlign w:val="subscript" /> + </w:rPr> + <w:t>2.5</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>銆丳M</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:vertAlign w:val="subscript" /> + </w:rPr> + <w:t>10</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>銆丆O銆丯O</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:vertAlign w:val="subscript" /> + </w:rPr> + <w:t>2</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>銆丼O</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:vertAlign w:val="subscript" /> + </w:rPr> + <w:t>2</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>銆丱</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:vertAlign w:val="subscript" /> + </w:rPr> + <w:t>3</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>銆侀鍚戙�侀閫熴�佹俯搴︺�佹箍搴︾瓑鐩戞祴鍥犲瓙锛屽湪宸ヤ綔璺嚎鍏宠仈鍖哄煙鑼冨洿鍐呰竟琛岄┒銆佽竟鐩戞祴銆佽竟鍒嗘瀽銆佽竟鍙嶉銆�</w:t> + </w:r> + </w:p> + <w:p> + <w:pPr> + <w:ind w:firstLine="560" /> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>涓烘彁鍗�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>璧拌埅鐩戞祴鏁堟灉锛�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>姣忎竴涓�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>鍘傚尯鍒嗗尯鎴栬矾娈�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>璧拌埅瀹�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>鎴栧彂鐜版暟鎹獊鍙樺紓甯革紙鍚屾鎰熺煡鏄庢樉寮傚懗锛�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>锛�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>鍗虫椂</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>寮�灞�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>澶�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>鏂逛細鍟嗭紝缁煎悎鍘嗗彶鎵ф硶妫�鏌ャ�佷俊璁裤�佽蛋鑸暟鎹拰浼佷笟宸ヨ壓绛変俊鎭鐩稿叧浼佷笟</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>鍏蜂綋鍘傚尯鎴栧鍥磋矾娈�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>姹℃煋杩涜鐮斿垽鍜屾薄鏌撴函婧愶紱</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>甯�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>鐜鎵ф硶</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>鎬婚槦鏈夊叧浜哄憳</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>渚濇嵁浼氬晢缁撴灉</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>锛�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>瀵逛紒涓氬紑灞曟牳鏌ュ拰闂</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>銆�</w:t> + </w:r> + </w:p> + <w:p> + <w:pPr> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + </w:pPr> + <w:bookmarkStart w:id="0" w:name="_GoBack" /> + <w:bookmarkEnd w:id="0" /> + </w:p> + <w:p> + <w:pPr> + <w:jc w:val="both" /> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:szCs w:val="21" /> + </w:rPr> + </w:pPr> + </w:p> + <w:p> + <w:pPr> + <w:jc w:val="center" /> + <w:rPr> + <w:rFonts w:hint="default" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:highlight w:val="cyan" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:highlight w:val="cyan" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>璇锋彃鍏ュ疄鏃惰蛋鑸浘</w:t> + </w:r> + </w:p> + <w:p> + <w:pPr> + <w:jc w:val="center" /> + <w:rPr> + <w:sz w:val="18" /> + <w:szCs w:val="18" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:sz w:val="18" /> + <w:szCs w:val="18" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${month}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:sz w:val="18" /> + <w:szCs w:val="18" /> + </w:rPr> + <w:t>鏈�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:sz w:val="18" /> + <w:szCs w:val="18" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${day}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:sz w:val="18" /> + <w:szCs w:val="18" /> + </w:rPr> + <w:t>鏃ュ疄闄呰蛋鑸洃娴嬭矾绾垮浘</w:t> + </w:r> + </w:p> + <w:p> + <w:pPr> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + </w:pPr> + </w:p> + <w:p> + <w:pPr> + <w:pStyle w:val="2" /> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + </w:rPr> + <w:t>浜屻�佽蛋鑸洃娴嬫暟鎹儏鍐�</w:t> + </w:r> + </w:p> + <w:p> + <w:pPr> + <w:pStyle w:val="3" /> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + </w:rPr> + <w:t>2.1銆佸尯鍩熺洃娴嬫儏鍐�</w:t> + </w:r> + </w:p> + <w:p> + <w:pPr> + <w:ind w:firstLine="560" /> + <w:rPr> + <w:color w:val="auto" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>渚濇嵁宸ヤ綔鏂规锛屾湰娆¤蛋鑸仛鐒�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="32" /> + <w:szCs w:val="32" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${factor_names}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>绛夌洃娴嬪洜瀛愩�傜粺璁℃椂娈靛唴锛�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${year?c}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>骞�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${month}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>鏈�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${day}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>鏃�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${start_time}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>-</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${end_time}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>锛夛紝</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="32" /> + <w:szCs w:val="32" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${factor_names}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>绛夌洃娴嬪洜瀛�</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:highlight w:val="cyan" /> + </w:rPr> + <w:t>鏁翠綋娴撳害涓嶉珮锛屾湭鍙戠幇瓒呮爣鎴栧紓甯搁珮娴撳害鎯呭喌</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>銆�</w:t> + </w:r> + </w:p> + <#list summary as item> + <w:p> + <w:pPr> + <w:ind w:firstLine="560" /> + <w:rPr> + <w:color w:val="auto" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${item.factor}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>鍧囧�间负</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${item.avg}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>渭g/m</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:vertAlign w:val="superscript" /> + </w:rPr> + <w:t>3</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>锛屾祿搴﹁寖鍥翠负</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${item.min}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>-</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>${item.max}</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>渭g/m</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:vertAlign w:val="superscript" /> + </w:rPr> + <w:t>3</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:color w:val="auto" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + </w:rPr> + <w:t>銆�</w:t> + </w:r> + </w:p> + </#list> + <w:p> + <w:pPr> + <w:pStyle w:val="3" /> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:color w:val="auto" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:color w:val="auto" /> + </w:rPr> + <w:t>2.2銆佹祿搴﹀彉鍖栦笌鐜板満鎯呭喌</w:t> + </w:r> + </w:p> + <w:p> + <w:pPr> + <w:keepNext w:val="0" /> + <w:keepLines w:val="0" /> + <w:pageBreakBefore w:val="0" /> + <w:widowControl w:val="0" /> + <w:kinsoku /> + <w:wordWrap /> + <w:overflowPunct /> + <w:topLinePunct w:val="0" /> + <w:autoSpaceDE /> + <w:autoSpaceDN /> + <w:bidi w:val="0" /> + <w:adjustRightInd /> + <w:snapToGrid /> + <w:ind w:firstLine="560" w:firstLineChars="200" /> + <w:textAlignment w:val="auto" /> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>璧拌埅鐩戞祴鏃舵鍐咃紝瀛樺湪閮ㄥ垎璺鍏抽敭鐗瑰緛鍥犲瓙娴撳害绐佸彉鍜屼綋鎰熷紓鍛筹紝缁撳悎瀹炴祴鏁版嵁涓庡彈鐐规函婧愭ā鍨嬪垎鏋愶紝鐩稿叧寮傚懗椋庨櫓濡備笅锛�</w:t> + </w:r> + </w:p> + <#list exceptions as item> + <w:p> + <w:pPr> + <w:keepNext w:val="0" /> + <w:keepLines w:val="0" /> + <w:pageBreakBefore w:val="0" /> + <w:widowControl w:val="0" /> + <w:kinsoku /> + <w:wordWrap /> + <w:overflowPunct /> + <w:topLinePunct w:val="0" /> + <w:autoSpaceDE /> + <w:autoSpaceDN /> + <w:bidi w:val="0" /> + <w:adjustRightInd /> + <w:snapToGrid /> + <w:ind w:firstLine="560" w:firstLineChars="200" /> + <w:textAlignment w:val="auto" /> + <w:rPr> + <w:rFonts w:hint="default" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" + w:cs="Times New Roman" /> + <w:color w:val="000000" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>浠�${item.startTime}鑷�${item.endTime}锛�${item.factorName}鍑虹幇${item.exception}<#if item.relatedSceneName??>锛岀粨鍚堢洃娴嬫暟鎹彉鍖栧拰鍙楃偣鍙嶅悜婧簮锛�<#list item.relatedSceneName as scene>${scene}銆�</#list>绛夊彲鑳藉瓨鍦ㄦ薄鏌撻闄┿��<#else>銆�</#if></w:t> + </w:r> + </w:p> + <w:p> + <w:pPr> + <w:jc w:val="center" /> + <w:rPr> + <w:rFonts w:hint="default" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:highlight w:val="none" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="default" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:highlight w:val="none" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:pict> + <v:shape id="_x0000_i1025_${item_index}" o:spt="75" + alt="f1725d6e3fb17a0e748045906f55ced" type="#_x0000_t75" + style="height:222.8pt;width:414.65pt;" filled="f" + o:preferrelative="t" stroked="f" coordsize="21600,21600"> + <v:path /> + <v:fill on="f" focussize="0,0" /> + <v:stroke on="f" /> + <v:imagedata r:id="imageId_${item_index}" + o:title="f1725d6e3fb17a0e748045906f55ced" /> + <o:lock v:ext="edit" aspectratio="t" /> + <w10:wrap type="none" /> + <w10:anchorlock /> + </v:shape> + </w:pict> + </w:r> + </w:p> + </#list> + <w:p> + <w:pPr> + <w:pStyle w:val="2" /> + <w:numPr> + <w:ilvl w:val="0" /> + <w:numId w:val="1" /> + </w:numPr> + <w:rPr> + <w:color w:val="auto" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:color w:val="auto" /> + </w:rPr> + <w:t>闂涓庡缓璁�</w:t> + </w:r> + </w:p> + <w:p> + <w:pPr> + <w:numPr> + <w:ilvl w:val="0" /> + <w:numId w:val="0" /> + </w:numPr> + <w:rPr> + <w:rFonts w:hint="default" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:lang w:val="en-US" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:highlight w:val="cyan" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>璇锋彃鍏ラ棶棰樹笌寤鸿</w:t> + </w:r> + </w:p> + <w:p> + <w:pPr> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + </w:rPr> + </w:pPr> + </w:p> + <w:p> + <w:pPr> + <w:pStyle w:val="2" /> + </w:pPr> + <w:r> + <w:br w:type="page" /> + </w:r> + <w:r> + <w:t>闄勫綍锛�</w:t> + </w:r> + </w:p> + <w:p> + <w:pPr> + <w:pStyle w:val="3" /> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:t>1</w:t> + </w:r> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + </w:rPr> + <w:t>銆佸垎鍖哄煙銆佸垎鍥犲瓙</w:t> + </w:r> + <w:r> + <w:t>娴撳害鍙樺寲瓒嬪娍鍥�</w:t> + </w:r> + </w:p> + <#list summary as item> + <w:p> + <w:pPr> + <w:numPr> + <w:ilvl w:val="0" /> + <w:numId w:val="2" /> + </w:numPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + <w:b /> + <w:bCs /> + </w:rPr> + <w:t>${item.factor}</w:t> + </w:r> + </w:p> + <w:p> + <w:pPr> + <w:jc w:val="center" /> + <w:rPr> + <w:rFonts w:hint="default" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:highlight w:val="none" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:rFonts w:hint="default" w:ascii="浠垮畫_GB2312" w:hAnsi="浠垮畫" + w:eastAsia="浠垮畫_GB2312" /> + <w:sz w:val="28" /> + <w:szCs w:val="28" /> + <w:highlight w:val="none" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" /> + </w:rPr> + <w:pict> + <v:shape id="_x0000_i1026_${item_index}" o:spt="75" + alt="f1725d6e3fb17a0e748045906f55ced" type="#_x0000_t75" + style="height:222.8pt;width:414.65pt;" filled="f" + o:preferrelative="t" stroked="f" coordsize="21600,21600"> + <v:path /> + <v:fill on="f" focussize="0,0" /> + <v:stroke on="f" /> + <v:imagedata r:id="imageId2_${item_index}" + o:title="f1725d6e3fb17a0e748045906f55ced" /> + <o:lock v:ext="edit" aspectratio="t" /> + <w10:wrap type="none" /> + <w10:anchorlock /> + </v:shape> + </w:pict> + </w:r> + </w:p> + </#list> + <w:sectPr> + <w:footerReference r:id="rId3" w:type="default" /> + <w:pgSz w:w="11906" w:h="16838" /> + <w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" + w:header="851" w:footer="992" + w:gutter="0" /> + <w:pgNumType w:start="1" /> + <w:cols w:space="720" w:num="1" /> + <w:docGrid w:type="lines" w:linePitch="312" w:charSpace="0" /> + </w:sectPr> + </w:body> + </w:document> + </pkg:xmlData> + </pkg:part> + <pkg:part pkg:name="/customXml/_rels/item1.xml.rels" + pkg:contentType="application/vnd.openxmlformats-package.relationships+xml"> + <pkg:xmlData> + <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> + <Relationship Id="rId1" + Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps" + Target="itemProps1.xml" /> + </Relationships> + </pkg:xmlData> + </pkg:part> + <pkg:part pkg:name="/customXml/item1.xml" pkg:contentType="application/xml"> + <pkg:xmlData> + <s:customData xmlns="http://www.wps.cn/officeDocument/2013/wpsCustomData" + xmlns:s="http://www.wps.cn/officeDocument/2013/wpsCustomData"> + <customSectProps> + <customSectPr /> + </customSectProps> + <customShpExts> + <customShpInfo spid="_x0000_s1025" textRotate="1" /> + </customShpExts> + </s:customData> + </pkg:xmlData> + </pkg:part> + <pkg:part pkg:name="/customXml/itemProps1.xml" + pkg:contentType="application/vnd.openxmlformats-officedocument.customXmlProperties+xml"> + <pkg:xmlData> + <ds:datastoreItem ds:itemID="{B1977F7D-205B-4081-913C-38D41E755F92}" + xmlns:ds="http://schemas.openxmlformats.org/officeDocument/2006/customXml"> + <ds:schemaRefs> + <ds:schemaRef ds:uri="http://www.wps.cn/officeDocument/2013/wpsCustomData" /> + </ds:schemaRefs> + </ds:datastoreItem> + </pkg:xmlData> + </pkg:part> + <pkg:part pkg:name="/docProps/app.xml" + pkg:contentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"> + <pkg:xmlData> + <Properties + xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" + xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"> + <Template>Normal.dotm</Template> + <Pages>3</Pages> + <Words>1400</Words> + <Characters>1941</Characters> + <Lines>15</Lines> + <Paragraphs>4</Paragraphs> + <TotalTime>2973</TotalTime> + <ScaleCrop>false</ScaleCrop> + <LinksUpToDate>false</LinksUpToDate> + <CharactersWithSpaces>1941</CharactersWithSpaces> + <Application>WPS Office_12.1.0.16929_F1E327BC-269C-435d-A152-05C5408002CA</Application> + <DocSecurity>0</DocSecurity> + </Properties> + </pkg:xmlData> + </pkg:part> + <pkg:part pkg:name="/docProps/core.xml" + pkg:contentType="application/vnd.openxmlformats-package.core-properties+xml"> + <pkg:xmlData> + <cp:coreProperties + xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:dcterms="http://purl.org/dc/terms/" + xmlns:dcmitype="http://purl.org/dc/dcmitype/" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <dcterms:created xsi:type="dcterms:W3CDTF">2021-11-01T11:12:00Z</dcterms:created> + <dc:creator>fc</dc:creator> + <cp:lastModifiedBy>feiyu02</cp:lastModifiedBy> + <dcterms:modified xsi:type="dcterms:W3CDTF">2024-05-30T07:47:42Z</dcterms:modified> + <cp:revision>4</cp:revision> + </cp:coreProperties> + </pkg:xmlData> + </pkg:part> + <pkg:part pkg:name="/docProps/custom.xml" + pkg:contentType="application/vnd.openxmlformats-officedocument.custom-properties+xml"> + <pkg:xmlData> + <Properties + xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" + xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"> + <property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="2" + name="KSOProductBuildVer"> + <vt:lpwstr>2052-12.1.0.16929</vt:lpwstr> + </property> + <property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="3" name="ICV"> + <vt:lpwstr>032C36D27878457B9A3432CE359BC4E3_13</vt:lpwstr> + </property> + </Properties> + </pkg:xmlData> + </pkg:part> + <pkg:part pkg:name="/word/fontTable.xml" + pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml"> + <pkg:xmlData> + <w:fonts xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" + xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" mc:Ignorable="w14"> + <w:font w:name="Times New Roman"> + <w:panose1 w:val="02020603050405020304" /> + <w:charset w:val="86" /> + <w:family w:val="roman" /> + <w:pitch w:val="default" /> + <w:sig w:usb0="E0002EFF" w:usb1="C000785B" w:usb2="00000009" w:usb3="00000000" + w:csb0="400001FF" + w:csb1="FFFF0000" /> + </w:font> + <w:font w:name="瀹嬩綋"> + <w:panose1 w:val="02010600030101010101" /> + <w:charset w:val="86" /> + <w:family w:val="auto" /> + <w:pitch w:val="default" /> + <w:sig w:usb0="00000203" w:usb1="288F0000" w:usb2="00000006" w:usb3="00000000" + w:csb0="00040001" + w:csb1="00000000" /> + </w:font> + <w:font w:name="Wingdings"> + <w:panose1 w:val="05000000000000000000" /> + <w:charset w:val="02" /> + <w:family w:val="auto" /> + <w:pitch w:val="default" /> + <w:sig w:usb0="00000000" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" + w:csb0="80000000" + w:csb1="00000000" /> + </w:font> + <w:font w:name="Arial"> + <w:panose1 w:val="020B0604020202020204" /> + <w:charset w:val="01" /> + <w:family w:val="swiss" /> + <w:pitch w:val="default" /> + <w:sig w:usb0="E0002EFF" w:usb1="C000785B" w:usb2="00000009" w:usb3="00000000" + w:csb0="400001FF" + w:csb1="FFFF0000" /> + </w:font> + <w:font w:name="榛戜綋"> + <w:panose1 w:val="02010609060101010101" /> + <w:charset w:val="86" /> + <w:family w:val="auto" /> + <w:pitch w:val="default" /> + <w:sig w:usb0="800002BF" w:usb1="38CF7CFA" w:usb2="00000016" w:usb3="00000000" + w:csb0="00040001" + w:csb1="00000000" /> + </w:font> + <w:font w:name="Courier New"> + <w:panose1 w:val="02070309020205020404" /> + <w:charset w:val="01" /> + <w:family w:val="modern" /> + <w:pitch w:val="default" /> + <w:sig w:usb0="E0002EFF" w:usb1="C0007843" w:usb2="00000009" w:usb3="00000000" + w:csb0="400001FF" + w:csb1="FFFF0000" /> + </w:font> + <w:font w:name="Symbol"> + <w:panose1 w:val="05050102010706020507" /> + <w:charset w:val="02" /> + <w:family w:val="roman" /> + <w:pitch w:val="default" /> + <w:sig w:usb0="00000000" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" + w:csb0="80000000" + w:csb1="00000000" /> + </w:font> + <w:font w:name="Calibri"> + <w:panose1 w:val="020F0502020204030204" /> + <w:charset w:val="00" /> + <w:family w:val="swiss" /> + <w:pitch w:val="default" /> + <w:sig w:usb0="E4002EFF" w:usb1="C200247B" w:usb2="00000009" w:usb3="00000000" + w:csb0="200001FF" + w:csb1="00000000" /> + </w:font> + <w:font w:name="Arial"> + <w:panose1 w:val="020B0604020202020204" /> + <w:charset w:val="00" /> + <w:family w:val="swiss" /> + <w:pitch w:val="default" /> + <w:sig w:usb0="E0002EFF" w:usb1="C000785B" w:usb2="00000009" w:usb3="00000000" + w:csb0="400001FF" + w:csb1="FFFF0000" /> + </w:font> + <w:font w:name="浠垮畫_GB2312"> + <w:altName w:val="浠垮畫" /> + <w:panose1 w:val="02010609030101010101" /> + <w:charset w:val="86" /> + <w:family w:val="modern" /> + <w:pitch w:val="default" /> + <w:sig w:usb0="00000001" w:usb1="080E0000" w:usb2="00000010" w:usb3="00000000" + w:csb0="00040000" + w:csb1="00000000" /> + </w:font> + <w:font w:name="浠垮畫"> + <w:panose1 w:val="02010609060101010101" /> + <w:charset w:val="86" /> + <w:family w:val="auto" /> + <w:pitch w:val="default" /> + <w:sig w:usb0="800002BF" w:usb1="38CF7CFA" w:usb2="00000016" w:usb3="00000000" + w:csb0="00040001" + w:csb1="00000000" /> + </w:font> + <w:font w:name="monospace"> + <w:altName w:val="Segoe Print" /> + <w:panose1 w:val="00000000000000000000" /> + <w:charset w:val="00" /> + <w:family w:val="auto" /> + <w:pitch w:val="default" /> + <w:sig w:usb0="00000000" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" + w:csb0="00000000" + w:csb1="00000000" /> + </w:font> + <w:font w:name="Segoe Print"> + <w:panose1 w:val="02000600000000000000" /> + <w:charset w:val="00" /> + <w:family w:val="auto" /> + <w:pitch w:val="default" /> + <w:sig w:usb0="0000028F" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" + w:csb0="2000009F" + w:csb1="47010000" /> + </w:font> + </w:fonts> + </pkg:xmlData> + </pkg:part> + <pkg:part pkg:name="/word/footer1.xml" + pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml"> + <pkg:xmlData> + <w:ftr xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:o="urn:schemas-microsoft-com:office:office" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" + xmlns:v="urn:schemas-microsoft-com:vml" + xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" + xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" + xmlns:w10="urn:schemas-microsoft-com:office:word" + xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" + xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" + xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" + xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" + xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" + xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" + xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" + xmlns:wpsCustomData="http://www.wps.cn/officeDocument/2013/wpsCustomData" + mc:Ignorable="w14 w15 wp14"> + <w:p> + <w:pPr> + <w:pStyle w:val="5" /> + </w:pPr> + <w:r> + <w:pict> + <v:shape id="_x0000_s1025" o:spid="_x0000_s1025" o:spt="202" + type="#_x0000_t202" + style="position:absolute;left:0pt;margin-top:0pt;height:144pt;width:144pt;mso-position-horizontal:center;mso-position-horizontal-relative:margin;mso-wrap-style:none;z-index:251659264;mso-width-relative:page;mso-height-relative:page;" + filled="f" stroked="f" coordsize="21600,21600"> + <v:path /> + <v:fill on="f" focussize="0,0" /> + <v:stroke on="f" /> + <v:imagedata o:title="" /> + <o:lock v:ext="edit" aspectratio="f" /> + <v:textbox inset="0mm,0mm,0mm,0mm" style="mso-fit-shape-to-text:t;"> + <w:txbxContent> + <w:p> + <w:pPr> + <w:pStyle w:val="5" /> + <w:rPr> + <w:sz w:val="21" /> + <w:szCs w:val="32" /> + </w:rPr> + </w:pPr> + <w:r> + <w:rPr> + <w:sz w:val="21" /> + <w:szCs w:val="32" /> + </w:rPr> + <w:fldChar w:fldCharType="begin" /> + </w:r> + <w:r> + <w:rPr> + <w:sz w:val="21" /> + <w:szCs w:val="32" /> + </w:rPr> + <w:instrText xml:space="preserve"> PAGE \* MERGEFORMAT </w:instrText> + </w:r> + <w:r> + <w:rPr> + <w:sz w:val="21" /> + <w:szCs w:val="32" /> + </w:rPr> + <w:fldChar w:fldCharType="separate" /> + </w:r> + <w:r> + <w:rPr> + <w:sz w:val="21" /> + <w:szCs w:val="32" /> + </w:rPr> + <w:t>1</w:t> + </w:r> + <w:r> + <w:rPr> + <w:sz w:val="21" /> + <w:szCs w:val="32" /> + </w:rPr> + <w:fldChar w:fldCharType="end" /> + </w:r> + </w:p> + </w:txbxContent> + </v:textbox> + </v:shape> + </w:pict> + </w:r> + </w:p> + </w:ftr> + </pkg:xmlData> + </pkg:part> + <#list exceptions as item> + <pkg:part pkg:name="/word/media/image_${item_index}.png" pkg:contentType="image/png"> + <pkg:binaryData>${item.pict}</pkg:binaryData> + </pkg:part> + </#list> + <#list summary as item> + <pkg:part pkg:name="/word/media/image2_${item_index}.png" pkg:contentType="image/png"> + <pkg:binaryData>${item.pict}</pkg:binaryData> + </pkg:part> + </#list> + <pkg:part pkg:name="/word/numbering.xml" + pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml"> + <pkg:xmlData> + <w:numbering + xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:o="urn:schemas-microsoft-com:office:office" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" + xmlns:v="urn:schemas-microsoft-com:vml" + xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" + xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" + xmlns:w10="urn:schemas-microsoft-com:office:word" + xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" + xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" + xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" + xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" + xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" + xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" + xmlns:wpsCustomData="http://www.wps.cn/officeDocument/2013/wpsCustomData" + mc:Ignorable="w14 wp14"> + <w:abstractNum w:abstractNumId="0"> + <w:nsid w:val="DC12C764" /> + <w:multiLevelType w:val="singleLevel" /> + <w:tmpl w:val="DC12C764" /> + <w:lvl w:ilvl="0" w:tentative="0"> + <w:start w:val="3" /> + <w:numFmt w:val="chineseCounting" /> + <w:suff w:val="nothing" /> + <w:lvlText w:val="%1銆�" /> + <w:lvlJc w:val="left" /> + <w:rPr> + <w:rFonts w:hint="eastAsia" /> + </w:rPr> + </w:lvl> + </w:abstractNum> + <w:abstractNum w:abstractNumId="1"> + <w:nsid w:val="6CEDC522" /> + <w:multiLevelType w:val="singleLevel" /> + <w:tmpl w:val="6CEDC522" /> + <w:lvl w:ilvl="0" w:tentative="0"> + <w:start w:val="1" /> + <w:numFmt w:val="bullet" /> + <w:lvlText w:val="飦�" /> + <w:lvlJc w:val="left" /> + <w:pPr> + <w:ind w:left="420" w:hanging="420" /> + </w:pPr> + <w:rPr> + <w:rFonts w:hint="default" w:ascii="Wingdings" w:hAnsi="Wingdings" /> + </w:rPr> + </w:lvl> + </w:abstractNum> + <w:num w:numId="1"> + <w:abstractNumId w:val="0" /> + </w:num> + <w:num w:numId="2"> + <w:abstractNumId w:val="1" /> + </w:num> + </w:numbering> + </pkg:xmlData> + </pkg:part> + <pkg:part pkg:name="/word/settings.xml" + pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml"> + <pkg:xmlData> + <w:settings xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:o="urn:schemas-microsoft-com:office:office" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" + xmlns:v="urn:schemas-microsoft-com:vml" + xmlns:w10="urn:schemas-microsoft-com:office:word" + xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" + xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" + xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main" + xmlns:wpsCustomData="http://www.wps.cn/officeDocument/2013/wpsCustomData" + mc:Ignorable="w14"> + <w:zoom w:percent="80" /> + <w:bordersDoNotSurroundHeader w:val="0" /> + <w:bordersDoNotSurroundFooter w:val="0" /> + <w:documentProtection w:enforcement="0" /> + <w:defaultTabStop w:val="420" /> + <w:hyphenationZone w:val="360" /> + <w:drawingGridVerticalSpacing w:val="156" /> + <w:displayHorizontalDrawingGridEvery w:val="1" /> + <w:displayVerticalDrawingGridEvery w:val="1" /> + <w:noPunctuationKerning w:val="1" /> + <w:characterSpacingControl w:val="compressPunctuation" /> + <w:hdrShapeDefaults> + <o:shapelayout v:ext="edit"> + <o:idmap v:ext="edit" data="1" /> + </o:shapelayout> + </w:hdrShapeDefaults> + <w:compat> + <w:spaceForUL /> + <w:balanceSingleByteDoubleByteWidth /> + <w:doNotLeaveBackslashAlone /> + <w:ulTrailSpace /> + <w:doNotExpandShiftReturn /> + <w:adjustLineHeightInTable /> + <w:doNotWrapTextWithPunct /> + <w:doNotUseEastAsianBreakRules /> + <w:useFELayout /> + <w:useNormalStyleForList /> + <w:doNotUseIndentAsNumberingTabStop /> + <w:useAltKinsokuLineBreakRules /> + <w:allowSpaceOfSameStyleInTable /> + <w:doNotSuppressIndentation /> + <w:doNotAutofitConstrainedTables /> + <w:autofitToFirstFixedWidthCell /> + <w:displayHangulFixedWidth /> + <w:splitPgBreakAndParaMark /> + <w:doNotVertAlignCellWithSp /> + <w:doNotBreakConstrainedForcedTable /> + <w:doNotVertAlignInTxbx /> + <w:useAnsiKerningPairs /> + <w:cachedColBalance /> + <w:compatSetting w:name="compatibilityMode" + w:uri="http://schemas.microsoft.com/office/word" + w:val="11" /> + </w:compat> + <w:docVars> + <w:docVar w:name="commondata" + w:val="eyJoZGlkIjoiOTVkOTAyNGJkMTI0YTgzMGU2YjE5M2FiNzYwOWI3ZDYifQ==" /> + </w:docVars> + <w:rsids> + <w:rsidRoot w:val="003807F0" /> + <w:rsid w:val="00207852" /> + <w:rsid w:val="00297BCD" /> + <w:rsid w:val="003807F0" /> + <w:rsid w:val="0055574E" /> + <w:rsid w:val="00560C22" /> + <w:rsid w:val="005E0AA6" /> + <w:rsid w:val="00A4285D" /> + <w:rsid w:val="00AE7861" /> + <w:rsid w:val="00BF541C" /> + <w:rsid w:val="00C90D8C" /> + <w:rsid w:val="00D04D4B" /> + <w:rsid w:val="00D651DB" /> + <w:rsid w:val="00F9544F" /> + <w:rsid w:val="010F6F1F" /> + <w:rsid w:val="016043AA" /> + <w:rsid w:val="018E3414" /> + <w:rsid w:val="01C64B2B" /> + <w:rsid w:val="01DD4F4D" /> + <w:rsid w:val="01EB026A" /> + <w:rsid w:val="026B1259" /> + <w:rsid w:val="02700392" /> + <w:rsid w:val="02794C14" /> + <w:rsid w:val="03056836" /> + <w:rsid w:val="03167991" /> + <w:rsid w:val="03406AC1" /> + <w:rsid w:val="03546191" /> + <w:rsid w:val="039B3FBF" /> + <w:rsid w:val="03B10EED" /> + <w:rsid w:val="03D269F7" /> + <w:rsid w:val="03F65CA8" /> + <w:rsid w:val="040B067C" /> + <w:rsid w:val="044270E9" /> + <w:rsid w:val="0478107D" /> + <w:rsid w:val="05262682" /> + <w:rsid w:val="053B3CE7" /> + <w:rsid w:val="05724D65" /> + <w:rsid w:val="05880374" /> + <w:rsid w:val="05900A12" /> + <w:rsid w:val="05AD7DDA" /> + <w:rsid w:val="05D33169" /> + <w:rsid w:val="05F25A43" /> + <w:rsid w:val="05FE2A05" /> + <w:rsid w:val="060E67DB" /> + <w:rsid w:val="06405ED9" /> + <w:rsid w:val="06414ED8" /> + <w:rsid w:val="06DE641E" /> + <w:rsid w:val="07154005" /> + <w:rsid w:val="07180E81" /> + <w:rsid w:val="07261BF2" /> + <w:rsid w:val="072E255C" /> + <w:rsid w:val="076B02A2" /> + <w:rsid w:val="07A2522F" /> + <w:rsid w:val="0825634E" /> + <w:rsid w:val="08352370" /> + <w:rsid w:val="08387E2F" /> + <w:rsid w:val="084805F7" /> + <w:rsid w:val="088272FC" /> + <w:rsid w:val="090F7660" /> + <w:rsid w:val="093975ED" /> + <w:rsid w:val="09622C8A" /> + <w:rsid w:val="09A33EA1" /> + <w:rsid w:val="0A114D66" /> + <w:rsid w:val="0A2467A6" /> + <w:rsid w:val="0A5B5D03" /> + <w:rsid w:val="0A8F3F52" /> + <w:rsid w:val="0AA95A29" /> + <w:rsid w:val="0AAB2FBB" /> + <w:rsid w:val="0AE40DB7" /> + <w:rsid w:val="0B8D2782" /> + <w:rsid w:val="0BA852CC" /> + <w:rsid w:val="0BC20732" /> + <w:rsid w:val="0CA57DF6" /> + <w:rsid w:val="0CE12711" /> + <w:rsid w:val="0D1424ED" /> + <w:rsid w:val="0D3627FC" /> + <w:rsid w:val="0D477A63" /> + <w:rsid w:val="0D4B1E3C" /> + <w:rsid w:val="0D8F26BE" /> + <w:rsid w:val="0DB341A2" /> + <w:rsid w:val="0DB937C0" /> + <w:rsid w:val="0DC70082" /> + <w:rsid w:val="0DD04666" /> + <w:rsid w:val="0DD412D6" /> + <w:rsid w:val="0DF66E6B" /> + <w:rsid w:val="0E323572" /> + <w:rsid w:val="0E455054" /> + <w:rsid w:val="0E8F3773" /> + <w:rsid w:val="0EBE1F72" /> + <w:rsid w:val="0F23356C" /> + <w:rsid w:val="0F471FF8" /> + <w:rsid w:val="0F4C24C5" /> + <w:rsid w:val="0F8D251B" /> + <w:rsid w:val="0F962F62" /> + <w:rsid w:val="0FA656C8" /> + <w:rsid w:val="0FD01854" /> + <w:rsid w:val="0FFA4F24" /> + <w:rsid w:val="10097E9B" /> + <w:rsid w:val="104028B1" /> + <w:rsid w:val="109034E2" /> + <w:rsid w:val="10BA60CC" /> + <w:rsid w:val="110544B6" /> + <w:rsid w:val="11812847" /> + <w:rsid w:val="11891B78" /> + <w:rsid w:val="11C56C2A" /> + <w:rsid w:val="11C82A88" /> + <w:rsid w:val="11ED1560" /> + <w:rsid w:val="124D591B" /> + <w:rsid w:val="126A5AE1" /> + <w:rsid w:val="12A164C5" /> + <w:rsid w:val="12D832CE" /> + <w:rsid w:val="1311124B" /> + <w:rsid w:val="13405DEA" /> + <w:rsid w:val="13A75B3A" /> + <w:rsid w:val="13B510DC" /> + <w:rsid w:val="13ED75D0" /> + <w:rsid w:val="14780B52" /> + <w:rsid w:val="14D738C8" /> + <w:rsid w:val="14FD6EB5" /> + <w:rsid w:val="152006C0" /> + <w:rsid w:val="153C7ED6" /> + <w:rsid w:val="15516A48" /> + <w:rsid w:val="155A2138" /> + <w:rsid w:val="15953073" /> + <w:rsid w:val="15A33352" /> + <w:rsid w:val="15C94700" /> + <w:rsid w:val="15CB10A6" /> + <w:rsid w:val="15D34A2F" /> + <w:rsid w:val="16085C21" /> + <w:rsid w:val="16894F27" /> + <w:rsid w:val="16E95D76" /> + <w:rsid w:val="17195A99" /> + <w:rsid w:val="17207198" /> + <w:rsid w:val="17683B61" /> + <w:rsid w:val="17866A7F" /> + <w:rsid w:val="1789133C" /> + <w:rsid w:val="179B5CE4" /> + <w:rsid w:val="17BE661D" /> + <w:rsid w:val="17CC249B" /> + <w:rsid w:val="17DE7D3C" /> + <w:rsid w:val="17F92A35" /> + <w:rsid w:val="1817095A" /> + <w:rsid w:val="18402479" /> + <w:rsid w:val="187D53EA" /> + <w:rsid w:val="18D21BDA" /> + <w:rsid w:val="193B7FE6" /> + <w:rsid w:val="19743B4F" /> + <w:rsid w:val="19766A09" /> + <w:rsid w:val="19C23532" /> + <w:rsid w:val="19D071CC" /> + <w:rsid w:val="19D74D61" /> + <w:rsid w:val="1A420699" /> + <w:rsid w:val="1A4C59BC" /> + <w:rsid w:val="1A670100" /> + <w:rsid w:val="1A824F3A" /> + <w:rsid w:val="1A9D6217" /> + <w:rsid w:val="1AB131C9" /> + <w:rsid w:val="1AC06538" /> + <w:rsid w:val="1ADF0AEB" /> + <w:rsid w:val="1AEE0892" /> + <w:rsid w:val="1B0827CC" /> + <w:rsid w:val="1B2104EC" /> + <w:rsid w:val="1B2E6E70" /> + <w:rsid w:val="1B6E476B" /> + <w:rsid w:val="1B755707" /> + <w:rsid w:val="1B7A032F" /> + <w:rsid w:val="1C000A2E" /> + <w:rsid w:val="1C670BAF" /> + <w:rsid w:val="1C6F2679" /> + <w:rsid w:val="1CB61035" /> + <w:rsid w:val="1CC47A8B" /> + <w:rsid w:val="1D144DE4" /> + <w:rsid w:val="1D333844" /> + <w:rsid w:val="1D51471F" /> + <w:rsid w:val="1D682E0F" /> + <w:rsid w:val="1DB05E6E" /> + <w:rsid w:val="1DB85F26" /> + <w:rsid w:val="1DB96EC4" /> + <w:rsid w:val="1DC13FCB" /> + <w:rsid w:val="1DCC1938" /> + <w:rsid w:val="1DD34EF7" /> + <w:rsid w:val="1DDD271F" /> + <w:rsid w:val="1DF93765" /> + <w:rsid w:val="1E2530ED" /> + <w:rsid w:val="1E636E30" /> + <w:rsid w:val="1F0777D3" /> + <w:rsid w:val="1F3A2287" /> + <w:rsid w:val="1F3C12DB" /> + <w:rsid w:val="1F413A8A" /> + <w:rsid w:val="1F503858" /> + <w:rsid w:val="1F6350C4" /> + <w:rsid w:val="1F8C3C44" /> + <w:rsid w:val="1FA94252" /> + <w:rsid w:val="1FC82DFC" /> + <w:rsid w:val="1FD77AD6" /> + <w:rsid w:val="1FF87411" /> + <w:rsid w:val="206D3F96" /> + <w:rsid w:val="20872559" /> + <w:rsid w:val="20937EA1" /> + <w:rsid w:val="2096364E" /> + <w:rsid w:val="20BF2BA6" /> + <w:rsid w:val="210D0FDB" /> + <w:rsid w:val="212443E2" /> + <w:rsid w:val="21270CB8" /> + <w:rsid w:val="21421CE9" /> + <w:rsid w:val="21645479" /> + <w:rsid w:val="217F21D3" /> + <w:rsid w:val="21BB7ADF" /> + <w:rsid w:val="21D7597E" /> + <w:rsid w:val="21D95D87" /> + <w:rsid w:val="21F73D50" /> + <w:rsid w:val="220F17A9" /> + <w:rsid w:val="222114DC" /> + <w:rsid w:val="224376A4" /> + <w:rsid w:val="2279343F" /> + <w:rsid w:val="22836EA6" /> + <w:rsid w:val="22A25180" /> + <w:rsid w:val="22BD7457" /> + <w:rsid w:val="22C04A6B" /> + <w:rsid w:val="22CA7B2E" /> + <w:rsid w:val="22CB258A" /> + <w:rsid w:val="22E36792" /> + <w:rsid w:val="22F74D27" /> + <w:rsid w:val="2316551E" /> + <w:rsid w:val="237C6574" /> + <w:rsid w:val="23CB1039" /> + <w:rsid w:val="24001EBA" /> + <w:rsid w:val="245D449F" /> + <w:rsid w:val="247B510D" /> + <w:rsid w:val="247C7BB2" /> + <w:rsid w:val="248E14C7" /> + <w:rsid w:val="24AA039B" /> + <w:rsid w:val="24C80672" /> + <w:rsid w:val="24D81252" /> + <w:rsid w:val="24E14744" /> + <w:rsid w:val="250A6257" /> + <w:rsid w:val="251660DE" /> + <w:rsid w:val="25255B1C" /> + <w:rsid w:val="255C672A" /> + <w:rsid w:val="25983863" /> + <w:rsid w:val="25B82157" /> + <w:rsid w:val="25BA1A2C" /> + <w:rsid w:val="25D845A8" /> + <w:rsid w:val="26257AC2" /> + <w:rsid w:val="2632115B" /> + <w:rsid w:val="264820B4" /> + <w:rsid w:val="26517B04" /> + <w:rsid w:val="265A4251" /> + <w:rsid w:val="26606A77" /> + <w:rsid w:val="26FE65EF" /> + <w:rsid w:val="272C4F16" /> + <w:rsid w:val="2737140A" /> + <w:rsid w:val="274B4BB7" /> + <w:rsid w:val="27A91EF7" /> + <w:rsid w:val="27BC4F62" /> + <w:rsid w:val="27BE2088" /> + <w:rsid w:val="27C372D0" /> + <w:rsid w:val="27CC1034" /> + <w:rsid w:val="27E407E2" /> + <w:rsid w:val="280875F3" /> + <w:rsid w:val="282D0BDB" /> + <w:rsid w:val="282E04AF" /> + <w:rsid w:val="286A3464" /> + <w:rsid w:val="28C25988" /> + <w:rsid w:val="28C3196F" /> + <w:rsid w:val="28C5248C" /> + <w:rsid w:val="29383A22" /> + <w:rsid w:val="294E2F18" /> + <w:rsid w:val="2976789D" /> + <w:rsid w:val="29F23B6E" /> + <w:rsid w:val="29FD1560" /> + <w:rsid w:val="2A8624E4" /> + <w:rsid w:val="2AB5595B" /> + <w:rsid w:val="2ACA6E50" /> + <w:rsid w:val="2B204122" /> + <w:rsid w:val="2B3C17C4" /> + <w:rsid w:val="2B543810" /> + <w:rsid w:val="2B576AEB" /> + <w:rsid w:val="2B732DA8" /> + <w:rsid w:val="2B7D1FB4" /> + <w:rsid w:val="2BCE271C" /> + <w:rsid w:val="2BFB2D9E" /> + <w:rsid w:val="2C4C35F9" /> + <w:rsid w:val="2C926D4E" /> + <w:rsid w:val="2CEC4F5B" /> + <w:rsid w:val="2CF241A1" /> + <w:rsid w:val="2D5C6913" /> + <w:rsid w:val="2D5D6A14" /> + <w:rsid w:val="2D943089" /> + <w:rsid w:val="2DF4782B" /> + <w:rsid w:val="2DF508B0" /> + <w:rsid w:val="2DF857E7" /> + <w:rsid w:val="2E057F04" /> + <w:rsid w:val="2E2A3D5D" /> + <w:rsid w:val="2E474078" /> + <w:rsid w:val="2E5F7614" /> + <w:rsid w:val="2E682EB4" /> + <w:rsid w:val="2E701821" /> + <w:rsid w:val="2E9A347E" /> + <w:rsid w:val="2EC82922" /> + <w:rsid w:val="2EF323BB" /> + <w:rsid w:val="2F2C5F9C" /> + <w:rsid w:val="2F3D2C6C" /> + <w:rsid w:val="2F762023" /> + <w:rsid w:val="2F9F555C" /> + <w:rsid w:val="2FB90FA6" /> + <w:rsid w:val="2FD55DEE" /> + <w:rsid w:val="3049507F" /> + <w:rsid w:val="30890FE5" /> + <w:rsid w:val="30D00355" /> + <w:rsid w:val="31255262" /> + <w:rsid w:val="31342FDA" /> + <w:rsid w:val="316E7D26" /> + <w:rsid w:val="3193503B" /> + <w:rsid w:val="31C41F3C" /> + <w:rsid w:val="31E00A6C" /> + <w:rsid w:val="31EE2129" /> + <w:rsid w:val="32990C1B" /> + <w:rsid w:val="32D66BFD" /> + <w:rsid w:val="32F81F54" /> + <w:rsid w:val="334F4362" /> + <w:rsid w:val="336B6CED" /> + <w:rsid w:val="33BA709B" /> + <w:rsid w:val="33C536CA" /> + <w:rsid w:val="33F57B58" /> + <w:rsid w:val="341744ED" /> + <w:rsid w:val="343B0A4A" /> + <w:rsid w:val="344C7431" /> + <w:rsid w:val="3454129D" /> + <w:rsid w:val="34732B82" /> + <w:rsid w:val="347B703D" /> + <w:rsid w:val="348957BF" /> + <w:rsid w:val="348D2568" /> + <w:rsid w:val="34A86AD4" /> + <w:rsid w:val="34E064A0" /> + <w:rsid w:val="35410E8D" /> + <w:rsid w:val="35703CFE" /> + <w:rsid w:val="35803450" /> + <w:rsid w:val="359C73A0" /> + <w:rsid w:val="35BE5D5B" /> + <w:rsid w:val="35CD5601" /> + <w:rsid w:val="35E436C1" /> + <w:rsid w:val="365E3BF8" /> + <w:rsid w:val="36A24542" /> + <w:rsid w:val="36A302BA" /> + <w:rsid w:val="36B861C5" /> + <w:rsid w:val="36EA5ACA" /> + <w:rsid w:val="36ED4659" /> + <w:rsid w:val="36FD71BC" /> + <w:rsid w:val="372B2789" /> + <w:rsid w:val="37515F68" /> + <w:rsid w:val="376B5157" /> + <w:rsid w:val="37955E55" /> + <w:rsid w:val="37987E0F" /> + <w:rsid w:val="37E24910" /> + <w:rsid w:val="37E85B06" /> + <w:rsid w:val="38003C16" /> + <w:rsid w:val="380D1E8F" /> + <w:rsid w:val="382161BA" /> + <w:rsid w:val="3835274B" /> + <w:rsid w:val="38493C94" /> + <w:rsid w:val="384A1DF6" /> + <w:rsid w:val="384B0B50" /> + <w:rsid w:val="3869607F" /> + <w:rsid w:val="38CA5ADC" /> + <w:rsid w:val="38F563D8" /> + <w:rsid w:val="391F00CC" /> + <w:rsid w:val="392456E2" /> + <w:rsid w:val="393067BC" /> + <w:rsid w:val="394E0615" /> + <w:rsid w:val="39671A73" /> + <w:rsid w:val="3A0177D1" /> + <w:rsid w:val="3A0A6224" /> + <w:rsid w:val="3A0C7AE5" /> + <w:rsid w:val="3A5D4105" /> + <w:rsid w:val="3A954DC4" /> + <w:rsid w:val="3AE07FD6" /> + <w:rsid w:val="3AE94BDC" /> + <w:rsid w:val="3B0E664A" /> + <w:rsid w:val="3B1078E5" /> + <w:rsid w:val="3B4C3275" /> + <w:rsid w:val="3B4E4C98" /> + <w:rsid w:val="3B640E2C" /> + <w:rsid w:val="3B67321F" /> + <w:rsid w:val="3BDA0543" /> + <w:rsid w:val="3BF85CCC" /> + <w:rsid w:val="3C212ABA" /> + <w:rsid w:val="3C2511C7" /> + <w:rsid w:val="3C645DBE" /> + <w:rsid w:val="3C6E669C" /> + <w:rsid w:val="3C940A5F" /> + <w:rsid w:val="3CA71600" /> + <w:rsid w:val="3CBA6CFD" /> + <w:rsid w:val="3CD4741F" /> + <w:rsid w:val="3D197528" /> + <w:rsid w:val="3D287635" /> + <w:rsid w:val="3D7D291C" /> + <w:rsid w:val="3DCC18F6" /> + <w:rsid w:val="3DD05246" /> + <w:rsid w:val="3DD42EA4" /> + <w:rsid w:val="3DE3676E" /> + <w:rsid w:val="3E021D6A" /> + <w:rsid w:val="3E1E66F6" /> + <w:rsid w:val="3E2122CE" /> + <w:rsid w:val="3E7942D9" /> + <w:rsid w:val="3E7C76BE" /> + <w:rsid w:val="3E8E558C" /> + <w:rsid w:val="3ECC2EBA" /> + <w:rsid w:val="3ECC7D5A" /> + <w:rsid w:val="3EE35677" /> + <w:rsid w:val="3EE64C07" /> + <w:rsid w:val="3EF13292" /> + <w:rsid w:val="3EF71AC8" /> + <w:rsid w:val="3F047C0D" /> + <w:rsid w:val="3F2C251F" /> + <w:rsid w:val="3F434400" /> + <w:rsid w:val="3F4F4C8E" /> + <w:rsid w:val="3F737155" /> + <w:rsid w:val="3F7647BE" /> + <w:rsid w:val="3F827606" /> + <w:rsid w:val="3FE200A5" /> + <w:rsid w:val="3FEE25A6" /> + <w:rsid w:val="40233BF9" /> + <w:rsid w:val="403F5565" /> + <w:rsid w:val="408E5B37" /> + <w:rsid w:val="40B557B9" /> + <w:rsid w:val="40E37C08" /> + <w:rsid w:val="40E867F0" /> + <w:rsid w:val="414716BD" /> + <w:rsid w:val="416449B9" /> + <w:rsid w:val="41675B9A" /> + <w:rsid w:val="417D79FC" /> + <w:rsid w:val="41CC2DBB" /> + <w:rsid w:val="41DD1F70" /> + <w:rsid w:val="42017235" /> + <w:rsid w:val="4251506E" /> + <w:rsid w:val="428B0C7F" /> + <w:rsid w:val="42AE2DC7" /> + <w:rsid w:val="42CF3040" /> + <w:rsid w:val="42F300BB" /> + <w:rsid w:val="430640AA" /> + <w:rsid w:val="43445F8E" /> + <w:rsid w:val="435968D0" /> + <w:rsid w:val="435E76C1" /> + <w:rsid w:val="4383394D" /> + <w:rsid w:val="43D0379E" /> + <w:rsid w:val="43D67F21" /> + <w:rsid w:val="43DD4E0B" /> + <w:rsid w:val="440B0AF0" /> + <w:rsid w:val="442073EE" /> + <w:rsid w:val="44902DCF" /> + <w:rsid w:val="44AF74C3" /> + <w:rsid w:val="44E27D3F" /> + <w:rsid w:val="451A6008" /> + <w:rsid w:val="45257195" /> + <w:rsid w:val="45257D39" /> + <w:rsid w:val="45565CEB" /> + <w:rsid w:val="45775504" /> + <w:rsid w:val="459800D3" /> + <w:rsid w:val="45EC57D9" /> + <w:rsid w:val="4623115E" /> + <w:rsid w:val="463A27FC" /> + <w:rsid w:val="46742D17" /> + <w:rsid w:val="46A2058E" /> + <w:rsid w:val="46BF151F" /> + <w:rsid w:val="46C312AA" /> + <w:rsid w:val="47046B53" /> + <w:rsid w:val="470B1C8F" /> + <w:rsid w:val="47173C32" /> + <w:rsid w:val="47370D7B" /> + <w:rsid w:val="47552714" /> + <w:rsid w:val="47A238A3" /> + <w:rsid w:val="47B9793D" /> + <w:rsid w:val="47E30E5E" /> + <w:rsid w:val="481B4B7E" /> + <w:rsid w:val="48734F2C" /> + <w:rsid w:val="48831CF9" /> + <w:rsid w:val="48B838B2" /> + <w:rsid w:val="48E96000" /> + <w:rsid w:val="491B7D35" /> + <w:rsid w:val="493078BA" /> + <w:rsid w:val="493E3092" /> + <w:rsid w:val="4961028C" /> + <w:rsid w:val="496C4820" /> + <w:rsid w:val="49816239" /> + <w:rsid w:val="499B42CB" /> + <w:rsid w:val="49A96FCD" /> + <w:rsid w:val="49DC7913" /> + <w:rsid w:val="49FA41E4" /> + <w:rsid w:val="49FD42A7" /> + <w:rsid w:val="4A0D4969" /> + <w:rsid w:val="4A5753A3" /> + <w:rsid w:val="4A6C0C97" /> + <w:rsid w:val="4A873D23" /> + <w:rsid w:val="4AA42D60" /> + <w:rsid w:val="4AB83EDC" /> + <w:rsid w:val="4ABA3F2C" /> + <w:rsid w:val="4B166E55" /> + <w:rsid w:val="4BBE7D14" /> + <w:rsid w:val="4C2555A1" /> + <w:rsid w:val="4C2E6A14" /> + <w:rsid w:val="4CD46FC7" /> + <w:rsid w:val="4D36241F" /> + <w:rsid w:val="4D385058" /> + <w:rsid w:val="4D6C1754" /> + <w:rsid w:val="4DEF40B9" /> + <w:rsid w:val="4DF62E6E" /> + <w:rsid w:val="4E6D76D3" /> + <w:rsid w:val="4EA529C9" /> + <w:rsid w:val="4EB15812" /> + <w:rsid w:val="4EC512BE" /> + <w:rsid w:val="4EF63225" /> + <w:rsid w:val="4EFB535F" /> + <w:rsid w:val="4F3A035A" /> + <w:rsid w:val="4FE47521" /> + <w:rsid w:val="4FE811D8" /> + <w:rsid w:val="4FF431D6" /> + <w:rsid w:val="4FF519A6" /> + <w:rsid w:val="50106568" /> + <w:rsid w:val="502D59B1" /> + <w:rsid w:val="506B379F" /> + <w:rsid w:val="507B7E86" /> + <w:rsid w:val="507C775A" /> + <w:rsid w:val="50A36C59" /> + <w:rsid w:val="50A637AF" /> + <w:rsid w:val="50D94BAC" /> + <w:rsid w:val="513D2982" /> + <w:rsid w:val="515752EB" /> + <w:rsid w:val="516923D4" /> + <w:rsid w:val="51B01DB1" /> + <w:rsid w:val="51BB79AE" /> + <w:rsid w:val="51E5240F" /> + <w:rsid w:val="51EB2E9F" /> + <w:rsid w:val="521E31BF" /> + <w:rsid w:val="522D1654" /> + <w:rsid w:val="52354569" /> + <w:rsid w:val="524E3666" /> + <w:rsid w:val="52A445CA" /> + <w:rsid w:val="53175AAC" /> + <w:rsid w:val="531C2FC4" /> + <w:rsid w:val="531F4900" /> + <w:rsid w:val="53264210" /> + <w:rsid w:val="536C61AC" /> + <w:rsid w:val="53937294" /> + <w:rsid w:val="54047020" /> + <w:rsid w:val="5436649B" /> + <w:rsid w:val="548D1042" /> + <w:rsid w:val="548E5CAE" /> + <w:rsid w:val="54B73456" /> + <w:rsid w:val="54E029AD" /> + <w:rsid w:val="54E51D72" /> + <w:rsid w:val="55252BA1" /> + <w:rsid w:val="55693E56" /> + <w:rsid w:val="558D118A" /> + <w:rsid w:val="559600E3" /> + <w:rsid w:val="55985036" /> + <w:rsid w:val="559D7345" /> + <w:rsid w:val="55ED0398" /> + <w:rsid w:val="5623674D" /> + <w:rsid w:val="562D166A" /> + <w:rsid w:val="56627AC7" /> + <w:rsid w:val="5664316A" /> + <w:rsid w:val="569E3BE5" /> + <w:rsid w:val="56E34BBD" /> + <w:rsid w:val="57342B3C" /> + <w:rsid w:val="575B78AF" /> + <w:rsid w:val="5782328C" /> + <w:rsid w:val="578B2A7B" /> + <w:rsid w:val="579066F6" /> + <w:rsid w:val="57A35B46" /> + <w:rsid w:val="57B141AA" /> + <w:rsid w:val="57E722A5" /> + <w:rsid w:val="580F1695" /> + <w:rsid w:val="58474AF1" /> + <w:rsid w:val="584C2108" /> + <w:rsid w:val="584C7737" /> + <w:rsid w:val="584E52C2" /> + <w:rsid w:val="587D2CF4" /> + <w:rsid w:val="58DA1745" /> + <w:rsid w:val="58F76517" /> + <w:rsid w:val="59403221" /> + <w:rsid w:val="59592D2E" /> + <w:rsid w:val="598E06B0" /> + <w:rsid w:val="59AD4E28" /> + <w:rsid w:val="59C02DAD" /> + <w:rsid w:val="59C77D28" /> + <w:rsid w:val="59CD2F44" /> + <w:rsid w:val="59EC3AF0" /> + <w:rsid w:val="5AA42BFB" /> + <w:rsid w:val="5AA464DA" /> + <w:rsid w:val="5AEC372E" /> + <w:rsid w:val="5AFF48D1" /> + <w:rsid w:val="5B1E7D8B" /> + <w:rsid w:val="5B354698" /> + <w:rsid w:val="5B8A3673" /> + <w:rsid w:val="5B9A366D" /> + <w:rsid w:val="5BA50E83" /> + <w:rsid w:val="5BAF58B1" /> + <w:rsid w:val="5BB71F72" /> + <w:rsid w:val="5BB86483" /> + <w:rsid w:val="5BCA7F13" /> + <w:rsid w:val="5BFB631F" /> + <w:rsid w:val="5CCE758F" /> + <w:rsid w:val="5CD03307" /> + <w:rsid w:val="5CD54DC2" /> + <w:rsid w:val="5CEF272C" /> + <w:rsid w:val="5D1D4073" /> + <w:rsid w:val="5D340BCE" /> + <w:rsid w:val="5D7402FB" /> + <w:rsid w:val="5D7A3273" /> + <w:rsid w:val="5D907C2B" /> + <w:rsid w:val="5DA55649" /> + <w:rsid w:val="5DA74A46" /> + <w:rsid w:val="5DAF64F7" /> + <w:rsid w:val="5DF572F4" /> + <w:rsid w:val="5E367E53" /> + <w:rsid w:val="5E3777CF" /> + <w:rsid w:val="5E627C8F" /> + <w:rsid w:val="5E941B9A" /> + <w:rsid w:val="5EA56B60" /> + <w:rsid w:val="5EB45E72" /> + <w:rsid w:val="5EE42033" /> + <w:rsid w:val="5F223024" /> + <w:rsid w:val="5F47750D" /> + <w:rsid w:val="5F6C3D73" /> + <w:rsid w:val="5F6D12E1" /> + <w:rsid w:val="60171194" /> + <w:rsid w:val="60235D74" /> + <w:rsid w:val="60326087" /> + <w:rsid w:val="604358C9" /> + <w:rsid w:val="604A33D1" /> + <w:rsid w:val="60A5680F" /> + <w:rsid w:val="60DD2497" /> + <w:rsid w:val="60DD4245" /> + <w:rsid w:val="60EB4BB4" /> + <w:rsid w:val="610C6A33" /> + <w:rsid w:val="61454C88" /> + <w:rsid w:val="61467A90" /> + <w:rsid w:val="61734281" /> + <w:rsid w:val="61766D25" /> + <w:rsid w:val="6186668A" /> + <w:rsid w:val="618D7A19" /> + <w:rsid w:val="61923281" /> + <w:rsid w:val="62297850" /> + <w:rsid w:val="62370347" /> + <w:rsid w:val="6243457B" /> + <w:rsid w:val="626A5FAC" /> + <w:rsid w:val="627227E9" /> + <w:rsid w:val="627925A6" /> + <w:rsid w:val="628D3A49" /> + <w:rsid w:val="62DA0F79" /> + <w:rsid w:val="62FB6C04" /> + <w:rsid w:val="63227845" /> + <w:rsid w:val="632B2584" /> + <w:rsid w:val="632D6A78" /> + <w:rsid w:val="63486434" /> + <w:rsid w:val="63CC4816" /> + <w:rsid w:val="63F21DB5" /> + <w:rsid w:val="64523063" /> + <w:rsid w:val="645C36D2" /> + <w:rsid w:val="65053701" /> + <w:rsid w:val="650D2C1F" /> + <w:rsid w:val="652E3AFA" /> + <w:rsid w:val="652F144F" /> + <w:rsid w:val="659C46CE" /> + <w:rsid w:val="65A76A4D" /> + <w:rsid w:val="65AD6EE9" /> + <w:rsid w:val="6671200E" /> + <w:rsid w:val="668B029F" /> + <w:rsid w:val="66B772E6" /> + <w:rsid w:val="66E62D88" /> + <w:rsid w:val="6735363C" /> + <w:rsid w:val="674F30A2" /> + <w:rsid w:val="67627252" /> + <w:rsid w:val="676B2150" /> + <w:rsid w:val="678B5151" /> + <w:rsid w:val="6799155C" /> + <w:rsid w:val="67A755AC" /> + <w:rsid w:val="67A94E81" /> + <w:rsid w:val="67E172DC" /> + <w:rsid w:val="684D12B7" /> + <w:rsid w:val="6850354E" /> + <w:rsid w:val="68874469" /> + <w:rsid w:val="68E31AA1" /> + <w:rsid w:val="68F83025" /> + <w:rsid w:val="691342F8" /> + <w:rsid w:val="691C4243" /> + <w:rsid w:val="69320EA6" /> + <w:rsid w:val="69401815" /> + <w:rsid w:val="69665317" /> + <w:rsid w:val="699219DD" /> + <w:rsid w:val="699251A4" /> + <w:rsid w:val="69B875FD" /> + <w:rsid w:val="69D02B99" /> + <w:rsid w:val="69DA5A01" /> + <w:rsid w:val="69F04FE9" /> + <w:rsid w:val="69F82E07" /> + <w:rsid w:val="6A8E5946" /> + <w:rsid w:val="6A9972A6" /> + <w:rsid w:val="6ACA4582" /> + <w:rsid w:val="6AE02C8E" /> + <w:rsid w:val="6AE56A57" /> + <w:rsid w:val="6B282DB8" /> + <w:rsid w:val="6B95295E" /> + <w:rsid w:val="6BA34398" /> + <w:rsid w:val="6BFC3D97" /> + <w:rsid w:val="6C1F1BB5" /> + <w:rsid w:val="6C3C6164" /> + <w:rsid w:val="6C4B4145" /> + <w:rsid w:val="6C531E86" /> + <w:rsid w:val="6C62725C" /> + <w:rsid w:val="6C661228" /> + <w:rsid w:val="6C7236B4" /> + <w:rsid w:val="6CB4672B" /> + <w:rsid w:val="6CE95D1F" /> + <w:rsid w:val="6CED43EA" /> + <w:rsid w:val="6CFA2C8D" /> + <w:rsid w:val="6D3E76B6" /> + <w:rsid w:val="6D411B6C" /> + <w:rsid w:val="6DD25E77" /> + <w:rsid w:val="6DF50EC0" /> + <w:rsid w:val="6E184B0E" /> + <w:rsid w:val="6E26539E" /> + <w:rsid w:val="6E3D5C7A" /> + <w:rsid w:val="6E50197D" /> + <w:rsid w:val="6E5471E3" /> + <w:rsid w:val="6EDF72DF" /> + <w:rsid w:val="6EE45119" /> + <w:rsid w:val="6EE94811" /> + <w:rsid w:val="6F04658B" /> + <w:rsid w:val="6F9E0147" /> + <w:rsid w:val="6FDD7DBD" /> + <w:rsid w:val="6FF97269" /> + <w:rsid w:val="703B399A" /> + <w:rsid w:val="70626515" /> + <w:rsid w:val="706C4D62" /> + <w:rsid w:val="70D3106A" /> + <w:rsid w:val="70E076ED" /> + <w:rsid w:val="70EB046F" /> + <w:rsid w:val="70EC2D22" /> + <w:rsid w:val="70F4525D" /> + <w:rsid w:val="71595FF1" /> + <w:rsid w:val="71652334" /> + <w:rsid w:val="71A9146B" /> + <w:rsid w:val="71AC586B" /> + <w:rsid w:val="71D1027A" /> + <w:rsid w:val="71DE5BBF" /> + <w:rsid w:val="71F118FE" /> + <w:rsid w:val="72A6605E" /> + <w:rsid w:val="72F054F2" /> + <w:rsid w:val="738C72D0" /> + <w:rsid w:val="739C1D3D" /> + <w:rsid w:val="73BA4869" /> + <w:rsid w:val="73D56A1E" /> + <w:rsid w:val="742A5227" /> + <w:rsid w:val="74324450" /> + <w:rsid w:val="74525B6F" /> + <w:rsid w:val="745F3497" /> + <w:rsid w:val="747B5DF7" /> + <w:rsid w:val="74E50E5A" /> + <w:rsid w:val="74F57957" /> + <w:rsid w:val="75327336" /> + <w:rsid w:val="754B57C9" /> + <w:rsid w:val="754F30FA" /> + <w:rsid w:val="7581530E" /> + <w:rsid w:val="75DA639F" /> + <w:rsid w:val="75DB5363" /> + <w:rsid w:val="75E3527B" /> + <w:rsid w:val="75EB48B6" /> + <w:rsid w:val="7649225F" /> + <w:rsid w:val="76562603" /> + <w:rsid w:val="7662493F" /> + <w:rsid w:val="7692014A" /> + <w:rsid w:val="76D0562B" /> + <w:rsid w:val="76DB7CF9" /> + <w:rsid w:val="772E0EFE" /> + <w:rsid w:val="77604885" /> + <w:rsid w:val="776B5CAF" /> + <w:rsid w:val="77811976" /> + <w:rsid w:val="77A86F03" /> + <w:rsid w:val="77AC5FE0" /> + <w:rsid w:val="77BE6726" /> + <w:rsid w:val="77C3056D" /> + <w:rsid w:val="77F34D01" /> + <w:rsid w:val="78054355" /> + <w:rsid w:val="780C4DCA" /> + <w:rsid w:val="783B62D7" /> + <w:rsid w:val="78436C2C" /> + <w:rsid w:val="78591FAB" /> + <w:rsid w:val="78673699" /> + <w:rsid w:val="7899684C" /> + <w:rsid w:val="78B52C90" /> + <w:rsid w:val="78CD4747" /> + <w:rsid w:val="78E60900" /> + <w:rsid w:val="78F543CA" /> + <w:rsid w:val="790425E8" /> + <w:rsid w:val="795E5777" /> + <w:rsid w:val="795F064C" /> + <w:rsid w:val="79662826" /> + <w:rsid w:val="79744383" /> + <w:rsid w:val="79C65D18" /> + <w:rsid w:val="79DC2AE5" /> + <w:rsid w:val="79EB1329" /> + <w:rsid w:val="79F45BCB" /> + <w:rsid w:val="7A192E5A" /> + <w:rsid w:val="7A406BD3" /> + <w:rsid w:val="7A8772A3" /> + <w:rsid w:val="7A923A72" /> + <w:rsid w:val="7AAB5AB2" /> + <w:rsid w:val="7B072192" /> + <w:rsid w:val="7B6F1748" /> + <w:rsid w:val="7BB7079E" /> + <w:rsid w:val="7BBD14DB" /> + <w:rsid w:val="7BF81ADB" /> + <w:rsid w:val="7C1A41CA" /> + <w:rsid w:val="7C3F1C7C" /> + <w:rsid w:val="7C5932E1" /> + <w:rsid w:val="7C5C02BC" /> + <w:rsid w:val="7C827D85" /> + <w:rsid w:val="7CD43201" /> + <w:rsid w:val="7D4B5084" /> + <w:rsid w:val="7D646343" /> + <w:rsid w:val="7D647201" /> + <w:rsid w:val="7D993AAB" /> + <w:rsid w:val="7D994D06" /> + <w:rsid w:val="7D9A584A" /> + <w:rsid w:val="7DB9526F" /> + <w:rsid w:val="7DC72227" /> + <w:rsid w:val="7DC732AD" /> + <w:rsid w:val="7E143EB6" /> + <w:rsid w:val="7E38769E" /> + <w:rsid w:val="7EAA4812" /> + <w:rsid w:val="7EC42148" /> + <w:rsid w:val="7ED24865" /> + <w:rsid w:val="7F572FBC" /> + <w:rsid w:val="7F7D1041" /> + <w:rsid w:val="7FC26BB4" /> + <w:rsid w:val="7FDD79F0" /> + <w:rsid w:val="7FED3342" /> + <w:rsid w:val="7FEE3921" /> + </w:rsids> + <m:mathPr> + <m:brkBin m:val="before" /> + <m:brkBinSub m:val="--" /> + <m:smallFrac m:val="0" /> + <m:dispDef /> + <m:lMargin m:val="0" /> + <m:rMargin m:val="0" /> + <m:defJc m:val="centerGroup" /> + <m:wrapIndent m:val="1440" /> + <m:intLim m:val="subSup" /> + <m:naryLim m:val="undOvr" /> + </m:mathPr> + <w:uiCompat97To2003 /> + <w:themeFontLang w:val="en-US" w:eastAsia="zh-CN" /> + <w:clrSchemeMapping w:bg1="light1" w:t1="dark1" w:bg2="light2" w:t2="dark2" + w:accent1="accent1" + w:accent2="accent2" w:accent3="accent3" w:accent4="accent4" w:accent5="accent5" + w:accent6="accent6" w:hyperlink="hyperlink" + w:followedHyperlink="followedHyperlink" /> + <w:doNotIncludeSubdocsInStats /> + </w:settings> + </pkg:xmlData> + </pkg:part> + <pkg:part pkg:name="/word/styles.xml" + pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"> + <pkg:xmlData> + <w:styles xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:o="urn:schemas-microsoft-com:office:office" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" + xmlns:v="urn:schemas-microsoft-com:vml" + xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" + xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" + xmlns:w10="urn:schemas-microsoft-com:office:word" + xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main" + xmlns:wpsCustomData="http://www.wps.cn/officeDocument/2013/wpsCustomData" + mc:Ignorable="w14"> + <w:docDefaults> + <w:rPrDefault> + <w:rPr> + <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" + w:eastAsia="瀹嬩綋" + w:cs="Times New Roman" /> + </w:rPr> + </w:rPrDefault> + <w:pPrDefault /> + </w:docDefaults> + <w:latentStyles w:count="260" w:defQFormat="0" w:defUnhideWhenUsed="1" + w:defSemiHidden="1" + w:defUIPriority="99" w:defLockedState="0"> + <w:lsdException w:qFormat="1" w:unhideWhenUsed="0" w:uiPriority="0" + w:semiHidden="0" + w:name="Normal" /> + <w:lsdException w:qFormat="1" w:unhideWhenUsed="0" w:uiPriority="0" + w:semiHidden="0" + w:name="heading 1" /> + <w:lsdException w:qFormat="1" w:uiPriority="0" w:name="heading 2" /> + <w:lsdException w:qFormat="1" w:unhideWhenUsed="0" w:uiPriority="0" + w:semiHidden="0" + w:name="heading 3" /> + <w:lsdException w:qFormat="1" w:unhideWhenUsed="0" w:uiPriority="0" + w:semiHidden="0" + w:name="heading 4" /> + <w:lsdException w:qFormat="1" w:unhideWhenUsed="0" w:uiPriority="0" + w:semiHidden="0" + w:name="heading 5" /> + <w:lsdException w:qFormat="1" w:uiPriority="0" w:name="heading 6" /> + <w:lsdException w:qFormat="1" w:uiPriority="0" w:name="heading 7" /> + <w:lsdException w:qFormat="1" w:uiPriority="0" w:name="heading 8" /> + <w:lsdException w:qFormat="1" w:uiPriority="0" w:name="heading 9" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="index 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="index 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="index 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="index 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="index 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="index 6" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="index 7" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="index 8" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="index 9" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="toc 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="toc 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="toc 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="toc 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="toc 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="toc 6" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="toc 7" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="toc 8" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="toc 9" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Normal Indent" /> + <w:lsdException w:qFormat="1" w:uiPriority="99" w:semiHidden="0" + w:name="footnote text" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="annotation text" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="header" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="footer" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="index heading" /> + <w:lsdException w:qFormat="1" w:uiPriority="0" w:name="caption" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="table of figures" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="envelope address" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="envelope return" /> + <w:lsdException w:qFormat="1" w:unhideWhenUsed="0" w:uiPriority="99" + w:semiHidden="0" + w:name="footnote reference" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="annotation reference" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="line number" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="page number" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="endnote reference" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="endnote text" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="table of authorities" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="macro" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="toa heading" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List Bullet" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List Number" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List Bullet 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List Bullet 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List Bullet 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List Bullet 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List Number 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List Number 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List Number 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List Number 5" /> + <w:lsdException w:qFormat="1" w:unhideWhenUsed="0" w:uiPriority="0" + w:semiHidden="0" + w:name="Title" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Closing" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Signature" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" + w:name="Default Paragraph Font" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Body Text" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Body Text Indent" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List Continue" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List Continue 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List Continue 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List Continue 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="List Continue 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Message Header" /> + <w:lsdException w:qFormat="1" w:unhideWhenUsed="0" w:uiPriority="0" + w:semiHidden="0" + w:name="Subtitle" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Salutation" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Date" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Body Text First Indent" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Body Text First Indent 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Note Heading" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Body Text 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Body Text 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Body Text Indent 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Body Text Indent 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Block Text" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Hyperlink" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="FollowedHyperlink" /> + <w:lsdException w:qFormat="1" w:unhideWhenUsed="0" w:uiPriority="0" + w:semiHidden="0" + w:name="Strong" /> + <w:lsdException w:qFormat="1" w:unhideWhenUsed="0" w:uiPriority="0" + w:semiHidden="0" + w:name="Emphasis" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Document Map" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Plain Text" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="E-mail Signature" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Normal (Web)" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="HTML Acronym" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="HTML Address" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="HTML Cite" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="HTML Code" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="HTML Definition" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="HTML Keyboard" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="HTML Preformatted" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="HTML Sample" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="HTML Typewriter" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="HTML Variable" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:name="Normal Table" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="annotation subject" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Simple 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Simple 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Simple 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Classic 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Classic 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Classic 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Classic 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Colorful 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Colorful 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Colorful 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Columns 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Columns 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Columns 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Columns 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Columns 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Grid 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Grid 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Grid 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Grid 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Grid 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Grid 6" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Grid 7" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Grid 8" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table List 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table List 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table List 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table List 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table List 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table List 6" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table List 7" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table List 8" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table 3D effects 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table 3D effects 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table 3D effects 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Contemporary" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Elegant" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Professional" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Subtle 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Subtle 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Web 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Web 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Web 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Balloon Text" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Grid" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="0" w:semiHidden="0" + w:name="Table Theme" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="60" w:semiHidden="0" + w:name="Light Shading" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="61" w:semiHidden="0" + w:name="Light List" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="62" w:semiHidden="0" + w:name="Light Grid" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="63" w:semiHidden="0" + w:name="Medium Shading 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="64" w:semiHidden="0" + w:name="Medium Shading 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="65" w:semiHidden="0" + w:name="Medium List 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="66" w:semiHidden="0" + w:name="Medium List 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="67" w:semiHidden="0" + w:name="Medium Grid 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="68" w:semiHidden="0" + w:name="Medium Grid 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="69" w:semiHidden="0" + w:name="Medium Grid 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="70" w:semiHidden="0" + w:name="Dark List" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="71" w:semiHidden="0" + w:name="Colorful Shading" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="72" w:semiHidden="0" + w:name="Colorful List" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="73" w:semiHidden="0" + w:name="Colorful Grid" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="60" w:semiHidden="0" + w:name="Light Shading Accent 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="61" w:semiHidden="0" + w:name="Light List Accent 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="62" w:semiHidden="0" + w:name="Light Grid Accent 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="63" w:semiHidden="0" + w:name="Medium Shading 1 Accent 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="64" w:semiHidden="0" + w:name="Medium Shading 2 Accent 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="65" w:semiHidden="0" + w:name="Medium List 1 Accent 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="66" w:semiHidden="0" + w:name="Medium List 2 Accent 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="67" w:semiHidden="0" + w:name="Medium Grid 1 Accent 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="68" w:semiHidden="0" + w:name="Medium Grid 2 Accent 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="69" w:semiHidden="0" + w:name="Medium Grid 3 Accent 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="70" w:semiHidden="0" + w:name="Dark List Accent 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="71" w:semiHidden="0" + w:name="Colorful Shading Accent 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="72" w:semiHidden="0" + w:name="Colorful List Accent 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="73" w:semiHidden="0" + w:name="Colorful Grid Accent 1" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="60" w:semiHidden="0" + w:name="Light Shading Accent 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="61" w:semiHidden="0" + w:name="Light List Accent 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="62" w:semiHidden="0" + w:name="Light Grid Accent 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="63" w:semiHidden="0" + w:name="Medium Shading 1 Accent 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="64" w:semiHidden="0" + w:name="Medium Shading 2 Accent 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="65" w:semiHidden="0" + w:name="Medium List 1 Accent 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="66" w:semiHidden="0" + w:name="Medium List 2 Accent 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="67" w:semiHidden="0" + w:name="Medium Grid 1 Accent 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="68" w:semiHidden="0" + w:name="Medium Grid 2 Accent 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="69" w:semiHidden="0" + w:name="Medium Grid 3 Accent 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="70" w:semiHidden="0" + w:name="Dark List Accent 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="71" w:semiHidden="0" + w:name="Colorful Shading Accent 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="72" w:semiHidden="0" + w:name="Colorful List Accent 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="73" w:semiHidden="0" + w:name="Colorful Grid Accent 2" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="60" w:semiHidden="0" + w:name="Light Shading Accent 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="61" w:semiHidden="0" + w:name="Light List Accent 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="62" w:semiHidden="0" + w:name="Light Grid Accent 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="63" w:semiHidden="0" + w:name="Medium Shading 1 Accent 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="64" w:semiHidden="0" + w:name="Medium Shading 2 Accent 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="65" w:semiHidden="0" + w:name="Medium List 1 Accent 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="66" w:semiHidden="0" + w:name="Medium List 2 Accent 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="67" w:semiHidden="0" + w:name="Medium Grid 1 Accent 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="68" w:semiHidden="0" + w:name="Medium Grid 2 Accent 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="69" w:semiHidden="0" + w:name="Medium Grid 3 Accent 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="70" w:semiHidden="0" + w:name="Dark List Accent 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="71" w:semiHidden="0" + w:name="Colorful Shading Accent 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="72" w:semiHidden="0" + w:name="Colorful List Accent 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="73" w:semiHidden="0" + w:name="Colorful Grid Accent 3" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="60" w:semiHidden="0" + w:name="Light Shading Accent 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="61" w:semiHidden="0" + w:name="Light List Accent 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="62" w:semiHidden="0" + w:name="Light Grid Accent 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="63" w:semiHidden="0" + w:name="Medium Shading 1 Accent 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="64" w:semiHidden="0" + w:name="Medium Shading 2 Accent 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="65" w:semiHidden="0" + w:name="Medium List 1 Accent 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="66" w:semiHidden="0" + w:name="Medium List 2 Accent 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="67" w:semiHidden="0" + w:name="Medium Grid 1 Accent 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="68" w:semiHidden="0" + w:name="Medium Grid 2 Accent 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="69" w:semiHidden="0" + w:name="Medium Grid 3 Accent 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="70" w:semiHidden="0" + w:name="Dark List Accent 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="71" w:semiHidden="0" + w:name="Colorful Shading Accent 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="72" w:semiHidden="0" + w:name="Colorful List Accent 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="73" w:semiHidden="0" + w:name="Colorful Grid Accent 4" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="60" w:semiHidden="0" + w:name="Light Shading Accent 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="61" w:semiHidden="0" + w:name="Light List Accent 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="62" w:semiHidden="0" + w:name="Light Grid Accent 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="63" w:semiHidden="0" + w:name="Medium Shading 1 Accent 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="64" w:semiHidden="0" + w:name="Medium Shading 2 Accent 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="65" w:semiHidden="0" + w:name="Medium List 1 Accent 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="66" w:semiHidden="0" + w:name="Medium List 2 Accent 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="67" w:semiHidden="0" + w:name="Medium Grid 1 Accent 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="68" w:semiHidden="0" + w:name="Medium Grid 2 Accent 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="69" w:semiHidden="0" + w:name="Medium Grid 3 Accent 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="70" w:semiHidden="0" + w:name="Dark List Accent 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="71" w:semiHidden="0" + w:name="Colorful Shading Accent 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="72" w:semiHidden="0" + w:name="Colorful List Accent 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="73" w:semiHidden="0" + w:name="Colorful Grid Accent 5" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="60" w:semiHidden="0" + w:name="Light Shading Accent 6" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="61" w:semiHidden="0" + w:name="Light List Accent 6" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="62" w:semiHidden="0" + w:name="Light Grid Accent 6" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="63" w:semiHidden="0" + w:name="Medium Shading 1 Accent 6" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="64" w:semiHidden="0" + w:name="Medium Shading 2 Accent 6" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="65" w:semiHidden="0" + w:name="Medium List 1 Accent 6" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="66" w:semiHidden="0" + w:name="Medium List 2 Accent 6" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="67" w:semiHidden="0" + w:name="Medium Grid 1 Accent 6" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="68" w:semiHidden="0" + w:name="Medium Grid 2 Accent 6" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="69" w:semiHidden="0" + w:name="Medium Grid 3 Accent 6" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="70" w:semiHidden="0" + w:name="Dark List Accent 6" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="71" w:semiHidden="0" + w:name="Colorful Shading Accent 6" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="72" w:semiHidden="0" + w:name="Colorful List Accent 6" /> + <w:lsdException w:unhideWhenUsed="0" w:uiPriority="73" w:semiHidden="0" + w:name="Colorful Grid Accent 6" /> + </w:latentStyles> + <w:style w:type="paragraph" w:default="1" w:styleId="1"> + <w:name w:val="Normal" /> + <w:qFormat /> + <w:uiPriority w:val="0" /> + <w:pPr> + <w:widowControl w:val="0" /> + <w:jc w:val="both" /> + </w:pPr> + <w:rPr> + <w:kern w:val="2" /> + <w:sz w:val="21" /> + <w:szCs w:val="24" /> + <w:lang w:val="en-US" w:eastAsia="zh-CN" w:bidi="ar-SA" /> + </w:rPr> + </w:style> + <w:style w:type="paragraph" w:styleId="2"> + <w:name w:val="heading 3" /> + <w:basedOn w:val="1" /> + <w:next w:val="1" /> + <w:qFormat /> + <w:uiPriority w:val="0" /> + <w:pPr> + <w:keepNext /> + <w:keepLines /> + <w:spacing w:before="260" w:beforeLines="0" w:beforeAutospacing="0" + w:after="260" + w:afterLines="0" w:afterAutospacing="0" w:line="413" w:lineRule="auto" /> + <w:outlineLvl w:val="2" /> + </w:pPr> + <w:rPr> + <w:b /> + <w:sz w:val="32" /> + </w:rPr> + </w:style> + <w:style w:type="paragraph" w:styleId="3"> + <w:name w:val="heading 4" /> + <w:basedOn w:val="1" /> + <w:next w:val="1" /> + <w:qFormat /> + <w:uiPriority w:val="0" /> + <w:pPr> + <w:keepNext /> + <w:keepLines /> + <w:spacing w:before="280" w:beforeLines="0" w:beforeAutospacing="0" + w:after="290" + w:afterLines="0" w:afterAutospacing="0" w:line="372" w:lineRule="auto" /> + <w:outlineLvl w:val="3" /> + </w:pPr> + <w:rPr> + <w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:eastAsia="榛戜綋" /> + <w:b /> + <w:sz w:val="28" /> + </w:rPr> + </w:style> + <w:style w:type="paragraph" w:styleId="4"> + <w:name w:val="heading 5" /> + <w:basedOn w:val="1" /> + <w:next w:val="1" /> + <w:qFormat /> + <w:uiPriority w:val="0" /> + <w:pPr> + <w:keepNext /> + <w:keepLines /> + <w:spacing w:before="280" w:beforeLines="0" w:beforeAutospacing="0" + w:after="290" + w:afterLines="0" w:afterAutospacing="0" w:line="372" w:lineRule="auto" /> + <w:outlineLvl w:val="4" /> + </w:pPr> + <w:rPr> + <w:b /> + <w:sz w:val="28" /> + </w:rPr> + </w:style> + <w:style w:type="character" w:default="1" w:styleId="8"> + <w:name w:val="Default Paragraph Font" /> + <w:semiHidden /> + <w:uiPriority w:val="0" /> + </w:style> + <w:style w:type="table" w:default="1" w:styleId="7"> + <w:name w:val="Normal Table" /> + <w:semiHidden /> + <w:uiPriority w:val="0" /> + <w:tblPr> + <w:tblStyle w:val="7" /> + <w:tblCellMar> + <w:top w:w="0" w:type="dxa" /> + <w:left w:w="108" w:type="dxa" /> + <w:bottom w:w="0" w:type="dxa" /> + <w:right w:w="108" w:type="dxa" /> + </w:tblCellMar> + </w:tblPr> + </w:style> + <w:style w:type="paragraph" w:styleId="5"> + <w:name w:val="footer" /> + <w:basedOn w:val="1" /> + <w:uiPriority w:val="0" /> + <w:pPr> + <w:tabs> + <w:tab w:val="center" w:pos="4153" /> + <w:tab w:val="right" w:pos="8306" /> + </w:tabs> + <w:snapToGrid w:val="0" /> + <w:jc w:val="left" /> + </w:pPr> + <w:rPr> + <w:sz w:val="18" /> + </w:rPr> + </w:style> + <w:style w:type="paragraph" w:styleId="6"> + <w:name w:val="header" /> + <w:basedOn w:val="1" /> + <w:uiPriority w:val="0" /> + <w:pPr> + <w:pBdr> + <w:top w:val="none" w:color="auto" w:sz="0" w:space="1" /> + <w:left w:val="none" w:color="auto" w:sz="0" w:space="4" /> + <w:bottom w:val="none" w:color="auto" w:sz="0" w:space="1" /> + <w:right w:val="none" w:color="auto" w:sz="0" w:space="4" /> + </w:pBdr> + <w:tabs> + <w:tab w:val="center" w:pos="4153" /> + <w:tab w:val="right" w:pos="8306" /> + </w:tabs> + <w:snapToGrid w:val="0" /> + <w:spacing w:line="240" w:lineRule="auto" /> + <w:jc w:val="both" /> + <w:outlineLvl w:val="9" /> + </w:pPr> + <w:rPr> + <w:sz w:val="18" /> + </w:rPr> + </w:style> + </w:styles> + </pkg:xmlData> + </pkg:part> + <pkg:part pkg:name="/word/theme/theme1.xml" + pkg:contentType="application/vnd.openxmlformats-officedocument.theme+xml"> + <pkg:xmlData> + <a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office"> + <a:themeElements> + <a:clrScheme name="Office"> + <a:dk1> + <a:sysClr val="windowText" lastClr="000000" /> + </a:dk1> + <a:lt1> + <a:sysClr val="window" lastClr="FFFFFF" /> + </a:lt1> + <a:dk2> + <a:srgbClr val="1F497D" /> + </a:dk2> + <a:lt2> + <a:srgbClr val="EEECE1" /> + </a:lt2> + <a:accent1> + <a:srgbClr val="4F81BD" /> + </a:accent1> + <a:accent2> + <a:srgbClr val="C0504D" /> + </a:accent2> + <a:accent3> + <a:srgbClr val="9BBB59" /> + </a:accent3> + <a:accent4> + <a:srgbClr val="8064A2" /> + </a:accent4> + <a:accent5> + <a:srgbClr val="4BACC6" /> + </a:accent5> + <a:accent6> + <a:srgbClr val="F79646" /> + </a:accent6> + <a:hlink> + <a:srgbClr val="0000FF" /> + </a:hlink> + <a:folHlink> + <a:srgbClr val="800080" /> + </a:folHlink> + </a:clrScheme> + <a:fontScheme name="Office"> + <a:majorFont> + <a:latin typeface="Cambria" /> + <a:ea typeface="" /> + <a:cs typeface="" /> + <a:font script="Jpan" typeface="锛汲 銈淬偡銉冦偗" /> + <a:font script="Hang" typeface="毵戩潃 瓿犽敃" /> + <a:font script="Hans" typeface="瀹嬩綋" /> + <a:font script="Hant" typeface="鏂扮窗鏄庨珨" /> + <a:font script="Arab" typeface="Times New Roman" /> + <a:font script="Hebr" typeface="Times New Roman" /> + <a:font script="Thai" typeface="Angsana New" /> + <a:font script="Ethi" typeface="Nyala" /> + <a:font script="Beng" typeface="Vrinda" /> + <a:font script="Gujr" typeface="Shruti" /> + <a:font script="Khmr" typeface="MoolBoran" /> + <a:font script="Knda" typeface="Tunga" /> + <a:font script="Guru" typeface="Raavi" /> + <a:font script="Cans" typeface="Euphemia" /> + <a:font script="Cher" typeface="Plantagenet Cherokee" /> + <a:font script="Yiii" typeface="Microsoft Yi Baiti" /> + <a:font script="Tibt" typeface="Microsoft Himalaya" /> + <a:font script="Thaa" typeface="MV Boli" /> + <a:font script="Deva" typeface="Mangal" /> + <a:font script="Telu" typeface="Gautami" /> + <a:font script="Taml" typeface="Latha" /> + <a:font script="Syrc" typeface="Estrangelo Edessa" /> + <a:font script="Orya" typeface="Kalinga" /> + <a:font script="Mlym" typeface="Kartika" /> + <a:font script="Laoo" typeface="DokChampa" /> + <a:font script="Sinh" typeface="Iskoola Pota" /> + <a:font script="Mong" typeface="Mongolian Baiti" /> + <a:font script="Viet" typeface="Times New Roman" /> + <a:font script="Uigh" typeface="Microsoft Uighur" /> + <a:font script="Geor" typeface="Sylfaen" /> + </a:majorFont> + <a:minorFont> + <a:latin typeface="Calibri" /> + <a:ea typeface="" /> + <a:cs typeface="" /> + <a:font script="Jpan" typeface="锛汲 鏄庢湞" /> + <a:font script="Hang" typeface="毵戩潃 瓿犽敃" /> + <a:font script="Hans" typeface="瀹嬩綋" /> + <a:font script="Hant" typeface="鏂扮窗鏄庨珨" /> + <a:font script="Arab" typeface="Arial" /> + <a:font script="Hebr" typeface="Arial" /> + <a:font script="Thai" typeface="Cordia New" /> + <a:font script="Ethi" typeface="Nyala" /> + <a:font script="Beng" typeface="Vrinda" /> + <a:font script="Gujr" typeface="Shruti" /> + <a:font script="Khmr" typeface="DaunPenh" /> + <a:font script="Knda" typeface="Tunga" /> + <a:font script="Guru" typeface="Raavi" /> + <a:font script="Cans" typeface="Euphemia" /> + <a:font script="Cher" typeface="Plantagenet Cherokee" /> + <a:font script="Yiii" typeface="Microsoft Yi Baiti" /> + <a:font script="Tibt" typeface="Microsoft Himalaya" /> + <a:font script="Thaa" typeface="MV Boli" /> + <a:font script="Deva" typeface="Mangal" /> + <a:font script="Telu" typeface="Gautami" /> + <a:font script="Taml" typeface="Latha" /> + <a:font script="Syrc" typeface="Estrangelo Edessa" /> + <a:font script="Orya" typeface="Kalinga" /> + <a:font script="Mlym" typeface="Kartika" /> + <a:font script="Laoo" typeface="DokChampa" /> + <a:font script="Sinh" typeface="Iskoola Pota" /> + <a:font script="Mong" typeface="Mongolian Baiti" /> + <a:font script="Viet" typeface="Arial" /> + <a:font script="Uigh" typeface="Microsoft Uighur" /> + <a:font script="Geor" typeface="Sylfaen" /> + </a:minorFont> + </a:fontScheme> + <a:fmtScheme name="Office"> + <a:fillStyleLst> + <a:solidFill> + <a:schemeClr val="phClr" /> + </a:solidFill> + <a:gradFill rotWithShape="1"> + <a:gsLst> + <a:gs pos="0"> + <a:schemeClr val="phClr"> + <a:tint val="50000" /> + <a:satMod val="300000" /> + </a:schemeClr> + </a:gs> + <a:gs pos="35000"> + <a:schemeClr val="phClr"> + <a:tint val="37000" /> + <a:satMod val="300000" /> + </a:schemeClr> + </a:gs> + <a:gs pos="100000"> + <a:schemeClr val="phClr"> + <a:tint val="15000" /> + <a:satMod val="350000" /> + </a:schemeClr> + </a:gs> + </a:gsLst> + <a:lin ang="16200000" scaled="1" /> + </a:gradFill> + <a:gradFill rotWithShape="1"> + <a:gsLst> + <a:gs pos="0"> + <a:schemeClr val="phClr"> + <a:shade val="51000" /> + <a:satMod val="130000" /> + </a:schemeClr> + </a:gs> + <a:gs pos="80000"> + <a:schemeClr val="phClr"> + <a:shade val="93000" /> + <a:satMod val="130000" /> + </a:schemeClr> + </a:gs> + <a:gs pos="100000"> + <a:schemeClr val="phClr"> + <a:shade val="94000" /> + <a:satMod val="135000" /> + </a:schemeClr> + </a:gs> + </a:gsLst> + <a:lin ang="16200000" scaled="0" /> + </a:gradFill> + </a:fillStyleLst> + <a:lnStyleLst> + <a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"> + <a:solidFill> + <a:schemeClr val="phClr"> + <a:shade val="95000" /> + <a:satMod val="105000" /> + </a:schemeClr> + </a:solidFill> + <a:prstDash val="solid" /> + </a:ln> + <a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"> + <a:solidFill> + <a:schemeClr val="phClr" /> + </a:solidFill> + <a:prstDash val="solid" /> + </a:ln> + <a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"> + <a:solidFill> + <a:schemeClr val="phClr" /> + </a:solidFill> + <a:prstDash val="solid" /> + </a:ln> + </a:lnStyleLst> + <a:effectStyleLst> + <a:effectStyle> + <a:effectLst> + <a:outerShdw blurRad="40000" dist="20000" dir="5400000" + rotWithShape="0"> + <a:srgbClr val="000000"> + <a:alpha val="38000" /> + </a:srgbClr> + </a:outerShdw> + </a:effectLst> + </a:effectStyle> + <a:effectStyle> + <a:effectLst> + <a:outerShdw blurRad="40000" dist="23000" dir="5400000" + rotWithShape="0"> + <a:srgbClr val="000000"> + <a:alpha val="35000" /> + </a:srgbClr> + </a:outerShdw> + </a:effectLst> + </a:effectStyle> + <a:effectStyle> + <a:effectLst> + <a:outerShdw blurRad="40000" dist="23000" dir="5400000" + rotWithShape="0"> + <a:srgbClr val="000000"> + <a:alpha val="35000" /> + </a:srgbClr> + </a:outerShdw> + </a:effectLst> + <a:scene3d> + <a:camera prst="orthographicFront"> + <a:rot lat="0" lon="0" rev="0" /> + </a:camera> + <a:lightRig rig="threePt" dir="t"> + <a:rot lat="0" lon="0" rev="1200000" /> + </a:lightRig> + </a:scene3d> + <a:sp3d> + <a:bevelT w="63500" h="25400" /> + </a:sp3d> + </a:effectStyle> + </a:effectStyleLst> + <a:bgFillStyleLst> + <a:solidFill> + <a:schemeClr val="phClr" /> + </a:solidFill> + <a:gradFill rotWithShape="1"> + <a:gsLst> + <a:gs pos="0"> + <a:schemeClr val="phClr"> + <a:tint val="40000" /> + <a:satMod val="350000" /> + </a:schemeClr> + </a:gs> + <a:gs pos="40000"> + <a:schemeClr val="phClr"> + <a:tint val="45000" /> + <a:satMod val="350000" /> + <a:shade val="99000" /> + </a:schemeClr> + </a:gs> + <a:gs pos="100000"> + <a:schemeClr val="phClr"> + <a:shade val="20000" /> + <a:satMod val="255000" /> + </a:schemeClr> + </a:gs> + </a:gsLst> + <a:path path="circle"> + <a:fillToRect l="50000" t="-80000" r="50000" b="180000" /> + </a:path> + </a:gradFill> + <a:gradFill rotWithShape="1"> + <a:gsLst> + <a:gs pos="0"> + <a:schemeClr val="phClr"> + <a:tint val="80000" /> + <a:satMod val="300000" /> + </a:schemeClr> + </a:gs> + <a:gs pos="100000"> + <a:schemeClr val="phClr"> + <a:shade val="30000" /> + <a:satMod val="200000" /> + </a:schemeClr> + </a:gs> + </a:gsLst> + <a:path path="circle"> + <a:fillToRect l="50000" t="50000" r="50000" b="50000" /> + </a:path> + </a:gradFill> + </a:bgFillStyleLst> + </a:fmtScheme> + </a:themeElements> + <a:objectDefaults /> + </a:theme> + </pkg:xmlData> + </pkg:part> +</pkg:package> \ No newline at end of file diff --git a/src/test/kotlin/com/flightfeather/uav/Test.kt b/src/test/kotlin/com/flightfeather/uav/Test.kt index 7cd72a9..64a939e 100644 --- a/src/test/kotlin/com/flightfeather/uav/Test.kt +++ b/src/test/kotlin/com/flightfeather/uav/Test.kt @@ -1,5 +1,6 @@ package com.flightfeather.uav +import com.flightfeather.uav.common.utils.DateUtil import com.flightfeather.uav.common.utils.FileExchange import com.flightfeather.uav.common.utils.FileUtil import com.flightfeather.uav.domain.entity.Company @@ -118,9 +119,16 @@ @Test fun foo16() { - val list = listOf(1, 2, 3, 4, 5, 6) - val iterator = list.iterator().also { it.next() } - iterator.forEach { + val d = "2023-06-13 00:01:50.0\t".trim().split(".")[0] + val t = DateUtil.instance.StringToDate(d, DateUtil.DateStyle.YYYY_MM_DD_HH_MM_SS) + println(d) + println(t) + } + + @Test + fun foo17() { + repeat(8) { + if (it == 5) return@repeat println(it) } } diff --git a/src/test/kotlin/com/flightfeather/uav/dataprocess/DataProcessTest.kt b/src/test/kotlin/com/flightfeather/uav/biz/dataprocess/DataProcessTest.kt similarity index 83% rename from src/test/kotlin/com/flightfeather/uav/dataprocess/DataProcessTest.kt rename to src/test/kotlin/com/flightfeather/uav/biz/dataprocess/DataProcessTest.kt index 2fd77b6..43b578f 100644 --- a/src/test/kotlin/com/flightfeather/uav/dataprocess/DataProcessTest.kt +++ b/src/test/kotlin/com/flightfeather/uav/biz/dataprocess/DataProcessTest.kt @@ -1,20 +1,12 @@ -package com.flightfeather.uav.dataprocess +package com.flightfeather.uav.biz.dataprocess -import com.flightfeather.uav.common.utils.DateUtil -import com.flightfeather.uav.common.utils.ExcelUtil -import com.flightfeather.uav.domain.entity.RealTimeData import com.flightfeather.uav.domain.mapper.RealTimeDataMapper import com.flightfeather.uav.lightshare.service.RealTimeDataService -import com.github.pagehelper.PageHelper -import org.apache.poi.xssf.streaming.SXSSFWorkbook -import org.junit.Assert.* import org.junit.Test import org.junit.runner.RunWith import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.test.context.junit4.SpringRunner -import tk.mybatis.mapper.entity.Example -import java.text.SimpleDateFormat import java.time.LocalDateTime import java.time.format.DateTimeFormatter import java.util.* diff --git a/src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/MissionServiceImplTest.kt b/src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/MissionServiceImplTest.kt new file mode 100644 index 0000000..a5b4ef3 --- /dev/null +++ b/src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/MissionServiceImplTest.kt @@ -0,0 +1,28 @@ +package com.flightfeather.uav.lightshare.service.impl + +import com.flightfeather.uav.biz.report.MissionReport +import com.flightfeather.uav.lightshare.service.MissionService +import org.junit.Test + +import org.junit.Assert.* +import org.junit.runner.RunWith +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.test.context.junit4.SpringRunner +import javax.servlet.http.HttpServletResponse + +@RunWith(SpringRunner::class) +@SpringBootTest +class MissionServiceImplTest { + + @Autowired + lateinit var missionService: MissionService + + @Autowired + lateinit var missionReport: MissionReport + + @Test + fun getReport() { + missionReport.execute("SH-CN-20240514") + } +} \ No newline at end of file diff --git a/src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImplTest.kt b/src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImplTest.kt index d8b7e78..3c28e3b 100644 --- a/src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImplTest.kt +++ b/src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImplTest.kt @@ -1,32 +1,17 @@ package com.flightfeather.uav.lightshare.service.impl -import com.flightfeather.uav.common.utils.DateUtil -import com.flightfeather.uav.common.utils.ExcelUtil -import com.flightfeather.uav.dataprocess.DataProcess -import com.flightfeather.uav.domain.entity.RealTimeData import com.flightfeather.uav.domain.entity.RealTimeDataVehicle import com.flightfeather.uav.domain.mapper.RealTimeDataVehicleMapper import com.flightfeather.uav.lightshare.service.RealTimeDataService -import com.flightfeather.uav.model.epw.EPWDataPrep -import com.flightfeather.uav.repository.AirDataRepository import com.flightfeather.uav.repository.impl.AirDataRepositoryImpl -import com.flightfeather.uav.socket.eunm.UWDeviceType -import com.github.pagehelper.PageHelper -import org.apache.poi.xssf.streaming.SXSSFWorkbook import org.junit.Test -import org.junit.Assert.* import org.junit.runner.RunWith import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.test.context.junit4.SpringRunner -import tk.mybatis.mapper.entity.Example import java.io.File import java.io.FileOutputStream -import java.util.* -import kotlin.math.atan -import kotlin.math.cos -import kotlin.math.sin @RunWith(SpringRunner::class) @SpringBootTest diff --git a/src/test/kotlin/com/flightfeather/uav/model/epw/EPWDataPrepTest.kt b/src/test/kotlin/com/flightfeather/uav/model/epw/EPWDataPrepTest.kt index 69db2a2..4cdb400 100644 --- a/src/test/kotlin/com/flightfeather/uav/model/epw/EPWDataPrepTest.kt +++ b/src/test/kotlin/com/flightfeather/uav/model/epw/EPWDataPrepTest.kt @@ -173,4 +173,9 @@ eTime = eTime.plusDays(1) } } + + @Test + fun foo3() { + + } } \ No newline at end of file -- Gitblit v1.9.3