提交 fda5d422 authored 作者: huhuiqing's avatar huhuiqing

Merge branch 'master' of http://8.140.26.4:10003/caijian/risk-monitor into dev_hhq

...@@ -247,6 +247,7 @@ const rightList = ref([ ...@@ -247,6 +247,7 @@ const rightList = ref([
width: 100%; width: 100%;
height: 299px; height: 299px;
background: rgb(249, 249, 249); background: rgb(249, 249, 249);
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.3);
display: flex; display: flex;
.left { .left {
margin-top: 35px; margin-top: 35px;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<!-- 公司导航栏 --> <!-- 公司导航栏 -->
<div class="company-nav"> <div class="company-nav">
<div class="company-logo-title"> <div class="company-logo-title">
<img :src="infoData.logoUrl" class="logo-img" /> <img :src="infoData.logoUrl?infoData.logoUrl:defaultCompanyIcon" class="logo-img" />
<div class="title-group"> <div class="title-group">
<h1 class="company-name">{{ infoData.orgName }}</h1> <h1 class="company-name">{{ infoData.orgName }}</h1>
<p class="company-english">{{ infoData.orgNameEn }}</p> <p class="company-english">{{ infoData.orgNameEn }}</p>
...@@ -131,7 +131,7 @@ ...@@ -131,7 +131,7 @@
<div class="personnel-grid"> <div class="personnel-grid">
<div class="personnel-card" v-for="(person, idx) in mainPersonnel" :key="idx"> <div class="personnel-card" v-for="(person, idx) in mainPersonnel" :key="idx">
<div class="personnel-card-header"> <div class="personnel-card-header">
<img :src="person.avatarUrl" class="person-avatar" /> <img :src="person.avatarUrl?person.avatarUrl:defaultUserIcon" class="person-avatar" />
<div class="person-info"> <div class="person-info">
<h4 class="person-name">{{ person.name }}</h4> <h4 class="person-name">{{ person.name }}</h4>
<p class="person-position">{{ person.position }}</p> <p class="person-position">{{ person.position }}</p>
...@@ -193,6 +193,9 @@ import TabIcon2Active from "./images/tab-icon2-active.png"; ...@@ -193,6 +193,9 @@ import TabIcon2Active from "./images/tab-icon2-active.png";
import TabIcon3Active from "./images/tab-icon3-active.png"; import TabIcon3Active from "./images/tab-icon3-active.png";
import TabIcon4Active from "./images/tab-icon4-active.png"; import TabIcon4Active from "./images/tab-icon4-active.png";
import defaultUserIcon from "@/assets/icons/default-icon1.png"
import defaultCompanyIcon from "@/assets/icons/default-icon2.png"
const router = useRouter(); const router = useRouter();
const tabList = ref([ const tabList = ref([
{ {
......
...@@ -1144,7 +1144,6 @@ const handleToPosi = id => { ...@@ -1144,7 +1144,6 @@ const handleToPosi = id => {
// 0 618 1240 2350 // 0 618 1240 2350
switch (id) { switch (id) {
case "position2": case "position2":
// containerRef.value.scrollTop = isShow.value ? 744 : 1090;
containerRef.value.scrollTop = isShow.value ? 844 : 1190; containerRef.value.scrollTop = isShow.value ? 844 : 1190;
break; break;
case "position3": case "position3":
...@@ -1334,6 +1333,7 @@ onMounted(async () => { ...@@ -1334,6 +1333,7 @@ onMounted(async () => {
height: 144px; height: 144px;
background: #fff; background: #fff;
overflow: hidden; overflow: hidden;
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.3);
.home-main-header-center { .home-main-header-center {
margin-top: 20px; margin-top: 20px;
margin-left: 200px; margin-left: 200px;
......
...@@ -408,7 +408,7 @@ ...@@ -408,7 +408,7 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20" style="width: 1600px; margin: 0 auto; margin-top: 39px"> <el-row :gutter="20" style="width: 1600px; margin: 0 auto; margin-top: 39px;">
<CustomTitle id="position4" title="资源库" style="margin-top: 0px" /> <CustomTitle id="position4" title="资源库" style="margin-top: 0px" />
<div class="resource-tabs"> <div class="resource-tabs">
<div <div
...@@ -1064,8 +1064,8 @@ const handleEntityClick = item => { ...@@ -1064,8 +1064,8 @@ const handleEntityClick = item => {
const route = router.resolve({ const route = router.resolve({
name: "companyPages", name: "companyPages",
params: { params: {
startTime: item.startTime, // startTime: item.startTime,
id: item.id id: item.entityId
} }
}); });
window.open(route.href, "_blank"); window.open(route.href, "_blank");
...@@ -2868,9 +2868,8 @@ const handleMediaClick = item => { ...@@ -2868,9 +2868,8 @@ const handleMediaClick = item => {
.home-main-footer { .home-main-footer {
// width: 100%; // width: 100%;
height: 911px; // height: 911px;
background: rgba(248, 249, 250, 1); background: rgba(248, 249, 250, 1);
.home-main-footer-header { .home-main-footer-header {
margin-top: 37px; margin-top: 37px;
margin-bottom: 36px; margin-bottom: 36px;
...@@ -3156,7 +3155,7 @@ const handleMediaClick = item => { ...@@ -3156,7 +3155,7 @@ const handleMediaClick = item => {
.all-content { .all-content {
width: 100%; width: 100%;
height: auto; height: auto;
padding-bottom: 100px; padding-bottom: 30px;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
// align-items: center; // align-items: center;
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
<template #default="{ row }"> <template #default="{ row }">
<div class="entity-name-cell"> <div class="entity-name-cell">
<el-avatar class="avatar" :size="24" :src="row.avatar || defaultIcon" /> <el-avatar class="avatar" :size="24" :src="row.avatar || defaultIcon" />
<div class="name" :title="row.name">{{ row.name }}</div> <div class="name" @click="handleCompClick(row)" :title="row.name">{{ row.name }}</div>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
...@@ -79,8 +79,9 @@ ...@@ -79,8 +79,9 @@
<script setup> <script setup>
import { ref, defineProps, defineEmits, computed, watch } from "vue"; import { ref, defineProps, defineEmits, computed, watch } from "vue";
import router from "@/router";
import { Close } from "@element-plus/icons-vue"; import { Close } from "@element-plus/icons-vue";
import defaultIcon from "../../../../../assets/icons/default-avatar.png"; import defaultIcon from "@/assets/icons/default-icon1.png";
const props = defineProps({ const props = defineProps({
modelValue: { modelValue: {
...@@ -149,6 +150,20 @@ const getTagStyle = tag => { ...@@ -149,6 +150,20 @@ const getTagStyle = tag => {
const index = Math.abs(hash) % colorPool.length; const index = Math.abs(hash) % colorPool.length;
return colorPool[index]; return colorPool[index];
}; };
// 跳转公司详情页
const handleCompClick = item => {
console.log("item", item);
window.sessionStorage.setItem('curTabName', item.entityNameZh || item.entityName)
const route = router.resolve({
name: "companyPages",
params: {
id: item.id
}
});
window.open(route.href, "_blank");
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
...@@ -271,6 +286,7 @@ const getTagStyle = tag => { ...@@ -271,6 +286,7 @@ const getTagStyle = tag => {
overflow: hidden; overflow: hidden;
white-space: nowrap; white-space: nowrap;
text-overflow: ellipsis; text-overflow: ellipsis;
cursor: pointer;
} }
} }
......
...@@ -127,7 +127,7 @@ const handleCompClick = item => { ...@@ -127,7 +127,7 @@ const handleCompClick = item => {
const route = router.resolve({ const route = router.resolve({
name: "companyPages", name: "companyPages",
params: { params: {
id: item.id id: item.entityId
} }
}); });
window.open(route.href, "_blank"); window.open(route.href, "_blank");
......
...@@ -475,7 +475,7 @@ const initDomainChart = () => { ...@@ -475,7 +475,7 @@ const initDomainChart = () => {
{ {
name: "制裁实体领域分布", name: "制裁实体领域分布",
type: "pie", type: "pie",
radius: [73.5, 89.5], radius: [65, 81],
center: ["50%", "50%"], center: ["50%", "50%"],
startAngle: 90, startAngle: 90,
data: data, data: data,
...@@ -485,24 +485,24 @@ const initDomainChart = () => { ...@@ -485,24 +485,24 @@ const initDomainChart = () => {
minMargin: 5, minMargin: 5,
edgeDistance: 10, edgeDistance: 10,
formatter: params => { formatter: params => {
return "{name|" + params.name + "}\n{value|" + params.value + "家 " + params.percent + "%}"; return "{name|" + params.name + "} \n {value|" + params.value + "家 " + params.percent + "%}";
}, },
rich: { rich: {
name: { name: {
fontSize: 18, fontSize: 18,
fontWeight: 700, fontWeight: 700,
color: "rgb(59, 65, 75)", color: "rgb(59, 65, 75)",
padding: [0, 0, 5, 0], padding: [10, 0, 10, 0],
fontFamily: "Microsoft YaHei", fontFamily: "Microsoft YaHei",
lineHeight: 26 lineHeight: 22
}, },
value: { value: {
fontSize: 16, fontSize: 16,
fontWeight: 400, fontWeight: 400,
color: "rgb(95, 101, 108)", color: "rgb(95, 101, 108)",
fontFamily: "Microsoft YaHei", fontFamily: "Microsoft YaHei",
lineHeight: 24, lineHeight: 22,
padding: [5, 0, 0, 0] padding: [10, 0, 10, 0]
} }
} }
}, },
......
<template> <template>
<div class="deep-mining"> <div class="deep-mining" :class="{ deepMiningChartmode: isInChart }">
<div class="side-nav"> <div class="side-nav">
<div <div
v-for="(item, index) in activeTab" v-for="(item, index) in activeTab"
...@@ -68,7 +68,7 @@ ...@@ -68,7 +68,7 @@
@click="selectEntity(item)" @click="selectEntity(item)"
> >
<div class="item-icon"> <div class="item-icon">
<img :src="defaultTitle" alt="" class="item-img"> <img :src="defaultTitle" alt="" class="item-img" />
</div> </div>
<span class="item-name">{{ item.name }}</span> <span class="item-name">{{ item.name }}</span>
</div> </div>
...@@ -77,7 +77,7 @@ ...@@ -77,7 +77,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="right"> <div class="right" @mouseenter="handleMouseEnter" @mouseleave="handleMouseLeave">
<div class="title-com custom-right-header"> <div class="title-com custom-right-header">
<div class="toggle-group"> <div class="toggle-group">
<div <div
...@@ -85,7 +85,7 @@ ...@@ -85,7 +85,7 @@
:class="{ active: rightActiveTab === 'supplyChain' }" :class="{ active: rightActiveTab === 'supplyChain' }"
@click="rightActiveTab = 'supplyChain'" @click="rightActiveTab = 'supplyChain'"
> >
<img :src="rightActiveTab === 'supplyChain' ? icon01Active : icon01" alt=""> <img :src="rightActiveTab === 'supplyChain' ? icon01Active : icon01" alt="" />
<span>供应链</span> <span>供应链</span>
</div> </div>
<div <div
...@@ -93,7 +93,7 @@ ...@@ -93,7 +93,7 @@
:class="{ active: rightActiveTab === 'equity' }" :class="{ active: rightActiveTab === 'equity' }"
@click="rightActiveTab = 'equity'" @click="rightActiveTab = 'equity'"
> >
<img :src="rightActiveTab === 'equity' ? icon02Active : icon02" alt=""> <img :src="rightActiveTab === 'equity' ? icon02Active : icon02" alt="" />
<span>股权</span> <span>股权</span>
</div> </div>
</div> </div>
...@@ -131,20 +131,38 @@ ...@@ -131,20 +131,38 @@
<div class="right-echarts"> <div class="right-echarts">
<div class="chart-wrapper"> <div class="chart-wrapper">
<div class="chart-controls"> <div class="chart-controls">
<div class="control-btn"><img :src="echartsIcon01" /></div> <div
<div class="control-btn"><img :src="echartsIcon02" /></div> class="control-btn"
<div class="control-btn"><img :src="echartsIcon03" /></div> :class="{ controlBtnActive: controlActive === 1 }"
@click="handleClickControlBtn(1)"
>
<img :src="echartsIcon01" />
</div>
<div
class="control-btn"
:class="{ controlBtnActive: controlActive === 2 }"
@click="handleClickControlBtn(2)"
>
<img :src="echartsIcon02" />
</div>
<div
class="control-btn"
:class="{ controlBtnActive: controlActive === 3 }"
@click="handleClickControlBtn(3)"
>
<img :src="echartsIcon03" />
</div>
</div> </div>
<div class="chart-legend"> <div class="chart-legend">
<div class="legend-item"><span class="dot blue"></span>已被制裁实体</div> <div class="legend-item"><span class="dot blue"></span>已被制裁实体</div>
<div class="legend-item"><span class="dot grey"></span>未被制裁实体</div> <div class="legend-item"><span class="dot grey"></span>未被制裁实体</div>
</div> </div>
<div ref="chartRef" class="chart-container"></div> <div ref="chartRef" id="chartbox" class="chart-container"></div>
<div class="node-popup" v-if="selectedNode"> <div class="node-popup" v-if="selectedNode">
<div class="popup-header"> <div class="popup-header">
<img :src="defaultTitle" class="popup-icon" /> <img :src="defaultTitle" class="popup-icon" />
<span class="popup-title">{{ selectedNode.name.replace(/\n/g, '') }}</span> <span class="popup-title">{{ selectedNode.name.replace(/\n/g, "") }}</span>
<el-icon class="close-icon" @click="selectedNode = null"><Close /></el-icon> <el-icon class="close-icon" @click="selectedNode = null"><Close /></el-icon>
</div> </div>
<div class="popup-body"> <div class="popup-body">
...@@ -174,16 +192,55 @@ import { debounce } from "lodash"; ...@@ -174,16 +192,55 @@ import { debounce } from "lodash";
import * as echarts from "echarts"; import * as echarts from "echarts";
import { Search, CaretRight, Close } from "@element-plus/icons-vue"; import { Search, CaretRight, Close } from "@element-plus/icons-vue";
import defaultTitle from "../../assets/default-icon2.png"; import defaultTitle from "../../assets/default-icon2.png";
import icon01 from "./assets/icon01.png" import icon01 from "./assets/icon01.png";
import icon02 from "./assets/icon02.png" import icon02 from "./assets/icon02.png";
import icon01Active from "./assets/icon01-active.png" import icon01Active from "./assets/icon01-active.png";
import icon02Active from "./assets/icon02-active.png" import icon02Active from "./assets/icon02-active.png";
import echartsIcon01 from "./assets/echartsIcon01.png" import echartsIcon01 from "./assets/echartsIcon01.png";
import echartsIcon02 from "./assets/echartsIcon02.png" import echartsIcon02 from "./assets/echartsIcon02.png";
import echartsIcon03 from "./assets/echartsIcon03.png" import echartsIcon03 from "./assets/echartsIcon03.png";
import company from "./assets/company.png" import company from "./assets/company.png";
import companyActive from "./assets/company-active.png" import companyActive from "./assets/company-active.png";
import { getSingleSanctionEntityList, getSingleSanctionEntitySupplyChain, getSingleSanctionEntityEquity } from "@/api/exportControlV2.0"; import {
getSingleSanctionEntityList,
getSingleSanctionEntitySupplyChain,
getSingleSanctionEntityEquity
} from "@/api/exportControlV2.0";
import getTreeChart from "./utils/treeChart";
import setChart from "@/utils/setChart";
const controlActive = ref(1);
const treeData = ref([{}]);
const handleClickControlBtn = btn => {
controlActive.value = btn;
if (btn === 1 || btn === 3) {
isInChart.value = true;
initChart();
} else if (btn === 2) {
isInChart.value = false;
if (chartInstance.value) {
chartInstance.value.dispose();
}
console.log("treeData", treeData.value);
let treeChart = getTreeChart(treeData.value);
setChart(treeChart, "chartbox");
}
};
const isInChart = ref(false);
const handleMouseEnter = () => {
if (controlActive.value !== 2) {
isInChart.value = true;
} else {
isInChart.value = false;
}
};
const handleMouseLeave = () => {
isInChart.value = false;
};
// 单次制裁-深度挖掘-制裁实体股权信息-列表 // 单次制裁-深度挖掘-制裁实体股权信息-列表
const singleSanctionEntityEquityData = ref(null); const singleSanctionEntityEquityData = ref(null);
...@@ -192,18 +249,16 @@ const getSingleSanctionEntityEquityRequest = async () => { ...@@ -192,18 +249,16 @@ const getSingleSanctionEntityEquityRequest = async () => {
try { try {
const res = await getSingleSanctionEntityEquity({ const res = await getSingleSanctionEntityEquity({
orgId: activeEntityId.value, orgId: activeEntityId.value,
rule: is50PercentRule.value, rule: is50PercentRule.value
}) });
if (res.code === 200) { if (res.code === 200) {
singleSanctionEntityEquityData.value = res.data || null; singleSanctionEntityEquityData.value = res.data || null;
initChart(); initChart();
} }
} catch (error) { } catch (error) {
console.log(error) console.log(error);
} }
} };
// 单次制裁-深度挖掘-制裁实体供应链信息-列表 // 单次制裁-深度挖掘-制裁实体供应链信息-列表
const singleSanctionEntitySupplyChainData = ref(null); const singleSanctionEntitySupplyChainData = ref(null);
...@@ -211,21 +266,32 @@ const singleSanctionEntitySupplyChainData = ref(null); ...@@ -211,21 +266,32 @@ const singleSanctionEntitySupplyChainData = ref(null);
const getSingleSanctionEntitySupplyChainRequest = async () => { const getSingleSanctionEntitySupplyChainRequest = async () => {
try { try {
const res = await getSingleSanctionEntitySupplyChain({ const res = await getSingleSanctionEntitySupplyChain({
orgId: activeEntityId.value, orgId: activeEntityId.value
}) });
if (res.code === 200) { if (res.code === 200) {
singleSanctionEntitySupplyChainData.value = res.data || null; singleSanctionEntitySupplyChainData.value = res.data || null;
initChart(); initChart();
treeData.value[0].id = res.data.orgId;
treeData.value[0].name = res.data.orgName;
treeData.value[0].symbol = "image://" + companyActive;
treeData.value[0].symbolSize = 50;
treeData.value[0].value = 10;
treeData.value[0].children = res.data.parentOrgList.map(item => {
return {
id: item.id,
name: item.name,
symbolSize: 30,
value: 10,
symbol: `image://${company}`
};
});
console.log("treeData0", treeData.value);
} }
} catch (error) { } catch (error) {
console.log(error) console.log(error);
} }
} };
// 单次制裁-深度挖掘-本次制裁实体清单列表 // 单次制裁-深度挖掘-本次制裁实体清单列表
const singleSanctionEntityList = ref([]); const singleSanctionEntityList = ref([]);
...@@ -236,8 +302,8 @@ const getSingleSanctionEntityListRequest = async () => { ...@@ -236,8 +302,8 @@ const getSingleSanctionEntityListRequest = async () => {
sanRecordId: sanRecordId.value, sanRecordId: sanRecordId.value,
isOnlyCn: false, isOnlyCn: false,
domainId: searchDomain.value || undefined, domainId: searchDomain.value || undefined,
searchText: searchText.value || undefined, searchText: searchText.value || undefined
}) });
if (res.code === 200) { if (res.code === 200) {
entityList.value = (res.data || []).map((group, index) => ({ entityList.value = (res.data || []).map((group, index) => ({
id: `group-${index}`, id: `group-${index}`,
...@@ -260,17 +326,15 @@ const getSingleSanctionEntityListRequest = async () => { ...@@ -260,17 +326,15 @@ const getSingleSanctionEntityListRequest = async () => {
} }
} }
} catch (error) { } catch (error) {
console.log(error) console.log(error);
} }
} };
const sanRecordId = ref("") const sanRecordId = ref("");
const getUrlParams = () => { const getUrlParams = () => {
const urlParams = new URLSearchParams(window.location.search); const urlParams = new URLSearchParams(window.location.search);
sanRecordId.value = urlParams.get("id") || "" sanRecordId.value = urlParams.get("id") || "";
} };
// const activeTab = ref(["实体穿透分析", "重点实体识别"]); // const activeTab = ref(["实体穿透分析", "重点实体识别"]);
const activeTab = ref(["实体穿透分析"]); const activeTab = ref(["实体穿透分析"]);
...@@ -287,11 +351,11 @@ const is50PercentRule = ref(false); ...@@ -287,11 +351,11 @@ const is50PercentRule = ref(false);
const entityList = ref([]); const entityList = ref([]);
const toggleGroup = (group) => { const toggleGroup = group => {
group.expanded = !group.expanded; group.expanded = !group.expanded;
}; };
const selectEntity = (item) => { const selectEntity = item => {
activeEntityId.value = item.id; activeEntityId.value = item.id;
currentEntityName.value = item.name; currentEntityName.value = item.name;
}; };
...@@ -311,7 +375,7 @@ const initChart = () => { ...@@ -311,7 +375,7 @@ const initChart = () => {
let option = {}; let option = {};
if (rightActiveTab.value === 'supplyChain') { if (rightActiveTab.value === "supplyChain") {
option = getSupplyChainOption(); option = getSupplyChainOption();
} else { } else {
option = getEquityOption(); option = getEquityOption();
...@@ -319,15 +383,15 @@ const initChart = () => { ...@@ -319,15 +383,15 @@ const initChart = () => {
chartInstance.value.setOption(option); chartInstance.value.setOption(option);
chartInstance.value.on('click', (params) => { chartInstance.value.on("click", params => {
if (params.dataType === 'node') { if (params.dataType === "node") {
selectedNode.value = params.data; selectedNode.value = params.data;
} else { } else {
selectedNode.value = null; selectedNode.value = null;
} }
}); });
chartInstance.value.getZr().on('click', (params) => { chartInstance.value.getZr().on("click", params => {
if (!params.target) { if (!params.target) {
selectedNode.value = null; selectedNode.value = null;
} }
...@@ -345,21 +409,21 @@ const getSupplyChainOption = () => { ...@@ -345,21 +409,21 @@ const getSupplyChainOption = () => {
// 中心节点 // 中心节点
nodes.push({ nodes.push({
id: '0', id: "0",
name: data.orgName, name: data.orgName,
category: 0, // 强制为制裁中 category: 0, // 强制为制裁中
symbol: 'image://' + companyActive, // 强制使用制裁中图标 symbol: "image://" + companyActive, // 强制使用制裁中图标
x: centerX, x: centerX,
y: centerY, y: centerY,
symbolSize: 50, symbolSize: 50,
label: { label: {
fontSize: 16, fontSize: 16,
fontWeight: 'bold', fontWeight: "bold",
color: '#055FC2', // 使用制裁蓝,在图标下方更清晰 color: "#055FC2", // 使用制裁蓝,在图标下方更清晰
position: 'bottom', position: "bottom",
distance: 10, distance: 10,
width: 150, width: 150,
overflow: 'break' overflow: "break"
} }
}); });
...@@ -374,26 +438,26 @@ const getSupplyChainOption = () => { ...@@ -374,26 +438,26 @@ const getSupplyChainOption = () => {
const y = centerY + radius * Math.sin(angle); const y = centerY + radius * Math.sin(angle);
// 动态计算标签位置:根据余弦值判断左右,根据正弦值判断上下 // 动态计算标签位置:根据余弦值判断左右,根据正弦值判断上下
let position = 'right'; let position = "right";
let align = 'left'; let align = "left";
const cosA = Math.cos(angle); const cosA = Math.cos(angle);
const sinA = Math.sin(angle); const sinA = Math.sin(angle);
if (Math.abs(cosA) < 0.3) { if (Math.abs(cosA) < 0.3) {
// 顶部区域 // 顶部区域
position = 'top'; position = "top";
align = 'center'; align = "center";
} else if (cosA < 0) { } else if (cosA < 0) {
// 左侧区域 // 左侧区域
position = 'left'; position = "left";
align = 'right'; align = "right";
} }
nodes.push({ nodes.push({
id: `p-${item.id}`, id: `p-${item.id}`,
name: item.name, name: item.name,
category: item.isSanctioned ? 0 : 1, category: item.isSanctioned ? 0 : 1,
symbol: 'image://' + (item.isSanctioned ? companyActive : company), symbol: "image://" + (item.isSanctioned ? companyActive : company),
x: x, x: x,
y: y, y: y,
isSanctioned: item.isSanctioned, isSanctioned: item.isSanctioned,
...@@ -402,7 +466,7 @@ const getSupplyChainOption = () => { ...@@ -402,7 +466,7 @@ const getSupplyChainOption = () => {
align: align, align: align,
distance: 8, distance: 8,
width: 110, width: 110,
overflow: 'break', overflow: "break",
lineHeight: 14, lineHeight: 14,
fontSize: 11 fontSize: 11
} }
...@@ -410,8 +474,8 @@ const getSupplyChainOption = () => { ...@@ -410,8 +474,8 @@ const getSupplyChainOption = () => {
links.push({ links.push({
source: `p-${item.id}`, source: `p-${item.id}`,
target: '0', target: "0",
value: '供应商', value: "供应商",
isSanctioned: item.isSanctioned && data.isSanctioned isSanctioned: item.isSanctioned && data.isSanctioned
}); });
}); });
...@@ -426,26 +490,26 @@ const getSupplyChainOption = () => { ...@@ -426,26 +490,26 @@ const getSupplyChainOption = () => {
const y = centerY + radius * Math.sin(angle); const y = centerY + radius * Math.sin(angle);
// 动态计算标签位置 // 动态计算标签位置
let position = 'right'; let position = "right";
let align = 'left'; let align = "left";
const cosA = Math.cos(angle); const cosA = Math.cos(angle);
const sinA = Math.sin(angle); const sinA = Math.sin(angle);
if (Math.abs(cosA) < 0.3) { if (Math.abs(cosA) < 0.3) {
// 底部区域 // 底部区域
position = 'bottom'; position = "bottom";
align = 'center'; align = "center";
} else if (cosA < 0) { } else if (cosA < 0) {
// 左侧区域 // 左侧区域
position = 'left'; position = "left";
align = 'right'; align = "right";
} }
nodes.push({ nodes.push({
id: `c-${item.id}`, id: `c-${item.id}`,
name: item.name, name: item.name,
category: item.isSanctioned ? 0 : 1, category: item.isSanctioned ? 0 : 1,
symbol: 'image://' + (item.isSanctioned ? companyActive : company), symbol: "image://" + (item.isSanctioned ? companyActive : company),
x: x, x: x,
y: y, y: y,
isSanctioned: item.isSanctioned, isSanctioned: item.isSanctioned,
...@@ -454,16 +518,16 @@ const getSupplyChainOption = () => { ...@@ -454,16 +518,16 @@ const getSupplyChainOption = () => {
align: align, align: align,
distance: 8, distance: 8,
width: 110, width: 110,
overflow: 'break', overflow: "break",
lineHeight: 14, lineHeight: 14,
fontSize: 11 fontSize: 11
} }
}); });
links.push({ links.push({
source: '0', source: "0",
target: `c-${item.id}`, target: `c-${item.id}`,
value: '客户', value: "客户",
isSanctioned: item.isSanctioned && data.isSanctioned isSanctioned: item.isSanctioned && data.isSanctioned
}); });
}); });
...@@ -471,45 +535,45 @@ const getSupplyChainOption = () => { ...@@ -471,45 +535,45 @@ const getSupplyChainOption = () => {
return { return {
tooltip: { tooltip: {
show: true, show: true,
formatter: (params) => { formatter: params => {
if (params.dataType === 'node') { if (params.dataType === "node") {
return `<div style="padding: 8px; max-width: 300px; white-space: normal; word-break: break-all;">${params.data.name}</div>`; return `<div style="padding: 8px; max-width: 300px; white-space: normal; word-break: break-all;">${params.data.name}</div>`;
} }
return ''; return "";
} }
}, },
series: [ series: [
{ {
type: 'graph', type: "graph",
layout: 'none', layout: "none",
symbolSize: 36, symbolSize: 36,
roam: true, roam: true,
label: { label: {
show: true, show: true,
formatter: '{b}', formatter: "{b}",
fontSize: 12, fontSize: 12,
hideOverlap: true hideOverlap: true
}, },
edgeSymbol: ['none', 'arrow'], edgeSymbol: ["none", "arrow"],
edgeSymbolSize: [4, 8], edgeSymbolSize: [4, 8],
edgeLabel: { edgeLabel: {
position: 'middle', position: "middle",
offset: [0, 13], offset: [0, 13],
fontSize: 12, fontSize: 12,
fontWeight: 400, fontWeight: 400,
fontFamily: 'Microsoft YaHei', fontFamily: "Microsoft YaHei",
lineHeight: 16, lineHeight: 16,
show: true, show: true,
formatter: '{c}', formatter: "{c}",
color: 'rgba(170, 173, 177, 1)', color: "rgba(170, 173, 177, 1)",
backgroundColor: 'rgba(234, 236, 238, 1)', backgroundColor: "rgba(234, 236, 238, 1)",
padding: [4, 8], padding: [4, 8],
borderRadius: 20 borderRadius: 20
}, },
data: nodes.map(node => ({ data: nodes.map(node => ({
...node, ...node,
label: { label: {
color: node.category === 0 ? '#055FC2' : '#5F656C', color: node.category === 0 ? "#055FC2" : "#5F656C",
...node.label ...node.label
} }
})), })),
...@@ -517,24 +581,26 @@ const getSupplyChainOption = () => { ...@@ -517,24 +581,26 @@ const getSupplyChainOption = () => {
return { return {
...link, ...link,
lineStyle: { lineStyle: {
color: link.isSanctioned ? 'rgba(100, 180, 255, 1)' : 'rgb(180, 181, 182)', color: link.isSanctioned ? "rgba(100, 180, 255, 1)" : "rgb(180, 181, 182)",
width: 1, width: 1,
curveness: 0 curveness: 0
}, },
label: link.isSanctioned ? { label: link.isSanctioned
? {
show: true, show: true,
formatter: '{c}', formatter: "{c}",
backgroundColor: 'rgba(231, 243, 255, 1)', backgroundColor: "rgba(231, 243, 255, 1)",
color: 'rgba(50, 150, 250, 1)', color: "rgba(50, 150, 250, 1)",
borderRadius: 20, borderRadius: 20,
padding: [4, 8], padding: [4, 8],
fontSize: 12, fontSize: 12,
fontWeight: 400, fontWeight: 400,
fontFamily: 'Microsoft YaHei', fontFamily: "Microsoft YaHei",
lineHeight: 16 lineHeight: 16
} : undefined }
: undefined
}; };
}), })
} }
] ]
}; };
...@@ -551,21 +617,21 @@ const getEquityOption = () => { ...@@ -551,21 +617,21 @@ const getEquityOption = () => {
// 中心节点 // 中心节点
nodes.push({ nodes.push({
id: '0', id: "0",
name: data.orgName, name: data.orgName,
category: 0, // 强制为制裁中 category: 0, // 强制为制裁中
symbol: 'image://' + companyActive, // 强制使用制裁中图标 symbol: "image://" + companyActive, // 强制使用制裁中图标
x: centerX, x: centerX,
y: centerY, y: centerY,
symbolSize: 50, symbolSize: 50,
label: { label: {
fontSize: 16, fontSize: 16,
fontWeight: 'bold', fontWeight: "bold",
color: '#055FC2', // 使用制裁蓝,在图标下方更清晰 color: "#055FC2", // 使用制裁蓝,在图标下方更清晰
position: 'bottom', position: "bottom",
distance: 10, distance: 10,
width: 150, width: 150,
overflow: 'break' overflow: "break"
} }
}); });
...@@ -583,15 +649,15 @@ const getEquityOption = () => { ...@@ -583,15 +649,15 @@ const getEquityOption = () => {
id: `p-${index}`, id: `p-${index}`,
name: item.name, name: item.name,
category: item.isSanctioned ? 0 : 1, category: item.isSanctioned ? 0 : 1,
symbol: 'image://' + (item.isSanctioned ? companyActive : company), symbol: "image://" + (item.isSanctioned ? companyActive : company),
x: x, x: x,
y: y, y: y,
isSanctioned: item.isSanctioned, isSanctioned: item.isSanctioned,
label: { label: {
position: 'top', position: "top",
distance: 8, distance: 8,
width: 110, width: 110,
overflow: 'break', overflow: "break",
lineHeight: 14, lineHeight: 14,
fontSize: 11 fontSize: 11
} }
...@@ -599,8 +665,8 @@ const getEquityOption = () => { ...@@ -599,8 +665,8 @@ const getEquityOption = () => {
links.push({ links.push({
source: `p-${index}`, source: `p-${index}`,
target: '0', target: "0",
value: item.type || '持股', // 使用 type 字段 value: item.type || "持股", // 使用 type 字段
isSanctioned: item.isSanctioned // 中心节点强制制裁,高亮取决于对方 isSanctioned: item.isSanctioned // 中心节点强制制裁,高亮取决于对方
}); });
}); });
...@@ -619,24 +685,24 @@ const getEquityOption = () => { ...@@ -619,24 +685,24 @@ const getEquityOption = () => {
id: `c-${index}`, id: `c-${index}`,
name: item.name, name: item.name,
category: item.isSanctioned ? 0 : 1, category: item.isSanctioned ? 0 : 1,
symbol: 'image://' + (item.isSanctioned ? companyActive : company), symbol: "image://" + (item.isSanctioned ? companyActive : company),
x: x, x: x,
y: y, y: y,
isSanctioned: item.isSanctioned, isSanctioned: item.isSanctioned,
label: { label: {
position: 'bottom', position: "bottom",
distance: 8, distance: 8,
width: 110, width: 110,
overflow: 'break', overflow: "break",
lineHeight: 14, lineHeight: 14,
fontSize: 11 fontSize: 11
} }
}); });
links.push({ links.push({
source: '0', source: "0",
target: `c-${index}`, target: `c-${index}`,
value: item.type || '持股', // 使用 type 字段 value: item.type || "持股", // 使用 type 字段
isSanctioned: item.isSanctioned // 中心节点强制制裁,高亮取决于对方 isSanctioned: item.isSanctioned // 中心节点强制制裁,高亮取决于对方
}); });
}); });
...@@ -644,45 +710,45 @@ const getEquityOption = () => { ...@@ -644,45 +710,45 @@ const getEquityOption = () => {
return { return {
tooltip: { tooltip: {
show: true, show: true,
formatter: (params) => { formatter: params => {
if (params.dataType === 'node') { if (params.dataType === "node") {
return `<div style="padding: 8px; max-width: 300px; white-space: normal; word-break: break-all;">${params.data.name}</div>`; return `<div style="padding: 8px; max-width: 300px; white-space: normal; word-break: break-all;">${params.data.name}</div>`;
} }
return ''; return "";
} }
}, },
series: [ series: [
{ {
type: 'graph', type: "graph",
layout: 'none', layout: "none",
symbolSize: 36, symbolSize: 36,
roam: true, roam: true,
label: { label: {
show: true, show: true,
formatter: '{b}', formatter: "{b}",
fontSize: 12, fontSize: 12,
hideOverlap: true hideOverlap: true
}, },
edgeSymbol: ['none', 'arrow'], edgeSymbol: ["none", "arrow"],
edgeSymbolSize: [4, 8], edgeSymbolSize: [4, 8],
edgeLabel: { edgeLabel: {
position: 'middle', position: "middle",
offset: [0, 13], offset: [0, 13],
fontSize: 12, fontSize: 12,
fontWeight: 400, fontWeight: 400,
fontFamily: 'Microsoft YaHei', fontFamily: "Microsoft YaHei",
lineHeight: 16, lineHeight: 16,
show: true, show: true,
formatter: '{c}', formatter: "{c}",
color: 'rgba(170, 173, 177, 1)', color: "rgba(170, 173, 177, 1)",
backgroundColor: 'rgba(234, 236, 238, 1)', backgroundColor: "rgba(234, 236, 238, 1)",
padding: [4, 8], padding: [4, 8],
borderRadius: 20 borderRadius: 20
}, },
data: nodes.map(node => ({ data: nodes.map(node => ({
...node, ...node,
label: { label: {
color: node.category === 0 ? '#055FC2' : '#5F656C', color: node.category === 0 ? "#055FC2" : "#5F656C",
...node.label ...node.label
} }
})), })),
...@@ -690,24 +756,26 @@ const getEquityOption = () => { ...@@ -690,24 +756,26 @@ const getEquityOption = () => {
return { return {
...link, ...link,
lineStyle: { lineStyle: {
color: link.isSanctioned ? 'rgba(100, 180, 255, 1)' : 'rgb(180, 181, 182)', color: link.isSanctioned ? "rgba(100, 180, 255, 1)" : "rgb(180, 181, 182)",
width: 1, width: 1,
curveness: 0 curveness: 0
}, },
label: link.isSanctioned ? { label: link.isSanctioned
? {
show: true, show: true,
formatter: '{c}', formatter: "{c}",
backgroundColor: 'rgba(231, 243, 255, 1)', backgroundColor: "rgba(231, 243, 255, 1)",
color: 'rgba(50, 150, 250, 1)', color: "rgba(50, 150, 250, 1)",
borderRadius: 20, borderRadius: 20,
padding: [4, 8], padding: [4, 8],
fontSize: 12, fontSize: 12,
fontWeight: 400, fontWeight: 400,
fontFamily: 'Microsoft YaHei', fontFamily: "Microsoft YaHei",
lineHeight: 16 lineHeight: 16
} : undefined }
: undefined
}; };
}), })
} }
] ]
}; };
...@@ -725,11 +793,11 @@ watch(searchDomain, () => { ...@@ -725,11 +793,11 @@ watch(searchDomain, () => {
getSingleSanctionEntityListRequest(); getSingleSanctionEntityListRequest();
}); });
watch(activeIndex, (val) => { watch(activeIndex, val => {
if (val === 0) { if (val === 0) {
nextTick(() => { nextTick(() => {
if (activeEntityId.value) { if (activeEntityId.value) {
if (rightActiveTab.value === 'supplyChain') { if (rightActiveTab.value === "supplyChain") {
getSingleSanctionEntitySupplyChainRequest(); getSingleSanctionEntitySupplyChainRequest();
} else { } else {
getSingleSanctionEntityEquityRequest(); getSingleSanctionEntityEquityRequest();
...@@ -740,9 +808,9 @@ watch(activeIndex, (val) => { ...@@ -740,9 +808,9 @@ watch(activeIndex, (val) => {
} }
}); });
watch(activeEntityId, (val) => { watch(activeEntityId, val => {
if (val) { if (val) {
if (rightActiveTab.value === 'supplyChain') { if (rightActiveTab.value === "supplyChain") {
getSingleSanctionEntitySupplyChainRequest(); getSingleSanctionEntitySupplyChainRequest();
} else { } else {
getSingleSanctionEntityEquityRequest(); getSingleSanctionEntityEquityRequest();
...@@ -752,14 +820,16 @@ watch(activeEntityId, (val) => { ...@@ -752,14 +820,16 @@ watch(activeEntityId, (val) => {
}); });
watch(is50PercentRule, () => { watch(is50PercentRule, () => {
if (rightActiveTab.value === 'equity' && activeEntityId.value) { if (rightActiveTab.value === "equity" && activeEntityId.value) {
getSingleSanctionEntityEquityRequest(); getSingleSanctionEntityEquityRequest();
} }
}); });
watch(rightActiveTab, (val) => { watch(
rightActiveTab,
val => {
if (activeEntityId.value) { if (activeEntityId.value) {
if (val === 'supplyChain') { if (val === "supplyChain") {
getSingleSanctionEntitySupplyChainRequest(); getSingleSanctionEntitySupplyChainRequest();
} else { } else {
getSingleSanctionEntityEquityRequest(); getSingleSanctionEntityEquityRequest();
...@@ -768,8 +838,9 @@ watch(rightActiveTab, (val) => { ...@@ -768,8 +838,9 @@ watch(rightActiveTab, (val) => {
nextTick(() => { nextTick(() => {
initChart(); initChart();
}); });
}, { immediate: true }); },
{ immediate: true }
);
onMounted(() => { onMounted(() => {
// 获取URL参数 // 获取URL参数
...@@ -777,7 +848,7 @@ onMounted(() => { ...@@ -777,7 +848,7 @@ onMounted(() => {
// 单次制裁-深度挖掘-本次制裁实体清单列表-请求 // 单次制裁-深度挖掘-本次制裁实体清单列表-请求
getSingleSanctionEntityListRequest(); getSingleSanctionEntityListRequest();
window.addEventListener('resize', handleResize); window.addEventListener("resize", handleResize);
}); });
onUnmounted(() => { onUnmounted(() => {
...@@ -787,7 +858,7 @@ onUnmounted(() => { ...@@ -787,7 +858,7 @@ onUnmounted(() => {
if (debouncedGetList && debouncedGetList.cancel) { if (debouncedGetList && debouncedGetList.cancel) {
debouncedGetList.cancel(); debouncedGetList.cancel();
} }
window.removeEventListener('resize', handleResize); window.removeEventListener("resize", handleResize);
}); });
const handleResize = () => { const handleResize = () => {
...@@ -802,7 +873,12 @@ const handleResize = () => { ...@@ -802,7 +873,12 @@ const handleResize = () => {
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
.deepMiningChartmode {
height: calc(100vh - 220px) !important;
// overflow: hidden;
}
.deep-mining { .deep-mining {
overflow: hidden;
width: 1601px; width: 1601px;
margin: 0 auto; margin: 0 auto;
position: relative; position: relative;
...@@ -898,13 +974,13 @@ const handleResize = () => { ...@@ -898,13 +974,13 @@ const handleResize = () => {
border-bottom: 1px solid rgb(234, 236, 238); border-bottom: 1px solid rgb(234, 236, 238);
&:hover { &:hover {
background-color: #F2F3F5; background-color: #f2f3f5;
} }
.arrow-icon { .arrow-icon {
margin-right: 8px; margin-right: 8px;
font-size: 14px; font-size: 14px;
color: #86909C; color: #86909c;
transition: transform 0.3s; transition: transform 0.3s;
&.expanded { &.expanded {
...@@ -916,18 +992,17 @@ const handleResize = () => { ...@@ -916,18 +992,17 @@ const handleResize = () => {
flex: 1; flex: 1;
font-size: 14px; font-size: 14px;
font-weight: 700; font-weight: 700;
color: #1D2129; color: #1d2129;
font-family: "Microsoft YaHei"; font-family: "Microsoft YaHei";
} }
.group-count { .group-count {
font-size: 14px; font-size: 14px;
color: #4E5969; color: #4e5969;
} }
} }
.group-children { .group-children {
.entity-item { .entity-item {
display: flex; display: flex;
align-items: center; align-items: center;
...@@ -939,7 +1014,7 @@ const handleResize = () => { ...@@ -939,7 +1014,7 @@ const handleResize = () => {
box-sizing: border-box; box-sizing: border-box;
&:hover { &:hover {
background-color: #F7F8FA; background-color: #f7f8fa;
} }
&.active { &.active {
...@@ -973,7 +1048,6 @@ const handleResize = () => { ...@@ -973,7 +1048,6 @@ const handleResize = () => {
font-family: "Microsoft YaHei"; font-family: "Microsoft YaHei";
line-height: 24px; line-height: 24px;
word-break: break-all; word-break: break-all;
} }
} }
} }
...@@ -1019,15 +1093,23 @@ const handleResize = () => { ...@@ -1019,15 +1093,23 @@ const handleResize = () => {
box-shadow: 0 0px 8px rgba(0, 0, 0, 0.1); box-shadow: 0 0px 8px rgba(0, 0, 0, 0.1);
.control-btn { .control-btn {
width: 14px; width: 24px;
height: 14px; height: 24px;
box-sizing: border-box;
padding: 5px;
cursor: pointer; cursor: pointer;
&:hover {
background: var(--color-bg-hover);
}
img { img {
width: 14px; width: 14px;
height: 14px; height: 14px;
} }
} }
.controlBtnActive {
background: var(--color-bg-hover);
}
} }
.chart-legend { .chart-legend {
...@@ -1045,10 +1127,10 @@ const handleResize = () => { ...@@ -1045,10 +1127,10 @@ const handleResize = () => {
font-weight: 400; font-weight: 400;
font-family: "Microsoft YaHei"; font-family: "Microsoft YaHei";
line-height: 24px; line-height: 24px;
color: #5F656C; color: #5f656c;
&:first-child { &:first-child {
color: #055FC2; color: #055fc2;
} }
.dot { .dot {
...@@ -1058,7 +1140,7 @@ const handleResize = () => { ...@@ -1058,7 +1140,7 @@ const handleResize = () => {
margin-right: 8px; margin-right: 8px;
&.blue { &.blue {
background: #055FC2; background: #055fc2;
} }
&.grey { &.grey {
...@@ -1104,7 +1186,7 @@ const handleResize = () => { ...@@ -1104,7 +1186,7 @@ const handleResize = () => {
.close-icon { .close-icon {
cursor: pointer; cursor: pointer;
font-size: 16px; font-size: 16px;
color: #86909C; color: #86909c;
position: absolute; position: absolute;
right: 0; right: 0;
top: 0; top: 0;
...@@ -1180,21 +1262,21 @@ const handleResize = () => { ...@@ -1180,21 +1262,21 @@ const handleResize = () => {
:deep(.el-checkbox__label) { :deep(.el-checkbox__label) {
font-size: 16px; font-size: 16px;
color: #5F656C; color: #5f656c;
font-family: "Microsoft YaHei"; font-family: "Microsoft YaHei";
} }
:deep(.el-checkbox__inner) { :deep(.el-checkbox__inner) {
border-color: #C9CDD4; border-color: #c9cdd4;
} }
:deep(.el-checkbox__input.is-checked .el-checkbox__inner) { :deep(.el-checkbox__input.is-checked .el-checkbox__inner) {
background-color: #055FC2; background-color: #055fc2;
border-color: #055FC2; border-color: #055fc2;
} }
:deep(.el-checkbox__input.is-checked + .el-checkbox__label) { :deep(.el-checkbox__input.is-checked + .el-checkbox__label) {
color: #5F656C; color: #5f656c;
} }
} }
...@@ -1257,12 +1339,11 @@ const handleResize = () => { ...@@ -1257,12 +1339,11 @@ const handleResize = () => {
} }
} }
.custom-scrollbar::-webkit-scrollbar { .custom-scrollbar::-webkit-scrollbar {
width: 6px; width: 6px;
} }
.custom-scrollbar::-webkit-scrollbar-thumb { .custom-scrollbar::-webkit-scrollbar-thumb {
background: #DCDFE6; background: #dcdfe6;
border-radius: 3px; border-radius: 3px;
} }
.custom-scrollbar::-webkit-scrollbar-track { .custom-scrollbar::-webkit-scrollbar-track {
...@@ -1270,14 +1351,15 @@ const handleResize = () => { ...@@ -1270,14 +1351,15 @@ const handleResize = () => {
} }
.title-com.custom-right-header { .title-com.custom-right-header {
.box, .text { .box,
.text {
display: none; display: none;
} }
.toggle-group { .toggle-group {
display: flex; display: flex;
background: #fff; background: #fff;
border: 1px solid #055FC2; border: 1px solid #055fc2;
border-radius: 20px; border-radius: 20px;
height: 32px; height: 32px;
overflow: hidden; overflow: hidden;
......
const getTreeChart = (treeData) => {
const option = {
series: [{
type: 'tree',
layout: 'orthogonal', // 从上到下布局
orient: 'TB', // Top to Bottom
data: treeData,
top: '10%',
bottom: '5%',
left: '10%',
right: '10%',
symbol: 'circle',
symbolSize: 40,
label: {
position: 'bottom',
verticalAlign: 'middle',
align: 'center'
},
leaves: {
label: {
position: 'top',
verticalAlign: 'middle',
align: 'center'
}
},
lineStyle: {
color: '#ccc',
width: 2,
type: 'dashed' // 虚线
},
emphasis: {
focus: 'descendant'
},
expandAndCollapse: true,
initialTreeDepth: 3
}]
};
return option
}
export default getTreeChart
\ No newline at end of file
...@@ -93,7 +93,7 @@ ...@@ -93,7 +93,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="right"> <div class="right" v-loading="isLoading">
<div class="title-com"> <div class="title-com">
<div class="box"></div> <div class="box"></div>
<div class="text">制裁清单</div> <div class="text">制裁清单</div>
...@@ -239,8 +239,11 @@ const addRuleCount = ref(0) ...@@ -239,8 +239,11 @@ const addRuleCount = ref(0)
const removeCount = ref(0) const removeCount = ref(0)
const removeRuleCount = ref(0) const removeRuleCount = ref(0)
const isLoading = ref(false)
// 调用单次制裁-制裁概况-制裁清单接口 // 调用单次制裁-制裁概况-制裁清单接口
const getSanctionOverviewList = async () => { const getSanctionOverviewList = async () => {
isLoading.value = true
try { try {
const res = await getSingleSanctionOverviewList({ const res = await getSingleSanctionOverviewList({
sanRecordId: sanRecordId.value, sanRecordId: sanRecordId.value,
...@@ -249,6 +252,7 @@ const getSanctionOverviewList = async () => { ...@@ -249,6 +252,7 @@ const getSanctionOverviewList = async () => {
searchText: searchKeyword.value || undefined, searchText: searchKeyword.value || undefined,
searchType: searchType.value searchType: searchType.value
}) })
isLoading.value = false
if (res.code === 200) { if (res.code === 200) {
const data = res.data || {} const data = res.data || {}
addCount.value = data.addCount || 0 addCount.value = data.addCount || 0
......
<template> <template>
<div class="home-wrapper"> <div class="home-wrapper">
<div class="home-main"> <div class="search-header" v-show="isShow">
<div class="home-main-header-center">
<el-input
v-model="searchThinktankText"
@keyup.enter="handleSearch"
style="width: 680px; height: 100%"
placeholder="搜索智库报告"
/>
<div class="search">
<div class="search-icon">
<img src="./assets/images/search-icon.png" alt="" />
</div>
<div class="search-text" @click="handleSearch">搜索</div>
</div>
</div>
<div class="home-main-header-btn-box">
<div class="btn" @click="handleToPosi('position1')">
<div class="btn-text">{{ "最新动态" }}</div>
<div class="btn-icon">
<img src="@/assets/icons/arrow-right-icon.png" alt="" />
</div>
</div>
<div class="btn" @click="handleToPosi('position2')">
<div class="btn-text">{{ "资讯要闻" }}</div>
<div class="btn-icon">
<img src="@/assets/icons/arrow-right-icon.png" alt="" />
</div>
</div>
<div class="btn" @click="handleToPosi('position3')">
<div class="btn-text">{{ "数据总览" }}</div>
<div class="btn-icon">
<img src="@/assets/icons/arrow-right-icon.png" alt="" />
</div>
</div>
<div class="btn" @click="handleToPosi('position4')">
<div class="btn-text">{{ "资源库" }}</div>
<div class="btn-icon">
<img src="@/assets/icons/arrow-right-icon.png" alt="" />
</div>
</div>
</div>
</div>
<div class="home-main" :class="{ scrollHomeMain: isShow }" ref="containerRef">
<div class="home-main-header"> <div class="home-main-header">
<div class="home-main-header-top"> <div class="home-main-header-top" v-show="!isShow">
<div class="header-left"> <div class="header-left">
<HeaderMenu></HeaderMenu> <HeaderMenu></HeaderMenu>
</div> </div>
...@@ -10,8 +52,13 @@ ...@@ -10,8 +52,13 @@
<headerInfo curTitleName="科技智库"></headerInfo> <headerInfo curTitleName="科技智库"></headerInfo>
</div> </div>
</div> </div>
<div class="home-main-header-center"> <div class="home-main-header-center" v-show="!isShow">
<el-input v-model="searchThinktankText" @keyup.enter="handleSearch" style="width: 838px; height: 100%" placeholder="搜索智库报告" /> <el-input
v-model="searchThinktankText"
@keyup.enter="handleSearch"
style="width: 838px; height: 100%"
placeholder="搜索智库报告"
/>
<div class="search"> <div class="search">
<div class="search-icon"> <div class="search-icon">
<img src="./assets/images/search-icon.png" alt="" /> <img src="./assets/images/search-icon.png" alt="" />
...@@ -37,26 +84,26 @@ ...@@ -37,26 +84,26 @@
<div class="item-footer">热点科技领域</div> <div class="item-footer">热点科技领域</div>
</div> </div>
</div> --> </div> -->
<div class="home-main-header-btn-box"> <div class="home-main-header-btn-box" v-show="!isShow">
<div class="btn" @click="scrollToTop('position1')"> <div class="btn" @click="handleToPosi('position1')">
<div class="btn-text">{{ "最新动态" }}</div> <div class="btn-text">{{ "最新动态" }}</div>
<div class="btn-icon"> <div class="btn-icon">
<img src="@/assets/icons/arrow-right-icon.png" alt="" /> <img src="@/assets/icons/arrow-right-icon.png" alt="" />
</div> </div>
</div> </div>
<div class="btn" @click="scrollToTop('position2')"> <div class="btn" @click="handleToPosi('position2')">
<div class="btn-text">{{ "资讯要闻" }}</div> <div class="btn-text">{{ "资讯要闻" }}</div>
<div class="btn-icon"> <div class="btn-icon">
<img src="@/assets/icons/arrow-right-icon.png" alt="" /> <img src="@/assets/icons/arrow-right-icon.png" alt="" />
</div> </div>
</div> </div>
<div class="btn" @click="scrollToTop('position3')"> <div class="btn" @click="handleToPosi('position3')">
<div class="btn-text">{{ "数据总览" }}</div> <div class="btn-text">{{ "数据总览" }}</div>
<div class="btn-icon"> <div class="btn-icon">
<img src="@/assets/icons/arrow-right-icon.png" alt="" /> <img src="@/assets/icons/arrow-right-icon.png" alt="" />
</div> </div>
</div> </div>
<div class="btn" @click="scrollToTop('position4')"> <div class="btn" @click="handleToPosi('position4')">
<div class="btn-text">{{ "资源库" }}</div> <div class="btn-text">{{ "资源库" }}</div>
<div class="btn-icon"> <div class="btn-icon">
<img src="@/assets/icons/arrow-right-icon.png" alt="" /> <img src="@/assets/icons/arrow-right-icon.png" alt="" />
...@@ -278,7 +325,6 @@ ...@@ -278,7 +325,6 @@
<MessageBubble <MessageBubble
v-for="(item, index) in messageList" v-for="(item, index) in messageList"
@click="handleClickPerson(item)" @click="handleClickPerson(item)"
:key="index" :key="index"
:avatar="item.personImage ? item.personImage : defaultHeaderIcin" :avatar="item.personImage ? item.personImage : defaultHeaderIcin"
:name="item.personName" :name="item.personName"
...@@ -607,6 +653,29 @@ import Box1Logo from "./assets/images/box1-logo.png"; ...@@ -607,6 +653,29 @@ import Box1Logo from "./assets/images/box1-logo.png";
import { setCanvasCreator } from "echarts/core"; import { setCanvasCreator } from "echarts/core";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import { useContainerScroll } from "@/hooks/useScrollShow";
const containerRef = ref(null);
const { isShow } = useContainerScroll(containerRef);
const handleToPosi = id => {
// 0 618 1240 2350
switch (id) {
case "position2":
// containerRef.value.scrollTop = isShow.value ? 744 : 1090;
containerRef.value.scrollTop = isShow.value ? 900 : 1150;
break;
case "position3":
containerRef.value.scrollTop = isShow.value ? 1480 : 1730;
break;
case "position4":
containerRef.value.scrollTop = isShow.value ? 2545 : 2795;
break;
default:
containerRef.value.scrollTop = 0;
}
};
const searchThinktankText = ref(""); //搜索科技人物及观点 const searchThinktankText = ref(""); //搜索科技人物及观点
// 智库列表 // 智库列表
const cardList = ref([ const cardList = ref([
...@@ -886,8 +955,8 @@ const handleGetThinkTankReportRemarks = async () => { ...@@ -886,8 +955,8 @@ const handleGetThinkTankReportRemarks = async () => {
if (res.code === 200 && res.data) { if (res.code === 200 && res.data) {
messageList.value = res.data; messageList.value = res.data;
messageList.value.forEach(item => { messageList.value.forEach(item => {
item.time = item.time.replace('T', ' ') item.time = item.time.replace("T", " ");
}) });
} }
} catch (error) { } catch (error) {
console.error("获取智库人物动态error", error); console.error("获取智库人物动态error", error);
...@@ -1536,7 +1605,7 @@ const handleGetetThinkTankReport = async () => { ...@@ -1536,7 +1605,7 @@ const handleGetetThinkTankReport = async () => {
const handleClick = tank => { const handleClick = tank => {
console.log(tank); console.log(tank);
window.sessionStorage.setItem("curTabName", tank.name+'概览'); window.sessionStorage.setItem("curTabName", tank.name + "概览");
// router.push({ name: "ThinkTankDetail", params: { id: tank.id } }); // router.push({ name: "ThinkTankDetail", params: { id: tank.id } });
if (!tank.id) { if (!tank.id) {
ElMessage.warning("当前智库id为空,无法进入详情页"); ElMessage.warning("当前智库id为空,无法进入详情页");
...@@ -1684,7 +1753,102 @@ onMounted(async () => { ...@@ -1684,7 +1753,102 @@ onMounted(async () => {
height: 100%; height: 100%;
position: relative; position: relative;
overflow-y: hidden; overflow-y: hidden;
.search-header {
width: 100%;
height: 144px;
background: #fff;
overflow: hidden;
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.3);
.home-main-header-center {
margin-top: 20px;
margin-left: 200px;
width: 800px;
height: 48px;
border-radius: 10px;
box-shadow: 0px 0px 15px 0px rgba(22, 119, 255, 0.1);
background: rgba(255, 255, 255, 1);
box-sizing: border-box;
padding: 1px;
position: relative;
border: 1px solid transparent;
&:hover {
border: 1px solid var(--color-main-active);
}
.search {
position: absolute;
right: -1px;
top: 0px;
width: 120px;
height: 46px;
border-radius: 10px;
background: var(--color-main-active);
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
.search-icon {
width: 18px;
height: 18px;
img {
width: 100%;
height: 100%;
}
}
.search-text {
margin-left: 8px;
height: 22px;
color: #fff;
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 22px;
}
}
}
.home-main-header-btn-box {
margin-top: 20px;
margin-left: 200px;
display: flex;
gap: 16px;
.btn {
display: flex;
align-items: center;
gap: 9px;
width: 160px;
height: 48px;
border: 1px solid #aed6ff;
box-sizing: border-box;
border-radius: 24px;
background: #e7f3ff;
cursor: pointer;
position: relative;
&:hover {
background: #cae3fc;
}
.btn-text {
width: 80px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 20px;
font-weight: 400;
line-height: 48px;
margin-left: 36px;
text-align: center;
}
.btn-icon {
position: absolute;
top: 16px;
right: 19px;
width: 6px;
height: 12px;
img {
width: 100%;
height: 100%;
}
}
}
}
}
.home-main { .home-main {
width: 100%; width: 100%;
height: 100%; height: 100%;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论