From d1746c678f0477052fe6286d0fe8871186584f02 Mon Sep 17 00:00:00 2001 From: wuchunlei Date: Wed, 16 Apr 2025 16:39:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=B9=E8=AE=AD=E7=8F=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TrainingClassController.java | 77 +++++++++++++++++-- .../TransactionDetailsController.java | 1 + .../modules/common/entity/BuyOrder.java | 4 +- .../modules/common/entity/TrainingClass.java | 9 ++- .../modules/common/entity/TrainingToUser.java | 8 +- .../peanut/modules/common/entity/UserVip.java | 2 +- .../common/service/TrainingClassService.java | 6 +- .../impl/TrainingClassServiceImpl.java | 37 +++++++-- .../controller/TrainingClassController.java | 32 ++++++-- .../service/impl/AliPayServiceImpl.java | 21 +++-- .../service/impl/WxpayServiceImpl.java | 21 +++-- 11 files changed, 166 insertions(+), 52 deletions(-) diff --git a/src/main/java/com/peanut/modules/common/controller/TrainingClassController.java b/src/main/java/com/peanut/modules/common/controller/TrainingClassController.java index 142957d5..3f4218f0 100644 --- a/src/main/java/com/peanut/modules/common/controller/TrainingClassController.java +++ b/src/main/java/com/peanut/modules/common/controller/TrainingClassController.java @@ -6,12 +6,8 @@ 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.BuyOrder; -import com.peanut.modules.common.entity.TrainingClass; -import com.peanut.modules.common.entity.TrainingToUser; -import com.peanut.modules.common.service.BuyOrderService; -import com.peanut.modules.common.service.TrainingClassService; -import com.peanut.modules.common.service.TrainingToUserService; +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; @@ -25,6 +21,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.math.BigDecimal; +import java.util.Date; import java.util.List; import java.util.Map; @@ -41,10 +38,16 @@ public class TrainingClassController { @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; //获取用户当前培训班最低价格 @@ -59,8 +62,17 @@ public class TrainingClassController { public R trainingClassList(@RequestBody Map params) { List trainingClassList = trainingClassService.list(new LambdaQueryWrapper() .eq(StringUtils.isNotEmpty(params.get("year").toString()),TrainingClass::getYear,params.get("year")) + .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()); + } int count = trainingToUserService.count(new LambdaQueryWrapper() .eq(TrainingToUser::getUserId, ShiroUtils.getUId()) .eq(TrainingToUser::getTrainingId,trainingClass.getId())); @@ -83,7 +95,34 @@ public class TrainingClassController { 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() @@ -112,6 +151,32 @@ public class TrainingClassController { 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分钟 diff --git a/src/main/java/com/peanut/modules/common/controller/TransactionDetailsController.java b/src/main/java/com/peanut/modules/common/controller/TransactionDetailsController.java index 2d1b9649..9767dc8c 100644 --- a/src/main/java/com/peanut/modules/common/controller/TransactionDetailsController.java +++ b/src/main/java/com/peanut/modules/common/controller/TransactionDetailsController.java @@ -70,6 +70,7 @@ public class TransactionDetailsController { } } detail.setProductName(productName); + detail.setRelationId(buyOrder.getOrderId()); } } return R.ok().put("transactionDetailsList",list); diff --git a/src/main/java/com/peanut/modules/common/entity/BuyOrder.java b/src/main/java/com/peanut/modules/common/entity/BuyOrder.java index d5dc6e63..3ea45e9f 100644 --- a/src/main/java/com/peanut/modules/common/entity/BuyOrder.java +++ b/src/main/java/com/peanut/modules/common/entity/BuyOrder.java @@ -171,7 +171,7 @@ public class BuyOrder implements Serializable { private Integer abroadBookId;//海外读书购买书籍id - private Integer offlineActivityId;//线下活动id + private Integer trainingClassId;//培训班id /** * 地址id @@ -218,4 +218,6 @@ public class BuyOrder implements Serializable { private VipBuyConfigEntity vipBuyConfigEntity; @TableField(exist = false) private BookEntity bookEntity; + @TableField(exist = false) + private String trainingClassIdentity; } diff --git a/src/main/java/com/peanut/modules/common/entity/TrainingClass.java b/src/main/java/com/peanut/modules/common/entity/TrainingClass.java index 6a0e0f17..623f0e64 100644 --- a/src/main/java/com/peanut/modules/common/entity/TrainingClass.java +++ b/src/main/java/com/peanut/modules/common/entity/TrainingClass.java @@ -30,10 +30,13 @@ public class TrainingClass { //培训日期 private String trainingDate; + //截至日期 + private String endDate; + //详情图片 private String icon; - //报名开关 0可报名1不可报名 + //报名开关 0不可报名1可报名 private Integer singupFlag; //费用 @@ -70,5 +73,9 @@ public class TrainingClass { @TableField(exist = false) private int isJoin; + @TableField(exist = false) + private String identity; + @TableField(exist = false) + private String finalFee; } diff --git a/src/main/java/com/peanut/modules/common/entity/TrainingToUser.java b/src/main/java/com/peanut/modules/common/entity/TrainingToUser.java index 00bd20f6..112b5e73 100644 --- a/src/main/java/com/peanut/modules/common/entity/TrainingToUser.java +++ b/src/main/java/com/peanut/modules/common/entity/TrainingToUser.java @@ -24,8 +24,6 @@ public class TrainingToUser { private String identity; - private String payMethod; - private Date createTime; @TableLogic @@ -33,5 +31,11 @@ public class TrainingToUser { @TableField(exist = false) private MyUserEntity user; + @TableField(exist = false) + private String payMethod; + @TableField(exist = false) + private String realMoney; + @TableField(exist = false) + private String jfDeduction; } diff --git a/src/main/java/com/peanut/modules/common/entity/UserVip.java b/src/main/java/com/peanut/modules/common/entity/UserVip.java index 9f9d5fd0..217ae285 100644 --- a/src/main/java/com/peanut/modules/common/entity/UserVip.java +++ b/src/main/java/com/peanut/modules/common/entity/UserVip.java @@ -25,7 +25,7 @@ public class UserVip implements Serializable { */ private Integer userId; /** - * 4中医学5针灸学6肿瘤学7国学8心理学 + * 4中医学5针灸学6肿瘤学7国学8心理学9中西汇通 */ private Integer type; /** diff --git a/src/main/java/com/peanut/modules/common/service/TrainingClassService.java b/src/main/java/com/peanut/modules/common/service/TrainingClassService.java index b6ffe53e..6817e403 100644 --- a/src/main/java/com/peanut/modules/common/service/TrainingClassService.java +++ b/src/main/java/com/peanut/modules/common/service/TrainingClassService.java @@ -1,14 +1,14 @@ package com.peanut.modules.common.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.peanut.modules.common.entity.MyUserEntity; +import com.peanut.modules.common.entity.BuyOrder; import com.peanut.modules.common.entity.TrainingClass; - -import java.math.BigDecimal; import java.util.Map; public interface TrainingClassService extends IService { Map getFinalPriceByUser(int classId, int userId); + void addTrainingClassForUser(BuyOrder buyOrder); + } diff --git a/src/main/java/com/peanut/modules/common/service/impl/TrainingClassServiceImpl.java b/src/main/java/com/peanut/modules/common/service/impl/TrainingClassServiceImpl.java index 0b099f32..4ce5e5a6 100644 --- a/src/main/java/com/peanut/modules/common/service/impl/TrainingClassServiceImpl.java +++ b/src/main/java/com/peanut/modules/common/service/impl/TrainingClassServiceImpl.java @@ -5,11 +5,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.peanut.modules.common.dao.TrainingClassDao; import com.peanut.modules.common.dao.UserVipDao; -import com.peanut.modules.common.entity.MyUserEntity; -import com.peanut.modules.common.entity.TrainingClass; -import com.peanut.modules.common.entity.UserContribution; -import com.peanut.modules.common.entity.UserVip; +import com.peanut.modules.common.entity.*; import com.peanut.modules.common.service.TrainingClassService; +import com.peanut.modules.common.service.TrainingToUserService; import com.peanut.modules.common.service.UserContributionService; import com.peanut.modules.common.service.UserVipService; import lombok.extern.slf4j.Slf4j; @@ -29,6 +27,8 @@ public class TrainingClassServiceImpl extends ServiceImpl getFinalPriceByUser(int classId,int userId) { @@ -43,7 +43,20 @@ public class TrainingClassServiceImpl extends ServiceImpl0){ fee = trainingClass.getVipFee(); - identity = "vip"; + if ("4".equals(vipType)){ + identity = "中医学vip"; + }else if ("5".equals(vipType)) { + identity = "针灸学vip"; + }else if ("6".equals(vipType)) { + identity = "肿瘤学vip"; + }else if ("7".equals(vipType)) { + identity = "国学vip"; + }else if ("8".equals(vipType)) { + identity = "心理学vip"; + }else if ("9".equals(vipType)) { + identity = "中西汇通vip"; + } + break; } } } @@ -53,12 +66,12 @@ public class TrainingClassServiceImpl extends ServiceImpl0){ fee = trainingClass.getSvipFee(); - identity = "svip"; + identity = "医学svip"; } }else if ("2".equals(svipType)&&userVipService.is78SVip(userId)){ if (fee.compareTo(trainingClass.getSvipFee())>0){ fee = trainingClass.getSvipFee(); - identity = "svip"; + identity = "国学心理学svip"; } } } @@ -98,4 +111,14 @@ public class TrainingClassServiceImpl extends ServiceImpl trainingClassList = trainingClassService.page(new Page<>( + Page trainingClassPage = trainingClassService.page(new Page<>( Long.parseLong(params.get("current").toString()), Long.parseLong(params.get("limit").toString())),wrapper); - return R.ok().put("trainingClassList",trainingClassList); + return R.ok().put("trainingClassList",trainingClassPage); } //培训班下用户列表 @@ -106,11 +106,22 @@ public class TrainingClassController { wrapper.selectAll(TrainingToUser.class); wrapper.eq(TrainingToUser::getTrainingId,params.get("trainingId")); wrapper.like(StringUtils.isNotEmpty(params.get("tel").toString()),MyUserEntity::getTel,params.get("tel")); - wrapper.orderByDesc(TrainingToUser::getCreateTime); + if ("2".equals(params.get("createTimeSort").toString())){ + wrapper.orderByAsc(TrainingToUser::getCreateTime); + }else { + wrapper.orderByDesc(TrainingToUser::getCreateTime); + } Page trainingClassUserList = trainingToUserService.page(new Page<>( Long.parseLong(params.get("current").toString()), Long.parseLong(params.get("limit").toString())),wrapper); for (TrainingToUser toUser:trainingClassUserList.getRecords()){ toUser.setUser(userService.getById(toUser.getUserId())); + if (StringUtils.isNotEmpty(toUser.getOrderSn())){ + BuyOrder buyOrder = buyOrderService.getOne(new LambdaQueryWrapper() + .eq(BuyOrder::getOrderSn,toUser.getOrderSn())); + toUser.setPayMethod("1".equals(buyOrder.getPaymentMethod())?"微信":("2".equals(buyOrder.getPaymentMethod())?"支付宝":"虚拟币")); + toUser.setRealMoney(buyOrder.getRealMoney().toString()); + toUser.setJfDeduction(buyOrder.getJfDeduction().toString()); + } } return R.ok().put("trainingClassUserList",trainingClassUserList); } @@ -129,6 +140,13 @@ public class TrainingClassController { return R.ok(); } + //培训班删除用户 + @RequestMapping("/delUserToTrainingClass") + public R delUserToTrainingClass(@RequestBody Map params) { + trainingToUserService.removeById(params.get("id").toString()); + return R.ok(); + } + diff --git a/src/main/java/com/peanut/modules/pay/alipay/service/impl/AliPayServiceImpl.java b/src/main/java/com/peanut/modules/pay/alipay/service/impl/AliPayServiceImpl.java index b2cb29cd..88c119c2 100644 --- a/src/main/java/com/peanut/modules/pay/alipay/service/impl/AliPayServiceImpl.java +++ b/src/main/java/com/peanut/modules/pay/alipay/service/impl/AliPayServiceImpl.java @@ -10,13 +10,14 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.peanut.common.utils.CopyUtils; import com.peanut.common.utils.OrderUtils; import com.peanut.common.utils.ShiroUtils; +import com.peanut.modules.book.service.BookBuyConfigService; +import com.peanut.modules.book.service.BuyOrderService; +import com.peanut.modules.book.service.MyUserService; +import com.peanut.modules.book.service.TransactionDetailsService; import com.peanut.modules.common.dao.*; import com.peanut.modules.book.service.*; import com.peanut.modules.common.entity.*; -import com.peanut.modules.common.service.CouponHistoryService; -import com.peanut.modules.common.service.CouponService; -import com.peanut.modules.common.service.OfflineActivityToUserService; -import com.peanut.modules.common.service.UserVipService; +import com.peanut.modules.common.service.*; import com.peanut.modules.master.service.UserCourseBuyService; import com.peanut.modules.pay.alipay.config.AliPayConfig; import com.peanut.modules.pay.alipay.config.AliPayUtil; @@ -76,7 +77,7 @@ public class AliPayServiceImpl implements AliPayService { @Autowired private CouponHistoryService couponHistoryService; @Autowired - private OfflineActivityToUserService offlineActivityToUserService; + private TrainingClassService trainingClassService; @Override public String pay(AlipayDTO payDto) { @@ -169,15 +170,11 @@ public class AliPayServiceImpl implements AliPayService { couponService.useCouponAmount(couponHistory); } - if("offlineActivity".equals(subject)){ + if("trainingClass".equals(subject)){ //更新 订单 记录 buyOrderService.updateOrderStatus(Integer.valueOf(customerid),oldPayZfbOrderEntity.getRelevanceoid(),"2"); - //插入活动人员关联 - OfflineActivityToUser offlineActivityToUser = new OfflineActivityToUser(); - offlineActivityToUser.setActivityId(order.getOfflineActivityId()); - offlineActivityToUser.setOrderId(order.getOrderId()); - offlineActivityToUser.setUserId(ShiroUtils.getUId()); - offlineActivityToUserService.save(offlineActivityToUser); + //插入培训班 + trainingClassService.addTrainingClassForUser(order); } if("relearn".equals(subject)){ diff --git a/src/main/java/com/peanut/modules/pay/weChatPay/service/impl/WxpayServiceImpl.java b/src/main/java/com/peanut/modules/pay/weChatPay/service/impl/WxpayServiceImpl.java index d6a0b220..442c7fa3 100644 --- a/src/main/java/com/peanut/modules/pay/weChatPay/service/impl/WxpayServiceImpl.java +++ b/src/main/java/com/peanut/modules/pay/weChatPay/service/impl/WxpayServiceImpl.java @@ -8,13 +8,14 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.peanut.common.utils.ShiroUtils; +import com.peanut.modules.book.service.BookBuyConfigService; +import com.peanut.modules.book.service.BuyOrderService; +import com.peanut.modules.book.service.MyUserService; +import com.peanut.modules.book.service.TransactionDetailsService; import com.peanut.modules.common.dao.*; import com.peanut.modules.book.service.*; import com.peanut.modules.common.entity.*; -import com.peanut.modules.common.service.CouponHistoryService; -import com.peanut.modules.common.service.CouponService; -import com.peanut.modules.common.service.OfflineActivityToUserService; -import com.peanut.modules.common.service.UserVipService; +import com.peanut.modules.common.service.*; import com.peanut.modules.master.service.UserCourseBuyService; import com.peanut.modules.pay.refund.entity.PayRefundOrder; import com.peanut.modules.pay.refund.service.PayRefundOrderService; @@ -83,7 +84,7 @@ public class WxpayServiceImpl extends ServiceImpl