1
zj
2025-09-21 2785d374a827a732ae74e8ef520369cfcb76eaf6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package com.ruoyi.im.service.impl;
 
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.im.comm.Result;
import com.ruoyi.im.service.InsuranceProductService;
import com.ruoyi.im.service.UserPolicyService;
import com.ruoyi.im.util.ValidatorUtil;
import com.ruoyi.system.domain.InsuranceProduct;
import com.ruoyi.system.domain.UserAccount;
import com.ruoyi.system.domain.UserPolicy;
import com.ruoyi.system.domain.dto.UserPolicyDto;
import com.ruoyi.system.mapper.UserPolicyMapper;
import com.ruoyi.system.service.UserAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.text.ParseException;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.atomic.AtomicLong;
 
@Service
public class UserPolicyServiceImpl extends ServiceImpl<UserPolicyMapper, UserPolicy> implements UserPolicyService {
 
    @Autowired
    InsuranceProductService insuranceProductService;
    @Autowired
    UserAccountService userAccountService;
 
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result purchaseApplication(UserPolicyDto dto) throws ParseException {
        UserAccount userAccount = userAccountService.getOne(new LambdaQueryWrapper<UserAccount>()
                .eq(UserAccount::getAccount,dto.getAccount()));
        if(ObjectUtil.isEmpty(userAccount)){
            return Result.error("请重新登录,未查询到你的信息!");
        }
        if(userAccount.getKycStatus() == 0){
            return Result.error("请先实名认证");
        }
 
        // 验证手机号
        boolean isPhoneValid = ValidatorUtil.isValidPhone(dto.getPhone());
        if(!isPhoneValid){
            return Result.error("手机号格式不正确!");
        }
        // 验证身份证
        boolean isIdCardValid = ValidatorUtil.isValidIdCard(dto.getIdCard());
        if(!isIdCardValid){
            return Result.error("身份证格式不正确!");
        }
        InsuranceProduct insuranceProduct = insuranceProductService.getById(dto.getProductId());
        if(ObjectUtil.isEmpty(insuranceProduct)){
            return Result.error("该产品停止购买或已下架!");
        }
        UserPolicy userPolicy = new UserPolicy();
        userPolicy.setUserId(userAccount.getId());
        userPolicy.setProductId(insuranceProduct.getId());
        userPolicy.setCoverageAmount(insuranceProduct.getCoverageAmount());
        userPolicy.setPremium(insuranceProduct.getPremium());
        userPolicy.setTerm(insuranceProduct.getTerm());
        userPolicy.setName(dto.getName());
        userPolicy.setGender(dto.getGender());
        userPolicy.setBirthDate(DateUtils.parseDate(dto.getBirthDate(),"yyyy-MM-dd HH:mm:ss"));
        userPolicy.setOccupation(dto.getOccupation());
        userPolicy.setIdCard(dto.getIdCard());
        userPolicy.setPhone(dto.getPhone());
        userPolicy.setPolicyNumber(generatePolicyNumber());
        userPolicy.setPolicyStatus(UserPolicy.PolicyStatus.PENDING);
        userPolicy.setCreatedAt(new Date());
        userPolicy.setUpdatedAt(new Date());
        userPolicy.setApprovalStatus(0);
        userPolicy.setIsLifelong(insuranceProduct.getTerm() == 0 ? 0 : 1);
 
        save(userPolicy);
        return Result.success("购买成功,注意查看资料审核状态!");
    }
 
    // 使用原子长整型确保线程安全
    private static final AtomicLong lastTimestamp = new AtomicLong(0);
    private static final Random random = new Random();
    private static final String PREFIX = "POL";
 
    /**
     * 基于时间毫秒生成唯一保单号
     * 格式: POL + 时间戳 + 随机数
     * 示例: POL16973512345671234
     */
    public static String generatePolicyNumber() {
        long currentTimestamp = System.currentTimeMillis();
        long lastTime = lastTimestamp.get();
 
        // 如果时间戳相同,增加序列号
        if (currentTimestamp == lastTime) {
            // 等待下一毫秒
            while (currentTimestamp <= lastTime) {
                currentTimestamp = System.currentTimeMillis();
            }
        }
        lastTimestamp.set(currentTimestamp);
 
        // 生成4位随机数
        int randomNum = random.nextInt(10000);
        String randomStr = String.format("%04d", randomNum);
 
        return PREFIX + currentTimestamp + randomStr;
    }
}