吉安感知网项目-后端
linwei
2026-01-08 777eeea75ffc628d024ded81f19deff78f4f42af
报警记录导出
10 files modified
8 files added
853 ■■■■ changed files
drone-common/src/main/java/org/sxkj/common/launch/LauncherServiceImpl.java 6 ●●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneAlarmRecordController.java 67 ●●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneFlightRecordController.java 75 ●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/record/controller/FwDroneFlightRecordDetailController.java 47 ●●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneAlarmRecordDTO.java 106 ●●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneFlightRecordDTO.java 51 ●●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneFlightRecordDetailDTO.java 38 ●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/record/entity/FwDroneAlarmRecordEntity.java 8 ●●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/record/entity/FwDroneFlightRecordDetailEntity.java 6 ●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/record/excel/FwDroneAlarmRecordExcel.java 30 ●●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/CustomCellWriteHeightConfig.java 49 ●●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/CustomCellWriteWeightConfig.java 70 ●●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictConverter.java 95 ●●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictItem.java 25 ●●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictItemLabel.java 25 ●●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/LocalDateTimeConverter.java 53 ●●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/MySheetWriteHandler.java 45 ●●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/RowWriteHandler.java 57 ●●●●● patch | view | raw | blame | history
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));
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);
    }
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));
    }
    /**
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));
    }
    /**
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;
}
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;
}
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;
}
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;
    /**
     * 反制方式:信号干扰/诱导驱离/无
     */
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
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;
}
drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/CustomCellWriteHeightConfig.java
New file
@@ -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));
    }
}
drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/CustomCellWriteWeightConfig.java
New file
@@ -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;
                }
            }
        }
    }
}
drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictConverter.java
New file
@@ -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);
    }
}
drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictItem.java
New file
@@ -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();
}
drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/ExcelDictItemLabel.java
New file
@@ -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();
}
drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/LocalDateTimeConverter.java
New file
@@ -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));
    }
}
drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/MySheetWriteHandler.java
New file
@@ -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("联系方式");
    }
}
drone-service/drone-fw/src/main/java/org/sxkj/fw/utils/excel/RowWriteHandler.java
New file
@@ -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) {
    //
    // }
}