feiyu02
2025-09-04 707b00a0ca6604c249a110b376ac1e44e408e624
src/main/kotlin/com/flightfeather/uav/domain/repository/MissionRep.kt
@@ -2,14 +2,68 @@
import com.flightfeather.uav.domain.entity.Mission
import com.flightfeather.uav.domain.mapper.MissionMapper
import com.flightfeather.uav.lightshare.bean.AreaVo
import org.springframework.stereotype.Repository
import tk.mybatis.mapper.entity.Example
import java.util.*
@Repository
class MissionRep(
    private val missionMapper: MissionMapper,
) {
    /**
     * 根据任务编码查询单个走航任务
     * @param missionCode 任务编码(主键)
     * @return 查询到的任务对象,若不存在则返回null
     */
    fun findOne(missionCode:String?): Mission? {
        return missionMapper.selectByPrimaryKey(missionCode)
    }
    /**
     * 根据任务对象属性条件查询任务列表
     * @param mission 包含查询条件的任务对象(如设备类型、区域等)
     * @return 符合条件的任务列表
     */
    fun findList(mission: Mission): List<Mission?> {
        return missionMapper.select(mission)
    }
    /**
     * 根据时间范围查询走航任务列表
     * @param startTime 查询起始时间(包含)
     * @param endTime 查询结束时间(包含)
     * @return 符合时间条件的走航任务列表
     */
    fun findByTimeRange(startTime: Date, endTime: Date): List<Mission?> {
        // 使用tk.mybatis的Example构建查询条件
        return missionMapper.selectByExample(Example(Mission::class.java).apply {
            // 创建查询条件:startTime字段在指定时间范围内
            createCriteria().andBetween("startTime", startTime, endTime)
                // 过滤掉没有结束时间的任务(确保任务已完成)
                .andIsNotNull("endTime")
        })
    }
    /**
     * 根据区域和时间范围查询有效走航任务列表
     * 筛选指定行政区划内、特定时间段且已完成有效里程记录的走航任务
     * @param areaVo 区域参数对象,包含省、市、区三级行政区划编码
     * @param startTime 查询起始时间(包含)
     * @param endTime 查询结束时间(包含)
     * @return 符合条件的走航任务列表,若无可返回空列表
     * @see AreaVo 区域参数数据结构
     * @see Mission 走航任务实体类
     */
    fun findByAreaAndTime(areaVo: AreaVo, startTime: Date, endTime: Date): List<Mission?> {
        return missionMapper.selectByExample(Example(Mission::class.java).apply {
            createCriteria().andBetween("startTime", startTime, endTime)
                .andEqualTo("provinceCode", areaVo.provinceCode)
                .andEqualTo("cityCode", areaVo.cityCode)
                .andEqualTo("districtCode", areaVo.districtCode)
                .andIsNotNull("kilometres")
                .andNotEqualTo("kilometres", 0)
        })
    }
}