| | |
| | | |
| | | <properties> |
| | | <java.version>1.8</java.version> |
| | | <kotlin.version>1.2.71</kotlin.version> |
| | | <kotlin.version>1.5.0</kotlin.version> |
| | | <!-- tk.mybatis --> |
| | | <mapper.plugin>tk.mybatis.mapper.generator.MapperPlugin</mapper.plugin> |
| | | <mapper.Mapper>tk.mybatis.mapper.common.Mapper</mapper.Mapper> |
| | |
| | | <dependency> |
| | | <groupId>org.jetbrains.kotlin</groupId> |
| | | <artifactId>kotlin-reflect</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>org.jetbrains.kotlin</groupId> |
| | | <artifactId>kotlin-stdlib-jdk8</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | |
| | | <artifactId>fastjson</artifactId> |
| | | <version>1.2.75</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>org.jetbrains.kotlin</groupId> |
| | | <artifactId>kotlin-stdlib-jdk8</artifactId> |
| | | <version>${kotlin.version}</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>org.jetbrains.kotlin</groupId> |
| | | <artifactId>kotlin-test-junit</artifactId> |
| | | <version>${kotlin.version}</version> |
| | | <scope>test</scope> |
| | | </dependency> |
| | | <!-- https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-maven-plugin --> |
| | | <dependency> |
| | | <groupId>org.jetbrains.kotlin</groupId> |
| | | <artifactId>kotlin-maven-plugin</artifactId> |
| | | <version>${kotlin.version}</version> |
| | | <scope>provided</scope> |
| | | </dependency> |
| | | |
| | | <!-- https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-maven-allopen --> |
| | | <dependency> |
| | | <groupId>org.jetbrains.kotlin</groupId> |
| | | <artifactId>kotlin-maven-allopen</artifactId> |
| | | <version>${kotlin.version}</version> |
| | | </dependency> |
| | | |
| | | </dependencies> |
| | | |
| | | <build> |
| | | <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory> |
| | | <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory> |
| | | <sourceDirectory>src/main/kotlin</sourceDirectory> |
| | | <testSourceDirectory>src/test/kotlin</testSourceDirectory> |
| | | <plugins> |
| | | <!-- <plugin>--> |
| | | <!-- <groupId>org.springframework.boot</groupId>--> |
| | | <!-- <artifactId>spring-boot-maven-plugin</artifactId>--> |
| | | <!-- </plugin>--> |
| | | <!-- <plugin>--> |
| | | <!-- <groupId>org.jetbrains.kotlin</groupId>--> |
| | | <!-- <artifactId>kotlin-maven-plugin</artifactId>--> |
| | | <!-- <configuration>--> |
| | | <!-- <args>--> |
| | | <!-- <arg>-Xjsr305=strict</arg>--> |
| | | <!-- </args>--> |
| | | <!-- <compilerPlugins>--> |
| | | <!-- <plugin>spring</plugin>--> |
| | | <!-- </compilerPlugins>--> |
| | | <!-- </configuration>--> |
| | | <!-- <dependencies>--> |
| | | <!-- <dependency>--> |
| | | <!-- <groupId>org.jetbrains.kotlin</groupId>--> |
| | | <!-- <artifactId>kotlin-maven-allopen</artifactId>--> |
| | | <!-- <version>${kotlin.version}</version>--> |
| | | <!-- </dependency>--> |
| | | <!-- </dependencies>--> |
| | | <!-- </plugin>--> |
| | | <plugin> |
| | | <groupId>org.jetbrains.kotlin</groupId> |
| | | <artifactId>kotlin-maven-plugin</artifactId> |
| | | <configuration> |
| | | <args> |
| | | <arg>-Xjsr305=strict</arg> |
| | | </args> |
| | | <compilerPlugins> |
| | | <plugin>spring</plugin> |
| | | </compilerPlugins> |
| | | </configuration> |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>org.jetbrains.kotlin</groupId> |
| | | <artifactId>kotlin-maven-allopen</artifactId> |
| | | <version>${kotlin.version}</version> |
| | | </dependency> |
| | | </dependencies> |
| | | </plugin> |
| | | <!-- mybatis generator èªå¨çæä»£ç æä»¶ --> |
| | | <plugin> |
| | | <groupId>org.mybatis.generator</groupId> |
| | |
| | | </dependency> |
| | | </dependencies> |
| | | </plugin> |
| | | <!-- <plugin>--> |
| | | <!-- <groupId>org.jetbrains.kotlin</groupId>--> |
| | | <!-- <artifactId>kotlin-maven-plugin</artifactId>--> |
| | | <!-- <version>${kotlin.version}</version>--> |
| | | <!-- <executions>--> |
| | | <!-- <execution>--> |
| | | <!-- <id>compile</id>--> |
| | | <!-- <phase>compile</phase>--> |
| | | <!-- <goals>--> |
| | | <!-- <goal>compile</goal>--> |
| | | <!-- </goals>--> |
| | | <!-- </execution>--> |
| | | <!-- <execution>--> |
| | | <!-- <id>test-compile</id>--> |
| | | <!-- <phase>test-compile</phase>--> |
| | | <!-- <goals>--> |
| | | <!-- <goal>test-compile</goal>--> |
| | | <!-- </goals>--> |
| | | <!-- </execution>--> |
| | | <!-- </executions>--> |
| | | <!-- <configuration>--> |
| | | <!-- <jvmTarget>1.8</jvmTarget>--> |
| | | <!-- </configuration>--> |
| | | <!-- </plugin>--> |
| | | <plugin> |
| | | <groupId>org.apache.maven.plugins</groupId> |
| | | <artifactId>maven-compiler-plugin</artifactId> |
| | | <executions> |
| | | <execution> |
| | | <id>compile</id> |
| | | <phase>compile</phase> |
| | | <goals> |
| | | <goal>compile</goal> |
| | | </goals> |
| | | </execution> |
| | | <execution> |
| | | <id>testCompile</id> |
| | | <phase>test-compile</phase> |
| | | <goals> |
| | | <goal>testCompile</goal> |
| | | </goals> |
| | | </execution> |
| | | </executions> |
| | | </plugin> |
| | | </plugins> |
| | | </build> |
| | | |
| | |
| | | <repository> |
| | | <id>alimaven</id> |
| | | <name>aliyun maven</name> |
| | | <url>http://maven.aliyun.com/nexus/content/groups/public/</url> |
| | | <url>https://maven.aliyun.com/repository/public</url> |
| | | </repository> |
| | | <repository> |
| | | <id>spring-snapshots</id> |
| | |
| | | */ |
| | | object ExcelUtil { |
| | | |
| | | private const val isLog = false |
| | | |
| | | class MyCell( |
| | | var text: String, |
| | | var rowSpan: Int = 1 |
| | | var rowSpan: Int = 1, |
| | | var colSpan: Int = 1, |
| | | var fontColor: Short? = null |
| | | ) |
| | | |
| | | /** |
| | |
| | | rowspan = c.rowSpan |
| | | } |
| | | if (rowspan > 1) { |
| | | println("åå¹¶1-1ï¼$rowIndex;${rowIndex + rowspan - 1};$i") |
| | | log("åå¹¶1-1ï¼$rowIndex;${rowIndex + rowspan - 1};$i") |
| | | sheet.addMergedRegion(CellRangeAddress(rowIndex, rowIndex + rowspan - 1, i, i)) |
| | | } |
| | | if (cell.isEmpty()) { |
| | |
| | | } else { |
| | | //彿°æ®ä¸æ¯æ°ç»æ¶ï¼éè¦ææå¤§è¡æ°åå¹¶åå
æ ¼ |
| | | if (rowspan > 1) { |
| | | println("åå¹¶1-2ï¼$rowIndex;${rowIndex + rowspan - 1};$i") |
| | | log("åå¹¶1-2ï¼$rowIndex;${rowIndex + rowspan - 1};$i") |
| | | sheet.addMergedRegion(CellRangeAddress(rowIndex, rowIndex + rowspan - 1, i, i)) |
| | | } |
| | | cell |
| | |
| | | when (c) { |
| | | is MyCell -> { |
| | | rows.createCell(i).setCellValue(c.text) |
| | | println("write1-1: ${c.text};($rowIndex, ${i})") |
| | | log("write1-1: ${c.text};($rowIndex, ${i})") |
| | | } |
| | | is String -> { |
| | | rows.createCell(i).setCellValue(c) |
| | | println("write1-2: ${c};($rowIndex, ${i})") |
| | | log("write1-2: ${c};($rowIndex, ${i})") |
| | | } |
| | | is Double -> rows.createCell(i).setCellValue(c) |
| | | is Boolean -> rows.createCell(i).setCellValue(c) |
| | |
| | | rows = sheet.getRow(_rowIndex) ?: sheet.createRow(_rowIndex) |
| | | } |
| | | if (rowspan > 1) { |
| | | println("åå¹¶2ï¼${index};${index + rowspan - 1};$i") |
| | | log("åå¹¶2ï¼${index};${index + rowspan - 1};$i") |
| | | sheet.addMergedRegion(CellRangeAddress(index, index + rowspan - 1, i, i)) |
| | | } |
| | | |
| | | when (c) { |
| | | is MyCell -> { |
| | | rows.createCell(map.key).setCellValue(c.text) |
| | | println("write2-1: ${c.text};($_rowIndex, ${map.key})") |
| | | log("write2-1: ${c.text};($_rowIndex, ${map.key})") |
| | | } |
| | | is String -> { |
| | | rows.createCell(map.key).setCellValue(c) |
| | | println("write2-2: ${c};($_rowIndex, ${map.key})") |
| | | log("write2-2: ${c};($_rowIndex, ${map.key})") |
| | | } |
| | | is Double -> rows.createCell(map.key).setCellValue(c) |
| | | is Boolean -> rows.createCell(map.key).setCellValue(c) |
| | | is Date -> rows.createCell(map.key).setCellValue(c) |
| | | is Calendar -> rows.createCell(map.key).setCellValue(c) |
| | | is LocalDate -> rows.createCell(map.key).setCellValue(c) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | rowIndex++ |
| | | } |
| | | // workbook.write(out) |
| | | // workbook.close() |
| | | // out.flush() |
| | | // out.close() |
| | | } |
| | | |
| | | /** |
| | | * èªå¨å¤çè¡åå¹¶æ°æ® |
| | | */ |
| | | fun write(heads: List<Array<String>>, contents: List<Array<Any>>, workbook: HSSFWorkbook, sheetName: String = "sheet1") { |
| | | |
| | | val sheet = workbook.createSheet(sheetName) |
| | | println("sheet: $sheetName") |
| | | |
| | | var rowIndex = 0 |
| | | |
| | | heads.forEach { |
| | | val rows = sheet.createRow(rowIndex) |
| | | for (i in it.indices) { |
| | | rows.createCell(i).setCellValue(it[i]) |
| | | } |
| | | rowIndex++ |
| | | } |
| | | |
| | | contents.forEach { |
| | | val maxRow = getMaxRows(it) |
| | | |
| | | var rows = sheet.getRow(rowIndex) ?: sheet.createRow(rowIndex) |
| | | |
| | | val arrayMap = mutableMapOf<Int, Array<*>>() |
| | | |
| | | //ååºå· |
| | | var col = 0 |
| | | for (i in it.indices) { |
| | | val cell = it[i] |
| | | |
| | | var rowspan = maxRow//åå¹¶çè¡ç跨度 |
| | | var colSpan = 1 |
| | | |
| | | val c = |
| | | if (cell is Array<*>) { |
| | | //彿°æ®ä¸ºæ°ç»æ¶ï¼éè¦æ ¹æ®æå¤§è¡æ°éæ°è®¡ç®è¯¥åå
æ ¼çè¡è·¨åº¦ |
| | | arrayMap[col] = cell |
| | | rowspan = maxRow / if (cell.size == 0) 1 else cell.size |
| | | val c = cell[0] |
| | | if (c is MyCell) { |
| | | rowspan = c.rowSpan |
| | | colSpan = c.colSpan |
| | | } |
| | | if (rowspan > 1 || colSpan > 1) { |
| | | log("åå¹¶1-1ï¼$rowIndex;${rowIndex + rowspan - 1};$col") |
| | | sheet.addMergedRegion(CellRangeAddress(rowIndex, rowIndex + rowspan - 1, col, col + colSpan - 1)) |
| | | } |
| | | if (cell.isEmpty()) { |
| | | "" |
| | | } else { |
| | | cell[0] |
| | | } |
| | | } else { |
| | | //彿°æ®ä¸æ¯æ°ç»æ¶ï¼éè¦ææå¤§è¡æ°åå¹¶åå
æ ¼ |
| | | if (cell is MyCell) { |
| | | rowspan = cell.rowSpan |
| | | colSpan = cell.colSpan |
| | | } |
| | | if (rowspan > 1 || colSpan > 1) { |
| | | log("åå¹¶1-2ï¼$rowIndex;${rowIndex + rowspan - 1};$col") |
| | | sheet.addMergedRegion(CellRangeAddress(rowIndex, rowIndex + rowspan - 1, col, col + colSpan - 1)) |
| | | } |
| | | cell |
| | | } |
| | | when (c) { |
| | | is MyCell -> { |
| | | rows.createCell(col).apply { |
| | | c.fontColor?.let {fC -> |
| | | val font = workbook.createFont() |
| | | val cellStyle = workbook.createCellStyle() |
| | | |
| | | font.color = fC |
| | | cellStyle.setFont(font) |
| | | setCellStyle(cellStyle) |
| | | } |
| | | setCellValue(c.text) |
| | | } |
| | | log("write1-1: ${c.text};($rowIndex, ${col})") |
| | | } |
| | | is String -> { |
| | | rows.createCell(col).setCellValue(c) |
| | | log("write1-2: ${c};($rowIndex, ${col})") |
| | | } |
| | | is Double -> rows.createCell(col).setCellValue(c) |
| | | is Int -> rows.createCell(col).setCellValue(c.toDouble()) |
| | | is Boolean -> rows.createCell(col).setCellValue(c) |
| | | is Date -> rows.createCell(col).setCellValue(c) |
| | | is Calendar -> rows.createCell(col).setCellValue(c) |
| | | is LocalDate -> rows.createCell(col).setCellValue(c) |
| | | } |
| | | |
| | | col += colSpan |
| | | } |
| | | |
| | | for (i in 1 until maxRow) { |
| | | rowIndex++ |
| | | arrayMap.forEach { map -> |
| | | rows = sheet.getRow(rowIndex) ?: sheet.createRow(rowIndex) |
| | | val array = map.value |
| | | if (i < array.size) { |
| | | // var rowspan = maxRow / array.size |
| | | var lastRowSpan = 1 |
| | | var rowspan = 1 |
| | | var colSpan = 1 |
| | | val c = array[i] |
| | | if (c is MyCell) { |
| | | rowspan = c.rowSpan |
| | | colSpan = c.colSpan |
| | | } |
| | | val _c = array[i - 1] |
| | | if (_c is MyCell) { |
| | | lastRowSpan = _c.rowSpan |
| | | } |
| | | var _rowIndex = rowIndex |
| | | var index = rowIndex |
| | | if (lastRowSpan > 1) { |
| | | index = rowIndex + (i * lastRowSpan) - 1 |
| | | _rowIndex = index |
| | | rows = sheet.getRow(_rowIndex) ?: sheet.createRow(_rowIndex) |
| | | } |
| | | if (rowspan > 1 || colSpan > 1) { |
| | | log("åå¹¶2ï¼${index};${index + rowspan - 1};${map.key}") |
| | | sheet.addMergedRegion(CellRangeAddress(index, index + rowspan - 1, map.key, map.key + colSpan - 1)) |
| | | } |
| | | |
| | | when (c) { |
| | | is MyCell -> { |
| | | rows.createCell(map.key).setCellValue(c.text) |
| | | log("write2-1: ${c.text};($_rowIndex, ${map.key})") |
| | | } |
| | | is String -> { |
| | | rows.createCell(map.key).setCellValue(c) |
| | | log("write2-2: ${c};($_rowIndex, ${map.key})") |
| | | } |
| | | is Double -> rows.createCell(map.key).setCellValue(c) |
| | | is Boolean -> rows.createCell(map.key).setCellValue(c) |
| | |
| | | } |
| | | return maxRows |
| | | } |
| | | |
| | | private fun log(log: String) { |
| | | if (isLog) { |
| | | println(log) |
| | | } |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.flightfeather.uav.lightshare.bean |
| | | |
| | | import com.flightfeather.uav.model.BaseSOP |
| | | import java.math.BigDecimal |
| | | import java.util.* |
| | | |
| | | /** |
| | | * å·¥ä¸ä¼ä¸æ±¡ææºä¿¡æ¯ |
| | | */ |
| | | class CompanySOP(sourceId: String, sourceName: String, index:String) : BaseSOP(sourceId, sourceName, index) { |
| | | |
| | | /** |
| | | * 主è¦ä»äºä¸å¡ |
| | | */ |
| | | |
| | | var ciMainBusiness: String? = null |
| | | |
| | | /** |
| | | * æå±éå¢ |
| | | */ |
| | | |
| | | var ciMemberGroup: String? = null |
| | | |
| | | /** |
| | | * ç份ç¼ç |
| | | */ |
| | | |
| | | var ciProvinceCode: String? = null |
| | | |
| | | /** |
| | | * ç份åç§° |
| | | */ |
| | | |
| | | var ciProvinceName: String? = null |
| | | |
| | | /** |
| | | * å°å¸ç¼ç |
| | | */ |
| | | |
| | | var ciCityCode: String? = null |
| | | |
| | | /** |
| | | * å°å¸åç§° |
| | | */ |
| | | |
| | | var ciCityName: String? = null |
| | | |
| | | /** |
| | | * åºå¿ç¼å· |
| | | */ |
| | | |
| | | var ciDistrictCode: String? = null |
| | | |
| | | /** |
| | | * åºå¿åç§° |
| | | */ |
| | | |
| | | var ciDistrictName: String? = null |
| | | |
| | | /** |
| | | * è¡éç¼ç |
| | | */ |
| | | |
| | | var ciTownCode: String? = null |
| | | |
| | | /** |
| | | * è¡éåç§° |
| | | */ |
| | | |
| | | var ciTownName: String? = null |
| | | |
| | | /** |
| | | * æå¨å·¥ä¸åº |
| | | */ |
| | | |
| | | var ciIndDistrict: String? = null |
| | | |
| | | /** |
| | | * åä½å°å |
| | | */ |
| | | |
| | | var ciAddress: String? = null |
| | | |
| | | /** |
| | | * ä¸å¿ç»åº¦ |
| | | */ |
| | | |
| | | var ciLongitude: BigDecimal? = null |
| | | |
| | | /** |
| | | * ä¸å¿çº¬åº¦ |
| | | */ |
| | | |
| | | var ciLatitude: BigDecimal? = null |
| | | |
| | | /** |
| | | * ç»ç»æºæä»£ç |
| | | */ |
| | | |
| | | var ciOrgCode: String? = null |
| | | |
| | | /** |
| | | * æ³äºº |
| | | */ |
| | | |
| | | var ciJuridicalPerson: String? = null |
| | | |
| | | /** |
| | | * è¡ä¸ç±»å« |
| | | */ |
| | | |
| | | var ciIndClassification: String? = null |
| | | |
| | | /** |
| | | * è¡ä¸ä»£ç |
| | | */ |
| | | |
| | | var ciIndustryCode: String? = null |
| | | |
| | | /** |
| | | * ç»è®°æ³¨åç±»å |
| | | */ |
| | | |
| | | var ciRegistrationType: String? = null |
| | | |
| | | /** |
| | | * 注åèµæ¬ï¼ä¸å
ï¼ |
| | | */ |
| | | |
| | | var ciRegisteredCapital: Int? = null |
| | | |
| | | /** |
| | | * 建åå¹´æ |
| | | */ |
| | | |
| | | var ciBuildDate: Date? = null |
| | | |
| | | /** |
| | | * ææ°æ¹æ©å»ºå¹´æ |
| | | */ |
| | | |
| | | var ciExpansionDate: Date? = null |
| | | |
| | | /** |
| | | * èå·¥äººæ° |
| | | */ |
| | | |
| | | var ciWorkersNumber: Int? = null |
| | | |
| | | /** |
| | | * ä¼ä¸è§æ¨¡ |
| | | */ |
| | | |
| | | var ciScale: Byte? = null |
| | | |
| | | /** |
| | | * 忬¡ç¯è¯å®¡æ¹å¹´æ |
| | | */ |
| | | |
| | | var ciEiaApprovarDate: String? = null |
| | | |
| | | /** |
| | | * ææ±¡è®¸å¯è¯ç¼å· |
| | | */ |
| | | |
| | | var ciPltPermitCode: String? = null |
| | | |
| | | /** |
| | | * ææ±¡æäº¤ææä»¶ |
| | | */ |
| | | |
| | | var ciTradingFiles: String? = null |
| | | |
| | | /** |
| | | * 鮿¿ç¼ç |
| | | */ |
| | | |
| | | var ciPostalCode: String? = null |
| | | |
| | | /** |
| | | * è系人å§å |
| | | */ |
| | | |
| | | var ciContactName: String? = null |
| | | |
| | | /** |
| | | * èç³»çµè¯ |
| | | */ |
| | | |
| | | var ciTelephone: String? = null |
| | | |
| | | /** |
| | | * èç³»å¾®ä¿¡å· |
| | | */ |
| | | |
| | | var ciContactsWx: String? = null |
| | | |
| | | /** |
| | | * ä¼ ç |
| | | */ |
| | | |
| | | var ciFax: String? = null |
| | | |
| | | /** |
| | | * çµåé®ç®± |
| | | */ |
| | | |
| | | var ciEmail: String? = null |
| | | |
| | | |
| | | var ciExtension2: String? = null |
| | | |
| | | |
| | | var ciExtension3: String? = null |
| | | |
| | | |
| | | var ciRemark: String? = null |
| | | } |
| | |
| | | package com.flightfeather.uav.lightshare.bean |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonInclude |
| | | import com.flightfeather.uav.model.BaseMData |
| | | import com.flightfeather.uav.socket.bean.AirData |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | |
| | | /** |
| | | * @author riku |
| | |
| | | var lng: Double? = null, |
| | | //纬度 |
| | | var lat: Double? = null |
| | | ) |
| | | ) : BaseMData() { |
| | | override fun getFactorData(type: FactorType): Double? { |
| | | if (values == null) throw IllegalStateException(this.javaClass.name + ": çæµæ°æ®æ°ç»ä¸ºnull") |
| | | for (d in values!!) { |
| | | if (d.factorName == type.name) { |
| | | return d.factorData |
| | | } |
| | | } |
| | | return null |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.flightfeather.uav.model |
| | | |
| | | /** |
| | | * æ°æ®é¢å¤ç模å |
| | | * 对äº[BaseModel]è¿è¡æ¨¡ååææ¶ï¼å¯¹åæ°æ®éè¦è¿è¡å¼å¸¸å¼åé¤åç¼ºå¤±æ°æ®è¡¥å
çé¢å¤çæä½ï¼ |
| | | * 使åå§æ°æ®ç¸å¯¹æ´å æ¥è¿ç宿
åµ |
| | | */ |
| | | abstract class BaseDataPrep<M : BaseMData, S : BaseSOP> { |
| | | |
| | | /** |
| | | * çæµæ°æ®é¢å¤ç |
| | | */ |
| | | abstract fun mDataPrep(mDataList: List<M>): List<M> |
| | | |
| | | /** |
| | | * æ±¡ææºé¢å¤ç |
| | | */ |
| | | abstract fun sopPrep(sopList: List<S>): List<S> |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.flightfeather.uav.model |
| | | |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | |
| | | /** |
| | | * åä¸ªæ±¡ææºå¯¹ææ¡çæµæ°æ®äº§ççå½±åç»æ |
| | | */ |
| | | class BaseEffect( |
| | | // æ±¡ææºæ è¯ |
| | | val sourceId: String, |
| | | val sourceName: String, |
| | | val index: String |
| | | ){ |
| | | // å½±åç»æå¼ |
| | | val value = mutableListOf<Pair<FactorType, Double>>() |
| | | // åç±»æ ç¾ |
| | | val tag = mutableListOf<BaseTag>() |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.flightfeather.uav.model |
| | | |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | |
| | | /** |
| | | * Monitoring data |
| | | * çæµæ°æ® åºç±» |
| | | */ |
| | | abstract class BaseMData { |
| | | abstract fun getFactorData(type: FactorType): Double? |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.flightfeather.uav.model |
| | | |
| | | import com.flightfeather.uav.common.utils.DateUtil |
| | | import com.flightfeather.uav.common.utils.ExcelUtil |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | import org.apache.poi.hssf.usermodel.HSSFEvaluationWorkbook |
| | | import org.apache.poi.hssf.usermodel.HSSFWorkbook |
| | | import java.io.File |
| | | import java.io.FileOutputStream |
| | | import java.util.* |
| | | import kotlin.math.round |
| | | |
| | | /** |
| | | * æ±¡ææºå½±åç¨åº¦æéåææ¨¡å |
| | | * åºç±» |
| | | */ |
| | | abstract class BaseModel<M : BaseMData, S : BaseSOP> { |
| | | |
| | | abstract var dataPrep: BaseDataPrep<M, S> |
| | | |
| | | // æéå åï¼å¨è¿è¡è®¡ç®åææ¶ä½¿ç¨ççæµå å |
| | | abstract var factorTypes: List<FactorType> |
| | | |
| | | // æéå¼ï¼å¤ç§æéè¿è¡ä¹ç§¯è®¡ç® |
| | | abstract var weights: List<BaseWeight<M, S>> |
| | | |
| | | // 计ç®ç»æ |
| | | private val result = mutableSetOf<BaseEffect>() |
| | | |
| | | // ç»æçéæ¹å¼ |
| | | abstract var sections: List<BaseSection<M, S>> |
| | | |
| | | /** |
| | | * æ±¡ææºå½±åç¨åº¦è®¡ç® |
| | | * @param mDataList çæµæ°æ®éå |
| | | * @param sopList æ±¡ææºéå |
| | | */ |
| | | fun execute(mDataList: List<M>, sopList: List<S>) { |
| | | result.clear() |
| | | |
| | | //1. æ°æ®é¢å¤ç |
| | | val mList = dataPrep.mDataPrep(mDataList) |
| | | val sList = dataPrep.sopPrep(sopList) |
| | | |
| | | mList.forEach m@{ m -> |
| | | if (!mDataCheck(m)) return@m |
| | | sList.forEach s@{ s -> |
| | | if (!sopCheck(s)) return@s |
| | | weightCompute(m, s) |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åç¹æéè®¡ç® |
| | | * è®¡ç®æ±¡ææºå¯¹åæ¬¡çæµæ°æ®äº§çç影忿 |
| | | * @param mData çæµæ°æ® |
| | | * @param sop æ±¡ææº |
| | | */ |
| | | private fun weightCompute(mData: M, sop: S) { |
| | | val effect = BaseEffect(sop.sourceId, sop.sourceName, sop.index) |
| | | |
| | | // å°åçæµæ°æ®æç
§æé计ç®åºç»æå¼ |
| | | factorTypes.forEach { type -> |
| | | var result = mData.getFactorData(type) ?: return@forEach |
| | | weights.forEach { |
| | | result *= it.getWeight(mData, sop)?: return |
| | | } |
| | | effect.value.add(Pair(type, result)) |
| | | } |
| | | |
| | | // åç»æå¼æ·»å çéæ ç¾ |
| | | sections.forEach { it.filter(mData, sop, effect) } |
| | | |
| | | // ä¿åç»æ |
| | | result.add(effect) |
| | | } |
| | | |
| | | fun outputToExcel( |
| | | fName: String? = null, |
| | | _workbook: HSSFWorkbook? = null, |
| | | _out: FileOutputStream? = null, |
| | | sheetName: String = "sheet1", |
| | | done: Boolean = true |
| | | ): Pair<HSSFWorkbook, FileOutputStream>? { |
| | | val rMap = formatConversion() |
| | | |
| | | val workbook = _workbook ?: HSSFWorkbook() |
| | | val fileName = fName ?: "æ±¡ææº¯æºæé模å${DateUtil().DateToString(Date(), "yyyy-MM-ddHHmmss")}.xls" |
| | | // val filePath = "E:\\work\\export\\$fileName" |
| | | // val filePath = "E:\\å·¥ä½\\å¼å\\èµ°èªçæµ\\ç®æ³ç¸å
³\\èªå¨è¾åº\\$fileName" |
| | | val filePath = "E:\\å·¥ä½\\å¼å\\èµ°èªçæµ\\ç®æ³ç¸å
³\\èªå¨è¾åº\\ç½æ ¼å\\$fileName" |
| | | val out = _out ?: FileOutputStream(File(filePath)) |
| | | |
| | | // 表头ç»ï¼å¤è¡è¡¨å¤´ï¼ |
| | | val heads = mutableListOf<Array<String>>() |
| | | // è¡¨å¤´è¡ |
| | | val h1 = mutableListOf<String>() |
| | | h1.add("ç¼å·") |
| | | h1.add("æ±¡ææº") |
| | | // arrayOf("æ©ä¸", "ä¸å", "ä¸å", "ä¸å", "åæ", "å¤é´") |
| | | |
| | | val contents = mutableListOf<Array<Any>>() |
| | | var isFirst = true |
| | | rMap.forEach { (source, tMap) -> |
| | | // æ°å»ºä¸è¡ |
| | | val contentList = mutableListOf<Any>() |
| | | // æ·»å æ±¡ææºåç§° |
| | | val l = source.split("(") |
| | | val index = l[1].substring(0, l[1].lastIndex) |
| | | contentList.add(index.toIntOrNull() ?: 0) |
| | | contentList.add(l[0]) |
| | | tMap.forEach { (factorType, lMap) -> |
| | | sections.forEach { |
| | | val types = mutableListOf<String>().apply { |
| | | addAll(it.sectionType) |
| | | addAll(it.constType) |
| | | } |
| | | var max = 0.0 |
| | | var maxP = types[0] |
| | | types.forEach {se -> |
| | | val lKey = "$se($factorType)" |
| | | if (lMap.containsKey(lKey)) { |
| | | val dataList = lMap[lKey] |
| | | val size = dataList?.size |
| | | // æ·»å 该åç±»ä½ä¸ºè¡¨å¤´ |
| | | val h = lKey |
| | | // val h = "$lKey($size)" |
| | | if (!h1.contains(h)) { |
| | | h1.add(h) |
| | | } |
| | | |
| | | // å°åå§çæ°æ®æ¢ç®å¾åºç»æï¼å¯ä»¥æ¯æ±åºåå¼ãæ»åççï¼åç»ä¿®æ¹ä¸ºå¯ç±ç¨æ·è®¾å® |
| | | // FIXME: 2021/6/23 æ¤å¤å
é»è®¤ä¸ºæ±åå¼ |
| | | val average = dataList?.average() |
| | | |
| | | if (average ?: 0.0 > max) { |
| | | max = average ?: 0.0 |
| | | maxP = se |
| | | } |
| | | |
| | | // å½åè¡æ·»å 该åç±»ä¸çç»æå¼ |
| | | contentList.add(average ?: 0.0) |
| | | } |
| | | } |
| | | if (isFirst) { |
| | | h1.add("æé«æ¶æ®µ") |
| | | h1.add("æé«æ¶æ®µå¼") |
| | | } |
| | | contentList.add(maxP) |
| | | contentList.add(max) |
| | | } |
| | | } |
| | | isFirst = false |
| | | contents.add(contentList.toTypedArray()) |
| | | } |
| | | |
| | | contents.sortByDescending { |
| | | val i = it[0] |
| | | if (i is Int) { |
| | | i |
| | | } else { |
| | | 0 |
| | | } |
| | | } |
| | | |
| | | heads.add(h1.toTypedArray()) |
| | | ExcelUtil.write(heads, contents, workbook, sheetName) |
| | | return if (!done) { |
| | | Pair(workbook, out) |
| | | } else { |
| | | workbook.write(out) |
| | | workbook.close() |
| | | out.flush() |
| | | out.close() |
| | | null |
| | | } |
| | | } |
| | | |
| | | private fun formatConversion(): Map<String, Map<String, Map<String?, MutableList<Double>>>> { |
| | | val rMap = mutableMapOf<String, MutableMap<String, MutableMap<String?, MutableList<Double>>>>() |
| | | println("ç»æé¿åº¦ï¼${result.size}") |
| | | result.forEach { e -> |
| | | val rKey = "${e.sourceName}(${e.index})" |
| | | if (!rMap.containsKey(rKey)) { |
| | | rMap[rKey] = mutableMapOf() |
| | | } |
| | | val lMap = rMap[rKey]!! |
| | | e.value.forEach { v -> |
| | | if (!lMap.containsKey(v.first.des)) { |
| | | lMap[v.first.des] = mutableMapOf() |
| | | } |
| | | val tMap = lMap[v.first.des]!! |
| | | e.tag.forEach { t -> |
| | | val factorName = v.first.des |
| | | val lKey = t.levelName + "($factorName)" |
| | | if (!tMap.containsKey(lKey)) { |
| | | tMap[lKey] = mutableListOf() |
| | | } |
| | | tMap[lKey]?.add(v.second) |
| | | } |
| | | } |
| | | } |
| | | return rMap |
| | | } |
| | | |
| | | /** |
| | | * çæµæ°æ®åæ³æ§æ£æ¥ |
| | | */ |
| | | abstract fun mDataCheck(m: M): Boolean |
| | | |
| | | /** |
| | | * æ±¡ææºæ°æ®åæ³æ§æ£æ¥ |
| | | */ |
| | | abstract fun sopCheck(s: S): Boolean |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.flightfeather.uav.model |
| | | |
| | | /** |
| | | * Source of pollution |
| | | * æ±¡ææº åºç±» |
| | | */ |
| | | open class BaseSOP( |
| | | // æ±¡ææºæ è¯ |
| | | var sourceId: String, |
| | | var sourceName: String, |
| | | var index: String |
| | | ) |
| | |
| | | package com.flightfeather.uav.model |
| | | |
| | | import com.flightfeather.uav.lightshare.bean.DataVo |
| | | |
| | | /** |
| | | * ç»è®¡å段æªé¢ |
| | | * ç»è®¡åç±» |
| | | * åä¸ç±»åççæµå åæç
§æä¸å±æ§è¿è¡å段综åç»è®¡ï¼è¾åºç»è®¡ç»æï¼ |
| | | * 常è§ç妿ç
§æ¶é´è¿è¡å段ç»è®¡ |
| | | */ |
| | | abstract class BaseSection { |
| | | abstract class BaseSection<M : BaseMData, S : BaseSOP> { |
| | | |
| | | // åºé´éå¼ |
| | | abstract val sectionValues: List<Double> |
| | | |
| | | // åºé´å¯¹åºç±»å |
| | | abstract val sectionType: List<String> |
| | | |
| | | // 常驻æ ç¾ |
| | | open val constType = listOf<String>() |
| | | |
| | | abstract val tagClz: Class<out BaseTag> |
| | | |
| | | fun filter(mData: M, sop: S, effect: BaseEffect) { |
| | | val v = onSectionValue(mData, sop, effect) |
| | | val type = sectionCal(v) |
| | | val tag = tagClz.newInstance() |
| | | tag.level = type.first |
| | | tag.levelName = type.second |
| | | effect.tag.add(tag) |
| | | |
| | | var level = sectionType.size |
| | | constType.forEach { |
| | | val cTag = tagClz.newInstance() |
| | | cTag.level = level |
| | | cTag.levelName = it |
| | | effect.tag.add(cTag) |
| | | level++ |
| | | } |
| | | } |
| | | |
| | | abstract fun onSectionValue(mData: M, sop: S, effect: BaseEffect): Double |
| | | |
| | | /** |
| | | * ç±»åçé |
| | | * @param value å½±åå ç´ çå¼ |
| | | */ |
| | | private fun sectionCal(value: Double): Pair<Int, String> { |
| | | for (i in sectionValues.indices) { |
| | | if (value < sectionValues[i]) { |
| | | return Pair(i, sectionType[i]) |
| | | } |
| | | } |
| | | return Pair(sectionType.lastIndex, sectionType.last()) |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.flightfeather.uav.model |
| | | |
| | | /** |
| | | * æ±¡ææºå½±åç»æçéç±»å |
| | | */ |
| | | abstract class BaseTag { |
| | | |
| | | // çéç±»ååç§° |
| | | abstract var name: String |
| | | // å½åçéçº§å« |
| | | var level: Int = 0 |
| | | // å½åçé级å«åç§° |
| | | var levelName: String? = null |
| | | } |
| | |
| | | package com.flightfeather.uav.model |
| | | |
| | | import com.flightfeather.uav.lightshare.bean.DataVo |
| | | |
| | | /** |
| | | * æé |
| | | * æç§å½±åå ç´ å¨ä¸åæ
åµä¸å¯¹æç§çæµæ°æ®äº§ççæéå½±å |
| | | */ |
| | | abstract class BaseWeight { |
| | | abstract class BaseWeight <M: BaseMData, S : BaseSOP> { |
| | | |
| | | abstract val tag:String |
| | | |
| | | // åºé´éå¼ |
| | | abstract val sectionValues: List<Double> |
| | | |
| | | // åºé´å¯¹åºæé |
| | | abstract val weights: List<Double> |
| | | |
| | | // 䏿¬¡è®¡ç®çæéå¼ |
| | | private var lastWeight = -1.0 |
| | | |
| | | // æéæ¯å¦åå |
| | | var isChange = true |
| | | |
| | | fun getWeight(mData: M, sop: S): Double? { |
| | | if (!isChange) { |
| | | if (lastWeight < 0) { |
| | | val v = onWeightFactor(mData, sop) ?: return null |
| | | lastWeight = weightCal(v) |
| | | } |
| | | // println("$tag: $lastWeight") |
| | | return lastWeight |
| | | } else { |
| | | val v = onWeightFactor(mData, sop) ?: return null |
| | | lastWeight = weightCal(v) |
| | | // println("$tag: $lastWeight") |
| | | return lastWeight |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è·åæéå åå¼ |
| | | */ |
| | | abstract fun onWeightFactor(mData: M, sop: S): Double? |
| | | |
| | | /** |
| | | * æéè®¡ç® |
| | | * @param value å½±åå ç´ çå¼ |
| | | */ |
| | | fun weightCal(value: Double): Double { |
| | | private fun weightCal(value: Double): Double { |
| | | for (i in sectionValues.indices) { |
| | | if (value < sectionValues[i]) { |
| | | return weights[i] |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.flightfeather.uav.model |
| | | |
| | | /** |
| | | * æ¶æ®µæ ç¾ |
| | | * [6,9,12,14,17,20]; [6,9)为æ©ä¸ï¼ä¹å便¬¡ä¸ºä¸åï¼ä¸åï¼ä¸åï¼åæåæä¸ |
| | | */ |
| | | class TimeTag :BaseTag() { |
| | | override var name: String = "æ¶æ®µ" |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.flightfeather.uav.model.epw |
| | | |
| | | import com.flightfeather.uav.lightshare.bean.CompanySOP |
| | | import com.flightfeather.uav.lightshare.bean.DataVo |
| | | import com.flightfeather.uav.model.BaseDataPrep |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | import kotlin.math.max |
| | | import kotlin.math.min |
| | | import kotlin.math.sqrt |
| | | |
| | | class EPWDataPrep : BaseDataPrep<DataVo, CompanySOP>() { |
| | | |
| | | // ååæ£ç´¢çæ°æ®è®°å½æ° |
| | | private val ncal = 15 |
| | | // æ å差忰忰 |
| | | private val nstd = 3 |
| | | // åå¼åæ°åæ° |
| | | private val xratio = 3 |
| | | // éè¦å¤ççå åç±»å |
| | | private val calTypes = |
| | | // emptyList<String>() |
| | | WeightType.prep |
| | | |
| | | override fun mDataPrep(mDataList: List<DataVo>): List<DataVo> { |
| | | mDataList.forEach { |
| | | it.values?.forEach v@{a -> |
| | | if (!calTypes.contains(a.factorName)) return@v |
| | | |
| | | val range = FactorType.getRange(a.factorName) ?: return@v |
| | | // å¤ææ°æ®æ¯å¦å¨åçèå´å
|
| | | if (a.factorData ?: 0.0 < range.first || a.factorData ?: 0.0 > range.second) { |
| | | a.factorData = null |
| | | } |
| | | } |
| | | } |
| | | |
| | | // val newDataList = mutableListOf<DataVo>() |
| | | // mDataList.forEach { |
| | | // newDataList.add(it.copy()) |
| | | // } |
| | | |
| | | var i = ncal |
| | | 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 |
| | | |
| | | if (it.factorData!! > vMax) { |
| | | val list = mDataList.subList(i - ncal, i) |
| | | // å»é¤æ æå¼çå¹³å |
| | | val avg = average(list, it.factorName) |
| | | // å»é¤æ æå¼çæ åå·® |
| | | val std = standardDeviation(avg.first, list, it.factorName) |
| | | // åçæå¤§å¼ |
| | | val max = max(avg.first + std * nstd, avg.first + avg.first * xratio) |
| | | // åçæå°å¼ |
| | | 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 |
| | | // newDataList[i].values?.get(y)?.factorData = avg.first |
| | | } |
| | | } |
| | | } |
| | | |
| | | i++ |
| | | } |
| | | |
| | | return mDataList |
| | | } |
| | | |
| | | override fun sopPrep(sopList: List<CompanySOP>): List<CompanySOP> { |
| | | return sopList |
| | | } |
| | | |
| | | /** |
| | | * å»é¤æ æå¼çå¹³å |
| | | * @param list çæµæ°æ® |
| | | * @return åå¼åæææ°æ®ä¸ªæ° |
| | | */ |
| | | private fun average(list: List<DataVo>, factorName:String?): Pair<Double, Int> { |
| | | var t = 0.0 |
| | | var c = 0 |
| | | list.forEach { |
| | | for (i in it.values?.indices ?: 0..0) { |
| | | val f = it.values?.get(i) |
| | | if (f?.factorName == factorName) { |
| | | if (f?.factorData != null) { |
| | | t += f.factorData!! |
| | | c++ |
| | | } |
| | | break |
| | | } |
| | | } |
| | | } |
| | | |
| | | val avg = if (c == 0) { |
| | | 0.0 |
| | | } else { |
| | | t / c |
| | | } |
| | | |
| | | return Pair(avg, c) |
| | | } |
| | | |
| | | /** |
| | | * å»é¤æ æå¼çæ åå·® |
| | | */ |
| | | private fun standardDeviation(avg: Double, list: List<DataVo>, factorName: String?): Double { |
| | | var t = 0.0 |
| | | var c = 0 |
| | | list.forEach { |
| | | for (i in it.values?.indices ?: 0..0) { |
| | | val f = it.values?.get(i) |
| | | if (f?.factorName == factorName) { |
| | | if (f?.factorData != null) { |
| | | t += (f.factorData!! - avg) * (f.factorData!! - avg) |
| | | c++ |
| | | } |
| | | break |
| | | } |
| | | } |
| | | } |
| | | |
| | | return if (c <= 1) { |
| | | 0.0 |
| | | } else { |
| | | sqrt(t / (c - 1)) |
| | | } |
| | | } |
| | | } |
| | |
| | | package com.flightfeather.uav.model.epw |
| | | |
| | | import com.flightfeather.uav.domain.entity.Company |
| | | import com.flightfeather.uav.lightshare.bean.CompanySOP |
| | | import com.flightfeather.uav.lightshare.bean.DataVo |
| | | import com.flightfeather.uav.model.* |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | import java.math.BigDecimal |
| | | |
| | | /** |
| | |
| | | * æ ¹æ®èµ°èªçæµæ°æ®ï¼ç»åé£éãé£åãçæµç¹ä¸ä¼ä¸çç¸å¯¹ä½ç½®çå ç´ ï¼è®¡ç®ä¼ä¸å¯¹çæµåºåçå½±åç¨åº¦ |
| | | * @author riku |
| | | */ |
| | | class EPWModel { |
| | | class EPWModel : BaseModel<DataVo, CompanySOP>() { |
| | | |
| | | private val windDirWeight = WindDirWeight() |
| | | private val windDisWeight = WindDisWeight() |
| | | override var dataPrep: BaseDataPrep<DataVo, CompanySOP> = EPWDataPrep() |
| | | |
| | | private lateinit var datas: List<DataVo> |
| | | private lateinit var sources: List<Company> |
| | | override var factorTypes: List<FactorType> = WeightType.weightType |
| | | |
| | | fun execute() { |
| | | datas.forEach d@{d -> |
| | | if (d.lng == null || d.lng == 0.0 || d.lat == null || d.lat == 0.0) { |
| | | return@d |
| | | } |
| | | override var weights: List<BaseWeight<DataVo, CompanySOP>> = listOf(WindDirWeight(), WindDisWeight()) |
| | | |
| | | var con = 0 |
| | | var ws = 0.0 |
| | | var wd = 0 |
| | | var hr = 0 |
| | | val lng = d.lng |
| | | val lat = d.lat |
| | | override var sections: List<BaseSection<DataVo, CompanySOP>> = listOf(TimeSection()) |
| | | |
| | | sources.forEach s@ { s -> |
| | | // ç»çº¬åº¦æææ§å¤æ |
| | | if (s.ciLongitude == null || s.ciLongitude == BigDecimal(0) || s.ciLatitude == null || s.ciLatitude == BigDecimal(0)) { |
| | | return@s |
| | | } |
| | | override fun mDataCheck(m: DataVo): Boolean = !(m.lng == null || m.lng == 0.0 || m.lat == null || m.lat == 0.0) |
| | | |
| | | val p1 = Pair(lng!!, lat!!) |
| | | val p2 = Pair(s.ciLongitude.toDouble(), s.ciLatitude.toDouble()) |
| | | windDirWeight.getWeight(p1, p2, wd) |
| | | override fun sopCheck(s: CompanySOP): Boolean = |
| | | !(s.ciLongitude == null || s.ciLongitude == BigDecimal(0) || s.ciLatitude == null || s.ciLatitude == BigDecimal(0)) |
| | | |
| | | windDisWeight.getWeight(p1, p2, ws) |
| | | |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.flightfeather.uav.model.epw |
| | | |
| | | import com.flightfeather.uav.lightshare.bean.CompanySOP |
| | | import com.flightfeather.uav.lightshare.bean.DataVo |
| | | import com.flightfeather.uav.model.BaseEffect |
| | | import com.flightfeather.uav.model.BaseSection |
| | | import com.flightfeather.uav.model.BaseTag |
| | | import com.flightfeather.uav.model.TimeTag |
| | | |
| | | /** |
| | | * æ¶æ®µåç±»ç»è®¡ |
| | | * [6,9,12,14,17,20]; [6,9)为æ©ä¸ï¼ä¹å便¬¡ä¸ºä¸åï¼ä¸åï¼ä¸åï¼åæåæä¸ |
| | | */ |
| | | class TimeSection : BaseSection<DataVo, CompanySOP>() { |
| | | |
| | | override val sectionValues: List<Double> = listOf(6.0, 9.0, 12.0, 14.0, 17.0, 20.0) |
| | | |
| | | override val sectionType: List<String> = listOf("忍", "æ©ä¸", "ä¸å", "ä¸å", "ä¸å", "åæ", "å¤é´") |
| | | |
| | | override val tagClz: Class<out BaseTag> = TimeTag::class.java |
| | | |
| | | override val constType: List<String> = listOf("综å") |
| | | |
| | | override fun onSectionValue(mData: DataVo, sop: CompanySOP, effect: BaseEffect): Double { |
| | | return getHour(mData.time!!) |
| | | } |
| | | |
| | | private fun getHour(time: String): Double { |
| | | return if (time.length >= 13) { |
| | | time.substring(11, 13).toDoubleOrNull() ?: 0.0 |
| | | } else { |
| | | 0.0 |
| | | } |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.flightfeather.uav.model.epw |
| | | |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | |
| | | object WeightType { |
| | | |
| | | val prep = 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 weightType = listOf( |
| | | FactorType.NO2, |
| | | FactorType.CO, |
| | | FactorType.H2S, |
| | | FactorType.SO2, |
| | | FactorType.O3, |
| | | FactorType.PM25, |
| | | FactorType.PM10, |
| | | FactorType.VOC, |
| | | ) |
| | | } |
| | |
| | | package com.flightfeather.uav.model.epw |
| | | |
| | | import com.flightfeather.uav.lightshare.bean.CompanySOP |
| | | import com.flightfeather.uav.lightshare.bean.DataVo |
| | | import com.flightfeather.uav.model.BaseWeight |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | import kotlin.math.PI |
| | | import kotlin.math.abs |
| | | import kotlin.math.atan2 |
| | | import kotlin.math.sqrt |
| | | |
| | | /** |
| | | * |
| | | * é£åæé |
| | | */ |
| | | class WindDirWeight : BaseWeight() { |
| | | class WindDirWeight : BaseWeight<DataVo, CompanySOP>() { |
| | | |
| | | override val tag: String = "é£åæé" |
| | | |
| | | override val sectionValues: List<Double> = listOf(22.5, 67.5, 112.5, 157.5, 180.0) |
| | | |
| | | override val weights: List<Double> = listOf(1.0, 0.8, 0.5, 0.2, 0.1) |
| | | |
| | | fun getWeight(deg: Double):Double { |
| | | return weightCal(deg) |
| | | override fun onWeightFactor(mData: DataVo, sop: CompanySOP): Double? { |
| | | val p1 = Pair(mData.lng!!, mData.lat!!) |
| | | val p2 = Pair(sop.ciLongitude!!.toDouble(), sop.ciLatitude!!.toDouble()) |
| | | val wd = mData.getFactorData(FactorType.WIND_DIRECTION) ?: 0.0 |
| | | return getAngle(p1, p2, wd) |
| | | } |
| | | |
| | | fun getWeight(p1: Pair<Double, Double>, p2: Pair<Double, Double>, wd: Int): Double { |
| | | |
| | | private fun getAngle(p1: Pair<Double, Double>, p2: Pair<Double, Double>, wd: Double): Double { |
| | | val dx = p2.first - p1.first |
| | | val dy = p2.second - p1.second |
| | | var x1 = atan2(dy, dx) * 180 / PI |
| | |
| | | if (x2 < 0) x2 += 360 |
| | | x1 = abs(x2 - x1) |
| | | if (x1>180) x1 = 360 - x1 |
| | | |
| | | return weightCal(x1) |
| | | // println("夹è§ï¼$x1") |
| | | return x1 |
| | | } |
| | | } |
| | |
| | | package com.flightfeather.uav.model.epw |
| | | |
| | | import com.flightfeather.uav.lightshare.bean.CompanySOP |
| | | import com.flightfeather.uav.lightshare.bean.DataVo |
| | | import com.flightfeather.uav.model.BaseWeight |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | import kotlin.math.abs |
| | | import kotlin.math.max |
| | | import kotlin.math.sqrt |
| | | |
| | | /** |
| | | * é£éè·ç¦»æé |
| | | * çæµç¹ä¸æ±¡ææºä¹é´çç©çè·ç¦»ä¸å½åé£éå¾åºçæé |
| | | */ |
| | | class WindDisWeight : BaseWeight() { |
| | | class WindDisWeight : BaseWeight<DataVo, CompanySOP>() { |
| | | |
| | | override val tag: String = "é£éè·ç¦»æé" |
| | | |
| | | override val sectionValues: List<Double> = listOf(2.0, 5.0, 8.0, 12.0, 20.0, 30.0) |
| | | |
| | | override val weights: List<Double> = listOf(1.0, 0.8, 0.6, 0.5, 0.3, 0.0) |
| | | |
| | | fun getWeight(dis: Double, ws: Double): Double { |
| | | val value = dis / 1000 / ws / 60 |
| | | return weightCal(value) |
| | | override fun onWeightFactor(mData: DataVo, sop: CompanySOP): Double? { |
| | | val p1 = Pair(mData.lng!!, mData.lat!!) |
| | | val p2 = Pair(sop.ciLongitude!!.toDouble(), sop.ciLatitude!!.toDouble()) |
| | | val ws = mData.getFactorData(FactorType.WIND_SPEED) |
| | | return if (ws == null) null else getWindSpeed(p1, p2, ws) |
| | | } |
| | | |
| | | fun getWeight(p1: Pair<Double, Double>, p2: Pair<Double, Double>, ws: Double): Double { |
| | | private fun getWindSpeed(p1: Pair<Double, Double>, p2: Pair<Double, Double>, ws: Double): Double { |
| | | val dx = p2.first - p1.first |
| | | val dy = p2.second - p1.second |
| | | val dis = sqrt(abs(dx * dx) + abs(dy * dy)) * 100 |
| | | return getWeight(dis, ws) |
| | | // println("è·ç¦»ï¼$dis") |
| | | val min = dis * 1000 / max(ws, 1.0) / 60 |
| | | // println("è·ç¦»è½¬ä¸ºé£éåéæ°ï¼$min") |
| | | return min |
| | | } |
| | | } |
| | |
| | | HEIGHT.value -> HEIGHT |
| | | else -> null |
| | | } |
| | | |
| | | fun getByName(name: String?): FactorType? = when (name) { |
| | | NO2.des -> NO2 |
| | | CO.des -> CO |
| | | H2S.des -> H2S |
| | | SO2.des -> SO2 |
| | | O3.des -> O3 |
| | | PM25.des -> PM25 |
| | | PM10.des -> PM10 |
| | | TEMPERATURE.des -> TEMPERATURE |
| | | HUMIDITY.des -> HUMIDITY |
| | | VOC.des -> VOC |
| | | NOI.des -> NOI |
| | | LNG.des -> LNG |
| | | LAT.des -> LAT |
| | | VELOCITY.des -> VELOCITY |
| | | TIME.des -> TIME |
| | | WIND_SPEED.des -> WIND_SPEED |
| | | WIND_DIRECTION.des -> WIND_DIRECTION |
| | | HEIGHT.des -> HEIGHT |
| | | else -> null |
| | | } |
| | | |
| | | fun getRange(name: String?): Pair<Double, Double>? { |
| | | getByName(name)?.let { |
| | | return getRange(it) |
| | | } |
| | | return null |
| | | } |
| | | |
| | | /** |
| | | * è·åçæµå åçåçèå´ |
| | | */ |
| | | fun getRange(type: FactorType): Pair<Double, Double>? = when (type) { |
| | | NO2 -> Pair(0.1, 1000.0) |
| | | CO -> Pair(1.0, 5000.0) |
| | | H2S -> Pair(0.1, 1000.0) |
| | | SO2 -> Pair(0.1, 1000.0) |
| | | O3 -> Pair(0.1, 2000.0) |
| | | PM25 -> Pair(0.1, 5000.0) |
| | | PM10 -> Pair(0.1, 10000.0) |
| | | TEMPERATURE -> Pair(-20.0, 70.0) |
| | | HUMIDITY -> Pair(0.0, 110.0) |
| | | VOC -> Pair(1.0, 5000.0) |
| | | NOI -> Pair(0.1, 1000.0) |
| | | LNG -> Pair(0.0, 180.0) |
| | | LAT -> Pair(0.0, 90.0) |
| | | VELOCITY -> Pair(0.0, 500.0) |
| | | TIME -> null |
| | | WIND_SPEED -> Pair(0.0, 100.0) |
| | | WIND_DIRECTION -> Pair(0.0, 360.0) |
| | | HEIGHT -> Pair(0.0, 1000.0) |
| | | else -> null |
| | | } |
| | | |
| | | fun getVMax(name: String?): Double? { |
| | | getByName(name)?.let { |
| | | return getVMax(it) |
| | | } |
| | | return null |
| | | } |
| | | |
| | | /** |
| | | * ä¸å¤çä½äºæ¤å¼çå¼ |
| | | */ |
| | | fun getVMax(type: FactorType): Double? = when (type) { |
| | | NO2 -> 10.0 |
| | | CO -> 100.0 |
| | | H2S -> 10.0 |
| | | SO2 -> 10.0 |
| | | O3 -> 10.0 |
| | | PM25 -> 10.0 |
| | | PM10 -> 10.0 |
| | | TEMPERATURE -> 10.0 |
| | | HUMIDITY -> 10.0 |
| | | VOC -> 10.0 |
| | | NOI -> 10.0 |
| | | LNG -> 0.0 |
| | | LAT -> 0.0 |
| | | VELOCITY -> 0.0 |
| | | TIME -> 0.0 |
| | | WIND_SPEED -> 2.0 |
| | | WIND_DIRECTION -> 0.0 |
| | | HEIGHT -> 0.0 |
| | | else -> null |
| | | } |
| | | } |
| | | } |
| | |
| | | spring: |
| | | datasource: |
| | | driver-class-name: com.mysql.cj.jdbc.Driver |
| | | # å±åç½æå¡å¨ |
| | | # url: jdbc:mysql://192.168.0.200:3306/dronemonitor?serverTimezone=Asia/Shanghai&prepStmtCacheSize=517&cachePrepStmts=true&autoReconnect=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false |
| | | # username: root |
| | | # password: cn.FLIGHTFEATHER |
| | | |
| | | 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 |
| | | # çº¿ä¸æå¡å¨ |
| | | # 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 |
| | | |
| | | # å¼åæ¬å°æå¡å¨ |
| | | # url: jdbc:mysql://localhost:3306/dronemonitor?serverTimezone=Asia/Shanghai&prepStmtCacheSize=517&cachePrepStmts=true&autoReconnect=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false |
| | | # username: root |
| | | # password: 123456 |
| | | |
| | | # å¼åè¿ç¨æå¡å¨ |
| | | url: jdbc:mysql://47.100.191.150:3306/dronemonitor?serverTimezone=Asia/Shanghai&prepStmtCacheSize=517&cachePrepStmts=true&autoReconnect=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false |
| | | username: remoteU1 |
| | | password: eSoF8DnzfGTlhAjE |
| | | hikari: |
| | | maximum-pool-size: 500 |
| | | minimum-idle: 20 |
| | |
| | | <!--<?xml version="1.0" encoding="UTF-8"?>--> |
| | | <!--<!–--> |
| | | <!--6个ä¼å
级ä»é«å°ä½ä¾æ¬¡ä¸ºï¼OFFãFATALãERRORãWARNãINFOãDEBUGãTRACEã ALLã--> |
| | | <!--å¦æè®¾ç½®ä¼å
级为WARNï¼é£ä¹OFFãFATALãERRORãWARN 4个级å«çlogè½æ£å¸¸è¾åº--> |
| | | <!--设置为OFF 表示ä¸è®°å½log4j2æ¬èº«çæ¥å¿ï¼--> |
| | | <!--–>--> |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <!-- |
| | | 6个ä¼å
级ä»é«å°ä½ä¾æ¬¡ä¸ºï¼OFFãFATALãERRORãWARNãINFOãDEBUGãTRACEã ALLã |
| | | å¦æè®¾ç½®ä¼å
级为WARNï¼é£ä¹OFFãFATALãERRORãWARN 4个级å«çlogè½æ£å¸¸è¾åº |
| | | 设置为OFF 表示ä¸è®°å½log4j2æ¬èº«çæ¥å¿ï¼ |
| | | --> |
| | | |
| | | <!--<!– statusï¼ç¨æ¥æå®log4jæ¬èº«çæå°æ¥å¿çº§å«,monitorInterval:æå®log4jèªå¨éæ°é
ç½®ççæµé´éæ¶é´ –>--> |
| | | <!--<configuration status="INFO" monitorInterval="30">--> |
| | | <!--<!– èªå·±è®¾ç½®å±æ§ï¼åé¢éè¿${}æ¥è®¿é® –>--> |
| | | <!--<properties>--> |
| | | <!--<property name="LOG_HOME">../obdLogs</property>--> |
| | | <!--</properties>--> |
| | | <!-- statusï¼ç¨æ¥æå®log4jæ¬èº«çæå°æ¥å¿çº§å«,monitorInterval:æå®log4jèªå¨éæ°é
ç½®ççæµé´éæ¶é´ --> |
| | | <configuration status="INFO" monitorInterval="30"> |
| | | <!-- èªå·±è®¾ç½®å±æ§ï¼åé¢éè¿${}æ¥è®¿é® --> |
| | | <properties> |
| | | <property name="LOG_HOME">../uavLogs</property> |
| | | </properties> |
| | | |
| | | <!--<appenders>--> |
| | | <!--<!–Appender 1. è¾åºå°Consoleæ§å¶å°ï¼æå®è¾åºæ ¼å¼åè¿æ»¤å¨ç级为INFO –>--> |
| | | <!--<Console name="Console" target="SYSTEM_OUT">--> |
| | | <!--<!–ThresholdFilteræå®æ¥å¿æ¶æ¯çè¾åºæä½å±æ¬¡–>--> |
| | | <!--<ThresholdFilter level="ALL" onMatch="ACCEPT" onMismatch="DENY"/>--> |
| | | <!--<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>--> |
| | | <!--</Console>--> |
| | | <appenders> |
| | | <!--Appender 1. è¾åºå°Consoleæ§å¶å°ï¼æå®è¾åºæ ¼å¼åè¿æ»¤å¨ç级为INFO --> |
| | | <Console name="Console" target="SYSTEM_OUT"> |
| | | <!--ThresholdFilteræå®æ¥å¿æ¶æ¯çè¾åºæä½å±æ¬¡--> |
| | | <ThresholdFilter level="ALL" onMatch="ACCEPT" onMismatch="DENY"/> |
| | | <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> |
| | | </Console> |
| | | |
| | | <!--<!–Appender 2. è¾åºå°æ»å¨ä¿åçæä»¶, 触åä¿åæ¥å¿æä»¶çæ¡ä»¶æ¯æ¥å¿æä»¶å¤§äº3KBï¼åªä¿åææ°ç10个æ¥å¿–>--> |
| | | <!--<File name="allLog" fileName="${LOG_HOME}/all.log">--> |
| | | <!--<ThresholdFilter level="ALL" onMatch="ACCEPT" onMismatch="DENY"/>--> |
| | | <!--<PatternLayout charset="UTF-8" pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>--> |
| | | <!--</File>--> |
| | | <!--Appender 2. è¾åºå°æ»å¨ä¿åçæä»¶, 触åä¿åæ¥å¿æä»¶çæ¡ä»¶æ¯æ¥å¿æä»¶å¤§äº3KBï¼åªä¿åææ°ç10个æ¥å¿--> |
| | | <File name="allLog" fileName="${LOG_HOME}/all.log"> |
| | | <ThresholdFilter level="ALL" onMatch="ACCEPT" onMismatch="DENY"/> |
| | | <PatternLayout charset="UTF-8" pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> |
| | | </File> |
| | | |
| | | |
| | | <!--<!–Appender 3. è¾åºå°æ»å¨ä¿åçæä»¶, 触åä¿åæ¥å¿æä»¶çæ¡ä»¶æ¯æ¥å¿æä»¶å¤§äº3KBï¼åªä¿åææ°ç10个æ¥å¿–>--> |
| | | <!--<RollingFile name="debugLog" fileName="${LOG_HOME}/debug.log" filePattern="${LOG_HOME}/debug-%i.log">--> |
| | | <!--<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>--> |
| | | <!--<PatternLayout charset="UTF-8" pattern="[%-5level][%d{yyyy-MM-dd HH:mm:ss}][%F:%L] - %m%n"/>--> |
| | | <!--<SizeBasedTriggeringPolicy size="3KB"/>--> |
| | | <!--<!– DefaultRolloverStrategy ä¸çåæ°maxï¼å¯ä»¥éå¶ SizeBasedTriggeringPolicyä¸sizeè¶
åºåï¼åªä¿çmaxä¸ªåæ¡£–>--> |
| | | <!--<DefaultRolloverStrategy max="10"/>--> |
| | | <!--</RollingFile>--> |
| | | <!--Appender 3. è¾åºå°æ»å¨ä¿åçæä»¶, 触åä¿åæ¥å¿æä»¶çæ¡ä»¶æ¯æ¥å¿æä»¶å¤§äº3KBï¼åªä¿åææ°ç10个æ¥å¿--> |
| | | <RollingFile name="debugLog" fileName="${LOG_HOME}/debug.log" filePattern="${LOG_HOME}/debug-%i.log"> |
| | | <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/> |
| | | <PatternLayout charset="UTF-8" pattern="[%-5level][%d{yyyy-MM-dd HH:mm:ss}][%F:%L] - %m%n"/> |
| | | <SizeBasedTriggeringPolicy size="3KB"/> |
| | | <!-- DefaultRolloverStrategy ä¸çåæ°maxï¼å¯ä»¥éå¶ SizeBasedTriggeringPolicyä¸sizeè¶
åºåï¼åªä¿çmaxä¸ªåæ¡£--> |
| | | <DefaultRolloverStrategy max="10"/> |
| | | </RollingFile> |
| | | |
| | | <!--<!–Appender 4. è¾åºå°æ»å¨ä¿åçæä»¶, 触åä¿åæ¥å¿æä»¶çæ¡ä»¶æ¯æ¯åéç¬¬ä¸æ¬¡çæ¥å¿äºä»¶ãERRORæ¥å¿æ¯æåéäº§çæ¥å¿ –>--> |
| | | <!--<RollingFile name="errorLog" fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/error-%d{yyyy-MM-dd_HH-mm}.log">--> |
| | | <!--<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>--> |
| | | <!--<PatternLayout charset="UTF-8" pattern="[%-5level][%d{yyyy-MM-dd HH:mm:ss}][%C:%F:%L] - %m%n"/>--> |
| | | <!--<TimeBasedTriggeringPolicy/>--> |
| | | <!--</RollingFile>--> |
| | | <!--Appender 4. è¾åºå°æ»å¨ä¿åçæä»¶, 触åä¿åæ¥å¿æä»¶çæ¡ä»¶æ¯æ¯åéç¬¬ä¸æ¬¡çæ¥å¿äºä»¶ãERRORæ¥å¿æ¯æåéäº§çæ¥å¿ --> |
| | | <RollingFile name="errorLog" fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/error-%d{yyyy-MM-dd_HH-mm}.log"> |
| | | <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> |
| | | <PatternLayout charset="UTF-8" pattern="[%-5level][%d{yyyy-MM-dd HH:mm:ss}][%C:%F:%L] - %m%n"/> |
| | | <TimeBasedTriggeringPolicy/> |
| | | </RollingFile> |
| | | |
| | | <!--<RollingFile name="RollingFile" fileName="${LOG_HOME}/rar.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{MM-dd-yyyy}-%i.log.gz">--> |
| | | <!--<PatternLayout charset="UTF-8" pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>--> |
| | | <!--<!–æ¥å¿æä»¶æå¤§å¼ 第äºå¤©å缩–>--> |
| | | <!--<Policies>--> |
| | | <!--<TimeBasedTriggeringPolicy/>--> |
| | | <!--<SizeBasedTriggeringPolicy size="10 MB"/>--> |
| | | <!--</Policies>--> |
| | | <!--</RollingFile>--> |
| | | <RollingFile name="RollingFile" fileName="${LOG_HOME}/rar.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{MM-dd-yyyy}-%i.log.gz"> |
| | | <PatternLayout charset="UTF-8" pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> |
| | | <!--æ¥å¿æä»¶æå¤§å¼ 第äºå¤©å缩--> |
| | | <Policies> |
| | | <TimeBasedTriggeringPolicy/> |
| | | <SizeBasedTriggeringPolicy size="10 MB"/> |
| | | </Policies> |
| | | </RollingFile> |
| | | |
| | | |
| | | <!--</appenders>--> |
| | | <!--<!–root é»è®¤å è½½–>--> |
| | | <!--<loggers>--> |
| | | <!--<root level="INFO">--> |
| | | </appenders> |
| | | <!--root é»è®¤å è½½--> |
| | | <loggers> |
| | | <root level="INFO"> |
| | | <!--<appender-ref ref="Console"/>--> |
| | | <!--<!–<appender-ref ref="allLog"/>–>--> |
| | | <!-- <appender-ref ref="allLog"/>--> |
| | | <!--<appender-ref ref="debugLog"/>--> |
| | | <!--<appender-ref ref="errorLog"/>--> |
| | | <!--<appender-ref ref="RollingFile"/>--> |
| | | <!--</root>--> |
| | | <!--</loggers>--> |
| | | <!--</configuration>--> |
| | | </root> |
| | | </loggers> |
| | | </configuration> |
| | |
| | | package com.flightfeather.uav |
| | | |
| | | import com.flightfeather.uav.common.utils.FileExchange |
| | | import com.flightfeather.uav.domain.entity.Company |
| | | import com.flightfeather.uav.socket.bean.DataUnit |
| | | import com.flightfeather.uav.socket.decoder.AirDataDecoder |
| | | import com.flightfeather.uav.socket.eunm.AirCommandUnit |
| | |
| | | fun dataChange() { |
| | | FileExchange().doTask2() |
| | | } |
| | | |
| | | @Test |
| | | fun listCopy() { |
| | | val l1 = listOf(Company().apply { ciGuid = "a" }, Company().apply { ciGuid = "b" }, Company().apply { ciGuid = "c" }) |
| | | val l2 = mutableListOf<Company>().apply { addAll(l1) } |
| | | l2[1].ciGuid = "d" |
| | | println(l1) |
| | | println(l2) |
| | | } |
| | | |
| | | @Test |
| | | fun average() { |
| | | for (i in 0..2) { |
| | | println(i) |
| | | } |
| | | val list = listOf(1, 2, 3, 4, 5, 0) |
| | | println(list.average()) |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.flightfeather.uav.model.epw |
| | | |
| | | import com.flightfeather.uav.common.utils.DateUtil |
| | | import com.flightfeather.uav.domain.entity.Company |
| | | import com.flightfeather.uav.domain.mapper.CompanyMapper |
| | | import com.flightfeather.uav.lightshare.bean.CompanySOP |
| | | import com.flightfeather.uav.lightshare.bean.DataVo |
| | | import com.flightfeather.uav.lightshare.service.RealTimeDataService |
| | | import org.apache.poi.hssf.usermodel.HSSFWorkbook |
| | | import org.junit.Test |
| | | import org.junit.runner.RunWith |
| | | import org.springframework.beans.BeanUtils |
| | | 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.FileOutputStream |
| | | import java.util.* |
| | | |
| | | @RunWith(SpringRunner::class) |
| | | @SpringBootTest |
| | | class EPWModelTest { |
| | | |
| | | @Autowired |
| | | lateinit var realTimeDataService: RealTimeDataService |
| | | |
| | | @Autowired |
| | | lateinit var companyMapper: CompanyMapper |
| | | |
| | | @Test |
| | | fun test1() { |
| | | val company = companyMapper |
| | | .selectAll() |
| | | // .selectByExample(Example(Company::class.java).apply { |
| | | // createCriteria() |
| | | // .orEqualTo("ciGuid", "Dp5iDYfKY7qi04Ze") |
| | | // .orEqualTo("ciGuid", "C9ZzWbc49AHuxa0U") |
| | | // .orEqualTo("ciGuid", "15xCtnjxa9pfmDSj") |
| | | // .orEqualTo("ciGuid", "mbd8mRmpRtcUsT61") |
| | | // .orEqualTo("ciGuid", "xh7fpulnFQDQjb3e") |
| | | // .orEqualTo("ciGuid", "mXef1NeDZyguGDLN") |
| | | // .orEqualTo("ciGuid", "LEU330ksO54BEH8A") |
| | | // .orEqualTo("ciGuid", "aZpHXOktTEuzUcTX") |
| | | // .orEqualTo("ciGuid", "dNDMoJfresNn5hPU") |
| | | // .orEqualTo("ciGuid", "J3euwNl19WZvH7iE") |
| | | // .orEqualTo("ciGuid", "eb2kbFjhCZN2s9If") |
| | | // .orEqualTo("ciGuid", "0PjZXFkpp1KT6hEM") |
| | | // .orEqualTo("ciGuid", "ymXoupcbVMa1bBF1") |
| | | // }) |
| | | val companySOPList = mutableListOf<CompanySOP>() |
| | | company.forEach { |
| | | val companySOP = CompanySOP(it.ciGuid, it.ciName, it.ciExtension1) |
| | | BeanUtils.copyProperties(it, companySOP) |
| | | companySOPList.add(companySOP) |
| | | } |
| | | |
| | | val dataSet = mutableListOf<DataVo>() |
| | | val timeSet = listOf( |
| | | Pair("2021-06-18 15:00:00", "2021-06-18 23:59:59"), |
| | | Pair("2021-06-19 00:00:00", "2021-06-19 23:59:59"), |
| | | Pair("2021-06-20 00:00:00", "2021-06-20 23:59:59"), |
| | | Pair("2021-06-21 00:00:00", "2021-06-21 23:59:59"), |
| | | Pair("2021-06-22 00:00:00", "2021-06-22 23:59:59"), |
| | | Pair("2021-06-23 00:00:00", "2021-06-23 23:59:59"), |
| | | Pair("2021-06-24 00:00:00", "2021-06-24 23:59:59"), |
| | | Pair("2021-06-25 00:00:00", "2021-06-25 23:59:59"), |
| | | Pair("2021-06-26 00:00:00", "2021-06-26 23:59:59"), |
| | | Pair("2021-06-27 00:00:00", "2021-06-27 23:59:59"), |
| | | Pair("2021-06-28 00:00:00", "2021-06-28 23:59:59"), |
| | | Pair("2021-06-29 00:00:00", "2021-06-29 23:59:59"), |
| | | Pair("2021-06-30 00:00:00", "2021-06-30 08:00:00"), |
| | | // Pair("2021-03-26 11:28:12", "2021-03-26 21:30:00"), |
| | | // Pair("2021-04-09 07:18:12", "2021-04-09 22:04:39"), |
| | | // Pair("2021-04-10 08:00:02", "2021-04-10 09:44:18"), |
| | | // Pair("2021-04-21 16:46:12", "2021-04-21 21:18:35"), |
| | | // Pair("2021-05-24 11:10:12", "2021-05-24 19:31:02"), |
| | | // Pair("2021-06-04 09:02:40", "2021-06-04 20:14:18"), |
| | | ) |
| | | |
| | | val epwModel = EPWModel() |
| | | var workbook: HSSFWorkbook? = null |
| | | var out: FileOutputStream? = null |
| | | |
| | | for (i in timeSet.indices) { |
| | | val it = timeSet[i] |
| | | val dataList = |
| | | realTimeDataService.getSecondData("0d0000000001", it.first, it.second, 1, 100000).data ?: emptyList() |
| | | dataList.forEach { |
| | | if (it.lng == 0.0 && it.lat == 0.0) { |
| | | it.lng = 121.235813 |
| | | it.lat = 30.835898 |
| | | } |
| | | } |
| | | dataSet.addAll(dataList) |
| | | println() |
| | | println("[${it.first}]æ°æ®é: ${dataList.size}") |
| | | |
| | | epwModel.execute(dataList, companySOPList) |
| | | val p = epwModel.outputToExcel( |
| | | // "污ææéåæç»æ-综å-${DateUtil().DateToString(Date(), "yyyy-MM-ddHHmmss")}.xls", |
| | | // "污ææéåæç»æ-${it.first.substring(0, 10)}.xls", |
| | | "污ææéåæç»æ-ç½æ ¼å-${it.first.substring(0, 10)}.xls", |
| | | workbook, |
| | | out, |
| | | it.first.substring(0, 10), |
| | | // false |
| | | // i == timeSet.size - 1 |
| | | ) |
| | | // p?.first?.let { workbook = it } |
| | | // p?.second?.let { out = it } |
| | | } |
| | | |
| | | println(dataSet.size) |
| | | epwModel.execute(dataSet, companySOPList) |
| | | epwModel.outputToExcel("污ææéåæç»æ-综å-${DateUtil().DateToString(Date(), "yyyy-MM-ddHHmmss")}.xls", workbook, out, "综å") |
| | | } |
| | | } |