liurunyu
2025-05-09 52cd0fe6f2224b0bd17b19ddaf475406a92b9ed4
Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV
10个文件已修改
27个文件已添加
2229 ■■■■ 已修改文件
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeCardOperate.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTermClient.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTermRecharge.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/application-global(166web文件花生壳).yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml 488 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientMapper.xml 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/card/IcCardSv.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/client/ClientSv.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/.gitattributes 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/.gitignore 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/.mvn/wrapper/maven-wrapper.properties 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/mvnw 259 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/mvnw.cmd 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/pom.xml 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/PipIrrTerminalApplication.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java 267 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/ActiveCard.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/DtoRecharge.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/CardStateENUM.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/LastOperateENUM.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/OperateTypeENUM.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/ClientCtrl.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/ClientSv.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/qo/QoClient.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/config/WebFilterConfiguration.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/config/WebListenerConfiguration.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application(121服务器).yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application(233服务器).yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application-self.yml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application.yml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/log4j2.yml 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/test/java/com/dy/pipIrrTerminal/PipIrrWebTerminalApplicationTests.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pom.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java
@@ -1,11 +1,9 @@
package com.dy.pipIrrGlobal.daoSe;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dy.pipIrrGlobal.pojoSe.SeCardOperate;
import com.dy.pipIrrGlobal.voSe.*;
import com.dy.pipIrrGlobal.voSt.VoClientOpenCardCount;
import com.dy.pipIrrGlobal.voSt.VoClientRechargeTotal;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -13,13 +11,11 @@
/**
 * @author ZhuBaoMin
 * @date 2024-02-02 16:00
 * @LastEditTime 2024-02-02 16:00
 * @date 2025-05-08 17:15
 * @LastEditTime 2025-05-08 17:15
 * @Description
 */
@Mapper
public interface SeCardOperateMapper extends BaseMapper<SeCardOperate> {
public interface SeCardOperateMapper {
    int deleteByPrimaryKey(Long id);
    int insert(SeCardOperate record);
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientMapper.java
@@ -4,6 +4,7 @@
import com.dy.pipIrrGlobal.pojoSe.SeClient;
import com.dy.pipIrrGlobal.voSe.VoClient;
import com.dy.pipIrrGlobal.voSe.VoClientWechat;
import com.dy.pipIrrGlobal.voSe.VoTermClient;
import com.dy.pipIrrGlobal.voSt.VoCardUsage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -127,4 +128,25 @@
     * @return
     */
    List<VoCardUsage> getClientUsages(Map<String, Object> params);
    /**
     * æ ¹æ®æŒ‡å®šæ¡ä»¶èŽ·å–å†œæˆ·è®°å½•æ•°_充值机
     * @param params
     * @return
     */
    Long getTermClientCount(Map<?, ?> params);
    /**
     * æ ¹æ®æŒ‡å®šæ¡ä»¶èŽ·å–å†œæˆ·æ•°æ®_充值机
     * @param params
     * @return
     */
    List<VoTermClient> getTermClients(Map<?, ?> params);
    /**
     * æ ¹æ®å†œæˆ·ID获取一个农户数据_充值机
     * @param clientId
     * @return
     */
    VoTermClient getTermOneClient(@Param("clientId") Long clientId);
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeCardOperate.java
@@ -17,8 +17,8 @@
/**
 * @author ZhuBaoMin
 * @date 2024-01-18 19:10
 * @LastEditTime 2024-02-02 16:00
 * @date 2025-05-08 17:15
 * @LastEditTime 2025-05-08 17:15
 * @Description
 */
@@ -152,6 +152,11 @@
    private Date operateDt;
    /**
     * æ“ä½œè®¢å•号
     */
    private String orderNo;
    /**
     * æ“ä½œæ˜¯å¦æœ‰æ•ˆ
     */
    @Length(message = "操作有效性不大于{max},不小于{min}", min = 1, max = 2)
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTermClient.java
New file
@@ -0,0 +1,45 @@
package com.dy.pipIrrGlobal.voSe;
import com.alibaba.fastjson2.annotation.JSONField;
import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import lombok.Data;
import java.util.Date;
/**
 * @author ZhuBaoMin
 * @date 2025-05-07 16:57
 * @LastEditTime 2025-05-07 16:57
 * @Description å……值机农户视图对象
 */
@Data
@JsonPropertyOrder({"clientId", "clientNum", "name", "districtNum",  "phone", "idCard", "villageName", "address", "cardCount",  "operateDt"})
public class VoTermClient {
    public static final long serialVersionUID = 202505071705001L;
    @JSONField(serializeUsing= ObjectWriterImplToString.class)
    private Long clientId;
    private String clientNum;
    private String name;
    @JSONField(serializeUsing= ObjectWriterImplToString.class)
    private Long districtNum;
    private String phone;
    private String idCard;
    private String villageName;;
    private String address;
    private Integer cardCount;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date operateDt;
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTermRecharge.java
New file
@@ -0,0 +1,36 @@
package com.dy.pipIrrGlobal.voSe;
import com.alibaba.fastjson2.annotation.JSONField;
import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import lombok.Data;
import java.util.Date;
/**
 * @author ZhuBaoMin
 * @date 2025-05-08 15:59
 * @LastEditTime 2025-05-08 15:59
 * @Description
 */
@Data
@JsonPropertyOrder({"projectNo", "cardNum", "balance", "waterPrice",  "time", "orderNo"})
public class VoTermRecharge {
    public static final long serialVersionUID = 202505081559001L;
    private Integer projectNo;
    @JSONField(serializeUsing= ObjectWriterImplToString.class)
    private Long cardNum;
    private Float balance;
    private Double waterPrice;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date time;
    private String orderNo;
}
pipIrr-platform/pipIrr-global/src/main/resources/application-global(166webÎļþ»¨Éú¿Ç).yml
@@ -146,6 +146,10 @@
        webPort: 8089
        actutorPort: 9089
        idSuffix: 11
    terminal:
        webPort: 8090
        actutorPort: 9090
        idSuffix: 12
    # 2023-10-24新增,用于执行临时任务,例如删除数据库中上些出错的数据
    temp:
        webPort: 8099
pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml
@@ -146,6 +146,10 @@
        webPort: 8089
        actutorPort: 9089
        idSuffix: 11
    terminal:
        webPort: 8090
        actutorPort: 9090
        idSuffix: 12
    # 2023-10-24新增,用于执行临时任务,例如删除数据库中上些出错的数据
    temp:
        webPort: 8099
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml
@@ -20,12 +20,14 @@
    <result column="remarks" jdbcType="VARCHAR" property="remarks" />
    <result column="operator" jdbcType="BIGINT" property="operator" />
    <result column="operate_dt" jdbcType="TIMESTAMP" property="operateDt" />
    <result column="order_no" jdbcType="VARCHAR" property="orderNo" />
    <result column="operate_valid" jdbcType="TINYINT" property="operateValid" />
  </resultMap>
  <sql id="Base_Column_List">
    <!--@mbg.generated-->
    id, card_id, client_id, money, system_balance, trade_amount, price, card_cost, gift, 
    refund_amount, no_trade_amount, operate_type, payment_id, remarks, `operator`, operate_dt, operate_valid
    refund_amount, no_trade_amount, operate_type, payment_id, remarks, `operator`, operate_dt,
    order_no, operate_valid
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
    <!--@mbg.generated-->
@@ -46,13 +48,15 @@
      price, card_cost, gift, 
      refund_amount, no_trade_amount, operate_type, 
      payment_id, remarks, `operator`, 
      operate_dt, operate_valid)
      operate_dt, order_no, operate_valid
      )
    values (#{id,jdbcType=BIGINT}, #{cardId,jdbcType=BIGINT}, #{clientId,jdbcType=BIGINT}, 
      #{money,jdbcType=FLOAT}, #{systemBalance,jdbcType=FLOAT}, #{tradeAmount,jdbcType=FLOAT}, 
      #{price,jdbcType=FLOAT}, #{cardCost,jdbcType=INTEGER}, #{gift,jdbcType=FLOAT}, 
      #{refundAmount,jdbcType=FLOAT}, #{noTradeAmount,jdbcType=FLOAT}, #{operateType,jdbcType=TINYINT}, 
      #{paymentId,jdbcType=BIGINT}, #{remarks,jdbcType=VARCHAR}, #{operator,jdbcType=BIGINT}, 
      #{operateDt,jdbcType=TIMESTAMP}, #{operateValid,jdbcType=TINYINT})
      #{operateDt,jdbcType=TIMESTAMP}, #{orderNo,jdbcType=VARCHAR}, #{operateValid,jdbcType=TINYINT}
      )
  </insert>
  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoSe.SeCardOperate">
    <!--@mbg.generated-->
@@ -106,6 +110,9 @@
      <if test="operateDt != null">
        operate_dt,
      </if>
      <if test="orderNo != null">
        order_no,
      </if>
      <if test="operateValid != null">
        operate_valid,
      </if>
@@ -158,6 +165,9 @@
      </if>
      <if test="operateDt != null">
        #{operateDt,jdbcType=TIMESTAMP},
      </if>
      <if test="orderNo != null">
        #{orderNo,jdbcType=VARCHAR},
      </if>
      <if test="operateValid != null">
        #{operateValid,jdbcType=TINYINT},
@@ -213,6 +223,9 @@
      <if test="operateDt != null">
        operate_dt = #{operateDt,jdbcType=TIMESTAMP},
      </if>
      <if test="orderNo != null">
        order_no = #{orderNo,jdbcType=VARCHAR},
      </if>
      <if test="operateValid != null">
        operate_valid = #{operateValid,jdbcType=TINYINT},
      </if>
@@ -237,6 +250,7 @@
      remarks = #{remarks,jdbcType=VARCHAR},
      `operator` = #{operator,jdbcType=BIGINT},
      operate_dt = #{operateDt,jdbcType=TIMESTAMP},
      order_no = #{orderNo,jdbcType=VARCHAR},
      operate_valid = #{operateValid,jdbcType=TINYINT}
    where id = #{id,jdbcType=BIGINT}
  </update>
@@ -244,12 +258,12 @@
  <!--根据指定条件获取充值记录数量-->
  <select id="getRecordCount" parameterType="java.util.Map" resultType="java.lang.Long">
    select
        COUNT(*) AS recordCount
    COUNT(*) AS recordCount
    FROM se_card_operate ope
        LEFT JOIN se_client_card card ON ope.card_id = card.id
        LEFT JOIN se_client cli ON ope.client_id = cli.id
        LEFT JOIN ba_user us ON ope.operator = us.id
        LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
    LEFT JOIN se_client_card card ON ope.card_id = card.id
    LEFT JOIN se_client cli ON ope.client_id = cli.id
    LEFT JOIN ba_user us ON ope.operator = us.id
    LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
    <where>
      AND ope.operate_type in(1, 2, 5,10)
      AND ope.operate_valid = 2
@@ -278,37 +292,37 @@
  <!--根据指定条件获取充值记录-->
  <select id="getRecharges" resultType="com.dy.pipIrrGlobal.voSe.VoRecharge">
    SELECT
      ope.id AS opeId,
      card.id AS cardId,
      cli.name AS clientName,
      cli.phone,
      cli.idCard,
      cli.clientNum,
      dis.name AS villageName,
      cli.address,
      card.money,
      cardNum,
      IFNULL(ope.card_cost,0) AS cardCost,
      IFNULL(ope.trade_amount, 0) AS amount,
      IFNULL(ope.gift, 0) AS gift,
      IFNULL(ope.refund_amount, 0) AS refundAmount,
      (IFNULL(ope.money, 0) + IFNULL(ope.trade_amount, 0) + IFNULL(ope.gift, 0)) AS afterRecharge,
      pay.name AS paymentName,
      ope.price,
      us.name AS opr,
      (CASE
        WHEN ope.operate_type = 1 THEN '开卡'
        WHEN ope.operate_type = 2 THEN '充值'
        WHEN ope.operate_type = 5 THEN '返还'
        WHEN ope.operate_type = 10 THEN '反写'
      END) AS operateType,
      ope.operate_dt
    ope.id AS opeId,
    card.id AS cardId,
    cli.name AS clientName,
    cli.phone,
    cli.idCard,
    cli.clientNum,
    dis.name AS villageName,
    cli.address,
    card.money,
    cardNum,
    IFNULL(ope.card_cost,0) AS cardCost,
    IFNULL(ope.trade_amount, 0) AS amount,
    IFNULL(ope.gift, 0) AS gift,
    IFNULL(ope.refund_amount, 0) AS refundAmount,
    (IFNULL(ope.money, 0) + IFNULL(ope.trade_amount, 0) + IFNULL(ope.gift, 0)) AS afterRecharge,
    pay.name AS paymentName,
    ope.price,
    us.name AS opr,
    (CASE
    WHEN ope.operate_type = 1 THEN '开卡'
    WHEN ope.operate_type = 2 THEN '充值'
    WHEN ope.operate_type = 5 THEN '返还'
    WHEN ope.operate_type = 10 THEN '反写'
    END) AS operateType,
    ope.operate_dt
    FROM se_card_operate ope
        LEFT JOIN se_client_card card ON ope.card_id = card.id
        LEFT JOIN se_client cli ON ope.client_id = cli.id
        LEFT JOIN ba_district dis ON dis.id = cli.villageId
        LEFT JOIN ba_user us ON ope.operator = us.id
        Left JOIN se_payment_method pay ON ope.payment_id = pay.id
    LEFT JOIN se_client_card card ON ope.card_id = card.id
    LEFT JOIN se_client cli ON ope.client_id = cli.id
    LEFT JOIN ba_district dis ON dis.id = cli.villageId
    LEFT JOIN ba_user us ON ope.operator = us.id
    Left JOIN se_payment_method pay ON ope.payment_id = pay.id
    <where>
      AND ope.operate_type in(1, 2, 5,10)
      AND ope.operate_valid = 2
@@ -335,7 +349,7 @@
  <!--根据指定条件获取交易记录数-->
  <select id="getTransactionRecordCount" parameterType="java.util.Map" resultType="java.lang.Long">
    SELECT
        COUNT(*) AS recordCount
    COUNT(*) AS recordCount
    FROM se_card_operate ope
    LEFT JOIN se_client cli ON ope.client_id = cli.id
    LEFT JOIN se_client_card card ON card.id = ope.card_id
@@ -361,41 +375,41 @@
  <!--根据指定条件获取交易记录-->
  <select id="getTransactions" resultType="com.dy.pipIrrGlobal.voSe.VoTradeDetails">
    SELECT
        ope.id AS orderNumber,
        cli.name AS clientName,
        card.cardNum AS cardNum,
        cli.idCard,
        cli.clientNum,
        cli.phone,
        (CASE ope.operate_type
            WHEN 1 THEN '开卡'
            WHEN 2 THEN '充值'
            WHEN 3 THEN '销卡'
            WHEN 5 THEN '补扣'
            WHEN 10 THEN '反写'
        END) AS operateType,
        (IFNULL(ope.trade_amount,0.00) + IFNULL(ope.card_cost,0.00)) AS tradeAmount,
        IFNULL(ope.trade_amount,0.00) AS waterCost,
        IFNULL(ope.card_cost,0.00) AS cardCost,
        IFNULL(ope.gift,0.00) AS gift,
        IFNULL(ope.refund_amount,0.00) AS refundAmount,
        (IFNULL(ope.money, 0) + IFNULL(ope.trade_amount, 0) + IFNULL(ope.gift, 0)) AS money,
        pay.name AS paymentName,
        ope.operate_dt as tradeTime,
        us.id AS cashierId,
        us.name AS cashierName,
        (CASE card.state
            WHEN 1 THEN '正常'
            WHEN 2 THEN '已注销'
            WHEN 3 THEN '已挂失'
        END) AS cardState,
        cli.districtTitle,
        cli.villageId AS villageId
    ope.id AS orderNumber,
    cli.name AS clientName,
    card.cardNum AS cardNum,
    cli.idCard,
    cli.clientNum,
    cli.phone,
    (CASE ope.operate_type
    WHEN 1 THEN '开卡'
    WHEN 2 THEN '充值'
    WHEN 3 THEN '销卡'
    WHEN 5 THEN '补扣'
    WHEN 10 THEN '反写'
    END) AS operateType,
    (IFNULL(ope.trade_amount,0.00) + IFNULL(ope.card_cost,0.00)) AS tradeAmount,
    IFNULL(ope.trade_amount,0.00) AS waterCost,
    IFNULL(ope.card_cost,0.00) AS cardCost,
    IFNULL(ope.gift,0.00) AS gift,
    IFNULL(ope.refund_amount,0.00) AS refundAmount,
    (IFNULL(ope.money, 0) + IFNULL(ope.trade_amount, 0) + IFNULL(ope.gift, 0)) AS money,
    pay.name AS paymentName,
    ope.operate_dt as tradeTime,
    us.id AS cashierId,
    us.name AS cashierName,
    (CASE card.state
    WHEN 1 THEN '正常'
    WHEN 2 THEN '已注销'
    WHEN 3 THEN '已挂失'
    END) AS cardState,
    cli.districtTitle,
    cli.villageId AS villageId
    FROM se_card_operate ope
        LEFT JOIN se_client cli ON ope.client_id = cli.id
        LEFT JOIN se_client_card card ON card.id = ope.card_id
        LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
        LEFT JOIN ba_user us ON ope.operator = us.id
    LEFT JOIN se_client cli ON ope.client_id = cli.id
    LEFT JOIN se_client_card card ON card.id = ope.card_id
    LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
    LEFT JOIN ba_user us ON ope.operator = us.id
    <where>
      AND ope.operate_type IN(1,2,3,5,10)
      AND ope.operate_valid = 2
@@ -422,11 +436,11 @@
  <!--根据指定条件获取开卡记录数量-->
  <select id="getActiveCardRecordCount" parameterType="java.util.Map" resultType="java.lang.Long">
    select
        COUNT(*) AS recordCount
    COUNT(*) AS recordCount
    FROM se_card_operate ope
        LEFT JOIN se_client_card card ON ope.card_id = card.id
        LEFT JOIN se_client cli ON ope.client_id = cli.id
        LEFT JOIN se_payment_method pay ON pay.id = ope.payment_id
    LEFT JOIN se_client_card card ON ope.card_id = card.id
    LEFT JOIN se_client cli ON ope.client_id = cli.id
    LEFT JOIN se_payment_method pay ON pay.id = ope.payment_id
    <where>
      AND ope.operate_type = 1
      AND ope.operate_valid = 2
@@ -451,24 +465,24 @@
  <!--根据指定条件获取开卡记录-->
  <select id="getActiveCards" resultType="com.dy.pipIrrGlobal.voSe.VoActiveCard">
    SELECT
        ope.id,
        cli.name AS clientName,
        cli.clientNum AS clientNum,
        card.cardNum AS cardNum,
        card.state AS state,
        (CASE
            WHEN card.state = 1 THEN '正常'
            WHEN card.state = 2 THEN '已注销'
            WHEN card.state = 3 THEN '已挂失'
        END) AS stateName,
        ope.card_cost AS cardCost,
        pay.name AS paymentName,
        (SELECT `name` FROM ba_user WHERE id =  ope.operator) AS operator,
        ope.operate_dt AS operateDt
    ope.id,
    cli.name AS clientName,
    cli.clientNum AS clientNum,
    card.cardNum AS cardNum,
    card.state AS state,
    (CASE
    WHEN card.state = 1 THEN '正常'
    WHEN card.state = 2 THEN '已注销'
    WHEN card.state = 3 THEN '已挂失'
    END) AS stateName,
    ope.card_cost AS cardCost,
    pay.name AS paymentName,
    (SELECT `name` FROM ba_user WHERE id =  ope.operator) AS operator,
    ope.operate_dt AS operateDt
    FROM se_card_operate ope
        LEFT JOIN se_client_card card ON ope.card_id = card.id
        LEFT JOIN se_client cli ON ope.client_id = cli.id
        LEFT JOIN se_payment_method pay ON pay.id = ope.payment_id
    LEFT JOIN se_client_card card ON ope.card_id = card.id
    LEFT JOIN se_client cli ON ope.client_id = cli.id
    LEFT JOIN se_payment_method pay ON pay.id = ope.payment_id
    <where>
      AND ope.operate_type = 1
      AND ope.operate_valid = 2
@@ -499,10 +513,10 @@
  <!--根据指定条件获取补卡记录数量-->
  <select id="getReissueCardRecordCount" parameterType="java.util.Map" resultType="java.lang.Long">
    select
        COUNT(*) AS recordCount
    COUNT(*) AS recordCount
    FROM se_card_operate ope
        LEFT JOIN se_client_card card ON ope.card_id = card.id
        LEFT JOIN se_client cli ON ope.client_id = cli.id
    LEFT JOIN se_client_card card ON ope.card_id = card.id
    LEFT JOIN se_client cli ON ope.client_id = cli.id
    <where>
      AND ope.operate_type = 4
      AND ope.operate_valid = 2
@@ -523,17 +537,17 @@
  <!--根据指定条件获取补卡记录-->
  <select id="getReissueCards" resultType="com.dy.pipIrrGlobal.voSe.VoReissueCard">
    SELECT
        CAST(ope.id AS char) AS id ,
        cli.name AS clientName,
        cli.clientNum AS clientNum,
        card.cardNum AS cardNum,
        ope.card_cost AS cardCost,
        IFNULL(ope.no_trade_amount,0) AS reissueAmount,
        (SELECT `name` FROM ba_user WHERE id =  ope.operator) AS operator,
        ope.operate_dt AS operateDt
    CAST(ope.id AS char) AS id ,
    cli.name AS clientName,
    cli.clientNum AS clientNum,
    card.cardNum AS cardNum,
    ope.card_cost AS cardCost,
    IFNULL(ope.no_trade_amount,0) AS reissueAmount,
    (SELECT `name` FROM ba_user WHERE id =  ope.operator) AS operator,
    ope.operate_dt AS operateDt
    FROM se_card_operate ope
        LEFT JOIN se_client_card card ON ope.card_id = card.id
        LEFT JOIN se_client cli ON ope.client_id = cli.id
    LEFT JOIN se_client_card card ON ope.card_id = card.id
    LEFT JOIN se_client cli ON ope.client_id = cli.id
    <where>
      AND ope.operate_type = 4
      AND ope.operate_valid = 2
@@ -560,11 +574,11 @@
  <!--根据指定条件获取通用操作记录数量-->
  <select id="getCommonOperationRecordCount" parameterType="java.util.Map" resultType="java.lang.Long">
    select
        COUNT(*) AS recordCount
    COUNT(*) AS recordCount
    FROM se_card_operate ope
        LEFT JOIN se_client cli ON ope.client_id = cli.id
        LEFT JOIN se_client_card card ON ope.card_id = card.id
        LEFT JOIN ba_user us ON ope.operator = us.id
    LEFT JOIN se_client cli ON ope.client_id = cli.id
    LEFT JOIN se_client_card card ON ope.card_id = card.id
    LEFT JOIN ba_user us ON ope.operator = us.id
    <where>
      AND ope.operate_valid = 2
      <if test = "operateType != null and operateType > 0">
@@ -588,21 +602,21 @@
  <!--根据指定条件获取通用操作记录-->
  <select id="getCommonOperations" resultType="com.dy.pipIrrGlobal.voSe.VoOperate">
    SELECT
        cli.name AS clientName,
        cli.clientNum,
        CAST(card.cardNum AS char) AS cardNum,
        us.name AS operator,
        ope.operate_dt AS operateDt,
        IFNULL(ope.trade_amount,0) AS refund,
        (CASE
            WHEN ope.payment_id = 1 THEN '现金'
        END) AS refundTypeName,
        card.money,
        IFNULL(ope.system_balance,0) AS systemBalance
    cli.name AS clientName,
    cli.clientNum,
    CAST(card.cardNum AS char) AS cardNum,
    us.name AS operator,
    ope.operate_dt AS operateDt,
    IFNULL(ope.trade_amount,0) AS refund,
    (CASE
    WHEN ope.payment_id = 1 THEN '现金'
    END) AS refundTypeName,
    card.money,
    IFNULL(ope.system_balance,0) AS systemBalance
    FROM se_card_operate ope
        LEFT JOIN se_client cli ON ope.client_id = cli.id
        LEFT JOIN se_client_card card ON ope.card_id = card.id
        LEFT JOIN ba_user us ON ope.operator = us.id
    LEFT JOIN se_client cli ON ope.client_id = cli.id
    LEFT JOIN se_client_card card ON ope.card_id = card.id
    LEFT JOIN ba_user us ON ope.operator = us.id
    <where>
      AND ope.operate_valid = 2
      <if test = "operateType != null and operateType > 0">
@@ -632,14 +646,14 @@
  <!--根据指定条件获取收据列表数-->
  <select id="getReceiptsRecordCount" parameterType="java.util.Map" resultType="java.lang.Long">
    SELECT
        COUNT(*) AS recordCount
    COUNT(*) AS recordCount
    FROM se_card_operate ope
        LEFT JOIN se_client cli ON ope.client_id = cli.id
        LEFT JOIN se_client_card card ON ope.card_id = card.id
        LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
        LEFT JOIN ba_user us ON ope.operator = us.id
        LEFT JOIN ba_district vil ON cli.villageId = vil.id
        LEFT JOIN ba_district tow ON cli.townId = tow.id
    LEFT JOIN se_client cli ON ope.client_id = cli.id
    LEFT JOIN se_client_card card ON ope.card_id = card.id
    LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
    LEFT JOIN ba_user us ON ope.operator = us.id
    LEFT JOIN ba_district vil ON cli.villageId = vil.id
    LEFT JOIN ba_district tow ON cli.townId = tow.id
    <where>
      AND ope.operate_type IN(1,2)
      AND ope.operate_valid = 2
@@ -668,34 +682,34 @@
  <!--根据指定条件获取收据列表-->
  <select id="getReceipts" resultType="com.dy.pipIrrGlobal.voSe.VoReceipt">
    SELECT
        ope.id AS orderNumber,
        tow.name AS townName,
        vil.name AS villageName,
        cli.`name`,
        cli.phone,
        cli.clientNum,
        card.cardNum,
        (CASE
            WHEN ope.operate_type = 1 THEN '开卡'
            WHEN ope.operate_type = 2 THEN '充值'
        END) AS operateType,
        IFNULL(ope.trade_amount,0) AS waterCost,
        IFNULL(ope.gift,0) AS gift,
        IFNULL(ope.card_cost,0) AS cardCost,
        (IFNULL(ope.trade_amount,0) + IFNULL(ope.card_cost,0)) AS amount,
        card.money,
        pay.`name` AS paymentName,
        us.`name` AS operatorName,
        ope.operate_dt AS operateTime,
        ope.operator AS cashierId,
        NOW() AS currentTime
    ope.id AS orderNumber,
    tow.name AS townName,
    vil.name AS villageName,
    cli.`name`,
    cli.phone,
    cli.clientNum,
    card.cardNum,
    (CASE
    WHEN ope.operate_type = 1 THEN '开卡'
    WHEN ope.operate_type = 2 THEN '充值'
    END) AS operateType,
    IFNULL(ope.trade_amount,0) AS waterCost,
    IFNULL(ope.gift,0) AS gift,
    IFNULL(ope.card_cost,0) AS cardCost,
    (IFNULL(ope.trade_amount,0) + IFNULL(ope.card_cost,0)) AS amount,
    card.money,
    pay.`name` AS paymentName,
    us.`name` AS operatorName,
    ope.operate_dt AS operateTime,
    ope.operator AS cashierId,
    NOW() AS currentTime
    FROM se_card_operate ope
        LEFT JOIN se_client cli ON ope.client_id = cli.id
        LEFT JOIN se_client_card card ON ope.card_id = card.id
        LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
        LEFT JOIN ba_user us ON ope.operator = us.id
        LEFT JOIN ba_district vil ON cli.villageId = vil.id
        LEFT JOIN ba_district tow ON cli.townId = tow.id
    LEFT JOIN se_client cli ON ope.client_id = cli.id
    LEFT JOIN se_client_card card ON ope.card_id = card.id
    LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
    LEFT JOIN ba_user us ON ope.operator = us.id
    LEFT JOIN ba_district vil ON cli.villageId = vil.id
    LEFT JOIN ba_district tow ON cli.townId = tow.id
    <where>
      AND ope.operate_type IN(1,2)
      AND ope.operate_valid = 2
@@ -730,14 +744,14 @@
  <!--根据指定条件获取收据收费金额合计-->
  <select id="getTotalAmount" parameterType="java.util.Map" resultType="java.lang.Double">
    SELECT
        SUM(IFNULL(ope.trade_amount,0) + IFNULL(ope.card_cost,0)) AS totalAmount
    SUM(IFNULL(ope.trade_amount,0) + IFNULL(ope.card_cost,0)) AS totalAmount
    FROM se_card_operate ope
        LEFT JOIN se_client cli ON ope.client_id = cli.id
        LEFT JOIN se_client_card card ON ope.card_id = card.id
        LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
        LEFT JOIN ba_user us ON ope.operator = us.id
        LEFT JOIN ba_district vil ON cli.villageId = vil.id
        LEFT JOIN ba_district tow ON cli.townId = tow.id
    LEFT JOIN se_client cli ON ope.client_id = cli.id
    LEFT JOIN se_client_card card ON ope.card_id = card.id
    LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
    LEFT JOIN ba_user us ON ope.operator = us.id
    LEFT JOIN ba_district vil ON cli.villageId = vil.id
    LEFT JOIN ba_district tow ON cli.townId = tow.id
    <where>
      AND ope.operate_type IN(1,2)
      AND ope.operate_valid = 2
@@ -758,9 +772,9 @@
  <!--根据水卡编号获取其挂失时退款金额(补卡时判断使用)-->
  <select id="getTradeAmountByCardNo" resultType="java.lang.Double">
    SELECT
        ope.trade_amount AS tradeAmount
    ope.trade_amount AS tradeAmount
    FROM se_client_card card
        INNER JOIN se_card_operate ope ON ope.card_id = card.id
    INNER JOIN se_card_operate ope ON ope.card_id = card.id
    <where>
      AND ope.operate_type = 6
      AND card.cardNum = #{cardNum}
@@ -800,7 +814,7 @@
    select
    count(*)
    from
      (
    (
    SELECT
    sco.client_id AS clientId,
    sc.`name` AS clientName,
@@ -815,22 +829,22 @@
    WHERE
    sco.operate_dt BETWEEN #{timeStart} AND #{timeStop} AND sco.operate_type = 1 AND sc.deleted = 0 AND sc.disabled = 0 AND sco.operate_valid = 2
    GROUP BY sc.id) c
    </select>
  </select>
  <!--指定时间段内开物理卡农户-->
  <select id="getOpenIcCardClients" resultType="com.dy.pipIrrGlobal.voSt.VoClientOpenCardCount">
    SELECT
      sco.client_id AS clientId,
      sc.`name` AS clientName,
      sc.clientNum AS clientNum,
      sc.address AS address,
      sc.phone AS phone,
      sc.idCard AS idCard,
      COUNT(sc.id) AS openCardCount
    sco.client_id AS clientId,
    sc.`name` AS clientName,
    sc.clientNum AS clientNum,
    sc.address AS address,
    sc.phone AS phone,
    sc.idCard AS idCard,
    COUNT(sc.id) AS openCardCount
    FROM
      `se_card_operate` sco
        INNER JOIN se_client sc ON sc.id = sco.client_id
    `se_card_operate` sco
    INNER JOIN se_client sc ON sc.id = sco.client_id
    WHERE
      sco.operate_dt BETWEEN #{timeStart} AND #{timeStop} AND sco.operate_type = 1 AND sc.deleted = 0 AND sc.disabled = 0 AND sco.operate_valid = 2
    sco.operate_dt BETWEEN #{timeStart} AND #{timeStop} AND sco.operate_type = 1 AND sc.deleted = 0 AND sc.disabled = 0 AND sco.operate_valid = 2
    GROUP BY sc.id
    ORDER BY sc.id DESC
    <trim prefix="limit " >
@@ -863,18 +877,18 @@
  <!--指定时间段内每个农户充值合计-->
  <select id="getRechargeTotalClients" resultType="com.dy.pipIrrGlobal.voSt.VoClientRechargeTotal">
    SELECT
      sco.client_id AS clientId,
      sc.`name` AS clientName,
      sc.clientNum AS clientNum,
      sc.address AS address,
      sc.phone AS phone,
      sc.idCard AS idCard,
      IFNULL(SUM(sco.trade_amount),0) AS rechargeTotal
    sco.client_id AS clientId,
    sc.`name` AS clientName,
    sc.clientNum AS clientNum,
    sc.address AS address,
    sc.phone AS phone,
    sc.idCard AS idCard,
    IFNULL(SUM(sco.trade_amount),0) AS rechargeTotal
    FROM
      `se_card_operate` sco
        INNER JOIN se_client sc ON sc.id = sco.client_id
    `se_card_operate` sco
    INNER JOIN se_client sc ON sc.id = sco.client_id
    WHERE
      sco.operate_dt BETWEEN #{timeStart} AND #{timeStop} AND sco.operate_type = 2 AND sc.deleted = 0 AND sc.disabled = 0 AND sco.operate_valid = 2
    sco.operate_dt BETWEEN #{timeStart} AND #{timeStop} AND sco.operate_type = 2 AND sc.deleted = 0 AND sc.disabled = 0 AND sco.operate_valid = 2
    GROUP BY sc.id
    ORDER BY sc.id DESC
    <trim prefix="limit " >
@@ -908,18 +922,18 @@
  <!--指定时间段内物理卡充值金额超过指定值的农户-->
  <select id="getRechargeTotalGtValueClients" resultType="com.dy.pipIrrGlobal.voSt.VoClientRechargeTotal">
    SELECT
      sco.client_id AS clientId,
      sc.`name` AS clientName,
      sc.clientNum AS clientNum,
      sc.address AS address,
      sc.phone AS phone,
      sc.idCard AS idCard,
      IFNULL(SUM(sco.trade_amount),0) AS rechargeTotal
    sco.client_id AS clientId,
    sc.`name` AS clientName,
    sc.clientNum AS clientNum,
    sc.address AS address,
    sc.phone AS phone,
    sc.idCard AS idCard,
    IFNULL(SUM(sco.trade_amount),0) AS rechargeTotal
    FROM
      `se_card_operate` sco
        INNER JOIN se_client sc ON sc.id = sco.client_id
    `se_card_operate` sco
    INNER JOIN se_client sc ON sc.id = sco.client_id
    WHERE
      sco.operate_dt BETWEEN #{timeStart} AND #{timeStop} AND sco.operate_type = 2 AND sc.deleted = 0 AND sc.disabled = 0 AND sco.operate_valid = 2
    sco.operate_dt BETWEEN #{timeStart} AND #{timeStop} AND sco.operate_type = 2 AND sc.deleted = 0 AND sc.disabled = 0 AND sco.operate_valid = 2
    GROUP BY sc.id
    HAVING IFNULL(SUM(sco.trade_amount),0) &gt; #{value}
    ORDER BY sc.id DESC
@@ -934,10 +948,10 @@
  <select id="getRechargesCountNew" resultType="java.lang.Long">
    SELECT COUNT(*) AS recordCount
    FROM se_client_card card
        LEFT JOIN se_client cli ON cli.id = card.clientId
        LEFT JOIN se_recharge_history rch ON rch.cardId = card.id
        LEFT JOIN se_payment_method pay ON pay.id = rch.paymentId
        LEFT JOIN ba_user us ON us.id = rch.operator
    LEFT JOIN se_client cli ON cli.id = card.clientId
    LEFT JOIN se_recharge_history rch ON rch.cardId = card.id
    LEFT JOIN se_payment_method pay ON pay.id = rch.paymentId
    LEFT JOIN ba_user us ON us.id = rch.operator
    <where>
      AND rch.operate_valid = 2
      <if test = "clientName != null and clientName !=''">
@@ -957,20 +971,20 @@
  <!--获取充值记录,管理平台充值列表使用,APP未使用-->
  <select id="getRechargesNew" resultType="com.dy.pipIrrGlobal.voSe.VoRechargeNew">
    SELECT
        cli.name AS clientName,
        cli.clientNum,
        card.cardNum,
        IFNULL(rch.amount, 0) AS amount,
        IFNULL(rch.gift, 0) AS gift,
        IFNULL(rch.afterRecharge, 0) AS afterRecharge,
        pay.name AS paymentName,
        us.name AS operator,
        rch.operateDt AS operateTime
    cli.name AS clientName,
    cli.clientNum,
    card.cardNum,
    IFNULL(rch.amount, 0) AS amount,
    IFNULL(rch.gift, 0) AS gift,
    IFNULL(rch.afterRecharge, 0) AS afterRecharge,
    pay.name AS paymentName,
    us.name AS operator,
    rch.operateDt AS operateTime
    FROM se_client_card card
        LEFT JOIN se_client cli ON cli.id = card.clientId
        LEFT JOIN se_recharge_history rch ON rch.cardId = card.id
        LEFT JOIN se_payment_method pay ON pay.id = rch.paymentId
        LEFT JOIN ba_user us ON us.id = rch.operator
    LEFT JOIN se_client cli ON cli.id = card.clientId
    LEFT JOIN se_recharge_history rch ON rch.cardId = card.id
    LEFT JOIN se_payment_method pay ON pay.id = rch.paymentId
    LEFT JOIN ba_user us ON us.id = rch.operator
    <where>
      AND rch.operate_valid = 2
      <if test = "clientName != null and clientName !=''">
@@ -997,9 +1011,9 @@
  <select id="getRefundsCount" resultType="java.lang.Long">
    SELECT COUNT(*) AS recordCount
    FROM se_client_card card
        INNER JOIN se_client cli ON cli.id = card.clientId
        LEFT JOIN se_card_operate ope ON ope.card_id = card.id
        INNER JOIN ba_user us ON us.id = ope.operator
    INNER JOIN se_client cli ON cli.id = card.clientId
    LEFT JOIN se_card_operate ope ON ope.card_id = card.id
    INNER JOIN ba_user us ON us.id = ope.operator
    <where>
      AND ope.operate_type = 5
      AND ope.operate_valid = 2
@@ -1020,17 +1034,17 @@
  <!--获取返还记录,管理平台充值列表使用-->
  <select id="getRefunds" resultType="com.dy.pipIrrGlobal.voSe.VoRefund">
    SELECT
        cli.name AS clientName,
        cli.clientNum,
        card.cardNum,
        IFNULL(ope.money, 0) AS money,
        IFNULL(ope.refund_amount, 0) AS refundAmount,
        us.name AS operator,
        ope.operate_dt AS operateTime
    cli.name AS clientName,
    cli.clientNum,
    card.cardNum,
    IFNULL(ope.money, 0) AS money,
    IFNULL(ope.refund_amount, 0) AS refundAmount,
    us.name AS operator,
    ope.operate_dt AS operateTime
    FROM se_client_card card
        INNER JOIN se_client cli ON cli.id = card.clientId
        LEFT JOIN se_card_operate ope ON ope.card_id = card.id
        INNER JOIN ba_user us ON us.id = ope.operator
    INNER JOIN se_client cli ON cli.id = card.clientId
    LEFT JOIN se_card_operate ope ON ope.card_id = card.id
    INNER JOIN ba_user us ON us.id = ope.operator
    <where>
      AND ope.operate_type = 5
      AND ope.operate_valid = 2
@@ -1058,14 +1072,14 @@
  <!--根据水卡ID、操作类型获取获取最后一条记录,判断开卡是否同步充值使用-->
  <update id="turnOperateValidByCardId">
    UPDATE se_card_operate
        SET operate_valid = 2
    SET operate_valid = 2
    WHERE id = (
        SELECT id FROM (
            SELECT id
        FROM se_card_operate
        WHERE operate_valid = 1 AND operate_type = #{operateType} AND card_id = #{cardId}
        ORDER BY id DESC
        LIMIT 1) AS subquery
    SELECT id FROM (
    SELECT id
    FROM se_card_operate
    WHERE operate_valid = 1 AND operate_type = #{operateType} AND card_id = #{cardId}
    ORDER BY id DESC
    LIMIT 1) AS subquery
    );
  </update>
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientMapper.xml
@@ -549,4 +549,83 @@
      </if>
    </trim>
  </select>
  <!--根据指定条件获取农户记录数_充值机-->
  <select id="getTermClientCount" resultType="java.lang.Long">
    SELECT
      count(*)
    FROM se_client cli
        LEFT JOIN ba_district dis_village ON cli.villageId = dis_village.id
    <where>
      AND cli.disabled = 0
      AND cli.deleted = 0
      <if test = "name != null and name !=''">
        AND cli.name like CONCAT('%',#{name},'%')
      </if>
      <if test = "clientNum != null and clientNum !=''">
        AND cli.clientNum like CONCAT('%',#{clientNum},'%')
      </if>
      <if test = "phone != null and phone !=''">
        AND cli.phone like CONCAT('%',#{phone},'%')
      </if>
    </where>
  </select>
  <!--根据指定条件获取农户数据_充值机-->
  <select id="getTermClients" resultType="com.dy.pipIrrGlobal.voSe.VoTermClient">
    SELECT
        cli.id AS clientId,
        cli.clientNum,
        cli.name,
        cli.phone,
        cli.idCard,
        dis_village.name AS villageName,
        cli.address,
        (SELECT COUNT(*) FROM se_client_card WHERE clientId = cli.id)+(SELECT COUNT(*) FROM se_virtual_card WHERE client_id = cli.id) AS cardCount,
        cli.operateDt,
        cli.districtNum
    FROM se_client cli
        LEFT JOIN ba_district dis_village ON cli.villageId = dis_village.id
    <where>
      AND cli.disabled = 0
      AND cli.deleted = 0
      <if test = "name != null and name !=''">
        AND cli.name like CONCAT('%',#{name},'%')
      </if>
      <if test = "clientNum != null and clientNum !=''">
        AND cli.clientNum like CONCAT('%',#{clientNum},'%')
      </if>
      <if test = "phone != null and phone !=''">
        AND cli.phone like CONCAT('%',#{phone},'%')
      </if>
    </where>
    ORDER BY cli.operateDt DESC
    <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="getTermOneClient" resultType="com.dy.pipIrrGlobal.voSe.VoTermClient">
    SELECT
      cli.id AS clientId,
      cli.clientNum,
      cli.name,
      cli.phone,
      cli.idCard,
      dis_village.name AS villageName,
      cli.address,
      (SELECT COUNT(*) FROM se_client_card WHERE clientId = cli.id)+(SELECT COUNT(*) FROM se_virtual_card WHERE client_id = cli.id) AS cardCount,
      cli.operateDt,
      cli.districtNum
    FROM se_client cli
           LEFT JOIN ba_district dis_village ON cli.villageId = dis_village.id
    WHERE cli.disabled = 0 AND cli.deleted = 0 AND cli.id = #{clientId}
  </select>
</mapper>
pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/card/IcCardSv.java
@@ -1,7 +1,6 @@
package com.dy.pipIrrStatistics.card;
import com.dy.common.webUtil.QueryResultVo;
import com.dy.pipIrrGlobal.daoSe.SeCardOperateMapper;
import com.dy.pipIrrGlobal.daoSe.SeClientCardMapper;
import com.dy.pipIrrGlobal.voSt.VoCardUsage;
import com.dy.pipIrrGlobal.voSt.VoICCard;
pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/client/ClientSv.java
@@ -3,7 +3,6 @@
import com.dy.common.webUtil.QueryResultVo;
import com.dy.pipIrrGlobal.daoRm.RmClientAmountDayLastMapper;
import com.dy.pipIrrGlobal.daoRm.RmOpenCloseValveHistoryMapper;
import com.dy.pipIrrGlobal.daoSe.SeCardOperateMapper;
import com.dy.pipIrrGlobal.daoSe.SeClientMapper;
import com.dy.pipIrrGlobal.voSt.*;
import com.dy.pipIrrStatistics.card.IcCardqo.CommonQO;
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/.gitattributes
New file
@@ -0,0 +1,2 @@
/mvnw text eol=lf
*.cmd text eol=crlf
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/.gitignore
New file
@@ -0,0 +1,33 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/.mvn/wrapper/maven-wrapper.properties
New file
@@ -0,0 +1,19 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
wrapperVersion=3.3.2
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/mvnw
New file
@@ -0,0 +1,259 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Apache Maven Wrapper startup batch script, version 3.3.2
#
# Optional ENV vars
# -----------------
#   JAVA_HOME - location of a JDK home dir, required when download maven via java source
#   MVNW_REPOURL - repo url base for downloading maven distribution
#   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
#   MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output
# ----------------------------------------------------------------------------
set -euf
[ "${MVNW_VERBOSE-}" != debug ] || set -x
# OS specific support.
native_path() { printf %s\\n "$1"; }
case "$(uname)" in
CYGWIN* | MINGW*)
  [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")"
  native_path() { cygpath --path --windows "$1"; }
  ;;
esac
# set JAVACMD and JAVACCMD
set_java_home() {
  # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched
  if [ -n "${JAVA_HOME-}" ]; then
    if [ -x "$JAVA_HOME/jre/sh/java" ]; then
      # IBM's JDK on AIX uses strange locations for the executables
      JAVACMD="$JAVA_HOME/jre/sh/java"
      JAVACCMD="$JAVA_HOME/jre/sh/javac"
    else
      JAVACMD="$JAVA_HOME/bin/java"
      JAVACCMD="$JAVA_HOME/bin/javac"
      if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then
        echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2
        echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2
        return 1
      fi
    fi
  else
    JAVACMD="$(
      'set' +e
      'unset' -f command 2>/dev/null
      'command' -v java
    )" || :
    JAVACCMD="$(
      'set' +e
      'unset' -f command 2>/dev/null
      'command' -v javac
    )" || :
    if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then
      echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2
      return 1
    fi
  fi
}
# hash string like Java String::hashCode
hash_string() {
  str="${1:-}" h=0
  while [ -n "$str" ]; do
    char="${str%"${str#?}"}"
    h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296))
    str="${str#?}"
  done
  printf %x\\n $h
}
verbose() { :; }
[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; }
die() {
  printf %s\\n "$1" >&2
  exit 1
}
trim() {
  # MWRAPPER-139:
  #   Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds.
  #   Needed for removing poorly interpreted newline sequences when running in more
  #   exotic environments such as mingw bash on Windows.
  printf "%s" "${1}" | tr -d '[:space:]'
}
# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties
while IFS="=" read -r key value; do
  case "${key-}" in
  distributionUrl) distributionUrl=$(trim "${value-}") ;;
  distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;;
  esac
done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties"
[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties"
case "${distributionUrl##*/}" in
maven-mvnd-*bin.*)
  MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/
  case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in
  *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;;
  :Darwin*x86_64) distributionPlatform=darwin-amd64 ;;
  :Darwin*arm64) distributionPlatform=darwin-aarch64 ;;
  :Linux*x86_64*) distributionPlatform=linux-amd64 ;;
  *)
    echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2
    distributionPlatform=linux-amd64
    ;;
  esac
  distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip"
  ;;
maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;;
*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;;
esac
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
distributionUrlName="${distributionUrl##*/}"
distributionUrlNameMain="${distributionUrlName%.*}"
distributionUrlNameMain="${distributionUrlNameMain%-bin}"
MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}"
MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
exec_maven() {
  unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
  exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
}
if [ -d "$MAVEN_HOME" ]; then
  verbose "found existing MAVEN_HOME at $MAVEN_HOME"
  exec_maven "$@"
fi
case "${distributionUrl-}" in
*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
esac
# prepare tmp dir
if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
  clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
  trap clean HUP INT TERM EXIT
else
  die "cannot create temp dir"
fi
mkdir -p -- "${MAVEN_HOME%/*}"
# Download and Install Apache Maven
verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
verbose "Downloading from: $distributionUrl"
verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
# select .zip or .tar.gz
if ! command -v unzip >/dev/null; then
  distributionUrl="${distributionUrl%.zip}.tar.gz"
  distributionUrlName="${distributionUrl##*/}"
fi
# verbose opt
__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
# normalize http auth
case "${MVNW_PASSWORD:+has-password}" in
'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
esac
if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
  verbose "Found wget ... using wget"
  wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
  verbose "Found curl ... using curl"
  curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
elif set_java_home; then
  verbose "Falling back to use Java to download"
  javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
  targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
  cat >"$javaSource" <<-END
    public class Downloader extends java.net.Authenticator
    {
      protected java.net.PasswordAuthentication getPasswordAuthentication()
      {
        return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
      }
      public static void main( String[] args ) throws Exception
      {
        setDefault( new Downloader() );
        java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
      }
    }
    END
  # For Cygwin/MinGW, switch paths to Windows format before running javac and java
  verbose " - Compiling Downloader.java ..."
  "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
  verbose " - Running Downloader.java ..."
  "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
fi
# If specified, validate the SHA-256 sum of the Maven distribution zip file
if [ -n "${distributionSha256Sum-}" ]; then
  distributionSha256Result=false
  if [ "$MVN_CMD" = mvnd.sh ]; then
    echo "Checksum validation is not supported for maven-mvnd." >&2
    echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
    exit 1
  elif command -v sha256sum >/dev/null; then
    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then
      distributionSha256Result=true
    fi
  elif command -v shasum >/dev/null; then
    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
      distributionSha256Result=true
    fi
  else
    echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
    echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
    exit 1
  fi
  if [ $distributionSha256Result = false ]; then
    echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
    echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
    exit 1
  fi
fi
# unzip and move
if command -v unzip >/dev/null; then
  unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
else
  tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
fi
printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url"
mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
clean || :
exec_maven "$@"
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/mvnw.cmd
New file
@@ -0,0 +1,149 @@
<# : batch portion
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements.  See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership.  The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License.  You may obtain a copy of the License at
@REM
@REM    http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied.  See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Apache Maven Wrapper startup batch script, version 3.3.2
@REM
@REM Optional ENV vars
@REM   MVNW_REPOURL - repo url base for downloading maven distribution
@REM   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
@REM   MVNW_VERBOSE - true: enable verbose log; others: silence the output
@REM ----------------------------------------------------------------------------
@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
@SET __MVNW_CMD__=
@SET __MVNW_ERROR__=
@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
@SET PSModulePath=
@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
  IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
)
@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
@SET __MVNW_PSMODULEP_SAVE=
@SET __MVNW_ARG0_NAME__=
@SET MVNW_USERNAME=
@SET MVNW_PASSWORD=
@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*)
@echo Cannot start maven from wrapper >&2 && exit /b 1
@GOTO :EOF
: end batch / begin powershell #>
$ErrorActionPreference = "Stop"
if ($env:MVNW_VERBOSE -eq "true") {
  $VerbosePreference = "Continue"
}
# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
if (!$distributionUrl) {
  Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
}
switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
  "maven-mvnd-*" {
    $USE_MVND = $true
    $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
    $MVN_CMD = "mvnd.cmd"
    break
  }
  default {
    $USE_MVND = $false
    $MVN_CMD = $script -replace '^mvnw','mvn'
    break
  }
}
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
if ($env:MVNW_REPOURL) {
  $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" }
  $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')"
}
$distributionUrlName = $distributionUrl -replace '^.*/',''
$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain"
if ($env:MAVEN_USER_HOME) {
  $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain"
}
$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
  Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
  Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
  exit $?
}
if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
  Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
}
# prepare tmp dir
$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
trap {
  if ($TMP_DOWNLOAD_DIR.Exists) {
    try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
    catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
  }
}
New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
# Download and Install Apache Maven
Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
Write-Verbose "Downloading from: $distributionUrl"
Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
$webclient = New-Object System.Net.WebClient
if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
  $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
}
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
# If specified, validate the SHA-256 sum of the Maven distribution zip file
$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
if ($distributionSha256Sum) {
  if ($USE_MVND) {
    Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
  }
  Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
  if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
    Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
  }
}
# unzip and move
Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null
try {
  Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
} catch {
  if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
    Write-Error "fail to move MAVEN_HOME"
  }
} finally {
  try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
  catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/pom.xml
New file
@@ -0,0 +1,138 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>pipIrr-web</artifactId>
        <groupId>com.dy</groupId>
        <version>1.0.0</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <packaging>jar</packaging>
    <artifactId>pipIrr-web-terminal</artifactId>
    <name>pipIrr-web-terminal</name>
    <description>充值机系统</description>
    <build>
        <plugins>
            <!-- ç”Ÿæˆä¸åŒ…含依赖jar的可执行jar包
            <plugin>
                !- spring boot提供的maven打包插件 -
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        !-
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        -
                        <configuration>
                            !- ä¸åŠ çš„è¯æœ€ç»ˆåŒ…åä¸º: ${artifactId}-${version}.jar, åŠ äº†çš„è¯æœ€ç»ˆåŒ…å: ${artifactId}-${version}-${classifier}.jar  -
                            <classifier>execute</classifier>
                            !- ä¸æŒ‡å®šç”Ÿæˆè·¯å¾„的话, é»˜è®¤ä¿å­˜åœ¨ ${build.directory} ä¸‹ -
                            <outputDirectory>${project.build.directory}/execute</outputDirectory>
                            <finalName>${artifactId}-${version}</finalName>
                            <layout>ZIP</layout>
                            <mainClass>com.dy.pipIrrBase.PipIrrBaseApplication</mainClass>
                            <includes>
                                <include>
                                    <groupId>com.dy</groupId>
                                    <artifactId>pipIrr-common</artifactId>
                                </include>
                                <include>
                                    <groupId>com.dy</groupId>
                                    <artifactId>pipIrr-global</artifactId>
                                </include>
                            </includes>
                            <excludes>
                                <exclude>
                                    <groupId>org.projectlombok</groupId>
                                    <artifactId>lombok</artifactId>
                                </exclude>
                            </excludes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            -->
            <!-- æ‹·è´ä¾èµ–çš„jar包到lib目录-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <configuration>
                            <!-- ä¸åŠ çš„è¯æœ€ç»ˆåŒ…åä¸º: ${artifactId}-${version}.jar, åŠ äº†çš„è¯æœ€ç»ˆåŒ…å: ${artifactId}-${version}-${classifier}.jar
                            <classifier>execute</classifier>
                            -->
                            <!-- ${project.build.directory}是maven变量,内置的,表示target目录,如果不写,将在根目录下创建/lib -->
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <!-- excludeTransitive:是否不包含间接依赖包,比如我们依赖A,但是A又依赖了B,我们是否也要把B打进去 é»˜è®¤ä¸æ‰“-->
                            <excludeTransitive>false</excludeTransitive>
                            <!-- å¤åˆ¶çš„jar文件去掉版本信息 -->
                            <stripVersion>false</stripVersion>
                            <finalName>${project.artifactId}-${project.version}</finalName>
                            <layout>ZIP</layout>
                            <mainClass>com.dy.pipIrrBase.PipIrrBaseApplication</mainClass>
                            <includes>
                                <include>
                                    <groupId>com.dy</groupId>
                                    <artifactId>pipIrr-common</artifactId>
                                </include>
                                <include>
                                    <groupId>com.dy</groupId>
                                    <artifactId>pipIrr-global</artifactId>
                                </include>
                            </includes>
                            <excludes>
                                <exclude>
                                    <groupId>org.projectlombok</groupId>
                                    <artifactId>lombok</artifactId>
                                </exclude>
                            </excludes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <!-- è®¾ç½®java编译版本,运行环境版本 -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <!-- source: æºä»£ç ç¼–译版本;target: ç›®æ ‡å¹³å°ç¼–译版本;encoding: å­—符集编码。 -->
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${encoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <!-- è§£å†³èµ„源文件的编码问题 -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>${encoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <!-- maven里执行测试用例的插件 -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
            <plugin>
                <!-- ä¸‹é¢è§£å†³ï¼šå½“进行Maven Lifecycle package时报错:Could not find artifact org.apache.mina:mina-core:bundle:2.2.1 in maven (https://repo1.maven.org/maven2/)-->
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
            </plugin>
        </plugins>
    </build>
</project>
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/PipIrrTerminalApplication.java
New file
@@ -0,0 +1,28 @@
package com.dy.pipIrrTerminal;
import com.dy.common.multiDataSource.EnableMultiDataSource;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.FilterType;
@SpringBootApplication
@EnableAspectJAutoProxy
@EnableMultiDataSource
@ComponentScan(basePackages = {"com.dy.common", "com.dy.pipIrrGlobal", "com.dy.pipIrrTerminal"},
        excludeFilters = {
                @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {
                        com.dy.common.singleDataSource.DruidDataSourceConfig.class //排除单数据源
                })
        }
)
@MapperScan({"com.dy.pipIrrGlobal.daoPr", "com.dy.pipIrrGlobal.daoBa","com.dy.pipIrrGlobal.daoFi", "com.dy.pipIrrGlobal.daoSe"})
public class PipIrrTerminalApplication {
    public static void main(String[] args) {
        SpringApplication.run(PipIrrTerminalApplication.class, args);
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java
New file
@@ -0,0 +1,52 @@
package com.dy.pipIrrTerminal.card;
import com.dy.common.aop.SsoAop;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrGlobal.voSe.VoTermRecharge;
import com.dy.pipIrrTerminal.card.dto.ActiveCard;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
import java.util.Objects;
/**
 * @author ZhuBaoMin
 * @date 2025-05-08 10:15
 * @LastEditTime 2025-05-08 10:15
 * @Description
 */
@Slf4j
@RestController
@RequestMapping(path = "card")
@RequiredArgsConstructor
public class CardCtrl {
    private final CardSv cardSv;
    @PostMapping(path = "activeTermCard", consumes = MediaType.APPLICATION_JSON_VALUE)
    @Transactional(rollbackFor = Exception.class)
    @SsoAop()
    public BaseResponse<VoTermRecharge> activeTermCard(@RequestBody @Valid ActiveCard po, BindingResult bindingResult) {
        if (bindingResult != null && bindingResult.hasErrors()) {
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        Map map_result = cardSv.activeOrReissueTermCard(po);
        if(map_result.get("success").equals(false)) {
            return BaseResponseUtils.buildErrorMsg(map_result.get("msg").toString());
        }
        return BaseResponseUtils.buildSuccess(map_result.get("content")) ;
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java
New file
@@ -0,0 +1,267 @@
package com.dy.pipIrrTerminal.card;
import com.dy.common.webUtil.BaseResponse;
import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper;
import com.dy.pipIrrGlobal.daoSe.SeCardOperateMapper;
import com.dy.pipIrrGlobal.daoSe.SeClientCardMapper;
import com.dy.pipIrrGlobal.daoSe.SeClientMapper;
import com.dy.pipIrrGlobal.pojoSe.SeCardOperate;
import com.dy.pipIrrGlobal.pojoSe.SeClientCard;
import com.dy.pipIrrGlobal.voSe.VoTermRecharge;
import com.dy.pipIrrTerminal.card.dto.ActiveCard;
import com.dy.pipIrrTerminal.card.dto.DtoRecharge;
import com.dy.pipIrrTerminal.card.enums.CardStateENUM;
import com.dy.pipIrrTerminal.card.enums.LastOperateENUM;
import com.dy.pipIrrTerminal.card.enums.OperateTypeENUM;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
 * @author ZhuBaoMin
 * @date 2025-05-08 10:15
 * @LastEditTime 2025-05-08 10:15
 * @Description
 */
@Slf4j
@Service
public class CardSv {
    @Autowired
    private SeCardOperateMapper seCardOperateMapper;
    @Autowired
    private SeClientCardMapper seClientCardMapper;
    @Autowired
    private SeClientMapper seClientMapper;
    @Autowired
    private PrWaterPriceMapper prWaterPriceMapper;
    @Value("${project.projectNo}")
    private Integer projectNo;
    /**
     * æ ¹æ®æ°´å¡åœ°å€åˆ¤æ–­è¯¥å¡æ˜¯å¦å¯ä»¥å¼€å¡
     * @param cardAddr
     * @return true:可以开卡
     */
    public Boolean canActiveCard(String cardAddr) {
        // æŒ‡å®šæ°´å¡åœ°å€çš„æ°´å¡æ•°é‡ï¼Œæ— æ•ˆå¡ç‰‡æŽ’除在外
        Long cardCount = Optional.ofNullable(seClientCardMapper.getCountByCardAddr(cardAddr)).orElse(0L);
        if (cardCount == 0) {
            return true;
        }
        // æŒ‡å®šæ°´å¡åœ°å€ä¸”正常状态或挂失状态的水卡数量
        cardCount = Optional.ofNullable(seClientCardMapper.getCountByCardAddrAndState(cardAddr)).orElse(0L);
        if (cardCount == 0) {
            return true;
        }
        return false;
    }
    /**
     * æ ¹æ®å†œæˆ·ç¼–号获取5级行政区划串areaCode,补卡过程中开新卡使用
     * @param clientId
     * @return
     */
    public Long getAreaCodeById(Long clientId) {
        return seClientMapper.getAreaCodeById(clientId);
    }
    public String getCardNumOfMax(String areaCode) {
        return seClientCardMapper.getCardNumOfMax(areaCode);
    }
    public Map generateCardNum(Long clientId) {
        Map map_cardNum = new HashMap<>();
        map_cardNum.put("success", false);
        map_cardNum.put("content", null);
        // èŽ·å–5级行政区划串areaCode
        Long areaCodeL = getAreaCodeById(clientId);
        if (areaCodeL == null) {
            map_cardNum.put("msg", "该农户行政区划异常");
            return map_cardNum;
        }
        String areaCode = String.valueOf(areaCodeL);
        String cardNum = Optional.ofNullable(getCardNumOfMax(areaCode)).orElse("");
        if (cardNum != null && cardNum.trim().length() > 0) {
            Integer number = Integer.parseInt(cardNum.substring(12));
            number = number + 1;
            if (number > 65535) {
                map_cardNum.put("msg", "水卡编号已满");
                return map_cardNum;
            }
            cardNum = cardNum.substring(0, 12) + String.format("%05d", number);
        } else {
            cardNum = areaCode + "00001";
        }
        map_cardNum.put("success", true);
        map_cardNum.put("content", cardNum);
        return map_cardNum;
    }
    public String generateOrderNo() {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyMMddHHmmss");
        LocalDateTime dateTime = LocalDateTime.now();
        Random random = new Random();
        String CHARACTERS = "0123456789";
        StringBuilder sb = new StringBuilder(4);
        for (int i = 0; i < 4; i++) {
            int index = random.nextInt(CHARACTERS.length());
            sb.append(CHARACTERS.charAt(index));
        }
        return dtf.format(dateTime) + sb.toString();
    }
    public Map addCardAndOperate(ActiveCard po, Long cardNum, String orderNo) {
        Map map = new HashMap<>();
        map.put("success", false);
        map.put("content", null);
        // amount:充值接口为输入参数,补卡接口为原卡退还金额
        SeClientCard seClientCard = new SeClientCard();
        seClientCard.setProtocol(po.getProtocol());
        seClientCard.setCardaddr(po.getCardAddr());
        seClientCard.setCardnum(String.valueOf(cardNum));
        seClientCard.setClientid(po.getClientId());
        seClientCard.setMoney(po.getAmount());
        seClientCard.setState(CardStateENUM.INVALID.getCode());
        if (po.getOriginalCardId() != null) {
            // è¡¥å¡
            seClientCard.setOriginalCardId(po.getOriginalCardId());
            seClientCard.setLastoper(LastOperateENUM.REPLACE.getCode());
            seClientCard.setReplacedt(new Date());
        } else {
            // å¼€æ–°å¡
            seClientCard.setLastoper(LastOperateENUM.ACTIVE.getCode());
            seClientCard.setCreatedt(new Date());
        }
        seClientCardMapper.insert(seClientCard);
        Long cardId = Optional.ofNullable(seClientCard.getId()).orElse(0L);
        if (cardId == 0) {
            map.put("msg", "开卡失败-农户卡写入异常");
            return map;
        }
        SeCardOperate seCardOperate = new SeCardOperate();
        seCardOperate.setCardId(cardId);
        seCardOperate.setClientId(po.getClientId());
        seCardOperate.setMoney(0f);
        seCardOperate.setCardCost(po.getCardCost());
        seCardOperate.setPaymentId(po.getPaymentId());
        if (po.getOriginalCardId() != null) {
            // è¡¥å¡
            seCardOperate.setOperateType(OperateTypeENUM.REISSUE.getCode());
            seCardOperate.setNoTradeAmount(po.getAmount());
        } else {
            // å¼€æ–°å¡
            seCardOperate.setOperateType(OperateTypeENUM.ACTIVE.getCode());
        }
        seCardOperate.setRemarks(po.getRemarks());
        seCardOperate.setOperator(po.getOperator());
        seCardOperate.setOperateDt(new Date());
        seCardOperate.setOrderNo(orderNo);
        seCardOperate.setOperateValid((byte) 1);
        seCardOperateMapper.insert(seCardOperate);
        Long rec = Optional.ofNullable(seCardOperate.getId()).orElse(0L);
        if (rec == 0) {
            map.put("msg", "开卡失败-开卡记录写入异常");
            return map;
        }
        map.put("success", true);
        return map;
    }
    public Map plusRecharge(ActiveCard po, Long cardNum) {
        Map map = new HashMap<>();
        map.put("success", false);
        map.put("content", null);
        DtoRecharge dtoRecharge = new DtoRecharge();
        dtoRecharge.setCardNum(cardNum);
        dtoRecharge.setAmount(po.getAmount());
        dtoRecharge.setPaymentId(po.getPaymentId());
        dtoRecharge.setRemarks(po.getRemarks());
        dtoRecharge.setOperator(po.getOperator());
        dtoRecharge.setMoney(0f);
        dtoRecharge.setGift(0f);
        dtoRecharge.setPrice(0f);
        //BaseResponse<Boolean> job = cardOperateSv.addRecharge(dtoRecharge);
        BaseResponse<Boolean> job = null;
        if (!job.getCode().equals("0001")) {
            map.put("msg", "开卡失败-充值异常");
            return map;
        }
        map.put("success", true);
        return map;
    }
    public Map activeOrReissueTermCard(ActiveCard po) {
        Map map = new HashMap<>();
        map.put("success", false);
        map.put("content", null);
        Float amount = po.getAmount();
        Long originalCardId = po.getOriginalCardId();
        if (!canActiveCard(po.getCardAddr())) {
            map.put("msg", "开卡失败-此卡已存在");
            return map;
        }
        Map map_cardNum = generateCardNum(po.getClientId());
        if(map_cardNum.get("success").equals(false)) {
            map.put("msg", map_cardNum.get("msg").toString());
            return map;
        }
        Long cardNum = Long.parseLong(map_cardNum.get("content").toString());
        String orderNo = generateOrderNo();
        Map map_addCardAndOperate = addCardAndOperate(po, cardNum, orderNo);
        if(map_addCardAndOperate.get("success").equals(false)) {
            map.put("msg", map_addCardAndOperate.get("msg").toString());
            return map;
        }
        if (amount != null && amount > 0 && originalCardId == null) {
            Map map_plusRecharge = plusRecharge(po, cardNum);
            if(map_plusRecharge.get("success").equals(false)) {
                map.put("msg", map_plusRecharge.get("msg").toString());
                return map;
            }
        }
        Float balance = Optional.ofNullable(seClientCardMapper.getMoneyByCardNum(cardNum)).orElse(0f);
        Double waterPrice = prWaterPriceMapper.getPrice();
        VoTermRecharge voTermRecharge = new VoTermRecharge();
        voTermRecharge.setProjectNo(projectNo);
        voTermRecharge.setCardNum(cardNum);
        voTermRecharge.setBalance(balance);
        voTermRecharge.setWaterPrice(waterPrice);
        voTermRecharge.setTime(new Date());
        voTermRecharge.setOrderNo(orderNo);
        map.put("success", true);
        map.put("msg", "操作成功");
        map.put("content", voTermRecharge);
        return map;
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/ActiveCard.java
New file
@@ -0,0 +1,69 @@
package com.dy.pipIrrTerminal.card.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
 * @author ZhuBaoMin
 * @date 2025-05-08 10:26
 * @LastEditTime 2025-05-08 10:26
 * @Description
 */
@Data
public class ActiveCard {
    public static final long serialVersionUID = 202505081027001L;
    /**
     * åè®®åç§°
     */
    @NotBlank(message = "协议不能为空")
    private String protocol;
    /**
     * æ°´å¡åœ°å€ï¼Œä»…保存,无业务
     */
    @NotBlank(message = "水卡地址不能为空")
    private String cardAddr;
    /**
     * å†œæˆ·ID(主键)
     */
    @NotNull(message = "农户不能为空")
    private Long clientId;
    /**
     * åŽŸæŒ‚å¤±å¡ID,补卡过程开卡需要
     */
    private Long originalCardId;
    /**
     * å¡ç‰‡è´¹ç”¨
     */
    @NotNull(message = "卡片费用不能为空")
    private Integer cardCost;
    /**
     * å……值金额
     */
    private Float amount;
    /**
     * æ”¯ä»˜æ–¹å¼ç¼–号
     */
    @NotNull(message = "付方式不能为空")
    private Long paymentId;
    /**
     * å¤‡æ³¨ä¿¡æ¯
     */
    private String remarks;
    /**
     * æ“ä½œäººç¼–号
     */
    @NotNull(message = "操作人不能为空")
    private Long operator;
}
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/DtoRecharge.java
New file
@@ -0,0 +1,73 @@
package com.dy.pipIrrTerminal.card.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import lombok.*;
/**
 * @author ZhuBaoMin
 * @date 2025-05-08 14:46
 * @LastEditTime 2025-05-08 14:46
 * @Description
 */
@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class DtoRecharge {
    public static final long serialVersionUID = 202505081447001L;
    /**
     * æ°´å¡ç¼–号
     */
    @NotNull(message = "水卡编号不能为空")
    private Long cardNum;
    /**
     * å†œæˆ·ID,不是充值接口传入,由开卡对象传入,保存充值记录需要
     */
    private Long clientId;
    /**
     * å¡ç‰‡ä½™é¢
     */
    @Min(value = 0, message="卡片余额不能小于0")
    private Float money;
    /**
     * å……值金额
     */
    private Float amount;
    /**
     * èµ é€é‡‘额
     */
    @Min(value = 0, message="赠送金额不能小于0")
    private Float gift;
    /**
     * ä»˜æ¬¾æ–¹å¼ç¼–号
     */
    private Long paymentId;
    /**
     * æ°´ä»·
     */
    @Min(value = 0, message="水价不能小于0")
    private Float price;
    /**
     * å¤‡æ³¨ä¿¡æ¯
     */
    private String remarks;
    /**
     * æ“ä½œäººç¼–号
     */
    @Positive(message = "操作人编号必须为大于0的整数")
    private Long operator;
}
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/CardStateENUM.java
New file
@@ -0,0 +1,23 @@
package com.dy.pipIrrTerminal.card.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * @author ZhuBaoMin
 * @date 2025-05-08 11:36
 * @LastEditTime 2025-05-08 11:36
 * @Description
 */
@Getter
@AllArgsConstructor
public enum CardStateENUM {
    NORMAL((byte)1, "正常"),
    CANCELLED((byte)2, "已注销"),
    LOSS((byte)3, "已挂失"),
    INVALID((byte)4, "无效的");
    private final Byte code;
    private final String message;
}
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/LastOperateENUM.java
New file
@@ -0,0 +1,29 @@
package com.dy.pipIrrTerminal.card.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * @author ZhuBaoMin
 * @date 2025-05-08 11:34
 * @LastEditTime 2025-05-08 11:34
 * @Description
 */
@Getter
@AllArgsConstructor
public enum LastOperateENUM {
    ACTIVE((byte)1, "开卡"),
    RECHARGE((byte)2, "充值"),
    CANCEL((byte)3, "注销"),
    REPLACE((byte)4, "补卡"),
    REFUND((byte)5, "补扣"),
    LOSS((byte)6, "挂失"),
    REVERSAL((byte)7, "冲正"),
    UNLOCK((byte)8, "解锁"),
    CONSUME((byte)9, "消费"),
    WRITE_BACK((byte)10, "反写");
    private final Byte code;
    private final String message;
}
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/OperateTypeENUM.java
New file
@@ -0,0 +1,29 @@
package com.dy.pipIrrTerminal.card.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * @author ZhuBaoMin
 * @date 2025-05-08 11:45
 * @LastEditTime 2025-05-08 11:45
 * @Description
 */
@Getter
@AllArgsConstructor
public enum OperateTypeENUM {
    ACTIVE((byte)1, "开卡"),
    RECHARGE((byte)2, "充值"),
    CANCEL((byte)3, "销卡"),
    REISSUE((byte)4, "补卡"),
    REFUND((byte)5, "补扣"),
    LOSS((byte)6, "挂失"),
    REVERSAL((byte)7, "冲正"),
    UNLOCK((byte)8, "解锁"),
    CONSUME((byte)9, "消费"),
    WRITE_BACK((byte)10, "反写");
    private final Byte code;
    private final String message;
}
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/ClientCtrl.java
New file
@@ -0,0 +1,67 @@
package com.dy.pipIrrTerminal.client;
import com.dy.common.aop.SsoAop;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.common.webUtil.QueryResultVo;
import com.dy.pipIrrGlobal.voSe.VoTermClient;
import com.dy.pipIrrTerminal.client.qo.QoClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
 * @author ZhuBaoMin
 * @date 2025-05-07 17:23
 * @LastEditTime 2025-05-07 17:23
 * @Description
 */
@Slf4j
@RestController
@RequestMapping(path = "client")
@RequiredArgsConstructor
public class ClientCtrl {
    private final ClientSv clientSv;
    /**
     * æ ¹æ®æŒ‡å®šæ¡ä»¶èŽ·å–å†œæˆ·æ•°æ®_充值机
     * @param vo
     * @return
     */
    @GetMapping(path = "getTermClients")
    @SsoAop()
    public BaseResponse<QueryResultVo<List<VoTermClient>>> getTermClients(QoClient vo){
        try {
            QueryResultVo<List<VoTermClient>> res = clientSv.getTermClients(vo);
            return BaseResponseUtils.buildSuccess(res);
        } catch (Exception e) {
            log.error("查询农户异常", e);
            return BaseResponseUtils.buildException(e.getMessage()) ;
        }
    }
    /**
     * æ ¹æ®å†œæˆ·ID获取一个农户数据_充值机
     * @param id
     * @return
     */
    @GetMapping(path = "/getTermOne/{id}")
    @SsoAop()
    public BaseResponse<VoTermClient> getTermOneClient(@PathVariable("id") Long id){
        if(id == null) {
            return BaseResponseUtils.buildErrorMsg("农户ID不能为空");
        }
        try {
            return BaseResponseUtils.buildSuccess(clientSv.getTermOneClient(id));
        } catch (Exception e) {
            log.error("查询农户异常", e);
            return BaseResponseUtils.buildException(e.getMessage()) ;
        }
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/ClientSv.java
New file
@@ -0,0 +1,57 @@
package com.dy.pipIrrTerminal.client;
import com.dy.common.webUtil.QueryResultVo;
import com.dy.pipIrrGlobal.daoSe.SeClientMapper;
import com.dy.pipIrrGlobal.voSe.VoClient;
import com.dy.pipIrrGlobal.voSe.VoTermClient;
import com.dy.pipIrrTerminal.client.qo.QoClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.common.utils.PojoUtils;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
 * @author ZhuBaoMin
 * @date 2025-05-07 17:25
 * @LastEditTime 2025-05-07 17:25
 * @Description
 */
@Slf4j
@Service
public class ClientSv {
    @Autowired
    private SeClientMapper seClientMapper;
    /**
     * æ ¹æ®æŒ‡å®šæ¡ä»¶èŽ·å–å†œæˆ·æ•°æ®_充值机
     * @param queryVo
     * @return
     */
    public QueryResultVo<List<VoTermClient>> getTermClients(QoClient queryVo){
        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(queryVo) ;
        Long itemTotal = (long)seClientMapper.getTermClientCount(params);
        QueryResultVo<List<VoTermClient>> rsVo = new QueryResultVo<>() ;
        rsVo.pageSize = queryVo.pageSize ;
        rsVo.pageCurr = queryVo.pageCurr ;
        rsVo.calculateAndSet(itemTotal, params);
        rsVo.obj = seClientMapper.getTermClients(params);
        return rsVo ;
    }
    /**
     * æ ¹æ®å†œæˆ·ID获取一个农户数据_充值机
     * @param clientId
     * @return
     */
    public VoTermClient getTermOneClient(Long clientId) {
        return seClientMapper.getTermOneClient(clientId);
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/qo/QoClient.java
New file
@@ -0,0 +1,25 @@
package com.dy.pipIrrTerminal.client.qo;
import com.dy.common.webUtil.QueryConditionVo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * @author ZhuBaoMin
 * @date 2025-05-07 17:16
 * @LastEditTime 2025-05-07 17:16
 * @Description å……值机农户查询对象
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class QoClient extends QueryConditionVo {
    public String name;
    public String clientNum;
    public String phone;
}
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/config/WebFilterConfiguration.java
New file
@@ -0,0 +1,52 @@
package com.dy.pipIrrTerminal.config;
import com.dy.common.webFilter.DevOfDataSourceNameSetFilter;
import com.dy.common.webFilter.UserTokenFilter;
import jakarta.servlet.Filter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @author ZhuBaoMin
 * @date 2025/05/07 16:02
 * @LastEditTime 2025/05/07 16:02
 * @Description
 */
@Configuration
public class WebFilterConfiguration {
    @Value("${pipIrr.global.dev}")
    public String isDevStage ;//是否为开发阶段
    @Value("${pipIrr.global.dsName}")
    public String dsName ;//开发阶段的数据源名称
    /**
     * DevOfDataSourceNameSetFilter与UserTokenFilter只能一个被配置上,
     * æ‰€ä»¥ä»–们的order都是1
     */
    private static final int order_UserTokenFilter = 1 ;//与下面
    private static final int order_DevOfDataSourceNameSetFilter = 1 ;
    @Bean
    public FilterRegistrationBean<? extends Filter> RegFilter() {
        FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
        if(this.isDevStage != null && !this.isDevStage.trim().equals("") && this.isDevStage.trim().equalsIgnoreCase("true")){
            filterRegistrationBean.setFilter(new DevOfDataSourceNameSetFilter());
            filterRegistrationBean.addUrlPatterns("/*");//配置过滤规则
            filterRegistrationBean.addInitParameter("dataSourceName",dsName);//设置init参数
            filterRegistrationBean.setName("DevOfDataSourceNameSetFilter");//设置过滤器名称
            filterRegistrationBean.setOrder(order_DevOfDataSourceNameSetFilter);//执行次序
        }else{
            filterRegistrationBean.setFilter(new UserTokenFilter());
            filterRegistrationBean.addUrlPatterns("/*");//配置过滤规则
            filterRegistrationBean.setName("UserTokenFilter");//设置过滤器名称
            filterRegistrationBean.setOrder(order_UserTokenFilter);//执行次序
        }
        return filterRegistrationBean;
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/config/WebListenerConfiguration.java
New file
@@ -0,0 +1,35 @@
package com.dy.pipIrrTerminal.config;
import com.dy.common.webListener.GenerateIdSetSuffixListener;
import jakarta.servlet.ServletContextListener;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @author ZhuBaoMin
 * @date 2025/05/07 16:02
 * @LastEditTime 2025/05/07 16:02
 * @Description
 */
@Configuration
public class WebListenerConfiguration {
    /**
     * å¯åŠ¨é¡ºåº
     */
    private static final int order_idSetSuffix = 1 ;
    /**
     * å†…部提供listener,该listener在系统启动时,根据配置 è®¾ç½®ID产生器的后缀
     * @return æ³¨å†ŒBean
     */
    @Bean
    public ServletListenerRegistrationBean<? extends ServletContextListener> regSsoListener() {
        ServletListenerRegistrationBean<GenerateIdSetSuffixListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>();
        listenerRegistrationBean.setListener(new GenerateIdSetSuffixListener());
        listenerRegistrationBean.setOrder(order_idSetSuffix);
        return listenerRegistrationBean;
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application(121·þÎñÆ÷).yml
New file
@@ -0,0 +1,4 @@
spring:
    profiles:
        #121服务器:common-web, global, database, database-mq, database-yq, database-hlj, database-gz, database-lz, database-jc, self
        include: common-web, global, database, database-mq, database-yq, database-hlj, database-gz, database-lz, database-jc, self
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application(233·þÎñÆ÷).yml
New file
@@ -0,0 +1,4 @@
spring:
    profiles:
        #233服务器:common-web, global, database, database-ym, database-sp, database-test,database-mj, self
        include: common-web, global, database, database-ym, database-sp, database-test,database-mj, self
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application-self.yml
New file
@@ -0,0 +1,19 @@
#actutor的web端口
management:
    server:
        port: ${pipIrr.terminal.actutorPort}
#web服务端口,tomcat默认是8090
server:
    port: ${pipIrr.terminal.webPort}
    servlet:
        context-path: /terminal #web访问上下文路径
        context-parameters:
            #GenerateIdSetSuffixListener中应用,取值范围是0-99
            idSuffix: ${pipIrr.terminal.idSuffix}
logging:
    level:
        com:
            dy:
                pipIrrGlobal:
                    daoSe: trace
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application.yml
New file
@@ -0,0 +1,3 @@
spring:
    profiles:
        include: common-web, global, database, database-ym, database-sp, database-test,database-mj, self
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/log4j2.yml
New file
@@ -0,0 +1,80 @@
Configuration:
    #status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出;可以设置成Off(关闭)或Error(只输出错误信息)
    status: Error
    Properties: # å®šä¹‰å…¨å±€å˜é‡
        Property:
            #日志文件存储的目录
            - name: log.path
              value: ./logs
            #日志文件存储名称
            - name: project.name
              value: pipIrrOperation
    #定义输出器,可以输出到控制台和文件.
    Appenders:
        #输出到控制台
        Console:
            #Appender命名
            name: CONSOLE
            target: SYSTEM_OUT
            ThresholdFilter:
                level: debug #输出日志级别,输出日志时,首先由Loggers.Root.level或Loggers.Logger.level判断是否输出,然后再由本level判断是否输出
                onMatch: ACCEPT #onMatch=ACCEPT å¤§äºŽç­‰äºŽ "level" é…ç½®çš„等级地日志输出
                onMismatch: DENY #onMismatch=DENY å°äºŽ "level" é…ç½®çš„等级地日志不输出
            #日志内容样式
            PatternLayout:
                #%n-换行
                #%m-日志内容,输出代码中指定的日志信息
                #%p-输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
                #%r-程序启动到现在的毫秒数
                #%%- è¾“出一个"%" å­—符
                #%t-当前线程名
                #%d-日期和时间, å¸¸ç”¨çš„æ ¼å¼æœ‰%d{DATE},%d{ABSOLUTE},%d{HH:mm:ss,SSS},%d{ddMMyyyyHH:mm:ss,SSS}
                #%l-同%F%L%C%M
                #%F-java源文件名
                #%L-java源码行数
                #%C-java类名,%C{1}输出最后一个元素
                #%M-java方法名
                pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%C.%M:%L) - %m%n"
        # è¾“出到文件,超过10MB归档
        RollingFile:
          - name: ROLLING_FILE
            ignoreExceptions: false
            fileName: ${log.path}/${project.name}.log
            filePattern: "${log.path}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
            ThresholdFilter:
              level: error #输出日志级别,输出日志时,首先由Loggers.Root.level或Loggers.Logger.level判断是否输出,然后再由本level判断是否输出
              onMatch: ACCEPT #onMatch=ACCEPT å¤§äºŽç­‰äºŽ "level" é…ç½®çš„等级地日志输出
              onMismatch: DENY #onMismatch=DENY å°äºŽ "level" é…ç½®çš„等级地日志不输出
            #日志内容样式
            PatternLayout:
              pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%C.%M:%L) - %m%n"
            Policies:
              # æ¯å¤©æ—¥å¿—文件按大小分子文件
              SizeBasedTriggeringPolicy:
                size: "1 MB"
            DefaultRolloverStrategy:
              max: 10  #一天内日志文件最大个数
              Delete:
                basePath: "${log.path}"
                maxDepth: 2 #删除日志文件的最大深度
                IfFileName:
                  glob: "${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
                IfLastModified:
                  age: "30d" #日志文件保留的最大天数
    Loggers:
        Root:
            level: info #日志输出级别,共有8个级别,按照从低到高为:all < trace < debug < info < warn < error < fatal < off
            AppenderRef: #Root的子节点,用来指定该日志输出到哪个Appender.
                - ref: CONSOLE #输出日志时,首先由本level判断是否输出,然后再由上面的Appenders.Console.ThresholdFilter.level判断是否输出
                - ref: ROLLING_FILE  #输出日志时,首先由本level判断是否输出,然后再由上面的Appenders.RollingFile.ThresholdFilter.level判断是否输出
        # ä¸ºåŒ…配置特殊的Log级别,方便调试,
        # ä¸å—Loggers.Root.level限制
        Logger:
            - name: org.apache.dubbo
              additivity: false #去除重复的log
              level: error #输出日志级别
              AppenderRef:
                - ref: CONSOLE #输出日志时,首先由本.level判断是否输出,然后再由上面的Appenders.Console.ThresholdFilter.level判断是否输出
                - ref: ROLLING_FILE #输出日志时,首先由本level判断是否输出,然后再由上面的Appenders.RollingFile.ThresholdFilter.level判断是否输出
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/test/java/com/dy/pipIrrTerminal/PipIrrWebTerminalApplicationTests.java
New file
@@ -0,0 +1,13 @@
package com.dy.pipIrrTerminal;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class PipIrrWebTerminalApplicationTests {
    @Test
    void contextLoads() {
    }
}
pipIrr-platform/pipIrr-web/pom.xml
@@ -33,6 +33,7 @@
        <module>pipIrr-web-operation</module>
        <module>pipIrr-web-file</module>
        <module>pipIrr-web-temp</module>
        <module>pipIrr-web-terminal</module>
    </modules>
    <dependencies>