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 wrapper = new LambdaQueryWrapper(); wrapper.eq(UserVip::getUserId,userId); wrapper.orderByAsc(UserVip::getState); wrapper.orderByAsc(UserVip::getEndTime); List 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); 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().eq(BuyOrder::getOrderSn, timeId)); WechatPaymentInfo paymentInfo = new WechatPaymentInfo(); paymentInfo.setOrderSn(buyOrderEntity.getOrderSn()); paymentInfo.setBuyOrderId(buyOrderEntity.getOrderId()); paymentInfo.setTotalAmount(buyOrderEntity.getRealMoney()); // paymentInfo.setAppName(buyOrder.getAppName()); if (buyOrder.getCome()==2){ paymentInfo.setAppName("wumen"); } else if (buyOrder.getCome()==1) { paymentInfo.setAppName("zmzm"); }else { 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 userVips = userVipDao.selectList(new LambdaQueryWrapper().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 userVips = userVipDao.selectList(new LambdaQueryWrapper().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 userVips = userVipDao.selectList(new LambdaQueryWrapper().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; }; } }