zjk
2026-09-29 54dcf0a82e7490fa58b1c056d5c0b9cb739c2931
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tcm.training.admin.member.mapper.ClinicQueryMapper">
 
    <sql id="ClinicWhere">
        WHERE c.deleted = 0
        <if test="regionCode != null and regionCode.trim() != ''">
            AND (
                c.province_code = #{regionCode}
                OR c.city_code = #{regionCode}
                OR c.district_code = #{regionCode}
            )
        </if>
        <if test="name != null and name.trim() != ''">
            AND c.name LIKE CONCAT('%', #{name}, '%')
        </if>
        <if test="phone != null and phone.trim() != ''">
            AND c.contact_phone LIKE CONCAT('%', #{phone}, '%')
        </if>
        <if test="agentName != null and agentName.trim() != ''">
            AND pa.agent_name LIKE CONCAT('%', #{agentName}, '%')
        </if>
        <if test="createdFrom != null">
            AND c.created_at &gt;= #{createdFrom}
        </if>
        <if test="createdTo != null">
            AND c.created_at &lt;= #{createdTo}
        </if>
        <if test="status != null">
            AND c.status = #{status}
        </if>
    </sql>
 
    <select id="selectClinicPage" resultType="com.tcm.training.admin.member.row.ClinicListRow">
        SELECT
            c.id,
            c.name,
            c.contact_phone AS phone,
            CASE
                WHEN c.province_name IS NOT NULL AND c.province_name != '' THEN
                    CONCAT(
                        c.province_name,
                        IFNULL(c.city_name, ''),
                        IFNULL(c.district_name, '')
                    )
                ELSE NULL
            END AS regionName,
            c.status,
            pa.agent_name AS agentName,
            COUNT(u.id) AS userCount,
            c.created_at AS createdAt,
            c.business_license_url AS businessLicenseUrl
        FROM tcm_clinic c
        LEFT JOIN tcm_provincial_agent pa ON pa.id = c.agent_id AND pa.deleted = 0
        LEFT JOIN tcm_app_user u ON u.clinic_id = c.id AND u.deleted = 0
        <include refid="ClinicWhere"/>
        GROUP BY
            c.id,
            c.name,
            c.contact_phone,
            c.province_name,
            c.city_name,
            c.district_name,
            c.status,
            pa.agent_name,
            c.created_at,
            c.business_license_url
        ORDER BY c.id DESC
    </select>
 
    <select id="selectClinicList" resultType="com.tcm.training.admin.member.row.ClinicListRow">
        SELECT
            c.id,
            c.name,
            c.address,
            c.contact_phone AS phone,
            CASE
                WHEN c.province_name IS NOT NULL AND c.province_name != '' THEN
                    CONCAT(
                        c.province_name,
                        IFNULL(c.city_name, ''),
                        IFNULL(c.district_name, '')
                    )
                ELSE NULL
            END AS regionName,
            c.status,
            pa.agent_name AS agentName,
            COUNT(u.id) AS userCount,
            c.created_at AS createdAt,
            c.business_license_url AS businessLicenseUrl
        FROM tcm_clinic c
        LEFT JOIN tcm_provincial_agent pa ON pa.id = c.agent_id AND pa.deleted = 0
        LEFT JOIN tcm_app_user u ON u.clinic_id = c.id AND u.deleted = 0
        <include refid="ClinicWhere"/>
        GROUP BY
            c.id,
            c.name,
            c.contact_phone,
            c.province_name,
            c.city_name,
            c.district_name,
            c.status,
            pa.agent_name,
            c.created_at,
            c.business_license_url,
            c.address
        ORDER BY c.id DESC
    </select>
 
    <select id="selectRegionOptions" resultType="com.tcm.training.admin.member.row.ClinicRegionOptionRow">
        SELECT DISTINCT
            CASE
                WHEN c.district_code IS NOT NULL AND c.district_code != '' THEN c.district_code
                WHEN c.city_code IS NOT NULL AND c.city_code != '' THEN c.city_code
                ELSE c.province_code
            END AS regionCode,
            CASE
                WHEN c.province_name IS NOT NULL AND c.province_name != '' THEN
                    CONCAT(
                        c.province_name,
                        IFNULL(c.city_name, ''),
                        IFNULL(c.district_name, '')
                    )
                ELSE NULL
            END AS regionName
        FROM tcm_clinic c
        WHERE c.deleted = 0
          AND c.province_name IS NOT NULL
          AND c.province_name != ''
        ORDER BY regionCode ASC
    </select>
 
    <select id="selectClinicDetail" resultType="com.tcm.training.admin.member.row.ClinicDetailRow">
        SELECT c.id, c.name, c.contact_phone AS contactPhone, c.address, c.province_code AS provinceCode, c.city_code AS cityCode, c.district_code AS districtCode,
               c.business_license_url AS businessLicenseUrl,
               c.bank_name AS bankName, c.account_holder AS accountHolder,
               c.account_number AS accountNumber, c.branch_name AS branchName,
               c.status, c.agent_id AS agentId,
               u.phone AS loginAccount, u.avatar AS avatar,
               COUNT(u.id) AS userCount
        FROM tcm_clinic c
        LEFT JOIN tcm_app_user u ON u.clinic_id = c.id AND u.deleted = 0 and u.type = 1
        WHERE c.deleted = 0 AND c.id = #{id}
        GROUP BY c.id, c.name, c.contact_phone, c.address, c.province_code, c.city_code, c.district_code, c.business_license_url,c.status,
                 c.bank_name, c.account_holder, c.account_number, c.branch_name, u.avatar, u.phone
    </select>
 
    <select id="selectClinicUserPage" resultType="com.tcm.training.admin.member.row.ClinicBoundUserRow">
        SELECT
            u.id,
            u.nickname,
            u.phone,
            u.avatar,
            IFNULL(p.livePoints, 0) AS livePoints,
            CASE
                WHEN u.member_expire_at IS NOT NULL AND u.member_expire_at &gt; NOW() THEN 1
                ELSE 0
            END AS isMember,
            u.status,
            u.created_at AS createdAt
        FROM tcm_app_user u
        LEFT JOIN (
            SELECT
                app_user_id,
                SUM(points_delta) AS livePoints
            FROM tcm_points_ledger
            WHERE deleted = 0
              AND business_type = 'LIVE_WATCH'
              AND income_expense_type = 'INCOME'
            GROUP BY app_user_id
        ) p ON p.app_user_id = u.id
        WHERE u.deleted = 0
          AND u.clinic_id = #{clinicId}
        <if test="nickname != null and nickname.trim() != ''">
            AND u.nickname LIKE CONCAT('%', #{nickname}, '%')
        </if>
        <if test="phone != null and phone.trim() != ''">
            AND u.phone LIKE CONCAT('%', #{phone}, '%')
        </if>
        <if test="status != null">
            AND u.status = #{status}
        </if>
        <if test="isMember != null and isMember == 1">
            AND u.member_expire_at IS NOT NULL AND u.member_expire_at &gt; NOW()
        </if>
        <if test="isMember != null and isMember == 0">
            AND (u.member_expire_at IS NULL OR u.member_expire_at &lt;= NOW())
        </if>
        <if test="registeredFrom != null">
            AND u.created_at &gt;= #{registeredFrom}
        </if>
        <if test="registeredTo != null">
            AND u.created_at &lt;= #{registeredTo}
        </if>
        ORDER BY u.id DESC
    </select>
 
</mapper>