提交 1d17e391 authored 作者: yanpeng's avatar yanpeng

finance api

上级 cb0a0e8a
流水线 #331 已通过 于阶段
in 1 分 39 秒
......@@ -30,7 +30,7 @@ import { http } from "./service.js";
/**
* 总次数统计
*/
*/
export function getDataCount() {
return http.get("/api/sanctionList/invFin/getTotalInfo");
}
......@@ -38,7 +38,7 @@ export function getDataCount() {
/**
* 最新出口管制政策
* url:/sanctionList/invFin/getLatestEntityListInfo
*/
*/
export function getLatestEntityListInfo() {
return http.get("/api/sanctionList/invFin/getLatestEntityListInfo");
}
......@@ -46,31 +46,31 @@ export function getLatestEntityListInfo() {
/**
* 风险信号
* url:/commonFeature/riskSignal/{moduleId}
*/
export function getRiskSignal(moduleId='0104') {
*/
export function getRiskSignal(moduleId = "0104") {
return http.get(`/api/commonFeature/riskSignal/${moduleId}`);
}
/**
* 新闻资讯
* url:/commonFeature/news/{moduleId}
*/
export function getNewsInfo(moduleId='0104') {
*/
export function getNewsInfo(moduleId = "0104") {
return http.get(`/api/commonFeature/news/${moduleId}`);
}
/**
* 社交媒体信息
* url:/commonFeature/remarks/{moduleId}
*/
export function getSocialMediaInfo(moduleId='0104') {
*/
export function getSocialMediaInfo(moduleId = "0104") {
return http.get(`/api/commonFeature/remarks/${moduleId}`);
}
/**
* 发布频度
* url:/entitiesDataCount/getAnnualCount
*/
*/
export function getReleaseCount(id) {
return http.get(`/api/entitiesDataCount/getAnnualCount?sanTypeId=${id}`);
}
......@@ -78,7 +78,7 @@ export function getReleaseCount(id) {
/**
* 制裁领域分析
* url:/entitiesDataCount/getSanDomainCount
*/
*/
export function getSanDomainCount(sanTypeIds) {
return http.get(`/api/entitiesDataCount/getSanDomainCount?sanTypeIds=${sanTypeIds}`);
}
......@@ -86,7 +86,7 @@ export function getSanDomainCount(sanTypeIds) {
/**
* 制裁清单增长趋势
* url:/entitiesDataCount/getAnnualSanDomain
*/
*/
export function getAnnualSanDomain(params) {
return http.post("/api/entitiesDataCount/getAnnualSanDomain", params);
}
......@@ -94,13 +94,37 @@ export function getAnnualSanDomain(params) {
/**
* 全部制裁(历史制裁过程)
* url:/entitiesDataCount/getSanctionProcess
*/
*/
export function getSanctionProcess(sanTypeIds = "1", pageNum = 1, pageSize = 10, isCn = false) {
return http.post("/api/entitiesDataCount/getSanctionProcess",{
return http.post("/api/entitiesDataCount/getSanctionProcess", {
sanTypeIds,
// typeName: tabMap[sanTypeId],
pageNum,
pageSize,
isCn
// typeName: tabMap[sanTypeId],
pageNum,
pageSize,
isCn
});
}
/**
* 制裁实体领域数量变化情况
* url:/sanctionList/statistics/domainNum
*/
export function getDomainNum(params) {
return http.get("/api/sanctionList/statistics/domainNum", params);
}
/**
* 获取制裁实体类型分布列表
* url:/sanctionList/statistics/entityTypeId
*/
export function getEntityTypeCount(params) {
return http.get("/api/sanctionList/statistics/entityTypeId", params);
}
/**
* 新闻链接
* url:/sanctionList/invFin/getRelateNews
*/
export function getRelateNews(sanRecordId) {
return http.get(`/api/sanctionList/invFin/getRelateNews?sanRecordId=${sanRecordId}`);
}
// 出口管制
const ExportControl = () => import('@/views/exportControl/index.vue')
const ExportControl = () => import("@/views/exportControl/index.vue");
const exportControlRoutes = [
// 出口管制首页
{
path: "/exportControl",
name: "ExportControl",
component: ExportControl,
meta: {
title: "出口管制概览",
isShowHeader: true
}
},
{
path: "/exportControlAnalysis",
name: "exportControlAnalysis",
component: () => import("@/views/exportControl/analysis/index.vue"),
redirect: "/exportControlAnalysis/overview",
meta: {
title: "分析页"
},
children: [
{
path: "overview",
name: "exportControlAnalysisOverview",
component: () => import("@/views/exportControl/analysis/content/overview.vue"),
meta: {
title: "制裁概况"
}
},
{
path: "deepDig",
name: "exportControlAnalysisDeepDig",
component: () => import("@/views/exportControl/analysis/content/deepDig.vue"),
meta: {
title: "深度挖掘"
}
},
{
path: "influence",
name: "exportControlAnalysisInfluence",
component: () => import("@/views/exportControl/analysis/content/influence.vue"),
meta: {
title: "影响分析"
}
},
]
},
{
path: "/exportControl/analysis",
name: "analysis",
component: () => import("@/views/exportControl/analysis/index.vue"),
meta: {
title: "分析页"
}
},
{
path: "/exportControl/infoplatform",
name: "infoplatform",
component: () => import("@/views/exportControl/infoPlatform/index.vue"),
meta: {
title: "信息平台"
}
},
{
path: "/exportControl/rulelimit",
name: "rulelimit",
component: () => import("@/views/exportControl/ruleLimit/index.vue"),
meta: {
title: "规则限制"
}
},
{
path: "/exportControl/ruledetail",
name: "ruledetail",
component: () => import("@/views/exportControl/ruleDetail/index.vue"),
meta: {
title: "规则详情"
}
},
{
path: "/exportControl/researchfunding",
name: "researchfunding",
component: () => import("@/views/exportControl/researchFunding/index.vue"),
meta: {
title: "科研资助"
}
},
// V2.0全部实体清单
{
path: "/exportControl/entityList",
name: "entityList",
component: () => import("@/views/exportControl/v2.0EntityList/index.vue"),
meta: {
title: "实体清单概览"
}
},
// V2.0单条制裁详情
{
path: "/exportControl/singleSanction",
name: "singleSanction",
component: () => import("@/views/exportControl/v2.0SingleSanction/index.vue"),
meta: {
title: "单条制裁详情",
dynamicTitle: true
}
},
// V2.0单条制裁详情-实体清单原文
{
path: "/exportControl/origin",
name: "entityListOrigin",
component: () => import("@/views/exportControl/v2.0SingleSanction/originPage/index.vue"),
// meta: {
// title: "实体清单原文"
// }
},
// V2.0全部实体清单
{
path: "/exportControl/commercialControlList",
name: "commercialControlList",
component: () => import("@/views/exportControl/v2.0CommercialControlList/index.vue"),
meta: {
title: "商业管制清单概览"
}
}
]
// 出口管制首页
{
path: "/exportControl",
name: "ExportControl",
component: ExportControl,
meta: {
title: "出口管制概览",
isShowHeader: true
}
},
{
path: "/exportControlAnalysis",
name: "exportControlAnalysis",
component: () => import("@/views/exportControl/analysis/index.vue"),
redirect: "/exportControlAnalysis/overview",
meta: {
title: "分析页"
},
children: [
{
path: "overview",
name: "exportControlAnalysisOverview",
component: () => import("@/views/exportControl/analysis/content/overview.vue"),
meta: {
title: "制裁概况"
}
},
{
path: "deepDig",
name: "exportControlAnalysisDeepDig",
component: () => import("@/views/exportControl/analysis/content/deepDig.vue"),
meta: {
title: "深度挖掘"
}
},
{
path: "influence",
name: "exportControlAnalysisInfluence",
component: () => import("@/views/exportControl/analysis/content/influence.vue"),
meta: {
title: "影响分析"
}
}
]
},
{
path: "/exportControl/analysis",
name: "analysis",
component: () => import("@/views/exportControl/analysis/index.vue"),
meta: {
title: "分析页"
}
},
{
path: "/exportControl/infoplatform",
name: "infoplatform",
component: () => import("@/views/exportControl/infoPlatform/index.vue"),
meta: {
title: "信息平台"
}
},
{
path: "/exportControl/rulelimit",
name: "rulelimit",
component: () => import("@/views/exportControl/ruleLimit/index.vue"),
meta: {
title: "规则限制"
}
},
{
path: "/exportControl/ruledetail",
name: "ruledetail",
component: () => import("@/views/exportControl/ruleDetail/index.vue"),
meta: {
title: "规则详情"
}
},
{
path: "/exportControl/researchfunding",
name: "researchfunding",
component: () => import("@/views/exportControl/researchFunding/index.vue"),
meta: {
title: "科研资助"
}
},
// V2.0全部实体清单
{
path: "/exportControl/entityList",
name: "entityList",
component: () => import("@/views/exportControl/v2.0EntityList/index.vue"),
meta: {
title: "实体清单概览"
}
},
// V2.0单条制裁详情
{
path: "/exportControl/singleSanction",
name: "singleSanction",
component: () => import("@/views/exportControl/v2.0SingleSanction/index.vue"),
meta: {
title: "单条制裁详情",
dynamicTitle: true
}
},
// V2.0单条制裁详情-实体清单原文
{
path: "/exportControl/origin",
name: "entityListOrigin",
component: () => import("@/views/exportControl/v2.0SingleSanction/originPage/index.vue")
// meta: {
// title: "实体清单原文"
// }
},
// V2.0商业制裁清单
{
path: "/exportControl/commercialControlList",
name: "commercialControlList",
component: () => import("@/views/exportControl/v2.0CommercialControlList/index.vue"),
meta: {
title: "商业管制清单概览"
}
}
];
export default exportControlRoutes
\ No newline at end of file
export default exportControlRoutes;
// 投融资限制
const Finance = () => import('@/views/finance/index.vue')
const Finance = () => import("@/views/finance/index.vue");
const financeRoutes = [
// 投融资限制
{
path: "/finance",
name: "Finance",
component: Finance,
meta: {
title: "投融资限制概览",
isShowHeader: true
}
},
// 投融资限制
{
path: "/finance",
name: "Finance",
component: Finance,
meta: {
title: "投融资限制概览",
isShowHeader: true
}
},
// SDN制裁清单概览
{
path: "/finance/sdnlistoverview",
name: "sdnlistOverview",
component: () => import("@/views/finance/v2.0EntityList/index.vue"),
meta: {
title: "SDN制裁清单概览"
}
},
// V2.0单条制裁详情
{
path: "/finance/singleSanction",
name: "singleSanction",
component: () => import("@/views/finance/v2.0SingleSanction/index.vue"),
meta: {
title: "单条制裁详情",
dynamicTitle: true
}
},
// V2.0单条制裁详情-实体清单原文
{
path: "/exportControl/origin",
name: "entityListOrigin",
component: () => import("@/views/exportControl/v2.0SingleSanction/originPage/index.vue")
// meta: {
// title: "实体清单原文"
// }
},
// V2.0商业制裁清单
{
path: "/finance/cmccontrolList",
name: "cmccontrolList",
component: () => import("@/views/finance/v2.0CommercialControlList/index.vue"),
meta: {
title: "涉军企业清单概览"
}
}
];
]
export default financeRoutes
\ No newline at end of file
export default financeRoutes;
......@@ -1045,7 +1045,7 @@ const handleToEntityList = item => {
entitiesDataInfoList.value[currentCarouselIndex.value].postDate + " 《实体清单新增条目》"
);
const routeData = router.resolve({
path: "/exportControl/singleSanction",
path: "/finance/singleSanction",
query: {
id,
sanTypeId
......@@ -1057,19 +1057,18 @@ const handleToEntityList = item => {
// 跳转到V2.0实体清单无ID
const handleToEntityListNoId = item => {
console.log("这是什么数据 =>", item);
if (item.nameZh == "实体清单") {
if (item.id == allSanTypeIds.value[0]) {
const routeData = router.resolve({
path: "/exportControl/entityList",
path: "/finance/sdnlistoverview",
query: {
sanTypeId: item.id
}
});
// 打开一个新页面
window.open(routeData.href, "_blank");
} else if (item.nameZh == "商业管制清单") {
} else if (item.id == allSanTypeIds.value[1]) {
const routeData = router.resolve({
path: "/exportControl/commercialControlList",
path: "/finance/cmccontrolList",
query: {
sanTypeId: item.id
}
......
......@@ -104,19 +104,8 @@
</div>
</div>
</template>
<!-- <div class="echarts" ref="sanctionCountChartRef"></div> -->
<EChart :option="sanctionCountChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }" />
<!-- <div class="bottom">
<div class="ai">
<div class="left">
<img :src="ai" alt="" class="icon1" />
<div class="text">美国对中国的制裁近年来呈现显著增长趋势。</div>
</div>
<div class="right">
<img :src="right" alt="" class="icon2" />
</div>
</div>
</div> -->
<div class="data-origin-box">
<div class="data-origin-icon">
<img :src="tipsIcon" alt="" />
......@@ -129,7 +118,7 @@
</div>
</AnalysisBox>
</div>
<div class="main-item">
<!-- <div class="main-item">
<AnalysisBox title="制裁实体各省分布情况">
<template #header-btn>
<el-select v-model="regionTime" class="time-select" placeholder="请选择" @change="getRegionCountData">
......@@ -155,17 +144,6 @@
</div>
</div>
</div>
<!-- <div class="bottom">
<div class="ai">
<div class="left">
<img :src="ai" alt="" class="icon1" />
<div class="text">我国被制裁实体多分布于沿海经济活跃省份。</div>
</div>
<div class="right">
<img :src="right" alt="" class="icon2" />
</div>
</div>
</div> -->
<div class="data-origin-box">
<div class="data-origin-icon">
<img :src="tipsIcon" alt="" />
......@@ -177,7 +155,7 @@
<AiPane :aiContent="rankChart.interpretation" />
</div>
</AnalysisBox>
</div>
</div> -->
<div class="main-item">
<AnalysisBox title="制裁实体领域分布情况">
<template #header-btn>
......@@ -185,19 +163,47 @@
<el-option v-for="item in timeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</template>
<!-- <div class="echarts" ref="domainChartRef"></div> -->
<EChart :option="domainChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }" />
<!-- <div class="bottom">
<div class="ai">
<div class="left">
<img :src="ai" alt="" class="icon1" />
<div class="text">美国对中国的制裁集中在半导体、人工智能等领域。</div>
<div class="data-origin-box">
<div class="data-origin-icon">
<img :src="tipsIcon" alt="" />
</div>
<div class="data-origin-text">进入实体清单的中国实体领域分布情况,数据来源:美国商务部官网</div>
</div>
<div class="ai-pane">
<AiButton />
<AiPane :aiContent="domainChart.interpretation" />
</div>
</AnalysisBox>
</div>
<div class="main-item">
<AnalysisBox title="制裁实体领域数量变化情况">
<!-- <template #header-btn>
<el-select v-model="domainTime" class="time-select" placeholder="请选择" @change="getDomainCountData">
<el-option v-for="item in timeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</template> -->
<template #header-btn>
<div class="toggle-btns">
<div
class="t-btn"
:class="{ active: activeDomainTab === 'year' }"
@click="handleDomainTabChange('year')"
>
按年度
</div>
<div class="right">
<img :src="right" alt="" class="icon2" />
<div
class="t-btn"
:class="{ active: activeDomainTab === 'sanction' }"
@click="handleDomainTabChange('sanction')"
>
按制裁
</div>
</div>
</div> -->
</template>
<EChart :option="domainNumChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }" />
<div class="data-origin-box">
<div class="data-origin-icon">
<img :src="tipsIcon" alt="" />
......@@ -206,7 +212,7 @@
</div>
<div class="ai-pane">
<AiButton />
<AiPane :aiContent="domainChart.interpretation" />
<AiPane :aiContent="domainNumChart.interpretation" />
</div>
</AnalysisBox>
</div>
......@@ -259,6 +265,8 @@ import {
getTechDomainCount,
getEntityTypeCount
} from "@/api/exportControlV2.0";
import { getDomainNum } from "@/api/finance";
import getMultiLineChart from "@/views/ZMOverView/components/fourSuppress/components/addDomain/multiLineChart";
import EChart from "@/components/Chart/index.vue";
import { useRoute } from "vue-router";
import tipsIcon from "../../../assets/icons/info-icon.png";
......@@ -267,6 +275,7 @@ import AiPane from "@/components/base/Ai/AiPane/index.vue";
import { useChartInterpretation } from "@/views/exportControl/utils/common";
const sanctionCountChart = useChartInterpretation();
const domainChart = useChartInterpretation();
const domainNumChart = useChartInterpretation();
const typeChart = useChartInterpretation();
const rankChart = useChartInterpretation();
......@@ -285,14 +294,15 @@ const getTypeCountData = async () => {
try {
const res = await getEntityTypeCount(param);
console.log("制裁实体类型分布情况", res.data);
if (res && res.code === 200) {
const data = res.data || [];
typeData.value = data.map(item => ({
name: item.name,
value: item.count || item.value
}));
typeChart.interpret({ type: "饼图", name: "制裁实体类型分布情况", data: data });
updateTypeChart();
typeChart.interpret({ type: "饼图", name: "制裁实体类型分布情况", data: data });
}
} catch (error) {
console.error("获取实体清单-数据统计-制裁实体类型分布情况失败:", error);
......@@ -365,6 +375,35 @@ const getRegionCountData = async () => {
}
};
// 实体清单-数据统计- 制裁实体领域数量变化趋势
const domainNumChartOption = ref({});
const activeDomainTab = ref("year");
const handleDomainTabChange = tab => {
activeDomainTab.value = tab;
getDomainNumData();
};
const getDomainNumData = async () => {
// 参数
const param = {
IDsanTypeId: activeDomainTab.value === "year" ? "year" : "record",
type: sanTypeId.value
};
try {
const res = await getDomainNum(param);
if (res && res.code === 200) {
domainNumChartOption.value = getMultiLineChart({
data: res.data || [],
xAxis: res.xAxis || [],
yAxis: res.yAxis || [],
title: "制裁实体领域数量变化趋势",
xAxisName: "时间",
yAxisName: "数量"
});
}
} catch (error) {
console.error("获取实体清单-数据统计-制裁实体领域数量变化趋势失败:", error);
}
};
// 实体清单-数据统计-制裁实体数量变化情况
const sanctionCountChange = ref([]);
// 获取实体清单-数据统计-制裁实体数量变化情况
......@@ -967,12 +1006,6 @@ const typeChartOption = ref({
]
});
const updateTypeChart = () => {
// if (!typeChartRef.value) return;
// let chart = echarts.getInstanceByDom(typeChartRef.value);
// if (!chart) {
// chart = echarts.init(typeChartRef.value);
// }
let data = typeData.value.length
? [...typeData.value]
: [
......@@ -989,20 +1022,20 @@ const updateTypeChart = () => {
totalValue = data.reduce((sum, item) => sum + (item.value || 0), 0);
}
if (data.length > TOP_N) {
const topData = data.slice(0, TOP_N);
const otherData = data.slice(TOP_N);
const otherValue = otherData.reduce((sum, item) => sum + (item.value || 0), 0);
// if (otherValue > 0) {
// topData.push({
// name: "其他",
// value: otherValue,
// extra: otherData
// });
// }
typeChartOption.value.series[0].data = topData;
}
// if (data.length > TOP_N) {
const topData = data.slice(0, TOP_N);
const otherData = data.slice(TOP_N);
const otherValue = otherData.reduce((sum, item) => sum + (item.value || 0), 0);
// if (otherValue > 0) {
// topData.push({
// name: "其他",
// value: otherValue,
// extra: otherData
// });
// }
typeChartOption.value.series[0].data = topData;
// }
// const option = {
// tooltip: {
......@@ -1117,15 +1150,12 @@ onMounted(() => {
getDomainCountData();
// 获取实体清单-数据统计-制裁实体类型分布情况
getTypeCountData();
// 获取实体清单-数据统计-制裁实体领域数量变化趋势
getDomainNumData();
});
</script>
<style scoped lang="scss">
* {
margin: 0;
padding: 0;
}
.data-statistics {
width: 1601px;
margin: 0 auto;
......
......@@ -16,18 +16,18 @@
<div class="label">发布时间:</div>
<div class="value">{{ formattedData.postDate }}</div>
</div>
<div class="info-row">
<!-- <div class="info-row">
<div class="label">生效时间:</div>
<div class="value">{{ formattedData.effectiveDate }}</div>
</div>
</div> -->
<div class="info-row">
<div class="label">发布文件:</div>
<div class="value">{{ formattedData.fileCode }}</div>
</div>
<div class="info-row">
<!-- <div class="info-row">
<div class="label">案卷号:</div>
<div class="value">{{ formattedData.administrativeOrderId }}</div>
</div>
</div> -->
<div class="info-row">
<div class="label">发布人:</div>
<div class="value link">
......@@ -42,6 +42,15 @@
</div>
</div>
</div>
<div class="left-top-content">
<div class="content-title">新闻链接:</div>
<div class="distribution-list">
<div class="list-item news-item" v-for="item in newsList" :key="item.newsId">
<div class="item-title">{{ item.newsTitle }}</div>
<img :src="openIcon" class="flag" />
</div>
</div>
</div>
<div class="left-top-content">
<div class="content-title">制裁实体分布:</div>
<div class="distribution-list">
......@@ -231,11 +240,13 @@ import { debounce } from "lodash";
import title from "../../assets/title.png";
import defaultTitle from "../../assets/default-icon1.png";
import flag from "../../assets/default-icon2.png";
import openIcon from "../../../assets/icons/icon-open.png";
import {
getSingleSanctionEntityCountry,
getSingleSanctionBackground,
getSingleSanctionOverviewList
} from "@/api/exportControlV2.0";
import { getRelateNews } from "@/api/finance";
import RuleSubsidiaryDialog from "../../../v2.0EntityList/components/sanctionsOverview/components/listPage/RuleSubsidiaryDialog.vue";
import { useRoute } from "vue-router";
......@@ -420,6 +431,19 @@ const getEntityCountry = async () => {
}
};
const newsList = ref([]);
// 调用新闻链接接口
const getNewsList = async () => {
try {
const res = await getRelateNews(sanRecordId.value);
console.log("res --:", res);
newsList.value = res;
} catch (error) {
console.log(error);
}
};
const props = defineProps({
data: {
type: Object,
......@@ -562,6 +586,8 @@ onMounted(() => {
getUrlParams();
// 单次制裁-制裁概况-制裁实体国家分布
getEntityCountry();
// 新闻链接
getNewsList();
// 单次制裁-制裁概况-制裁背景
getSanctionBackground();
// 单次制裁-制裁概况-制裁清单
......@@ -751,6 +777,35 @@ onMounted(() => {
}
}
}
.news-item {
display: flex;
justify-content: space-between;
align-items: center;
border-radius: 20px;
width: 460px;
background-color: rgb(246, 250, 255);
padding: 5px 15px;
font-size: 14px;
height: 36px;
cursor: pointer;
.item-title {
font-size: 14px;
font-weight: 400;
color: rgba(5, 95, 194, 1);
font-family: Source Han Sans CN;
line-height: 24px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
max-width: 90%;
}
.flag {
width: 16px;
height: 16px;
margin-right: 0px;
}
}
}
}
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论