From 5e388cfb25b24a154e28b3c42143493fc77f8e56 Mon Sep 17 00:00:00 2001
From: liulin <lin.liu@88.com>
Date: 星期五, 04 七月 2025 11:02:10 +0800
Subject: [PATCH] 添加mqtt

---
 src/main/java/com/lunhan/water/entity/request/rechargerecords/Recharge.java |   28 +++++++
 src/main/java/com/lunhan/water/host/controller/api/UserController.java      |   23 +++++
 src/main/java/com/lunhan/water/service/PaymentRecordsService.java           |   33 +++++++
 src/main/resources/application-dev.yml                                      |    2 
 src/main/java/com/lunhan/water/service/RechargeRecordsService.java          |   46 +++++++++++
 src/main/resources/application-test.yml                                     |   31 +++++++
 src/main/java/com/lunhan/water/repository/po/HeartbeatDataPO.java           |    9 +
 src/main/java/com/lunhan/water/service/PaymentServices.java                 |   21 ++++
 8 files changed, 182 insertions(+), 11 deletions(-)

diff --git a/src/main/java/com/lunhan/water/entity/request/rechargerecords/Recharge.java b/src/main/java/com/lunhan/water/entity/request/rechargerecords/Recharge.java
new file mode 100644
index 0000000..d273170
--- /dev/null
+++ b/src/main/java/com/lunhan/water/entity/request/rechargerecords/Recharge.java
@@ -0,0 +1,28 @@
+package com.lunhan.water.entity.request.rechargerecords;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class Recharge {
+    /**
+     * 订单金额
+     */
+    private BigDecimal orderAmount;
+    /**
+     * 折扣金额
+     */
+    private BigDecimal discountAmount;
+
+    /**
+     * 充值金额
+     */
+    private BigDecimal rechargeAmount;
+    /**
+     *
+     *备注
+     */
+    private String remark;
+
+}
diff --git a/src/main/java/com/lunhan/water/host/controller/api/UserController.java b/src/main/java/com/lunhan/water/host/controller/api/UserController.java
index 41c91f7..e8c717d 100644
--- a/src/main/java/com/lunhan/water/host/controller/api/UserController.java
+++ b/src/main/java/com/lunhan/water/host/controller/api/UserController.java
@@ -6,7 +6,9 @@
 import com.lunhan.water.common.util.ParameterUtil;
 import com.lunhan.water.common.validator.ParameterValidateResult;
 import com.lunhan.water.common.validator.ParameterValidator;
+import com.lunhan.water.entity.enums.EPayType;
 import com.lunhan.water.entity.request.paymentrecords.ReqBuyWater;
+import com.lunhan.water.entity.request.rechargerecords.Recharge;
 import com.lunhan.water.entity.request.userlogin.ReqModifyUserLogin;
 import com.lunhan.water.entity.search.SearchPaymentRecords;
 import com.lunhan.water.entity.search.SearchRechargeRecords;
@@ -110,4 +112,25 @@
         request.setUserId(user.getId());
         return rechargeRecordsService.search(request);
     }
+    /**
+     * 用户充值
+     *
+     * @author li。ling。yu
+     * @date 2023/08/04
+     */
+    @PostMapping(value = "fees")
+    public ExecutedResult<String> pay(@RequestBody Recharge request) {
+        //#region 参数验证
+        ParameterValidator validator = new ParameterValidator()
+                // 必须大于0
+                .addGreater(ParameterUtil.named("充值金额"), request.getRechargeAmount(), BigDecimal.ZERO)
+                ;
+        LoginUserDTO loginUser = super.getTokenUser();
+        ParameterValidateResult result = validator.validate();
+        if (result.getIsFiled()) {
+            return failed(result.getErrorMsg());
+        }
+        //#endregion
+        return this.rechargeRecordsService.recharge(request,loginUser);
+    }
 }
diff --git a/src/main/java/com/lunhan/water/repository/po/HeartbeatDataPO.java b/src/main/java/com/lunhan/water/repository/po/HeartbeatDataPO.java
index 858d534..879b352 100644
--- a/src/main/java/com/lunhan/water/repository/po/HeartbeatDataPO.java
+++ b/src/main/java/com/lunhan/water/repository/po/HeartbeatDataPO.java
@@ -41,16 +41,21 @@
 	 */
 	private Long id;
 	/**
-	 * null
+	 * 设备code
 	 */
 	@TableField(value = "data_key")
 	private String dataKey;
 	/**
-	 * null
+	 * 收到的心跳
 	 */
 	@TableField(value = "data_value")
 	private Integer dataValue;
 	/**
+	 * 发送心跳
+	 */
+	@TableField(value = "send_value")
+	private Integer sendValue;
+	/**
 	 * null
 	 */
 	@TableLogic
diff --git a/src/main/java/com/lunhan/water/service/PaymentRecordsService.java b/src/main/java/com/lunhan/water/service/PaymentRecordsService.java
index e3bd5c6..340600f 100644
--- a/src/main/java/com/lunhan/water/service/PaymentRecordsService.java
+++ b/src/main/java/com/lunhan/water/service/PaymentRecordsService.java
@@ -235,8 +235,9 @@
         data.addProperty(facilityPO.getFacilityCode() + "_amount", request.getAmount().multiply(BigDecimal.valueOf(100)));
         data.addProperty(facilityPO.getFacilityCode() + "_user", userLoginPO.getUserCode());
         data.addProperty(facilityPO.getFacilityCode() + "_state", 1);
+        boolean send=false;
         if (Objects.nonNull(mqttServer)) {
-            mqttServer.send(topic, data.toString());
+            send = mqttServer.send(topic, data.toString());
         } else {
             try {
                 System.out.println("mqttServer bean尚未初始化...");
@@ -245,8 +246,11 @@
             } catch (Exception ignored) {
             }
             if (Objects.nonNull(mqttServer)) {
-                mqttServer.send(topic, data.toString());
+                send=mqttServer.send(topic, data.toString());
             }
+        }
+        if(!send){
+            ExecutedResult.failed("通讯断开!");
         }
         return ExecutedResult.success("请点击设备取水按钮取水");
     }
@@ -361,14 +365,37 @@
     public void uploadState(String time,WaterFacilityPO facilityPO, List<CountVO> listVo){
         CountVO heartbeatVO = listVo.stream().filter(x -> x.getName().equals(facilityPO.getFacilityCode() + "_heartbeat")).findFirst().orElse(null);
         HeartbeatDataPO heartbeatDataPO = heartbeatDataMapper.getByKey(facilityPO.getFacilityCode());
-        if(Objects.isNull(heartbeatDataPO)){
+        if(Objects.nonNull(heartbeatDataPO)){
+            heartbeatDataPO.setDataValue(Integer.valueOf(heartbeatVO.getValue()));
+            heartbeatDataPO.setSendValue(heartbeatDataPO.getSendValue()==0?1:0);
+            heartbeatDataMapper.updateById(heartbeatDataPO);
+        }else {
             HeartbeatDataPO dataPO=new HeartbeatDataPO();
             dataPO.setDataKey(facilityPO.getFacilityCode());
+            dataPO.setSendValue(0);
             dataPO.setDataValue(Integer.valueOf(heartbeatVO.getValue()));
             dataPO.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
             dataPO.setRemark(LocalDateTimeUtil.nowDateTimeStr());
             heartbeatDataMapper.insert(dataPO);
         }
+        //发送心跳数据
+        // 发送心跳
+        String topic = "zundong/"+facilityPO.getFacilityCode()+"/remotecontrol/";
+        JsonObject data = new JsonObject();
+        data.addProperty(facilityPO.getFacilityCode()+"_heartbeat", heartbeatDataPO.getSendValue()==0?1:0);
+        if (Objects.nonNull(mqttServer)) {
+            mqttServer.send(topic, data.toString());
+        } else {
+            try {
+                System.out.println("mqttServer bean尚未初始化...");
+                mqttServer = SpringUtil.getBean(MQTTServer.class);
+                System.out.println("mqttServer 初始化bean成功!");
+            } catch (Exception ignored) {
+            }
+            if (Objects.nonNull(mqttServer)) {
+                mqttServer.send(topic, data.toString());
+            }
+        }
     }
     public ExecutedResult<List<PaymentRecordsVO>> getList(List<Long> listId) {
         List<PaymentRecordsVO> result = new ArrayList<>();
diff --git a/src/main/java/com/lunhan/water/service/PaymentServices.java b/src/main/java/com/lunhan/water/service/PaymentServices.java
index 3e3a839..11b0c75 100644
--- a/src/main/java/com/lunhan/water/service/PaymentServices.java
+++ b/src/main/java/com/lunhan/water/service/PaymentServices.java
@@ -20,6 +20,7 @@
 import com.lunhan.water.entity.request.pay.ReqPayRefund;
 
 import com.lunhan.water.repository.impl.*;
+import com.lunhan.water.repository.mapper.SysDictTypeMapper;
 import com.lunhan.water.repository.po.*;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,6 +34,7 @@
 import java.nio.charset.StandardCharsets;
 import java.time.LocalDateTime;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
@@ -58,6 +60,10 @@
     private TradeRecordMapperImpl tradeRecordDao;
     @Autowired
     private RedisTemplate<String, Object> redisTemplate;
+    @Autowired
+    private  SysDictTypeMapperImpl sysDictTypeMapper;
+    @Autowired
+    private SysDictDataMapperImpl sysDictDataMapper;
 
 
     /**
@@ -111,7 +117,7 @@
                 item.setPaymentMethod(EPayType.WX_PAY.getDesc());
                 item.setRechargeStatus(EYesOrNo.NO.getValue());
                 item.setRechargeAmount(request.getTradeAmount());
-                item.setComment("水卡充值");
+                item.setComment("余额充值");
                 item.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
                 item.setCreateUser(loginUser.getUserId());
                 item.setCreateUserName(loginUser.getNickName());
@@ -378,8 +384,17 @@
                         UserLoginPO user = userLoginMapper.getById(rechargeOrderPO.getUserId());
                         UserLoginPO userLoginPO = new UserLoginPO();
                         userLoginPO.setId(user.getId());
-                        //余额加上交易金额=充值后的余额
-                        userLoginPO.setBalance(userLoginPO.getBalance().add(trade.getTradeAmount()));
+                        //将充值金额转换为水量
+                        List<SysDictDataPO> feesAmount = sysDictDataMapper.getListByType("fees_amount");
+                        if(ListUtil.isNotNullOrEmpty(feesAmount)){
+                            SysDictDataPO sysDictDataPO = feesAmount.get(0);
+                            BigDecimal bigDecimal = trade.getTradeAmount().multiply(new BigDecimal(sysDictDataPO.getDictValue())).setScale(2, BigDecimal.ROUND_DOWN);
+                            userLoginPO.setBalance(bigDecimal);
+                        }else {
+                            //默认单价
+                            BigDecimal bigDecimal = trade.getTradeAmount().multiply(new BigDecimal(3)).setScale(2, BigDecimal.ROUND_DOWN);
+                            userLoginPO.setBalance(bigDecimal);
+                        }
                         int modify = userLoginMapper.updateById(userLoginPO);
                         //添加资金明细记录
                         UserCapitalChangePO changePO = new UserCapitalChangePO();
diff --git a/src/main/java/com/lunhan/water/service/RechargeRecordsService.java b/src/main/java/com/lunhan/water/service/RechargeRecordsService.java
index 3c9054e..bc49f12 100644
--- a/src/main/java/com/lunhan/water/service/RechargeRecordsService.java
+++ b/src/main/java/com/lunhan/water/service/RechargeRecordsService.java
@@ -24,12 +24,22 @@
 
 import com.lunhan.water.common.*;
 import com.lunhan.water.common.enums.*;
+import com.lunhan.water.common.jwt.LoginUserDTO;
 import com.lunhan.water.common.model.Tuple;
 import com.lunhan.water.common.util.*;
+import com.lunhan.water.entity.enums.EPayState;
+import com.lunhan.water.entity.enums.EPayType;
+import com.lunhan.water.entity.request.rechargerecords.Recharge;
+import com.lunhan.water.repository.impl.RechargeOrderMapperImpl;
+import com.lunhan.water.repository.impl.UserLoginMapperImpl;
+import com.lunhan.water.repository.po.RechargeOrderPO;
+import com.lunhan.water.repository.po.UserLoginPO;
 import com.lunhan.water.repository.vo.PaymentRecordsVO;
 import org.apache.commons.lang3.BooleanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 import com.lunhan.water.repository.impl.RechargeRecordsMapperImpl;
@@ -39,6 +49,7 @@
 import com.lunhan.water.entity.search.SearchRechargeRecords;
 import com.lunhan.water.repository.vo.RechargeRecordsVO;
 import com.lunhan.water.service.convert.RechargeRecordsConvert;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 充值记录
@@ -48,6 +59,10 @@
 public class RechargeRecordsService extends BaseService {
     @Autowired
     private RechargeRecordsMapperImpl mapper;
+    @Autowired
+    private UserLoginMapperImpl userLoginMapper;
+    @Autowired
+    private RechargeOrderMapperImpl rechargeOrderMapper;
 
     public ExecutedResult<Long> create(ReqCreateRechargeRecords request) {
         // 转换po
@@ -194,7 +209,36 @@
         }
         return ExecutedResult.success(result);
     }
-
+    /**
+     * 充值订单
+     *
+     * @param request
+     * @param loginUser
+     * @return
+     */
+    public ExecutedResult<String> recharge(Recharge request, LoginUserDTO loginUser) {
+        Long now = LocalDateTimeUtil.nowTimeStamp();
+        // 修改用户余额
+        UserLoginPO userLoginPO = userLoginMapper.get4Openid(loginUser.getUserId());
+        if (Objects.isNull(userLoginPO)) {
+            return ExecutedResult.failed("用户信息不存在!");
+        }
+        RechargeOrderPO orderPO=new RechargeOrderPO();
+        orderPO.setUserId(userLoginPO.getId());
+        orderPO.setOrderNo("CZ"+SnowFlakeUtil.getId());
+        orderPO.setOrderAmount(request.getRechargeAmount());
+        orderPO.setDiscountAmount(BigDecimal.ZERO);
+        orderPO.setPaymentAmount(request.getRechargeAmount());
+        orderPO.setPayType(EPayType.WX_PAY.getValue());
+        orderPO.setPayState(EPayState.WAITING.getValue());
+        orderPO.setCreateTime(now);
+        orderPO.setRemark("后台充值");
+        int insert = rechargeOrderMapper.insert(orderPO);
+        if(insert>0){
+            return ExecutedResult.success(orderPO.getOrderNo());
+        }
+        return ExecutedResult.failed("提交充值订单失败!");
+    }
     public ExecutedResult<PagerResult<RechargeRecordsVO>> search(SearchRechargeRecords search) {
         // 处理创建时间范围-查询参数
         if(search.getDateType()!=null&&search.getDateType()>0){
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index b566561..a1e9b0f 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -48,7 +48,7 @@
   enable: false
 mqtt:
   # 是否启用
-  enable: true
+  enable: false
   host: 113.250.189.120
   port: 1885
   user: admin
diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml
index 6a71143..4914ca0 100644
--- a/src/main/resources/application-test.yml
+++ b/src/main/resources/application-test.yml
@@ -6,7 +6,7 @@
     date-format: yyyy-MM-dd HH:mm:ss
   datasource:
     driver-class-name: org.postgresql.Driver
-    url: jdbc:postgresql://113.250.189.120:57654/test_db1
+    url: jdbc:postgresql://113.250.189.120:57654/water_ration_system
     username: lunhan
     password: lunhan.20240330
     druid:
@@ -41,3 +41,32 @@
 quartz:
   # 是否启用
   enable: true
+
+mqtt:
+  # 是否启用
+  enable: true
+  host: 113.250.189.120
+  port: 1885
+  user: admin
+  password: public
+  # 订阅主题
+  topic: zundong/#
+  # 订阅消息的客户端id
+  clientId: water-ration-service-dev
+  # 连接超时时间
+  connectionTimeout: 10
+  # 心跳
+  keepAliveInterval: 20
+  # 发送消息的客户端id
+  serverClientId: water-ration-service-publish-dev
+pay:
+  weiXin:
+    merchantId: 1610112902
+    merchantKey: HWYTddj1235jdskDAS5353fgsdAD4S53
+    keyPath: d:/data/wxpay/apiclient_cert.p12 # 商户证书路径 xxx_cert.p12
+    privateKeyPath: d:/data/wxpay/apiclient_key.pem # 商户证书路径 xxx_key.pem
+    certificateSn: 48FC0C8D96B147CE751AEEBC882C20676F900581 # 微信支付API证书序列号
+    appID: wx08c82dac406bee56
+    notifyBasicUrl: https://www.huiwuyuntong.com/water-qinghe-local # 本地调试回调,请用frpc代理天翼云服务器端口 11101,到本机的8929
+
+

--
Gitblit v1.9.3