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.HttpContextUtil; 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.common.entity.*; import com.peanut.modules.common.service.*; import com.peanut.modules.pay.weChatPay.dto.WechatPaymentInfo; import com.peanut.modules.pay.weChatPay.service.WxpayService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.amqp.core.MessagePostProcessor; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import jakarta.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.Map; /** * 培训班 */ @Slf4j @RestController("commonTrainingClass") @RequestMapping("common/trainingClass") public class TrainingClassController { @Autowired private TrainingClassService trainingClassService; @Autowired private TrainingToUserService trainingToUserService; @Autowired private com.peanut.modules.book.service.TransactionDetailsService transactionDetailsService; @Autowired private JfTransactionDetailsService jfTransactionDetailsService; @Autowired private BuyOrderService buyOrderService; @Autowired private WxpayService wxpayService; @Autowired private MyUserService userService; @Autowired private RabbitTemplate rabbitTemplate; //获取用户当前培训班最低价格 @RequestMapping("/getFinalPriceByUser") public R getFinalPriceByUser(@RequestBody Map params) { Map info = trainingClassService.getFinalPriceByUser((int)params.get("classId"),(int)params.get("userId")); return R.ok().put("info",info); } //培训班列表 @RequestMapping("/trainingClassList") public R trainingClassList(@RequestBody Map params) { //根部不同平台返回不同列表 HttpServletRequest request = HttpContextUtil.getHttpServletRequest(); String displayApp = ""; String appType = request.getHeader("appType")==null?"":request.getHeader("appType"); if ("".equals(appType)){ displayApp = "0"; }else if ("medical".equals(appType)){ displayApp = "2"; }else if ("sociology".equals(appType)){ displayApp = "1"; }else if ("psyche".equals(appType)){ displayApp = "3"; }else if ("taihumed".equals(appType)){ displayApp = "4"; } List trainingClassList = trainingClassService.list(new LambdaQueryWrapper() .eq(TrainingClass::getDisplayFlag,0) .eq(StringUtils.isNotEmpty(params.get("year").toString()),TrainingClass::getYear,params.get("year")) .like(!"".equals(displayApp),TrainingClass::getDisplayApp,displayApp) .orderByDesc(TrainingClass::getSingupFlag) .orderByAsc(TrainingClass::getSort)); for (TrainingClass trainingClass : trainingClassList) { trainingClass.setFinalFee("0"); Map m = trainingClassService.getFinalPriceByUser(trainingClass.getId(),ShiroUtils.getUId()); if (m!=null&m.containsKey("identity")){ trainingClass.setIdentity(m.get("identity").toString()); } if (m!=null&m.containsKey("fee")){ trainingClass.setFinalFee(m.get("fee").toString()); } Long count = trainingToUserService.count(new LambdaQueryWrapper() .eq(TrainingToUser::getUserId, ShiroUtils.getUId()) .eq(TrainingToUser::getTrainingId,trainingClass.getId())); if (count > 0) { trainingClass.setIsJoin(1); }else { trainingClass.setIsJoin(0); } } return R.ok().put("trainingClassList",trainingClassList); } //培训班报名 @RequestMapping("/trainingClassPaySave") @Transactional public R trainingClassPaySave(@RequestBody BuyOrder buyOrder){ Long count = trainingToUserService.count(new LambdaQueryWrapper() .eq(TrainingToUser::getUserId,buyOrder.getUserId()) .eq(TrainingToUser::getTrainingId,buyOrder.getTrainingClassId())); if(count>0){ return R.error("已报名"); } buyOrder.setOrderStatus("0"); buyOrder.setOrderType("trainingClass"); String timeId = IdWorker.getTimeId().substring(0, 32); buyOrder.setOrderSn(timeId); buyOrder.setUserId(ShiroUtils.getUId()); buyOrderService.save(buyOrder); if (StringUtils.isNotEmpty(buyOrder.getUserName())){ MyUserEntity user = userService.getById(buyOrder.getUserId()); user.setName(buyOrder.getUserName()); userService.updateById(user); } BigDecimal totalPrice = buyOrder.getRealMoney(); //虚拟币支付 if (Constants.PAYMENT_METHOD_VIRTUAL.equals(buyOrder.getPaymentMethod())) { buyOrder.setOrderStatus(Constants.ORDER_STATUS_TO_BE_SHIPPED); MyUserEntity user = userService.getById(buyOrder.getUserId()); if (usePeanutCoin(user, totalPrice)) { //处理抵扣积分 if(buyOrder.getJfDeduction().compareTo(BigDecimal.ZERO)>0){ userCoinJf(buyOrder); } buyOrder.setSuccessTime(new Date()); // 更新订单状态 buyOrderService.updateOrderStatus(user.getId(), buyOrder.getOrderSn(), "2"); //记录用户虚拟币消费 if(totalPrice.compareTo(BigDecimal.ZERO)>0){ transactionDetailsService.recordTransaction(buyOrder, user, totalPrice); } //插入培训班 trainingClassService.addTrainingClassForUser(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(buyOrder.getOrderId()); paymentInfo.setOrderType(buyOrderEntity.getOrderType()); paymentInfo.setTotalAmount(buyOrderEntity.getRealMoney()); if (buyOrder.getCome()==2){ paymentInfo.setAppName("wumen"); } else if (buyOrder.getCome()==1) { paymentInfo.setAppName("zmzm"); } else if (buyOrder.getCome()==3) { paymentInfo.setAppName("xlkj"); } else if (buyOrder.getCome()==4) { paymentInfo.setAppName("thyy"); }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", totalPrice); } 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)); userService.updateById(user); return true; } return false; } private void userCoinJf(BuyOrder order){ MyUserEntity userEntity = userService.getById(order.getUserId()); userEntity.setJf(userEntity.getJf().subtract(order.getJfDeduction())); userService.updateById(userEntity); JfTransactionDetails jfTransactionDetails = new JfTransactionDetails(); jfTransactionDetails.setUserId(userEntity.getId()); jfTransactionDetails.setChangeAmount(order.getJfDeduction().negate()); jfTransactionDetails.setActType(1); jfTransactionDetails.setUserBalance(userEntity.getJf()); jfTransactionDetails.setRelationId(order.getOrderId()); jfTransactionDetails.setRemark("消费积分抵扣:"+order.getJfDeduction().toString()+",订单号:"+order.getOrderSn()); jfTransactionDetailsService.save(jfTransactionDetails); } private MessagePostProcessor messagePostProcessor() { return message -> { //设置有效期30分钟 message.getMessageProperties().setExpiration(String.valueOf(30 * 60 * 1000)); return message; }; } }