ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
@@ -59,7 +59,7 @@ R<Long> getVipCount(@RequestParam("userId")Long userId, @RequestParam("vipId") Integer vipId ); @GetMapping("/app-user/listByIds") @PostMapping("/app-user/listByIds") List<AppUser> listByIds(@RequestParam("ids") List<Long> list); /** @@ -87,7 +87,7 @@ * @param userId * @return */ @PutMapping("/app-user/setLowerUserShop") @PostMapping("/app-user/setLowerUserShop") R<List<AppUser>> setLowerUserShop(@RequestParam("userId") Long userId,@RequestParam("shopId") Integer shopId); ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/GoodsAppUser.java
@@ -39,6 +39,9 @@ private Long appUserId; @TableField(exist = false) private String appUserIdStr; @TableField(exist = false) @ApiModelProperty(value = "用户名称") private String userName; ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/TechnicianClient.java
@@ -29,6 +29,6 @@ * @param ids * @return */ @PostMapping("/technician-subscribe/getTechnicianByIds") @PostMapping("/technician/getTechnicianByIds") R<List<Technician>> getTechnicianByIds(@RequestParam("ids") Collection<Integer> ids); } ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
@@ -5,6 +5,7 @@ import java.util.concurrent.TimeUnit; import javax.servlet.http.HttpServletRequest; import com.ruoyi.common.core.exception.auth.NotPermissionException; import com.ruoyi.system.api.model.LoginUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -90,7 +91,7 @@ public LoginUser getLoginUserApplet() { LoginUser loginUserAppletToken = getLoginUserAppletToken(ServletUtils.getRequest()); if (loginUserAppletToken == null) { throw new RuntimeException("令牌已过期,请重新登录!"); throw new NotPermissionException("令牌已过期,请重新登录!"); } return loginUserAppletToken; } @@ -128,7 +129,7 @@ public LoginUser getLoginUser() { LoginUser loginUser = getLoginUser(ServletUtils.getRequest()); if (loginUser == null) { throw new RuntimeException("令牌已过期,请重新登录!"); throw new NotPermissionException("令牌已过期,请重新登录!"); } if(null == loginUser.getUserid()){ loginUser.setUserid(loginUser.getSysUser().getUserId()); ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java
@@ -1,5 +1,6 @@ package com.ruoyi.gateway.filter; import com.ruoyi.common.core.exception.auth.NotPermissionException; import com.ruoyi.gateway.config.properties.AntiShakeProperties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -131,7 +132,7 @@ /** * 防抖处理 */ public void antiShake(ServerHttpRequest request) throws Exception{ public void antiShake(ServerHttpRequest request) { HttpMethod method = request.getMethod(); if(HttpMethod.OPTIONS == method || !antiShakeProperties.getEnable()){ return; @@ -174,20 +175,19 @@ /** * 验证token * @param request * @throws Exception */ public void verifyToken(ServerHttpRequest request) throws Exception{ public void verifyToken(ServerHttpRequest request) { String token = getToken(request); if (StringUtils.isEmpty(token)) { throw new RuntimeException("令牌不能为空"); throw new NotPermissionException("令牌不能为空"); } Claims claims = JwtUtils.parseToken(token); if (claims == null) { throw new RuntimeException("令牌已过期或验证不正确!"); throw new NotPermissionException("令牌已过期或验证不正确!"); } String userid = JwtUtils.getUserId(claims); if (StringUtils.isEmpty(userid)) { throw new RuntimeException("令牌验证失败"); throw new NotPermissionException("令牌验证失败"); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java
@@ -643,8 +643,8 @@ } @GetMapping("/listByIds") List<AppUser> listByIds(@RequestParam("ids") List<Long> ids) { @PostMapping("/listByIds") public List<AppUser> listByIds(@RequestParam("ids") List<Long> ids) { if(ids.size() == 0){ return new ArrayList<>(); } @@ -664,7 +664,7 @@ /** * 设置指定用户的下级用户绑定门店 */ @PutMapping("setLowerUserShop") @PostMapping("/setLowerUserShop") public R<Void> setLowerUserShop(@RequestParam("userId") Long userId,@RequestParam("shopId") Integer shopId) { appUserService.update(new LambdaUpdateWrapper<AppUser>() .set(AppUser::getShopId,shopId) ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WithdrawalRequestsController.java
@@ -157,7 +157,7 @@ @PostMapping("/withdrawalCallback") public Object withdrawalCallback(@RequestBody SinglePayCallbackResult singlePayCallbackResult){ Integer status = singlePayCallbackResult.getStatus(); if(203 == status){ if(203 == status || 205 == status){ String merchantOrderNo = singlePayCallbackResult.getMerchantOrderNo(); WithdrawalRequests withdrawalRequests = withdrawalRequestsService.getById(merchantOrderNo); if(1 == withdrawalRequests.getStatus()){ ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/SinglePayCallbackResult.java
@@ -15,6 +15,13 @@ * 202 处理中 批次正在处理中状态 * 203 处理完成 批次中的每笔明细都明确了代付结果 * 204 批次不存在 汇聚未受理该批次的请求,找不到该批次,明确失败 * 205 交易成功 明确交易成功的状态码 * 208 订单已取消 代付订单被商户审核为拒绝付款 * 210 账务冻结中 确认出款后对商户的账户余额进行冻结处理 * 211 账务解冻中 确认失败后对商户的账户余额进行解冻处理 * 212 订单取消中 商户审核为拒绝付款的中间状态 * 213 账务扣款中 确认成功后对商户的账户冻结款的扣款处理 * 214 订单不存在 汇聚未受理该笔代付请求,找不到该笔订单,明确失败 */ private Integer status; /** ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -744,7 +744,7 @@ orderInfo.setRecipient(userAddress.getRecieveName() + "-" + userAddress.getRecievePhone()); orderInfo.setAddress(userAddress.getRecieveAddress()); } if(StringUtils.isNotEmpty(order.getExpressJson())){ if(StringUtils.isNotEmpty(order.getExpressJson()) && !"NULL".equals(order.getExpressJson())){ JSONObject jsonObject = JSON.parseObject(order.getExpressJson()); String com = jsonObject.getString("com"); String num = jsonObject.getString("num"); ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java
@@ -509,6 +509,10 @@ confirmOrderVo.setDiscountAmount(activityAmount); int earnPoint = goodsList.stream().mapToInt(MyShoppingCartVo::getEarnSpendingPoints).sum(); confirmOrderVo.setEarnPoint(earnPoint); if(BigDecimal.ZERO.compareTo(paymentMoney) > 0){ paymentMoney = BigDecimal.ZERO; } //支付金额,订单金额-订单优惠 confirmOrderVo.setPayMoney(paymentMoney); confirmOrderVo.setResidualPoint(appUser.getAvailablePoint().intValue()); @@ -916,6 +920,10 @@ } } } if(BigDecimal.ZERO.compareTo(paymentMoney) > 0){ paymentMoney = BigDecimal.ZERO; } //构建订单明细 Order order = new Order(); order.setAppUserId(userid); @@ -1036,21 +1044,98 @@ //开始构建支付数据 //现金支付 paymentMoney = paymentMoney.add(expressFee).setScale(2, RoundingMode.HALF_EVEN); if(BigDecimal.ZERO.compareTo(paymentMoney) > 0){ paymentMoney = BigDecimal.ZERO; } if(1 == shoppingCartPayment.getPaymentType()){ //调起微信支付 String goodsNames = goodsList.stream().map(MyShoppingCartVo::getName).collect(Collectors.joining("\n")); UniPayResult uniPayResult = PaymentUtil.uniPay(order.getOrderNumber(), paymentMoney.doubleValue(), order.getOrderType() == 1 ? "购买服务商品" : "购买单品商品", goodsNames, "", "/order/shopping-cart/shoppingCartPaymentCallback", appUser.getWxOpenid(), null); if(null == uniPayResult || !"100".equals(uniPayResult.getRa_Code())){ return R.fail(null == uniPayResult ? "支付失败" : uniPayResult.getRb_CodeMsg()); if(BigDecimal.ZERO.compareTo(paymentMoney) < 0){ //调起微信支付 String goodsNames = goodsList.stream().map(MyShoppingCartVo::getName).collect(Collectors.joining("\n")); UniPayResult uniPayResult = PaymentUtil.uniPay(order.getOrderNumber(), paymentMoney.doubleValue(), order.getOrderType() == 1 ? "购买服务商品" : "购买单品商品", goodsNames, "", "/order/shopping-cart/shoppingCartPaymentCallback", appUser.getWxOpenid(), null); if(null == uniPayResult || !"100".equals(uniPayResult.getRa_Code())){ return R.fail(null == uniPayResult ? "支付失败" : uniPayResult.getRb_CodeMsg()); } String rc_result = uniPayResult.getRc_Result(); JSONObject jsonObject = JSON.parseObject(rc_result); jsonObject.put("orderId", order.getId().toString()); //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。 long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC); redisTemplate.opsForZSet().add("OrderPayment", order.getOrderNumber(), second); return R.ok(jsonObject.toJSONString()); }else{ earnPoint = order.getGetPoint(); appUser = appUserClient.getAppUserById(order.getAppUserId()); Integer lavePoint = appUser.getLavePoint(); paymentMoney = order.getPaymentAmount(); //构建积分流水记录 if(earnPoint > 0){ PointSetting pointSetting = pointSettingClient.getPointSetting(appUser.getVipId()).getData(); int earnPoint1 = 0; if(null != pointSetting && 1 == pointSetting.getBuyPointOpen()){ earnPoint1 = new BigDecimal(earnPoint).multiply(pointSetting.getBuyPoint().divide(new BigDecimal(100))).intValue(); } appUser.setShopPoint(appUser.getShopPoint() + earnPoint); appUser.setLavePoint(appUser.getLavePoint() + earnPoint); appUser.setTotalPoint(appUser.getTotalPoint() + earnPoint); appUser.setAvailablePoint(appUser.getAvailablePoint() + earnPoint1); appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() + earnPoint1); JSONObject jsonObject = new JSONObject(); jsonObject.put("shopPoint", earnPoint); jsonObject.put("availablePoint", earnPoint1); if(null != pointSetting && 1 == pointSetting.getBuyPointGift()){ appUser.setTransferablePoint(appUser.getTransferablePoint() + earnPoint1); jsonObject.put("transferablePoint", earnPoint1); } UserPoint userPoint = new UserPoint(); userPoint.setType(1); userPoint.setHistoricalPoint(lavePoint); userPoint.setVariablePoint(earnPoint); userPoint.setBalance(appUser.getLavePoint()); userPoint.setCreateTime(LocalDateTime.now()); userPoint.setAppUserId(appUser.getId()); userPoint.setObjectId(order.getId()); userPoint.setExtention(jsonObject.toJSONString()); userPointClient.saveUserPoint(userPoint); } appUser.setShopAmount(appUser.getShopAmount().add(paymentMoney).setScale(2, RoundingMode.HALF_EVEN)); appUser.setLastShopTime(LocalDateTime.now()); appUserClient.editAppUserById(appUser); //变更等级 appUserClient.vipUpgrade(appUser.getId()); //修改订支付状态 order.setPayStatus(2); //自提 if(order.getOrderType() == 1 && StringUtils.isEmpty(order.getAddressJson())){ order.setOrderStatus(2); } orderService.updateById(order); //处理优惠券 if(null != order.getUserCouponId()){ UserCoupon userCoupon = userCouponClient.getUserCoupon(order.getUserCouponId()).getData(); if(null != userCoupon && null == userCoupon.getUseTime()){ userCoupon.setStatus(2); userCoupon.setUseTime(LocalDateTime.now()); userCouponClient.editUserCoupon(userCoupon); } } //添加查询快递信息队列 if(StringUtils.isNotEmpty(order.getExpressJson())){ //一小时后定时查询快递信息 redisTemplate.opsForZSet().add("order_express", order.getId(), LocalDateTime.now().plusHours(1).toEpochSecond(ZoneOffset.UTC)); } //删除购物车数据 userid = tokenService.getLoginUserApplet().getUserid(); List<OrderGood> list1 = orderGoodService.list(new LambdaQueryWrapper<OrderGood>().eq(OrderGood::getOrderId, order.getId())); List<Integer> goodsIds1 = list1.stream().map(OrderGood::getGoodsId).collect(Collectors.toList()); this.remove(new LambdaQueryWrapper<ShoppingCart>().eq(ShoppingCart::getAppUserId, userid).in(ShoppingCart::getGoodsId, goodsIds1)); } String rc_result = uniPayResult.getRc_Result(); JSONObject jsonObject = JSON.parseObject(rc_result); jsonObject.put("orderId", order.getId().toString()); //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。 long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC); redisTemplate.opsForZSet().add("OrderPayment", order.getOrderNumber(), second); return R.ok(jsonObject.toJSONString()); } //账户余额 BigDecimal redPacketAmount = BigDecimal.ZERO; ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/OrderActivityInfoController.java
@@ -62,7 +62,7 @@ public R<Void> saveActivityConfig(@RequestBody OrderActivityInfo orderActivityInfo){ orderActivityInfo.setIsShelf(0); if (org.springframework.util.StringUtils.hasLength(orderActivityInfo.getVipIds())){ List<String> vipIds = Arrays.asList(orderActivityInfo.getVipIds().split(",")); List<String> vipIds = new ArrayList<>(Arrays.asList(orderActivityInfo.getVipIds().split(","))); List<OrderActivityInfo> list = orderActivityInfoService.lambdaQuery() .le(OrderActivityInfo::getStartTime, orderActivityInfo.getStartTime()) .or() @@ -70,7 +70,7 @@ if (!list.isEmpty()){ for (OrderActivityInfo activityInfo : list) { List<String> vips = Arrays.asList(activityInfo.getVipIds().split(",")); vipIds.retainAll(vips); vipIds.addAll(vips); if (!vipIds.isEmpty()){ StringBuilder message = new StringBuilder(); List<String> collect = vips.stream().sorted().collect(Collectors.toList()); ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopWithdrawController.java
@@ -26,6 +26,7 @@ import com.ruoyi.other.util.payment.model.SinglePayCallbackResult; import com.ruoyi.other.util.payment.model.SinglePayResult; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.model.LoginUser; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -65,6 +66,9 @@ @Resource private AppUserClient appUserClient; @Resource private SysUserClient sysUserClient; @@ -121,7 +125,8 @@ @GetMapping("/shop/with") @ApiOperation(value = "提现申请", notes = "提现申请列表", tags = {"门店后台"}) public R shopwith(@RequestParam BigDecimal money){ SysUser sysUser = tokenService.getLoginUser().getSysUser(); Long userid = tokenService.getLoginUser().getUserid(); SysUser sysUser = sysUserClient.getSysUser(userid).getData(); Integer objectId = sysUser.getObjectId(); Shop shop = shopService.getById(objectId); if (money.compareTo(shop.getCanWithdrawMoney())>0){ @@ -179,7 +184,7 @@ return R.fail("查询账户余额出错"); } Double useAbleSettAmount = accountBalanceQueryResult.getUseAbleSettAmount(); if(useAbleSettAmount < shopWithdraw1.getMoney().doubleValue()){ if(useAbleSettAmount < (shopWithdraw1.getMoney().doubleValue() + 1)){ return R.fail("账户可用余额不足,请先补充账户余额"); } //银行卡转账 @@ -238,7 +243,7 @@ @PostMapping("/withdrawalCallback") public Object withdrawalCallback(@RequestBody SinglePayCallbackResult singlePayCallbackResult){ Integer status = singlePayCallbackResult.getStatus(); if(203 == status){ if(203 == status || 205 == status){ String merchantOrderNo = singlePayCallbackResult.getMerchantOrderNo(); ShopWithdraw shopWithdraw = shopWithdrawService.getById(merchantOrderNo); if(1 == shopWithdraw.getStatus()){ ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsServiceImpl.java
@@ -459,6 +459,7 @@ List<AppUser> appUsers = appUserClient.listByIds(userIds); for (GoodsAppUser goodsAppUser : goodsAppUserList) { appUsers.stream().filter(u -> u.getId().equals(goodsAppUser.getAppUserId())).findFirst().ifPresent( u -> { goodsAppUser.setAppUserIdStr(goodsAppUser.getAppUserId().toString()); goodsAppUser.setUserName(u.getName()); goodsAppUser.setPhone(u.getPhone()); VipSetting vipSetting = vipSettingService.getById(u.getVipId()); ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/SinglePayCallbackResult.java
@@ -11,6 +11,17 @@ public class SinglePayCallbackResult { /** * 交易状态 * 201 批次已创建 汇聚受理并创建该批次的初始状态 * 202 处理中 批次正在处理中状态 * 203 处理完成 批次中的每笔明细都明确了代付结果 * 204 批次不存在 汇聚未受理该批次的请求,找不到该批次,明确失败 * 205 交易成功 明确交易成功的状态码 * 208 订单已取消 代付订单被商户审核为拒绝付款 * 210 账务冻结中 确认出款后对商户的账户余额进行冻结处理 * 211 账务解冻中 确认失败后对商户的账户余额进行解冻处理 * 212 订单取消中 商户审核为拒绝付款的中间状态 * 213 账务扣款中 确认成功后对商户的账户冻结款的扣款处理 * 214 订单不存在 汇聚未受理该笔代付请求,找不到该笔订单,明确失败 */ private Integer status; /** ruoyi-service/ruoyi-other/src/main/resources/mapper/other/SeckillActivityInfoMapper.xml
@@ -64,7 +64,7 @@ tgc.`name` goodsCategoryName, tg.operating_cost, tg.shop_cost, tg.purchase_limit maxNum, tsai.max_num maxNum, tg.home_page_picture, tg.original_price, tg.sale_num,