Browse Source

处理订单号重复的问题。

yuj 7 years ago
parent
commit
5a86b5d982

+ 59 - 28
src/main/java/com/uas/platform/b2c/prod/product/common/service/impl/CreateNumberServiceImpl.java

@@ -1,15 +1,21 @@
 package com.uas.platform.b2c.prod.product.common.service.impl;
 
+import com.uas.platform.b2c.prod.commodity.controller.GoodsController;
 import com.uas.platform.b2c.prod.product.common.dao.CreateNumberDao;
 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.core.utils.DateFormatUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 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.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -26,17 +32,21 @@ public class CreateNumberServiceImpl implements CreateNumberService {
 
 	private final RedisTemplate<Serializable,Serializable> redisTemplate;
 
+	private final JdbcTemplate jdbcTemplate;
+
 	@Autowired
-	public CreateNumberServiceImpl(CreateNumberDao createNumberDao, RedisTemplate redisTemplate) {
+	public CreateNumberServiceImpl(CreateNumberDao createNumberDao, RedisTemplate redisTemplate, JdbcTemplate jdbcTemplate) {
 		this.createNumberDao = createNumberDao;
 		this.redisTemplate = redisTemplate;
-	}
+        this.jdbcTemplate = jdbcTemplate;
+    }
 
 	@Override
 	public CreateNumber save(CreateNumber createNumber) {
 		return createNumberDao.save(createNumber);
 	}
 
+	@Transactional(propagation = Propagation.NOT_SUPPORTED)
 	@Override
 	public String getTimeNumber(String tbname, int digit, Integer... addNums) {
 		synchronized (tbname) {
@@ -45,39 +55,60 @@ public class CreateNumberServiceImpl implements CreateNumberService {
 			while (true) {
 				if (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);
-						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);
+                    timeNumber = getOrderNumber(tbname, digit, addNums);
+                    redisTemplate.delete(tbname);
 					break;
 				}
 			}
-
 			return timeNumber;
 		}
 	}
 
+	/**
+	 * 循环取订单号,如果连续取十次,还取不到,就报错误。
+	 * @param tnName 表名称
+	 * @param digit 数字
+	 * @param addNums 预留长度
+	 * @return
+	 */
+	public String getOrderNumber(String tnName, int digit, Integer... addNums) {
+	    int times = 0;
+	    boolean success = false;
+	    String timeNumber = "";
+	    while((times < 10) && !success) {
+            String time = getTime();
+            int num = 0;
+            CreateNumber createNumber = createNumberDao.findByTbname(tnName);
+            if (createNumber == null) {
+                num = (addNums.length > 0) ? (num + addNums[0]) : (num + 1);
+                createNumber = new CreateNumber(tnName, time, num + 1);
+                try {
+                    createNumberDao.save(createNumber);
+                    success = true;
+                    timeNumber = time + formatIntToStr(num, digit);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            } else {
+                //如果已经存在createNumber信息
+                Integer originNum = createNumber.getNumber();
+                String originTime = createNumber.getTime();
+                // 2、检查时间是今天,就设置成对应的值
+				num = time.equals(originTime) ? originNum : num;
+                num = (addNums.length > 0) ? (num + addNums[0]) : (num + 1);
+                int update = jdbcTemplate.update("update product$creat_number set cn_time = '" + time + "', cn_number = " + num
+                        + " where cn_tbname = '" + tnName + "' and cn_time = '" + originTime + "' and cn_number = " + originNum);
+                if (update == 1) {
+                    success = true;
+					timeNumber = time + formatIntToStr(num, digit);
+                }
+            }
+            times++;
+        }
+        return timeNumber;
+
+    }
+
 	/**
 	 * 获得8位时间
 	 */

+ 1 - 1
src/main/resources/logback.xml

@@ -5,7 +5,7 @@
     <!-- 文件输出指定项目日志 -->
     <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${CATALINA_HOME}/logs/b2c%d{yyyy-MM-dd}.log</fileNamePattern>
+            <fileNamePattern>${CATALINA_HOME}/logs/b2c_%d{yyyy-MM-dd}.log</fileNamePattern>
             <maxHistory>30</maxHistory>
         </rollingPolicy>
 

+ 41 - 0
src/test/java/com/uas/platform/b2c/javase/collection/ThreadTableTest.java

@@ -0,0 +1,41 @@
+package com.uas.platform.b2c.javase.collection;
+
+import com.uas.platform.b2c.common.base.dao.CommonDao;
+import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
+import com.uas.platform.b2c.trade.order.model.TableTest;
+import org.apache.commons.collections.CollectionUtils;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author yuj
+ * @date 2018/10/26 10:07
+ */
+public class ThreadTableTest implements Runnable {
+
+    private CommonDao commonDao;
+
+    private CreateNumberService createNumberService;
+
+    public ThreadTableTest() {
+    }
+
+    public ThreadTableTest(CommonDao commonDao, CreateNumberService createNumberService) {
+        this.commonDao = commonDao;
+        this.createNumberService = createNumberService;
+    }
+
+    @Override
+    public void run() {
+        List<TableTest> list = new ArrayList<>();
+        for (int j = 0; j < 10; j++) {
+            TableTest test1 = new TableTest();
+            String number = createNumberService.getTimeNumber("trade$testtes", 8);
+            test1.setCode(number);
+            list.add(test1);
+        }
+        if (CollectionUtils.isNotEmpty(list)) {
+            commonDao.save(list, TableTest.class);
+        }
+    }
+}