Procházet zdrojové kódy

修改主键生成重复问题

huhu před 6 měsíci
rodič
revize
ceec451ec5

+ 16 - 4
zfjg-modules/zfjg-manage/src/main/java/com/zfjg/manage/service/impl/enforce/job/EnforceJobServiceImpl.java

@@ -75,6 +75,7 @@ import com.zfjg.manage.service.enforce.template.IEnforceTemplateService;
 import com.zfjg.manage.service.impl.other.IHolidayCacheServiceImpl;
 import com.zfjg.manage.service.impl.other.IHolidayCacheServiceImpl;
 import com.zfjg.manage.service.sys.IFileService;
 import com.zfjg.manage.service.sys.IFileService;
 import com.zfjg.manage.sync.remote.ILjZfjgSyncDataService;
 import com.zfjg.manage.sync.remote.ILjZfjgSyncDataService;
+import com.zfjg.manage.utils.SequenceGenerator;
 import com.zfjg.manage.utils.gd.GDUtils;
 import com.zfjg.manage.utils.gd.GDUtils;
 import com.zfjg.system.api.RemoteDictDataService;
 import com.zfjg.system.api.RemoteDictDataService;
 import com.zfjg.system.api.domain.SysDept;
 import com.zfjg.system.api.domain.SysDept;
@@ -187,6 +188,9 @@ public class EnforceJobServiceImpl extends ServiceImpl<EnforceJobMapper, Enforce
     @Autowired
     @Autowired
     private RedisTemplate redisTemplate;
     private RedisTemplate redisTemplate;
 
 
+    @Autowired
+    private SequenceGenerator sequenceGenerator;
+
     @Value("${enforce.root_org_id}")
     @Value("${enforce.root_org_id}")
     private String rootOrgId;
     private String rootOrgId;
 
 
@@ -1372,7 +1376,7 @@ public class EnforceJobServiceImpl extends ServiceImpl<EnforceJobMapper, Enforce
                 EnforceJobNodeItemRecord record = new EnforceJobNodeItemRecord();
                 EnforceJobNodeItemRecord record = new EnforceJobNodeItemRecord();
                 BeanUtils.copyProperties(e, record);
                 BeanUtils.copyProperties(e, record);
                 record.setItemId(enforceJobNodeItemDTO.getId());
                 record.setItemId(enforceJobNodeItemDTO.getId());
-                record.setId(null);
+                record.setId(sequenceGenerator.nextId());
                 recordsList.add(record);
                 recordsList.add(record);
 //                enforceJobNodeItemRecordService.saveRecord(e);
 //                enforceJobNodeItemRecordService.saveRecord(e);
             });
             });
@@ -1382,7 +1386,15 @@ public class EnforceJobServiceImpl extends ServiceImpl<EnforceJobMapper, Enforce
                     .in(EnforceJobNodeItemRecord::getItemId, deleteIds));
                     .in(EnforceJobNodeItemRecord::getItemId, deleteIds));
         }
         }
         if (StringUtils.isNotEmpty(recordsList)) {
         if (StringUtils.isNotEmpty(recordsList)) {
-            enforceJobNodeItemRecordService.saveOrUpdateBatch(recordsList);
+            try {
+                enforceJobNodeItemRecordService.saveOrUpdateBatch(recordsList);
+            }catch (Exception e){
+                e.printStackTrace();
+                for (EnforceJobNodeItemRecord bean:recordsList){
+                    bean.setId(sequenceGenerator.nextId());
+                }
+                enforceJobNodeItemRecordService.saveOrUpdateBatch(recordsList);
+            }
         }
         }
         if (StringUtils.isNotEmpty(updateEnforceJobNodeItemList)) {
         if (StringUtils.isNotEmpty(updateEnforceJobNodeItemList)) {
             enforceJobNodeItemService.updateBatchById(updateEnforceJobNodeItemList);
             enforceJobNodeItemService.updateBatchById(updateEnforceJobNodeItemList);
@@ -2679,7 +2691,7 @@ public class EnforceJobServiceImpl extends ServiceImpl<EnforceJobMapper, Enforce
         BeanUtils.copyProperties(enforceHandbook, templateHandbook);
         BeanUtils.copyProperties(enforceHandbook, templateHandbook);
         //新增  EnforceJobTemplateHandbook
         //新增  EnforceJobTemplateHandbook
 
 
-        templateHandbook.setId(null);
+        templateHandbook.setId(sequenceGenerator.nextId());
         templateHandbook.setJobId(enforceJobNode.getJobId());
         templateHandbook.setJobId(enforceJobNode.getJobId());
         templateHandbook.setJobNodeId(enforceJobNode.getId());
         templateHandbook.setJobNodeId(enforceJobNode.getId());
         templateHandbook.setItemType("0");
         templateHandbook.setItemType("0");
@@ -2698,7 +2710,7 @@ public class EnforceJobServiceImpl extends ServiceImpl<EnforceJobMapper, Enforce
         enforceJobNodeItem.setItemName(enforceHandbook.getEnforceItem());
         enforceJobNodeItem.setItemName(enforceHandbook.getEnforceItem());
         enforceJobNodeItem.setItemContent(enforceHandbook.getEnforceContent());
         enforceJobNodeItem.setItemContent(enforceHandbook.getEnforceContent());
         enforceJobNodeItem.setEnforceObjClass(enforceHandbook.getEnforceClass());
         enforceJobNodeItem.setEnforceObjClass(enforceHandbook.getEnforceClass());
-        enforceJobNodeItem.setId(null);
+        enforceJobNodeItem.setId(sequenceGenerator.nextId());
         enforceJobNodeItem.setCheckOptions(null);
         enforceJobNodeItem.setCheckOptions(null);
         enforceJobNodeItem.setCreateTime(new Date());
         enforceJobNodeItem.setCreateTime(new Date());
         enforceJobNodeItem.setUpdateTime(new Date());
         enforceJobNodeItem.setUpdateTime(new Date());

+ 5 - 0
zfjg-modules/zfjg-manage/src/main/java/com/zfjg/manage/service/impl/enforce/obj/EnforceObjServiceImpl.java

@@ -36,6 +36,7 @@ import com.zfjg.manage.service.UserRedisCacheService;
 import com.zfjg.manage.service.enforce.job.IEnforceJobService;
 import com.zfjg.manage.service.enforce.job.IEnforceJobService;
 import com.zfjg.manage.service.enforce.obj.*;
 import com.zfjg.manage.service.enforce.obj.*;
 import com.zfjg.manage.service.enforce.template.IEnforceTemplateService;
 import com.zfjg.manage.service.enforce.template.IEnforceTemplateService;
+import com.zfjg.manage.utils.SequenceGenerator;
 import com.zfjg.system.api.domain.SysDept;
 import com.zfjg.system.api.domain.SysDept;
 import com.zfjg.system.api.domain.SysDictData;
 import com.zfjg.system.api.domain.SysDictData;
 import com.zfjg.system.api.model.LoginUser;
 import com.zfjg.system.api.model.LoginUser;
@@ -91,6 +92,9 @@ public class EnforceObjServiceImpl extends ServiceImpl<EnforceObjMapper, Enforce
     @Autowired
     @Autowired
     private ElasticsearchRestTemplate elasticsearchRestTemplate;
     private ElasticsearchRestTemplate elasticsearchRestTemplate;
 
 
+    @Autowired
+    private SequenceGenerator sequenceGenerator;
+
     private static Map<String, String> enforceObjTypeMap = new HashMap<String, String>() {
     private static Map<String, String> enforceObjTypeMap = new HashMap<String, String>() {
         {
         {
             put("1", "高危火灾单位");
             put("1", "高危火灾单位");
@@ -650,6 +654,7 @@ public class EnforceObjServiceImpl extends ServiceImpl<EnforceObjMapper, Enforce
      */
      */
     private void saveEnforceObjChangeHis(EnforceObj enforceObjOld, EnforceObjDTO enforceObjDTO) {
     private void saveEnforceObjChangeHis(EnforceObj enforceObjOld, EnforceObjDTO enforceObjDTO) {
         EnforceObjChangeHis enforceObjChangeHis = new EnforceObjChangeHis();
         EnforceObjChangeHis enforceObjChangeHis = new EnforceObjChangeHis();
+        enforceObjChangeHis.setId(sequenceGenerator.nextId());
         if (Objects.nonNull(enforceObjOld)) {
         if (Objects.nonNull(enforceObjOld)) {
             LOGGER.info("变更执法对象信息前,enforceOriginalObj=[{}]", enforceObjOld);
             LOGGER.info("变更执法对象信息前,enforceOriginalObj=[{}]", enforceObjOld);
             LOGGER.info("变更记录执法对象信息后,enforceObj=[{}]", enforceObjDTO);
             LOGGER.info("变更记录执法对象信息后,enforceObj=[{}]", enforceObjDTO);

+ 4 - 0
zfjg-modules/zfjg-manage/src/main/java/com/zfjg/manage/task/job/UnfreezeEnforceObjJobClient.java

@@ -8,6 +8,7 @@ import com.zfjg.manage.api.domain.enforce.obj.EnforceObjChangeHis;
 import com.zfjg.manage.api.dto.enforce.obj.EnforceObjDTO;
 import com.zfjg.manage.api.dto.enforce.obj.EnforceObjDTO;
 import com.zfjg.manage.mapper.enforce.obj.EnforceObjChangeHisMapper;
 import com.zfjg.manage.mapper.enforce.obj.EnforceObjChangeHisMapper;
 import com.zfjg.manage.service.enforce.obj.IEnforceObjService;
 import com.zfjg.manage.service.enforce.obj.IEnforceObjService;
+import com.zfjg.manage.utils.SequenceGenerator;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
@@ -38,6 +39,8 @@ public class UnfreezeEnforceObjJobClient {
     @Value("${fire.corn.unfreeze-enforce-obj-rsync.isopen}")
     @Value("${fire.corn.unfreeze-enforce-obj-rsync.isopen}")
     private Boolean isopen;
     private Boolean isopen;
 
 
+    @Autowired
+    SequenceGenerator sequenceGenerator;
     /**
     /**
      * 冻结执法对象自动解封任务(用新的)
      * 冻结执法对象自动解封任务(用新的)
      */
      */
@@ -72,6 +75,7 @@ public class UnfreezeEnforceObjJobClient {
         enforceObjChangeHis.setUpdateUserName("系统操作");
         enforceObjChangeHis.setUpdateUserName("系统操作");
         enforceObjChangeHis.setCreateTime(new Date());
         enforceObjChangeHis.setCreateTime(new Date());
         enforceObjChangeHis.setUpdateUserType(1L);
         enforceObjChangeHis.setUpdateUserType(1L);
+        enforceObjChangeHis.setId(sequenceGenerator.nextId());
         enforceObjChangeHisMapper.insert(enforceObjChangeHis);
         enforceObjChangeHisMapper.insert(enforceObjChangeHis);
         t.setManageStatus(0L);
         t.setManageStatus(0L);
         EnforceObjDTO enforceObjDTO = new EnforceObjDTO();
         EnforceObjDTO enforceObjDTO = new EnforceObjDTO();

+ 4 - 0
zfjg-modules/zfjg-manage/src/main/java/com/zfjg/manage/task/obj/ObjCountTask.java

@@ -13,6 +13,7 @@ import com.zfjg.manage.mapper.enforce.obj.EnforceObjChangeHisMapper;
 import com.zfjg.manage.repository.EnforceObjRepository;
 import com.zfjg.manage.repository.EnforceObjRepository;
 import com.zfjg.manage.service.enforce.job.IEnforceJobService;
 import com.zfjg.manage.service.enforce.job.IEnforceJobService;
 import com.zfjg.manage.service.enforce.obj.IEnforceObjService;
 import com.zfjg.manage.service.enforce.obj.IEnforceObjService;
+import com.zfjg.manage.utils.SequenceGenerator;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeanUtils;
@@ -40,6 +41,8 @@ public class ObjCountTask {
     @Autowired
     @Autowired
     private EnforceObjChangeHisMapper enforceObjChangeHisMapper;
     private EnforceObjChangeHisMapper enforceObjChangeHisMapper;
 
 
+    @Autowired
+    SequenceGenerator sequenceGenerator;
     /**
     /**
      * 定时更新执法对象抽泣次数
      * 定时更新执法对象抽泣次数
      */
      */
@@ -99,6 +102,7 @@ public class ObjCountTask {
             enforceObjChangeHis.setUpdateUserName("系统操作");
             enforceObjChangeHis.setUpdateUserName("系统操作");
             enforceObjChangeHis.setCreateTime(new Date());
             enforceObjChangeHis.setCreateTime(new Date());
             enforceObjChangeHis.setUpdateUserType(1L);
             enforceObjChangeHis.setUpdateUserType(1L);
+            enforceObjChangeHis.setId(sequenceGenerator.nextId());
             enforceObjChangeHisMapper.insert(enforceObjChangeHis);
             enforceObjChangeHisMapper.insert(enforceObjChangeHis);
             log.info("定时更新执法对象经营状态ID:{},时间{}", enforceObj.getId(), enforceObj.getBlockedEndTime());
             log.info("定时更新执法对象经营状态ID:{},时间{}", enforceObj.getId(), enforceObj.getBlockedEndTime());
         });
         });

+ 6 - 0
zfjg-modules/zfjg-manage/src/main/java/com/zfjg/manage/task/obj/ObjSyncTask.java

@@ -19,6 +19,7 @@ import com.zfjg.manage.service.enforce.obj.IEnforceObjService;
 import com.zfjg.manage.service.enforce.obj.IEnforceObjSyncFailHisService;
 import com.zfjg.manage.service.enforce.obj.IEnforceObjSyncFailHisService;
 import com.zfjg.manage.service.enforce.obj.IEnforceObjTagService;
 import com.zfjg.manage.service.enforce.obj.IEnforceObjTagService;
 import com.zfjg.manage.task.domain.obj.*;
 import com.zfjg.manage.task.domain.obj.*;
+import com.zfjg.manage.utils.SequenceGenerator;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -70,6 +71,9 @@ public class ObjSyncTask {
     @Autowired
     @Autowired
     private RestTemplate restTemplate;
     private RestTemplate restTemplate;
 
 
+    @Autowired
+    private SequenceGenerator sequenceGenerator;
+
     @Value("${fire.corn.obj-sync-task.isopen}")
     @Value("${fire.corn.obj-sync-task.isopen}")
     private Boolean isopen;
     private Boolean isopen;
 
 
@@ -538,6 +542,7 @@ public class ObjSyncTask {
      */
      */
     public <T> T execute(ObjSyncSearch search, String path, Class<T> object, String type) {
     public <T> T execute(ObjSyncSearch search, String path, Class<T> object, String type) {
         SysPullLog sysPullLog = new SysPullLog();
         SysPullLog sysPullLog = new SysPullLog();
+        sysPullLog.setId(sequenceGenerator.nextId());
         sysPullLog.setRunTime(DateUtils.getNowDate());
         sysPullLog.setRunTime(DateUtils.getNowDate());
         sysPullLog.setReq_json(search.toString());
         sysPullLog.setReq_json(search.toString());
         sysPullLog.setState(0l);
         sysPullLog.setState(0l);
@@ -593,6 +598,7 @@ public class ObjSyncTask {
                     sysPullLogMapper.insert(sysPullLog);
                     sysPullLogMapper.insert(sysPullLog);
                     return null;
                     return null;
                 }
                 }
+
                 sysPullLogMapper.insert(sysPullLog);
                 sysPullLogMapper.insert(sysPullLog);
                 break;
                 break;
             default:
             default:

+ 5 - 0
zfjg-modules/zfjg-manage/src/main/java/com/zfjg/manage/task/video/DataShareVeidoListClient.java

@@ -19,6 +19,7 @@ import com.zfjg.manage.mapper.sys.SysPullLogMapper;
 import com.zfjg.manage.service.device.IDeviceService;
 import com.zfjg.manage.service.device.IDeviceService;
 import com.zfjg.manage.service.enforce.video.IEnforceVideoHkResService;
 import com.zfjg.manage.service.enforce.video.IEnforceVideoHkResService;
 import com.zfjg.manage.service.enforce.video.IEnforceVideoService;
 import com.zfjg.manage.service.enforce.video.IEnforceVideoService;
+import com.zfjg.manage.utils.SequenceGenerator;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
@@ -183,6 +184,8 @@ public class DataShareVeidoListClient {
         private IDeviceService deviceRepository;
         private IDeviceService deviceRepository;
         private IEnforceVideoService enforceVideoRepository;
         private IEnforceVideoService enforceVideoRepository;
         private VideoBindJobTask videoBindJobService;
         private VideoBindJobTask videoBindJobService;
+
+        private SequenceGenerator sequenceGenerator;
         /**
         /**
          * STEP4:设置参数提交方式
          * STEP4:设置参数提交方式
          */
          */
@@ -203,6 +206,7 @@ public class DataShareVeidoListClient {
             this.deviceRepository = SpringUtils.getBean(IDeviceService.class);
             this.deviceRepository = SpringUtils.getBean(IDeviceService.class);
             this.enforceVideoRepository = SpringUtils.getBean(IEnforceVideoService.class);
             this.enforceVideoRepository = SpringUtils.getBean(IEnforceVideoService.class);
             this.videoBindJobService = SpringUtils.getBean(VideoBindJobTask.class);
             this.videoBindJobService = SpringUtils.getBean(VideoBindJobTask.class);
+            this.sequenceGenerator=SpringUtils.getBean(SequenceGenerator.class);
         }
         }
 
 
         @Override
         @Override
@@ -222,6 +226,7 @@ public class DataShareVeidoListClient {
                 sysPullLogMapper.insert(sysPullLog);
                 sysPullLogMapper.insert(sysPullLog);
                 return;
                 return;
             }
             }
+            sysPullLog.setId(sequenceGenerator.nextId());
             sysPullLogMapper.insert(sysPullLog);
             sysPullLogMapper.insert(sysPullLog);
             log.info("线程:" + Thread.currentThread().getName() + " , 读取数据耗时 :" + (System.currentTimeMillis() - start) + "ms");
             log.info("线程:" + Thread.currentThread().getName() + " , 读取数据耗时 :" + (System.currentTimeMillis() - start) + "ms");
             List<EnforceVideoHkRes> enforceVideoHkRes = result.getJSONObject("data").getJSONArray("list").toJavaList(EnforceVideoHkRes.class);
             List<EnforceVideoHkRes> enforceVideoHkRes = result.getJSONObject("data").getJSONArray("list").toJavaList(EnforceVideoHkRes.class);

+ 112 - 0
zfjg-modules/zfjg-manage/src/main/java/com/zfjg/manage/utils/SequenceGenerator.java

@@ -0,0 +1,112 @@
+package com.zfjg.manage.utils;
+
+import org.springframework.stereotype.Service;
+
+import java.net.NetworkInterface;
+import java.security.SecureRandom;
+import java.time.Instant;
+import java.util.Enumeration;
+
+/**
+ * Distributed Sequence Generator. Inspired by Twitter snowflake:
+ * https://github.com/twitter/snowflake/tree/snowflake-2010
+ *
+ * <p>This class should be used as a Singleton. Make sure that you create and reuse a Single
+ * instance of SequenceGenerator per node in your distributed system cluster.
+ */
+@Service
+public class SequenceGenerator {
+  private static final int TOTAL_BITS = 60;
+  private static final int EPOCH_BITS = 42;
+  private static final int NODE_ID_BITS = 10;
+  private static final int SEQUENCE_BITS = 12;
+
+  private static final int maxNodeId = (int) (Math.pow(2, NODE_ID_BITS) - 1);
+  private static final int maxSequence = (int) (Math.pow(2, SEQUENCE_BITS) - 1);
+
+  // Custom Epoch (January 1, 2015 Midnight UTC = 2015-01-01T00:00:00Z)
+  private static final long CUSTOM_EPOCH = 1420070400000L;
+
+  private final int nodeId;
+
+  private volatile long lastTimestamp = -1L;
+  private volatile long sequence = 0L;
+
+  // Create SequenceGenerator with a nodeId
+  public SequenceGenerator(int nodeId) {
+    if (nodeId < 0 || nodeId > maxNodeId) {
+      throw new IllegalArgumentException(
+          String.format("NodeId must be between %d and %d", 0, maxNodeId));
+    }
+    this.nodeId = nodeId;
+  }
+
+  // Let SequenceGenerator generate a nodeId
+  public SequenceGenerator() {
+    this.nodeId = createNodeId();
+  }
+
+  public synchronized long nextId() {
+    long currentTimestamp = timestamp();
+
+    if (currentTimestamp < lastTimestamp) {
+      throw new IllegalStateException("Invalid System Clock!");
+    }
+
+    if (currentTimestamp == lastTimestamp) {
+      sequence = (sequence + 1) & maxSequence;
+      if (sequence == 0) {
+        // Sequence Exhausted, wait till next millisecond.
+        currentTimestamp = waitNextMillis(currentTimestamp);
+      }
+    } else {
+      // reset sequence to start with zero for the next millisecond
+      sequence = 0;
+    }
+
+    lastTimestamp = currentTimestamp;
+
+    long id = currentTimestamp << (TOTAL_BITS - EPOCH_BITS);
+    id |= (nodeId << (TOTAL_BITS - EPOCH_BITS - NODE_ID_BITS));
+    id |= sequence;
+    return id;
+  }
+
+  // Get current timestamp in milliseconds, adjust for the custom epoch.
+  private static long timestamp() {
+    return Instant.now().toEpochMilli() - CUSTOM_EPOCH;
+  }
+
+  // Block and wait till next millisecond
+  private long waitNextMillis(long currentTimestamp) {
+    while (currentTimestamp == lastTimestamp) {
+      currentTimestamp = timestamp();
+    }
+    return currentTimestamp;
+  }
+
+  private int createNodeId() {
+    int nodeId;
+    try {
+      StringBuilder sb = new StringBuilder();
+      Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
+      while (networkInterfaces.hasMoreElements()) {
+        NetworkInterface networkInterface = networkInterfaces.nextElement();
+        byte[] mac = networkInterface.getHardwareAddress();
+        if (mac != null) {
+          for (int i = 0; i < mac.length; i++) {
+            sb.append(String.format("%02X", mac[i]));
+          }
+        }
+      }
+      nodeId = sb.toString().hashCode();
+    } catch (Exception ex) {
+      nodeId = (new SecureRandom().nextInt());
+    }
+    nodeId = nodeId & maxNodeId;
+
+    return nodeId;
+  }
+
+
+}