ソースを参照

刷新档案编码

wuheng 1 年間 前
コミット
b8a6148e21

+ 14 - 3
common/src/main/java/com/koobietech/eas/common/utils/ArchiveManager.java

@@ -8,10 +8,10 @@ import com.koobietech.eas.common.pojo.StudentNumberInfoPojo;
 import org.springframework.util.StringUtils;
 
 import java.time.LocalDate;
-import java.time.LocalDateTime;
 import java.time.Period;
 import java.time.format.DateTimeFormatter;
 import java.util.Locale;
+import java.util.Random;
 import java.util.UUID;
 
 /**
@@ -34,7 +34,7 @@ public class ArchiveManager {
      */
     public static String generateArchiveCode(String generateStudentCode, String fileTypeCode) {
         String studentNum = generateStudentCode.substring(2, STUDENT_NUM_LENGTH + 3);
-        String nowDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHhmmss", Locale.CHINA));
+        String nowDate = String.valueOf(new SnowflakeManager( Long.valueOf(RandomInt(22)) , 1L).nextId()).substring(0, 13);
         String archiveCode = ARCHIVE_CODE_PREFIX + studentNum + nowDate + fileTypeCode;
         if (archiveCode.length() < ARCHIVE_CODE_LENGTH) {
             archiveCode += UUID.randomUUID().toString()
@@ -43,6 +43,17 @@ public class ArchiveManager {
         return archiveCode;
     }
 
+    /**
+     * 返回随机数
+     */
+    private static int RandomInt(int end){
+        int i = new Random().nextInt(end);
+        if ( i == 0 ) {
+            return RandomInt(end);
+        }
+        return i;
+    }
+
     /**
      *解析档案编号信息
      *
@@ -90,7 +101,7 @@ public class ArchiveManager {
 
         // 如果生成的档案编码长度不足,用UUID填充
         if (studentCode.length() < STUDENT_CODE_LENGTH) {
-            studentCode += UUID.randomUUID().toString()
+            studentCode += String.valueOf(new SnowflakeManager( Long.valueOf(RandomInt(22)) , 1L).nextId())
                     .substring(0, STUDENT_CODE_LENGTH - studentCode.length());
         }
         return studentCode;

+ 61 - 0
common/src/main/java/com/koobietech/eas/common/utils/SnowflakeManager.java

@@ -0,0 +1,61 @@
+package com.koobietech.eas.common.utils;
+public class SnowflakeManager {
+
+    private final long twepoch = 1288834974657L;
+    private final long workerIdBits = 5L;
+    private final long datacenterIdBits = 5L;
+    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
+    private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
+    private final long sequenceBits = 12L;
+    private final long workerIdShift = sequenceBits;
+    private final long datacenterIdShift = sequenceBits + workerIdBits;
+    private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
+    private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+    private final long workerIdMask = -1L ^ (-1L << workerIdBits);
+    private final long datacenterIdMask = -1L ^ (-1L << datacenterIdBits);
+
+    private final long workerId;
+    private final long datacenterId;
+    private volatile long sequence = 0L;
+    private volatile long lastTimestamp = -1L;
+
+    public SnowflakeManager(long workerId, long datacenterId) {
+        if (workerId > maxWorkerId || workerId < 0) {
+            throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
+        }
+        if (datacenterId > maxDatacenterId || datacenterId < 0) {
+            throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
+        }
+        this.workerId = workerId;
+        this.datacenterId = datacenterId;
+    }
+
+    public synchronized long nextId() {
+        long timestamp = timeGen();
+        if (timestamp < lastTimestamp) {
+            throw new RuntimeException(String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
+        }
+        if (lastTimestamp == timestamp) {
+            sequence = (sequence + 1) & sequenceMask;
+            if (sequence == 0) { // sequence overflow, wait next tick
+                timestamp = tilNextMillis(lastTimestamp);
+            }
+        } else {
+            sequence = 0L;
+        }
+        lastTimestamp = timestamp;
+        return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence;
+    }
+
+    private long tilNextMillis(long lastTimestamp) {
+        long timestamp = timeGen();
+        while (timestamp <= lastTimestamp) {
+            timestamp = timeGen();
+        }
+        return timestamp;
+    }
+
+    private long timeGen() {
+        return System.currentTimeMillis();
+    }
+}

+ 7 - 42
common/src/test/java/com/koobietech/eas/common/utils/PasswordManagerTest.java

@@ -1,53 +1,18 @@
 package com.koobietech.eas.common.utils;
 
 
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
 class PasswordManagerTest {
 
 
     public static void main(String[] args) {
 
-        /**
-         * 需求是 按照传入的数据为准, 但是数据库已存在的 不能清除, 只能修改.
-         * 以往是 清除数据库的数据, 全部插入新的数据, 这样会丢失之前的数据的配置.
-         *
-         * 取出数据库已存在的数据
-         * 用传入的数据做对比,  存在的 更新, 不存在的 删除!
-         * 之后 新数据 不存在的 插入
-         */
-
-        Integer[] arr1  = {1,2,3,4,5,6};  //数据库的数据
-        Integer[] arr2  = {1,3,5,7,9};    //更新后的数据  135更新  79新增 246 删除
-
-        //insert 从set2中删除在set1中出现的元素
-        Set<Integer> set1 = new HashSet<>(Arrays.asList(arr1));
-        Set<Integer> set2 = new HashSet<>(Arrays.asList(arr2));
-        set2.removeAll(set1);
-        Integer[] studentAdd = set2.toArray(new Integer[0]);
-        for (Integer i : studentAdd) {
-            System.out.println(i);
-        }
-        System.out.println( "-------------------" );
-        //delete 从set1中删除在set2中出现的元素
-        Set<Integer> set11 = new HashSet<>(Arrays.asList(arr1));
-        Set<Integer> set22 = new HashSet<>(Arrays.asList(arr2));
-        set11.removeAll(set22);
-        Integer[] studentDel = set11.toArray(new Integer[0]);
-        for (Integer i : studentDel) {
-            System.out.println(i);
-        }
-        //update
-        System.out.println( "-------------------" );
-        Set<Integer> set111 = new HashSet<>(Arrays.asList(arr1));
-        Set<Integer> set222 = new HashSet<>(Arrays.asList(arr2));
-        set111.retainAll(set222);
-        Integer[] studentUpdate = set111.toArray(new Integer[0]);
-        for (Integer i : studentUpdate) {
-            System.out.println(i);
-        }
+        System.out.println(
+
+
+                (new SnowflakeManager( 12L , 1L)).nextId()
+
+
+        );
 
 
     }

+ 4 - 7
service/src/main/java/com/koobietech/eas/service/impl/EasStuProfileServiceImpl.java

@@ -261,12 +261,9 @@ public class EasStuProfileServiceImpl implements EasStuProfileService {
         ArchivesDto archivesDto = easArchivesFilesService.saveArchiveStudentsFile(easArcTlsStudents.getStudentNumber(), doc);
 
         // 设置时间和有效期
-        Date createTime = DateManager.convertToYearMonthDayToDate(new Date());
-        Date modifyTime = new Date();
         Calendar calendar = Calendar.getInstance();
-        assert createTime != null;
-        calendar.setTime(createTime);
-        calendar.add(Calendar.YEAR, 1);
+        calendar.setTime(new Date());
+        calendar.add(Calendar.YEAR, 5);
         Date validityTime = calendar.getTime();
 
         // 创建 EasArcArchives 对象并设置属性
@@ -276,8 +273,8 @@ public class EasStuProfileServiceImpl implements EasStuProfileService {
         easArcArchives.setFilePath(archivesDto.getPath());
         easArcArchives.setFiletype(FILETYPE);
         easArcArchives.setArctype(archivesDto.getFileType());
-        easArcArchives.setCreateTime(createTime);
-        easArcArchives.setModifyTime(modifyTime);
+        easArcArchives.setCreateTime(easArcTlsStudents.getCreateTime());
+        easArcArchives.setModifyTime(new Date());
         easArcArchives.setValidityTime(validityTime);
         easArcArchives.setManagerId(easArcTlsStudents.getManagerId());
         easArcArchives.setCreateUid(SecurityManager.getLoginUid().intValue());