Files
nuttyreading-java/src/main/java/com/peanut/modules/common/controller/TrainingClassController.java
2025-10-17 17:47:24 +08:00

214 lines
9.2 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.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<String,Object> params) {
Map<String,Object> info = trainingClassService.getFinalPriceByUser((int)params.get("classId"),(int)params.get("userId"));
return R.ok().put("info",info);
}
//培训班列表
@RequestMapping("/trainingClassList")
public R trainingClassList(@RequestBody Map<String,Object> 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<TrainingClass> trainingClassList = trainingClassService.list(new LambdaQueryWrapper<TrainingClass>()
.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<TrainingToUser>()
.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){
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<BuyOrder>()
.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;
};
}
}