From 777eeea75ffc628d024ded81f19deff78f4f42af Mon Sep 17 00:00:00 2001
From: linwei <872216696@qq.com>
Date: Thu, 08 Jan 2026 16:18:41 +0800
Subject: [PATCH] 报警记录导出

---
 drone-service/drone-fw/src/main/java/org/sxkj/fw/record/excel/FwDroneAlarmRecordExcel.java                  |   30 +
 drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneFlightRecordDetailController.java |   47 +-
 drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/LocalDateTimeConverter.java                    |   53 +++
 drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneAlarmRecordController.java        |   67 +++-
 drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/CustomCellWriteHeightConfig.java               |   49 +++
 drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/RowWriteHandler.java                           |   57 +++
 drone-service/drone-fw/src/main/java/org/sxkj/fw/record/entity/FwDroneAlarmRecordEntity.java                |    8 
 drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictConverter.java                        |   95 ++++++
 drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictItem.java                             |   25 +
 drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneAlarmRecordDTO.java                      |  106 ++++++
 drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/MySheetWriteHandler.java                       |   45 +++
 drone-common/src/main/java/org/sxkj/common/launch/LauncherServiceImpl.java                                  |    6 
 drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneFlightRecordDetailDTO.java               |   38 ++
 drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/CustomCellWriteWeightConfig.java               |   70 ++++
 drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictItemLabel.java                        |   25 +
 drone-service/drone-fw/src/main/java/org/sxkj/fw/record/entity/FwDroneFlightRecordDetailEntity.java         |    6 
 drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneFlightRecordController.java       |   75 ++--
 drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneFlightRecordDTO.java                     |   51 +++
 18 files changed, 745 insertions(+), 108 deletions(-)

diff --git a/drone-common/src/main/java/org/sxkj/common/launch/LauncherServiceImpl.java b/drone-common/src/main/java/org/sxkj/common/launch/LauncherServiceImpl.java
index b50ed96..bce7572 100644
--- a/drone-common/src/main/java/org/sxkj/common/launch/LauncherServiceImpl.java
+++ b/drone-common/src/main/java/org/sxkj/common/launch/LauncherServiceImpl.java
@@ -40,10 +40,16 @@
 		PropsUtil.setProperty(props, "spring.cloud.nacos.password", LauncherConstant.NACOS_PASSWORD);
 		PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.server-addr", LauncherConstant.nacosAddr(profile));
 		PropsUtil.setProperty(props, "spring.cloud.nacos.config.server-addr", LauncherConstant.nacosAddr(profile));
+		// 指定命名空间
+		PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.namespace", "ja-dev");
+		PropsUtil.setProperty(props, "spring.cloud.nacos.config.namespace", "ja-dev");
 		PropsUtil.setProperty(props, "spring.cloud.sentinel.transport.dashboard", LauncherConstant.sentinelAddr(profile));
 		PropsUtil.setProperty(props, "spring.zipkin.base-url", LauncherConstant.zipkinAddr(profile));
 		PropsUtil.setProperty(props, "spring.datasource.dynamic.enabled", "false");
 
+		props.setProperty("knife4j.enable", "true");
+		props.setProperty("swagger.enabled", "true");
+		props.setProperty("spring.mvc.pathmatch.matching-strategy", "ANT_PATH_MATCHER");
 		// 开启elk日志
 		// PropsUtil.setProperty(props, "blade.log.elk.destination", LauncherConstant.elkAddr(profile));
 
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneAlarmRecordController.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneAlarmRecordController.java
index de522c2..508d8e6 100644
--- a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneAlarmRecordController.java
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneAlarmRecordController.java
@@ -16,6 +16,9 @@
  */
 package org.sxkj.fw.record.controller;
 
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -27,10 +30,12 @@
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.sxkj.fw.record.dto.FwDroneAlarmRecordDTO;
 import org.sxkj.fw.record.entity.FwDroneAlarmRecordEntity;
 import org.sxkj.fw.record.vo.FwDroneAlarmRecordVO;
 import org.sxkj.fw.record.excel.FwDroneAlarmRecordExcel;
@@ -41,8 +46,12 @@
 import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.tool.constant.BladeConstant;
 import springfox.documentation.annotations.ApiIgnore;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.util.Map;
 import java.util.List;
+import java.util.Objects;
 import javax.servlet.http.HttpServletResponse;
 
 /**
@@ -72,13 +81,13 @@
 	/**
 	 * 无人机告警表 分页
 	 */
-	@GetMapping("/list")
-	@ApiOperationSupport(order = 2)
-	@ApiOperation(value = "分页", notes = "传入fwDroneAlarmRecord")
-	public R<IPage<FwDroneAlarmRecordVO>> list(@ApiIgnore @RequestParam Map<String, Object> fwDroneAlarmRecord, Query query) {
-		IPage<FwDroneAlarmRecordEntity> pages = fwDroneAlarmRecordService.page(Condition.getPage(query), Condition.getQueryWrapper(fwDroneAlarmRecord, FwDroneAlarmRecordEntity.class));
-		return R.data(FwDroneAlarmRecordWrapper.build().pageVO(pages));
-	}
+	// @GetMapping("/list")
+	// @ApiOperationSupport(order = 2)
+	// @ApiOperation(value = "分页", notes = "传入fwDroneAlarmRecord")
+	// public R<IPage<FwDroneAlarmRecordVO>> list(@ApiIgnore @RequestParam Map<String, Object> fwDroneAlarmRecord, Query query) {
+	// 	IPage<FwDroneAlarmRecordEntity> pages = fwDroneAlarmRecordService.page(Condition.getPage(query), Condition.getQueryWrapper(fwDroneAlarmRecord, FwDroneAlarmRecordEntity.class));
+	// 	return R.data(FwDroneAlarmRecordWrapper.build().pageVO(pages));
+	// }
 
 	/**
 	 * 无人机告警表 自定义分页
@@ -94,22 +103,23 @@
 	/**
 	 * 无人机告警表 新增
 	 */
-	@PostMapping("/save")
-	@ApiOperationSupport(order = 4)
-	@ApiOperation(value = "新增", notes = "传入fwDroneAlarmRecord")
-	public R save(@Valid @RequestBody FwDroneAlarmRecordEntity fwDroneAlarmRecord) {
-		return R.status(fwDroneAlarmRecordService.save(fwDroneAlarmRecord));
-	}
+	// @PostMapping("/save")
+	// @ApiOperationSupport(order = 4)
+	// @ApiOperation(value = "新增", notes = "传入fwDroneAlarmRecord")
+	// public R save(@Valid @RequestBody FwDroneAlarmRecordDTO fwDroneAlarmRecord) {
+	// 	FwDroneAlarmRecordEntity fwDroneAlarmRecordEntity = Objects.requireNonNull(BeanUtil.copy(fwDroneAlarmRecord, FwDroneAlarmRecordEntity.class));
+	// 	return R.status(fwDroneAlarmRecordService.save(fwDroneAlarmRecordEntity));
+	// }
 
 	/**
 	 * 无人机告警表 修改
 	 */
-	@PostMapping("/update")
-	@ApiOperationSupport(order = 5)
-	@ApiOperation(value = "修改", notes = "传入fwDroneAlarmRecord")
-	public R update(@Valid @RequestBody FwDroneAlarmRecordEntity fwDroneAlarmRecord) {
-		return R.status(fwDroneAlarmRecordService.updateById(fwDroneAlarmRecord));
-	}
+	// @PostMapping("/update")
+	// @ApiOperationSupport(order = 5)
+	// @ApiOperation(value = "修改", notes = "传入fwDroneAlarmRecord")
+	// public R update(@Valid @RequestBody FwDroneAlarmRecordEntity fwDroneAlarmRecord) {
+	// 	return R.status(fwDroneAlarmRecordService.updateById(fwDroneAlarmRecord));
+	// }
 
 	/**
 	 * 无人机告警表 新增或修改
@@ -117,8 +127,9 @@
 	@PostMapping("/submit")
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入fwDroneAlarmRecord")
-	public R submit(@Valid @RequestBody FwDroneAlarmRecordEntity fwDroneAlarmRecord) {
-		return R.status(fwDroneAlarmRecordService.saveOrUpdate(fwDroneAlarmRecord));
+	public R submit(@Valid @RequestBody FwDroneAlarmRecordDTO fwDroneAlarmRecord) {
+		FwDroneAlarmRecordEntity fwDroneAlarmRecordEntity = Objects.requireNonNull(BeanUtil.copy(fwDroneAlarmRecord, FwDroneAlarmRecordEntity.class));
+		return R.status(fwDroneAlarmRecordService.saveOrUpdate(fwDroneAlarmRecordEntity));
 	}
 
 	/**
@@ -145,6 +156,20 @@
 		//}
 		queryWrapper.lambda().eq(FwDroneAlarmRecordEntity::getIsDeleted, BladeConstant.DB_NOT_DELETED);
 		List<FwDroneAlarmRecordExcel> list = fwDroneAlarmRecordService.exportFwDroneAlarmRecord(queryWrapper);
+
+		// String fileName = "无人机告警表数据" + DateUtil.time() + ".xlsx";
+		// String filePath = "D:\\software\\" + fileName; // 替换为实际的本地路径
+		// try (FileOutputStream outputStream = new FileOutputStream(filePath)) {
+		// 	ExcelWriter excelWriter = EasyExcel.write(outputStream, FwDroneAlarmRecordExcel.class)
+		// 		.autoCloseStream(true)
+		// 		.build();
+		// 	WriteSheet writeSheet = EasyExcel.writerSheet("无人机告警表数据表").build();
+		// 	excelWriter.write(list, writeSheet);
+		// 	excelWriter.finish();
+		// } catch (IOException e) {
+		// 	e.printStackTrace();
+		// }
+
 		ExcelUtil.export(response, "无人机告警表数据" + DateUtil.time(), "无人机告警表数据表", list, FwDroneAlarmRecordExcel.class);
 	}
 
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneFlightRecordController.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneFlightRecordController.java
index fe8571b..cb6486d 100644
--- a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneFlightRecordController.java
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneFlightRecordController.java
@@ -16,34 +16,37 @@
  */
 package org.sxkj.fw.record.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
-import javax.validation.Valid;
-
-import org.springblade.core.secure.BladeUser;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.constant.BladeConstant;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springframework.web.bind.annotation.*;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.sxkj.fw.record.dto.FwDroneFlightRecordDTO;
 import org.sxkj.fw.record.entity.FwDroneFlightRecordEntity;
-import org.sxkj.fw.record.vo.FwDroneFlightRecordVO;
 import org.sxkj.fw.record.excel.FwDroneFlightRecordExcel;
-import org.sxkj.fw.record.wrapper.FwDroneFlightRecordWrapper;
 import org.sxkj.fw.record.service.IFwDroneFlightRecordService;
-import org.springblade.core.boot.ctrl.BladeController;
-import org.springblade.core.tool.utils.DateUtil;
-import org.springblade.core.excel.util.ExcelUtil;
-import org.springblade.core.tool.constant.BladeConstant;
+import org.sxkj.fw.record.vo.FwDroneFlightRecordVO;
+import org.sxkj.fw.record.wrapper.FwDroneFlightRecordWrapper;
 import springfox.documentation.annotations.ApiIgnore;
-import java.util.Map;
-import java.util.List;
+
 import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * 无人机飞行记录表 控制器
@@ -72,13 +75,13 @@
 	/**
 	 * 无人机飞行记录表 分页
 	 */
-	@GetMapping("/list")
-	@ApiOperationSupport(order = 2)
-	@ApiOperation(value = "分页", notes = "传入fwDroneFlightRecord")
-	public R<IPage<FwDroneFlightRecordVO>> list(@ApiIgnore @RequestParam Map<String, Object> fwDroneFlightRecord, Query query) {
-		IPage<FwDroneFlightRecordEntity> pages = fwDroneFlightRecordService.page(Condition.getPage(query), Condition.getQueryWrapper(fwDroneFlightRecord, FwDroneFlightRecordEntity.class));
-		return R.data(FwDroneFlightRecordWrapper.build().pageVO(pages));
-	}
+	// @GetMapping("/list")
+	// @ApiOperationSupport(order = 2)
+	// @ApiOperation(value = "分页", notes = "传入fwDroneFlightRecord")
+	// public R<IPage<FwDroneFlightRecordVO>> list(@ApiIgnore @RequestParam Map<String, Object> fwDroneFlightRecord, Query query) {
+	// 	IPage<FwDroneFlightRecordEntity> pages = fwDroneFlightRecordService.page(Condition.getPage(query), Condition.getQueryWrapper(fwDroneFlightRecord, FwDroneFlightRecordEntity.class));
+	// 	return R.data(FwDroneFlightRecordWrapper.build().pageVO(pages));
+	// }
 
 	/**
 	 * 无人机飞行记录表 自定义分页
@@ -94,22 +97,23 @@
 	/**
 	 * 无人机飞行记录表 新增
 	 */
-	@PostMapping("/save")
-	@ApiOperationSupport(order = 4)
-	@ApiOperation(value = "新增", notes = "传入fwDroneFlightRecord")
-	public R save(@Valid @RequestBody FwDroneFlightRecordEntity fwDroneFlightRecord) {
-		return R.status(fwDroneFlightRecordService.save(fwDroneFlightRecord));
-	}
+	// @PostMapping("/save")
+	// @ApiOperationSupport(order = 4)
+	// @ApiOperation(value = "新增", notes = "传入fwDroneFlightRecord")
+	// public R save(@Valid @RequestBody FwDroneFlightRecordDTO fwDroneFlightRecord) {
+	// 	FwDroneFlightRecordEntity entity = Objects.requireNonNull(BeanUtil.copy(fwDroneFlightRecord, FwDroneFlightRecordEntity.class));
+	// 	return R.status(fwDroneFlightRecordService.save(entity));
+	// }
 
 	/**
 	 * 无人机飞行记录表 修改
 	 */
-	@PostMapping("/update")
-	@ApiOperationSupport(order = 5)
-	@ApiOperation(value = "修改", notes = "传入fwDroneFlightRecord")
-	public R update(@Valid @RequestBody FwDroneFlightRecordEntity fwDroneFlightRecord) {
-		return R.status(fwDroneFlightRecordService.updateById(fwDroneFlightRecord));
-	}
+	// @PostMapping("/update")
+	// @ApiOperationSupport(order = 5)
+	// @ApiOperation(value = "修改", notes = "传入fwDroneFlightRecord")
+	// public R update(@Valid @RequestBody FwDroneFlightRecordEntity fwDroneFlightRecord) {
+	// 	return R.status(fwDroneFlightRecordService.updateById(fwDroneFlightRecord));
+	// }
 
 	/**
 	 * 无人机飞行记录表 新增或修改
@@ -117,8 +121,9 @@
 	@PostMapping("/submit")
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入fwDroneFlightRecord")
-	public R submit(@Valid @RequestBody FwDroneFlightRecordEntity fwDroneFlightRecord) {
-		return R.status(fwDroneFlightRecordService.saveOrUpdate(fwDroneFlightRecord));
+	public R submit(@Valid @RequestBody FwDroneFlightRecordDTO fwDroneFlightRecord) {
+		FwDroneFlightRecordEntity entity = Objects.requireNonNull(BeanUtil.copy(fwDroneFlightRecord, FwDroneFlightRecordEntity.class));
+		return R.status(fwDroneFlightRecordService.saveOrUpdate(entity));
 	}
 
 	/**
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneFlightRecordDetailController.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneFlightRecordDetailController.java
index 1479711..e49bd1b 100644
--- a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneFlightRecordDetailController.java
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneFlightRecordDetailController.java
@@ -27,11 +27,14 @@
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.sxkj.fw.record.dto.FwDroneFlightRecordDetailDTO;
 import org.sxkj.fw.record.entity.FwDroneFlightRecordDetailEntity;
+import org.sxkj.fw.record.entity.FwDroneFlightRecordEntity;
 import org.sxkj.fw.record.vo.FwDroneFlightRecordDetailVO;
 import org.sxkj.fw.record.excel.FwDroneFlightRecordDetailExcel;
 import org.sxkj.fw.record.wrapper.FwDroneFlightRecordDetailWrapper;
@@ -43,6 +46,7 @@
 import springfox.documentation.annotations.ApiIgnore;
 import java.util.Map;
 import java.util.List;
+import java.util.Objects;
 import javax.servlet.http.HttpServletResponse;
 
 /**
@@ -72,13 +76,13 @@
 	/**
 	 * 无人机飞行记录详情表 分页
 	 */
-	@GetMapping("/list")
-	@ApiOperationSupport(order = 2)
-	@ApiOperation(value = "分页", notes = "传入fwDroneFlightRecordDetail")
-	public R<IPage<FwDroneFlightRecordDetailVO>> list(@ApiIgnore @RequestParam Map<String, Object> fwDroneFlightRecordDetail, Query query) {
-		IPage<FwDroneFlightRecordDetailEntity> pages = fwDroneFlightRecordDetailService.page(Condition.getPage(query), Condition.getQueryWrapper(fwDroneFlightRecordDetail, FwDroneFlightRecordDetailEntity.class));
-		return R.data(FwDroneFlightRecordDetailWrapper.build().pageVO(pages));
-	}
+	// @GetMapping("/list")
+	// @ApiOperationSupport(order = 2)
+	// @ApiOperation(value = "分页", notes = "传入fwDroneFlightRecordDetail")
+	// public R<IPage<FwDroneFlightRecordDetailVO>> list(@ApiIgnore @RequestParam Map<String, Object> fwDroneFlightRecordDetail, Query query) {
+	// 	IPage<FwDroneFlightRecordDetailEntity> pages = fwDroneFlightRecordDetailService.page(Condition.getPage(query), Condition.getQueryWrapper(fwDroneFlightRecordDetail, FwDroneFlightRecordDetailEntity.class));
+	// 	return R.data(FwDroneFlightRecordDetailWrapper.build().pageVO(pages));
+	// }
 
 	/**
 	 * 无人机飞行记录详情表 自定义分页
@@ -94,22 +98,22 @@
 	/**
 	 * 无人机飞行记录详情表 新增
 	 */
-	@PostMapping("/save")
-	@ApiOperationSupport(order = 4)
-	@ApiOperation(value = "新增", notes = "传入fwDroneFlightRecordDetail")
-	public R save(@Valid @RequestBody FwDroneFlightRecordDetailEntity fwDroneFlightRecordDetail) {
-		return R.status(fwDroneFlightRecordDetailService.save(fwDroneFlightRecordDetail));
-	}
+	// @PostMapping("/save")
+	// @ApiOperationSupport(order = 4)
+	// @ApiOperation(value = "新增", notes = "传入fwDroneFlightRecordDetail")
+	// public R save(@Valid @RequestBody FwDroneFlightRecordDetailEntity fwDroneFlightRecordDetail) {
+	// 	return R.status(fwDroneFlightRecordDetailService.save(fwDroneFlightRecordDetail));
+	// }
 
 	/**
 	 * 无人机飞行记录详情表 修改
 	 */
-	@PostMapping("/update")
-	@ApiOperationSupport(order = 5)
-	@ApiOperation(value = "修改", notes = "传入fwDroneFlightRecordDetail")
-	public R update(@Valid @RequestBody FwDroneFlightRecordDetailEntity fwDroneFlightRecordDetail) {
-		return R.status(fwDroneFlightRecordDetailService.updateById(fwDroneFlightRecordDetail));
-	}
+	// @PostMapping("/update")
+	// @ApiOperationSupport(order = 5)
+	// @ApiOperation(value = "修改", notes = "传入fwDroneFlightRecordDetail")
+	// public R update(@Valid @RequestBody FwDroneFlightRecordDetailEntity fwDroneFlightRecordDetail) {
+	// 	return R.status(fwDroneFlightRecordDetailService.updateById(fwDroneFlightRecordDetail));
+	// }
 
 	/**
 	 * 无人机飞行记录详情表 新增或修改
@@ -117,8 +121,9 @@
 	@PostMapping("/submit")
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入fwDroneFlightRecordDetail")
-	public R submit(@Valid @RequestBody FwDroneFlightRecordDetailEntity fwDroneFlightRecordDetail) {
-		return R.status(fwDroneFlightRecordDetailService.saveOrUpdate(fwDroneFlightRecordDetail));
+	public R submit(@Valid @RequestBody FwDroneFlightRecordDetailDTO fwDroneFlightRecordDetail) {
+		FwDroneFlightRecordDetailEntity entity = Objects.requireNonNull(BeanUtil.copy(fwDroneFlightRecordDetail, FwDroneFlightRecordDetailEntity.class));
+		return R.status(fwDroneFlightRecordDetailService.saveOrUpdate(entity));
 	}
 
 	/**
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneAlarmRecordDTO.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneAlarmRecordDTO.java
index 8944a93..91c51e2 100644
--- a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneAlarmRecordDTO.java
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneAlarmRecordDTO.java
@@ -16,9 +16,15 @@
  */
 package org.sxkj.fw.record.dto;
 
-import org.sxkj.fw.record.entity.FwDroneAlarmRecordEntity;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.time.LocalTime;
+import java.util.Date;
 
 /**
  * 无人机告警表 数据传输对象实体类
@@ -27,8 +33,100 @@
  * @since 2026-01-08
  */
 @Data
-@EqualsAndHashCode(callSuper = true)
-public class FwDroneAlarmRecordDTO extends FwDroneAlarmRecordEntity {
+public class FwDroneAlarmRecordDTO {
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty("主键id")
+	private Long id;
+	/**
+	 * 反无设备ID(关联ja_fw_device.id)
+	 */
+	@ApiModelProperty(value = "反无设备ID(关联ja_fw_device.id)")
+	private Long deviceId;
+	/**
+	 * 无人机名称
+	 */
+	@ApiModelProperty(value = "无人机名称")
+	private String droneName;
+	/**
+	 * 无人机序列号
+	 */
+	@ApiModelProperty(value = "无人机序列号")
+	private String droneSerialNo;
+	/**
+	 * 无人机类型(微型机/植保机...)
+	 */
+	@ApiModelProperty(value = "无人机类型(微型机/植保机...)")
+	private String droneType;
+	/**
+	 * 告警类型:实时告警/历史告警
+	 */
+	@ApiModelProperty(value = "告警类型:实时告警/历史告警")
+	private String alarmType;
+	/**
+	 * 告警时间
+	 */
+	@ApiModelProperty(value = "告警时间")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date alarmTime;
+	/**
+	 * 触发原因
+	 */
+	@ApiModelProperty(value = "触发原因")
+	private String triggerReason;
+	/**
+	 * 飞行状态:侦测中/反制中
+	 */
+	@ApiModelProperty(value = "飞行状态:侦测中/反制中")
+	private String flightStatus;
+	/**
+	 * 当前经度
+	 */
+	@ApiModelProperty(value = "当前经度")
+	private Double longitude;
+	/**
+	 * 当前纬度
+	 */
+	@ApiModelProperty(value = "当前纬度")
+	private Double latitude;
+	/**
+	 * 信号频段(MHz)
+	 */
+	@ApiModelProperty(value = "信号频段(MHz)")
+	private Integer signalFreqMhz;
+	/**
+	 * 飞行高度(m)
+	 */
+	@ApiModelProperty(value = "飞行高度(m)")
+	private Integer flightHeightM;
+	/**
+	 * 飞行速度(m/s)
+	 */
+	@ApiModelProperty(value = "飞行速度(m/s)")
+	private BigDecimal flightSpeedMs;
+	/**
+	 * 停留时长(秒)
+	 */
+	@ApiModelProperty(value = "停留时长 (秒) ")
+ 	private String stayDuration;
+	/**
+	 * 反制方式:信号干扰/诱导驱离/无
+	 */
+	@ApiModelProperty(value = "反制方式:信号干扰/诱导驱离/无")
+	private String counterWay;
+	/**
+	 * 区域id ja_fw_area_divide
+	 */
+	@ApiModelProperty(value = "区域id ja_fw_area_divide")
+	private String areaDivideId;
+	/**
+	 * 场景id ja_fw_defense_scene.id
+	 */
+	@ApiModelProperty(value = "场景id ja_fw_defense_scene.id")
+	private String defenseSceneId;
+	/**
+	 * 区域编码
+	 */
+	@ApiModelProperty(value = "区域编码")
+	private String areaCode;
 }
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneFlightRecordDTO.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneFlightRecordDTO.java
index 3ac46b8..de7edec 100644
--- a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneFlightRecordDTO.java
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneFlightRecordDTO.java
@@ -16,9 +16,12 @@
  */
 package org.sxkj.fw.record.dto;
 
-import org.sxkj.fw.record.entity.FwDroneFlightRecordEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
+
+import java.time.LocalTime;
+import java.util.Date;
 
 /**
  * 无人机飞行记录表 数据传输对象实体类
@@ -27,8 +30,48 @@
  * @since 2026-01-08
  */
 @Data
-@EqualsAndHashCode(callSuper = true)
-public class FwDroneFlightRecordDTO extends FwDroneFlightRecordEntity {
+ public class FwDroneFlightRecordDTO  {
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty("主键id")
+	private Long id;
+
+	/**
+	 * 反无设备ID(关联ja_fw_device.id)
+	 */
+	@ApiModelProperty(value = "反无设备ID(关联ja_fw_device.id)")
+	private Long deviceId;
+	/**
+	 * 无人机名称
+	 */
+	@ApiModelProperty(value = "无人机名称")
+	private String droneName;
+	/**
+	 * 序列号
+	 */
+	@ApiModelProperty(value = "序列号")
+	private String serialNo;
+	/**
+	 * 首次告警时间
+	 */
+	@ApiModelProperty(value = "首次告警时间")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date alarmTime;
+	/**
+	 * 触发原因/类型
+	 */
+	@ApiModelProperty(value = "触发原因/类型")
+	private String triggerType;
+	/**
+	 * 停留时长(HH:MM:SS)
+	 */
+	@ApiModelProperty(value = "停留时长(HH:MM:SS)")
+	@JsonFormat(pattern = "HH:mm:ss")
+	private LocalTime stayDuration;
+	/**
+	 * 区域编码
+	 */
+	@ApiModelProperty(value = "区域编码")
+	private String areaCode;
+
 }
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneFlightRecordDetailDTO.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneFlightRecordDetailDTO.java
index c76f098..d7b15b1 100644
--- a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneFlightRecordDetailDTO.java
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneFlightRecordDetailDTO.java
@@ -16,9 +16,11 @@
  */
 package org.sxkj.fw.record.dto;
 
-import org.sxkj.fw.record.entity.FwDroneFlightRecordDetailEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
+
+import java.util.Date;
 
 /**
  * 无人机飞行记录详情表 数据传输对象实体类
@@ -27,8 +29,36 @@
  * @since 2026-01-08
  */
 @Data
-@EqualsAndHashCode(callSuper = true)
-public class FwDroneFlightRecordDetailDTO extends FwDroneFlightRecordDetailEntity {
+public class FwDroneFlightRecordDetailDTO {
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty("主键id")
+	private Long id;
+
+	/**
+	 * 飞行记录表ID
+	 */
+	@ApiModelProperty(value = "飞行记录表ID")
+	private Long flightRecordId;
+	/**
+	 * 经度
+	 */
+	@ApiModelProperty(value = "经度")
+	private Double longitude;
+	/**
+	 * 纬度
+	 */
+	@ApiModelProperty(value = "纬度")
+	private Double latitude;
+	/**
+	 * 点位时间
+	 */
+	@ApiModelProperty(value = "点位时间")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date pointTime;
+	/**
+	 * 区域编码
+	 */
+	@ApiModelProperty(value = "区域编码")
+	private String areaCode;
 }
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/entity/FwDroneAlarmRecordEntity.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/entity/FwDroneAlarmRecordEntity.java
index 3866384..877d85d 100644
--- a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/entity/FwDroneAlarmRecordEntity.java
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/entity/FwDroneAlarmRecordEntity.java
@@ -18,6 +18,7 @@
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -75,6 +76,7 @@
 	 */
 	@TableField("alarm_time")
 	@ApiModelProperty(value = "告警时间")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 	private Date alarmTime;
 	/**
 	 * 触发原因
@@ -119,11 +121,11 @@
 	@ApiModelProperty(value = "飞行速度(m/s)")
 	private BigDecimal flightSpeedMs;
 	/**
-	 * 停留时长 HH:MM:SS
+	 * 停留时长 (秒)
 	 */
 	@TableField("stay_duration")
-	@ApiModelProperty(value = "停留时长 HH:MM:SS")
-	private LocalTime stayDuration;
+	@ApiModelProperty(value = "停留时长(秒)")
+ 	private String stayDuration;
 	/**
 	 * 反制方式:信号干扰/诱导驱离/无
 	 */
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/entity/FwDroneFlightRecordDetailEntity.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/entity/FwDroneFlightRecordDetailEntity.java
index a0f27ed..9c66804 100644
--- a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/entity/FwDroneFlightRecordDetailEntity.java
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/entity/FwDroneFlightRecordDetailEntity.java
@@ -16,13 +16,13 @@
  */
 package org.sxkj.fw.record.entity;
 
-import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import org.springblade.core.tenant.mp.TenantEntity;
+import org.springblade.core.mp.base.BaseEntity;
 
 import java.util.Date;
 
@@ -36,7 +36,7 @@
 @TableName("ja_fw_drone_flight_record_detail")
 @ApiModel(value = "FwDroneFlightRecordDetail对象", description = "无人机飞行记录详情表")
 @EqualsAndHashCode(callSuper = true)
-public class FwDroneFlightRecordDetailEntity extends TenantEntity {
+public class FwDroneFlightRecordDetailEntity extends BaseEntity {
 
 	/**
 	 * 飞行记录表ID
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/excel/FwDroneAlarmRecordExcel.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/excel/FwDroneAlarmRecordExcel.java
index b5bc030..a2d87d3 100644
--- a/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/excel/FwDroneAlarmRecordExcel.java
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/record/excel/FwDroneAlarmRecordExcel.java
@@ -21,11 +21,14 @@
 import com.alibaba.excel.annotation.write.style.ColumnWidth;
 import com.alibaba.excel.annotation.write.style.ContentRowHeight;
 import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
+import org.sxkj.fw.utils.excel.ExcelDictConverter;
+import org.sxkj.fw.utils.excel.ExcelDictItem;
+import org.sxkj.fw.utils.excel.ExcelDictItemLabel;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
-import java.time.LocalTime;
 import java.util.Date;
 
 
@@ -65,7 +68,9 @@
 	 * 无人机类型(微型机/植保机...)
 	 */
 	@ColumnWidth(20)
-	@ExcelProperty("无人机类型(微型机/植保机...)")
+	@ExcelProperty( value = "无人机类型(微型机/植保机...)",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "droneType")
+	@ExcelDictItem(type = "droneType")
 	private String droneType;
 	/**
 	 * 告警类型:实时告警/历史告警
@@ -78,6 +83,7 @@
 	 */
 	@ColumnWidth(20)
 	@ExcelProperty("告警时间")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 	private Date alarmTime;
 	/**
 	 * 触发原因
@@ -89,7 +95,9 @@
 	 * 飞行状态:侦测中/反制中
 	 */
 	@ColumnWidth(20)
-	@ExcelProperty("飞行状态:侦测中/反制中")
+	@ExcelProperty(value = "飞行状态:侦测中/反制中", converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "flightStatus")
+	@ExcelDictItem(type = "flightStatus")
 	private String flightStatus;
 	/**
 	 * 当前经度
@@ -122,16 +130,18 @@
 	@ExcelProperty("飞行速度(m/s)")
 	private BigDecimal flightSpeedMs;
 	/**
-	 * 停留时长 HH:MM:SS
+	 * 停留时长 (秒)
 	 */
 	@ColumnWidth(20)
-	@ExcelProperty("停留时长 HH:MM:SS")
-	private LocalTime stayDuration;
+	@ExcelProperty(value = "停留时长(秒)")
+	private String stayDuration;
 	/**
 	 * 反制方式:信号干扰/诱导驱离/无
 	 */
 	@ColumnWidth(20)
-	@ExcelProperty("反制方式:信号干扰/诱导驱离/无")
+ 	@ExcelProperty(value = "反制方式:信号干扰/诱导驱离/无", converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "counterWay")
+	@ExcelDictItem(type = "counterWay")
 	private String counterWay;
 	/**
 	 * 区域id ja_fw_area_divide
@@ -151,11 +161,5 @@
 	@ColumnWidth(20)
 	@ExcelProperty("区域编码")
 	private String areaCode;
-	/**
-	 * 删除标志(0存在 1删除)
-	 */
-	@ColumnWidth(20)
-	@ExcelProperty("删除标志(0存在 1删除)")
-	private Byte isDeleted;
 
 }
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/CustomCellWriteHeightConfig.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/CustomCellWriteHeightConfig.java
new file mode 100644
index 0000000..9de8371
--- /dev/null
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/CustomCellWriteHeightConfig.java
@@ -0,0 +1,49 @@
+package org.sxkj.fw.utils.excel;
+
+import com.alibaba.excel.write.style.row.AbstractRowHeightStyleStrategy;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+
+import java.util.Iterator;
+
+/**
+ * 自适应行高
+ * @author zhongrj
+ * @since 2021-10-29
+ */
+public class CustomCellWriteHeightConfig extends AbstractRowHeightStyleStrategy {
+	/**
+	 * 默认高度
+	 */
+	private static final Integer DEFAULT_HEIGHT = 300;
+
+	@Override
+	protected void setHeadColumnHeight(Row row, int relativeRowIndex) {
+	}
+
+	@Override
+	protected void setContentColumnHeight(Row row, int relativeRowIndex) {
+		Iterator<Cell> cellIterator = row.cellIterator();
+		if (!cellIterator.hasNext()) {
+			return;
+		}
+
+		// 默认为 1行高度
+		Integer maxHeight = 1;
+		while (cellIterator.hasNext()) {
+			Cell cell = cellIterator.next();
+			switch (cell.getCellTypeEnum()) {
+				case STRING:
+					if (cell.getStringCellValue().indexOf("\n") != -1) {
+						int length = cell.getStringCellValue().split("\n").length;
+						maxHeight = Math.max(maxHeight, length);
+					}
+					break;
+				default:
+					break;
+			}
+		}
+
+		row.setHeight((short) (maxHeight * DEFAULT_HEIGHT));
+	}
+}
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/CustomCellWriteWeightConfig.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/CustomCellWriteWeightConfig.java
new file mode 100644
index 0000000..841e472
--- /dev/null
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/CustomCellWriteWeightConfig.java
@@ -0,0 +1,70 @@
+package org.sxkj.fw.utils.excel;
+
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.Head;
+import com.alibaba.excel.metadata.data.CellData;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
+import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.springblade.core.tool.utils.CollectionUtil;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 自适应行款
+ * @author zhongrj
+ * @since 2021-10-29
+ */
+public class CustomCellWriteWeightConfig extends AbstractColumnWidthStyleStrategy {
+	private Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<>();
+
+	@Override
+	protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
+		// 在3.0版本中,列宽设置逻辑已改变,使用此方法进行设置
+		Sheet sheet = writeSheetHolder.getSheet();
+		Integer columnWidth = CACHE.get(writeSheetHolder.getSheetNo()) != null ?
+				CACHE.get(writeSheetHolder.getSheetNo()).get(cell.getColumnIndex()) : null;
+		if (columnWidth != null) {
+			sheet.setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
+		}
+
+		super.setColumnWidth(writeSheetHolder, cellDataList, cell, head, relativeRowIndex, isHead);
+	}
+
+	/**
+	 * 计算长度
+	 * @param cellDataList
+	 * @param cell
+	 * @param isHead
+	 * @return
+	 */
+	private Integer dataLength(List<CellData> cellDataList, Cell cell, Boolean isHead) {
+		if (isHead) {
+			return cell.getStringCellValue().getBytes().length;
+		} else {
+			CellData cellData = cellDataList.get(0);
+			CellDataTypeEnum type = cellData.getType();
+			if (type == null) {
+				return -1;
+			} else {
+				switch (type) {
+					case STRING:
+						// 换行符(数据需要提前解析好)
+						int index = cellData.getStringValue().indexOf("\n");
+						return index != -1 ?
+							cellData.getStringValue().substring(0, index).getBytes().length + 1 : cellData.getStringValue().getBytes().length + 1;
+					case BOOLEAN:
+						return cellData.getBooleanValue().toString().getBytes().length;
+					case NUMBER:
+						return cellData.getNumberValue().toString().getBytes().length;
+					default:
+						return -1;
+				}
+			}
+		}
+	}
+}
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictConverter.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictConverter.java
new file mode 100644
index 0000000..88d5523
--- /dev/null
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictConverter.java
@@ -0,0 +1,95 @@
+package org.sxkj.fw.utils.excel;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.ReadCellData;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import com.github.xiaoymin.knife4j.core.util.StrUtil;
+import org.springframework.stereotype.Component;
+import org.sxkj.system.cache.DictBizCache;
+import org.sxkj.system.entity.DictBiz;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+/**
+ * 字典映射
+ *
+ * @author zhongrj
+ * @date 2023-11-17
+ */
+@Component
+public class ExcelDictConverter implements Converter<String> {
+
+	@Override
+	public Class supportJavaTypeKey() {
+		return Integer.class;
+	}
+
+	@Override
+	public CellDataTypeEnum supportExcelTypeKey() {
+		return CellDataTypeEnum.STRING;
+	}
+
+	/**
+	 * 导入excel 解析到java 对象
+	 * @param cellData
+	 * @param contentProperty
+	 * @param globalConfiguration
+	 * @return
+	 * @throws Exception
+	 */
+	@Override
+	public String convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+			// 获取字典类型
+			Field field = contentProperty.getField();
+			ExcelDictItemLabel excel = field.getAnnotation(ExcelDictItemLabel.class);
+			String dictType = excel.type();
+			// 为空返回
+			String dictLabel = cellData.getStringValue();
+			if (StrUtil.isBlank(dictLabel)) {
+				return dictLabel;
+			}
+			// 查询字典
+			List<DictBiz> list = DictBizCache.getList(dictType);
+			//解析返回
+			String key = "";
+			for (DictBiz dictBiz : list) {
+				if (dictBiz.getDictValue().equals(dictLabel)){
+					key = dictBiz.getDictKey();
+					break;
+				}
+			}
+			// 返回key
+			return key;
+	}
+
+	/**
+	 * java 导出到 excel
+	 *
+	 * @param dictValue
+	 * @param excelContentProperty
+	 * @param globalConfiguration
+	 * @return
+	 * @throws Exception
+	 */
+	@Override
+	public WriteCellData<?> convertToExcelData(String dictValue, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+		// 获取字典类型
+		Field field = excelContentProperty.getField();
+		ExcelDictItem excel = field.getAnnotation(ExcelDictItem.class);
+		String dictType = excel.type();
+		List<DictBiz> list = DictBizCache.getList(dictType);
+		String value = "";
+		//解析返回
+		for (DictBiz dictBiz : list) {
+			if (dictBiz.getDictKey().equals(dictValue)){
+				value = dictBiz.getDictValue();
+				break;
+			}
+		}
+		return new WriteCellData<>(value);
+	}
+}
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictItem.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictItem.java
new file mode 100644
index 0000000..8ff6eca
--- /dev/null
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictItem.java
@@ -0,0 +1,25 @@
+package org.sxkj.fw.utils.excel;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * excel导出字典转换注解
+ * <p>
+ * 将excel导出的字典code自动转换为字典label
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+@JacksonAnnotationsInside
+public @interface ExcelDictItem {
+
+	/**
+	 * 字典type
+	 */
+	String type();
+
+}
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictItemLabel.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictItemLabel.java
new file mode 100644
index 0000000..74762d4
--- /dev/null
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictItemLabel.java
@@ -0,0 +1,25 @@
+package org.sxkj.fw.utils.excel;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * excel导入字典转换注解
+ * <p>
+ * 将excel导入的字典label自动转换为字典code
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+@JacksonAnnotationsInside
+public @interface ExcelDictItemLabel {
+
+	/**
+	 * 字典type
+	 */
+	String type();
+
+}
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/LocalDateTimeConverter.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/LocalDateTimeConverter.java
new file mode 100644
index 0000000..25b60a7
--- /dev/null
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/LocalDateTimeConverter.java
@@ -0,0 +1,53 @@
+package org.sxkj.fw.utils.excel;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.converters.WriteConverterContext;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.ReadCellData;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * LocalDateTime转换器
+ *
+ * @author
+ * @since 2026-01-08
+ */
+public class LocalDateTimeConverter implements Converter<LocalDateTime> {
+
+	private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+	@Override
+	public Class<LocalDateTime> supportJavaTypeKey() {
+		return LocalDateTime.class;
+	}
+
+	@Override
+	public CellDataTypeEnum supportExcelTypeKey() {
+		return CellDataTypeEnum.STRING;
+	}
+
+	@Override
+	public LocalDateTime convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+		if (cellData == null || cellData.getStringValue() == null || cellData.getStringValue().trim().isEmpty()) {
+			return null;
+		}
+		try {
+			return LocalDateTime.parse(cellData.getStringValue(), TIME_FORMATTER);
+		} catch (Exception e) {
+			return null;
+		}
+	}
+
+	@Override
+	public WriteCellData<?> convertToExcelData(WriteConverterContext<LocalDateTime> context) throws Exception {
+		if (context.getValue() == null) {
+			return new WriteCellData<>("");
+		}
+		return new WriteCellData<>(context.getValue().format(TIME_FORMATTER));
+	}
+}
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/MySheetWriteHandler.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/MySheetWriteHandler.java
new file mode 100644
index 0000000..7129210
--- /dev/null
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/MySheetWriteHandler.java
@@ -0,0 +1,45 @@
+package org.sxkj.fw.utils.excel;
+
+import com.alibaba.excel.write.handler.SheetWriteHandler;
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
+import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+
+public class MySheetWriteHandler implements SheetWriteHandler {
+	@Override
+	public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
+
+	}
+
+	@Override
+	public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
+		Workbook workbook = writeWorkbookHolder.getWorkbook();
+		Sheet sheet = workbook.getSheetAt(0);
+		Row row1 = sheet.createRow(0);
+		row1.setHeight((short) 500);
+		Cell cell = row1.createCell(0);
+		//设置单元格内容
+		cell.setCellValue("附件2");
+		//设置标题
+		Row row2 = sheet.createRow(1);
+		row2.setHeight((short) 800);
+		Cell cell1 = row2.createCell(0);
+		cell1.setCellValue("存量建筑垃圾堆体治理进度月报表");
+		CellStyle cellStyle = workbook.createCellStyle();
+		cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+		cellStyle.setAlignment(HorizontalAlignment.CENTER);
+		Font font = workbook.createFont();
+		font.setBold(true);
+		font.setFontHeight((short) 400);
+		cellStyle.setFont(font);
+		cell1.setCellStyle(cellStyle);
+		sheet.addMergedRegionUnsafe(new CellRangeAddress(1, 1, 0, 17));
+		//设置填表日期,填报人,联系方式
+		Row row3 = sheet.createRow(2);
+		row3.setHeight((short) 500);
+		row3.createCell(1).setCellValue("填表日期");
+		row3.createCell(11).setCellValue("填表人");
+		row3.createCell(15).setCellValue("联系方式");
+	}
+}
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/RowWriteHandler.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/RowWriteHandler.java
new file mode 100644
index 0000000..cdf7929
--- /dev/null
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/RowWriteHandler.java
@@ -0,0 +1,57 @@
+package org.sxkj.fw.utils.excel;
+
+import com.alibaba.excel.metadata.Head;
+import com.alibaba.excel.metadata.data.CellData;
+import com.alibaba.excel.write.handler.CellWriteHandler;
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
+import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
+import org.apache.poi.ss.usermodel.*;
+import org.springblade.core.tool.utils.Func;
+
+/**
+ * 修改单元格格式为文本格式
+ * @author zhongrj
+ * @since 2021-9-26
+ */
+public class RowWriteHandler  implements CellWriteHandler {
+
+	public static CellStyle cellStyle;
+
+	/**
+	 * 设置全局变量,防止  cellStyle 创建过多报错 2021-12-16 zrj
+	 * The maximum number of cell styles was exceeded. You can define up to 64000styles in a .xlsx workbook
+	 * @param cellStyle
+	 */
+	public static void setCellStyle(CellStyle cellStyle) {
+		RowWriteHandler.cellStyle = cellStyle;
+	}
+
+	@Override
+	public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {
+
+	}
+
+	@Override
+	public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {
+		//设置单元格格式为文本
+		Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
+		//自定义样式不为空时,重复利用
+		if(Func.isEmpty(cellStyle)){
+			cellStyle = workbook.createCellStyle();
+			setCellStyle(cellStyle);
+		}
+		DataFormat dataFormat = workbook.createDataFormat();
+		cellStyle.setDataFormat(dataFormat.getFormat("@"));
+		cell.setCellStyle(cellStyle);
+	}
+
+	//@Override 加上会报错
+	public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {
+
+	}
+
+	// @Override
+	// public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
+	//
+	// }
+}

--
Gitblit v1.9.3