
管理员
站长
- UID
- 1
- 积分
- 224315
- 余额
- 13 R
- Moe币
- 84800
- 在线时间
- 264 小时
- 注册时间
- 2025-12-28
- 最后登录
- 2026-9-19
|
package com.mg1.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mg1.common.teen.TeenGuard;
import com.mg1.entity.*;
import com.mg1.mapper.*;
import com.mg1.service.VipService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class VipServiceImpl implements VipService {
private final VipOrderMapper vipOrderMapper;
private final VipPlanMapper vipPlanMapper;
private final UserMapper userMapper;
private final TeenGuard teenGuard;
public VipServiceImpl(VipOrderMapper vipOrderMapper, VipPlanMapper vipPlanMapper, UserMapper userMapper,
TeenGuard teenGuard) {
this.vipOrderMapper = vipOrderMapper;
this.vipPlanMapper = vipPlanMapper;
this.userMapper = userMapper;
this.teenGuard = teenGuard;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Map<String, Object> createOrder(Long userId, Long planId) {
assertTeenPurchaseAllowed(userId);
VipPlan plan = vipPlanMapper.selectById(planId);
if (plan == null || plan.getStatus() != 1) {
throw new IllegalArgumentException("套餐不存在或已下架");
}
VipOrder order = new VipOrder();
order.setOrderNo("VIP" + System.currentTimeMillis() + (int)(Math.random() * 1000));
order.setUserId(userId);
order.setPlanId(planId);
order.setPlanName(plan.getName());
order.setDays(plan.getDays());
order.setAmount(plan.getPrice());
order.setPayType("qrcode");
order.setPayStatus(0);
order.setQrcodeUrl(""); // 模拟支付二维码
order.setExpireTime(LocalDateTime.now().plusMinutes(15));
vipOrderMapper.insert(order);
Map<String, Object> result = new HashMap<>();
result.put("orderNo", order.getOrderNo());
result.put("amount", order.getAmount());
result.put("qrcodeUrl", order.getQrcodeUrl());
result.put("expireTime", order.getExpireTime());
return result;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Map<String, Object> payOrder(Long userId, String orderNo) {
assertTeenPurchaseAllowed(userId);
VipOrder order = vipOrderMapper.selectOne(
new LambdaQueryWrapper<VipOrder>().eq(VipOrder::getOrderNo, orderNo).eq(VipOrder::getUserId, userId));
if (order == null) throw new IllegalArgumentException("订单不存在");
if (order.getPayStatus() != 0) throw new IllegalArgumentException("订单状态异常");
order.setPayStatus(1);
order.setPayTime(LocalDateTime.now());
vipOrderMapper.updateById(order);
// 更新用户VIP
User user = userMapper.selectById(userId);
LocalDateTime now = LocalDateTime.now();
if (user.getVipExpire() != null && user.getVipExpire().isAfter(now)) {
user.setVipExpire(user.getVipExpire().plusDays(order.getDays()));
} else {
user.setVipExpire(now.plusDays(order.getDays()));
}
user.setVipStatus(1);
userMapper.updateById(user);
Map<String, Object> result = new HashMap<>();
result.put("vipExpire", user.getVipExpire());
return result;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void cancelOrder(Long userId, String orderNo) {
VipOrder order = vipOrderMapper.selectOne(
new LambdaQueryWrapper<VipOrder>().eq(VipOrder::getOrderNo, orderNo).eq(VipOrder::getUserId, userId));
if (order == null) throw new IllegalArgumentException("订单不存在");
order.setPayStatus(2);
vipOrderMapper.updateById(order);
}
@Override
public IPage<Map<String, Object>> orderPage(Long userId, int pageNum, int pageSize) {
LambdaQueryWrapper<VipOrder> wrapper = new LambdaQueryWrapper<VipOrder>()
.eq(VipOrder::getUserId, userId)
.orderByDesc(VipOrder::getCreateTime);
Page<VipOrder> page = vipOrderMapper.selectPage(new Page<>(pageNum, pageSize), wrapper);
IPage<Map<String, Object>> result = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
result.setRecords(page.getRecords().stream().map(o -> {
Map<String, Object> map = new HashMap<>();
map.put("orderNo", o.getOrderNo());
map.put("planName", o.getPlanName());
map.put("amount", o.getAmount());
map.put("payStatus", o.getPayStatus());
map.put("createTime", o.getCreateTime());
return map;
}).collect(Collectors.toList()));
return result;
}
/** 青少年模式消费拦截,统一委托 TeenGuard,避免多处重复判断 */
private void assertTeenPurchaseAllowed(Long userId) {
teenGuard.assertConsumeAllowed(userId);
}
@Override
public Map<String, Object> userInfo(Long userId) {
User user = userMapper.selectById(userId);
Map<String, Object> result = new HashMap<>();
boolean isVip = user.getVipStatus() == 1 && user.getVipExpire() != null && user.getVipExpire().isAfter(LocalDateTime.now());
if (!isVip && user.getVipStatus() == 1) {
// 过期了,更新状态
user.setVipStatus(0);
userMapper.updateById(user);
}
result.put("isVip", isVip);
result.put("vipExpire", user.getVipExpire());
if (isVip) {
long remainDays = java.time.Duration.between(LocalDateTime.now(), user.getVipExpire()).toDays();
result.put("remainDays", (int) remainDays);
} else {
result.put("remainDays", 0);
}
return result;
}
@Override
public boolean isExpiringSoon(Long userId) {
User user = userMapper.selectById(userId);
if (user.getVipExpire() == null) return false;
long days = java.time.Duration.between(LocalDateTime.now(), user.getVipExpire()).toDays();
return days > 0 && days <= 7;
}
}
|
|