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) > #{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;