From fcefe41e05439f548a58c7e5b6aa6e58f7b80ada Mon Sep 17 00:00:00 2001 From: hcong <1050828145@qq.com> Date: 星期一, 23 十二月 2024 11:57:46 +0800 Subject: [PATCH] 1. 新增接口网格数据excel模板、网格数据excel导入 2. 接口解析网格数据抛出相关excel报错信息 3. FileExchange.kt新增excel转换到GridDataDetail列表方法 4. 新增导入excel的单元测试代码 --- src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteTelemetryServiceImpl.kt | 71 +++++++++++++++++++++++++++++++++++ 1 files changed, 71 insertions(+), 0 deletions(-) diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteTelemetryServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteTelemetryServiceImpl.kt index 60ef723..c28b246 100644 --- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteTelemetryServiceImpl.kt +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteTelemetryServiceImpl.kt @@ -1,5 +1,7 @@ package com.flightfeather.uav.lightshare.service.impl +import com.flightfeather.uav.common.exception.BizException +import com.flightfeather.uav.common.utils.FileExchange import com.flightfeather.uav.domain.entity.GridCell import com.flightfeather.uav.domain.entity.GridData import com.flightfeather.uav.domain.entity.GridDataDetail @@ -7,10 +9,17 @@ import com.flightfeather.uav.domain.repository.SatelliteGridRep import com.flightfeather.uav.lightshare.bean.AreaVo import com.flightfeather.uav.lightshare.bean.DataHead +import com.flightfeather.uav.lightshare.bean.GridDataImportResult import com.flightfeather.uav.lightshare.service.SatelliteTelemetryService import com.github.pagehelper.PageHelper import org.springframework.stereotype.Service +import org.springframework.web.multipart.MultipartFile +import java.io.ByteArrayInputStream +import java.io.File import java.time.LocalDateTime +import java.time.ZoneId +import java.util.* +import javax.servlet.http.HttpServletResponse /** * @@ -20,6 +29,7 @@ @Service class SatelliteTelemetryServiceImpl(private val satelliteGridRep: SatelliteGridRep) : SatelliteTelemetryService { + private val fileExchange = FileExchange() override fun fetchGridGroup(areaVo: AreaVo, page: Int?, perPage: Int?): Pair<DataHead, List<GridGroup?>> { val pageInfo = PageHelper.startPage<GridGroup>(page ?: 1, perPage ?: 100) val res = satelliteGridRep.fetchGridGroup(areaVo) @@ -37,4 +47,65 @@ override fun fetchGridDataDetail(dataId: Int, groupId: Int?, cellId: Int?): List<GridDataDetail?> { return satelliteGridRep.fetchGridDataDetail(dataId, groupId, cellId) } + + override fun importGridData(groupId: Int, type: Int?, dataTime: LocalDateTime?, update: Int?, file: MultipartFile): GridDataImportResult? { + val gridData = satelliteGridRep.fetchGridData(groupId, dataTime, type) + if (!file.contentType!!.startsWith("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) { + throw BizException("鏂囦欢绫诲瀷閿欒锛岃涓婁紶xlsx绫诲瀷鏂囦欢") + } + if (gridData.isNotEmpty() && update == 0) { + return GridDataImportResult(false, "鏁版嵁搴撳搴旂綉鏍肩粍鍜屾棩鏈熶笅宸插瓨鍦ㄩ仴娴嬫暟鎹�") + } + val exchangeGridDataDetails + = fileExchange.exchangeGridData(ByteArrayInputStream(file.bytes)) + val gridCellsInDB = satelliteGridRep.fetchGridCell(groupId) + val setA = gridCellsInDB.asSequence().map { it?.id ?: -1 }.toSet() + val setB = exchangeGridDataDetails.asSequence().map { it.cellId ?: -1 }.toSet() + // excel 涓己灏戠殑鐨勫崟鍏冩牸 + val onlyInA = setA - setB + // excel 涓鍑虹殑鐨勫崟鍏冩牸 + val onlyInB = setB - setA + if (onlyInA.isNotEmpty()) { + throw BizException("瀵煎叆鏁版嵁涓己灏戜互涓嬬綉鏍煎崟鍏冩牸锛�${onlyInA.joinToString(",")}") + } + if (onlyInB.isNotEmpty()) { + throw BizException("瀵煎叆鏁版嵁涓湁澶氫綑缃戞牸鍗曞厓鏍硷細${onlyInB.joinToString(",")}") + } + if (update == 1) { + exchangeGridDataDetails.forEach { + it.dataId = gridData[0]?.id + it.groupId = gridData[0]?.groupId + } + satelliteGridRep.updatePM25Batch(exchangeGridDataDetails) + return GridDataImportResult(true, "瑕嗙洊鎴愬姛") + } + val gridDataEntity = GridData() + gridDataEntity.groupId = groupId + gridDataEntity.dataTime = dataTime?.atZone(ZoneId.systemDefault())?.toInstant()?.toEpochMilli() + ?.let { Date(it) } + gridDataEntity.type = type?.toByte() + satelliteGridRep.insertGridDataAndDetail(gridDataEntity, exchangeGridDataDetails) + return GridDataImportResult(true, "瀵煎叆鎴愬姛") + } + + override fun downloadTemplate(response: HttpServletResponse): Boolean { + val fileName = "GridData-PM2.5-Template.xlsx" + val path = (Thread.currentThread().contextClassLoader?.getResource("/")?.path + ?: "src/main/resources") + "/templates/" + fileName + val file = File(path) + if (file.exists()) { + val fName = Base64.getEncoder().encodeToString(fileName.toByteArray()) + response.apply { + setHeader("Content-Disposition", "attachment;filename=$fName") + setHeader("fileName", fName) + addHeader("Access-Control-Expose-Headers", "fileName") + contentType = "application/vnd.ms-excel;charset=UTF-8" + setHeader("Pragma", "no-cache") + setHeader("Cache-Control", "no-cache") + setDateHeader("Expires", 0) + } + response.outputStream.write(file.readBytes()) + } + return true + } } \ No newline at end of file -- Gitblit v1.9.3