package com.example.firstapp.database.dao
|
|
import androidx.room.Dao
|
import androidx.room.Delete
|
import androidx.room.Insert
|
import androidx.room.Query
|
import androidx.room.Update
|
import com.example.firstapp.database.entity.Code
|
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
|
|
@Dao
|
interface CodeDao {
|
|
@Insert
|
fun insert(code: Code): Long
|
|
@Update
|
fun update(code: Code)
|
|
@Delete
|
fun delete(msg: Msg): Completable
|
|
@Query("DELETE FROM Code where id=:id")
|
fun delete(id: Long)
|
|
@Query("DELETE FROM Code")
|
fun deleteAll(): Completable
|
|
|
@Query("SELECT * FROM Code WHERE id = :id LIMIT 1")
|
fun getCodeById(id: Long): Code?
|
|
@Query("SELECT * FROM Code")
|
fun getAllCodes(): List<Code>
|
|
@Query("SELECT * FROM Code WHERE oneLevel = :type")
|
fun getCodesByType(type: String): List<Code>
|
|
|
|
@Query("DELETE FROM Code WHERE id = :id")
|
fun deleteCodeById(id: Long)
|
|
@Query("SELECT * FROM Code order by time desc")
|
abstract fun getAllCodesDesc(): List<Code>
|
|
@Query("""
|
SELECT * FROM Code
|
WHERE oneLevel LIKE '%' || :keyword || '%'
|
AND pickup = '0'
|
ORDER BY createTime DESC
|
""")
|
fun getByKeyword(keyword: String): List<Code>
|
|
@Query("""
|
SELECT * FROM Code
|
WHERE category = :category
|
AND code = :code
|
AND (smsTimestamp = :smsTimestamp )
|
LIMIT 1
|
""")
|
fun queryByTypeAndCodeAndDate(category: String, code: String, smsTimestamp: Long): 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")
|
fun getNewPackagesByDay(date: Long): List<Code>
|
|
@Query("""
|
SELECT * FROM code
|
WHERE substr(createTime, 1, 10) =
|
date(:date/1000, 'unixepoch', 'localtime')
|
ORDER BY createTime DESC
|
""")
|
fun getPackagesByDay(date: Long): Flow<List<Code>>
|
|
@Query("""
|
SELECT * FROM code
|
WHERE substr(createTime, 1, 10) =
|
date(:date/1000, 'unixepoch', 'localtime') and pickup = 1 and category='快递'
|
ORDER BY createTime DESC
|
""")
|
fun getPackagesByDayReaded(date: Long): Flow<List<Code>>
|
|
@Query("""
|
SELECT oneLevel as courierName, COUNT(*) as count
|
FROM code
|
WHERE strftime('%Y-%W', substr(createTime, 1, 10)) =
|
strftime('%Y-%W', datetime(:date/1000, 'unixepoch', 'localtime')) and category='快递'
|
GROUP BY oneLevel
|
ORDER BY count DESC
|
""")
|
fun getCourierStatsByWeek(date: Long): Flow<List<CourierStat>>
|
|
@Query("""
|
WITH RECURSIVE dates(date_value) AS (
|
SELECT date(datetime(:date/1000, 'unixepoch', 'localtime'), 'weekday 0', '-21 days') as date_value
|
UNION ALL
|
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,
|
strftime('%Y-%m-%d', 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) =
|
date(:date/1000, 'unixepoch', 'localtime')
|
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')) and category='快递'
|
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')) and category='快递'
|
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,
|
strftime('%Y-%m-%d', year_start) as weekStart
|
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 and code.category='快递'
|
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,
|
COUNT(code.id) as count,
|
strftime('%Y-%m-%d', 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 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(c.id) as count,
|
strftime('%Y-%m-%d', month_start) as weekStart
|
FROM months m
|
LEFT JOIN code c ON strftime('%Y-%m', c.createTime) = strftime('%Y-%m', m.month_start) and c.category='快递'
|
GROUP BY m.month_start
|
ORDER BY m.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,
|
strftime('%Y-%m-%d', 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,
|
strftime('%Y-%m-%d', 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>
|
|
|
@Query("""
|
SELECT COUNT(1)
|
FROM code
|
WHERE date(createTime) BETWEEN date(:startDateCur) AND date(:endDateCur)
|
""")
|
fun getCurrentWeekStats2(startDateCur: String, endDateCur: String): Flow<Long>
|
|
// @Query("""
|
// WITH RECURSIVE dates(date_value) AS (
|
// SELECT date('now', 'weekday 1', '-7 days')
|
// UNION ALL
|
// SELECT date(date_value, '+1 day')
|
// FROM dates
|
// WHERE date_value < date('now', 'weekday 1', '-7 days', '+6 days')
|
// )
|
// SELECT
|
// strftime('%d', date_value) AS date,
|
// COUNT(c.id) AS count,
|
// '' as weekStart
|
// FROM dates d
|
// LEFT JOIN code c ON date(c.createTime) = d.date_value
|
// GROUP BY d.date_value
|
// ORDER BY d.date_value ASC
|
//
|
// """)
|
|
@Query("""
|
WITH RECURSIVE dates(date_value) AS (
|
SELECT date(:startDateCur)
|
UNION ALL
|
SELECT date(date_value, '+1 day')
|
FROM dates
|
WHERE date_value < date(:endDateCur)
|
)
|
SELECT
|
strftime('%d', date_value) AS date,
|
COUNT(c.id) AS count,
|
'' AS weekStart
|
FROM dates d
|
LEFT JOIN code c ON date(c.createTime) = d.date_value and c.category='快递'
|
GROUP BY d.date_value
|
ORDER BY d.date_value ASC
|
""")
|
fun getWeeklyStatsChart(startDateCur: String, endDateCur: String): Flow<List<DailyStat>>
|
|
|
@Query("""
|
SELECT COUNT(1)
|
FROM code
|
WHERE date(createTime) BETWEEN date(:startDateCur) AND date(:endDateCur) and category =:type
|
""")
|
fun getDateStatsByType(startDateCur: String, endDateCur: String,type: String): Flow<Long>
|
}
|