270 lines
12 KiB
Java
270 lines
12 KiB
Java
package com.peanut.modules.common.controller;
|
||
|
||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
||
import com.peanut.common.utils.R;
|
||
import com.peanut.common.utils.ShiroUtils;
|
||
import com.peanut.config.Constants;
|
||
import com.peanut.config.DelayQueueConfig;
|
||
import com.peanut.modules.book.service.TransactionDetailsService;
|
||
import com.peanut.modules.common.dao.JfTransactionDetailsDao;
|
||
import com.peanut.modules.common.dao.MyUserDao;
|
||
import com.peanut.modules.common.dao.UserVipDao;
|
||
import com.peanut.modules.common.dao.VipBuyConfigDao;
|
||
import com.peanut.modules.common.entity.*;
|
||
import com.peanut.modules.common.service.BuyOrderService;
|
||
import com.peanut.modules.common.service.UserVipService;
|
||
import com.peanut.modules.common.to.VipOrderDto;
|
||
import com.peanut.modules.pay.weChatPay.dto.WechatPaymentInfo;
|
||
import com.peanut.modules.pay.weChatPay.service.WxpayService;
|
||
import lombok.extern.slf4j.Slf4j;
|
||
import org.springframework.amqp.core.MessagePostProcessor;
|
||
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
||
import org.springframework.beans.factory.annotation.Autowired;
|
||
import org.springframework.web.bind.annotation.RequestBody;
|
||
import org.springframework.web.bind.annotation.RequestMapping;
|
||
import org.springframework.web.bind.annotation.RestController;
|
||
|
||
import javax.transaction.Transactional;
|
||
import java.math.BigDecimal;
|
||
import java.time.LocalDate;
|
||
import java.time.Period;
|
||
import java.util.Calendar;
|
||
import java.util.Date;
|
||
import java.util.List;
|
||
|
||
/**
|
||
* 超V管理
|
||
*/
|
||
@Slf4j
|
||
@RestController("commonUserVip")
|
||
@RequestMapping("common/userVip")
|
||
public class UserVipController {
|
||
|
||
@Autowired
|
||
private UserVipService userVipService;
|
||
@Autowired
|
||
private BuyOrderService buyOrderService;
|
||
@Autowired
|
||
private WxpayService wxpayService;
|
||
@Autowired
|
||
private RabbitTemplate rabbitTemplate;
|
||
@Autowired
|
||
private MyUserDao myUserDao;
|
||
@Autowired
|
||
private VipBuyConfigDao vipBuyConfigDao;
|
||
@Autowired
|
||
private UserVipDao userVipDao;
|
||
@Autowired
|
||
private TransactionDetailsService transactionDetailsService;
|
||
@Autowired
|
||
private JfTransactionDetailsDao jfTransactionDetailsDao;
|
||
|
||
@RequestMapping("/getMyVipHistory")
|
||
public R getMyVipHistory(String userId) {
|
||
LambdaQueryWrapper<UserVip> wrapper = new LambdaQueryWrapper();
|
||
wrapper.eq(UserVip::getUserId,userId);
|
||
wrapper.orderByAsc(UserVip::getState);
|
||
wrapper.orderByAsc(UserVip::getEndTime);
|
||
List<UserVip> userVips = userVipService.list(wrapper);
|
||
return R.ok().put("result", userVips);
|
||
}
|
||
|
||
@RequestMapping("/placeVipOrder")
|
||
@Transactional
|
||
public R placeVipOrder(@RequestBody BuyOrder buyOrder) throws Exception {
|
||
int uid = ShiroUtils.getUId();
|
||
|
||
buyOrder.setOrderStatus("0");
|
||
buyOrder.setOrderType("vip");
|
||
String timeId = IdWorker.getTimeId().substring(0, 32);
|
||
buyOrder.setOrderSn(timeId);
|
||
buyOrder.setUserId(uid);
|
||
if(buyOrder.getCome()==1){
|
||
buyOrder.setAppName("zmzm");
|
||
}
|
||
buyOrderService.save(buyOrder);
|
||
BigDecimal totalPrice = buyOrder.getRealMoney();
|
||
if (Constants.PAYMENT_METHOD_VIRTUAL.equals(buyOrder.getPaymentMethod())) {
|
||
buyOrder.setOrderStatus(Constants.ORDER_STATUS_TO_BE_SHIPPED);
|
||
MyUserEntity user = myUserDao.selectById(buyOrder.getUserId());
|
||
if (usePeanutCoin(user, totalPrice)&&useJfCoin(user,buyOrder.getJfDeduction())) {
|
||
// 更新订单状态
|
||
buyOrderService.updateOrderStatus(user.getId(), buyOrder.getOrderSn(), "2");
|
||
//记录用户虚拟币消费
|
||
if(totalPrice.compareTo(BigDecimal.ZERO)>0){
|
||
recordTransaction(buyOrder, user, totalPrice);
|
||
}
|
||
//记录用户积分消费情况
|
||
if(buyOrder.getJfDeduction()!=null&&buyOrder.getJfDeduction().compareTo(BigDecimal.ZERO) > 0){
|
||
recordJfTransaction(buyOrder, user, buyOrder.getJfDeduction());
|
||
}
|
||
//开通用户vip,并且对已开通的课程做延期
|
||
openVipForUser(buyOrder);
|
||
} else {
|
||
return R.error(500, "余额不足!");
|
||
}
|
||
}
|
||
//下单微信支付预付款订单
|
||
if(Constants.PAYMENT_METHOD_WECHAT_PAY.equals(buyOrder.getPaymentMethod())){
|
||
BuyOrder buyOrderEntity = buyOrderService.getBaseMapper().selectOne(new LambdaQueryWrapper<BuyOrder>().eq(BuyOrder::getOrderSn, timeId));
|
||
WechatPaymentInfo paymentInfo = new WechatPaymentInfo();
|
||
paymentInfo.setOrderSn(buyOrderEntity.getOrderSn());
|
||
paymentInfo.setBuyOrderId(buyOrderEntity.getOrderId());
|
||
paymentInfo.setTotalAmount(buyOrderEntity.getRealMoney());
|
||
paymentInfo.setAppName(buyOrder.getAppName());
|
||
wxpayService.prepay(paymentInfo);
|
||
}
|
||
rabbitTemplate.convertAndSend(
|
||
DelayQueueConfig.ORDER_TO_BE_PAY_EXCHANGE,
|
||
DelayQueueConfig.ORDER_TO_BE_PAY_ROUTING_KEY,
|
||
buyOrder.getOrderId(),
|
||
messagePostProcessor()
|
||
);
|
||
return R.ok().put("orderSn", timeId).put("money",buyOrder.getRealMoney());
|
||
}
|
||
|
||
private boolean usePeanutCoin(MyUserEntity user, BigDecimal totalPrice) {
|
||
if (user.getPeanutCoin().compareTo(totalPrice) >= 0) {
|
||
if(totalPrice.compareTo(BigDecimal.ZERO)==0){//纯积分支付,虚拟币不用支付
|
||
return true;
|
||
}
|
||
user.setPeanutCoin(user.getPeanutCoin().subtract(totalPrice));
|
||
myUserDao.updateById(user);
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
private void openVipForUser(BuyOrder buyOrder) throws Exception {
|
||
VipBuyConfigEntity vipBuyConfigEntity = vipBuyConfigDao.selectById(buyOrder.getVipBuyConfigId());
|
||
MyUserEntity userEntity = myUserDao.selectById(buyOrder.getUserId());
|
||
String u_v_type = userEntity.getVip();
|
||
if(vipBuyConfigEntity.getType()==1){//超v
|
||
if(u_v_type.equals("0")){//初次办理
|
||
UserVip userVip = new UserVip();
|
||
userVip.setUserId(userEntity.getId());
|
||
userVip.setType(1);
|
||
userVip.setStartTime(new Date());
|
||
LocalDate today = LocalDate.now();
|
||
LocalDate threeYearsLater = today.plus(Period.ofYears(vipBuyConfigEntity.getYear()));
|
||
Date threeYearsDate = Date.from(threeYearsLater.atStartOfDay(java.time.ZoneId.systemDefault()).toInstant());
|
||
userVip.setEndTime(threeYearsDate);
|
||
userVipDao.insert(userVip);
|
||
userEntity.setVip("1");
|
||
myUserDao.updateById(userEntity);
|
||
}else if(u_v_type.equals("1")){//vip延期
|
||
List<UserVip> userVips = userVipDao.selectList(new LambdaQueryWrapper<UserVip>().eq(UserVip::getUserId, userEntity.getId()).gt(UserVip::getEndTime, new Date()).eq(UserVip::getState, 0));
|
||
if(userVips.size()!=1){
|
||
throwExceptionMethod();
|
||
}
|
||
UserVip userVip = userVips.get(0);
|
||
Date endTime = userVip.getEndTime();
|
||
Calendar calendar = Calendar.getInstance();
|
||
calendar.setTime(endTime);
|
||
calendar.add(Calendar.YEAR,vipBuyConfigEntity.getYear());
|
||
userVip.setEndTime(calendar.getTime());
|
||
userVipDao.updateById(userVip);
|
||
}else if (u_v_type.equals("2")||u_v_type.equals("3")){//医学vip或国学vip升级
|
||
List<UserVip> userVips = userVipDao.selectList(new LambdaQueryWrapper<UserVip>().eq(UserVip::getUserId, userEntity.getId()).gt(UserVip::getEndTime, new Date()).eq(UserVip::getState, 0));
|
||
if(userVips.size()!=1){
|
||
throwExceptionMethod();
|
||
}
|
||
UserVip userVip1 = userVips.get(0);
|
||
userVip1.setEndTime(new Date());
|
||
userVip1.setState(1);
|
||
userVipDao.updateById(userVip1);
|
||
UserVip userVip = new UserVip();
|
||
userVip.setUserId(userEntity.getId());
|
||
userVip.setType(1);
|
||
userVip.setStartTime(new Date());
|
||
LocalDate today = LocalDate.now();
|
||
LocalDate threeYearsLater = today.plus(Period.ofYears(vipBuyConfigEntity.getYear()));
|
||
Date threeYearsDate = Date.from(threeYearsLater.atStartOfDay(java.time.ZoneId.systemDefault()).toInstant());
|
||
userVip.setEndTime(threeYearsDate);
|
||
userVipDao.insert(userVip);
|
||
userEntity.setVip("1");
|
||
myUserDao.updateById(userEntity);
|
||
|
||
}
|
||
}
|
||
if(vipBuyConfigEntity.getType()==2||vipBuyConfigEntity.getType()==3){//医学vip或国学vip
|
||
if(userEntity.getVip().equals("2")||userEntity.getVip().equals("3")){//续费
|
||
List<UserVip> userVips = userVipDao.selectList(new LambdaQueryWrapper<UserVip>().eq(UserVip::getUserId, userEntity.getId()).gt(UserVip::getEndTime, new Date()).eq(UserVip::getState, 0));
|
||
if(userVips.size()!=1){
|
||
throwExceptionMethod();
|
||
}
|
||
UserVip userVip = userVips.get(0);
|
||
Date endTime = userVip.getEndTime();
|
||
Calendar calendar = Calendar.getInstance();
|
||
calendar.setTime(endTime);
|
||
calendar.add(Calendar.YEAR,vipBuyConfigEntity.getYear());
|
||
userVip.setEndTime(calendar.getTime());
|
||
userVipDao.updateById(userVip);
|
||
}else{//新办理
|
||
UserVip userVip = new UserVip();
|
||
userVip.setUserId(userEntity.getId());
|
||
userVip.setType(vipBuyConfigEntity.getType());
|
||
userVip.setStartTime(new Date());
|
||
LocalDate today = LocalDate.now();
|
||
LocalDate threeYearsLater = today.plus(Period.ofYears(vipBuyConfigEntity.getYear()));
|
||
Date threeYearsDate = Date.from(threeYearsLater.atStartOfDay(java.time.ZoneId.systemDefault()).toInstant());
|
||
userVip.setEndTime(threeYearsDate);
|
||
userVipDao.insert(userVip);
|
||
userEntity.setVip(vipBuyConfigEntity.getType().toString());
|
||
myUserDao.updateById(userEntity);
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
private static void throwExceptionMethod() throws Exception {
|
||
throw new Exception("开通vip异常");
|
||
}
|
||
|
||
private void recordJfTransaction(BuyOrder buyOrder, MyUserEntity user, BigDecimal jf){
|
||
JfTransactionDetails jfTransactionDetails = new JfTransactionDetails();
|
||
jfTransactionDetails.setUserId(user.getId());
|
||
jfTransactionDetails.setChangeAmount(jf);
|
||
jfTransactionDetails.setActType(0);
|
||
jfTransactionDetails.setUserBalance(user.getJf());
|
||
jfTransactionDetails.setRelationId(buyOrder.getOrderId());
|
||
jfTransactionDetails.setRemark("消费积分抵扣:"+jf.toString()+",订单号:"+buyOrder.getOrderSn());
|
||
jfTransactionDetailsDao.insert(jfTransactionDetails);
|
||
}
|
||
|
||
private boolean useJfCoin(MyUserEntity user,BigDecimal jf){
|
||
if(jf==null){
|
||
return true;
|
||
}
|
||
if(user.getJf().compareTo(jf)>=0){
|
||
user.setJf(user.getJf().subtract(jf));
|
||
myUserDao.updateById(user);
|
||
return true;
|
||
}else{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
private void recordTransaction(BuyOrder buyOrder, MyUserEntity user, BigDecimal totalPrice) {
|
||
TransactionDetailsEntity transactionDetailsEntity = new TransactionDetailsEntity();
|
||
transactionDetailsEntity.setRemark("订单编号为 - " + buyOrder.getOrderSn());
|
||
transactionDetailsEntity.setUserId(user.getId());
|
||
transactionDetailsEntity.setUserName(user.getNickname());
|
||
transactionDetailsEntity.setChangeAmount(totalPrice.negate());
|
||
transactionDetailsEntity.setUserBalance(user.getPeanutCoin());
|
||
transactionDetailsEntity.setTel(user.getTel());
|
||
transactionDetailsEntity.setOrderType("购买商品");
|
||
transactionDetailsService.save(transactionDetailsEntity);
|
||
}
|
||
|
||
private MessagePostProcessor messagePostProcessor() {
|
||
return message -> {
|
||
//设置有效期30分钟
|
||
message.getMessageProperties().setExpiration(String.valueOf(30 * 60 * 1000));
|
||
return message;
|
||
};
|
||
}
|
||
|
||
}
|