Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
D
device-back
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
1
议题
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
Matrix
device-back
Commits
b99865e2
提交
b99865e2
authored
9月 22, 2020
作者:
Matrix
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[核查模块] 修复了一些自动核查相关的BUG
[测试模块] 增加了出现异常后的自动回滚
上级
992e22e5
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
78 行增加
和
24 行删除
+78
-24
DeviceCheckController.java
...device/confirmcheck/controller/DeviceCheckController.java
+38
-22
DeviceCheckDetailDao.java
.../device/confirmcheck/repository/DeviceCheckDetailDao.java
+1
-1
DeviceCheckControllerTest.java
.../com/tykj/dev/confirmcheck/DeviceCheckControllerTest.java
+37
-1
BaseTest.java
dev-union/src/test/java/com/tykj/dev/union/BaseTest.java
+2
-0
没有找到文件。
dev-confirmcheck/src/main/java/com/tykj/dev/device/confirmcheck/controller/DeviceCheckController.java
浏览文件 @
b99865e2
package
com
.
tykj
.
dev
.
device
.
confirmcheck
.
controller
;
import
com.google.common.collect.Lists
;
import
com.tykj.dev.config.swagger.AutoDocument
;
import
com.tykj.dev.device.confirmcheck.entity.domain.DeviceCheckBillEntity
;
import
com.tykj.dev.device.confirmcheck.entity.domain.DeviceCheckDetailEntity
;
...
...
@@ -38,10 +39,7 @@ import org.springframework.web.bind.annotation.*;
import
javax.servlet.http.HttpServletRequest
;
import
java.time.LocalDate
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Objects
;
import
java.util.*
;
import
static
com
.
tykj
.
dev
.
misc
.
base
.
BusinessEnum
.
CONFIRM_CHECK_DETAIL
;
import
static
com
.
tykj
.
dev
.
misc
.
base
.
BusinessEnum
.
CONFIRM_CHECK_STAT
;
...
...
@@ -112,17 +110,25 @@ public class DeviceCheckController {
@ApiOperation
(
value
=
"发起自动核查"
,
notes
=
"发起自动核查"
)
@PostMapping
(
"/check/auto"
)
public
ResponseEntity
startAutoCheck
()
{
// 构建返回数据对象
Map
<
String
,
List
<
Integer
>>
resultIds
=
new
HashMap
<>();
resultIds
.
put
(
"statId"
,
new
ArrayList
<>());
resultIds
.
put
(
"detailId"
,
new
ArrayList
<>());
resultIds
.
put
(
"taskId"
,
new
ArrayList
<>());
// 发起省级的统计 - 获得所有的市级单位
List
<
Units
>
cityUnits
=
unitsRepo
.
findAllByLevel
(
2
);
Units
provUnit
=
unitsRepo
.
findById
(
1
).
get
();
String
baseTitle
=
LocalDate
.
now
().
getYear
()
+
"年"
+
(
LocalDate
.
now
().
getMonthValue
()
+
1
)
+
"月"
;
// 构建省的统计账单
DeviceCheckStat
provinceStat
=
initStatData
(
"自动核查"
,
DeviceCheckStat
provinceStat
Do
=
initStatData
(
"自动核查"
,
0
,
0
,
baseTitle
+
"浙江省自动核查"
,
provUnit
.
getName
(),
cityUnits
);
DeviceCheckStat
provStat
=
statRepo
.
save
(
provinceStatDo
);
resultIds
.
get
(
"statId"
).
add
(
provStat
.
getId
());
List
<
DeviceLibrary
>
deviceList
=
deviceRepo
.
findAll
();
Map
<
String
,
List
<
DeviceLibrary
>>
devInLib
=
deviceList
.
stream
()
.
filter
(
device
->
device
.
getOwnUnit
().
equals
(
device
.
getLocationUnit
()))
...
...
@@ -133,9 +139,11 @@ public class DeviceCheckController {
.
collect
(
groupingBy
(
DeviceLibrary:
:
getOwnUnit
));
// 构建省统Task
TaskBto
provStatTask
=
new
Task
(
CHECK_STAT_0
.
id
,
"省自动核查"
,
0
,
".0."
,
CONFIRM_CHECK_STAT
.
id
,
prov
ince
Stat
.
getId
(),
provUnit
.
getUnitId
())
TaskBto
provStatTask
=
new
Task
(
CHECK_STAT_0
.
id
,
"省自动核查"
,
0
,
".0."
,
CONFIRM_CHECK_STAT
.
id
,
provStat
.
getId
(),
provUnit
.
getUnitId
())
.
parse2Bto
();
taskService
.
start
(
provStatTask
);
provStatTask
.
setInvolveUserIdList
(
Lists
.
newArrayList
(-
1
));
provStatTask
=
taskService
.
start
(
provStatTask
).
parse2Bto
();
resultIds
.
get
(
"taskId"
).
add
(
provStatTask
.
getId
());
List
<
CheckDeviceStatVo
>
statVoList
=
new
ArrayList
<>();
List
<
DeviceCheckStat
>
cityStatList
=
new
ArrayList
<>();
...
...
@@ -155,10 +163,13 @@ public class DeviceCheckController {
DeviceCheckStat
cityStat
=
statRepo
.
save
(
cityStatDo
);
cityStatList
.
add
(
cityStat
);
resultIds
.
get
(
"statId"
).
add
(
cityStat
.
getId
());
// 构建市统task 获得id
TaskBto
cityStatTask
=
new
Task
(
CHECK_STAT_0
.
id
,
city
.
getName
()
+
"自动核查统计"
,
provStatTask
.
getId
(),
addNode
(
provStatTask
.
getNodeIdDetail
(),
provinceStat
.
getId
()),
CONFIRM_CHECK_STAT
.
id
,
cityStat
.
getId
(),
city
.
getUnitId
())
TaskBto
cityStatTask
=
new
Task
(
CHECK_STAT_0
.
id
,
city
.
getName
()
+
"自动核查统计"
,
provStatTask
.
getId
(),
addNode
(
provStatTask
.
getNodeIdDetail
(),
provinceStat
Do
.
getId
()),
CONFIRM_CHECK_STAT
.
id
,
cityStat
.
getId
(),
city
.
getUnitId
())
.
parse2Bto
();
taskService
.
start
(
cityStatTask
);
cityStatTask
.
setInvolveUserIdList
(
Lists
.
newArrayList
(-
1
));
cityStatTask
=
taskService
.
start
(
cityStatTask
).
parse2Bto
();
resultIds
.
get
(
"taskId"
).
add
(
cityStatTask
.
getId
());
// 构建市自查账单
DeviceCheckDetailEntity
cityDetailDo
=
DeviceCheckDetailEntity
.
EmptyWithChecker
(
...
...
@@ -169,6 +180,7 @@ public class DeviceCheckController {
devInLib
.
getOrDefault
(
city
.
getName
(),
new
ArrayList
<>()),
devNotInLib
.
getOrDefault
(
city
.
getName
(),
new
ArrayList
<>()));
DeviceCheckDetailEntity
cityDetail
=
detailRepo
.
save
(
cityDetailDo
);
resultIds
.
get
(
"detailId"
).
add
(
cityDetail
.
getId
());
List
<
CheckDeviceStatVo
>
cityStatVoList
=
deviceList
.
stream
()
.
filter
(
d
->
d
.
getOwnUnit
().
equals
(
city
.
getName
()))
...
...
@@ -176,9 +188,9 @@ public class DeviceCheckController {
.
collect
(
toList
());
statVoList
.
addAll
(
cityStatVoList
);
// 构建市自查TASK
TaskBto
cityDetailTask
=
new
Task
(
CHECK_DETAIL_0
.
id
,
city
.
getName
()
+
"自动核查自查"
,
cityStatTask
.
getId
(),
addNode
(
cityStatTask
.
getNodeIdDetail
(),
cityStatTask
.
getId
()),
CONFIRM_CHECK_DETAIL
.
id
,
cityDetail
.
getId
(),
city
.
getUnitId
())
.
parse2Bto
();
taskService
.
start
(
cityDetailTask
);
TaskBto
cityDetailTask
=
new
Task
Bto
(
CHECK_DETAIL_0
.
id
,
city
.
getName
()
+
"自动核查自查"
,
cityStatTask
.
getId
(),
addNode
(
cityStatTask
.
getNodeIdDetail
(),
cityStatTask
.
getId
()),
CONFIRM_CHECK_DETAIL
.
id
,
cityDetail
.
getId
(),
city
.
getUnitId
(),
0
);
cityDetailTask
=
taskService
.
start
(
cityDetailTask
)
.
parse2Bto
();
resultIds
.
get
(
"taskId"
).
add
(
cityDetailTask
.
getId
()
);
// 构建县任务
for
(
Units
county
:
countyUnits
)
{
...
...
@@ -192,6 +204,7 @@ public class DeviceCheckController {
devInLib
.
getOrDefault
(
city
.
getName
(),
new
ArrayList
<>()),
devNotInLib
.
getOrDefault
(
city
.
getName
(),
new
ArrayList
<>()));
DeviceCheckDetailEntity
countyDetail
=
detailRepo
.
save
(
countyDetailDo
);
resultIds
.
get
(
"detailId"
).
add
(
countyDetail
.
getId
());
List
<
CheckDeviceStatVo
>
countyStatVoList
=
deviceList
.
stream
()
.
filter
(
d
->
d
.
getOwnUnit
().
equals
(
city
.
getName
()))
.
map
(
d
->
transUtil
.
device2InitStatVo
(
d
,
city
.
getName
(),
cityStat
.
getId
(),
countyDetail
.
getId
()))
...
...
@@ -199,9 +212,9 @@ public class DeviceCheckController {
statVoList
.
addAll
(
countyStatVoList
);
//构建县自查TASK
TaskBto
countyDetailTask
=
new
Task
(
CHECK_DETAIL_0
.
id
,
county
.
getName
()
+
"自动核查自查"
,
cityStatTask
.
getId
(),
addNode
(
cityStatTask
.
getNodeIdDetail
(),
cityStatTask
.
getId
()),
CONFIRM_CHECK_DETAIL
.
id
,
countyDetail
.
getId
(),
county
.
getUnitId
())
.
parse2Bto
();
taskService
.
start
(
countyDetailTask
);
TaskBto
countyDetailTask
=
new
Task
Bto
(
CHECK_DETAIL_0
.
id
,
county
.
getName
()
+
"自动核查自查"
,
cityStatTask
.
getId
(),
addNode
(
cityStatTask
.
getNodeIdDetail
(),
cityStatTask
.
getId
()),
CONFIRM_CHECK_DETAIL
.
id
,
countyDetail
.
getId
(),
county
.
getUnitId
(),
0
);
countyDetailTask
=
taskService
.
start
(
countyDetailTask
)
.
parse2Bto
();
resultIds
.
get
(
"taskId"
).
add
(
countyDetailTask
.
getId
()
);
}
// 处理JSON INFO 数据
...
...
@@ -210,8 +223,8 @@ public class DeviceCheckController {
.
filter
(
stat
->
!
countyNames
.
contains
(
stat
.
getAreaStatList
().
get
(
0
).
getAreaName
()))
.
reduce
(
CheckDeviceStatVo:
:
add
)
.
get
();
prov
ince
Stat
.
setStatInfo
(
JacksonUtil
.
toJSon
(
provStatVo
));
statRepo
.
save
(
prov
ince
Stat
);
provStat
.
setStatInfo
(
JacksonUtil
.
toJSon
(
provStatVo
));
statRepo
.
save
(
provStat
);
// 对于市统计来说,只需要自己本市以及其下地区的数据
for
(
DeviceCheckStat
csd
:
cityStatList
)
{
List
<
String
>
cityNames
=
new
ArrayList
<>();
...
...
@@ -234,7 +247,7 @@ public class DeviceCheckController {
statRepo
.
saveAll
(
cityStatList
);
}
return
ResponseEntity
.
ok
(
"自动发起任务成功"
);
return
ResponseEntity
.
ok
(
new
ResultObj
(
resultIds
,
"自动核查任务发起成功"
)
);
}
/**
...
...
@@ -317,7 +330,7 @@ public class DeviceCheckController {
long
count
=
devLibVo
.
getDevInLibrary
().
stream
()
.
filter
(
deviceInLibVo
->
deviceInLibVo
.
getProofResult
()
==
1
)
.
count
();
detailRepo
.
updateCheckDetail
(
id
,
detailString
,
checkResult
,
currentUser
.
getUserId
(),
assignUserId
,
count
);
detailRepo
.
updateCheckDetail
(
id
,
detailString
,
checkResult
,
currentUser
.
getUserId
(),
assignUserId
,
(
int
)
count
);
//2. 推进TASK 状态
TaskBto
currentTask
=
taskService
.
get
(
id
,
CONFIRM_CHECK_DETAIL
.
id
);
currentTask
.
getInvolveUserIdList
().
set
(
0
,
AuthenticationUtils
.
getAuthentication
().
getCurrentUserInfo
().
getUserId
());
...
...
@@ -425,7 +438,9 @@ public class DeviceCheckController {
// 如果汇总完毕则将父级的统计任务推进
if
(
over
)
{
TaskBto
fatherTask
=
taskService
.
get
(
fatherTaskId
);
TaskBto
statTask
=
taskService
.
moveToNext
(
fatherTask
,
fatherTask
.
getLastUserId
());
//如果上一个id是-1 则证明是所有人的跟踪统计,即自动核查,那么下一步推进到所有人的待办
Integer
lastUserId
=
fatherTask
.
getLastUserId
()
==
-
1
?
0
:
fatherTask
.
getLastUserId
();
TaskBto
statTask
=
taskService
.
moveToNext
(
fatherTask
,
lastUserId
);
logService
.
addLog
(
new
TaskLogBto
(
statTask
.
getId
(),
"地区数据已统计完毕,等待确认"
,
new
ArrayList
<>(),
fatherTask
.
getFirstUserId
()));
}
log
.
info
(
"[核查模块] D 操作完毕"
);
...
...
@@ -468,8 +483,9 @@ public class DeviceCheckController {
// 如果所有子地区统计任务都已经完结,则推进父地区统计任务进度
boolean
allOver
=
taskService
.
TaskTreeIsOver
(
parentTaskId
);
if
(
allOver
)
{
TaskBto
statTask
=
taskService
.
moveToEnd
(
parentTask
);
logService
.
addLog
(
new
TaskLogBto
(
statTask
.
getId
(),
"统计数据确认操作"
));
log
.
info
(
"[核查任务] 所有市的核查统计任务已经完毕,推进省级的核查统计任务"
);
TaskBto
statTask
=
taskService
.
moveToNext
(
parentTask
,
0
);
logService
.
addLog
(
new
TaskLogBto
(
statTask
.
getId
(),
"省级统计任务状态推进"
));
}
}
...
...
dev-confirmcheck/src/main/java/com/tykj/dev/device/confirmcheck/repository/DeviceCheckDetailDao.java
浏览文件 @
b99865e2
...
...
@@ -21,7 +21,7 @@ public interface DeviceCheckDetailDao extends JpaRepository<DeviceCheckDetailEnt
*/
@Modifying
@Query
(
"update DeviceCheckDetailEntity o set o.checkDetail=?2,o.checkResult = ?3,o.userAId =?4,o.userBId=?5,o.checkedCount=?6 where o.id=?1"
)
void
updateCheckDetail
(
Integer
id
,
String
checkDetail
,
String
checkResult
,
int
userAId
,
int
userBId
,
long
checkedCount
);
void
updateCheckDetail
(
Integer
id
,
String
checkDetail
,
String
checkResult
,
int
userAId
,
int
userBId
,
Integer
checkedCount
);
@Modifying
@Query
(
"update DeviceCheckDetailEntity o set o.checkStatus=?2 where o.id=?1"
)
...
...
dev-union/src/test/java/com/tykj/dev/confirmcheck/DeviceCheckControllerTest.java
浏览文件 @
b99865e2
package
com
.
tykj
.
dev
.
confirmcheck
;
import
com.fasterxml.jackson.databind.JsonNode
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.github.wenhao.jpa.Specifications
;
import
com.google.common.collect.Lists
;
import
com.tykj.dev.device.confirmcheck.entity.vo.CheckBillVo
;
...
...
@@ -20,9 +22,11 @@ import org.springframework.test.context.ActiveProfiles;
import
org.springframework.test.web.servlet.MockMvc
;
import
org.springframework.test.web.servlet.RequestBuilder
;
import
java.io.IOException
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.StringJoiner
;
import
java.util.stream.StreamSupport
;
import
static
com
.
tykj
.
dev
.
misc
.
utils
.
JacksonUtil
.
toJSon
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
request
.
MockMvcRequestBuilders
.
post
;
...
...
@@ -63,9 +67,41 @@ class DeviceCheckControllerTest extends BaseTest {
request
=
post
(
"/check/confirm/check/auto"
)
.
header
(
"Origin"
,
"*"
);
mockMvc
.
perform
(
request
)
.
andExpect
(
status
().
isOk
())
.
andDo
(
mvcResult1
->
System
.
out
.
println
(
"[测试结果] 自动发起核查任务测试通过"
));
.
andDo
(
result
->
{
String
resultString
=
result
.
getResponse
().
getContentAsString
();
System
.
out
.
println
(
"[测试结果] 自动发起核查任务测试通过,返回结果为 : "
+
resultString
);
deleteAutoCheckData
(
resultString
);
});
}
private
void
deleteAutoCheckData
(
String
resultString
)
throws
IOException
{
ObjectMapper
objectMapper
=
new
ObjectMapper
();
JsonNode
jsonNode
=
objectMapper
.
readTree
(
resultString
);
StreamSupport
.
stream
(
jsonNode
.
get
(
"data"
).
get
(
"statId"
).
spliterator
(),
false
)
.
map
(
JsonNode:
:
asInt
)
.
forEach
(
statId
->
{
System
.
out
.
printf
(
"[数据清理-统计] 删除id为 %d 的统计数据 %n"
,
statId
);
statRepo
.
deleteById
(
statId
);
});
StreamSupport
.
stream
(
jsonNode
.
get
(
"data"
).
get
(
"detailId"
).
spliterator
(),
false
)
.
map
(
JsonNode:
:
asInt
)
.
forEach
(
detailId
->
{
System
.
out
.
printf
(
"[数据清理-自查] 删除id为 %d 的自查数据 %n"
,
detailId
);
detailRepo
.
deleteById
(
detailId
);
});
StreamSupport
.
stream
(
jsonNode
.
get
(
"data"
).
get
(
"taskId"
).
spliterator
(),
false
)
.
map
(
JsonNode:
:
asInt
)
.
forEach
(
taskId
->
{
System
.
out
.
printf
(
"[数据清理-任务] 删除id为 %d 的任务数据 %n"
,
taskId
);
taskRepo
.
deleteById
(
taskId
);
});
}
@Test
...
...
dev-union/src/test/java/com/tykj/dev/union/BaseTest.java
浏览文件 @
b99865e2
...
...
@@ -4,6 +4,7 @@ import org.junit.runner.RunWith;
import
org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
org.springframework.test.context.junit4.SpringRunner
;
import
org.springframework.transaction.annotation.Transactional
;
/**
* BaseTest.
...
...
@@ -14,5 +15,6 @@ import org.springframework.test.context.junit4.SpringRunner;
@RunWith
(
SpringRunner
.
class
)
@SpringBootTest
(
classes
=
UnionApplication
.
class
,
webEnvironment
=
SpringBootTest
.
WebEnvironment
.
RANDOM_PORT
)
@AutoConfigureMockMvc
@Transactional
public
class
BaseTest
{
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论