Browse Source

完成流水号自增,增加redis工具

master
刘忱 2 years ago
parent
commit
89c1644a9d
  1. 2
      win-module-mes/win-module-mes-api/src/main/java/com/win/module/mes/api/package-info.java
  2. 2
      win-module-mes/win-module-mes-biz/src/main/java/com/win/module/mes/api/package-info.java
  3. 2
      win-module-scp/win-module-scp-api/src/main/java/com/win/module/scp/api/package-info.java
  4. 4
      win-module-scp/win-module-scp-biz/src/main/java/com/win/module/scp/api/package-info.java
  5. 13
      win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApi.java
  6. 2
      win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java
  7. 16
      win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApiImpl.java
  8. 8
      win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberService.java
  9. 54
      win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberServiceImpl.java
  10. 260
      win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/redis/RedisCache.java
  11. 4
      win-module-wms/win-module-wms-api/src/main/java/com/win/module/wms/api/package-info.java
  12. 4
      win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/api/package-info.java

2
win-module-mes/win-module-mes-api/src/main/java/com/win/mes/api/package-info.java → win-module-mes/win-module-mes-api/src/main/java/com/win/module/mes/api/package-info.java

@ -1,4 +1,4 @@
/**
* System API 定义暴露给其它模块的 API
*/
package com.win.scp.api;
package com.win.module.mes.api;

2
win-module-scp/win-module-scp-api/src/main/java/com/win/scp/api/package-info.java → win-module-mes/win-module-mes-biz/src/main/java/com/win/module/mes/api/package-info.java

@ -1,4 +1,4 @@
/**
* System API 定义暴露给其它模块的 API
*/
package com.win.scp.api;
package com.win.module.mes.api;

2
win-module-wms/win-module-wms-api/src/main/java/com/win/scp/api/package-info.java → win-module-scp/win-module-scp-api/src/main/java/com/win/module/scp/api/package-info.java

@ -1,4 +1,4 @@
/**
* System API 定义暴露给其它模块的 API
*/
package com.win.scp.api;
package com.win.module.scp.api;

4
win-module-scp/win-module-scp-biz/src/main/java/com/win/module/scp/api/package-info.java

@ -0,0 +1,4 @@
/**
* System API 定义暴露给其它模块的 API
*/
package com.win.module.scp.api;

13
win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApi.java

@ -0,0 +1,13 @@
package com.win.module.system.api.serialnumber;
public interface SerialNumberApi {
/**
* 根据编码规则生成编码
*
* @param ruleCode
* @return
*/
String generateCode(String ruleCode);
}

2
win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java

@ -166,5 +166,7 @@ public interface ErrorCodeConstants {
// ========== 流水号编码规则 1-002-029-000 ==========
ErrorCode SERIAL_NUMBER_NOT_EXISTS = new ErrorCode(1_002_029_000, "流水号规则不存在");
ErrorCode SERIAL_NUMBER_EXISTS = new ErrorCode(1_002_029_001, "流水号规则已存在");
ErrorCode RULE_CODE_NOT_EXISTS = new ErrorCode(1_002_029_001, "编码不存在");
ErrorCode LENGTH_NOT_ENOUGH = new ErrorCode(1_002_029_001, "单据编号长度不足");
}

16
win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApiImpl.java

@ -0,0 +1,16 @@
package com.win.module.system.api.serialnumber;
import com.win.module.system.service.serialnumber.SerialNumberService;
import javax.annotation.Resource;
public class SerialNumberApiImpl implements SerialNumberApi {
@Resource
private SerialNumberService smsCodeService;
@Override
public String generateCode(String ruleCode) {
return smsCodeService.generateCode(ruleCode);
}
}

8
win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberService.java

@ -72,4 +72,12 @@ public interface SerialNumberService {
*/
List<SerialNumberDO> getSerialNumberList(SerialNumberExportReqVO exportReqVO);
/**
* 根据编码规则生成编码
*
* @param ruleCode
* @return
*/
String generateCode(String ruleCode);
}

54
win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberServiceImpl.java

@ -9,16 +9,20 @@ import com.win.module.system.controller.admin.serialnumber.vo.SerialNumberUpdate
import com.win.module.system.convert.serialnumber.SerialNumberConvert;
import com.win.module.system.dal.dataobject.serialnumber.SerialNumberDO;
import com.win.module.system.dal.mysql.serialnumber.SerialNumberMapper;
import com.win.module.system.util.redis.RedisCache;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Collection;
import java.util.List;
import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.win.module.system.enums.ErrorCodeConstants.SERIAL_NUMBER_EXISTS;
import static com.win.module.system.enums.ErrorCodeConstants.SERIAL_NUMBER_NOT_EXISTS;
import static com.win.module.system.enums.ErrorCodeConstants.*;
/**
* 流水号规则 Service 实现类
@ -29,6 +33,8 @@ import static com.win.module.system.enums.ErrorCodeConstants.SERIAL_NUMBER_NOT_E
@Validated
public class SerialNumberServiceImpl implements SerialNumberService {
@Resource
private RedisCache redisCache;
@Resource
private SerialNumberMapper serialNumberMapper;
@ -95,4 +101,48 @@ public class SerialNumberServiceImpl implements SerialNumberService {
return serialNumberMapper.selectList(exportReqVO);
}
@Override
public synchronized String generateCode(String ruleCode) {
QueryWrapper<SerialNumberDO> queryWrapper = new QueryWrapper<>();
queryWrapper.isNull("delete_time");
queryWrapper.eq("rule_code", ruleCode);
SerialNumberDO encodedRule = serialNumberMapper.selectOne(queryWrapper);
String pattern = "";
if(encodedRule == null) {
throw exception(RULE_CODE_NOT_EXISTS);
}
if(encodedRule.getPattern() != null && !encodedRule.getPattern().equals("")) {
LocalDate currentDate = LocalDate.now();
pattern = currentDate.format(DateTimeFormatter.ofPattern(encodedRule.getPattern().replace("m", "M")));
}
long millMinutes = 0;
if(encodedRule.getPattern().toLowerCase().indexOf("d") > 0) { //包含日
LocalDateTime midnight = LocalDateTime.now().plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(1);
millMinutes = ChronoUnit.MINUTES.between(LocalDateTime.now(), midnight);
} else if(encodedRule.getPattern().toLowerCase().indexOf("m") > 0) { //包含月
LocalDateTime midnight = LocalDateTime.now().plusMonths(1).plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(1);
millMinutes = ChronoUnit.MONTHS.between(LocalDateTime.now(), midnight);
} else if(encodedRule.getPattern().toLowerCase().indexOf("y") > 0) {
LocalDateTime midnight = LocalDateTime.now().plusYears(1).plusMonths(1).plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(1);
millMinutes = ChronoUnit.YEARS.between(LocalDateTime.now(), midnight);
}
boolean flag = true;
String code;
do {
StringBuilder sb = new StringBuilder();
Long increment = redisCache.incr(encodedRule.getRuleCode() + pattern, millMinutes);
sb.append(encodedRule.getPrefix());
sb.append(pattern);
sb.append(encodedRule.getSeparator());
String incrementStr = increment.toString();
if (incrementStr.length() <= encodedRule.getLength()) {
sb.append(String.format("%0" + encodedRule.getLength() + "d", increment));
} else {
throw exception(LENGTH_NOT_ENOUGH);
}
code = sb.toString();
} while (flag);
return code;
}
}

260
win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/redis/RedisCache.java

@ -0,0 +1,260 @@
package com.win.module.system.util.redis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* spring redis 工具类
*
* @author win
**/
@SuppressWarnings(value = {"unchecked", "rawtypes"})
@Component
public class RedisCache {
@Autowired
public RedisTemplate redisTemplate;
/**
* 缓存基本的对象IntegerString实体类等
*
* @param key 缓存的键值
* @param value 缓存的值
*/
public <T> void setCacheObject(final String key, final T value) {
redisTemplate.opsForValue().set(key, value);
}
/**
* 缓存基本的对象IntegerString实体类等
*
* @param key 缓存的键值
* @param value 缓存的值
* @param timeout 时间
* @param timeUnit 时间颗粒度
*/
public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) {
redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
}
/**
* 设置有效时间
*
* @param key Redis键
* @param timeout 超时时间
* @return true=设置成功false=设置失败
*/
public boolean expire(final String key, final long timeout) {
return expire(key, timeout, TimeUnit.SECONDS);
}
/**
* 设置有效时间
*
* @param key Redis键
* @param timeout 超时时间
* @param unit 时间单位
* @return true=设置成功false=设置失败
*/
public boolean expire(final String key, final long timeout, final TimeUnit unit) {
return redisTemplate.expire(key, timeout, unit);
}
/**
* 获取有效时间
*
* @param key Redis键
* @return 有效时间
*/
public long getExpire(final String key) {
return redisTemplate.getExpire(key);
}
/**
* 判断 key是否存在
*
* @param key
* @return true 存在 false不存在
*/
public Boolean hasKey(String key) {
return redisTemplate.hasKey(key);
}
/**
* 获得缓存的基本对象
*
* @param key 缓存键值
* @return 缓存键值对应的数据
*/
public <T> T getCacheObject(final String key) {
ValueOperations<String, T> operation = redisTemplate.opsForValue();
return operation.get(key);
}
/**
* 删除单个对象
*
* @param key
*/
public boolean deleteObject(final String key) {
return redisTemplate.delete(key);
}
/**
* 删除集合对象
*
* @param collection 多个对象
* @return
*/
public boolean deleteObject(final Collection collection) {
return redisTemplate.delete(collection) > 0;
}
/**
* 缓存List数据
*
* @param key 缓存的键值
* @param dataList 待缓存的List数据
* @return 缓存的对象
*/
public <T> long setCacheList(final String key, final List<T> dataList) {
Long count = redisTemplate.opsForList().rightPushAll(key, dataList);
return count == null ? 0 : count;
}
/**
* 获得缓存的list对象
*
* @param key 缓存的键值
* @return 缓存键值对应的数据
*/
public <T> List<T> getCacheList(final String key) {
return redisTemplate.opsForList().range(key, 0, -1);
}
/**
* 缓存Set
*
* @param key 缓存键值
* @param dataSet 缓存的数据
* @return 缓存数据的对象
*/
public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet) {
BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);
Iterator<T> it = dataSet.iterator();
while (it.hasNext()) {
setOperation.add(it.next());
}
return setOperation;
}
/**
* 获得缓存的set
*
* @param key
* @return
*/
public <T> Set<T> getCacheSet(final String key) {
return redisTemplate.opsForSet().members(key);
}
/**
* 缓存Map
*
* @param key
* @param dataMap
*/
public <T> void setCacheMap(final String key, final Map<String, T> dataMap) {
if (dataMap != null) {
redisTemplate.opsForHash().putAll(key, dataMap);
}
}
/**
* 获得缓存的Map
*
* @param key
* @return
*/
public <T> Map<String, T> getCacheMap(final String key) {
return redisTemplate.opsForHash().entries(key);
}
/**
* 往Hash中存入数据
*
* @param key Redis键
* @param hKey Hash键
* @param value
*/
public <T> void setCacheMapValue(final String key, final String hKey, final T value) {
redisTemplate.opsForHash().put(key, hKey, value);
}
/**
* 获取Hash中的数据
*
* @param key Redis键
* @param hKey Hash键
* @return Hash中的对象
*/
public <T> T getCacheMapValue(final String key, final String hKey) {
HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();
return opsForHash.get(key, hKey);
}
/**
* 获取多个Hash中的数据
*
* @param key Redis键
* @param hKeys Hash键集合
* @return Hash对象集合
*/
public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys) {
return redisTemplate.opsForHash().multiGet(key, hKeys);
}
/**
* 删除Hash中的某条数据
*
* @param key Redis键
* @param hKey Hash键
* @return 是否成功
*/
public boolean deleteCacheMapValue(final String key, final String hKey) {
return redisTemplate.opsForHash().delete(key, hKey) > 0;
}
/**
* 获得缓存的基本对象列表
*
* @param pattern 字符串前缀
* @return 对象列表
*/
public Collection<String> keys(final String pattern) {
return redisTemplate.keys(pattern);
}
/**
* 获取自增数
*
* @param key
* @param liveTime 过期分钟
* @return
*/
public Long incr(String key, long liveTime) {
ValueOperations<String, Object> ops = redisTemplate.opsForValue();
Long increment = ops.increment(key, 1);
if ((null == increment || increment.longValue() == 0) && liveTime > 0) {
expire(key, liveTime);
}
return increment;
}
}

4
win-module-wms/win-module-wms-api/src/main/java/com/win/module/wms/api/package-info.java

@ -0,0 +1,4 @@
/**
* System API 定义暴露给其它模块的 API
*/
package com.win.module.wms.api;

4
win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/api/package-info.java

@ -0,0 +1,4 @@
/**
* System API 定义暴露给其它模块的 API
*/
package com.win.module.wms.api;
Loading…
Cancel
Save