1. 新增获取工业企业信息接口;
2. 调整获取数据接口的结果按照时间升序排列;
3. 新增获取给定时间之后的数据的接口;
已修改6个文件
已添加8个文件
1432 ■■■■■ 文件已修改
pom.xml 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/common/utils/ExcelUtil.kt 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/common/utils/FileExchange.kt 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/entity/Company.java 915 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/mapper/CompanyMapper.kt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/service/CompanyService.kt 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/service/RealTimeDataService.kt 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/CompanyServiceImpl.kt 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/web/CompanyController.kt 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/web/RealTimeDataController.kt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/kotlin/com/flightfeather/uav/Test.kt 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/CompanyServiceImplTest.kt 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -116,35 +116,48 @@
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>
    </dependencies>
    <build>
        <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
        <testSourceDirectory>${project.basedir}/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.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>-->
            <!-- mybatis generator è‡ªåŠ¨ç”Ÿæˆä»£ç æ’ä»¶ -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
src/main/kotlin/com/flightfeather/uav/common/utils/ExcelUtil.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,157 @@
package com.flightfeather.uav.common.utils
import org.apache.poi.hssf.usermodel.HSSFWorkbook
import org.apache.poi.ss.util.CellRangeAddress
import java.time.LocalDate
import java.util.*
import kotlin.math.max
/**
 * @author riku
 * Date: 2020/6/12
 */
object ExcelUtil {
    class MyCell(
            var text: String,
            var rowSpan: Int = 1
    )
    /**
     * è‡ªåŠ¨å¤„ç†è¡Œåˆå¹¶æ•°æ®
     */
    fun write2(heads: List<String>, contents: List<Array<Any>>, workbook: HSSFWorkbook, sheetName:String) {
        val sheet = workbook.createSheet(sheetName)
        var rowIndex = 0
        if (heads.isNotEmpty()) {
            val rows = sheet.createRow(rowIndex)
            for (i in 0 until heads.size) {
                rows.createCell(i).setCellValue(heads[i])
            }
            rowIndex++
        }
        contents.forEach {
            val maxRow = getMaxRows(it)
            var rows = sheet.getRow(rowIndex) ?: sheet.createRow(rowIndex)
            val arrayMap = mutableMapOf<Int, Array<*>>()
            for (i in it.indices) {
                val cell = it[i]
                var rowspan = maxRow//合并的行的跨度
                val c =
                        if (cell is Array<*>) {
                            //当数据为数组时,需要根据最大行数重新计算该单元格的行跨度
                            arrayMap[i] = cell
                            rowspan = maxRow / if (cell.size == 0) 1 else cell.size
                            val c = cell[0]
                            if (c is MyCell) {
                                rowspan = c.rowSpan
                            }
                            if (rowspan > 1) {
                                println("合并1-1:$rowIndex;${rowIndex + rowspan - 1};$i")
                                sheet.addMergedRegion(CellRangeAddress(rowIndex, rowIndex + rowspan - 1, i, i))
                            }
                            if (cell.isEmpty()) {
                                ""
                            } else {
                                cell[0]
                            }
                        } else {
                            //当数据不是数组时,需要按最大行数合并单元格
                            if (rowspan > 1) {
                                println("合并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})")
                    }
                    is String -> {
                        rows.createCell(i).setCellValue(c)
                        println("write1-2: ${c};($rowIndex, ${i})")
                    }
                    is Double -> rows.createCell(i).setCellValue(c)
                    is Boolean -> rows.createCell(i).setCellValue(c)
                    is Date -> rows.createCell(i).setCellValue(c)
                    is Calendar -> rows.createCell(i).setCellValue(c)
                    is LocalDate -> rows.createCell(i).setCellValue(c)
                }
            }
            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
                        val c = array[i]
                        if (c is MyCell) {
                            rowspan = c.rowSpan
                        }
                        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) {
                            println("合并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})")
                            }
                            is String -> {
                                rows.createCell(map.key).setCellValue(c)
                                println("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()
    }
    private fun getMaxRows(rowArray: Array<Any>): Int {
        var maxRows = 1
        rowArray.forEach {
            if (it is Array<*>) {
                maxRows = max(it.size, maxRows)
            }
        }
        return maxRows
    }
}
src/main/kotlin/com/flightfeather/uav/common/utils/FileExchange.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,176 @@
package com.flightfeather.uav.common.utils
import com.alibaba.fastjson.JSONObject
import com.flightfeather.uav.socket.bean.AirData
import org.apache.poi.hssf.usermodel.HSSFWorkbook
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.text.SimpleDateFormat
import java.util.*
class FileExchange {
    companion object {
        private const val TMP = "65536"
        private const val SPCOND = "65548"
        private const val TUR = "65702"
        private const val DO = "65542"
        private const val PH = "65558"
        private val format = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
    }
    fun doTask() {
        //source
        val path = "E:\\工作\\金山走航\\MissionData.xls"
        val workbook = HSSFWorkbook(FileInputStream(path))
        val sheet = workbook.getSheetAt(0)
        //target
        val fileName = "无人船数据.xls"
        val filePath = "e:/$fileName"
        val out = FileOutputStream(File(filePath))
        val heads = listOf("时间", "经度", "纬度", "Temperature(°C)", "spCond(uS/cm)", "Turbidity(NTU)", "DO(mg/L)", "PH")
        val contents = mutableListOf<Array<Any>>()
        val lastRow = mutableListOf<Any>()
        for (i in 1 until sheet.lastRowNum) {
            val row = sheet.getRow(i)
            val time = row.getCell(2).numericCellValue.toLong() * 1000
            val lat = row.getCell(4).numericCellValue
            val lng = row.getCell(5).numericCellValue
            val value = row.getCell(6).stringCellValue
            val cList = mutableListOf<Any>()
            //时间
            val date = Date(time)
            val d = format.format(date)
            cList.add(d)
            //经度
            cList.add(lng)
            cList.add(lat)
            //
            val jO = JSONObject.parseObject(value)
            cList.add((jO[TMP] ?: "0").toString())
            cList.add((jO[SPCOND] ?: "0").toString())
            cList.add((jO[TUR] ?: "0").toString())
            cList.add((jO[DO] ?: "0").toString())
            cList.add((jO[PH] ?: "0").toString())
//            if (lastRow.isEmpty()) {
//                lastRow.addAll(cList)
//            } else {
//                for (i in cList.indices) {
//                    if (cList[i] == "") {
//                        cList[i] = lastRow[i]
//                    }
//                }
//                lastRow.clear()
//                lastRow.addAll(cList)
//            }
            contents.add(cList.toTypedArray())
        }
        val newWorkBook = HSSFWorkbook()
        ExcelUtil.write2(heads, contents, newWorkBook, "data")
        newWorkBook.write(out)
        newWorkBook.close()
        workbook.close()
        out.flush()
        out.close()
    }
    fun doTask2() {
        //source
        val path = "E:\\工作\\金山走航\\无人船数据-补充空白值.xls"
        val workbook = HSSFWorkbook(FileInputStream(path))
        val sheet = workbook.getSheetAt(0)
        //target
        val fileName = "无人船走航数据.xls"
        val filePath = "e:/$fileName"
        val out = FileOutputStream(File(filePath))
        val heads = listOf("id", "device_code", "latitude", "longitude", "altitude", "height", "factors", "data_time", "create_time")
        val contents = mutableListOf<Array<Any>>()
        for (i in 1..sheet.lastRowNum) {
            val row = sheet.getRow(i)
            val deviceCode = "0c"
            val latitude = row.getCell(2).numericCellValue
            val longitude = row.getCell(1).numericCellValue
            val altitude = ""
            val height = ""
            val dataTime = row.getCell(0).stringCellValue
            val createTime = dataTime
            val factorsList = mutableListOf<AirData>()
            val tmp = row.getCell(3).numericCellValue
            val spC = row.getCell(4).numericCellValue
            val tur = row.getCell(5).numericCellValue
            val dO = row.getCell(6).numericCellValue
            val ph = row.getCell(7).numericCellValue
            factorsList.apply {
                add(AirData().apply {
                    factorId = "1"
                    factorName = "TMP"
                    factorData = tmp
                    physicalQuantity = 0.0
                })
                add(AirData().apply {
                    factorId = "2"
                    factorName = "spC"
                    factorData = spC
                    physicalQuantity = 0.0
                })
                add(AirData().apply {
                    factorId = "3"
                    factorName = "tur"
                    factorData = tur
                    physicalQuantity = 0.0
                })
                add(AirData().apply {
                    factorId = "4"
                    factorName = "DO"
                    factorData = dO
                    physicalQuantity = 0.0
                })
                add(AirData().apply {
                    factorId = "5"
                    factorName = "PH"
                    factorData = ph
                    physicalQuantity = 0.0
                })
            }
            val factors = JSONObject.toJSON(factorsList).toString()
            val cList = mutableListOf<Any>()
            cList.add("")
            cList.add(deviceCode)
            cList.add(latitude)
            cList.add(longitude)
            cList.add(altitude)
            cList.add(height)
            cList.add(factors)
            cList.add(dataTime)
            cList.add(createTime)
            contents.add(cList.toTypedArray())
        }
        val newWorkBook = HSSFWorkbook()
        ExcelUtil.write2(heads, contents, newWorkBook, "data")
        newWorkBook.write(out)
        newWorkBook.close()
        workbook.close()
        out.flush()
        out.close()
    }
}
src/main/kotlin/com/flightfeather/uav/domain/entity/Company.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,915 @@
package com.flightfeather.uav.domain.entity;
import com.fasterxml.jackson.annotation.JsonInclude;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import java.math.BigDecimal;
import java.util.Date;
@Table(name = "ea_companyinfo")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Company {
    @Id
    @Column(name = "CI_GUID")
    private String ciGuid;
    /**
     * å•位名称
     */
    @Column(name = "CI_Name")
    private String ciName;
    /**
     * ä¸»è¦ä»Žäº‹ä¸šåŠ¡
     */
    @Column(name = "CI_Main_Business")
    private String ciMainBusiness;
    /**
     * æ‰€å±žé›†å›¢
     */
    @Column(name = "CI_Member_Group")
    private String ciMemberGroup;
    /**
     * çœä»½ç¼–码
     */
    @Column(name = "CI_Province_Code")
    private String ciProvinceCode;
    /**
     * çœä»½åç§°
     */
    @Column(name = "CI_Province_Name")
    private String ciProvinceName;
    /**
     * åœ°å¸‚编码
     */
    @Column(name = "CI_City_Code")
    private String ciCityCode;
    /**
     * åœ°å¸‚名称
     */
    @Column(name = "CI_City_Name")
    private String ciCityName;
    /**
     * åŒºåŽ¿ç¼–å·
     */
    @Column(name = "CI_District_Code")
    private String ciDistrictCode;
    /**
     * åŒºåŽ¿åç§°
     */
    @Column(name = "CI_District_Name")
    private String ciDistrictName;
    /**
     * è¡—镇编码
     */
    @Column(name = "CI_Town_Code")
    private String ciTownCode;
    /**
     * è¡—镇名称
     */
    @Column(name = "CI_Town_Name")
    private String ciTownName;
    /**
     * æ‰€åœ¨å·¥ä¸šåŒº
     */
    @Column(name = "CI_Ind_District")
    private String ciIndDistrict;
    /**
     * å•位地址
     */
    @Column(name = "CI_Address")
    private String ciAddress;
    /**
     * ä¸­å¿ƒç»åº¦
     */
    @Column(name = "CI_Longitude")
    private BigDecimal ciLongitude;
    /**
     * ä¸­å¿ƒçº¬åº¦
     */
    @Column(name = "CI_Latitude")
    private BigDecimal ciLatitude;
    /**
     * ç»„织机构代码
     */
    @Column(name = "CI_Org_Code")
    private String ciOrgCode;
    /**
     * æ³•人
     */
    @Column(name = "CI_Juridical_Person")
    private String ciJuridicalPerson;
    /**
     * è¡Œä¸šç±»åˆ«
     */
    @Column(name = "CI_Ind_Classification")
    private String ciIndClassification;
    /**
     * è¡Œä¸šä»£ç 
     */
    @Column(name = "CI_Industry_Code")
    private String ciIndustryCode;
    /**
     * ç™»è®°æ³¨å†Œç±»åž‹
     */
    @Column(name = "CI_Registration_Type")
    private String ciRegistrationType;
    /**
     * æ³¨å†Œèµ„本(万元)
     */
    @Column(name = "CI_Registered_Capital")
    private Integer ciRegisteredCapital;
    /**
     * å»ºåŽ‚å¹´æœˆ
     */
    @Column(name = "CI_Build_Date")
    private Date ciBuildDate;
    /**
     * æœ€æ–°æ”¹æ‰©å»ºå¹´æœˆ
     */
    @Column(name = "CI_Expansion_Date")
    private Date ciExpansionDate;
    /**
     * èŒå·¥äººæ•°
     */
    @Column(name = "CI_Workers_Number")
    private Integer ciWorkersNumber;
    /**
     * ä¼ä¸šè§„模
     */
    @Column(name = "CI_Scale")
    private Byte ciScale;
    /**
     * åŽ†æ¬¡çŽ¯è¯„å®¡æ‰¹å¹´æœˆ
     */
    @Column(name = "CI_Eia_Approval_Date")
    private String ciEiaApprovalDate;
    /**
     * æŽ’污许可证编号
     */
    @Column(name = "CI_Plt_Permit_Code")
    private String ciPltPermitCode;
    /**
     * æŽ’污权交易文件
     */
    @Column(name = "CI_Trading_Files")
    private String ciTradingFiles;
    /**
     * é‚®æ”¿ç¼–码
     */
    @Column(name = "CI_Postal_Code")
    private String ciPostalCode;
    /**
     * è”系人姓名
     */
    @Column(name = "CI_Contact_Name")
    private String ciContactName;
    /**
     * è”系电话
     */
    @Column(name = "CI_Telephone")
    private String ciTelephone;
    /**
     * è”系微信号
     */
    @Column(name = "CI_Contacts_WX")
    private String ciContactsWx;
    /**
     * ä¼ çœŸ
     */
    @Column(name = "CI_Fax")
    private String ciFax;
    /**
     * ç”µå­é‚®ç®±
     */
    @Column(name = "CI_Email")
    private String ciEmail;
    @Column(name = "CI_Extension1")
    private String ciExtension1;
    @Column(name = "CI_Extension2")
    private String ciExtension2;
    @Column(name = "CI_Extension3")
    private String ciExtension3;
    @Column(name = "CI_Remark")
    private String ciRemark;
    /**
     * @return CI_GUID
     */
    public String getCiGuid() {
        return ciGuid;
    }
    /**
     * @param ciGuid
     */
    public void setCiGuid(String ciGuid) {
        this.ciGuid = ciGuid == null ? null : ciGuid.trim();
    }
    /**
     * èŽ·å–å•ä½åç§°
     *
     * @return CI_Name - å•位名称
     */
    public String getCiName() {
        return ciName;
    }
    /**
     * è®¾ç½®å•位名称
     *
     * @param ciName å•位名称
     */
    public void setCiName(String ciName) {
        this.ciName = ciName == null ? null : ciName.trim();
    }
    /**
     * èŽ·å–ä¸»è¦ä»Žäº‹ä¸šåŠ¡
     *
     * @return CI_Main_Business - ä¸»è¦ä»Žäº‹ä¸šåŠ¡
     */
    public String getCiMainBusiness() {
        return ciMainBusiness;
    }
    /**
     * è®¾ç½®ä¸»è¦ä»Žäº‹ä¸šåŠ¡
     *
     * @param ciMainBusiness ä¸»è¦ä»Žäº‹ä¸šåŠ¡
     */
    public void setCiMainBusiness(String ciMainBusiness) {
        this.ciMainBusiness = ciMainBusiness == null ? null : ciMainBusiness.trim();
    }
    /**
     * èŽ·å–æ‰€å±žé›†å›¢
     *
     * @return CI_Member_Group - æ‰€å±žé›†å›¢
     */
    public String getCiMemberGroup() {
        return ciMemberGroup;
    }
    /**
     * è®¾ç½®æ‰€å±žé›†å›¢
     *
     * @param ciMemberGroup æ‰€å±žé›†å›¢
     */
    public void setCiMemberGroup(String ciMemberGroup) {
        this.ciMemberGroup = ciMemberGroup == null ? null : ciMemberGroup.trim();
    }
    /**
     * èŽ·å–çœä»½ç¼–ç 
     *
     * @return CI_Province_Code - çœä»½ç¼–码
     */
    public String getCiProvinceCode() {
        return ciProvinceCode;
    }
    /**
     * è®¾ç½®çœä»½ç¼–码
     *
     * @param ciProvinceCode çœä»½ç¼–码
     */
    public void setCiProvinceCode(String ciProvinceCode) {
        this.ciProvinceCode = ciProvinceCode == null ? null : ciProvinceCode.trim();
    }
    /**
     * èŽ·å–çœä»½åç§°
     *
     * @return CI_Province_Name - çœä»½åç§°
     */
    public String getCiProvinceName() {
        return ciProvinceName;
    }
    /**
     * è®¾ç½®çœä»½åç§°
     *
     * @param ciProvinceName çœä»½åç§°
     */
    public void setCiProvinceName(String ciProvinceName) {
        this.ciProvinceName = ciProvinceName == null ? null : ciProvinceName.trim();
    }
    /**
     * èŽ·å–åœ°å¸‚ç¼–ç 
     *
     * @return CI_City_Code - åœ°å¸‚编码
     */
    public String getCiCityCode() {
        return ciCityCode;
    }
    /**
     * è®¾ç½®åœ°å¸‚编码
     *
     * @param ciCityCode åœ°å¸‚编码
     */
    public void setCiCityCode(String ciCityCode) {
        this.ciCityCode = ciCityCode == null ? null : ciCityCode.trim();
    }
    /**
     * èŽ·å–åœ°å¸‚åç§°
     *
     * @return CI_City_Name - åœ°å¸‚名称
     */
    public String getCiCityName() {
        return ciCityName;
    }
    /**
     * è®¾ç½®åœ°å¸‚名称
     *
     * @param ciCityName åœ°å¸‚名称
     */
    public void setCiCityName(String ciCityName) {
        this.ciCityName = ciCityName == null ? null : ciCityName.trim();
    }
    /**
     * èŽ·å–åŒºåŽ¿ç¼–å·
     *
     * @return CI_District_Code - åŒºåŽ¿ç¼–å·
     */
    public String getCiDistrictCode() {
        return ciDistrictCode;
    }
    /**
     * è®¾ç½®åŒºåŽ¿ç¼–å·
     *
     * @param ciDistrictCode åŒºåŽ¿ç¼–å·
     */
    public void setCiDistrictCode(String ciDistrictCode) {
        this.ciDistrictCode = ciDistrictCode == null ? null : ciDistrictCode.trim();
    }
    /**
     * èŽ·å–åŒºåŽ¿åç§°
     *
     * @return CI_District_Name - åŒºåŽ¿åç§°
     */
    public String getCiDistrictName() {
        return ciDistrictName;
    }
    /**
     * è®¾ç½®åŒºåŽ¿åç§°
     *
     * @param ciDistrictName åŒºåŽ¿åç§°
     */
    public void setCiDistrictName(String ciDistrictName) {
        this.ciDistrictName = ciDistrictName == null ? null : ciDistrictName.trim();
    }
    /**
     * èŽ·å–è¡—é•‡ç¼–ç 
     *
     * @return CI_Town_Code - è¡—镇编码
     */
    public String getCiTownCode() {
        return ciTownCode;
    }
    /**
     * è®¾ç½®è¡—镇编码
     *
     * @param ciTownCode è¡—镇编码
     */
    public void setCiTownCode(String ciTownCode) {
        this.ciTownCode = ciTownCode == null ? null : ciTownCode.trim();
    }
    /**
     * èŽ·å–è¡—é•‡åç§°
     *
     * @return CI_Town_Name - è¡—镇名称
     */
    public String getCiTownName() {
        return ciTownName;
    }
    /**
     * è®¾ç½®è¡—镇名称
     *
     * @param ciTownName è¡—镇名称
     */
    public void setCiTownName(String ciTownName) {
        this.ciTownName = ciTownName == null ? null : ciTownName.trim();
    }
    /**
     * èŽ·å–æ‰€åœ¨å·¥ä¸šåŒº
     *
     * @return CI_Ind_District - æ‰€åœ¨å·¥ä¸šåŒº
     */
    public String getCiIndDistrict() {
        return ciIndDistrict;
    }
    /**
     * è®¾ç½®æ‰€åœ¨å·¥ä¸šåŒº
     *
     * @param ciIndDistrict æ‰€åœ¨å·¥ä¸šåŒº
     */
    public void setCiIndDistrict(String ciIndDistrict) {
        this.ciIndDistrict = ciIndDistrict == null ? null : ciIndDistrict.trim();
    }
    /**
     * èŽ·å–å•ä½åœ°å€
     *
     * @return CI_Address - å•位地址
     */
    public String getCiAddress() {
        return ciAddress;
    }
    /**
     * è®¾ç½®å•位地址
     *
     * @param ciAddress å•位地址
     */
    public void setCiAddress(String ciAddress) {
        this.ciAddress = ciAddress == null ? null : ciAddress.trim();
    }
    /**
     * èŽ·å–ä¸­å¿ƒç»åº¦
     *
     * @return CI_Longitude - ä¸­å¿ƒç»åº¦
     */
    public BigDecimal getCiLongitude() {
        return ciLongitude;
    }
    /**
     * è®¾ç½®ä¸­å¿ƒç»åº¦
     *
     * @param ciLongitude ä¸­å¿ƒç»åº¦
     */
    public void setCiLongitude(BigDecimal ciLongitude) {
        this.ciLongitude = ciLongitude;
    }
    /**
     * èŽ·å–ä¸­å¿ƒçº¬åº¦
     *
     * @return CI_Latitude - ä¸­å¿ƒçº¬åº¦
     */
    public BigDecimal getCiLatitude() {
        return ciLatitude;
    }
    /**
     * è®¾ç½®ä¸­å¿ƒçº¬åº¦
     *
     * @param ciLatitude ä¸­å¿ƒçº¬åº¦
     */
    public void setCiLatitude(BigDecimal ciLatitude) {
        this.ciLatitude = ciLatitude;
    }
    /**
     * èŽ·å–ç»„ç»‡æœºæž„ä»£ç 
     *
     * @return CI_Org_Code - ç»„织机构代码
     */
    public String getCiOrgCode() {
        return ciOrgCode;
    }
    /**
     * è®¾ç½®ç»„织机构代码
     *
     * @param ciOrgCode ç»„织机构代码
     */
    public void setCiOrgCode(String ciOrgCode) {
        this.ciOrgCode = ciOrgCode == null ? null : ciOrgCode.trim();
    }
    /**
     * èŽ·å–æ³•äºº
     *
     * @return CI_Juridical_Person - æ³•人
     */
    public String getCiJuridicalPerson() {
        return ciJuridicalPerson;
    }
    /**
     * è®¾ç½®æ³•人
     *
     * @param ciJuridicalPerson æ³•人
     */
    public void setCiJuridicalPerson(String ciJuridicalPerson) {
        this.ciJuridicalPerson = ciJuridicalPerson == null ? null : ciJuridicalPerson.trim();
    }
    /**
     * èŽ·å–è¡Œä¸šç±»åˆ«
     *
     * @return CI_Ind_Classification - è¡Œä¸šç±»åˆ«
     */
    public String getCiIndClassification() {
        return ciIndClassification;
    }
    /**
     * è®¾ç½®è¡Œä¸šç±»åˆ«
     *
     * @param ciIndClassification è¡Œä¸šç±»åˆ«
     */
    public void setCiIndClassification(String ciIndClassification) {
        this.ciIndClassification = ciIndClassification == null ? null : ciIndClassification.trim();
    }
    /**
     * èŽ·å–è¡Œä¸šä»£ç 
     *
     * @return CI_Industry_Code - è¡Œä¸šä»£ç 
     */
    public String getCiIndustryCode() {
        return ciIndustryCode;
    }
    /**
     * è®¾ç½®è¡Œä¸šä»£ç 
     *
     * @param ciIndustryCode è¡Œä¸šä»£ç 
     */
    public void setCiIndustryCode(String ciIndustryCode) {
        this.ciIndustryCode = ciIndustryCode == null ? null : ciIndustryCode.trim();
    }
    /**
     * èŽ·å–ç™»è®°æ³¨å†Œç±»åž‹
     *
     * @return CI_Registration_Type - ç™»è®°æ³¨å†Œç±»åž‹
     */
    public String getCiRegistrationType() {
        return ciRegistrationType;
    }
    /**
     * è®¾ç½®ç™»è®°æ³¨å†Œç±»åž‹
     *
     * @param ciRegistrationType ç™»è®°æ³¨å†Œç±»åž‹
     */
    public void setCiRegistrationType(String ciRegistrationType) {
        this.ciRegistrationType = ciRegistrationType == null ? null : ciRegistrationType.trim();
    }
    /**
     * èŽ·å–æ³¨å†Œèµ„æœ¬ï¼ˆä¸‡å…ƒï¼‰
     *
     * @return CI_Registered_Capital - æ³¨å†Œèµ„本(万元)
     */
    public Integer getCiRegisteredCapital() {
        return ciRegisteredCapital;
    }
    /**
     * è®¾ç½®æ³¨å†Œèµ„本(万元)
     *
     * @param ciRegisteredCapital æ³¨å†Œèµ„本(万元)
     */
    public void setCiRegisteredCapital(Integer ciRegisteredCapital) {
        this.ciRegisteredCapital = ciRegisteredCapital;
    }
    /**
     * èŽ·å–å»ºåŽ‚å¹´æœˆ
     *
     * @return CI_Build_Date - å»ºåŽ‚å¹´æœˆ
     */
    public Date getCiBuildDate() {
        return ciBuildDate;
    }
    /**
     * è®¾ç½®å»ºåŽ‚å¹´æœˆ
     *
     * @param ciBuildDate å»ºåŽ‚å¹´æœˆ
     */
    public void setCiBuildDate(Date ciBuildDate) {
        this.ciBuildDate = ciBuildDate;
    }
    /**
     * èŽ·å–æœ€æ–°æ”¹æ‰©å»ºå¹´æœˆ
     *
     * @return CI_Expansion_Date - æœ€æ–°æ”¹æ‰©å»ºå¹´æœˆ
     */
    public Date getCiExpansionDate() {
        return ciExpansionDate;
    }
    /**
     * è®¾ç½®æœ€æ–°æ”¹æ‰©å»ºå¹´æœˆ
     *
     * @param ciExpansionDate æœ€æ–°æ”¹æ‰©å»ºå¹´æœˆ
     */
    public void setCiExpansionDate(Date ciExpansionDate) {
        this.ciExpansionDate = ciExpansionDate;
    }
    /**
     * èŽ·å–èŒå·¥äººæ•°
     *
     * @return CI_Workers_Number - èŒå·¥äººæ•°
     */
    public Integer getCiWorkersNumber() {
        return ciWorkersNumber;
    }
    /**
     * è®¾ç½®èŒå·¥äººæ•°
     *
     * @param ciWorkersNumber èŒå·¥äººæ•°
     */
    public void setCiWorkersNumber(Integer ciWorkersNumber) {
        this.ciWorkersNumber = ciWorkersNumber;
    }
    /**
     * èŽ·å–ä¼ä¸šè§„æ¨¡
     *
     * @return CI_Scale - ä¼ä¸šè§„模
     */
    public Byte getCiScale() {
        return ciScale;
    }
    /**
     * è®¾ç½®ä¼ä¸šè§„模
     *
     * @param ciScale ä¼ä¸šè§„模
     */
    public void setCiScale(Byte ciScale) {
        this.ciScale = ciScale;
    }
    /**
     * èŽ·å–åŽ†æ¬¡çŽ¯è¯„å®¡æ‰¹å¹´æœˆ
     *
     * @return CI_Eia_Approval_Date - åŽ†æ¬¡çŽ¯è¯„å®¡æ‰¹å¹´æœˆ
     */
    public String getCiEiaApprovalDate() {
        return ciEiaApprovalDate;
    }
    /**
     * è®¾ç½®åŽ†æ¬¡çŽ¯è¯„å®¡æ‰¹å¹´æœˆ
     *
     * @param ciEiaApprovalDate åŽ†æ¬¡çŽ¯è¯„å®¡æ‰¹å¹´æœˆ
     */
    public void setCiEiaApprovalDate(String ciEiaApprovalDate) {
        this.ciEiaApprovalDate = ciEiaApprovalDate == null ? null : ciEiaApprovalDate.trim();
    }
    /**
     * èŽ·å–æŽ’æ±¡è®¸å¯è¯ç¼–å·
     *
     * @return CI_Plt_Permit_Code - æŽ’污许可证编号
     */
    public String getCiPltPermitCode() {
        return ciPltPermitCode;
    }
    /**
     * è®¾ç½®æŽ’污许可证编号
     *
     * @param ciPltPermitCode æŽ’污许可证编号
     */
    public void setCiPltPermitCode(String ciPltPermitCode) {
        this.ciPltPermitCode = ciPltPermitCode == null ? null : ciPltPermitCode.trim();
    }
    /**
     * èŽ·å–æŽ’æ±¡æƒäº¤æ˜“æ–‡ä»¶
     *
     * @return CI_Trading_Files - æŽ’污权交易文件
     */
    public String getCiTradingFiles() {
        return ciTradingFiles;
    }
    /**
     * è®¾ç½®æŽ’污权交易文件
     *
     * @param ciTradingFiles æŽ’污权交易文件
     */
    public void setCiTradingFiles(String ciTradingFiles) {
        this.ciTradingFiles = ciTradingFiles == null ? null : ciTradingFiles.trim();
    }
    /**
     * èŽ·å–é‚®æ”¿ç¼–ç 
     *
     * @return CI_Postal_Code - é‚®æ”¿ç¼–码
     */
    public String getCiPostalCode() {
        return ciPostalCode;
    }
    /**
     * è®¾ç½®é‚®æ”¿ç¼–码
     *
     * @param ciPostalCode é‚®æ”¿ç¼–码
     */
    public void setCiPostalCode(String ciPostalCode) {
        this.ciPostalCode = ciPostalCode == null ? null : ciPostalCode.trim();
    }
    /**
     * èŽ·å–è”ç³»äººå§“å
     *
     * @return CI_Contact_Name - è”系人姓名
     */
    public String getCiContactName() {
        return ciContactName;
    }
    /**
     * è®¾ç½®è”系人姓名
     *
     * @param ciContactName è”系人姓名
     */
    public void setCiContactName(String ciContactName) {
        this.ciContactName = ciContactName == null ? null : ciContactName.trim();
    }
    /**
     * èŽ·å–è”ç³»ç”µè¯
     *
     * @return CI_Telephone - è”系电话
     */
    public String getCiTelephone() {
        return ciTelephone;
    }
    /**
     * è®¾ç½®è”系电话
     *
     * @param ciTelephone è”系电话
     */
    public void setCiTelephone(String ciTelephone) {
        this.ciTelephone = ciTelephone == null ? null : ciTelephone.trim();
    }
    /**
     * èŽ·å–è”ç³»å¾®ä¿¡å·
     *
     * @return CI_Contacts_WX - è”系微信号
     */
    public String getCiContactsWx() {
        return ciContactsWx;
    }
    /**
     * è®¾ç½®è”系微信号
     *
     * @param ciContactsWx è”系微信号
     */
    public void setCiContactsWx(String ciContactsWx) {
        this.ciContactsWx = ciContactsWx == null ? null : ciContactsWx.trim();
    }
    /**
     * èŽ·å–ä¼ çœŸ
     *
     * @return CI_Fax - ä¼ çœŸ
     */
    public String getCiFax() {
        return ciFax;
    }
    /**
     * è®¾ç½®ä¼ çœŸ
     *
     * @param ciFax ä¼ çœŸ
     */
    public void setCiFax(String ciFax) {
        this.ciFax = ciFax == null ? null : ciFax.trim();
    }
    /**
     * èŽ·å–ç”µå­é‚®ç®±
     *
     * @return CI_Email - ç”µå­é‚®ç®±
     */
    public String getCiEmail() {
        return ciEmail;
    }
    /**
     * è®¾ç½®ç”µå­é‚®ç®±
     *
     * @param ciEmail ç”µå­é‚®ç®±
     */
    public void setCiEmail(String ciEmail) {
        this.ciEmail = ciEmail == null ? null : ciEmail.trim();
    }
    /**
     * @return CI_Extension1
     */
    public String getCiExtension1() {
        return ciExtension1;
    }
    /**
     * @param ciExtension1
     */
    public void setCiExtension1(String ciExtension1) {
        this.ciExtension1 = ciExtension1 == null ? null : ciExtension1.trim();
    }
    /**
     * @return CI_Extension2
     */
    public String getCiExtension2() {
        return ciExtension2;
    }
    /**
     * @param ciExtension2
     */
    public void setCiExtension2(String ciExtension2) {
        this.ciExtension2 = ciExtension2 == null ? null : ciExtension2.trim();
    }
    /**
     * @return CI_Extension3
     */
    public String getCiExtension3() {
        return ciExtension3;
    }
    /**
     * @param ciExtension3
     */
    public void setCiExtension3(String ciExtension3) {
        this.ciExtension3 = ciExtension3 == null ? null : ciExtension3.trim();
    }
    /**
     * @return CI_Remark
     */
    public String getCiRemark() {
        return ciRemark;
    }
    /**
     * @param ciRemark
     */
    public void setCiRemark(String ciRemark) {
        this.ciRemark = ciRemark == null ? null : ciRemark.trim();
    }
}
src/main/kotlin/com/flightfeather/uav/domain/mapper/CompanyMapper.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
package com.flightfeather.uav.domain.mapper
import com.flightfeather.uav.domain.MyMapper
import com.flightfeather.uav.domain.entity.Company
import org.apache.ibatis.annotations.Mapper
@Mapper
interface CompanyMapper : MyMapper<Company>
src/main/kotlin/com/flightfeather/uav/lightshare/service/CompanyService.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.flightfeather.uav.lightshare.service
import com.flightfeather.uav.domain.entity.Company
import com.flightfeather.uav.lightshare.bean.BaseResponse
import com.flightfeather.uav.lightshare.bean.DataVo
interface CompanyService {
    fun getCompanyInfo(): BaseResponse<List<Company>>
}
src/main/kotlin/com/flightfeather/uav/lightshare/service/RealTimeDataService.kt
@@ -6,4 +6,6 @@
interface RealTimeDataService {
    fun getSecondData(deviceCode: String?, startTime: String?, endTime: String?, page: Int?, perPage: Int?): BaseResponse<List<DataVo>>
    fun getNextData(deviceCode: String, updateTime: String, page: Int?, perPage: Int?): BaseResponse<List<DataVo>>
}
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/CompanyServiceImpl.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.flightfeather.uav.lightshare.service.impl
import com.flightfeather.uav.domain.entity.Company
import com.flightfeather.uav.domain.mapper.CompanyMapper
import com.flightfeather.uav.lightshare.bean.BaseResponse
import com.flightfeather.uav.lightshare.service.CompanyService
import org.springframework.stereotype.Service
import tk.mybatis.mapper.entity.Example
@Service
class CompanyServiceImpl(private val companyMapper: CompanyMapper) : CompanyService {
    override fun getCompanyInfo(): BaseResponse<List<Company>> {
        val result = companyMapper.selectAll()
        return BaseResponse(true, data = result)
    }
}
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt
@@ -32,7 +32,12 @@
                sTime?.let { andGreaterThanOrEqualTo("dataTime", it) }
                eTime?.let { andLessThanOrEqualTo("dataTime", it) }
            }
            orderBy("dataTime").desc()
            orderBy("dataTime").apply {
                // å½“请求接口不传递起始时间,默认获取最新的数据
                if (startTime == null && endTime == null) {
                    desc()
                }
            }
        }).forEach {
            result.add(DataVo(
                    dateFormatter.format(it.dataTime),
@@ -41,7 +46,29 @@
                    it.longitude.toDouble(), it.latitude.toDouble()
            ))
        }
//        result.reverse()
        if (startTime == null && endTime == null) {
            result.reverse()
        }
        return BaseResponse(true, head = DataHead(pageInfo.pageNum, pageInfo.pages), data = result)
    }
    override fun getNextData(deviceCode: String, updateTime: String, page: Int?, perPage: Int?): BaseResponse<List<DataVo>> {
        val _perPage = perPage ?: 60
        val _page = page ?: 1
        val pageInfo = PageHelper.startPage<RealTimeData>(_page, _perPage)
        val result = mutableListOf<DataVo>()
        realTimeDataMapper.selectByExample(Example(RealTimeData::class.java).apply {
            createCriteria().andEqualTo("deviceCode", deviceCode)
                .andGreaterThan("dataTime", updateTime)
            orderBy("dataTime")
        }).forEach {
            result.add(DataVo(
                dateFormatter.format(it.dataTime),
                it.deviceCode,
                GsonUtils.parserJsonToArrayBeans(it.factors, AirData::class.java),
                it.longitude.toDouble(), it.latitude.toDouble()
            ))
        }
        return BaseResponse(true, head = DataHead(pageInfo.pageNum, pageInfo.pages), data = result)
    }
}
src/main/kotlin/com/flightfeather/uav/lightshare/web/CompanyController.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.flightfeather.uav.lightshare.web
import com.flightfeather.uav.lightshare.service.CompanyService
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("air/company")
class CompanyController(private val companyService: CompanyService) {
    @GetMapping("/info")
    fun getCompanyInfo() = companyService.getCompanyInfo()
}
src/main/kotlin/com/flightfeather/uav/lightshare/web/RealTimeDataController.kt
@@ -18,4 +18,12 @@
            @RequestParam(value = "page", required = false) page: Int?,
            @RequestParam(value = "perPage", required = false) perPage: Int?
    ) = realTimeDataService.getSecondData(deviceCode, startTime, endTime, page, perPage)
    @GetMapping("/sec/next")
    fun getNextData(
        @RequestParam(value = "deviceCode") deviceCode: String,
        @RequestParam(value = "updateTime") updateTime: String,
        @RequestParam(value = "page", required = false) page: Int?,
        @RequestParam(value = "perPage", required = false) perPage: Int?
    ) = realTimeDataService.getNextData(deviceCode, updateTime, page, perPage)
}
src/main/resources/application.yml
@@ -1,9 +1,9 @@
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
#    url: jdbc:mysql://47.100.191.150:3306/uav?serverTimezone=Asia/Shanghai&prepStmtCacheSize=517&cachePrepStmts=true&autoReconnect=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
#    username: uav
#    password: obd2019
#    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
src/test/kotlin/com/flightfeather/uav/Test.kt
@@ -1,5 +1,6 @@
package com.flightfeather.uav
import com.flightfeather.uav.common.utils.FileExchange
import com.flightfeather.uav.socket.bean.DataUnit
import com.flightfeather.uav.socket.decoder.AirDataDecoder
import com.flightfeather.uav.socket.eunm.AirCommandUnit
@@ -41,4 +42,9 @@
        out.flush()
        out.close()
    }
    @Test
    fun dataChange() {
        FileExchange().doTask2()
    }
}
src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/CompanyServiceImplTest.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.flightfeather.uav.lightshare.service.impl
import com.flightfeather.uav.lightshare.service.CompanyService
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
@RunWith(SpringRunner::class)
@SpringBootTest
class CompanyServiceImplTest {
    @Autowired
    lateinit var companyService: CompanyService
    @Test
    fun getCompanyInfo() {
        val r = companyService.getCompanyInfo()
        println(r)
    }
}