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