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); } }