liurunyu
2024-10-12 708dce320caedf9973ff0282098fb70dafd6702e
Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV
1个文件已添加
17个文件已修改
874 ■■■■ 已修改文件
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientCardMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeRechargeHistoryMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeCardOperate.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeRechargeHistory.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTransactionStatistics.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/init-config.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeGeneralMapper.xml 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeRechargeHistoryMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/CardOperateCtrl.java 189 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/CardOperateSv.java 227 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/dto/CallBack.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/dto/DtoCancel.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/clientCard/CardStateENUM.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/clientCard/ClientCardCtrl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/general/GeneralSv.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java
@@ -6,6 +6,7 @@
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;
import java.util.Map;
@@ -224,4 +225,19 @@
     * @return
     */
    List<VoClientRechargeTotal> getRechargeTotalGtValueClients(Map<String, Object> params);
    /**
     * 依据水卡ID将最后一条无效状态的指定操作记录改为有效
     * @param cardId
     * @return
     */
    Integer turnOperateValidByCardId(@Param("cardId") Long cardId, @Param("operateType") Integer operateType);
    /**
     * 根据水卡ID、操作类型获取获取最后一条记录,判断开卡是否同步充值使用
     * @param cardId
     * @return
     */
    SeCardOperate getCardOperate(@Param("operateType") Integer operateType, @Param("cardId") Long cardId);
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientCardMapper.java
@@ -37,6 +37,7 @@
    /**
     * 依据水卡地址获取水卡编号(12月19日废弃)
     * 2024-06-30取消废弃,恢复使用
     * @param cardAddr
     * @return
     */
@@ -141,7 +142,7 @@
    List<VoCards> getUnreplaced(Map<?, ?> params);
    /**
     * 根据指定水卡编号获取挂失事记录数量(补卡、解锁使用)
     * 根据指定水卡编号获取挂失记录数量(补卡、解锁使用)
     * @param cardNum
     * @return
     */
@@ -191,7 +192,7 @@
    Double getTotalMoneyIcCards();
    /**
     * 根据水卡地址获取水卡数量,用来判断该卡是否允许开卡
     * 根据水卡地址获取水卡数量,用来判断该卡是否允许开卡,无效卡片排除在外
     * @param cardAddr
     * @return
     */
@@ -234,4 +235,20 @@
     * @return
     */
    Float getTotalConsumption(@Param("timeStart")String timeStart, @Param("timeStop")String timeStop);
    /**
     * 依据水卡地址将最后一条无效状态的指定操作记录改为有效
     * @param cardAddr
     * @param operateType
     * @return
     */
    Integer turnCardValidByAddr(@Param("cardAddr")String cardAddr, @Param("operateType")Integer operateType);
    /**
     * 根据水卡ID获取原水卡ID,补卡通知中使用
     * @param cardId
     * @return
     */
    Long getOriginalCardIdByCardId(@Param("cardId") Long cardId);
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeRechargeHistoryMapper.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dy.pipIrrGlobal.pojoSe.SeRechargeHistory;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * @author ZhuBaoMin
@@ -24,4 +25,11 @@
    int updateByPrimaryKeySelective(SeRechargeHistory record);
    int updateByPrimaryKey(SeRechargeHistory record);
    /**
     * 依据水卡ID将最后一条无效状态的充值历史记录改为有效
     * @param cardId
     * @return
     */
    Integer turnRechargeHistoryValidByCardId(@Param("cardId") Long cardId);
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeCardOperate.java
@@ -142,4 +142,10 @@
     */
    @Schema(description = "操作时间", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    private Date operateDt;
    /**
     * 操作是否有效
     */
    @Length(message = "操作有效性不大于{max},不小于{min}", min = 1, max = 2)
    private Byte operateValid;
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeRechargeHistory.java
@@ -125,4 +125,10 @@
    @Schema(description = "操作时间", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    private Date operatedt;
    /**
     * 操作是否有效
     */
    @Length(message = "操作有效性不大于{max},不小于{min}", min = 1, max = 2)
    private Byte operateValid;
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTransactionStatistics.java
@@ -1,39 +1,54 @@
package com.dy.pipIrrGlobal.voSe;
import com.alibaba.fastjson2.annotation.JSONField;
import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
import com.dy.common.po.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
 * @author ZhuBaoMin
 * @date 2024-01-22 18:27
 * @LastEditTime 2024-01-22 18:27
 * @Description
 * @Description 交易记录汇总视图对象
 */
@Data
@Schema(title = "交易记录汇总视图对象")
public class VoTransactionStatistics implements BaseEntity {
    private static final long serialVersionUID = 202401241705001L;
    @Schema(title = "业务类型")
    /**
     * 业务类型
     */
    private String operateType;
    @Schema(title = "交易日期")
    /**
     * 交易日期
     */
    private String tradeDate;
    @Schema(title = "交易笔数")
    /**
     * 交易笔数
     */
    private Integer count;
    @Schema(title = "实收金额")
    /**
     * 实收金额
     */
    private Float received;
    @Schema(title = "赠送金额")
    /**
     * 赠送金额
     */
    private Float gift;
    @Schema(title = "返还金额")
    /**
     * 返还金额
     */
    private Float refundAmount;
    @Schema(title = "收银员ID")
    private String cashierId;
    /**
     * 收银员ID
     */
    @JSONField(serializeUsing= ObjectWriterImplToString.class)
    private Long cashierId;
}
pipIrr-platform/pipIrr-global/src/main/resources/init-config.xml
@@ -27,6 +27,7 @@
            <settings>
                <item1 item_name="lng" item_value="101.89878161146011" remarks="经度"/>
                <item2 item_name="lat" item_value="25.673963608371185" remarks="纬度"/>
                <item3 item_name="projectName" item_value="管灌系统及高效智慧微灌云服务管理平台软件系统" remarks="项目名称"/>
            </settings>
            <waterTypes>
                <item1 typeName="灌溉用水"/>
@@ -73,6 +74,7 @@
            <settings>
                <item1 item_name="lng" item_value="101.87345" remarks="经度"/>
                <item2 item_name="lat" item_value="25.70424" remarks="纬度"/>
                <item3 item_name="projectName" item_value="管灌系统及高效智慧微灌云服务管理平台软件系统" remarks="项目名称"/>
            </settings>
            <waterTypes>
                <item1 typeName="灌溉用水"/>
@@ -119,6 +121,7 @@
            <settings>
                <item1 item_name="lng" item_value="101.87345" remarks="经度"/>
                <item2 item_name="lat" item_value="25.70424" remarks="纬度"/>
                <item3 item_name="projectName" item_value="管灌系统及高效智慧微灌云服务管理平台软件系统" remarks="项目名称"/>
            </settings>
            <waterTypes>
                <item1 typeName="灌溉用水"/>
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml
@@ -20,11 +20,12 @@
    <result column="remarks" jdbcType="VARCHAR" property="remarks" />
    <result column="operator" jdbcType="BIGINT" property="operator" />
    <result column="operate_dt" jdbcType="TIMESTAMP" property="operateDt" />
    <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
    refund_amount, no_trade_amount, operate_type, payment_id, remarks, `operator`, operate_dt, operate_valid
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
    <!--@mbg.generated-->
@@ -45,13 +46,13 @@
      price, card_cost, gift, 
      refund_amount, no_trade_amount, operate_type, 
      payment_id, remarks, `operator`, 
      operate_dt)
      operate_dt, 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})
      #{operateDt,jdbcType=TIMESTAMP}, #{operateValid,jdbcType=TINYINT})
  </insert>
  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoSe.SeCardOperate">
    <!--@mbg.generated-->
@@ -105,6 +106,9 @@
      <if test="operateDt != null">
        operate_dt,
      </if>
      <if test="operateValid != null">
        operate_valid,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
@@ -154,6 +158,9 @@
      </if>
      <if test="operateDt != null">
        #{operateDt,jdbcType=TIMESTAMP},
      </if>
      <if test="operateValid != null">
        #{operateValid,jdbcType=TINYINT},
      </if>
    </trim>
  </insert>
@@ -206,6 +213,9 @@
      <if test="operateDt != null">
        operate_dt = #{operateDt,jdbcType=TIMESTAMP},
      </if>
      <if test="operateValid != null">
        operate_valid = #{operateValid,jdbcType=TINYINT},
      </if>
    </set>
    where id = #{id,jdbcType=BIGINT}
  </update>
@@ -226,7 +236,8 @@
      payment_id = #{paymentId,jdbcType=BIGINT},
      remarks = #{remarks,jdbcType=VARCHAR},
      `operator` = #{operator,jdbcType=BIGINT},
      operate_dt = #{operateDt,jdbcType=TIMESTAMP}
      operate_dt = #{operateDt,jdbcType=TIMESTAMP},
      operate_valid = #{operateValid,jdbcType=TINYINT}
    where id = #{id,jdbcType=BIGINT}
  </update>
@@ -235,12 +246,13 @@
    select
        COUNT(*) AS recordCount
    FROM se_card_operate ope
    INNER JOIN se_client_card card ON ope.card_id = card.id
    INNER JOIN se_client cli ON ope.client_id = cli.id
    INNER 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)
      AND ope.operate_valid = 2
      <if test = "clientName != null and clientName !=''">
        AND cli.name like CONCAT('%',#{clientName},'%')
      </if>
@@ -291,13 +303,14 @@
      END) AS operateType,
      ope.operate_dt
    FROM se_card_operate ope
    INNER JOIN se_client_card card ON ope.card_id = card.id
    INNER 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
    LEFT JOIN ba_district dis ON dis.id = cli.villageId
    INNER JOIN ba_user us ON ope.operator = us.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)
      AND ope.operate_valid = 2
      <if test = "clientName != null and clientName !=''">
        AND cli.name like CONCAT('%',#{clientName},'%')
      </if>
@@ -329,7 +342,7 @@
        INNER JOIN ba_user us ON ope.operator = us.id
    <where>
      AND ope.operate_type IN(1,2,3,5)
      AND ope.operate_valid = 2
      <if test = "villageId != null and villageId > 0">
        AND cli.villageId = #{villageId}
      </if>
@@ -364,7 +377,6 @@
        IFNULL(ope.card_cost,0.00) AS cardCost,
        IFNULL(ope.gift,0.00) AS gift,
        IFNULL(ope.refund_amount,0.00) AS refundAmount,
        <!--ope.money,-->
        (IFNULL(ope.money, 0) + IFNULL(ope.trade_amount, 0) + IFNULL(ope.gift, 0)) AS money,
        pay.name AS paymentName,
        ope.operate_dt as tradeTime,
@@ -384,7 +396,7 @@
        LEFT JOIN ba_user us ON ope.operator = us.id
    <where>
      AND ope.operate_type IN(1,2,3,5)
      AND ope.operate_valid = 2
      <if test = "villageId != null and villageId > 0">
        AND cli.villageId = #{villageId}
      </if>
@@ -410,10 +422,12 @@
    select
    COUNT(*) AS recordCount
    FROM se_card_operate ope
    INNER JOIN se_client_card card ON ope.card_id = card.id
    INNER 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
        LEFT JOIN se_payment_method pay ON pay.id = ope.payment_id
    <where>
      AND ope.operate_type = 1
      AND ope.operate_valid = 2
      <if test = "clientName != null and clientName !=''">
        AND cli.name like CONCAT('%',#{clientName},'%')
      </if>
@@ -450,11 +464,12 @@
        (SELECT `name` FROM ba_user WHERE id =  ope.operator) AS operator,
        ope.operate_dt AS operateDt
    FROM se_card_operate ope
        INNER JOIN se_client_card card ON ope.card_id = card.id
        INNER JOIN se_client cli ON ope.client_id = cli.id
        INNER 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
      <if test = "clientName != null and clientName !=''">
        AND cli.name like CONCAT('%',#{clientName},'%')
      </if>
@@ -484,10 +499,11 @@
    select
    COUNT(*) AS recordCount
    FROM se_card_operate ope
    INNER JOIN se_client_card card ON ope.card_id = card.id
    INNER 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
      <if test = "clientName != null and clientName !=''">
        AND cli.name like CONCAT('%',#{clientName},'%')
      </if>
@@ -514,10 +530,11 @@
    (SELECT `name` FROM ba_user WHERE id =  ope.operator) AS operator,
    ope.operate_dt AS operateDt
    FROM se_card_operate ope
    INNER JOIN se_client_card card ON ope.card_id = card.id
    INNER 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
      <if test = "clientName != null and clientName !=''">
        AND cli.name like CONCAT('%',#{clientName},'%')
      </if>
@@ -543,10 +560,11 @@
    select
        COUNT(*) AS recordCount
    FROM se_card_operate ope
        INNER JOIN se_client cli ON ope.client_id = cli.id
        INNER JOIN se_client_card card ON ope.card_id = card.id
        INNER 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">
        AND ope.operate_type = #{operateType}
      </if>
@@ -580,10 +598,11 @@
        card.money,
        IFNULL(ope.system_balance,0) AS systemBalance
    FROM se_card_operate ope
        INNER JOIN se_client cli ON ope.client_id = cli.id
        INNER JOIN se_client_card card ON ope.card_id = card.id
        INNER 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">
        AND ope.operate_type = #{operateType}
      </if>
@@ -613,14 +632,15 @@
    SELECT
    COUNT(*) AS recordCount
    FROM se_card_operate ope
    INNER JOIN se_client cli ON ope.client_id = cli.id
    INNER JOIN se_client_card card ON ope.card_id = card.id
    INNER JOIN se_payment_method pay ON ope.payment_id = pay.id
    INNER JOIN ba_user us ON ope.operator = us.id
    INNER JOIN ba_district vil ON cli.villageId = vil.id
    INNER 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
      <if test = "operateId != null and operateId > 0">
        AND ope.id = #{operateId}
      </if>
@@ -668,14 +688,15 @@
        ope.operator AS cashierId,
        NOW() AS currentTime
    FROM se_card_operate ope
    INNER JOIN se_client cli ON ope.client_id = cli.id
    INNER JOIN se_client_card card ON ope.card_id = card.id
    INNER JOIN se_payment_method pay ON ope.payment_id = pay.id
    INNER JOIN ba_user us ON ope.operator = us.id
    INNER JOIN ba_district vil ON cli.villageId = vil.id
    INNER 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
      <if test = "operateId != null and operateId > 0">
        AND ope.id = #{operateId}
      </if>
@@ -717,6 +738,7 @@
    LEFT JOIN ba_district tow ON cli.townId = tow.id
    <where>
      AND ope.operate_type IN(1,2)
      AND ope.operate_valid = 2
      <if test = "operateId != null and operateId > 0">
        AND ope.id = #{operateId}
      </if>
@@ -751,7 +773,7 @@
    FROM
    `se_card_operate`
    WHERE
    operate_dt BETWEEN #{timeStart} AND #{timeStop} AND operate_type = 1
    operate_dt BETWEEN #{timeStart} AND #{timeStop} AND operate_type = 1 AND operate_valid = 2
  </select>
  <!--指定时间段内挂失总数量(物理卡)-->
  <select id="getLossCountIcCardsCount" resultType="java.lang.Long">
@@ -760,7 +782,7 @@
    FROM
    `se_card_operate`
    WHERE
    operate_dt BETWEEN #{timeStart} AND #{timeStop} AND operate_type = 6
    operate_dt BETWEEN #{timeStart} AND #{timeStop} AND operate_type = 6 AND operate_valid = 2
  </select>
  <!--指定时间段内充值总数量(物理卡)-->
  <select id="getRechargeCountIcCardsCount" resultType="java.lang.Long">
@@ -769,7 +791,7 @@
    FROM
    `se_card_operate`
    WHERE
    operate_dt BETWEEN #{timeStart} AND #{timeStop} AND operate_type = 2
    operate_dt BETWEEN #{timeStart} AND #{timeStop} AND operate_type = 2 AND operate_valid = 2
  </select>
  <!--指定时间段内开物理卡农户数量-->
  <select id="getOpenIcCardClientsCount" resultType="java.lang.Long">
@@ -789,7 +811,7 @@
    `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
    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>
  <!--指定时间段内开物理卡农户-->
@@ -806,7 +828,7 @@
      `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
      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 " >
@@ -833,7 +855,7 @@
    `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
    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) c
  </select>
  <!--指定时间段内每个农户充值合计-->
@@ -850,7 +872,7 @@
      `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
      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 " >
@@ -877,7 +899,7 @@
    `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
    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) > #{value}) c
  </select>
@@ -895,7 +917,7 @@
      `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
      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
@@ -910,11 +932,12 @@
  <select id="getRechargesCountNew" 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_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
        INNER JOIN ba_user us ON us.id = rch.operator
        LEFT JOIN ba_user us ON us.id = rch.operator
    <where>
      AND rch.operate_valid = 2
      <if test = "clientName != null and clientName !=''">
        AND cli.name like CONCAT('%',#{clientName},'%')
      </if>
@@ -942,11 +965,12 @@
        us.name AS operator,
        rch.operateDt AS operateTime
    FROM se_client_card card
        INNER JOIN se_client cli ON cli.id = card.clientId
        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
        INNER JOIN ba_user us ON us.id = rch.operator
        LEFT JOIN ba_user us ON us.id = rch.operator
    <where>
      AND rch.operate_valid = 2
      <if test = "clientName != null and clientName !=''">
        AND cli.name like CONCAT('%',#{clientName},'%')
      </if>
@@ -976,6 +1000,7 @@
        INNER JOIN ba_user us ON us.id = ope.operator
    <where>
      AND ope.operate_type = 5
      AND ope.operate_valid = 2
      <if test = "clientName != null and clientName !=''">
        AND cli.name like CONCAT('%',#{clientName},'%')
      </if>
@@ -1006,6 +1031,7 @@
        INNER JOIN ba_user us ON us.id = ope.operator
    <where>
      AND ope.operate_type = 5
      AND ope.operate_valid = 2
      <if test = "clientName != null and clientName !=''">
        AND cli.name like CONCAT('%',#{clientName},'%')
      </if>
@@ -1025,4 +1051,25 @@
      </if>
    </trim>
  </select>
  <!--根据水卡ID、操作类型获取获取最后一条记录,判断开卡是否同步充值使用-->
  <update id="turnOperateValidByCardId">
    UPDATE se_card_operate
        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
    );
  </update>
  <!--根据操作类型、水卡ID获取获取最后一条记录-->
  <select id="getCardOperate" resultType="com.dy.pipIrrGlobal.pojoSe.SeCardOperate">
    SELECT * FROM se_card_operate
    WHERE operate_type = #{operateType} AND card_id = #{cardId} ORDER BY operate_dt DESC LIMIT 1
  </select>
</mapper>
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml
@@ -61,10 +61,13 @@
    </delete>
    <!--依据水卡地址获取水卡编号(12月19日废弃)-->
    <!--2024-06-30取消废弃,恢复使用-->
    <select id="getCardIdByAddr" resultType="java.lang.Long">
        SELECT id AS cardId
        FROM se_client_card
        WHERE cardAddr = #{cardAddr}
        ORDER BY id DESC
        LIMIT 1
    </select>
    <!--根据水卡编号获取水卡表主键(12月19日添加后废弃)-->
@@ -356,7 +359,7 @@
                         END)     AS state
              FROM se_client_card card
                       INNER JOIN se_client cli ON cli.id = card.clientId
              WHERE card.clientId = #{clientId,jdbcType=BIGINT}
              WHERE state != 4 AND card.clientId = #{clientId,jdbcType=BIGINT}
              UNION ALL
              SELECT '虚拟卡'     AS cardType,
                     vc.vc_num AS cardNum,
@@ -368,25 +371,43 @@
              FROM se_virtual_card vc
                       INNER JOIN se_client cli ON cli.id = vc.client_id
              WHERE vc.client_id = #{clientId,jdbcType=BIGINT}
        <!--              SELECT '虚拟卡'              AS cardType,-->
        <!--                     virtualCard.vc_num AS CardNum,-->
        <!--                     virtualCard.money  AS vcMoney,-->
        <!--                     (CASE-->
        <!--                          WHEN virtualCard.in_use = 0 THEN '未使用'-->
        <!--                          WHEN virtualCard.in_use = 1 THEN '使用中'-->
        <!--                         END)           AS State-->
        <!--              FROM se_client client-->
        <!--                       LEFT JOIN se_virtual_card virtualCard ON client.id = virtualCard.client_id-->
        <!--              WHERE client.id = #{clientId,jdbcType=BIGINT}-->
        ) card
        ORDER BY card.Money DESC, card.State DESC
    </select>
    <!--根据水卡编号获取操作记录列表-->
    <select id="getOperateRecordsByCardNum" resultType="java.util.HashMap">
        SELECT *
        FROM v_operate
        WHERE cardNum = #{cardNum,jdbcType=BIGINT}
        SELECT
            ope.id AS orderNumber,
            cli.villageId,
            cli.districtTitle,
            cli.clientNum,
            cli.`name`,
            card.cardNum,
            cli.idCard,
            cli.phone,
            IFNULL(ope.money,0) AS money,
            IFNULL(ope.gift,0) AS gift,
            IFNULL(ope.card_cost,0) AS cardCost,
            IFNULL((ope.money + ope.trade_amount + ope.gift),0) AS afterRecharge,
            ope.payment_id AS paymentId,
            pay.name AS paymentMethod,
            CASE
            WHEN ope.operate_type = 1 THEN '开卡'
            WHEN ope.operate_type = 2 THEN '充值'
            WHEN ope.operate_type = 3 THEN '销卡'
            END AS operateType,
            ope.operate_dt AS operateDt,
            user.name AS operatorName
        FROM se_card_operate ope
            LEFT JOIN se_client cli ON cli.id = ope.client_id
            LEFT JOIN se_client_card card ON card.id = ope.card_id
            LEFT JOIN se_payment_method pay ON pay.id = ope.payment_id
            LEFT JOIN ba_user user ON user.id = ope.operator
        WHERE ope.operate_valid = 2 AND ope.operate_type in (1,2,3) AND cardNum = #{cardNum,jdbcType=BIGINT}
<!--        SELECT *-->
<!--        FROM v_operate-->
<!--        WHERE cardNum = #{cardNum,jdbcType=BIGINT}-->
    </select>
    <!--根据水卡编号获取余额-->
@@ -423,6 +444,7 @@
                    WHEN state = 1 THEN '正常'
                    WHEN state = 2 THEN '已注销'
                    WHEN state = 3 THEN '已挂失'
                    WHEN state = 4 THEN '无效卡片'
            END) AS stateName
        FROM se_client_card
        WHERE cardNum = #{cardNum,jdbcType=BIGINT}
@@ -454,18 +476,9 @@
        SELECT cli.clientNum,
               cli.name AS clientName,
               cardNum,
        <!--        CASE-->
        <!--            WHEN card.cardNum LIKE '10%' THEN CONCAT(SUBSTRING(card.cardNum, 7, 6),SUBSTRING(card.cardNum, 14, 4))-->
        <!--            ELSE card.cardNum-->
        <!--        END AS cardNum,-->
        cli.phone,
        cli.idCard,
        card.state AS cardState,
        <!--        (CASE-->
        <!--            WHEN card.state = 1 THEN '正常'-->
        <!--            WHEN card.state = 2 THEN '已注销'-->
        <!--            WHEN card.state = 3 THEN '已挂失'-->
        <!--        End) AS stateName,-->
        '正常'                  AS stateName,
        '农户卡'                 AS cardType,
        FORMAT(card.money, 2) AS money
@@ -504,13 +517,10 @@
    <!--获取已挂失未补卡的记录-->
    <select id="getUnreplaced" resultType="com.dy.pipIrrGlobal.voSe.VoCards">
        SELECT cli.clientNum,
        SELECT
            cli.clientNum,
               cli.name AS clientName,
               cardNum,
        <!--        CASE-->
        <!--          WHEN card.cardNum LIKE '10%' THEN CONCAT(SUBSTRING(card.cardNum, 7, 6),SUBSTRING(card.cardNum, 14, 4))-->
        <!--          ELSE card.cardNum-->
        <!--        END AS cardNum,-->
        cli.phone,
        cli.idCard,
        card.state            AS cardState,
@@ -529,7 +539,7 @@
        </trim>
    </select>
    <!--根据指定水卡编号获取挂失事记录数量(补卡、解锁使用)-->
    <!--根据指定水卡编号获取挂失记录数量(补卡、解锁使用)-->
    <select id="getLostCount" resultType="java.lang.Integer">
        SELECT COUNT(*) AS recordCount
        FROM se_client_card card
@@ -586,7 +596,7 @@
               '农户卡'                 AS cardType,
               FORMAT(card.money, 2) AS money
        FROM se_client_card card
                 INNER JOIN se_client cli ON card.clientId = cli.id
            LEFT JOIN se_client cli ON card.clientId = cli.id
        <where>
            card.state = 1
            <if test="clientName != null and clientName != ''">
@@ -636,11 +646,11 @@
        WHERE state = 1
    </select>
    <!--根据水卡地址获取水卡数量-->
    <!--根据水卡地址获取水卡数量,无效卡片排除在外-->
    <select id="getCountByCardAddr" resultType="java.lang.Long">
        SELECT COUNT(*) AS recordCount
        FROM se_client_card
        WHERE cardAddr = #{cardAddr}
        WHERE cardAddr = #{cardAddr} AND se_client_card.state != 4
    </select>
    <!--根据水卡地址获取指定状态的水卡数量-->
@@ -722,4 +732,23 @@
        FROM rm_open_close_valve_history
        WHERE cl_dt BETWEEN #{timeStart} AND #{timeStop}
    </select>
    <!--依据水卡地址将最后一条无效状态的指定操作记录改为有效-->
    <update id="turnCardValidByAddr">
        UPDATE se_client_card
        SET state = 1
        WHERE id = (
            SELECT id FROM (
                SELECT id
                FROM se_client_card
                WHERE state = 4 AND cardAddr = #{cardAddr} AND lastOper  = #{operateType}
                ORDER BY id DESC
                LIMIT 1) AS subquery
        );
    </update>
    <!--根据水卡ID获取原水卡ID,补卡通知中使用-->
    <select id="getOriginalCardIdByCardId" resultType="java.lang.Long">
        SELECT original_card_id AS originalCardId FROM se_client_card WHERE id = #{cardId};
    </select>
</mapper>
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeGeneralMapper.xml
@@ -253,6 +253,7 @@
    SUM(ope.trade_amount) AS tradeAmount
    FROM se_card_operate ope
    <where>
      AND ope.operate_valid = 2
      <if test = "tradeDate != null and tradeDate !=''">
        AND Date(ope.operate_dt) = #{tradeDate}
      </if>
@@ -265,7 +266,7 @@
        AND ope.operator = #{cashierId}
      </if>
    </where>
    GROUP BY ope.payment_id,  Date(ope.operate_dt)
<!--    GROUP BY ope.payment_id,  Date(ope.operate_dt)-->
  </select>
  <!--  财务对账审核页,收银员+日期分组,排除交易类型分组,记录数-->
@@ -286,17 +287,46 @@
  <!--开卡系统交易统计,收银员+日期+类型分组-->
  <select id="getSummaries" resultType="com.dy.pipIrrGlobal.voSe.VoTransactionStatistics">
    SELECT * FROM v_trade_summary
    SELECT
        CASE
            WHEN ope.operate_type = 1 THEN '开卡'
            WHEN ope.operate_type = 2 THEN '充值'
            WHEN ope.operate_type = 3 THEN '销卡'
            WHEN ope.operate_type = 4 THEN '补卡'
            WHEN ope.operate_type = 5 THEN '返还'
        END AS operateType,
        Date(ope.operate_dt) AS tradeDate,
        COUNT(*) AS count,
        (IFNULL(SUM(ope.trade_amount), 0) + IFNULL(SUM(ope.card_cost), 0)) AS received,
        IFNULL(SUM(ope.gift), 0) AS gift,
        IFNULL(sum(ope.refund_amount),0) AS refundAmount,
        us.id AS cashierId
    FROM se_card_operate ope
        INNER JOIN ba_user us ON us.id = ope.operator
    <where>
      AND ope.operate_type IN(1,2,3,4,5)
      <if test = "cashierId != null and cashierId > 0">
        AND cashierId = #{cashierId}
        AND us.id = #{cashierId}
      </if>
      <if test = "timeStart != null and timeStop != null">
        AND Date(tradeDate) BETWEEN #{timeStart} AND #{timeStop}
        AND Date(ope.operate_dt) BETWEEN #{timeStart} AND #{timeStop}
      </if>
    </where>
    GROUP BY ope.operate_type,  Date(ope.operate_dt), us.id
    ORDER BY tradeDate
<!--    SELECT * FROM v_trade_summary-->
<!--    <where>-->
<!--      <if test = "cashierId != null and cashierId > 0">-->
<!--        AND cashierId = #{cashierId}-->
<!--      </if>-->
<!--      <if test = "timeStart != null and timeStop != null">-->
<!--        AND Date(tradeDate) BETWEEN #{timeStart} AND #{timeStop}-->
<!--      </if>-->
<!--    </where>-->
<!--    ORDER BY tradeDate-->
  </select>
  <!--  根据收银员ID及日期获取财务对账_交易明细记录数-->
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeRechargeHistoryMapper.xml
@@ -177,4 +177,18 @@
      operateDt = #{operatedt,jdbcType=TIMESTAMP}
    where id = #{id,jdbcType=BIGINT}
  </update>
  <!--依据水卡ID将最后一条无效状态的充值历史记录改为有效-->
  <update id="turnRechargeHistoryValidByCardId">
    UPDATE se_recharge_history
        SET operate_valid = 2
    WHERE id = (
        SELECT id FROM (
            SELECT id
            FROM se_recharge_history
            WHERE operate_valid = 1 AND cardId = #{cardId}
            ORDER BY id DESC
        LIMIT 1) AS subquery
    );
  </update>
</mapper>
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/CardOperateCtrl.java
@@ -59,8 +59,10 @@
    @Value("${project.projectNo}")
    private Integer projectNo;
    /**
     * 开卡
     *
     * @param po 开卡传入对象
     * @param bindingResult
     * @return 水卡编号
@@ -79,7 +81,6 @@
        }
        Long clientId = po.getClientId();
        // 获取5级行政区划串areaCode
        Long areaCodeL = cardOperateSv.getAreaCodeById(clientId);
        if(areaCodeL == null) {
@@ -135,19 +136,18 @@
        seClientCard.setCardnum(cardNum);
        seClientCard.setClientid(clientId);
        seClientCard.setMoney(amount);
        seClientCard.setState(CardStateENUM.NORMAL.getCode());
        // 开卡时卡片状态为无效
        seClientCard.setState(CardStateENUM.INVALID.getCode());
        if(originalCardId != null) {
            // 补卡
            seClientCard.setOriginalCardId(originalCardId);
        }
        seClientCard.setCreatedt(activeTime);
        //if(cardCost == 0) {
        //    // 换卡
        //    seClientCard.setLastoper(LastOperateENUM.CHANGE_CARD.getCode());
        //}else {
        //    // 开卡
        //    seClientCard.setLastoper(LastOperateENUM.ACTIVE.getCode());
        //}
            seClientCard.setLastoper(LastOperateENUM.REPLACE.getCode());
            seClientCard.setReplacedt(activeTime);
        } else {
            // 开新卡
        seClientCard.setLastoper(LastOperateENUM.ACTIVE.getCode());
            seClientCard.setCreatedt(activeTime);
        }
        Long cardId = Optional.ofNullable(clientCardSv.add(seClientCard)).orElse(0L) ;
        if(cardId == 0) {
            return BaseResponseUtils.buildErrorMsg(SellResultCode.ACTIVE_FAIL_WRITE_CLIENT_CARD_ERROR.getMessage());
@@ -165,18 +165,15 @@
        if(originalCardId != null) {
            // 补卡
            seCardOperate.setOperateType(OperateTypeENUM.REISSUE.getCode());
            seCardOperate.setNoTradeAmount(amount);
        }else {
            // 开新卡或换卡
            //if(cardCost > 0) {
            //    seCardOperate.setOperateType(OperateTypeENUM.ACTIVE.getCode());
            //}else {
            //    seCardOperate.setOperateType(OperateTypeENUM.CHANGE_CARD.getCode());
            //}
            // 开新卡
            seCardOperate.setOperateType(OperateTypeENUM.ACTIVE.getCode());
        }
        seCardOperate.setRemarks(remarks);
        seCardOperate.setOperator(operator);
        seCardOperate.setOperateDt(activeTime);
        seCardOperate.setOperateValid((byte) 1);
        Long rec = Optional.ofNullable(cardOperateSv.add(seCardOperate)).orElse(0L);
        if(rec == 0) {
            return BaseResponseUtils.buildErrorMsg(SellResultCode.ACTIVE_FAIL_WRITE_ACTIVE_CARD_ERROR.getMessage());
@@ -203,7 +200,6 @@
        }
        Map map = new HashMap();
//        map.put("projectNo", String.format("%02x", Integer.parseInt(cardOperateSv.getProjectNo())));
        map.put("projectNo", String.format("%02x", projectNo));
        map.put("orderNumber", rec);
        map.put("cardNum", cardNum);
@@ -212,6 +208,7 @@
    /**
     * 补卡
     *
     * @param po
     * @param bindingResult
     * @return
@@ -276,13 +273,14 @@
        /**
         * 如果是补卡调用的开卡且转移了退还金额,需修改挂失卡余额为0
         */
         * 通知补卡成功时再处理
        if(reissueAmount != null) {
            SeClientCard seClientCard = new SeClientCard();
            seClientCard.setId(cardId);
            seClientCard.setMoney(0f);
            cardOperateSv.updateClientCard(seClientCard);
        }
         */
        /**
         * 添加开卡记录,退还金额冲到新卡中
@@ -318,6 +316,7 @@
    /**
     * 充值
     *
     * @param po 充值传输对象
     * @param bindingResult
     * @return
@@ -334,6 +333,7 @@
    /**
     * 销卡
     *
     * @param po
     * @param bindingResult
     * @return
@@ -360,7 +360,7 @@
        Long clientId = 0L;
        Long cardNum = po.getCardNum();
        Float refund = po.getRefund();
        Byte refundType = po.getRefundType();
        Long refundType = po.getRefundType();
        String remarks = po.getRemarks();
        Long operator = po.getOperator();
        Date cancelTime = new Date();
@@ -382,10 +382,10 @@
        clientId = Long.parseLong(map.get("clientId").toString());
        /**
         * 修改农户卡信息:
         * 修改农户卡信息,通知时再处理
         *      注销时间
         *      最后操作类型-4
         */
        SeClientCard seClientCard = new SeClientCard();
        seClientCard.setId(cardId);
        seClientCard.setCanceldt(cancelTime);
@@ -396,6 +396,7 @@
        if(rec_updateClientCard == 0) {
            return BaseResponseUtils.buildErrorMsg(SellResultCode.CANCEL_FAIL_WRITE_CLIENT_CARD_ERROR.getMessage());
        }
         */
        /**
         * 添加注销操作记录
@@ -405,11 +406,12 @@
        seCardOperate.setCardId(cardId);
        seCardOperate.setClientId(clientId);
        seCardOperate.setTradeAmount(-refund);
        seCardOperate.setPaymentId(1L);
        seCardOperate.setPaymentId(refundType);
        seCardOperate.setOperateType(OperateTypeENUM.CANCEL.getCode());
        seCardOperate.setRemarks(remarks);
        seCardOperate.setOperator(operator);
        seCardOperate.setOperateDt(cancelTime);
        seCardOperate.setOperateValid((byte) 1);
        Long rec = Optional.ofNullable(cardOperateSv.add(seCardOperate)).orElse(0L);
        if(rec == 0) {
@@ -424,7 +426,8 @@
    }
    /**
     * 挂失
     * 挂失,不需要二次通知
     *
     * @param po
     * @param bindingResult
     * @return
@@ -479,6 +482,7 @@
         *  状态
         *  最后操作类型-6
         */
        SeClientCard seClientCard = new SeClientCard();
        seClientCard.setId(cardId);
        seClientCard.setMoney(money);
@@ -489,6 +493,7 @@
        if(rec_updateClientCard == 0) {
            return BaseResponseUtils.buildErrorMsg(SellResultCode.LOSS_FAIL_WRITE_CLIENT_CARD_ERROR.getMessage());
        }
        /**
         * 添加挂失记录
@@ -504,6 +509,7 @@
        seCardOperate.setRemarks(remarks);
        seCardOperate.setOperator(operator);
        seCardOperate.setOperateDt(lossTime);
        seCardOperate.setOperateValid((byte) 2);
        Long rec = Optional.ofNullable(cardOperateSv.add(seCardOperate)).orElse(0L);
        if(rec == 0) {
            return BaseResponseUtils.buildErrorMsg(SellResultCode.LOSS_FAIL_WRITE_LOSS_ERROR.getMessage());
@@ -517,7 +523,8 @@
    }
    /**
     * 冲正
     * 冲正,2024-09-30 作废,冲正功能由充值功能代替
     *
     * @param po
     * @param bindingResult
     * @return
@@ -567,8 +574,8 @@
        /**
         * 修改农户卡信息:
         *      挂失时间
         *      最后操作类型-4
         *      冲正时间
         *      最后操作类型-7
         */
        SeClientCard seClientCard = new SeClientCard();
        seClientCard.setId(cardId);
@@ -592,6 +599,7 @@
        seCardOperate.setRemarks(remarks);
        seCardOperate.setOperator(operator);
        seCardOperate.setOperateDt(reversalTime);
        seCardOperate.setOperateValid((byte) 2);
        Long rec = Optional.ofNullable(cardOperateSv.add(seCardOperate)).orElse(0L);
        if(rec == 0) {
            return BaseResponseUtils.buildErrorMsg(SellResultCode.REVERSAL_FAIL_WRITE_REVERSAL_ERROR.getMessage());
@@ -607,6 +615,7 @@
    /**
     * 补扣
     *
     * @param po
     * @param bindingResult
     * @return
@@ -655,10 +664,10 @@
        clientId = Long.parseLong(map.get("clientId").toString());
        /**
         * 修改农户卡信息:
         *      挂失时间
         *      最后操作类型-4
         */
         * 修改农户卡信息,通知时处理
         *      补扣时间
         *      最后操作类型-5
        SeClientCard seClientCard = new SeClientCard();
        seClientCard.setId(cardId);
        seClientCard.setRefunddt(refundTime);
@@ -668,6 +677,7 @@
        if(rec_updateClientCard == 0) {
            return BaseResponseUtils.buildErrorMsg(SellResultCode.RECHARGE_FAIL_WRITE_CLIENT_CARD_ERROR.getMessage());
        }
         */
        /**
         * 添加补扣操作记录
@@ -681,6 +691,7 @@
        seCardOperate.setRemarks(remarks);
        seCardOperate.setOperator(operator);
        seCardOperate.setOperateDt(refundTime);
        seCardOperate.setOperateValid((byte) 1);
        Long rec = Optional.ofNullable(cardOperateSv.add(seCardOperate)).orElse(0L);
        if(rec == 0) {
            return BaseResponseUtils.buildErrorMsg(SellResultCode.REFUND_FAIL_WRITE_REFUND_ERROR.getMessage());
@@ -690,7 +701,8 @@
    }
    /**
     * 解锁
     * 解锁,不需要二次通知
     *
     * @param po
     * @param bindingResult
     * @return
@@ -762,6 +774,7 @@
        seCardOperate.setRemarks(remarks);
        seCardOperate.setOperator(operator);
        seCardOperate.setOperateDt(unlockTime);
        seCardOperate.setOperateValid((byte) 2);
        Long rec = Optional.ofNullable(cardOperateSv.add(seCardOperate)).orElse(0L);
        if(rec == 0) {
            return BaseResponseUtils.buildErrorMsg(SellResultCode.UNLOCK_FAIL_WRITE_UNLOCK_ERROR.getMessage());
@@ -772,11 +785,109 @@
        map_response.put("orderNumber", rec);
        map_response.put("cardNum", cardNum);
        return BaseResponseUtils.buildSuccess(map_response) ;
    }
    /**
     * 操作执行回调
     *
     * @param po
     * @param bindingResult
     * @return
     */
    @PostMapping(path = "call_back", consumes = MediaType.APPLICATION_JSON_VALUE)
    @Transactional(rollbackFor = Exception.class)
    @SsoAop()
    public BaseResponse<Boolean> callBack(@RequestBody @Valid CallBack po, BindingResult bindingResult) {
        if (bindingResult != null && bindingResult.hasErrors()) {
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        String cardAddr = po.getCardAddr();
        Integer operateType = po.getOperateType();
        // 此时无需判断卡片状态
        Long cardId = cardOperateSv.getCardIdByAddr(cardAddr);
        if (cardId == null || cardId.equals(0)) {
            return BaseResponseUtils.buildErrorMsg("您指定的水卡不存在");
        }
        if (operateType == 1) {
            /**
             * 开卡操作执行通知
             *  1.依据水卡地址将最后一条无效状态的指定操作记录改为有效
             *  2.依据水卡ID将最后一条无效状态的水卡记录改为有效
             *  3.如果开卡同步充值
             *      修改充值操作记录为有效
             *      修改充值历史记录为有效
             *      修改水卡表的操作信息
             */
            Integer rec_card = Optional.ofNullable(cardOperateSv.turnCardValidByAddr(cardAddr, operateType)).orElse(0);
            Integer rec_ope = Optional.ofNullable(cardOperateSv.turnOperateValidByCardId(cardId, operateType)).orElse(0);
            if (rec_card == 0 || rec_ope == 0) {
                return BaseResponseUtils.buildErrorMsg("不存在未生效的水卡");
            }
            Boolean isMergeRecharge = cardOperateSv.isMergeRecharge(cardId);
            if (isMergeRecharge) {
                cardOperateSv.turnOperateValidByCardId(cardId, 2);
                cardOperateSv.turnRechargeHistoryValidByCardId(cardId);
                cardOperateSv.updateCard(cardId);
            }
        } else if (operateType == 2) {
            /**
             * 充值操作执行通知
             *  1.操作记录改为有效-cardId
             *  2.充值历史记录改为有效-cardId
             *  3.休水卡表的操作信息及余额-cardId、(mondy、amount、gift从充值历史表中获取)
             */
            Integer rec_ope = Optional.ofNullable(cardOperateSv.turnOperateValidByCardId(cardId, operateType)).orElse(0);
            Integer rec_recharge = cardOperateSv.turnRechargeHistoryValidByCardId(cardId);
            if (rec_recharge == 0 || rec_ope == 0) {
                return BaseResponseUtils.buildErrorMsg("不存在未生效的水卡");
            }
            cardOperateSv.updateCard(cardId);
        } else if (operateType == 3) {
            /**
             * 销卡操作执行通知
             *  1.操作记录改为有效-cardId
             *  2.修改水卡表的记录及余额(0)
             */
            cardOperateSv.turnOperateValidByCardId(cardId, operateType);
            cardOperateSv.updateCancels(operateType, cardId);
        } else if (operateType == 4) {
            /**
             * 补卡操作执行通知
             *  1.新水卡记录改为有效-cardId
             *  2.开卡操作记录改为有效-cardId
             *  3.如果存在退还金额
             *      清空原卡余额
             */
            Integer rec_card = Optional.ofNullable(cardOperateSv.turnCardValidByAddr(cardAddr, operateType)).orElse(0);
            Integer rec_ope = Optional.ofNullable(cardOperateSv.turnOperateValidByCardId(cardId, operateType)).orElse(0);
            if (rec_card == 0 || rec_ope == 0) {
                return BaseResponseUtils.buildErrorMsg("不存在未生效的水卡");
            }
            cardOperateSv.emptyCardBalance(operateType, cardId);
        } else if (operateType == 5) {
            /**
             * 补扣操作执行通知
             *  1.操作记录改为有效
             *  2.修改水卡表的操作信息及余额-从操作记录中取money、refund
             */
            cardOperateSv.turnOperateValidByCardId(cardId, operateType);
            cardOperateSv.updateRefund(operateType, cardId);
        }
        return BaseResponseUtils.buildSuccess();
    }
    /**
     * 创建管理卡
     *
     * @param po
     * @param bindingResult
     * @return
@@ -828,6 +939,7 @@
    /**
     * 获取充值记录
     *
     * @param vo
     * @return
     */
@@ -854,6 +966,7 @@
    /**
     * 获取充值记录,管理平台充值列表使用,APP未使用
     *
     * @param vo
     * @return
     */
@@ -871,6 +984,7 @@
    /**
     * 获取返还记录,管理平台充值列表使用
     *
     * @param vo
     * @return
     */
@@ -888,6 +1002,7 @@
    /**
     * 获取水卡消费记录,管理平台使用
     *
     * @param vo
     * @return
     */
@@ -905,6 +1020,7 @@
    /**
     * 根据指定条件获取交易明细
     *
     * @param vo
     * @return
     */
@@ -921,6 +1037,7 @@
    /**
     * 根据指定条件获取开卡记录
     *
     * @param vo
     * @return
     */
@@ -950,6 +1067,7 @@
    /**
     * 根据指定条件获取补卡记录
     *
     * @param vo
     * @return
     */
@@ -981,6 +1099,7 @@
     * 根据指定条件获取通用操作记录
     * 注销、挂失、冲正、解锁通用
     * 注销-3,挂失-6,冲正-7,解锁-8
     *
     * @param vo
     * @return
     */
@@ -1016,6 +1135,7 @@
    /**
     * 根据指定条件获取收据列表
     *
     * @param vo
     * @return
     */
@@ -1032,10 +1152,6 @@
    @SsoAop()
    public BaseResponse<Map> getReceipts(QoReceipt vo){
        try {
        //    Map res = Optional.ofNullable(cardOperateSv.getReceipts(vo)).orElse(new HashMap());
        //    if(res.size() == 0) {
        //        return BaseResponseUtils.buildErrorMsg(SellResultCode.No_RECEIPTS.getMessage());
        //    }
            return BaseResponseUtils.buildSuccess(cardOperateSv.getReceipts(vo));
        } catch (Exception e) {
            log.error("获取电子钱包账户记录", e);
@@ -1045,6 +1161,7 @@
    /**
     * 金额转大写
     *
     * @param amount
     * @return
     */
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/CardOperateSv.java
@@ -9,12 +9,16 @@
import com.dy.pipIrrGlobal.daoBa.BaSettingsMapper;
import com.dy.pipIrrGlobal.daoRm.RmOpenCloseValveHistoryMapper;
import com.dy.pipIrrGlobal.daoSe.*;
import com.dy.pipIrrGlobal.pojoSe.*;
import com.dy.pipIrrGlobal.pojoSe.SeCardOperate;
import com.dy.pipIrrGlobal.pojoSe.SeClientCard;
import com.dy.pipIrrGlobal.pojoSe.SeManagerCard;
import com.dy.pipIrrGlobal.pojoSe.SeRechargeHistory;
import com.dy.pipIrrGlobal.voRm.VoExpend;
import com.dy.pipIrrGlobal.voSe.*;
import com.dy.pipIrrSell.cardOperate.dto.DtoRecharge;
import com.dy.pipIrrSell.cardOperate.enums.OperateTypeENUM;
import com.dy.pipIrrSell.cardOperate.qo.*;
import com.dy.pipIrrSell.clientCard.CardStateENUM;
import com.dy.pipIrrSell.clientCard.ClientCardSv;
import com.dy.pipIrrSell.clientCard.LastOperateENUM;
import com.dy.pipIrrSell.result.SellResultCode;
@@ -25,6 +29,7 @@
import org.springframework.stereotype.Service;
import java.text.DecimalFormat;
import java.time.Duration;
import java.util.*;
/**
@@ -72,6 +77,7 @@
    /**
     * 添加开卡记录
     *
     * @param po 水卡操作对象
     * @return 开卡记录主键
     */
@@ -82,6 +88,7 @@
    /**
     * 根据农户编号获取5级行政区划代码,开卡使用
     *
     * @param clientNum 农户编号
     * @return 5级行政区划代码
     */
@@ -95,6 +102,7 @@
    /**
     * 根据农户编号获取5级行政区划串areaCode,补卡过程中开新卡使用
     *
     * @param clientId
     * @return
     */
@@ -104,6 +112,7 @@
    /**
     * 根据行政区划串模块查询水卡编号,开卡使用
     *
     * @param areaCode
     * @return
     */
@@ -113,6 +122,7 @@
    /**
     * 根据行政区划串模糊查询管理卡编号,创建管理卡使用
     *
     * @param areaCode
     * @return
     */
@@ -122,6 +132,7 @@
    /**
     * 创建管理卡
     *
     * @param po
     * @return
     */
@@ -132,6 +143,7 @@
    /**
     * 根据农户编号获取农户ID,开卡使用
     *
     * @param clientNum
     * @return
     */
@@ -141,6 +153,7 @@
    /**
     * 添加水卡操作对象,各操作都使用
     *
     * @param po 水卡操作对象
     * @return 操作记录主键
     */
@@ -152,6 +165,7 @@
    /**
     * 添加充值记录
     * 修改农户信息、添加水卡操作记录、添加充值记录
     *
     * @param po
     * @return
     */
@@ -183,9 +197,16 @@
        Long operator = po.getOperator();
        Date rechargeTime = new Date();
        // 验证水卡状态是否支持当前操作
        // 获取水卡状态
        String stateName = Optional.ofNullable(clientCardSv.getCardStateByCardNum(cardNum)).orElse("");
        if(stateName.length() == 0 || !stateName.equals("正常")) {
        // 单独充值时卡片必须为正常
        if (remarks.trim().equals("充值") && !stateName.equals("正常")) {
            return BaseResponseUtils.buildErrorMsg(stateName + ", " + SellResultCode.THE_CARD_NOT_SUPPORT_THIS_OPERATION.getMessage());
        }
        // 开卡同步充值时允许卡片为无效状态,得到通知后自动变更为有效
        if (!remarks.trim().equals("充值") && !stateName.equals("正常") && !stateName.equals("无效卡片")) {
            return BaseResponseUtils.buildErrorMsg(stateName + ", " + SellResultCode.THE_CARD_NOT_SUPPORT_THIS_OPERATION.getMessage());
        }
@@ -200,29 +221,17 @@
        clientId = Long.parseLong(map.get("clientId").toString());
        /**
         * 修改农户卡信息:
         *      补卡时间
         *      最后操作类型-2
         */
        // 根据支付方式ID获取支付方式名称
        SePaymentMethod sePaymentMethod = sePaymentMethodMapper.selectByPrimaryKey(paymentId);
        String paymentName = sePaymentMethod.getName();
         * 充值时不修改农户卡信息,收到成功通知后再修改:余额、充值时间、最后操作类型
        SeClientCard seClientCard = new SeClientCard();
        seClientCard.setId(cardId);
        seClientCard.setMoney(afterRecharge);
        seClientCard.setRechargedt(rechargeTime);
        //if(paymentName != null && paymentName.equals("换卡")) {
        //    seClientCard.setLastoper(LastOperateENUM.CHANGE_RECHARGE.getCode ());
        //}else {
        //    seClientCard.setLastoper(LastOperateENUM.RECHARGE.getCode ());
        //}
        seClientCard.setLastoper(LastOperateENUM.RECHARGE.getCode ());
        Integer rec_updateClientCard = Optional.ofNullable(clientCardSv.UpdateClientCard(seClientCard)).orElse(0);
        if(rec_updateClientCard == 0) {
            return BaseResponseUtils.buildErrorMsg(SellResultCode.RECHARGE_FAIL_WRITE_CLIENT_CARD_ERROR.getMessage());
        }
         */
        /**
         * 添加水卡充值操作记录
@@ -233,18 +242,13 @@
        seCardOperate.setMoney(money);
        seCardOperate.setTradeAmount(amount);
        seCardOperate.setGift(gift);
        //if(paymentName != null && paymentName.equals("换卡")) {
        //    seCardOperate.setOperateType(OperateTypeENUM.CHANGE_RECHARGE.getCode());
        //}else {
        //    seCardOperate.setOperateType(OperateTypeENUM.RECHARGE.getCode());
        //}
        seCardOperate.setOperateType(OperateTypeENUM.RECHARGE.getCode());
        seCardOperate.setPaymentId(paymentId);
        seCardOperate.setPrice(price);
        seCardOperate.setRemarks(remarks);
        seCardOperate.setOperator(operator);
        seCardOperate.setOperateDt(rechargeTime);
        seCardOperate.setOperateValid((byte) 1);
        seCardOperateMapper.insert(seCardOperate);
        Long rec = Optional.ofNullable(seCardOperate.getId()).orElse(0L);
        if(rec == 0) {
@@ -266,6 +270,7 @@
        seRechargeHistory.setRemarks(remarks);
        seRechargeHistory.setOperator(operator);
        seRechargeHistory.setOperatedt(rechargeTime);
        seRechargeHistory.setOperateValid((byte) 1);
        seRechargeHistoryMapper.insert(seRechargeHistory);
        Long rec_seRechargeHistory = Optional.ofNullable(seRechargeHistory.getId()).orElse(0L);
        if(rec_seRechargeHistory == 0) {
@@ -281,6 +286,7 @@
    /**
     * 根据指定条件获取充值记录
     *
     * @param queryVo
     * @return
     */
@@ -312,6 +318,7 @@
    /**
     * 获取充值记录,管理平台充值列表使用,APP未使用
     *
     * @param queryVo
     * @return
     */
@@ -331,6 +338,7 @@
    /**
     * 获取返还记录,管理平台充值列表使用
     *
     * @param queryVo
     * @return
     */
@@ -350,6 +358,7 @@
    /**
     * 获取水卡消费记录,管理平台使用
     *
     * @param queryVo
     * @return
     */
@@ -369,6 +378,7 @@
    /**
     * 根据指定条件获取交易记录
     *
     * @param vo
     * @return
     */
@@ -439,6 +449,7 @@
    /**
     * 根据指定条件获取开卡记录
     *
     * @param queryVo
     * @return
     */
@@ -471,6 +482,7 @@
    /**
     * 根据指定条件获取补卡记录
     *
     * @param queryVo
     * @return
     */
@@ -503,6 +515,7 @@
    /**
     * 根据指定条件获取通用操作记录
     *
     * @param queryVo
     * @return
     */
@@ -535,6 +548,7 @@
    /**
     * 根据指定条件获取收据列表
     *
     * @param queryVo
     * @return
     */
@@ -578,6 +592,7 @@
    /**
     * 判断指定水卡是否为挂失状态且无补卡记录
     *
     * @param cardNum 水卡编号
     * @return 是否已挂失未补卡
     */
@@ -592,6 +607,7 @@
    /**
     * 修改农户水卡
     *
     * @param po
     * @return
     */
@@ -601,6 +617,7 @@
    /**
     * 获取项目编号
     *
     * @return
     */
    public String getProjectNo() {
@@ -609,6 +626,7 @@
    /**
     * 根据水卡编号获取其挂失时退款金额(补卡时判断使用)
     *
     * @param cardNum
     * @return
     */
@@ -618,12 +636,13 @@
    /**
     * 根据水卡地址判断该卡是否可以开卡
     *
     * @param cardAddr
     * @return
     */
    public Boolean canActiveCard(String cardAddr) {
        // 指定水卡地址的水卡数量
        // 指定水卡地址的水卡数量,无效卡片排除在外
        Long cardCount = Optional.ofNullable(seClientCardMapper.getCountByCardAddr(cardAddr)).orElse(0L);
        if(cardCount == 0) {
           return true;
@@ -637,4 +656,164 @@
        return false;
    }
    /**
     * 依据水卡地址获取水卡编号
     *
     * @param cardAddr
     * @return
     */
    public Long getCardIdByAddr(String cardAddr) {
        return seClientCardMapper.getCardIdByAddr(cardAddr);
    }
    /**
     * 依据水卡地址将最后一条无效状态的指定操作记录改为有效
     *
     * @param cardAddr
     * @param operateType
     * @return
     */
    public Integer turnCardValidByAddr(String cardAddr, Integer operateType) {
        return seClientCardMapper.turnCardValidByAddr(cardAddr, operateType);
    }
    /**
     * 根据水卡ID、操作类型获取获取最后一条记录,判断开卡是否同步充值使用
     *
     * @param cardId
     * @return
     */
    public Integer turnOperateValidByCardId(Long cardId, Integer operateType) {
        return seCardOperateMapper.turnOperateValidByCardId(cardId, operateType);
    }
    /**
     * 依据水卡ID将最后一条无效状态的充值历史记录改为有效
     *
     * @param cardId
     * @return
     */
    public Integer turnRechargeHistoryValidByCardId(Long cardId) {
        return seRechargeHistoryMapper.turnRechargeHistoryValidByCardId(cardId);
    }
    /**
     * 根据水卡ID判断是否为开卡时同步充值
     * 该水卡ID不存在开卡记录或充值记录则返回false
     * 如果开卡操作与充值操作时间间隔超过30秒则返回false
     * 如果充值金额大于0且充值前余额为0则返回true
     *
     * @param cardId
     * @return
     */
    public Boolean isMergeRecharge(Long cardId) {
        SeCardOperate activeCard = seCardOperateMapper.getCardOperate(1, cardId);
        SeCardOperate recharge = seCardOperateMapper.getCardOperate(2, cardId);
        if (activeCard == null || recharge == null) {
            return false;
        }
        Duration duration = Duration.between(activeCard.getOperateDt().toInstant(), recharge.getOperateDt().toInstant());
        if (duration.toSeconds() > 30) {
            return false;
        }
        Float money = Optional.ofNullable(recharge.getMoney()).orElse(0f);
        Float tradeAmount = Optional.ofNullable(recharge.getTradeAmount()).orElse(0f);
        if (tradeAmount > 0 && money == 0) {
            return true;
        } else {
            return false;
        }
    }
    /**
     * 根据水卡ID从操作记录表中取出:余额、交易金额、赠送金额,求和得到水卡余额
     * 将余额更新到水卡表中
     *
     * @param cardId
     * @return
     */
    public Boolean updateCard(Long cardId) {
        SeCardOperate recharge = seCardOperateMapper.getCardOperate(2, cardId);
        if (recharge == null) {
            return false;
        }
        Float money = Optional.ofNullable(recharge.getMoney()).orElse(0f);
        Float amount = Optional.ofNullable(recharge.getTradeAmount()).orElse(0f);
        Float gift = Optional.ofNullable(recharge.getGift()).orElse(0f);
        SeClientCard clientCard = new SeClientCard();
        clientCard.setId(cardId);
        clientCard.setMoney(money + amount + gift);
        clientCard.setRechargedt(recharge.getOperateDt());
        clientCard.setLastoper(LastOperateENUM.RECHARGE.getCode());
        Integer rec_updateClientCard = seClientCardMapper.updateByPrimaryKeySelective(clientCard);
        if (rec_updateClientCard == null || rec_updateClientCard == 0) {
            return false;
        }
        return true;
    }
    /**
     * 如果补卡时转移了退还金额,清空挂失卡余额
     * @param operateType
     * @param cardId
     */
    public void emptyCardBalance(Integer operateType, Long cardId) {
        SeCardOperate cardOperate = seCardOperateMapper.getCardOperate(operateType, cardId);
        if(cardOperate != null) {
            Float noTradeAmount = cardOperate.getNoTradeAmount();
            if(noTradeAmount != null && noTradeAmount > 0) {
                Long originalCardId = seClientCardMapper.getOriginalCardIdByCardId(cardId);
                if(originalCardId != null) {
                    SeClientCard clientCard = new SeClientCard();
                    clientCard.setId(cardId);
                    clientCard.setMoney(0f);
                    seClientCardMapper.updateByPrimaryKeySelective(clientCard);
                }
            }
        }
    }
    /**
     * 修改注销水卡表的记录及余额(0)
     * @param cardId
     * @return
     */
    public Integer updateCancels(Integer operateType, Long cardId) {
        SeCardOperate cardOperate = seCardOperateMapper.getCardOperate(operateType, cardId);
        Date cancelTime = Optional.ofNullable(cardOperate.getOperateDt()).orElse(new Date());
        SeClientCard clientCard = new SeClientCard();
        clientCard.setId(cardId);
        clientCard.setCanceldt(cancelTime);
        clientCard.setMoney(0f);
        clientCard.setState(CardStateENUM.CANCELLED.getCode());
        clientCard.setLastoper(LastOperateENUM.CANCEL.getCode());
        return seClientCardMapper.updateByPrimaryKeySelective(clientCard);
    }
    /**
     * 修改补扣水卡表的操作信息及余额
     * @param operateType
     * @param cardId
     * @return
     */
    public Integer updateRefund(Integer operateType, Long cardId) {
        SeCardOperate cardOperate = seCardOperateMapper.getCardOperate(operateType, cardId);
        Date refundTime = Optional.ofNullable(cardOperate.getOperateDt()).orElse(new Date());
        Float money = cardOperate.getMoney();
        Float refund = cardOperate.getRefundAmount();
        SeClientCard clientCard = new SeClientCard();
        clientCard.setId(cardId);
        clientCard.setRefunddt(refundTime);
        clientCard.setMoney(money + refund);
        clientCard.setLastoper(LastOperateENUM.REFUND.getCode());
        return seClientCardMapper.updateByPrimaryKeySelective(clientCard);
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/dto/CallBack.java
New file
@@ -0,0 +1,30 @@
package com.dy.pipIrrSell.cardOperate.dto;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
 * @author ZhuBaoMin
 * @date 2024-09-30 15:05
 * @LastEditTime 2024-09-30 15:05
 * @Description 操作执行回调:开卡、充值、补卡、销卡、补扣
 */
@Data
public class CallBack {
    public static final long serialVersionUID = 202409301507001L;
    /**
     * 水卡地址
     */
    @NotBlank(message = "水卡地址不能为空")
    private String cardAddr;
    /**
     * 操作类型:1-开卡,2-充值,3-销卡,4-补卡,5-补扣
     */
    @NotNull(message = "操作类型不能为空")
    private Integer operateType;
}
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/dto/DtoCancel.java
@@ -43,11 +43,11 @@
    private Float refund;
    /**
     * 退款方式;1-现金
     * 退款方式;
     */
    @Schema(description = "退款方式", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    @Positive(message = "退款方式必须为大于0的整数")
    private Byte refundType;
    private Long refundType;
    /**
     * 备注信息
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/clientCard/CardStateENUM.java
@@ -15,7 +15,8 @@
public enum CardStateENUM {
    NORMAL((byte)1, "正常"),
    CANCELLED((byte)2, "已注销"),
    LOSS((byte)3, "已挂失");
    LOSS((byte)3, "已挂失"),
    INVALID((byte)4, "无效的");
    private final Byte code;
    private final String message;
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/clientCard/ClientCardCtrl.java
@@ -11,7 +11,6 @@
import com.dy.pipIrrGlobal.voSe.VoCards2;
import com.dy.pipIrrSell.clientCard.qo.QoCards;
import com.dy.pipIrrSell.clientCard.qo.QoCards2;
import com.dy.pipIrrSell.result.SellResultCode;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -182,11 +181,12 @@
    public BaseResponse<QueryResultVo<List<VoCards2>>> getCardsByClientNameAndPhone(QoCards2 vo){
        try {
            QueryResultVo<List<VoCards2>> res = clientCardSv.getCardsByClientNameAndPhone(vo);
            if(res.itemTotal != null && res.itemTotal > 0) {
                return BaseResponseUtils.buildSuccess(res);
            }else {
                return BaseResponseUtils.buildFail(SellResultCode.THE_CARD_NOT_EXIST.getMessage());
            }
            //if(res.itemTotal != null && res.itemTotal > 0) {
            //    return BaseResponseUtils.buildSuccess(res);
            //}else {
            //    return BaseResponseUtils.buildFail(SellResultCode.THE_CARD_NOT_EXIST.getMessage());
            //}
        } catch (Exception e) {
            log.error("查询水卡异常", e);
            return BaseResponseUtils.buildException(e.getMessage()) ;
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/general/GeneralSv.java
@@ -160,8 +160,6 @@
        // 获取各支付方式ID
        Long paymentId_cash = 0L;
        //Long paymentId_wechat = 0L;
        //Long paymentId_alipay = 0L;
        Long paymentId_pos = 0L;
        Long paymentId_transfer = 0L;
        List<SePaymentMethod> list_payment = sePaymentMethodMapper.getPaymentMethods();
@@ -170,19 +168,12 @@
            if(paymentMethod.getName().equals("现金")) {
                paymentId_cash = paymentMethod.getId();
            }
            //if(paymentMethod.getName().equals("微信支付")) {
            //    paymentId_wechat = paymentMethod.getId();
            //}
            //if(paymentMethod.getName().equals("支付宝支付")) {
            //    paymentId_alipay = paymentMethod.getId();
            //}
            if(paymentMethod.getName().equals("POS机")) {
                paymentId_pos = paymentMethod.getId();
            }
            if(paymentMethod.getName().equals("银行转账")) {
                paymentId_transfer = paymentMethod.getId();
            }
        }
        // 接收传入参数:交易起止日期、收银员ID
@@ -197,22 +188,19 @@
            String tradeDate = dateFormat.format(calendar.getTime()) ;
            if(cashierId != 1000000L) {
                Float receivedCash = Optional.ofNullable(seGeneralMapper.getPaymentSums(tradeDate, cashierId, paymentId_cash)).orElse(0f);
                //Float receivedWechat = Optional.ofNullable(seGeneralMapper.getPaymentSums(tradeDate, cashierId,paymentId_wechat)).orElse(0f);
                //Float receivedAlipay = Optional.ofNullable(seGeneralMapper.getPaymentSums(tradeDate, cashierId,paymentId_alipay)).orElse(0f);
                Float receivedPos = Optional.ofNullable(seGeneralMapper.getPaymentSums(tradeDate, cashierId,paymentId_pos)).orElse(0f);
                Float receivedTransfer = Optional.ofNullable(seGeneralMapper.getPaymentSums(tradeDate, cashierId, paymentId_transfer)).orElse(0f);
                JSONObject job = new JSONObject();
                job.put("tradeDate", tradeDate);
                job.put("receivedCash", receivedCash);
                //job.put("receivedWechat", receivedWechat);
                //job.put("receivedAlipay", receivedAlipay);
                job.put("receivedPos", receivedPos);
                job.put("receivedTransfer", receivedTransfer);
                array_paymentSums.add(job);
            }else {
                // 分级计算指定日期微信收退款合计,再计算实收金额
                // 此处应用时再优化
                Double rechargeWeChat = Optional.ofNullable(seWalletRechargeMapper.getRechargeSum(tradeDate)).orElse(0.0);
                Double refundWeChat = Optional.ofNullable(seRefundMapper.getRefundSum(tradeDate)).orElse(0.0);
                Double receiveWeChat = rechargeWeChat - refundWeChat;