cloudroam
2025-04-01 661a264fef5d1a23ba850c9f65ac79c0127b3d1d
app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt
@@ -9,6 +9,8 @@
import com.example.firstapp.database.entity.Msg
import com.example.firstapp.model.CourierStat
import com.example.firstapp.model.DailyStat
import com.example.firstapp.model.HeatmapStat
import com.example.firstapp.model.StationGroup
import io.reactivex.Completable
import kotlinx.coroutines.flow.Flow
@@ -34,7 +36,7 @@
    @Query("SELECT * FROM Code")
     fun getAllCodes(): List<Code>
    @Query("SELECT * FROM Code WHERE type = :type")
    @Query("SELECT * FROM Code WHERE oneLevel = :type")
     fun getCodesByType(type: String): List<Code>
@@ -47,72 +49,240 @@
    @Query("""
        SELECT * FROM Code 
        WHERE type LIKE '%' || :keyword || '%'
        WHERE oneLevel LIKE '%' || :keyword || '%'
        AND pickup = '0'
        ORDER BY time DESC
    """)
    fun getByKeyword(keyword: String): List<Code>
    @Query("SELECT * FROM Code WHERE type = :content and code= :code and createtime = :dateString LIMIT 1")
    fun queryByTypeAndCodeAndDate(content: String, code: String, dateString: String): Code
    @Query("""
        SELECT * FROM Code
        WHERE category = :category
        AND code = :code
        AND substr(createTime, 1, 10) = substr(:dateString, 1, 10)
        LIMIT 1
    """)
    fun queryByTypeAndCodeAndDate(category: String, code: String, dateString: String): Code?
    @Query("update  Code set pickup = '1' ,  pickuptime = CURRENT_TIMESTAMP  where id=:id")
    fun pickup(id: Long)
    //查询当天包裹信息
    @Query("SELECT * FROM code WHERE date(createtime) = date(:date/1000, 'unixepoch', 'localtime') ORDER BY createtime DESC")
    @Query("SELECT * FROM code WHERE date(createTime) = date(:date/1000, 'unixepoch', 'localtime') ORDER BY createTime DESC")
    fun getNewPackagesByDay(date: Long): List<Code>
    @Query("""
        SELECT * FROM code 
        WHERE substr(createtime, 1, 10) =
        WHERE substr(createTime, 1, 10) =
              date(:date/1000, 'unixepoch', 'localtime')
        ORDER BY createtime DESC
        ORDER BY createTime DESC
    """)
    fun getPackagesByDay(date: Long): Flow<List<Code>>
    @Query("""
        SELECT type as courierName, COUNT(*) as count
        SELECT oneLevel as courierName, COUNT(*) as count
        FROM code 
        WHERE strftime('%Y-%W', substr(createtime, 1, 10)) =
        WHERE strftime('%Y-%W', substr(createTime, 1, 10)) =
              strftime('%Y-%W', datetime(:date/1000, 'unixepoch', 'localtime'))
        GROUP BY type
        GROUP BY oneLevel
        ORDER BY count DESC
    """)
    fun getCourierStatsByWeek(date: Long): Flow<List<CourierStat>>
    @Query("""
        WITH RECURSIVE weeks(week_start, week_end) AS (
            -- 从选定的日期开始计算周
            SELECT
                date(datetime(:date/1000, 'unixepoch', 'localtime'), 'weekday 1', '-28 days') as week_start,
                date(datetime(:date/1000, 'unixepoch', 'localtime'), 'weekday 0', '-28 days') as week_end
            UNION ALL
            SELECT
                date(week_start, '+7 days'),
                date(week_end, '+7 days')
            FROM weeks
            WHERE date(week_start) <= date(datetime(:date/1000, 'unixepoch', 'localtime'))
            LIMIT 5
        )
        SELECT
            CAST(strftime('%W', week_start) AS INTEGER) as date,
            COUNT(code.id) as count,
            week_start as week_start
        FROM weeks
        LEFT JOIN code ON datetime(code.createtime) BETWEEN datetime(weeks.week_start)
            AND datetime(weeks.week_end, '+23 hours', '+59 minutes', '+59 seconds')
        GROUP BY weeks.week_start
        ORDER BY weeks.week_start ASC
    """)
    fun getDailyStatsByWeek(date: Long): Flow<List<DailyStat>>
    WITH RECURSIVE dates(date_value) AS (
        -- 从当前日期往前3周的周一开始
        SELECT date(datetime(:date/1000, 'unixepoch', 'localtime'), 'weekday 0', '-21 days') as date_value
        UNION ALL
        -- 每次加7天,直到后2周
        SELECT date(date_value, '+7 days')
        FROM dates
        WHERE date_value < date(datetime(:date/1000, 'unixepoch', 'localtime'), 'weekday 0', '+14 days')
    )
    SELECT
        strftime('%Y-%m-%d', date_value) as date,
        COUNT(c.id) as count,
        date_value as weekStart
    FROM dates d
    LEFT JOIN code c ON strftime('%Y-%m-%d', c.createTime) BETWEEN
        strftime('%Y-%m-%d', d.date_value)
        AND strftime('%Y-%m-%d', date(d.date_value, '+6 days'))
    GROUP BY d.date_value
    ORDER BY d.date_value ASC
    LIMIT :weekCount
""")
    fun getWeeklyStats(date: Long, weekCount: Int): Flow<List<DailyStat>>
    @Query("""
        SELECT * FROM code 
        WHERE substr(createtime, 1, 10) =
        WHERE substr(createTime, 1, 10) =
              date(:date/1000, 'unixepoch', 'localtime')
        ORDER BY createtime DESC
        ORDER BY createTime DESC
    """)
     fun getPackagesByWeek(date: Long): Flow<List<Code>>
    @Query("""
        SELECT oneLevel as courierName, COUNT(*) as count
        FROM code
        WHERE strftime('%Y-%m', substr(createTime, 1, 10)) =
              strftime('%Y-%m', datetime(:date/1000, 'unixepoch', 'localtime'))
        GROUP BY oneLevel
        ORDER BY count DESC
    """)
    fun getCourierStatsByMonth(date: Long): Flow<List<CourierStat>>
    @Query("""
        SELECT oneLevel as courierName, COUNT(*) as count
        FROM code
        WHERE strftime('%Y', substr(createTime, 1, 10)) =
              strftime('%Y', datetime(:date/1000, 'unixepoch', 'localtime'))
        GROUP BY oneLevel
        ORDER BY count DESC
    """)
    fun getCourierStatsByYear(date: Long): Flow<List<CourierStat>>
//    @Query("""
//        WITH RECURSIVE months(month_start) AS (
//            SELECT date(datetime(:date/1000, 'unixepoch', 'localtime'), 'start of month', '-11 months')
//            UNION ALL
//            SELECT date(month_start, '+1 month')
//            FROM months
//            WHERE date(month_start) < date(datetime(:date/1000, 'unixepoch', 'localtime'), 'start of month')
//        )
//        SELECT
//            strftime('%m', month_start) as date,
//            COUNT(code.id) as count,
//            month_start as week_start
//        FROM months
//        LEFT JOIN code ON strftime('%Y-%m', code.createTime) = strftime('%Y-%m', months.month_start)
//        GROUP BY months.month_start
//        ORDER BY months.month_start ASC
//    """)
//    fun getMonthlyStats(date: Long): Flow<List<DailyStat>>
    @Query("""
        WITH RECURSIVE years(year_start) AS (
            SELECT date(datetime(:date/1000, 'unixepoch', 'localtime'), 'start of year', '-4 years')
            UNION ALL
            SELECT date(year_start, '+1 year')
            FROM years
            WHERE date(year_start) < date(datetime(:date/1000, 'unixepoch', 'localtime'), 'start of year')
        )
        SELECT
            strftime('%Y', year_start) as date,
            COUNT(code.id) as count,
            year_start as week_start
        FROM years
        LEFT JOIN code ON strftime('%Y', code.createTime) = strftime('%Y', years.year_start)
        GROUP BY years.year_start
        ORDER BY years.year_start ASC
    """)
    fun getYearlyStats(date: Long): Flow<List<DailyStat>>
    @Query("""
        WITH RECURSIVE dates(date) AS (
            SELECT date(datetime(:date/1000, 'unixepoch', 'localtime'), 'start of year')
            UNION ALL
            SELECT date(date, '+1 day')
            FROM dates
            WHERE date < date(datetime(:date/1000, 'unixepoch', 'localtime'), 'start of year', '+1 year', '-1 day')
        )
        SELECT
            CAST(strftime('%w', dates.date) AS INTEGER) as dayOfWeek,
            CAST(strftime('%W', dates.date) AS INTEGER) as weekOfYear,
            COUNT(code.id) as count
        FROM dates
        LEFT JOIN code ON date(code.createTime) = dates.date
        GROUP BY dates.date
        ORDER BY dates.date
    """)
    fun getYearlyHeatmap(date: Long): Flow<List<HeatmapStat>>
    @Query("""
        WITH RECURSIVE days(date) AS (
            SELECT date(datetime(:date/1000, 'unixepoch', 'localtime'), 'start of month')
            UNION ALL
            SELECT date(date, '+1 day')
            FROM days
            WHERE date < date(datetime(:date/1000, 'unixepoch', 'localtime'), 'start of month', '+1 month', '-1 day')
        )
        SELECT
            strftime('%d', days.date) || '' as date,  -- 确保 date 不为空
            COUNT(code.id) as count,
            days.date as week_start
        FROM days
        LEFT JOIN code ON date(code.createTime) = days.date
        GROUP BY days.date
        ORDER BY days.date ASC
    """)
    fun getMonthlyStats(date: Long): Flow<List<DailyStat>>
    @Query("""
        WITH RECURSIVE months(month_start) AS (
            SELECT date(datetime(:date/1000, 'unixepoch', 'localtime'), 'start of year') as month_start
            UNION ALL
            SELECT date(month_start, '+1 month')
            FROM months
            WHERE strftime('%m', month_start) < '12'
        )
        SELECT
            strftime('%m', month_start) as date,
            COUNT(code.id) as count,
            month_start as weekStart
        FROM months
        LEFT JOIN code ON strftime('%Y-%m', code.createTime) = strftime('%Y-%m', months.month_start)
        GROUP BY months.month_start
        ORDER BY months.month_start ASC
    """)
    fun getYearMonthlyStats(date: Long): Flow<List<DailyStat>>
    // 新增当前周统计方法
    @Query("""
    WITH RECURSIVE days(date) AS (
        SELECT date(datetime(:date/1000, 'unixepoch', 'localtime'), 'weekday 0') as date
        UNION ALL
        SELECT date(date, '+1 day')
        FROM days
        WHERE date < date(datetime(:date/1000, 'unixepoch', 'localtime'), 'weekday 6')
    )
    SELECT
        strftime('%Y-%m-%d', days.date) as date,
        COUNT(code.id) as count,
        days.date as weekStart
    FROM days
    LEFT JOIN code ON date(code.createTime) = days.date
    GROUP BY days.date
    ORDER BY days.date ASC
""")
    fun getCurrentWeekStats(date: Long): Flow<List<DailyStat>>
    // 新增当前年统计方法
    @Query("""
    SELECT
        strftime('%Y', datetime(:date/1000, 'unixepoch', 'localtime')) as date,
        COUNT(id) as count,
        datetime(:date/1000, 'unixepoch', 'localtime') as weekStart
    FROM code
    WHERE strftime('%Y', createTime) = strftime('%Y', datetime(:date/1000, 'unixepoch', 'localtime'))
""")
    fun getCurrentYearStats(date: Long): Flow<List<DailyStat>>
    @Query("""
        SELECT oneLevel as stationName, COUNT(*) as count
        FROM Code
        WHERE category = :type AND pickup = '0'
        GROUP BY oneLevel
        ORDER BY createTime DESC
    """)
    fun getStationsByType(type: String): List<StationGroup>
    @Query("""
        SELECT * FROM Code
        WHERE category = :type AND pickup = '0'
        AND oneLevel = :stationName
        ORDER BY createTime DESC
    """)
    fun getPackagesByTypeAndStation(type: String, stationName: String): List<Code>
}