|
|
|
|
@@ -1,14 +1,17 @@
|
|
|
|
|
package com.czg.service.order.service.impl;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.date.LocalDateTimeUtil;
|
|
|
|
|
import cn.hutool.core.exceptions.ValidateException;
|
|
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
|
|
import com.alibaba.fastjson2.JSONObject;
|
|
|
|
|
import com.czg.account.dto.shopuser.ShopUserMoneyEditDTO;
|
|
|
|
|
import com.czg.account.entity.ShopInfo;
|
|
|
|
|
import com.czg.account.entity.ShopMerchant;
|
|
|
|
|
import com.czg.account.entity.ShopUser;
|
|
|
|
|
import com.czg.account.service.ShopActivateService;
|
|
|
|
|
import com.czg.account.service.ShopMerchantService;
|
|
|
|
|
import com.czg.account.service.ShopUserService;
|
|
|
|
|
import com.czg.account.entity.UserInfo;
|
|
|
|
|
import com.czg.account.service.*;
|
|
|
|
|
import com.czg.config.RabbitPublisher;
|
|
|
|
|
import com.czg.config.RedisCst;
|
|
|
|
|
import com.czg.entity.req.*;
|
|
|
|
|
import com.czg.entity.resp.*;
|
|
|
|
|
import com.czg.enums.ShopUserFlowBizEnum;
|
|
|
|
|
@@ -18,13 +21,16 @@ import com.czg.order.service.OrderInfoService;
|
|
|
|
|
import com.czg.order.service.OrderPaymentService;
|
|
|
|
|
import com.czg.resp.CzgResult;
|
|
|
|
|
import com.czg.service.CzgPayService;
|
|
|
|
|
import com.czg.service.RedisService;
|
|
|
|
|
import com.czg.service.order.dto.OrderPayParamDTO;
|
|
|
|
|
import com.czg.service.order.dto.VipPayParamDTO;
|
|
|
|
|
import com.czg.service.order.enums.OrderStatusEnums;
|
|
|
|
|
import com.czg.service.order.enums.PayEnums;
|
|
|
|
|
import com.czg.service.order.service.PayService;
|
|
|
|
|
import com.czg.system.enums.SysParamCodeEnum;
|
|
|
|
|
import com.czg.system.service.SysParamsService;
|
|
|
|
|
import com.czg.utils.AssertUtil;
|
|
|
|
|
import com.czg.utils.MD5Util;
|
|
|
|
|
import jakarta.annotation.Resource;
|
|
|
|
|
import jakarta.validation.constraints.NotBlank;
|
|
|
|
|
import lombok.NonNull;
|
|
|
|
|
@@ -33,6 +39,8 @@ import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
|
import java.time.temporal.ChronoUnit;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
|
|
@@ -50,24 +58,98 @@ public class PayServiceImpl implements PayService {
|
|
|
|
|
@DubboReference
|
|
|
|
|
private ShopUserService shopUserService;
|
|
|
|
|
@DubboReference
|
|
|
|
|
private UserInfoService userInfoService;
|
|
|
|
|
@DubboReference
|
|
|
|
|
private ShopInfoService shopInfoService;
|
|
|
|
|
@DubboReference
|
|
|
|
|
private ShopActivateService shopActivateService;
|
|
|
|
|
@Resource
|
|
|
|
|
private RabbitPublisher rabbitPublisher;
|
|
|
|
|
@Resource
|
|
|
|
|
private CzgPayService czgPayService;
|
|
|
|
|
@Resource
|
|
|
|
|
private OrderInfoService orderInfoService;
|
|
|
|
|
@Resource
|
|
|
|
|
private OrderPaymentService paymentService;
|
|
|
|
|
@Resource
|
|
|
|
|
private RedisService redisService;
|
|
|
|
|
|
|
|
|
|
private final BigDecimal MONEY_RATE = new BigDecimal("100");
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional
|
|
|
|
|
public CzgResult<Object> vipPayOrder(OrderPayParamDTO payParam) {
|
|
|
|
|
OrderInfo orderInfo = orderInfoService.getById(payParam.getOrderId());
|
|
|
|
|
AssertUtil.isNull(orderInfo, "订单不存在");
|
|
|
|
|
if (!"unpaid".equals(orderInfo.getStatus())) {
|
|
|
|
|
return CzgResult.failure("该订单已不可支付");
|
|
|
|
|
}
|
|
|
|
|
if (!"afterPay".equals(orderInfo.getPayMode())
|
|
|
|
|
&& orderInfo.getCreateTime().isAfter(LocalDateTimeUtil.offset(LocalDateTime.now(), -15, ChronoUnit.SECONDS))) {
|
|
|
|
|
return CzgResult.failure("订单十五分钟内有效,当前已超时,请重新下单。");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ShopUser shopUser = new ShopUser();
|
|
|
|
|
if ("scanCode".equals(payParam.getPayType())) {
|
|
|
|
|
AssertUtil.isBlank(payParam.getAuthCode(), "会员码不能为空");
|
|
|
|
|
Object o = redisService.get(RedisCst.SHOP_USER_DYNAMIC_CODE + shopUser.getShopId() + ":" + payParam.getAuthCode());
|
|
|
|
|
AssertUtil.isNull(o, "会员码已失效");
|
|
|
|
|
shopUser = shopUserService.getById(o.toString());
|
|
|
|
|
} else {
|
|
|
|
|
ShopInfo shopInfo = shopInfoService.getById(payParam.getShopId());
|
|
|
|
|
AssertUtil.isNull(shopInfo, "店铺不存在");
|
|
|
|
|
if ("userPay".equals(payParam.getPayType()) && shopInfo.getIsMemberInPwd() == 1) {
|
|
|
|
|
AssertUtil.isNull(payParam.getShopUserId(), "请选择付款人后重试");
|
|
|
|
|
shopUser = shopUserService.getById(payParam.getShopUserId());
|
|
|
|
|
} else if ("accountPay".equals(payParam.getPayType())) {
|
|
|
|
|
AssertUtil.isBlank(payParam.getPwd(), "支付密码不能为空");
|
|
|
|
|
shopUser = shopUserService.getById(payParam.getShopUserId());
|
|
|
|
|
AssertUtil.isNull(shopUser, "会员不存在");
|
|
|
|
|
UserInfo userInfo = userInfoService.getById(shopUser.getUserId());
|
|
|
|
|
AssertUtil.isNull(userInfo, "用户信息不存在");
|
|
|
|
|
if (!userInfo.getPayPwd().equals(MD5Util.md5AsHex(payParam.getPwd()))) {
|
|
|
|
|
return CzgResult.failure("支付密码错误");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
AssertUtil.isNull(shopUser, "会员不存在");
|
|
|
|
|
if (!shopUser.getShopId().equals(orderInfo.getShopId())) {
|
|
|
|
|
return CzgResult.failure("违规操作,请确认店铺后重试");
|
|
|
|
|
}
|
|
|
|
|
if (shopUser.getAmount().compareTo(orderInfo.getOrderAmount()) < 0) {
|
|
|
|
|
return CzgResult.failure("会员余额不足");
|
|
|
|
|
}
|
|
|
|
|
ShopUserMoneyEditDTO shopUserMoneyEditDTO = ShopUserMoneyEditDTO.builder()
|
|
|
|
|
.id(orderInfo.getId())
|
|
|
|
|
.money(orderInfo.getOrderAmount())
|
|
|
|
|
.type(0)
|
|
|
|
|
.bizEnum(ShopUserFlowBizEnum.ORDER_PAY)
|
|
|
|
|
.relationId(orderInfo.getId())
|
|
|
|
|
.build();
|
|
|
|
|
//更新会员余额 并生成流水
|
|
|
|
|
Long flowId = shopUserService.updateMoney(shopUser.getShopId(), shopUserMoneyEditDTO);
|
|
|
|
|
orderInfoService.updateChain()
|
|
|
|
|
.set(OrderInfo::getPayAmount, orderInfo.getOrderAmount())
|
|
|
|
|
.set(OrderInfo::getStatus, OrderStatusEnums.DONE.getCode())
|
|
|
|
|
.set(OrderInfo::getPaidTime, LocalDateTime.now())
|
|
|
|
|
.set(OrderInfo::getPayType, "vip-pay")
|
|
|
|
|
.set(OrderInfo::getPayOrderId, flowId)
|
|
|
|
|
.where(OrderInfo::getId).eq(orderInfo.getId())
|
|
|
|
|
.update();
|
|
|
|
|
//发送打票信息
|
|
|
|
|
rabbitPublisher.sendOrderPrintMsg(orderInfo.getId().toString());
|
|
|
|
|
return CzgResult.success();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional
|
|
|
|
|
public CzgResult<Map<String, Object>> h5PayOrder(@NonNull String clintIp, OrderPayParamDTO payParam) {
|
|
|
|
|
OrderInfo orderInfo = orderInfoService.getById(payParam.getOrderId());
|
|
|
|
|
AssertUtil.isNull(orderInfo, "订单不存在");
|
|
|
|
|
String payOrderNo = orderInfo.getPlatformType() + IdUtil.getSnowflakeNextId();
|
|
|
|
|
initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(), "order", payOrderNo, "", orderInfo.getOrderAmount()));
|
|
|
|
|
upOrderPayInfo(orderInfo.getId(), PayEnums.H5_PAY.getValue(), payOrderNo);
|
|
|
|
|
Long paymentId = initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(),
|
|
|
|
|
"order", payOrderNo, "", orderInfo.getOrderAmount()));
|
|
|
|
|
upOrderPayInfo(orderInfo.getId(), PayEnums.H5_PAY.getValue(), paymentId);
|
|
|
|
|
return h5Pay(payParam.getShopId(), new CzgH5PayReq(payOrderNo, orderInfo.getOrderAmount().multiply(MONEY_RATE).longValue(),
|
|
|
|
|
"点餐支付", clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), ""));
|
|
|
|
|
}
|
|
|
|
|
@@ -81,8 +163,9 @@ public class PayServiceImpl implements PayService {
|
|
|
|
|
AssertUtil.isBlank(payParam.getOpenId(), "用户小程序ID不能为空");
|
|
|
|
|
AssertUtil.isBlank(payParam.getPayType(), "支付方式不能为空");
|
|
|
|
|
String payOrderNo = orderInfo.getPlatformType() + IdUtil.getSnowflakeNextId();
|
|
|
|
|
initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(), "order", payOrderNo, "", orderInfo.getOrderAmount()));
|
|
|
|
|
upOrderPayInfo(orderInfo.getId(), "aliPay".equals(payParam.getPayType()) ? PayEnums.ALIPAY_MINI.getValue() : PayEnums.WECHAT_MINI.getValue(), payOrderNo);
|
|
|
|
|
Long paymentId = initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(),
|
|
|
|
|
"order", payOrderNo, "", orderInfo.getOrderAmount()));
|
|
|
|
|
upOrderPayInfo(orderInfo.getId(), "aliPay".equals(payParam.getPayType()) ? PayEnums.ALIPAY_MINI.getValue() : PayEnums.WECHAT_MINI.getValue(), paymentId);
|
|
|
|
|
return jsPay(payParam.getShopId(), payParam.getPayType(), new CzgJsPayReq(payOrderNo, orderInfo.getOrderAmount().multiply(MONEY_RATE).longValue(),
|
|
|
|
|
"点餐支付", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), ""));
|
|
|
|
|
}
|
|
|
|
|
@@ -93,8 +176,9 @@ public class PayServiceImpl implements PayService {
|
|
|
|
|
OrderInfo orderInfo = orderInfoService.getById(payParam.getOrderId());
|
|
|
|
|
AssertUtil.isNull(orderInfo, "订单不存在");
|
|
|
|
|
String payOrderNo = orderInfo.getPlatformType() + IdUtil.getSnowflakeNextId();
|
|
|
|
|
initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(), "order", payOrderNo, "", orderInfo.getOrderAmount()));
|
|
|
|
|
upOrderPayInfo(orderInfo.getId(), "aliPay".equals(payParam.getPayType()) ? PayEnums.ALIPAY_MINI.getValue() : PayEnums.WECHAT_MINI.getValue(), payOrderNo);
|
|
|
|
|
Long paymentId = initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(),
|
|
|
|
|
"order", payOrderNo, "", orderInfo.getOrderAmount()));
|
|
|
|
|
upOrderPayInfo(orderInfo.getId(), "aliPay".equals(payParam.getPayType()) ? PayEnums.ALIPAY_MINI.getValue() : PayEnums.WECHAT_MINI.getValue(), paymentId);
|
|
|
|
|
return ltPay(payParam.getShopId(), payParam.getPayType(), new CzgLtPayReq(payOrderNo, orderInfo.getOrderAmount().multiply(MONEY_RATE).longValue(),
|
|
|
|
|
"点餐支付", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), ""));
|
|
|
|
|
}
|
|
|
|
|
@@ -105,8 +189,9 @@ public class PayServiceImpl implements PayService {
|
|
|
|
|
OrderInfo orderInfo = orderInfoService.getById(payParam.getOrderId());
|
|
|
|
|
AssertUtil.isNull(orderInfo, "订单不存在");
|
|
|
|
|
String payOrderNo = orderInfo.getPlatformType() + IdUtil.getSnowflakeNextId();
|
|
|
|
|
initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(), "order", payOrderNo, "", orderInfo.getOrderAmount()));
|
|
|
|
|
upOrderPayInfo(orderInfo.getId(), PayEnums.MAIN_SCAN.getValue(), payOrderNo);
|
|
|
|
|
Long paymentId = initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(),
|
|
|
|
|
"order", payOrderNo, "", orderInfo.getOrderAmount()));
|
|
|
|
|
upOrderPayInfo(orderInfo.getId(), PayEnums.MAIN_SCAN.getValue(), paymentId);
|
|
|
|
|
return scanPay(payParam.getShopId(), new CzgScanPayReq(payOrderNo, orderInfo.getOrderAmount().multiply(MONEY_RATE).longValue(),
|
|
|
|
|
"点餐支付", clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), ""));
|
|
|
|
|
}
|
|
|
|
|
@@ -118,8 +203,9 @@ public class PayServiceImpl implements PayService {
|
|
|
|
|
AssertUtil.isNull(orderInfo, "订单不存在");
|
|
|
|
|
AssertUtil.isBlank(payParam.getAuthCode(), "扫描码不能为空");
|
|
|
|
|
String payOrderNo = orderInfo.getPlatformType() + IdUtil.getSnowflakeNextId();
|
|
|
|
|
initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(), "order", payOrderNo, payParam.getAuthCode(), orderInfo.getOrderAmount()));
|
|
|
|
|
upOrderPayInfo(orderInfo.getId(), PayEnums.BACK_SCAN.getValue(), payOrderNo);
|
|
|
|
|
Long paymentId = initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(),
|
|
|
|
|
"order", payOrderNo, payParam.getAuthCode(), orderInfo.getOrderAmount()));
|
|
|
|
|
upOrderPayInfo(orderInfo.getId(), PayEnums.BACK_SCAN.getValue(), paymentId);
|
|
|
|
|
return microPay(payParam.getShopId(), new CzgMicroPayReq(payOrderNo, orderInfo.getOrderAmount().multiply(MONEY_RATE).longValue(),
|
|
|
|
|
"点餐支付", payParam.getAuthCode(), payParam.getBuyerRemark(), ""));
|
|
|
|
|
}
|
|
|
|
|
@@ -127,9 +213,16 @@ public class PayServiceImpl implements PayService {
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional
|
|
|
|
|
public CzgResult<Object> cashPayVip(VipPayParamDTO payParam) {
|
|
|
|
|
ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId())
|
|
|
|
|
.eq(ShopUser::getUserId, payParam.getUserId()).one();
|
|
|
|
|
ShopUser shopUser = shopUserService.getById(payParam.getShopUserId());
|
|
|
|
|
AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在");
|
|
|
|
|
ShopInfo shopInfo = shopInfoService.getById(payParam.getShopId());
|
|
|
|
|
AssertUtil.isNull(shopInfo, "店铺不存在");
|
|
|
|
|
if (shopInfo.getIsMemberInPwd().equals(1)) {
|
|
|
|
|
AssertUtil.isBlank(shopInfo.getOperationPwd(), "请设置操作密码后使用");
|
|
|
|
|
if (!shopInfo.getOperationPwd().equals(MD5Util.md5AsHex(payParam.getPwd()))) {
|
|
|
|
|
return CzgResult.failure("支付密码错误");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (shopUser.getIsVip().equals(0)) {
|
|
|
|
|
shopUserService.updateChain()
|
|
|
|
|
.set(ShopUser::getIsVip, 1)
|
|
|
|
|
@@ -153,8 +246,7 @@ public class PayServiceImpl implements PayService {
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional
|
|
|
|
|
public CzgResult<Map<String, Object>> jsPayVip(String clintIp, VipPayParamDTO payParam) {
|
|
|
|
|
ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId())
|
|
|
|
|
.eq(ShopUser::getUserId, payParam.getUserId()).one();
|
|
|
|
|
ShopUser shopUser = shopUserService.getById(payParam.getShopUserId());
|
|
|
|
|
AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在");
|
|
|
|
|
AssertUtil.isBlank(payParam.getOpenId(), "用户小程序ID不能为空");
|
|
|
|
|
AssertUtil.isBlank(payParam.getPayType(), "支付方式不能为空");
|
|
|
|
|
@@ -167,8 +259,7 @@ public class PayServiceImpl implements PayService {
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional
|
|
|
|
|
public CzgResult<Map<String, Object>> ltPayVip(String clintIp, VipPayParamDTO payParam) {
|
|
|
|
|
ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId())
|
|
|
|
|
.eq(ShopUser::getUserId, payParam.getUserId()).one();
|
|
|
|
|
ShopUser shopUser = shopUserService.getById(payParam.getShopUserId());
|
|
|
|
|
AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在");
|
|
|
|
|
AssertUtil.isBlank(payParam.getOpenId(), "用户小程序ID不能为空");
|
|
|
|
|
AssertUtil.isBlank(payParam.getPayType(), "支付方式不能为空");
|
|
|
|
|
@@ -181,8 +272,7 @@ public class PayServiceImpl implements PayService {
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional
|
|
|
|
|
public CzgResult<Map<String, Object>> scanPayVip(String clintIp, VipPayParamDTO payParam) {
|
|
|
|
|
ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId())
|
|
|
|
|
.eq(ShopUser::getUserId, payParam.getUserId()).one();
|
|
|
|
|
ShopUser shopUser = shopUserService.getById(payParam.getShopUserId());
|
|
|
|
|
AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在");
|
|
|
|
|
String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId();
|
|
|
|
|
initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), "memberIn", payOrderNo, "", payParam.getAmount()));
|
|
|
|
|
@@ -193,10 +283,9 @@ public class PayServiceImpl implements PayService {
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional
|
|
|
|
|
public CzgResult<Map<String, Object>> microPayVip(VipPayParamDTO payParam) {
|
|
|
|
|
ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId())
|
|
|
|
|
.eq(ShopUser::getUserId, payParam.getUserId()).one();
|
|
|
|
|
AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在");
|
|
|
|
|
AssertUtil.isBlank(payParam.getAuthCode(), "扫描码不能为空");
|
|
|
|
|
ShopUser shopUser = shopUserService.getById(payParam.getShopUserId());
|
|
|
|
|
AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在");
|
|
|
|
|
String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId();
|
|
|
|
|
initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), "memberIn", payOrderNo, payParam.getAuthCode(), payParam.getAmount()));
|
|
|
|
|
return microPay(payParam.getShopId(), new CzgMicroPayReq(payOrderNo, payParam.getAmount().multiply(MONEY_RATE).longValue(),
|
|
|
|
|
@@ -228,13 +317,14 @@ public class PayServiceImpl implements PayService {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void initOrderPayment(OrderPayment payment) {
|
|
|
|
|
private Long initOrderPayment(OrderPayment payment) {
|
|
|
|
|
paymentService.save(payment);
|
|
|
|
|
return payment.getId();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void upOrderPayInfo(@NonNull Long orderId, @NotBlank String payType, @NotBlank String payOrderNo) {
|
|
|
|
|
private void upOrderPayInfo(@NonNull Long orderId, @NotBlank String payType, @NotBlank Long paymentId) {
|
|
|
|
|
orderInfoService.updateChain()
|
|
|
|
|
.set(OrderInfo::getPayOrderNo, payOrderNo)
|
|
|
|
|
.set(OrderInfo::getPayOrderId, paymentId)
|
|
|
|
|
.set(OrderInfo::getPayType, payType)
|
|
|
|
|
.where(OrderInfo::getId).eq(orderId)
|
|
|
|
|
.update();
|
|
|
|
|
|