liusuyi
2025-11-19 fadbcd1f76ec12d760b059018b8a37aaa64303de
优化
5 files modified
1 files renamed
434 ■■■■■ changed files
ard-work/src/main/java/com/ard/work/domain/entity/ArdFlightTask.java 8 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/entity/ArdMedia.java 15 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceServiceImpl.java 264 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/impl/ArdMediaServiceImpl.java 2 ●●●●● patch | view | raw | blame | history
ard-work/src/main/resources/mapper/ArdFlightTaskMapper.xml 2 ●●●●● patch | view | raw | blame | history
ard-work/src/main/resources/mapper/ArdMediaMapper.xml 143 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/entity/ArdFlightTask.java
@@ -2,12 +2,17 @@
import com.ard.common.core.domain.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ArdFlightTask extends BaseEntity {
    private Integer taskId;             // 任务ID
@@ -23,7 +28,6 @@
    private Date endTime;               // 任务结束时间
    private Long duration;              // 持续时长(单位:秒)
    private String serverId;            // 服务器ID
    // 计算持续时长,单位:秒
    public Long getDuration() {
ard-work/src/main/java/com/ard/work/domain/entity/ArdMedia.java
@@ -1,9 +1,18 @@
package com.ard.work.domain.entity;
import com.ard.common.core.domain.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ArdMedia extends BaseEntity {
    private String id;                 // 媒体ID
@@ -13,4 +22,10 @@
    private String fileMd5;            // 文件MD5值
    private String mediaUrl;           // 地址
    private String sourceUrl;          // 源地址
    private Long   photoId;            // 图片ID
    private Double longitude;          // 经度
    private Double latitude;           // 纬度
    private Double height;             // 高度
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date captureTime;           // 抓拍时间
}
ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceServiceImpl.java
@@ -24,6 +24,7 @@
import javax.annotation.Resource;
import javax.net.ssl.*;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
@@ -45,16 +46,24 @@
    private TyClient tyClient;
    @Resource
    private OssServiceContext ossServiceContext;
    @Resource
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;  // 使用线程池执行异步任务
    /**
     * 查询飞行架次列表
     *
     * @param ardFlightTask 飞行架次
     * @return 飞行架次集合
     */
    @Override
    public List<ArdFlightTask> selectArdFlightTask(ArdFlightTask ardFlightTask) {
        return ardFlightTaskMapper.selectArdFlightTask(ardFlightTask);
    }
    // 同步所有服务的飞行历史
    /**
     * 同步所有服务的飞行历史
     *
     */
    @Scheduled(fixedDelay = 10000)
    public void syncAllFlightHistory() {
        List<String> serverIds = ardServerInfoService.getServerIdsList();
@@ -72,12 +81,12 @@
        return maxStartTime != null ? maxStartTime : new Date(0);  // 如果没有数据,返回 Unix 纪元时间作为起点
    }
    // 调用接口获取飞行历史数据
    // 根据上次同步时间同步飞行历史
    public void syncFlightHistory(String serverId, Date lastSyncTime) {
    public void syncFlightHistory(String serverId, Date startTime) {
        // 创建查询条件 BoxHistoryDTO,并设置 startTime 作为过滤条件
        BoxHistoryDTO boxHistoryDTO = new BoxHistoryDTO();
        boxHistoryDTO.setStartTime(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, lastSyncTime));  // 传递 lastSyncTime 参数
        BoxHistoryDTO boxHistoryDTO = BoxHistoryDTO.builder()
                .startTime(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, startTime))
                .build();
        // 获取飞行历史
        List<BoxHistoryReceiver> historyList = getBoxHistory(serverId, boxHistoryDTO);
@@ -90,44 +99,28 @@
        }
    }
    // 调用接口获取飞行历史数据
    private List<BoxHistoryReceiver> getBoxHistory(String serverId, BoxHistoryDTO boxHistoryDTO) {
        TyHttpCommonReceiver<List<BoxHistoryReceiver>> boxHistory = tyClient.getBoxHistory(serverId, boxHistoryDTO);
        return boxHistory.getContent();
    }
    // 将数据同步到本地数据库
    private void syncToLocalDatabase(String serverId, BoxHistoryReceiver boxHistoryReceiver) {
        // 创建FlightTask实体对象并填充数据
        ArdFlightTask flightTask = new ArdFlightTask();
        flightTask.setTaskId(boxHistoryReceiver.getTaskId());
        flightTask.setBoxSn(boxHistoryReceiver.getBoxSn());
        flightTask.setBoxName(boxHistoryReceiver.getBoxName());
        flightTask.setTaskName(boxHistoryReceiver.getTaskName());
        Integer photoCount = Integer.parseInt(boxHistoryReceiver.getPhotoCount());
        flightTask.setPhotoCount(photoCount);
        Integer videoCount = (boxHistoryReceiver.getVideoPathList() != null) ?
                boxHistoryReceiver.getVideoPathList().size() : 0;
        flightTask.setVideoCount(videoCount);
        flightTask.setVideoPath(boxHistoryReceiver.getVideoPath());
        flightTask.setServerId(serverId);
        Date startTime = DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, boxHistoryReceiver.getStartTime());
        flightTask.setStartTime(startTime);
        Date endTime = DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, boxHistoryReceiver.getEndTime());
        flightTask.setEndTime(endTime);
        flightTask.setCreateTime(DateUtils.getNowDate());
        // 检查是否已经存在相同任务ID的记录
        ArdFlightTask ardFlightTask = ardFlightTaskMapper.getArdFlightTaskById(flightTask.getTaskId());
        ArdFlightTask ardFlightTask = ardFlightTaskMapper.getArdFlightTaskById(boxHistoryReceiver.getTaskId());
        if (ardFlightTask == null) {
            // 如果不存在,则插入新记录
            log.info("Syncing task {}", boxHistoryReceiver.getTaskId());
            log.debug("insert task {}", boxHistoryReceiver.getTaskId());
            // 创建FlightTask实体对象并填充数据
            ArdFlightTask flightTask = ArdFlightTask.builder()
                    .taskId(boxHistoryReceiver.getTaskId())
                    .boxSn(boxHistoryReceiver.getBoxSn())
                    .boxName(boxHistoryReceiver.getBoxName())
                    .taskName(boxHistoryReceiver.getTaskName())
                    .photoCount(Integer.parseInt(boxHistoryReceiver.getPhotoCount()))
                    .videoCount((boxHistoryReceiver.getVideoPathList() != null) ?
                            boxHistoryReceiver.getVideoPathList().size() : 0)
                    .videoPath(boxHistoryReceiver.getVideoPath())
                    .serverId(serverId)
                    .startTime(DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, boxHistoryReceiver.getStartTime()))
                    .endTime(DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, boxHistoryReceiver.getEndTime()))
                    .build();
            flightTask.setCreateTime(DateUtils.getNowDate());
            // 插入新记录
            int rows = ardFlightTaskMapper.insertArdFlightTask(flightTask);
            if (rows > 0) {
@@ -135,14 +128,14 @@
                ardMediaMapper.deleteArdMediaByTaskId(flightTask.getTaskId());
                // 插入视频
                syncVideoToDatabase(flightTask, boxHistoryReceiver.getVideoPathList());
                insertVideoToDatabase(flightTask, boxHistoryReceiver.getVideoPathList());
                // 插入图片
                syncPhotoToDatabase(flightTask, serverId, boxHistoryReceiver.getBoxSn());
                insertPhotoToDatabase(flightTask, serverId, boxHistoryReceiver.getBoxSn());
            }
        } else {
            // 如果存在,则更新记录
            log.info("Updating task {}", boxHistoryReceiver.getTaskId());
            log.debug("Updating task {}", boxHistoryReceiver.getTaskId());
            // 增量更新
            updateVideoToDatabase(ardFlightTask, boxHistoryReceiver.getVideoPathList());
            // 增量更新图片
@@ -151,18 +144,33 @@
        }
    }
    // 调用接口获取飞行历史数据
    private List<BoxHistoryReceiver> getBoxHistory(String serverId, BoxHistoryDTO boxHistoryDTO) {
        TyHttpCommonReceiver<List<BoxHistoryReceiver>> boxHistory = tyClient.getBoxHistory(serverId, boxHistoryDTO);
        return boxHistory.getContent();
    }
    //调用接口获取架次图片
    private List<BoxPhotosReceiver> getBoxPhotos(String serverId, BoxPhotosDTO boxPhotosDTO) {
        TyHttpCommonReceiver<List<BoxPhotosReceiver>> boxPhotos = tyClient.getBoxPhotos(serverId, boxPhotosDTO);
        return boxPhotos.getContent();
    }
    // 插入视频记录
    private void syncVideoToDatabase(ArdFlightTask flightTask, List<String> videoPathList) {
    private void insertVideoToDatabase(ArdFlightTask flightTask, List<String> videoPathList) {
        if (videoPathList != null && !videoPathList.isEmpty()) {
            for (String videoPath : videoPathList) {
                ArdMedia ardMedia = new ArdMedia();
                ardMedia.setId(IdUtils.simpleUUID());
                ardMedia.setTaskId(flightTask.getTaskId());
                ardMedia.setMediaType(1); // 1表示视频
                ardMedia.setSourceUrl(videoPath);
                ArdMedia ardMedia =  ArdMedia.builder()
                        .id(IdUtils.simpleUUID())
                        .taskId(flightTask.getTaskId())
                        .mediaType(1) // 1表示视频
                        .sourceUrl(videoPath)
                        .fileSize(getFileSizeByUrl(videoPath))
                        .build();
                // 异步上传文件到OSS,并在上传完成后插入数据库
                CompletableFuture.supplyAsync(() -> uploadFileToOss(flightTask.getBoxSn(), videoPath, "record",
                CompletableFuture.supplyAsync(() -> uploadFileToOss(flightTask.getBoxSn(), videoPath, "record1",
                                MimeTypeUtils.VIDEO_MP4), threadPoolTaskExecutor)
                        .thenAccept(url -> {
                            ardMedia.setMediaUrl(url);  // 获取上传后的文件 URL
@@ -182,19 +190,28 @@
        if (count != null && size > count) {
            log.info("录像数量不一致,需要更新数据库");
            // 需要插入新的视频
            // 获取本地数据库中已存在的视频记录
            List<ArdMedia> existingVideos = ardMediaMapper.selectArdMediaByTaskIdAndType(flightTask.getTaskId(), 1);
            List<String> newVideos = getNewVideos(existingVideos, videoPathList);
            // 提取现有的视频路径
            List<String> existingVideoPaths = existingVideos.stream()
                    .map(ArdMedia::getSourceUrl) // 获取每个视频的 URL
                    .collect(Collectors.toList());
            // 从接口返回的视频路径中找出新的视频
            List<String> newVideos = videoPathList.stream()
                    .filter(videoPath -> !existingVideoPaths.contains(videoPath)) // 过滤出新的视频
                    .collect(Collectors.toList());
            if (!newVideos.isEmpty()) {
                // 插入新的视频记录
                for (String videoPath : newVideos) {
                    ArdMedia ardMedia = new ArdMedia();
                    ardMedia.setId(IdUtils.simpleUUID());
                    ardMedia.setTaskId(flightTask.getTaskId());
                    ardMedia.setMediaType(1); // 1表示视频
                    ardMedia.setSourceUrl(videoPath);
                    ArdMedia ardMedia =  ArdMedia.builder()
                            .id(IdUtils.simpleUUID())
                            .taskId(flightTask.getTaskId())
                            .mediaType(1) // 1表示视频
                            .fileSize(getFileSizeByUrl(videoPath))
                            .sourceUrl(videoPath)
                            .build();
                    // 异步上传文件到OSS,并在上传完成后插入数据库
                    CompletableFuture.supplyAsync(() -> uploadFileToOss(flightTask.getBoxSn(), videoPath, "record",
                    CompletableFuture.supplyAsync(() -> uploadFileToOss(flightTask.getBoxSn(), videoPath, "record1",
                                    MimeTypeUtils.VIDEO_MP4), threadPoolTaskExecutor)
                            .thenAccept(url -> {
                                ardMedia.setMediaUrl(url);  // 获取上传后的文件 URL
@@ -210,62 +227,30 @@
        }
    }
    // 获取需要插入的新视频路径
    private List<String> getNewVideos(List<ArdMedia> existingVideos, List<String> videoPathList) {
        // 提取现有的视频路径
        List<String> existingVideoPaths = existingVideos.stream()
                .map(ArdMedia::getSourceUrl) // 获取每个视频的 URL
                .collect(Collectors.toList());
        // 从接口返回的视频路径中找出新的视频
        List<String> newVideos = videoPathList.stream()
                .filter(videoPath -> !existingVideoPaths.contains(videoPath)) // 过滤出新的视频
                .collect(Collectors.toList());
        return newVideos;
    }
    // 插入图片记录
    private void syncPhotoToDatabase(ArdFlightTask flightTask, String serverId, String boxSn) {
    private void insertPhotoToDatabase(ArdFlightTask flightTask, String serverId, String boxSn) {
        // 查询图片
        BoxPhotosDTO boxPhotosDTO = new BoxPhotosDTO();
        boxPhotosDTO.setTaskId(flightTask.getTaskId());
        boxPhotosDTO.setBoxSn(boxSn);
        boxPhotosDTO.setPageIndex(1);
        boxPhotosDTO.setPageSize(500);
        TyHttpCommonReceiver<List<BoxPhotosReceiver>> boxPhotos = tyClient.getBoxPhotos(serverId, boxPhotosDTO);
        List<BoxPhotosReceiver> photoList = boxPhotos.getContent();
        List<BoxPhotosReceiver> photoList = getBoxPhotos(serverId, boxPhotosDTO);
        if (photoList != null && !photoList.isEmpty()) {
            for (BoxPhotosReceiver photo : photoList) {
                ArdMedia ardMedia = new ArdMedia();
                ardMedia.setId(IdUtils.simpleUUID());
                ardMedia.setTaskId(flightTask.getTaskId());
                ardMedia.setMediaType(0); // 0表示图片
                ardMedia.setFileSize(photo.getFileSize());
                ardMedia.setFileMd5(photo.getFileMd5());
                ardMedia.setSourceUrl(photo.getImgUrl());
                // 异步上传文件到OSS,并在上传完成后插入数据库
                CompletableFuture.supplyAsync(() -> uploadFileToOss(flightTask.getBoxSn(), photo.getImgUrl(), "pic",
                                MimeTypeUtils.IMAGE_JPG), threadPoolTaskExecutor)
                        .thenAccept(url -> {
                            ardMedia.setMediaUrl(url);  // 获取上传后的文件 URL
                            ardMedia.setCreateTime(new Date());
                            ardMediaMapper.insertArdMedia(ardMedia);  // 插入数据库
                        });
            }
            addPhotos(flightTask, photoList);
        }
    }
    private void updatePhotoToDatabase(ArdFlightTask flightTask, String serverId, String boxSn) {
        int count = flightTask.getPhotoCount(); //获取本地库图片数量
        // 查询图片
        BoxPhotosDTO boxPhotosDTO = new BoxPhotosDTO();
        boxPhotosDTO.setTaskId(flightTask.getTaskId());
        boxPhotosDTO.setBoxSn(boxSn);
        boxPhotosDTO.setPageIndex(1);
        boxPhotosDTO.setPageSize(500);
        BoxPhotosDTO boxPhotosDTO =  BoxPhotosDTO.builder()
                .taskId(flightTask.getTaskId())
                .boxSn(boxSn)
                .pageIndex(1)
                .pageSize(500)
                .build();
        TyHttpCommonReceiver<List<BoxPhotosReceiver>> boxPhotos = tyClient.getBoxPhotos(serverId, boxPhotosDTO);
        List<BoxPhotosReceiver> photoList = boxPhotos.getContent();
        int size = photoList.size();
@@ -275,26 +260,18 @@
            // 获取本地数据库中已存在的图片记录(类型为 0 表示图片)
            List<ArdMedia> existingPhotos = ardMediaMapper.selectArdMediaByTaskIdAndType(flightTask.getTaskId(), 0);
            // 需要插入新的视频
            List<BoxPhotosReceiver> newPhotos = getNewPhotos(existingPhotos, photoList);
            // 提取现有的图片路径(根据 imgUrl 来判断是否重复)
            List<String> existingPhotoUrls = existingPhotos.stream()
                    .map(ArdMedia::getSourceUrl) // 提取 ArdMedia 中的图片 URL
                    .collect(Collectors.toList());
            // 筛选出 photoList 中没有出现在 existingPhotos 中的新图片
            List<BoxPhotosReceiver> newPhotos = photoList.stream()
                    .filter(photo -> !existingPhotoUrls.contains(photo.getImgUrl())) // 过滤出新图片
                    .collect(Collectors.toList());
            if (!newPhotos.isEmpty()) {
                // 插入新的视频记录
                for (BoxPhotosReceiver photo : newPhotos) {
                    ArdMedia ardMedia = new ArdMedia();
                    ardMedia.setId(IdUtils.simpleUUID());
                    ardMedia.setTaskId(flightTask.getTaskId());
                    ardMedia.setMediaType(0); // 0表示图片
                    ardMedia.setFileSize(photo.getFileSize());
                    ardMedia.setFileMd5(photo.getFileMd5());
                    ardMedia.setSourceUrl(photo.getImgUrl());
                    // 异步上传文件到OSS,并在上传完成后插入数据库
                    CompletableFuture.supplyAsync(() -> uploadFileToOss(flightTask.getBoxSn(), photo.getImgUrl(), "pic",
                                    MimeTypeUtils.IMAGE_JPG), threadPoolTaskExecutor)
                            .thenAccept(url -> {
                                ardMedia.setMediaUrl(url);  // 获取上传后的文件 URL
                                ardMedia.setCreateTime(new Date());
                                ardMediaMapper.insertArdMedia(ardMedia);  // 插入数据库
                            });
                }
                addPhotos(flightTask, newPhotos);
                // 更新任务的视频数量
                flightTask.setPhotoCount(flightTask.getPhotoCount() + newPhotos.size());
@@ -303,23 +280,35 @@
        }
    }
    // 获取需要插入的新图片
    private List<BoxPhotosReceiver> getNewPhotos(List<ArdMedia> existingPhotos, List<BoxPhotosReceiver> photoList) {
        // 提取现有的图片路径(根据 imgUrl 来判断是否重复)
        List<String> existingPhotoUrls = existingPhotos.stream()
                .map(ArdMedia::getSourceUrl) // 提取 ArdMedia 中的图片 URL
                .collect(Collectors.toList());
        // 筛选出 photoList 中没有出现在 existingPhotos 中的新图片
        List<BoxPhotosReceiver> newPhotos = photoList.stream()
                .filter(photo -> !existingPhotoUrls.contains(photo.getImgUrl())) // 过滤出新图片
                .collect(Collectors.toList());
        return newPhotos; // 返回新增的图片列表
    private void addPhotos(ArdFlightTask flightTask, List<BoxPhotosReceiver> photoList) {
        for (BoxPhotosReceiver photo : photoList) {
            ArdMedia ardMedia = ArdMedia.builder()
                    .id(IdUtils.simpleUUID())
                    .taskId(flightTask.getTaskId())
                    .mediaType(0) // 0表示图片
                    .fileSize(photo.getFileSize())
                    .fileMd5(photo.getFileMd5())
                    .sourceUrl(photo.getImgUrl())
                    .photoId(photo.getPhotoId())
                    .longitude(photo.getLng())
                    .latitude(photo.getLat())
                    .height(photo.getHeight())
                    .captureTime(DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, photo.getTimeStamp()))
                    .build();
            // 异步上传文件到OSS,并在上传完成后插入数据库
            CompletableFuture.supplyAsync(() -> uploadFileToOss(flightTask.getBoxSn(), photo.getImgUrl(), "pic1",
                            MimeTypeUtils.IMAGE_JPG), threadPoolTaskExecutor)
                    .thenAccept(url -> {
                        ardMedia.setMediaUrl(url);  // 获取上传后的文件 URL
                        ardMedia.setCreateTime(new Date());
                        ardMediaMapper.insertArdMedia(ardMedia);  // 插入数据库
                    });
        }
    }
    // 通用的上传方法,支持视频和图片等文件上传
    public String uploadFileToOss(String boxSn, String fileUrl, String bucket, String contentType) {
    private String uploadFileToOss(String boxSn, String fileUrl, String bucket, String contentType) {
        InputStream fileInputStream = null;
        String fileOssUrl = "";
        try {
@@ -385,4 +374,17 @@
        return fileOssUrl; // 返回上传后的文件OSS URL
    }
    //获取文件大小
    private long getFileSizeByUrl(String fileUrl) {
        try {
            URL url = new URL(fileUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("HEAD");
            conn.connect();
            return conn.getContentLengthLong(); // 返回字节大小
        } catch (Exception e) {
            return -1;
        }
    }
}
ard-work/src/main/java/com/ard/work/service/impl/ArdMediaServiceImpl.java
File was renamed from ard-work/src/main/java/com/ard/work/service/impl/IArdMediaServiceImpl.java
@@ -14,7 +14,7 @@
 * Date: 2025年11月18日13:17
 **/
@Service
public class IArdMediaServiceImpl implements IArdMediaService {
public class ArdMediaServiceImpl implements IArdMediaService {
    @Resource
    private ArdMediaMapper ardMediaMapper;
ard-work/src/main/resources/mapper/ArdFlightTaskMapper.xml
@@ -114,7 +114,7 @@
    </update>
    <!-- 根据任务ID获取飞行任务 -->
    <select id="getArdFlightTaskById" resultType="ArdFlightTask">
    <select id="getArdFlightTaskById" resultMap="ArdFlightTaskResult">
        SELECT *
        FROM ard_flight_task
        WHERE task_id = #{taskId}
ard-work/src/main/resources/mapper/ArdMediaMapper.xml
@@ -11,49 +11,75 @@
        <result property="fileMd5" column="file_md5"/>
        <result property="mediaUrl" column="media_url"/>
        <result property="sourceUrl" column="source_url"/>
        <result property="photoId" column="photo_id"/>
        <result property="longitude" column="longitude"/>
        <result property="latitude" column="latitude"/>
        <result property="height" column="height"/>
        <result property="captureTime" column="capture_time"/>
        <result property="createTime" column="create_time"/>
    </resultMap>
    <!-- 查询媒体列表:根据条件动态生成SQL -->
    <select id="selectArdMedia" resultMap="ArdMediaResult">
        SELECT id, task_id, media_type, file_size, file_md5, media_url, source_url,create_time
        SELECT
        id, task_id, media_type, file_size, file_md5, media_url, source_url,
        photo_id, longitude, latitude, height, capture_time, create_time
        FROM ard_media
        <where>
            <!-- 动态查询条件:任务ID -->
            <if test="taskId != null">AND task_id = #{taskId}</if>
            <!-- 动态查询条件:媒体类型 -->
            <if test="mediaType != null">AND media_type = #{mediaType}</if>
            <!-- 动态查询条件:文件大小 -->
            <if test="fileSize != null">AND file_size = #{fileSize}</if>
            <!-- 动态查询条件:文件MD5 -->
            <if test="fileMd5 != null">AND file_md5 = #{fileMd5}</if>
            <!-- 动态查询条件:媒体URL -->
            <if test="mediaUrl != null">AND media_url = #{mediaUrl}</if>
            <!-- 动态查询条件:媒体URL -->
            <if test="sourceUrl != null">AND source_url = #{sourceUrl}</if>
            <!-- 动态查询条件:时间戳 -->
            <if test="photoId != null">AND photo_id = #{photoId}</if>
            <if test="longitude != null">AND longitude = #{longitude}</if>
            <if test="latitude != null">AND latitude = #{latitude}</if>
            <if test="height != null">AND height = #{height}</if>
            <if test="captureTime != null">AND capture_time = #{captureTime}</if>
            <if test="createTime != null">AND create_time = #{createTime}</if>
        </where>
        order by create_time desc
        ORDER BY create_time DESC
    </select>
    <!-- 根据任务ID查询媒体 -->
    <select id="selectArdMediaByTaskId" resultMap="ArdMediaResult">
        SELECT id, task_id, media_type, file_size, file_md5, media_url,source_url, create_time
        SELECT id,
               task_id,
               media_type,
               file_size,
               file_md5,
               media_url,
               source_url,
               photo_id,
               longitude,
               latitude,
               height,
               capture_time,
               create_time
        FROM ard_media
        WHERE task_id = #{taskId}
    </select>
    <!-- 根据任务ID和媒体类型查询媒体 -->
    <select id="selectArdMediaByTaskIdAndType" resultMap="ArdMediaResult">
        SELECT id, task_id, media_type, file_size, file_md5, media_url,source_url, create_time
        SELECT id,
               task_id,
               media_type,
               file_size,
               file_md5,
               media_url,
               source_url,
               photo_id,
               longitude,
               latitude,
               height,
               capture_time,
               create_time
        FROM ard_media
        WHERE task_id = #{taskId} and media_type = #{mediaType}
        WHERE task_id = #{taskId}
          and media_type = #{mediaType}
    </select>
    <!-- 插入媒体记录 -->
    <insert id="insertArdMedia" parameterType="com.ard.work.domain.entity.ArdMedia">
@@ -66,8 +92,14 @@
            <if test="fileMd5 != null">file_md5,</if>
            <if test="mediaUrl != null">media_url,</if>
            <if test="sourceUrl != null">source_url,</if>
            <if test="photoId != null">photo_id,</if>
            <if test="longitude != null">longitude,</if>
            <if test="latitude != null">latitude,</if>
            <if test="height != null">height,</if>
            <if test="captureTime != null">capture_time,</if>
            <if test="createTime != null">create_time,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="id != null">#{id},</if>
            <if test="taskId != null">#{taskId},</if>
@@ -76,43 +108,48 @@
            <if test="fileMd5 != null">#{fileMd5},</if>
            <if test="mediaUrl != null">#{mediaUrl},</if>
            <if test="sourceUrl != null">#{sourceUrl},</if>
            <if test="photoId != null">#{photoId},</if>
            <if test="longitude != null">#{longitude},</if>
            <if test="latitude != null">#{latitude},</if>
            <if test="height != null">#{height},</if>
            <if test="captureTime != null">#{captureTime},</if>
            <if test="createTime != null">#{createTime},</if>
        </trim>
    </insert>
    <!-- 批量插入媒体记录 -->
    <insert id="insertArdMediaList" parameterType="java.util.List">
        INSERT INTO ard_media
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="list != null and !list.isEmpty()">
                <foreach item="item" collection="list" separator=",">
                    <trim prefix="(" suffix=")" suffixOverrides=",">
                        <if test="item.taskId != null">task_id,</if>
                        <if test="item.mediaType != null">media_type,</if>
                        <if test="item.fileSize != null">file_size,</if>
                        <if test="item.fileMd5 != null">file_md5,</if>
                        <if test="item.mediaUrl != null">media_url,</if>
                        <if test="item.sourceUrl != null">source_url,</if>
                        <if test="item.createTime != null">create_time,</if>
                    </trim>
                </foreach>
            </if>
        </trim>
        <trim prefix="values " suffix=")" suffixOverrides=",">
            <foreach item="item" collection="list" separator=",">
                <trim prefix="(" suffix=")" suffixOverrides=",">
                    <if test="item.taskId != null">#{item.taskId},</if>
                    <if test="item.mediaType != null">#{item.mediaType},</if>
                    <if test="item.fileSize != null">#{item.fileSize},</if>
                    <if test="item.fileMd5 != null">#{item.fileMd5},</if>
                    <if test="item.mediaUrl != null">#{item.mediaUrl},</if>
                    <if test="item.sourceUrl != null">#{item.sourceUrl},</if>
                    <if test="item.createTime != null">#{item.createTime},</if>
                </trim>
            </foreach>
        </trim>
        INSERT INTO ard_media(
        task_id,
        media_type,
        file_size,
        file_md5,
        media_url,
        source_url,
        photo_id,
        longitude,
        latitude,
        height,
        capture_time,
        create_time
        )
        VALUES
        <foreach collection="list" item="item" separator=",">
            (
            #{item.taskId},
            #{item.mediaType},
            #{item.fileSize},
            #{item.fileMd5},
            #{item.mediaUrl},
            #{item.sourceUrl},
            #{item.photoId},
            #{item.longitude},
            #{item.latitude},
            #{item.height},
            #{item.captureTime},
            #{item.createTime}
            )
        </foreach>
    </insert>
@@ -131,7 +168,9 @@
    <!-- 删除媒体记录 -->
    <delete id="deleteArdMediaById" parameterType="Integer">
        DELETE FROM ard_media WHERE id = #{id}
        DELETE
        FROM ard_media
        WHERE id = #{id}
    </delete>
    <!-- 批量删除媒体记录 -->
@@ -143,7 +182,9 @@
    </delete>
    <delete id="deleteArdMediaByTaskId" parameterType="java.lang.Integer">
        DELETE FROM ard_media WHERE task_id = #{taskId}
        DELETE
        FROM ard_media
        WHERE task_id = #{taskId}
    </delete>
</mapper>