liulin
2025-07-04 5e388cfb25b24a154e28b3c42143493fc77f8e56
添加mqtt
已添加1个文件
已修改7个文件
193 ■■■■■ 文件已修改
src/main/java/com/lunhan/water/entity/request/rechargerecords/Recharge.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lunhan/water/host/controller/api/UserController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lunhan/water/repository/po/HeartbeatDataPO.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lunhan/water/service/PaymentRecordsService.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lunhan/water/service/PaymentServices.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lunhan/water/service/RechargeRecordsService.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-test.yml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
}
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);
    }
}
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
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<>();
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();
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){
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
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