shinnosuke
2026-08-05 971e637c2eebe93011a485ddfa99d4f19289811d
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package com.talentcard.server.mapper;
 
import java.util.List;
import java.util.Map;
 
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.talentcard.server.entity.TicketPackage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
 
@Mapper
public interface TicketPackageMapper extends BaseMapper<TicketPackage> {
 
    @Select("""
            select p.id,
                   p.package_no as packageNo,
                   p.package_name as packageName,
                   p.merchant_id as merchantId,
                   m.merchant_name as merchantName,
                   p.cover_url as coverUrl,
                   p.talent_levels as talentLevels,
                   p.claim_price as claimPrice,
                   p.per_user_limit as perUserLimit,
                   p.valid_start as validStart,
                   p.valid_end as validEnd,
                   p.app_name as appName,
                   p.app_jump_url as appJumpUrl,
                   p.usage_text as usageText,
                   p.status,
                   p.sort_no as sortNo,
                   p.created_at as createdAt,
                   p.updated_at as updatedAt,
                   count(c.id) as totalCodes,
                   sum(case when c.status = 'AVAILABLE' and c.deleted = 0 then 1 else 0 end) as availableCodes,
                   sum(case when c.status = 'LOCKED' and c.deleted = 0 then 1 else 0 end) as lockedCodes,
                   sum(case when c.status = 'ISSUED' and c.deleted = 0 then 1 else 0 end) as issuedCodes,
                   sum(case when c.status = 'USED' and c.deleted = 0 then 1 else 0 end) as usedCodes,
                   sum(case when c.status = 'VOID' and c.deleted = 0 then 1 else 0 end) as voidCodes
            from ticket_package p
            left join merchant m on m.id = p.merchant_id and m.deleted = 0
            left join ticket_package_code c on c.package_id = p.id and c.deleted = 0
            where p.deleted = 0
              and (#{merchantId} is null or p.merchant_id = #{merchantId})
              and (#{status} is null or p.status = #{status})
              and (#{keyword} is null or #{keyword} = '' or p.package_name like concat('%', #{keyword}, '%') or p.package_no like concat('%', #{keyword}, '%'))
            group by p.id
            order by p.sort_no desc, p.id desc
            limit #{size} offset #{offset}
            """)
    List<Map<String, Object>> selectAdminPage(@Param("merchantId") Long merchantId,
                                              @Param("status") Integer status,
                                              @Param("keyword") String keyword,
                                              @Param("size") int size,
                                              @Param("offset") int offset);
 
    @Select("""
            select count(*)
            from ticket_package p
            where p.deleted = 0
              and (#{merchantId} is null or p.merchant_id = #{merchantId})
              and (#{status} is null or p.status = #{status})
              and (#{keyword} is null or #{keyword} = '' or p.package_name like concat('%', #{keyword}, '%') or p.package_no like concat('%', #{keyword}, '%'))
            """)
    Long countAdminPage(@Param("merchantId") Long merchantId,
                        @Param("status") Integer status,
                        @Param("keyword") String keyword);
 
    @Select("""
            select p.id,
                   p.package_no as packageNo,
                   p.package_name as packageName,
                   p.merchant_id as merchantId,
                   m.merchant_name as merchantName,
                   p.cover_url as coverUrl,
                   p.talent_levels as talentLevels,
                   p.claim_price as claimPrice,
                   p.per_user_limit as perUserLimit,
                   p.valid_start as validStart,
                   p.valid_end as validEnd,
                   p.app_name as appName,
                   p.app_jump_url as appJumpUrl,
                   p.usage_text as usageText,
                   p.status,
                   p.sort_no as sortNo,
                   p.created_at as createdAt,
                   p.updated_at as updatedAt,
                   count(c.id) as totalCodes,
                   sum(case when c.status = 'AVAILABLE' and c.deleted = 0 then 1 else 0 end) as availableCodes,
                   sum(case when c.status = 'LOCKED' and c.deleted = 0 then 1 else 0 end) as lockedCodes,
                   sum(case when c.status = 'ISSUED' and c.deleted = 0 then 1 else 0 end) as issuedCodes,
                   sum(case when c.status = 'USED' and c.deleted = 0 then 1 else 0 end) as usedCodes,
                   sum(case when c.status = 'VOID' and c.deleted = 0 then 1 else 0 end) as voidCodes
            from ticket_package p
            left join merchant m on m.id = p.merchant_id and m.deleted = 0
            left join ticket_package_code c on c.package_id = p.id and c.deleted = 0
            where p.id = #{id} and p.deleted = 0
            group by p.id
            limit 1
            """)
    Map<String, Object> selectAdminDetail(@Param("id") Long id);
 
    @Select("""
            select p.id,
                   p.package_no as packageNo,
                   p.package_name as packageName,
                   p.merchant_id as merchantId,
                   m.merchant_name as merchantName,
                   p.cover_url as coverUrl,
                   p.talent_levels as talentLevels,
                   p.claim_price as claimPrice,
                   p.per_user_limit as perUserLimit,
                   p.valid_start as validStart,
                   p.valid_end as validEnd,
                   p.app_name as appName,
                   p.app_jump_url as appJumpUrl,
                   p.usage_text as usageText,
                   p.status,
                   p.sort_no as sortNo,
                   sum(case when c.status = 'AVAILABLE' and c.deleted = 0 then 1 else 0 end) as availableCodes
            from ticket_package p
            left join merchant m on m.id = p.merchant_id and m.deleted = 0
            left join ticket_package_code c on c.package_id = p.id and c.deleted = 0
            where p.deleted = 0
              and p.status = 1
              and (p.valid_start is null or p.valid_start <= current_date)
              and (p.valid_end is null or p.valid_end >= current_date)
              and (#{merchantId} is null or p.merchant_id = #{merchantId})
            group by p.id
            order by p.sort_no desc, p.id desc
            """)
    List<Map<String, Object>> selectPortalPackages(@Param("merchantId") Long merchantId);
 
    @Select("""
            select p.*
            from ticket_package p
            where p.id = #{id} and p.deleted = 0
            limit 1
            for update
            """)
    TicketPackage selectByIdForUpdate(@Param("id") Long id);
}