Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
3ed377d1
提交
3ed377d1
authored
12月 20, 2025
作者:
李智林
浏览文件
操作
浏览文件
下载
差异文件
update
上级
17e424f0
e641835b
显示空白字符变更
内嵌
并排
正在显示
20 个修改的文件
包含
3126 行增加
和
370 行删除
+3126
-370
exportControl.js
src/api/exportControl.js
+91
-0
index.vue
src/views/bill/billHome/index.vue
+107
-56
index.vue
src/views/decree/decreeHome/index.vue
+22
-17
fishbone-mock.json
...iews/exportControl/analysis/components/fishbone-mock.json
+11
-7
influencePanel1.vue
...ews/exportControl/analysis/components/influencePanel1.vue
+150
-29
influencePanel2.vue
...ews/exportControl/analysis/components/influencePanel2.vue
+1
-1
panel2.vue
src/views/exportControl/analysis/components/panel2.vue
+2
-2
pieCharts.vue
src/views/exportControl/analysis/components/pieCharts.vue
+1
-1
overview.vue
src/views/exportControl/analysis/content/overview.vue
+83
-155
dialog.vue
src/views/exportControl/components/dialog.vue
+3
-1
index.vue
src/views/exportControl/index.vue
+25
-7
charts.js
src/views/exportControl/utils/charts.js
+3
-1
index.vue
src/views/finance/index.vue
+7
-3
index.vue
src/views/innovationSubject/index.vue
+1
-2
index.vue
...views/marketAccessRestrictions/marketAccessHome/index.vue
+7
-3
index.vue
src/views/technologyFigures/index.vue
+85
-34
index.vue
src/views/thinkTank/index.vue
+115
-51
出口管制接口-4.md
出口管制接口-4.md
+1358
-0
出口管制接口.xlsx
出口管制接口.xlsx
+0
-0
出口管制接口new.md
出口管制接口new.md
+1054
-0
没有找到文件。
src/api/exportControl.js
浏览文件 @
3ed377d1
...
@@ -353,6 +353,24 @@ export function getEntitiesCountBy50PercentRules(
...
@@ -353,6 +353,24 @@ export function getEntitiesCountBy50PercentRules(
);
);
}
}
/**
* 获取前序事件
*/
// /entitiesDataInfo/precedingEvents
export
function
getPrecedingEvents
(
startTime
=
"2025-11-11"
,
pageNum
=
1
,
pageSize
=
10
)
{
return
request200
(
request
({
method
:
"POST"
,
url
:
"/api/entitiesDataInfo/precedingEvents"
,
data
:
{
sanctionDate
:
startTime
,
pageNum
,
pageSize
}
})
);
}
/**
/**
* 领域分布查询
* 领域分布查询
*/
*/
...
@@ -745,3 +763,76 @@ export function getKeyListedEntityList(date, keyword = "") {
...
@@ -745,3 +763,76 @@ export function getKeyListedEntityList(date, keyword = "") {
})
})
);
);
}
}
/**
* 获取科学仪器对美依赖数量
*/
export
function
getScientificInstrumentDependencyCount
(
orgIds
=
"12100000400012916R,121000004013595328,12100000435230200R"
)
{
return
request200
(
request
({
method
:
"GET"
,
url
:
"/api/instrument/getDependencyUS"
,
params
:
{
orgIds
}
})
);
}
/**
* 科学仪器近十年对美依赖度升高风险分析
* url: /instrument/getDependencyUSRisk
*/
export
function
getScientificInstrumentDependencyRisk
()
{
return
request200
(
request
({
method
:
"GET"
,
url
:
"/api/instrument/getDependencyUSRisk"
})
);
}
/**
* 科学仪器近十年国产化数量统计
* url:/instrument/getLocalizationRisk
*/
export
function
getScientificInstrumentLocalizationRisk
()
{
return
request200
(
request
({
method
:
"GET"
,
url
:
"/api/instrument/getLocalizationRisk"
})
);
}
/**
* 科学仪器进口国统计
* url: /instrument/getOriginCount
*/
export
function
getScientificInstrumentOriginCount
(
orgIds
=
"12100000400012916R,121000004013595328,12100000435230200R"
)
{
return
request200
(
request
({
method
:
"GET"
,
url
:
"/api/instrument/getOriginCount"
,
params
:
{
orgIds
}
})
);
}
/**
* 新增科研机构列表
* url: /entitiesDataInfo/scientificImpact/entityList
*/
export
function
getScientificImpactEntityList
(
startTime
)
{
return
request200
(
request
({
method
:
"GET"
,
url
:
"/api/entitiesDataInfo/scientificImpact/entityList"
,
params
:
{
sanctionDate
:
startTime
||
"2025-11-11"
}
})
);
}
src/views/bill/billHome/index.vue
浏览文件 @
3ed377d1
...
@@ -84,7 +84,6 @@
...
@@ -84,7 +84,6 @@
<div
class=
"btn-icon"
>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
</div>
</div>
<div
class=
"btn"
@
click=
"handleToPosi('position2')"
>
<div
class=
"btn"
@
click=
"handleToPosi('position2')"
>
<div
class=
"btn-text"
>
{{
"资讯要闻"
}}
</div>
<div
class=
"btn-text"
>
{{
"资讯要闻"
}}
</div>
...
@@ -224,11 +223,7 @@
...
@@ -224,11 +223,7 @@
</div>
</div>
</div>
</div>
<div
class=
"box2-main"
>
<div
class=
"box2-main"
>
<div
<div
class=
"box2-main-item"
v-for=
"(item, index) in warningList"
:key=
"index"
>
class=
"box2-main-item"
v-for=
"(item, index) in warningList"
:key=
"index"
>
<div
<div
class=
"item-left"
class=
"item-left"
:class=
"
{
:class=
"
{
...
@@ -267,14 +262,21 @@
...
@@ -267,14 +262,21 @@
</div>
</div>
</div>
</div>
<div
class=
"box3-main"
>
<div
class=
"box3-main"
>
<div
class=
"box3-item"
v-for=
"(news, index) in newsList"
:key=
"index"
@
click=
"handleClickToNewsDetail()"
>
<div
class=
"box3-item"
v-for=
"(news, index) in newsList"
:key=
"index"
@
click=
"handleClickToNewsDetail()"
>
<div
class=
"left"
>
<div
class=
"left"
>
<img
:src=
"news.newsImage || News1"
alt=
""
/>
<img
:src=
"news.newsImage || News1"
alt=
""
/>
</div>
</div>
<div
class=
"right"
>
<div
class=
"right"
>
<div
class=
"right-top"
>
<div
class=
"right-top"
>
<div
class=
"title"
>
{{
news
.
newsTitle
}}
</div>
<div
class=
"title"
>
{{
news
.
newsTitle
}}
</div>
<div
class=
"time"
>
{{
news
.
newsDate
?
news
.
newsDate
.
slice
(
5
)
:
''
}}
-
{{
news
.
newsOrg
}}
</div>
<div
class=
"time"
>
{{
news
.
newsDate
?
news
.
newsDate
.
slice
(
5
)
:
""
}}
-
{{
news
.
newsOrg
}}
</div>
</div>
</div>
<div
class=
"right-footer"
>
{{
news
.
newsContent
}}
</div>
<div
class=
"right-footer"
>
{{
news
.
newsContent
}}
</div>
</div>
</div>
...
@@ -322,14 +324,26 @@
...
@@ -322,14 +324,26 @@
</div>
</div>
</div>
</div>
<div
class=
"box5-select"
>
<div
class=
"box5-select"
>
<el-select
v-model=
"box5Select"
placeholder=
"选择领域"
@
change=
"handleBox5Change"
style=
"width: 150px"
>
<el-select
v-model=
"box5Select"
placeholder=
"选择领域"
@
change=
"handleBox5Change"
style=
"width: 150px"
>
<el-option
label=
"全部领域"
value=
"全部领域"
/>
<el-option
label=
"全部领域"
value=
"全部领域"
/>
<el-option
v-for=
"item in categoryList"
:key=
"item.id"
:label=
"item.name"
:value=
"item.id"
/>
<el-option
v-for=
"item in categoryList"
:key=
"item.id"
:label=
"item.name"
:value=
"item.id"
/>
</el-select>
</el-select>
</div>
</div>
<div
class=
"box5-main"
:style=
"
{ display: !box5HasData ? 'flex' : 'block', justifyContent: 'center', alignItems: 'center' }">
<div
class=
"box5-main"
:style=
"
{
display: !box5HasData ? 'flex' : 'block',
justifyContent: 'center',
alignItems: 'center'
}"
>
<el-empty
v-if=
"!box5HasData"
description=
"暂无数据"
:image-size=
"100"
/>
<el-empty
v-if=
"!box5HasData"
description=
"暂无数据"
:image-size=
"100"
/>
<div
v-else
id=
"box5Chart"
style=
"width: 100%; height: 100%
;
"
></div>
<div
v-else
id=
"box5Chart"
style=
"width: 100%; height: 100%"
></div>
</div>
</div>
</div>
</div>
<div
class=
"box6"
>
<div
class=
"box6"
>
...
@@ -374,9 +388,16 @@
...
@@ -374,9 +388,16 @@
/>
/>
</el-select>
</el-select>
</div>
</div>
<div
class=
"box7-main"
:style=
"
{ display: !box7HasData ? 'flex' : 'block', justifyContent: 'center', alignItems: 'center' }">
<div
class=
"box7-main"
:style=
"
{
display: !box7HasData ? 'flex' : 'block',
justifyContent: 'center',
alignItems: 'center'
}"
>
<el-empty
v-if=
"!box7HasData"
description=
"暂无数据"
:image-size=
"100"
/>
<el-empty
v-if=
"!box7HasData"
description=
"暂无数据"
:image-size=
"100"
/>
<div
v-else
id=
"box7Chart"
style=
"width: 100%; height: 100%
;
"
></div>
<div
v-else
id=
"box7Chart"
style=
"width: 100%; height: 100%"
></div>
</div>
</div>
</div>
</div>
<div
class=
"box8"
>
<div
class=
"box8"
>
...
@@ -404,7 +425,14 @@
...
@@ -404,7 +425,14 @@
/>
/>
</el-select>
</el-select>
</div>
</div>
<div
class=
"box8-main"
:style=
"
{ display: box8Data.length === 0 ? 'flex' : 'block', justifyContent: 'center', alignItems: 'center' }">
<div
class=
"box8-main"
:style=
"
{
display: box8Data.length === 0 ? 'flex' : 'block',
justifyContent: 'center',
alignItems: 'center'
}"
>
<el-empty
v-if=
"box8Data.length === 0"
description=
"暂无数据"
:image-size=
"100"
/>
<el-empty
v-if=
"box8Data.length === 0"
description=
"暂无数据"
:image-size=
"100"
/>
<div
<div
v-else
v-else
...
@@ -457,9 +485,16 @@
...
@@ -457,9 +485,16 @@
/>
/>
<
/el-select
>
<
/el-select
>
<
/div
>
<
/div
>
<
div
class
=
"box9-main"
:
style
=
"{ display: !box9HasData ? 'flex' : 'block', justifyContent: 'center', alignItems: 'center'
}
"
>
<
div
class
=
"box9-main"
:
style
=
"{
display: !box9HasData ? 'flex' : 'block',
justifyContent: 'center',
alignItems: 'center'
}
"
>
<
el
-
empty
v
-
if
=
"!box9HasData"
description
=
"暂无数据"
:
image
-
size
=
"100"
/>
<
el
-
empty
v
-
if
=
"!box9HasData"
description
=
"暂无数据"
:
image
-
size
=
"100"
/>
<
div
v
-
else
id
=
"box9Chart"
style
=
"width: 100%; height: 100%
;
"
><
/div
>
<
div
v
-
else
id
=
"box9Chart"
style
=
"width: 100%; height: 100%"
><
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
...
@@ -479,7 +514,6 @@
...
@@ -479,7 +514,6 @@
{{
cate
.
name
}}
{{
cate
.
name
}}
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
div
class
=
"home-main-footer-main"
>
<
div
class
=
"home-main-footer-main"
>
<
div
class
=
"left"
>
<
div
class
=
"left"
>
...
@@ -490,9 +524,7 @@
...
@@ -490,9 +524,7 @@
<
/div
>
<
/div
>
<
div
class
=
"select-main"
>
<
div
class
=
"select-main"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"activeAreaList"
@
change
=
"handleAreaChange"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"activeAreaList"
@
change
=
"handleAreaChange"
>
<
el
-
checkbox
class
=
"filter-checkbox"
label
=
"全部领域"
>
<
el
-
checkbox
class
=
"filter-checkbox"
label
=
"全部领域"
>
全部领域
<
/el-checkbox
>
全部领域
<
/el-checkbox
>
<
el
-
checkbox
<
el
-
checkbox
v
-
for
=
"(area, index) in cateKuList"
v
-
for
=
"(area, index) in cateKuList"
:
key
=
"area.id"
:
key
=
"area.id"
...
@@ -563,7 +595,12 @@
...
@@ -563,7 +595,12 @@
<
div
class
=
"right"
>
<
div
class
=
"right"
>
<
div
class
=
"right-header"
>
<
div
class
=
"right-header"
>
<
div
class
=
"right-header-box"
>
<
div
class
=
"right-header-box"
>
<
el
-
select
v
-
model
=
"footerSelect1"
placeholder
=
"选择委员会"
style
=
"width: 240px"
@
change
=
"handleFooterSelect1Change"
>
<
el
-
select
v
-
model
=
"footerSelect1"
placeholder
=
"选择委员会"
style
=
"width: 240px"
@
change
=
"handleFooterSelect1Change"
>
<
el
-
option
<
el
-
option
v
-
for
=
"item in postOrgList"
v
-
for
=
"item in postOrgList"
:
key
=
"item.departmentId"
:
key
=
"item.departmentId"
...
@@ -573,7 +610,12 @@
...
@@ -573,7 +610,12 @@
<
/el-select
>
<
/el-select
>
<
/div
>
<
/div
>
<
div
class
=
"right-header-box"
>
<
div
class
=
"right-header-box"
>
<
el
-
select
v
-
model
=
"footerSelect2"
placeholder
=
"选择提出议员"
style
=
"width: 240px"
@
change
=
"handleFooterSelect2Change"
>
<
el
-
select
v
-
model
=
"footerSelect2"
placeholder
=
"选择提出议员"
style
=
"width: 240px"
@
change
=
"handleFooterSelect2Change"
>
<
el
-
option
<
el
-
option
v
-
for
=
"item in postMemberList"
v
-
for
=
"item in postMemberList"
:
key
=
"item.memberId"
:
key
=
"item.memberId"
...
@@ -582,8 +624,13 @@
...
@@ -582,8 +624,13 @@
/>
/>
<
/el-select
>
<
/el-select
>
<
/div
>
<
/div
>
<
div
class
=
"right-header-box"
style
=
"margin-left: auto;"
>
<
div
class
=
"right-header-box"
style
=
"margin-left: auto"
>
<
el
-
select
v
-
model
=
"releaseTime"
placeholder
=
"选择排序方式"
style
=
"width: 120px"
@
change
=
"handlePxChange"
>
<
el
-
select
v
-
model
=
"releaseTime"
placeholder
=
"选择排序方式"
style
=
"width: 120px"
@
change
=
"handlePxChange"
>
<
el
-
option
<
el
-
option
v
-
for
=
"item in releaseTimeList"
v
-
for
=
"item in releaseTimeList"
:
key
=
"item.value"
:
key
=
"item.value"
...
@@ -594,7 +641,16 @@
...
@@ -594,7 +641,16 @@
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
div
class
=
"right-main"
v
-
loading
=
"loading"
>
<
div
class
=
"right-main"
v
-
loading
=
"loading"
>
<<<<<<<
HEAD
<
div
class
=
"right-main-box"
v
-
for
=
"(item, index) in bills"
:
key
=
"index"
@
click
=
"handleClickToDetailO(item)"
>
<
div
class
=
"right-main-box"
v
-
for
=
"(item, index) in bills"
:
key
=
"index"
@
click
=
"handleClickToDetailO(item)"
>
=======
<
div
class
=
"right-main-box"
v
-
for
=
"(item, index) in bills"
:
key
=
"index"
@
click
=
"handleClickToDetail()"
>
>>>>>>>
e641835b10377b442772bb20faa9c6a12d09b494
<
div
class
=
"header"
>
<
div
class
=
"header"
>
<
div
class
=
"title"
>
{{
item
.
name
}}
<
/div
>
<
div
class
=
"title"
>
{{
item
.
name
}}
<
/div
>
<
div
class
=
"en-title"
>
{{
item
.
eName
}}
<
/div
>
<
div
class
=
"en-title"
>
{{
item
.
eName
}}
<
/div
>
...
@@ -721,13 +777,13 @@ import { iteratee } from "lodash";
...
@@ -721,13 +777,13 @@ import { iteratee } from "lodash";
const
searchBillText
=
ref
(
""
);
const
searchBillText
=
ref
(
""
);
const
formatMessageTime
=
(
timeStr
)
=>
{
const
formatMessageTime
=
timeStr
=>
{
if
(
!
timeStr
)
return
''
;
if
(
!
timeStr
)
return
""
;
// 假设格式为 2025-11-02T12:09:45
// 假设格式为 2025-11-02T12:09:45
if
(
timeStr
.
includes
(
'T'
))
{
if
(
timeStr
.
includes
(
"T"
))
{
const
[
date
,
time
]
=
timeStr
.
split
(
'T'
);
const
[
date
,
time
]
=
timeStr
.
split
(
"T"
);
const
[
year
,
month
,
day
]
=
date
.
split
(
'-'
);
const
[
year
,
month
,
day
]
=
date
.
split
(
"-"
);
const
[
hour
,
minute
]
=
time
.
split
(
':'
);
const
[
hour
,
minute
]
=
time
.
split
(
":"
);
return
`${year
}
-${month
}
-${day
}
${hour
}
:${minute
}
`
;
return
`${year
}
-${month
}
-${day
}
${hour
}
:${minute
}
`
;
}
}
return
timeStr
;
return
timeStr
;
...
@@ -1019,7 +1075,6 @@ const categoryList = ref([]);
...
@@ -1019,7 +1075,6 @@ const categoryList = ref([]);
// 资源库使用的领域分类列表
// 资源库使用的领域分类列表
const
cateKuList
=
ref
([]);
const
cateKuList
=
ref
([]);
// 获取领域分类
// 获取领域分类
const
handleGetHylyList
=
async
()
=>
{
const
handleGetHylyList
=
async
()
=>
{
try
{
try
{
...
@@ -1096,10 +1151,7 @@ const handleGetPostOrgList = async () => {
...
@@ -1096,10 +1151,7 @@ const handleGetPostOrgList = async () => {
console
.
log
(
"提出部门列表"
,
res
);
console
.
log
(
"提出部门列表"
,
res
);
if
(
res
.
code
===
200
)
{
if
(
res
.
code
===
200
)
{
const
list
=
res
.
data
.
filter
(
item
=>
item
.
departmentId
);
const
list
=
res
.
data
.
filter
(
item
=>
item
.
departmentId
);
postOrgList
.
value
=
[
postOrgList
.
value
=
[{
departmentName
:
"全部委员会"
,
departmentId
:
"全部委员会"
}
,
...
list
];
{
departmentName
:
"全部委员会"
,
departmentId
:
"全部委员会"
}
,
...
list
];
}
}
}
catch
(
error
)
{
}
}
catch
(
error
)
{
}
}
;
}
;
...
@@ -1112,10 +1164,7 @@ const handleGetPostMemberList = async () => {
...
@@ -1112,10 +1164,7 @@ const handleGetPostMemberList = async () => {
console
.
log
(
"提出议员列表"
,
res
);
console
.
log
(
"提出议员列表"
,
res
);
if
(
res
.
code
===
200
)
{
if
(
res
.
code
===
200
)
{
const
list
=
res
.
data
.
filter
(
item
=>
item
.
memberId
);
const
list
=
res
.
data
.
filter
(
item
=>
item
.
memberId
);
postMemberList
.
value
=
[
postMemberList
.
value
=
[{
memberName
:
"全部提出议员"
,
memberId
:
"全部提出议员"
}
,
...
list
];
{
memberName
:
"全部提出议员"
,
memberId
:
"全部提出议员"
}
,
...
list
];
}
}
}
catch
(
error
)
{
}
}
catch
(
error
)
{
}
}
;
}
;
...
@@ -1142,25 +1191,25 @@ const handleGetBills = async () => {
...
@@ -1142,25 +1191,25 @@ const handleGetBills = async () => {
}
;
}
;
if
(
!
activeYyList
.
value
.
includes
(
"全部议院"
))
{
if
(
!
activeYyList
.
value
.
includes
(
"全部议院"
))
{
params
.
congressIds
=
activeYyList
.
value
.
join
(
','
);
params
.
congressIds
=
activeYyList
.
value
.
join
(
","
);
}
}
if
(
footerSelect1
.
value
!==
"全部委员会"
)
{
if
(
footerSelect1
.
value
!==
"全部委员会"
)
{
params
.
departmentId
=
footerSelect1
.
value
;
params
.
departmentId
=
footerSelect1
.
value
;
}
}
if
(
!
activeDpList
.
value
.
includes
(
"全部党派"
))
{
if
(
!
activeDpList
.
value
.
includes
(
"全部党派"
))
{
params
.
partyIds
=
activeDpList
.
value
.
join
(
','
);
params
.
partyIds
=
activeDpList
.
value
.
join
(
","
);
}
}
if
(
footerSelect2
.
value
!==
"全部提出议员"
)
{
if
(
footerSelect2
.
value
!==
"全部提出议员"
)
{
params
.
personId
=
footerSelect2
.
value
;
params
.
personId
=
footerSelect2
.
value
;
}
}
if
(
!
activeAreaList
.
value
.
includes
(
"全部领域"
))
{
if
(
!
activeAreaList
.
value
.
includes
(
"全部领域"
))
{
params
.
researchIds
=
activeAreaList
.
value
.
join
(
','
);
params
.
researchIds
=
activeAreaList
.
value
.
join
(
","
);
}
}
if
(
releaseTime
.
value
!==
true
)
{
if
(
releaseTime
.
value
!==
true
)
{
params
.
sortFun
=
releaseTime
.
value
;
params
.
sortFun
=
releaseTime
.
value
;
}
}
if
(
!
activePubTime
.
value
.
includes
(
"全部时间"
))
{
if
(
!
activePubTime
.
value
.
includes
(
"全部时间"
))
{
params
.
years
=
activePubTime
.
value
.
join
(
','
);
params
.
years
=
activePubTime
.
value
.
join
(
","
);
}
}
try
{
try
{
...
@@ -1183,13 +1232,13 @@ const handleGetBills = async () => {
...
@@ -1183,13 +1232,13 @@ const handleGetBills = async () => {
bills
.
value
=
[];
bills
.
value
=
[];
total
.
value
=
0
;
total
.
value
=
0
;
}
}
}
else
{
}
else
{
bills
.
value
=
[];
bills
.
value
=
[];
total
.
value
=
0
;
total
.
value
=
0
;
}
}
loading
.
value
=
false
;
loading
.
value
=
false
;
}
catch
(
error
)
{
}
catch
(
error
)
{
if
(
error
.
name
!==
'AbortError'
)
{
if
(
error
.
name
!==
"AbortError"
)
{
console
.
error
(
error
);
console
.
error
(
error
);
loading
.
value
=
false
;
loading
.
value
=
false
;
}
}
...
@@ -1197,19 +1246,19 @@ const handleGetBills = async () => {
...
@@ -1197,19 +1246,19 @@ const handleGetBills = async () => {
}
;
}
;
// 处理选择委员会变化
// 处理选择委员会变化
const
handleFooterSelect1Change
=
(
val
)
=>
{
const
handleFooterSelect1Change
=
val
=>
{
console
.
log
(
"选择委员会变化"
,
val
);
console
.
log
(
"选择委员会变化"
,
val
);
// 等会再做处理
// 等会再做处理
handleGetBills
();
handleGetBills
();
}
;
}
;
// 处理选择议员变化
// 处理选择议员变化
const
handleFooterSelect2Change
=
(
val
)
=>
{
const
handleFooterSelect2Change
=
val
=>
{
console
.
log
(
"选择议员变化"
,
val
);
console
.
log
(
"选择议员变化"
,
val
);
// 等会再做处理
// 等会再做处理
handleGetBills
();
handleGetBills
();
}
;
}
;
// 处理选择排序方式变化
// 处理选择排序方式变化
const
handlePxChange
=
(
val
)
=>
{
const
handlePxChange
=
val
=>
{
console
.
log
(
"选择排序方式变化"
,
val
);
console
.
log
(
"选择排序方式变化"
,
val
);
// 等会再做处理
// 等会再做处理
handleGetBills
();
handleGetBills
();
...
@@ -1321,7 +1370,9 @@ const handleBox5 = async () => {
...
@@ -1321,7 +1370,9 @@ const handleBox5 = async () => {
await
nextTick
();
await
nextTick
();
const
proposed
=
box5Data
.
value
.
data
[
0
].
value
;
const
proposed
=
box5Data
.
value
.
data
[
0
].
value
;
const
passed
=
box5Data
.
value
.
data
[
1
].
value
;
const
passed
=
box5Data
.
value
.
data
[
1
].
value
;
const
rate
=
box5Data
.
value
.
percent
||
proposed
.
map
((
p
,
i
)
=>
{
const
rate
=
box5Data
.
value
.
percent
||
proposed
.
map
((
p
,
i
)
=>
{
const
pass
=
passed
[
i
]
||
0
;
const
pass
=
passed
[
i
]
||
0
;
return
p
?
((
pass
/
p
)
*
100
).
toFixed
(
2
)
:
0
;
return
p
?
((
pass
/
p
)
*
100
).
toFixed
(
2
)
:
0
;
}
);
}
);
...
@@ -1541,7 +1592,7 @@ const handleClickTab = tab => {
...
@@ -1541,7 +1592,7 @@ const handleClickTab = tab => {
}
;
}
;
const
activeAreaList
=
ref
([
"全部领域"
]);
const
activeAreaList
=
ref
([
"全部领域"
]);
const
handleAreaChange
=
(
val
)
=>
{
const
handleAreaChange
=
val
=>
{
if
(
val
.
includes
(
"全部领域"
)
&&
val
.
length
>
1
)
{
if
(
val
.
includes
(
"全部领域"
)
&&
val
.
length
>
1
)
{
if
(
val
[
val
.
length
-
1
]
===
"全部领域"
)
{
if
(
val
[
val
.
length
-
1
]
===
"全部领域"
)
{
activeAreaList
.
value
=
[
"全部领域"
];
activeAreaList
.
value
=
[
"全部领域"
];
...
@@ -1563,7 +1614,7 @@ const dpList = ref([
...
@@ -1563,7 +1614,7 @@ const dpList = ref([
]);
]);
const
activeDpList
=
ref
([
"全部党派"
]);
const
activeDpList
=
ref
([
"全部党派"
]);
// 处理选择党派变化
// 处理选择党派变化
const
handleDpChange
=
(
val
)
=>
{
const
handleDpChange
=
val
=>
{
if
(
val
.
includes
(
"全部党派"
)
&&
val
.
length
>
1
)
{
if
(
val
.
includes
(
"全部党派"
)
&&
val
.
length
>
1
)
{
if
(
val
[
val
.
length
-
1
]
===
"全部党派"
)
{
if
(
val
[
val
.
length
-
1
]
===
"全部党派"
)
{
activeDpList
.
value
=
[
"全部党派"
];
activeDpList
.
value
=
[
"全部党派"
];
...
@@ -1584,7 +1635,7 @@ const yyList = ref([
...
@@ -1584,7 +1635,7 @@ const yyList = ref([
]);
]);
const
activeYyList
=
ref
([
"全部议院"
]);
const
activeYyList
=
ref
([
"全部议院"
]);
// 处理选择议院变化
// 处理选择议院变化
const
handleYyChange
=
(
val
)
=>
{
const
handleYyChange
=
val
=>
{
if
(
val
.
includes
(
"全部议院"
)
&&
val
.
length
>
1
)
{
if
(
val
.
includes
(
"全部议院"
)
&&
val
.
length
>
1
)
{
if
(
val
[
val
.
length
-
1
]
===
"全部议院"
)
{
if
(
val
[
val
.
length
-
1
]
===
"全部议院"
)
{
activeYyList
.
value
=
[
"全部议院"
];
activeYyList
.
value
=
[
"全部议院"
];
...
@@ -1604,12 +1655,12 @@ const pubTime = ref([
...
@@ -1604,12 +1655,12 @@ const pubTime = ref([
{
id
:
"2024"
,
name
:
"2024年"
}
,
{
id
:
"2024"
,
name
:
"2024年"
}
,
{
id
:
"2023"
,
name
:
"2023年"
}
,
{
id
:
"2023"
,
name
:
"2023年"
}
,
{
id
:
"2022"
,
name
:
"2022年"
}
,
{
id
:
"2022"
,
name
:
"2022年"
}
,
{
id
:
"2021"
,
name
:
"2021年"
}
,
{
id
:
"2021"
,
name
:
"2021年"
}
//
{
id
:
"更早时间"
,
name
:
"更早时间"
}
//
{
id
:
"更早时间"
,
name
:
"更早时间"
}
]);
]);
const
activePubTime
=
ref
([
"全部时间"
]);
const
activePubTime
=
ref
([
"全部时间"
]);
// 处理选择时间变化
// 处理选择时间变化
const
handlePubTimeChange
=
(
val
)
=>
{
const
handlePubTimeChange
=
val
=>
{
if
(
val
.
includes
(
"全部时间"
)
&&
val
.
length
>
1
)
{
if
(
val
.
includes
(
"全部时间"
)
&&
val
.
length
>
1
)
{
if
(
val
[
val
.
length
-
1
]
===
"全部时间"
)
{
if
(
val
[
val
.
length
-
1
]
===
"全部时间"
)
{
activePubTime
.
value
=
[
"全部时间"
];
activePubTime
.
value
=
[
"全部时间"
];
...
@@ -1801,6 +1852,8 @@ onUnmounted(() => {});
...
@@ -1801,6 +1852,8 @@ onUnmounted(() => {});
.
home
-
box
{
.
home
-
box
{
width
:
100
%
;
width
:
100
%
;
height
:
100
%
;
height
:
100
%
;
background
:
url
(
"./assets/images/background.png"
);
background
-
size
:
100
%
100
%
;
overflow
-
y
:
auto
;
overflow
-
y
:
auto
;
.
home
-
header
{
.
home
-
header
{
height
:
64
px
;
height
:
64
px
;
...
@@ -1828,8 +1881,6 @@ onUnmounted(() => {});
...
@@ -1828,8 +1881,6 @@ onUnmounted(() => {});
width
:
1600
px
;
width
:
1600
px
;
margin
:
0
auto
;
margin
:
0
auto
;
margin
-
top
:
48
px
;
margin
-
top
:
48
px
;
background
:
url
(
"./assets/images/background.png"
);
background
-
size
:
100
%
100
%
;
.
home
-
main
-
header
{
.
home
-
main
-
header
{
display
:
flex
;
display
:
flex
;
flex
-
direction
:
column
;
flex
-
direction
:
column
;
...
...
src/views/decree/decreeHome/index.vue
浏览文件 @
3ed377d1
...
@@ -106,7 +106,7 @@
...
@@ -106,7 +106,7 @@
<div
class=
"home-main-header-item-box"
>
<div
class=
"home-main-header-item-box"
>
<div
class=
"item"
v-for=
"(item, index) in govInsList"
:key=
"index"
@
click=
"handleToInstitution(item)"
>
<div
class=
"item"
v-for=
"(item, index) in govInsList"
:key=
"index"
@
click=
"handleToInstitution(item)"
>
<div
class=
"item-left"
>
<div
class=
"item-left"
>
<img
:src=
"item.img
?item.img
: DefaultIcon2"
alt=
""
/>
<img
:src=
"item.img
? item.img
: DefaultIcon2"
alt=
""
/>
</div>
</div>
<div
class=
"item-right"
>
{{
item
.
name
}}
</div>
<div
class=
"item-right"
>
{{
item
.
name
}}
</div>
</div>
</div>
...
@@ -335,7 +335,6 @@
...
@@ -335,7 +335,6 @@
<DivideHeader
id=
"position4"
class=
"divide4"
:titleText=
"'资源库'"
></DivideHeader>
<DivideHeader
id=
"position4"
class=
"divide4"
:titleText=
"'资源库'"
></DivideHeader>
<div
class=
"home-main-footer-header"
>
<div
class=
"home-main-footer-header"
>
<div
class=
"btn-box"
>
<div
class=
"btn-box"
>
<div
<div
class=
"btn"
class=
"btn"
:class=
"
{ btnActive: activeCate === cate.id }"
:class=
"
{ btnActive: activeCate === cate.id }"
...
@@ -345,7 +344,6 @@
...
@@ -345,7 +344,6 @@
>
>
{{
cate
.
name
}}
{{
cate
.
name
}}
</div>
</div>
</div>
</div>
<div
class=
"select-box"
>
<div
class=
"select-box"
>
<div
class=
"paixu-btn"
@
click=
"handleSwithSort"
>
<div
class=
"paixu-btn"
@
click=
"handleSwithSort"
>
...
@@ -375,6 +373,7 @@
...
@@ -375,6 +373,7 @@
:key=
"time.id"
:key=
"time.id"
v-model=
"activePubTime"
v-model=
"activePubTime"
:label=
"time.id"
:label=
"time.id"
style=
"width: 100px"
class=
"filter-checkbox"
class=
"filter-checkbox"
>
>
{{
time
.
name
}}
{{
time
.
name
}}
...
@@ -414,13 +413,13 @@
...
@@ -414,13 +413,13 @@
class=
"main-item"
class=
"main-item"
v-for=
"(item, index) in curDecreeList"
v-for=
"(item, index) in curDecreeList"
:key=
"index"
:key=
"index"
@
click=
"handleClick
ToDetail
"
@
click=
"handleClick
Decree(item)
"
>
>
<div
class=
"main-item-left"
>
<div
class=
"main-item-left"
>
<div
class=
"left-left"
>
{{
item
.
time
}}
</div>
<div
class=
"left-left"
>
{{
item
.
time
}}
</div>
<div
class=
"left-right"
>
<div
class=
"left-right"
>
<div
class=
"icon"
>
<div
class=
"icon"
>
<img
:src=
"item.orgImage
?item.orgImage:DefaultIcon2"
alt=
""
>
<img
:src=
"item.orgImage
? item.orgImage : DefaultIcon2"
alt=
""
/
>
</div>
</div>
<div
class=
"line"
v-if=
"index !== 9 && index !== totalDecreesNum - 1"
></div>
<div
class=
"line"
v-if=
"index !== 9 && index !== totalDecreesNum - 1"
></div>
</div>
</div>
...
@@ -497,8 +496,8 @@ import getCalendarHeatChart from "./utils/cleandarHeat";
...
@@ -497,8 +496,8 @@ import getCalendarHeatChart from "./utils/cleandarHeat";
import
setChart
from
"@/utils/setChart"
;
import
setChart
from
"@/utils/setChart"
;
import
DefaultIcon1
from
'@/assets/icons/default-icon1.png'
import
DefaultIcon1
from
"@/assets/icons/default-icon1.png"
;
import
DefaultIcon2
from
'@/assets/icons/default-icon2.png'
import
DefaultIcon2
from
"@/assets/icons/default-icon2.png"
;
import
p1
from
"./assets/images/iconp1.png"
;
import
p1
from
"./assets/images/iconp1.png"
;
import
p2
from
"./assets/images/iconp2.png"
;
import
p2
from
"./assets/images/iconp2.png"
;
...
@@ -534,10 +533,8 @@ import Message3 from "./assets/images/message-icon3.png";
...
@@ -534,10 +533,8 @@ import Message3 from "./assets/images/message-icon3.png";
// 跳转行政机构主页
// 跳转行政机构主页
const
handleToInstitution
=
item
=>
{
const
handleToInstitution
=
item
=>
{
if
(
item
.
name
===
"美国商务部"
)
{
const
curRoute
=
router
.
resolve
(
"/institution"
);
const
curRoute
=
router
.
resolve
(
"/institution"
);
window
.
open
(
curRoute
.
href
,
"_blank"
);
window
.
open
(
curRoute
.
href
,
"_blank"
);
}
}
;
}
;
// 返回首页
// 返回首页
...
@@ -689,6 +686,17 @@ const handleClickToDetail = () => {
...
@@ -689,6 +686,17 @@ const handleClickToDetail = () => {
window
.
open
(
route
.
href
,
"_blank"
);
window
.
open
(
route
.
href
,
"_blank"
);
}
;
}
;
// 点击政令库政令
const
handleClickDecree
=
decree
=>
{
const
route
=
router
.
resolve
({
path
:
"/decreeLayout"
,
query
:
{
id
:
decree
.
id
}
}
);
window
.
open
(
route
.
href
,
"_blank"
);
}
;
// 风险信号
// 风险信号
const
warningList
=
ref
([
const
warningList
=
ref
([
{
{
...
@@ -780,7 +788,6 @@ const messageList = ref([
...
@@ -780,7 +788,6 @@ const messageList = ref([
// time: "14:49 · 发布于X",
// time: "14:49 · 发布于X",
// content: `如果这个疯狂的支出法案获得通过,‘美国党’将在第二天成立。`
// content: `如果这个疯狂的支出法案获得通过,‘美国党’将在第二天成立。`
//
}
//
}
]);
]);
const
handleGetMessage
=
async
()
=>
{
const
handleGetMessage
=
async
()
=>
{
const
params
=
{
const
params
=
{
...
@@ -854,7 +861,6 @@ const chart2Data = ref([
...
@@ -854,7 +861,6 @@ const chart2Data = ref([
// name: "人工智能",
// name: "人工智能",
// value: 46
// value: 46
//
}
,
//
}
,
]);
]);
// const colorList = ["#69B1FF", "#FFC069", "#87E8DE", "#85A5FF", "#FF7875", "#B37FEB", "#4096FF"];
// const colorList = ["#69B1FF", "#FFC069", "#87E8DE", "#85A5FF", "#FF7875", "#B37FEB", "#4096FF"];
...
@@ -892,7 +898,6 @@ const keyDecreeList = ref([
...
@@ -892,7 +898,6 @@ const keyDecreeList = ref([
// time: "2025年2月",
// time: "2025年2月",
// content: `将中国列为“外国对手”,系统性收紧中美在半导体、人工智能、量子技术等前沿科技领域的双向投资,构建对华科技封锁体系。`
// content: `将中国列为“外国对手”,系统性收紧中美在半导体、人工智能、量子技术等前沿科技领域的双向投资,构建对华科技封锁体系。`
//
}
,
//
}
,
]);
]);
const
handleGetKeyDecree
=
async
()
=>
{
const
handleGetKeyDecree
=
async
()
=>
{
...
@@ -1857,7 +1862,7 @@ onMounted(async () => {
...
@@ -1857,7 +1862,7 @@ onMounted(async () => {
height
:
402
px
;
height
:
402
px
;
overflow
-
y
:
auto
;
overflow
-
y
:
auto
;
overflow
-
x
:
hidden
;
overflow
-
x
:
hidden
;
padding
-
top
:
6
px
;
padding
:
6
px
0
;
.
box3
-
item
{
.
box3
-
item
{
display
:
flex
;
display
:
flex
;
height
:
77
px
;
height
:
77
px
;
...
@@ -1967,7 +1972,7 @@ onMounted(async () => {
...
@@ -1967,7 +1972,7 @@ onMounted(async () => {
height
:
402
px
;
height
:
402
px
;
overflow
-
y
:
auto
;
overflow
-
y
:
auto
;
box
-
sizing
:
border
-
box
;
box
-
sizing
:
border
-
box
;
padding
-
top
:
8
px
;
padding
-
bottom
:
8
px
;
.
box4
-
main
-
item
{
.
box4
-
main
-
item
{
margin
-
top
:
16
px
;
margin
-
top
:
16
px
;
display
:
flex
;
display
:
flex
;
...
@@ -2601,7 +2606,8 @@ onMounted(async () => {
...
@@ -2601,7 +2606,8 @@ onMounted(async () => {
}
}
}
}
.
box7
-
main
{
.
box7
-
main
{
height
:
400
px
;
margin
-
top
:
10
px
;
height
:
380
px
;
box
-
sizing
:
border
-
box
;
box
-
sizing
:
border
-
box
;
overflow
-
y
:
auto
;
overflow
-
y
:
auto
;
overflow
-
x
:
hidden
;
overflow
-
x
:
hidden
;
...
@@ -2756,7 +2762,6 @@ onMounted(async () => {
...
@@ -2756,7 +2762,6 @@ onMounted(async () => {
background
:
rgba
(
20
,
89
,
187
,
1
);
background
:
rgba
(
20
,
89
,
187
,
1
);
}
}
}
}
}
}
.
select
-
box
{
.
select
-
box
{
margin
-
top
:
5
px
;
margin
-
top
:
5
px
;
...
@@ -2919,7 +2924,7 @@ onMounted(async () => {
...
@@ -2919,7 +2924,7 @@ onMounted(async () => {
height
:
24
px
;
height
:
24
px
;
border
-
radius
:
12
px
;
border
-
radius
:
12
px
;
overflow
:
hidden
;
overflow
:
hidden
;
img
{
img
{
width
:
100
%
;
width
:
100
%
;
height
:
100
%
;
height
:
100
%
;
}
}
...
...
src/views/exportControl/analysis/components/fishbone-mock.json
浏览文件 @
3ed377d1
[
[
{
{
"id"
:
86
,
"name"
:
"美国"
,
"name"
:
"人工智能"
,
"count"
:
0.37960339943342775
"nameZh"
:
"人工智能"
,
},
"description"
:
null
,
{
"parentId"
:
null
,
"name"
:
"德国"
,
"isMainBranch"
:
"Y"
,
"count"
:
0.20113314447592068
"children"
:
null
},
{
"name"
:
"日本"
,
"count"
:
0.1558073654390935
}
}
]
]
\ No newline at end of file
src/views/exportControl/analysis/components/influencePanel1.vue
浏览文件 @
3ed377d1
...
@@ -99,6 +99,13 @@ import college9 from "../../assets/images/college9.png";
...
@@ -99,6 +99,13 @@ import college9 from "../../assets/images/college9.png";
import
college10
from
"../../assets/images/college10.png"
;
import
college10
from
"../../assets/images/college10.png"
;
import
college11
from
"../../assets/images/college11.png"
;
import
college11
from
"../../assets/images/college11.png"
;
import
{
getHorizontalBarChart1
,
getPieOption2
,
getMultipleLineChart
}
from
"../../utils/charts"
;
import
{
getHorizontalBarChart1
,
getPieOption2
,
getMultipleLineChart
}
from
"../../utils/charts"
;
import
{
getScientificImpactEntityList
,
getScientificInstrumentDependencyCount
,
getScientificInstrumentDependencyRisk
,
getScientificInstrumentLocalizationRisk
,
getScientificInstrumentOriginCount
}
from
"@/api/exportControl"
;
const
selectOptions
=
[
const
selectOptions
=
[
{
{
value
:
1
,
value
:
1
,
...
@@ -170,39 +177,153 @@ const horizontalBarOptions = shallowRef({});
...
@@ -170,39 +177,153 @@ const horizontalBarOptions = shallowRef({});
const
pieOptions2
=
shallowRef
({});
const
pieOptions2
=
shallowRef
({});
const
multipleLineOptions1
=
shallowRef
({});
const
multipleLineOptions1
=
shallowRef
({});
const
multipleLineOptions2
=
shallowRef
({});
const
multipleLineOptions2
=
shallowRef
({});
onMounted
(()
=>
{
// 获取仪器对美依赖度升高风险分析数据
horizontalBarOptions
.
value
=
getHorizontalBarChart1
(
const
fetchDependencyRiskData
=
async
()
=>
{
[
"地球探测仪器"
,
"计算机及其配套设备"
,
"天文仪器"
,
"分析仪器"
,
"核仪器"
,
"物理性能测试仪器"
,
"医学科研仪器"
],
try
{
[
10
,
10
,
21
,
25
,
79
,
95
,
109
],
const
data
=
await
getScientificInstrumentDependencyRisk
();
false
if
(
data
&&
data
.
instrumentCountList
&&
Array
.
isArray
(
data
.
instrumentCountList
))
{
);
// 提取年份数据(去重并排序)
pieOptions2
.
value
=
getPieOption2
([
const
allYears
=
[...
new
Set
(
data
.
instrumentCountList
.
flatMap
(
item
=>
item
.
countList
.
map
(
c
=>
c
.
year
)))].
sort
();
{
name
:
"美国"
,
value
:
27
},
{
name
:
"日本"
,
value
:
22
},
// 转换数据格式以适应 getMultipleLineChart
{
name
:
"德国"
,
value
:
18
},
const
chartData
=
data
.
instrumentCountList
.
map
(
item
=>
{
{
name
:
"英国"
,
value
:
15
},
// 为每个仪器类型创建完整的年份数据序列
{
name
:
"韩国"
,
value
:
12
},
const
values
=
allYears
.
map
(
year
=>
{
{
name
:
"荷兰"
,
value
:
8
},
const
yearData
=
item
.
countList
.
find
(
c
=>
c
.
year
===
year
);
{
name
:
"其他"
,
value
:
7
}
return
yearData
?
yearData
.
count
:
0
;
]);
});
return
{
name
:
item
.
name
,
value
:
values
};
});
// 使用 getMultipleLineChart 生成图表配置
multipleLineOptions1
.
value
=
getMultipleLineChart
({
multipleLineOptions1
.
value
=
getMultipleLineChart
({
dates
:
[
"2016"
,
"2017"
,
"2018"
,
"2019"
,
"2020"
,
"2021"
,
"2022"
,
"2023"
,
"2024"
,
"2025"
],
dates
:
allYears
.
map
(
String
),
// 转换为字符串以匹配原数据格式
data
:
[
data
:
chartData
{
name
:
"电子测量仪器"
,
value
:
[
45
,
35
,
25
,
20
,
20
,
14
,
15
,
15
,
23
,
21
]
},
{
name
:
"分析仪器"
,
value
:
[
35
,
33
,
24
,
21
,
22
,
18
,
13
,
19
,
21
,
31
]
},
{
name
:
"工艺试验仪器"
,
value
:
[
32
,
22
,
12
,
11
,
14
,
15
,
17
,
13
,
12
,
26
]
},
{
name
:
"核仪器"
,
value
:
[
48
,
38
,
28
,
28
,
28
,
18
,
18
,
18
,
28
,
28
]
}
]
});
});
}
}
catch
(
error
)
{
console
.
error
(
"获取仪器对美依赖度升高风险分析数据失败:"
,
error
);
}
};
// 获取仪器国产化降低风险分析数据
const
fetchLocalizationRiskData
=
async
()
=>
{
try
{
const
data
=
await
getScientificInstrumentLocalizationRisk
();
if
(
data
&&
data
.
instrumentCountList
&&
Array
.
isArray
(
data
.
instrumentCountList
))
{
// 提取年份数据(去重并排序)
const
allYears
=
[...
new
Set
(
data
.
instrumentCountList
.
flatMap
(
item
=>
item
.
countList
.
map
(
c
=>
c
.
year
)))].
sort
();
// 转换数据格式以适应 getMultipleLineChart
const
chartData
=
data
.
instrumentCountList
.
map
(
item
=>
{
// 为每个仪器类型创建完整的年份数据序列
const
values
=
allYears
.
map
(
year
=>
{
const
yearData
=
item
.
countList
.
find
(
c
=>
c
.
year
===
year
);
return
yearData
?
yearData
.
count
:
0
;
});
return
{
name
:
item
.
name
,
value
:
values
};
});
// 使用 getMultipleLineChart 生成图表配置
multipleLineOptions2
.
value
=
getMultipleLineChart
({
multipleLineOptions2
.
value
=
getMultipleLineChart
({
dates
:
[
"2016"
,
"2017"
,
"2018"
,
"2019"
,
"2020"
,
"2021"
,
"2022"
,
"2023"
,
"2024"
,
"2025"
],
dates
:
allYears
.
map
(
String
),
// 转换为字符串以匹配原数据格式
data
:
[
data
:
chartData
{
name
:
"电子测量仪器"
,
value
:
[
45
,
35
,
25
,
20
,
20
,
14
,
15
,
15
,
23
,
21
]
},
{
name
:
"分析仪器"
,
value
:
[
35
,
33
,
24
,
21
,
22
,
18
,
13
,
19
,
21
,
31
]
},
{
name
:
"工艺试验仪器"
,
value
:
[
32
,
22
,
12
,
11
,
14
,
15
,
17
,
13
,
12
,
26
]
},
{
name
:
"核仪器"
,
value
:
[
48
,
38
,
28
,
28
,
28
,
18
,
18
,
18
,
28
,
28
]
}
]
});
});
}
}
catch
(
error
)
{
console
.
error
(
"获取仪器国产化降低风险分析数据失败:"
,
error
);
}
};
// 获取各类别仪器对美依赖情况数据
const
fetchDependencyCountData
=
async
()
=>
{
try
{
const
data
=
await
getScientificInstrumentDependencyCount
();
if
(
data
&&
Array
.
isArray
(
data
))
{
// 按照 count 降序排列
const
sortedData
=
data
.
sort
((
a
,
b
)
=>
a
.
count
-
b
.
count
);
// 提取仪器名称和对应的计数
const
names
=
sortedData
.
map
(
item
=>
item
.
name
);
const
counts
=
sortedData
.
map
(
item
=>
item
.
count
);
// 使用 getHorizontalBarChart1 生成图表配置
horizontalBarOptions
.
value
=
getHorizontalBarChart1
(
names
,
counts
,
false
);
}
}
catch
(
error
)
{
console
.
error
(
"获取各类别仪器对美依赖情况数据失败:"
,
error
);
}
};
// 获取仪器进口国可替代性分析数据
const
fetchOriginCountData
=
async
()
=>
{
try
{
const
data
=
await
getScientificInstrumentOriginCount
();
if
(
data
&&
Array
.
isArray
(
data
))
{
// 转换数据格式以适应 getPieOption2
// 数据结构应该是 [{ name: "国家名", value: 数量 }]
const
pieData
=
data
.
map
(
item
=>
({
name
:
item
.
name
,
value
:
(
item
.
count
*
100
).
toFixed
(
1
)
}));
// 使用 getPieOption2 生成图表配置
pieOptions2
.
value
=
getPieOption2
(
pieData
);
}
}
catch
(
error
)
{
console
.
error
(
"获取仪器进口国可替代性分析数据失败:"
,
error
);
}
};
onMounted
(
async
()
=>
{
// horizontalBarOptions.value = getHorizontalBarChart1(
// ["地球探测仪器", "计算机及其配套设备", "天文仪器", "分析仪器", "核仪器", "物理性能测试仪器", "医学科研仪器"],
// [10, 10, 21, 25, 79, 95, 109],
// false
// );
// pieOptions2.value = getPieOption2([
// { name: "美国", value: 27 },
// { name: "日本", value: 22 },
// { name: "德国", value: 18 },
// { name: "英国", value: 15 },
// { name: "韩国", value: 12 },
// { name: "荷兰", value: 8 },
// { name: "其他", value: 7 }
// ]);
// multipleLineOptions1.value = getMultipleLineChart({
// dates: ["2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025"],
// data: [
// { name: "电子测量仪器", value: [45, 35, 25, 20, 20, 14, 15, 15, 23, 21] },
// { name: "分析仪器", value: [35, 33, 24, 21, 22, 18, 13, 19, 21, 31] },
// { name: "工艺试验仪器", value: [32, 22, 12, 11, 14, 15, 17, 13, 12, 26] },
// { name: "核仪器", value: [48, 38, 28, 28, 28, 18, 18, 18, 28, 28] }
// ]
// });
// multipleLineOptions2.value = getMultipleLineChart({
// dates: ["2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025"],
// data: [
// { name: "电子测量仪器", value: [45, 35, 25, 20, 20, 14, 15, 15, 23, 21] },
// { name: "分析仪器", value: [35, 33, 24, 21, 22, 18, 13, 19, 21, 31] },
// { name: "工艺试验仪器", value: [32, 22, 12, 11, 14, 15, 17, 13, 12, 26] },
// { name: "核仪器", value: [48, 38, 28, 28, 28, 18, 18, 18, 28, 28] }
// ]
// });
// 获取各类别仪器对美依赖情况数据
await
fetchDependencyCountData
();
// 获取仪器进口国可替代性分析数据
await
fetchOriginCountData
();
// 获取仪器对美依赖度升高风险分析数据
await
fetchDependencyRiskData
();
// 获取仪器国产化降低风险分析数据
await
fetchLocalizationRiskData
();
});
});
</
script
>
</
script
>
...
...
src/views/exportControl/analysis/components/influencePanel2.vue
浏览文件 @
3ed377d1
...
@@ -12,7 +12,7 @@
...
@@ -12,7 +12,7 @@
<div
class=
"item"
v-for=
"(item, index) in listData"
:key=
"index"
@
click=
"handleEttClick(item)"
>
<div
class=
"item"
v-for=
"(item, index) in listData"
:key=
"index"
@
click=
"handleEttClick(item)"
>
<div
class=
"index"
:class=
"
{ isTopTen: index
<
10
}"
>
{{
index
+
1
}}
</div>
<div
class=
"index"
:class=
"
{ isTopTen: index
<
10
}"
>
{{
index
+
1
}}
</div>
<div
class=
"name"
>
{{
item
.
name
||
item
.
nameEn
}}
</div>
<div
class=
"name"
>
{{
item
.
name
||
item
.
nameEn
}}
</div>
<div
class=
"icon"
:class=
"
{ iconUp: item.
isUp, iconDown: !item.isUp
}">
</div>
<div
class=
"icon"
:class=
"
{ iconUp: item.
marketChange > 0, iconDown: item.marketChange
<
0
}"
></div>
</div>
</div>
</div>
</div>
</div>
</div>
...
...
src/views/exportControl/analysis/components/panel2.vue
浏览文件 @
3ed377d1
...
@@ -186,12 +186,12 @@ const fetchEntityFinancing = async () => {
...
@@ -186,12 +186,12 @@ const fetchEntityFinancing = async () => {
// 按日期排序
// 按日期排序
const
sortedData
=
data
const
sortedData
=
data
.
sort
((
a
,
b
)
=>
{
.
sort
((
a
,
b
)
=>
{
return
new
Date
(
a
.
name
)
-
new
Date
(
b
.
name
);
return
new
Date
(
a
.
year
)
-
new
Date
(
b
.
year
);
})
})
.
filter
((
item
,
idx
)
=>
idx
%
3
===
0
);
.
filter
((
item
,
idx
)
=>
idx
%
3
===
0
);
// 提取 x 轴数据(日期)
// 提取 x 轴数据(日期)
const
xAxisData
=
sortedData
.
map
(
item
=>
item
.
name
);
const
xAxisData
=
sortedData
.
map
(
item
=>
item
.
year
);
// 提取 y 轴数据(融资数量)
// 提取 y 轴数据(融资数量)
const
seriesData
=
sortedData
.
map
(
item
=>
item
.
count
);
const
seriesData
=
sortedData
.
map
(
item
=>
item
.
count
);
...
...
src/views/exportControl/analysis/components/pieCharts.vue
浏览文件 @
3ed377d1
...
@@ -30,7 +30,7 @@ onMounted(async () => {
...
@@ -30,7 +30,7 @@ onMounted(async () => {
.
filter
(
item
=>
item
.
count
>
0
)
.
filter
(
item
=>
item
.
count
>
0
)
.
map
(
item
=>
{
.
map
(
item
=>
{
return
{
return
{
name
:
item
?.
domain
,
name
:
item
?.
name
,
value
:
item
?.
count
value
:
item
?.
count
};
};
})
})
...
...
src/views/exportControl/analysis/content/overview.vue
浏览文件 @
3ed377d1
...
@@ -92,8 +92,8 @@
...
@@ -92,8 +92,8 @@
家,其中50%规则涉及
家,其中50%规则涉及
<span
class=
"text2"
>
{{
<span
class=
"text2"
>
{{
panel5IsChecked
panel5IsChecked
? entitiesCountBy50PercentRules
Data
?.ruleCount
? entitiesCountBy50PercentRules?.ruleCount
: entitiesCountBy50PercentRules
Data
?.totalCount
: entitiesCountBy50PercentRules?.totalCount
}}
</span>
}}
</span>
家
家
</div>
</div>
...
@@ -160,6 +160,7 @@
...
@@ -160,6 +160,7 @@
</CardCustom>
</CardCustom>
<CardCustom
title=
"美国前序相关制裁、前序相关事件列表"
:style=
"{ width: '600px', height: '678px' }"
>
<CardCustom
title=
"美国前序相关制裁、前序相关事件列表"
:style=
"{ width: '600px', height: '678px' }"
>
<div
class=
"panel6"
>
<div
class=
"panel6"
>
<div
class=
"panel6-list"
>
<div
class=
"item"
v-for=
"(item, idx) in panel6"
:key=
"item.title"
>
<div
class=
"item"
v-for=
"(item, idx) in panel6"
:key=
"item.title"
>
<div
class=
"left"
>
<div
class=
"left"
>
<div
class=
"icon"
></div>
<div
class=
"icon"
></div>
...
@@ -171,7 +172,8 @@
...
@@ -171,7 +172,8 @@
<div
class=
"desc"
>
{{ item.desc }}
</div>
<div
class=
"desc"
>
{{ item.desc }}
</div>
</div>
</div>
</div>
</div>
<div
class=
"more"
>
</div>
<div
class=
"more"
@
click=
"handleMoreClick"
>
查看更多
查看更多
<span
class=
"moreIcon"
></span>
<span
class=
"moreIcon"
></span>
</div>
</div>
...
@@ -189,21 +191,14 @@ import ButtonList from "@/components/buttonList/buttonList.vue";
...
@@ -189,21 +191,14 @@ import ButtonList from "@/components/buttonList/buttonList.vue";
import
Hint
from
"../components/hint.vue"
;
import
Hint
from
"../components/hint.vue"
;
import
{
onMounted
,
reactive
,
ref
,
shallowRef
,
watch
}
from
"vue"
;
import
{
onMounted
,
reactive
,
ref
,
shallowRef
,
watch
}
from
"vue"
;
import
panel1_1
from
"../../assets/images/panel1_1.png"
;
import
panel1_1
from
"../../assets/images/panel1_1.png"
;
import
panel5_1
from
"../../assets/images/panel5_1.png"
;
import
panel5_2
from
"../../assets/images/panel5_2.png"
;
import
panel5_3
from
"../../assets/images/panel5_3.png"
;
import
panel5_4
from
"../../assets/images/panel5_4.png"
;
import
panel5_5
from
"../../assets/images/panel5_5.png"
;
import
panel5_6
from
"../../assets/images/panel5_6.png"
;
import
panel5_7
from
"../../assets/images/panel5_7.png"
;
import
panel5_8
from
"../../assets/images/panel5_8.png"
;
import
{
import
{
getOrganizationInfo
,
getOrganizationInfo
,
getPersonList
,
getPersonList
,
getSanReasonSelect
,
getSanReasonSelect
,
getSelectEntitiesList
,
getSelectEntitiesList
,
getEntitiesList
,
getEntitiesList
,
getEntitiesCountBy50PercentRules
getEntitiesCountBy50PercentRules
,
getPrecedingEvents
}
from
"@/api/exportControl"
;
}
from
"@/api/exportControl"
;
import
_
from
"lodash"
;
import
_
from
"lodash"
;
...
@@ -212,32 +207,7 @@ import { formatAnyDateToChinese } from "../../utils";
...
@@ -212,32 +207,7 @@ import { formatAnyDateToChinese } from "../../utils";
const
route
=
useRoute
();
const
route
=
useRoute
();
const
router
=
useRouter
();
const
router
=
useRouter
();
const
organizationInfo
=
shallowRef
({});
const
organizationInfo
=
shallowRef
({});
const
personLis
=
shallowRef
([
const
personLis
=
shallowRef
([]);
// {
// name: "吉娜·雷蒙多",
// enName: "Gina Raimondo",
// party: "美国民主党",
// img: panel2_1
// },
// {
// name: "迈克・约翰逊",
// enName: "Mike Johnson",
// party: "美国共和党",
// img: panel2_2
// },
// {
// name: "艾伦·埃斯特韦斯",
// enName: "Alan Estevez",
// party: "美国民主党",
// img: panel2_3
// },
// {
// name: "凯・格兰杰",
// enName: "Kay Granger",
// party: "美国共和党",
// img: panel2_4
// }
]);
const
sanReasonSelect
=
shallowRef
([
const
sanReasonSelect
=
shallowRef
([
{
{
text
:
"获取美国产物项,以支持中国量子技术;"
text
:
"获取美国产物项,以支持中国量子技术;"
...
@@ -276,18 +246,33 @@ const total = ref(0);
...
@@ -276,18 +246,33 @@ const total = ref(0);
const
loading
=
ref
(
false
);
const
loading
=
ref
(
false
);
const
tableWrapRef
=
ref
(
null
);
const
tableWrapRef
=
ref
(
null
);
const
noMoreData
=
ref
(
false
);
const
noMoreData
=
ref
(
false
);
const
entitiesCountBy50PercentRules
=
ref
(
0
);
const
entitiesCountBy50PercentRules
=
ref
({
ruleCount
:
0
,
totalCount
:
0
});
const
precedingEvents
=
shallowRef
([]);
const
panel6
=
ref
([]);
const
panel6CurrentPage
=
ref
(
1
);
const
panel6PageSize
=
ref
(
10
);
const
panel6Loading
=
ref
(
false
);
const
panel6NoMoreData
=
ref
(
false
);
onMounted
(
async
()
=>
{
onMounted
(
async
()
=>
{
try
{
try
{
const
[
organizationInfoData
,
sanReasonSelectData
,
entitiesCountBy50PercentRulesData
]
=
await
Promise
.
all
([
const
[
organizationInfoData
,
sanReasonSelectData
,
entitiesCountBy50PercentRulesData
,
precedingEventsData
]
=
await
Promise
.
all
([
getOrganizationInfo
(),
getOrganizationInfo
(),
// getPersonList(),
// getPersonList(),
getSanReasonSelect
(
route
.
query
.
startTime
),
getSanReasonSelect
(
route
.
query
.
startTime
),
getEntitiesCountBy50PercentRules
(
"实体清单"
,
currentPage
.
value
,
pageSize
.
value
)
getEntitiesCountBy50PercentRules
(
"实体清单"
,
currentPage
.
value
,
pageSize
.
value
),
// getSelectEntitiesList(route.query.startTime)
// getSelectEntitiesList(route.query.startTime),
getPrecedingEvents
(
route
.
query
.
startTime
)
]);
]);
console
.
log
(
"entitiesCountBy50PercentRulesData"
,
entitiesCountBy50PercentRulesData
);
console
.
log
(
"entitiesCountBy50PercentRulesData"
,
entitiesCountBy50PercentRulesData
);
entitiesCountBy50PercentRules
.
value
=
{
ruleCount
:
entitiesCountBy50PercentRulesData
?.
ruleCount
||
0
,
totalCount
:
entitiesCountBy50PercentRulesData
?.
totalCount
||
0
};
organizationInfo
.
value
=
{
organizationInfo
.
value
=
{
img
:
panel1_1
,
img
:
panel1_1
,
mingcheng
:
organizationInfoData
?.
orgNameZh
,
mingcheng
:
organizationInfoData
?.
orgNameZh
,
...
@@ -307,18 +292,12 @@ onMounted(async () => {
...
@@ -307,18 +292,12 @@ onMounted(async () => {
return
{
text
:
item
};
return
{
text
:
item
};
});
});
// selectEntitiesList.value = _.map(selectEntitiesListData, item => {
precedingEvents
.
value
=
precedingEventsData
.
content
||
[];
// return {
panel6
.
value
=
precedingEventsData
.
content
.
map
(
item
=>
({
// name: item?.entityNameZh,
...
item
,
// domains: item.techDomainList,
time
:
formatAnyDateToChinese
(
item
.
eventTime
),
// address: "--",
desc
:
item
.
summary
||
"--"
// time: formatAnyDateToChinese(item?.startTime),
}));
// isUp: true,
// revenue: "--",
// subCompany: "--",
// img: ""
// };
// });
// 初始化加载第一页数据
// 初始化加载第一页数据
await
fetchEntitiesList
(
currentPage
.
value
,
pageSize
.
value
);
await
fetchEntitiesList
(
currentPage
.
value
,
pageSize
.
value
);
...
@@ -427,108 +406,10 @@ const panel5TypeMap = {
...
@@ -427,108 +406,10 @@ const panel5TypeMap = {
通信网络
:
"warning"
,
通信网络
:
"warning"
,
航空航天
:
"success"
航空航天
:
"success"
};
};
const
panel5MockData
=
[
{
name
:
"科大讯飞股份有限公司"
,
domains
:
[
"人工智能"
],
address
:
"深圳"
,
time
:
"2025年9月"
,
isUp
:
true
,
revenue
:
"325"
,
subCompany
:
"讯飞智元信息科技...等15家>"
,
img
:
panel5_1
},
{
name
:
"华为技术有限公司"
,
domains
:
[
"通信网络"
],
address
:
"--"
,
time
:
"2025年9月"
,
isUp
:
true
,
revenue
:
"325"
,
subCompany
:
"海思半导体有限公...等15家>"
,
img
:
panel5_2
},
{
name
:
"中国航空工业集团"
,
domains
:
[
"航空航天"
],
address
:
"--"
,
time
:
"2025年9月"
,
isUp
:
true
,
revenue
:
"325"
,
subCompany
:
"中航科技控股有限...等15家>"
,
img
:
panel5_3
},
{
name
:
"杭州海康威视有限公司"
,
domains
:
[
"航空航天"
],
address
:
"深圳"
,
time
:
"2025年9月"
,
isUp
:
true
,
revenue
:
"325"
,
subCompany
:
"海云智能科技有限...等15家>"
,
img
:
panel5_4
},
{
name
:
"浪潮集团有限公司"
,
domains
:
[
"人工智能"
],
address
:
"--"
,
time
:
"2025年9月"
,
isUp
:
true
,
revenue
:
"325"
,
subCompany
:
"浪潮商用机器有限...等15家>"
,
img
:
panel5_5
},
{
name
:
"中兴通讯股份有限公司"
,
domains
:
[
"航空航天"
],
address
:
"深圳"
,
time
:
"2025年9月"
,
isUp
:
true
,
revenue
:
"325"
,
subCompany
:
"中融讯合通信设备...等15家>"
,
img
:
panel5_6
},
{
name
:
"大疆创新科技有限公司"
,
domains
:
[
"人工智能"
],
address
:
"--"
,
time
:
"2025年9月"
,
isUp
:
true
,
revenue
:
"325"
,
subCompany
:
"大疆智能计算服务...等15家>"
,
img
:
panel5_7
},
{
name
:
"艾睿中国电子贸易有限公司"
,
domains
:
[
"航空航天"
],
address
:
"上海"
,
time
:
"2025年9月"
,
isUp
:
true
,
revenue
:
"325"
,
subCompany
:
"讯飞智元信息科技...等15家>"
,
img
:
panel5_8
}
];
// 历次制裁过程
const
panel6
=
ref
([
{
time
:
"2025-09-02"
,
title
:
"传感器和仪器仪表技术咨询委员会将于2024年5月9日召开部分闭门会议"
,
desc
:
"传感器与仪器仪表技术咨询委员会(以下简称“委员会”)将于美国东部夏令时间2024年5月9日星期四下午1:00至2:30召开会议。本次会议将通过微软团队(MS Teams)以线上形式举行。根据美国商务部第10-16号《部门组织》文件。"
},
{
time
:
"2025-04-17"
,
title
:
"美国对华加征关税至20%并扩大科技制裁"
,
desc
:
'美国以"芬太尼问题"为由提高对华关税至20%,恢复钢铁铝关税;同时推动《恢复贸易公平法案》,计划对中国商品征收100%关税。系统性打压中国高科技产业,关税措施实质为经济勒索。'
},
{
time
:
"2025-04-17"
,
title
:
"中美关税战升级至125%与反制措施"
,
desc
:
'美国将对华关税从34%提升至84%(总税率104%),中方同步对美商品加征同等税率,并暂停进口美国影片、限制留学合作。特朗普政府通过"基准关税+对等关税+额外加征"策略施压,引发全球供应链震荡。'
}
]);
const
handleOrgClick
=
item
=>
{
const
handleOrgClick
=
item
=>
{
console
.
log
(
item
);
console
.
log
(
item
);
if
(
item
.
entityType
!=
2
)
return
;
const
route
=
router
.
resolve
({
const
route
=
router
.
resolve
({
path
:
"/companyPages"
,
path
:
"/companyPages"
,
query
:
{
query
:
{
...
@@ -537,6 +418,47 @@ const handleOrgClick = item => {
...
@@ -537,6 +418,47 @@ const handleOrgClick = item => {
});
});
window
.
open
(
route
.
href
,
"_blank"
);
window
.
open
(
route
.
href
,
"_blank"
);
};
};
// 处理"查看更多"点击事件
const
handleMoreClick
=
async
()
=>
{
if
(
panel6Loading
.
value
||
panel6NoMoreData
.
value
)
return
;
panel6Loading
.
value
=
true
;
try
{
// 增加页码
panel6CurrentPage
.
value
++
;
// 获取更多数据
const
moreEvents
=
await
getPrecedingEvents
(
route
.
query
.
startTime
,
panel6CurrentPage
.
value
,
panel6PageSize
.
value
);
if
(
moreEvents
&&
Array
.
isArray
(
moreEvents
.
content
)
&&
moreEvents
.
content
.
length
>
0
)
{
// 处理新数据
const
newEvents
=
moreEvents
.
content
.
map
(
item
=>
({
...
item
,
time
:
formatAnyDateToChinese
(
item
.
eventTime
),
desc
:
item
.
summary
||
"--"
}));
// 追加到现有数据
panel6
.
value
=
[...
panel6
.
value
,
...
newEvents
];
// 检查是否还有更多数据(简单的检查方式)
// 如果返回的数据少于请求的数量,则认为没有更多数据
if
(
newEvents
.
length
<
panel6PageSize
.
value
)
{
panel6NoMoreData
.
value
=
true
;
}
}
else
{
// 没有更多数据
panel6NoMoreData
.
value
=
true
;
}
}
catch
(
error
)
{
console
.
error
(
"获取更多前序事件失败:"
,
error
);
// 出错时回退页码
panel6CurrentPage
.
value
--
;
}
finally
{
panel6Loading
.
value
=
false
;
}
};
</
script
>
</
script
>
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
...
@@ -826,10 +748,16 @@ const handleOrgClick = item => {
...
@@ -826,10 +748,16 @@ const handleOrgClick = item => {
}
}
.panel6
{
.panel6
{
height
:
100%
;
height
:
100%
;
padding
:
6px
45px
0
28px
;
padding
:
6px
45px
20px
28px
;
display
:
flex
;
display
:
flex
;
flex-direction
:
column
;
flex-direction
:
column
;
align-items
:
center
;
align-items
:
center
;
.panel6-list
{
height
:
90%
;
overflow-y
:
auto
;
margin-bottom
:
auto
;
padding-left
:
5px
;
}
.item
{
.item
{
display
:
flex
;
display
:
flex
;
.left
{
.left
{
...
...
src/views/exportControl/components/dialog.vue
浏览文件 @
3ed377d1
<
template
>
<
template
>
<div
class=
"message-bubble"
>
<div
class=
"message-bubble"
>
<div
class=
"avatar-container"
@
click=
"handleClick"
>
<div
class=
"avatar-container"
@
click=
"handleClick"
>
<img
:src=
"avatar"
:alt=
"name"
class=
"avatar"
/>
<img
:src=
"avatar
|| avatarUser
"
:alt=
"name"
class=
"avatar"
/>
</div>
</div>
<div
class=
"bubble-container"
>
<div
class=
"bubble-container"
>
<div
class=
"bubble"
>
<div
class=
"bubble"
>
...
@@ -19,6 +19,8 @@
...
@@ -19,6 +19,8 @@
</
template
>
</
template
>
<
script
setup
>
<
script
setup
>
import
avatarUser
from
"@/assets/images/avatar_user.png"
;
const
emit
=
defineEmits
([
"click"
,
"info-click"
]);
const
emit
=
defineEmits
([
"click"
,
"info-click"
]);
defineProps
({
defineProps
({
avatar
:
{
avatar
:
{
...
...
src/views/exportControl/index.vue
浏览文件 @
3ed377d1
...
@@ -220,7 +220,7 @@
...
@@ -220,7 +220,7 @@
<
template
#
default
>
<
template
#
default
>
<div
class=
"news-list"
>
<div
class=
"news-list"
>
<NewsList
:list-data=
"newsList"
@
click=
"handleNewsInfoClick
"
/>
<NewsList
:list-data=
"newsList"
@
item-click=
"item => handleNewsInfoClick(item)
"
/>
</div>
</div>
</
template
>
</
template
>
</custom-container>
</custom-container>
...
@@ -321,7 +321,7 @@
...
@@ -321,7 +321,7 @@
</div>
</div>
<div
class=
"box3-content"
>
<div
class=
"box3-content"
>
<div
class=
"box3-content-title"
>
商业管制清单(CCL)更新频度
</div>
<div
class=
"box3-content-title"
>
商业管制清单(CCL)更新频度
</div>
<el-table
:data=
"tableData
1
"
stripe
style=
"width: 100%"
>
<el-table
:data=
"tableData
2
"
stripe
style=
"width: 100%"
>
<el-table-column
prop=
"year"
label=
"年份"
width=
"150"
/>
<el-table-column
prop=
"year"
label=
"年份"
width=
"150"
/>
<el-table-column
label=
"发布次数"
width=
"200"
>
<el-table-column
label=
"发布次数"
width=
"200"
>
<
template
#
default=
"scope"
>
<
template
#
default=
"scope"
>
...
@@ -694,6 +694,7 @@ import _ from "lodash";
...
@@ -694,6 +694,7 @@ import _ from "lodash";
const
handleCompClick
=
item
=>
{
const
handleCompClick
=
item
=>
{
console
.
log
(
"item"
,
item
);
console
.
log
(
"item"
,
item
);
if
(
item
.
entityType
!=
2
)
return
;
const
route
=
router
.
resolve
({
const
route
=
router
.
resolve
({
path
:
"/companyPages"
,
path
:
"/companyPages"
,
query
:
{
query
:
{
...
@@ -712,6 +713,8 @@ const trendOption = ref({});
...
@@ -712,6 +713,8 @@ const trendOption = ref({});
const
trendChecked
=
ref
(
false
);
const
trendChecked
=
ref
(
false
);
// 发布频度
// 发布频度
const
tableData1
=
ref
([]);
const
tableData1
=
ref
([]);
// CCL发布频度
const
tableData2
=
ref
([]);
// 历次制裁过程
// 历次制裁过程
const
sanctionProcessList
=
ref
([]);
const
sanctionProcessList
=
ref
([]);
const
sanctionPage
=
ref
(
1
);
const
sanctionPage
=
ref
(
1
);
...
@@ -727,10 +730,11 @@ const newsList = ref([]);
...
@@ -727,10 +730,11 @@ const newsList = ref([]);
onMounted
(
async
()
=>
{
onMounted
(
async
()
=>
{
try
{
try
{
const
[
dataCount
,
entitiesDataInfo
,
industryCountByYear
,
countDomainByYear
]
=
await
Promise
.
all
([
const
[
dataCount
,
entitiesDataInfo
,
industryCountByYear
,
cclList
,
countDomainByYear
]
=
await
Promise
.
all
([
getEntitiesDataCount
(),
getEntitiesDataCount
(),
getEntitiesDataInfo
(),
getEntitiesDataInfo
(),
getIndustryCountByYear
(
1
),
getIndustryCountByYear
(
1
),
getIndustryCountByYear
(
13
),
getCountDomainByYear
(
trendChecked
.
value
)
getCountDomainByYear
(
trendChecked
.
value
)
]);
]);
// 交换第二个和第三个元素
// 交换第二个和第三个元素
...
@@ -742,6 +746,7 @@ onMounted(async () => {
...
@@ -742,6 +746,7 @@ onMounted(async () => {
});
});
entitiesDataInfoList
.
value
=
entitiesDataInfo
||
[];
entitiesDataInfoList
.
value
=
entitiesDataInfo
||
[];
const
list
=
_
.
chain
(
industryCountByYear
).
filter
(
"year"
).
orderBy
(
"year"
,
"desc"
).
value
();
const
list
=
_
.
chain
(
industryCountByYear
).
filter
(
"year"
).
orderBy
(
"year"
,
"desc"
).
value
();
const
cclList1
=
_
.
chain
(
cclList
).
filter
(
"year"
).
orderBy
(
"year"
,
"desc"
).
value
();
const
total
=
_
.
sumBy
(
list
,
"count"
);
const
total
=
_
.
sumBy
(
list
,
"count"
);
tableData1
.
value
=
_
.
map
(
list
,
item
=>
{
tableData1
.
value
=
_
.
map
(
list
,
item
=>
{
return
{
return
{
...
@@ -751,6 +756,14 @@ onMounted(async () => {
...
@@ -751,6 +756,14 @@ onMounted(async () => {
tags
:
item
.
domain
tags
:
item
.
domain
};
};
}).
slice
(
0
,
5
);
}).
slice
(
0
,
5
);
tableData2
.
value
=
_
.
map
(
cclList1
,
item
=>
{
return
{
year
:
item
.
year
,
num
:
item
.
count
,
percent
:
item
.
count
/
total
,
tags
:
item
.
domain
};
}).
slice
(
0
,
5
);
console
.
log
(
"countDomainByYear"
,
countDomainByYear
);
console
.
log
(
"countDomainByYear"
,
countDomainByYear
);
// 整理柱状图数据并应用到趋势图
// 整理柱状图数据并应用到趋势图
if
(
countDomainByYear
&&
countDomainByYear
[
0
].
yearDomainCount
)
{
if
(
countDomainByYear
&&
countDomainByYear
[
0
].
yearDomainCount
)
{
...
@@ -1194,6 +1207,7 @@ const fetchNewsInfo = async () => {
...
@@ -1194,6 +1207,7 @@ const fetchNewsInfo = async () => {
const
data
=
await
getNewsInfo
();
const
data
=
await
getNewsInfo
();
if
(
data
&&
Array
.
isArray
(
data
))
{
if
(
data
&&
Array
.
isArray
(
data
))
{
newsList
.
value
=
data
.
map
(
item
=>
({
newsList
.
value
=
data
.
map
(
item
=>
({
...
item
,
avatar
:
item
.
newsImage
,
avatar
:
item
.
newsImage
,
name
:
item
.
newsTitle
,
name
:
item
.
newsTitle
,
time
:
formatTime
(
item
.
newsDate
),
time
:
formatTime
(
item
.
newsDate
),
...
@@ -1439,7 +1453,7 @@ const handleNewsInfoClick = item => {
...
@@ -1439,7 +1453,7 @@ const handleNewsInfoClick = item => {
const
route
=
router
.
resolve
({
const
route
=
router
.
resolve
({
path
:
"/newsAnalysis"
,
path
:
"/newsAnalysis"
,
query
:
{
query
:
{
newsId
:
item
.
i
d
newsId
:
item
.
newsI
d
}
}
});
});
window
.
open
(
route
.
href
,
"_blank"
);
window
.
open
(
route
.
href
,
"_blank"
);
...
@@ -1887,10 +1901,14 @@ const handleMediaClick = item => {
...
@@ -1887,10 +1901,14 @@ const handleMediaClick = item => {
}
}
.home-wrapper
{
.home-wrapper
{
width
:
100%
;
height
:
calc
(
100vh
-
96px
);
position
:
relative
;
overflow-y
:
hidden
;
.home-main
{
.home-main
{
// width: 1400px
;
width
:
100%
;
padding
:
0
5
%
;
height
:
100
%
;
margin
:
0
auto
;
overflow-y
:
auto
;
background
:
url("./assets/images/background.png")
;
background
:
url("./assets/images/background.png")
;
background-size
:
100%
100%
;
background-size
:
100%
100%
;
.home-main-header
{
.home-main-header
{
...
...
src/views/exportControl/utils/charts.js
浏览文件 @
3ed377d1
...
@@ -139,6 +139,7 @@ export function getPieOption2(data, title) {
...
@@ -139,6 +139,7 @@ export function getPieOption2(data, title) {
}
}
},
},
legend
:
{
legend
:
{
type
:
"scroll"
,
icon
:
"rect"
,
icon
:
"rect"
,
top
:
"center"
,
top
:
"center"
,
right
:
"40"
,
right
:
"40"
,
...
@@ -825,6 +826,7 @@ export const getMultipleLineChart = obj => {
...
@@ -825,6 +826,7 @@ export const getMultipleLineChart = obj => {
containLabel
:
true
containLabel
:
true
},
},
legend
:
{
legend
:
{
type
:
"scroll"
,
right
:
"5%"
,
right
:
"5%"
,
icon
:
"circle"
,
icon
:
"circle"
,
itemWidth
:
15
,
itemWidth
:
15
,
...
@@ -835,7 +837,7 @@ export const getMultipleLineChart = obj => {
...
@@ -835,7 +837,7 @@ export const getMultipleLineChart = obj => {
},
},
itemGap
:
17
,
itemGap
:
17
,
data
:
obj
.
data
.
map
((
item
,
index
)
=>
{
data
:
obj
.
data
.
map
((
item
,
index
)
=>
{
return
{
name
:
item
.
name
,
itemStyle
:
{
color
:
color
[
index
]
}
};
return
{
name
:
item
.
name
,
itemStyle
:
{
color
:
color
[
index
%
4
]
}
};
})
})
},
},
xAxis
:
{
xAxis
:
{
...
...
src/views/finance/index.vue
浏览文件 @
3ed377d1
...
@@ -1698,10 +1698,14 @@ onMounted(async () => {
...
@@ -1698,10 +1698,14 @@ onMounted(async () => {
}
}
.home-wrapper
{
.home-wrapper
{
width
:
100%
;
height
:
calc
(
100vh
-
96px
);
position
:
relative
;
overflow-y
:
hidden
;
.home-main
{
.home-main
{
// width: 1400px
;
width
:
100%
;
padding
:
0
5
%
;
height
:
100
%
;
margin
:
0
auto
;
overflow-y
:
auto
;
background
:
url("./assets/images/background.png")
;
background
:
url("./assets/images/background.png")
;
background-size
:
100%
100%
;
background-size
:
100%
100%
;
.home-main-header
{
.home-main-header
{
...
...
src/views/innovationSubject/index.vue
浏览文件 @
3ed377d1
...
@@ -352,7 +352,6 @@
...
@@ -352,7 +352,6 @@
/>
/>
</el-select>
</el-select>
</div>
</div>
</div>
</div>
</div>
</div>
<div
class=
"center-footer-layout"
>
<div
class=
"center-footer-layout"
>
...
@@ -405,6 +404,7 @@
...
@@ -405,6 +404,7 @@
</div>
</div>
</div>
</div>
<div
class=
"home-main-footer-main"
>
<div
class=
"home-main-footer-main"
>
<div
class=
"footer-main-item"
v-for=
"item in universityList"
:key=
"item.name"
@
click=
"handleClickToDetail"
>
<div
class=
"footer-main-item"
v-for=
"item in universityList"
:key=
"item.name"
@
click=
"handleClickToDetail"
>
<img
:src=
"item.pic"
style=
"height: 32px; width: 32px;"
/>
<img
:src=
"item.pic"
style=
"height: 32px; width: 32px;"
/>
<div
class=
"item-text"
>
{{ item.name }}
</div>
<div
class=
"item-text"
>
{{ item.name }}
</div>
...
@@ -894,7 +894,6 @@ onMounted(async () => {
...
@@ -894,7 +894,6 @@ onMounted(async () => {
let
chart1
=
getPieChart
(
chart1Data
.
value
,
colorList
);
let
chart1
=
getPieChart
(
chart1Data
.
value
,
colorList
);
setChart
(
chart1
,
"chart1"
);
setChart
(
chart1
,
"chart1"
);
});
});
</
script
>
</
script
>
...
...
src/views/marketAccessRestrictions/marketAccessHome/index.vue
浏览文件 @
3ed377d1
...
@@ -1070,10 +1070,14 @@ onMounted(async () => {
...
@@ -1070,10 +1070,14 @@ onMounted(async () => {
box-shadow
:
none
;
box-shadow
:
none
;
}
}
.home-wrapper
{
.home-wrapper
{
width
:
100%
;
height
:
calc
(
100vh
-
96px
);
position
:
relative
;
overflow-y
:
hidden
;
.home-main
{
.home-main
{
// width: 1400px;
width
:
100%
;
width
:
100%
;
margin
:
0
auto
;
height
:
100%
;
overflow-y
:
auto
;
background
:
url("./assets/images/background.png")
;
background
:
url("./assets/images/background.png")
;
background-size
:
100%
100%
;
background-size
:
100%
100%
;
.home-main-header
{
.home-main-header
{
...
@@ -1217,7 +1221,7 @@ onMounted(async () => {
...
@@ -1217,7 +1221,7 @@ onMounted(async () => {
right
:
19px
;
right
:
19px
;
width
:
6px
;
width
:
6px
;
height
:
12px
;
height
:
12px
;
img
{
img
{
width
:
100%
;
width
:
100%
;
height
:
100%
;
height
:
100%
;
}
}
...
...
src/views/technologyFigures/index.vue
浏览文件 @
3ed377d1
...
@@ -100,10 +100,13 @@
...
@@ -100,10 +100,13 @@
</div>
</div>
<div
class=
"box2-main"
>
<div
class=
"box2-main"
>
<div
class=
"box2-main-item"
v-for=
"(item, index) in warningList"
:key=
"index"
>
<div
class=
"box2-main-item"
v-for=
"(item, index) in warningList"
:key=
"index"
>
<div
class=
"item-left"
:class=
"
{
<div
class=
"item-left"
:class=
"
{
itemLeftStatus1: item.status === '一般风险',
itemLeftStatus1: item.status === '一般风险',
itemLeftStatus2: item.status === '重大风险'
itemLeftStatus2: item.status === '重大风险'
}">
}"
>
{{
item
.
status
}}
{{
item
.
status
}}
</div>
</div>
<div
class=
"item-right"
>
<div
class=
"item-right"
>
...
@@ -131,14 +134,18 @@
...
@@ -131,14 +134,18 @@
<img
src=
"./assets/images/TechnologyFigures-icon3.png"
alt=
""
/>
<img
src=
"./assets/images/TechnologyFigures-icon3.png"
alt=
""
/>
</div>
</div>
<!--
<div
class=
"box3-header-title"
>
{{
"人物动向"
}}
</div>
-->
<!--
<div
class=
"box3-header-title"
>
{{
"人物动向"
}}
</div>
-->
<div
class=
"header-title"
<div
style=
"width: 1560px; display: flex; justify-content: space-between; margin-top: 10px"
>
class=
"header-title"
style=
"width: 1560px; display: flex; justify-content: space-between; margin-top: 10px"
>
<div
class=
"box3-header-title"
>
<div
class=
"box3-header-title"
>
{{
"人物动向"
}}
{{
"人物动向"
}}
</div>
</div>
<div
style=
"display: flex; gap: 8px; margin-right: 12px"
>
<div
style=
"display: flex; gap: 8px; margin-right: 12px"
>
<div
v-for=
"value in peoDateList"
<div
:class=
"peoDate !== value ? 'btn-box-samll' : 'btn-box-select-samll'"
>
v-for=
"value in peoDateList"
:class=
"peoDate !== value ? 'btn-box-samll' : 'btn-box-select-samll'"
>
{{
value
}}
{{
value
}}
</div>
</div>
</div>
</div>
...
@@ -154,14 +161,18 @@
...
@@ -154,14 +161,18 @@
<div
class=
"header-icon"
>
<div
class=
"header-icon"
>
<img
src=
"./assets/images/header-message.png"
alt=
""
/>
<img
src=
"./assets/images/header-message.png"
alt=
""
/>
</div>
</div>
<div
class=
"header-title"
<div
style=
"width: 1595px; display: flex; justify-content: space-between; margin-top: 10px"
>
class=
"header-title"
style=
"width: 1595px; display: flex; justify-content: space-between; margin-top: 10px"
>
<div>
<div>
{{
"重要人物言论及立场"
}}
{{
"重要人物言论及立场"
}}
</div>
</div>
<div
style=
"display: flex; gap: 8px; margin-right: 12px"
>
<div
style=
"display: flex; gap: 8px; margin-right: 12px"
>
<div
v-for=
"value in fields"
<div
:class=
"fieldSelect !== value ? 'btn-box-samll' : 'btn-box-select-samll'"
>
v-for=
"value in fields"
:class=
"fieldSelect !== value ? 'btn-box-samll' : 'btn-box-select-samll'"
>
{{
value
}}
{{
value
}}
</div>
</div>
</div>
</div>
...
@@ -178,18 +189,33 @@
...
@@ -178,18 +189,33 @@
<div
class=
"box5-header"
>
<div
class=
"box5-header"
>
<div
class=
"box5-header-left"
>
<div
class=
"box5-header-left"
>
<div
class=
"box5-header-icon"
>
<div
class=
"box5-header-icon"
>
<img
src=
"./assets/images/TechnologyFigures-icon1.png"
alt=
""
<img
style=
"margin: 13px 21px 13px 21px; height: 22px"
/>
src=
"./assets/images/TechnologyFigures-icon1.png"
alt=
""
style=
"margin: 13px 21px 13px 21px; height: 22px"
/>
<div
class=
"box5-header-title"
>
{{
"科技人物观点词云"
}}
</div>
<div
class=
"box5-header-title"
>
{{
"科技人物观点词云"
}}
</div>
</div>
</div>
<div>
<div>
<div
style=
"height: 45px; display: flex; align-items: center"
>
<div
style=
"height: 45px; display: flex; align-items: center"
>
<el-select
v-model=
"wordCloudvalue"
style=
"width: 120px; height: 28px"
>
<el-select
v-model=
"wordCloudvalue"
style=
"width: 120px; height: 28px"
>
<el-option
v-for=
"item in yearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
<el-option
v-for=
"item in yearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-select>
<el-select
v-model=
"wordCloudfield"
style=
"width: 120px; height: 28px; margin: 10px 24px 10px 5px"
>
<el-select
<el-option
v-for=
"item in fieldSelect"
:key=
"item.value"
:label=
"item.label"
v-model=
"wordCloudfield"
:value=
"item.value"
/>
style=
"width: 120px; height: 28px; margin: 10px 24px 10px 5px"
>
<el-option
v-for=
"item in fieldSelect"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-select>
</div>
</div>
</div>
</div>
...
@@ -202,17 +228,22 @@
...
@@ -202,17 +228,22 @@
<div
class=
"header-icon"
>
<div
class=
"header-icon"
>
<img
src=
"./assets/images/box3-header-icon.png"
alt=
""
/>
<img
src=
"./assets/images/box3-header-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"header-title"
<div
style=
"display: flex; width: 740px; justify-content: space-between; align-items: center"
>
class=
"header-title"
style=
"display: flex; width: 740px; justify-content: space-between; align-items: center"
>
<div>
<div>
{{
"科技人物观点涉及领域变化趋势"
}}
{{
"科技人物观点涉及领域变化趋势"
}}
</div>
</div>
<el-select
v-model=
"areaSelect"
style=
"width: 120px; height: 28px"
>
<el-select
v-model=
"areaSelect"
style=
"width: 120px; height: 28px"
>
<el-option
v-for=
"item in options"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
<el-option
v-for=
"item in options"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-select>
</div>
</div>
</div>
</div>
<div
class=
"box6-main"
id=
"box6Chart"
></div>
<div
class=
"box6-main"
id=
"box6Chart"
></div>
...
@@ -238,16 +269,22 @@
...
@@ -238,16 +269,22 @@
</div>
</div>
<div
style=
"display: flex; width: 730px; justify-content: space-between; align-items: center"
>
<div
style=
"display: flex; width: 730px; justify-content: space-between; align-items: center"
>
<div
class=
"box8-header-title"
>
{{
"主要人物涉华观点统计"
}}
</div>
<div
class=
"box8-header-title"
>
{{
"主要人物涉华观点统计"
}}
</div>
<div
style=
"gap: 8px;display: flex;"
>
<div
style=
"gap: 8px; display: flex"
>
<div
v-for=
"value in viewOption"
<div
:class=
"viewSelect !== value ? 'btn-box-samll' : 'btn-box-select-samll'"
>
v-for=
"value in viewOption"
:class=
"viewSelect !== value ? 'btn-box-samll' : 'btn-box-select-samll'"
>
{{
value
}}
{{
value
}}
</div>
</div>
<el-select
v-model=
"wordCloudvalue"
style=
"width: 120px; height: 28px; margin-top: -5px;"
>
<el-select
v-model=
"wordCloudvalue"
style=
"width: 120px; height: 28px; margin-top: -5px"
>
<el-option
v-for=
"item in yearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
<el-option
v-for=
"item in yearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-select>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -262,8 +299,13 @@
...
@@ -262,8 +299,13 @@
<DivideHeader
id=
"position4"
class=
"divide-header"
:titleText=
"'资源库'"
></DivideHeader>
<DivideHeader
id=
"position4"
class=
"divide-header"
:titleText=
"'资源库'"
></DivideHeader>
<div
class=
"home-main-footer-header"
>
<div
class=
"home-main-footer-header"
>
<div
class=
"btn-box"
>
<div
class=
"btn-box"
>
<div
class=
"btn"
:class=
"
{ btnActive: activeCate === cate }" v-for="(cate, index) in categoryList"
<div
:key="index" @click="handleClickCate(cate)">
class=
"btn"
:class=
"
{ btnActive: activeCate === cate }"
v-for="(cate, index) in categoryList"
:key="index"
@click="handleClickCate(cate)"
>
{{
cate
}}
{{
cate
}}
</div>
</div>
</div>
</div>
...
@@ -438,13 +480,22 @@ onMounted(() => {
...
@@ -438,13 +480,22 @@ onMounted(() => {
}
}
.home-wrapper
{
.home-wrapper
{
width
:
100%
;
height
:
calc
(
100vh
-
96px
);
position
:
relative
;
overflow-y
:
hidden
;
.home-main
{
.home-main
{
width
:
1920px
;
// width: 1920px;
margin
:
0
auto
;
// margin: 0 auto;
// background: url("./assets/images/background.png");
// background-repeat: no-repeat;
// background-color: #fff;
// background-size: contain;
width
:
100%
;
height
:
100%
;
overflow-y
:
auto
;
background
:
url("./assets/images/background.png")
;
background
:
url("./assets/images/background.png")
;
background-repeat
:
no-repeat
;
background-size
:
100%
100%
;
background-color
:
#fff
;
background-size
:
contain
;
.home-main-header
{
.home-main-header
{
display
:
flex
;
display
:
flex
;
...
...
src/views/thinkTank/index.vue
浏览文件 @
3ed377d1
...
@@ -78,12 +78,17 @@
...
@@ -78,12 +78,17 @@
</div>
</div>
<div
class=
"content"
>
{{
item
.
desc
}}
</div>
<div
class=
"content"
>
{{
item
.
desc
}}
</div>
<div
class=
"tag-box"
>
<div
class=
"tag-box"
>
<div
class=
"tag"
:class=
"
{
<div
class=
"tag"
:class=
"
{
tag1: val.status === 1,
tag1: val.status === 1,
tag2: val.status === 2,
tag2: val.status === 2,
tag3: val.status === 3,
tag3: val.status === 3,
tag4: val.status === 4
tag4: val.status === 4
}" v-for="(val, idx) in item.tagList" :key="idx">
}"
v-for="(val, idx) in item.tagList"
:key="idx"
>
{{
val
.
name
}}
{{
val
.
name
}}
</div>
</div>
</div>
</div>
...
@@ -108,8 +113,12 @@
...
@@ -108,8 +113,12 @@
</div>
</div>
</div>
</div>
<div
style=
"display: flex"
>
<div
style=
"display: flex"
>
<img
src=
"./assets/images/right-left-icon1.png"
alt=
""
<img
style=
"margin-top: 174px; width: 24px; height: 48px"
@
click=
"changeBox1Data('previous')"
/>
src=
"./assets/images/right-left-icon1.png"
alt=
""
style=
"margin-top: 174px; width: 24px; height: 48px"
@
click=
"changeBox1Data('previous')"
/>
<div
class=
"box1-main"
>
<div
class=
"box1-main"
>
<div
class=
"box1-main-left"
>
<div
class=
"box1-main-left"
>
<img
:src=
"box1Data[box1DataIndex]?.imageUrl"
alt=
""
/>
<img
:src=
"box1Data[box1DataIndex]?.imageUrl"
alt=
""
/>
...
@@ -117,7 +126,11 @@
...
@@ -117,7 +126,11 @@
<div
class=
"box1-main-right"
>
<div
class=
"box1-main-right"
>
<div
class=
"title"
>
{{
box1Data
[
box1DataIndex
]?.
reportName
}}
</div>
<div
class=
"title"
>
{{
box1Data
[
box1DataIndex
]?.
reportName
}}
</div>
<div
class=
"tag-box"
>
<div
class=
"tag-box"
>
<div
class=
"tag"
v-for=
"(item, index) in box1Data[box1DataIndex]?.industryVOList"
:key=
"index"
>
<div
class=
"tag"
v-for=
"(item, index) in box1Data[box1DataIndex]?.industryVOList"
:key=
"index"
>
{{
item
}}
{{
item
}}
</div>
</div>
</div>
</div>
...
@@ -133,8 +146,12 @@
...
@@ -133,8 +146,12 @@
</div>
</div>
</div>
</div>
</div>
</div>
<img
src=
"./assets/images/right-left-icon2.png"
alt=
""
<img
style=
"margin-top: 174px; width: 24px; height: 48px"
@
click=
"changeBox1Data('next')"
/>
src=
"./assets/images/right-left-icon2.png"
alt=
""
style=
"margin-top: 174px; width: 24px; height: 48px"
@
click=
"changeBox1Data('next')"
/>
</div>
</div>
</div>
</div>
<div
class=
"box2"
>
<div
class=
"box2"
>
...
@@ -149,11 +166,14 @@
...
@@ -149,11 +166,14 @@
</div>
</div>
<div
class=
"box2-main"
>
<div
class=
"box2-main"
>
<div
class=
"box2-main-item"
v-for=
"(item, index) in warningList"
:key=
"index"
>
<div
class=
"box2-main-item"
v-for=
"(item, index) in warningList"
:key=
"index"
>
<div
class=
"item-left"
:class=
"
{
<div
class=
"item-left"
:class=
"
{
itemLeftStatus1: item.status === '一般风险 ' || item.status === '暂无数值',
itemLeftStatus1: item.status === '一般风险 ' || item.status === '暂无数值',
itemLeftStatus2: item.status === '重大风险',
itemLeftStatus2: item.status === '重大风险',
itemLeftStatus3: item.status === '特别重大'
itemLeftStatus3: item.status === '特别重大'
}">
}"
>
{{
item
.
status
||
"一般风险"
}}
{{
item
.
status
||
"一般风险"
}}
</div>
</div>
<div
class=
"item-right"
>
<div
class=
"item-right"
>
...
@@ -207,14 +227,20 @@
...
@@ -207,14 +227,20 @@
<div
class=
"header-title"
>
{{
"智库人物动态"
}}
</div>
<div
class=
"header-title"
>
{{
"智库人物动态"
}}
</div>
</div>
</div>
<div
class=
"box4-tag-box"
>
<div
class=
"box4-tag-box"
>
<div
class=
"tag"
:class=
"
{
<div
class=
"tag"
:class=
"
{
tagActive: box4ActiveTag === tag.name,
tagActive: box4ActiveTag === tag.name,
tag1: tag.status === 1,
tag1: tag.status === 1,
tag2: tag.status === 2,
tag2: tag.status === 2,
tag3: tag.status === 3,
tag3: tag.status === 3,
tag4: tag.status === 4,
tag4: tag.status === 4,
tag5: tag.status === 5
tag5: tag.status === 5
}" v-for="(tag, index) in box4TagList" :key="index" @click="handleClickBox4Tag(tag.name)">
}"
v-for="(tag, index) in box4TagList"
:key="index"
@click="handleClickBox4Tag(tag.name)"
>
{{
tag
.
name
}}
{{
tag
.
name
}}
</div>
</div>
</div>
</div>
...
@@ -246,8 +272,13 @@
...
@@ -246,8 +272,13 @@
</div>
</div>
<div
class=
"box5-select-box"
>
<div
class=
"box5-select-box"
>
<el-select
v-model=
"box5selectetedYear"
placeholder=
"选择时间"
style=
"width: 120px"
>
<el-select
v-model=
"box5selectetedYear"
placeholder=
"选择时间"
style=
"width: 120px"
>
<el-option
v-for=
"item in box5YearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
<el-option
@
click=
"changeBox5Data(item.value)"
/>
v-for=
"item in box5YearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
@
click=
"changeBox5Data(item.value)"
/>
</el-select>
</el-select>
</div>
</div>
</div>
</div>
...
@@ -261,8 +292,13 @@
...
@@ -261,8 +292,13 @@
<div
class=
"header-title"
>
{{
"政策建议领域分布"
}}
</div>
<div
class=
"header-title"
>
{{
"政策建议领域分布"
}}
</div>
<div
class=
"box6-select-box"
>
<div
class=
"box6-select-box"
>
<el-select
v-model=
"box6selectetedYear"
placeholder=
"选择时间"
style=
"width: 120px"
>
<el-select
v-model=
"box6selectetedYear"
placeholder=
"选择时间"
style=
"width: 120px"
>
<el-option
v-for=
"item in box6YearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
<el-option
@
click=
"handleBox6()"
/>
v-for=
"item in box6YearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
@
click=
"handleBox6()"
/>
</el-select>
</el-select>
</div>
</div>
</div>
</div>
...
@@ -291,19 +327,28 @@
...
@@ -291,19 +327,28 @@
</div>
</div>
<div
class=
"box8-select-box"
>
<div
class=
"box8-select-box"
>
<el-select
v-model=
"box8selectetedYear"
placeholder=
"选择时间"
style=
"width: 120px"
>
<el-select
v-model=
"box8selectetedYear"
placeholder=
"选择时间"
style=
"width: 120px"
>
<el-option
v-for=
"item in box8YearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
<el-option
@
click=
"changeBox8Data(item.value)"
/>
v-for=
"item in box8YearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
@
click=
"changeBox8Data(item.value)"
/>
</el-select>
</el-select>
</div>
</div>
</div>
</div>
<div
class=
"box8-main"
>
<div
class=
"box8-main"
>
<div
class=
"box8-item"
v-for=
"(item, index) in box8Data"
:key=
"index"
>
<div
class=
"box8-item"
v-for=
"(item, index) in box8Data"
:key=
"index"
>
<div
class=
"item-left"
<div
:class=
"
{ itemBold1: index === 0, itemBold2: index === 1, itemBold3: index === 2 }">
class=
"item-left"
:class=
"
{ itemBold1: index === 0, itemBold2: index === 1, itemBold3: index === 2 }"
>
{{
index
+
1
}}
{{
index
+
1
}}
</div>
</div>
<div
class=
"item-center"
<div
:class=
"
{ itemBold1: index === 0, itemBold2: index === 1, itemBold3: index === 2 }">
class=
"item-center"
:class=
"
{ itemBold1: index === 0, itemBold2: index === 1, itemBold3: index === 2 }"
>
{{
item
.
clause
}}
{{
item
.
clause
}}
</div>
</div>
<div
class=
"item-right"
>
{{
`${item.count
}
份报告 >`
}}
<
/div
>
<div
class=
"item-right"
>
{{
`${item.count
}
份报告 >`
}}
<
/div
>
...
@@ -317,8 +362,13 @@
...
@@ -317,8 +362,13 @@
<
DivideHeader
id
=
"position4"
class
=
"divide-header"
:
titleText
=
"'资源库'"
><
/DivideHeader
>
<
DivideHeader
id
=
"position4"
class
=
"divide-header"
:
titleText
=
"'资源库'"
><
/DivideHeader
>
<
div
class
=
"home-main-footer-header"
>
<
div
class
=
"home-main-footer-header"
>
<
div
class
=
"btn-box"
>
<
div
class
=
"btn-box"
>
<
div
class
=
"btn"
:
class
=
"{ btnActive: activeCate === cate
}
"
v
-
for
=
"(cate, index) in categoryList"
<
div
:
key
=
"index"
@
click
=
"handleClickCate(cate)"
>
class
=
"btn"
:
class
=
"{ btnActive: activeCate === cate
}
"
v
-
for
=
"(cate, index) in categoryList"
:
key
=
"index"
@
click
=
"handleClickCate(cate)"
>
{{
cate
}}
{{
cate
}}
<
/div
>
<
/div
>
<
/div
>
<
/div
>
...
@@ -332,11 +382,21 @@
...
@@ -332,11 +382,21 @@
<
/div
>
<
/div
>
<
div
class
=
"select-main"
>
<
div
class
=
"select-main"
>
<
div
class
=
"checkbox-group"
>
<
div
class
=
"checkbox-group"
>
<
el
-
checkbox
v
-
model
=
"checkAll"
:
indeterminate
=
"isIndeterminate"
@
change
=
"handleCheckAllChange"
>
<
el
-
checkbox
v
-
model
=
"checkAll"
:
indeterminate
=
"isIndeterminate"
@
change
=
"handleCheckAllChange"
>
全部领域
全部领域
<
/el-checkbox
>
<
/el-checkbox
>
<
el
-
checkbox
v
-
for
=
"research in areaList"
:
key
=
"research.id"
v
-
model
=
"selectedAreaList"
<
el
-
checkbox
:
label
=
"research.id"
@
change
=
"handleCheckedAreaChange()"
class
=
"filter-checkbox"
>
v
-
for
=
"research in areaList"
:
key
=
"research.id"
v
-
model
=
"selectedAreaList"
:
label
=
"research.id"
@
change
=
"handleCheckedAreaChange()"
class
=
"filter-checkbox"
>
{{
research
.
name
}}
{{
research
.
name
}}
<
/el-checkbox
>
<
/el-checkbox
>
<
/div
>
<
/div
>
...
@@ -350,8 +410,13 @@
...
@@ -350,8 +410,13 @@
<
/div
>
<
/div
>
<
div
class
=
"select-main"
>
<
div
class
=
"select-main"
>
<
div
class
=
"checkbox-group"
>
<
div
class
=
"checkbox-group"
>
<
el
-
checkbox
v
-
for
=
"time in pubTimeList"
:
key
=
"time.id"
v
-
model
=
"selectedPubTimeList"
:
label
=
"time.id"
<
el
-
checkbox
class
=
"filter-checkbox"
>
v
-
for
=
"time in pubTimeList"
:
key
=
"time.id"
v
-
model
=
"selectedPubTimeList"
:
label
=
"time.id"
class
=
"filter-checkbox"
>
{{
time
.
name
}}
{{
time
.
name
}}
<
/el-checkbox
>
<
/el-checkbox
>
<
/div
>
<
/div
>
...
@@ -374,13 +439,16 @@
...
@@ -374,13 +439,16 @@
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
div
class
=
"right-footer"
>
<
div
class
=
"right-footer"
>
<
div
class
=
"info"
>
<
div
class
=
"info"
>
共
{{
total
}}
项调查
<
/div
>
共
{{
total
}}
项调查
<
/div
>
<
div
class
=
"page-box"
>
<
div
class
=
"page-box"
>
<
el
-
pagination
:
page
-
size
=
"12"
background
layout
=
"prev, pager, next"
:
total
=
"total"
<
el
-
pagination
@
current
-
change
=
"handleCurrentChange()"
:
current
-
page
=
"currentPage"
/>
:
page
-
size
=
"12"
background
layout
=
"prev, pager, next"
:
total
=
"total"
@
current
-
change
=
"handleCurrentChange()"
:
current
-
page
=
"currentPage"
/>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
...
@@ -1184,11 +1252,11 @@ const curFooterList = ref([
...
@@ -1184,11 +1252,11 @@ const curFooterList = ref([
}
}
]);
]);
const
currentPage
=
ref
(
1
);
const
currentPage
=
ref
(
1
);
const
total
=
ref
(
0
)
const
total
=
ref
(
0
)
;
// 处理页码改变事件
// 处理页码改变事件
const
handleCurrentChange
=
page
=>
{
const
handleCurrentChange
=
page
=>
{
currentPage
.
value
=
page
;
currentPage
.
value
=
page
;
handleGetetThinkTankReport
()
handleGetetThinkTankReport
()
;
}
;
}
;
//获取智库报告
//获取智库报告
const
handleGetetThinkTankReport
=
async
()
=>
{
const
handleGetetThinkTankReport
=
async
()
=>
{
...
@@ -1197,13 +1265,13 @@ const handleGetetThinkTankReport = async () => {
...
@@ -1197,13 +1265,13 @@ const handleGetetThinkTankReport = async () => {
pageSize
:
12
,
pageSize
:
12
,
researchTypeIds
:
selectedAreaList
.
value
,
researchTypeIds
:
selectedAreaList
.
value
,
years
:
2025
years
:
2025
}
}
;
try
{
try
{
const
res
=
await
getThinkTankReport
(
params
);
const
res
=
await
getThinkTankReport
(
params
);
console
.
log
(
"智库报告"
,
res
);
console
.
log
(
"智库报告"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
if
(
res
.
code
===
200
&&
res
.
data
)
{
curFooterList
.
value
=
res
.
data
.
content
;
curFooterList
.
value
=
res
.
data
.
content
;
total
.
value
=
res
.
data
.
totalElements
total
.
value
=
res
.
data
.
totalElements
;
}
}
}
catch
(
error
)
{
}
catch
(
error
)
{
console
.
error
(
"获取智库报告error"
,
error
);
console
.
error
(
"获取智库报告error"
,
error
);
...
@@ -1211,7 +1279,7 @@ const handleGetetThinkTankReport = async () => {
...
@@ -1211,7 +1279,7 @@ const handleGetetThinkTankReport = async () => {
}
;
}
;
const
handleClick
=
tank
=>
{
const
handleClick
=
tank
=>
{
console
.
log
(
tank
)
console
.
log
(
tank
)
;
// router.push(
{
name
:
"ThinkTankDetail"
,
params
:
{
id
:
tank
.
id
}
}
);
// router.push(
{
name
:
"ThinkTankDetail"
,
params
:
{
id
:
tank
.
id
}
}
);
const
curRoute
=
router
.
resolve
({
name
:
"ThinkTankDetail"
,
params
:
{
id
:
tank
.
id
,
name
:
tank
.
name
}
}
);
const
curRoute
=
router
.
resolve
({
name
:
"ThinkTankDetail"
,
params
:
{
id
:
tank
.
id
,
name
:
tank
.
name
}
}
);
window
.
open
(
curRoute
.
href
,
"_blank"
);
window
.
open
(
curRoute
.
href
,
"_blank"
);
...
@@ -1239,7 +1307,7 @@ onMounted(async () => {
...
@@ -1239,7 +1307,7 @@ onMounted(async () => {
handleBox7
();
handleBox7
();
handleGetHylyList
();
handleGetHylyList
();
handleGetThinkTankHot
(
getDateYearsAgo
(
1
));
handleGetThinkTankHot
(
getDateYearsAgo
(
1
));
handleGetetThinkTankReport
()
handleGetetThinkTankReport
()
;
}
);
}
);
<
/script
>
<
/script
>
...
@@ -1249,17 +1317,20 @@ onMounted(async () => {
...
@@ -1249,17 +1317,20 @@ onMounted(async () => {
}
}
.
home
-
wrapper
{
.
home
-
wrapper
{
width
:
100
%
;
height
:
calc
(
100
vh
-
96
px
);
position
:
relative
;
overflow
-
y
:
hidden
;
.
home
-
main
{
.
home
-
main
{
width
:
1920
px
;
width
:
100
%
;
margin
:
0
auto
;
height
:
100
%
;
overflow
-
y
:
auto
;
background
:
url
(
"./assets/images/background.png"
);
background
:
url
(
"./assets/images/background.png"
);
background
-
size
:
100
%
100
%
;
background
-
size
:
100
%
100
%
;
.
home
-
main
-
header
{
.
home
-
main
-
header
{
display
:
flex
;
display
:
flex
;
flex
-
direction
:
column
;
flex
-
direction
:
column
;
align
-
items
:
center
;
align
-
items
:
center
;
.
home
-
main
-
header
-
top
{
.
home
-
main
-
header
-
top
{
box
-
sizing
:
border
-
box
;
box
-
sizing
:
border
-
box
;
width
:
100
%
;
width
:
100
%
;
...
@@ -2937,7 +3008,6 @@ onMounted(async () => {
...
@@ -2937,7 +3008,6 @@ onMounted(async () => {
box
-
shadow
:
none
!
important
;
box
-
shadow
:
none
!
important
;
}
}
.
page
{
.
page
{
width
:
1600
px
;
width
:
1600
px
;
height
:
40
px
;
height
:
40
px
;
...
@@ -2957,7 +3027,6 @@ onMounted(async () => {
...
@@ -2957,7 +3027,6 @@ onMounted(async () => {
letter
-
spacing
:
0
px
;
letter
-
spacing
:
0
px
;
text
-
align
:
left
;
text
-
align
:
left
;
}
}
}
}
:
deep
(.
el
-
pagination
)
{
:
deep
(.
el
-
pagination
)
{
...
@@ -2977,17 +3046,12 @@ onMounted(async () => {
...
@@ -2977,17 +3046,12 @@ onMounted(async () => {
font
-
size
:
16
px
;
font
-
size
:
16
px
;
font
-
weight
:
400
;
font
-
weight
:
400
;
font
-
family
:
"Microsoft YaHei"
;
font
-
family
:
"Microsoft YaHei"
;
}
}
:
deep
(.
el
-
pagination
.
is
-
background
.
el
-
pager
li
.
is
-
active
)
{
:
deep
(.
el
-
pagination
.
is
-
background
.
el
-
pager
li
.
is
-
active
)
{
background
-
color
:
#
fff
;
background
-
color
:
#
fff
;
color
:
rgba
(
22
,
119
,
255
,
1
);
color
:
rgba
(
22
,
119
,
255
,
1
);
border
-
color
:
rgba
(
22
,
119
,
255
,
1
);
border
-
color
:
rgba
(
22
,
119
,
255
,
1
);
}
}
:
deep
(.
el
-
pagination
.
is
-
background
.
el
-
pager
li
.
is
-
ellipsis
)
{
:
deep
(.
el
-
pagination
.
is
-
background
.
el
-
pager
li
.
is
-
ellipsis
)
{
...
...
出口管制接口-4.md
0 → 100644
浏览文件 @
3ed377d1
# 交互消息类
## ApiResult
```
java
public
class
ApiResult
<
T
>
{
@ApiModelProperty
(
"响应码"
)
private
int
code
;
@ApiModelProperty
(
"响应消息"
)
private
String
message
;
@ApiModelProperty
(
"是否成功"
)
private
boolean
success
;
@ApiModelProperty
(
"响应数据"
)
private
T
data
;
}
```
## LatestExportControlInfo
```
java
public
class
LatestExportControlInfo
{
// 出口管制事件ID
private
String
id
;
// 管制信息标题
private
String
name
;
// 管制内容简述
private
String
summary
;
// 发布机构名称
private
String
postOrgName
;
// 发布时间
private
Date
postDate
;
// 涉及领域
private
List
<
String
>
domains
;
// 涉及中国实体数
private
Integer
cnEntityCount
;
// 涉及主要实体
private
List
<
SanctionListBean
>
sanEntities
;
}
```
## AnnualCount
```
java
public
class
AnnualCount
{
// 年份
private
Integer
year
;
// 数量
private
Integer
count
;
// 领域列表
private
List
<
String
>
domain
;
}
```
## DomainCount
```
java
public
class
DomainCount
{
// 制裁类型名称
private
String
sanTypeName
;
// 领域统计信息
private
List
<
BaseCount
>
domainCountInfo
;
}
```
## BaseCount
```
java
public
class
BaseCount
{
// 统计名称
private
String
name
;
// 数量
private
Integer
count
;
}
```
## ExportPageQuery
```
java
public
class
ExportPageQuery
extends
BasePageQuery
{
// 类型名称(实体清单)
private
String
typeName
;
// 制裁时间
@JsonFormat
(
pattern
=
"yyyy-MM-dd"
,
timezone
=
"GMT+8"
)
private
Date
sanctionDate
;
// 是否只看中国实体
private
Boolean
isCn
;
}
```
## BasePageQuery
```
java
public
class
BasePageQuery
{
// 查询页
private
Integer
pageNum
=
1
;
// 每页数量
private
Integer
pageSize
=
10
;
// 排序字段
private
String
sortField
;
// 排序方式
private
String
sortOrder
;
}
```
## SanctionProcess
```
java
public
class
SanctionProcess
{
// 制裁事件ID
private
String
id
;
// 制裁时间
private
Date
postDate
;
// 制裁标题
private
String
name
;
// 制裁内容简述
private
String
summary
;
// 涉及中国实体数
private
Integer
cnEntityCount
;
}
```
## SanctionListBean
```
java
public
class
SanctionListBean
extends
BaseBean
{
@Id
@Column
(
name
=
"ID"
,
nullable
=
false
)
private
String
id
;
@Column
(
name
=
"ENTITY_NAME"
)
private
String
entityName
;
@Column
(
name
=
"SAN_TYPE_ID"
)
private
Integer
sanTypeId
;
@Column
(
name
=
"ENTITY_TYPE"
)
private
Integer
entityType
;
@Column
(
name
=
"ENTITY_ID"
)
private
String
entityId
;
@Column
(
name
=
"ENTITY_NAME_ZH"
)
private
String
entityNameZh
;
@Column
(
name
=
"COUNTRY_ID"
)
private
String
countryId
;
@Column
(
name
=
"SAN_REASON"
)
private
String
sanReason
;
@Column
(
name
=
"SAN_INTENSITY"
)
private
char
sanIntensity
;
@Column
(
name
=
"START_TIME"
)
private
Date
startTime
;
@Column
(
name
=
"END_TIME"
)
private
Date
endTime
;
@Column
(
name
=
"IS_KEY"
)
private
char
isKey
;
@Transient
private
List
<
TechDomainBean
>
techDomainList
;
/**
* 领域列表
*/
@Transient
private
List
<
String
>
techDomains
;
/**
* 50%规则子企业数
*/
@Transient
private
Integer
ruleOrgCount
;
// 50%规则子企业列表
@Transient
private
List
<
Organization
>
ruleOrgList
;
}
```
## OrgInfo
```
java
public
class
OrgInfo
{
// 机构id
private
String
id
;
// 机构名称
private
String
orgName
;
// 机构中文名称
private
String
orgNameZh
;
// 相关制裁措施列表
private
List
<
String
>
sanTypeList
;
// 机构职责
private
String
orgDuty
;
// 机构图片
private
String
imageUrl
;
// 人员列表
private
List
<
PersonInfo
>
personList
;
// 领域列表
private
List
<
String
>
domainList
;
// 市值
private
Double
marketValue
;
// 市值变化(-1:降低;0:持平:1:上升)
private
Integer
marketChange
;
// 地址
private
String
address
;
// 类型
private
String
orgType
;
// 行业
private
List
<
String
>
industryList
;
// 科研仪器数
private
Integer
instrumentNum
;
}
```
## PersonInfo
```
java
public
class
PersonInfo
{
// id
private
String
id
;
// 人物类别
private
Integer
type
;
// 姓名
private
String
name
;
// 党派
private
String
party
;
// 职位
private
String
position
;
// 头像链接
private
String
imageUrl
;
}
```
## SanCountInfo
```
java
public
class
SanCountInfo
{
// 实体数
private
Integer
entityNum
;
// 实体变动数
private
Integer
entityChange
;
// 上市公司数
private
Integer
listedCompanyNum
;
// 上市公司变动数
private
Integer
listedCompanyChange
;
// 涉及领域名数
private
Integer
domainNum
;
// 涉及领域变动数
private
Integer
domainChange
;
// 实体类型数
private
Integer
typeNum
;
// 实体类型变动数
private
Integer
typeChange
;
}
```
## Chain
```
java
public
class
Chain
{
@Id
@Column
(
name
=
"id"
)
@GeneratedValue
(
strategy
=
GenerationType
.
IDENTITY
)
private
Integer
id
;
// 名称
@Column
(
name
=
"name"
)
private
String
name
;
// 中文名称
@Column
(
name
=
"name_zh"
)
private
String
nameZh
;
// 值
@Column
(
name
=
"description"
)
private
String
description
;
// 父级id
@Column
(
name
=
"parent_id"
)
private
Integer
parentId
;
// 是否为产业链主分支
@Column
(
name
=
"is_main_branch"
)
private
String
isMainBranch
;
// 下属产业链分支
@Transient
private
List
<
Chain
>
children
;
}
```
## FishboneResp
```
java
public
class
FishboneResp
<
T
>
{
private
String
text
;
private
List
<
T
>
causes
;
}
```
## AreasStreamResp
```
java
public
class
AreasStreamResp
{
// 上游国内企业数量
private
int
upstreamInternalCount
;
// 上游国内占比
private
double
upstreamInternalRate
;
// 上游受制裁企业数量
private
int
upstreamEntityCount
;
// 上游受制裁占比
private
double
upstreamEntityRate
;
// 中游国内企业数量
private
int
midstreamInternalCount
;
// 中游国内占比
private
double
midstreamInternalRate
;
// 中游受制裁企业数量
private
int
midstreamEntityCount
;
// 中游受制裁占比
private
double
midstreamEntityRate
;
// 下游国内企业数量
private
int
downstreamInternalCount
;
// 下游国内占比
private
double
downstreamInternalRate
;
// 下游受制裁企业数量
private
int
downstreamEntityCount
;
// 下游受制裁占比
private
double
downstreamEntityRate
;
}
```
## AnnualDomainQuery
```
java
public
class
AnnualDomainQuery
{
// 开始年份
private
Integer
startYear
;
// 结束年份
private
Integer
endYear
;
// 是否考虑50%规则
private
Boolean
isRule
;
}
```
## AnnualDomainCount
```
java
public
class
AnnualDomainCount
{
// 年度领域统计
private
List
<
DomainCount
>
yearDomainCount
;
// 所有领域
private
List
<
BaseCount
>
domians
;
}
```
## SanctionTypeBean
```
java
public
class
SanctionTypeBean
extends
BaseBean
{
@Id
@Column
(
name
=
"ID"
,
nullable
=
false
)
private
Integer
id
;
@Column
(
name
=
"NAME"
)
private
String
name
;
@Column
(
name
=
"NAME_ZH"
)
private
String
nameZh
;
@Column
(
name
=
"NAME_ABBR"
)
private
String
nameAbbr
;
@Column
(
name
=
"DESCRIPTION"
)
private
String
description
;
// 发布国家
@Column
(
name
=
"POST_COUNTRY_ID"
)
private
String
postCountryId
;
// 发布机构
@Column
(
name
=
"POST_ORG_ID"
)
private
String
postOrgId
;
// 是否出口管制 1:是 0:否
@Column
(
name
=
"IS_EXPORT_CONTROL"
)
private
String
isExportControl
;
// 总发布次数
@Transient
private
Integer
postCount
;
}
```
## Organization
```
java
public
class
Organization
extends
BaseBean
{
// 机构id
@Id
@Column
(
name
=
"id"
,
nullable
=
false
)
private
String
id
;
// 机构名称
@Column
(
name
=
"org_name"
,
nullable
=
false
)
private
String
orgName
;
// 组织机构代码
@Column
(
name
=
"uscc"
)
private
String
uscc
;
// 机构简称
@Column
(
name
=
"org_abb"
)
private
String
orgAbb
;
// 机构英文名称
@Column
(
name
=
"org_name_en"
)
private
String
orgNameEn
;
// 机构英文简称
@Column
(
name
=
"org_abb_en"
)
private
String
orgAbbEn
;
// 机构别名
@Column
(
name
=
"org_alias"
)
private
String
orgAlias
;
// 机构曾用名
@Column
(
name
=
"org_former_name"
)
private
String
orgFormerName
;
// 机构类型id
@Column
(
name
=
"org_type_id"
)
private
Long
orgTypeId
;
// 机构简介
@Column
(
name
=
"org_introduction"
)
private
String
orgIntroduction
;
// 营业范围
@Column
(
name
=
"business_scope"
)
private
String
businessScope
;
// 行业id
@Column
(
name
=
"domain_ids"
)
private
String
domainIds
;
// 行业代码
@Column
(
name
=
"economic_industry_code"
)
private
String
economicIndustryCode
;
// 经济行业名称
@Column
(
name
=
"economic_industry_name"
)
private
String
economicIndustryName
;
// 国家id
@Column
(
name
=
"country_id"
)
private
String
countryId
;
// 省份
@Column
(
name
=
"province"
)
private
String
province
;
// 城市
@Column
(
name
=
"city"
)
private
String
city
;
// 区县
@Column
(
name
=
"county"
)
private
String
county
;
// 详细地址
@Column
(
name
=
"address"
)
private
String
address
;
// 成立时间
@Column
(
name
=
"establishment_date"
)
private
LocalDate
establishmentDate
;
// 变更时间
@Column
(
name
=
"issuing_date"
)
private
String
issuingDate
;
// 营业期限自
@Column
(
name
=
"operation_period_from"
)
private
String
operationPeriodFrom
;
// 营业期限至
@Column
(
name
=
"operation_period_until"
)
private
String
operationPeriodUntil
;
// 营业状态
@Column
(
name
=
"business_status"
)
private
String
businessStatus
;
// 法人id
@Column
(
name
=
"legal_representative_id"
)
private
String
legalRepresentativeId
;
/// 法人
@Column
(
name
=
"legal_representative"
)
private
String
legalRepresentative
;
// 联系电话
@Column
(
name
=
"telephone"
)
private
String
telephone
;
// 邮箱
@Column
(
name
=
"email"
)
private
String
email
;
// 邮政编码
@Column
(
name
=
"postcode"
)
private
String
postcode
;
// 网址
@Column
(
name
=
"url"
)
private
String
url
;
// 员工人数
@Column
(
name
=
"number_of_employees"
)
private
String
numberOfEmployees
;
// 注册资金
@Column
(
name
=
"registered_capital"
)
private
String
registeredCapital
;
// LOGO链接
@Column
(
name
=
"logo_url"
)
private
String
logoUrl
;
@Column
(
name
=
"create_by"
)
private
String
createBy
;
@Column
(
name
=
"update_by"
)
private
String
updateBy
;
@Column
(
name
=
"p_org_id"
)
private
String
pOrgId
;
}
```
## EventInfo
```
java
public
class
EventInfo
extends
BaseBean
{
@Id
@Column
(
name
=
"id"
)
@ApiModelProperty
(
value
=
"唯一标识"
)
private
String
id
;
@Column
(
name
=
"title"
)
@ApiModelProperty
(
value
=
"标题"
)
private
String
title
;
@Column
(
name
=
"event_time"
)
@ApiModelProperty
(
value
=
"事件时间"
)
@JsonFormat
(
pattern
=
"yyyy-MM-dd"
)
@DateTimeFormat
(
pattern
=
"yyyy-MM-dd"
)
private
Date
eventTime
;
@Column
(
name
=
"summary"
)
@ApiModelProperty
(
value
=
"摘要"
)
private
String
summary
;
@Column
(
name
=
"summary_zh"
)
@ApiModelProperty
(
value
=
"摘要译文"
)
private
String
summaryZh
;
@Column
(
name
=
"event_type"
)
@ApiModelProperty
(
value
=
"事件类别"
)
private
String
eventType
;
@Column
(
name
=
"CONTENT"
)
@ApiModelProperty
(
value
=
"主要内容"
)
private
String
content
;
@Column
(
name
=
"title_zh"
)
@ApiModelProperty
(
value
=
"标题译文"
)
private
String
titleZh
;
@Column
(
name
=
"content_zh"
)
@ApiModelProperty
(
value
=
"主要内容译文"
)
private
String
contentZh
;
@Column
(
name
=
"type"
)
@ApiModelProperty
(
value
=
"事件类别"
)
private
String
type
;
@Column
(
name
=
"LOCATION"
)
@ApiModelProperty
(
value
=
"事件地点"
)
private
String
location
;
@Column
(
name
=
"country"
)
@ApiModelProperty
(
value
=
"国家"
)
private
String
country
;
}
```
## RegionCount
```
java
public
class
RegionCount
{
// 名称
private
String
name
;
// 数量
private
Integer
count
;
// 经度
private
Double
lon
;
// 纬度
private
Double
lat
;
}
```
## EventQuery
```
java
public
class
EventQuery
extends
BasePageQuery
{
// 制裁记录ID (暂时无作用,后续根据ID查)
private
Integer
sanctionId
;
// 制裁时间
@JsonFormat
(
pattern
=
"yyyy-MM-dd"
,
timezone
=
"GMT+8"
)
private
Date
sanctionDate
;
}
```
## RuleEntityCount
```
JAVA
public class RuleEntityCount {
// 总数
private Integer totalCount;
// 50%规则关联数
private Integer ruleCount;
}
```
## RiskSignalVO
```
java
public
class
RiskSignalVO
{
@ApiModelProperty
(
"风险信号id"
)
private
Long
signalId
;
@ApiModelProperty
(
"风险信号标题"
)
private
String
signalTitle
;
@ApiModelProperty
(
"风险信号时间"
)
private
LocalDate
signalTime
;
@ApiModelProperty
(
"风险信号等级"
)
private
String
signalLevel
;
@ApiModelProperty
(
"风险信号关联法案id"
)
private
String
billId
;
@ApiModelProperty
(
"风险信号关联政令id"
)
private
Long
orderId
;
@ApiModelProperty
(
"风险信号关联报告id"
)
private
String
reportId
;
@ApiModelProperty
(
"风险信号关联制裁id"
)
private
Integer
sanId
;
}
```
## NewsVO
```
java
public
class
NewsVO
{
@ApiModelProperty
(
value
=
"新闻id"
)
private
String
newsId
;
@ApiModelProperty
(
value
=
"新闻时间"
)
private
LocalDate
newsDate
;
@ApiModelProperty
(
value
=
"新闻内容"
)
private
String
newsContent
;
@ApiModelProperty
(
value
=
"新闻标题"
)
private
String
newsTitle
;
@ApiModelProperty
(
value
=
"新闻机构"
)
private
String
newsOrg
;
@ApiModelProperty
(
value
=
"新闻图片"
)
private
String
newsImage
;
}
```
## RemarksVO
```
java
public
class
RemarksVO
{
@ApiModelProperty
(
value
=
"人物id"
)
private
String
personId
;
@ApiModelProperty
(
value
=
"人物图像"
)
private
String
personImage
;
@ApiModelProperty
(
value
=
"人物名称"
)
private
String
personName
;
@ApiModelProperty
(
value
=
"言论ID"
)
private
Long
remarksId
;
@ApiModelProperty
(
value
=
"人物言论"
)
private
String
remarks
;
@ApiModelProperty
(
value
=
"时间"
)
private
LocalDateTime
time
;
@ApiModelProperty
(
value
=
"言论平台名称"
)
private
String
orgName
;
}
```
# 字典
## 领域类别(id:name)
1:人工智能、2:生物科技、3:新一代信息技术、4:量子科技、5:新能源、6:集成电路、7:海洋、8:先进制造、9:新材料、10:航空航天、11:深海、12:极地、13:太空、14:核
## 实体类别(id:name)
1:人物、2:机构、7:地址
## 人物类别(待定)
1:政府官员、2:科技领袖、3:顶级科学家、4:国会议员
# 出口管制
## **获取出口管制类清单统计信息**
请求地址:/sanctionList/export/getTotalInfo
请求类型:GET
输入参数:
参数:无输入
请求头:携带token,内容为:
```
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult
<List
<
SanctionTypeBean
>
>
## 最新出口管制政策(4条)
请求地址:/entitiesDataInfo/getLatestInfo
请求类型:GET
输入参数:
参数:无输入
请求头:携带token,内容为:
```
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult
<LatestExportControlInfo>
## 发布(更新)频度
请求地址:/entitiesDataCount/getAnnualCount
请求类型:GET
输入参数:
参数:Integer sanTypeId(制裁类别)
实体清单发布频度:1;CCL发布频度:13
请求头:携带token,内容为:
```
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult
<List
<
AnnualCount
>
>
## **制裁领域分析**(20251215)
请求地址:/entitiesDataCount/getSanDomainCount
请求类型:GET
输入参数:
参数:Boolean rule(是否勾选50%规则)
请求头:携带token,内容为:
```
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult
<List
<
DomainCount
>
>
## **历次制裁过程**
请求地址:/entitiesDataCount/getSanctionProcess
请求类型:POST
输入参数:
参数:ExportPageQuery exportPageQuery
请求头:携带token,内容为:
```
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult
<Page
<
SanctionProcess
>
>
## **制裁实体清单**列表(20251215)
请求地址:/sanctionList/pageQuery
请求类型:POST
输入参数:
参数:ExportPageQuery exportPageQuery
出口管制-概览页请求时:typeName=实体清单
实体清单-制裁概览页请求时:typeName=实体清单,sanctionDate=该次制裁的具体时间
请求头:携带token,内容为:
```
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult
<Page
<
SanctionListBean
>
>
## **发布机构与重点人物**
请求地址:/sanctionList/getPublishedOrg
请求类型:GET
输入参数:
参数:Integer sanTypeId
暂时固定输入:1;对应实体清单发布机构
请求头:携带token
输出结果:ApiResult
<OrgInfo>
## **领域分布查询**
请求地址:/entitiesDataInfo/getDomianDistribution
请求类型:GET
输入参数:
参数:String sanctionDate (制裁时间)
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **类型分布查询**
请求地址:/entitiesDataInfo/getTypeDistribution
请求类型:GET
输入参数:
参数:String sanctionDate (制裁时间)
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **区域分布查询**
请求地址:/entitiesDataInfo/getRegionDistribution
请求类型:GET
输入参数:
参数:String sanctionDate (制裁时间)
请求头:携带token
输出结果:ApiResult
<List
<
RegionCount
>
>
## **制裁理由查询**
请求地址:/entitiesDataInfo/getSanReason
请求类型:GET
输入参数:
参数:String sanctionDate (制裁时间)
请求头:携带token
输出结果:ApiResult
<List
<
String
>
>
## **深度挖掘-制裁信息变化统计**
请求地址:/entitiesDataInfo/getSanCountInfo
请求类型:GET
输入参数:
参数:String sanctionDate (制裁时间)
请求头:携带token
输出结果:ApiResult
<SanCountInfo>
## **年度实体数统计**
请求地址:/entitiesDataInfo/getCountByDomianAndType
请求类型:GET
输入参数:
参数:String domianId (非必需,领域类别ID),Integer typeId (非必需,实体类别ID)
参考字典
请求头:携带token
输出结果:ApiResult
<SanCountInfo>
## **重点实体列表查询**
请求地址:/entitiesDataInfo/getKeyEntities
请求类型:GET
输入参数:
参数:String sanctionDate(必需),String searchText(非必需,检索文本)
请求头:携带token
输出结果:ApiResult
<List
<
OrgInfo
>
>
## **上市企业制裁强度**
请求地址:/entitiesDataInfo/listedEntity/sanInfo
请求类型:GET
输入参数:
参数:无
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **上市企业融资变化情况**
请求地址:/entitiesDataInfo/listedEntity/financing
请求类型:GET
输入参数:
参数:无
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **上市企业市值变化情况**
请求地址:/entitiesDataInfo/listedEntity/market
请求类型:GET
输入参数:
参数:无
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **重点上市企业列表**
请求地址:/entitiesDataInfo/listedEntity/keyEntity
请求类型:GET
输入参数:
参数:String sanctionDate(必需),String searchText(非必需,检索文本)
请求头:携带token
输出结果:ApiResult
<List
<
OrgInfo
>
>
## **历次制裁涉及领域数查询**
请求地址:/entitiesDataInfo/getPreviousDomian
请求类型:GET
输入参数:
参数:无
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **具体领域的制裁实体数统计**
请求地址:/entitiesDataInfo/getDomianAnnual
请求类型:GET
输入参数:
参数:String domainId
请求头:携带token
输出结果:ApiResult
<List
<
AnnualCount
>
>
## **具体实体类型的制裁实体数统计**
请求地址:/entitiesDataInfo/getEntityTypeAnnual
请求类型:GET
输入参数:
参数:Integer entityTypeId
请求头:携带token
输出结果:ApiResult
<List
<
AnnualCount
>
>
## **产业链结构查询**
请求地址:/chain/getChainTree
请求类型:GET
输入参数:
参数:Integer chainId,非必需
请求头:携带token
输出结果:ApiResult
<List
<
Chain
>
>
## **根据领域获取产业链信息**
请求地址:/chain/getChainInfo
请求类型:GET
输入参数:
参数:Integer domainId,领域ID
请求头:携带token
输出结果:ApiResult
<List
<
Chain
>
>
## **产业链鱼骨图信息查询**
请求地址:/chain/getChainFishbone
请求类型:GET
输入参数:
参数:Integer chainId
请求头:携带token
输出结果:ApiResult
<FishboneResp>
## **产业链中国企业实体信息查询**
请求地址:/chain/getChainEntityStat
请求类型:GET
输入参数:
参数:Integer chainId
请求头:携带token
输出结果:ApiResult
<AreasStreamResp>
## **实体列表查询**
请求地址:/entitiesDataInfo/getEntityList
请求类型:GET
输入参数:
参数:String sanctionDate(制裁时间),String domainId(领域ID)
请求头:携带token
输出结果:ApiResult
<List
<
OrgInfo
>
>
## **历年制裁领域统计**
请求地址:/entitiesDataCount/getAnnualSanDomain
请求类型:POST
输入参数:
参数:AnnualDomainQuery annualDomainQuery
请求头:携带token
输出结果:ApiResult
<List
<
AnnualDomainCount
>
>
## **新增实体数量增长趋势**
请求地址:/entitiesDataInfo/yoyComparison
请求类型:GET
输入参数:
参数:无输入
请求头:携带token
输出结果:ApiResult
<List
<
AnnualCount
>
>
## **获取机构的详情信息**
请求地址:/organization/getDetail/{id}
请求类型:GET
输入参数:
参数:机构ID
请求头:携带token
输出结果:ApiResult
<Organization>
## **获取美国前序事件**
请求地址:/entitiesDataInfo/precedingEvents
请求类型:POST
输入参数:
参数:EventQuery eventQuery
请求头:携带token
输出结果:ApiResult
<Page
<
EventInfo
>
>
## **新增科研机构列表**
请求地址:/entitiesDataInfo/scientificImpact/entityList
请求类型:GET
输入参数:
参数:String sanctionDate
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **各类别仪器对美依赖情况**
请求地址:/instrument/getDependencyUS
请求类型:GET
输入参数:
参数:List
<String>
orgIds 机构公司ID列表
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **仪器对美依赖度升高风险分析**
请求地址:/instrument/getDependencyUSRisk
请求类型:GET
输入参数:
参数:无
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **仪器进口国可替代性分析**
请求地址:/instrument/getOriginCount
请求类型:GET
输入参数:
参数:List
<String>
orgIds 机构公司ID列表
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **仪器国产化降低风险分析**
请求地址:/instrument/getLocalizationRisk
请求类型:GET
输入参数:
参数:无
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **制裁实体清单50%规则实体数**
请求地址:/sanctionList/getRuleCount
请求类型:POST
输入参数:
参数:ExportPageQuery exportPageQuery
请求头:携带token
输出结果:ApiResult
<RuleEntityCount>
## **科研院所类实体历史制裁情况**
请求地址:/entitiesDataInfo/annual/researchInstitute
请求类型:GET
输入参数:
参数:无
请求头:携带token
输出结果:ApiResult
<List
<
AnnualCount
>
>
## **企业类实体历史制裁情况**
请求地址:/entitiesDataInfo/annual/enterprise
请求类型:GET
输入参数:
参数:无
请求头:携带token
输出结果:ApiResult
<List
<
AnnualCount
>
>
## **风险信号**
请求地址:/commonFeature/riskSignal/{moduleId}
请求类型:GET
输入参数:
参数:moduleId
请求头:携带token
输出结果:ApiResult
<List
<
RiskSignalVO
>
>
## **新闻资讯**
请求地址:/commonFeature/news/{moduleId}
请求类型:GET
输入参数:
参数:moduleId
请求头:携带token
输出结果:ApiResult
<List
<
NewsVO
>
>
## **社交媒体**
请求地址:/commonFeature/remarks/{moduleId}
请求类型:GET
输入参数:
参数:moduleId
请求头:携带token
输出结果:ApiResult
<List
<
RemarksVO
>
>
\ No newline at end of file
出口管制接口.xlsx
deleted
100644 → 0
浏览文件 @
17e424f0
File deleted
出口管制接口new.md
0 → 100644
浏览文件 @
3ed377d1
# 交互消息类
## ApiResult
```
java
public
class
ApiResult
<
T
>
{
@ApiModelProperty
(
"响应码"
)
private
int
code
;
@ApiModelProperty
(
"响应消息"
)
private
String
message
;
@ApiModelProperty
(
"是否成功"
)
private
boolean
success
;
@ApiModelProperty
(
"响应数据"
)
private
T
data
;
}
```
## LatestExportControlInfo
```
java
public
class
LatestExportControlInfo
{
// 出口管制事件ID
private
String
id
;
// 管制信息标题
private
String
name
;
// 管制内容简述
private
String
summary
;
// 发布机构名称
private
String
postOrgName
;
// 发布时间
private
Date
postDate
;
// 涉及领域
private
List
<
String
>
domains
;
// 涉及中国实体数
private
Integer
cnEntityCount
;
// 涉及主要实体
private
List
<
SanctionListBean
>
sanEntities
;
}
```
## AnnualCount
```
java
public
class
AnnualCount
{
// 年份
private
Integer
year
;
// 数量
private
Integer
count
;
// 领域列表
private
List
<
String
>
domain
;
}
```
## DomainCount
```
java
public
class
DomainCount
{
// 制裁类型名称
private
String
sanTypeName
;
// 领域统计信息
private
List
<
BaseCount
>
domainCountInfo
;
}
```
## BaseCount
```
java
public
class
BaseCount
{
// 统计名称
private
String
name
;
// 数量
private
Integer
count
;
}
```
## ExportPageQuery
```
java
public
class
ExportPageQuery
extends
BasePageQuery
{
// 类型名称(实体清单)
private
String
typeName
;
// 制裁时间
@JsonFormat
(
pattern
=
"yyyy-MM-dd"
,
timezone
=
"GMT+8"
)
private
Date
sanctionDate
;
// 是否只看中国实体
private
Boolean
isCn
;
}
```
## BasePageQuery
```
java
public
class
BasePageQuery
{
// 查询页
private
Integer
pageNum
=
1
;
// 每页数量
private
Integer
pageSize
=
10
;
// 排序字段
private
String
sortField
;
// 排序方式
private
String
sortOrder
;
}
```
## SanctionProcess
```
java
public
class
SanctionProcess
{
// 制裁事件ID
private
String
id
;
// 制裁时间
private
Date
postDate
;
// 制裁标题
private
String
name
;
// 制裁内容简述
private
String
summary
;
// 涉及中国实体数
private
Integer
cnEntityCount
;
}
```
## SanctionListBean
```
java
public
class
SanctionListBean
extends
BaseBean
{
@Id
@Column
(
name
=
"ID"
,
nullable
=
false
)
private
String
id
;
@Column
(
name
=
"ENTITY_NAME"
)
private
String
entityName
;
@Column
(
name
=
"SAN_TYPE_ID"
)
private
Integer
sanTypeId
;
@Column
(
name
=
"ENTITY_TYPE"
)
private
Integer
entityType
;
@Column
(
name
=
"ENTITY_ID"
)
private
String
entityId
;
@Column
(
name
=
"ENTITY_NAME_ZH"
)
private
String
entityNameZh
;
@Column
(
name
=
"COUNTRY_ID"
)
private
String
countryId
;
@Column
(
name
=
"SAN_REASON"
)
private
String
sanReason
;
@Column
(
name
=
"SAN_INTENSITY"
)
private
char
sanIntensity
;
@Column
(
name
=
"START_TIME"
)
private
Date
startTime
;
@Column
(
name
=
"END_TIME"
)
private
Date
endTime
;
@Column
(
name
=
"IS_KEY"
)
private
char
isKey
;
@Transient
private
List
<
TechDomainBean
>
techDomainList
;
/**
* 领域列表
*/
@Transient
private
List
<
String
>
techDomains
;
/**
* 50%规则子企业数
*/
@Transient
private
Integer
ruleOrgCount
;
// 50%规则子企业列表
@Transient
private
List
<
Organization
>
ruleOrgList
;
}
```
## OrgInfo
```
java
public
class
OrgInfo
{
// 机构id
private
String
id
;
// 机构名称
private
String
orgName
;
// 相关制裁措施列表
private
List
<
String
>
sanTypeList
;
// 机构职责
private
String
orgDuty
;
// 机构图片
private
String
imageUrl
;
// 人员列表
private
List
<
PersonInfo
>
personList
;
}
```
## PersonInfo
```
java
public
class
PersonInfo
{
// id
private
String
id
;
// 人物类别
private
Integer
type
;
// 姓名
private
String
name
;
// 党派
private
String
party
;
// 职位
private
String
position
;
// 头像链接
private
String
imageUrl
;
}
```
## SanCountInfo
```
java
public
class
SanCountInfo
{
// 实体数
private
Integer
entityNum
;
// 实体变动数
private
Integer
entityChange
;
// 上市公司数
private
Integer
listedCompanyNum
;
// 上市公司变动数
private
Integer
listedCompanyChange
;
// 涉及领域名数
private
Integer
domainNum
;
// 涉及领域变动数
private
Integer
domainChange
;
// 实体类型数
private
Integer
typeNum
;
// 实体类型变动数
private
Integer
typeChange
;
}
```
## Chain
```
java
public
class
Chain
{
@Id
@Column
(
name
=
"id"
)
@GeneratedValue
(
strategy
=
GenerationType
.
IDENTITY
)
private
Integer
id
;
// 名称
@Column
(
name
=
"name"
)
private
String
name
;
// 中文名称
@Column
(
name
=
"name_zh"
)
private
String
nameZh
;
// 值
@Column
(
name
=
"description"
)
private
String
description
;
// 父级id
@Column
(
name
=
"parent_id"
)
private
Integer
parentId
;
// 是否为产业链主分支
@Column
(
name
=
"is_main_branch"
)
private
String
isMainBranch
;
// 下属产业链分支
@Transient
private
List
<
Chain
>
children
;
}
```
## FishboneResp
```
java
public
class
FishboneResp
<
T
>
{
private
String
text
;
private
List
<
T
>
causes
;
}
```
## AreasStreamResp
```
java
public
class
AreasStreamResp
{
// 上游国内企业数量
private
int
upstreamInternalCount
;
// 上游国内占比
private
double
upstreamInternalRate
;
// 上游受制裁企业数量
private
int
upstreamEntityCount
;
// 上游受制裁占比
private
double
upstreamEntityRate
;
// 中游国内企业数量
private
int
midstreamInternalCount
;
// 中游国内占比
private
double
midstreamInternalRate
;
// 中游受制裁企业数量
private
int
midstreamEntityCount
;
// 中游受制裁占比
private
double
midstreamEntityRate
;
// 下游国内企业数量
private
int
downstreamInternalCount
;
// 下游国内占比
private
double
downstreamInternalRate
;
// 下游受制裁企业数量
private
int
downstreamEntityCount
;
// 下游受制裁占比
private
double
downstreamEntityRate
;
}
```
## AnnualDomainQuery
```
java
public
class
AnnualDomainQuery
{
// 开始年份
private
Integer
startYear
;
// 结束年份
private
Integer
endYear
;
// 是否考虑50%规则
private
Boolean
isRule
;
}
```
## AnnualDomainCount
```
java
public
class
AnnualDomainCount
{
// 年度领域统计
private
List
<
DomainCount
>
yearDomainCount
;
// 所有领域
private
List
<
BaseCount
>
domians
;
}
```
## SanctionTypeBean
```
java
public
class
SanctionTypeBean
extends
BaseBean
{
@Id
@Column
(
name
=
"ID"
,
nullable
=
false
)
private
Integer
id
;
@Column
(
name
=
"NAME"
)
private
String
name
;
@Column
(
name
=
"NAME_ZH"
)
private
String
nameZh
;
@Column
(
name
=
"NAME_ABBR"
)
private
String
nameAbbr
;
@Column
(
name
=
"DESCRIPTION"
)
private
String
description
;
// 发布国家
@Column
(
name
=
"POST_COUNTRY_ID"
)
private
String
postCountryId
;
// 发布机构
@Column
(
name
=
"POST_ORG_ID"
)
private
String
postOrgId
;
// 是否出口管制 1:是 0:否
@Column
(
name
=
"IS_EXPORT_CONTROL"
)
private
String
isExportControl
;
// 总发布次数
@Transient
private
Integer
postCount
;
}
```
## Organization
```
java
public
class
Organization
extends
BaseBean
{
// 机构id
@Id
@Column
(
name
=
"id"
,
nullable
=
false
)
private
String
id
;
// 机构名称
@Column
(
name
=
"org_name"
,
nullable
=
false
)
private
String
orgName
;
// 组织机构代码
@Column
(
name
=
"uscc"
)
private
String
uscc
;
// 机构简称
@Column
(
name
=
"org_abb"
)
private
String
orgAbb
;
// 机构英文名称
@Column
(
name
=
"org_name_en"
)
private
String
orgNameEn
;
// 机构英文简称
@Column
(
name
=
"org_abb_en"
)
private
String
orgAbbEn
;
// 机构别名
@Column
(
name
=
"org_alias"
)
private
String
orgAlias
;
// 机构曾用名
@Column
(
name
=
"org_former_name"
)
private
String
orgFormerName
;
// 机构类型id
@Column
(
name
=
"org_type_id"
)
private
Long
orgTypeId
;
// 机构简介
@Column
(
name
=
"org_introduction"
)
private
String
orgIntroduction
;
// 营业范围
@Column
(
name
=
"business_scope"
)
private
String
businessScope
;
// 行业id
@Column
(
name
=
"domain_ids"
)
private
String
domainIds
;
// 行业代码
@Column
(
name
=
"economic_industry_code"
)
private
String
economicIndustryCode
;
// 经济行业名称
@Column
(
name
=
"economic_industry_name"
)
private
String
economicIndustryName
;
// 国家id
@Column
(
name
=
"country_id"
)
private
String
countryId
;
// 省份
@Column
(
name
=
"province"
)
private
String
province
;
// 城市
@Column
(
name
=
"city"
)
private
String
city
;
// 区县
@Column
(
name
=
"county"
)
private
String
county
;
// 详细地址
@Column
(
name
=
"address"
)
private
String
address
;
// 成立时间
@Column
(
name
=
"establishment_date"
)
private
LocalDate
establishmentDate
;
// 变更时间
@Column
(
name
=
"issuing_date"
)
private
String
issuingDate
;
// 营业期限自
@Column
(
name
=
"operation_period_from"
)
private
String
operationPeriodFrom
;
// 营业期限至
@Column
(
name
=
"operation_period_until"
)
private
String
operationPeriodUntil
;
// 营业状态
@Column
(
name
=
"business_status"
)
private
String
businessStatus
;
// 法人id
@Column
(
name
=
"legal_representative_id"
)
private
String
legalRepresentativeId
;
/// 法人
@Column
(
name
=
"legal_representative"
)
private
String
legalRepresentative
;
// 联系电话
@Column
(
name
=
"telephone"
)
private
String
telephone
;
// 邮箱
@Column
(
name
=
"email"
)
private
String
email
;
// 邮政编码
@Column
(
name
=
"postcode"
)
private
String
postcode
;
// 网址
@Column
(
name
=
"url"
)
private
String
url
;
// 员工人数
@Column
(
name
=
"number_of_employees"
)
private
String
numberOfEmployees
;
// 注册资金
@Column
(
name
=
"registered_capital"
)
private
String
registeredCapital
;
// LOGO链接
@Column
(
name
=
"logo_url"
)
private
String
logoUrl
;
@Column
(
name
=
"create_by"
)
private
String
createBy
;
@Column
(
name
=
"update_by"
)
private
String
updateBy
;
@Column
(
name
=
"p_org_id"
)
private
String
pOrgId
;
}
```
## EventInfo
```
java
public
class
EventInfo
extends
BaseBean
{
@Id
@Column
(
name
=
"id"
)
@ApiModelProperty
(
value
=
"唯一标识"
)
private
String
id
;
@Column
(
name
=
"title"
)
@ApiModelProperty
(
value
=
"标题"
)
private
String
title
;
@Column
(
name
=
"event_time"
)
@ApiModelProperty
(
value
=
"事件时间"
)
@JsonFormat
(
pattern
=
"yyyy-MM-dd"
)
@DateTimeFormat
(
pattern
=
"yyyy-MM-dd"
)
private
Date
eventTime
;
@Column
(
name
=
"summary"
)
@ApiModelProperty
(
value
=
"摘要"
)
private
String
summary
;
@Column
(
name
=
"summary_zh"
)
@ApiModelProperty
(
value
=
"摘要译文"
)
private
String
summaryZh
;
@Column
(
name
=
"event_type"
)
@ApiModelProperty
(
value
=
"事件类别"
)
private
String
eventType
;
@Column
(
name
=
"CONTENT"
)
@ApiModelProperty
(
value
=
"主要内容"
)
private
String
content
;
@Column
(
name
=
"title_zh"
)
@ApiModelProperty
(
value
=
"标题译文"
)
private
String
titleZh
;
@Column
(
name
=
"content_zh"
)
@ApiModelProperty
(
value
=
"主要内容译文"
)
private
String
contentZh
;
@Column
(
name
=
"type"
)
@ApiModelProperty
(
value
=
"事件类别"
)
private
String
type
;
@Column
(
name
=
"LOCATION"
)
@ApiModelProperty
(
value
=
"事件地点"
)
private
String
location
;
@Column
(
name
=
"country"
)
@ApiModelProperty
(
value
=
"国家"
)
private
String
country
;
}
```
# 字典
## 领域类别(id:name)
1:人工智能、2:生物科技、3:新一代信息技术、4:量子科技、5:新能源、6:集成电路、7:海洋、8:先进制造、9:新材料、10:航空航天、11:深海、12:极地、13:太空、14:核
## 实体类别(id:name)
1:人物、2:机构、7:地址
## 人物类别(待定)
1:政府官员、2:科技领袖、3:顶级科学家、4:国会议员
# 出口管制
## **获取出口管制类清单统计信息**
请求地址:/sanctionList/export/getTotalInfo
请求类型:GET
输入参数:
参数:无输入
请求头:携带token,内容为:
```
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult
<List
<
SanctionTypeBean
>
>
## 最新出口管制政策(4条)
请求地址:http://8.140.26.4:9085/entitiesDataInfo/getLatestInfo
请求类型:GET
输入参数:
参数:无输入
请求头:携带token,内容为:
```
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult
<LatestExportControlInfo>
## 发布(更新)频度
请求地址:http://8.140.26.4:9085/entitiesDataCount/getAnnualCount
请求类型:GET
输入参数:
参数:Integer sanTypeId(制裁类别)
实体清单发布频度:1;CCL发布频度:X(待定,暂无数据)
请求头:携带token,内容为:
```
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult
<List
<
AnnualCount
>
>
## **制裁领域分析**(20251215)
请求地址:http://8.140.26.4:9085/entitiesDataCount/getSanDomainCount
请求类型:GET
输入参数:
参数:Boolean rule(是否勾选50%规则)
请求头:携带token,内容为:
```
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult
<List
<
DomainCount
>
>
## **历次制裁过程**
请求地址:http://8.140.26.4:9085/entitiesDataCount/getSanctionProcess
请求类型:POST
输入参数:
参数:ExportPageQuery exportPageQuery
请求头:携带token,内容为:
```
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult
<Page
<
SanctionProcess
>
>
## **制裁实体清单**列表(20251215)
请求地址:/sanctionList/pageQuery
请求类型:POST
输入参数:
参数:ExportPageQuery exportPageQuery
出口管制-概览页请求时:typeName=实体清单
实体清单-制裁概览页请求时:typeName=实体清单,sanctionDate=该次制裁的具体时间
请求头:携带token,内容为:
```
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult
<Page
<
SanctionListBean
>
>
## **发布机构与重点人物**
请求地址:/sanctionList/getPublishedOrg
请求类型:GET
输入参数:
参数:Integer sanTypeId
暂时固定输入:1;对应实体清单发布机构
请求头:携带token
输出结果:ApiResult
<OrgInfo>
## **领域分布查询**
请求地址:/entitiesDataInfo/getDomianDistribution
请求类型:GET
输入参数:
参数:String sanctionDate (制裁时间)
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **类型分布查询**
请求地址:/entitiesDataInfo/getTypeDistribution
请求类型:GET
输入参数:
参数:String sanctionDate (制裁时间)
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **区域分布查询**
请求地址:/entitiesDataInfo/getRegionDistribution
请求类型:GET
输入参数:
参数:String sanctionDate (制裁时间)
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **制裁理由查询**
请求地址:/entitiesDataInfo/getSanReason
请求类型:GET
输入参数:
参数:String sanctionDate (制裁时间)
请求头:携带token
输出结果:ApiResult
<List
<
String
>
>
## **深度挖掘-制裁信息变化统计**
请求地址:/entitiesDataInfo/getSanCountInfo
请求类型:GET
输入参数:
参数:String sanctionDate (制裁时间)
请求头:携带token
输出结果:ApiResult
<SanCountInfo>
## **年度实体数统计**
请求地址:/entitiesDataInfo/getCountByDomianAndType
请求类型:GET
输入参数:
参数:String domianId (非必需,领域类别ID),Integer typeId (非必需,实体类别ID)
参考字典
请求头:携带token
输出结果:ApiResult
<SanCountInfo>
## **重点实体列表查询**
请求地址:/entitiesDataInfo/getKeyEntities
请求类型:GET
输入参数:
参数:String sanctionDate(必需),String searchText(非必需,检索文本)
请求头:携带token
输出结果:ApiResult
<List
<
OrgInfo
>
>
## **上市企业制裁强度**
请求地址:/entitiesDataInfo/listedEntity/sanInfo
请求类型:GET
输入参数:
参数:无
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **上市企业融资变化情况**
请求地址:/entitiesDataInfo/listedEntity/financing
请求类型:GET
输入参数:
参数:无
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **上市企业市值变化情况**
请求地址:/entitiesDataInfo/listedEntity/market
请求类型:GET
输入参数:
参数:无
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **重点上市企业列表**
请求地址:/entitiesDataInfo/listedEntity/keyEntity
请求类型:GET
输入参数:
参数:String sanctionDate(必需),String searchText(非必需,检索文本)
请求头:携带token
输出结果:ApiResult
<List
<
OrgInfo
>
>
## **历次制裁涉及领域数查询**
请求地址:/entitiesDataInfo/getPreviousDomian
请求类型:GET
输入参数:
参数:无
请求头:携带token
输出结果:ApiResult
<List
<
BaseCount
>
>
## **具体领域的制裁实体数统计**
请求地址:/entitiesDataInfo/getDomianAnnual
请求类型:GET
输入参数:
参数:String domainId
请求头:携带token
输出结果:ApiResult
<List
<
AnnualCount
>
>
## **具体实体类型的制裁实体数统计**
请求地址:/entitiesDataInfo/getEntityTypeAnnual
请求类型:GET
输入参数:
参数:Integer entityTypeId
请求头:携带token
输出结果:ApiResult
<List
<
AnnualCount
>
>
## **产业链结构查询**
请求地址:/chain/getChainTree
请求类型:GET
输入参数:
参数:Integer chainId,非必需
请求头:携带token
输出结果:ApiResult
<List
<
Chain
>
>
## **产业链鱼骨图信息查询**
请求地址:/chain/getChainFishbone
请求类型:GET
输入参数:
参数:Integer chainId
请求头:携带token
输出结果:ApiResult
<FishboneResp>
## **产业链中国企业实体信息查询**
请求地址:/chain/getChainEntityStat
请求类型:GET
输入参数:
参数:Integer chainId
请求头:携带token
输出结果:ApiResult
<AreasStreamResp>
## **实体列表查询**
请求地址:/entitiesDataInfo/getEntityList
请求类型:GET
输入参数:
参数:String sanctionDate(制裁时间),String domainId(领域ID)
请求头:携带token
输出结果:ApiResult
<List
<
OrgInfo
>
>
## **历年制裁领域统计**
请求地址:/entitiesDataCount/getAnnualSanDomain
请求类型:POST
输入参数:
参数:AnnualDomainQuery annualDomainQuery
请求头:携带token
输出结果:ApiResult
<List
<
AnnualDomainCount
>
>
## **新增实体数量增长趋势**
请求地址:/entitiesDataInfo/yoyComparison
请求类型:GET
输入参数:
参数:无输入
请求头:携带token
输出结果:ApiResult
<List
<
AnnualCount
>
>
## **获取机构的详情信息**
请求地址:/organization/getDetail/{id}
请求类型:GET
输入参数:
参数:机构ID
请求头:携带token
输出结果:ApiResult
<Organization>
## **获取5条美国前序事件**
请求地址:/entitiesDataInfo/precedingEvents
请求类型:GET
输入参数:
参数:String sanctionDate 制裁时间
请求头:携带token
输出结果:ApiResult
<List
<
EventInfo
>
>
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论