From f67cf3b81a00f732ca743431258ae6b78f5f40ab Mon Sep 17 00:00:00 2001
From: tj <1378534974@qq.com>
Date: 星期四, 17 四月 2025 15:05:28 +0800
Subject: [PATCH] 11、我的	切换头像  点击切换头像没有显示允许存储权限的窗口,华为的手机目前有 49、首页	实时刷新  点击全部取件或其他分类后,回到上一层,内容没有刷新(5个分类) 52、数据统计	数据统计  1.周月年的柱状图统计逻辑需要修改为只统计快递类的数据  2.按年的图形统计,右下方加上图示说明 53、首页	首页登录  点击用户协议、隐私政策无反应

---
 app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt |  309 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 308 insertions(+), 1 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 8df5a2b..e63ba6a 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>
 
 
@@ -41,4 +49,303 @@
 
     @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 time DESC
+    """)
+    fun getByKeyword(keyword: String): List<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")
+    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