增加设备维护信息管理

This commit is contained in:
sdy 2026-06-15 14:43:39 +08:00
parent 5e8e1586fc
commit e28d4aa921
14 changed files with 547 additions and 3 deletions

View File

@ -22,6 +22,7 @@ public interface BusinessConstant {
String SPEAKER_AUDIO_BUCKET = "speaker-audio";//喊话器音频桶 String SPEAKER_AUDIO_BUCKET = "speaker-audio";//喊话器音频桶
String GEO_MARK_BUCKET = "geo-mark";//地图标注文件桶 String GEO_MARK_BUCKET = "geo-mark";//地图标注文件桶
String DICT_IMAGE_BUCKET = "source-material";//字典图片桶 String DICT_IMAGE_BUCKET = "source-material";//字典图片桶
String MAINTENANCE_IMAGE_BUCKET = "maintenance-images";//字典图片桶
//********************************* route action *********************************// //********************************* route action *********************************//
String DEFAULT_ACTION_TRIGGER_TYPE = "reachPoint";//默认动作触发器类型 到达航点执行 String DEFAULT_ACTION_TRIGGER_TYPE = "reachPoint";//默认动作触发器类型 到达航点执行

View File

@ -0,0 +1,99 @@
package com.multictrl.modules.business.controller;
import com.multictrl.common.annotation.ApiOrder;
import com.multictrl.common.annotation.LogOperation;
import com.multictrl.common.constant.Constant;
import com.multictrl.common.page.PageData;
import com.multictrl.common.utils.Result;
import com.multictrl.common.validator.AssertUtils;
import com.multictrl.common.validator.ValidatorUtils;
import com.multictrl.common.validator.group.AddGroup;
import com.multictrl.common.validator.group.UpdateGroup;
import com.multictrl.modules.business.dto.MaintenanceDTO;
import com.multictrl.modules.business.service.MaintenanceService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.*;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import java.util.Map;
/**
* 设备维护信息
*
* @author Sdy
* @since 1.0.0 2026-06-12
*/
@RestController
@RequestMapping("business/maintenance")
@Tag(name = "设备维护")
@ApiOrder(23)
@RequiredArgsConstructor
public class MaintenanceController {
private final MaintenanceService maintenanceService;
@GetMapping("page")
@Operation(summary = "分页")
@Parameters({
@Parameter(name = Constant.PAGE, description = "当前页码从1开始"),
@Parameter(name = Constant.LIMIT, description = "每页显示记录数"),
@Parameter(name = "dockSn", description = "机库SN"),
@Parameter(name = "date", description = "维保日期 yyyy-MM-dd")
})
@RequiresPermissions("bus:maintenance:page")
public Result<PageData<MaintenanceDTO>> page(@Parameter(hidden = true) @RequestParam Map<String, Object> params) {
PageData<MaintenanceDTO> page = maintenanceService.pageList(params);
return new Result<PageData<MaintenanceDTO>>().ok(page);
}
@GetMapping("{id}")
@Operation(summary = "信息")
@RequiresPermissions("bus:maintenance:info")
public Result<MaintenanceDTO> get(@PathVariable("id") Long id) {
MaintenanceDTO data = maintenanceService.getInfo(id);
return new Result<MaintenanceDTO>().ok(data);
}
@PostMapping
@Operation(summary = "保存")
@LogOperation("保存")
@RequiresPermissions("bus:maintenance:save")
public Result<Object> save(@RequestBody MaintenanceDTO dto) {
//效验数据
ValidatorUtils.validateEntity(dto, AddGroup.class);
maintenanceService.addMaintenance(dto);
return new Result<>();
}
@PutMapping
@Operation(summary = "修改")
@LogOperation("修改")
@RequiresPermissions("bus:maintenance:update")
public Result<Object> update(@RequestBody MaintenanceDTO dto) {
//效验数据
ValidatorUtils.validateEntity(dto, UpdateGroup.class);
maintenanceService.updateMaintenance(dto);
return new Result<>();
}
@DeleteMapping
@Operation(summary = "删除")
@LogOperation("删除")
@RequiresPermissions("bus:maintenance:delete")
public Result<Object> delete(@RequestBody Long[] ids) {
//效验数据
AssertUtils.isArrayEmpty(ids, "id");
maintenanceService.deleteMaintenance(ids);
return new Result<>();
}
}

View File

@ -59,11 +59,22 @@ public class MinioController {
@Operation(summary = "上传字典图片") @Operation(summary = "上传字典图片")
@PostMapping("/uploadDictImage") @PostMapping("/uploadDictImage")
public Result<String> uploadDictImage( public Result<String> uploadDictImage(
@RequestParam("file") MultipartFile file) { @RequestParam("file") MultipartFile file) {
if (file.isEmpty()) { if (file.isEmpty()) {
return new Result<String>().error(ErrorCode.UPLOAD_FILE_EMPTY); return new Result<String>().error(ErrorCode.UPLOAD_FILE_EMPTY);
} }
return new Result<String>().ok(minioService.uploadDictImage( file)); return new Result<String>().ok(minioService.uploadDictImage(file));
}
@Operation(summary = "上传维保图片")
@PostMapping("/uploadMaintenanceImage/{dockSn}")
public Result<String> uploadMaintenanceImage(@PathVariable String dockSn,
@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return new Result<String>().error(ErrorCode.UPLOAD_FILE_EMPTY);
}
return new Result<String>().ok(minioService.uploadMaintenanceImage(dockSn, file));
} }
} }

View File

@ -0,0 +1,21 @@
package com.multictrl.modules.business.dao;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.multictrl.common.dao.BaseDao;
import com.multictrl.modules.business.entity.MaintenanceEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 设备维护信息
*
* @author Sdy
* @since 1.0.0 2026-06-12
*/
@Mapper
public interface MaintenanceDao extends BaseDao<MaintenanceEntity> {
//分页列表查询
IPage<MaintenanceEntity> pageList(IPage<MaintenanceEntity> page, @Param("ew") QueryWrapper<MaintenanceEntity> wrapper);
}

View File

@ -0,0 +1,16 @@
package com.multictrl.modules.business.dao;
import com.multictrl.common.dao.BaseDao;
import com.multictrl.modules.business.entity.MaintenanceImgEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 维保图片
*
* @author Sdy
* @since 1.0.0 2026-06-12
*/
@Mapper
public interface MaintenanceImgDao extends BaseDao<MaintenanceImgEntity> {
}

View File

@ -0,0 +1,62 @@
package com.multictrl.modules.business.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.multictrl.common.validator.group.AddGroup;
import com.multictrl.common.validator.group.UpdateGroup;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Null;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* 设备维护信息
*
* @author Sdy
* @since 1.0.0 2026-06-12
*/
@Data
@Schema(name = "设备维护信息")
public class MaintenanceDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Null(message = "标识必须为空", groups = {AddGroup.class})
@NotNull(message = "标识不能为空", groups = {UpdateGroup.class})
@Schema(description = "标识")
private Long id;
@NotBlank(message = "机库SN不能为空", groups = {AddGroup.class, UpdateGroup.class})
@Schema(description = "机库SN")
private String dockSn;
@Schema(description = "维护内容")
private String content;
@NotBlank(message = "操作人不能为空", groups = {AddGroup.class, UpdateGroup.class})
@Schema(description = "操作人")
private String operator;
@NotNull(message = "操作时间不能为空", groups = {AddGroup.class, UpdateGroup.class})
@Schema(description = "操作时间")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date operationDate;
@Schema(description = "图片集合")
private List<String> imageUrls;
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
@Schema(description = "机库名称")
private String dockName;
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
@Schema(description = "机库型号")
private String dockModel;
}

View File

@ -0,0 +1,54 @@
package com.multictrl.modules.business.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.multictrl.common.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 设备维护信息
*
* @author Sdy
* @since 1.0.0 2026-06-12
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("bus_maintenance")
public class MaintenanceEntity extends BaseEntity {
/**
* 机库SN
*/
private String dockSn;
/**
* 维护内容
*/
private String content;
/**
* 操作人
*/
private String operator;
/**
* 操作时间
*/
private Date operationDate;
/**
* $column.comments
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updater;
/**
* $column.comments
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateDate;
@TableField(exist = false)
private String dockName;
@TableField(exist = false)
private String dockModel;
}

View File

@ -0,0 +1,29 @@
package com.multictrl.modules.business.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
* 维保图片
*
* @author Sdy
* @since 1.0.0 2026-06-12
*/
@Data
@TableName("bus_maintenance_img")
public class MaintenanceImgEntity {
@TableId
private Long id;
/**
* $column.comments
*/
private Long maintenanceId;
/**
* $column.comments
*/
private String imageUrl;
}

View File

@ -0,0 +1,32 @@
package com.multictrl.modules.business.service;
import com.multictrl.common.page.PageData;
import com.multictrl.common.service.CrudService;
import com.multictrl.modules.business.dto.MaintenanceDTO;
import com.multictrl.modules.business.entity.MaintenanceEntity;
import java.util.Map;
/**
* 设备维护信息
*
* @author Sdy
* @since 1.0.0 2026-06-12
*/
public interface MaintenanceService extends CrudService<MaintenanceEntity, MaintenanceDTO> {
//分页列表
PageData<MaintenanceDTO> pageList(Map<String, Object> params);
//获取详情
MaintenanceDTO getInfo(Long id);
//新增设备维护
void addMaintenance(MaintenanceDTO dto);
//修改设备维护
void updateMaintenance(MaintenanceDTO dto);
//删除设备维护
void deleteMaintenance(Long[] ids);
}

View File

@ -45,4 +45,7 @@ public interface MinioService {
//上传字典图片 //上传字典图片
String uploadDictImage(MultipartFile file); String uploadDictImage(MultipartFile file);
//上传维保图片
String uploadMaintenanceImage(String dockSn, MultipartFile file);
} }

View File

@ -0,0 +1,127 @@
package com.multictrl.modules.business.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.multictrl.common.constant.BusinessConstant;
import com.multictrl.common.page.PageData;
import com.multictrl.common.service.impl.CrudServiceImpl;
import com.multictrl.common.utils.ConvertUtils;
import com.multictrl.common.utils.DateUtils;
import com.multictrl.modules.business.dao.MaintenanceDao;
import com.multictrl.modules.business.dao.MaintenanceImgDao;
import com.multictrl.modules.business.dto.MaintenanceDTO;
import com.multictrl.modules.business.entity.MaintenanceEntity;
import com.multictrl.modules.business.entity.MaintenanceImgEntity;
import com.multictrl.modules.business.service.DockService;
import com.multictrl.modules.business.service.MaintenanceService;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
/**
* 设备维护信息
*
* @author Sdy
* @since 1.0.0 2026-06-12
*/
@Service
@RequiredArgsConstructor
public class MaintenanceServiceImpl extends CrudServiceImpl<MaintenanceDao, MaintenanceEntity, MaintenanceDTO> implements MaintenanceService {
private final MaintenanceImgDao maintenanceImgDao;
private final DockService dockService;
@Override
public QueryWrapper<MaintenanceEntity> getWrapper(Map<String, Object> params) {
String id = (String) params.get("id");
String dockSn = (String) params.get("dockSn");
String date = (String) params.get("date");
QueryWrapper<MaintenanceEntity> wrapper = new QueryWrapper<>();
wrapper.eq(StrUtil.isNotBlank(id), "m.id", id);
wrapper.eq(StrUtil.isNotBlank(dockSn), "m.dock_sn", dockSn);
if (StrUtil.isNotBlank(date)) {
wrapper.between("m.operation_date", DateUtils.parse(date + " 00:00:00", DateUtils.DATE_TIME_PATTERN)
, DateUtils.parse(date + " 23:59:59", DateUtils.DATE_TIME_PATTERN));
}
wrapper.orderByDesc("m.update_date");
return wrapper;
}
@Override
public PageData<MaintenanceDTO> pageList(Map<String, Object> params) {
IPage<MaintenanceEntity> iPage = baseDao.pageList(getPage(params, null, false), getWrapper(params));
List<MaintenanceDTO> list = ConvertUtils.sourceToTarget(iPage.getRecords(), MaintenanceDTO.class);
if (CollUtil.isNotEmpty(list)) {
for (MaintenanceDTO dto : list) {
List<MaintenanceImgEntity> entityList = maintenanceImgDao.selectList(new QueryWrapper<MaintenanceImgEntity>()
.eq("maintenance_id", dto.getId()));
if (CollUtil.isNotEmpty(entityList)) {
List<String> imageList = entityList.stream().map(v -> BusinessConstant.IMAGE_PATH + v.getImageUrl()).toList();
dto.setImageUrls(imageList);
}
}
}
return new PageData<>(list, iPage.getTotal());
}
@Override
public MaintenanceDTO getInfo(Long id) {
MaintenanceEntity maintenanceEntity = selectById(id);
MaintenanceDTO dto = ConvertUtils.sourceToTarget(maintenanceEntity, MaintenanceDTO.class);
List<MaintenanceImgEntity> imgEntities = maintenanceImgDao.selectList(new QueryWrapper<MaintenanceImgEntity>()
.eq("maintenance_id", id));
List<String> imgList = Optional.ofNullable(imgEntities).orElse(Collections.emptyList())
.stream().map(MaintenanceImgEntity::getImageUrl).collect(Collectors.toList());
dto.setImageUrls(imgList);
return dto;
}
@Transactional(rollbackFor = Exception.class)
@Override
public void addMaintenance(MaintenanceDTO dto) {
MaintenanceEntity maintenanceEntity = ConvertUtils.sourceToTarget(dto, MaintenanceEntity.class);
insert(maintenanceEntity);
//增加图片
addImages(maintenanceEntity.getId(), dto.getImageUrls());
}
@Transactional(rollbackFor = Exception.class)
@Override
public void updateMaintenance(MaintenanceDTO dto) {
MaintenanceEntity maintenanceEntity = ConvertUtils.sourceToTarget(dto, MaintenanceEntity.class);
updateById(maintenanceEntity);
//删除图片
maintenanceImgDao.delete(new QueryWrapper<MaintenanceImgEntity>().eq("maintenance_id", maintenanceEntity.getId()));
//新增照片
addImages(maintenanceEntity.getId(), dto.getImageUrls());
}
@Transactional(rollbackFor = Exception.class)
@Override
public void deleteMaintenance(Long[] ids) {
delete(ids);
//删除图片
maintenanceImgDao.delete(new QueryWrapper<MaintenanceImgEntity>().in("maintenance_id", Arrays.asList(ids)));
}
//新增照片
private void addImages(Long maintenanceId, List<String> imageUrls) {
if (CollUtil.isNotEmpty(imageUrls)) {
for (String imageUrl : imageUrls) {
MaintenanceImgEntity imgEntity = new MaintenanceImgEntity();
imgEntity.setMaintenanceId(maintenanceId);
imgEntity.setImageUrl(imageUrl);
maintenanceImgDao.insert(imgEntity);
}
}
}
}

View File

@ -211,6 +211,20 @@ public class MinioServiceImpl implements MinioService {
return BusinessConstant.DICT_IMAGE_BUCKET + "/" + path; return BusinessConstant.DICT_IMAGE_BUCKET + "/" + path;
} }
@Override
public String uploadMaintenanceImage(String dockSn, MultipartFile file) {
//文件路径
String path = dockSn + "/" + DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN_COMPACT) + "." + FileNameUtil.extName(file.getOriginalFilename());
try {
uploadFile(file.getInputStream(), BusinessConstant.MAINTENANCE_IMAGE_BUCKET, path);
} catch (Exception e) {
log.error(ExceptionUtils.getErrorStackTrace(e));
throw new RenException(ErrorCode.OSS_UPLOAD_FILE_ERROR, file.getOriginalFilename());
}
return BusinessConstant.MAINTENANCE_IMAGE_BUCKET + "/" + path;
}
private String getMimeType(String fileName) { private String getMimeType(String fileName) {
if (fileName == null) return "application/octet-stream"; if (fileName == null) return "application/octet-stream";

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.multictrl.modules.business.dao.MaintenanceDao">
<resultMap type="com.multictrl.modules.business.entity.MaintenanceEntity" id="busMaintenanceMap">
<result property="id" column="id"/>
<result property="dockSn" column="dock_sn"/>
<result property="content" column="content"/>
<result property="operator" column="operator"/>
<result property="operationDate" column="operation_date"/>
<result property="creator" column="creator"/>
<result property="createDate" column="create_date"/>
<result property="updater" column="updater"/>
<result property="updateDate" column="update_date"/>
</resultMap>
<select id="pageList" resultType="com.multictrl.modules.business.entity.MaintenanceEntity">
SELECT m.*, d.dock_name, d.dock_model
FROM bus_maintenance m
LEFT JOIN bus_dock d on m.dock_sn = d.dock_sn
${ew.customSqlSegment}
</select>
</mapper>

View File

@ -2294,4 +2294,56 @@ ON TABLE "public"."bus_nofly_zone" IS '禁飞区';
-- Primary Key structure for table bus_nofly_zone -- Primary Key structure for table bus_nofly_zone
-- ---------------------------- -- ----------------------------
ALTER TABLE "public"."bus_nofly_zone" ALTER TABLE "public"."bus_nofly_zone"
ADD CONSTRAINT "uav_no_flying_pkey" PRIMARY KEY ("id"); ADD CONSTRAINT "uav_no_flying_pkey" PRIMARY KEY ("id");
--2026/6/15
DROP TABLE IF EXISTS "public"."bus_maintenance";
CREATE TABLE "public"."bus_maintenance"
(
"id" int8 NOT NULL,
"dock_sn" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
"content" text COLLATE "pg_catalog"."default",
"operator" varchar(255) COLLATE "pg_catalog"."default",
"operation_date" timestamp(6),
"creator" int8,
"create_date" timestamp(6),
"updater" int8,
"update_date" timestamp(6)
)
;
COMMENT
ON COLUMN "public"."bus_maintenance"."dock_sn" IS '机库SN';
COMMENT
ON COLUMN "public"."bus_maintenance"."content" IS '维护内容';
COMMENT
ON COLUMN "public"."bus_maintenance"."operator" IS '操作人';
COMMENT
ON COLUMN "public"."bus_maintenance"."operation_date" IS '操作时间';
COMMENT
ON TABLE "public"."bus_maintenance" IS '设备维护信息';
-- ----------------------------
-- Table structure for bus_maintenance_img
-- ----------------------------
DROP TABLE IF EXISTS "public"."bus_maintenance_img";
CREATE TABLE "public"."bus_maintenance_img"
(
"id" int8 NOT NULL,
"maintenance_id" int8 NOT NULL,
"image_url" varchar(255) COLLATE "pg_catalog"."default"
)
;
COMMENT
ON TABLE "public"."bus_maintenance_img" IS '维保图片';
-- ----------------------------
-- Primary Key structure for table bus_maintenance
-- ----------------------------
ALTER TABLE "public"."bus_maintenance"
ADD CONSTRAINT "bus_maintenance_pkey" PRIMARY KEY ("id");
-- ----------------------------
-- Primary Key structure for table bus_maintenance_img
-- ----------------------------
ALTER TABLE "public"."bus_maintenance_img"
ADD CONSTRAINT "bus_maintenance_img_pkey" PRIMARY KEY ("id");