|
@@ -5,18 +5,31 @@ import com.uas.platform.b2c.prod.product.common.model.CreateNumber;
|
|
|
import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
|
|
import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
|
|
|
import com.uas.platform.b2c.core.utils.DateFormatUtils;
|
|
import com.uas.platform.b2c.core.utils.DateFormatUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
+import org.springframework.dao.DataAccessException;
|
|
|
|
|
+import org.springframework.data.redis.connection.RedisConnection;
|
|
|
|
|
+import org.springframework.data.redis.core.RedisCallback;
|
|
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
+import java.io.Serializable;
|
|
|
import java.util.Date;
|
|
import java.util.Date;
|
|
|
|
|
|
|
|
@Service
|
|
@Service
|
|
|
public class CreateNumberServiceImpl implements CreateNumberService {
|
|
public class CreateNumberServiceImpl implements CreateNumberService {
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取redis锁时间
|
|
|
|
|
+ */
|
|
|
|
|
+ private final static long expireTime = 300L;
|
|
|
|
|
+
|
|
|
private final CreateNumberDao createNumberDao;
|
|
private final CreateNumberDao createNumberDao;
|
|
|
|
|
|
|
|
|
|
+ private final RedisTemplate<Serializable,Serializable> redisTemplate;
|
|
|
|
|
+
|
|
|
@Autowired
|
|
@Autowired
|
|
|
- public CreateNumberServiceImpl(CreateNumberDao createNumberDao) {
|
|
|
|
|
|
|
+ public CreateNumberServiceImpl(CreateNumberDao createNumberDao, RedisTemplate redisTemplate) {
|
|
|
this.createNumberDao = createNumberDao;
|
|
this.createNumberDao = createNumberDao;
|
|
|
|
|
+ this.redisTemplate = redisTemplate;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -28,31 +41,36 @@ public class CreateNumberServiceImpl implements CreateNumberService {
|
|
|
public String getTimeNumber(String tbname, int digit, Integer... addNums) {
|
|
public String getTimeNumber(String tbname, int digit, Integer... addNums) {
|
|
|
synchronized (tbname) {
|
|
synchronized (tbname) {
|
|
|
// 1、找有没有用存这个表的
|
|
// 1、找有没有用存这个表的
|
|
|
- String time = getTime();
|
|
|
|
|
- int num;
|
|
|
|
|
- String timeNumber;
|
|
|
|
|
- CreateNumber createNumber = createNumberDao.findByTbname(tbname);
|
|
|
|
|
- if (createNumber == null) {
|
|
|
|
|
- createNumber = new CreateNumber();
|
|
|
|
|
- createNumber.setTbname(tbname);
|
|
|
|
|
- createNumber.setTime(time);
|
|
|
|
|
- num = 1;
|
|
|
|
|
- } else {
|
|
|
|
|
- // 2、检查时间是不是今天
|
|
|
|
|
- if (time.equals(createNumber.getTime())) {
|
|
|
|
|
- num = createNumber.getNumber() + 1;
|
|
|
|
|
- } else {
|
|
|
|
|
- num = 1;
|
|
|
|
|
|
|
+ String timeNumber = "";
|
|
|
|
|
+ while (getDataFromRedis(tbname) == null) {
|
|
|
|
|
+ setDataToRedis(tbname);
|
|
|
|
|
+ String time = getTime();
|
|
|
|
|
+ int num;
|
|
|
|
|
+ CreateNumber createNumber = createNumberDao.findByTbname(tbname);
|
|
|
|
|
+ if (createNumber == null) {
|
|
|
|
|
+ createNumber = new CreateNumber();
|
|
|
|
|
+ createNumber.setTbname(tbname);
|
|
|
createNumber.setTime(time);
|
|
createNumber.setTime(time);
|
|
|
|
|
+ num = 1;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 2、检查时间是不是今天
|
|
|
|
|
+ if (time.equals(createNumber.getTime())) {
|
|
|
|
|
+ num = createNumber.getNumber() + 1;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ num = 1;
|
|
|
|
|
+ createNumber.setTime(time);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+ if (addNums.length > 0) {
|
|
|
|
|
+ createNumber.setNumber(num + addNums[0] - 1);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ createNumber.setNumber(num);
|
|
|
|
|
+ }
|
|
|
|
|
+ createNumberDao.save(createNumber);
|
|
|
|
|
+ redisTemplate.delete(tbname);
|
|
|
|
|
+ timeNumber = createNumber.getTime() + formatIntToStr(num, digit);
|
|
|
}
|
|
}
|
|
|
- if (addNums.length > 0) {
|
|
|
|
|
- createNumber.setNumber(num + addNums[0] - 1);
|
|
|
|
|
- } else {
|
|
|
|
|
- createNumber.setNumber(num);
|
|
|
|
|
- }
|
|
|
|
|
- createNumberDao.save(createNumber);
|
|
|
|
|
- timeNumber = createNumber.getTime() + formatIntToStr(num, digit);
|
|
|
|
|
|
|
+
|
|
|
return timeNumber;
|
|
return timeNumber;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -76,7 +94,7 @@ public class CreateNumberServiceImpl implements CreateNumberService {
|
|
|
return String.format(format, number);
|
|
return String.format(format, number);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
+ @Override
|
|
|
public String generateOrderNumber(String orderType, String table, int number) {
|
|
public String generateOrderNumber(String orderType, String table, int number) {
|
|
|
return orderType.replaceAll("_TIMESTAP_NUMBER", getTimeNumber(table, number));
|
|
return orderType.replaceAll("_TIMESTAP_NUMBER", getTimeNumber(table, number));
|
|
|
}
|
|
}
|
|
@@ -87,4 +105,39 @@ public class CreateNumberServiceImpl implements CreateNumberService {
|
|
|
return voucherType.replace("_TIMESTAP_NUMBER", timeNumber);
|
|
return voucherType.replace("_TIMESTAP_NUMBER", timeNumber);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * redis获取key的值
|
|
|
|
|
+ * @param keyVale
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
|
|
+ private Object getDataFromRedis(final String keyVale) {
|
|
|
|
|
+ Object result = redisTemplate.execute(new RedisCallback<Object>() {
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Object doInRedis(RedisConnection connection) throws DataAccessException {
|
|
|
|
|
+ byte[] key = redisTemplate.getStringSerializer().serialize(keyVale);
|
|
|
|
|
+ if (connection.exists(key)) {
|
|
|
|
|
+ return redisTemplate.getStringSerializer().deserialize(connection.get(key));
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void setDataToRedis(final String keyVale) {
|
|
|
|
|
+ redisTemplate.execute(new RedisCallback<Object>() {
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Object doInRedis(RedisConnection connection) throws DataAccessException {
|
|
|
|
|
+ byte[] key = redisTemplate.getStringSerializer().serialize(keyVale);
|
|
|
|
|
+ if (!connection.exists(key)) {
|
|
|
|
|
+ byte[] value = "1".getBytes();
|
|
|
|
|
+ connection.set(key, value);
|
|
|
|
|
+ connection.expire(key, expireTime);
|
|
|
|
|
+ return redisTemplate.getStringSerializer().deserialize(connection.get(key));
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|