提交 13be0980 authored 作者: yanpeng's avatar yanpeng

bugfix-4 投融资限制

上级 a9c00d6f
......@@ -137,6 +137,16 @@ export function getReasonAndSan(sanRecordId) {
return http.get(`/api/sanctionList/invFin/getReasonAndSan?sanRecordId=${sanRecordId}`);
}
/**
* 分页查询制裁实体清单
* url:/sanctionList/pageQuery
*/
export function getEntitiesList(params) {
return http.post("/api/sanctionList/pageQuery", params);
}
/**
* 制裁历程
* url:/entitiesDataCount/getSanRecord
......
......@@ -117,9 +117,10 @@
</div>
</el-tooltip>
<div class="dynamic-item-tags">
<span v-for="(tag, tIndex) in item.tags" :key="tIndex" class="tag" :class="getTagClass(tag)">
<!-- <span v-for="(tag, tIndex) in item.tags" :key="tIndex" class="tag" :class="getTagClass(tag)">
{{ tag }}
</span>
</span> -->
<AreaTag v-for="(tag, tIndex) in item.tags" :key="tIndex" :tagName="tag" />
</div>
</div>
</div>
......@@ -278,6 +279,7 @@ import { onMounted, ref, computed, inject, watch, onUnmounted } from "vue";
import { useRouter } from "vue-router";
import Echarts from "@/components/Chart/index.vue";
import SimplePagination from "@/components/SimplePagination.vue";
import AreaTag from "@/components/base/AreaTag/index.vue";
import * as echarts from "echarts";
import defaultIcon from "../../assets/defaultIcon.png";
import leftBtn from "../../assets/left-btn.png";
......@@ -510,8 +512,8 @@ const handleNewsClick = item => {
// }
// });
// window.open(href, "_blank");
gotoNewsDetail(item.id);
gotoNewsDetail(item.id);
};
// 点击联合制裁项-如果是政令则跳转详情
......
......@@ -708,10 +708,10 @@ import { useGotoCompanyPages } from "@/router/modules/company";
import { useGotoNewsDetail } from "@/router/modules/news";
const gotoCompanyPages = useGotoCompanyPages();
const gotoNewsDetail = useGotoNewsDetail();
const trendChart = useChartInterpretation();
const radarChart = useChartInterpretation();
const entityListReleaseFreqChart = useChartInterpretation();
const commerceControlListReleaseFreqChart = useChartInterpretation();
// const trendChart = useChartInterpretation();
// const radarChart = useChartInterpretation();
// const entityListReleaseFreqChart = useChartInterpretation();
// const commerceControlListReleaseFreqChart = useChartInterpretation();
import { useRouter } from "vue-router";
import { navigateToViewRiskSignal } from "@/utils/riskSignalOverviewNavigate";
......
......@@ -49,8 +49,8 @@
:class="{ active: currentSanctionId === item.id }"
@click="handleSanctionSelect(item.id)"
>
<!-- <div class="item-left">{{ item.date }}-{{ item.title }}</div> -->
<div class="item-left">{{ item.date }}-实体清单更新</div>
<div class="item-left">{{ item.date }}-{{ item.title }}</div>
<!-- <div class="item-left">{{ item.date }}-实体清单更新</div> -->
<div class="item-right">{{ item.count }}{{ item.unit }}</div>
</div>
</div>
......
......@@ -29,55 +29,20 @@
</AnalysisBox>
</div>
<div class="left-bottom">
<!-- <div class="title">
<div class="box"></div>
<div class="text">实体清单更新历史</div>
<div class="filters">
<el-select v-model="selectedDomain" placeholder="Select"
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-checkbox v-model="onlyChina">只看涉华动态</el-checkbox>
</div>
<div class="btn">
<img src="../../../../assets/下载按钮.png" alt="" />
<img src="../../../../assets/收藏按钮.png" alt="" />
</div>
</div>
<div class="left-bottom-main">
<div class="sanction-list" v-for="item in sanctionList" :key="item.id">
<div class="time">
<div class="year">{{ item.year }}</div>
<div class="date">{{ item.date }}</div>
</div>
<img :src="item.icon || title" alt="" />
<div class="main">
<div class="main-title" @click="handleClick(item)">{{ item.name }}</div>
<el-tooltip effect="dark" :content="item.summary" popper-class="common-prompt-popper" placement="top"
:show-after="500">
<div class="main-desc">{{ item.summary }}</div>
</el-tooltip>
<div class="tag-box">
<div v-for="tag in item.techDomainList" :key="tag" class="tag-item">{{ tag }}</div>
</div>
<div :class="{ 'count-tag': item.cnEntityCount }">
{{ item.cnEntityCount ? `${item.cnEntityCount}家中国实体` : "" }}
</div>
</div>
</div>
</div>
<div class="left-footer">
<div class="total-count"> {{ totalAll }} </div>
<el-pagination v-model:current-page="currentPageAll" :page-size="pageSizeAll" :total="totalAll"
layout="prev, pager, next" background @current-change="handlePageChangeAll" />
</div> -->
<AnalysisBox title="实体清单更新历史" :showAllBtn="false">
<template #header-btn>
<div class="filters">
<el-select v-model="selectedDomain" placeholder="Select"
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
v-model="selectedDomain"
placeholder="Select"
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-checkbox v-model="onlyChina">只看涉华动态</el-checkbox>
</div>
......@@ -91,8 +56,13 @@
<img :src="item.icon || title" alt="" />
<div class="main">
<div class="main-title" @click="handleClick(item)">{{ item.name }}</div>
<el-tooltip effect="dark" :content="item.summary" popper-class="common-prompt-popper" placement="top"
:show-after="500">
<el-tooltip
effect="dark"
:content="item.summary"
popper-class="common-prompt-popper"
placement="top"
:show-after="500"
>
<div class="main-desc">{{ item.summary }}</div>
</el-tooltip>
<div class="tag-box">
......@@ -107,14 +77,20 @@
</div>
<div class="left-footer">
<div class="total-count">共 {{ totalAll }} 项</div>
<el-pagination v-model:current-page="currentPageAll" :page-size="pageSizeAll" :total="totalAll"
layout="prev, pager, next" background @current-change="handlePageChangeAll" />
<el-pagination
v-model:current-page="currentPageAll"
:page-size="pageSizeAll"
:total="totalAll"
layout="prev, pager, next"
background
@current-change="handlePageChangeAll"
/>
</div>
</AnalysisBox>
</div>
</div>
<div class="right">
<AnalysisBox title="发布机构" :showAllBtn="false">
<AnalysisBox title="发布机构" :showAllBtn="false" :height="auto">
<div class="right-main">
<div class="right-main-title" @click="handleClickOrg(publishInfo)">
<img :src="publishInfo.imageUrl" alt="" />
......@@ -130,8 +106,12 @@
<span>关键人物</span>
</div>
<div class="key-person-list">
<div class="person-item" v-for="(item, index) in publishInfo.personList" :key="index"
@click="handlePerClick(item)">
<div
class="person-item"
v-for="(item, index) in publishInfo.personList"
:key="index"
@click="handlePerClick(item)"
>
<img :src="item.imageUrl" alt="" />
<div class="person-info">
<CommonPrompt :content="item.name">
......@@ -160,11 +140,19 @@
</div>
</div>
</div>
<div class="more-btn" v-if="publishOrgInfo.length < dynamicTotal" @click="handleLoadMoreDynamic">
<!-- <div class="more-btn" v-if="publishOrgInfo.length < dynamicTotal" @click="handleLoadMoreDynamic">
<span>查看更多</span>
<el-icon>
<ArrowDown />
</el-icon>
</div> -->
<div class="dynamic-footer">
<simple-pagination
v-model:current-page="dynamicPage"
:page-size="dynamicPageSize"
:total="dynamicTotal"
@page-change="handleListPageChange"
/>
</div>
</div>
</div>
......@@ -176,6 +164,7 @@
<script setup>
import { ref, onMounted, watch } from "vue";
import router from "@/router";
import SimplePagination from "@/components/SimplePagination.vue";
import title from "../../../../assets/title.png";
import defaultIcon from "../../../../../assets/icons/default-avatar.png";
import icon01 from "../../assets/icon01.png";
......@@ -376,7 +365,10 @@ const getPublishOrgInfoFn = async (isLoadMore = false) => {
console.error("获取发布机构动态失败:", error);
}
};
const handleListPageChange = val => {
dynamicPage.value = val;
getPublishOrgInfoFn(false);
};
const handleLoadMoreDynamic = () => {
dynamicPage.value++;
getPublishOrgInfoFn(true);
......@@ -401,17 +393,16 @@ const getEntityInfoFn = async id => {
const sanTypeId = ref("");
// 跳转到数据资源库
const handleToDataLibrary = (item) => {
console.log('item', item);
const handleToDataLibrary = item => {
console.log("item", item);
let domainStr = domainOptions.filter(item => item.value === selectedDomain.value)[0].label
let params
if (domainStr === '全部领域') {
let domainStr = domainOptions.filter(item => item.value === selectedDomain.value)[0].label;
let params;
if (domainStr === "全部领域") {
params = {
isCnEntityOnly: true,
selectedDate: JSON.stringify([item.postDate, item.postDate])
}
};
} else {
params = {
isCnEntityOnly: true,
......@@ -424,8 +415,7 @@ const handleToDataLibrary = (item) => {
query: params
});
window.open(route.href, "_blank");
}
};
onMounted(() => {
sanTypeId.value = route.query.sanTypeId;
......@@ -616,7 +606,7 @@ onMounted(() => {
border-radius: 20px;
background-color: rgba(206, 79, 81, 0.1);
cursor: pointer;
&:hover{
&:hover {
text-decoration: underline;
}
}
......@@ -646,11 +636,13 @@ onMounted(() => {
.right {
width: 520px;
height: 1020px;
height: auto;
// min-height: 900px;
max-height: 1280px;
.right-main {
padding: 7px 24px 20px 23px;
height: 100%;
.right-main-title {
cursor: pointer;
width: 473px;
......@@ -767,7 +759,12 @@ onMounted(() => {
.right-main-dynamic {
width: 100%;
height: 900px;
display: flex;
flex-direction: column;
// justify-content: space-between;
// height: auto;
position: relative;
.dynamic-title {
display: flex;
align-items: center;
......@@ -788,8 +785,9 @@ onMounted(() => {
}
.dynamic-list {
max-height: 500px;
overflow-y: auto;
// max-height: 500px;
height: auto;
// overflow-y: auto;
padding-right: 10px;
/* 滚动条样式 */
......@@ -880,6 +878,11 @@ onMounted(() => {
margin-right: 4px;
}
}
.dynamic-footer {
position: absolute;
bottom: 50px;
left: 180px;
}
}
}
}
......
......@@ -5,9 +5,10 @@
<el-input v-model="searchKeyword" class="search-input" placeholder="搜索实体" :suffix-icon="Search" />
<div class="filters">
<el-checkbox v-model="onlyChina" label="只看中国实体" />
<el-select v-model="order" placeholder="请选择排序方式" style="width: 160px">
<!-- <el-select v-model="order" placeholder="请选择排序方式" style="width: 160px">
<el-option v-for="item in orderOptions" :value="item.value" :key="item.value" :label="item.name" />
</el-select>
</el-select> -->
<TimeSortSelectBox @handle-px-change="handleTimePx" />
</div>
</div>
<div class="main">
......@@ -62,70 +63,6 @@
</div>
</div>
<div class="right">
<!-- <div class="title">
<div class="left-wrapper">
<div class="box"></div>
<div class="text">实体清单</div>
</div>
<div class="right-wrapper">
<div class="stats">
<div class="dot"></div>
<div class="count-text"><span class="highlight">{{ ruleCount.totalCount }}</span></div>
<div class="rule-text">(50%规则涉及<span class="highlight">{{ ruleCount.ruleCount }}</span>家)</div>
</div>
<div class="btn">
<img src="../../../../assets/下载按钮.png" alt="" />
<img src="../../../../assets/收藏按钮.png" alt="" />
</div>
</div>
</div> -->
<!-- <div class="right-table">
<el-table :data="entityRows" table-layout="fixed" :row-class-name="tableRowClassName"
:header-cell-style="{ background: '#fff' }">
<el-table-column label="实体名称" min-width="200">
<template #default="{ row }">
<div class="entity-name-cell" @click="handleCompClick(row)">
<el-image v-if="row.img" class="avatar" :src="row.img" alt=""></el-image>
<div v-else class="avatar-undefined">
{{
(row.entityNameZh || row.entityName)?.match(
/[\u4e00-\u9fa5a-zA-Z0-9]/
)?.[0]
}}
</div>
<CommonPrompt :content="row.entityNameZh || row.entityName" style="flex: 1; overflow: hidden" />
</div>
</template>
</el-table-column>
<el-table-column label="涉及领域" min-width="150">
<template #default="{ row }">
<div class="domain-cell">
<el-tag v-for="tag in row.techDomains" :key="tag" class="domain-tag" effect="plain"
:disable-transitions="true" :style="getTagStyle(tag)">
{{ tag }}
</el-tag>
</div>
</template>
</el-table-column>
<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">
<template #default="{ row }">
<div class="rule-cell" v-if="row.ruleOrgCount > 0">
<div class="rule-text" :title="row.ruleOrgList?.[0]?.orgName || ''">
{{ row.ruleOrgList?.[0]?.orgName || '' }}...等
</div>
<el-link class="rule-link" type="primary" :underline="false" @click="handleRuleClick(row)">{{
row.ruleOrgCount }}家 ></el-link>
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="tight-footer">
<div class="total-text">共 {{ total }} 项</div>
<el-pagination :current-page="currentPage" v-model:page-size="pageSize" :total="total" layout="prev, pager, next"
prev-text="<" next-text=">" @current-change="handleCurrentChange" />
</div> -->
<AnalysisBox title="实体清单" :showAllBtn="false">
<template #header-btn>
<div class="stats">
......@@ -147,7 +84,11 @@
table-layout="fixed"
:row-class-name="tableRowClassName"
:header-cell-style="{ background: '#fff' }"
v-loading="tableLoading"
>
<template #empty>
<el-empty description="暂无数据" />
</template>
<el-table-column label="实体名称" min-width="200">
<template #default="{ row }">
<div class="entity-name-cell" @click="handleCompClick(row)">
......@@ -162,10 +103,10 @@
</div>
</template>
</el-table-column>
<el-table-column label="涉及领域" min-width="150">
<el-table-column label="涉及领域" min-width="200">
<template #default="{ row }">
<div class="domain-cell">
<el-tag
<!-- <el-tag
v-for="tag in row.techDomains"
:key="tag"
class="domain-tag"
......@@ -174,7 +115,12 @@
:style="getTagStyle(tag)"
>
{{ tag }}
</el-tag>
</el-tag> -->
<AreaTag
v-for="(tag, index) in getDisplayTags(row.techDomains)"
:key="index"
:tagName="tag"
/>
</div>
</template>
</el-table-column>
......@@ -241,16 +187,18 @@ import { useRouter } from "vue-router";
import { Search } from "@element-plus/icons-vue";
import defaultIcon from "../../../../../assets/icons/default-avatar.png";
import RuleSubsidiaryDialog from "./RuleSubsidiaryDialog.vue";
import AreaTag from "@/components/base/AreaTag/index.vue";
import { getExportControlList, get50PercentEntityCount } from "@/api/exportControlV2.0.js";
import CommonPrompt from "@/views/exportControl/commonPrompt/index.vue";
import { useGotoCompanyPages } from "@/router/modules/company";
import TimeSortSelectBox from "@/components/base/TimeSortSelectBox/index.vue";
const gotoCompanyPages = useGotoCompanyPages();
const router = useRouter();
const order = ref("asc");
const orderOptions = ref([
{ name: "正序", value: "asc" },
{ name: "倒序", value: "desc" }
{ name: "倒序", value: "desc" },
{ name: "正序", value: "asc" }
]);
// 跳转公司详情页
const handleCompClick = item => {
......@@ -274,6 +222,7 @@ const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(0);
const tableLoading = ref(false);
const entityRows = computed(() => mainList.value);
const handleCurrentChange = val => {
......@@ -282,6 +231,43 @@ const handleCurrentChange = val => {
getExportControlListApi();
};
// 辅助函数:计算需要显示的标签
const getDisplayTags = domains => {
if (!domains || domains.length === 0) return [];
// 1. 获取当前用户选中的领域名称 (排除"全部")
const selectedValues = techFields.value.filter(item => item.checked && item.value !== "all").map(item => item.label); // 注意:techFields中存储的是 label 作为显示名称
// 如果没选中任何特定领域(即选中了“全部”或都没选),直接返回前3个
if (selectedValues.length === 0) {
return domains.slice(0, 3);
}
// 2. 分离 domains 中 "已选中" 和 "未选中" 的部分
const matched = [];
const others = [];
domains.forEach(tag => {
if (selectedValues.includes(tag)) {
matched.push(tag);
} else {
others.push(tag);
}
});
// 3. 组合结果:优先显示匹配的,不足的用其他的补齐,总数限制为3
const result = [...matched];
// 如果匹配的不足3个,从 others 中取剩余的配额
if (result.length < 3) {
const remainingCount = 3 - result.length;
result.push(...others.slice(0, remainingCount));
}
// 如果匹配的超过3个,只取前3个(虽然通常匹配不会这么多,但做个保护)
return result.slice(0, 3);
};
const getTagStyle = tag => {
// 预设颜色池
const colorPool = [
......@@ -342,7 +328,7 @@ const sanctionTimes = ref([
{ label: "2024年", value: "2024", checked: false },
{ label: "2023年", value: "2023", checked: false },
{ label: "2022年", value: "2022", checked: false },
{ label: "2021年", value: "2021", checked: false },
// { label: "2021年", value: "2021", checked: false },
{ label: "自定义", value: "custom", checked: false }
]);
......@@ -413,6 +399,7 @@ const ruleCount = ref(0);
let abortController = null;
const getExportControlListApi = async () => {
tableLoading.value = true;
// 取消上一轮未完成的请求
if (abortController) {
try {
......@@ -478,8 +465,10 @@ const getExportControlListApi = async () => {
try {
const res = await getExportControlList(data, { signal: abortController.signal });
tableLoading.value = false;
// 50%规则涉及实体数
const countRes = await get50PercentEntityCount(data);
if (countRes.code === 200) {
ruleCount.value = countRes.data;
}
......@@ -491,9 +480,11 @@ const getExportControlListApi = async () => {
if (!error || (error.code !== "ERR_CANCELED" && error.name !== "CanceledError" && error.name !== "AbortError")) {
console.error(error);
}
tableLoading.value = false;
} finally {
isFetching.value = false;
abortController = null;
tableLoading.value = false;
}
};
......@@ -501,8 +492,13 @@ const getExportControlListApi = async () => {
// currentPage.value = 1;
// getExportControlListApi();
// });
watch([onlyChina, order], () => {
const handleTimePx = data => {
console.log("选择排序", data);
currentPage.value = 1;
order.value = orderOptions.value[data - 1].value;
getExportControlListApi();
};
watch([onlyChina], () => {
currentPage.value = 1;
getExportControlListApi();
});
......
......@@ -43,7 +43,7 @@ defineProps({
.title-text {
color: rgba(10, 18, 30, 1);
font-size: 32px;
font-family: "Microsoft YaHei";
font-family: "Source Han Sans CN";
font-weight: 700;
margin-left: 20px;
white-space: nowrap;
......
......@@ -50,8 +50,8 @@
:class="{ active: currentSanctionId === item.id }"
@click="handleSanctionSelect(item.id)"
>
<!-- <div class="item-left">{{ item.date }}-{{ item.title }}</div> -->
<div class="item-left">{{ item.date }}-SDN清单更新</div>
<div class="item-left">{{ item.date }}-{{ item.title }}</div>
<!-- <div class="item-left">{{ item.date }}-SDN清单更新</div> -->
<div class="item-right">{{ item.count }}{{ item.unit }}</div>
</div>
</div>
......@@ -455,6 +455,7 @@ const stopAutoPlay = () => {
// ✅ 自动下一个(支持循环)
const handleNextClickAuto = () => {
const currentIndex = sanctionList.value.findIndex(item => item.id === currentSanctionId.value);
console.log("现在的currentIndex", currentIndex);
let nextItem;
if (currentIndex < sanctionList.value.length - 1) {
......@@ -473,6 +474,7 @@ const handlePrevClick = () => {
const currentIndex = sanctionList.value.findIndex(item => item.id === currentSanctionId.value);
if (currentIndex > 0) {
const prevItem = sanctionList.value[currentIndex - 1];
console.log("prevItem", prevItem);
handleSanctionSelect(prevItem.id);
// startAutoPlay();
}
......@@ -491,7 +493,7 @@ const handleSanctionSelect = id => {
currentSanctionId.value = id;
getFishboneData();
// getCnEntityOnChainData();
startAutoPlay();
// startAutoPlay();
};
const activeTab = ref(["制裁时序分析", "限制关联分析"]);
......
......@@ -75,9 +75,17 @@
<AnalysisBox title="实体清单更新历史" :showAllBtn="false">
<template #header-btn>
<div class="filters">
<el-select v-model="selectedDomain" placeholder="Select"
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
v-model="selectedDomain"
placeholder="Select"
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-checkbox v-model="onlyChina">只看涉华动态</el-checkbox>
</div>
......@@ -91,8 +99,13 @@
<img :src="item.icon || title" alt="" />
<div class="main">
<div class="main-title" @click="handleClick(item)">{{ item.name }}</div>
<el-tooltip effect="dark" :content="item.summary" popper-class="common-prompt-popper" placement="top"
:show-after="500">
<el-tooltip
effect="dark"
:content="item.summary"
popper-class="common-prompt-popper"
placement="top"
:show-after="500"
>
<div class="main-desc">{{ item.summary }}</div>
</el-tooltip>
<div class="tag-box">
......@@ -107,8 +120,14 @@
</div>
<div class="left-footer">
<div class="total-count"> {{ totalAll }} </div>
<el-pagination v-model:current-page="currentPageAll" :page-size="pageSizeAll" :total="totalAll"
layout="prev, pager, next" background @current-change="handlePageChangeAll" />
<el-pagination
v-model:current-page="currentPageAll"
:page-size="pageSizeAll"
:total="totalAll"
layout="prev, pager, next"
background
@current-change="handlePageChangeAll"
/>
</div>
</AnalysisBox>
</div>
......@@ -130,8 +149,12 @@
<span>关键人物</span>
</div>
<div class="key-person-list">
<div class="person-item" v-for="(item, index) in publishInfo.personList" :key="index"
@click="handlePerClick(item)">
<div
class="person-item"
v-for="(item, index) in publishInfo.personList"
:key="index"
@click="handlePerClick(item)"
>
<img :src="item.imageUrl" alt="" />
<div class="person-info">
<CommonPrompt :content="item.name">
......@@ -160,11 +183,19 @@
</div>
</div>
</div>
<div class="more-btn" v-if="publishOrgInfo.length < dynamicTotal" @click="handleLoadMoreDynamic">
<!-- <div class="more-btn" v-if="publishOrgInfo.length < dynamicTotal" @click="handleLoadMoreDynamic">
<span>查看更多</span>
<el-icon>
<ArrowDown />
</el-icon>
</div> -->
<div class="dynamic-footer">
<simple-pagination
v-model:current-page="dynamicPage"
:page-size="dynamicPageSize"
:total="dynamicTotal"
@page-change="handleListPageChange"
/>
</div>
</div>
</div>
......@@ -177,7 +208,7 @@
import { ref, onMounted, watch } from "vue";
import router from "@/router";
import title from "../../../../assets/title.png";
import defaultIcon from "../../../../../assets/icons/default-avatar.png";
import SimplePagination from "@/components/SimplePagination.vue";
import icon01 from "../../assets/icon01.png";
import icon02 from "../../assets/icon02.png";
import { ArrowDown } from "@element-plus/icons-vue";
......@@ -376,6 +407,10 @@ const getPublishOrgInfoFn = async (isLoadMore = false) => {
console.error("获取发布机构动态失败:", error);
}
};
const handleListPageChange = val => {
dynamicPage.value = val;
getPublishOrgInfoFn(false);
};
const handleLoadMoreDynamic = () => {
dynamicPage.value++;
......@@ -401,17 +436,16 @@ const getEntityInfoFn = async id => {
const sanTypeId = ref("");
// 跳转到数据资源库
const handleToDataLibrary = (item) => {
const handleToDataLibrary = item => {
// console.log('item', item);
let domainStr = domainOptions.filter(item => item.value === selectedDomain.value)[0].label
let params
if (domainStr === '全部领域') {
let domainStr = domainOptions.filter(item => item.value === selectedDomain.value)[0].label;
let params;
if (domainStr === "全部领域") {
params = {
isCnEntityOnly: true,
selectedDate: JSON.stringify([item.postDate, item.postDate])
}
};
} else {
params = {
isCnEntityOnly: true,
......@@ -424,8 +458,7 @@ const handleToDataLibrary = (item) => {
query: params
});
window.open(route.href, "_blank");
}
};
onMounted(() => {
sanTypeId.value = route.query.sanTypeId;
......@@ -647,11 +680,13 @@ onMounted(() => {
.right {
width: 520px;
height: 1020px;
height: auto;
// min-height: 900px;
max-height: 1200px;
.right-main {
padding: 7px 24px 20px 23px;
height: 100%;
.right-main-title {
cursor: pointer;
width: 473px;
......@@ -768,6 +803,10 @@ onMounted(() => {
.right-main-dynamic {
width: 100%;
height: 900px;
display: flex;
flex-direction: column;
position: relative;
.dynamic-title {
display: flex;
......@@ -789,8 +828,8 @@ onMounted(() => {
}
.dynamic-list {
max-height: 500px;
overflow-y: auto;
// max-height: 500px;
// overflow-y: auto;
padding-right: 10px;
/* 滚动条样式 */
......@@ -867,6 +906,12 @@ onMounted(() => {
}
}
.dynamic-footer {
position: absolute;
bottom: 50px;
left: 180px;
}
.more-btn {
width: 100%;
display: flex;
......
......@@ -5,9 +5,10 @@
<el-input v-model="searchKeyword" class="search-input" placeholder="搜索实体" :suffix-icon="Search" />
<div class="filters">
<el-checkbox v-model="onlyChina" label="只看中国实体" />
<el-select v-model="order" placeholder="请选择排序方式" style="width: 160px">
<!-- <el-select v-model="order" placeholder="请选择排序方式" style="width: 160px">
<el-option v-for="item in orderOptions" :value="item.value" :key="item.value" :label="item.name" />
</el-select>
</el-select> -->
<TimeSortSelectBox @handle-px-change="handleTimePx" />
</div>
</div>
<div class="main">
......@@ -62,79 +63,17 @@
</div>
</div>
<div class="right">
<!-- <div class="title">
<div class="left-wrapper">
<div class="box"></div>
<div class="text">实体清单</div>
</div>
<div class="right-wrapper">
<div class="stats">
<div class="dot"></div>
<div class="count-text"><span class="highlight">{{ ruleCount.totalCount }}</span></div>
<div class="rule-text">(50%规则涉及<span class="highlight">{{ ruleCount.ruleCount }}</span>家)</div>
</div>
<div class="btn">
<img src="../../../../assets/下载按钮.png" alt="" />
<img src="../../../../assets/收藏按钮.png" alt="" />
</div>
</div>
</div> -->
<!-- <div class="right-table">
<el-table :data="entityRows" table-layout="fixed" :row-class-name="tableRowClassName"
:header-cell-style="{ background: '#fff' }">
<el-table-column label="实体名称" min-width="200">
<template #default="{ row }">
<div class="entity-name-cell" @click="handleCompClick(row)">
<el-image v-if="row.img" class="avatar" :src="row.img" alt=""></el-image>
<div v-else class="avatar-undefined">
{{
(row.entityNameZh || row.entityName)?.match(
/[\u4e00-\u9fa5a-zA-Z0-9]/
)?.[0]
}}
</div>
<CommonPrompt :content="row.entityNameZh || row.entityName" style="flex: 1; overflow: hidden" />
</div>
</template>
</el-table-column>
<el-table-column label="涉及领域" min-width="150">
<template #default="{ row }">
<div class="domain-cell">
<el-tag v-for="tag in row.techDomains" :key="tag" class="domain-tag" effect="plain"
:disable-transitions="true" :style="getTagStyle(tag)">
{{ tag }}
</el-tag>
</div>
</template>
</el-table-column>
<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">
<template #default="{ row }">
<div class="rule-cell" v-if="row.ruleOrgCount > 0">
<div class="rule-text" :title="row.ruleOrgList?.[0]?.orgName || ''">
{{ row.ruleOrgList?.[0]?.orgName || '' }}...等
</div>
<el-link class="rule-link" type="primary" :underline="false" @click="handleRuleClick(row)">{{
row.ruleOrgCount }}家 ></el-link>
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="tight-footer">
<div class="total-text">共 {{ total }} 项</div>
<el-pagination :current-page="currentPage" v-model:page-size="pageSize" :total="total" layout="prev, pager, next"
prev-text="<" next-text=">" @current-change="handleCurrentChange" />
</div> -->
<AnalysisBox title="实体清单" :showAllBtn="false">
<template #header-btn>
<div class="stats">
<div class="dot"></div>
<div class="count-text">
<span class="highlight" @click="handlToDataLibrary">{{ ruleCount.totalCount }}</span>
<span class="highlight" @click="handlToDataLibrary">{{ ruleCount.totalCount }}</span>
</div>
<div class="rule-text">
(50%规则涉及<span class="highlight" @click="handlToDataLibrary1">{{ ruleCount.ruleCount }}</span
(50%规则涉及<span class="highlight" @click="handlToDataLibrary1">{{
ruleCount.ruleCount
}}</span
>家)
</div>
</div>
......@@ -145,7 +84,11 @@
table-layout="fixed"
:row-class-name="tableRowClassName"
:header-cell-style="{ background: '#fff' }"
v-loading="tableLoading"
>
<template #empty>
<el-empty />
</template>
<el-table-column label="实体名称" min-width="200">
<template #default="{ row }">
<div class="entity-name-cell" @click="handleCompClick(row)">
......@@ -237,6 +180,7 @@
import { ref, computed, onMounted, watch } from "vue";
import { useRouter } from "vue-router";
import { Search } from "@element-plus/icons-vue";
import TimeSortSelectBox from "@/components/base/TimeSortSelectBox/index.vue";
import defaultIcon from "../../../../../assets/icons/default-avatar.png";
import RuleSubsidiaryDialog from "./RuleSubsidiaryDialog.vue";
import { getExportControlList, get50PercentEntityCount } from "@/api/exportControlV2.0.js";
......@@ -245,10 +189,10 @@ import { useGotoCompanyPages } from "@/router/modules/company";
const gotoCompanyPages = useGotoCompanyPages();
const router = useRouter();
const order = ref("asc");
const order = ref("desc");
const orderOptions = ref([
{ name: "正序", value: "asc" },
{ name: "倒序", value: "desc" }
{ name: "倒序", value: "desc" },
{ name: "正序", value: "asc" }
]);
// 跳转公司详情页
const handleCompClick = item => {
......@@ -409,8 +353,14 @@ const mainList = ref([]);
const isFetching = ref(false);
const ruleCount = ref(0);
const handleTimePx = val => {
console.log(val);
order.value = orderOptions.value[val - 1].value;
};
const tableLoading = ref(false);
let abortController = null;
const getExportControlListApi = async () => {
tableLoading.value = true;
// 取消上一轮未完成的请求
if (abortController) {
try {
......@@ -475,6 +425,7 @@ const getExportControlListApi = async () => {
try {
const res = await getExportControlList(data, { signal: abortController.signal });
tableLoading.value = false;
// 50%规则涉及实体数
const countRes = await get50PercentEntityCount(data);
if (countRes.code === 200) {
......@@ -488,9 +439,11 @@ const getExportControlListApi = async () => {
if (!error || (error.code !== "ERR_CANCELED" && error.name !== "CanceledError" && error.name !== "AbortError")) {
console.error(error);
}
tableLoading.value = false;
} finally {
isFetching.value = false;
abortController = null;
tableLoading.value = false;
}
};
......@@ -530,26 +483,25 @@ watch(customDateRange, () => {
// 跳转到数据资源库
const handlToDataLibrary = () => {
const params = {
isCnEntityOnly: true,
isCnEntityOnly: true
};
const route = router.resolve({
path: "/dataLibrary/sDNList",
query: params
});
window.open(route.href, "_blank");
}
};
const handlToDataLibrary1 = () => {
const params = {
isCnEntityOnly: true,
isHalfRule: true,
isHalfRule: true
};
const route = router.resolve({
path: "/dataLibrary/sDNList",
query: params
});
window.open(route.href, "_blank");
}
};
</script>
<style scoped lang="scss">
......@@ -587,7 +539,7 @@ const handlToDataLibrary1 = () => {
.filters {
display: flex;
// align-items: center;
align-items: center;
.el-checkbox {
margin-right: 20px;
......
......@@ -29,7 +29,7 @@ import listPage from "./components/listPage/index.vue";
const emit = defineEmits(["update-entity-info"]);
const activeTab = ref(["实体清单列表", "实体清单简介"]);
const activeTab = ref(["SDN清单列表", "SDN清单简介"]);
const activeIndex = ref(0);
const handleClickTab = index => {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论