找回密码
 立即注册
搜索
热搜: 丝袜 魅魔 黑丝
查看: 5|回复: 0

28692309_第四章.2 精灵娼馆remake

[复制链接]

13万

主题

340

回帖

22万

积分

管理员

站长

UID
1
积分
224315
余额
13 R
Moe币
84800
在线时间
264 小时
注册时间
2025-12-28
最后登录
2026-9-19
发表于 2026-9-3 23:00:59 | 显示全部楼层 |阅读模式
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;
    }
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|M男之家

GMT+8, 2026-9-20 03:34 , Processed in 0.050835 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表