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(); } }