diff --git a/electripper-admin/src/main/java/com/ruoyi/web/controller/app/AppVerifyController.java b/electripper-admin/src/main/java/com/ruoyi/web/controller/app/AppVerifyController.java index 563e517..dcf4ef4 100644 --- a/electripper-admin/src/main/java/com/ruoyi/web/controller/app/AppVerifyController.java +++ b/electripper-admin/src/main/java/com/ruoyi/web/controller/app/AppVerifyController.java @@ -144,10 +144,10 @@ public class AppVerifyController extends BaseController if(order.getRuleId()==null){ return error("=============================================ruleId未传!!!============================================="); } - //设备是否在线 - if(!asDeviceService.isOnline(order.getSn())){ - return error("设备不在线"); - } +// //设备是否在线 +// if(!asDeviceService.isOnline(order.getSn())){ +// return error("设备不在线"); +// } //实名判断 if(!asUserService.checkIsAuthentication(order.getUserId())){ return error("您还未实名,请先实名"); @@ -265,16 +265,15 @@ public class AppVerifyController extends BaseController if(userId!=null){ AsUser asUser = asUserService.selectUserById(userId); if(asUser!=null){ - BigDecimal result = asUser.getBalance().subtract(deposit); - int comparisonResult = result.compareTo(BigDecimal.ZERO); + int comparisonResult = deposit.compareTo(BigDecimal.ZERO); if (comparisonResult < 0) { throw new ServiceException("余额不足,扣除押金后余额小于0"); } - asUser.setBalance(result);//更新用余额 + asUser.setBalance(deposit);//更新用余额 // 更新用户并更新缓存 LoginUser loginUser = SecurityUtils.getLoginUser(); AsUser currentUser = loginUser.getAsUser(); - currentUser.setBalance(result); + currentUser.setBalance(deposit); if (asUserService.updateUserProfile(currentUser) > 0) { logger.info("【提现金额】更新用户缓存:"+ JSON.toJSON(currentUser)); @@ -661,7 +660,7 @@ public class AppVerifyController extends BaseController int updateUser = asUserService.updateUser(asUser); if (updateUser>0) { - logger.info("【提现金额】保存身份信息成功"); + logger.info("【实名认证】保存身份信息成功"); // 更新缓存用户信息 tokenService.setLoginUser(loginUser); } diff --git a/electripper-admin/src/main/java/com/ruoyi/web/controller/common/CallbackController.java b/electripper-admin/src/main/java/com/ruoyi/web/controller/common/CallbackController.java index 940251d..e2f4734 100644 --- a/electripper-admin/src/main/java/com/ruoyi/web/controller/common/CallbackController.java +++ b/electripper-admin/src/main/java/com/ruoyi/web/controller/common/CallbackController.java @@ -31,7 +31,9 @@ public class CallbackController { @RequestMapping(value = "/wechat", method = RequestMethod.POST) public ResponseEntity weChat(HttpServletRequest request) { try { - callbackService.weChat(request); + synchronized (callbackService) { // 注意这里的锁对象选择很重要 + callbackService.weChat(request); + } } catch (ValidationException e) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(null); } catch (Exception e) { diff --git a/electripper-admin/src/main/resources/application-druid.yml b/electripper-admin/src/main/resources/application-druid.yml index e7c579a..5651be6 100644 --- a/electripper-admin/src/main/resources/application-druid.yml +++ b/electripper-admin/src/main/resources/application-druid.yml @@ -6,9 +6,12 @@ spring: druid: # 主库数据源 master: - url: jdbc:mysql://localhost:3306/electripper?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +# url: jdbc:mysql://localhost:3306/electripper?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +# username: root +# password: 123456 + url: jdbc:mysql://106.75.233.135:3306/electripper?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root - password: 123456 + password: 9671e015b05b3f11 # 从库数据源 slave: # 从数据源开关/默认关闭 diff --git a/electripper-admin/src/main/resources/application.yml b/electripper-admin/src/main/resources/application.yml index 5314e02..7ca29f3 100644 --- a/electripper-admin/src/main/resources/application.yml +++ b/electripper-admin/src/main/resources/application.yml @@ -196,8 +196,8 @@ wx: merchantSerialNumber: 66910F800A60768020F07D39A56AE701574A16AE refund: # 退款回调地址 - notifyUrl: https://dianche.chuantewulian.cn/prod-api/payment/callback/wechat/refund - +# notifyUrl: https://dianche.chuantewulian.cn/prod-api/payment/callback/wechat/refund + notifyUrl: http://124.221.246.124:2289/payment/callback/wechat/refund # 锁设置 lock: # 锁前缀 diff --git a/electripper-system/src/main/java/com/ruoyi/system/mapper/EtDividendDetailMapper.java b/electripper-system/src/main/java/com/ruoyi/system/mapper/EtDividendDetailMapper.java index 95c8a3e..761b88d 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/mapper/EtDividendDetailMapper.java +++ b/electripper-system/src/main/java/com/ruoyi/system/mapper/EtDividendDetailMapper.java @@ -67,4 +67,11 @@ public interface EtDividendDetailMapper */ public int isDividendComputed(String date); + /** + * 根据订单号查询分账明细 + * @param orderNo + * @return + */ + public List selectEtDividendDetailByOrderNo(String orderNo); + } diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/IEtDividendDetailService.java b/electripper-system/src/main/java/com/ruoyi/system/service/IEtDividendDetailService.java index 0a01b1e..9b9f344 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/IEtDividendDetailService.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/IEtDividendDetailService.java @@ -19,6 +19,14 @@ public interface IEtDividendDetailService */ public EtDividendDetail selectEtDividendDetailById(Long id); + /** + * 查询分账明细 + * + * @param orderNo 订单号 + * @return 分账明细 + */ + public List selectEtDividendDetailByOrderNo(String orderNo); + /** * 查询分账明细列表 * diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/impl/AsDeviceServiceImpl.java b/electripper-system/src/main/java/com/ruoyi/system/service/impl/AsDeviceServiceImpl.java index cb51654..2b20e97 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/impl/AsDeviceServiceImpl.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/impl/AsDeviceServiceImpl.java @@ -437,7 +437,10 @@ public class AsDeviceServiceImpl extends ServiceImpl i String finalOrderNo = orderNo; Boolean execute = transactionTemplate.execute(e -> { /** 2.发送命令*/ - sendCommand(asDevice.getMac(), token,IotConstants.COMMAND_OPEN,"编号开锁"); + ResponseVo responseVo = sendCommandWithResp(asDevice.getMac(), token, IotConstants.COMMAND_OPEN, "编号开锁"); + if(responseVo.getCode() != 0){ + return Boolean.FALSE; + } /** 3.更新车辆状态*/ asDevice.setLockStatus(ServiceConstants.LOCK_STATUS_OPEN); asDevice.setStatus(ServiceConstants.VEHICLE_STATUS_IN_USING); @@ -854,9 +857,6 @@ public class AsDeviceServiceImpl extends ServiceImpl i OrderResponse orderResponse = new OrderResponse(); String orderNo = appointmentVo.getOrderNo(); EtOrder order = etOrderService.selectEtOrderByOrderNo(orderNo); - //1.发送开锁命令并更新车辆状态 - String token = Token.getToken(); - sendCommand(asDevice.getMac(), token,IotConstants.COMMAND_CLOSE,"取消预约关锁"); /** 5.记录行程*/ int tripLog = tripLogService.tripLog(order.getOrderNo(),order.getSn(),ServiceConstants.TRIP_LOG_TYPE_UNLOCK_RIDE); if(tripLog==0){ diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/impl/AsUserServiceImpl.java b/electripper-system/src/main/java/com/ruoyi/system/service/impl/AsUserServiceImpl.java index 496b098..5444229 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/impl/AsUserServiceImpl.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/impl/AsUserServiceImpl.java @@ -516,7 +516,6 @@ public class AsUserServiceImpl implements IAsUserService String idCard = authenticationVo.getIdCard(); String realName = authenticationVo.getRealName(); Object o = VerifyIdentityUtil.verifyIdentity(verifyUrl, appcode, idCard, realName); - return o; } diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/impl/CallbackServiceImpl.java b/electripper-system/src/main/java/com/ruoyi/system/service/impl/CallbackServiceImpl.java index a1ba4fd..0c3323e 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/impl/CallbackServiceImpl.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/impl/CallbackServiceImpl.java @@ -18,9 +18,7 @@ import com.ruoyi.common.utils.http.HttpUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.*; import com.ruoyi.system.domain.vo.AttachVo; -import com.ruoyi.system.mapper.AsDeviceMapper; -import com.ruoyi.system.mapper.AsUserMapper; -import com.ruoyi.system.mapper.SysUserMapper; +import com.ruoyi.system.mapper.*; import com.ruoyi.system.service.*; import com.wechat.pay.java.core.notification.Notification; import com.wechat.pay.java.core.notification.NotificationParser; @@ -45,6 +43,7 @@ import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.util.*; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; /** @@ -58,6 +57,12 @@ public class CallbackServiceImpl implements CallbackService { @Autowired private IEtOrderService orderService; + @Resource + private EtOrderMapper etOrderMapper; + + @Resource + private EtRefundMapper etRefundMapper; + @Autowired private IAsDeviceService asDeviceService; @@ -108,7 +113,7 @@ public class CallbackServiceImpl implements CallbackService { * 微信支付回调 */ @Override - @SneakyThrows +// @SneakyThrows @Transactional public void weChat(HttpServletRequest request) { String body = HttpUtils.getBody(request); @@ -162,7 +167,12 @@ public class CallbackServiceImpl implements CallbackService { if(autoRefundDeposit!=null && autoRefundDeposit>0){ //创建一个定时器,计算出退还时间后,执行退款操作 // 往后推autoRefundDeposit小时执行 -// scheduledExecutorService.schedule(() -> { + scheduledExecutorService.schedule(() -> { + // 如果退款成功直接返回 + EtRefund refund2 = etRefundMapper.selectEtRefundByOrderNo(order.getOrderNo()); + if(ObjectUtil.isNotNull(refund2) && refund2.getRefundResult().equals(Constants.SUCCESS2)){ + return; + } logger.info("【微信支付回调】退还押金定时任务开始"); // 退款 Long userId = order.getUserId(); @@ -171,7 +181,7 @@ public class CallbackServiceImpl implements CallbackService { etOrder.setPaid(ServiceConstants.ORDER_PAY_STATUS_PAID); etOrder.setType(ServiceConstants.ORDER_TYPE_DEPOSIT); etOrder.setStatus(ServiceConstants.ORDER_STATUS_ORDER_END); - List etOrders = orderService.selectEtOrderList(etOrder); + List etOrders = etOrderMapper.selectEtOrderList(etOrder); if (etOrders.size() == 0 || ObjectUtil.isNull(etOrders) ) { throw new ServiceException("押金充值记录不存在"); } @@ -185,8 +195,10 @@ public class CallbackServiceImpl implements CallbackService { if(newestOrder.getTotalFee().compareTo(new BigDecimal(deposit))!=0){ throw new ServiceException("押金充值记录与当前运营区的押金不同"); } - Refund refund = wxPayService.refund(newestOrder,autoRefundDeposit+"个小时后自动退押金", newestOrder.getTotalFee()); - EtRefund refund1= orderService.createRefund(etOrder, newestOrder.getTotalFee(), null, null, null, null, refund,ServiceConstants.REFUND_TYPE_DEPOSIT); + String reason = autoRefundDeposit + "个小时后自动退押金"; + Refund refund = wxPayService.refund(newestOrder,reason, newestOrder.getTotalFee()); + newestOrder.setReason(reason); + EtRefund refund1= orderService.createRefund(newestOrder, newestOrder.getTotalFee(), null, null, null, null, refund,ServiceConstants.REFUND_TYPE_DEPOSIT); int i = etRefundService.insertEtRefund(refund1); if(i>0){ logger.info("【自动退款】保存退款对象成功"); @@ -195,17 +207,22 @@ public class CallbackServiceImpl implements CallbackService { capitalFlowRecords(newestOrder,ServiceConstants.FLOW_TYPE_DISBURSE,ServiceConstants.ORDER_TYPE_DEPOSIT_REFUND); // 更新用户信息,清除缓存 - asUser.setBalance(asUser.getBalance().subtract(newestOrder.getTotalFee())); + asUser.setBalance(BigDecimal.ZERO); int updateUser = userService.updateUser(asUser); - Collection keys = SpringUtils.getBean(RedisCache.class).keys(CacheConstants.LOGIN_TOKEN_KEY + "*"); - redisCache.deleteObject(keys); if(updateUser>0){ + Collection keys = SpringUtils.getBean(RedisCache.class).keys(CacheConstants.LOGIN_TOKEN_KEY + "*"); + redisCache.deleteObject(keys); logger.info("【微信支付回调】退还押金,更新用户余额成功!"); } + logger.info("=================【微信支付回调】退还押金定时任务结束!!!=================="); } else { throw new ServiceException("没有找到押金充值记录"); } -// }, autoRefundDeposit, TimeUnit.HOURS); + }, autoRefundDeposit , TimeUnit.HOURS); + } + List etDividendDetails = dividendDetailService.selectEtDividendDetailByOrderNo(order.getOrderNo()); + if(ObjectUtil.isNotNull(etDividendDetails) && etDividendDetails.size()>0){ + return; } logger.info("=================【微信支付回调】开始请求分账=================="); logger.info("区域对象====="+JSON.toJSONString(area)); @@ -279,7 +296,7 @@ public class CallbackServiceImpl implements CallbackService { logger.info("【微信支付回调】押金支付"); // 4-押金支付 order.setStatus(ServiceConstants.ORDER_STATUS_ORDER_END); - asUser.setBalance(asUser.getBalance().add(order.getTotalFee())); + asUser.setBalance(order.getTotalFee()); order.setMark("押金支付"); // 新增资金流水记录 @@ -314,6 +331,7 @@ public class CallbackServiceImpl implements CallbackService { logger.error("【微信支付回调】更新用户押金失败"); throw new ServiceException("【微信支付回调】更新用户押金失败"); } + logger.info("=================【微信支付回调】全部结束!!!!!=================="); } } } @@ -357,7 +375,7 @@ public class CallbackServiceImpl implements CallbackService { // todo capitalFlow.setOperatorBalance(); } } - BigDecimal bigDecimal = new BigDecimal(handlingCharge); + BigDecimal bigDecimal = new BigDecimal(handlingCharge).divide(new BigDecimal(1000), 2, BigDecimal.ROUND_HALF_UP); capitalFlow.setHandlingCharge(bigDecimal.multiply(order.getTotalFee()));//手续费 capitalFlow.setPayType(ServiceConstants.PAY_TYPE_WX); capitalFlow.setCreateTime(DateUtils.getNowDate()); @@ -399,6 +417,7 @@ public class CallbackServiceImpl implements CallbackService { EtOrder order = orderService.selectEtOrderByOrderNo(refund.getOrderNo()); // 新增资金流水记录 capitalFlowRecords(order,ServiceConstants.FLOW_TYPE_DISBURSE,ServiceConstants.ORDER_TYPE_RIDING_REFUND); + logger.info("【微信退款回调】全部结束!!!!!"); } } } diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtDividendDetailServiceImpl.java b/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtDividendDetailServiceImpl.java index 0af6b91..c35e286 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtDividendDetailServiceImpl.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtDividendDetailServiceImpl.java @@ -32,6 +32,11 @@ public class EtDividendDetailServiceImpl implements IEtDividendDetailService return etDividendDetailMapper.selectEtDividendDetailById(id); } + @Override + public List selectEtDividendDetailByOrderNo(String orderNo) { + return etDividendDetailMapper.selectEtDividendDetailByOrderNo(orderNo); + } + /** * 查询分账明细列表 * diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtOrderServiceImpl.java b/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtOrderServiceImpl.java index 2a6f9d5..6123cc7 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtOrderServiceImpl.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtOrderServiceImpl.java @@ -749,20 +749,24 @@ public class EtOrderServiceImpl implements IEtOrderService etRefund.setUserId(etOrder.getUserId()); etRefund.setRefundNo(refund.getOutRefundNo()); etRefund.setType(type); - StringBuilder itemDesc = new StringBuilder(); - if(ObjectUtil.isNotNull(appointmentFee) && !appointmentFee.equals(BigDecimal.ZERO)){ - itemDesc.append("预约费:").append(appointmentFee).append("元,"); + if(type.equals(ServiceConstants.REFUND_TYPE_DEPOSIT)){ + etRefund.setItemDesc("押金自动退款"); + }else{ + StringBuilder itemDesc = new StringBuilder(); + if(ObjectUtil.isNotNull(appointmentFee) && !appointmentFee.equals(BigDecimal.ZERO)){ + itemDesc.append("预约费:").append(appointmentFee).append("元,"); + } + if(ObjectUtil.isNotNull(dispatchFee) && !dispatchFee.equals(BigDecimal.ZERO)){ + itemDesc.append("调度费:").append(dispatchFee).append("元,"); + } + if(ObjectUtil.isNotNull(manageFee) && !manageFee.equals(BigDecimal.ZERO)){ + itemDesc.append("管理费:").append(manageFee).append("元,"); + } + if(ObjectUtil.isNotNull(ridingFee) && !ridingFee.equals(BigDecimal.ZERO)){ + itemDesc.append("骑行费:").append(ridingFee).append("元,"); + } + etRefund.setItemDesc(itemDesc.toString()); } - if(ObjectUtil.isNotNull(dispatchFee) && !dispatchFee.equals(BigDecimal.ZERO)){ - itemDesc.append("调度费:").append(dispatchFee).append("元,"); - } - if(ObjectUtil.isNotNull(manageFee) && !manageFee.equals(BigDecimal.ZERO)){ - itemDesc.append("管理费:").append(manageFee).append("元,"); - } - if(ObjectUtil.isNotNull(ridingFee) && !ridingFee.equals(BigDecimal.ZERO)){ - itemDesc.append("骑行费:").append(ridingFee).append("元,"); - } - etRefund.setItemDesc(itemDesc.toString()); return etRefund; } diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/impl/WxPayService.java b/electripper-system/src/main/java/com/ruoyi/system/service/impl/WxPayService.java index fbeab1a..01de147 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/impl/WxPayService.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/impl/WxPayService.java @@ -160,12 +160,14 @@ public class WxPayService implements IWxPayService { public Refund refund(EtOrder etOrder,String reason,BigDecimal amount) { CreateRequest request = new CreateRequest(); request.setOutTradeNo(etOrder.getOutTradeNo()); - request.setOutRefundNo(IdUtils.randomUUID2()); + request.setOutRefundNo(IdUtils.getOrderNo("ref")); request.setReason(reason); request.setAmount(getAmountReq(etOrder.getTotalFee(),amount)); request.setNotifyUrl(wxPayConfig.getRefundNotifyUrl()); log.info("【退款】请求微信参数:【{}】",JSON.toJSONString(request)); - return refundService2.create(request); + Refund refund = refundService2.create(request); + log.info("【退款】微信返回结果:【{}】",JSON.toJSONString(refund)); + return refund; } /** 请求分账API */ diff --git a/electripper-system/src/main/resources/mapper/system/EtDividendDetailMapper.xml b/electripper-system/src/main/resources/mapper/system/EtDividendDetailMapper.xml index 3118e03..be52b68 100644 --- a/electripper-system/src/main/resources/mapper/system/EtDividendDetailMapper.xml +++ b/electripper-system/src/main/resources/mapper/system/EtDividendDetailMapper.xml @@ -43,6 +43,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" WHERE DATE(create_time) = #{date} + + insert into et_dividend_detail diff --git a/electripper-system/src/main/resources/mapper/system/EtRefundMapper.xml b/electripper-system/src/main/resources/mapper/system/EtRefundMapper.xml index 110f60c..879a784 100644 --- a/electripper-system/src/main/resources/mapper/system/EtRefundMapper.xml +++ b/electripper-system/src/main/resources/mapper/system/EtRefundMapper.xml @@ -14,6 +14,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -21,7 +22,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, refund_no, order_no, user_id, amount, dispatch_fee, manage_fee, riding_fee, appointment_fee, reason, create_time, item_desc,refund_result from et_refund + select id, refund_no, order_no, user_id, amount, dispatch_fee, manage_fee, riding_fee, appointment_fee, type, reason, create_time, item_desc,refund_result from et_refund @@ -63,6 +65,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" manage_fee, riding_fee, appointment_fee, + type, reason, create_time, item_desc, @@ -78,6 +81,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{manageFee}, #{ridingFee}, #{appointmentFee}, + #{type}, #{reason}, #{createTime}, #{itemDesc}, @@ -96,6 +100,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" manage_fee = #{manageFee}, riding_fee = #{ridingFee}, appointment_fee = #{appointmentFee}, + type = #{type}, reason = #{reason}, create_time = #{createTime}, item_desc = #{itemDesc}, @@ -106,13 +111,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update et_refund - refund_no = #{refundNo}, user_id = #{userId}, amount = #{amount}, dispatch_fee = #{dispatchFee}, manage_fee = #{manageFee}, riding_fee = #{ridingFee}, appointment_fee = #{appointmentFee}, + type = #{type}, reason = #{reason}, create_time = #{createTime}, item_desc = #{itemDesc},