吉安感知网项目-后端
linwei
2026-01-29 89fbcb27691165a2a19c85c36d8c3c84f9d38caf
优化
10 files modified
2 files added
300 ■■■■ changed files
drone-service/drone-gd/src/main/java/org/sxkj/gd/flyer/mapper/GdFlyerMapper.xml 12 ●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdPatrolTaskMapper.java 7 ●●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdPatrolTaskMapper.xml 10 ●●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdPatrolTaskServiceImpl.java 66 ●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdPatrolTaskVO.java 5 ●●●● patch | view | raw | blame | history
drone-service/drone-system/src/main/java/org/sxkj/system/controller/DeptController.java 36 ●●●● patch | view | raw | blame | history
drone-service/drone-system/src/main/java/org/sxkj/system/excel/DeptImportExcel.java 62 ●●●●● patch | view | raw | blame | history
drone-service/drone-system/src/main/java/org/sxkj/system/excel/DeptImporter.java 4 ●●●● patch | view | raw | blame | history
drone-service/drone-system/src/main/java/org/sxkj/system/mapper/RegionMapper.xml 3 ●●●● patch | view | raw | blame | history
drone-service/drone-system/src/main/java/org/sxkj/system/service/IDeptService.java 3 ●●●● patch | view | raw | blame | history
drone-service/drone-system/src/main/java/org/sxkj/system/service/impl/DeptServiceImpl.java 14 ●●●● patch | view | raw | blame | history
drone-service/drone-system/src/main/java/org/sxkj/system/util/excel/RegionSheetWriteHandler.java 78 ●●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/flyer/mapper/GdFlyerMapper.xml
@@ -60,12 +60,12 @@
            <if test="param2.skilledTaskType != null and param2.skilledTaskType != ''">
                and skilled_task_type = #{param2.skilledTaskType}
            </if>
            <if test="param2.deptList != null and param2.deptList.size > 0">
                AND create_dept in
                <foreach collection="param2.deptList" item="deptId" open="(" separator="," close=")">
                    #{deptId}
                </foreach>
            </if>
            <!-- <if test="param2.deptList != null and param2.deptList.size > 0"> -->
            <!--     AND create_dept in -->
            <!--     <foreach collection="param2.deptList" item="deptId" open="(" separator="," close=")"> -->
            <!--         #{deptId} -->
            <!--     </foreach> -->
            <!-- </if> -->
        </where>
    </select>
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdPatrolTaskMapper.java
@@ -60,4 +60,11 @@
     * @return 更新影响行数
     */
    Integer updateWorkOrderById(@Param("workOrderParam") GdWorkOrderEntity workOrderParam);
    /**
     * 获取巡查任务详情
     * @param patrolTaskId
     * @return
     */
    GdPatrolTaskVO getPatrolTaskIdById(Long patrolTaskId);
}
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdPatrolTaskMapper.xml
@@ -83,6 +83,16 @@
    <select id="exportGdPatrolTask" resultType="org.sxkj.gd.workorder.excel.GdPatrolTaskExcel">
        SELECT * FROM ja_gd_patrol_task ${ew.customSqlSegment}
    </select>
    <select id="getPatrolTaskIdById" resultType="org.sxkj.gd.workorder.vo.GdPatrolTaskVO">
        SELECT
            pt.*,
            md.airport_id as airport_id
        FROM
            ja_gd_patrol_task pt
        left join
                ja_gd_manage_device md on md.id = pt.device_id
        WHERE id = #{patrolTaskId}
    </select>
    <!-- 自定义更新工单状态语句 -->
    <update id="updateWorkOrderById" parameterType="org.sxkj.gd.workorder.entity.GdWorkOrderEntity">
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdPatrolTaskServiceImpl.java
@@ -597,7 +597,7 @@
        if (patrolTaskId == null) {
            return R.fail("巡查任务主键不能为空");
        }
        GdPatrolTaskEntity taskEntity = getById(patrolTaskId);
        GdPatrolTaskVO taskEntity = baseMapper.getPatrolTaskIdById(patrolTaskId);
        if (taskEntity == null) {
            return R.fail("巡查任务不存在");
        }
@@ -605,43 +605,49 @@
        return jianXingtuApiService.saveFlyTask(param);
    }
    private GdXingtuFlyTaskSaveDTO buildXingtuFlyTask(GdPatrolTaskEntity taskEntity) {
    /**
     * 构建巡察任务推送的巡察任务信息
     * @param gdPatrolTaskVO
     * @return
     */
    private GdXingtuFlyTaskSaveDTO buildXingtuFlyTask(GdPatrolTaskVO gdPatrolTaskVO) {
        GdXingtuFlyTaskSaveDTO param = new GdXingtuFlyTaskSaveDTO();
        if (StringUtil.isNotBlank(taskEntity.getPatrolTaskName())) {
            param.setName(taskEntity.getPatrolTaskName());
        } else if (StringUtil.isNotBlank(taskEntity.getTaskNo())) {
            param.setName(taskEntity.getTaskNo());
        if (StringUtil.isNotBlank(gdPatrolTaskVO.getPatrolTaskName())) {
            param.setName(gdPatrolTaskVO.getPatrolTaskName());
        } else if (StringUtil.isNotBlank(gdPatrolTaskVO.getTaskNo())) {
            param.setName(gdPatrolTaskVO.getTaskNo());
        }
        if (StringUtil.isNotBlank(taskEntity.getPatrolTaskType())) {
            param.setInspectionType(taskEntity.getPatrolTaskType());
        if (StringUtil.isNotBlank(gdPatrolTaskVO.getPatrolTaskType())) {
            param.setInspectionType(gdPatrolTaskVO.getPatrolTaskType());
        }
        param.setTimingType("单次执行");
        if (StringUtil.isNotBlank(taskEntity.getAirlineId())) {
            param.setAirlineId(taskEntity.getAirlineId());
        if (StringUtil.isNotBlank(gdPatrolTaskVO.getAirlineId())) {
            param.setAirlineId(gdPatrolTaskVO.getAirlineId());
        }
        if (taskEntity.getExecuteTime() != null) {
            param.setSingleTime(DateUtil.format(taskEntity.getExecuteTime(), "yyyy-MM-dd HH:mm:ss"));
        if (gdPatrolTaskVO.getExecuteTime() != null) {
            param.setSingleTime(DateUtil.format(gdPatrolTaskVO.getExecuteTime(), "yyyy-MM-dd HH:mm:ss"));
        }
        if (StringUtil.isNotBlank(taskEntity.getAreaCode())) {
            param.setRegionCode(taskEntity.getAreaCode());
        if (StringUtil.isNotBlank(gdPatrolTaskVO.getAreaCode())) {
            param.setRegionCode(gdPatrolTaskVO.getAreaCode());
        }
        if (StringUtil.isNotBlank(taskEntity.getDeviceId())) {
            GdManageDeviceEntity device = null;
            if (StringUtils.isNumeric(taskEntity.getDeviceId())) {
                device = gdManageDeviceService.getById(Long.valueOf(taskEntity.getDeviceId()));
            }
            if (device == null) {
                device = gdManageDeviceService.lambdaQuery()
                    .eq(GdManageDeviceEntity::getAirportId, taskEntity.getDeviceId())
                    .one();
            }
            if (device != null && StringUtil.isNotBlank(device.getAirportId())) {
                param.setAirportId(device.getAirportId());
            } else {
                param.setAirportId(taskEntity.getDeviceId());
            }
        if (StringUtil.isNotBlank(gdPatrolTaskVO.getAirportId())) {
            param.setAirportId(gdPatrolTaskVO.getAirportId());
            // GdManageDeviceEntity device = null;
            // if (StringUtils.isNumeric(taskEntity.getAirportId())) {
            //     device = gdManageDeviceService.getById(Long.valueOf(taskEntity.getDeviceId()));
            // }
            // if (device == null) {
            //     device = gdManageDeviceService.lambdaQuery()
            //         .eq(GdManageDeviceEntity::getAirportId, taskEntity.getDeviceId())
            //         .one();
            // }
            // if (device != null && StringUtil.isNotBlank(device.getAirportId())) {
            //     param.setAirportId(device.getAirportId());
            // } else {
            //     param.setAirportId(taskEntity.getAirportId());
            // }
        }
        String status = parseStatus(taskEntity.getTaskStatus());
        String status = parseStatus(gdPatrolTaskVO.getTaskStatus());
        if (StringUtil.isNotBlank(status)) {
            param.setStatus(status);
        }
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdPatrolTaskVO.java
@@ -86,7 +86,7 @@
     * 关联设备ID
     */
    @ApiModelProperty(value = "关联设备ID")
    private String deviceId;
    private Long deviceId;
    @ApiModelProperty(value = "设备名称")
    private String deviceName;
@@ -138,4 +138,7 @@
    @ApiModelProperty(value = "逻辑删除")
    private Integer isDeleted;
    @ApiModelProperty(value = "机场id")
    private String airportId;
}
drone-service/drone-system/src/main/java/org/sxkj/system/controller/DeptController.java
@@ -16,6 +16,7 @@
 */
package org.sxkj.system.controller;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -52,16 +53,14 @@
import org.sxkj.system.entity.Region;
import org.sxkj.system.entity.User;
import org.sxkj.system.enums.DictEnum;
import org.sxkj.system.excel.DeptExcel;
import org.sxkj.system.excel.DeptImporter;
import org.sxkj.system.excel.RegionExcel;
import org.sxkj.system.excel.RegionImporter;
import org.sxkj.system.excel.*;
import org.sxkj.system.mapper.DeptMapper;
import org.sxkj.system.mapper.UserMapper;
import org.sxkj.system.param.DeptAddParam;
import org.sxkj.system.param.DeptExportParam;
import org.sxkj.system.param.DeptPageParam;
import org.sxkj.system.service.IDeptService;
import org.sxkj.system.util.excel.RegionSheetWriteHandler;
import org.sxkj.system.vo.DeptVO;
import org.sxkj.system.wrapper.DeptWrapper;
import org.springframework.web.bind.annotation.*;
@@ -69,6 +68,9 @@
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
@@ -348,7 +350,7 @@
    @ApiOperation(value = "导入机构", notes = "传入excel")
    public R importRegion(MultipartFile file, Integer isCovered) {
        DeptImporter deptImporter = new DeptImporter(deptService, isCovered == 1);
        ExcelUtil.save(file, deptImporter, DeptExcel.class);
        ExcelUtil.save(file, deptImporter, DeptImportExcel.class);
        return R.success("操作成功");
    }
@@ -365,13 +367,31 @@
    /**
     * 导出模板
     * <p>
     * 为区域列添加下拉选择功能,限制用户只能选择预设的区域名称
     * </p>
     *
     * @param response HTTP响应对象
     * @throws IOException 导出异常
     */
    @GetMapping("export-template")
    @ApiOperationSupport(order = 16)
    @ApiOperation(value = "导出模板")
    public void exportUser(HttpServletResponse response) {
        List<DeptExcel> list = new ArrayList<>();
        ExcelUtil.export(response, "机构模板", "机构表", list, DeptExcel.class);
    public void exportUser(HttpServletResponse response) throws IOException {
        // 设置响应头
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding(StandardCharsets.UTF_8.name());
        String fileName = URLEncoder.encode("机构模板", StandardCharsets.UTF_8.name());
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        // 准备空数据列表
        List<DeptImportExcel> list = new ArrayList<>();
        // 使用EasyExcel导出,并注册RegionSheetWriteHandler
        EasyExcel.write(response.getOutputStream(), DeptImportExcel.class)
                .registerWriteHandler(new RegionSheetWriteHandler())
                .sheet("机构表")
                .doWrite(list);
    }
}
drone-service/drone-system/src/main/java/org/sxkj/system/excel/DeptImportExcel.java
New file
@@ -0,0 +1,62 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill 庄骞 (smallchill@163.com)
 */
package org.sxkj.system.excel;
import com.alibaba.excel.annotation.ExcelProperty;
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 lombok.Data;
import org.sxkj.system.util.excel.ExcelDictConverter;
import org.sxkj.system.util.excel.ExcelDictItem;
import org.sxkj.system.util.excel.ExcelDictItemLabel;
import java.io.Serializable;
/**
 * RegionExcel
 *
 * @author Chill
 */
@Data
@ColumnWidth(16)
@HeadRowHeight(20)
@ContentRowHeight(18)
public class DeptImportExcel implements Serializable {
    private static final long serialVersionUID = 1L;
    @ExcelProperty("机构名称")
    @ColumnWidth(20)
    private String deptName;
    @ExcelProperty(value = "所属区划", converter = ExcelDictConverter.class)
    @ColumnWidth(20)
    @ExcelDictItemLabel(type = "regionName")
    @ExcelDictItem(type = "regionName")
    private String areaCode;
    @ExcelProperty("机构描述")
    @ColumnWidth(20)
    private String remark;
    @ColumnWidth(20)
    @ExcelProperty(value = "机构状态", converter = ExcelDictConverter.class)
    @ExcelDictItemLabel(type = "institutionStatus")
    @ExcelDictItem(type = "institutionStatus")
    private String status;
}
drone-service/drone-system/src/main/java/org/sxkj/system/excel/DeptImporter.java
@@ -29,13 +29,13 @@
 * @author Chill
 */
@RequiredArgsConstructor
public class DeptImporter implements ExcelImporter<DeptExcel> {
public class DeptImporter implements ExcelImporter<DeptImportExcel> {
    private final IDeptService service;
    private final Boolean isCovered;
    @Override
    public void save(List<DeptExcel> data) {
    public void save(List<DeptImportExcel> data) {
        service.importDept(data, isCovered);
    }
}
drone-service/drone-system/src/main/java/org/sxkj/system/mapper/RegionMapper.xml
@@ -155,7 +155,8 @@
        FROM
            blade_region
        <where>
            city_code = '360800000000'
                city_code = '360800000000'
                and region_level > '2'
            <if test="param2.status!=null">
                and status = #{param1.status}
            </if>
drone-service/drone-system/src/main/java/org/sxkj/system/service/IDeptService.java
@@ -23,6 +23,7 @@
import org.sxkj.common.node.TreeStringNode;
import org.sxkj.system.entity.Dept;
import org.sxkj.system.excel.DeptExcel;
import org.sxkj.system.excel.DeptImportExcel;
import org.sxkj.system.param.DeptExportParam;
import org.sxkj.system.param.DeptPageParam;
import org.sxkj.system.vo.DeptVO;
@@ -202,7 +203,7 @@
     * @param data
     * @param isCovered
     */
    void importDept(List<DeptExcel> data, Boolean isCovered);
    void importDept(List<DeptImportExcel> data, Boolean isCovered);
    /**
     * 导出部门
drone-service/drone-system/src/main/java/org/sxkj/system/service/impl/DeptServiceImpl.java
@@ -32,12 +32,15 @@
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringPool;
import org.springframework.stereotype.Service;
import org.sxkj.common.constant.WordOrderConstant;
import org.sxkj.common.func.Streams;
import org.sxkj.common.node.TreeStringNode;
import org.sxkj.common.utils.NodeTreeUtil;
import org.sxkj.common.utils.OrderNumUtils;
import org.sxkj.system.cache.SysCache;
import org.sxkj.system.entity.Dept;
import org.sxkj.system.excel.DeptExcel;
import org.sxkj.system.excel.DeptImportExcel;
import org.sxkj.system.mapper.DeptMapper;
import org.sxkj.system.param.DeptExportParam;
import org.sxkj.system.param.DeptPageParam;
@@ -301,6 +304,7 @@
    /**
     * 分页查询
     *
     * @param page
     * @param deptPageParam
     * @return
@@ -312,11 +316,12 @@
    /**
     * 导入部门
     *
     * @param data
     * @param isCovered
     */
    @Override
    public void importDept(List<DeptExcel> data, Boolean isCovered) {
    public void importDept(List<DeptImportExcel> data, Boolean isCovered) {
        List<Dept> list = new ArrayList<>();
        data.forEach(deptExcel -> {
            Dept dept = BeanUtil.copy(deptExcel, Dept.class);
@@ -325,12 +330,17 @@
        if (isCovered) {
            this.saveOrUpdateBatch(list);
        } else {
            list.forEach(item -> {
                String times = OrderNumUtils.initOrderNum2(WordOrderConstant.ORG_CODE);
                String deptCode = WordOrderConstant.ORG_PREFIX + times;
                item.setDeptCode(deptCode);
            });
            this.saveBatch(list);
        }
    }
    @Override
    public List<DeptExcel> exportDept(DeptExportParam dept) {
          return baseMapper.exportDept(dept);
        return baseMapper.exportDept(dept);
    }
}
drone-service/drone-system/src/main/java/org/sxkj/system/util/excel/RegionSheetWriteHandler.java
New file
@@ -0,0 +1,78 @@
package org.sxkj.system.util.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.CellRangeAddressList;
import java.util.ArrayList;
import java.util.List;
/**
 * 区域数据验证处理器
 * <p>
 * 用于为Excel导出模板中的区域列添加下拉选择功能
 * </p>
 *
 * @author Chill
 */
public class RegionSheetWriteHandler implements SheetWriteHandler {
    /**
     * 区域名称列表
     * <p>
     * 这里需要根据实际情况从区域数据源获取
     * </p>
     */
    private static final String[] REGION_NAMES = {
            "吉州区", "青原区", "吉安县", "吉水县", "峡江县", "新干县", "永丰县", "泰和县", "遂川县", "万安县"
    };
    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        // 工作表创建前的操作,暂时不需要
    }
    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        Workbook workbook = writeWorkbookHolder.getWorkbook();
        Sheet sheet = writeSheetHolder.getSheet();
        // 为区域列添加下拉选择
        // 假设区域列是第3列(索引为1),从第2行开始(索引为1)
        addRegionValidation(workbook, sheet, 1, 1, 1000);
    }
    /**
     * 为区域列添加数据验证,设置下拉选择
     *
     * @param workbook 工作簿
     * @param sheet    工作表
     * @param column   列索引
     * @param startRow 开始行索引
     * @param endRow   结束行索引
     */
    private void addRegionValidation(Workbook workbook, Sheet sheet, int column, int startRow, int endRow) {
        // 创建数据验证助手
        DataValidationHelper helper = sheet.getDataValidationHelper();
        // 创建下拉列表约束
        DataValidationConstraint constraint = helper.createExplicitListConstraint(REGION_NAMES);
        // 创建数据验证区域
        CellRangeAddressList addressList = new CellRangeAddressList(startRow, endRow, column, column);
        // 创建数据验证
        DataValidation validation = helper.createValidation(constraint, addressList);
        // 设置验证错误提示
        validation.setErrorStyle(DataValidation.ErrorStyle.STOP);
        validation.setShowErrorBox(true);
        validation.setSuppressDropDownArrow(true);
        validation.createErrorBox("输入错误", "请从下拉列表中选择区域名称");
        // 添加数据验证到工作表
        sheet.addValidationData(validation);
    }
}