获取农户数据去掉重复记录,微信支付的传参、返回值、接口、数据库表金额都以元为单位
| | |
| | | <artifactId>kaptcha</artifactId> |
| | | <version>2.3.2</version> |
| | | </dependency> |
| | | |
| | | <!--RocketMQ--> |
| | | <dependency> |
| | | <groupId>org.apache.rocketmq</groupId> |
| | | <artifactId>rocketmq-spring-boot-starter</artifactId> |
| | | <version>2.2.3</version> |
| | | </dependency> |
| | | |
| | | </dependencies> |
| | | |
| | | <build> |
| | |
| | | * @param params |
| | | * @return |
| | | */ |
| | | Long getRecordCount(Map<?, ?> params); |
| | | List<VoClient> getRecordCount(Map<?, ?> params); |
| | | |
| | | /** |
| | | * 根据指定条件获取农户数据 |
| | |
| | | * @param orderNumber |
| | | * @return |
| | | */ |
| | | Integer getRechargeAmountByOrderNumber(@Param("orderNumber") String orderNumber); |
| | | Double getRechargeAmountByOrderNumber(@Param("orderNumber") String orderNumber); |
| | | } |
| | |
| | | */ |
| | | @Schema(description = "充值金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED) |
| | | @NotNull(message = "充值金额不能为空") |
| | | private Integer rechargeAmount; |
| | | private Double rechargeAmount; |
| | | |
| | | /** |
| | | * 下单时间 |
| | |
| | | @Schema(description = "充值金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED) |
| | | @NotNull(message = "充值金额不能为空") |
| | | @Positive(message = "充值金额必须为大于0的整数") |
| | | private Integer rechargeAmount; |
| | | private Double rechargeAmount; |
| | | |
| | | /** |
| | | * 充值完成时间 |
New file |
| | |
| | | org.apache.rocketmq.spring.autoconfigure.RocketMQAutoConfiguration |
| | |
| | | #虚拟卡配置参数 |
| | | vc: |
| | | #虚拟卡最低余额报警值 |
| | | alarmValue: 10 |
| | | alarmValue: 10 |
| | | |
| | | rocketmq: |
| | | consumer: |
| | | group: consumer_group |
| | | # 一次拉取消息最大值,注意是拉取消息的最大值而非消费最大值 |
| | | pull-batch-size: 10 |
| | | name-server: 127.0.0.1:9876 |
| | | producer: |
| | | # 发送同一类消息的设置为同一个group,保证唯一 |
| | | group: producer_group |
| | | # 发送消息超时时间,默认3000 |
| | | sendMessageTimeout: 10000 |
| | | # 发送消息失败重试次数,默认2 |
| | | retryTimesWhenSendFailed: 2 |
| | | # 异步消息重试次数,默认2 |
| | | retryTimesWhenSendAsyncFailed: 2 |
| | | # 消息最大长度,默认1024 * 1024 * 4(默认4M) |
| | | maxMessageSize: 4096 |
| | | # 压缩消息阈值,默认4k(1024 * 4) |
| | | compressMessageBodyThreshold: 4096 |
| | | # 是否在内部发送失败时重试另一个broker,默认false |
| | | retryNextServer: false |
| | |
| | | </select> |
| | | |
| | | <!--根据指定条件获取农户记录数--> |
| | | <select id="getRecordCount" parameterType="java.util.Map" resultType="java.lang.Long"> |
| | | SELECT |
| | | COUNT(*) AS recordCount |
| | | <!-- <select id="getRecordCount" parameterType="java.util.Map" resultType="java.lang.Long">--> |
| | | <select id="getRecordCount" resultType="com.dy.pipIrrGlobal.voSe.VoClient"> |
| | | <!-- SELECT--> |
| | | <!-- COUNT(*) AS recordCount--> |
| | | SELECT DISTINCT |
| | | cli.countyId, |
| | | dis_con.name AS countryName, |
| | | cli.townId, |
| | | dis_town.name AS townName, |
| | | cli.villageId, |
| | | dis_village.name AS villageName, |
| | | cli.blockId, |
| | | blo.name AS blockName, |
| | | cli.divideId, |
| | | divi.name AS divideName, |
| | | cli.typeId, |
| | | wat.typeName AS waterTypeName, |
| | | cli.id AS clientId, |
| | | cli.name, |
| | | cli.clientNum, |
| | | cli.phone, |
| | | cli.idCard, |
| | | cli.area, |
| | | (SELECT COUNT(*) FROM se_client_card WHERE clientId = cli.id)+(SELECT COUNT(*) FROM se_virtual_card WHERE client_id = cli.id) AS cardCount, |
| | | cli.address, |
| | | cli.remarks, |
| | | cli.operateDt |
| | | FROM se_client cli |
| | | LEFT JOIN ba_district dis_con ON cli.countyId = dis_con.id |
| | | LEFT JOIN ba_district dis_town ON cli.townId = dis_town.id |
| | |
| | | |
| | | <!--根据指定条件获取农户数据--> |
| | | <select id="getClients" resultType="com.dy.pipIrrGlobal.voSe.VoClient"> |
| | | SELECT |
| | | SELECT DISTINCT |
| | | cli.countyId, |
| | | dis_con.name AS countryName, |
| | | cli.townId, |
| | |
| | | <result column="money" jdbcType="FLOAT" property="money" /> |
| | | <result column="after_recharge" jdbcType="FLOAT" property="afterRecharge" /> |
| | | <result column="order_number" jdbcType="VARCHAR" property="orderNumber" /> |
| | | <result column="recharge_amount" jdbcType="INTEGER" property="rechargeAmount" /> |
| | | <result column="recharge_amount" jdbcType="FLOAT" property="rechargeAmount" /> |
| | | <result column="order_time" jdbcType="TIMESTAMP" property="orderTime" /> |
| | | <result column="recharge_time" jdbcType="TIMESTAMP" property="rechargeTime" /> |
| | | <result column="order_state" jdbcType="TINYINT" property="orderState" /> |
| | |
| | | order_state) |
| | | values (#{id,jdbcType=BIGINT}, #{vcId,jdbcType=BIGINT}, #{clientId,jdbcType=BIGINT}, |
| | | #{money,jdbcType=FLOAT}, #{afterRecharge,jdbcType=FLOAT}, #{orderNumber,jdbcType=VARCHAR}, |
| | | #{rechargeAmount,jdbcType=INTEGER}, #{orderTime,jdbcType=TIMESTAMP}, #{rechargeTime,jdbcType=TIMESTAMP}, |
| | | #{rechargeAmount,jdbcType=FLOAT}, #{orderTime,jdbcType=TIMESTAMP}, #{rechargeTime,jdbcType=TIMESTAMP}, |
| | | #{orderState,jdbcType=TINYINT}) |
| | | </insert> |
| | | <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoSe.SeVcRecharge"> |
| | |
| | | #{orderNumber,jdbcType=VARCHAR}, |
| | | </if> |
| | | <if test="rechargeAmount != null"> |
| | | #{rechargeAmount,jdbcType=INTEGER}, |
| | | #{rechargeAmount,jdbcType=FLOAT}, |
| | | </if> |
| | | <if test="orderTime != null"> |
| | | #{orderTime,jdbcType=TIMESTAMP}, |
| | |
| | | order_number = #{orderNumber,jdbcType=VARCHAR}, |
| | | </if> |
| | | <if test="rechargeAmount != null"> |
| | | recharge_amount = #{rechargeAmount,jdbcType=INTEGER}, |
| | | recharge_amount = #{rechargeAmount,jdbcType=FLOAT}, |
| | | </if> |
| | | <if test="orderTime != null"> |
| | | order_time = #{orderTime,jdbcType=TIMESTAMP}, |
| | |
| | | money = #{money,jdbcType=FLOAT}, |
| | | after_recharge = #{afterRecharge,jdbcType=FLOAT}, |
| | | order_number = #{orderNumber,jdbcType=VARCHAR}, |
| | | recharge_amount = #{rechargeAmount,jdbcType=INTEGER}, |
| | | recharge_amount = #{rechargeAmount,jdbcType=FLOAT}, |
| | | order_time = #{orderTime,jdbcType=TIMESTAMP}, |
| | | recharge_time = #{rechargeTime,jdbcType=TIMESTAMP}, |
| | | order_state = #{orderState,jdbcType=TINYINT} |
| | |
| | | <where> |
| | | AND order_state = 2 |
| | | <if test = "virtualId != null and virtualId > 0"> |
| | | AND vc_id = ${virtualId} |
| | | AND vc_id = #{virtualId} |
| | | </if> |
| | | </where> |
| | | ORDER BY order_number |
| | | </select> |
| | | |
| | | <!--根据订单号获取充值金额--> |
| | | <select id="getRechargeAmountByOrderNumber" resultType="java.lang.Integer"> |
| | | <select id="getRechargeAmountByOrderNumber" resultType="java.lang.Double"> |
| | | SELECT |
| | | recharge_amount AS rechargeAmount |
| | | FROM se_vc_recharge |
| | |
| | | SELECT |
| | | id, |
| | | vc_num AS vcNum, |
| | | ROUND(money / 100,2) AS money, |
| | | <!-- ROUND(money / 100,2) AS money,--> |
| | | money, |
| | | in_use AS inUse, |
| | | (CASE |
| | | WHEN in_use = 0 THEN '未使用' |
New file |
| | |
| | | package com.dy.pipIrrApp.workOrder; |
| | | |
| | | import org.apache.rocketmq.spring.annotation.ConsumeMode; |
| | | import org.apache.rocketmq.spring.annotation.MessageModel; |
| | | import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; |
| | | import org.apache.rocketmq.spring.core.RocketMQListener; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * @author ZhuBaoMin |
| | | * @date 2024-11-04 11:00 |
| | | * @LastEditTime 2024-11-04 11:00 |
| | | * @Description |
| | | */ |
| | | |
| | | @Component |
| | | @RocketMQMessageListener( |
| | | topic = "workOrder", |
| | | consumerGroup = "consumer_group", |
| | | selectorExpression = "*", |
| | | messageModel = MessageModel.CLUSTERING, |
| | | consumeMode = ConsumeMode.CONCURRENTLY |
| | | ) |
| | | public class ConsumerListener implements RocketMQListener<String> { |
| | | @Override |
| | | public void onMessage(String message) { |
| | | System.out.println("ConsumerListener receive message: " + message); |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.pipIrrApp.workOrder; |
| | | |
| | | import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; |
| | | import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; |
| | | import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; |
| | | import org.apache.rocketmq.client.exception.MQClientException; |
| | | import org.apache.rocketmq.common.message.MessageExt; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * @author ZhuBaoMin |
| | | * @date 2024-11-04 15:02 |
| | | * @LastEditTime 2024-11-04 15:02 |
| | | * @Description |
| | | */ |
| | | |
| | | @Component |
| | | public class ConsumerListener_push{ |
| | | public void receiveMessage () throws MQClientException { |
| | | DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_group"); |
| | | consumer.setNamesrvAddr("127.0.0.1:9876"); |
| | | |
| | | // 设置消息监听器 |
| | | consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> { |
| | | for (MessageExt msg : msgs) { |
| | | System.out.println("ConsumerListener_push receive message: " + new String(msg.getBody())); |
| | | } |
| | | return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; |
| | | }); |
| | | |
| | | // 订阅主题和标签 |
| | | consumer.subscribe("workOrder", "王五"); |
| | | |
| | | // 启动消费者 |
| | | consumer.start(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.pipIrrApp.workOrder; |
| | | |
| | | import com.dy.common.aop.SsoAop; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.rocketmq.client.exception.MQBrokerException; |
| | | import org.apache.rocketmq.client.exception.MQClientException; |
| | | import org.apache.rocketmq.client.producer.DefaultMQProducer; |
| | | import org.apache.rocketmq.client.producer.SendResult; |
| | | import org.apache.rocketmq.common.message.Message; |
| | | import org.apache.rocketmq.remoting.exception.RemotingException; |
| | | import org.apache.rocketmq.spring.core.RocketMQTemplate; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.nio.charset.StandardCharsets; |
| | | |
| | | /** |
| | | * @author ZhuBaoMin |
| | | * @date 2024-11-04 9:30 |
| | | * @LastEditTime 2024-11-04 9:30 |
| | | * @Description 工单控制类 |
| | | */ |
| | | |
| | | @Slf4j |
| | | @RestController |
| | | @RequestMapping(path = "workOrder") |
| | | @RequiredArgsConstructor |
| | | public class WorkOrderCtrl { |
| | | private final WorkOrderSv workOrderSv; |
| | | |
| | | @Autowired |
| | | private RocketMQTemplate rocketMQTemplate; |
| | | |
| | | |
| | | @GetMapping("/sendWorkOrder") |
| | | @Transactional(rollbackFor = Exception.class) |
| | | @SsoAop() |
| | | public void sendWorkOrder() throws MQClientException, MQBrokerException, RemotingException, InterruptedException { |
| | | ConsumerListener_push ConsumerListener_push = new ConsumerListener_push(); |
| | | ConsumerListener_push.receiveMessage(); |
| | | |
| | | String topic = "workOrder"; |
| | | String tag = "王五"; |
| | | String key = "11"; |
| | | String message = "Hello World"; |
| | | //SendResult sendResult = rocketMQTemplate.syncSend(topic + ":" + tag, message); |
| | | //System.out.println("send result:" + sendResult.toString()); |
| | | |
| | | DefaultMQProducer producer = new DefaultMQProducer("producer_group"); |
| | | producer.setNamesrvAddr("127.0.0.1:9876"); |
| | | producer.start(); |
| | | Message msg = new Message(topic,tag,"11",message.getBytes(StandardCharsets.UTF_8)); |
| | | SendResult approveSendResult = producer.send(msg); |
| | | System.out.println("send result:" + approveSendResult.toString()); |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.pipIrrApp.workOrder; |
| | | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | /** |
| | | * @author ZhuBaoMin |
| | | * @date 2024-11-04 9:29 |
| | | * @LastEditTime 2024-11-04 9:29 |
| | | * @Description 工单服务类 |
| | | */ |
| | | |
| | | @Slf4j |
| | | @Service |
| | | public class WorkOrderSv { |
| | | } |
| | |
| | | */ |
| | | public QueryResultVo<List<VoClient>> getClients(QueryVo queryVo){ |
| | | Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(queryVo) ; |
| | | Long itemTotal = seClientMapper.getRecordCount(params); |
| | | |
| | | Long itemTotal = (long)seClientMapper.getRecordCount(params).size(); |
| | | QueryResultVo<List<VoClient>> rsVo = new QueryResultVo<>() ; |
| | | rsVo.pageSize = queryVo.pageSize ; |
| | | rsVo.pageCurr = queryVo.pageCurr ; |
| | |
| | | String refundNo = po.getRefundNo(); |
| | | Integer refund = po.getRefund(); |
| | | |
| | | // 生成body |
| | | Integer total = virtualCardSv.getRechargeAmountByOrderNumber(tradeNo); |
| | | // 生成body,金额单位由元改为分 |
| | | //Integer total = virtualCardSv.getRechargeAmountByOrderNumber(tradeNo); |
| | | Integer total = (int)(virtualCardSv.getRechargeAmountByOrderNumber(tradeNo)*100); |
| | | RefundRequest.Amount amount = new RefundRequest.Amount(); |
| | | amount.setRefund(refund); |
| | | amount.setTotal(total); |
| | |
| | | String orderNumber = po.getOrderNumber(); |
| | | Long virtualId = po.getVirtualId(); |
| | | Long clientId = po.getClientId(); |
| | | Integer rechargeAmount = po.getRechargeAmount(); |
| | | Double rechargeAmount = po.getRechargeAmount(); |
| | | |
| | | // 验证该虚拟卡账户是否存在并取出当前账户余额 |
| | | SeVirtualCard seVirtualCard = seVirtualCardMapper.selectByPrimaryKey(virtualId); |
| | |
| | | |
| | | Long virtualId = seVcRecharge.getVcId(); |
| | | Double money = seVcRecharge.getMoney(); |
| | | Integer rechargeAmount = seVcRecharge.getRechargeAmount(); |
| | | Double rechargeAmount = seVcRecharge.getRechargeAmount(); |
| | | Double afterRrecharge = money + rechargeAmount; |
| | | |
| | | seVcRecharge.setAfterRecharge(afterRrecharge); |
| | |
| | | * @param orderNumber |
| | | * @return |
| | | */ |
| | | public Integer getRechargeAmountByOrderNumber(String orderNumber) { |
| | | public Double getRechargeAmountByOrderNumber(String orderNumber) { |
| | | return seVcRechargeMapper.getRechargeAmountByOrderNumber(orderNumber); |
| | | |
| | | } |
| | |
| | | */ |
| | | @Schema(description = "充值金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED) |
| | | @NotNull(message = "充值金额不能为空") |
| | | private Integer rechargeAmount; |
| | | private Double rechargeAmount; |
| | | } |
| | |
| | | // 接收参数:登录态ID、虚拟卡ID、充值金额(分) |
| | | Long sessionId = order.getSessionId(); |
| | | Long virtualId = order.getVcId(); |
| | | Integer rechargeAmount = order.getRechargeAmount(); |
| | | //Integer rechargeAmount = order.getRechargeAmount(); |
| | | |
| | | String prepayId = ""; |
| | | |
| | |
| | | virtualCard.setOrderNumber(orderNumber); |
| | | virtualCard.setClientId(clientId); |
| | | virtualCard.setVirtualId(virtualId); |
| | | virtualCard.setRechargeAmount(rechargeAmount); |
| | | virtualCard.setRechargeAmount(order.getRechargeAmount()); |
| | | BaseResponse result = virtualCardSv.insertVCRecharge(virtualCard); |
| | | if(!result.getCode().equals("0001")) { |
| | | return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_ADD_FAIL.getMessage()); |
| | |
| | | |
| | | //订单金额 |
| | | JSONObject job_amount = new JSONObject(); |
| | | job_amount.put("total", rechargeAmount); |
| | | job_amount.put("total", (int)(order.getRechargeAmount()*100)); |
| | | job_amount.put("currency", "CNY"); |
| | | job_body.put("amount", job_amount); |
| | | |
| | |
| | | */ |
| | | @Schema(description = "支付金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED) |
| | | @NotNull(message = "虚支付金额不能为空") |
| | | private Integer rechargeAmount; |
| | | private Double rechargeAmount; |
| | | } |
| | |
| | | import java.io.ByteArrayInputStream; |
| | | import java.io.IOException; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.nio.file.Files; |
| | | import java.nio.file.Paths; |
| | | import java.security.*; |
| | | import java.security.cert.Certificate; |
| | | import java.security.cert.CertificateException; |
| | |
| | | Integer refund = po.getRefund(); |
| | | |
| | | // 生成body |
| | | Integer total = virtualCardSv.getRechargeAmountByOrderNumber(tradeNo); |
| | | Double total = virtualCardSv.getRechargeAmountByOrderNumber(tradeNo); |
| | | RefundRequest.Amount amount = new RefundRequest.Amount(); |
| | | amount.setRefund(refund); |
| | | amount.setTotal(total); |
| | |
| | | String orderNumber = po.getOrderNumber(); |
| | | Long virtualId = po.getVirtualId(); |
| | | Long clientId = po.getClientId(); |
| | | Integer rechargeAmount = po.getRechargeAmount(); |
| | | Double rechargeAmount = po.getRechargeAmount(); |
| | | |
| | | // 验证该虚拟卡账户是否存在并取出当前账户余额 |
| | | SeVirtualCard seVirtualCard = seVirtualCardMapper.selectByPrimaryKey(virtualId); |
| | |
| | | |
| | | Long virtualId = seVcRecharge.getVcId(); |
| | | Double money = seVcRecharge.getMoney(); |
| | | Integer rechargeAmount = seVcRecharge.getRechargeAmount(); |
| | | Double rechargeAmount = seVcRecharge.getRechargeAmount(); |
| | | Double afterRrecharge = money + rechargeAmount; |
| | | |
| | | seVcRecharge.setAfterRecharge(afterRrecharge); |
| | |
| | | * @param orderNumber |
| | | * @return |
| | | */ |
| | | public Integer getRechargeAmountByOrderNumber(String orderNumber) { |
| | | public Double getRechargeAmountByOrderNumber(String orderNumber) { |
| | | return seVcRechargeMapper.getRechargeAmountByOrderNumber(orderNumber); |
| | | |
| | | } |
| | |
| | | * 充值金额 |
| | | */ |
| | | @NotNull(message = "充值金额不能为空") |
| | | private Integer rechargeAmount; |
| | | private Double rechargeAmount; |
| | | } |
| | |
| | | return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); |
| | | } |
| | | |
| | | // 接收参数:登录态ID、虚拟卡ID、充值金额(分) |
| | | // 接收参数:登录态ID、虚拟卡ID、充值金额(单位元) |
| | | Long sessionId = order.getSessionId(); |
| | | Long virtualId = order.getVcId(); |
| | | Integer rechargeAmount = order.getRechargeAmount(); |
| | | //Integer rechargeAmount = (int)(order.getRechargeAmount()*100); |
| | | |
| | | String prepayId = ""; |
| | | |
| | |
| | | virtualCard.setVirtualId(virtualId); |
| | | virtualCard.setClientId(clientId); |
| | | virtualCard.setOrderNumber(orderNumber); |
| | | virtualCard.setRechargeAmount(rechargeAmount); |
| | | //virtualCard.setRechargeAmount(rechargeAmount); |
| | | virtualCard.setRechargeAmount(order.getRechargeAmount()); |
| | | |
| | | // -1:虚拟卡不存在,0:添加充值记录失败 |
| | | Long rechargeId = virtualCardSv.insertVCRecharge(virtualCard); |
| | |
| | | |
| | | //订单金额 |
| | | JSONObject job_amount = new JSONObject(); |
| | | job_amount.put("total", rechargeAmount); |
| | | job_amount.put("total", (int)(order.getRechargeAmount()*100)); |
| | | job_amount.put("currency", "CNY"); |
| | | job_body.put("amount", job_amount); |
| | | |
| | |
| | | private Long vcId; |
| | | |
| | | /** |
| | | * 充值金额金额 |
| | | * 充值金额金额,单位元 |
| | | */ |
| | | @Schema(description = "支付金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED) |
| | | @NotNull(message = "虚支付金额不能为空") |
| | | private Integer rechargeAmount; |
| | | private Double rechargeAmount; |
| | | } |
| | |
| | | */ |
| | | @Schema(description = "原订单金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED) |
| | | @NotNull(message = "原订单金额不能为空") |
| | | private Integer total; |
| | | private Double total; |
| | | |
| | | /** |
| | | * 退款币种,固定为“CNY” |