Ver Fonte

全局ID功能实现

wanggaokun há 1 ano atrás
pai
commit
56c7d93cb7

+ 27 - 5
PHM-admin/phm-common/src/main/java/com/phm/common/utils/ip/IpUtils.java

@@ -1,11 +1,13 @@
 package com.phm.common.utils.ip;
 
+import com.phm.common.utils.ServletUtils;
+import com.phm.common.utils.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
 import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
 import java.net.UnknownHostException;
-import javax.servlet.http.HttpServletRequest;
-
-import com.phm.common.utils.StringUtils;
-import com.phm.common.utils.ServletUtils;
 
 /**
  * 获取IP方法
@@ -191,11 +193,31 @@ public class IpUtils {
     public static String getHostIp() {
         try {
             return InetAddress.getLocalHost().getHostAddress();
-        } catch (UnknownHostException e) {
+        } catch (UnknownHostException ignored) {
         }
         return "127.0.0.1";
     }
 
+    /**
+     * 获取MAC地址
+     *
+     * @return MAC地址
+     */
+    public static String getMac() {
+        try {
+            NetworkInterface network = NetworkInterface.getByInetAddress(InetAddress.getLocalHost());
+            byte[] mac = network.getHardwareAddress();
+            StringBuilder sb = new StringBuilder();
+            for (int i = 0; i < mac.length; i++) {
+                sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
+            }
+            return sb.toString();
+        } catch (SocketException | UnknownHostException ignored) {
+
+        }
+        return "99-99-99-99-99-99";
+    }
+
     /**
      * 获取主机名
      *

+ 68 - 0
PHM-admin/phm-manage/src/main/java/com/phm/manage/config/SnowFlakeConfig.java

@@ -0,0 +1,68 @@
+package com.phm.manage.config;
+
+import com.phm.common.utils.ip.IpUtils;
+import com.phm.manage.domain.GlobalIdRegister;
+import com.phm.manage.mapper.GlobalIdRegisterMapper;
+import com.phm.manage.util.SnowFlakeIdGenerator;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.List;
+
+/**
+ * @Description SnowFlakeConfig
+ * @Author WGK
+ * @Date 2023/9/8 14:33
+ */
+@Configuration
+public class SnowFlakeConfig {
+
+    @Autowired
+    private GlobalIdRegisterMapper globalIdRegisterMapper;
+
+    /**
+     * 初始化生成ID参数
+     *
+     * @return bean
+     */
+    @Bean()
+    @ConditionalOnMissingBean(SnowFlakeIdGenerator.class)//用户没有注入自己的bean才装配
+    public SnowFlakeIdGenerator getDefaultIdGenerator() {
+        GlobalIdRegister globalIdRegister = new GlobalIdRegister();
+        globalIdRegister.setMachine(IpUtils.getMac());
+        List<GlobalIdRegister> registerList = globalIdRegisterMapper.selectGlobalIdRegisterList(globalIdRegister);
+        Long machineId = 1L;
+        Long datacenterId = 1L;
+        if (CollectionUtils.isEmpty(registerList)) {
+            globalIdRegister.setMachineId(1L);
+            globalIdRegister.setDatacenterId(1L);
+            GlobalIdRegister register = globalIdRegisterMapper.selectGlobalIdRegister();
+            if (ObjectUtils.isNotEmpty(register)) {
+                machineId = register.getMachineId();
+                datacenterId = register.getDatacenterId();
+                globalIdRegister.setMachineId(++machineId);
+                globalIdRegister.setDatacenterId(datacenterId);
+                if (register.getMachineId() >= SnowFlakeIdGenerator.MAX_MACHINE_NUM && register.getDatacenterId() < SnowFlakeIdGenerator.MAX_DATACENTER_NUM) {
+                    globalIdRegister.setMachineId(1L);
+                    globalIdRegister.setDatacenterId(++datacenterId);
+                }
+                if (register.getMachineId() >= SnowFlakeIdGenerator.MAX_MACHINE_NUM && register.getDatacenterId() >= SnowFlakeIdGenerator.MAX_DATACENTER_NUM) {
+                    globalIdRegister.setDatacenterId(1L);
+                    globalIdRegister.setMachineId(1L);
+                }
+            }
+            SnowFlakeIdGenerator snowFlakeIdGenerator = new SnowFlakeIdGenerator(globalIdRegister.getDatacenterId(), globalIdRegister.getMachineId());
+            globalIdRegisterMapper.insertGlobalIdRegister(globalIdRegister);
+            return snowFlakeIdGenerator;
+        } else {
+            globalIdRegister.setDatacenterId(registerList.get(0).getDatacenterId());
+            globalIdRegister.setMachineId(registerList.get(0).getMachineId());
+            return new SnowFlakeIdGenerator(globalIdRegister.getDatacenterId(), globalIdRegister.getMachineId());
+        }
+    }
+
+}

+ 91 - 0
PHM-admin/phm-manage/src/main/java/com/phm/manage/controller/GlobalIdRegisterController.java

@@ -0,0 +1,91 @@
+package com.phm.manage.controller;
+
+import com.phm.common.annotation.Log;
+import com.phm.common.core.controller.BaseController;
+import com.phm.common.core.domain.AjaxResult;
+import com.phm.common.core.page.TableDataInfo;
+import com.phm.common.enums.BusinessType;
+import com.phm.common.utils.poi.ExcelUtil;
+import com.phm.manage.domain.GlobalIdRegister;
+import com.phm.manage.service.IGlobalIdRegisterService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 全局机器ID注册Controller
+ *
+ * @author phm
+ * @date 2023-09-08
+ */
+@RestController
+@RequestMapping("/manage/register")
+public class GlobalIdRegisterController extends BaseController {
+    @Autowired
+    private IGlobalIdRegisterService globalIdRegisterService;
+
+    /**
+     * 查询全局机器ID注册列表
+     */
+    @PreAuthorize("@ss.hasPermi('manage:register:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(GlobalIdRegister globalIdRegister) {
+        startPage();
+        List<GlobalIdRegister> list = globalIdRegisterService.selectGlobalIdRegisterList(globalIdRegister);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出全局机器ID注册列表
+     */
+    @PreAuthorize("@ss.hasPermi('manage:register:export')")
+    @Log(title = "全局机器ID注册", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, GlobalIdRegister globalIdRegister) {
+        List<GlobalIdRegister> list = globalIdRegisterService.selectGlobalIdRegisterList(globalIdRegister);
+        ExcelUtil<GlobalIdRegister> util = new ExcelUtil<GlobalIdRegister>(GlobalIdRegister.class);
+        util.exportExcel(response, list, "全局机器ID注册数据");
+    }
+
+    /**
+     * 获取全局机器ID注册详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('manage:register:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
+        return success(globalIdRegisterService.selectGlobalIdRegisterById(id));
+    }
+
+    /**
+     * 新增全局机器ID注册
+     */
+    @PreAuthorize("@ss.hasPermi('manage:register:add')")
+    @Log(title = "全局机器ID注册", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody GlobalIdRegister globalIdRegister) {
+        return toAjax(globalIdRegisterService.insertGlobalIdRegister(globalIdRegister));
+    }
+
+    /**
+     * 修改全局机器ID注册
+     */
+    @PreAuthorize("@ss.hasPermi('manage:register:edit')")
+    @Log(title = "全局机器ID注册", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody GlobalIdRegister globalIdRegister) {
+        return toAjax(globalIdRegisterService.updateGlobalIdRegister(globalIdRegister));
+    }
+
+    /**
+     * 删除全局机器ID注册
+     */
+    @PreAuthorize("@ss.hasPermi('manage:register:remove')")
+    @Log(title = "全局机器ID注册", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids) {
+        return toAjax(globalIdRegisterService.deleteGlobalIdRegisterByIds(ids));
+    }
+}

+ 41 - 0
PHM-admin/phm-manage/src/main/java/com/phm/manage/domain/GlobalIdRegister.java

@@ -0,0 +1,41 @@
+package com.phm.manage.domain;
+
+import com.phm.common.annotation.Excel;
+import com.phm.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 全局机器ID注册对象 phm_global_id_register
+ *
+ * @author phm
+ * @date 2023-09-08
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class GlobalIdRegister extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 唯一ID
+     */
+    private Long id;
+
+    /**
+     * 机器标识
+     */
+    @Excel(name = "机器标识")
+    private String machine;
+
+    /**
+     * 机器id
+     */
+    @Excel(name = "机器id")
+    private Long machineId;
+
+    /**
+     * 数据中心id
+     */
+    @Excel(name = "数据中心id")
+    private Long datacenterId;
+}

+ 68 - 0
PHM-admin/phm-manage/src/main/java/com/phm/manage/mapper/GlobalIdRegisterMapper.java

@@ -0,0 +1,68 @@
+package com.phm.manage.mapper;
+
+import com.phm.manage.domain.GlobalIdRegister;
+
+import java.util.List;
+
+/**
+ * 全局机器ID注册Mapper接口
+ *
+ * @author phm
+ * @date 2023-09-08
+ */
+public interface GlobalIdRegisterMapper {
+    /**
+     * 查询全局机器ID注册
+     *
+     * @param id 全局机器ID注册主键
+     * @return 全局机器ID注册
+     */
+    public GlobalIdRegister selectGlobalIdRegisterById(Long id);
+
+    /**
+     * 查询最新一条数据
+     *
+     * @return GlobalIdRegister
+     */
+    public GlobalIdRegister selectGlobalIdRegister();
+
+    /**
+     * 查询全局机器ID注册列表
+     *
+     * @param globalIdRegister 全局机器ID注册
+     * @return 全局机器ID注册集合
+     */
+    public List<GlobalIdRegister> selectGlobalIdRegisterList(GlobalIdRegister globalIdRegister);
+
+    /**
+     * 新增全局机器ID注册
+     *
+     * @param globalIdRegister 全局机器ID注册
+     * @return 结果
+     */
+    public int insertGlobalIdRegister(GlobalIdRegister globalIdRegister);
+
+    /**
+     * 修改全局机器ID注册
+     *
+     * @param globalIdRegister 全局机器ID注册
+     * @return 结果
+     */
+    public int updateGlobalIdRegister(GlobalIdRegister globalIdRegister);
+
+    /**
+     * 删除全局机器ID注册
+     *
+     * @param id 全局机器ID注册主键
+     * @return 结果
+     */
+    public int deleteGlobalIdRegisterById(Long id);
+
+    /**
+     * 批量删除全局机器ID注册
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteGlobalIdRegisterByIds(Long[] ids);
+}

+ 61 - 0
PHM-admin/phm-manage/src/main/java/com/phm/manage/service/IGlobalIdRegisterService.java

@@ -0,0 +1,61 @@
+package com.phm.manage.service;
+
+import java.util.List;
+import com.phm.manage.domain.GlobalIdRegister;
+
+/**
+ * 全局机器ID注册Service接口
+ * 
+ * @author phm
+ * @date 2023-09-08
+ */
+public interface IGlobalIdRegisterService 
+{
+    /**
+     * 查询全局机器ID注册
+     * 
+     * @param id 全局机器ID注册主键
+     * @return 全局机器ID注册
+     */
+    public GlobalIdRegister selectGlobalIdRegisterById(Long id);
+
+    /**
+     * 查询全局机器ID注册列表
+     * 
+     * @param globalIdRegister 全局机器ID注册
+     * @return 全局机器ID注册集合
+     */
+    public List<GlobalIdRegister> selectGlobalIdRegisterList(GlobalIdRegister globalIdRegister);
+
+    /**
+     * 新增全局机器ID注册
+     * 
+     * @param globalIdRegister 全局机器ID注册
+     * @return 结果
+     */
+    public int insertGlobalIdRegister(GlobalIdRegister globalIdRegister);
+
+    /**
+     * 修改全局机器ID注册
+     * 
+     * @param globalIdRegister 全局机器ID注册
+     * @return 结果
+     */
+    public int updateGlobalIdRegister(GlobalIdRegister globalIdRegister);
+
+    /**
+     * 批量删除全局机器ID注册
+     * 
+     * @param ids 需要删除的全局机器ID注册主键集合
+     * @return 结果
+     */
+    public int deleteGlobalIdRegisterByIds(Long[] ids);
+
+    /**
+     * 删除全局机器ID注册信息
+     * 
+     * @param id 全局机器ID注册主键
+     * @return 结果
+     */
+    public int deleteGlobalIdRegisterById(Long id);
+}

+ 90 - 0
PHM-admin/phm-manage/src/main/java/com/phm/manage/service/impl/GlobalIdRegisterServiceImpl.java

@@ -0,0 +1,90 @@
+package com.phm.manage.service.impl;
+
+import com.phm.common.utils.ip.IpUtils;
+import com.phm.manage.domain.GlobalIdRegister;
+import com.phm.manage.mapper.GlobalIdRegisterMapper;
+import com.phm.manage.service.IGlobalIdRegisterService;
+import com.phm.manage.util.SnowFlakeIdGenerator;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 全局机器ID注册Service业务层处理
+ *
+ * @author phm
+ * @date 2023-09-08
+ */
+@Service
+public class GlobalIdRegisterServiceImpl implements IGlobalIdRegisterService {
+    @Autowired
+    private GlobalIdRegisterMapper globalIdRegisterMapper;
+
+    /**
+     * 查询全局机器ID注册
+     *
+     * @param id 全局机器ID注册主键
+     * @return 全局机器ID注册
+     */
+    @Override
+    public GlobalIdRegister selectGlobalIdRegisterById(Long id) {
+        return globalIdRegisterMapper.selectGlobalIdRegisterById(id);
+    }
+
+    /**
+     * 查询全局机器ID注册列表
+     *
+     * @param globalIdRegister 全局机器ID注册
+     * @return 全局机器ID注册
+     */
+    @Override
+    public List<GlobalIdRegister> selectGlobalIdRegisterList(GlobalIdRegister globalIdRegister) {
+        return globalIdRegisterMapper.selectGlobalIdRegisterList(globalIdRegister);
+    }
+
+    /**
+     * 新增全局机器ID注册
+     *
+     * @param globalIdRegister 全局机器ID注册
+     * @return 结果
+     */
+    @Override
+    public int insertGlobalIdRegister(GlobalIdRegister globalIdRegister) {
+        return globalIdRegisterMapper.insertGlobalIdRegister(globalIdRegister);
+    }
+
+    /**
+     * 修改全局机器ID注册
+     *
+     * @param globalIdRegister 全局机器ID注册
+     * @return 结果
+     */
+    @Override
+    public int updateGlobalIdRegister(GlobalIdRegister globalIdRegister) {
+        return globalIdRegisterMapper.updateGlobalIdRegister(globalIdRegister);
+    }
+
+    /**
+     * 批量删除全局机器ID注册
+     *
+     * @param ids 需要删除的全局机器ID注册主键
+     * @return 结果
+     */
+    @Override
+    public int deleteGlobalIdRegisterByIds(Long[] ids) {
+        return globalIdRegisterMapper.deleteGlobalIdRegisterByIds(ids);
+    }
+
+    /**
+     * 删除全局机器ID注册信息
+     *
+     * @param id 全局机器ID注册主键
+     * @return 结果
+     */
+    @Override
+    public int deleteGlobalIdRegisterById(Long id) {
+        return globalIdRegisterMapper.deleteGlobalIdRegisterById(id);
+    }
+}

+ 94 - 0
PHM-admin/phm-manage/src/main/java/com/phm/manage/util/SnowFlakeIdGenerator.java

@@ -0,0 +1,94 @@
+package com.phm.manage.util;
+
+
+/**
+ * @Description 雪花算法生成ID
+ * @Author WGK
+ * @Date 2023/9/8 9:35
+ */
+public class SnowFlakeIdGenerator {
+    /**
+     * 起始的时间戳
+     */
+    private final static long START_STAMP = 1480166465631L;
+
+    /**
+     * 每一部分占用的位数
+     */
+    private final static long SEQUENCE_BIT = 12; //序列号占用的位数
+    private final static long MACHINE_BIT = 5;   //机器标识占用的位数
+    private final static long DATACENTER_BIT = 5;//数据中心占用的位数
+
+    /**
+     * 每一部分的最大值
+     */
+    public final static long MAX_DATACENTER_NUM = ~(-1L << DATACENTER_BIT);
+    public final static long MAX_MACHINE_NUM = ~(-1L << MACHINE_BIT);
+    private final static long MAX_SEQUENCE = ~(-1L << SEQUENCE_BIT);
+
+    /**
+     * 每一部分向左的位移
+     */
+    private final static long MACHINE_LEFT = SEQUENCE_BIT;
+    private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
+    private final static long TIMESTAMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;
+
+    private final long datacenterId;  //数据中心
+    private final long machineId;     //机器标识
+    private long sequence = 0L; //序列号
+    private long lastTimestamp = -1L;//上一次时间戳
+
+    public SnowFlakeIdGenerator(long datacenterId, long machineId) {
+        if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {
+            throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0");
+        }
+        if (machineId > MAX_MACHINE_NUM || machineId < 0) {
+            throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0");
+        }
+        this.datacenterId = datacenterId;
+        this.machineId = machineId;
+    }
+
+    /**
+     * 产生下一个ID
+     *
+     * @return id
+     */
+    public synchronized long nextId() {
+        long currStmp = getNewTimestamp();
+        if (currStmp < lastTimestamp) {
+            throw new RuntimeException("Clock moved backwards.  Refusing to generate id");
+        }
+
+        if (currStmp == lastTimestamp) {
+            //相同毫秒内,序列号自增
+            sequence = (sequence + 1) & MAX_SEQUENCE;
+            //同一毫秒的序列数已经达到最大
+            if (sequence == 0L) {
+                currStmp = getNextMill();
+            }
+        } else {
+            //不同毫秒内,序列号置为0
+            sequence = 0L;
+        }
+
+        lastTimestamp = currStmp;
+
+        return (currStmp - START_STAMP) << TIMESTAMP_LEFT //时间戳部分
+                | datacenterId << DATACENTER_LEFT       //数据中心部分
+                | machineId << MACHINE_LEFT             //机器标识部分
+                | sequence;                             //序列号部分
+    }
+
+    private long getNextMill() {
+        long mill = getNewTimestamp();
+        while (mill <= lastTimestamp) {
+            mill = getNewTimestamp();
+        }
+        return mill;
+    }
+
+    private long getNewTimestamp() {
+        return System.currentTimeMillis();
+    }
+}

+ 70 - 0
PHM-admin/phm-manage/src/main/resources/mapper/manage/GlobalIdRegisterMapper.xml

@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.phm.manage.mapper.GlobalIdRegisterMapper">
+    
+    <resultMap type="GlobalIdRegister" id="GlobalIdRegisterResult">
+        <result property="id"    column="id"    />
+        <result property="machine"    column="machine"    />
+        <result property="machineId"    column="machine_id"    />
+        <result property="datacenterId"    column="datacenter_id"    />
+    </resultMap>
+
+    <sql id="selectGlobalIdRegisterVo">
+        select id, machine, machine_id, datacenter_id from phm_global_id_register
+    </sql>
+
+    <select id="selectGlobalIdRegisterList" parameterType="GlobalIdRegister" resultMap="GlobalIdRegisterResult">
+        <include refid="selectGlobalIdRegisterVo"/>
+        <where>  
+            <if test="machine != null "> and machine = #{machine}</if>
+            <if test="machineId != null "> and machine_id = #{machineId}</if>
+            <if test="datacenterId != null "> and datacenter_id = #{datacenterId}</if>
+        </where>
+    </select>
+    
+    <select id="selectGlobalIdRegisterById" parameterType="Long" resultMap="GlobalIdRegisterResult">
+        <include refid="selectGlobalIdRegisterVo"/>
+        where id = #{id}
+    </select>
+    <select id="selectGlobalIdRegister" parameterType="Long" resultMap="GlobalIdRegisterResult">
+        <include refid="selectGlobalIdRegisterVo"/>
+        order by id desc limit 1
+    </select>
+        
+    <insert id="insertGlobalIdRegister" parameterType="GlobalIdRegister" useGeneratedKeys="true" keyProperty="id">
+        insert into phm_global_id_register
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="machine != null and machine != ''">machine,</if>
+            <if test="machineId != null">machine_id,</if>
+            <if test="datacenterId != null">datacenter_id,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="machine != null and machine != ''">#{machine},</if>
+            <if test="machineId != null">#{machineId},</if>
+            <if test="datacenterId != null">#{datacenterId},</if>
+         </trim>
+    </insert>
+
+    <update id="updateGlobalIdRegister" parameterType="GlobalIdRegister">
+        update phm_global_id_register
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="machine != null and machine != ''">machine = #{machine},</if>
+            <if test="machineId != null">machine_id = #{machineId},</if>
+            <if test="datacenterId != null">datacenter_id = #{datacenterId},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteGlobalIdRegisterById" parameterType="Long">
+        delete from phm_global_id_register where id = #{id}
+    </delete>
+
+    <delete id="deleteGlobalIdRegisterByIds" parameterType="String">
+        delete from phm_global_id_register where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>