zhubaomin
2025-04-07 ecef3df4890be54c1da2a8a4fc1c8c1f50f1c263
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml
@@ -61,10 +61,13 @@
    </delete>
    <!--依据水卡地址获取水卡编号(12月19日废弃)-->
    <!--2024-06-30取消废弃,恢复使用-->
    <select id="getCardIdByAddr" resultType="java.lang.Long">
        SELECT id AS cardId
        FROM se_client_card
        WHERE cardAddr = #{cardAddr}
        ORDER BY id DESC
        LIMIT 1
    </select>
    <!--根据水卡编号获取水卡表主键(12月19日添加后废弃)-->
@@ -89,7 +92,8 @@
    <!-- 根据水卡编号获取水卡对应的农户id和姓名 -->
    <select id="getClientIdAndNameByCardAddrAndCardNo" resultType="java.util.Map">
        SELECT cli.id   AS clientId,
               cli.name AS clientName
               cli.name AS clientName,
               cli.address AS clientAddress
        FROM se_client_card card
                 INNER JOIN se_client cli ON card.clientId = cli.id
        WHERE card.cardAddr = #{cardAddr}
@@ -346,47 +350,67 @@
    <!--根据农户主键获取水卡列表(物理卡+虚拟卡)-->
    <select id="getCardInfoByClientId" resultType="com.dy.pipIrrGlobal.voSe.VoCardInfo">
        SELECT *
        FROM (SELECT '物理卡'              AS cardType,
                     clientCard.cardNum AS cardNum,
                     clientCard.money   AS money,
                     (CASE
                          WHEN clientCard.state = 1 THEN '正常'
                          WHEN clientCard.state = 2 THEN '已注销'
                          ELSE '已挂失'
                         END)           AS state
              FROM se_client client
                       LEFT JOIN se_client_card clientCard ON clientCard.clientId = client.id
              WHERE client.id = #{clientId,jdbcType=BIGINT}
        FROM (SELECT
                '物理卡' AS cardType,
                card.cardNum AS cardNum,
                card.money   AS money,
                (CASE
                    WHEN card.state = 1 THEN '正常'
                    WHEN card.state = 2 THEN '已注销'
                    ELSE '已挂失'
                END) AS state
              FROM se_client_card card
                INNER JOIN se_client cli ON cli.id = card.clientId
              WHERE state != 4 AND card.clientId = #{clientId,jdbcType=BIGINT}
              UNION ALL
              SELECT '虚拟卡'     AS cardType,
                     vc.vc_num AS cardNum,
                     vc.money  AS money,
                     (CASE
                          WHEN vc.in_use = 0 THEN '未使用'
                          WHEN vc.in_use = 1 THEN '使用中'
                         END)  AS state
              SELECT
                '虚拟卡' AS cardType,
                vc.vc_num AS cardNum,
                ROUND(vc.money /100, 2)  AS money,
                (CASE
                    WHEN vc.in_use = 0 THEN '未使用'
                    WHEN vc.in_use = 1 THEN '使用中'
                END) AS state
              FROM se_virtual_card vc
                       INNER JOIN se_client cli ON cli.id = vc.client_id
              WHERE vc.client_id = #{clientId,jdbcType=BIGINT}
        <!--              SELECT '虚拟卡'              AS cardType,-->
        <!--                     virtualCard.vc_num AS CardNum,-->
        <!--                     virtualCard.money  AS vcMoney,-->
        <!--                     (CASE-->
        <!--                          WHEN virtualCard.in_use = 0 THEN '未使用'-->
        <!--                          WHEN virtualCard.in_use = 1 THEN '使用中'-->
        <!--                         END)           AS State-->
        <!--              FROM se_client client-->
        <!--                       LEFT JOIN se_virtual_card virtualCard ON client.id = virtualCard.client_id-->
        <!--              WHERE client.id = #{clientId,jdbcType=BIGINT}-->
                INNER JOIN se_client cli ON cli.id = vc.client_id
              WHERE vc.state = 1 AND vc.client_id = #{clientId,jdbcType=BIGINT}
        ) card
        ORDER BY card.Money DESC, card.State DESC
    </select>
    <!--根据水卡编号获取操作记录列表-->
    <select id="getOperateRecordsByCardNum" resultType="java.util.HashMap">
        SELECT *
        FROM v_operate
        WHERE cardNum = #{cardNum,jdbcType=BIGINT}
        SELECT
            ope.id AS orderNumber,
            cli.villageId,
            cli.districtTitle,
            cli.clientNum,
            cli.`name`,
            card.cardNum,
            cli.idCard,
            cli.phone,
            IFNULL(ope.money,0) AS money,
            IFNULL(ope.gift,0) AS gift,
            IFNULL(ope.card_cost,0) AS cardCost,
            IFNULL((ope.money + ope.trade_amount + ope.gift),0) AS afterRecharge,
            ope.payment_id AS paymentId,
            pay.name AS paymentMethod,
            CASE
            WHEN ope.operate_type = 1 THEN '开卡'
            WHEN ope.operate_type = 2 THEN '充值'
            WHEN ope.operate_type = 3 THEN '销卡'
            END AS operateType,
            ope.operate_dt AS operateDt,
            user.name AS operatorName
        FROM se_card_operate ope
            LEFT JOIN se_client cli ON cli.id = ope.client_id
            LEFT JOIN se_client_card card ON card.id = ope.card_id
            LEFT JOIN se_payment_method pay ON pay.id = ope.payment_id
            LEFT JOIN ba_user user ON user.id = ope.operator
        WHERE ope.operate_valid = 2 AND ope.operate_type in (1,2,3) AND cardNum = #{cardNum,jdbcType=BIGINT}
<!--        SELECT *-->
<!--        FROM v_operate-->
<!--        WHERE cardNum = #{cardNum,jdbcType=BIGINT}-->
    </select>
    <!--根据水卡编号获取余额-->
@@ -423,6 +447,7 @@
                    WHEN state = 1 THEN '正常'
                    WHEN state = 2 THEN '已注销'
                    WHEN state = 3 THEN '已挂失'
                    WHEN state = 4 THEN '无效卡片'
            END) AS stateName
        FROM se_client_card
        WHERE cardNum = #{cardNum,jdbcType=BIGINT}
@@ -432,7 +457,7 @@
    <select id="getCardsCount" parameterType="java.util.Map" resultType="java.lang.Long">
        SELECT COUNT(*) AS recordCount
        FROM se_client_card card
                 INNER JOIN se_client cli ON card.clientId = cli.id
            LEFT JOIN se_client cli ON card.clientId = cli.id
        <where>
            AND card.state = 1
            <if test="clientNum != null and clientNum != ''">
@@ -452,25 +477,16 @@
    <!--根据指定条件获取水卡列表,应用程序使用-->
    <select id="getCards" resultType="com.dy.pipIrrGlobal.voSe.VoCards">
        SELECT cli.clientNum,
               cli.name AS clientName,
               cardNum,
        <!--        CASE-->
        <!--            WHEN card.cardNum LIKE '10%' THEN CONCAT(SUBSTRING(card.cardNum, 7, 6),SUBSTRING(card.cardNum, 14, 4))-->
        <!--            ELSE card.cardNum-->
        <!--        END AS cardNum,-->
        cli.phone,
        cli.idCard,
        card.state AS cardState,
        <!--        (CASE-->
        <!--            WHEN card.state = 1 THEN '正常'-->
        <!--            WHEN card.state = 2 THEN '已注销'-->
        <!--            WHEN card.state = 3 THEN '已挂失'-->
        <!--        End) AS stateName,-->
        '正常'                  AS stateName,
        '农户卡'                 AS cardType,
        FORMAT(card.money, 2) AS money
            cli.name AS clientName,
            cardNum,
            cli.phone,
            cli.idCard,
            card.state AS cardState,
            '正常' AS stateName,
            '农户卡' AS cardType,
            FORMAT(card.money, 2) AS money
        FROM se_client_card card
                 INNER JOIN se_client cli ON card.clientId = cli.id
            LEFT JOIN se_client cli ON card.clientId = cli.id
        <where>
            AND card.state = 1
            <if test="clientNum != null and clientNum != ''">
@@ -504,23 +520,20 @@
    <!--获取已挂失未补卡的记录-->
    <select id="getUnreplaced" resultType="com.dy.pipIrrGlobal.voSe.VoCards">
        SELECT cli.clientNum,
               cli.name AS clientName,
               cardNum,
        <!--        CASE-->
        <!--          WHEN card.cardNum LIKE '10%' THEN CONCAT(SUBSTRING(card.cardNum, 7, 6),SUBSTRING(card.cardNum, 14, 4))-->
        <!--          ELSE card.cardNum-->
        <!--        END AS cardNum,-->
        cli.phone,
        cli.idCard,
        card.state            AS cardState,
        '已挂失'                 AS stateName,
        '农户卡'                 AS cardType,
        FORMAT(card.money, 2) AS money
        SELECT
            cli.clientNum,
            cli.name AS clientName,
            cardNum,
            cli.phone,
            cli.idCard,
            card.state AS cardState,
            '已挂失' AS stateName,
            '农户卡' AS cardType,
            FORMAT(card.money, 2) AS money
        FROM se_client_card card
                 INNER JOIN se_client cli ON card.clientId = cli.id
            INNER JOIN se_client cli ON card.clientId = cli.id
        WHERE card.state = 3
          AND NOT EXISTS(SELECT * FROM se_client_card card2 WHERE card2.original_card_id = card.id)
            AND NOT EXISTS(SELECT * FROM se_client_card card2 WHERE card2.original_card_id = card.id)
        ORDER BY card.id
        <trim prefix="limit ">
            <if test="start != null and count != null">
@@ -529,7 +542,7 @@
        </trim>
    </select>
    <!--根据指定水卡编号获取挂失事记录数量(补卡、解锁使用)-->
    <!--根据指定水卡编号获取挂失记录数量(补卡、解锁使用)-->
    <select id="getLostCount" resultType="java.lang.Integer">
        SELECT COUNT(*) AS recordCount
        FROM se_client_card card
@@ -556,7 +569,7 @@
    <select id="getCardsByClientNameAndPhoneCount" resultType="java.lang.Long">
        SELECT COUNT(*) AS recordCount
        FROM se_client_card card
                 INNER JOIN se_client cli ON card.clientId = cli.id
            INNER JOIN se_client cli ON card.clientId = cli.id
        <where>
            card.state = 1
            <if test="clientName != null and clientName != ''">
@@ -586,7 +599,7 @@
               '农户卡'                 AS cardType,
               FORMAT(card.money, 2) AS money
        FROM se_client_card card
                 INNER JOIN se_client cli ON card.clientId = cli.id
            LEFT JOIN se_client cli ON card.clientId = cli.id
        <where>
            card.state = 1
            <if test="clientName != null and clientName != ''">
@@ -636,11 +649,11 @@
        WHERE state = 1
    </select>
    <!--根据水卡地址获取水卡数量-->
    <!--根据水卡地址获取水卡数量,无效卡片排除在外-->
    <select id="getCountByCardAddr" resultType="java.lang.Long">
        SELECT COUNT(*) AS recordCount
        FROM se_client_card
        WHERE cardAddr = #{cardAddr}
        WHERE cardAddr = #{cardAddr} AND se_client_card.state != 4
    </select>
    <!--根据水卡地址获取指定状态的水卡数量-->
@@ -650,4 +663,121 @@
        WHERE cardAddr = #{cardAddr}
          AND state IN (1, 3)
    </select>
    <!--获取指定时间段水卡使用情况记录数量-->
    <select id="getCardUsagesCount" resultType="com.dy.pipIrrGlobal.voSt.VoCardUsage">
        SELECT
        card.id as cardId,
        cli.name AS clientName,
        card.cardNum,
        a.cl_ic_card_no,
        card.money AS balance,
        a.totalConsumption,
        b.totalRecharge
        FROM  se_client_card card
        INNER JOIN se_client cli ON cli.id = card.clientId
        LEFT JOIN  (
        SELECT his.cl_ic_card_no, SUM(his.cl_this_money) AS totalConsumption
        FROM rm_open_close_valve_history his
        WHERE his.cl_dt BETWEEN #{timeStart} AND #{timeStop}
        GROUP BY his.cl_ic_card_no
        ) a ON  a.cl_ic_card_no = CAST(card.cardNum AS CHAR)
        LEFT JOIN  (
        SELECT rch.cardId,ROUND(SUM(rch.amount),2) as totalRecharge
        FROM se_recharge_history rch
        WHERE rch.operate_valid = 2  AND rch.operateDt BETWEEN #{timeStart} AND #{timeStop}
        GROUP BY rch.cardId
        ) b ON b.cardId = card.id
        <where>
            <if test="clientName != null and clientName != ''">
                AND cli.name like CONCAT('%', #{clientName}, '%')
            </if>
            <if test="cardNum != null and cardNum != ''">
                AND card.cardNum like CONCAT('%', #{cardNum}, '%')
            </if>
            <if test="clientNum != null and clientNum != ''">
                AND cli.clientNum like CONCAT('%', #{clientNum}, '%')
            </if>
        </where>
    </select>
    <!--获取指定时间段水卡使用情况:充值合计、消费合计、余额-->
    <select id="getCardUsages" resultType="com.dy.pipIrrGlobal.voSt.VoCardUsage">
        SELECT
        card.id as cardId,
        cli.name AS clientName,
        card.cardNum,
        a.cl_ic_card_no,
        card.money AS balance,
        a.totalConsumption,
        b.totalRecharge
        FROM  se_client_card card
        INNER JOIN se_client cli ON cli.id = card.clientId
        LEFT JOIN  (
        SELECT his.cl_ic_card_no, SUM(his.cl_this_money) AS totalConsumption
        FROM rm_open_close_valve_history his
        WHERE his.cl_dt BETWEEN #{timeStart} AND #{timeStop}
        GROUP BY his.cl_ic_card_no
        ) a ON  a.cl_ic_card_no = CAST(card.cardNum AS CHAR)
        LEFT JOIN  (
        SELECT rch.cardId,ROUND(SUM(rch.amount),2) as totalRecharge
        FROM se_recharge_history rch
        WHERE rch.operate_valid = 2  AND rch.operateDt BETWEEN #{timeStart} AND #{timeStop}
        GROUP BY rch.cardId
        ) b ON b.cardId = card.id
        <where>
            <if test="clientName != null and clientName != ''">
                AND cli.name like CONCAT('%', #{clientName}, '%')
            </if>
            <if test="cardNum != null and cardNum != ''">
                AND card.cardNum like CONCAT('%', #{cardNum}, '%')
            </if>
            <if test="clientNum != null and clientNum != ''">
                AND cli.clientNum like CONCAT('%', #{clientNum}, '%')
            </if>
        </where>
        ORDER BY cli.name, card.cardNum
        <trim prefix="limit ">
            <if test="start != null and count != null">
                #{start,javaType=Integer,jdbcType=INTEGER}, #{count,javaType=Integer,jdbcType=INTEGER}
            </if>
        </trim>
    </select>
    <!--获取指定时间段内水卡充值总计-->
    <select id="getTotalRecharge" resultType="java.lang.Float">
        SELECT ROUND(SUM(amount),2) AS totalRecharge
        FROM se_recharge_history
        WHERE operateDt BETWEEN #{timeStart} AND #{timeStop}
    </select>
    <!--获取指定时间段内水卡消费总计-->
    <select id="getTotalConsumption" resultType="java.lang.Float">
        SELECT ROUND(SUM(cl_this_money),2) AS totalConsumption
        FROM rm_open_close_valve_history
        WHERE cl_dt BETWEEN #{timeStart} AND #{timeStop}
    </select>
    <!--依据水卡地址将最后一条无效状态的指定操作记录改为有效-->
    <update id="turnCardValidByAddr">
        UPDATE se_client_card
        SET state = 1
        WHERE id = (
            SELECT id FROM (
                SELECT id
                FROM se_client_card
                WHERE state = 4 AND cardAddr = #{cardAddr} AND lastOper  = #{operateType}
                ORDER BY id DESC
                LIMIT 1) AS subquery
        );
    </update>
    <!--根据水卡ID获取原水卡ID,补卡通知中使用-->
    <select id="getOriginalCardIdByCardId" resultType="java.lang.Long">
        SELECT original_card_id AS originalCardId FROM se_client_card WHERE id = #{cardId};
    </select>
</mapper>