fb2f11d7d502ceacbe7fbed176bea4ab0f152f69..774c0b57de71a09c1965a89a1a08f9196b23fcd5
2025-07-04 liulin
修改支付接口
774c0b 对比 | 目录
2025-07-04 liulin
修改支付接口
be685d 对比 | 目录
2025-07-04 liulin
修改支付接口
1ba7e1 对比 | 目录
2025-07-04 liulin
修改支付接口
c89d90 对比 | 目录
2025-07-04 liulin
修改支付接口
aeb4cf 对比 | 目录
2025-07-04 liulin
修改支付接口
4b43fa 对比 | 目录
2025-07-04 liulin
添加mqtt
48525d 对比 | 目录
2025-07-04 liulin
添加mqtt
5e388c 对比 | 目录
已添加1个文件
已修改9个文件
250 ■■■■ 文件已修改
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/host/controller/pay/PaymentServicesController.java 4 ●●● 补丁 | 查看 | 原始文档 | 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 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lunhan/water/service/RechargeRecordsService.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 10 ●●●●● 补丁 | 查看 | 原始文档 | 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/host/controller/pay/PaymentServicesController.java
@@ -49,10 +49,8 @@
        ParameterValidator validator = new ParameterValidator()
                // 必须是枚举值
                .addMustEnum(ParameterUtil.named("业务类型"), request.getBusinessType(), EBusinessType.class)
                // 必须大于0
                .addGreater(ParameterUtil.named("交易金额"), request.getTradeAmount(), BigDecimal.ZERO)
                //水表编号不能为空
                .addNotNullOrEmpty(ParameterUtil.named("支付token"), request.getPayToken());
                //.addNotNullOrEmpty(ParameterUtil.named("支付token"), request.getPayToken());
                ;
        ParameterValidateResult result = validator.validate();
        if (result.getIsFiled()) {
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;
    /**
@@ -69,12 +75,12 @@
    @Transactional(rollbackFor = Exception.class)
    public ExecutedResult<Map<String, Object>> weiXinPay(LoginUserDTO loginUser, ReqCreatePay request) {
        //判断token是否存在,如果不存在,说明重复提交订单
        String redisToken = redisTemplate.opsForValue().get(request.getPayToken()).toString();
        if (StringUtil.isNullOrEmpty(redisToken)) {
            throw new RuntimeException("请勿重复提交充值订单!");
        }
        //删除token
        redisTemplate.delete(request.getPayToken());
//        String redisToken = redisTemplate.opsForValue().get(request.getPayToken()).toString();
//        if (StringUtil.isNullOrEmpty(redisToken)) {
//            throw new RuntimeException("请勿重复提交充值订单!");
//        }
//        //删除token
//        redisTemplate.delete(request.getPayToken());
        EBusinessType type = EBusinessType.getByValue(request.getBusinessType());
        if (Objects.isNull(type)) {
@@ -106,12 +112,24 @@
                request.setBusinessComment("用户充值");
                //添加充值记录
                RechargeRecordsPO item = new RechargeRecordsPO();
                item.setUserId(user.getId());
                //将充值金额转换为水量
                List<SysDictDataPO> feesAmount = sysDictDataMapper.getListByType("fees_amount");
                if(ListUtil.isNotNullOrEmpty(feesAmount)){
                    SysDictDataPO sysDictDataPO = feesAmount.get(0);
                    BigDecimal bigDecimal = request.getTradeAmount().multiply(new BigDecimal(sysDictDataPO.getDictValue())).setScale(2, BigDecimal.ROUND_DOWN);
                    item.setRechargeWater(bigDecimal);
                }else {
                    //默认单价
                    BigDecimal bigDecimal =request.getTradeAmount().multiply(new BigDecimal(3)).setScale(2, BigDecimal.ROUND_DOWN);
                    item.setRechargeWater(bigDecimal);
                }
                item.setRechargeOrder(request.getBusinessNo());
                item.setRechargeType(ERechargeType.MOBILE.getDesc());
                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());
@@ -376,20 +394,32 @@
                        rechargeOrderMapper.updateById(rechargeOrderPO);
                        //修改用户余额
                        UserLoginPO user = userLoginMapper.getById(rechargeOrderPO.getUserId());
                        UserLoginPO userLoginPO = new UserLoginPO();
                        userLoginPO.setId(user.getId());
                        //余额加上交易金额=充值后的余额
                        userLoginPO.setBalance(userLoginPO.getBalance().add(trade.getTradeAmount()));
                        int modify = userLoginMapper.updateById(userLoginPO);
                        //将充值金额转换为水量
                        BigDecimal afterMoney=BigDecimal.ZERO;
                        BigDecimal bigDecimal=BigDecimal.ZERO;
                        BigDecimal beforeMoney=user.getBalance();
                        List<SysDictDataPO> feesAmount = sysDictDataMapper.getListByType("fees_amount");
                        if(ListUtil.isNotNullOrEmpty(feesAmount)){
                            SysDictDataPO sysDictDataPO = feesAmount.get(0);
                             bigDecimal = trade.getTradeAmount().multiply(new BigDecimal(sysDictDataPO.getDictValue())).setScale(2, BigDecimal.ROUND_DOWN);
                            afterMoney=user.getBalance().add(bigDecimal);
                        }else {
                            //默认单价
                             bigDecimal= trade.getTradeAmount().multiply(new BigDecimal(3)).setScale(2, BigDecimal.ROUND_DOWN);
                             afterMoney=user.getBalance().add(bigDecimal);
                        }
                        user.setBalance(afterMoney);
                        int modify = userLoginMapper.updateById(user);
                        //添加资金明细记录
                        UserCapitalChangePO changePO = new UserCapitalChangePO();
                        changePO.setUserId(user.getId());
                        changePO.setBusiness(ECapitalChange.MOBILE_Recharge.getValue());
                        changePO.setBusinessName(ECapitalChange.MOBILE_Recharge.getDesc());
                        changePO.setBusinessCode(recordsPO.getRechargeOrder());
                        changePO.setChangeMoney(paidAmount);
                        changePO.setBeforeMoney(user.getBalance());
                        changePO.setAfterMoney(userLoginPO.getBalance());
                        changePO.setChangeMoney(bigDecimal);
                        changePO.setBeforeMoney(beforeMoney);
                        changePO.setAfterMoney(afterMoney);
                        changePO.setDescription("微信充值");
                        changePO.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
                        changePO.setCreateUser("0");
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
@@ -70,6 +70,6 @@
    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
    appID: wxd361a7f92bb0c73a
    notifyBasicUrl: https://www.huiwuyuntong.com/water-ration-beta # 本地调试回调,请用frpc代理天翼云服务器端口 11101,到本机的8929
src/main/resources/application-prod.yml
@@ -57,3 +57,13 @@
quartz:
  # 是否启用
  enable: true
pay:
  weiXin:
    merchantId: 1610112902
    merchantKey: HWYTddj1235jdskDAS5353fgsdAD4S53
    keyPath: /data/ssl/hwyt/wxpay/apiclient_cert.p12 # 商户证书路径 xxx_cert.p12
    privateKeyPath: /data/ssl/hwyt/wxpay/apiclient_key.pem # 商户证书路径 xxx_key.pem
    certificateSn: 48FC0C8D96B147CE751AEEBC882C20676F900581 # 微信支付API证书序列号
    appID: wxd361a7f92bb0c73a
    notifyBasicUrl: https://www.huiwuyuntong.com/water-ration-beta # 本地调试回调,请用frpc代理天翼云服务器端口 11101,到本机的8929
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: /data/ssl/hwyt/wxpay/apiclient_cert.p12 # 商户证书路径 xxx_cert.p12
    privateKeyPath: /data/ssl/hwyt/wxpay/apiclient_key.pem # 商户证书路径 xxx_key.pem
    certificateSn: 48FC0C8D96B147CE751AEEBC882C20676F900581 # 微信支付API证书序列号
    appID: wxd361a7f92bb0c73a
    notifyBasicUrl: https://www.huiwuyuntong.com/water-ration-beta # 本地调试回调,请用frpc代理天翼云服务器端口 11101,到本机的8929