提交 87899162 authored 作者: 付康's avatar 付康

合并分支 'fk-dev' 到 'pre'

Fk dev 查看合并请求 !347
流水线 #489 已通过 于阶段
in 4 分 47 秒
...@@ -383,9 +383,9 @@ const handleToModule = (item, index) => { ...@@ -383,9 +383,9 @@ const handleToModule = (item, index) => {
} else { } else {
const curRoute = router.resolve({ const curRoute = router.resolve({
path: item.path, path: item.path,
query: { // query: {
titleIndex: 2 // titleIndex: 2
} // }
}); });
window.open(curRoute.href, "_blank"); window.open(curRoute.href, "_blank");
} }
......
...@@ -81,7 +81,7 @@ ...@@ -81,7 +81,7 @@
<template v-if="activeTabName === '国会法案'"> <template v-if="activeTabName === '国会法案'">
<div class="right-main-box" v-for="item in bills" :key="item.billId"> <div class="right-main-box" v-for="item in bills" :key="item.billId">
<div v-if="item.riskSignal" class="risk-tag" :class="getRiskTagClass(item.riskSignal)">{{ item.riskSignal <div v-if="item.riskSignal" class="risk-tag" :class="getRiskTagClass(item.riskSignal)">{{ item.riskSignal
}}</div> }}</div>
<div class="bill-cover"> <div class="bill-cover">
<img class="bill-image" :src="getBillImageUrl(item)" alt="" @error="handleBillImageError" /> <img class="bill-image" :src="getBillImageUrl(item)" alt="" @error="handleBillImageError" />
<div class="bill-id" :title="item.billId">{{ item.billId || "-" }}</div> <div class="bill-id" :title="item.billId">{{ item.billId || "-" }}</div>
...@@ -859,11 +859,42 @@ const handleCommitteeCurrentChange = page => { ...@@ -859,11 +859,42 @@ const handleCommitteeCurrentChange = page => {
// 议员合作关系跳转至数据资源库 // 议员合作关系跳转至数据资源库
const handleCooperationToDataLibrary = (item) => { const handleCooperationToDataLibrary = (item) => {
console.log('item', item); // console.log('item', item);
console.log('activeAreaList', activeAreaList.value); // console.log('activeAreaList', activeAreaList.value);
console.log('areaOptions', areaOptions.value); // console.log('areaOptions', areaOptions.value);
// console.log('footerSelect1', footerSelect1.value);
// console.log('委员会列表', postOrgList.value);
const postOrgStr = postOrgList.value.filter(item => item.departmentId === footerSelect1.value)[0].departmentName
const areaList = activeAreaList.value.map(item => {
return areaOptions.value.filter(val => val.id === item)[0].name
})
const memberList = [item.left.name, item.right.name]
console.log(postOrgStr, areaList, memberList);
let param
if (areaList.length > 2) {
param = {
selectedOrg: postOrgStr,
selectedmember: JSON.stringify(memberList),
selectedAreaList: JSON.stringify(areaList)
}
} else {
param = {
selectedOrg: postOrgStr,
selectedmember: JSON.stringify(memberList),
domains: areaList[0]
}
}
const route = router.resolve({
path: "/dataLibrary/countryBill",
query: param
});
window.open(route.href, "_blank");
} }
...@@ -872,10 +903,10 @@ const handleToDataLibrary = (item) => { ...@@ -872,10 +903,10 @@ const handleToDataLibrary = (item) => {
let congressStr = '全部议院' let congressStr = '全部议院'
console.log('item', item); console.log('item', item);
console.log('activeYyList', activeYyList.value); console.log('activeYyList', activeYyList.value);
if(activeYyList.value && activeYyList.value.length === 1) { if (activeYyList.value && activeYyList.value.length === 1) {
if(activeYyList.value[0] === 'S') { if (activeYyList.value[0] === 'S') {
congressStr = '参议院' congressStr = '参议院'
} else if(activeYyList.value[0] === 'H') { } else if (activeYyList.value[0] === 'H') {
congressStr = '众议院' congressStr = '众议院'
} }
} }
...@@ -883,7 +914,7 @@ const handleToDataLibrary = (item) => { ...@@ -883,7 +914,7 @@ const handleToDataLibrary = (item) => {
selectedOrg: item.name, selectedOrg: item.name,
selectedCongress: congressStr selectedCongress: congressStr
} }
const route = router.resolve({ const route = router.resolve({
path: "/dataLibrary/countryBill", path: "/dataLibrary/countryBill",
query: param query: param
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
moreText="查看全部委员会" moreText="查看全部委员会"
:moreCardMinCount="7" :moreCardMinCount="7"
@time-click="handleCommitteeTimeClick" @time-click="handleCommitteeTimeClick"
@name-click="handleToDataLibrary" @name-click="handleToInstitution"
@count-click="handleToDataLibrary" @count-click="handleToDataLibrary"
@more-click="handleToCommitteeMore" @more-click="handleToCommitteeMore"
/> />
...@@ -1414,28 +1414,46 @@ const handleResize = () => { ...@@ -1414,28 +1414,46 @@ const handleResize = () => {
box9ChartInstance && box9ChartInstance.resize(); box9ChartInstance && box9ChartInstance.resize();
}; };
// 下钻至资源库 // 跳转行政机构主页
const handleToDataLibrary = (item) => { const handleToInstitution = item => {
window.sessionStorage.setItem("curTabName", item.orgName);
window.sessionStorage.setItem("curTabName", item.id);
const curRoute = router.resolve({ const curRoute = router.resolve({
path: "/institution", path: "/institution",
query: { query: {
id: item.id id: item.orgId
} }
}); });
window.open(curRoute.href, "_blank"); window.open(curRoute.href, "_blank");
// router.push({
// path: "/institution",
// query: {
// id: item.orgId
// }
// })
};
// console.log('item', item); // 下钻至资源库
// const selectParam = { const handleToDataLibrary = (item) => {
// selectedOrg: item.name,
// selectedCongress: item.chamber // window.sessionStorage.setItem("curTabName", item.id);
// } // const curRoute = router.resolve({
// const route = router.resolve({ // path: "/institution",
// path: "/dataLibrary/countryBill", // query: {
// query: selectParam // id: item.id
// }
// }); // });
// window.open(route.href, "_blank"); // window.open(curRoute.href, "_blank");
// console.log('item', item);
const selectParam = {
selectedOrg: item.name,
selectedCongress: item.chamber
}
const route = router.resolve({
path: "/dataLibrary/countryBill",
query: selectParam
});
window.open(route.href, "_blank");
} }
......
<template> <template>
<div class="wrapper"> <div class="wrapper">
<div class="header">
<div class="header-content">
<div class="header-item">首页</div>
<div class="header-item">></div>
<div class="header-item back-item" @click="handleBackHome">综合检索</div>
<div class="header-item">></div>
<div class="header-item">智能问答</div>
</div>
</div>
<div class="main"> <div class="main">
<div class="left"> <div class="left">
<div class="left-header"> <div class="left-header">
...@@ -199,12 +190,6 @@ const areaList = ref([ ...@@ -199,12 +190,6 @@ const areaList = ref([
} }
]); ]);
// 返回综合检索
const handleBackHome = () => {
router.push({
path: "/comprehensiveSearch"
});
};
const contentContainer = ref(null); const contentContainer = ref(null);
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<div class="header-box"> <div class="header-box">
<div class="header-top"> <div class="header-top">
<SelectBox :placeholder-name="areaPlaceHolder" select-title="科技领域" :select-list="areaList" <SelectBox :placeholder-name="areaPlaceHolder" select-title="科技领域" :select-list="areaList"
:select-name="selectedArea" @update:select-text="handleSelectArea" /> :select-name="selectedArea" :is-multiple="true" @update:select-text="handleSelectArea" />
<SelectBox :placeholder-name="DatePlaceHolder" select-title="提案时间" :select-list="dateList" <SelectBox :placeholder-name="DatePlaceHolder" select-title="提案时间" :select-list="dateList"
:select-name="selectedDate" :custom-time="customTime" @update:select-text="handleSelectDate" :select-name="selectedDate" :custom-time="customTime" @update:select-text="handleSelectDate"
@update:custom-time="handleCustomDate" /> @update:custom-time="handleCustomDate" />
...@@ -13,8 +13,11 @@ ...@@ -13,8 +13,11 @@
:select-list="congressList" :select-name="selectedCongress" @update:select-text="handleSelectCongress" /> :select-list="congressList" :select-name="selectedCongress" @update:select-text="handleSelectCongress" />
<SelectBox v-if="isFolderAll" :placeholder-name="orgPlaceHolder" select-title="委员会" :select-list="orgList" <SelectBox v-if="isFolderAll" :placeholder-name="orgPlaceHolder" select-title="委员会" :select-list="orgList"
:select-name="selectedOrg" @update:select-text="handleSelectOrg" /> :select-name="selectedOrg" @update:select-text="handleSelectOrg" />
<SelectBox v-if="isFolderAll" :placeholder-name="memberPlaceHolder" select-title="提案议员"
:select-list="memberList" :select-name="selectedPostMan" @update:select-text="handleSelectPostMan" />
<SelectBox v-if="isFolderAll" :placeholder-name="memberPlaceHolder" select-title="提出议员" <SelectBox v-if="isFolderAll" :placeholder-name="memberPlaceHolder" select-title="提出议员"
:select-list="memberList" :select-name="selectedmember" @update:select-text="handleSelectMember" /> :select-list="memberList" :select-name="selectedmember" :is-multiple="true"
@update:select-text="handleSelectMember" />
<SelectBox v-if="isFolderAll" :placeholder-name="statusPlaceHolder" select-title="所处阶段" <SelectBox v-if="isFolderAll" :placeholder-name="statusPlaceHolder" select-title="所处阶段"
:select-list="statusList" :select-name="selectedStatus" @update:select-text="handleSelectStauts" /> :select-list="statusList" :select-name="selectedStatus" @update:select-text="handleSelectStauts" />
<div class="check-box"> <div class="check-box">
...@@ -131,7 +134,7 @@ ...@@ -131,7 +134,7 @@
<el-table-column label="日期" width="120" class-name="date-column"> <el-table-column label="日期" width="120" class-name="date-column">
<template #default="scope">{{ scope.row.date }}</template> <template #default="scope">{{ scope.row.date }}</template>
</el-table-column> </el-table-column>
<el-table-column label="提人" width="480"> <el-table-column label="提人" width="480">
<template #default="scope"> <template #default="scope">
<span class="person-item text-compact" @click="handlePerClick(scope.row)">{{ scope.row.sponsorPersonName <span class="person-item text-compact" @click="handlePerClick(scope.row)">{{ scope.row.sponsorPersonName
}}</span> }}</span>
...@@ -337,11 +340,11 @@ const handleChangeTime = value => { ...@@ -337,11 +340,11 @@ const handleChangeTime = value => {
// 激活的标签列表 // 激活的标签列表
const activeTagList = computed(() => { const activeTagList = computed(() => {
const arr = [] const arr = []
if (selectedArea.value && selectedArea.value !== '全部领域') { if (selectedArea.value && selectedArea.value[0] !== '全部领域') {
arr.push( arr.push(
{ {
tag: '科技领域', tag: '科技领域',
name: selectedArea.value name: selectedArea.value.join('、')
} }
) )
} }
...@@ -377,11 +380,11 @@ const activeTagList = computed(() => { ...@@ -377,11 +380,11 @@ const activeTagList = computed(() => {
} }
) )
} }
if (selectedmember.value && selectedmember.value !== '全部议员') { if (selectedmember.value && selectedmember.value[0] !== '全部议员') {
arr.push( arr.push(
{ {
tag: '提出议员', tag: '提出议员',
name: selectedmember.value name: selectedmember.value.join('、')
} }
) )
} }
...@@ -411,7 +414,7 @@ const activeTagList = computed(() => { ...@@ -411,7 +414,7 @@ const activeTagList = computed(() => {
const handleCloseCurTag = (tag, index) => { const handleCloseCurTag = (tag, index) => {
switch (tag.tag) { switch (tag.tag) {
case '科技领域': case '科技领域':
selectedArea.value = '全部领域' selectedArea.value = ['全部领域']
break break
case '提案时间': case '提案时间':
selectedDate.value = '' selectedDate.value = ''
...@@ -426,7 +429,7 @@ const handleCloseCurTag = (tag, index) => { ...@@ -426,7 +429,7 @@ const handleCloseCurTag = (tag, index) => {
selectedOrg.value = '全部委员会' selectedOrg.value = '全部委员会'
break break
case '提出议员': case '提出议员':
selectedmember.value = '全部议员' selectedmember.value = ['全部议员']
break break
case '所处阶段': case '所处阶段':
selectedStatus.value = '全部阶段' selectedStatus.value = '全部阶段'
...@@ -511,7 +514,7 @@ const operationList = ref([ ...@@ -511,7 +514,7 @@ const operationList = ref([
// 科技领域 // 科技领域
const areaPlaceHolder = ref('请选择领域') const areaPlaceHolder = ref('请选择领域')
const selectedArea = ref('全部领域') const selectedArea = ref(['全部领域'])
const areaList = ref([ const areaList = ref([
{ {
name: '全部领域', name: '全部领域',
...@@ -579,7 +582,8 @@ const areaList = ref([ ...@@ -579,7 +582,8 @@ const areaList = ref([
}, },
]) ])
const handleSelectArea = (value) => { const handleSelectArea = (value) => {
selectedArea.value = value // selectedArea.value = value
selectedArea.value = value.length > 1 && value.includes('全部领域') ? value.filter(item => item !== '全部议员') : value;
} }
// 提案时间 // 提案时间
...@@ -697,12 +701,18 @@ const handleGetOrgList = async () => { ...@@ -697,12 +701,18 @@ const handleGetOrgList = async () => {
} }
} }
// 提案议员
const selectedPostMan = ref('全部议员')
const handleSelectPostMan = value => {
selectedPostMan.value = value
}
// 提出议员 // 提出议员
const memberList = ref([]) const memberList = ref([])
const selectedmember = ref('全部议员') const selectedmember = ref(['全部议员'])
const memberPlaceHolder = ref('请选择议员') const memberPlaceHolder = ref('请选择议员')
const handleSelectMember = value => { const handleSelectMember = value => {
selectedmember.value = value selectedmember.value = value.length > 1 && value.includes('全部议员') ? value.filter(item => item !== '全部议员') : value;
} }
// 获取议员 // 获取议员
...@@ -793,12 +803,12 @@ const handleInvolveCnChange = () => { ...@@ -793,12 +803,12 @@ const handleInvolveCnChange = () => {
// 清空条件 // 清空条件
const handleClear = () => { const handleClear = () => {
selectedArea.value = '全部领域' selectedArea.value = ['全部领域']
selectedDate.value = '' selectedDate.value = ''
selectedParty.value = '全部党派' selectedParty.value = '全部党派'
selectedCongress.value = '全部议院' selectedCongress.value = '全部议院'
selectedOrg.value = '全部委员会' selectedOrg.value = '全部委员会'
selectedmember.value = '全部议员' selectedmember.value = ['全部议员']
selectedStatus.value = '全部阶段' selectedStatus.value = '全部阶段'
isInvolveCn.value = false isInvolveCn.value = false
ElMessage.success('已清空条件!') ElMessage.success('已清空条件!')
...@@ -861,15 +871,15 @@ const fetchTableData = async () => { ...@@ -861,15 +871,15 @@ const fetchTableData = async () => {
const params = { const params = {
page: currentPage.value, page: currentPage.value,
size: pageSize.value, size: pageSize.value,
keyword: '',
type: 1, // type 1= 法案 2= 政令 3 =智库 4=智库报告 5=实体清单【制裁记录】 6= 人物 7= 机构 8=新闻 9= 社媒 type: 1, // type 1= 法案 2= 政令 3 =智库 4=智库报告 5=实体清单【制裁记录】 6= 人物 7= 机构 8=新闻 9= 社媒
domains: selectedArea.value === '全部领域' ? null : [selectedArea.value], domains: selectedArea.value[0] === '全部领域' ? null : selectedArea.value,
proposedDateStart: customTime.value[0], proposedDateStart: customTime.value[0],
proposedDateEnd: customTime.value[1], proposedDateEnd: customTime.value[1],
affiliation: selectedParty.value === '全部党派' ? null : selectedParty.value, affiliation: selectedParty.value === '全部党派' ? null : selectedParty.value,
originChamber: selectedCongress.value === '全部议院' ? null : selectedCongress.value, originChamber: selectedCongress.value === '全部议院' ? null : selectedCongress.value,
originDepart: selectedOrg.value === '全部委员会' ? null : selectedOrg.value, originDepart: selectedOrg.value === '全部委员会' ? null : selectedOrg.value,
sponsorPersonName: selectedmember.value === '全部议员' ? null : selectedmember.value, proposer: handleSelectPostMan.value === '全部议员' ? null :selectedPostMan.value,
sponsorPersonName: selectedmember.value[0] === '全部议员' ? null : selectedmember.value,
status: selectedStatus.value === '全部阶段' ? null : selectedStatus.value, status: selectedStatus.value === '全部阶段' ? null : selectedStatus.value,
isInvolveCn: isInvolveCn.value ? 'Y' : 'N', isInvolveCn: isInvolveCn.value ? 'Y' : 'N',
sort: isSort.value ? 0 : 1 // 0 先按分数降序 后按时间降序 1 先按分数降序,再按时间升序 sort: isSort.value ? 0 : 1 // 0 先按分数降序 后按时间降序 1 先按分数降序,再按时间升序
...@@ -961,15 +971,15 @@ const fetchAllData = async () => { ...@@ -961,15 +971,15 @@ const fetchAllData = async () => {
const params = { const params = {
page: 1, page: 1,
size: 9999, size: 9999,
keyword: '',
type: 1, // type 1= 法案 2= 政令 3 =智库 4=智库报告 5=实体清单【制裁记录】 6= 人物 7= 机构 8=新闻 9= 社媒 type: 1, // type 1= 法案 2= 政令 3 =智库 4=智库报告 5=实体清单【制裁记录】 6= 人物 7= 机构 8=新闻 9= 社媒
domains: selectedArea.value === '全部领域' ? null : [selectedArea.value], domains: selectedArea.value[0] === '全部领域' ? null : selectedArea.value,
proposedDateStart: customTime.value[0], proposedDateStart: customTime.value[0],
proposedDateEnd: customTime.value[1], proposedDateEnd: customTime.value[1],
affiliation: selectedParty.value === '全部党派' ? null : selectedParty.value, affiliation: selectedParty.value === '全部党派' ? null : selectedParty.value,
originChamber: selectedCongress.value === '全部议院' ? null : selectedCongress.value, originChamber: selectedCongress.value === '全部议院' ? null : selectedCongress.value,
originDepart: selectedOrg.value === '全部委员会' ? null : selectedOrg.value, originDepart: selectedOrg.value === '全部委员会' ? null : selectedOrg.value,
sponsorPersonName: selectedmember.value === '全部议员' ? null : selectedmember.value, proposer: handleSelectPostMan.value === '全部议员' ? null :selectedPostMan.value,
sponsorPersonName: selectedmember.value[0] === '全部议员' ? null : selectedmember.value,
status: selectedStatus.value === '全部阶段' ? null : selectedStatus.value, status: selectedStatus.value === '全部阶段' ? null : selectedStatus.value,
isInvolveCn: isInvolveCn.value ? 'Y' : 'N', isInvolveCn: isInvolveCn.value ? 'Y' : 'N',
sort: isSort.value ? 0 : 1 // 0 先按分数降序 后按时间降序 1 先按分数降序,再按时间升序 sort: isSort.value ? 0 : 1 // 0 先按分数降序 后按时间降序 1 先按分数降序,再按时间升序
...@@ -1122,7 +1132,12 @@ const handleDownloadCurChartData = () => { ...@@ -1122,7 +1132,12 @@ const handleDownloadCurChartData = () => {
const initParam = () => { const initParam = () => {
const hasQuery = Object.keys(route.query).length > 0; const hasQuery = Object.keys(route.query).length > 0;
if (hasQuery) { if (hasQuery) {
selectedArea.value = route.query.domains ? route.query.domains : '全部领域' if (route.query.selectedAreaList) {
selectedArea.value = JSON.parse(route.query.selectedAreaList)
} else {
selectedArea.value = route.query.domains ? [route.query.domains] : ['全部领域']
}
if (route.query.selectedDate && Array.isArray(JSON.parse(route.query.selectedDate)) && JSON.parse(route.query.selectedDate).length) { if (route.query.selectedDate && Array.isArray(JSON.parse(route.query.selectedDate)) && JSON.parse(route.query.selectedDate).length) {
selectedDate.value = '自定义' selectedDate.value = '自定义'
...@@ -1139,6 +1154,7 @@ const initParam = () => { ...@@ -1139,6 +1154,7 @@ const initParam = () => {
selectedCongress.value = route.query.selectedCongress ? route.query.selectedCongress : '全部议院' selectedCongress.value = route.query.selectedCongress ? route.query.selectedCongress : '全部议院'
selectedOrg.value = route.query.selectedOrg ? route.query.selectedOrg : '全部委员会' selectedOrg.value = route.query.selectedOrg ? route.query.selectedOrg : '全部委员会'
selectedmember.value = route.query.selectedmember ? JSON.parse(route.query.selectedmember) : ['全部议员']
const query = route.query; const query = route.query;
if (Object.keys(query).length > 0) { if (Object.keys(query).length > 0) {
...@@ -1146,7 +1162,12 @@ const initParam = () => { ...@@ -1146,7 +1162,12 @@ const initParam = () => {
} }
} else { } else {
const savedQuery = JSON.parse(sessionStorage.getItem('countryRouteQuery') || '{}'); const savedQuery = JSON.parse(sessionStorage.getItem('countryRouteQuery') || '{}');
selectedArea.value = savedQuery.domains ? savedQuery.domains : '全部领域'
if (savedQuery.selectedAreaList) {
selectedArea.value = JSON.parse(savedQuery.selectedAreaList)
} else {
selectedArea.value = savedQuery.domains ? [savedQuery.domains] : ['全部领域']
}
if (savedQuery.selectedDate && Array.isArray(JSON.parse(savedQuery.selectedDate)) && JSON.parse(savedQuery.selectedDate).length) { if (savedQuery.selectedDate && Array.isArray(JSON.parse(savedQuery.selectedDate)) && JSON.parse(savedQuery.selectedDate).length) {
selectedDate.value = '自定义' selectedDate.value = '自定义'
customTime.value = JSON.parse(savedQuery.selectedDate) customTime.value = JSON.parse(savedQuery.selectedDate)
...@@ -1160,6 +1181,7 @@ const initParam = () => { ...@@ -1160,6 +1181,7 @@ const initParam = () => {
selectedCongress.value = savedQuery.selectedCongress ? savedQuery.selectedCongress : '全部议院' selectedCongress.value = savedQuery.selectedCongress ? savedQuery.selectedCongress : '全部议院'
selectedOrg.value = savedQuery.selectedOrg ? savedQuery.selectedOrg : '全部委员会' selectedOrg.value = savedQuery.selectedOrg ? savedQuery.selectedOrg : '全部委员会'
selectedmember.value = savedQuery.selectedmember ? savedQuery.selectedmember : ['全部议员']
} }
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<div class="select-wrapper" :class="{ 'select-wrapper-custom': selectValue === '自定义' }"> <div class="select-wrapper" :class="{ 'select-wrapper-custom': selectValue === '自定义' }">
<div class="select-left text-tip-1">{{ selectTitle + ':' }}</div> <div class="select-left text-tip-1">{{ selectTitle + ':' }}</div>
<div class="select-right" :class="{ 'select-right-custom': selectValue === '自定义' }"> <div class="select-right" :class="{ 'select-right-custom': selectValue === '自定义' }">
<el-select v-model="selectValue" :placeholder="placeholderName" filterable style="width: 240px"> <el-select v-model="selectValue" :placeholder="placeholderName" filterable :multiple="isMultiple" style="width: 240px">
<!-- <el-option label="全部领域" value="全部领域" /> --> <!-- <el-option label="全部领域" value="全部领域" /> -->
<el-option v-for="item in selectList" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in selectList" :key="item.id" :label="item.name" :value="item.id" />
</el-select> </el-select>
...@@ -37,6 +37,10 @@ const props = defineProps({ ...@@ -37,6 +37,10 @@ const props = defineProps({
customTime: { customTime: {
type: String, type: String,
default: '' default: ''
},
isMultiple: {
type: Boolean,
default: false
} }
}) })
...@@ -58,7 +62,7 @@ const customTimeValue = computed({ ...@@ -58,7 +62,7 @@ const customTimeValue = computed({
<style lang="scss" scoped> <style lang="scss" scoped>
.select-wrapper { .select-wrapper {
width: 348px; width: 348px;
height: 28px; min-height: 28px;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
......
...@@ -721,12 +721,12 @@ const handleSelectEntityType = value => { ...@@ -721,12 +721,12 @@ const handleSelectEntityType = value => {
const handleGetEntityTypes = async () => { const handleGetEntityTypes = async () => {
try { try {
const res = await getEntityTypes() const res = await getEntityTypes()
console.log('获取实体类型列表'); console.log('获取实体类型列表', res);
if (res.code === 200 && res.data) { if (res.code === 200 && res.data) {
entityTypeList.value = res.data.map(item => { entityTypeList.value = res.data.map(item => {
return { return {
name: item.name, name: item.name,
id: item.code id: item.id
} }
}) })
} }
...@@ -814,7 +814,6 @@ const fetchTableData = async () => { ...@@ -814,7 +814,6 @@ const fetchTableData = async () => {
provinceName: selectedProvince.value === '全部省份' ? null : selectedProvince.value, // 实体省份 provinceName: selectedProvince.value === '全部省份' ? null : selectedProvince.value, // 实体省份
entityTypeCode: selectedEntityType.value === '全部实体类型' ? null : selectedEntityType.value, // 实体类别 entityTypeCode: selectedEntityType.value === '全部实体类型' ? null : selectedEntityType.value, // 实体类别
ratio: isHalfRule.value ? 'Y' : null, // 50%规则 ratio: isHalfRule.value ? 'Y' : null, // 50%规则
isInvolveCn: isCnEntityOnly.value ? 'Y' : null, // 是否只看中国实体
sort: isSort.value ? 0 : 1 // 0 先按分数降序 后按时间降序 1 先按分数降序,再按时间升序 sort: isSort.value ? 0 : 1 // 0 先按分数降序 后按时间降序 1 先按分数降序,再按时间升序
} }
try { try {
...@@ -905,7 +904,6 @@ const fetchAllData = async () => { ...@@ -905,7 +904,6 @@ const fetchAllData = async () => {
provinceName: selectedProvince.value === '全部省份' ? null : selectedProvince.value, // 实体省份 provinceName: selectedProvince.value === '全部省份' ? null : selectedProvince.value, // 实体省份
entityTypeCode: selectedEntityType.value === '全部实体类型' ? null : selectedEntityType.value, // 实体类别 entityTypeCode: selectedEntityType.value === '全部实体类型' ? null : selectedEntityType.value, // 实体类别
ratio: isHalfRule.value ? 'Y' : null, // 50%规则 ratio: isHalfRule.value ? 'Y' : null, // 50%规则
isInvolveCn: isCnEntityOnly.value ? 'Y' : null, // 是否只看中国实体
sort: isSort.value ? 0 : 1 // 0 先按分数降序 后按时间降序 1 先按分数降序,再按时间升序 sort: isSort.value ? 0 : 1 // 0 先按分数降序 后按时间降序 1 先按分数降序,再按时间升序
} }
try { try {
...@@ -1064,11 +1062,16 @@ const initParam = () => { ...@@ -1064,11 +1062,16 @@ const initParam = () => {
} }
selectedProvince.value = route.query.selectedProvince ? provinceList.value.filter(item => item.name.indexOf(route.query.selectedProvince) > -1)[0].name : '全部省份' 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
isHalfRule.value = route.query.isHalfRule === 'true' ? true : false
isCnEntityOnly.value = route.query.isCnEntityOnly ? true : false isCnEntityOnly.value = route.query.isCnEntityOnly ? true : false
if (isCnEntityOnly.value) {
selectedCountry.value = '0101'
} else {
selectedCountry.value = route.query.selectedCountryId ? route.query.selectedCountryId : '全部国家'
}
selectedEntityType.value = route.query.selectedEntityType ? entityTypeList.value.filter(item => item.name === route.query.selectedEntityType)[0].id : '全部实体类型' selectedEntityType.value = route.query.selectedEntityType ? entityTypeList.value.filter(item => item.name === route.query.selectedEntityType)[0].id : '全部实体类型'
...@@ -1083,17 +1086,32 @@ const initParam = () => { ...@@ -1083,17 +1086,32 @@ const initParam = () => {
selectedDate.value = '自定义' selectedDate.value = '自定义'
customTime.value = JSON.parse(savedQuery.selectedDate) customTime.value = JSON.parse(savedQuery.selectedDate)
} }
isHalfRule.value = savedQuery.isHalfRule ? true : false isHalfRule.value = savedQuery.isHalfRule === 'true' ? true : false
selectedProvince.value = savedQuery.selectedProvince ? provinceList.value.filter(item => item.name.indexOf(savedQuery.selectedProvince) > -1)[0].name : '全部省份' 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 isCnEntityOnly.value = savedQuery.isCnEntityOnly ? true : false
if (isCnEntityOnly.value) {
selectedCountry.value = '0101'
} else {
selectedCountry.value = route.query.selectedCountryId ? route.query.selectedCountryId : '全部国家'
}
selectedEntityType.value = savedQuery.selectedEntityType ? entityTypeList.value.filter(item => item.name === savedQuery.selectedEntityType)[0].id : '全部实体类型' selectedEntityType.value = savedQuery.selectedEntityType ? entityTypeList.value.filter(item => item.name === savedQuery.selectedEntityType)[0].id : '全部实体类型'
} }
} }
watch(
() => isCnEntityOnly.value,
val => {
if (val) {
selectedCountry.value = '0101'
} else {
selectedCountry.value = '全部国家'
}
}
)
// 跳转机构详情 // 跳转机构详情
const handleClickToDetail = (curEntity) => { const handleClickToDetail = (curEntity) => {
console.log('curEntity', curEntity); console.log('curEntity', curEntity);
......
...@@ -7,33 +7,13 @@ ...@@ -7,33 +7,13 @@
<SelectBox :placeholder-name="DatePlaceHolder" select-title="制裁时间" :select-list="dateList" <SelectBox :placeholder-name="DatePlaceHolder" select-title="制裁时间" :select-list="dateList"
:select-name="selectedDate" :custom-time="customTime" @update:select-text="handleSelectDate" :select-name="selectedDate" :custom-time="customTime" @update:select-text="handleSelectDate"
@update:custom-time="handleCustomDate" /> @update:custom-time="handleCustomDate" />
<SelectBox v-if="isFolderAll" :placeholder-name="countryPlaceHolder" select-title="国家地区" <SelectBox v-if="isFolderAll" :placeholder-name="typePlaceHolder" select-title="物项类别" :select-list="typeList"
:select-list="countryList" :select-name="selectedCountry" @update:select-text="handleSelectCountry" /> :select-name="selectedType" @update:select-text="handleSelectType" />
<SelectBox v-if="isShowProvinceBox" :placeholder-name="provincePlaceHolder" select-title="实体省份" <SelectBox v-if="isFolderAll" :placeholder-name="controlReasonPlaceHolder" select-title="管控原因"
:select-list="provinceList" :select-name="selectedProvince" @update:select-text="handleSelectProvince" /> :select-list="controlReasonList" :select-name="selectedControlReason"
<SelectBox v-if="isFolderAll" :placeholder-name="entityTypePlaceHolder" select-title="实体类型" @update:select-text="handleSelectControlReason" />
:select-list="entityTypeList" :select-name="selectedEntityType" <InputBox input-title="物项名称" :input-name="categoryName" @update:input-text="handleInputCategoryName"
@update:select-text="handleSelectEntityType" /> placeholder-name="请输入物项名称" />
<div class="check-box">
<div class="check-box-left text-tip-1">
{{ '50%规则:' }}
</div>
<div class="check-box-right">
<el-checkbox v-model="isHalfRule" class="involve-checkbox">
{{ '只看50%规则' }}
</el-checkbox>
</div>
</div>
<div class="check-box">
<div class="check-box-left text-tip-1">
{{ '中国实体:' }}
</div>
<div class="check-box-right">
<el-checkbox v-model="isCnEntityOnly" class="involve-checkbox">
{{ '只看中国实体' }}
</el-checkbox>
</div>
</div>
</div> </div>
<div class="header-footer"> <div class="header-footer">
<div class="header-footer-left"> <div class="header-footer-left">
...@@ -130,7 +110,7 @@ ...@@ -130,7 +110,7 @@
<el-table ref="tableRef" :data="tableData" row-key="id" @selection-change="handleSelectionChange" <el-table ref="tableRef" :data="tableData" row-key="id" @selection-change="handleSelectionChange"
@select="handleSelect" @select-all="handleSelectAll" style="width: 100%" :row-style="{ height: '52px' }"> @select="handleSelect" @select-all="handleSelectAll" style="width: 100%" :row-style="{ height: '52px' }">
<el-table-column type="selection" width="40" /> <el-table-column type="selection" width="40" />
<el-table-column label="实体名称" width="620"> <el-table-column label="物项名称">
<template #default="scope"> <template #default="scope">
<span class="title-item text-compact-bold" @click="handleClickToDetail(scope.row)">{{ <span class="title-item text-compact-bold" @click="handleClickToDetail(scope.row)">{{
scope.row.originalTitle scope.row.originalTitle
...@@ -140,22 +120,15 @@ ...@@ -140,22 +120,15 @@
<el-table-column label="制裁时间" width="120" class-name="date-column"> <el-table-column label="制裁时间" width="120" class-name="date-column">
<template #default="scope">{{ scope.row.date }}</template> <template #default="scope">{{ scope.row.date }}</template>
</el-table-column> </el-table-column>
<el-table-column label="上市地点">
<template #default="scope">
<span class="person-item text-compact" @click="handleOrgClick(scope.row)">{{ scope.row.organizationName
}}</span>
</template>
</el-table-column>
<el-table-column label="涉及领域" width="500" class-name="date-column"> <el-table-column label="涉及领域" width="500" class-name="date-column">
<template #default="scope"> <template #default="scope">
<div class="tag-box"> <div class="tag-box">
<AreaTag v-for="tag, index in scope.row.domains" :key="index" :tagName="tag" /> <AreaTag v-for="tag, index in scope.row.domains" :key="index" :tagName="tag" />
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="实体类型" width="100"> <el-table-column label="物项类别" width="180">
<template #default="scope">{{ scope.row.typeStr }}</template> <template #default="scope">{{ scope.row.materialCategory }}</template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
...@@ -179,6 +152,7 @@ import PieChart from '../../components/PieChart/index.vue' ...@@ -179,6 +152,7 @@ import PieChart from '../../components/PieChart/index.vue'
import BarChart from '../../components/BarChart/index.vue' import BarChart from '../../components/BarChart/index.vue'
import RaderChart from '../../components/RadarChart/idnex.vue' import RaderChart from '../../components/RadarChart/idnex.vue'
import SelectBox from '../../components/SelectBox/index.vue' import SelectBox from '../../components/SelectBox/index.vue'
import InputBox from '../../components/InputBox/index.vue'
import DataChartSwitchBox from '../../components/dataChartSwitchBox/index.vue' import DataChartSwitchBox from '../../components/dataChartSwitchBox/index.vue'
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import router from '@/router' import router from '@/router'
...@@ -186,18 +160,10 @@ import router from '@/router' ...@@ -186,18 +160,10 @@ import router from '@/router'
import { search } from '@/api/comprehensiveSearch' import { search } from '@/api/comprehensiveSearch'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import getDateRange from '@/utils/getDateRange' import getDateRange from '@/utils/getDateRange'
import { getProvinceList, getCountryList, getEntityTypes } from '@/api/comprehensiveSearch/index' import { getMaterialCategory, getControlReason } from '@/api/comprehensiveSearch/index'
const route = useRoute(); const route = useRoute();
const isShowProvinceBox = computed(() => {
let isShow = false
if (isFolderAll.value && (selectedCountry.value === '0101' || selectedCountry.value === '全部国家')) {
isShow = true
}
return isShow
})
// 图表/数据 // 图表/数据
const isShowChart = ref(false) const isShowChart = ref(false)
// 点击切换数据/图表 // 点击切换数据/图表
...@@ -233,7 +199,7 @@ const staticsDemensionList = ref([ ...@@ -233,7 +199,7 @@ const staticsDemensionList = ref([
name: '制裁时间', name: '制裁时间',
active: true, active: true,
chartTypeList: ['折线图', '柱状图'], chartTypeList: ['折线图', '柱状图'],
chartTitle: '实体清单制裁时间变化趋势', chartTitle: '商业管制清单制裁时间变化趋势',
data: { data: {
dataX: [], dataX: [],
dataY: [] dataY: []
...@@ -251,30 +217,17 @@ const staticsDemensionList = ref([ ...@@ -251,30 +217,17 @@ const staticsDemensionList = ref([
name: '科技领域', name: '科技领域',
active: false, active: false,
chartTypeList: ['饼状图'], chartTypeList: ['饼状图'],
chartTitle: '实体清单科技领域分布', chartTitle: '商业管制清单科技领域分布',
data: [] data: []
}, },
{ {
name: '实体类型', name: '物项类别',
active: false, active: false,
chartTypeList: ['饼状图'], chartTypeList: ['饼状图'],
chartTitle: '实体类型分布', chartTitle: '商业管制清单物项类别分布',
data: []
},
{
name: '实体国家地区',
active: false,
chartTypeList: ['饼状图'],
chartTitle: '实体国家地区分布',
data: []
},
{
name: '实体省份',
active: false,
chartTypeList: ['饼状图'],
chartTitle: '实体省份分布',
data: [] data: []
} }
]) ])
// 当前维度下的图表列表 // 当前维度下的图表列表
...@@ -370,60 +323,38 @@ const activeTagList = computed(() => { ...@@ -370,60 +323,38 @@ const activeTagList = computed(() => {
} }
) )
} }
if (selectedCountry.value && selectedCountry.value !== '全部国家') { if (selectedType.value && selectedType.value !== '全部类别') {
const countryArr = countryList.value.filter(item => item.id === selectedCountry.value) const countryArr = typeList.value.filter(item => item.id === selectedType.value)
let countryStr = '全部国家' let countryStr = '全部类别'
if (countryArr && countryArr.length) { if (countryArr && countryArr.length) {
countryStr = countryArr[0].name countryStr = countryArr[0].name
} }
arr.push( arr.push(
{ {
tag: '实体国家地区', tag: '物项类别',
name: countryStr name: countryStr
} }
) )
} }
if (selectedProvince.value && selectedProvince.value !== '全部省份' && (selectedCountry.value === '0101' || selectedCountry.value === '全部国家')) { if (selectedControlReason.value && selectedControlReason.value !== '全部管控原因') {
arr.push( arr.push(
{ {
tag: '实体省份', tag: '管控原因',
name: selectedProvince.value name: selectedControlReason.value
}
)
}
if (selectedEntityType.value && selectedEntityType.value !== '全部实体类型') {
const entityTypeArr = entityTypeList.value.filter(item => item.id === selectedEntityType.value)
let entityTypeStr = '全部类型'
if (entityTypeArr && entityTypeArr.length) {
entityTypeStr = entityTypeArr[0].name
}
arr.push(
{
tag: '实体类型',
name: entityTypeStr
} }
) )
} }
if (isHalfRule.value) { if (categoryName.value) {
const halfRuleStr = '50%规则'
arr.push( arr.push(
{ {
tag: '50%规则', tag: '物项名称',
name: halfRuleStr name: categoryName.value
} }
) )
} }
if (isCnEntityOnly.value) {
const involveStr = '只看中国实体'
arr.push(
{
tag: '只看中国实体',
name: involveStr
}
)
}
return arr return arr
...@@ -439,21 +370,16 @@ const handleCloseCurTag = (tag, index) => { ...@@ -439,21 +370,16 @@ const handleCloseCurTag = (tag, index) => {
selectedDate.value = '' selectedDate.value = ''
customTime.value = [] customTime.value = []
break break
case '实体国家地区': case '物项类别':
selectedCountry.value = '全部国家' selectedType.value = '全部类别'
break
case '实体省份':
selectedProvince.value = '全部省份'
break break
case '实体类型': case '管控原因':
selectedEntityType.value = '全部实体类型' selectedControlReason.value = '全部管控原因'
break break
case '50%规则': case '物项名称':
isHalfRule.value = false categoryName.value = ''
break
case '只看中国实体':
isCnEntityOnly.value = false
break break
} }
} }
...@@ -463,71 +389,13 @@ const activeChart = ref('') // 当前激活的图表 ...@@ -463,71 +389,13 @@ const activeChart = ref('') // 当前激活的图表
const handleSwitchActiveChart = val => { const handleSwitchActiveChart = val => {
activeChart.value = val.name activeChart.value = val.name
} }
// 雷达图数据
const radarChartData = ref({
title: [
{
name: '航空航天',
max: 10
},
{
name: '先进制造',
max: 10
},
{
name: '量子科技',
max: 10
},
{
name: '人工智能',
max: 10
},
{
name: '新材料',
max: 10
},
{
name: '集成电路',
max: 10
},
],
data: [
{
name: "337调查",
value: [10, 5, 2, 8, 5, 7
]
},
{
name: "232调查",
value: [2, 5, 3, 8, 10, 2]
},
{
name: "301调查",
value: [5, 8, 2, 9, 1, 5]
}
]
}
)
// 数据- 是否全选 // 数据- 是否全选
const isSelectedAll = ref(false) const isSelectedAll = ref(false)
// 批量操作-当前操作 // 批量操作-当前操作
const curOperation = ref('') const curOperation = ref('')
const operationList = ref([ const operationList = ref([
{
name: 'aaa',
id: 'aaa'
},
{
name: 'bbb',
id: 'bbb'
},
{
name: 'ccc',
id: 'ccc'
},
]) ])
// 科技领域 // 科技领域
...@@ -639,28 +507,28 @@ const handleSelectDate = (value) => { ...@@ -639,28 +507,28 @@ const handleSelectDate = (value) => {
} }
} }
// 实体国家地区 // 物项类别
const countryList = ref([ const typeList = ref([
{ {
name: '全部国家', name: '全部类别',
id: '全部国家' id: '全部类别'
}, },
]) ])
const selectedCountry = ref('全部国家') const selectedType = ref('全部类别')
const countryPlaceHolder = ref('请选择实体国家') const typePlaceHolder = ref('请选择物项类别')
const handleSelectCountry = value => { const handleSelectType = value => {
selectedCountry.value = value selectedType.value = value
} }
// 获取国家地区列表 // 获取国家地区列表
const handleGetCountryList = async () => { const handleGetMaterialCategory = async () => {
try { try {
const res = await getCountryList() const res = await getMaterialCategory()
console.log('获取国家列表', res); console.log('获取物项类别', res);
if (res.code === 200 && res.data) { if (res && res.length) {
countryList.value = res.data.map(item => { typeList.value = res.map(item => {
return { return {
name: item.name, name: item,
id: item.id id: item
} }
}) })
} }
...@@ -670,86 +538,50 @@ const handleGetCountryList = async () => { ...@@ -670,86 +538,50 @@ const handleGetCountryList = async () => {
} }
// 实体省份(仅支持中国省份) // 管控原因
const provinceList = ref([ const controlReasonList = ref([
{ {
name: '全部省份', name: '全部管控原因',
id: '全部省份', id: '全部管控原因',
} }
]) ])
const selectedProvince = ref('全部省份') const selectedControlReason = ref('全部管控原因')
const provincePlaceHolder = ref('请选择发布机构') const controlReasonPlaceHolder = ref('请选择管控原因')
const handleSelectProvince = value => { const handleSelectControlReason = value => {
selectedProvince.value = value selectedControlReason.value = value
} }
// 获取全部省份列表 // 获取管控原因列表
const handleGetProvinceList = async () => { const handleGetControlReason = async () => {
try { try {
const res = await getProvinceList() const res = await getControlReason()
console.log('获取省份列表', res); console.log('获取管控原因', res);
if (res && res.length) { if (res && res.length) {
provinceList.value = res.map(item => { controlReasonList.value = res.map(item => {
return { return {
name: item, name: item,
id: item id: item
} }
}) })
} }
} catch (error) { } catch (error) {
console.error(error);
} finally {
} }
} }
// 实体类型列表 // 物项名称
const entityTypeList = ref([ const categoryName = ref('')
{ const handleInputCategoryName = value => {
name: '全部实体类型', categoryName.value = value
id: '全部实体类型'
}
])
const selectedEntityType = ref('全部实体类型')
const entityTypePlaceHolder = ref('请选择实体类型')
const handleSelectEntityType = value => {
selectedEntityType.value = value
}
// 获取实体类型列表
const handleGetEntityTypes = async () => {
try {
const res = await getEntityTypes()
console.log('获取实体类型列表');
if (res.code === 200 && res.data) {
entityTypeList.value = res.data.map(item => {
return {
name: item.name,
id: item.code
}
})
}
} catch (error) {
}
} }
// 是否50%规则
const isHalfRule = ref(false)
// 是否只看中国实体
const isCnEntityOnly = ref(false)
// 清空条件 // 清空条件
const handleClear = () => { const handleClear = () => {
selectedArea.value = '全部领域' selectedArea.value = '全部领域'
selectedDate.value = '' selectedDate.value = ''
customTime.value = [] customTime.value = []
selectedCountry.value = '全部国家' selectedType.value = '全部类别'
selectedProvince.value = '全部省份' selectedControlReason.value = '全部管控原因'
selectedEntityType.value = '全部实体类型' categoryName.value = ''
isHalfRule.value = false
isCnEntityOnly.value = false
ElMessage.success('已清空条件!') ElMessage.success('已清空条件!')
} }
...@@ -804,16 +636,13 @@ const fetchTableData = async () => { ...@@ -804,16 +636,13 @@ const fetchTableData = async () => {
const params = { const params = {
page: currentPage.value, page: currentPage.value,
size: pageSize.value, size: pageSize.value,
// keyword: '', type: 13, // 商业管制清单
type: 10, // 实体清单
domains: selectedArea.value === '全部领域' ? null : [selectedArea.value], // 科技领域 domains: selectedArea.value === '全部领域' ? null : [selectedArea.value], // 科技领域
proposedDateStart: customTime.value[0] ? customTime.value[0] : null, proposedDateStart: customTime.value[0] ? customTime.value[0] : null,
proposedDateEnd: customTime.value[1] ? customTime.value[1] : null, proposedDateEnd: customTime.value[1] ? customTime.value[1] : null,
countryId: selectedCountry.value === '全部国家' ? null : selectedCountry.value, // 国家地区 materialCategory: selectedType.value === '全部类别' ? null : selectedType.value, // 物项类别
provinceName: selectedProvince.value === '全部省份' ? null : selectedProvince.value, // 实体省份 controlReason: selectedControlReason.value === '全部管控原因' ? null : selectedControlReason.value, // 管控原因
entityTypeCode: selectedEntityType.value === '全部实体类型' ? null : selectedEntityType.value, // 实体类别 materialNameZh: categoryName.value ? categoryName.value : null, // 物项名称
ratio: isHalfRule.value ? 'Y' : null, // 50%规则
isInvolveCn: isCnEntityOnly.value ? 'Y' : null, // 是否只看中国实体
sort: isSort.value ? 0 : 1 // 0 先按分数降序 后按时间降序 1 先按分数降序,再按时间升序 sort: isSort.value ? 0 : 1 // 0 先按分数降序 后按时间降序 1 先按分数降序,再按时间升序
} }
try { try {
...@@ -838,19 +667,12 @@ const fetchTableData = async () => { ...@@ -838,19 +667,12 @@ const fetchTableData = async () => {
name: key, name: key,
value: Number(value) value: Number(value)
})) }))
staticsDemensionList.value[2].data = Object.entries(res.data.aggregationSentityTypeCode).map(([key, value]) => ({ staticsDemensionList.value[2].data = Object.entries(res.data.aggregationMaterialCategory).map(([key, value]) => ({
name: key,
value: Number(value)
}))
staticsDemensionList.value[3].data = Object.entries(res.data.aggregationCountryId).map(([key, value]) => ({
name: key,
value: Number(value)
}))
staticsDemensionList.value[4].data = Object.entries(res.data.aggregationProvinceName).map(([key, value]) => ({
name: key, name: key,
value: Number(value) value: Number(value)
})) }))
} }
const curDemensionItem = staticsDemensionList.value.filter(item => { const curDemensionItem = staticsDemensionList.value.filter(item => {
...@@ -861,7 +683,17 @@ const fetchTableData = async () => { ...@@ -861,7 +683,17 @@ const fetchTableData = async () => {
setTimeout(() => { setTimeout(() => {
activeChart.value = curDemensionItem.chartTypeList[0] activeChart.value = curDemensionItem.chartTypeList[0]
curChartData.value = curDemensionItem.data if (curDemension.value === '制裁时间') {
if (selectedTime.value === '按月度统计') {
curChartData.value = curDemensionItem.data
} else if (selectedTime.value === '按季度统计') {
curChartData.value = curDemensionItem.quatarData
} else {
curChartData.value = curDemensionItem.yearData
}
} else {
curChartData.value = curDemensionItem.data
}
}) })
loading.value = false loading.value = false
} catch (error) { } catch (error) {
...@@ -886,15 +718,13 @@ const fetchAllData = async () => { ...@@ -886,15 +718,13 @@ const fetchAllData = async () => {
const params = { const params = {
page: 1, page: 1,
size: 9999, size: 9999,
type: 10, // 实体清单 type: 13, // 商业管制清单
domains: selectedArea.value === '全部领域' ? null : [selectedArea.value], // 科技领域 domains: selectedArea.value === '全部领域' ? null : [selectedArea.value], // 科技领域
proposedDateStart: customTime.value[0] ? customTime.value[0] : null, proposedDateStart: customTime.value[0] ? customTime.value[0] : null,
proposedDateEnd: customTime.value[1] ? customTime.value[1] : null, proposedDateEnd: customTime.value[1] ? customTime.value[1] : null,
countryId: selectedCountry.value === '全部国家' ? null : selectedCountry.value, // 国家地区 materialCategory: selectedType.value === '全部类别' ? null : selectedType.value, // 物项类别
provinceName: selectedProvince.value === '全部省份' ? null : selectedProvince.value, // 实体省份 controlReason: selectedControlReason.value === '全部管控原因' ? null : selectedControlReason.value, // 管控原因
entityTypeCode: selectedEntityType.value === '全部实体类型' ? null : selectedEntityType.value, // 实体类别 materialNameZh: categoryName.value ? categoryName.value : null, // 物项名称
ratio: isHalfRule.value ? 'Y' : null, // 50%规则
isInvolveCn: isCnEntityOnly.value ? 'Y' : null, // 是否只看中国实体
sort: isSort.value ? 0 : 1 // 0 先按分数降序 后按时间降序 1 先按分数降序,再按时间升序 sort: isSort.value ? 0 : 1 // 0 先按分数降序 后按时间降序 1 先按分数降序,再按时间升序
} }
try { try {
...@@ -1052,49 +882,38 @@ const initParam = () => { ...@@ -1052,49 +882,38 @@ const initParam = () => {
customTime.value = JSON.parse(route.query.selectedDate) customTime.value = JSON.parse(route.query.selectedDate)
} }
selectedProvince.value = route.query.selectedProvince ? provinceList.value.filter(item => item.name.indexOf(route.query.selectedProvince) > -1)[0].name : '全部省份' selectedType.value = route.query.orgnizationName ? route.query.orgnizationName : '全部类别'
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 ? entityTypeList.value.filter(item => item.name === route.query.selectedEntityType)[0].id : '全部实体类型'
const query = route.query; const query = route.query;
if (Object.keys(query).length > 0) { if (Object.keys(query).length > 0) {
sessionStorage.setItem('entityRouteQuery', JSON.stringify(query)); sessionStorage.setItem('commerceRouteQuery', JSON.stringify(query));
} }
} else { } else {
const savedQuery = JSON.parse(sessionStorage.getItem('entityRouteQuery') || '{}'); const savedQuery = JSON.parse(sessionStorage.getItem('commerceRouteQuery') || '{}');
selectedArea.value = savedQuery.domains ? savedQuery.domains : '全部领域' selectedArea.value = savedQuery.domains ? savedQuery.domains : '全部领域'
if (savedQuery.selectedDate && Array.isArray(JSON.parse(savedQuery.selectedDate)) && JSON.parse(savedQuery.selectedDate).length) { if (savedQuery.selectedDate && Array.isArray(JSON.parse(savedQuery.selectedDate)) && JSON.parse(savedQuery.selectedDate).length) {
selectedDate.value = '自定义' selectedDate.value = '自定义'
customTime.value = JSON.parse(savedQuery.selectedDate) 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 ? entityTypeList.value.filter(item => item.name === savedQuery.selectedEntityType)[0].id : '全部实体类型'
} }
} }
// 跳转机构详情 // 跳转政令详情
const handleClickToDetail = (curEntity) => { const handleClickToDetail = (curDecree) => {
console.log('curEntity', curEntity); console.log('curDecree', curDecree);
window.sessionStorage.setItem("decreeId", curEntity.id); window.sessionStorage.setItem("decreeId", curDecree.id);
window.sessionStorage.setItem("curTabName", curEntity.title); window.sessionStorage.setItem("curTabName", curDecree.title);
const route = router.resolve({ const route = router.resolve({
name: "companyPages", path: "/decreeLayout",
params: { query: {
id: curEntity.id id: curDecree.id
} }
}); });
window.open(route.href, "_blank"); window.open(route.href, "_blank");
}; };
...@@ -1133,9 +952,9 @@ const handleExport = () => { ...@@ -1133,9 +952,9 @@ const handleExport = () => {
}; };
onMounted(async () => { onMounted(async () => {
await handleGetProvinceList() // 获取省份列表
await handleGetCountryList() // 获取国家列表 handleGetMaterialCategory() // 获取物项类别列表
await handleGetEntityTypes() // 获取实体类型列表 handleGetControlReason() // 获取管控原因
initParam() initParam()
// 初始化 // 初始化
await fetchTableData() await fetchTableData()
...@@ -1207,9 +1026,17 @@ onMounted(async () => { ...@@ -1207,9 +1026,17 @@ onMounted(async () => {
} }
.chart-main-box { .chart-main-box {
width: 1568px;
height: 809px;
margin: 0 auto;
background: rgba(255, 255, 255);
border: 1px solid var(--bg-black-5);
border-radius: 10px;
.info-box { .info-box {
margin: 0 auto; margin: 0 auto;
width: 1568px; margin-top: 16px;
width: 1520px;
height: 30px; height: 30px;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
...@@ -1219,6 +1046,11 @@ onMounted(async () => { ...@@ -1219,6 +1046,11 @@ onMounted(async () => {
height: 28px; height: 28px;
border: none; border: none;
cursor: pointer; cursor: pointer;
img {
width: 100%;
height: 100%;
}
} }
.num-box { .num-box {
...@@ -1229,14 +1061,13 @@ onMounted(async () => { ...@@ -1229,14 +1061,13 @@ onMounted(async () => {
.content-box { .content-box {
margin: 0 auto; margin: 0 auto;
margin-top: 16px; margin-top: 16px;
width: 1568px; width: 1520px;
height: 766px; height: 726px;
border-radius: 10px; border: none;
background: rgba(255, 255, 255);
border: 1px solid var(--bg-black-5);
.content-header { .content-header {
margin: 16px 24px; margin: 16px 0;
width: 1520px; width: 1520px;
height: 28px; height: 28px;
} }
...@@ -1269,6 +1100,11 @@ onMounted(async () => { ...@@ -1269,6 +1100,11 @@ onMounted(async () => {
height: 28px; height: 28px;
border: none; border: none;
cursor: pointer; cursor: pointer;
img {
width: 100%;
height: 100%;
}
} }
.num-box { .num-box {
......
...@@ -180,6 +180,7 @@ import BarChart from '../../components/BarChart/index.vue' ...@@ -180,6 +180,7 @@ import BarChart from '../../components/BarChart/index.vue'
import RaderChart from '../../components/RadarChart/idnex.vue' import RaderChart from '../../components/RadarChart/idnex.vue'
import SelectBox from '../../components/SelectBox/index.vue' import SelectBox from '../../components/SelectBox/index.vue'
import DataChartSwitchBox from '../../components/dataChartSwitchBox/index.vue' import DataChartSwitchBox from '../../components/dataChartSwitchBox/index.vue'
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import router from '@/router' import router from '@/router'
...@@ -813,7 +814,7 @@ const fetchTableData = async () => { ...@@ -813,7 +814,7 @@ const fetchTableData = async () => {
provinceName: selectedProvince.value === '全部省份' ? null : selectedProvince.value, // 实体省份 provinceName: selectedProvince.value === '全部省份' ? null : selectedProvince.value, // 实体省份
entityTypeCode: selectedEntityType.value === '全部实体类型' ? null : selectedEntityType.value, // 实体类别 entityTypeCode: selectedEntityType.value === '全部实体类型' ? null : selectedEntityType.value, // 实体类别
ratio: isHalfRule.value ? 'Y' : null, // 50%规则 ratio: isHalfRule.value ? 'Y' : null, // 50%规则
isInvolveCn: isCnEntityOnly.value ? 'Y' : null, // 是否只看中国实体 // isInvolveCn: isCnEntityOnly.value ? 'Y' : null, // 是否只看中国实体
sort: isSort.value ? 0 : 1 // 0 先按分数降序 后按时间降序 1 先按分数降序,再按时间升序 sort: isSort.value ? 0 : 1 // 0 先按分数降序 后按时间降序 1 先按分数降序,再按时间升序
} }
try { try {
...@@ -861,7 +862,17 @@ const fetchTableData = async () => { ...@@ -861,7 +862,17 @@ const fetchTableData = async () => {
setTimeout(() => { setTimeout(() => {
activeChart.value = curDemensionItem.chartTypeList[0] activeChart.value = curDemensionItem.chartTypeList[0]
curChartData.value = curDemensionItem.data if (curDemension.value === '制裁时间') {
if (selectedTime.value === '按月度统计') {
curChartData.value = curDemensionItem.data
} else if (selectedTime.value === '按季度统计') {
curChartData.value = curDemensionItem.quatarData
} else {
curChartData.value = curDemensionItem.yearData
}
} else {
curChartData.value = curDemensionItem.data
}
}) })
loading.value = false loading.value = false
} catch (error) { } catch (error) {
...@@ -894,7 +905,7 @@ const fetchAllData = async () => { ...@@ -894,7 +905,7 @@ const fetchAllData = async () => {
provinceName: selectedProvince.value === '全部省份' ? null : selectedProvince.value, // 实体省份 provinceName: selectedProvince.value === '全部省份' ? null : selectedProvince.value, // 实体省份
entityTypeCode: selectedEntityType.value === '全部实体类型' ? null : selectedEntityType.value, // 实体类别 entityTypeCode: selectedEntityType.value === '全部实体类型' ? null : selectedEntityType.value, // 实体类别
ratio: isHalfRule.value ? 'Y' : null, // 50%规则 ratio: isHalfRule.value ? 'Y' : null, // 50%规则
isInvolveCn: isCnEntityOnly.value ? 'Y' : null, // 是否只看中国实体 // isInvolveCn: isCnEntityOnly.value ? 'Y' : null, // 是否只看中国实体
sort: isSort.value ? 0 : 1 // 0 先按分数降序 后按时间降序 1 先按分数降序,再按时间升序 sort: isSort.value ? 0 : 1 // 0 先按分数降序 后按时间降序 1 先按分数降序,再按时间升序
} }
try { try {
...@@ -1053,11 +1064,16 @@ const initParam = () => { ...@@ -1053,11 +1064,16 @@ const initParam = () => {
} }
selectedProvince.value = route.query.selectedProvince ? provinceList.value.filter(item => item.name.indexOf(route.query.selectedProvince) > -1)[0].name : '全部省份' 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
isHalfRule.value = route.query.isHalfRule === 'true' ? true : false
isCnEntityOnly.value = route.query.isCnEntityOnly ? true : false isCnEntityOnly.value = route.query.isCnEntityOnly ? true : false
if (isCnEntityOnly.value) {
selectedCountry.value = '0101'
} else {
selectedCountry.value = route.query.selectedCountryId ? route.query.selectedCountryId : '全部国家'
}
selectedEntityType.value = route.query.selectedEntityType ? entityTypeList.value.filter(item => item.name === route.query.selectedEntityType)[0].id : '全部实体类型' selectedEntityType.value = route.query.selectedEntityType ? entityTypeList.value.filter(item => item.name === route.query.selectedEntityType)[0].id : '全部实体类型'
...@@ -1072,17 +1088,32 @@ const initParam = () => { ...@@ -1072,17 +1088,32 @@ const initParam = () => {
selectedDate.value = '自定义' selectedDate.value = '自定义'
customTime.value = JSON.parse(savedQuery.selectedDate) customTime.value = JSON.parse(savedQuery.selectedDate)
} }
isHalfRule.value = savedQuery.isHalfRule ? true : false isHalfRule.value = savedQuery.isHalfRule === 'true' ? true : false
selectedProvince.value = savedQuery.selectedProvince ? provinceList.value.filter(item => item.name.indexOf(savedQuery.selectedProvince) > -1)[0].name : '全部省份' 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 isCnEntityOnly.value = savedQuery.isCnEntityOnly ? true : false
if (isCnEntityOnly.value) {
selectedCountry.value = '0101'
} else {
selectedCountry.value = route.query.selectedCountryId ? route.query.selectedCountryId : '全部国家'
}
selectedEntityType.value = savedQuery.selectedEntityType ? entityTypeList.value.filter(item => item.name === savedQuery.selectedEntityType)[0].id : '全部实体类型' selectedEntityType.value = savedQuery.selectedEntityType ? entityTypeList.value.filter(item => item.name === savedQuery.selectedEntityType)[0].id : '全部实体类型'
} }
} }
watch(
() => isCnEntityOnly.value,
val => {
if (val) {
selectedCountry.value = '0101'
} else {
selectedCountry.value = '全部国家'
}
}
)
// 跳转机构详情 // 跳转机构详情
const handleClickToDetail = (curEntity) => { const handleClickToDetail = (curEntity) => {
console.log('curEntity', curEntity); console.log('curEntity', curEntity);
...@@ -1090,11 +1121,11 @@ const handleClickToDetail = (curEntity) => { ...@@ -1090,11 +1121,11 @@ const handleClickToDetail = (curEntity) => {
window.sessionStorage.setItem("decreeId", curEntity.id); window.sessionStorage.setItem("decreeId", curEntity.id);
window.sessionStorage.setItem("curTabName", curEntity.title); window.sessionStorage.setItem("curTabName", curEntity.title);
const route = router.resolve({ const route = router.resolve({
name: "companyPages", name: "companyPages",
params: { params: {
id: curEntity.id id: curEntity.id
} }
}); });
window.open(route.href, "_blank"); window.open(route.href, "_blank");
}; };
...@@ -1207,9 +1238,17 @@ onMounted(async () => { ...@@ -1207,9 +1238,17 @@ onMounted(async () => {
} }
.chart-main-box { .chart-main-box {
width: 1568px;
height: 809px;
margin: 0 auto;
background: rgba(255, 255, 255);
border: 1px solid var(--bg-black-5);
border-radius: 10px;
.info-box { .info-box {
margin: 0 auto; margin: 0 auto;
width: 1568px; margin-top: 16px;
width: 1520px;
height: 30px; height: 30px;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
...@@ -1229,14 +1268,13 @@ onMounted(async () => { ...@@ -1229,14 +1268,13 @@ onMounted(async () => {
.content-box { .content-box {
margin: 0 auto; margin: 0 auto;
margin-top: 16px; margin-top: 16px;
width: 1568px; width: 1520px;
height: 766px; height: 726px;
border-radius: 10px; border: none;
background: rgba(255, 255, 255);
border: 1px solid var(--bg-black-5);
.content-header { .content-header {
margin: 16px 24px; margin: 16px 0;
width: 1520px; width: 1520px;
height: 28px; height: 28px;
} }
......
...@@ -1213,4 +1213,6 @@ onMounted(async () => { ...@@ -1213,4 +1213,6 @@ onMounted(async () => {
// :deep(.el-table__header th:first-child) { // :deep(.el-table__header th:first-child) {
// background-color: #e6f7ff; // background-color: #e6f7ff;
// color: #1890ff; // color: #1890ff;
// }</style> // }
\ No newline at end of file </style>
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<div class="sub-title">{{ subtitle }}</div> <div class="sub-title">{{ subtitle }}</div>
</div> </div>
<div class="description">{{ description }}</div> <div class="description">{{ description }}</div>
<div v-if="quantity > 0" class="quantity" :style="{ color: color }"> <div v-if="quantity > 0" class="quantity" :style="{ color: color }" @click.stop="handleClickNum(title)">
{{ quantity }}{{ unit || "个" }} {{ quantity }}{{ unit || "个" }}
<div class="quantity-title-des" v-if="desMap[title]"> <div class="quantity-title-des" v-if="desMap[title]">
<img class="info-icon" :src="infoIcon" alt="" /> <img class="info-icon" :src="infoIcon" alt="" />
...@@ -20,6 +20,28 @@ ...@@ -20,6 +20,28 @@
<script setup> <script setup>
import infoIcon from "../assets/icons/info-icon.png"; import infoIcon from "../assets/icons/info-icon.png";
import { useRouter } from "vue-router";
const router = useRouter()
const emits = defineEmits(['num-click'])
const handleClickNum = (item) => {
if (item === '实体清单') {
const route = router.resolve({
path: "/dataLibrary/dataEntityList",
query: {
isCnEntityOnly: true
}
});
window.open(route.href, "_blank");
} else if (item === '商业管制清单') {
const route = router.resolve({
path: "/dataLibrary/dataCommerceControlList",
});
window.open(route.href, "_blank");
}
}
defineProps({ defineProps({
title: { title: {
type: String, type: String,
...@@ -135,6 +157,7 @@ const desMap = { ...@@ -135,6 +157,7 @@ const desMap = {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: flex-end; align-items: flex-end;
.quantity-title-des { .quantity-title-des {
display: flex; display: flex;
align-items: center; align-items: center;
...@@ -143,6 +166,7 @@ const desMap = { ...@@ -143,6 +166,7 @@ const desMap = {
font-weight: 400; font-weight: 400;
color: rgba(95, 101, 108, 1); color: rgba(95, 101, 108, 1);
line-height: 1.4; line-height: 1.4;
.info-icon { .info-icon {
width: 16px; width: 16px;
height: 16px; height: 16px;
......
...@@ -116,7 +116,7 @@ ...@@ -116,7 +116,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="box1-absolute"> <div class="box1-absolute" @click="handleToDataLibrary(item)">
<div class="box1-absolute-des"> <div class="box1-absolute-des">
<el-icon> <el-icon>
<Warning color="rgba(206, 79, 81, 1)" /> <Warning color="rgba(206, 79, 81, 1)" />
...@@ -867,7 +867,8 @@ const handleTitleClick = item => { ...@@ -867,7 +867,8 @@ const handleTitleClick = item => {
path: "/exportControl/singleSanction", path: "/exportControl/singleSanction",
query: { query: {
id: item.id, id: item.id,
sanTypeId: item.sanTypeId sanTypeId: item.sanTypeId,
date: `${item.year}-${item.dateStr}`
} }
}); });
window.open(route.href, "_blank"); window.open(route.href, "_blank");
...@@ -1765,7 +1766,8 @@ const handleSanc = item => { ...@@ -1765,7 +1766,8 @@ const handleSanc = item => {
path: "/exportControl/singleSanction", path: "/exportControl/singleSanction",
query: { query: {
id: item.id, id: item.id,
sanTypeId: activeResourceTabItem.value.id sanTypeId: activeResourceTabItem.value.id,
date: item.postDate
} }
}); });
window.open(route.href, "_blank"); window.open(route.href, "_blank");
...@@ -1821,7 +1823,7 @@ const handleSearch = () => { ...@@ -1821,7 +1823,7 @@ const handleSearch = () => {
const handleEntityRowClick = row => { const handleEntityRowClick = row => {
console.log("row", row); console.log("row", row);
const params = { const params = {
domains: row.tags[0], // domains: row.tags[0],
selectedDate: JSON.stringify([row.year + "-01-01", row.year + "-12-31"]) selectedDate: JSON.stringify([row.year + "-01-01", row.year + "-12-31"])
}; };
const route = router.resolve({ const route = router.resolve({
...@@ -1835,7 +1837,7 @@ const handleEntityRowClick = row => { ...@@ -1835,7 +1837,7 @@ const handleEntityRowClick = row => {
const handleCommercialRowClick = row => { const handleCommercialRowClick = row => {
console.log("row", row); console.log("row", row);
const params = { const params = {
domains: row.tags[0], // domains: row.tags[0],
selectedDate: JSON.stringify([row.year + "-01-01", row.year + "-12-31"]) selectedDate: JSON.stringify([row.year + "-01-01", row.year + "-12-31"])
}; };
const route = router.resolve({ const route = router.resolve({
...@@ -1861,18 +1863,31 @@ const handleRadarChartClick = value => { ...@@ -1861,18 +1863,31 @@ const handleRadarChartClick = value => {
// 点击制裁清单数量增长趋势 // 点击制裁清单数量增长趋势
const handleMultiBarChartClick = val => { const handleMultiBarChartClick = val => {
// console.log('value', val);
const params = { const params = {
isHalfRule: trendChecked.value,
domains: val.seriesName, domains: val.seriesName,
isCnEntityOnly: true,
selectedDate: JSON.stringify([val.name + "-01-01", val.name + "-12-31"]) selectedDate: JSON.stringify([val.name + "-01-01", val.name + "-12-31"])
}; };
const route = router.resolve({ const route = router.resolve({
path: "/dataLibrary/dataEntityListEvent", path: selectedEntityId.value === 1 ? "/dataLibrary/dataEntityList" : "/dataLibrary/dataCommerceControlList",
query: params query: params
}); });
window.open(route.href, "_blank"); window.open(route.href, "_blank");
}; };
// 跳转到数据资源库
const handleToDataLibrary = (item) => {
const route = router.resolve({
path: "/dataLibrary/dataEntityList",
query: {
isCnEntityOnly: true,
selectedDate: JSON.stringify([item.postDate, item.postDate])
}
});
window.open(route.href, "_blank");
}
onMounted(async () => { onMounted(async () => {
handleGetHylyList(); handleGetHylyList();
let chart1 = getMultiLineChart(chart1Data.value.title, chart1Data.value.data[0].value, chart1Data.value.data[1].value); let chart1 = getMultiLineChart(chart1Data.value.title, chart1Data.value.data[0].value, chart1Data.value.data[1].value);
...@@ -1986,7 +2001,7 @@ const handleMediaClick = item => { ...@@ -1986,7 +2001,7 @@ const handleMediaClick = item => {
padding-right: 50px; padding-right: 50px;
box-sizing: border-box; box-sizing: border-box;
background: linear-gradient(to right, rgba(206, 79, 81, 0), rgba(206, 79, 81, 0.3)); background: linear-gradient(to right, rgba(206, 79, 81, 0), rgba(206, 79, 81, 0.3));
cursor: pointer;
&-des { &-des {
display: flex; display: flex;
gap: 5px; gap: 5px;
......
<template> <template>
<div class="data-statistics"> <div class="data-statistics">
<div class="nav"> <div class="nav">
<div class="nav-item"> <div class="nav-item" @click="handleToDataLibrary">
<div class="item-position"></div> <div class="item-position"></div>
<div class="content"> <div class="content">
<div class="info"> <div class="info">
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="nav-item"> <div class="nav-item" @click="handleToDataLibrary1">
<div class="item-position"></div> <div class="item-position"></div>
<div class="content"> <div class="content">
<div class="info"> <div class="info">
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="nav-item"> <div class="nav-item" @click="handleToDataLibrary2">
<div class="item-position"></div> <div class="item-position"></div>
<div class="content"> <div class="content">
<div class="info"> <div class="info">
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="nav-item"> <div class="nav-item" @click="handleToDataLibrary3(totalCount.latestTime)">
<div class="item-position"></div> <div class="item-position"></div>
<div class="content"> <div class="content">
<div class="info"> <div class="info">
...@@ -412,6 +412,8 @@ const totalCount = ref(0); ...@@ -412,6 +412,8 @@ const totalCount = ref(0);
const getTotalCountData = async () => { const getTotalCountData = async () => {
try { try {
const res = await getTotalCount(sanTypeId.value); const res = await getTotalCount(sanTypeId.value);
console.log('统计', res);
totalCount.value = res.data || 0; totalCount.value = res.data || 0;
} catch (error) { } catch (error) {
console.error("获取实体清单-数据统计-总量统计失败:", error); console.error("获取实体清单-数据统计-总量统计失败:", error);
...@@ -1193,7 +1195,49 @@ const handlePieChartClick1 = val => { ...@@ -1193,7 +1195,49 @@ const handlePieChartClick1 = val => {
query: params query: params
}); });
window.open(route.href, "_blank"); window.open(route.href, "_blank");
}; }
// 跳转到数据资源库
const handleToDataLibrary = () => {
const route = router.resolve({
path: "/dataLibrary/dataEntityList",
query:{
isCnEntityOnly: true
}
});
window.open(route.href, "_blank");
}
const handleToDataLibrary1 = () => {
const route = router.resolve({
path: "/dataLibrary/dataEntityList",
query:{
isCnEntityOnly: true,
isHalfRule: true
}
});
window.open(route.href, "_blank");
}
const handleToDataLibrary2 = () => {
const route = router.resolve({
path: "/dataLibrary/dataEntityList",
query:{
selectedDate: JSON.stringify([currentYear+'01-01', currentYear+ '12-31'])
}
});
window.open(route.href, "_blank");
}
const handleToDataLibrary3 = (time) => {
const route = router.resolve({
path: "/dataLibrary/dataEntityList",
query:{
selectedDate: JSON.stringify([time, time])
}
});
window.open(route.href, "_blank");
}
onMounted(() => { onMounted(() => {
sanTypeId.value = route.query.sanTypeId || ""; sanTypeId.value = route.query.sanTypeId || "";
...@@ -1235,6 +1279,10 @@ onMounted(() => { ...@@ -1235,6 +1279,10 @@ onMounted(() => {
background-color: #fff; background-color: #fff;
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1); box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
position: relative; position: relative;
cursor: pointer;
&:hover{
background: var(--color-primary-2);
}
.item-position { .item-position {
position: absolute; position: absolute;
......
...@@ -75,17 +75,9 @@ ...@@ -75,17 +75,9 @@
<AnalysisBox title="实体清单更新历史" :showAllBtn="false"> <AnalysisBox title="实体清单更新历史" :showAllBtn="false">
<template #header-btn> <template #header-btn>
<div class="filters"> <div class="filters">
<el-select <el-select v-model="selectedDomain" placeholder="Select"
v-model="selectedDomain" style="width: 150px; height: 32px; margin-right: 16px">
placeholder="Select" <el-option v-for="item in domainOptions" :key="item.value" :label="item.label" :value="item.value" />
style="width: 150px; height: 32px; margin-right: 16px"
>
<el-option
v-for="item in domainOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
<el-checkbox v-model="onlyChina">只看涉华动态</el-checkbox> <el-checkbox v-model="onlyChina">只看涉华动态</el-checkbox>
</div> </div>
...@@ -99,20 +91,15 @@ ...@@ -99,20 +91,15 @@
<img :src="item.icon || title" alt="" /> <img :src="item.icon || title" alt="" />
<div class="main"> <div class="main">
<div class="main-title" @click="handleClick(item)">{{ item.name }}</div> <div class="main-title" @click="handleClick(item)">{{ item.name }}</div>
<el-tooltip <el-tooltip effect="dark" :content="item.summary" popper-class="common-prompt-popper" placement="top"
effect="dark" :show-after="500">
:content="item.summary"
popper-class="common-prompt-popper"
placement="top"
:show-after="500"
>
<div class="main-desc">{{ item.summary }}</div> <div class="main-desc">{{ item.summary }}</div>
</el-tooltip> </el-tooltip>
<div class="tag-box"> <div class="tag-box">
<div v-for="tag in item.techDomainList" :key="tag" class="tag-item">{{ tag }}</div> <div v-for="tag in item.techDomainList" :key="tag" class="tag-item">{{ tag }}</div>
</div> </div>
<div :class="{ 'count-tag': item.cnEntityCount }"> <div :class="{ 'count-tag': item.cnEntityCount }" @click="handleToDataLibrary">
{{ item.cnEntityCount ? `${item.cnEntityCount}家中国实体` : "" }} {{ item.cnEntityCount ? `${item.cnEntityCount}家中国实体` : "" }}
</div> </div>
</div> </div>
...@@ -120,14 +107,8 @@ ...@@ -120,14 +107,8 @@
</div> </div>
<div class="left-footer"> <div class="left-footer">
<div class="total-count"> {{ totalAll }} </div> <div class="total-count"> {{ totalAll }} </div>
<el-pagination <el-pagination v-model:current-page="currentPageAll" :page-size="pageSizeAll" :total="totalAll"
v-model:current-page="currentPageAll" layout="prev, pager, next" background @current-change="handlePageChangeAll" />
:page-size="pageSizeAll"
:total="totalAll"
layout="prev, pager, next"
background
@current-change="handlePageChangeAll"
/>
</div> </div>
</AnalysisBox> </AnalysisBox>
</div> </div>
...@@ -149,12 +130,8 @@ ...@@ -149,12 +130,8 @@
<span>关键人物</span> <span>关键人物</span>
</div> </div>
<div class="key-person-list"> <div class="key-person-list">
<div <div class="person-item" v-for="(item, index) in publishInfo.personList" :key="index"
class="person-item" @click="handlePerClick(item)">
v-for="(item, index) in publishInfo.personList"
:key="index"
@click="handlePerClick(item)"
>
<img :src="item.imageUrl" alt="" /> <img :src="item.imageUrl" alt="" />
<div class="person-info"> <div class="person-info">
<CommonPrompt :content="item.name"> <CommonPrompt :content="item.name">
...@@ -242,7 +219,8 @@ const handleClick = item => { ...@@ -242,7 +219,8 @@ const handleClick = item => {
path: "/exportControl/singleSanction", path: "/exportControl/singleSanction",
query: { query: {
id: item.id, id: item.id,
sanTypeId: item.sanTypeId || 1 sanTypeId: item.sanTypeId || 1,
date: `${item.year}-${item.date}`
} }
}); });
window.open(route.href, "_blank"); window.open(route.href, "_blank");
...@@ -421,6 +399,30 @@ const getEntityInfoFn = async id => { ...@@ -421,6 +399,30 @@ const getEntityInfoFn = async id => {
}; };
const sanTypeId = ref(""); const sanTypeId = ref("");
// 跳转到数据资源库
const handleToDataLibrary = () => {
let domainStr = domainOptions.filter(item => item.value === selectedDomain.value)[0].label
let params
if (domainStr === '全部领域') {
params = {
isCnEntityOnly: true,
}
} else {
params = {
isCnEntityOnly: true,
domains: domainStr
};
}
const route = router.resolve({
path: "/dataLibrary/dataEntityList",
query: params
});
window.open(route.href, "_blank");
}
onMounted(() => { onMounted(() => {
sanTypeId.value = route.query.sanTypeId; sanTypeId.value = route.query.sanTypeId;
// 获取实体清单基本信息 // 获取实体清单基本信息
......
...@@ -17,47 +17,27 @@ ...@@ -17,47 +17,27 @@
<div class="text">科技领域</div> <div class="text">科技领域</div>
</div> </div>
<div class="checkbox-group"> <div class="checkbox-group">
<el-checkbox <el-checkbox v-for="(item, index) in techFields" :key="index" v-model="item.checked" :label="item.label"
v-for="(item, index) in techFields" @change="handleFilterChange(item, techFields, 'tech')" />
:key="index"
v-model="item.checked"
:label="item.label"
@change="handleFilterChange(item, techFields, 'tech')"
/>
</div> </div>
<div class="title"> <div class="title">
<div class="box"></div> <div class="box"></div>
<div class="text">实体类型</div> <div class="text">实体类型</div>
</div> </div>
<div class="checkbox-group"> <div class="checkbox-group">
<el-checkbox <el-checkbox v-for="(item, index) in entityTypes" :key="index" v-model="item.checked" :label="item.label"
v-for="(item, index) in entityTypes" @change="handleFilterChange(item, entityTypes, 'type')" />
:key="index"
v-model="item.checked"
:label="item.label"
@change="handleFilterChange(item, entityTypes, 'type')"
/>
</div> </div>
<div class="title"> <div class="title">
<div class="box"></div> <div class="box"></div>
<div class="text">制裁时间</div> <div class="text">制裁时间</div>
</div> </div>
<div class="checkbox-group"> <div class="checkbox-group">
<el-checkbox <el-checkbox v-for="(item, index) in sanctionTimes" :key="index" v-model="item.checked" :label="item.label"
v-for="(item, index) in sanctionTimes" @change="handleFilterChange(item, sanctionTimes, 'time')" />
:key="index"
v-model="item.checked"
:label="item.label"
@change="handleFilterChange(item, sanctionTimes, 'time')"
/>
<div v-if="sanctionTimes.find(i => i.value === 'custom' && i.checked)" class="custom-date-picker"> <div v-if="sanctionTimes.find(i => i.value === 'custom' && i.checked)" class="custom-date-picker">
<el-date-picker <el-date-picker v-model="customDateRange" type="daterange" range-separator="-" start-placeholder="开始日期"
v-model="customDateRange" end-placeholder="结束日期" />
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</div> </div>
</div> </div>
</div> </div>
...@@ -96,9 +76,9 @@ ...@@ -96,9 +76,9 @@
<CommonPrompt :content="row.entityNameZh || row.entityName" style="flex: 1; overflow: hidden" /> <CommonPrompt :content="row.entityNameZh || row.entityName" style="flex: 1; overflow: hidden" />
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="涉及领域" min-width="150"> <el-table-column label="涉及领域" min-width="150">
<template #default="{ row }"> <template #default="{ row }">
<div class="domain-cell"> <div class="domain-cell">
<el-tag v-for="tag in row.techDomains" :key="tag" class="domain-tag" effect="plain" <el-tag v-for="tag in row.techDomains" :key="tag" class="domain-tag" effect="plain"
:disable-transitions="true" :style="getTagStyle(tag)"> :disable-transitions="true" :style="getTagStyle(tag)">
...@@ -106,10 +86,10 @@ ...@@ -106,10 +86,10 @@
</el-tag> </el-tag>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="startTime" label="制裁时间" width="140" show-overflow-tooltip align="center" /> <el-table-column prop="startTime" label="制裁时间" width="140" show-overflow-tooltip align="center" />
<el-table-column label="50%规则子企业" min-width="280" show-overflow-tooltip align="right"> <el-table-column label="50%规则子企业" min-width="280" show-overflow-tooltip align="right">
<template #default="{ row }"> <template #default="{ row }">
<div class="rule-cell" v-if="row.ruleOrgCount > 0"> <div class="rule-cell" v-if="row.ruleOrgCount > 0">
<div class="rule-text" :title="row.ruleOrgList?.[0]?.orgName || ''"> <div class="rule-text" :title="row.ruleOrgList?.[0]?.orgName || ''">
{{ row.ruleOrgList?.[0]?.orgName || '' }}...等 {{ row.ruleOrgList?.[0]?.orgName || '' }}...等
...@@ -118,34 +98,29 @@ ...@@ -118,34 +98,29 @@
row.ruleOrgCount }}家 ></el-link> row.ruleOrgCount }}家 ></el-link>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
<div class="tight-footer"> <div class="tight-footer">
<div class="total-text">共 {{ total }} 项</div> <div class="total-text">共 {{ total }} 项</div>
<el-pagination :current-page="currentPage" v-model:page-size="pageSize" :total="total" layout="prev, pager, next" <el-pagination :current-page="currentPage" v-model:page-size="pageSize" :total="total" layout="prev, pager, next"
prev-text="<" next-text=">" @current-change="handleCurrentChange" /> prev-text="<" next-text=">" @current-change="handleCurrentChange" />
</div> --> </div> -->
<AnalysisBox title="实体清单" :showAllBtn="false"> <AnalysisBox title="实体清单" :showAllBtn="false">
<template #header-btn> <template #header-btn>
<div class="stats"> <div class="stats">
<div class="dot"></div> <div class="dot"></div>
<div class="count-text"> <div class="count-text">
<span class="highlight">{{ ruleCount.totalCount }}</span> <span class="highlight" @click="handlToDataLibrary">{{ ruleCount.totalCount }}</span>
</div> </div>
<div class="rule-text"> <div class="rule-text">
(50%规则涉及<span class="highlight">{{ ruleCount.ruleCount }}</span (50%规则涉及<span class="highlight" @click="handlToDataLibrary1">{{ ruleCount.ruleCount }}</span>家)
>家)
</div> </div>
</div> </div>
</template> </template>
<div class="right-table"> <div class="right-table">
<el-table <el-table :data="entityRows" table-layout="fixed" :row-class-name="tableRowClassName"
:data="entityRows" :header-cell-style="{ background: '#fff' }">
table-layout="fixed"
:row-class-name="tableRowClassName"
:header-cell-style="{ background: '#fff' }"
>
<el-table-column label="实体名称" min-width="200"> <el-table-column label="实体名称" min-width="200">
<template #default="{ row }"> <template #default="{ row }">
<div class="entity-name-cell" @click="handleCompClick(row)"> <div class="entity-name-cell" @click="handleCompClick(row)">
...@@ -153,56 +128,30 @@ ...@@ -153,56 +128,30 @@
<div v-else class="avatar-undefined"> <div v-else class="avatar-undefined">
{{ (row.entityNameZh || row.entityName)?.match(/[\u4e00-\u9fa5a-zA-Z0-9]/)?.[0] }} {{ (row.entityNameZh || row.entityName)?.match(/[\u4e00-\u9fa5a-zA-Z0-9]/)?.[0] }}
</div> </div>
<CommonPrompt <CommonPrompt :content="row.entityNameZh || row.entityName" style="flex: 1; overflow: hidden" />
:content="row.entityNameZh || row.entityName"
style="flex: 1; overflow: hidden"
/>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="涉及领域" min-width="150"> <el-table-column label="涉及领域" min-width="150">
<template #default="{ row }"> <template #default="{ row }">
<div class="domain-cell"> <div class="domain-cell">
<el-tag <el-tag v-for="tag in row.techDomains" :key="tag" class="domain-tag" effect="plain"
v-for="tag in row.techDomains" :disable-transitions="true" :style="getTagStyle(tag)">
:key="tag"
class="domain-tag"
effect="plain"
:disable-transitions="true"
:style="getTagStyle(tag)"
>
{{ tag }} {{ tag }}
</el-tag> </el-tag>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column prop="listingLocation" label="上市地点" width="140" show-overflow-tooltip align="center" />
prop="listingLocation" <el-table-column prop="startTime" label="制裁时间" width="140" show-overflow-tooltip align="center" />
label="上市地点"
width="140"
show-overflow-tooltip
align="center"
/>
<el-table-column
prop="startTime"
label="制裁时间"
width="140"
show-overflow-tooltip
align="center"
/>
<el-table-column label="50%规则子企业" min-width="280" show-overflow-tooltip align="right"> <el-table-column label="50%规则子企业" min-width="280" show-overflow-tooltip align="right">
<template #default="{ row }"> <template #default="{ row }">
<div class="rule-cell" v-if="row.ruleOrgCount > 0"> <div class="rule-cell" v-if="row.ruleOrgCount > 0">
<div class="rule-text" :title="row.ruleOrgList?.[0]?.orgName || ''"> <div class="rule-text" :title="row.ruleOrgList?.[0]?.orgName || ''">
{{ row.ruleOrgList?.[0]?.orgName || "" }}...等 {{ row.ruleOrgList?.[0]?.orgName || "" }}...等
</div> </div>
<el-link <el-link class="rule-link" type="primary" :underline="false" @click="handleRuleClick(row)">{{
class="rule-link" row.ruleOrgCount }}家 ></el-link>
type="primary"
:underline="false"
@click="handleRuleClick(row)"
>{{ row.ruleOrgCount }}家 ></el-link
>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
...@@ -210,26 +159,15 @@ ...@@ -210,26 +159,15 @@
</div> </div>
<div class="tight-footer"> <div class="tight-footer">
<div class="total-text">共 {{ total }} 项</div> <div class="total-text">共 {{ total }} 项</div>
<el-pagination <el-pagination :current-page="currentPage" v-model:page-size="pageSize" :total="total"
:current-page="currentPage" layout="prev, pager, next" prev-text="<" next-text=">" @current-change="handleCurrentChange" />
v-model:page-size="pageSize"
:total="total"
layout="prev, pager, next"
prev-text="<"
next-text=">"
@current-change="handleCurrentChange"
/>
</div> </div>
</AnalysisBox> </AnalysisBox>
</div> </div>
</div> </div>
</div> </div>
<RuleSubsidiaryDialog <RuleSubsidiaryDialog v-model="ruleDialogVisible" :company-name="currentRuleCompany" :total-count="currentRuleCount"
v-model="ruleDialogVisible" :data-list="currentRuleList" />
:company-name="currentRuleCompany"
:total-count="currentRuleCount"
:data-list="currentRuleList"
/>
</div> </div>
</template> </template>
...@@ -414,7 +352,7 @@ const getExportControlListApi = async () => { ...@@ -414,7 +352,7 @@ const getExportControlListApi = async () => {
if (abortController) { if (abortController) {
try { try {
abortController.abort(); abortController.abort();
} catch {} } catch { }
} }
abortController = new AbortController(); abortController = new AbortController();
isFetching.value = true; isFetching.value = true;
...@@ -526,6 +464,30 @@ watch(customDateRange, () => { ...@@ -526,6 +464,30 @@ watch(customDateRange, () => {
getExportControlListApi(); getExportControlListApi();
} }
}); });
// 跳转到数据资源库
const handlToDataLibrary = () => {
const params = {
isCnEntityOnly: true,
};
const route = router.resolve({
path: "/dataLibrary/dataEntityList",
query: params
});
window.open(route.href, "_blank");
}
const handlToDataLibrary1 = () => {
const params = {
isCnEntityOnly: true,
isHalfRule: true,
};
const route = router.resolve({
path: "/dataLibrary/dataEntityList",
query: params
});
window.open(route.href, "_blank");
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
...@@ -577,6 +539,7 @@ watch(customDateRange, () => { ...@@ -577,6 +539,7 @@ watch(customDateRange, () => {
width: 160px; width: 160px;
height: 32px; height: 32px;
} }
:deep(.el-checkbox__label) { :deep(.el-checkbox__label) {
font-size: 14px; font-size: 14px;
color: rgb(95, 101, 108); color: rgb(95, 101, 108);
...@@ -729,6 +692,7 @@ watch(customDateRange, () => { ...@@ -729,6 +692,7 @@ watch(customDateRange, () => {
.highlight { .highlight {
color: #cd4246; color: #cd4246;
margin: 0 4px; margin: 0 4px;
} }
} }
...@@ -1001,6 +965,11 @@ watch(customDateRange, () => { ...@@ -1001,6 +965,11 @@ watch(customDateRange, () => {
.highlight { .highlight {
color: #cd4246; color: #cd4246;
margin: 0 4px; margin: 0 4px;
cursor: pointer;
&:hover {
text-decoration: underline;
}
} }
} }
...@@ -1011,6 +980,11 @@ watch(customDateRange, () => { ...@@ -1011,6 +980,11 @@ watch(customDateRange, () => {
.highlight { .highlight {
color: #cd4246; color: #cd4246;
cursor: pointer;
&:hover {
text-decoration: underline;
}
} }
} }
} }
......
<template> <template>
<div class="data-statistics"> <div class="data-statistics">
<div class="nav"> <div class="nav">
<div class="nav-item"> <div class="nav-item" @click="handleToDataLibrary">
<div class="item-position"></div> <div class="item-position"></div>
<div class="content"> <div class="content">
<div class="info"> <div class="info">
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="nav-item"> <div class="nav-item" @click="handleToDataLibrary1">
<div class="item-position"></div> <div class="item-position"></div>
<div class="content"> <div class="content">
<div class="info"> <div class="info">
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="nav-item"> <div class="nav-item" @click="handleToDataLibrary2">
<div class="item-position"></div> <div class="item-position"></div>
<div class="content"> <div class="content">
<div class="info"> <div class="info">
...@@ -351,6 +351,8 @@ const getTotalCount = async () => { ...@@ -351,6 +351,8 @@ const getTotalCount = async () => {
if (!sanRecordId.value) return; if (!sanRecordId.value) return;
try { try {
const res = await getSingleSanctionTotalCount(route.query.sanTypeId, sanRecordId.value); const res = await getSingleSanctionTotalCount(route.query.sanTypeId, sanRecordId.value);
console.log('统计', res);
if (res.code === 200) { if (res.code === 200) {
totalCount.value = res.data || {}; totalCount.value = res.data || {};
} }
...@@ -882,7 +884,6 @@ const handlePieChartClick1 = (val) => { ...@@ -882,7 +884,6 @@ const handlePieChartClick1 = (val) => {
// 制裁实体国家地区分布情况 // 制裁实体国家地区分布情况
const handleClickRankChart = (item) => { const handleClickRankChart = (item) => {
// console.log('item', item);
const params = { const params = {
selectedCountryId: item.id, selectedCountryId: item.id,
selectedDate: JSON.stringify([route.query.date, route.query.date]) selectedDate: JSON.stringify([route.query.date, route.query.date])
...@@ -908,6 +909,43 @@ const handleRankChartClick = (item) => { ...@@ -908,6 +909,43 @@ const handleRankChartClick = (item) => {
window.open(curRoute.href, "_blank"); window.open(curRoute.href, "_blank");
} }
// 跳转到数据资源库
const handleToDataLibrary = () => {
const dateStr = route.query.date ? route.query.date : ''
const curRoute = router.resolve({
path: "/dataLibrary/dataEntityList",
query: {
isCnEntityOnly: true,
selectedDate: JSON.stringify([dateStr, dateStr])
}
});
window.open(curRoute.href, "_blank");
}
const handleToDataLibrary1 = () => {
const dateStr = route.query.date ? route.query.date : ''
const curRoute = router.resolve({
path: "/dataLibrary/dataEntityList",
query: {
isCnEntityOnly: true,
isHalfRule: true,
selectedDate: JSON.stringify([dateStr, dateStr])
}
});
window.open(curRoute.href, "_blank");
}
const handleToDataLibrary2 = () => {
const dateStr = route.query.date ? route.query.date : ''
const curRoute = router.resolve({
path: "/dataLibrary/dataEntityList",
query: {
selectedDate: JSON.stringify([dateStr, dateStr])
}
});
window.open(curRoute.href, "_blank");
}
onMounted(() => { onMounted(() => {
// 获取路由参数id // 获取路由参数id
...@@ -957,6 +995,11 @@ onMounted(() => { ...@@ -957,6 +995,11 @@ onMounted(() => {
background-color: #fff; background-color: #fff;
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1); box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
position: relative; position: relative;
cursor: pointer;
&:hover {
background: var(--color-primary-2);
}
.item-position { .item-position {
position: absolute; position: absolute;
......
...@@ -45,17 +45,15 @@ ...@@ -45,17 +45,15 @@
<div class="left-top-content"> <div class="left-top-content">
<div class="content-title">制裁实体分布:</div> <div class="content-title">制裁实体分布:</div>
<div class="distribution-list"> <div class="distribution-list">
<div class="list-item" v-for="(item, index) in entityDistribution" :key="index"> <div class="list-item" v-for="(item, index) in entityDistribution" :key="index"
@click="handleToDataLibrary(item)">
<img :src="item.imageUrl || flag" alt="" class="flag" /> <img :src="item.imageUrl || flag" alt="" class="flag" />
<div class="country-name">{{ item.name }}</div> <div class="country-name">{{ item.name }}</div>
<div class="progress-bar-container"> <div class="progress-bar-container">
<div <div class="progress-bar" :style="{
class="progress-bar" width: item.width,
:style="{ background: item.gradient
width: item.width, }"></div>
background: item.gradient
}"
></div>
</div> </div>
<div class="count" :class="{ highlight: index === 0 }">{{ item.count }}</div> <div class="count" :class="{ highlight: index === 0 }">{{ item.count }}</div>
</div> </div>
...@@ -98,25 +96,13 @@ ...@@ -98,25 +96,13 @@
</div> </div>
<div class="filter-right"> <div class="filter-right">
<el-checkbox v-model="onlyChina" label="只看中国实体" /> <el-checkbox v-model="onlyChina" label="只看中国实体" />
<el-select <el-select v-model="filterField" placeholder="选择领域" style="width: 150px; margin: 0 12px 0 16px">
v-model="filterField"
placeholder="选择领域"
style="width: 150px; margin: 0 12px 0 16px"
>
<!-- <el-option label="全部领域" value="" /> --> <!-- <el-option label="全部领域" value="" /> -->
<el-option <el-option v-for="item in domainOptions" :key="item.value" :label="item.label" :value="item.value" />
v-for="item in domainOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
<el-input <el-input v-model="searchKeyword" placeholder="搜索实体"
v-model="searchKeyword"
placeholder="搜索实体"
style="width: 150px; border: 1px solid rgba(170, 173, 177, 0.4); border-radius: 5px" style="width: 150px; border: 1px solid rgba(170, 173, 177, 0.4); border-radius: 5px"
:suffix-icon="Search" :suffix-icon="Search" />
/>
</div> </div>
</div> </div>
<div class="stats-row"> <div class="stats-row">
...@@ -131,21 +117,14 @@ ...@@ -131,21 +117,14 @@
<div class="stats-info"> <div class="stats-info">
<div class="stat-item"> <div class="stat-item">
<span class="dot red"></span> <span class="dot red"></span>
<span class="text" <span class="text">新增 <span class="num red">{{ addCount }}</span> 家 (50%规则涉及<span class="num red">{{
>新增 <span class="num red">{{ addCount }}</span> 家 (50%规则涉及<span class="num red">{{ addRuleCount
addRuleCount }}</span>家)</span>
}}</span
>家)</span
>
</div> </div>
<div class="stat-item"> <div class="stat-item">
<span class="dot green"></span> <span class="dot green"></span>
<span class="text" <span class="text">移除 <span class="num green">{{ removeCount }}</span> 家 (50%规则涉及<span
>移除 <span class="num green">{{ removeCount }}</span> 家 (50%规则涉及<span class="num green">{{ removeRuleCount }}</span>家)</span>
class="num green"
>{{ removeRuleCount }}</span
>家)</span
>
</div> </div>
</div> </div>
</div> </div>
...@@ -177,11 +156,7 @@ ...@@ -177,11 +156,7 @@
>{{ item }}</span >{{ item }}</span
> --> > -->
<div class="domain-box"> <div class="domain-box">
<AreaTag <AreaTag v-for="(domain, index) in scope.row.fields" :key="index" :tagName="domain" />
v-for="(domain, index) in scope.row.fields"
:key="index"
:tagName="domain"
/>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
...@@ -190,11 +165,8 @@ ...@@ -190,11 +165,8 @@
<el-table-column prop="revenue" label="营收(亿元)" width="110" align="center" /> <el-table-column prop="revenue" label="营收(亿元)" width="110" align="center" />
<el-table-column label="50%规则子企业" width="180" align="center"> <el-table-column label="50%规则子企业" width="180" align="center">
<template #default="scope"> <template #default="scope">
<span <span v-if="scope.row.subsidiaryCount" class="subsidiary-link"
v-if="scope.row.subsidiaryCount" @click="handleSubsidiaryClick(scope.row)">
class="subsidiary-link"
@click="handleSubsidiaryClick(scope.row)"
>
{{ scope.row.subsidiaryText }} {{ scope.row.subsidiaryText }}
<span class="blue-text">{{ scope.row.subsidiaryCount }}家 ></span> <span class="blue-text">{{ scope.row.subsidiaryCount }}家 ></span>
</span> </span>
...@@ -212,12 +184,8 @@ ...@@ -212,12 +184,8 @@
</div> </div>
</div> </div>
<!-- 50%规则子企业弹框 --> <!-- 50%规则子企业弹框 -->
<RuleSubsidiaryDialog <RuleSubsidiaryDialog v-model="subsidiaryDialogVisible" :company-name="currentSubsidiaryCompanyName"
v-model="subsidiaryDialogVisible" :total-count="currentSubsidiaryCount" :data-list="currentSubsidiaryList" />
:company-name="currentSubsidiaryCompanyName"
:total-count="currentSubsidiaryCount"
:data-list="currentSubsidiaryList"
/>
</div> </div>
</template> </template>
...@@ -342,8 +310,8 @@ const getSanctionOverviewList = async () => { ...@@ -342,8 +310,8 @@ const getSanctionOverviewList = async () => {
subsidiaryText: subsidiaryText:
org.ruleOrgList && org.ruleOrgList.length > 0 org.ruleOrgList && org.ruleOrgList.length > 0
? (org.ruleOrgList[0].orgName.length > 10 ? (org.ruleOrgList[0].orgName.length > 10
? org.ruleOrgList[0].orgName.slice(0, 10) + "..." ? org.ruleOrgList[0].orgName.slice(0, 10) + "..."
: org.ruleOrgList[0].orgName) + "...等" : org.ruleOrgList[0].orgName) + "...等"
: "" : ""
})) }))
})); }));
...@@ -555,6 +523,26 @@ const entityDistribution = ref([ ...@@ -555,6 +523,26 @@ const entityDistribution = ref([
} }
]); ]);
const sanTypeId = ref(""); const sanTypeId = ref("");
// 跳转到数据资源库
const handleToDataLibrary = (item) => {
console.log('item', item);
const dateStr = formattedData.value.postDate.replace(/(\d{4})(\d{1,2})(\d{1,2})日/, (_, y, m, d) =>
`${y}-${m.padStart(2, '0')}-${d.padStart(2, '0')}`
);
const route = router.resolve({
path: "/dataLibrary/dataEntityList",
query:{
selectedDate: JSON.stringify([dateStr,dateStr]),
selectedCountryId: item.id
}
});
window.open(route.href, "_blank");
}
onMounted(() => { onMounted(() => {
// 获取路由参数中的sanTypeId // 获取路由参数中的sanTypeId
console.log("route.query.sanTypeId --:", route.query.sanTypeId); console.log("route.query.sanTypeId --:", route.query.sanTypeId);
...@@ -696,6 +684,11 @@ onMounted(() => { ...@@ -696,6 +684,11 @@ onMounted(() => {
display: flex; display: flex;
align-items: center; align-items: center;
height: 24px; height: 24px;
cursor: pointer;
&:hover {
background: var(--color-primary-2);
}
.flag { .flag {
width: 24px; width: 24px;
......
...@@ -247,12 +247,15 @@ const handlePageChange = async newPage => { ...@@ -247,12 +247,15 @@ const handlePageChange = async newPage => {
// ========== 选择某项 ========== // ========== 选择某项 ==========
const selectSanction = async item => { const selectSanction = async item => {
// console.log('item', item);
selectedSanctionId.value = item.id; selectedSanctionId.value = item.id;
router.replace({ router.replace({
path: window.location.pathname, path: window.location.pathname,
query: { query: {
id: item.id, id: item.id,
sanTypeId: item.sanTypeId sanTypeId: item.sanTypeId,
date: item.postDate
} }
}); });
sanctionModalVisible.value = false; sanctionModalVisible.value = false;
...@@ -260,7 +263,7 @@ const selectSanction = async item => { ...@@ -260,7 +263,7 @@ const selectSanction = async item => {
// 根据最新URL参数刷新当前页面 // 根据最新URL参数刷新当前页面
window.sessionStorage.setItem("curTabName", item.postDate + " 《实体清单新增条目》"); window.sessionStorage.setItem("curTabName", item.postDate + " 《实体清单新增条目》");
window.open(`${window.location.pathname}?id=${item.id}&sanTypeId=${item.sanTypeId}`, "_self"); window.open(`${window.location.pathname}?id=${item.id}&sanTypeId=${item.sanTypeId}&date=${item.postDate}`, "_self");
}; };
// ========== 关闭弹窗时重置 ========== // ========== 关闭弹窗时重置 ==========
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<div class="sub-title">{{ subtitle }}</div> <div class="sub-title">{{ subtitle }}</div>
</div> </div>
<div class="description">{{ description }}</div> <div class="description">{{ description }}</div>
<div v-if="quantity > 0" class="quantity" :style="{ color: color }"> <div v-if="quantity > 0" class="quantity" :style="{ color: color }" @click.stop="handleClickNum(title)">
{{ quantity }}{{ unit || "个" }} {{ quantity }}{{ unit || "个" }}
<div class="quantity-title-des" v-if="desMap[title]"> <div class="quantity-title-des" v-if="desMap[title]">
<img class="info-icon" :src="infoIcon" alt="" /> <img class="info-icon" :src="infoIcon" alt="" />
...@@ -20,6 +20,25 @@ ...@@ -20,6 +20,25 @@
<script setup> <script setup>
import infoIcon from "../assets/icons/info-icon.png"; import infoIcon from "../assets/icons/info-icon.png";
import { useRouter } from "vue-router";
const router = useRouter()
const handleClickNum = (item) => {
if (item === '特别指定国民清单') {
const route = router.resolve({
path: "/dataLibrary/sDNList",
// query: {
// isCnEntityOnly: true
// }
});
window.open(route.href, "_blank");
} else if (item === '涉军企业清单') {
const route = router.resolve({
path: "/dataLibrary/mREList",
});
window.open(route.href, "_blank");
}
}
defineProps({ defineProps({
title: { title: {
type: String, type: String,
......
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="box1-absolute"> <div class="box1-absolute" @click="handleToDataLibrary(item)">
<div class="box1-absolute-des"> <div class="box1-absolute-des">
<el-icon> <el-icon>
<Warning color="rgba(206, 79, 81, 1)" /> <Warning color="rgba(206, 79, 81, 1)" />
...@@ -149,7 +149,7 @@ ...@@ -149,7 +149,7 @@
<div class="box3"> <div class="box3">
<div class="box3-content"> <div class="box3-content">
<div class="box3-content-title">特别指定国民清单(SDN)发布频度</div> <div class="box3-content-title">特别指定国民清单(SDN)发布频度</div>
<el-table :data="entityListReleaseFreq" stripe style="width: 100%"> <el-table :data="entityListReleaseFreq" stripe style="width: 100%" @row-click="handleEntityRowClick">
<el-table-column prop="year" label="年份" width="200" /> <el-table-column prop="year" label="年份" width="200" />
<el-table-column label="发布次数" width="300"> <el-table-column label="发布次数" width="300">
<template #default="scope"> <template #default="scope">
...@@ -186,7 +186,7 @@ ...@@ -186,7 +186,7 @@
</div> </div>
<div class="box3-content"> <div class="box3-content">
<div class="box3-content-title">中国军事工业复合体企业清单(CMIC)更新频度</div> <div class="box3-content-title">中国军事工业复合体企业清单(CMIC)更新频度</div>
<el-table :data="commerceControlListReleaseFreq" stripe style="width: 100%; margin-bottom: auto"> <el-table :data="commerceControlListReleaseFreq" stripe style="width: 100%; margin-bottom: auto" @row-click="handleCommercialRowClick">
<el-table-column prop="year" label="年份" width="200" /> <el-table-column prop="year" label="年份" width="200" />
<el-table-column label="发布次数" width="300"> <el-table-column label="发布次数" width="300">
<template #default="scope"> <template #default="scope">
...@@ -257,7 +257,8 @@ ...@@ -257,7 +257,8 @@
<el-checkbox v-model="domainChecked" label="50%规则" size="large" /> <el-checkbox v-model="domainChecked" label="50%规则" size="large" />
</template> </template>
<template #default> <template #default>
<EChart :option="radarOption" autoresize :style="{ height: '420px' }" /> <EChart :option="radarOption" autoresize :style="{ height: '420px' }"
@chart-click="handleRadarChartClick" />
<div class="data-origin-box"> <div class="data-origin-box">
<div class="data-origin-icon"> <div class="data-origin-icon">
<img :src="tipsIcon" alt="" /> <img :src="tipsIcon" alt="" />
...@@ -284,7 +285,8 @@ ...@@ -284,7 +285,8 @@
</div> </div>
</template> </template>
<template #default> <template #default>
<EChart :option="trendOption" autoresize :style="{ height: '420px' }" /> <EChart :option="trendOption" autoresize :style="{ height: '420px' }"
@chart-click="handleMultiBarChartClick" />
<div class="data-origin-box"> <div class="data-origin-box">
<div class="data-origin-icon"> <div class="data-origin-icon">
<img :src="tipsIcon" alt="" /> <img :src="tipsIcon" alt="" />
...@@ -1593,6 +1595,80 @@ const handleSearch = () => { ...@@ -1593,6 +1595,80 @@ const handleSearch = () => {
window.open(curRoute.href, "_blank"); window.open(curRoute.href, "_blank");
}; };
// 点击特别指定国民清单(SDN)发布频度
const handleEntityRowClick = row => {
// console.log("row", row);
const params = {
// domains: row.tags[0],
selectedDate: JSON.stringify([row.year + "-01-01", row.year + "-12-31"])
};
const route = router.resolve({
path: "/dataLibrary/sDNListEvent",
query: params
});
window.open(route.href, "_blank");
};
// 点击中国军事工业复合体企业清单(CMIC)更新频度
const handleCommercialRowClick = row => {
console.log("row", row);
const params = {
selectedDate: JSON.stringify([row.year + "-01-01", row.year + "-12-31"])
};
const route = router.resolve({
path: "/dataLibrary/mREListEvent",
query: params
});
window.open(route.href, "_blank");
};
// 点击制裁领域分布
const handleRadarChartClick = value => {
const params = {
isHalfRule: domainChecked.value
};
let route
if (domainChecked.value) {
route = router.resolve({
path: "/dataLibrary/sDNList",
query: params
});
} else {
route = router.resolve({
path: "/dataLibrary/sDNList",
});
}
window.open(route.href, "_blank");
};
// 点击制裁清单数量增长趋势
const handleMultiBarChartClick = val => {
const params = {
isHalfRule: trendChecked.value,
domains: val.seriesName,
isCnEntityOnly: true,
selectedDate: JSON.stringify([val.name + "-01-01", val.name + "-12-31"])
};
const route = router.resolve({
path: selectedEntityId.value === 2 ? "/dataLibrary/sDNList" : "/dataLibrary/mREList",
query: params
});
window.open(route.href, "_blank");
};
// 跳转到数据资源库
const handleToDataLibrary = (item) => {
const route = router.resolve({
path: "/dataLibrary/sDNList",
query: {
isCnEntityOnly: true,
selectedDate: JSON.stringify([item.postDate, item.postDate])
}
});
window.open(route.href, "_blank");
}
onMounted(async () => { onMounted(async () => {
console.log("finance 页面 mounted"); console.log("finance 页面 mounted");
try { try {
......
...@@ -973,7 +973,7 @@ export const getMultipleBarChart_m = object => { ...@@ -973,7 +973,7 @@ export const getMultipleBarChart_m = object => {
const option = { const option = {
tooltip: { tooltip: {
trigger: "axis", trigger: "item",
axisPointer: { axisPointer: {
type: "shadow" type: "shadow"
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论