Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
5c38f268
提交
5c38f268
authored
4月 09, 2026
作者:
yanpeng
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'pre' of
http://8.140.26.4:10003/caijian/risk-monitor
into yp-dev
上级
dd2b632a
79410949
流水线
#396
已通过 于阶段
in 1 分 36 秒
变更
37
流水线
1
全部展开
显示空白字符变更
内嵌
并排
正在显示
37 个修改的文件
包含
845 行增加
和
526 行删除
+845
-526
config.js
public/js/config.js
+3
-0
billHome.js
src/api/bill/billHome.js
+1
-1
index.js
src/api/marketAccessRestrictions/index.js
+2
-2
overviewNormalBox.vue
src/components/base/boxBackground/overviewNormalBox.vue
+26
-35
IntelligentEntityText.vue
src/components/base/texts/IntelligentEntityText.vue
+56
-8
index.js
src/router/index.js
+1
-1
decree.js
src/router/modules/decree.js
+6
-12
marketAccessRestrictions.js
src/router/modules/marketAccessRestrictions.js
+4
-13
writtingAsstaintStore.js
src/stores/writtingAsstaintStore.js
+2
-4
ResourceLibrarySection.vue
src/views/bill/billHome/ResourceLibrarySection.vue
+1
-3
index.vue
src/views/bill/billHome/index.vue
+37
-20
index.vue
src/views/bill/deepDig/processAnalysis/index.vue
+7
-0
index.vue
src/views/bill/template/index.vue
+25
-1
index.vue
src/views/dataLibrary/bill/countryBill/index.vue
+2
-2
index.vue
...s/dataLibrary/exportControl/commerceControlList/index.vue
+2
-2
index.vue
...aLibrary/exportControl/commerceControlListEvent/index.vue
+2
-2
index.vue
src/views/dataLibrary/exportControl/entityList/index.vue
+13
-10
index.vue
...views/dataLibrary/exportControl/entityListEvent/index.vue
+2
-2
index.vue
src/views/dataLibrary/index.vue
+4
-3
index.vue
src/views/decree/decreeHome/index.vue
+2
-70
index.vue
src/views/decree/decreeLayout/index.vue
+1
-234
index.vue
src/views/exportControl/index.vue
+0
-0
charts.js
src/views/exportControl/utils/charts.js
+1
-1
index.vue
...ontrol/v2.0EntityList/components/dataStatistics/index.vue
+87
-9
index.vue
...ol/v2.0SingleSanction/components/dataStatistics/index.vue
+96
-14
SurveyHistory.vue
src/views/marketAccessRestrictions/com/SurveyHistory.vue
+0
-1
tips-icon.png
...sRestrictions/marketAccessHome/assets/icons/tips-icon.png
+0
-0
CarouselItem232.vue
...cessRestrictions/marketAccessHome/com/CarouselItem232.vue
+87
-0
CarouselItem301.vue
...cessRestrictions/marketAccessHome/com/CarouselItem301.vue
+124
-0
CarouselItem337.vue
...cessRestrictions/marketAccessHome/com/CarouselItem337.vue
+125
-0
index.vue
...views/marketAccessRestrictions/marketAccessHome/index.vue
+0
-0
barChart1.js
...ketAccessRestrictions/marketAccessHome/utils/barChart1.js
+6
-4
multiLineChart.js
...cessRestrictions/marketAccessHome/utils/multiLineChart.js
+53
-14
index.vue
...tAccessRestrictions/marketAccessLayout/case/337/index.vue
+2
-2
index.vue
...ews/marketAccessRestrictions/marketAccessLayout/index.vue
+29
-15
index.vue
...views/marketAccessRestrictions/singleCaseLayout/index.vue
+36
-41
出口管制接口-4.md
出口管制接口-4.md
+0
-0
没有找到文件。
public/js/config.js
浏览文件 @
5c38f268
const
baseUrl
=
`http://8.140.26.4:9085`
const
outImgbaseUrl
=
`http://8.140.26.4:10017/out/img`
// 写报图片URL
\ No newline at end of file
src/api/bill/billHome.js
浏览文件 @
5c38f268
...
...
@@ -16,7 +16,7 @@ export function getBillIndustry(params) {
return
request
({
method
:
'GET'
,
url
:
`/api/BillOverview/billIndustry/
${
params
.
year
}
`
,
params
:
{
sta
tus
:
params
.
status
}
params
:
{
sta
geName
:
params
.
stageName
}
})
}
...
...
src/api/marketAccessRestrictions/index.js
浏览文件 @
5c38f268
...
...
@@ -138,7 +138,7 @@ export function getSurveyList(params) {
// 详情页---------------------------------------------------
//
获取调查列表
接口
//
调查分类详情
接口
/**
* @param { sortCode }
*/
...
...
@@ -169,7 +169,7 @@ export function getSearchAllYear(params) {
}
// 调查简介
/marketsearchDetails/searchBlurb
// 调查简介
export
function
getSearchBlurb
(
params
)
{
return
request
({
method
:
'GET'
,
...
...
src/components/base/boxBackground/overviewNormalBox.vue
浏览文件 @
5c38f268
<
template
>
<div
class=
"overview-normal-box-wrapper"
:style=
"
{ width: width ? width : '1064px', height: height ? height : '460px' }">
<div
class=
"overview-normal-box-header"
>
<div
class=
"header-left"
>
<div
class=
"header-icon"
>
<div
class=
"box-main"
:style=
"
{ width: width || '1064px', height: height || '460px' }">
<div
class=
"box-head-box"
>
<div
class=
"box-head-left"
>
<slot
name=
"header-icon"
></slot>
</div>
<div
class=
"header-title"
>
{{
title
}}
</div>
</div>
<div
class=
"header-right"
>
<div
class=
"box-head-name one-line-ellipsis"
>
{{
title
}}
</div>
<div
class=
"box-head-right"
>
<slot
name=
"header-right"
></slot>
</div>
</div>
<div
class=
"
wrapper-main
"
>
<div
class=
"
box-down-box
"
>
<slot></slot>
</div>
</div>
...
...
@@ -41,49 +37,44 @@ const props = defineProps({
</
script
>
<
style
lang=
"scss"
scoped
>
.
overview-normal-box-wrapper
{
.
box-main
{
border
:
1px
solid
rgba
(
234
,
236
,
238
,
1
);
border-radius
:
10px
;
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
position
:
relative
;
display
:
flex
;
flex-direction
:
column
;
.overview-normal-box-header
{
.box-head-box
{
padding
:
0
22px
;
height
:
48px
;
border-bottom
:
1px
solid
rgba
(
240
,
242
,
244
,
1
);
display
:
flex
;
justify-content
:
space-between
;
box-sizing
:
border-box
;
.header-left
{
display
:
flex
;
.header-icon
{
align-items
:
center
;
width
:
100%
;
.box-head-left
{
width
:
24px
;
height
:
24px
;
margin-top
:
14
px
;
margin-left
:
19
px
;
font-size
:
0
px
;
margin-right
:
16
px
;
}
.header-title
{
margin-left
:
17px
;
height
:
48px
;
.box-head-name
{
color
:
var
(
--
color-main-active
);
font-family
:
Source
Han
Sans
CN
;
font-size
:
20px
;
font-weight
:
700
;
line-height
:
48
px
;
text-align
:
center
;
}
font-weight
:
bold
;
line-height
:
20
px
;
width
:
20px
;
flex
:
auto
;
}
.header-right
{
height
:
48px
;
margin-right
:
28px
;
.box-head-right
{
margin-left
:
16px
;
}
}
.wrapper-main
{
height
:
calc
(
100%
-
48px
);
.box-down-box
{
height
:
20px
;
flex
:
auto
;
overflow
:
hidden
;
}
}
...
...
src/components/base/texts/IntelligentEntityText.vue
浏览文件 @
5c38f268
<
template
>
<p
class=
"p-regular-rereg"
>
<span
class=
"text-regular"
v-for=
"(segment, index) in processedText"
:key=
"index"
>
<span
v-if=
"segment.isEntity"
@
click=
"$emit('onEntityClick', segment.entity)"
class=
"entity-link"
>
<span
v-if=
"segment.isEntity"
@
click=
"$emit('onEntityClick', segment.entity)"
:class=
"['entity-link',
{ 'keyword-highlight': segment.isKeywordHit }]"
>
{{
segment
.
entity
?.
text_span
}}
<img
:src=
"SearchIcon"
:width=
"10"
:height=
"10"
alt=
"search"
/>
</span>
<span
v-else
>
{{
segment
.
text
}}
<span
:class=
"
{ 'keyword-highlight': segment.isKeywordHit }">
{{
segment
.
text
}}
</span>
</span>
</span>
</p>
...
...
@@ -20,6 +24,7 @@ export interface ProcessedTextSegment {
text
:
string
;
isEntity
:
boolean
;
entity
?:
TextEntity
;
isKeywordHit
?:
boolean
;
}
const
props
=
defineProps
({
text
:
{
...
...
@@ -29,15 +34,42 @@ const props = defineProps({
entities
:
{
type
:
Array
<
TextEntity
>
,
default
:
()
=>
[]
},
highlight
:
{
type
:
String
,
default
:
""
}
});
const
emit
=
defineEmits
([
"onEntityClick"
]);
// 处理后的文本段
const
processedText
=
ref
<
ProcessedTextSegment
[]
>
([]);
const
normalizeKeyword
=
(
value
:
unknown
)
=>
String
(
value
??
""
).
trim
();
const
getKeywordMatches
=
(
text
:
string
,
keyword
:
string
)
=>
{
if
(
!
keyword
)
return
[{
text
,
isKeywordHit
:
false
}];
const
lowerText
=
text
.
toLowerCase
();
const
lowerKeyword
=
keyword
.
toLowerCase
();
if
(
!
lowerKeyword
)
return
[{
text
,
isKeywordHit
:
false
}];
const
parts
:
Array
<
{
text
:
string
;
isKeywordHit
:
boolean
}
>
=
[];
let
start
=
0
;
while
(
start
<
text
.
length
)
{
const
index
=
lowerText
.
indexOf
(
lowerKeyword
,
start
);
if
(
index
===
-
1
)
{
parts
.
push
({
text
:
text
.
slice
(
start
),
isKeywordHit
:
false
});
break
;
}
if
(
index
>
start
)
{
parts
.
push
({
text
:
text
.
slice
(
start
,
index
),
isKeywordHit
:
false
});
}
parts
.
push
({
text
:
text
.
slice
(
index
,
index
+
keyword
.
length
),
isKeywordHit
:
true
});
start
=
index
+
keyword
.
length
;
}
return
parts
.
filter
(
part
=>
part
.
text
);
};
// 处理文本,识别并替换实体
const
processText
=
()
=>
{
console
.
log
(
"props.entities.length"
,
props
.
entities
.
length
);
if
(
!
props
.
text
||
!
props
.
entities
)
{
// console.log('props.text', props.entities.length)
processedText
.
value
=
[{
text
:
""
,
isEntity
:
false
}];
...
...
@@ -46,6 +78,7 @@ const processText = () => {
const
result
=
[];
let
currentPosition
=
0
;
const
keyword
=
normalizeKeyword
(
props
.
highlight
);
// 按实体文本长度排序,优先匹配长文本
const
sortedEntities
=
[...
props
.
entities
].
sort
((
a
,
b
)
=>
b
.
text_span
.
length
-
a
.
text_span
.
length
);
...
...
@@ -61,7 +94,8 @@ const processText = () => {
// 如果当前位置是实体,添加到结果
result
.
push
({
isEntity
:
true
,
entity
:
{
...
entity
}
entity
:
{
...
entity
},
isKeywordHit
:
keyword
?
entityText
.
toLowerCase
().
includes
(
keyword
.
toLowerCase
())
:
false
});
currentPosition
=
endPosition
;
matched
=
true
;
...
...
@@ -82,18 +116,26 @@ const processText = () => {
if
(
nextEntityStart
>
currentPosition
)
{
const
plainText
=
props
.
text
.
substring
(
currentPosition
,
nextEntityStart
);
const
parts
=
getKeywordMatches
(
plainText
,
keyword
);
parts
.
forEach
(
part
=>
{
result
.
push
({
text
:
plainText
,
isEntity
:
false
text
:
part
.
text
,
isEntity
:
false
,
isKeywordHit
:
part
.
isKeywordHit
});
});
currentPosition
=
nextEntityStart
;
}
else
{
// 没有更多实体,添加剩余文本
const
remainingText
=
props
.
text
.
substring
(
currentPosition
);
if
(
remainingText
)
{
const
parts
=
getKeywordMatches
(
remainingText
,
keyword
);
parts
.
forEach
(
part
=>
{
result
.
push
({
text
:
remainingText
,
isEntity
:
false
text
:
part
.
text
,
isEntity
:
false
,
isKeywordHit
:
part
.
isKeywordHit
});
});
}
currentPosition
=
props
.
text
.
length
;
...
...
@@ -106,6 +148,7 @@ const processText = () => {
// 监听文本和实体变化
watch
(()
=>
props
.
text
,
processText
);
watch
(()
=>
props
.
entities
,
processText
,
{
deep
:
true
});
watch
(()
=>
props
.
highlight
,
processText
);
// 初始化处理
onMounted
(
processText
);
...
...
@@ -113,6 +156,11 @@ onMounted(processText);
<
style
lang=
"scss"
scoped
>
@use
"@/styles/common.scss"
;
.keyword-highlight
{
background
:
rgba
(
255
,
199
,
0
,
0
.35
);
border-radius
:
2px
;
}
.entity-link
{
color
:
var
(
--
color-primary-100
);
&
:hover
{
...
...
src/router/index.js
浏览文件 @
5c38f268
...
...
@@ -94,7 +94,7 @@ router.beforeEach((to, from, next) => {
const
storageKey
=
to
.
meta
.
titleStorageKey
||
"curTabName"
;
// 新开页签时 sessionStorage 不共享,优先用 query 带过来的 title/name
const
queryTitle
=
(
to
.
query
&&
(
to
.
query
.
title
||
to
.
query
.
name
))
?
String
(
to
.
query
.
title
||
to
.
query
.
name
)
:
""
;
if
(
!
to
.
path
.
startsWith
(
'/decreeLayout/'
)
)
{
if
(
!
to
.
meta
.
noTitle
)
{
document
.
title
=
queryTitle
||
window
.
sessionStorage
.
getItem
(
storageKey
)
||
to
.
meta
.
title
;
}
}
else
{
...
...
src/router/modules/decree.js
浏览文件 @
5c38f268
...
...
@@ -28,9 +28,7 @@ const decreeRoutes = [
name
:
"DecreeLayoutContainer"
,
component
:
DecreeLayoutContainer
,
redirect
:
"/decreeLayout/overview"
,
// meta: {
// title: "政令布局"
// },
// meta: { title: "政令布局" },
children
:
[
{
path
:
"overview"
,
...
...
@@ -46,19 +44,19 @@ const decreeRoutes = [
path
:
"introduction"
,
name
:
"DecreeIntroduction"
,
component
:
DecreeIntroduction
,
// meta: { title: "政令简介"
}
meta
:
{
noTitle
:
true
}
},
{
path
:
"background"
,
name
:
"DecreeBackground"
,
component
:
DecreeBackground
,
// meta: { title: "政令背景"
}
meta
:
{
noTitle
:
true
}
},
{
path
:
"measures"
,
name
:
"DecreeMeasures"
,
component
:
DecreeMeasures
,
// meta: { title: "政令举措"
}
meta
:
{
noTitle
:
true
}
},
]
},
...
...
@@ -67,18 +65,14 @@ const decreeRoutes = [
path
:
"deepDig"
,
name
:
"DeepDig"
,
component
:
DecreeDeepDig
,
// meta: {
// title: "深度挖掘"
// }
meta
:
{
noTitle
:
true
}
},
// 影响分析路由
{
path
:
"influence"
,
name
:
"DecreeInfluence"
,
component
:
DecreeInfluence
,
// meta: {
// title: "影响分析"
// }
meta
:
{
noTitle
:
true
}
},
]
},
...
...
src/router/modules/marketAccessRestrictions.js
浏览文件 @
5c38f268
...
...
@@ -28,22 +28,17 @@ const marketAccessRestrictionsRoutes = [
dynamicTitle
:
true
},
children
:
[
{
path
:
"case"
,
name
:
"MarketAccessCase"
,
component
:
MarketAccessCase
,
// meta: {
// title: "调查案件"
// }
meta
:
{
noTitle
:
true
}
},
{
path
:
"overview"
,
name
:
"MarketAccessOverview"
,
component
:
MarketAccessOverview
,
// meta: {
// title: "数据统计"
// }
meta
:
{
noTitle
:
true
}
}
]
},
...
...
@@ -62,17 +57,13 @@ const marketAccessRestrictionsRoutes = [
path
:
"overview"
,
name
:
"MarketSingleCaseOverview"
,
component
:
MarketSingleCaseOverview
,
// meta: {
// title: "调查简介"
// }
meta
:
{
noTitle
:
true
}
},
{
path
:
"deepdig"
,
name
:
"MarketSingleCaseDeepdig"
,
component
:
MarketSingleCaseDeepdig
,
// meta: {
// title: "深度挖掘"
// }
meta
:
{
noTitle
:
true
}
}
]
},
...
...
src/stores/writtingAsstaintStore.js
浏览文件 @
5c38f268
...
...
@@ -485,7 +485,6 @@ export const useWrittingAsstaintStore = defineStore('writtingAsstaint', {
// ========== AI 生成报文 SSE(更新报文内容 + 执行步骤) ==========
async
fetchReportData
(
params
)
{
console
.
log
(
">"
)
if
(
this
.
abortController
)
this
.
abortController
.
abort
();
this
.
abortController
=
new
AbortController
();
// this.processLog = '';
...
...
@@ -511,7 +510,8 @@ export const useWrittingAsstaintStore = defineStore('writtingAsstaint', {
lastFlushedIndex
=
0
;
if
(
this
.
reportContent
.
includes
(
'./out/img'
))
{
this
.
reportContent
=
this
.
reportContent
.
replaceAll
(
'./out/img'
,
'http://172.19.21.9:8003/out/img'
);
this
.
reportContent
=
this
.
reportContent
.
replaceAll
(
'./out/img'
,
outImgbaseUrl
);
// console.log(reportContent)
}
};
...
...
@@ -571,7 +571,6 @@ export const useWrittingAsstaintStore = defineStore('writtingAsstaint', {
streamBuffer
+=
str
;
updateFlushIndexByBoundary
();
flushToReport
(
false
);
console
.
log
(
streamBuffer
,
456
)
console
.
log
(
msgData
,
'data'
)
}
else
{
// 结束时把剩余内容强制 flush
...
...
@@ -663,7 +662,6 @@ export const useWrittingAsstaintStore = defineStore('writtingAsstaint', {
};
await
this
.
fetchReportData
(
params
);
}
else
{
console
.
log
(
10101010101010
)
// 政令模板需要先解析PDF
if
(
this
.
curTempTitle
===
'政令'
)
{
if
(
this
.
uploadFileList
.
length
===
0
)
{
...
...
src/views/bill/billHome/ResourceLibrarySection.vue
浏览文件 @
5c38f268
...
...
@@ -93,7 +93,7 @@
<div
class=
"item"
>
<div
class=
"item-left"
>
法案进展:
</div>
<div
class=
"item-right2"
>
<div
class=
"tag"
v-for=
"(val, idx) in
getReversedProgress(item.progress)
"
:key=
"`$
{item.billId}-${val}-${idx}`" :style="{ zIndex: item.progress.length - idx }">
{{
val
}}
</div>
<div
class=
"tag"
v-for=
"(val, idx) in
item.progress
"
:key=
"`$
{item.billId}-${val}-${idx}`" :style="{ zIndex: item.progress.length - idx }">
{{
val
}}
</div>
</div>
</div>
</div>
...
...
@@ -458,8 +458,6 @@ const handleClickAvatar = async member => {
}
catch
(
error
)
{
}
}
;
const
getReversedProgress
=
progress
=>
(
Array
.
isArray
(
progress
)
?
[...
progress
].
reverse
()
:
[]);
const
handleClickCommitteeBill
=
bill
=>
{
if
(
!
bill
?.
billId
)
return
;
props
.
onClickToDetail
({
...
...
src/views/bill/billHome/index.vue
浏览文件 @
5c38f268
...
...
@@ -373,7 +373,8 @@ const committeeTimeRange = ref("近一月");
const
committeeTimeOptions
=
[
{
label
:
"近一周"
,
value
:
"近一周"
},
{
label
:
"近一月"
,
value
:
"近一月"
},
{
label
:
"近一年"
,
value
:
"近一年"
}
{
label
:
"近一年"
,
value
:
"近一年"
},
{
label
:
"全部时间"
,
value
:
"全部时间"
}
];
const
committeeCardList
=
ref
([]);
...
...
@@ -1029,14 +1030,15 @@ const handleBox6 = async () => {
// 涉华领域分布
const
box9ChartData
=
ref
([]);
const
box9selectetedTime
=
ref
(
"2025"
);
// 立法状态下拉:提出法案、众议院通过、参议院通过、解决分歧、完成立法
// v-model 存储的是接口需要的 status 值
const
box9LegislativeStatus
=
ref
(
"提案"
);
// 立法状态下拉:提出法案、众议院通过、参议院通过、解决分歧、
呈交总统、
完成立法
// v-model 存储的是接口需要的 status 值
(直接作为接口参数)
const
box9LegislativeStatus
=
ref
(
"提
出法
案"
);
const
box9LegislativeStatusList
=
ref
([
{
label
:
"提出法案"
,
value
:
"提案"
},
{
label
:
"提出法案"
,
value
:
"提
出法
案"
},
{
label
:
"众议院通过"
,
value
:
"众议院通过"
},
{
label
:
"参议院通过"
,
value
:
"参议院通过"
},
{
label
:
"解决分歧"
,
value
:
"分歧已解决"
},
{
label
:
"解决分歧"
,
value
:
"解决分歧"
},
{
label
:
"呈交总统"
,
value
:
"呈交总统"
},
{
label
:
"完成立法"
,
value
:
"完成立法"
}
]);
const
box9YearList
=
ref
([
...
...
@@ -1063,18 +1065,39 @@ const box9YearList = ref([
]);
const
box9HasData
=
ref
(
true
);
let
box9ChartInstance
=
null
;
const
BOX9_MAX_DOMAIN_COUNT
=
7
;
const
BOX9_OTHER_DOMAIN_NAME
=
"其他"
;
const
formatBox9DomainData
=
(
list
=
[])
=>
{
if
(
!
Array
.
isArray
(
list
)
||
list
.
length
<=
BOX9_MAX_DOMAIN_COUNT
)
{
return
list
;
}
const
topDomainList
=
list
.
slice
(
0
,
BOX9_MAX_DOMAIN_COUNT
);
const
otherDomainCount
=
list
.
slice
(
BOX9_MAX_DOMAIN_COUNT
).
reduce
((
sum
,
item
)
=>
{
return
sum
+
Number
(
item
?.
countBill
||
0
);
},
0
);
if
(
!
otherDomainCount
)
{
return
topDomainList
;
}
return
[
...
topDomainList
,
{
industryName
:
BOX9_OTHER_DOMAIN_NAME
,
countBill
:
otherDomainCount
}
];
};
const
getBox9Data
=
async
()
=>
{
chartLoading
.
value
=
{
...
chartLoading
.
value
,
box6
:
true
};
const
params
=
{
year
:
box9selectetedTime
.
value
,
sta
tus
:
box9LegislativeStatus
.
value
sta
geName
:
box9LegislativeStatus
.
value
};
try
{
const
res
=
await
getBillIndustry
(
params
);
console
.
log
(
"box9-涉华法案领域分布"
,
res
.
data
);
if
(
res
.
code
===
200
&&
res
.
data
&&
res
.
data
.
length
>
0
)
{
box9HasData
.
value
=
true
;
box9ChartData
.
value
=
res
.
data
;
box9ChartData
.
value
=
formatBox9DomainData
(
res
.
data
)
;
}
else
{
box9HasData
.
value
=
false
;
box9ChartData
.
value
=
[];
...
...
@@ -1104,16 +1127,9 @@ const handleBox9Data = async () => {
const
selectedIndex
=
box9LegislativeStatusList
.
value
.
findIndex
(
item
=>
item
.
value
===
box9LegislativeStatus
.
value
);
const
arr
=
[
{
label
:
"提出法案"
,
value
:
"提案"
},
{
label
:
"众议院通过"
,
value
:
"众议院通过"
},
{
label
:
"参议院通过"
,
value
:
"参议院通过"
},
{
label
:
"解决分歧"
,
value
:
"分歧已解决"
},
{
label
:
"完成立法"
,
value
:
"完成立法"
}
]
const
status
=
arr
.
filter
(
item
=>
{
return
item
.
value
===
box9LegislativeStatus
.
value
})[
0
].
label
// 当前选中的立法状态中文名(直接等于接口传参值)
const
statusItem
=
box9LegislativeStatusList
.
value
[
selectedIndex
];
const
status
=
statusItem
?
statusItem
.
label
:
""
;
const
selectParam
=
{
moduleType
:
'国会法案'
,
key
:
2
,
...
...
@@ -1272,13 +1288,14 @@ const getBox8ChartOption = stageList => {
const
handleBox8Data
=
async
()
=>
{
chartLoading
.
value
=
{
...
chartLoading
.
value
,
box8
:
true
};
// 进展分布显示顺序:提出法案(对应进度“提案”)、众议院通过、参议院通过、
分歧已解决(解决分歧)
、完成立法
const
stageOrder
=
[
"提案"
,
"众议院通过"
,
"参议院通过"
,
"分歧已解决"
,
"完成立法"
];
// 进展分布显示顺序:提出法案(对应进度“提案”)、众议院通过、参议院通过、
解决分歧(对应进度“分歧已解决”)、呈交总统
、完成立法
const
stageOrder
=
[
"提案"
,
"众议院通过"
,
"参议院通过"
,
"分歧已解决"
,
"
呈交总统"
,
"
完成立法"
];
const
stageNameMap
=
{
提案
:
"提出法案"
,
众议院通过
:
"众议院通过"
,
参议院通过
:
"参议院通过"
,
分歧已解决
:
"解决分歧"
,
呈交总统
:
"呈交总统"
,
完成立法
:
"完成立法"
};
...
...
src/views/bill/deepDig/processAnalysis/index.vue
浏览文件 @
5c38f268
...
...
@@ -1169,6 +1169,10 @@ onMounted(async () => {
<
style
lang
=
"scss"
scoped
>
.
wrap
{
display
:
flex
;
flex
-
direction
:
row
;
flex
-
wrap
:
nowrap
;
direction
:
ltr
;
justify
-
content
:
flex
-
start
;
margin
-
bottom
:
30
px
;
...
...
@@ -1254,6 +1258,8 @@ onMounted(async () => {
.
left
{
margin
-
top
:
16
px
;
width
:
792
px
;
flex
:
0
0
792
px
;
.
box1
{
width
:
792
px
;
...
...
@@ -1651,6 +1657,7 @@ onMounted(async () => {
margin
-
left
:
16
px
;
margin
-
top
:
16
px
;
width
:
792
px
;
flex
:
0
0
792
px
;
height
:
847
px
;
.
box3
{
...
...
src/views/bill/template/index.vue
浏览文件 @
5c38f268
...
...
@@ -131,6 +131,7 @@
<IntelligentEntityText
:text=
"term?.fynr || ''"
:entities=
"termsHighlight ? getTermEntities(term, 'cn') : []"
:highlight=
"searchKeyword"
@
on-entity-click=
"e => gotoSearchResults(e.text_span, '')"
/>
</div>
...
...
@@ -141,6 +142,7 @@
<IntelligentEntityText
:text=
"term?.ywnr || ''"
:entities=
"termsHighlight ? getTermEntities(term, 'en') : []"
:highlight=
"searchKeyword"
@
on-entity-click=
"e => gotoSearchResults(e.text_span, '')"
/>
</div>
...
...
@@ -343,6 +345,27 @@ const chart1ColorList = ref([...MUTICHARTCOLORS]);
const
chart2ColorList
=
ref
([...
MUTICHARTCOLORS
]);
const
chart2Data
=
ref
([]);
const
DOMAIN_MAX_DISPLAY_COUNT
=
7
;
const
DOMAIN_OTHER_NAME
=
"其他"
;
const
formatDomainChartData
=
(
list
=
[])
=>
{
if
(
!
Array
.
isArray
(
list
)
||
list
.
length
<=
DOMAIN_MAX_DISPLAY_COUNT
)
{
return
list
;
}
const
topDomainList
=
list
.
slice
(
0
,
DOMAIN_MAX_DISPLAY_COUNT
);
const
otherCount
=
list
.
slice
(
DOMAIN_MAX_DISPLAY_COUNT
).
reduce
((
sum
,
item
)
=>
{
return
sum
+
Number
(
item
?.
value
||
0
);
}
,
0
);
if
(
!
otherCount
)
{
return
topDomainList
;
}
return
[
...
topDomainList
,
{
name
:
DOMAIN_OTHER_NAME
,
value
:
otherCount
}
];
}
;
const
aiPaneVisible
=
ref
({
domain
:
false
,
...
...
@@ -737,12 +760,13 @@ const handleGetBillHyly = async () => {
.
map
(
name
=>
{
return
{
label
:
name
,
value
:
name
}
;
}
);
c
hart2Data
.
value
=
res
.
data
.
map
(
item
=>
{
c
onst
domainChartData
=
res
.
data
.
map
(
item
=>
{
return
{
name
:
item
.
hylymc
,
value
:
item
.
countTk
}
;
}
);
chart2Data
.
value
=
formatDomainChartData
(
domainChartData
);
aiPaneFetched
.
value
=
{
...
aiPaneFetched
.
value
,
domain
:
false
}
;
let
chart2
=
getPieChart
(
chart2Data
.
value
,
chart2ColorList
.
value
);
...
...
src/views/dataLibrary/bill/countryBill/index.vue
浏览文件 @
5c38f268
...
...
@@ -1131,10 +1131,10 @@ const initParam = () => {
const
query
=
route
.
query
;
if
(
Object
.
keys
(
query
).
length
>
0
)
{
sessionStorage
.
setItem
(
'
r
outeQuery'
,
JSON
.
stringify
(
query
));
sessionStorage
.
setItem
(
'
countryR
outeQuery'
,
JSON
.
stringify
(
query
));
}
}
else
{
const
savedQuery
=
JSON
.
parse
(
sessionStorage
.
getItem
(
'
r
outeQuery'
)
||
'{
}
'
);
const
savedQuery
=
JSON
.
parse
(
sessionStorage
.
getItem
(
'
countryR
outeQuery'
)
||
'{
}
'
);
selectedArea
.
value
=
savedQuery
.
domains
?
savedQuery
.
domains
:
'全部领域'
if
(
savedQuery
.
selectedDate
&&
Array
.
isArray
(
JSON
.
parse
(
savedQuery
.
selectedDate
))
&&
JSON
.
parse
(
savedQuery
.
selectedDate
).
length
)
{
selectedDate
.
value
=
'自定义'
...
...
src/views/dataLibrary/exportControl/commerceControlList/index.vue
浏览文件 @
5c38f268
...
...
@@ -876,10 +876,10 @@ const initParam = () => {
const
query
=
route
.
query
;
if
(
Object
.
keys
(
query
).
length
>
0
)
{
sessionStorage
.
setItem
(
'
decre
eRouteQuery'
,
JSON
.
stringify
(
query
));
sessionStorage
.
setItem
(
'
commerc
eRouteQuery'
,
JSON
.
stringify
(
query
));
}
}
else
{
const
savedQuery
=
JSON
.
parse
(
sessionStorage
.
getItem
(
'
decre
eRouteQuery'
)
||
'{
}
'
);
const
savedQuery
=
JSON
.
parse
(
sessionStorage
.
getItem
(
'
commerc
eRouteQuery'
)
||
'{
}
'
);
selectedArea
.
value
=
savedQuery
.
domains
?
savedQuery
.
domains
:
'全部领域'
if
(
savedQuery
.
selectedDate
&&
Array
.
isArray
(
JSON
.
parse
(
savedQuery
.
selectedDate
))
&&
JSON
.
parse
(
savedQuery
.
selectedDate
).
length
)
{
selectedDate
.
value
=
'自定义'
...
...
src/views/dataLibrary/exportControl/commerceControlListEvent/index.vue
浏览文件 @
5c38f268
...
...
@@ -803,10 +803,10 @@ const initParam = () => {
const
query
=
route
.
query
;
if
(
Object
.
keys
(
query
).
length
>
0
)
{
sessionStorage
.
setItem
(
'
decree
RouteQuery'
,
JSON
.
stringify
(
query
));
sessionStorage
.
setItem
(
'
commerceEvent
RouteQuery'
,
JSON
.
stringify
(
query
));
}
}
else
{
const
savedQuery
=
JSON
.
parse
(
sessionStorage
.
getItem
(
'
decree
RouteQuery'
)
||
'{
}
'
);
const
savedQuery
=
JSON
.
parse
(
sessionStorage
.
getItem
(
'
commerceEvent
RouteQuery'
)
||
'{
}
'
);
selectedArea
.
value
=
savedQuery
.
domains
?
savedQuery
.
domains
:
'全部领域'
if
(
savedQuery
.
selectedDate
&&
Array
.
isArray
(
JSON
.
parse
(
savedQuery
.
selectedDate
))
&&
JSON
.
parse
(
savedQuery
.
selectedDate
).
length
)
{
selectedDate
.
value
=
'自定义'
...
...
src/views/dataLibrary/exportControl/entityList/index.vue
浏览文件 @
5c38f268
...
...
@@ -191,7 +191,7 @@ const route = useRoute();
const
isShowProvinceBox
=
computed
(()
=>
{
let
isShow
=
false
if
(
isFolderAll
.
value
&&
(
selectedCountry
.
value
===
'0101'
||
selectedCountry
.
value
===
'全部国家'
))
{
if
(
isFolderAll
.
value
&&
(
selectedCountry
.
value
===
'0101'
||
selectedCountry
.
value
===
'全部国家'
))
{
isShow
=
true
}
return
isShow
...
...
@@ -686,7 +686,7 @@ const handleGetProvinceList = async () => {
try
{
const
res
=
await
getProvinceList
()
console
.
log
(
'获取省份列表'
,
res
);
if
(
res
&&
res
.
length
)
{
if
(
res
&&
res
.
length
)
{
provinceList
.
value
=
res
.
map
(
item
=>
{
return
{
name
:
item
,
...
...
@@ -1051,30 +1051,33 @@ const initParam = () => {
customTime
.
value
=
JSON
.
parse
(
route
.
query
.
selectedDate
)
}
selectedCountry
.
value
=
route
.
query
.
orgnizationName
?
route
.
query
.
orgnizationName
:
'全部国家'
selectedProvince
.
value
=
route
.
query
.
selectedProvince
?
provinceList
.
value
.
filter
(
item
=>
item
.
name
.
indexOf
(
route
.
query
.
selectedProvince
)
>
-
1
)[
0
].
name
:
'全部省份'
selectedCountry
.
value
=
route
.
query
.
selectedCountryId
?
route
.
query
.
selectedCountryId
:
'全部国家'
isHalfRule
.
value
=
route
.
query
.
isHalfRule
?
true
:
false
isCnEntityOnly
.
value
=
route
.
query
.
isCnEntityOnly
?
true
:
false
selectedEntityType
.
value
=
route
.
query
.
selectedEntityType
?
route
.
query
.
selectedEntityType
:
'全部实体类型'
selectedEntityType
.
value
=
route
.
query
.
selectedEntityType
?
entityTypeList
.
value
.
filter
(
item
=>
item
.
name
===
route
.
query
.
selectedEntityType
)[
0
].
id
:
'全部实体类型'
const
query
=
route
.
query
;
if
(
Object
.
keys
(
query
).
length
>
0
)
{
sessionStorage
.
setItem
(
'
decree
RouteQuery'
,
JSON
.
stringify
(
query
));
sessionStorage
.
setItem
(
'
entity
RouteQuery'
,
JSON
.
stringify
(
query
));
}
}
else
{
const
savedQuery
=
JSON
.
parse
(
sessionStorage
.
getItem
(
'
decree
RouteQuery'
)
||
'{
}
'
);
const
savedQuery
=
JSON
.
parse
(
sessionStorage
.
getItem
(
'
entity
RouteQuery'
)
||
'{
}
'
);
selectedArea
.
value
=
savedQuery
.
domains
?
savedQuery
.
domains
:
'全部领域'
if
(
savedQuery
.
selectedDate
&&
Array
.
isArray
(
JSON
.
parse
(
savedQuery
.
selectedDate
))
&&
JSON
.
parse
(
savedQuery
.
selectedDate
).
length
)
{
selectedDate
.
value
=
'自定义'
customTime
.
value
=
JSON
.
parse
(
savedQuery
.
selectedDate
)
}
isHalfRule
.
value
=
savedQuery
.
isHalfRule
?
true
:
false
selectedProvince
.
value
=
savedQuery
.
selectedProvince
?
provinceList
.
value
.
filter
(
item
=>
item
.
name
.
indexOf
(
savedQuery
.
selectedProvince
)
>
-
1
)[
0
].
name
:
'全部省份'
selectedCountry
.
value
=
route
.
query
.
selectedCountryId
?
route
.
query
.
selectedCountryId
:
'全部国家'
isCnEntityOnly
.
value
=
savedQuery
.
isCnEntityOnly
?
true
:
false
selectedEntityType
.
value
=
savedQuery
.
selectedEntityType
?
savedQuery
.
selectedEntityType
:
'全部实体类型'
selectedEntityType
.
value
=
savedQuery
.
selectedEntityType
?
entityTypeList
.
value
.
filter
(
item
=>
item
.
name
===
savedQuery
.
selectedEntityType
)[
0
].
id
:
'全部实体类型'
}
}
...
...
@@ -1129,9 +1132,9 @@ const handleExport = () => {
}
;
onMounted
(
async
()
=>
{
handleGetProvinceList
()
// 获取省份列表
handleGetCountryList
()
// 获取国家列表
handleGetEntityTypes
()
// 获取实体类型列表
await
handleGetProvinceList
()
// 获取省份列表
await
handleGetCountryList
()
// 获取国家列表
await
handleGetEntityTypes
()
// 获取实体类型列表
initParam
()
// 初始化
await
fetchTableData
()
...
...
src/views/dataLibrary/exportControl/entityListEvent/index.vue
浏览文件 @
5c38f268
...
...
@@ -803,10 +803,10 @@ const initParam = () => {
const
query
=
route
.
query
;
if
(
Object
.
keys
(
query
).
length
>
0
)
{
sessionStorage
.
setItem
(
'
decree
RouteQuery'
,
JSON
.
stringify
(
query
));
sessionStorage
.
setItem
(
'
entityEvent
RouteQuery'
,
JSON
.
stringify
(
query
));
}
}
else
{
const
savedQuery
=
JSON
.
parse
(
sessionStorage
.
getItem
(
'
decree
RouteQuery'
)
||
'{
}
'
);
const
savedQuery
=
JSON
.
parse
(
sessionStorage
.
getItem
(
'
entityEvent
RouteQuery'
)
||
'{
}
'
);
selectedArea
.
value
=
savedQuery
.
domains
?
savedQuery
.
domains
:
'全部领域'
if
(
savedQuery
.
selectedDate
&&
Array
.
isArray
(
JSON
.
parse
(
savedQuery
.
selectedDate
))
&&
JSON
.
parse
(
savedQuery
.
selectedDate
).
length
)
{
selectedDate
.
value
=
'自定义'
...
...
src/views/dataLibrary/index.vue
浏览文件 @
5c38f268
...
...
@@ -393,7 +393,7 @@ const timer = ref(null);
// 关闭当前标签页
const
handleCloseCurTab
=
(
tab
,
index
)
=>
{
if
(
tagsViewStore
.
visitedViews
.
length
===
1
)
{
if
(
tagsViewStore
.
visitedViews
.
length
===
1
)
{
ElMessage
.
warning
(
'至少保留一个标签页'
)
return
}
...
...
@@ -494,16 +494,17 @@ onMounted(() => {
siderList
.
value
[
3
].
isExpanded
=
true
;
siderList
.
value
[
3
].
children
[
0
].
active
=
true
;
break
;
case
"/dataLibrary/data
CommerceControlLis
t"
:
case
"/dataLibrary/data
EntityListEven
t"
:
siderList
.
value
[
3
].
active
=
true
;
siderList
.
value
[
3
].
isExpanded
=
true
;
siderList
.
value
[
3
].
children
[
1
].
active
=
true
;
break
;
case
"/dataLibrary/data
EntityListEven
t"
:
case
"/dataLibrary/data
CommerceControlLis
t"
:
siderList
.
value
[
3
].
active
=
true
;
siderList
.
value
[
3
].
isExpanded
=
true
;
siderList
.
value
[
3
].
children
[
2
].
active
=
true
;
break
;
case
"/dataLibrary/dataCommerceControlListEvent"
:
siderList
.
value
[
3
].
active
=
true
;
siderList
.
value
[
3
].
isExpanded
=
true
;
...
...
src/views/decree/decreeHome/index.vue
浏览文件 @
5c38f268
...
...
@@ -63,66 +63,6 @@
<DivideHeader
id=
"position1"
class=
"divide"
:titleText=
"'最新动态'"
></DivideHeader>
<div
class=
"home-main-center"
>
<div
class=
"center-top"
>
<!-- <div class="box1">
<div class="box1-left" @click="handleSwithCurDecree('left')">
<div class="icon">
<img src="./assets/images/box1-left.svg" alt="" />
</div>
</div>
<div class="box1-right" @click="handleSwithCurDecree('right')">
<div class="icon">
<img src="./assets/images/box1-right.svg" alt="" />
</div>
</div>
<div class="box1-header">
<div class="box1-header-left">
<div class="icon">
<img src="./assets/images/box1-header-icon.png" alt="" />
</div>
<div class="title">{{ "最新科技政令" }}</div>
</div>
<div class="box1-header-right" @click="handleClickOrder">
{{ "查看详情 >" }}
</div>
</div>
<el-carousel ref="carouselRef" height="395px" :autoplay="true" :interval="3000" arrow="never"
indicator-position="none">
<el-carousel-item v-for="(item, index) in box1DataList" :key="index">
<div class="box1-main">
<div class="box1-main-left">
<img v-if="item.imageUrl" :src="item.imageUrl" alt="" />
<div v-else class="box1-main-left-img-mock">
<img class="img-mock-badge-img" src="./assets/images/badge.png" />
<p class="img-mock-badge-title">行政令</p>
<p class="img-mock-badge-title">{{ item.name }}</p>
</div>
</div>
<div class="box1-main-right">
<div class="box1-main-right-title">
{{ item.name }}
</div>
<div class="box1-main-right-info">
<AreaTag v-for="(tag, index) in item.industryList" :key="index" :tagName="tag.industryName" />
</div>
<div class="box1-main-right-center">
{{ item.describe }}
</div>
<div class="box1-main-right-footer">
<div class="footer-left">{{ item.postDate }}</div>
<div class="footer-right">
<div class="footer-right-item1">
{{ item.officialUrl }}
</div>
<div class="footer-right-item2">
<img src="./assets/images/open-icon.png" alt="" />
</div>
</div>
</div>
</div>
</div>
</el-carousel-item>
</el-carousel>
</div> -->
<OverviewMainBox
class=
"box1"
title=
"最新科技政令"
@
toDetail=
"handleClickOrder"
>
<
template
#
header-icon
>
<img
style=
"width: 100%; height: 100%"
src=
"./assets/images/box1-header-icon.png"
alt=
""
/>
...
...
@@ -610,7 +550,6 @@ const carouselRef = ref(null);
const
handleClickOrder
=
()
=>
{
let
index
=
carouselRef
.
value
?.
activeIndex
||
0
;
let
item
=
box1DataList
.
value
[
index
];
console
.
log
(
item
)
if
(
item
)
onNavigateToDetail
(
item
)
};
...
...
@@ -732,10 +671,7 @@ handleGetMessage();
// 点击人物头像,跳转到人物主页
const
handleClickPerson
=
async
item
=>
{
console
.
log
(
"person"
,
item
);
const
personTypeList
=
JSON
.
parse
(
window
.
sessionStorage
.
getItem
(
"personTypeList"
));
console
.
log
(
"personTypeList"
,
personTypeList
);
let
type
=
0
;
let
personTypeName
=
""
;
...
...
@@ -749,12 +685,9 @@ const handleClickPerson = async item => {
const
arr
=
personTypeList
.
filter
(
item
=>
{
return
item
.
typeId
===
res
.
data
.
personType
;
});
console
.
log
(
"arr"
,
arr
);
if
(
arr
&&
arr
.
length
>
0
)
{
personTypeName
=
arr
[
0
].
typeName
;
console
.
log
(
"personTypeName"
,
personTypeName
);
if
(
personTypeName
===
"科技企业领袖"
)
{
type
=
1
;
}
else
if
(
personTypeName
===
"国会议员"
)
{
...
...
@@ -1551,12 +1484,11 @@ onMounted(async () => {
position
:
absolute
;
right
:
-13px
;
top
:
-10px
;
padding
:
0
8px
;
height
:
26px
;
padding
:
4px
8px
6px
;
background-color
:
#FF4D4F
;
color
:
white
;
font-size
:
16px
;
line-height
:
2
6px
;
line-height
:
1
6px
;
font-family
:
Source
Han
Sans
CN
;
border-radius
:
14px
;
letter-spacing
:
1px
;
...
...
src/views/decree/decreeLayout/index.vue
浏览文件 @
5c38f268
...
...
@@ -69,85 +69,14 @@
<router-view
/>
</div>
</div>
<!--
<div
class=
"layout-report-box"
v-if=
"activeName === '法案原文'"
>
<div
class=
"report-close"
@
click=
"handleSwitchActiveName('分析报告')"
>
<img
src=
"./assets/images/report-close-icon.png"
alt=
""
/>
</div>
<div
class=
"report-main"
>
<div
class=
"report-header"
>
<div
class=
"report-header-left"
>
<div
class=
"text"
>
法案版本:
</div>
<div
class=
"select-box"
>
<el-select
v-model=
"curBill"
placeholder=
"选择法案"
style=
"width: 240px"
>
<el-option
v-for=
"item in billList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</div>
</div>
<div
class=
"report-header-right"
>
<div
class=
"btn"
>
<div
class=
"icon"
>
<img
src=
"./assets/images/report-header-icon1.png"
alt=
""
/>
</div>
<div
class=
"text"
>
翻译
</div>
</div>
<div
class=
"btn"
>
<div
class=
"icon"
>
<img
src=
"./assets/images/report-header-icon2.png"
alt=
""
/>
</div>
<div
class=
"text"
>
下载
</div>
</div>
<div
class=
"btn"
>
<div
class=
"icon"
>
<img
src=
"./assets/images/report-header-icon3.png"
alt=
""
/>
</div>
<div
class=
"text"
>
对比
</div>
</div>
<div
class=
"btn"
>
<div
class=
"icon"
>
<img
src=
"./assets/images/report-header-icon4.png"
alt=
""
/>
</div>
<div
class=
"text"
>
查找
</div>
</div>
</div>
</div>
<div
class=
"report-content"
>
<div
class=
"content-left"
>
<img
src=
"./assets/images/report1.png"
alt=
""
/>
</div>
<div
class=
"content-right"
>
<img
src=
"./assets/images/report2.png"
alt=
""
/>
</div>
</div>
</div>
</div>
-->
<!--
<div
class=
"report"
v-if=
"isShowReport"
>
<div
class=
"report-close"
@
click=
"handleCloseReport"
>
<img
src=
"@/assets/icons/close.png"
alt=
""
/>
</div>
<div
class=
"report-header"
>
{{
"政令原文"
}}
</div>
<div
class=
"report-main"
>
<div
class=
"left"
>
<div
v-if=
"!reportUrl"
class=
"noContent"
>
{{
"中文原文暂无数据"
}}
</div>
<iframe
v-else
:src=
"reportUrl"
style=
"border: none"
width=
"100%"
height=
"100%"
>
</iframe>
</div>
<div
class=
"right"
>
<div
v-if=
"!reportUrlEn"
class=
"noContent"
>
{{
"英文原文暂无数据"
}}
</div>
<iframe
v-else
:src=
"reportUrlEn"
style=
"border: none"
width=
"100%"
height=
"100%"
>
</iframe>
</div>
</div>
</div>
-->
</div>
</
template
>
<
script
setup
>
import
{
ref
,
onMounted
,
onUnmounted
}
from
"vue"
;
import
{
ref
,
onMounted
}
from
"vue"
;
import
router
from
"@/router"
;
import
{
useRoute
}
from
"vue-router"
;
import
{
getDecreeSummary
}
from
"@/api/decree/introduction"
;
import
{
getDecreeReport
}
from
"@/api/decree/introduction"
;
import
search
from
"./assets/images/search.png"
;
import
icon1
from
"./assets/icons/icon1.svg"
;
import
icon1Active
from
"./assets/icons/icon1_active.svg"
;
...
...
@@ -156,7 +85,6 @@ import icon2Active from "./assets/icons/icon2_active.svg";
import
icon3
from
"./assets/icons/icon3.svg"
;
import
icon3Active
from
"./assets/icons/icon3_active.svg"
;
import
USALogo
from
"./assets/images/USA-logo.png"
;
import
DefaultIcon2
from
"@/assets/icons/default-icon2.png"
;
const
route
=
useRoute
();
...
...
@@ -224,28 +152,8 @@ const handleGetSummary = async () => {
}
}
catch
(
error
)
{}
document
.
title
=
pageTitle
;
window
.
sessionStorage
.
setItem
(
"curTabName"
,
pageTitle
);
};
// 获取报告原文
// const reportUrl = ref("");
// const reportUrlEn = ref("");
// const handleGetReport = async () => {
// try {
// const res = await getDecreeReport({id: route.query.id});
// console.log("报告原文", res);
// if (res.code === 200 && res.data) {
// reportUrl.value = res.data.content;
// reportUrlEn.value = res.data.contentEn;
// }
// } catch (error) {}
// };
// const isShowReport = ref(false);
// const handleCloseReport = () => {
// isShowReport.value = false;
// };
const
handleShowReport
=
()
=>
{
const
curRoute
=
router
.
resolve
({
path
:
"/decree/decreeOriginal"
,
...
...
@@ -291,7 +199,6 @@ onMounted(() => {
}
else
if
(
route
.
path
===
"/decreeLayout/influence"
)
{
activeTitle
.
value
=
"影响分析"
;
}
// handleGetReport();
});
</
script
>
...
...
@@ -312,20 +219,6 @@ onMounted(() => {
height
:
100%
;
background
:
#f7f8f9
;
.report-close
{
position
:
absolute
;
top
:
20px
;
right
:
230px
;
width
:
20px
;
height
:
20px
;
cursor
:
pointer
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.report-header
{
width
:
100%
;
height
:
50px
;
...
...
@@ -639,130 +532,5 @@ onMounted(() => {
background-color
:
#f7f8f9
;
}
}
.layout-report-box
{
position
:
absolute
;
z-index
:
9999
;
top
:
154px
;
left
:
0
;
width
:
100%
;
height
:
926px
;
background
:
rgba
(
248
,
249
,
250
,
1
);
.report-close
{
position
:
absolute
;
top
:
24px
;
right
:
178px
;
width
:
32px
;
height
:
32px
;
cursor
:
pointer
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.report-main
{
width
:
1600px
;
height
:
926px
;
margin
:
0
auto
;
background
:
#fff
;
box-sizing
:
border-box
;
padding
:
0
69px
;
.report-header
{
height
:
77px
;
border-bottom
:
1px
solid
rgba
(
240
,
242
,
244
,
1
);
display
:
flex
;
justify-content
:
space-between
;
.report-header-left
{
display
:
flex
;
.text
{
margin-top
:
32px
;
width
:
70px
;
height
:
14px
;
color
:
rgba
(
95
,
101
,
108
,
1
);
font-family
:
Microsoft
YaHei
;
font-size
:
14px
;
font-weight
:
400
;
line-height
:
14px
;
}
.select-box
{
margin-left
:
8px
;
margin-top
:
23px
;
}
}
.report-header-right
{
display
:
flex
;
margin-top
:
24px
;
.btn
{
display
:
flex
;
width
:
88px
;
height
:
32px
;
margin-left
:
8px
;
box-sizing
:
border-box
;
border
:
1px
solid
rgba
(
230
,
231
,
232
,
1
);
border-radius
:
4px
;
background
:
rgba
(
255
,
255
,
255
,
1
);
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
.icon
{
width
:
16px
;
height
:
16px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.text
{
margin-left
:
8px
;
height
:
32px
;
color
:
rgba
(
95
,
101
,
108
,
1
);
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
font-weight
:
400
;
line-height
:
32px
;
}
}
}
}
.report-content
{
display
:
flex
;
margin-top
:
35px
;
.content-left
{
width
:
680px
;
height
:
786px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.content-right
{
margin-left
:
89px
;
width
:
680px
;
height
:
786px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
}
}
}
}
</
style
>
\ No newline at end of file
src/views/exportControl/index.vue
浏览文件 @
5c38f268
差异被折叠。
点击展开。
src/views/exportControl/utils/charts.js
浏览文件 @
5c38f268
...
...
@@ -973,7 +973,7 @@ export const getMultipleBarChart_m = object => {
const
option
=
{
tooltip
:
{
trigger
:
"
axis
"
,
trigger
:
"
item
"
,
axisPointer
:
{
type
:
"shadow"
}
...
...
src/views/exportControl/v2.0EntityList/components/dataStatistics/index.vue
浏览文件 @
5c38f268
...
...
@@ -105,7 +105,8 @@
</div>
</
template
>
<!-- <div class="echarts" ref="sanctionCountChartRef"></div> -->
<EChart
:option=
"sanctionCountChartOption"
autoresize
:style=
"{ height: '300px', padding: '0 20px' }"
/>
<EChart
:option=
"sanctionCountChartOption"
autoresize
:style=
"{ height: '300px', padding: '0 20px' }"
@
chart-click=
"handleBarChartClick"
/>
<!-- <div class="bottom">
<div class="ai">
<div class="left">
...
...
@@ -139,17 +140,14 @@
<div
class=
"map-wrapper"
>
<div
class=
"map-chart"
ref=
"mapChartRef"
></div>
<div
class=
"rank-list"
>
<div
class=
"rank-item"
v-for=
"(item, index) in rankData"
:key=
"index"
>
<div
class=
"rank-item"
v-for=
"(item, index) in rankData"
:key=
"index"
@
click=
"handleClickRankChart(item)"
>
<div
class=
"rank-index"
:class=
"'rank-' + (index + 1)"
>
{{ index + 1 }}
</div>
<div
class=
"rank-name"
>
{{ item.name }}
</div>
<div
class=
"rank-bar-bg"
>
<div
class=
"rank-bar-fill"
:style=
"{
<div
class=
"rank-bar-fill"
:style=
"{
width: (item.value / maxRankValue) * 100 + '%',
background: getBarColor(index)
}"
></div>
}"
></div>
</div>
<div
class=
"rank-value"
>
{{ item.value }}家
</div>
</div>
...
...
@@ -186,7 +184,8 @@
</el-select>
</
template
>
<!-- <div class="echarts" ref="domainChartRef"></div> -->
<EChart
:option=
"domainChartOption"
autoresize
:style=
"{ height: '300px', padding: '0 20px' }"
/>
<EChart
:option=
"domainChartOption"
autoresize
:style=
"{ height: '300px', padding: '0 20px' }"
@
chart-click=
"handlePieChartClick"
/>
<!-- <div class="bottom">
<div class="ai">
<div class="left">
...
...
@@ -218,7 +217,7 @@
</el-select>
</
template
>
<!-- <div class="echarts" ref="typeChartRef"></div> -->
<EChart
:option=
"typeChartOption"
autoresize
:style=
"{ height: '300px', padding: '0 20px' }"
/>
<EChart
:option=
"typeChartOption"
autoresize
:style=
"{ height: '300px', padding: '0 20px' }"
@
chart-click=
"handlePieChartClick1"
/>
<!-- <div class="bottom">
<div class="ai">
<div class="left">
...
...
@@ -261,6 +260,7 @@ import {
}
from
"@/api/exportControlV2.0"
;
import
EChart
from
"@/components/Chart/index.vue"
;
import
{
useRoute
}
from
"vue-router"
;
import
{
useRouter
}
from
"vue-router"
;
import
tipsIcon
from
"../../../assets/icons/info-icon.png"
;
import
AiButton
from
"@/components/base/Ai/AiButton/index.vue"
;
import
AiPane
from
"@/components/base/Ai/AiPane/index.vue"
;
...
...
@@ -271,6 +271,7 @@ const typeChart = useChartInterpretation();
const
rankChart
=
useChartInterpretation
();
const
route
=
useRoute
();
const
router
=
useRouter
()
// 实体清单-数据统计-制裁实体类型分布情况
const
typeData
=
ref
([]);
const
getTypeCountData
=
async
()
=>
{
...
...
@@ -637,6 +638,17 @@ const updateMapChart = () => {
};
mapChartInstance
.
setOption
(
option
);
mapChartInstance
.
on
(
'click'
,
function
(
params
)
{
const
param
=
{
selectedProvince
:
params
.
name
,
selectedDate
:
regionTime
.
value
===
'all'
?
null
:
JSON
.
stringify
([
regionTime
.
value
+
'-01-01'
,
regionTime
.
value
+
'-12-31'
])
}
const
route
=
router
.
resolve
({
path
:
'/dataLibrary/dataEntityList'
,
query
:
param
});
window
.
open
(
route
.
href
,
"_blank"
);
});
};
const
initMapChart
=
()
=>
{
...
...
@@ -1100,6 +1112,64 @@ const initTypeChart = () => {
};
const
sanTypeId
=
ref
(
""
);
// 点击制裁实体数量变化情况
const
handleBarChartClick
=
(
val
)
=>
{
console
.
log
(
'value'
,
val
);
const
params
=
{
selectedDate
:
activeTab
.
value
===
'year'
?
JSON
.
stringify
([
val
.
name
+
'-01-01'
,
val
.
name
+
'-12-31'
])
:
JSON
.
stringify
([
val
.
name
,
val
.
name
])
}
const
route
=
router
.
resolve
({
path
:
'/dataLibrary/dataEntityList'
,
query
:
params
});
window
.
open
(
route
.
href
,
"_blank"
);
}
// 制裁实体各省分布情况
const
handleClickRankChart
=
(
item
)
=>
{
// console.log('item', item);
const
params
=
{
selectedProvince
:
item
.
name
,
selectedDate
:
regionTime
.
value
===
'all'
?
null
:
JSON
.
stringify
([
regionTime
.
value
+
'-01-01'
,
regionTime
.
value
+
'-12-31'
])
}
const
route
=
router
.
resolve
({
path
:
'/dataLibrary/dataEntityList'
,
query
:
params
});
window
.
open
(
route
.
href
,
"_blank"
);
}
// 制裁实体领域分布情况
const
handlePieChartClick
=
(
val
)
=>
{
console
.
log
(
'val'
,
val
);
const
params
=
{
domains
:
val
.
name
,
selectedDate
:
domainTime
.
value
===
'all'
?
null
:
JSON
.
stringify
([
domainTime
.
value
+
'-01-01'
,
domainTime
.
value
+
'-12-31'
])
}
const
route
=
router
.
resolve
({
path
:
'/dataLibrary/dataEntityList'
,
query
:
params
});
window
.
open
(
route
.
href
,
"_blank"
);
}
// 制裁实体类型分布情况
const
handlePieChartClick1
=
(
val
)
=>
{
console
.
log
(
'val'
,
val
);
const
params
=
{
selectedEntityType
:
val
.
name
,
selectedDate
:
typeTime
.
value
===
'all'
?
null
:
JSON
.
stringify
([
typeTime
.
value
+
'-01-01'
,
typeTime
.
value
+
'-12-31'
])
}
const
route
=
router
.
resolve
({
path
:
'/dataLibrary/dataEntityList'
,
query
:
params
});
window
.
open
(
route
.
href
,
"_blank"
);
}
onMounted
(()
=>
{
sanTypeId
.
value
=
route
.
query
.
sanTypeId
||
""
;
console
.
log
(
"数据统计页面接收到的 sanTypeId:"
,
sanTypeId
.
value
);
...
...
@@ -1536,16 +1606,19 @@ onMounted(() => {
align-items
:
center
;
justify-content
:
flex-start
;
padding
:
22px
;
.data-origin-icon
{
width
:
16px
;
height
:
16px
;
font-size
:
0px
;
margin-right
:
8px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.data-origin-text
{
font-family
:
Source
Han
Sans
CN
;
font-size
:
14px
;
...
...
@@ -1558,18 +1631,23 @@ onMounted(() => {
right
:
0px
;
bottom
:
15px
;
z-index
:
2
;
:deep
(
.ai-pane-wrapper
)
{
display
:
none
;
}
:deep
(
.ai-button-wrapper
)
{
display
:
flex
;
}
&
:hover
{
width
:
100%
;
bottom
:
0px
;
:deep
(
.ai-pane-wrapper
)
{
display
:
block
;
}
:deep
(
.ai-button-wrapper
)
{
display
:
none
;
}
...
...
src/views/exportControl/v2.0SingleSanction/components/dataStatistics/index.vue
浏览文件 @
5c38f268
...
...
@@ -54,7 +54,8 @@
</div>
</div>
</div>
-->
<EChart
:option=
"domainChartOption"
autoresize
:style=
"
{ height: '300px', padding: '0 20px' }" />
<EChart
:option=
"domainChartOption"
autoresize
:style=
"
{ height: '300px', padding: '0 20px' }"
@chart-click="handlePieChartClick" />
<div
class=
"data-origin-box"
>
<div
class=
"data-origin-icon"
>
<img
:src=
"tipsIcon"
alt=
""
/>
...
...
@@ -104,7 +105,8 @@
</div>
</div>
</div>
-->
<EChart
:option=
"typeChartOption"
autoresize
:style=
"
{ height: '300px', padding: '0 20px' }" />
<EChart
:option=
"typeChartOption"
autoresize
:style=
"
{ height: '300px', padding: '0 20px' }"
@chart-click="handlePieChartClick1" />
<div
class=
"data-origin-box"
>
<div
class=
"data-origin-icon"
>
<img
:src=
"tipsIcon"
alt=
""
/>
...
...
@@ -120,17 +122,15 @@
<div
class=
"main-item"
>
<AnalysisBox
title=
"制裁实体国家地区分布情况"
>
<div
class=
"country-list"
>
<div
class=
"list-item"
v-for=
"(item, index) in countryDistribution"
:key=
"index"
>
<div
class=
"list-item"
v-for=
"(item, index) in countryDistribution"
:key=
"index"
@
click=
"handleClickRankChart(item)"
>
<img
:src=
"flag"
alt=
""
class=
"flag"
/>
<div
class=
"country-name"
>
{{
item
.
name
}}
</div>
<div
class=
"progress-bar-container"
>
<div
class=
"progress-bar"
:style=
"
{
<div
class=
"progress-bar"
:style=
"
{
width: item.width,
background: item.gradient
}"
>
</div>
}">
</div>
</div>
<div
class=
"count"
:class=
"
{ highlight: index === 0 }">
{{
item
.
count
}}
家
</div>
</div>
...
...
@@ -163,17 +163,15 @@
<div
class=
"map-wrapper"
>
<div
class=
"map-chart"
ref=
"mapChartRef"
></div>
<div
class=
"rank-list"
>
<div
class=
"rank-item"
v-for=
"(item, index) in regionDistribution"
:key=
"index"
>
<div
class=
"rank-item"
v-for=
"(item, index) in regionDistribution"
:key=
"index"
@
click=
"handleRankChartClick(item)"
>
<div
class=
"rank-index"
:class=
"'rank-' + (index + 1)"
>
{{
index
+
1
}}
</div>
<div
class=
"rank-name"
>
{{
item
.
name
}}
</div>
<div
class=
"rank-bar-bg"
>
<div
class=
"rank-bar-fill"
:style=
"
{
<div
class=
"rank-bar-fill"
:style=
"
{
width: (maxRegionCount > 0 ? (item.count / maxRegionCount) * 100 : 0) + '%',
background: getBarColor(index)
}"
>
</div>
}">
</div>
</div>
<div
class=
"rank-value"
>
{{
item
.
count
}}
家
</div>
</div>
...
...
@@ -474,6 +472,18 @@ const initMapChart = () => {
chart
.
setOption
(
option
);
chart
.
on
(
'click'
,
function
(
params
)
{
const
param
=
{
selectedProvince
:
params
.
name
,
selectedDate
:
JSON
.
stringify
([
route
.
query
.
date
,
route
.
query
.
date
])
}
const
curRoute
=
router
.
resolve
({
path
:
'/dataLibrary/dataEntityList'
,
query
:
param
});
window
.
open
(
curRoute
.
href
,
"_blank"
);
});
window
.
addEventListener
(
"resize"
,
()
=>
{
chart
.
resize
();
});
...
...
@@ -841,6 +851,64 @@ const initTypeChart = () => {
// });
};
const
sanTypeId
=
ref
(
""
);
// 制裁实体领域分布情况
const
handlePieChartClick
=
(
val
)
=>
{
// console.log('val', val);
const
params
=
{
domains
:
val
.
name
,
selectedDate
:
JSON
.
stringify
([
route
.
query
.
date
,
route
.
query
.
date
])
}
const
curRoute
=
router
.
resolve
({
path
:
'/dataLibrary/dataEntityList'
,
query
:
params
});
window
.
open
(
curRoute
.
href
,
"_blank"
);
}
// 制裁实体类型分布情况
const
handlePieChartClick1
=
(
val
)
=>
{
// console.log('val', val);
const
params
=
{
selectedEntityType
:
val
.
name
,
selectedDate
:
JSON
.
stringify
([
route
.
query
.
date
,
route
.
query
.
date
])
}
const
curRoute
=
router
.
resolve
({
path
:
'/dataLibrary/dataEntityList'
,
query
:
params
});
window
.
open
(
curRoute
.
href
,
"_blank"
);
}
// 制裁实体国家地区分布情况
const
handleClickRankChart
=
(
item
)
=>
{
// console.log('item', item);
const
params
=
{
selectedCountryId
:
item
.
id
,
selectedDate
:
JSON
.
stringify
([
route
.
query
.
date
,
route
.
query
.
date
])
}
const
curRoute
=
router
.
resolve
({
path
:
'/dataLibrary/dataEntityList'
,
query
:
params
});
window
.
open
(
curRoute
.
href
,
"_blank"
);
}
// 制裁实体各省分布情况
const
handleRankChartClick
=
(
item
)
=>
{
console
.
log
(
'item'
,
item
);
const
params
=
{
selectedProvince
:
item
.
name
,
selectedDate
:
JSON
.
stringify
([
route
.
query
.
date
,
route
.
query
.
date
])
}
const
curRoute
=
router
.
resolve
({
path
:
'/dataLibrary/dataEntityList'
,
query
:
params
});
window
.
open
(
curRoute
.
href
,
"_blank"
);
}
onMounted
(()
=>
{
// 获取路由参数id
sanTypeId
.
value
=
route
.
query
.
sanTypeId
;
...
...
@@ -986,6 +1054,11 @@ onMounted(() => {
display
:
flex
;
align-items
:
center
;
margin-bottom
:
16px
;
cursor
:
pointer
;
&
:hover
{
background
:
var
(
--
color-primary-2
);
}
&
:last-child
{
margin-bottom
:
0
;
...
...
@@ -1284,22 +1357,26 @@ onMounted(() => {
}
}
}
.data-origin-box
{
width
:
100%
;
display
:
flex
;
align-items
:
center
;
justify-content
:
flex-start
;
padding
:
22px
;
.data-origin-icon
{
width
:
16px
;
height
:
16px
;
font-size
:
0px
;
margin-right
:
8px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.data-origin-text
{
font-family
:
Source
Han
Sans
CN
;
font-size
:
14px
;
...
...
@@ -1312,18 +1389,23 @@ onMounted(() => {
right
:
0px
;
bottom
:
15px
;
z-index
:
2
;
:deep
(
.ai-pane-wrapper
)
{
display
:
none
;
}
:deep
(
.ai-button-wrapper
)
{
display
:
flex
;
}
&
:hover
{
width
:
100%
;
bottom
:
0px
;
:deep
(
.ai-pane-wrapper
)
{
display
:
block
;
}
:deep
(
.ai-button-wrapper
)
{
display
:
none
;
}
...
...
src/views/marketAccessRestrictions/com/SurveyHistory.vue
浏览文件 @
5c38f268
...
...
@@ -48,7 +48,6 @@ const props = defineProps({
})
const
onNavigateToDetail
=
item
=>
{
window
.
sessionStorage
.
setItem
(
"curTabName"
,
item
.
searchname
);
const
curRoute
=
router
.
resolve
({
path
:
"/marketSingleCaseLayout/overview"
,
query
:
{
id
:
item
.
sortcode
,
searchId
:
item
.
searchid
}
...
...
src/views/marketAccessRestrictions/marketAccessHome/assets/icons/tips-icon.png
0 → 100644
浏览文件 @
5c38f268
1.0 KB
src/views/marketAccessRestrictions/marketAccessHome/com/CarouselItem232.vue
0 → 100644
浏览文件 @
5c38f268
<
template
>
<div
class=
"box-text-box"
>
<div
class=
"box-text-item"
>
<div
class=
"box-text-left"
>
{{
"启动时间:"
}}
</div>
<div
class=
"box-text-right one-line-ellipsis"
>
{{
props
.
baseInfo
.
searchnum
}}
</div>
</div>
<div
class=
"box-text-item"
>
<div
class=
"box-text-left"
>
{{
"调查概括:"
}}
</div>
<div
class=
"box-text-right two-line-ellipsis"
>
{{
props
.
baseInfo
.
product
}}
</div>
</div>
<div
class=
"box-text-item"
>
<div
class=
"box-text-left"
>
{{
"调查阶段:"
}}
</div>
<div
class=
"box-text-right one-line-ellipsis"
>
{{
props
.
baseInfo
.
plaintiff
}}
</div>
</div>
<div
class=
"box-text-item"
>
<div
class=
"box-text-left"
>
{{
"调查范围:"
}}
</div>
<div
class=
"box-text-right five-line-ellipsis"
>
{{
props
.
baseInfo
.
defendant
}}
</div>
</div>
</div>
</
template
>
<
script
setup
name=
"CarouselItem337"
>
const
props
=
defineProps
({
baseInfo
:
{
type
:
Object
,
default
:
()
=>
({})
}
})
</
script
>
<
style
scoped
lang=
"scss"
>
.box-text-box
{
width
:
100%
;
padding
:
20px
20px
0
;
height
:
185px
;
.box-text-item
{
display
:
flex
;
align-items
:
flex-start
;
line-height
:
30px
;
margin-bottom
:
8px
;
&
:
:
before
{
content
:
""
;
width
:
4px
;
height
:
4px
;
border-radius
:
2px
;
background
:
rgba
(
59
,
65
,
75
,
1
);
margin-top
:
16px
;
margin-right
:
12px
;
}
.box-text-left
{
height
:
30px
;
width
:
100px
;
color
:
rgba
(
59
,
65
,
75
,
1
);
font-family
:
Source
Han
Sans
CN
;
font-size
:
16px
;
font-weight
:
700
;
}
.box-text-right
{
min-height
:
30px
;
width
:
20px
;
flex
:
auto
;
color
:
rgba
(
59
,
65
,
75
,
1
);
font-family
:
Source
Han
Sans
CN
;
font-size
:
16px
;
}
.two-line-ellipsis
{
max-height
:
60px
;
display
:
-
webkit-box
;
-webkit-line-clamp
:
2
;
-webkit-box-orient
:
vertical
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
normal
;
}
.five-line-ellipsis
{
max-height
:
150px
;
display
:
-
webkit-box
;
-webkit-line-clamp
:
5
;
-webkit-box-orient
:
vertical
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
normal
;
}
}
}
</
style
>
\ No newline at end of file
src/views/marketAccessRestrictions/marketAccessHome/com/CarouselItem301.vue
0 → 100644
浏览文件 @
5c38f268
<
template
>
<div
class=
"box-blue-box"
>
<div
class=
"box-blue-name"
>
<div
class=
"box-blue-time"
>
{{
props
.
baseInfo
.
progressdate
}}
</div>
<div
class=
"box-blue-time"
>
{{
props
.
baseInfo
.
progressresult
}}
</div>
</div>
<div
class=
"box-blue-text one-line-ellipsis"
>
{{
props
.
baseInfo
.
progressdetails
}}
</div>
</div>
<div
class=
"box-text-box"
>
<div
class=
"box-text-item"
>
<div
class=
"box-text-left"
>
{{
"启动时间:"
}}
</div>
<div
class=
"box-text-right one-line-ellipsis"
>
{{
props
.
baseInfo
.
searchnum
}}
</div>
</div>
<div
class=
"box-text-item"
>
<div
class=
"box-text-left"
>
{{
"调查对象:"
}}
</div>
<div
class=
"box-text-right one-line-ellipsis"
>
{{
props
.
baseInfo
.
product
}}
</div>
</div>
<div
class=
"box-text-item"
>
<div
class=
"box-text-left"
>
{{
"调查状态:"
}}
</div>
<div
class=
"box-text-right one-line-ellipsis"
>
{{
props
.
baseInfo
.
plaintiff
}}
</div>
</div>
<div
class=
"box-text-item"
>
<div
class=
"box-text-left"
>
{{
"请愿方:"
}}
</div>
<div
class=
"box-text-right three-line-ellipsis"
>
{{
props
.
baseInfo
.
product
}}
</div>
</div>
</div>
</
template
>
<
script
setup
name=
"CarouselItem337"
>
const
props
=
defineProps
({
baseInfo
:
{
type
:
Object
,
default
:
()
=>
({})
}
})
</
script
>
<
style
scoped
lang=
"scss"
>
.box-blue-box
{
width
:
100%
;
padding
:
0
20px
10px
;
border
:
1px
solid
rgba
(
231
,
243
,
255
,
1
);
border-radius
:
4px
;
background
:
rgba
(
246
,
250
,
255
,
1
);
.box-blue-name
{
height
:
38px
;
display
:
flex
;
align-items
:
center
;
font-weight
:
bold
;
font-family
:
Source
Han
Sans
CN
;
font-size
:
16px
;
line-height
:
24px
;
color
:
var
(
--
text-primary-80-color
);
&
:
:
before
{
content
:
""
;
width
:
4px
;
height
:
4px
;
border-radius
:
2px
;
background
:
var
(
--
text-primary-80-color
);
margin-right
:
12px
;
}
.box-blue-time
{
height
:
24px
;
width
:
100px
;
}
}
.box-blue-text
{
padding-left
:
18px
;
height
:
30px
;
color
:
rgba
(
59
,
65
,
75
,
1
);
font-family
:
Source
Han
Sans
CN
;
font-size
:
16px
;
line-height
:
30px
;
}
}
.box-text-box
{
width
:
100%
;
padding
:
20px
20px
0
;
height
:
185px
;
.box-text-item
{
display
:
flex
;
align-items
:
flex-start
;
line-height
:
30px
;
margin-bottom
:
8px
;
&
:
:
before
{
content
:
""
;
width
:
4px
;
height
:
4px
;
border-radius
:
2px
;
background
:
rgba
(
59
,
65
,
75
,
1
);
margin-top
:
16px
;
margin-right
:
12px
;
}
.box-text-left
{
height
:
30px
;
width
:
100px
;
color
:
rgba
(
59
,
65
,
75
,
1
);
font-family
:
Source
Han
Sans
CN
;
font-size
:
16px
;
font-weight
:
700
;
}
.box-text-right
{
min-height
:
30px
;
width
:
20px
;
flex
:
auto
;
color
:
rgba
(
59
,
65
,
75
,
1
);
font-family
:
Source
Han
Sans
CN
;
font-size
:
16px
;
}
.three-line-ellipsis
{
max-height
:
90px
;
display
:
-
webkit-box
;
-webkit-line-clamp
:
3
;
-webkit-box-orient
:
vertical
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
normal
;
}
}
}
</
style
>
\ No newline at end of file
src/views/marketAccessRestrictions/marketAccessHome/com/CarouselItem337.vue
0 → 100644
浏览文件 @
5c38f268
<
template
>
<div
class=
"box-blue-box"
>
<div
class=
"box-blue-name"
>
<div
class=
"box-blue-time"
>
{{
props
.
baseInfo
.
progressdate
}}
</div>
<div
class=
"box-blue-time"
>
{{
props
.
baseInfo
.
progressresult
}}
</div>
</div>
<div
class=
"box-blue-text"
>
{{
props
.
baseInfo
.
progressdetails
}}
</div>
</div>
<div
class=
"box-text-box"
>
<div
class=
"box-text-item"
>
<div
class=
"box-text-left"
>
{{
"调查案号:"
}}
</div>
<div
class=
"box-text-right one-line-ellipsis"
>
{{
props
.
baseInfo
.
searchnum
}}
</div>
</div>
<div
class=
"box-text-item"
>
<div
class=
"box-text-left"
>
{{
"涉及产品:"
}}
</div>
<div
class=
"box-text-right one-line-ellipsis"
>
{{
props
.
baseInfo
.
product
}}
</div>
</div>
<div
class=
"box-text-item"
>
<div
class=
"box-text-left"
>
{{
"原告:"
}}
</div>
<div
class=
"box-text-right one-line-ellipsis"
>
{{
props
.
baseInfo
.
plaintiff
}}
</div>
</div>
<div
class=
"box-text-item"
>
<div
class=
"box-text-left"
>
{{
"被告:"
}}
</div>
<div
class=
"box-text-right one-line-ellipsis"
>
{{
props
.
baseInfo
.
defendant
}}
</div>
</div>
<div
class=
"box-text-item"
>
<div
class=
"box-text-left"
>
{{
"涉案专利:"
}}
</div>
<div
class=
"box-text-right one-line-ellipsis"
>
{{
props
.
baseInfo
.
patent
}}
</div>
</div>
</div>
</
template
>
<
script
setup
name=
"CarouselItem337"
>
const
props
=
defineProps
({
baseInfo
:
{
type
:
Object
,
default
:
()
=>
({})
}
})
</
script
>
<
style
scoped
lang=
"scss"
>
.box-blue-box
{
width
:
100%
;
padding
:
0
20px
10px
;
border
:
1px
solid
rgba
(
231
,
243
,
255
,
1
);
border-radius
:
4px
;
background
:
rgba
(
246
,
250
,
255
,
1
);
.box-blue-name
{
height
:
38px
;
display
:
flex
;
align-items
:
center
;
font-weight
:
bold
;
font-family
:
Source
Han
Sans
CN
;
font-size
:
16px
;
line-height
:
24px
;
color
:
var
(
--
text-primary-80-color
);
&
:
:
before
{
content
:
""
;
width
:
4px
;
height
:
4px
;
border-radius
:
2px
;
background
:
var
(
--
text-primary-80-color
);
margin-right
:
12px
;
}
.box-blue-time
{
height
:
24px
;
width
:
100px
;
}
}
.box-blue-text
{
padding-left
:
18px
;
height
:
60px
;
color
:
rgba
(
59
,
65
,
75
,
1
);
font-family
:
Source
Han
Sans
CN
;
font-size
:
16px
;
line-height
:
30px
;
display
:
-
webkit-box
;
-webkit-line-clamp
:
2
;
-webkit-box-orient
:
vertical
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
normal
;
}
}
.box-text-box
{
width
:
100%
;
padding
:
20px
20px
0
;
height
:
185px
;
.box-text-item
{
display
:
flex
;
align-items
:
flex-start
;
line-height
:
30px
;
margin-bottom
:
8px
;
&
:
:
before
{
content
:
""
;
width
:
4px
;
height
:
4px
;
border-radius
:
2px
;
background
:
rgba
(
59
,
65
,
75
,
1
);
margin-top
:
16px
;
margin-right
:
12px
;
}
.box-text-left
{
height
:
30px
;
width
:
100px
;
color
:
rgba
(
59
,
65
,
75
,
1
);
font-family
:
Source
Han
Sans
CN
;
font-size
:
16px
;
font-weight
:
700
;
}
.box-text-right
{
min-height
:
30px
;
width
:
20px
;
flex
:
auto
;
color
:
rgba
(
59
,
65
,
75
,
1
);
font-family
:
Source
Han
Sans
CN
;
font-size
:
16px
;
}
}
}
</
style
>
\ No newline at end of file
src/views/marketAccessRestrictions/marketAccessHome/index.vue
浏览文件 @
5c38f268
差异被折叠。
点击展开。
src/views/marketAccessRestrictions/marketAccessHome/utils/barChart1.js
浏览文件 @
5c38f268
...
...
@@ -5,10 +5,12 @@ const getBarChart = (nameList, valueList) => {
const
option
=
{
tooltip
:
{},
grid
:
{
top
:
'8%'
,
right
:
24
,
bottom
:
24
,
left
:
24
,
width
:
'100%'
,
height
:
'83%'
,
top
:
'15%'
,
right
:
'5%'
,
bottom
:
'2%'
,
left
:
'1%'
,
containLabel
:
true
},
yAxis
:
{
...
...
src/views/marketAccessRestrictions/marketAccessHome/utils/multiLineChart.js
浏览文件 @
5c38f268
import
*
as
echarts
from
'echarts'
const
getMultiLineChart
=
(
data
)
=>
{
console
.
log
(
'dataaaa'
,
data
);
return
{
tooltip
:
{
trigger
:
'
axis
'
,
trigger
:
'
item
'
,
axisPointer
:
{
type
:
'cross'
,
label
:
{
...
...
@@ -14,44 +12,79 @@ const getMultiLineChart = (data) => {
}
},
grid
:
{
top
:
48
,
right
:
24
,
bottom
:
24
,
left
:
24
,
width
:
'95%'
,
height
:
'83%'
,
top
:
'15%'
,
left
:
'1%'
,
containLabel
:
true
},
legend
:
{
show
:
true
,
top
:
10
,
left
:
'10%'
icon
:
'circle'
,
textStyle
:
{
color
:
'rgba(95, 101, 108, 1)'
,
fontFamily
:
'Microsoft YaHei'
,
fontSize
:
'14px'
,
}
},
color
:
[
'#0A57A6'
,
'#FA8C16'
,
'#722ED1'
],
xAxis
:
[
{
type
:
'category'
,
boundaryGap
:
false
,
data
:
data
.
title
data
:
data
.
title
,
axisLine
:
{
show
:
true
,
lineStyle
:
{
color
:
'#e7f3ff'
,
},
},
axisLabel
:
{
show
:
true
,
textStyle
:
{
color
:
'rgba(95, 101, 108, 1)'
,
fontFamily
:
'Microsoft YaHei'
,
fontsize
:
14
,
}
}
}
],
yAxis
:
[
{
type
:
'value'
,
position
:
'left'
,
name
:
'数量'
,
nameLocation
:
'end'
,
nameGap
:
12
,
nameTextStyle
:
{
color
:
'#666'
,
fontSize
:
14
,
fontWeight
:
400
,
padding
:
[
0
,
0
,
6
,
-
20
]
},
axisLabel
:
{
formatter
:
'{value}'
,
color
:
'#666'
,
fontSize
:
14
,
fontWeight
:
400
},
splitLine
:
{
show
:
true
,
lineStyle
:
{
type
:
'dashed'
,
// 虚线类型
color
:
'rgb(231, 243, 255)'
,
// 灰色线条
width
:
1
// 线宽为1
}
color
:
'#e7f3ff'
,
type
:
'dashed'
,
}
},
}
],
series
:
[
{
name
:
data
.
data
[
0
]?.
name
,
type
:
'line'
,
smooth
:
true
,
symbol
:
'emptyCircle'
,
symbolSize
:
6
,
areaStyle
:
{
color
:
new
echarts
.
graphic
.
LinearGradient
(
0
,
0
,
0
,
1
,
[{
offset
:
0
,
...
...
@@ -69,6 +102,9 @@ const getMultiLineChart = (data) => {
{
name
:
data
.
data
[
1
]?.
name
,
type
:
'line'
,
smooth
:
true
,
symbol
:
'emptyCircle'
,
symbolSize
:
6
,
areaStyle
:
{
color
:
new
echarts
.
graphic
.
LinearGradient
(
0
,
0
,
0
,
1
,
[{
offset
:
0
,
...
...
@@ -86,6 +122,9 @@ const getMultiLineChart = (data) => {
{
name
:
data
.
data
[
2
]?.
name
,
type
:
'line'
,
smooth
:
true
,
symbol
:
'emptyCircle'
,
symbolSize
:
6
,
areaStyle
:
{
color
:
new
echarts
.
graphic
.
LinearGradient
(
0
,
0
,
0
,
1
,
[{
offset
:
0
,
...
...
src/views/marketAccessRestrictions/marketAccessLayout/case/337/index.vue
浏览文件 @
5c38f268
...
...
@@ -200,8 +200,8 @@ const handleFetchSurveyList = async () => {
publishYear
:
checkedYearList
.
value
.
join
(
','
)
||
null
,
Area
:
checkedAreaList
.
value
.
join
(
','
)
||
null
,
searchCountry
:
checkedCountryList
.
value
.
join
(
','
)
||
null
,
caseStatus
:
filterStage
.
value
?
filterStage
.
value
:
null
,
keywords
:
searchText
.
value
?
searchText
.
value
:
null
,
caseStatus
:
filterStage
.
value
||
null
,
keywords
:
searchText
.
value
||
null
,
sortField
:
"date"
,
sortOrder
:
isSort
.
value
?
"asc"
:
"desc"
};
...
...
src/views/marketAccessRestrictions/marketAccessLayout/index.vue
浏览文件 @
5c38f268
...
...
@@ -3,11 +3,11 @@
<div
class=
"page-top"
>
<div
class=
"head-box"
>
<div
class=
"head-icon"
>
<img
:src=
"c
urSurvey.image
"
alt=
""
/>
<img
:src=
"c
odeInfo.sortImageUrl || Img337
"
alt=
""
/>
</div>
<div
class=
"head-info"
>
<div
class=
"head-name one-line-ellipsis"
>
{{
c
urSurvey
.
titl
e
}}
</div>
<div
class=
"head-text one-line-ellipsis"
>
{{
c
urSurvey
.
desc
}}
</div>
<div
class=
"head-name one-line-ellipsis"
>
{{
c
odeInfo
.
sortNam
e
}}
</div>
<div
class=
"head-text one-line-ellipsis"
>
{{
c
odeInfo
.
sortDescription
}}
</div>
</div>
<!--
<div
class=
"head-button"
>
<div
class=
"button-icon"
>
...
...
@@ -35,7 +35,7 @@
</
template
>
<
script
setup
>
import
{
ref
,
computed
,
onMounted
}
from
"vue"
;
import
{
ref
,
onMounted
,
reactive
}
from
"vue"
;
import
router
from
"@/router/index"
;
import
icon1
from
"./assets/icons/icon1.svg"
;
import
icon1Active
from
"./assets/icons/icon1_active.svg"
;
...
...
@@ -44,6 +44,7 @@ import icon2Active from "./assets/icons/icon2_active.svg";
import
Img337
from
"./assets/images/337.png"
;
import
Img232
from
"./assets/images/232.png"
;
import
Img301
from
"./assets/images/301.png"
;
import
{
getSurvyInfo
}
from
"@/api/marketAccessRestrictions/index.js"
import
{
useRoute
}
from
"vue-router"
;
const
route
=
useRoute
();
...
...
@@ -63,27 +64,23 @@ const tabList = ref([
}
]);
const
curSurvey
=
computed
(()
=>
{
if
(
route
.
query
.
id
===
"301"
)
{
return
{
const
curSurvey
=
[
{
title
:
"301调查"
,
desc
:
'由美国贸易代表办公室依据《1974年贸易法》第301条针对"不合理或不公正贸易做法"发起的调查'
,
image
:
Img301
,
};
}
else
if
(
route
.
query
.
id
===
"232"
)
{
return
{
},
{
title
:
"232调查"
,
desc
:
"依据《1962年贸易扩展法》第232条款,授权美国商务部对“特定进口产品是否威胁或损害美国国家安全”而开展的全面调查。"
,
image
:
Img232
,
};
}
else
{
return
{
},
{
title
:
"337调查"
,
desc
:
'美国国际贸易委员会根据《1930年关税法》第337节及相关修正案进行的调查,主要针对进口贸易中的知识产权侵权行为以及其他不公平竞争行为'
,
image
:
Img337
,
};
}
});
]
const
activeName
=
ref
(
"调查案件"
);
const
handleClickBtn
=
item
=>
{
...
...
@@ -94,7 +91,23 @@ const handleClickBtn = item => {
});
};
const
codeInfo
=
reactive
({
sortCode
:
route
.
query
.
id
,
sortName
:
"调查主页"
,
sortImageUrl
:
""
,
sortDescription
:
""
,
})
const
onSurvyInfo
=
async
()
=>
{
const
res
=
await
getSurvyInfo
({
sortCode
:
route
.
query
.
id
})
console
.
log
(
"调查分类信息"
,
res
)
if
(
res
.
code
==
200
)
{
Object
.
assign
(
codeInfo
,
res
.
data
)
}
document
.
title
=
codeInfo
.
sortName
;
}
onMounted
(()
=>
{
onSurvyInfo
()
if
(
route
.
path
===
"/marketAccessLayout/overview"
)
{
activeName
.
value
=
"数据统计"
;
}
else
{
...
...
@@ -141,6 +154,7 @@ onMounted(() => {
line-height
:
26px
;
}
.head-text
{
margin-top
:
4px
;
width
:
100%
;
height
:
24px
;
color
:
rgba
(
95
,
101
,
108
,
1
);
...
...
src/views/marketAccessRestrictions/singleCaseLayout/index.vue
浏览文件 @
5c38f268
...
...
@@ -3,13 +3,13 @@
<div
class=
"page-top"
>
<div
class=
"head-box"
>
<div
class=
"head-icon"
>
<img
:src=
"c
urSurvey.image
"
alt=
""
/>
<img
:src=
"c
odeInfo.sortImageUrl || Img337
"
alt=
""
/>
</div>
<div
class=
"head-info"
>
<div
class=
"head-name one-line-ellipsis"
>
{{
curSurvey
.
title
}}
</div>
<div
class=
"head-text"
>
{{
curSurvey
.
time
}}
</div>
<div
class=
"head-name one-line-ellipsis"
>
{{
baseInfo
.
SEARCHNAME
}}
</div>
<div
class=
"head-text"
>
{{
baseInfo
.
SEARCHDATE
}}
</div>
</div>
<div
:class=
"`item-tag tag-$
{c
urSurvey.name}`">
{{
curSurvey
.
name
}}
调查
</div>
<div
:class=
"`item-tag tag-$
{c
odeInfo.sortCode}`">
{{
codeInfo
.
sortName
}}
</div>
</div>
<div
class=
"page-tabs"
>
<div
:class=
"['tab-item',
{'tab-active': activeName==item.name}]" v-for="(item, index) in tabList" :key="index" @click="handleClickBtn(item)">
...
...
@@ -37,15 +37,14 @@
</
template
>
<
script
setup
>
import
{
ref
,
onMounted
,
computed
}
from
"vue"
;
import
{
ref
,
onMounted
,
reactive
}
from
"vue"
;
import
router
from
"@/router"
;
import
NavIcon1
from
"./assets/images/nav-icon1.png"
;
import
NavIcon1Active
from
"./assets/images/nav-icon1-active.png"
;
import
NavIcon3
from
"./assets/images/nav-icon2.png"
;
import
NavIcon3Active
from
"./assets/images/nav-icon2-active.png"
;
import
Img337
from
"./assets/images/337.png"
;
import
Img232
from
"./assets/images/232.png"
;
import
Img301
from
"./assets/images/301.png"
;
import
{
getSurvyInfo
,
getSearchBlurb
}
from
"@/api/marketAccessRestrictions/index.js"
import
{
useRoute
}
from
"vue-router"
;
const
route
=
useRoute
();
...
...
@@ -64,39 +63,6 @@ const tabList = ref([
}
]);
const
surveyList
=
ref
([
{
title
:
"337-TA-1443:外国制造的半导体器件及其下游产品和组件"
,
time
:
"2025年7月18日"
,
image
:
Img337
,
name
:
"337"
},
{
title
:
"231-TA-1225:进口药及进口原材料的调查"
,
time
:
"2021年9月21日"
,
image
:
Img232
,
name
:
"232"
},
{
title
:
"美国贸易代表第301条关于中国针对海事、物流和造船业以争取主导地位的行动"
,
time
:
"2025年4月17日"
,
image
:
Img301
,
name
:
"301"
}
]);
const
curSurvey
=
computed
(()
=>
{
let
survey
;
if
(
route
.
query
.
id
===
"232"
)
{
survey
=
surveyList
.
value
[
1
];
}
else
if
(
route
.
query
.
id
===
"301"
)
{
survey
=
surveyList
.
value
[
2
];
}
else
{
survey
=
surveyList
.
value
[
0
];
}
return
survey
;
});
const
activeName
=
ref
(
"调查案件"
);
const
handleClickBtn
=
item
=>
{
activeName
.
value
=
item
.
name
;
...
...
@@ -106,8 +72,36 @@ const handleClickBtn = item => {
});
};
const
codeInfo
=
reactive
({
sortCode
:
route
.
query
.
id
,
sortName
:
""
,
sortImageUrl
:
""
,
})
const
onSurvyInfo
=
async
()
=>
{
const
res
=
await
getSurvyInfo
({
sortCode
:
route
.
query
.
id
})
console
.
log
(
"调查分类信息"
,
res
)
if
(
res
.
code
==
200
)
{
Object
.
assign
(
codeInfo
,
res
.
data
)
}
}
const
baseInfo
=
reactive
({
SEARCHNAME
:
"调查详情"
,
SEARCHDATE
:
""
,
})
const
onSearchBlurb
=
async
()
=>
{
const
res
=
await
getSearchBlurb
({
sortCode
:
route
.
query
.
id
,
searchId
:
route
.
query
.
searchId
})
console
.
log
(
"调查简介"
,
res
)
if
(
res
.
code
==
200
)
{
baseInfo
.
SEARCHNAME
=
res
.
data
.
SEARCHNAME
baseInfo
.
SEARCHDATE
=
res
.
data
.
SEARCHDATE
}
document
.
title
=
baseInfo
.
SEARCHNAME
;
}
onMounted
(()
=>
{
console
.
log
(
'route'
,
route
);
onSurvyInfo
()
onSearchBlurb
()
if
(
route
.
path
===
"/marketSingleCaseLayout/deepdig"
)
{
activeName
.
value
=
"影响分析"
;
}
else
{
...
...
@@ -154,6 +148,7 @@ onMounted(() => {
line-height
:
26px
;
}
.head-text
{
margin-top
:
4px
;
width
:
100%
;
height
:
24px
;
color
:
rgba
(
95
,
101
,
108
,
1
);
...
...
出口管制接口-4.md
浏览文件 @
5c38f268
差异被折叠。
点击展开。
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论