Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
1
合并请求
1
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
466aabb3
提交
466aabb3
authored
12月 19, 2025
作者:
yanpeng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
api-4
上级
34ad808f
隐藏空白字符变更
内嵌
并排
正在显示
11 个修改的文件
包含
226 行增加
和
77 行删除
+226
-77
exportControl.js
src/api/exportControl.js
+71
-3
fishbone-mock.json
...iews/exportControl/analysis/components/fishbone-mock.json
+8
-12
fishbone.vue
src/views/exportControl/analysis/components/fishbone.vue
+1
-1
influencePanel2.vue
...ews/exportControl/analysis/components/influencePanel2.vue
+118
-15
panel1.vue
src/views/exportControl/analysis/components/panel1.vue
+5
-18
panel2.vue
src/views/exportControl/analysis/components/panel2.vue
+1
-12
panel4.vue
src/views/exportControl/analysis/components/panel4.vue
+3
-3
pieCharts.vue
src/views/exportControl/analysis/components/pieCharts.vue
+2
-2
overview.vue
src/views/exportControl/analysis/content/overview.vue
+16
-10
news.vue
src/views/exportControl/components/news.vue
+1
-1
出口管制接口.xlsx
出口管制接口.xlsx
+0
-0
没有找到文件。
src/api/exportControl.js
浏览文件 @
466aabb3
...
@@ -328,6 +328,31 @@ export function getSelectEntitiesList(startTime) {
...
@@ -328,6 +328,31 @@ export function getSelectEntitiesList(startTime) {
);
);
}
}
/**
* 涉及50%规则的实体数
*/
export
function
getEntitiesCountBy50PercentRules
(
typeName
=
"实体清单"
,
pageNum
=
1
,
pageSize
=
10
,
sanctionDate
=
""
,
isCn
=
false
)
{
return
request200
(
request
({
method
:
"POST"
,
url
:
"/api/sanctionList/getRuleCount"
,
data
:
{
typeName
,
pageNum
,
pageSize
,
sanctionDate
,
isCn
}
})
);
}
/**
/**
* 领域分布查询
* 领域分布查询
*/
*/
...
@@ -352,7 +377,7 @@ export function getDomainDistribution(sanctionDate = "2025-11-11") {
...
@@ -352,7 +377,7 @@ export function getDomainDistribution(sanctionDate = "2025-11-11") {
* startTime: string
* startTime: string
* }[]>}
* }[]>}
*/
*/
export
function
getEntitiesList
(
typeName
=
"实体清单"
,
pageNum
=
1
,
pageSize
=
10
,
sanctionDate
=
""
,
rule
=
false
)
{
export
function
getEntitiesList
(
typeName
=
"实体清单"
,
pageNum
=
1
,
pageSize
=
10
,
sanctionDate
=
""
,
isCn
=
false
)
{
return
request200
(
return
request200
(
request
({
request
({
method
:
"POST"
,
method
:
"POST"
,
...
@@ -362,7 +387,7 @@ export function getEntitiesList(typeName = "实体清单", pageNum = 1, pageSize
...
@@ -362,7 +387,7 @@ export function getEntitiesList(typeName = "实体清单", pageNum = 1, pageSize
pageNum
,
pageNum
,
pageSize
,
pageSize
,
sanctionDate
,
sanctionDate
,
rule
isCn
}
}
})
})
);
);
...
@@ -584,7 +609,8 @@ export function getCountThisType(param) {
...
@@ -584,7 +609,8 @@ export function getCountThisType(param) {
return
request200
(
return
request200
(
request
({
request
({
method
:
"GET"
,
method
:
"GET"
,
url
:
"/api/entitiesDataCount/countThisType"
,
// url: "/api/entitiesDataCount/countThisType",
url
:
"/api/entitiesDataInfo/annual/researchInstitute"
,
params
:
{
params
:
{
param
param
}
}
...
@@ -592,6 +618,48 @@ export function getCountThisType(param) {
...
@@ -592,6 +618,48 @@ export function getCountThisType(param) {
);
);
}
}
/**
* 企业类实体历史制裁情况
*/
export
function
getEnterpriseSanCount
()
{
return
request200
(
request
({
method
:
"GET"
,
url
:
"/api/entitiesDataInfo/annual/enterprise"
})
);
}
/**
* 根据领域获取产业链信息
*/
export
function
getChainInfoByDomainId
(
domainId
)
{
return
request200
(
request
({
method
:
"GET"
,
url
:
"/api/chain/getChainInfo"
,
params
:
{
domainId
}
})
);
}
/**
* 产业链中国企业实体信息查询
*/
export
function
getCnEntityOnChain
(
chainId
)
{
return
request200
(
request
({
method
:
"GET"
,
url
:
"/api/chain/getChainEntityStat"
,
params
:
{
chainId
}
})
);
}
/**
/**
* 产业链信息查询
* 产业链信息查询
*/
*/
...
...
src/views/exportControl/analysis/components/fishbone-mock.json
浏览文件 @
466aabb3
[
[
{
{
"personImage"
:
"https://www.congress.gov/img/member/y000064_200.jpg"
,
"id"
:
86
,
"personName"
:
"扬(Young, Todd)"
,
"name"
:
"人工智能"
,
"remarks"
:
"拜登打心底里厌恶美国的石油和天然气产业,他的一系列政策,正在摧毁这个能为美国创造大量就业岗位的重要领域。"
,
"nameZh"
:
"人工智能"
,
"time"
:
"2025-04-12T03:27:07"
,
"description"
:
null
,
"orgName"
:
"推特"
"parentId"
:
null
,
},
"isMainBranch"
:
"Y"
,
{
"children"
:
null
"personImage"
:
"https://www.congress.gov/img/member/k000306_200.jpg"
,
"personName"
:
"科尔贝 (Kolbe), 吉姆 (Jim)"
,
"remarks"
:
"美国将控制加沙地带,我们会把这片被战火摧毁的区域改造成 “中东的里维埃拉”,这一计划会为当地带来全新未来。"
,
"time"
:
"2025-01-12T00:55:53"
,
"orgName"
:
"推特"
}
}
]
]
\ No newline at end of file
src/views/exportControl/analysis/components/fishbone.vue
浏览文件 @
466aabb3
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
<div
class=
"fishbone-wrapper"
>
<div
class=
"fishbone-wrapper"
>
<div
class=
"fishbone-scroll-container"
ref=
"scrollContainerRef"
>
<div
class=
"fishbone-scroll-container"
ref=
"scrollContainerRef"
>
<div
class=
"fishbone"
ref=
"fishboneRef"
v-if=
"fishboneData.length > 0"
>
<div
class=
"fishbone"
ref=
"fishboneRef"
v-if=
"fishboneData.length > 0"
>
<div
class=
"main-line"
:style=
"
{ width: (fishboneData.length / 2) * 340 - 2
75
+ 'px' }">
</div>
<div
class=
"main-line"
:style=
"
{ width: (fishboneData.length / 2) * 340 - 2
00
+ 'px' }">
</div>
<!-- 奇数索引的数据组放在上方 -->
<!-- 奇数索引的数据组放在上方 -->
<div
<div
v-for=
"(causeGroup, groupIndex) in getOddGroups(fishboneData)"
v-for=
"(causeGroup, groupIndex) in getOddGroups(fishboneData)"
...
...
src/views/exportControl/analysis/components/influencePanel2.vue
浏览文件 @
466aabb3
...
@@ -11,7 +11,7 @@
...
@@ -11,7 +11,7 @@
<div
class=
"listWrap"
>
<div
class=
"listWrap"
>
<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
}}
</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.isUp, iconDown: !item.isUp }">
</div>
</div>
</div>
</div>
</div>
...
@@ -22,10 +22,13 @@
...
@@ -22,10 +22,13 @@
<Hint
<Hint
text=
"法案核心意图在于通过税收优惠吸引制造业回流美国,并在关键科技领域对中国进行遏制,限制中国获取先进技术、资本和市场渠道,从而延缓中国科技产业的发展速度。给半导体、新能源、人工智能等相关科技行业带来不小的短期压力。"
text=
"法案核心意图在于通过税收优惠吸引制造业回流美国,并在关键科技领域对中国进行遏制,限制中国获取先进技术、资本和市场渠道,从而延缓中国科技产业的发展速度。给半导体、新能源、人工智能等相关科技行业带来不小的短期压力。"
></Hint>
></Hint>
<div
class=
"subPanel2-buttonlist"
v-if=
"chainData.length > 0"
>
<ButtonList
:list=
"chainData"
:active-id=
"activeChainId"
@
click=
"setActiveChainId"
></ButtonList>
</div>
<div
class=
"chartsWrap"
>
<div
class=
"chartsWrap"
>
<div
class=
"right-main-content"
>
<div
class=
"right-main-content"
>
<div
class=
"right-main-content-main"
>
<div
class=
"right-main-content-main"
>
<Fishbone
:chainId=
"activeButtonId"
/>
<Fishbone
:chainId=
"
chainData.length > 0 ? activeChainId :
activeButtonId"
/>
</div>
</div>
<div
class=
"right-main-content-footer"
>
<div
class=
"right-main-content-footer"
>
<div
class=
"footer-item1"
>
<div
class=
"footer-item1"
>
...
@@ -34,10 +37,13 @@
...
@@ -34,10 +37,13 @@
<img
src=
"../../assets/images/warning.png"
alt=
""
/>
<img
src=
"../../assets/images/warning.png"
alt=
""
/>
</div>
</div>
<div
class=
"text"
>
<div
class=
"text"
>
{{
"中国企业45家(51.00%),受制裁3家(7.00%)"
}}
{{
`国内企业数据量${cnEntityOnChainData.upstreamInternalCount
}
家(${cnEntityOnChainData.upstreamInternalRate
}
%),受制裁${cnEntityOnChainData.upstreamEntityCount
}
家(${cnEntityOnChainData.upstreamEntityRate
}
%)`
}}
<!--
{{
"中国企业45家(51.00%),受制裁3家(7.00%)"
}}
-->
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<div
class=
"footer-item1-top"
>
{{
"
基础支撑
"
}}
</div>
<
div
class
=
"footer-item1-top"
>
{{
"
上游
"
}}
<
/div
>
<
/div
>
<
/div
>
<
div
class
=
"footer-item2"
>
<
div
class
=
"footer-item2"
>
<
div
class
=
"footer-item2-bottom"
>
<
div
class
=
"footer-item2-bottom"
>
...
@@ -45,10 +51,13 @@
...
@@ -45,10 +51,13 @@
<
img
src
=
"../../assets/images/warning.png"
alt
=
""
/>
<
img
src
=
"../../assets/images/warning.png"
alt
=
""
/>
<
/div
>
<
/div
>
<
div
class
=
"text"
>
<
div
class
=
"text"
>
{{
"中国企业45家(51.00%),受制裁3家(7.00%)"
}}
{{
`国内企业数据量${cnEntityOnChainData.midstreamInternalCount
}
家(${cnEntityOnChainData.midstreamInternalRate
}
%),受制裁${cnEntityOnChainData.midstreamEntityCount
}
家(${cnEntityOnChainData.midstreamEntityRate
}
%)`
}}
<!--
{{
"中国企业45家(51.00%),受制裁3家(7.00%)"
}}
-->
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<div
class=
"footer-item2-top"
>
{{
"
软件算法
"
}}
</div>
<
div
class
=
"footer-item2-top"
>
{{
"
中游
"
}}
<
/div
>
<
/div
>
<
/div
>
<
div
class
=
"footer-item3"
>
<
div
class
=
"footer-item3"
>
<
div
class
=
"footer-item3-bottom"
>
<
div
class
=
"footer-item3-bottom"
>
...
@@ -56,10 +65,13 @@
...
@@ -56,10 +65,13 @@
<
img
src
=
"../../assets/images/warning.png"
alt
=
""
/>
<
img
src
=
"../../assets/images/warning.png"
alt
=
""
/>
<
/div
>
<
/div
>
<
div
class
=
"text"
>
<
div
class
=
"text"
>
{{
"中国企业45家(51.00%),受制裁3家(7.00%)"
}}
{{
`国内企业数据量${cnEntityOnChainData.downstreamInternalCount
}
家(${cnEntityOnChainData.downstreamInternalRate
}
%),受制裁${cnEntityOnChainData.downstreamEntityCount
}
家(${cnEntityOnChainData.downstreamEntityRate
}
%)`
}}
<!--
{{
"中国企业45家(51.00%),受制裁3家(7.00%)"
}}
-->
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<div
class=
"footer-item3-top"
>
{{
"
行业应用
"
}}
</div>
<
div
class
=
"footer-item3-top"
>
{{
"
下游
"
}}
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
...
@@ -77,7 +89,7 @@ import Hint from "./hint.vue";
...
@@ -77,7 +89,7 @@ import Hint from "./hint.vue";
import
ButtonList
from
"@/components/buttonList/buttonList.vue"
;
import
ButtonList
from
"@/components/buttonList/buttonList.vue"
;
import
Fishbone
from
"./fishbone.vue"
;
import
Fishbone
from
"./fishbone.vue"
;
import
{
getHorizontalBarChart2
}
from
"../../utils/charts"
;
import
{
getHorizontalBarChart2
}
from
"../../utils/charts"
;
import
{
getDomainDistribution
,
getChainEntities
}
from
"@/api/exportControl"
;
import
{
getDomainDistribution
,
getChainEntities
,
getChainInfoByDomainId
,
getCnEntityOnChain
}
from
"@/api/exportControl"
;
import
{
useRoute
,
useRouter
}
from
"vue-router"
;
import
{
useRoute
,
useRouter
}
from
"vue-router"
;
const
route
=
useRoute
();
const
route
=
useRoute
();
const
router
=
useRouter
();
const
router
=
useRouter
();
...
@@ -151,6 +163,78 @@ const handleEttClick = item => {
...
@@ -151,6 +163,78 @@ const handleEttClick = item => {
}
);
}
);
window
.
open
(
route
.
href
,
"_blank"
);
window
.
open
(
route
.
href
,
"_blank"
);
}
;
}
;
// 处理点击事件
const
handleChainClick
=
async
chainId
=>
{
}
;
// 获取产业链信息数据
const
chainData
=
ref
([]);
const
activeChainId
=
ref
(
chainData
.
value
[
0
]?.
id
);
const
setActiveChainId
=
id
=>
{
activeChainId
.
value
=
id
;
}
;
const
fetchChainInfo
=
async
()
=>
{
try
{
const
data
=
await
getChainInfoByDomainId
(
activeButtonId
.
value
);
console
.
log
(
"getChainInfoByDomainId"
,
data
);
if
(
data
&&
Array
.
isArray
(
data
))
{
// 将获取到的数据赋值给 chainData
chainData
.
value
=
data
.
map
(
item
=>
({
...
item
,
text
:
item
.
name
}
));
console
.
log
(
"chainData.value"
,
chainData
.
value
);
setActiveChainId
(
chainData
.
value
[
0
].
id
);
}
else
{
setActiveChainId
(
null
);
chainData
.
value
=
[];
}
}
catch
(
error
)
{
console
.
error
(
"获取产业链信息数据失败:"
,
error
);
}
}
;
const
cnEntityOnChainData
=
ref
({
upstreamInternalCount
:
0
,
upstreamInternalRate
:
0
,
upstreamEntityCount
:
0
,
upstreamEntityRate
:
0
,
midstreamInternalCount
:
0
,
midstreamInternalRate
:
0
,
midstreamEntityCount
:
0
,
midstreamEntityRate
:
0
,
downstreamInternalCount
:
0
,
downstreamInternalRate
:
0
,
downstreamEntityCount
:
0
,
downstreamEntityRate
:
0
}
);
const
fetchCnEntityOnChain
=
async
()
=>
{
try
{
console
.
log
(
"getCnEntityOnChain 111111"
,
chainData
.
value
);
const
data
=
await
getCnEntityOnChain
(
chainData
.
value
.
length
>
0
?
activeChainId
.
value
:
activeButtonId
.
value
);
console
.
log
(
"getCnEntityOnChain"
,
data
);
if
(
!!
data
&&
Object
.
keys
(
data
).
length
>
0
)
{
// 将获取到的数据赋值给 cnEntityOnChainData
cnEntityOnChainData
.
value
=
{
upstreamInternalCount
:
data
.
upstreamInternalCount
||
0
,
upstreamInternalRate
:
Math
.
floor
(
data
.
upstreamInternalRate
*
100
)
||
0
,
upstreamEntityCount
:
data
.
upstreamEntityCount
||
0
,
upstreamEntityRate
:
Math
.
floor
(
data
.
upstreamEntityRate
*
100
)
||
0
,
midstreamInternalCount
:
data
.
midstreamInternalCount
||
0
,
midstreamInternalRate
:
Math
.
floor
(
data
.
midstreamInternalRate
*
100
)
||
0
,
midstreamEntityCount
:
data
.
midstreamEntityCount
||
0
,
midstreamEntityRate
:
Math
.
floor
(
data
.
midstreamEntityRate
*
100
)
||
0
,
downstreamInternalCount
:
data
.
downstreamInternalCount
||
0
,
downstreamInternalRate
:
Math
.
floor
(
data
.
downstreamInternalRate
*
100
)
||
0
,
downstreamEntityCount
:
data
.
downstreamEntityCount
||
0
,
downstreamEntityRate
:
Math
.
floor
(
data
.
downstreamEntityRate
*
100
)
||
0
}
;
console
.
log
(
"getCnEntityOnChain 222222"
,
chainData
.
value
);
}
}
catch
(
error
)
{
console
.
error
(
"获取产业链信息数据失败:"
,
error
);
}
}
;
// 获取领域分布数据并更新图表
// 获取领域分布数据并更新图表
const
fetchDomainDistribution
=
async
()
=>
{
const
fetchDomainDistribution
=
async
()
=>
{
try
{
try
{
...
@@ -193,6 +277,7 @@ const fetchChainEntities = async () => {
...
@@ -193,6 +277,7 @@ const fetchChainEntities = async () => {
listData
.
value
=
data
.
map
(
item
=>
({
listData
.
value
=
data
.
map
(
item
=>
({
...
item
,
...
item
,
name
:
item
.
orgNameZh
,
name
:
item
.
orgNameZh
,
nameEn
:
item
.
orgName
,
isUp
:
item
.
isUp
isUp
:
item
.
isUp
}
));
}
));
}
}
...
@@ -203,16 +288,31 @@ const fetchChainEntities = async () => {
...
@@ -203,16 +288,31 @@ const fetchChainEntities = async () => {
onMounted
(
async
()
=>
{
onMounted
(
async
()
=>
{
fetchDomainDistribution
();
fetchDomainDistribution
();
// horizontalBarOptions.value = getHorizontalBarChart2(
// ["贸易", "军工", "金融业", "跨境电商", "半导体", "新能源"],
// [10, 21, 25, 79, 95, 109],
// false
// );
fetchChainEntities
();
fetchChainEntities
();
// 获取产业链信息数据
fetchChainInfo
();
// 获取产业链中国企业实体信息查询
fetchCnEntityOnChain
();
}
);
}
);
watch
(()
=>
activeButtonId
.
value
,
fetchChainEntities
);
watch
(
()
=>
activeButtonId
.
value
,
async
()
=>
{
await
fetchChainEntities
();
// 获取产业链信息数据
await
fetchChainInfo
();
// 获取产业链中国企业实体信息查询
await
fetchCnEntityOnChain
();
}
);
watch
(
()
=>
activeChainId
.
value
,
async
()
=>
{
await
fetchCnEntityOnChain
();
}
);
<
/script
>
<
/script
>
<
style
lang
=
"scss"
scoped
>
<
style
lang
=
"scss"
scoped
>
...
@@ -225,6 +325,9 @@ watch(() => activeButtonId.value, fetchChainEntities);
...
@@ -225,6 +325,9 @@ watch(() => activeButtonId.value, fetchChainEntities);
display
:
flex
;
display
:
flex
;
flex
-
direction
:
column
;
flex
-
direction
:
column
;
padding
:
17
px
18
px
12
px
18
px
;
padding
:
17
px
18
px
12
px
18
px
;
&-
buttonlist
{
padding
:
10
px
;
}
.
chartsWrap
{
.
chartsWrap
{
flex
:
1
;
flex
:
1
;
.
right
-
main
-
content
{
.
right
-
main
-
content
{
...
...
src/views/exportControl/analysis/components/panel1.vue
浏览文件 @
466aabb3
...
@@ -124,9 +124,6 @@ const fetchKeyEntityList = async (date = "2025-11-11", keyword = "") => {
...
@@ -124,9 +124,6 @@ const fetchKeyEntityList = async (date = "2025-11-11", keyword = "") => {
};
};
onMounted
(
async
()
=>
{
onMounted
(
async
()
=>
{
// 确保默认值正确设置
domainValue
.
value
=
domainOptions
[
0
].
value
;
typeValue
.
value
=
typeOptions
[
0
].
value
;
try
{
try
{
const
[
entitiesGrowthTrendData
,
entitiesUpdateCountData
]
=
await
Promise
.
all
([
const
[
entitiesGrowthTrendData
,
entitiesUpdateCountData
]
=
await
Promise
.
all
([
getEntitiesGrowthTrend
(),
getEntitiesGrowthTrend
(),
...
@@ -167,7 +164,7 @@ onMounted(async () => {
...
@@ -167,7 +164,7 @@ onMounted(async () => {
});
});
const
domainOptions
=
[
const
domainOptions
=
[
{
{
value
:
""
,
value
:
"
all
"
,
label
:
"全部"
label
:
"全部"
},
},
{
{
...
@@ -257,7 +254,7 @@ const domainOptions = [
...
@@ -257,7 +254,7 @@ const domainOptions = [
];
];
const
typeOptions
=
[
const
typeOptions
=
[
{
{
value
:
""
,
value
:
"
all
"
,
label
:
"全部"
label
:
"全部"
},
},
{
{
...
@@ -273,14 +270,14 @@ const typeOptions = [
...
@@ -273,14 +270,14 @@ const typeOptions = [
label
:
"地址"
label
:
"地址"
}
}
];
];
const
domainValue
=
ref
(
""
);
const
domainValue
=
ref
(
"
all
"
);
const
typeValue
=
ref
(
""
);
const
typeValue
=
ref
(
"
all
"
);
const
bar1Option
=
shallowRef
({});
const
bar1Option
=
shallowRef
({});
const
bar1DataIsEmpty
=
ref
(
false
);
const
bar1DataIsEmpty
=
ref
(
false
);
watch
(
watch
(
[
domainValue
,
typeValue
],
[
domainValue
,
typeValue
],
async
([
domain
,
type
])
=>
{
async
([
domain
,
type
])
=>
{
let
EntitiesChangeCount
=
await
getEntitiesChangeCount
(
domain
,
type
);
let
EntitiesChangeCount
=
await
getEntitiesChangeCount
(
domain
==
"all"
?
""
:
domain
,
type
==
"all"
?
""
:
type
);
EntitiesChangeCount
=
_
.
reverse
(
EntitiesChangeCount
);
EntitiesChangeCount
=
_
.
reverse
(
EntitiesChangeCount
);
bar1DataIsEmpty
.
value
=
EntitiesChangeCount
.
length
===
0
;
bar1DataIsEmpty
.
value
=
EntitiesChangeCount
.
length
===
0
;
bar1Option
.
value
=
getBarChart
(
bar1Option
.
value
=
getBarChart
(
...
@@ -292,16 +289,6 @@ watch(
...
@@ -292,16 +289,6 @@ watch(
},
},
{
immediate
:
true
}
{
immediate
:
true
}
);
);
// const options = [
// {
// value: "1",
// label: "人工智能"
// },
// {
// value: "2",
// label: "航空航天"
// }
// ];
const
subPanel4
=
ref
([
const
subPanel4
=
ref
([
{
{
name
:
"中国科学技术大学"
,
name
:
"中国科学技术大学"
,
...
...
src/views/exportControl/analysis/components/panel2.vue
浏览文件 @
466aabb3
...
@@ -76,18 +76,6 @@ import { getEntityFinancing, getEntityMarketValue, getKeyListedEntityList, getSa
...
@@ -76,18 +76,6 @@ import { getEntityFinancing, getEntityMarketValue, getKeyListedEntityList, getSa
import
{
useRoute
,
useRouter
}
from
"vue-router"
;
import
{
useRoute
,
useRouter
}
from
"vue-router"
;
const
route
=
useRoute
();
const
route
=
useRoute
();
const
router
=
useRouter
();
const
router
=
useRouter
();
const
options
=
[
{
value
:
"1"
,
label
:
"人工智能"
},
{
value
:
"2"
,
label
:
"航空航天"
}
];
const
value1
=
ref
(
""
);
const
value2
=
ref
(
""
);
const
value3
=
ref
(
""
);
const
value3
=
ref
(
""
);
const
bar1Option
=
shallowRef
({});
const
bar1Option
=
shallowRef
({});
const
bar2Option
=
shallowRef
({});
const
bar2Option
=
shallowRef
({});
...
@@ -119,6 +107,7 @@ const subPanel4 = ref([
...
@@ -119,6 +107,7 @@ const subPanel4 = ref([
// 获取重点上市企业列表数据
// 获取重点上市企业列表数据
const
fetchKeyListedEntityList
=
async
(
keyword
=
""
)
=>
{
const
fetchKeyListedEntityList
=
async
(
keyword
=
""
)
=>
{
try
{
try
{
console
.
log
(
"获取重点上市企业列表数据"
,
route
.
query
.
startTime
);
const
data
=
await
getKeyListedEntityList
(
route
.
query
.
startTime
,
keyword
);
const
data
=
await
getKeyListedEntityList
(
route
.
query
.
startTime
,
keyword
);
if
(
data
&&
Array
.
isArray
(
data
))
{
if
(
data
&&
Array
.
isArray
(
data
))
{
// 根据 fishbone-mock.json 的数据结构处理数据
// 根据 fishbone-mock.json 的数据结构处理数据
...
...
src/views/exportControl/analysis/components/panel4.vue
浏览文件 @
466aabb3
...
@@ -19,7 +19,7 @@
...
@@ -19,7 +19,7 @@
</CardCustom>
</CardCustom>
</div>
</div>
<div
class=
"row"
>
<div
class=
"row"
>
<CardCustom
title=
"历次制裁涉及实体数"
:style=
"
{ width: '798px', height: '422px' }">
<CardCustom
title=
"历次制裁涉及实体
类型
数"
:style=
"
{ width: '798px', height: '422px' }">
<div
class=
"subPanel3"
>
<div
class=
"subPanel3"
>
<div
class=
"chartsWrap"
:style=
"
{ paddingBottom: '10px' }">
<div
class=
"chartsWrap"
:style=
"
{ paddingBottom: '10px' }">
<Echarts
:option=
"bar2Option"
height=
"100%"
></Echarts>
<Echarts
:option=
"bar2Option"
height=
"100%"
></Echarts>
...
@@ -46,7 +46,7 @@ import { Search } from "@element-plus/icons-vue";
...
@@ -46,7 +46,7 @@ import { Search } from "@element-plus/icons-vue";
import
Echarts
from
"@/components/Chart/index.vue"
;
import
Echarts
from
"@/components/Chart/index.vue"
;
import
{
getBarChart
,
getLineChart
,
getPieOption1
}
from
"../../utils/charts"
;
import
{
getBarChart
,
getLineChart
,
getPieOption1
}
from
"../../utils/charts"
;
import
Hint
from
"./hint.vue"
;
import
Hint
from
"./hint.vue"
;
import
{
getCountSanTypeByTime
,
getCountTypeByYear
,
getCountThisType
}
from
"@/api/exportControl"
;
import
{
getCountSanTypeByTime
,
getCountTypeByYear
,
getCountThisType
,
getEnterpriseSanCount
}
from
"@/api/exportControl"
;
import
_
from
"lodash"
;
import
_
from
"lodash"
;
import
{
useRoute
}
from
"vue-router"
;
import
{
useRoute
}
from
"vue-router"
;
const
route
=
useRoute
();
const
route
=
useRoute
();
...
@@ -60,7 +60,7 @@ onMounted(async () => {
...
@@ -60,7 +60,7 @@ onMounted(async () => {
getCountSanTypeByTime
(
route
.
query
.
startTime
),
getCountSanTypeByTime
(
route
.
query
.
startTime
),
getCountThisType
(
"1"
),
getCountThisType
(
"1"
),
getCountTypeByYear
(),
getCountTypeByYear
(),
get
CountThisType
(
"2"
)
get
EnterpriseSanCount
(
)
]);
]);
pie1Option
.
value
=
getPieOption1
(
pie1Option
.
value
=
getPieOption1
(
...
...
src/views/exportControl/analysis/components/pieCharts.vue
浏览文件 @
466aabb3
...
@@ -13,7 +13,7 @@
...
@@ -13,7 +13,7 @@
import
Echarts
from
"@/components/Chart/index.vue"
;
import
Echarts
from
"@/components/Chart/index.vue"
;
import
{
getPieOption
}
from
"../../utils/charts"
;
import
{
getPieOption
}
from
"../../utils/charts"
;
import
{
ref
,
onMounted
,
shallowRef
}
from
"vue"
;
import
{
ref
,
onMounted
,
shallowRef
}
from
"vue"
;
import
{
getCountByDomain
,
getCountByType
}
from
"@/api/exportControl"
;
import
{
getCountByDomain
,
getCountByType
,
getDomainDistribution
}
from
"@/api/exportControl"
;
import
_
from
"lodash"
;
import
_
from
"lodash"
;
import
{
useRoute
}
from
"vue-router"
;
import
{
useRoute
}
from
"vue-router"
;
const
route
=
useRoute
();
const
route
=
useRoute
();
...
@@ -22,7 +22,7 @@ const pie2Option = shallowRef({});
...
@@ -22,7 +22,7 @@ const pie2Option = shallowRef({});
onMounted
(
async
()
=>
{
onMounted
(
async
()
=>
{
try
{
try
{
const
[
countByDomainData
,
countByTypeData
]
=
await
Promise
.
all
([
const
[
countByDomainData
,
countByTypeData
]
=
await
Promise
.
all
([
get
CountByDomai
n
(
route
.
query
.
startTime
),
get
DomainDistributio
n
(
route
.
query
.
startTime
),
getCountByType
(
route
.
query
.
startTime
)
getCountByType
(
route
.
query
.
startTime
)
]);
]);
pie1Option
.
value
=
getPieOption
(
pie1Option
.
value
=
getPieOption
(
...
...
src/views/exportControl/analysis/content/overview.vue
浏览文件 @
466aabb3
...
@@ -88,9 +88,13 @@
...
@@ -88,9 +88,13 @@
<div
class=
"hintWrap"
>
<div
class=
"hintWrap"
>
<div
class=
"title"
>
<div
class=
"title"
>
共计
共计
<span
class=
"text1"
>
112
</span>
<span
class=
"text1"
>
{{ entityTotal }}
</span>
家,其中50%规则涉及
家,其中50%规则涉及
<span
class=
"text2"
>
604
</span>
<span
class=
"text2"
>
{{
panel5IsChecked
? entitiesCountBy50PercentRulesData?.ruleCount
: entitiesCountBy50PercentRulesData?.totalCount
}}
</span>
家
家
</div>
</div>
</div>
</div>
...
@@ -185,10 +189,6 @@ import ButtonList from "@/components/buttonList/buttonList.vue";
...
@@ -185,10 +189,6 @@ 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
panel2_1
from
"../../assets/images/panel2_1.png"
;
import
panel2_2
from
"../../assets/images/panel2_2.png"
;
import
panel2_3
from
"../../assets/images/panel2_3.png"
;
import
panel2_4
from
"../../assets/images/panel2_4.png"
;
import
panel5_1
from
"../../assets/images/panel5_1.png"
;
import
panel5_1
from
"../../assets/images/panel5_1.png"
;
import
panel5_2
from
"../../assets/images/panel5_2.png"
;
import
panel5_2
from
"../../assets/images/panel5_2.png"
;
import
panel5_3
from
"../../assets/images/panel5_3.png"
;
import
panel5_3
from
"../../assets/images/panel5_3.png"
;
...
@@ -202,7 +202,8 @@ import {
...
@@ -202,7 +202,8 @@ import {
getPersonList
,
getPersonList
,
getSanReasonSelect
,
getSanReasonSelect
,
getSelectEntitiesList
,
getSelectEntitiesList
,
getEntitiesList
getEntitiesList
,
getEntitiesCountBy50PercentRules
}
from
"@/api/exportControl"
;
}
from
"@/api/exportControl"
;
import
_
from
"lodash"
;
import
_
from
"lodash"
;
...
@@ -275,16 +276,18 @@ const total = ref(0);
...
@@ -275,16 +276,18 @@ 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
);
onMounted
(
async
()
=>
{
onMounted
(
async
()
=>
{
try
{
try
{
const
[
organizationInfoData
,
sanReasonSelectData
]
=
await
Promise
.
all
([
const
[
organizationInfoData
,
sanReasonSelectData
,
entitiesCountBy50PercentRulesData
]
=
await
Promise
.
all
([
getOrganizationInfo
(),
getOrganizationInfo
(),
// getPersonList(),
// getPersonList(),
getSanReasonSelect
(
route
.
query
.
startTime
)
getSanReasonSelect
(
route
.
query
.
startTime
),
getEntitiesCountBy50PercentRules
(
"实体清单"
,
currentPage
.
value
,
pageSize
.
value
)
// getSelectEntitiesList(route.query.startTime)
// getSelectEntitiesList(route.query.startTime)
]);
]);
console
.
log
(
"
organizationInfoData"
,
organizationInfo
Data
);
console
.
log
(
"
entitiesCountBy50PercentRulesData"
,
entitiesCountBy50PercentRules
Data
);
organizationInfo
.
value
=
{
organizationInfo
.
value
=
{
img
:
panel1_1
,
img
:
panel1_1
,
mingcheng
:
organizationInfoData
?.
orgNameZh
,
mingcheng
:
organizationInfoData
?.
orgNameZh
,
...
@@ -325,6 +328,7 @@ onMounted(async () => {
...
@@ -325,6 +328,7 @@ onMounted(async () => {
});
});
// 获取实体清单数据
// 获取实体清单数据
const
entityTotal
=
ref
(
0
);
const
fetchEntitiesList
=
async
(
page
=
1
,
size
=
10
)
=>
{
const
fetchEntitiesList
=
async
(
page
=
1
,
size
=
10
)
=>
{
if
(
loading
.
value
||
noMoreData
.
value
)
return
;
if
(
loading
.
value
||
noMoreData
.
value
)
return
;
...
@@ -332,6 +336,7 @@ const fetchEntitiesList = async (page = 1, size = 10) => {
...
@@ -332,6 +336,7 @@ const fetchEntitiesList = async (page = 1, size = 10) => {
try
{
try
{
const
res
=
await
getEntitiesList
(
"实体清单"
,
page
,
size
,
route
.
query
.
startTime
,
panel5IsChecked
.
value
);
const
res
=
await
getEntitiesList
(
"实体清单"
,
page
,
size
,
route
.
query
.
startTime
,
panel5IsChecked
.
value
);
if
(
res
)
{
if
(
res
)
{
entityTotal
.
value
=
res
.
totalElements
;
const
newData
=
res
.
content
.
map
(
item
=>
({
const
newData
=
res
.
content
.
map
(
item
=>
({
...
item
,
...
item
,
name
:
item
.
entityNameZh
,
name
:
item
.
entityNameZh
,
...
@@ -372,6 +377,7 @@ watch(
...
@@ -372,6 +377,7 @@ watch(
()
=>
panel5IsChecked
.
value
,
()
=>
panel5IsChecked
.
value
,
newVal
=>
{
newVal
=>
{
fetchEntitiesList
(
1
,
10
);
fetchEntitiesList
(
1
,
10
);
// getEntitiesCountBy50PercentRules("实体清单", 1, pageSize.value)
}
}
);
);
...
...
src/views/exportControl/components/news.vue
浏览文件 @
466aabb3
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
<div
class=
"news-list"
>
<div
class=
"news-list"
>
<div
v-for=
"(item, index) in listData"
:key=
"index"
class=
"news-item"
@
click=
"handleItemClick(item)"
>
<div
v-for=
"(item, index) in listData"
:key=
"index"
class=
"news-item"
@
click=
"handleItemClick(item)"
>
<div
class=
"news-image"
>
<div
class=
"news-image"
>
<img
:src=
"item.
image
|| newsImg"
:alt=
"item.title"
/>
<img
:src=
"item.
avatar
|| newsImg"
:alt=
"item.title"
/>
</div>
</div>
<div
class=
"news-content"
>
<div
class=
"news-content"
>
<div
class=
"news-header"
>
<div
class=
"news-header"
>
...
...
出口管制接口.xlsx
0 → 100644
浏览文件 @
466aabb3
File added
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论