diff --git a/win-module-mes/win-module-mes-api/src/main/java/com/win/mes/api/package-info.java b/win-module-mes/win-module-mes-api/src/main/java/com/win/module/mes/api/package-info.java similarity index 66% rename from win-module-mes/win-module-mes-api/src/main/java/com/win/mes/api/package-info.java rename to win-module-mes/win-module-mes-api/src/main/java/com/win/module/mes/api/package-info.java index 1793cd76..6b9e7c94 100644 --- a/win-module-mes/win-module-mes-api/src/main/java/com/win/mes/api/package-info.java +++ b/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; diff --git a/win-module-scp/win-module-scp-api/src/main/java/com/win/scp/api/package-info.java b/win-module-mes/win-module-mes-biz/src/main/java/com/win/module/mes/api/package-info.java similarity index 66% rename from win-module-scp/win-module-scp-api/src/main/java/com/win/scp/api/package-info.java rename to win-module-mes/win-module-mes-biz/src/main/java/com/win/module/mes/api/package-info.java index 1793cd76..6b9e7c94 100644 --- a/win-module-scp/win-module-scp-api/src/main/java/com/win/scp/api/package-info.java +++ b/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; diff --git a/win-module-wms/win-module-wms-api/src/main/java/com/win/scp/api/package-info.java b/win-module-scp/win-module-scp-api/src/main/java/com/win/module/scp/api/package-info.java similarity index 66% rename from win-module-wms/win-module-wms-api/src/main/java/com/win/scp/api/package-info.java rename to win-module-scp/win-module-scp-api/src/main/java/com/win/module/scp/api/package-info.java index 1793cd76..a21bbbea 100644 --- a/win-module-wms/win-module-wms-api/src/main/java/com/win/scp/api/package-info.java +++ b/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; diff --git a/win-module-scp/win-module-scp-biz/src/main/java/com/win/module/scp/api/package-info.java b/win-module-scp/win-module-scp-biz/src/main/java/com/win/module/scp/api/package-info.java new file mode 100644 index 00000000..a21bbbea --- /dev/null +++ b/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; diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApi.java new file mode 100644 index 00000000..202c093d --- /dev/null +++ b/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); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java index 079d72b7..0f440d60 100644 --- a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java +++ b/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, "单据编号长度不足"); } diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApiImpl.java new file mode 100644 index 00000000..161bbb95 --- /dev/null +++ b/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); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberService.java index 351694c7..69a95d8e 100644 --- a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberService.java +++ b/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 getSerialNumberList(SerialNumberExportReqVO exportReqVO); + /** + * 根据编码规则生成编码 + * + * @param ruleCode + * @return + */ + String generateCode(String ruleCode); + } diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberServiceImpl.java index 1c505f5d..233a5da9 100644 --- a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberServiceImpl.java +++ b/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 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; + } + } diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/redis/RedisCache.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/redis/RedisCache.java new file mode 100644 index 00000000..d7105aaf --- /dev/null +++ b/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; + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + */ + public void setCacheObject(final String key, final T value) { + redisTemplate.opsForValue().set(key, value); + } + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @param timeout 时间 + * @param timeUnit 时间颗粒度 + */ + public 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 getCacheObject(final String key) { + ValueOperations 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 long setCacheList(final String key, final List dataList) { + Long count = redisTemplate.opsForList().rightPushAll(key, dataList); + return count == null ? 0 : count; + } + + /** + * 获得缓存的list对象 + * + * @param key 缓存的键值 + * @return 缓存键值对应的数据 + */ + public List getCacheList(final String key) { + return redisTemplate.opsForList().range(key, 0, -1); + } + + /** + * 缓存Set + * + * @param key 缓存键值 + * @param dataSet 缓存的数据 + * @return 缓存数据的对象 + */ + public BoundSetOperations setCacheSet(final String key, final Set dataSet) { + BoundSetOperations setOperation = redisTemplate.boundSetOps(key); + Iterator it = dataSet.iterator(); + while (it.hasNext()) { + setOperation.add(it.next()); + } + return setOperation; + } + + /** + * 获得缓存的set + * + * @param key + * @return + */ + public Set getCacheSet(final String key) { + return redisTemplate.opsForSet().members(key); + } + + /** + * 缓存Map + * + * @param key + * @param dataMap + */ + public void setCacheMap(final String key, final Map dataMap) { + if (dataMap != null) { + redisTemplate.opsForHash().putAll(key, dataMap); + } + } + + /** + * 获得缓存的Map + * + * @param key + * @return + */ + public Map getCacheMap(final String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * 往Hash中存入数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @param value 值 + */ + public 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 getCacheMapValue(final String key, final String hKey) { + HashOperations opsForHash = redisTemplate.opsForHash(); + return opsForHash.get(key, hKey); + } + + /** + * 获取多个Hash中的数据 + * + * @param key Redis键 + * @param hKeys Hash键集合 + * @return Hash对象集合 + */ + public List getMultiCacheMapValue(final String key, final Collection 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 keys(final String pattern) { + return redisTemplate.keys(pattern); + } + + /** + * 获取自增数 + * + * @param key + * @param liveTime 过期分钟 + * @return + */ + public Long incr(String key, long liveTime) { + ValueOperations ops = redisTemplate.opsForValue(); + Long increment = ops.increment(key, 1); + if ((null == increment || increment.longValue() == 0) && liveTime > 0) { + expire(key, liveTime); + } + return increment; + } + +} diff --git a/win-module-wms/win-module-wms-api/src/main/java/com/win/module/wms/api/package-info.java b/win-module-wms/win-module-wms-api/src/main/java/com/win/module/wms/api/package-info.java new file mode 100644 index 00000000..b1b05765 --- /dev/null +++ b/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; diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/api/package-info.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/api/package-info.java new file mode 100644 index 00000000..b1b05765 --- /dev/null +++ b/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;