diff --git a/src/main/java/com/peanut/modules/common/entity/AiBuyConfig.java b/src/main/java/com/peanut/modules/common/entity/AiBuyConfig.java index 5bcde939..7b8d98b3 100644 --- a/src/main/java/com/peanut/modules/common/entity/AiBuyConfig.java +++ b/src/main/java/com/peanut/modules/common/entity/AiBuyConfig.java @@ -1,5 +1,6 @@ package com.peanut.modules.common.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; @@ -40,5 +41,12 @@ public class AiBuyConfig implements Serializable { @TableLogic private Integer delFlag; + @TableField(exist = false) + private boolean canUpgrade; + @TableField(exist = false) + private String upgradeCount; + @TableField(exist = false) + private BigDecimal upgradeFee; + } diff --git a/src/main/java/com/peanut/modules/common/entity/AiVipLog.java b/src/main/java/com/peanut/modules/common/entity/AiVipLog.java index 6ad3113a..0f8a3b58 100644 --- a/src/main/java/com/peanut/modules/common/entity/AiVipLog.java +++ b/src/main/java/com/peanut/modules/common/entity/AiVipLog.java @@ -36,6 +36,9 @@ public class AiVipLog implements Serializable { //结束时间 private Date endTime; + //0有效1失效 + private Integer state; + @TableLogic private Integer delFlag; 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 824f5027..6d605592 100644 --- a/src/main/java/com/peanut/modules/common/entity/BuyOrder.java +++ b/src/main/java/com/peanut/modules/common/entity/BuyOrder.java @@ -217,6 +217,8 @@ public class BuyOrder implements Serializable { @TableField(exist = false) private VipBuyConfigEntity vipBuyConfigEntity; @TableField(exist = false) + private AiBuyConfig aiBuyConfig; + @TableField(exist = false) private BookEntity bookEntity; @TableField(exist = false) private String trainingClassIdentity; diff --git a/src/main/java/com/peanut/modules/common/service/AiVipLogService.java b/src/main/java/com/peanut/modules/common/service/AiVipLogService.java index 997e23af..63a14913 100644 --- a/src/main/java/com/peanut/modules/common/service/AiVipLogService.java +++ b/src/main/java/com/peanut/modules/common/service/AiVipLogService.java @@ -2,13 +2,14 @@ package com.peanut.modules.common.service; import com.baomidou.mybatisplus.extension.service.IService; import com.peanut.modules.common.entity.AiVipLog; +import com.peanut.modules.common.entity.BuyOrder; public interface AiVipLogService extends IService { - void openAiVip(int aiBuyConfigId); + void openAiVip(BuyOrder buyOrder); boolean isAiVip(); - void userCount(); + boolean userCount(); } diff --git a/src/main/java/com/peanut/modules/common/service/impl/AiVipLogServiceImpl.java b/src/main/java/com/peanut/modules/common/service/impl/AiVipLogServiceImpl.java index 51c64676..12626346 100644 --- a/src/main/java/com/peanut/modules/common/service/impl/AiVipLogServiceImpl.java +++ b/src/main/java/com/peanut/modules/common/service/impl/AiVipLogServiceImpl.java @@ -9,13 +9,12 @@ import com.peanut.modules.common.dao.AiBuyConfigDao; import com.peanut.modules.common.dao.AiVipLogDao; import com.peanut.modules.common.entity.AiBuyConfig; import com.peanut.modules.common.entity.AiVipLog; +import com.peanut.modules.common.entity.BuyOrder; import com.peanut.modules.common.service.AiVipLogService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; - import java.util.Date; -import java.util.List; @Slf4j @Service("commonAiVipLogService") @@ -25,58 +24,60 @@ public class AiVipLogServiceImpl extends ServiceImpl impl private AiBuyConfigDao aiBuyConfigDao; @Override - public void openAiVip(int aiBuyConfigId) { - AiBuyConfig config = aiBuyConfigDao.selectById(aiBuyConfigId); + public void openAiVip(BuyOrder buyOrder) { + AiBuyConfig config = aiBuyConfigDao.selectById(buyOrder.getAiBuyConfigId()); if (config != null) { - AiVipLog aiVipLog = new AiVipLog(); - aiVipLog.setUserId(ShiroUtils.getUId()); - //1月度2季度 - aiVipLog.setType(config.getType()); - aiVipLog.setCount(config.getCount()); - aiVipLog.setSurplusCount(config.getCount()); - Date date = new Date(); - aiVipLog.setStartTime(date); - if (config.getType()==1){ - aiVipLog.setEndTime(DateUtils.addDateMonths(date,1)); - }else { - aiVipLog.setEndTime(DateUtils.addDateMonths(date,3)); + if ("aiVip".equals(buyOrder.getOrderType())){ + AiVipLog aiVipLog = new AiVipLog(); + aiVipLog.setUserId(ShiroUtils.getUId()); + //1月度2季度 + aiVipLog.setType(config.getType()); + aiVipLog.setCount(config.getCount()); + aiVipLog.setSurplusCount(config.getCount()); + Date date = new Date(); + aiVipLog.setStartTime(date); + if (config.getType()==1){ + aiVipLog.setEndTime(DateUtils.addDateMonths(date,1)); + }else { + aiVipLog.setEndTime(DateUtils.addDateMonths(date,3)); + } + this.save(aiVipLog); + }else if ("upgradeAiVip".equals(buyOrder.getOrderType())){ + AiVipLog aiVipLog = this.getOne(new LambdaQueryWrapper() + .eq(AiVipLog::getUserId,ShiroUtils.getUId()) + .eq(AiVipLog::getState,0)); + if (aiVipLog!=null){ + aiVipLog.setSurplusCount(config.getCount()-aiVipLog.getCount()+aiVipLog.getSurplusCount()); + aiVipLog.setCount(config.getCount()); + this.updateById(aiVipLog); + } } - this.save(aiVipLog); } } @Override public boolean isAiVip() { - List aiVipLogs = this.list(new LambdaQueryWrapper() + AiVipLog aiVipLog = this.getOne(new LambdaQueryWrapper() .eq(AiVipLog::getUserId,ShiroUtils.getUId()) - .orderByAsc(AiVipLog::getStartTime)); - for (AiVipLog aiVipLog:aiVipLogs){ - if (aiVipLog.getSurplusCount()>0&&new Date().getTime()0&&new Date().getTime() aiVipLogs = this.list(new LambdaQueryWrapper() + public boolean userCount() { + AiVipLog aiVipLog = this.getOne(new LambdaQueryWrapper() .eq(AiVipLog::getUserId,ShiroUtils.getUId()) - .orderByAsc(AiVipLog::getStartTime)); - boolean flag = false; - for (AiVipLog aiVipLog:aiVipLogs){ - if (aiVipLog.getSurplusCount()>0&&new Date().getTime()0&&new Date().getTime() impl @Autowired private VipBuyConfigDao vipBuyConfigDao; @Autowired + private AiBuyConfigDao aiBuyConfigDao; + @Autowired private ShopProductCourseDao shopProductCourseDao; @Override @@ -90,6 +92,9 @@ public class BuyOrderServiceImpl extends ServiceImpl impl if (b.getVipBuyConfigId()!=0){ b.setVipBuyConfigEntity(vipBuyConfigDao.selectById(b.getVipBuyConfigId())); } + if (b.getAiBuyConfigId()!=0){ + b.setAiBuyConfig(aiBuyConfigDao.selectById(b.getAiBuyConfigId())); + } //组装商品 List buyOrderProducts = buyOrderProductDao.selectList( new LambdaQueryWrapper().eq(BuyOrderProduct::getOrderId, b.getOrderId())); @@ -138,9 +143,12 @@ public class BuyOrderServiceImpl extends ServiceImpl impl if (buyOrder.getProductId()!=null){ buyOrder.setBookBuyConfigEntity(bookBuyConfigDao.selectById(buyOrder.getProductId())); } - if (buyOrder.getVipBuyConfigId()!=null){ + if (buyOrder.getVipBuyConfigId()!=null&&buyOrder.getAiBuyConfigId()!=0){ buyOrder.setVipBuyConfigEntity(vipBuyConfigDao.selectById(buyOrder.getVipBuyConfigId())); } + if (buyOrder.getAiBuyConfigId()!=null&&buyOrder.getAiBuyConfigId()!=0){ + buyOrder.setAiBuyConfig(aiBuyConfigDao.selectById(buyOrder.getAiBuyConfigId())); + } //添加商品信息 MPJLambdaWrapper buyOrderProductWrapper = new MPJLambdaWrapper<>(); buyOrderProductWrapper.leftJoin(BuyOrder.class,BuyOrder::getOrderId,BuyOrderProduct::getOrderId); diff --git a/src/main/java/com/peanut/modules/job/task/AiVipTask.java b/src/main/java/com/peanut/modules/job/task/AiVipTask.java new file mode 100644 index 00000000..afc99ab3 --- /dev/null +++ b/src/main/java/com/peanut/modules/job/task/AiVipTask.java @@ -0,0 +1,53 @@ +package com.peanut.modules.job.task; + +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.peanut.config.DelayQueueConfig; +import com.peanut.modules.common.entity.AiVipLog; +import com.peanut.modules.common.service.AiVipLogService; +import org.apache.commons.lang.time.DateUtils; +import org.springframework.amqp.core.MessagePostProcessor; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; + +@Component("aiVipTask") +public class AiVipTask implements ITask{ + + @Autowired + private AiVipLogService aiVipLogService; + @Autowired + private RabbitTemplate rabbitTemplate; + + @Override + public void run(String params) { + List aiVipLogs = aiVipLogService.list(new LambdaQueryWrapper() + .eq(AiVipLog::getState,0)); + for (AiVipLog aiVipLog : aiVipLogs) { + if (aiVipLog.getEndTime().getTime() { + message.getMessageProperties().setDelay((int)date); + return message; + }; + } + +} diff --git a/src/main/java/com/peanut/modules/mq/Consumer/CommonConsumer.java b/src/main/java/com/peanut/modules/mq/Consumer/CommonConsumer.java index e5f9ea8c..9ffa55de 100644 --- a/src/main/java/com/peanut/modules/mq/Consumer/CommonConsumer.java +++ b/src/main/java/com/peanut/modules/mq/Consumer/CommonConsumer.java @@ -4,10 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.peanut.config.DelayQueueConfig; import com.peanut.modules.common.dao.*; import com.peanut.modules.common.entity.*; -import com.peanut.modules.common.service.ClassEntityService; -import com.peanut.modules.common.service.ClassExamService; -import com.peanut.modules.common.service.CouponHistoryService; -import com.peanut.modules.common.service.UserVipService; +import com.peanut.modules.common.service.*; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.beans.factory.annotation.Autowired; @@ -41,6 +38,8 @@ public class CommonConsumer { private CourseCatalogueDao courseCatalogueDao; @Autowired private UserVipService userVipService; + @Autowired + private AiVipLogService aiVipLogService; @RabbitListener(queues = DelayQueueConfig.COMMON_QUEUE) public void commonConsumer(String typeAndParam) { @@ -102,6 +101,14 @@ public class CommonConsumer { couponHistoryService.updateById(couponHistory); } } + //aiVip过期 + if ("aiVipExpire".equals(typeAndParams[0])){ + AiVipLog aiVipLog = aiVipLogService.getById(typeAndParams[1]); + if (aiVipLog != null&&aiVipLog.getState()==0) { + aiVipLog.setState(1); + aiVipLogService.updateById(aiVipLog); + } + } }catch (Exception e) { log.error("mq通用队列消费异常",e.getMessage()+"-"+typeAndParam); } 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 49006f53..8578122c 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 @@ -30,6 +30,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; + import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.util.*; @@ -209,7 +211,7 @@ public class AliPayServiceImpl implements AliPayService { userCoinJf(order); } //开通aivip - aiVipLogService.openAiVip(order.getAiBuyConfigId()); + aiVipLogService.openAiVip(order); } if("point".equals(subject)){ @@ -338,8 +340,8 @@ public class AliPayServiceImpl implements AliPayService { } log.error(">>>>>>>>>>验签失败 params = {}", params.toString()); return "fail"; - } catch (Exception e) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); log.error(">>>>>>>>>>订单回调异常: 订单号 = {}, msg = {}", params.toString(), e.getMessage()); return "fail"; } 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 dfb123e2..15ecb3be 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 @@ -198,7 +198,7 @@ public class WxpayServiceImpl extends ServiceImpl list = aiBuyConfigService.list(new LambdaQueryWrapper() .orderByAsc(AiBuyConfig::getFee)); + //是否会员 + AiVipLog aiVipLog = aiVipLogService.getOne(new LambdaQueryWrapper() + .eq(AiVipLog::getUserId,ShiroUtils.getUId()) + .eq(AiVipLog::getState,0)); + //不是会员全部返回 + if (aiVipLog==null){ + for (AiBuyConfig aiBuyConfig:list){ + aiBuyConfig.setCanUpgrade(true); + } + }else { + AiBuyConfig config = aiBuyConfigService.getOne(new LambdaQueryWrapper() + .eq(AiBuyConfig::getType,aiVipLog.getType()) + .eq(AiBuyConfig::getCount,aiVipLog.getCount())); + //是会员判断能否升级 + for (AiBuyConfig aiBuyConfig:list){ + List aiVipLogs = aiVipLogService.list(new LambdaQueryWrapper() + .eq(AiVipLog::getUserId, ShiroUtils.getUId()) + .eq(AiVipLog::getState, 0) + .eq(AiVipLog::getType, aiBuyConfig.getType()) + .lt(AiVipLog::getCount, aiBuyConfig.getCount())); + if (aiVipLogs.size()>0){ + aiBuyConfig.setCanUpgrade(true); + aiBuyConfig.setUpgradeFee(aiBuyConfig.getFee().subtract(config.getFee())); + aiBuyConfig.setUpgradeCount(new BigDecimal(aiBuyConfig.getCount()).subtract(new BigDecimal(config.getCount()))+""); + } + } + } return R.ok().put("list",list); } } diff --git a/src/main/java/com/peanut/modules/taihumed/controller/AiVipController.java b/src/main/java/com/peanut/modules/taihumed/controller/AiVipController.java index 893c9960..52647e6c 100644 --- a/src/main/java/com/peanut/modules/taihumed/controller/AiVipController.java +++ b/src/main/java/com/peanut/modules/taihumed/controller/AiVipController.java @@ -2,17 +2,14 @@ package com.peanut.modules.taihumed.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.github.yulichang.wrapper.MPJLambdaWrapper; 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.entity.BuyOrder; -import com.peanut.modules.common.entity.MyUserEntity; -import com.peanut.modules.common.service.AiVipLogService; -import com.peanut.modules.common.service.BuyOrderService; -import com.peanut.modules.common.service.JfTransactionDetailsService; -import com.peanut.modules.common.service.MyUserService; +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 +22,8 @@ import org.springframework.web.bind.annotation.RestController; import javax.transaction.Transactional; import java.math.BigDecimal; +import java.util.Date; +import java.util.List; @Slf4j @RestController("taihumedAiVip") @@ -44,7 +43,45 @@ public class AiVipController { @Autowired private WxpayService wxpayService; @Autowired + private AiChatContentService aiChatContentService; + @Autowired private AiVipLogService aiVipLogService; + @Autowired + private AiBuyConfigService aiBuyConfigService; + + //用户开通aivip信息 + @RequestMapping("/getUserAiVip") + public R getUserAiVip(){ + int freeCount = 0; + int flag = 0;//不是vip + AiVipLog aiVipLog = aiVipLogService.getOne(new LambdaQueryWrapper() + .eq(AiVipLog::getUserId,ShiroUtils.getUId()) + .eq(AiVipLog::getState,0)); + if (aiVipLog!=null){ + List aiBuyConfig = aiBuyConfigService.list(new LambdaQueryWrapper() + .eq(AiBuyConfig::getType,aiVipLog.getType()) + .orderByDesc(AiBuyConfig::getCount)); + //能否升级 + if (aiBuyConfig.size() > 0){ + if (aiVipLog.getCount() quankeContentList = aiChatContentService.list(new LambdaQueryWrapper() + .eq(AiChatContent::getUserId,ShiroUtils.getUId()) + .like(AiChatContent::getChatAssistantName,"全科") + .orderByAsc(AiChatContent::getCreateTime) + .groupBy(AiChatContent::getChatId)); + freeCount = 3-quankeContentList.size(); + + } + return R.ok().put("aiVipLog",aiVipLog) + .put("flag",flag) + .put("freeCount",freeCount); + } //aivip下单 @RequestMapping("/placeAiVipOrder") @@ -52,7 +89,6 @@ public class AiVipController { public R placeVipOrder(@RequestBody BuyOrder buyOrder){ int uid = ShiroUtils.getUId(); buyOrder.setOrderStatus("0"); - buyOrder.setOrderType("aiVip"); String timeId = IdWorker.getTimeId().substring(0, 32); buyOrder.setOrderSn(timeId); buyOrder.setUserId(uid); @@ -73,7 +109,7 @@ public class AiVipController { jfTransactionDetailsService.recordJfTransaction(buyOrder, user, buyOrder.getJfDeduction()); } //开通用户aiVip - aiVipLogService.openAiVip(buyOrder.getAiBuyConfigId()); + aiVipLogService.openAiVip(buyOrder); } else { rabbitTemplate.convertAndSend( DelayQueueConfig.ORDER_TO_BE_PAY_EXCHANGE,