From 93775e1f3d79a1e11b839abbf24201dafcd9e646 Mon Sep 17 00:00:00 2001 From: tj <1378534974@qq.com> Date: 星期五, 25 四月 2025 13:45:56 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt | 307 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 302 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt b/app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt index a3c0bca..4cc2795 100644 --- a/app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt +++ b/app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt @@ -7,7 +7,12 @@ 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 { @@ -24,6 +29,9 @@ @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? @@ -31,7 +39,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> @@ -44,11 +52,300 @@ @Query(""" SELECT * FROM Code - WHERE type LIKE '%' || :keyword || '%' - ORDER BY time DESC + WHERE oneLevel LIKE '%' || :keyword || '%' + AND pickup = '0' + ORDER BY createTime DESC """) fun getByKeyword(keyword: String): List<Code> - @Query("SELECT * FROM Code WHERE type = :content and code= :code and overtime = :dateString LIMIT 1") - fun queryByTypeAndCodeAndDate(content: String, code: String, dateString: String): 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> } -- Gitblit v1.9.3