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