Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
D
device-back
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
1
议题
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
Matrix
device-back
Commits
ea213796
提交
ea213796
authored
9月 29, 2020
作者:
邓砥奕
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[业务模块]添加电子签章随机生成id接口
上级
195d053e
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
197 行增加
和
0 行删除
+197
-0
Snowflake.java
...misc/src/main/java/com/tykj/dev/misc/utils/Snowflake.java
+187
-0
TaskSelectController.java
...ev/device/taskselect/controller/TaskSelectController.java
+10
-0
没有找到文件。
dev-misc/src/main/java/com/tykj/dev/misc/utils/Snowflake.java
0 → 100644
浏览文件 @
ea213796
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
();
}
}
}
dev-taskselect/src/main/java/com/tykj/dev/device/taskselect/controller/TaskSelectController.java
浏览文件 @
ea213796
...
@@ -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
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论