Xiajijian
2025-10-11 8fe759f26e23fb594f4bf02d6d4889f4521d41a7
1.修该并合并无人机盒子对象相关关系。
3 files added
9 files modified
5 files deleted
2 files renamed
1155 ■■■■■ changed files
ard-admin/src/main/java/com/ard/web/controller/data/MinioFileController.java 47 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/java/com/ard/web/controller/work/ArdDroneController.java 18 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/java/com/ard/web/controller/work/ArdServerController.java 4 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/java/com/ard/web/controller/work/uav/UavBoxController.java 42 ●●●●● patch | view | raw | blame | history
ard-ui/src/views/monitor/server/index.vue 16 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/component/minio/utils/MinioUtil.java 16 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/entity/ArdDroneInfo.java 87 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/entity/MinioSysFile.java 51 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/entity/UavBoxEntity.java 68 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/receiver/BoxInfoReceiver.java 14 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/mapper/ArdDroneInfoMapper.java 45 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/mapper/UavBoxMapper.java 61 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/IArdDroneService.java 48 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/IMinioFileService.java 53 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/IUavBoxService.java 64 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/impl/ArdDroneServiceImpl.java 124 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/impl/UavBoxServiceImpl.java 140 ●●●●● patch | view | raw | blame | history
ard-work/src/main/resources/mapper/ArdDroneInfoMapper.xml 149 ●●●●● patch | view | raw | blame | history
ard-work/src/main/resources/mapper/UavBoxMapper.xml 108 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/java/com/ard/web/controller/data/MinioFileController.java
New file
@@ -0,0 +1,47 @@
package com.ard.web.controller.data;
import com.ard.common.utils.file.FileUtils;
import com.ard.work.domain.entity.MinioSysFile;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import static com.ard.work.component.minio.utils.MinioUtil.uploadFile;
/**
 * 文件请求处理
 *
 * @author ard
 */
@Api(tags = "MinIo文件上传")
@RestController
@RequestMapping("/minoFile")
public class MinioFileController {
    private static final Logger log = LoggerFactory.getLogger(MinioFileController.class);
    /**
     * 文件上传-指定桶名称
     */
    @ApiOperation("文件上传-指定桶名称")
    @PostMapping("upload/{bucketName}/{fileName}")
    public MinioSysFile upload(@RequestPart("file")MultipartFile file,
                               @PathVariable String bucketName,
                               @PathVariable String fileName) {
        try {
            // 上传并返回访问地址
            String url = uploadFile(bucketName,fileName,file);
            MinioSysFile minioSysFile = new MinioSysFile();
            minioSysFile.setName(FileUtils.getName(url));
            minioSysFile.setUrl(url);
            return minioSysFile;
        } catch (Exception e) {
            log.error("上传文件失败", e);
            //return R.fail(e.getMessage());
            return null;
        }
    }
}
ard-admin/src/main/java/com/ard/web/controller/work/ArdDroneController.java
File was renamed from ard-admin/src/main/java/com/ard/web/controller/data/ArdDroneController.java
@@ -1,4 +1,4 @@
package com.ard.web.controller.data;
package com.ard.web.controller.work;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
@@ -32,11 +32,11 @@
 */
@Api(tags = "无人机管理接口")
@RestController
@RequestMapping("/data/drone")
@RequestMapping("/uav/drone")
public class ArdDroneController extends BaseController {
    @Autowired
    private IArdDroneService ardDroneManagementService;
    private IArdDroneService ardDroneService;
    /**
     * 查询无人机管理列表
@@ -46,7 +46,7 @@
    @GetMapping("/list")
    public TableDataInfo list(ArdDroneInfo ardDroneInfo) {
        startPage();
        List<ArdDroneInfo> list = ardDroneManagementService.selectArdDroneManagementList(ardDroneInfo);
        List<ArdDroneInfo> list = ardDroneService.selectArdDroneList(ardDroneInfo);
        return getDataTable(list);
    }
@@ -58,7 +58,7 @@
    @Log(title = "无人机管理", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, ArdDroneInfo ardDroneInfo) {
        List<ArdDroneInfo> list = ardDroneManagementService.selectArdDroneManagementList(ardDroneInfo);
        List<ArdDroneInfo> list = ardDroneService.selectArdDroneList(ardDroneInfo);
        ExcelUtil<ArdDroneInfo> util = new ExcelUtil<ArdDroneInfo>(ArdDroneInfo.class);
        util.exportExcel(response, list, "无人机管理数据");
    }
@@ -70,7 +70,7 @@
    @PreAuthorize("@ss.hasPermi('system:management:query')")
    @GetMapping(value = "/{id}")
    public AjaxResult getInfo(@PathVariable("id") String id) {
        return success(ardDroneManagementService.selectArdDroneManagementById(id));
        return success(ardDroneService.selectArdDroneById(id));
    }
    /**
@@ -81,7 +81,7 @@
    @Log(title = "无人机管理", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody ArdDroneInfo ardDroneInfo) {
        return toAjax(ardDroneManagementService.insertArdDroneManagement(ardDroneInfo));
        return toAjax(ardDroneService.insertArdDrone(ardDroneInfo));
    }
    /**
@@ -92,7 +92,7 @@
    @Log(title = "无人机管理", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody ArdDroneInfo ardDroneInfo) {
        return toAjax(ardDroneManagementService.updateArdDroneManagement(ardDroneInfo));
        return toAjax(ardDroneService.updateArdDrone(ardDroneInfo));
    }
    /**
@@ -103,7 +103,7 @@
    @Log(title = "无人机管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable String[] ids) {
        return toAjax(ardDroneManagementService.deleteArdDroneManagementByIds(ids));
        return toAjax(ardDroneService.deleteArdDroneByIds(ids));
    }
}
ard-admin/src/main/java/com/ard/web/controller/work/ArdServerController.java
File was renamed from ard-admin/src/main/java/com/ard/web/controller/data/ArdServerController.java
@@ -1,4 +1,4 @@
package com.ard.web.controller.data;
package com.ard.web.controller.work;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
@@ -32,7 +32,7 @@
 */
@Api(tags = "服务器管理接口")
@RestController
@RequestMapping("/data/server")
@RequestMapping("/uav/server")
public class ArdServerController extends BaseController {
    @Autowired
ard-admin/src/main/java/com/ard/web/controller/work/uav/UavBoxController.java
@@ -4,8 +4,8 @@
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import com.ard.work.domain.entity.UavBoxEntity;
import com.ard.work.service.IUavBoxService;
import com.ard.work.domain.entity.ArdDroneInfo;
import com.ard.work.service.IArdDroneService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -33,10 +33,10 @@
@Api(tags = "无人机盒子")
@RestController
@RequestMapping("/uav/box")
public class UavBoxController extends BaseController
{
public class UavBoxController extends BaseController {
    @Resource
    private IUavBoxService uavBoxService;
    private IArdDroneService ardDroneService;
    /**
     * 查询无人机盒子列表
@@ -44,10 +44,10 @@
    @ApiOperation("查询无人机盒子列表")
    @PreAuthorize("@ss.hasPermi('uav:box:list')")
    @GetMapping("/list")
    public TableDataInfo list(UavBoxEntity uavBoxEntity)
    public TableDataInfo list(ArdDroneInfo ArdDroneInfo)
    {
        startPage();
        List<UavBoxEntity> list = uavBoxService.selectUavBoxList(uavBoxEntity);
        List<ArdDroneInfo> list = ardDroneService.selectArdDroneList(ArdDroneInfo);
        return getDataTable(list);
    }
@@ -57,10 +57,9 @@
    @PreAuthorize("@ss.hasPermi('uav:box:export')")
    @Log(title = "无人机盒子", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, UavBoxEntity uavBoxEntity)
    {
        List<UavBoxEntity> list = uavBoxService.selectUavBoxList(uavBoxEntity);
        ExcelUtil<UavBoxEntity> util = new ExcelUtil<UavBoxEntity>(UavBoxEntity.class);
    public void export(HttpServletResponse response, ArdDroneInfo ArdDroneInfo) {
        List<ArdDroneInfo> list = ardDroneService.selectArdDroneList(ArdDroneInfo);
        ExcelUtil<ArdDroneInfo> util = new ExcelUtil<ArdDroneInfo>(ArdDroneInfo.class);
        util.exportExcel(response, list, "无人机盒子数据");
    }
@@ -70,9 +69,8 @@
    @ApiOperation("获取无人机盒子详细信息")
    @PreAuthorize("@ss.hasPermi('uav:box:query')")
    @GetMapping(value = "/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id)
    {
        return success(uavBoxService.selectUavBoxById(id));
    public AjaxResult getInfo(@PathVariable("id") String id) {
        return success(ardDroneService.selectArdDroneById(id));
    }
    /**
@@ -82,9 +80,8 @@
    @PreAuthorize("@ss.hasPermi('uav:box:add')")
    @Log(title = "无人机盒子", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody UavBoxEntity uavBoxEntity)
    {
        return toAjax(uavBoxService.insertUavBox(uavBoxEntity));
    public AjaxResult add(@RequestBody ArdDroneInfo ardDroneInfo) {
        return toAjax(ardDroneService.insertArdDrone(ardDroneInfo));
    }
    /**
@@ -94,9 +91,8 @@
    @PreAuthorize("@ss.hasPermi('uav:box:edit')")
    @Log(title = "无人机盒子", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody UavBoxEntity uavBoxEntity)
    {
        return toAjax(uavBoxService.updateUavBox(uavBoxEntity));
    public AjaxResult edit(@RequestBody ArdDroneInfo ArdDroneInfo) {
        return toAjax(ardDroneService.updateArdDrone(ArdDroneInfo));
    }
    /**
@@ -106,8 +102,8 @@
    @PreAuthorize("@ss.hasPermi('uav:box:remove')")
    @Log(title = "无人机盒子", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable Long[] ids)
    {
        return toAjax(uavBoxService.deleteUavBoxByIds(ids));
    public AjaxResult remove(@PathVariable String[] ids) {
        return toAjax(ardDroneService.deleteArdDroneByIds(ids));
    }
}
ard-ui/src/views/monitor/server/index.vue
@@ -157,14 +157,14 @@
                </tr>
              </thead>
              <tbody v-if="server.sysFiles">
                <tr v-for="(sysFile, index) in server.sysFiles" :key="index">
                  <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.dirName }}</div></td>
                  <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.sysTypeName }}</div></td>
                  <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.typeName }}</div></td>
                  <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.total }}</div></td>
                  <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.free }}</div></td>
                  <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.used }}</div></td>
                  <td class="el-table__cell is-leaf"><div class="cell" :class="{'text-danger': sysFile.usage > 80}">{{ sysFile.usage }}%</div></td>
                <tr v-for="(minioSysFile, index) in server.sysFiles" :key="index">
                  <td class="el-table__cell is-leaf"><div class="cell">{{ minioSysFile.dirName }}</div></td>
                  <td class="el-table__cell is-leaf"><div class="cell">{{ minioSysFile.sysTypeName }}</div></td>
                  <td class="el-table__cell is-leaf"><div class="cell">{{ minioSysFile.typeName }}</div></td>
                  <td class="el-table__cell is-leaf"><div class="cell">{{ minioSysFile.total }}</div></td>
                  <td class="el-table__cell is-leaf"><div class="cell">{{ minioSysFile.free }}</div></td>
                  <td class="el-table__cell is-leaf"><div class="cell">{{ minioSysFile.used }}</div></td>
                  <td class="el-table__cell is-leaf"><div class="cell" :class="{'text-danger': minioSysFile.usage > 80}">{{ minioSysFile.usage }}%</div></td>
                </tr>
              </tbody>
            </table>
ard-work/src/main/java/com/ard/work/component/minio/utils/MinioUtil.java
@@ -76,16 +76,24 @@
     * 上传文件
     *
     * @param bucketName 桶名称
     * @param fileName
     * @param fileName 文件名
     * @throws IOException
     */
    public static String uploadFile(String bucketName, String fileName, MultipartFile multipartFile) throws IOException {
        String url = "";
        MinioClient minioClient = SpringUtils.getBean(MinioClient.class);
        try (InputStream inputStream = multipartFile.getInputStream()) {
            minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(inputStream,
                    multipartFile.getSize(), -1).contentType(multipartFile.getContentType()).build());
            url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(fileName).method(Method.GET).build());
            minioClient.putObject(PutObjectArgs.builder().
                    bucket(bucketName).
                    object(fileName).
                    stream(inputStream,multipartFile.getSize(), -1).
                    contentType(multipartFile.getContentType()).
                    build());
            url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().
                    bucket(bucketName).
                    object(fileName).
                    method(Method.GET).
                    build());
            url = url.substring(0, url.indexOf('?'));
            return ServletUtils.urlDecode(url);
        } catch (Exception e) {
ard-work/src/main/java/com/ard/work/domain/entity/ArdDroneInfo.java
@@ -1,43 +1,90 @@
package com.ard.work.domain.entity;
import java.util.Date;
import com.ard.common.annotation.Excel;
import com.ard.common.core.domain.BaseEntity;
import lombok.Data;
import com.ard.work.domain.receiver.BoxInfoReceiver;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;
import java.util.Date;
import java.util.Objects;
/**
 * 无人机管理对象 ard_drone_info
 * 无人机盒子对象 uav_box
 * 
 * @author xia
 * @date 2025-10-10
 * @author ruoyi
 * @date 2025-03-04
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ArdDroneInfo extends BaseEntity {
    private static final long serialVersionUID = 1L;
    /** ID */
    private String id;
    /** 主键 */
    private Long id;
    /** 设备型号 */
    private String deviceModel;
    /** 盒子编码 */
    @Excel(name = "盒子编码")
    private String boxSn;
    /** 设备SN */
    private String deviceSn;
    /** 盒子名称 */
    @Excel(name = "盒子名称")
    private String boxName;
    /** 设备名称 */
    private String deviceName;
    /** 盒子版本 */
    @Excel(name = "盒子版本")
    private String boxVersion;
    /** 工作状态 */
    private String deviceStatus;
    /** 启动时间 */
    @Excel(name = "启动时间")
    private Date startTime;
    /** 加入时间 */
    private Date deviceAddTime;
    /** 在线状态 */
    @Excel(name = "在线状态")
    private Integer onLine;
    /** 在线时间 */
    private Date onlineTime;
    /** 视频服务器地址 */
    @Excel(name = "视频服务器地址")
    private String videoServer;
    /** 视频服务器端口 */
    @Excel(name = "视频服务器端口")
    private Integer videoPort;
    /** 最后任务id */
    @Excel(name = "最后任务id")
    private Integer lastTaskId;
    /** 用户ID */
    @Excel(name = "用户ID")
    private Long userId;
    /** 部门ID */
    @Excel(name = "部门ID")
    private Long deptId;
    /** 服务器管理ID */
    @Excel(name = "服务器管理ID")
    private String serverInfoId;
    /**
     * 服务器实体对象
     */
    private ArdServerInfo ardServerInfo;
    /**
     * 判断两个无人机对象的属性是否相同
     */
    public boolean isSameAs(BoxInfoReceiver other) {
        return Objects.equals(this.boxName, other.getBoxName()) &&
                Objects.equals(this.boxVersion, other.getBoxVersion()) &&
                Objects.equals(this.lastTaskId, other.getLastTaskId()) &&
                Objects.equals(this.onLine, other.getOnLine());
        // 对比其他属性
    }
}
ard-work/src/main/java/com/ard/work/domain/entity/MinioSysFile.java
New file
@@ -0,0 +1,51 @@
package com.ard.work.domain.entity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
 * 文件信息
 *
 * @author ard
 */
public class MinioSysFile {
    /**
     * 文件名称
     */
    private String name;
    /**
     * 文件地址
     */
    private String url;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public String getUrl()
    {
        return url;
    }
    public void setUrl(String url)
    {
        this.url = url;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
                .append("name", getName())
                .append("url", getUrl())
                .toString();
    }
}
ard-work/src/main/java/com/ard/work/domain/entity/UavBoxEntity.java
File was deleted
ard-work/src/main/java/com/ard/work/domain/receiver/BoxInfoReceiver.java
@@ -1,5 +1,6 @@
package com.ard.work.domain.receiver;
import com.ard.work.domain.entity.ArdServerInfo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@@ -34,6 +35,8 @@
    /**
     * 云盒在线状态
     * 0:不在线
     * 1:在线
     */
    @JsonProperty("onLine")
    private Integer onLine;
@@ -56,4 +59,15 @@
    @JsonProperty("lastTaskId")
    private Integer lastTaskId;
    /**
     * 服务器实体对象ID
     */
    @JsonProperty("lastTaskId")
    private String serverInfoId;
    /**
     * 服务器实体对象
     */
    private ArdServerInfo ardServerInfo;
}
ard-work/src/main/java/com/ard/work/mapper/ArdDroneInfoMapper.java
@@ -5,58 +5,57 @@
import java.util.List;
/**
 * 无人机管理Mapper接口
 * 无人机盒子Mapper接口
 * 
 * @author xia
 * @date 2025-10-10
 * @author lsy
 * @date 2025-03-04
 */
public interface ArdDroneInfoMapper {
    /**
     * 查询无人机管理
     * 查询无人机盒子
     * 
     * @param id 无人机管理主键
     * @return 无人机管理
     * @param id 无人机盒子主键
     * @return 无人机盒子
     */
    public ArdDroneInfo selectArdDroneManagementById(String id);
    ArdDroneInfo selectArdDroneById(String id);
    /**
     * 查询无人机管理列表
     * 查询无人机盒子列表
     * 
     * @param ardDroneInfo 无人机管理
     * @return 无人机管理集合
     * @param ArdDroneInfo 无人机盒子
     * @return 无人机盒子集合
     */
    public List<ArdDroneInfo> selectArdDroneManagementList(ArdDroneInfo ardDroneInfo);
    List<ArdDroneInfo> selectArdDroneList(ArdDroneInfo ArdDroneInfo);
    /**
     * 新增无人机管理
     * 新增无人机盒子
     * 
     * @param ardDroneInfo 无人机管理
     * @param ArdDroneInfo 无人机盒子
     * @return 结果
     */
    public int insertArdDroneManagement(ArdDroneInfo ardDroneInfo);
    int insertArdDrone(ArdDroneInfo ArdDroneInfo);
    /**
     * 修改无人机管理
     * 修改无人机盒子
     * 
     * @param ardDroneInfo 无人机管理
     * @param ArdDroneInfo 无人机盒子
     * @return 结果
     */
    public int updateArdDroneManagement(ArdDroneInfo ardDroneInfo);
    int updateArdDrone(ArdDroneInfo ArdDroneInfo);
    /**
     * 删除无人机管理
     * 删除无人机盒子
     * 
     * @param id 无人机管理主键
     * @param id 无人机盒子主键
     * @return 结果
     */
    public int deleteArdDroneManagementById(String id);
    int deleteArdDroneById(String id);
    /**
     * 批量删除无人机管理
     * 批量删除无人机盒子
     * 
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteArdDroneManagementByIds(String[] ids);
    int deleteArdDroneByIds(String[] ids);
}
ard-work/src/main/java/com/ard/work/mapper/UavBoxMapper.java
File was deleted
ard-work/src/main/java/com/ard/work/service/IArdDroneService.java
@@ -1,62 +1,64 @@
package com.ard.work.service;
import com.ard.work.domain.entity.ArdDroneInfo;
import java.util.List;
/**
 * 无人机管理Service接口
 * 无人机盒子Service接口
 * 
 * @author xia
 * @date 2025-10-10
 * @author ruoyi
 * @date 2025-03-04
 */
public interface IArdDroneService {
    /**
     * 查询无人机管理
     * 查询无人机盒子
     * 
     * @param id 无人机管理主键
     * @return 无人机管理
     * @param id 无人机盒子主键
     * @return 无人机盒子
     */
    public ArdDroneInfo selectArdDroneManagementById(String id);
    public ArdDroneInfo selectArdDroneById(String id);
    /**
     * 查询无人机管理列表
     * 查询无人机盒子列表
     * 
     * @param ardDroneInfo 无人机管理
     * @return 无人机管理集合
     * @param ArdDroneInfo 无人机盒子
     * @return 无人机盒子集合
     */
    public List<ArdDroneInfo> selectArdDroneManagementList(ArdDroneInfo ardDroneInfo);
    public List<ArdDroneInfo> selectArdDroneList(ArdDroneInfo ArdDroneInfo);
    /**
     * 新增无人机管理
     * 新增无人机盒子
     * 
     * @param ardDroneInfo 无人机管理
     * @param ArdDroneInfo 无人机盒子
     * @return 结果
     */
    public int insertArdDroneManagement(ArdDroneInfo ardDroneInfo);
    public int insertArdDrone(ArdDroneInfo ArdDroneInfo);
    /**
     * 修改无人机管理
     * 修改无人机盒子
     * 
     * @param ardDroneInfo 无人机管理
     * @param ArdDroneInfo 无人机盒子
     * @return 结果
     */
    public int updateArdDroneManagement(ArdDroneInfo ardDroneInfo);
    public int updateArdDrone(ArdDroneInfo ArdDroneInfo);
    /**
     * 批量删除无人机管理
     * 批量删除无人机盒子
     * 
     * @param ids 需要删除的无人机管理主键集合
     * @param ids 需要删除的无人机盒子主键集合
     * @return 结果
     */
    public int deleteArdDroneManagementByIds(String[] ids);
    public int deleteArdDroneByIds(String[] ids);
    /**
     * 删除无人机管理信息
     * 删除无人机盒子信息
     * 
     * @param id 无人机管理主键
     * @param id 无人机盒子主键
     * @return 结果
     */
    public int deleteArdDroneManagementById(String id);
    public int deleteArdDroneById(String id);
}
ard-work/src/main/java/com/ard/work/service/IMinioFileService.java
New file
@@ -0,0 +1,53 @@
package com.ard.work.service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
/**
 * 文件上传接口
 *
 * @author ard
 */
public interface IMinioFileService {
    /**
     * 文件上传接口
     *
     * @param file 上传的文件
     * @return 访问地址
     * @throws Exception
     */
    public String uploadFile(MultipartFile file) throws Exception;
    /**
     * 文件上传-指定桶名称
     *
     * @param file 上传的文件
     * @param bucketName 桶名称
     * @return 访问地址
     * @throws Exception
     */
    public String uploadFile(MultipartFile file, String bucketName) throws Exception;
    /**
     * 文件下载接口
     */
    public void downloadFile(String fileName, HttpServletResponse response) throws Exception;
    /**
     * 文件下载接口-指定桶名称
     */
    public void downloadFile(String fileName, String bucketName, HttpServletResponse response) throws Exception;
    /**
     * 文件删除接口
     */
    public void deleteFile(String fileName) throws Exception;
    /**
     * 文件删除接口-指定桶名称
     */
    public void deleteFile(String fileName, String bucketName) throws Exception;
}
ard-work/src/main/java/com/ard/work/service/IUavBoxService.java
File was deleted
ard-work/src/main/java/com/ard/work/service/impl/ArdDroneServiceImpl.java
@@ -1,94 +1,142 @@
package com.ard.work.service.impl;
import com.ard.common.utils.uuid.IdUtils;
import com.ard.common.utils.DateUtils;
import com.ard.work.domain.entity.ArdDroneInfo;
import com.ard.work.domain.receiver.BoxInfoReceiver;
import com.ard.work.mapper.ArdDroneInfoMapper;
import com.ard.work.service.ITyService;
import com.ard.work.service.IArdDroneService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Stack;
import java.util.stream.Collectors;
/**
 * 无人机管理Service业务层处理
 * 无人机盒子Service业务层处理
 * 
 * @author xia
 * @date 2025-10-10
 * @author ruoyi
 * @date 2025-03-04
 */
@Service
public class ArdDroneServiceImpl implements IArdDroneService {
    @Autowired
    private ArdDroneInfoMapper ardDroneInfoMapper;
    @Resource
    private ArdDroneInfoMapper ArdDroneInfoMapper;
    @Resource
    private ITyService tyService;
    /**
     * 查询无人机管理
     * 查询无人机盒子
     * 
     * @param id 无人机管理主键
     * @return 无人机管理
     * @param id 无人机盒子主键
     * @return 无人机盒子
     */
    @Override
    public ArdDroneInfo selectArdDroneManagementById(String id)
    {
        return ardDroneInfoMapper.selectArdDroneManagementById(id);
    public ArdDroneInfo selectArdDroneById(String id) {
        return ArdDroneInfoMapper.selectArdDroneById(id);
    }
    /**
     * 查询无人机管理列表
     * 查询无人机盒子列表
     * 
     * @param ardDroneInfo 无人机管理
     * @return 无人机管理
     * @param ArdDroneInfo 无人机盒子
     * @return 无人机盒子
     */
    @Override
    public List<ArdDroneInfo> selectArdDroneManagementList(ArdDroneInfo ardDroneInfo) {
        return ardDroneInfoMapper.selectArdDroneManagementList(ardDroneInfo);
    public List<ArdDroneInfo> selectArdDroneList(ArdDroneInfo ArdDroneInfo) {
        return ArdDroneInfoMapper.selectArdDroneList(ArdDroneInfo);
    }
    /**
     * 新增无人机管理
     * 新增无人机盒子
     * 
     * @param ardDroneInfo 无人机管理
     * @param ArdDroneInfo 无人机盒子
     * @return 结果
     */
    @Override
    public int insertArdDroneManagement(ArdDroneInfo ardDroneInfo) {
        ardDroneInfo.setId(IdUtils.fastUUID());
        return ardDroneInfoMapper.insertArdDroneManagement(ardDroneInfo);
    public int insertArdDrone(ArdDroneInfo ArdDroneInfo) {
        ArdDroneInfo.setCreateTime(DateUtils.getNowDate());
        return ArdDroneInfoMapper.insertArdDrone(ArdDroneInfo);
    }
    /**
     * 修改无人机管理
     * 修改无人机盒子
     * 
     * @param ardDroneInfo 无人机管理
     * @param ArdDroneInfo 无人机盒子
     * @return 结果
     */
    @Override
    public int updateArdDroneManagement(ArdDroneInfo ardDroneInfo)
    {
        return ardDroneInfoMapper.updateArdDroneManagement(ardDroneInfo);
    public int updateArdDrone(ArdDroneInfo ArdDroneInfo) {
        ArdDroneInfo.setUpdateTime(DateUtils.getNowDate());
        return ArdDroneInfoMapper.updateArdDrone(ArdDroneInfo);
    }
    /**
     * 批量删除无人机管理
     * 批量删除无人机盒子
     * 
     * @param ids 需要删除的无人机管理主键
     * @param ids 需要删除的无人机盒子主键
     * @return 结果
     */
    @Override
    public int deleteArdDroneManagementByIds(String[] ids)
    {
        return ardDroneInfoMapper.deleteArdDroneManagementByIds(ids);
    public int deleteArdDroneByIds(String[] ids) {
        return ArdDroneInfoMapper.deleteArdDroneByIds(ids);
    }
    /**
     * 删除无人机管理信息
     * 删除无人机盒子信息
     * 
     * @param id 无人机管理主键
     * @param id 无人机盒子主键
     * @return 结果
     */
    @Override
    public int deleteArdDroneManagementById(String id)
    {
        return ardDroneInfoMapper.deleteArdDroneManagementById(id);
    public int deleteArdDroneById(String id) {
        return ArdDroneInfoMapper.deleteArdDroneById(id);
    }
    /**
     * 同步盒子属性
     *
     * @return 结果
     */
    @Scheduled(fixedRate = 1000 * 60)
    public void syncBoxInfo() {
        List<ArdDroneInfo> ArdDroneeListEntity = selectArdDroneList(new ArdDroneInfo());
        // 将本地列表转换为Map,方便快速查找
        Map<String, ArdDroneInfo> localArdDroneMap = ArdDroneeListEntity.stream()
                .collect(Collectors.toMap(ArdDroneInfo::getBoxSn, drone -> drone));
        //遍历接口最新获取的无人机盒子信息
        tyService.getBoxList().forEach(remoteArdDrone -> {
            ArdDroneInfo localArdDroneInfo = localArdDroneMap.get(remoteArdDrone.getBoxSn());
            if (localArdDroneInfo != null) {
                if (!localArdDroneInfo.isSameAs(remoteArdDrone)) {
                    // 修改无人机(只更新变化的属性)
                    updateChangedAttributes(localArdDroneInfo, remoteArdDrone);
                    updateArdDrone(localArdDroneInfo);
                }
            }
        });
    }
    // 更新变化的属性
    private void updateChangedAttributes(ArdDroneInfo localBoxInfo, BoxInfoReceiver remoteArdDrone) {
        if (!Objects.equals(localBoxInfo.getBoxName(), remoteArdDrone.getBoxName())) {
            localBoxInfo.setBoxName(remoteArdDrone.getBoxName());
        }
        if (!Objects.equals(localBoxInfo.getBoxVersion(), remoteArdDrone.getBoxVersion())) {
            localBoxInfo.setBoxVersion(remoteArdDrone.getBoxVersion());
        }
        if (!Objects.equals(localBoxInfo.getLastTaskId(), remoteArdDrone.getLastTaskId())) {
            localBoxInfo.setLastTaskId(remoteArdDrone.getLastTaskId());
        }
        if (!Objects.equals(localBoxInfo.getOnLine(), remoteArdDrone.getOnLine())) {
            localBoxInfo.setOnLine(remoteArdDrone.getOnLine());
        }
        // 更新其他属性
    }
}
ard-work/src/main/java/com/ard/work/service/impl/UavBoxServiceImpl.java
File was deleted
ard-work/src/main/resources/mapper/ArdDroneInfoMapper.xml
@@ -4,89 +4,138 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ard.work.mapper.ArdDroneInfoMapper">
    
    <resultMap type="ArdDroneInfo" id="ArdDroneManagementResult">
    <resultMap type="ArdDroneInfo" id="ArdDroneResult">
        <result property="id"    column="id"    />
        <result property="deviceModel"    column="device_model"    />
        <result property="deviceSn"    column="device_sn"    />
        <result property="deviceName"    column="device_name"    />
        <result property="deviceStatus"    column="device_status"    />
        <result property="deviceAddTime"    column="device_add_time"    />
        <result property="onlineTime"    column="online_time"    />
        <result property="boxSn"    column="box_sn"    />
        <result property="boxName"    column="box_name"    />
        <result property="boxVersion"    column="box_version"    />
        <result property="startTime"    column="start_time"    />
        <result property="onLine"    column="onLine"    />
        <result property="videoServer"    column="video_server"    />
        <result property="videoPort"    column="video_port"    />
        <result property="lastTaskId"    column="last_task_id"    />
        <result property="userId"    column="user_id"    />
        <result property="deptId"    column="dept_id"    />
        <result property="createBy"    column="create_by"    />
        <result property="createTime"    column="create_time"    />
        <result property="updateBy"    column="update_by"    />
        <result property="updateTime"    column="update_time"    />
        <result property="remark"    column="remark"    />
        <result property="serverInfoId"    column="server_info_id"    />
        <!-- 关联 ArdServerInfo 对象 -->
        <association property="ardServerInfo"
                     javaType="com.ard.work.domain.entity.ArdServerInfo"
                     column="server_info_id"
                     autoMapping="true"
                     select="selectArdServerInfo">
        </association>
    </resultMap>
    <sql id="selectArdDroneManagementVo">
    <select id="selectArdServerInfo" resultType="com.ard.work.domain.entity.ArdServerInfo">
        select * from ard_server_info where id = #{server_info_id}
    </select>
    <sql id="selectArdDroneVo">
        select id,
               device_model,
               device_sn,
               device_name,
               device_status,
               device_add_time,
               online_time,
               server_info_id
            box_sn,
            box_name,
            box_version,
            start_time,
            on_line,
            video_server,
            video_port,
            last_task_id,
            server_info_id,
            user_id,
            dept_id
        from ard_drone_info
    </sql>
    <select id="selectArdDroneManagementList" parameterType="ArdDroneInfo" resultMap="ArdDroneManagementResult">
        <include refid="selectArdDroneManagementVo"/>
    <select id="selectArdDroneList" parameterType="ArdDroneInfo" resultMap="ArdDroneResult">
        <include refid="selectArdDroneVo"/>
        <where>  
            <if test="deviceModel != null  and deviceModel != ''"> and device_model = #{deviceModel}</if>
            <if test="deviceSn != null  and deviceSn != ''"> and device_sn = #{deviceSn}</if>
            <if test="deviceName != null  and deviceName != ''"> and device_name like concat('%', #{deviceName}, '%')</if>
            <if test="deviceStatus != null  and deviceStatus != ''"> and device_status = #{deviceStatus}</if>
            <if test="deviceAddTime != null "> and device_add_time = #{deviceAddTime}</if>
            <if test="onlineTime != null "> and online_time = #{onlineTime}</if>
            <if test="boxSn != null  and boxSn != ''"> and box_sn = #{boxSn}</if>
            <if test="boxName != null  and boxName != ''"> and box_name like concat('%', #{boxName}, '%')</if>
            <if test="boxVersion != null  and boxVersion != ''"> and box_version = #{boxVersion}</if>
            <if test="onLine != null "> and onLine = #{onLine}</if>
            <if test="lastTaskId != null "> and last_task_id = #{lastTaskId}</if>
            <if test="userId != null "> and user_id = #{userId}</if>
            <if test="deptId != null "> and dept_id = #{deptId}</if>
        </where>
    </select>
    
    <select id="selectArdDroneManagementById" parameterType="String" resultMap="ArdDroneManagementResult">
        <include refid="selectArdDroneManagementVo"/>
    <select id="selectArdDroneById" parameterType="String" resultMap="ArdDroneResult">
        <include refid="selectArdDroneVo"/>
        where id = #{id}
    </select>
    <insert id="insertArdDroneManagement" parameterType="ArdDroneInfo">
    <insert id="insertArdDrone" parameterType="ArdDroneInfo">
        insert into ard_drone_info
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id != null">id,</if>
            <if test="deviceModel != null">device_model,</if>
            <if test="deviceSn != null">device_sn,</if>
            <if test="deviceName != null">device_name,</if>
            <if test="deviceStatus != null">device_status,</if>
            <if test="deviceAddTime != null">device_add_time,</if>
            <if test="onlineTime != null">online_time,</if>
            <if test="serverInfoId != null">server_info_id,</if>
            <if test="boxSn != null">box_sn,</if>
            <if test="boxName != null">box_name,</if>
            <if test="boxVersion != null">box_version,</if>
            <if test="startTime != null">start_time,</if>
            <if test="onLine != null">on_line,</if>
            <if test="videoServer != null">video_server,</if>
            <if test="videoPort != null">video_port,</if>
            <if test="lastTaskId != null">last_task_id,</if>
            <if test="userId != null">user_id,</if>
            <if test="deptId != null">dept_id,</if>
            <if test="createBy != null">create_by,</if>
            <if test="createTime != null">create_time,</if>
            <if test="updateBy != null">update_by,</if>
            <if test="updateTime != null">update_time,</if>
            <if test="remark != null">remark,</if>
         </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="id != null">#{id},</if>
            <if test="deviceModel != null">#{deviceModel},</if>
            <if test="deviceSn != null">#{deviceSn},</if>
            <if test="deviceName != null">#{deviceName},</if>
            <if test="deviceStatus != null">#{deviceStatus},</if>
            <if test="deviceAddTime != null">#{deviceAddTime},</if>
            <if test="onlineTime != null">#{onlineTime},</if>
            <if test="serverInfoId != null">#{serverInfoId},</if>
            <if test="boxSn != null">#{boxSn},</if>
            <if test="boxName != null">#{boxName},</if>
            <if test="boxVersion != null">#{boxVersion},</if>
            <if test="startTime != null">#{startTime},</if>
            <if test="onLine != null">#{onLine},</if>
            <if test="videoServer != null">#{videoServer},</if>
            <if test="videoPort != null">#{videoPort},</if>
            <if test="lastTaskId != null">#{lastTaskId},</if>
            <if test="userId != null">#{userId},</if>
            <if test="deptId != null">#{deptId},</if>
            <if test="createBy != null">#{createBy},</if>
            <if test="createTime != null">#{createTime},</if>
            <if test="updateBy != null">#{updateBy},</if>
            <if test="updateTime != null">#{updateTime},</if>
            <if test="remark != null">#{remark},</if>
         </trim>
    </insert>
    <update id="updateArdDroneManagement" parameterType="ArdDroneInfo">
    <update id="updateArdDrone" parameterType="ArdDroneInfo">
        update ard_drone_info
        <trim prefix="SET" suffixOverrides=",">
            <if test="deviceModel != null">device_model = #{deviceModel},</if>
            <if test="deviceSn != null">device_sn = #{deviceSn},</if>
            <if test="deviceName != null">device_name = #{deviceName},</if>
            <if test="deviceStatus != null">device_status = #{deviceStatus},</if>
            <if test="deviceAddTime != null">device_add_time = #{deviceAddTime},</if>
            <if test="onlineTime != null">online_time = #{onlineTime},</if>
            <if test="serverInfoId != null">server_info_id = #{serverInfoId},</if>
            <if test="boxSn != null">box_sn = #{boxSn},</if>
            <if test="boxName != null">box_name = #{boxName},</if>
            <if test="boxVersion != null">box_version = #{boxVersion},</if>
            <if test="startTime != null">start_time = #{startTime},</if>
            <if test="onLine != null">on_line = #{onLine},</if>
            <if test="videoServer != null">video_server = #{videoServer},</if>
            <if test="videoPort != null">video_port = #{videoPort},</if>
            <if test="lastTaskId != null">last_task_id = #{lastTaskId},</if>
            <if test="userId != null">user_id = #{userId},</if>
            <if test="deptId != null">dept_id = #{deptId},</if>
            <if test="createBy != null">create_by = #{createBy},</if>
            <if test="createTime != null">create_time = #{createTime},</if>
            <if test="updateBy != null">update_by = #{updateBy},</if>
            <if test="updateTime != null">update_time = #{updateTime},</if>
            <if test="remark != null">remark = #{remark},</if>
        </trim>
        where id = #{id}
    </update>
    <delete id="deleteArdDroneManagementById" parameterType="String">
    <delete id="deleteArdDroneById" parameterType="String">
        delete from ard_drone_info where id = #{id}
    </delete>
    <delete id="deleteArdDroneManagementByIds" parameterType="String">
    <delete id="deleteArdDroneByIds" parameterType="String">
        delete from ard_drone_info where id in
        <foreach item="id" collection="array" open="(" separator="," close=")">
            #{id}
ard-work/src/main/resources/mapper/UavBoxMapper.xml
File was deleted