提交 ea213796 authored 作者: 邓砥奕's avatar 邓砥奕

[业务模块]添加电子签章随机生成id接口

上级 195d053e
package com.tykj.dev.misc.utils;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author dengdiyi
*/
@Component
@Configuration
public class Snowflake {
/**
* 开始时间戳
*/
private static final long START_TIME = 0L;
/**
* 时间戳位数
*/
private static final long TIME_BIT = 39L;
/**
* 机房组位数
*/
private static final long WORKER_GROUP_BIT = 4L;
/**
* 机器位数
*/
private static final long WORKER_BIT = 4L;
/**
* 标识符位数
*/
private static final long SEQUENCE_BIT = 14L;
/**
* 最大机房ID
*/
private static final long MAX_WORKER_GROUP = ~(-1L << WORKER_GROUP_BIT);
/**
* 最大机器ID
*/
private static final long MAX_WORKER = ~(-1L << WORKER_BIT);
/**
* 上一次的时间戳
*/
private long lastTime = -1L;
/**
* 当前的时间戳
*/
private long timeNow;
/**
* 当前时钟回拨数
*/
private long clockBack = 0L;
/**
* 时钟回拨位数
*/
private static final long CLOCK_BACK_BIT = 2L;
/**
* 最大时钟回拨数
*/
private static final long MAX_CLOCK_BACK = ~(-1L <<CLOCK_BACK_BIT);
/**
* 时钟回拨最大等待时间
*/
private static final long MAX_WAIT_TIME = 10000L;
/**
* 当前标识符
*/
private long sequence = 0L;
/**
* 最大Seq
*/
private static final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BIT);
/**
* 当前机房ID
*/
private long workGroupId = 0L;
/**
* 当前机器ID
*/
private long workerId = 0L;
/**
* 机器ID左移位数
*/
private static final long WORKER_ID_LEFT_SHIFT = SEQUENCE_BIT;
/**
* 机房ID左移位数
*/
private static final long WORKER_GROUP_ID_LEFT_SHIFT = SEQUENCE_BIT + WORKER_BIT;
/**
* 时间戳左移位数
*/
private static final long TIME_LEFT_SHIFT = SEQUENCE_BIT + WORKER_BIT + WORKER_GROUP_BIT;
/**
* 时间回拨位左移位数
*/
private static final long CLOCK_BACK_SHIFT = SEQUENCE_BIT + WORKER_BIT + WORKER_GROUP_BIT + TIME_BIT;
/**
* lock锁实现同步
*/
private final Lock lock = new ReentrantLock();
// public int num =0;
/**
* 设置当前机器ID
* @param workerId 机器ID
*/
public void setWorkerId(long workerId){
if(workerId< MAX_WORKER &&workerId>=0) {
this.workerId = workerId;
}
else{
throw new IllegalArgumentException("workerId is too big or a minus");
}
}
/**
* 设置当前机房ID
* @param workGroupId 机房ID
*/
public void setWorkGroupId(long workGroupId){
if(workGroupId< MAX_WORKER_GROUP &&workGroupId>=0) {
this.workGroupId = workGroupId;
}
else{
throw new IllegalArgumentException("workGroup_id is too big or a minus");
}
}
/**
* 同步创建下一个订单号
* @return long id
*/
public long creatNextId() {
lock.lock();
try {
timeNow = System.currentTimeMillis();
if (timeNow == lastTime) {
sequence = (sequence + 1) & MAX_SEQUENCE;
if (sequence == 0) {
waitNextMills();
}
} else if (isClockBack()) {
if (lastTime - timeNow < MAX_WAIT_TIME) {
try {
Thread.sleep(lastTime - timeNow);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
clockBack = (clockBack + 1) & MAX_CLOCK_BACK;
if (clockBack == 0) {
throw new IllegalArgumentException("clock back too many times");
}
sequence = 0L;
}
} else {
sequence = 0L;
}
lastTime = timeNow;
return sequence | workerId << WORKER_ID_LEFT_SHIFT | workGroupId << WORKER_GROUP_ID_LEFT_SHIFT | (timeNow - START_TIME) << TIME_LEFT_SHIFT | clockBack << CLOCK_BACK_SHIFT;
}
finally {
lock.unlock();
}
}
/**
* 判断是否时钟回拨
* @return true or false
*/
public boolean isClockBack(){
return lastTime-timeNow>0;
}
/**
* 等待下一毫秒
*/
public void waitNextMills(){
timeNow = System.currentTimeMillis();
while (timeNow <= lastTime) {
timeNow = System.currentTimeMillis();
}
}
}
...@@ -31,6 +31,7 @@ import com.tykj.dev.device.user.subject.service.UserPublicService; ...@@ -31,6 +31,7 @@ import com.tykj.dev.device.user.subject.service.UserPublicService;
import com.tykj.dev.misc.base.ResultObj; import com.tykj.dev.misc.base.ResultObj;
import com.tykj.dev.misc.exception.ApiException; import com.tykj.dev.misc.exception.ApiException;
import com.tykj.dev.misc.utils.ResultUtil; import com.tykj.dev.misc.utils.ResultUtil;
import com.tykj.dev.misc.utils.Snowflake;
import com.tykj.dev.misc.utils.StringSplitUtil; import com.tykj.dev.misc.utils.StringSplitUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
...@@ -101,6 +102,9 @@ public class TaskSelectController { ...@@ -101,6 +102,9 @@ public class TaskSelectController {
@Autowired @Autowired
private SendBackBillDetailDao sendBackBillDetailDao; private SendBackBillDetailDao sendBackBillDetailDao;
@Autowired
private Snowflake snowflake;
@ApiOperation(value = "查询业务对应页面的数据", notes = "可以通过这个接口查询业务对应页面的数据") @ApiOperation(value = "查询业务对应页面的数据", notes = "可以通过这个接口查询业务对应页面的数据")
@GetMapping("/manage/detail/{id}") @GetMapping("/manage/detail/{id}")
public ResponseEntity selectData(@PathVariable("id") int taskId) { public ResponseEntity selectData(@PathVariable("id") int taskId) {
...@@ -421,4 +425,10 @@ public class TaskSelectController { ...@@ -421,4 +425,10 @@ public class TaskSelectController {
default:throw new ApiException(ResultUtil.failed("该接口不支持当前task业务类型")); default:throw new ApiException(ResultUtil.failed("该接口不支持当前task业务类型"));
} }
} }
@ApiOperation(value = "生成电子签章随机id", notes = "可以通过这个接口生成电子签章随机id")
@GetMapping("/signature/create")
public ResponseEntity createSignatureId(){
return ResponseEntity.ok(snowflake.creatNextId());
}
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论