Kaynağa Gözat

Merge remote-tracking branch 'origin/release-201834-wangcz' into release-201834-wangcz

wangyc 7 yıl önce
ebeveyn
işleme
6bbfbc552f

+ 8 - 0
src/main/java/com/uas/platform/b2c/prod/product/common/model/CreateNumber.java

@@ -70,4 +70,12 @@ public class CreateNumber {
 		this.number = number;
 	}
 
+	public CreateNumber() {
+	}
+
+	public CreateNumber(String tbname, String time, Integer number) {
+		this.tbname = tbname;
+		this.time = time;
+		this.number = number;
+	}
 }

+ 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位时间
 	 */

+ 14 - 0
src/main/java/com/uas/platform/b2c/trade/order/dao/TableTestDao.java

@@ -0,0 +1,14 @@
+package com.uas.platform.b2c.trade.order.dao;
+
+import com.uas.platform.b2c.trade.order.model.TableTest;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author yuj
+ * @date 2018/10/25 11:37
+ */
+@Repository
+public interface TableTestDao extends JpaRepository<TableTest, Long>, JpaSpecificationExecutor<TableTest> {
+}

+ 36 - 0
src/main/java/com/uas/platform/b2c/trade/order/model/TableTest.java

@@ -0,0 +1,36 @@
+package com.uas.platform.b2c.trade.order.model;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * @author yuj
+ * @date 2018/10/25 11:38
+ */
+@Entity
+@Table(name = "table_test")
+public class TableTest implements Serializable {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @Column(name = "code")
+    private String code;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+}

+ 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>
 

+ 2 - 2
src/test/java/com/uas/platform/b2c/BaseJunitTest.java

@@ -18,8 +18,8 @@ import org.springframework.web.context.WebApplicationContext;
  * @date 2017年11月8日16:48:18
  */
 @RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration("classpath:spring/context.xml")
-@WebAppConfiguration("")
+@ContextConfiguration("classpath:spring/*.xml")
+@WebAppConfiguration("src/main/webapp")
 @Transactional
 @TransactionConfiguration(defaultRollback = true)
 public class BaseJunitTest {

+ 12 - 0
src/test/java/com/uas/platform/b2c/DesTest.java

@@ -3,8 +3,12 @@ package com.uas.platform.b2c;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.uas.platform.core.util.Des;
+import org.glassfish.grizzly.utils.ArraySet;
 import org.junit.Test;
 
+import java.util.HashSet;
+import java.util.Set;
+
 public class DesTest {
     @Test
     public void test(){
@@ -61,5 +65,13 @@ public class DesTest {
         Object jsonObject = JSON.parse(str2);
         System.out.println(JSON.toJSONString(jsonObject));
     }
+
+    @Test
+    public void testProduct() {
+        Set<Long> idSet = new HashSet<>();
+        idSet.add(33l);
+        idSet.add(34l);
+        System.out.println(idSet);
+    }
 }
 

+ 9 - 6
src/test/java/com/uas/platform/b2c/Test.java

@@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.UUID;
 
 /**
  * description
@@ -29,11 +30,13 @@ public class Test {
 
     @org.junit.Test
     public void testList() {
-        String list = "PreparedStatementCallback; SQL [insert into product$users(pu_date, pu_enuu, pu_prid, pu_useruu) values (?, ?, ?, ?)]; Duplicate entry '10030994-34298797-1000001778' for key 'UNIQUE_ENUU_USERUU_PRID'; nested exception is java.sql.BatchUpdateException: Duplicate entry '10030994-34298797-1000001778' for key 'UNIQUE_ENUU_USERUU_PRID'";
-        int li = list.lastIndexOf("-");
-        String substring = list.substring(0, li);
-        int l = substring.lastIndexOf("-");
-        String substring1 = substring.substring(l + 1);
-        System.out.println(substring1);
+//        String list = "PreparedStatementCallback; SQL [insert into product$users(pu_date, pu_enuu, pu_prid, pu_useruu) values (?, ?, ?, ?)]; Duplicate entry '10030994-34298797-1000001778' for key 'UNIQUE_ENUU_USERUU_PRID'; nested exception is java.sql.BatchUpdateException: Duplicate entry '10030994-34298797-1000001778' for key 'UNIQUE_ENUU_USERUU_PRID'";
+//        int li = list.lastIndexOf("-");
+//        String substring = list.substring(0, li);
+//        int l = substring.lastIndexOf("-");
+//        String substring1 = substring.substring(l + 1);
+//        System.out.println(substring1);
+        UUID uuid = UUID.randomUUID();
+        System.out.println(uuid);
     }
 }

+ 50 - 0
src/test/java/com/uas/platform/b2c/javase/collection/TableOrderTest.java

@@ -0,0 +1,50 @@
+package com.uas.platform.b2c.javase.collection;
+
+import com.uas.platform.b2c.BaseJunitTest;
+import com.uas.platform.b2c.common.base.dao.CommonDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
+import com.uas.platform.b2c.prod.commodity.model.Product;
+import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.annotation.Resource;
+
+/**
+ * 并发测试订单号重复的问题
+ * @author yuj
+ *
+ * @date 2018/10/25 11:36
+ */
+public class TableOrderTest extends BaseJunitTest {
+
+    @Resource
+    private ProductDao productDao;
+
+    @Autowired
+    private CommonDao commonDao;
+
+    @Autowired
+    private CreateNumberService createNumberService;
+
+    @Test
+    public void test() {
+        for(int i = 0; i < 100; i++) {
+            ThreadTableTest test = new ThreadTableTest(commonDao, createNumberService);
+            Thread thread = new Thread(test);
+            thread.start();
+            thread.run();
+        }
+
+    }
+
+    @Test
+    public void testAa() {
+        Product one = productDao.findOne(34301150l);
+        if (one != null) {
+            System.out.println(one);
+        } else {
+            System.out.println("sfsaf");
+        }
+    }
+}

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