| | |
| | | import com.flightfeather.uav.common.utils.ExcelUtil |
| | | import com.flightfeather.uav.common.utils.FileExchange |
| | | import com.flightfeather.uav.common.utils.GsonUtils |
| | | import com.flightfeather.uav.domain.entity.RealTimeData |
| | | import com.flightfeather.uav.domain.entity.toRowContent |
| | | import com.flightfeather.uav.domain.entity.toRowTitle |
| | | import com.flightfeather.uav.domain.entity.* |
| | | import com.flightfeather.uav.domain.mapper.RealTimeDataGridMapper |
| | | import com.flightfeather.uav.domain.mapper.RealTimeDataMapper |
| | | import com.flightfeather.uav.domain.mapper.RealTimeDataUavMapper |
| | | import com.flightfeather.uav.domain.mapper.RealTimeDataVehicleMapper |
| | | import com.flightfeather.uav.lightshare.bean.* |
| | | import com.flightfeather.uav.lightshare.service.RealTimeDataService |
| | | import com.flightfeather.uav.model.epw.EPWDataPrep |
| | | import com.flightfeather.uav.repository.AirDataRepository |
| | | import com.flightfeather.uav.socket.bean.AirData |
| | | import com.flightfeather.uav.socket.eunm.UWDeviceType |
| | | import com.github.pagehelper.PageHelper |
| | | import org.apache.poi.xssf.streaming.SXSSFWorkbook |
| | | import org.springframework.stereotype.Service |
| | |
| | | import javax.servlet.http.HttpServletResponse |
| | | |
| | | @Service |
| | | class RealTimeDataServiceImpl(val realTimeDataMapper: RealTimeDataMapper) : RealTimeDataService { |
| | | class RealTimeDataServiceImpl( |
| | | private val realTimeDataMapper: RealTimeDataMapper, |
| | | private val airDataRepository: AirDataRepository, |
| | | private val realTimeDataVehicleMapper: RealTimeDataVehicleMapper, |
| | | private val realTimeDataUavMapper: RealTimeDataUavMapper, |
| | | private val realTimeDataGridMapper: RealTimeDataGridMapper |
| | | ) : RealTimeDataService { |
| | | |
| | | private var dateFormatter = SimpleDateFormat("yyyy-MM-dd HH:mm:ss") |
| | | private val fileExchange = FileExchange() |
| | |
| | | val eTime = endTime?.let { dateFormatter.parse(it) } |
| | | val pageInfo = PageHelper.startPage<RealTimeData>(_page, _perPage) |
| | | val result = mutableListOf<DataVo>() |
| | | realTimeDataMapper.selectByExample(Example(RealTimeData::class.java).apply { |
| | | createCriteria().apply { |
| | | deviceCode?.let { andEqualTo("deviceCode", it) } |
| | | sTime?.let { andGreaterThanOrEqualTo("dataTime", it) } |
| | | eTime?.let { andLessThanOrEqualTo("dataTime", it) } |
| | | |
| | | when (UWDeviceType.getType(deviceCode)) { |
| | | UWDeviceType.VEHICLE -> { |
| | | realTimeDataVehicleMapper.selectByExample(Example(RealTimeDataVehicle::class.java).apply { |
| | | getSecondDataExample(this, deviceCode, sTime, eTime) |
| | | }).forEach { result.add(it.toDataVo()) } |
| | | } |
| | | orderBy("dataTime").apply { |
| | | // 当请求接口不传递起始时间,默认获取最新的数据 |
| | | if (startTime == null && endTime == null) { |
| | | desc() |
| | | UWDeviceType.UAV -> { |
| | | realTimeDataUavMapper.selectByExample(Example(RealTimeDataUav::class.java).apply { |
| | | getSecondDataExample(this, deviceCode, sTime, eTime) |
| | | }).forEach { result.add(it.toDataVo()) } |
| | | } |
| | | UWDeviceType.GRID -> { |
| | | realTimeDataGridMapper.selectByExample(Example(RealTimeDataGrid::class.java).apply { |
| | | getSecondDataExample(this, deviceCode, sTime, eTime) |
| | | }).forEach { result.add(it.toDataVo()) } |
| | | } |
| | | else -> { |
| | | // 从原始数据表中获取数据 |
| | | realTimeDataMapper.selectByExample(Example(RealTimeData::class.java).apply { |
| | | getSecondDataExample(this, deviceCode, sTime, eTime) |
| | | }).forEach { |
| | | if (it.longitude == null || it.latitude == null) { |
| | | return@forEach |
| | | } |
| | | result.add(it.toDataVo()) |
| | | } |
| | | } |
| | | }).forEach { |
| | | if (it.longitude == null || it.latitude == null) { |
| | | return@forEach |
| | | } |
| | | result.add(DataVo( |
| | | dateFormatter.format(it.dataTime), |
| | | it.deviceCode, |
| | | GsonUtils.parserJsonToArrayBeans(it.factors, AirData::class.java), |
| | | it.longitude?.toDouble(), it.latitude?.toDouble() |
| | | )) |
| | | } |
| | | |
| | | if (startTime == null && endTime == null) { |
| | | result.reverse() |
| | | } |
| | | return BaseResponse(true, head = DataHead(pageInfo.pageNum, pageInfo.pages), data = result) |
| | | } |
| | | |
| | | private fun getSecondDataExample(example: Example, deviceCode: String?, sTime: Date?, eTime: Date?) { |
| | | example.createCriteria().apply { |
| | | deviceCode?.let { andEqualTo("deviceCode", it) } |
| | | sTime?.let { andGreaterThanOrEqualTo("dataTime", it) } |
| | | eTime?.let { andLessThanOrEqualTo("dataTime", it) } |
| | | } |
| | | example.orderBy("dataTime").apply { |
| | | // 当请求接口不传递起始时间,默认获取最新的数据 |
| | | if (sTime == null && eTime == null) { |
| | | desc() |
| | | } |
| | | } |
| | | } |
| | | |
| | | override fun getNextData(deviceCode: String, updateTime: String, page: Int?, perPage: Int?): BaseResponse<List<DataVo>> { |
| | |
| | | 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() |
| | | )) |
| | | |
| | | when (UWDeviceType.getType(deviceCode)) { |
| | | UWDeviceType.VEHICLE -> { |
| | | realTimeDataVehicleMapper.selectByExample(Example(RealTimeDataVehicle::class.java).apply { |
| | | getNextDataExample(this, deviceCode, updateTime) |
| | | }).forEach { result.add(it.toDataVo()) } |
| | | } |
| | | UWDeviceType.UAV -> { |
| | | realTimeDataUavMapper.selectByExample(Example(RealTimeDataUav::class.java).apply { |
| | | getNextDataExample(this, deviceCode, updateTime) |
| | | }).forEach { result.add(it.toDataVo()) } |
| | | } |
| | | UWDeviceType.GRID -> { |
| | | realTimeDataGridMapper.selectByExample(Example(RealTimeDataGrid::class.java).apply { |
| | | getNextDataExample(this, deviceCode, updateTime) |
| | | }).forEach { result.add(it.toDataVo()) } |
| | | } |
| | | else -> { |
| | | realTimeDataMapper.selectByExample(Example(RealTimeData::class.java).apply { |
| | | getNextDataExample(this, deviceCode, updateTime) |
| | | }).forEach { result.add(it.toDataVo()) } |
| | | } |
| | | } |
| | | return BaseResponse(true, head = DataHead(pageInfo.pageNum, pageInfo.pages), data = result) |
| | | } |
| | | |
| | | private fun getNextDataExample(example: Example, deviceCode: String, updateTime: String) { |
| | | example.createCriteria().andEqualTo("deviceCode", deviceCode) |
| | | .andGreaterThan("dataTime", updateTime) |
| | | example.orderBy("dataTime") |
| | | } |
| | | |
| | | override fun importData(file: MultipartFile): BaseResponse<DataImportResult> { |
| | |
| | | } |
| | | return contents |
| | | } |
| | | |
| | | override fun dataPreprocessing(): BaseResponse<String> { |
| | | val epwDataPrep = EPWDataPrep() |
| | | val res = getSecondData("0b0000000002", "2021-10-23 19:00:00", "2021-10-23 20:00:00", 1, 5000) |
| | | val dataList = res.data ?: emptyList() |
| | | var count = 0 |
| | | dataList.forEach { |
| | | val result = epwDataPrep.mDataPrep2(listOf(it)) |
| | | count += airDataRepository.savePrepData2(result) |
| | | println("[${it.deviceCode}]: [${it.time}]") |
| | | Thread.sleep(4000) |
| | | } |
| | | return BaseResponse(count > 0, data = "插入数据: ${count}条") |
| | | } |
| | | } |