cloudroam
2025-03-05 2933603ee0940395a80a91bb23e50cbe8ba9baa5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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 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("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 type = :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 type 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("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 type as courierName, COUNT(*) as count 
        FROM code 
        WHERE strftime('%Y-%W', substr(createtime, 1, 10)) = 
              strftime('%Y-%W', datetime(:date/1000, 'unixepoch', 'localtime'))
        GROUP BY type
        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>>
 
    @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>>
}