1. 购买优惠券调整,先调预支付,回调接口中处理逻辑

This commit is contained in:
邱贞招 2024-09-04 15:47:03 +08:00
parent d20eb67955
commit e06236c512
7 changed files with 160 additions and 70 deletions

View File

@ -1291,14 +1291,14 @@ public class AppVerifyController extends BaseController
}
/**
* 优惠券购买
* 优惠券购买预支付
*/
@GetMapping("/coupon/buy")
public AjaxResult couponBuy(Long userId, Long couponId)
{
logger.info("优惠券购买【userId="+userId+"】,【couponId="+couponId+"");
Boolean result =etCouponService.couponBuy(userId, couponId);
return success(result);
PrepayWithRequestPaymentResponse paymentResponse = etCouponService.couponBuy(userId, couponId);
return success(paymentResponse);
}
/**

View File

@ -66,6 +66,10 @@ public class EtOrder extends BaseEntity
@Excel(name = "计费规则")
private Long ruleId;
/** 优惠券id */
@Excel(name = "优惠券id")
private Long couponId;
/** 套餐对象 */
@TableField(exist = false)
private EtFeeRule rule;

View File

@ -2,6 +2,7 @@ package com.ruoyi.system.service;
import java.util.List;
import com.ruoyi.system.domain.EtCoupon;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayWithRequestPaymentResponse;
/**
* 优惠券Service接口
@ -65,5 +66,5 @@ public interface IEtCouponService
* @param couponId
* @return
*/
Boolean couponBuy(Long userId, Long couponId);
PrepayWithRequestPaymentResponse couponBuy(Long userId, Long couponId);
}

View File

@ -29,6 +29,13 @@ public interface IWxPayService {
*/
PrepayWithRequestPaymentResponse prepayWithRequestPayment(String payType, EtOrder order);
/**
* 生成微信预支付订单(优惠券)
* @param order 平台订单
* @return JSAPI调用
*/
PrepayWithRequestPaymentResponse prepayWithRequestPayment(EtOrder order);
// /**
// * 关闭订单

View File

@ -48,10 +48,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.*;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@ -125,7 +122,10 @@ public class CallbackServiceImpl implements CallbackService {
private CallbackService callbackService;
@Resource
private EtModelMapper etModelMapper;
private EtCouponMapper etCouponMapper;
@Resource
private EtCouponClaimLogMapper etCouponClaimLogMapper;
@Value("${aliyun.accessKeyId}")
private String accessKeyId;
@ -245,6 +245,14 @@ public class CallbackServiceImpl implements CallbackService {
order.setMark("取消预约支付");
asDevice.setStatus(ServiceConstants.VEHICLE_STATUS_NORMAL);//取消预约支付后车辆正常运营
asDevice.setLockStatus(ServiceConstants.LOCK_STATUS_CLOSE);
}else if(attachVo.getType().equals(ServiceConstants.ORDER_TYPE_COUPON)){
/** 优惠券订单 */
logger.info("【微信支付回调】优惠券支付");
// 3-优惠券支付
order.setStatus(ServiceConstants.ORDER_STATUS_ORDER_END);
order.setMark("优惠券支付");
// 优惠券成功处理逻辑
couponSuccessHandle(order);
}else if(attachVo.getType().equals(ServiceConstants.BUSINESS_TYPE_DEPOSIT)){
logger.info("【微信支付回调】押金支付");
// 4-押金支付
@ -289,6 +297,56 @@ public class CallbackServiceImpl implements CallbackService {
}
}
private void couponSuccessHandle(EtOrder order) {
/**
* 购买分为抵用券订单会员卡订单折扣卡订单
* 1. 插入一条记录et_coupon_user_log 获取方式是购买
* 2. 增加订单记录类型是优惠券订单
* 3. 增加账变, 所属人为运营商
* */
// 1. 插入一条记录et_coupon_user_log 获取方式是购买
Long userId = order.getUserId();
Long couponId = order.getCouponId();
AsUser asUser = asUserMapper.selectUserById(userId);
if(ObjectUtil.isNull(asUser)){
throw new ServiceException("用户【"+userId+"】不存在");
}
EtCoupon etCoupon = etCouponMapper.selectEtCouponByCouponId(couponId);
if(ObjectUtil.isNull(etCoupon)){
throw new ServiceException("优惠券【"+couponId+"】不存在");
}
EtCouponUserLog etCouponUserLog = new EtCouponUserLog();
etCouponUserLog.setCouponId(couponId);
etCouponUserLog.setUserId(userId);
etCouponUserLog.setUserName(asUser.getUserName());
etCouponUserLog.setCreateTime(DateUtils.getNowDate());
etCouponUserLog.setGainMethod(ServiceConstants.COUPON_GAIN_METHOD_BUY);
etCouponUserLog.setAreaId(etCoupon.getAreaId());
etCouponUserLog.setAreaName(etCoupon.getAreaName());
etCouponUserLog.setExpirationTime(DateUtils.addValidity(new Date(),etCoupon.getValidityUnit(),etCoupon.getValidityValue()));
if(ServiceConstants.COUPON_TYPE_TIME_CARD.equals(etCoupon.getType()) || ServiceConstants.COUPON_TYPE_VIP_CARD.equals(etCoupon.getType())){
AsUser asUser1 = new AsUser(userId);
asUser1.setVipType(etCoupon.getType());
Date expirationTime;
if(ObjectUtil.isNull(asUser.getExpirationTime())){
expirationTime = DateUtils.getNowDate();
}else{
expirationTime = asUser.getExpirationTime();
}
asUser1.setExpirationTime(DateUtils.addValidity(expirationTime,etCoupon.getValidityUnit(),etCoupon.getValidityValue()));
asUser1.setUserId(userId);
int updateUser = asUserMapper.updateUser(asUser1);
}
int i1 = etCouponClaimLogMapper.insertEtCouponClaimLog(etCouponUserLog);
if(i1 == 0){
throw new ServiceException("保存优惠券领取记录失败");
}
// 增加优惠券账变
callbackService.capitalFlowRecords(order,ServiceConstants.FLOW_TYPE_INCOME,
ServiceConstants.ORDER_TYPE_COUPON_INCOME,ServiceConstants.OWNER_TYPE_OPERATOR,null,ServiceConstants.PAY_TYPE_WX);
}
private void asynchronousMsg(EtOrder order, BigDecimal amount) {
scheduledExecutorService.schedule(() -> {
/** 发送一个短信给运营商*/

View File

@ -1,26 +1,29 @@
package com.ruoyi.system.service.impl;
import java.util.Date;
import java.util.List;
import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.constant.ServiceConstants;
import com.ruoyi.common.core.domain.entity.AsUser;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.system.domain.*;
import com.ruoyi.system.domain.EtCoupon;
import com.ruoyi.system.domain.EtOrder;
import com.ruoyi.system.domain.vo.PrepayWithRequestPaymentResponseVo;
import com.ruoyi.system.mapper.AsUserMapper;
import com.ruoyi.system.mapper.EtCouponClaimLogMapper;
import com.ruoyi.system.mapper.EtCouponMapper;
import com.ruoyi.system.mapper.EtOrderMapper;
import com.ruoyi.system.service.CallbackService;
import com.ruoyi.system.service.IEtCouponService;
import com.ruoyi.system.service.IWxPayService;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayWithRequestPaymentResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.EtCouponMapper;
import com.ruoyi.system.service.IEtCouponService;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
/**
* 优惠券Service业务层处理
@ -29,14 +32,12 @@ import javax.annotation.Resource;
* @date 2024-08-05
*/
@Service
@Slf4j
public class EtCouponServiceImpl implements IEtCouponService
{
@Resource
private EtCouponMapper etCouponMapper;
@Resource
private EtCouponClaimLogMapper etCouponClaimLogMapper;
@Resource
private AsUserMapper userMapper;
@ -44,7 +45,7 @@ public class EtCouponServiceImpl implements IEtCouponService
private EtOrderMapper etOrderMapper;
@Autowired
private CallbackService callbackService;
private IWxPayService wxPayService;
/**
* 查询优惠券
@ -127,66 +128,29 @@ public class EtCouponServiceImpl implements IEtCouponService
*/
@Override
@Transactional
public Boolean couponBuy(Long userId, Long couponId) {
/**
* 购买分为抵用券订单会员卡订单折扣卡订单
* 1. 插入一条记录et_coupon_user_log 获取方式是购买
* 2. 增加订单记录类型是优惠券订单
* 3. 增加账变, 所属人为运营商
* */
// 1. 插入一条记录et_coupon_user_log 获取方式是购买
public PrepayWithRequestPaymentResponse couponBuy(Long userId, Long couponId) {
EtCoupon etCoupon = etCouponMapper.selectEtCouponByCouponId(couponId);
if(ObjectUtils.isEmpty(etCoupon)){
throw new ServiceException("优惠券【"+couponId+"】不存在");
}
AsUser asUser = userMapper.selectUserById(userId);
if(ObjectUtil.isNull(asUser)){
throw new ServiceException("用户【"+userId+"】不存在");
}
EtCoupon etCoupon = etCouponMapper.selectEtCouponByCouponId(couponId);
if(ObjectUtil.isNull(etCoupon)){
throw new ServiceException("优惠券【"+couponId+"】不存在");
}
EtCouponUserLog etCouponUserLog = new EtCouponUserLog();
etCouponUserLog.setCouponId(couponId);
etCouponUserLog.setUserId(userId);
etCouponUserLog.setUserName(asUser.getUserName());
etCouponUserLog.setCreateTime(DateUtils.getNowDate());
etCouponUserLog.setGainMethod(ServiceConstants.COUPON_GAIN_METHOD_BUY);
etCouponUserLog.setAreaId(etCoupon.getAreaId());
etCouponUserLog.setAreaName(etCoupon.getAreaName());
etCouponUserLog.setExpirationTime(DateUtils.addValidity(new Date(),etCoupon.getValidityUnit(),etCoupon.getValidityValue()));
if(ServiceConstants.COUPON_TYPE_TIME_CARD.equals(etCoupon.getType()) || ServiceConstants.COUPON_TYPE_VIP_CARD.equals(etCoupon.getType())){
AsUser asUser1 = new AsUser(userId);
asUser1.setVipType(etCoupon.getType());
Date expirationTime;
if(ObjectUtil.isNull(asUser.getExpirationTime())){
expirationTime = DateUtils.getNowDate();
}else{
expirationTime = asUser.getExpirationTime();
}
asUser1.setExpirationTime(DateUtils.addValidity(expirationTime,etCoupon.getValidityUnit(),etCoupon.getValidityValue()));
int updateUser = userMapper.updateUser(asUser1);
}
int i1 = etCouponClaimLogMapper.insertEtCouponClaimLog(etCouponUserLog);
if(i1 == 0){
throw new ServiceException("保存优惠券领取记录失败");
}
// 2. 增加订单记录类型是优惠券订单
EtOrder order = createOrder(etCoupon, asUser);
if(ObjectUtil.isNotNull(order)){
int i = etOrderMapper.insertEtOrder(order);
if(i > 0){
// 账变是针对账户而言的优惠券充值后的入账是进入到那个账户 有效期 季度 quarter
callbackService.capitalFlowRecords(order,ServiceConstants.FLOW_TYPE_INCOME,
ServiceConstants.ORDER_TYPE_COUPON_INCOME,ServiceConstants.OWNER_TYPE_OPERATOR,null,ServiceConstants.PAY_TYPE_WX);
return true;
}
}
return false;
PrepayWithRequestPaymentResponse response = wxPayService.prepayWithRequestPayment(order);
PrepayWithRequestPaymentResponseVo responseVo = new PrepayWithRequestPaymentResponseVo();
BeanUtils.copyProperties(response,responseVo);
responseVo.setSessionId(IdUtils.randomUUIDByDigit(8));
responseVo.setOrderNo(order.getOrderNo());
return responseVo;
}
private EtOrder createOrder(EtCoupon etCoupon,AsUser user) {
EtOrder etOrder = new EtOrder();
etOrder.setOrderNo(IdUtils.getOrderNo("wx"));
etOrder.setOrderNo(IdUtils.getOrderNo("yhj"));
etOrder.setUserId(user.getUserId());
etOrder.setUserName(user.getUserName());
etOrder.setMark("优惠券购买");
@ -197,6 +161,10 @@ public class EtCouponServiceImpl implements IEtCouponService
etOrder.setType(ServiceConstants.ORDER_TYPE_COUPON);
etOrder.setTotalFee(etCoupon.getRetailPrice());
etOrder.setPayFee(etCoupon.getRetailPrice());
int i = etOrderMapper.insertEtOrder(etOrder);
if(i == 0){
throw new ServiceException("订单生成失败");
}
return etOrder;
}
}

View File

@ -143,6 +143,58 @@ public class WxPayService implements IWxPayService {
}
}
@Override
public PrepayWithRequestPaymentResponse prepayWithRequestPayment(EtOrder order) {
String billNo = order.getOrderNo();
// 创建订单
AsUser user = asUserService.selectUserById(order.getUserId());
try {
List<EtAreaDept> areaId1 = etAreaDeptMapper.selectList(new QueryWrapper<EtAreaDept>().eq("area_id", order.getAreaId()));
if (ObjectUtil.isNotEmpty(areaId1) && areaId1.size() > 0){
EtAreaDept etAreaDept = areaId1.get(0);
SysDept sysDept = deptService.selectDeptById(etAreaDept.getDeptId());
log.info("获取到运营商对象:【{}】",JSON.toJSON(sysDept));
if(ObjectUtil.isNull(sysDept)){
throw new ServiceException("没有运营商:【"+etAreaDept.getDeptId()+"");
}
// 获取JSAPI所需参数
PrepayRequest request = new PrepayRequest();
request.setAmount(getAmount(order.getPayFee()));
JsapiServiceExtension jsapiServiceExtension = getJsapiServiceExtension(sysDept);
if(StrUtil.isNotBlank(order.getOutTradeNo())){
String tradeNo = order.getOutTradeNo();
// 关闭订单
CloseOrderRequest closeOrderRequest = new CloseOrderRequest();
closeOrderRequest.setMchid(sysDept.getMerchantId());
closeOrderRequest.setOutTradeNo(tradeNo);
jsapiServiceExtension.closeOrder(closeOrderRequest);
}
String outTradeNo = IdUtils.getOrderNo("wx");
order.setOutTradeNo(outTradeNo);
int updateEtOrder = etOrderService.updateEtOrder(order);
if(updateEtOrder == 0){
throw new ServiceException("更新订单outTradeNo失败");
}
request.setOutTradeNo(outTradeNo);
request.setAppid(sysDept.getAppid());
request.setMchid(sysDept.getMerchantId());
String description = "优惠券订单-"+billNo;
request.setAttach(JSON.toJSONString(new AttachVo(order.getType(),user.getUserId(), "")));
request.setDescription(description);
request.setNotifyUrl(sysDept.getNotifyUrl());
request.setPayer(getPayer(user.getWxopenid()));
PrepayWithRequestPaymentResponse res = jsapiServiceExtension.prepayWithRequestPayment(request);
return res;
}else{
log.info("区域:【{}】没有绑定运营商",order.getAreaId());
throw new ServiceException("区域:【"+order.getAreaId()+"】没有绑定运营商");
}
} finally {
redisLock.unlock(PREPAY_LOCK + billNo);
}
}
private JsapiServiceExtension getJsapiServiceExtension(SysDept sysDept) {
// 初始化商户配置
Config config = new RSAAutoCertificateConfig.Builder()