zhubaomin
6 天以前 20afccf343cd9c2f8efb1a20a0e92d4844a4adfa
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml
@@ -5,11 +5,13 @@
    <!--@mbg.generated-->
    <!--@Table se_client_card-->
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="protocol" jdbcType="VARCHAR" property="protocol" />
    <result column="cardAddr" jdbcType="VARCHAR" property="cardaddr" />
    <result column="cardNum" jdbcType="BIGINT" property="cardnum" />
    <result column="clientId" jdbcType="BIGINT" property="clientid" />
    <result column="money" jdbcType="FLOAT" property="money" />
    <result column="state" jdbcType="TINYINT" property="state" />
    <result column="original_card_id" jdbcType="BIGINT" property="originalCardId" />
    <result column="createDt" jdbcType="TIMESTAMP" property="createdt" />
    <result column="replaceDt" jdbcType="TIMESTAMP" property="replacedt" />
    <result column="rechargeDt" jdbcType="TIMESTAMP" property="rechargedt" />
@@ -17,14 +19,17 @@
    <result column="cancelDt" jdbcType="TIMESTAMP" property="canceldt" />
    <result column="unlockDt" jdbcType="TIMESTAMP" property="unlockdt" />
    <result column="reversalDt" jdbcType="TIMESTAMP" property="reversaldt" />
    <result column="refundDt" jdbcType="TIMESTAMP" property="refunddt" />
    <result column="consumeDt" jdbcType="TIMESTAMP" property="consumedt" />
    <result column="lastOper" jdbcType="TINYINT" property="lastoper" />
    <result column="remarks" jdbcType="VARCHAR" property="remarks" />
    <result column="order_no" jdbcType="VARCHAR" property="orderNo" />
  </resultMap>
  <sql id="Base_Column_List">
    <!--@mbg.generated-->
    id, cardAddr, cardNum, clientId, money, `state`, createDt, replaceDt, rechargeDt,
    lossDtDt, cancelDt, unlockDt, reversalDt, consumeDt, lastOper, remarks
    id, protocol, cardAddr, cardNum, clientId, money, `state`, original_card_id, createDt,
    replaceDt, rechargeDt, lossDtDt, cancelDt, unlockDt, reversalDt, refundDt, consumeDt,
    lastOper, remarks, order_no
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
    <!--@mbg.generated-->
@@ -38,59 +43,33 @@
    delete from se_client_card
    where id = #{id,jdbcType=BIGINT}
  </delete>
  <!--依据水卡地址获取水卡编号(12月19日废弃)-->
  <select id="getCardIdByAddr" resultType="java.lang.Long">
    SELECT id AS cardId FROM se_client_card WHERE cardAddr = #{cardAddr}
  </select>
  <!--根据水卡编号获取水卡表主键(12月19日添加后废弃)-->
  <select id="getCardIdByNum" resultType="java.lang.Long">
    SELECT id AS cardId FROM se_client_card WHERE cardNum = #{cardNum}
  </select>
  <!--根据水卡编号获取水卡表主键及农户编号-->
  <select id="getCardIdAndClientNum" resultType="java.util.Map">
<!--    SELECT id AS cardId, clientNum FROM se_client_card WHERE cardNum = #{cardNum}-->
    SELECT
        card.id AS cardId,
        cli.clientNum,
        cli.id AS clientId
    FROM se_client_card card
        INNER JOIN se_client cli ON card.clientId = cli.id
    WHERE card.cardNum = #{cardNum}
  </select>
  <!--根据行政区划串模糊查询水卡编号-->
  <select id="getCardNumOfMax"  resultType="java.lang.String">
    SELECT cardNum
    FROM se_client_card
    WHERE cardNum LIKE CONCAT('%',#{areaCode},'%')
    ORDER BY cardNum desc
    LIMIT 0,1
  </select>
  <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.dy.pipIrrGlobal.pojoSe.SeClientCard">
  <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoSe.SeClientCard">
    <!--@mbg.generated-->
    insert into se_client_card (id, cardAddr, cardNum, clientId,
      money, `state`, createDt,
    insert into se_client_card (id, protocol, cardAddr,
      cardNum, clientId, money,
      `state`, original_card_id, createDt,
      replaceDt, rechargeDt, lossDtDt, 
      cancelDt, unlockDt, reversalDt, 
      consumeDt, lastOper, remarks
      )
    values (#{id,jdbcType=BIGINT}, #{cardaddr,jdbcType=VARCHAR}, #{cardnum,jdbcType=BIGINT}, #{clientid,jdbcType=BIGINT},
      #{money,jdbcType=FLOAT}, #{state,jdbcType=TINYINT}, #{createdt,jdbcType=TIMESTAMP},
      refundDt, consumeDt, lastOper,
      remarks, order_no)
    values (#{id,jdbcType=BIGINT}, #{protocol,jdbcType=VARCHAR}, #{cardaddr,jdbcType=VARCHAR},
      #{cardnum,jdbcType=BIGINT}, #{clientid,jdbcType=BIGINT}, #{money,jdbcType=FLOAT},
      #{state,jdbcType=TINYINT}, #{originalCardId,jdbcType=BIGINT}, #{createdt,jdbcType=TIMESTAMP},
      #{replacedt,jdbcType=TIMESTAMP}, #{rechargedt,jdbcType=TIMESTAMP}, #{lossdtdt,jdbcType=TIMESTAMP}, 
      #{canceldt,jdbcType=TIMESTAMP}, #{unlockdt,jdbcType=TIMESTAMP}, #{reversaldt,jdbcType=TIMESTAMP}, 
      #{consumedt,jdbcType=TIMESTAMP}, #{lastoper,jdbcType=TINYINT}, #{remarks,jdbcType=VARCHAR}
      )
      #{refunddt,jdbcType=TIMESTAMP}, #{consumedt,jdbcType=TIMESTAMP}, #{lastoper,jdbcType=TINYINT},
      #{remarks,jdbcType=VARCHAR}, #{orderNo,jdbcType=VARCHAR})
  </insert>
  <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.dy.pipIrrGlobal.pojoSe.SeClientCard" useGeneratedKeys="true">
  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoSe.SeClientCard">
    <!--@mbg.generated-->
    insert into se_client_card
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="protocol != null">
        protocol,
      </if>
      <if test="cardaddr != null">
        cardAddr,
      </if>
@@ -105,6 +84,9 @@
      </if>
      <if test="state != null">
        `state`,
      </if>
      <if test="originalCardId != null">
        original_card_id,
      </if>
      <if test="createdt != null">
        createDt,
@@ -127,6 +109,9 @@
      <if test="reversaldt != null">
        reversalDt,
      </if>
      <if test="refunddt != null">
        refundDt,
      </if>
      <if test="consumedt != null">
        consumeDt,
      </if>
@@ -136,8 +121,17 @@
      <if test="remarks != null">
        remarks,
      </if>
      <if test="orderNo != null">
        order_no,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=BIGINT},
      </if>
      <if test="protocol != null">
        #{protocol,jdbcType=VARCHAR},
      </if>
      <if test="cardaddr != null">
        #{cardaddr,jdbcType=VARCHAR},
      </if>
@@ -152,6 +146,9 @@
      </if>
      <if test="state != null">
        #{state,jdbcType=TINYINT},
      </if>
      <if test="originalCardId != null">
        #{originalCardId,jdbcType=BIGINT},
      </if>
      <if test="createdt != null">
        #{createdt,jdbcType=TIMESTAMP},
@@ -174,6 +171,9 @@
      <if test="reversaldt != null">
        #{reversaldt,jdbcType=TIMESTAMP},
      </if>
      <if test="refunddt != null">
        #{refunddt,jdbcType=TIMESTAMP},
      </if>
      <if test="consumedt != null">
        #{consumedt,jdbcType=TIMESTAMP},
      </if>
@@ -183,12 +183,18 @@
      <if test="remarks != null">
        #{remarks,jdbcType=VARCHAR},
      </if>
      <if test="orderNo != null">
        #{orderNo,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.dy.pipIrrGlobal.pojoSe.SeClientCard">
    <!--@mbg.generated-->
    update se_client_card
    <set>
      <if test="protocol != null">
        protocol = #{protocol,jdbcType=VARCHAR},
      </if>
      <if test="cardaddr != null">
        cardAddr = #{cardaddr,jdbcType=VARCHAR},
      </if>
@@ -203,6 +209,9 @@
      </if>
      <if test="state != null">
        `state` = #{state,jdbcType=TINYINT},
      </if>
      <if test="originalCardId != null">
        original_card_id = #{originalCardId,jdbcType=BIGINT},
      </if>
      <if test="createdt != null">
        createDt = #{createdt,jdbcType=TIMESTAMP},
@@ -225,6 +234,9 @@
      <if test="reversaldt != null">
        reversalDt = #{reversaldt,jdbcType=TIMESTAMP},
      </if>
      <if test="refunddt != null">
        refundDt = #{refunddt,jdbcType=TIMESTAMP},
      </if>
      <if test="consumedt != null">
        consumeDt = #{consumedt,jdbcType=TIMESTAMP},
      </if>
@@ -234,17 +246,22 @@
      <if test="remarks != null">
        remarks = #{remarks,jdbcType=VARCHAR},
      </if>
      <if test="orderNo != null">
        order_no = #{orderNo,jdbcType=VARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=BIGINT}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoSe.SeClientCard">
    <!--@mbg.generated-->
    update se_client_card
    set cardAddr = #{cardaddr,jdbcType=VARCHAR},
    set protocol = #{protocol,jdbcType=VARCHAR},
      cardAddr = #{cardaddr,jdbcType=VARCHAR},
      cardNum = #{cardnum,jdbcType=BIGINT},
      clientId = #{clientid,jdbcType=BIGINT},
      money = #{money,jdbcType=FLOAT},
      `state` = #{state,jdbcType=TINYINT},
      original_card_id = #{originalCardId,jdbcType=BIGINT},
      createDt = #{createdt,jdbcType=TIMESTAMP},
      replaceDt = #{replacedt,jdbcType=TIMESTAMP},
      rechargeDt = #{rechargedt,jdbcType=TIMESTAMP},
@@ -252,24 +269,516 @@
      cancelDt = #{canceldt,jdbcType=TIMESTAMP},
      unlockDt = #{unlockdt,jdbcType=TIMESTAMP},
      reversalDt = #{reversaldt,jdbcType=TIMESTAMP},
      refundDt = #{refunddt,jdbcType=TIMESTAMP},
      consumeDt = #{consumedt,jdbcType=TIMESTAMP},
      lastOper = #{lastoper,jdbcType=TINYINT},
      remarks = #{remarks,jdbcType=VARCHAR}
      remarks = #{remarks,jdbcType=VARCHAR},
      order_no = #{orderNo,jdbcType=VARCHAR}
    where id = #{id,jdbcType=BIGINT}
  </update>
  <!--根据农户主键获取水卡列表-->
  <select id="getCardInfoByClientId" resultType="com.dy.pipIrrGlobal.voSe.VoCardInfo">
    SELECT
        cardNum,
        '用户卡' AS cardType,
        money,
        (CASE
            WHEN state = 1 THEN "正常"
            WHEN state = 2 THEN "已注销"
            ELSE "已挂失"
        END) AS state
  <!--依据水卡地址获取水卡编号(12月19日废弃)-->
  <!--2024-06-30取消废弃,恢复使用-->
  <select id="getCardIdByAddr" resultType="java.lang.Long">
    SELECT id AS cardId
    FROM se_client_card
    WHERE clientId = ${clientId}
    WHERE cardAddr = #{cardAddr}
    ORDER BY id DESC
    LIMIT 1
  </select>
  <!--根据水卡编号获取水卡表主键(12月19日添加后废弃)-->
  <select id="getCardIdByNum" resultType="java.lang.Long">
    SELECT id AS cardId
    FROM se_client_card
    WHERE cardNum = #{cardNum}
  </select>
  <!--根据水卡编号获取水卡表主键及农户编号-->
  <select id="getCardIdAndClientNum" resultType="java.util.Map">
    <!--    SELECT id AS cardId, clientNum FROM se_client_card WHERE cardNum = #{cardNum}-->
    SELECT card.id AS cardId,
    cli.clientNum,
    cli.id  AS clientId,
    protocol
    FROM se_client_card card
    INNER JOIN se_client cli ON card.clientId = cli.id
    WHERE card.cardNum = #{cardNum}
  </select>
  <!-- 根据水卡编号获取水卡对应的农户id和姓名 -->
  <select id="getClientIdAndNameByCardAddrAndCardNo" resultType="java.util.Map">
    SELECT cli.id   AS clientId,
    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}
    and card.cardNum = #{cardNum}
  </select>
  <!-- 根据水卡编号获取水卡 -->
  <select id="getCardsByAddrAndNum" resultType="com.dy.pipIrrGlobal.voSe.VoCardInfo1">
    SELECT id,
    money
    FROM se_client_card
    WHERE cardAddr = #{cardAddr}
    and cardNum = #{cardNum}
  </select>
  <!--根据行政区划串模糊查询水卡编号-->
  <select id="getCardNumOfMax" resultType="java.lang.String">
    SELECT cardNum
    FROM se_client_card
    WHERE cardNum LIKE CONCAT(#{areaCode}, '%')
    ORDER BY cardNum desc
    LIMIT 0,1
  </select>
  <update id="updateMoney">
    update se_client_card
    set money = #{money,jdbcType=FLOAT}
    where id = #{id,jdbcType=BIGINT}
  </update>
  <!--根据农户主键获取水卡列表(物理卡+虚拟卡)-->
  <select id="getCardInfoByClientId" resultType="com.dy.pipIrrGlobal.voSe.VoCardInfo">
    SELECT *
    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,
    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.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
    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>
  <!--根据水卡编号获取余额-->
  <select id="getMoneyByCardNum" resultType="java.lang.Float">
    SELECT money
    FROM se_client_card
    WHERE cardNum = #{cardNum,jdbcType=BIGINT}
  </select>
  <!--根据水卡编号获取充值总额-->
  <select id="sumRechargeByCardNum" resultType="java.lang.Float">
    SELECT SUM(his.amount) AS amount
    FROM se_recharge_history his
    INNER JOIN se_client_card card ON his.cardId = card.id
    WHERE card.cardNum = #{cardNum,jdbcType=BIGINT}
  </select>
  <!--根据水卡编号获取卡片状态:1-开卡,2-补卡,3-充值,4-挂失,5-注销,6-解锁,7-冲正,8-消费-->
  <select id="getCardStateByCardNum" resultType="java.lang.String">
    <!--    SELECT-->
    <!--      (CASE-->
    <!--         WHEN lastOper = 1 THEN "开卡"-->
    <!--         WHEN lastOper = 2 THEN "补卡"-->
    <!--         WHEN lastOper = 3 THEN "充值"-->
    <!--         WHEN lastOper = 4 THEN "挂失"-->
    <!--         WHEN lastOper = 5 THEN "注销"-->
    <!--         WHEN lastOper = 6 THEN "解锁"-->
    <!--         WHEN lastOper = 7 THEN "冲正"-->
    <!--         WHEN lastOper = 8 THEN "消费"-->
    <!--        END) AS stateName-->
    <!--    FROM se_client_card-->
    <!--    WHERE cardNum = ${cardNum}-->
    SELECT (CASE
    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}
  </select>
  <!--根据指定条件获取水卡列表记录数,应用程序使用-->
  <select id="getCardsCount" parameterType="java.util.Map" resultType="java.lang.Long">
    SELECT COUNT(*) AS recordCount
    FROM se_client_card card
    LEFT JOIN se_client cli ON card.clientId = cli.id
    <where>
      AND card.state = 1
      <if test="clientNum != null and clientNum != ''">
        AND cli.clientNum like CONCAT('%', #{clientNum}, '%')
      </if>
      <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>
    </where>
  </select>
  <!--根据指定条件获取水卡列表,应用程序使用-->
  <select id="getCards" resultType="com.dy.pipIrrGlobal.voSe.VoCards">
    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
    LEFT JOIN se_client cli ON card.clientId = cli.id
    <where>
      AND card.state = 1
      <if test="clientNum != null and clientNum != ''">
        AND cli.clientNum like CONCAT('%', #{clientNum}, '%')
      </if>
      <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>
    </where>
    ORDER BY card.id
    <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="getUnreplacedRecordCount" resultType="java.lang.Long">
    SELECT COUNT(*) AS recordCount
    FROM se_client_card card
           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.cardNum)
  </select>
  <!--获取已挂失未补卡的记录-->
  <select id="getUnreplaced" resultType="com.dy.pipIrrGlobal.voSe.VoCards">
    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
    WHERE card.state = 3
    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">
        #{start,javaType=Integer,jdbcType=INTEGER}, #{count,javaType=Integer,jdbcType=INTEGER}
      </if>
    </trim>
  </select>
  <!--根据指定水卡编号获取挂失记录数量(补卡、解锁使用)-->
  <select id="getLostCount" resultType="java.lang.Integer">
    SELECT COUNT(*) AS recordCount
    FROM se_client_card card
    <where>
      AND card.state = 3
      <if test="cardNum != null and cardNum > 0">
        AND card.cardNum = #{cardNum}
      </if>
    </where>
  </select>
  <!--根据指定水卡编号获取已补卡数量(补卡、解锁使用)-->
  <select id="getReplacedCount" resultType="java.lang.Integer">
    SELECT COUNT(*) AS recordCount
    FROM se_client_card card
    INNER JOIN se_client_card card2 ON card2.original_card_id = card.id
    <where>
      <if test="cardNum != null and cardNum > 0">
        AND card.cardNum = #{cardNum}
      </if>
    </where>
  </select>
  <!--根据农户姓名和手机号获取水卡列表记录数,应用程序使用-->
  <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
    <where>
      card.state = 1
      <if test="clientName != null and clientName != ''">
        AND cli.name like CONCAT('%', #{clientName}, '%')
      </if>
      <if test="phone != null and phone != ''">
        AND cli.phone like CONCAT('%', #{phone}, '%')
      </if>
    </where>
  </select>
  <!--根据农户姓名和手机号获取水卡列表,应用程序使用-->
  <select id="getCardsByClientNameAndPhone" resultType="com.dy.pipIrrGlobal.voSe.VoCards2">
    SELECT card.id               AS clientCardId,
    cli.id                AS clientId,
    cli.clientNum,
    cli.name              AS clientName,
    card.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 cardType,
    FORMAT(card.money, 2) AS money
    FROM se_client_card card
    LEFT JOIN se_client cli ON card.clientId = cli.id
    <where>
      card.state = 1
      <if test="clientName != null and clientName != ''">
        AND cli.name like CONCAT('%', #{clientName}, '%')
      </if>
      <if test="phone != null and phone != ''">
        AND cli.phone like CONCAT('%', #{phone}, '%')
      </if>
    </where>
    ORDER BY card.id
    <trim prefix="limit ">
      <if test="start != null and count != null">
        #{start,javaType=Integer,jdbcType=INTEGER}, #{count,javaType=Integer,jdbcType=INTEGER}
      </if>
    </trim>
  </select>
  <!--根据农户ID查询正常状态的水卡列表,小程序使用-->
  <select id="getCardsByClientID" resultType="com.dy.pipIrrGlobal.voWe.VoCards3">
    SELECT card.id               AS clientCardId,
    cli.id                AS clientId,
    cli.clientNum,
    cli.name              AS clientName,
    card.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 cardType,
    FORMAT(card.money, 2) AS money
    FROM se_client_card card
    INNER JOIN se_client cli ON card.clientId = cli.id
    where card.state = 1
    AND cli.id like CONCAT('%', #{clientId}, '%')
    ORDER BY card.id
  </select>
  <!--当前余额总量(物理卡)-->
  <select id="getTotalMoneyIcCards" resultType="java.lang.Double">
    SELECT IFNULL(SUM(money), 0) AS totalMoney
    FROM `se_client_card`
    WHERE state = 1
  </select>
  <!--根据水卡地址获取水卡数量,无效卡片排除在外-->
  <select id="getCountByCardAddr" resultType="java.lang.Long">
    SELECT COUNT(*) AS recordCount
    FROM se_client_card
    WHERE cardAddr = #{cardAddr} AND se_client_card.state != 4
  </select>
  <!--根据水卡地址获取指定状态的水卡数量-->
  <select id="getCountByCardAddrAndState" resultType="java.lang.Long">
    SELECT COUNT(*) AS recordCount
    FROM se_client_card
    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>
  <!--充值机用根据订单号将水卡改为有效-->
  <update id="turnCardValidByOrderNumber">
    UPDATE se_client_card
    SET state = 1
    WHERE state = 4 AND order_no = #{orderNumber}
  </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>