jiangqs
2023-05-25 c203ff63489126a94d1be5dbfe32cadb69a70594
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package com.ruoyi.order.util;
 
 
 
import com.ruoyi.common.redis.service.RedisService;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.poi.ss.usermodel.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import java.security.SecureRandom;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.TimeUnit;
 
/**
 * @author jqs34
 * @ClassName CodeFactoryUtil
 * @description: TODO
 * @date 2023年02月13日
 * @version: 1.0
 */
@Component
public class CodeFactoryUtil {
 
 
    //静态住入到自己的类中
    private static RedisService redisService;
 
    //将静态属性以入参(形参)的方式传入一个方法中,然后将此方法通过 @Autowired 注入到Spring容器中
    @Autowired
    public void setService(RedisService redisService) {
        CodeFactoryUtil.redisService = redisService;
    }
 
    /**
     * APP用户编码
     */
    private static final String APP_USER_PREFIX = "HRT_M";
 
    /**
     * 商户编号
     */
    private static final String SHOP_PREFIX = "HRT_S";
 
    /**
     * 商户订单前缀
     */
    private static final String ORDER_PREFIX = "SC";
 
    /**
     * 退款订单前缀
     */
    private static final String ORDER_REFUND_PREFIX = "RO";
 
    /**
     * 用户id和随机数总长度
     */
 
    private static final int MAX_LENGTH = 4;
 
    /**
     * 更具id进行加密+加随机数组成固定长度编码
     */
 
    public static void main(String[] args) {
        Long orderId = 1L;
        String userNo = getShopNo(orderId);
        System.out.println(userNo);
    }
 
    /**
     * 获取商户编号
     *
     * @param shopId
     * @return
     */
    public static String getShopNo(Long shopId) {
        String prefix = SHOP_PREFIX;
        return toFillZeroCode(prefix, MAX_LENGTH, shopId);
    }
 
    public static String getShopOrderNo() {
        String orderNo;
        String timeTemp = DateFormatUtils.format(new Date(), "yyyyMMdd");
        String prefix = ORDER_PREFIX + timeTemp;
        String suffixNumber = getSuffixNumber(prefix);
        orderNo = prefix + suffixNumber;
        return orderNo;
    }
 
    private static String getSuffixNumber(String prefix){
        Integer suffixNumberInt;
        String suffixNumber = "0001";
        if(redisService.hasKey(prefix)){
            suffixNumberInt = redisService.getCacheObject(prefix);
            suffixNumber = toFillZeroSuffixNumber(suffixNumberInt);
            suffixNumberInt = suffixNumberInt + 1;
            redisService.setCacheObject(prefix, suffixNumberInt, 24L, TimeUnit.HOURS);
        }else{
            redisService.setCacheObject(prefix, 1, 24L, TimeUnit.HOURS);
        }
        return suffixNumber;
    }
 
    private static String toFillZeroSuffixNumber(Integer suffixNumberInt){
        String suffixNumberStr = suffixNumberInt.toString();
        int length = suffixNumberStr.length();
        int fillLength = 4 - length;
        StringBuilder idsbs = new StringBuilder();
        for (int i = 0; i < fillLength; i++) {
            idsbs.append("0");
        }
        return idsbs.append(suffixNumberStr).toString();
    }
 
 
    /**
     * 0补位
     *
     * @param prefix
     * @param totalLength
     * @param id
     * @return
     */
    private static String toFillZeroCode(String prefix, int totalLength, Long id) {
        String idStr = id.toString();
        int length = idStr.length();
 
        int fillLength = totalLength - length;
        StringBuilder idsbs = new StringBuilder(prefix);
        for (int i = 0; i < fillLength; i++) {
            idsbs.append("0");
        }
        return idsbs.append(idStr).toString();
    }
 
    /**
     * 随机6位数生成
     */
    public static String getRandStr(int num) {
        // 默认6位
        num = num != 0 ? num : 6;
        Random r = new SecureRandom();
        StringBuffer str = new StringBuffer();
        int i = 0;
        while (i < num) {
            str.append(r.nextInt(10));
            i++;
        }
        return str.toString();
    }
}