提交 5c38f268 authored 作者: yanpeng's avatar yanpeng

Merge branch 'pre' of http://8.140.26.4:10003/caijian/risk-monitor into yp-dev

流水线 #396 已通过 于阶段
in 1 分 36 秒
const baseUrl = `http://8.140.26.4:9085`
\ No newline at end of file
const baseUrl = `http://8.140.26.4:9085`
const outImgbaseUrl = `http://8.140.26.4:10017/out/img` // 写报图片URL
\ No newline at end of file
......@@ -16,7 +16,7 @@ export function getBillIndustry(params) {
return request({
method: 'GET',
url: `/api/BillOverview/billIndustry/${params.year}`,
params: { status: params.status }
params: { stageName: params.stageName }
})
}
......
......@@ -138,7 +138,7 @@ export function getSurveyList(params) {
// 详情页---------------------------------------------------
// 获取调查列表接口
// 调查分类详情接口
/**
* @param { sortCode }
*/
......@@ -169,7 +169,7 @@ export function getSearchAllYear(params) {
}
// 调查简介 /marketsearchDetails/searchBlurb
// 调查简介
export function getSearchBlurb(params) {
return request({
method: 'GET',
......
<template>
<div class="overview-normal-box-wrapper"
:style="{ width: width ? width : '1064px', height: height ? height : '460px' }">
<div class="overview-normal-box-header">
<div class="header-left">
<div class="header-icon">
<slot name="header-icon"></slot>
</div>
<div class="header-title">{{ title }}</div>
<div class="box-main" :style="{ width: width || '1064px', height: height || '460px' }">
<div class="box-head-box">
<div class="box-head-left">
<slot name="header-icon"></slot>
</div>
<div class="header-right">
<div class="box-head-name one-line-ellipsis">{{ title }}</div>
<div class="box-head-right">
<slot name="header-right"></slot>
</div>
</div>
<div class="wrapper-main">
<div class="box-down-box">
<slot></slot>
</div>
</div>
......@@ -41,49 +37,44 @@ const props = defineProps({
</script>
<style lang="scss" scoped>
.overview-normal-box-wrapper {
.box-main {
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 10px;
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 1);
position: relative;
display: flex;
flex-direction: column;
.overview-normal-box-header {
.box-head-box {
padding: 0 22px;
height: 48px;
border-bottom: 1px solid rgba(240, 242, 244, 1);
display: flex;
justify-content: space-between;
box-sizing: border-box;
.header-left {
display: flex;
.header-icon {
width: 24px;
height: 24px;
margin-top: 14px;
margin-left: 19px;
}
.header-title {
margin-left: 17px;
height: 48px;
color: var(--color-main-active);
font-family: Source Han Sans CN;
font-size: 20px;
font-weight: 700;
line-height: 48px;
text-align: center;
}
align-items: center;
width: 100%;
.box-head-left {
width: 24px;
height: 24px;
font-size: 0px;
margin-right: 16px;
}
.header-right {
height: 48px;
margin-right: 28px;
.box-head-name {
color: var(--color-main-active);
font-family: Source Han Sans CN;
font-size: 20px;
font-weight: bold;
line-height: 20px;
width: 20px;
flex: auto;
}
.box-head-right {
margin-left: 16px;
}
}
.wrapper-main {
height: calc(100% - 48px);
.box-down-box {
height: 20px;
flex: auto;
overflow: hidden;
}
}
......
<template>
<p class="p-regular-rereg">
<span class="text-regular" v-for="(segment, index) in processedText" :key="index">
<span v-if="segment.isEntity" @click="$emit('onEntityClick', segment.entity)" class="entity-link">
<span
v-if="segment.isEntity"
@click="$emit('onEntityClick', segment.entity)"
:class="['entity-link', { 'keyword-highlight': segment.isKeywordHit }]"
>
{{ segment.entity?.text_span }}
<img :src="SearchIcon" :width="10" :height="10" alt="search" />
</span>
<span v-else>
{{ segment.text }}
<span :class="{ 'keyword-highlight': segment.isKeywordHit }">{{ segment.text }}</span>
</span>
</span>
</p>
......@@ -20,6 +24,7 @@ export interface ProcessedTextSegment {
text: string;
isEntity: boolean;
entity?: TextEntity;
isKeywordHit?: boolean;
}
const props = defineProps({
text: {
......@@ -29,15 +34,42 @@ const props = defineProps({
entities: {
type: Array<TextEntity>,
default: () => []
},
highlight: {
type: String,
default: ""
}
});
const emit = defineEmits(["onEntityClick"]);
// 处理后的文本段
const processedText = ref<ProcessedTextSegment[]>([]);
const normalizeKeyword = (value: unknown) => String(value ?? "").trim();
const getKeywordMatches = (text: string, keyword: string) => {
if (!keyword) return [{ text, isKeywordHit: false }];
const lowerText = text.toLowerCase();
const lowerKeyword = keyword.toLowerCase();
if (!lowerKeyword) return [{ text, isKeywordHit: false }];
const parts: Array<{ text: string; isKeywordHit: boolean }> = [];
let start = 0;
while (start < text.length) {
const index = lowerText.indexOf(lowerKeyword, start);
if (index === -1) {
parts.push({ text: text.slice(start), isKeywordHit: false });
break;
}
if (index > start) {
parts.push({ text: text.slice(start, index), isKeywordHit: false });
}
parts.push({ text: text.slice(index, index + keyword.length), isKeywordHit: true });
start = index + keyword.length;
}
return parts.filter(part => part.text);
};
// 处理文本,识别并替换实体
const processText = () => {
console.log("props.entities.length", props.entities.length);
if (!props.text || !props.entities) {
// console.log('props.text', props.entities.length)
processedText.value = [{ text: "", isEntity: false }];
......@@ -46,6 +78,7 @@ const processText = () => {
const result = [];
let currentPosition = 0;
const keyword = normalizeKeyword(props.highlight);
// 按实体文本长度排序,优先匹配长文本
const sortedEntities = [...props.entities].sort((a, b) => b.text_span.length - a.text_span.length);
......@@ -61,7 +94,8 @@ const processText = () => {
// 如果当前位置是实体,添加到结果
result.push({
isEntity: true,
entity: { ...entity }
entity: { ...entity },
isKeywordHit: keyword ? entityText.toLowerCase().includes(keyword.toLowerCase()) : false
});
currentPosition = endPosition;
matched = true;
......@@ -82,18 +116,26 @@ const processText = () => {
if (nextEntityStart > currentPosition) {
const plainText = props.text.substring(currentPosition, nextEntityStart);
result.push({
text: plainText,
isEntity: false
const parts = getKeywordMatches(plainText, keyword);
parts.forEach(part => {
result.push({
text: part.text,
isEntity: false,
isKeywordHit: part.isKeywordHit
});
});
currentPosition = nextEntityStart;
} else {
// 没有更多实体,添加剩余文本
const remainingText = props.text.substring(currentPosition);
if (remainingText) {
result.push({
text: remainingText,
isEntity: false
const parts = getKeywordMatches(remainingText, keyword);
parts.forEach(part => {
result.push({
text: part.text,
isEntity: false,
isKeywordHit: part.isKeywordHit
});
});
}
currentPosition = props.text.length;
......@@ -106,6 +148,7 @@ const processText = () => {
// 监听文本和实体变化
watch(() => props.text, processText);
watch(() => props.entities, processText, { deep: true });
watch(() => props.highlight, processText);
// 初始化处理
onMounted(processText);
......@@ -113,6 +156,11 @@ onMounted(processText);
<style lang="scss" scoped>
@use "@/styles/common.scss";
.keyword-highlight {
background: rgba(255, 199, 0, 0.35);
border-radius: 2px;
}
.entity-link {
color: var(--color-primary-100);
&:hover {
......
......@@ -94,7 +94,7 @@ router.beforeEach((to, from, next) => {
const storageKey = to.meta.titleStorageKey || "curTabName";
// 新开页签时 sessionStorage 不共享,优先用 query 带过来的 title/name
const queryTitle = (to.query && (to.query.title || to.query.name)) ? String(to.query.title || to.query.name) : "";
if (!to.path.startsWith('/decreeLayout/')) {
if (!to.meta.noTitle) {
document.title = queryTitle || window.sessionStorage.getItem(storageKey) || to.meta.title;
}
} else {
......
......@@ -28,9 +28,7 @@ const decreeRoutes = [
name: "DecreeLayoutContainer",
component: DecreeLayoutContainer,
redirect: "/decreeLayout/overview",
// meta: {
// title: "政令布局"
// },
// meta: { title: "政令布局" },
children: [
{
path: "overview",
......@@ -46,19 +44,19 @@ const decreeRoutes = [
path: "introduction",
name: "DecreeIntroduction",
component: DecreeIntroduction,
// meta: { title: "政令简介" }
meta: { noTitle: true }
},
{
path: "background",
name: "DecreeBackground",
component: DecreeBackground,
// meta: { title: "政令背景" }
meta: { noTitle: true }
},
{
path: "measures",
name: "DecreeMeasures",
component: DecreeMeasures,
// meta: { title: "政令举措" }
meta: { noTitle: true }
},
]
},
......@@ -67,18 +65,14 @@ const decreeRoutes = [
path: "deepDig",
name: "DeepDig",
component: DecreeDeepDig,
// meta: {
// title: "深度挖掘"
// }
meta: { noTitle: true }
},
// 影响分析路由
{
path: "influence",
name: "DecreeInfluence",
component: DecreeInfluence,
// meta: {
// title: "影响分析"
// }
meta: { noTitle: true }
},
]
},
......
......@@ -28,22 +28,17 @@ const marketAccessRestrictionsRoutes = [
dynamicTitle: true
},
children: [
{
path: "case",
name: "MarketAccessCase",
component: MarketAccessCase,
// meta: {
// title: "调查案件"
// }
meta: { noTitle: true }
},
{
path: "overview",
name: "MarketAccessOverview",
component: MarketAccessOverview,
// meta: {
// title: "数据统计"
// }
meta: { noTitle: true }
}
]
},
......@@ -62,17 +57,13 @@ const marketAccessRestrictionsRoutes = [
path: "overview",
name: "MarketSingleCaseOverview",
component: MarketSingleCaseOverview,
// meta: {
// title: "调查简介"
// }
meta: { noTitle: true }
},
{
path: "deepdig",
name: "MarketSingleCaseDeepdig",
component: MarketSingleCaseDeepdig,
// meta: {
// title: "深度挖掘"
// }
meta: { noTitle: true }
}
]
},
......
......@@ -485,7 +485,6 @@ export const useWrittingAsstaintStore = defineStore('writtingAsstaint', {
// ========== AI 生成报文 SSE(更新报文内容 + 执行步骤) ==========
async fetchReportData(params) {
console.log(">")
if (this.abortController) this.abortController.abort();
this.abortController = new AbortController();
// this.processLog = '';
......@@ -511,7 +510,8 @@ export const useWrittingAsstaintStore = defineStore('writtingAsstaint', {
lastFlushedIndex = 0;
if (this.reportContent.includes('./out/img')) {
this.reportContent = this.reportContent.replaceAll('./out/img', 'http://172.19.21.9:8003/out/img');
this.reportContent = this.reportContent.replaceAll('./out/img', outImgbaseUrl);
// console.log(reportContent)
}
};
......@@ -571,7 +571,6 @@ export const useWrittingAsstaintStore = defineStore('writtingAsstaint', {
streamBuffer += str;
updateFlushIndexByBoundary();
flushToReport(false);
console.log(streamBuffer,456)
console.log(msgData,'data')
} else {
// 结束时把剩余内容强制 flush
......@@ -663,7 +662,6 @@ export const useWrittingAsstaintStore = defineStore('writtingAsstaint', {
};
await this.fetchReportData(params);
} else {
console.log(10101010101010)
// 政令模板需要先解析PDF
if (this.curTempTitle === '政令') {
if (this.uploadFileList.length === 0) {
......
......@@ -93,7 +93,7 @@
<div class="item">
<div class="item-left">法案进展:</div>
<div class="item-right2">
<div class="tag" v-for="(val, idx) in getReversedProgress(item.progress)" :key="`${item.billId}-${val}-${idx}`" :style="{ zIndex: item.progress.length - idx }">{{ val }}</div>
<div class="tag" v-for="(val, idx) in item.progress" :key="`${item.billId}-${val}-${idx}`" :style="{ zIndex: item.progress.length - idx }">{{ val }}</div>
</div>
</div>
</div>
......@@ -458,8 +458,6 @@ const handleClickAvatar = async member => {
} catch (error) {}
};
const getReversedProgress = progress => (Array.isArray(progress) ? [...progress].reverse() : []);
const handleClickCommitteeBill = bill => {
if (!bill?.billId) return;
props.onClickToDetail({
......
......@@ -373,7 +373,8 @@ const committeeTimeRange = ref("近一月");
const committeeTimeOptions = [
{ label: "近一周", value: "近一周" },
{ label: "近一月", value: "近一月" },
{ label: "近一年", value: "近一年" }
{ label: "近一年", value: "近一年" },
{label:"全部时间", value: "全部时间"}
];
const committeeCardList = ref([]);
......@@ -1029,14 +1030,15 @@ const handleBox6 = async () => {
// 涉华领域分布
const box9ChartData = ref([]);
const box9selectetedTime = ref("2025");
// 立法状态下拉:提出法案、众议院通过、参议院通过、解决分歧、完成立法
// v-model 存储的是接口需要的 status 值
const box9LegislativeStatus = ref("提案");
// 立法状态下拉:提出法案、众议院通过、参议院通过、解决分歧、呈交总统、完成立法
// v-model 存储的是接口需要的 status 值(直接作为接口参数)
const box9LegislativeStatus = ref("提出法案");
const box9LegislativeStatusList = ref([
{ label: "提出法案", value: "提案" },
{ label: "提出法案", value: "提出法案" },
{ label: "众议院通过", value: "众议院通过" },
{ label: "参议院通过", value: "参议院通过" },
{ label: "解决分歧", value: "分歧已解决" },
{ label: "解决分歧", value: "解决分歧" },
{ label: "呈交总统", value: "呈交总统" },
{ label: "完成立法", value: "完成立法" }
]);
const box9YearList = ref([
......@@ -1063,18 +1065,39 @@ const box9YearList = ref([
]);
const box9HasData = ref(true);
let box9ChartInstance = null;
const BOX9_MAX_DOMAIN_COUNT = 7;
const BOX9_OTHER_DOMAIN_NAME = "其他";
const formatBox9DomainData = (list = []) => {
if (!Array.isArray(list) || list.length <= BOX9_MAX_DOMAIN_COUNT) {
return list;
}
const topDomainList = list.slice(0, BOX9_MAX_DOMAIN_COUNT);
const otherDomainCount = list.slice(BOX9_MAX_DOMAIN_COUNT).reduce((sum, item) => {
return sum + Number(item?.countBill || 0);
}, 0);
if (!otherDomainCount) {
return topDomainList;
}
return [
...topDomainList,
{
industryName: BOX9_OTHER_DOMAIN_NAME,
countBill: otherDomainCount
}
];
};
const getBox9Data = async () => {
chartLoading.value = { ...chartLoading.value, box6: true };
const params = {
year: box9selectetedTime.value,
status: box9LegislativeStatus.value
stageName: box9LegislativeStatus.value
};
try {
const res = await getBillIndustry(params);
console.log("box9-涉华法案领域分布", res.data);
if (res.code === 200 && res.data && res.data.length > 0) {
box9HasData.value = true;
box9ChartData.value = res.data;
box9ChartData.value = formatBox9DomainData(res.data);
} else {
box9HasData.value = false;
box9ChartData.value = [];
......@@ -1104,16 +1127,9 @@ const handleBox9Data = async () => {
const selectedIndex = box9LegislativeStatusList.value.findIndex(
item => item.value === box9LegislativeStatus.value
);
const arr = [
{ label: "提出法案", value: "提案" },
{ label: "众议院通过", value: "众议院通过" },
{ label: "参议院通过", value: "参议院通过" },
{ label: "解决分歧", value: "分歧已解决" },
{ label: "完成立法", value: "完成立法" }
]
const status = arr.filter(item => {
return item.value === box9LegislativeStatus.value
})[0].label
// 当前选中的立法状态中文名(直接等于接口传参值)
const statusItem = box9LegislativeStatusList.value[selectedIndex];
const status = statusItem ? statusItem.label : "";
const selectParam = {
moduleType: '国会法案',
key: 2,
......@@ -1272,13 +1288,14 @@ const getBox8ChartOption = stageList => {
const handleBox8Data = async () => {
chartLoading.value = { ...chartLoading.value, box8: true };
// 进展分布显示顺序:提出法案(对应进度“提案”)、众议院通过、参议院通过、分歧已解决(解决分歧)、完成立法
const stageOrder = ["提案", "众议院通过", "参议院通过", "分歧已解决", "完成立法"];
// 进展分布显示顺序:提出法案(对应进度“提案”)、众议院通过、参议院通过、解决分歧(对应进度“分歧已解决”)、呈交总统、完成立法
const stageOrder = ["提案", "众议院通过", "参议院通过", "分歧已解决", "呈交总统", "完成立法"];
const stageNameMap = {
提案: "提出法案",
众议院通过: "众议院通过",
参议院通过: "参议院通过",
分歧已解决: "解决分歧",
呈交总统: "呈交总统",
完成立法: "完成立法"
};
......
......@@ -1169,6 +1169,10 @@ onMounted(async () => {
<style lang="scss" scoped>
.wrap {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
direction: ltr;
justify-content: flex-start;
margin-bottom: 30px;
......@@ -1254,6 +1258,8 @@ onMounted(async () => {
.left {
margin-top: 16px;
width: 792px;
flex: 0 0 792px;
.box1 {
width: 792px;
......@@ -1651,6 +1657,7 @@ onMounted(async () => {
margin-left: 16px;
margin-top: 16px;
width: 792px;
flex: 0 0 792px;
height: 847px;
.box3 {
......
......@@ -131,6 +131,7 @@
<IntelligentEntityText
:text="term?.fynr || ''"
:entities="termsHighlight ? getTermEntities(term, 'cn') : []"
:highlight="searchKeyword"
@on-entity-click="e => gotoSearchResults(e.text_span, '')"
/>
</div>
......@@ -141,6 +142,7 @@
<IntelligentEntityText
:text="term?.ywnr || ''"
:entities="termsHighlight ? getTermEntities(term, 'en') : []"
:highlight="searchKeyword"
@on-entity-click="e => gotoSearchResults(e.text_span, '')"
/>
</div>
......@@ -343,6 +345,27 @@ const chart1ColorList = ref([...MUTICHARTCOLORS]);
const chart2ColorList = ref([...MUTICHARTCOLORS]);
const chart2Data = ref([]);
const DOMAIN_MAX_DISPLAY_COUNT = 7;
const DOMAIN_OTHER_NAME = "其他";
const formatDomainChartData = (list = []) => {
if (!Array.isArray(list) || list.length <= DOMAIN_MAX_DISPLAY_COUNT) {
return list;
}
const topDomainList = list.slice(0, DOMAIN_MAX_DISPLAY_COUNT);
const otherCount = list.slice(DOMAIN_MAX_DISPLAY_COUNT).reduce((sum, item) => {
return sum + Number(item?.value || 0);
}, 0);
if (!otherCount) {
return topDomainList;
}
return [
...topDomainList,
{
name: DOMAIN_OTHER_NAME,
value: otherCount
}
];
};
const aiPaneVisible = ref({
domain: false,
......@@ -737,12 +760,13 @@ const handleGetBillHyly = async () => {
.map(name => {
return { label: name, value: name };
});
chart2Data.value = res.data.map(item => {
const domainChartData = res.data.map(item => {
return {
name: item.hylymc,
value: item.countTk
};
});
chart2Data.value = formatDomainChartData(domainChartData);
aiPaneFetched.value = { ...aiPaneFetched.value, domain: false };
let chart2 = getPieChart(chart2Data.value, chart2ColorList.value);
......
......@@ -1131,10 +1131,10 @@ const initParam = () => {
const query = route.query;
if (Object.keys(query).length > 0) {
sessionStorage.setItem('routeQuery', JSON.stringify(query));
sessionStorage.setItem('countryRouteQuery', JSON.stringify(query));
}
} else {
const savedQuery = JSON.parse(sessionStorage.getItem('routeQuery') || '{}');
const savedQuery = JSON.parse(sessionStorage.getItem('countryRouteQuery') || '{}');
selectedArea.value = savedQuery.domains ? savedQuery.domains : '全部领域'
if (savedQuery.selectedDate && Array.isArray(JSON.parse(savedQuery.selectedDate)) && JSON.parse(savedQuery.selectedDate).length) {
selectedDate.value = '自定义'
......
......@@ -876,10 +876,10 @@ const initParam = () => {
const query = route.query;
if (Object.keys(query).length > 0) {
sessionStorage.setItem('decreeRouteQuery', JSON.stringify(query));
sessionStorage.setItem('commerceRouteQuery', JSON.stringify(query));
}
} else {
const savedQuery = JSON.parse(sessionStorage.getItem('decreeRouteQuery') || '{}');
const savedQuery = JSON.parse(sessionStorage.getItem('commerceRouteQuery') || '{}');
selectedArea.value = savedQuery.domains ? savedQuery.domains : '全部领域'
if (savedQuery.selectedDate && Array.isArray(JSON.parse(savedQuery.selectedDate)) && JSON.parse(savedQuery.selectedDate).length) {
selectedDate.value = '自定义'
......
......@@ -803,10 +803,10 @@ const initParam = () => {
const query = route.query;
if (Object.keys(query).length > 0) {
sessionStorage.setItem('decreeRouteQuery', JSON.stringify(query));
sessionStorage.setItem('commerceEventRouteQuery', JSON.stringify(query));
}
} else {
const savedQuery = JSON.parse(sessionStorage.getItem('decreeRouteQuery') || '{}');
const savedQuery = JSON.parse(sessionStorage.getItem('commerceEventRouteQuery') || '{}');
selectedArea.value = savedQuery.domains ? savedQuery.domains : '全部领域'
if (savedQuery.selectedDate && Array.isArray(JSON.parse(savedQuery.selectedDate)) && JSON.parse(savedQuery.selectedDate).length) {
selectedDate.value = '自定义'
......
......@@ -191,7 +191,7 @@ const route = useRoute();
const isShowProvinceBox = computed(() => {
let isShow = false
if(isFolderAll.value && (selectedCountry.value==='0101' || selectedCountry.value==='全部国家')) {
if (isFolderAll.value && (selectedCountry.value === '0101' || selectedCountry.value === '全部国家')) {
isShow = true
}
return isShow
......@@ -207,18 +207,18 @@ const handleSwitchChartData = () => {
return item.name === curDemension.value
})[0]
// setTimeout(() => {
activeChart.value = curDemensionItem.chartTypeList[0]
if (curDemension.value === '制裁时间') {
if (selectedTime.value === '按月度统计') {
curChartData.value = curDemensionItem.data
} else if (selectedTime.value === '按季度统计') {
curChartData.value = curDemensionItem.quatarData
} else {
curChartData.value = curDemensionItem.yearData
}
} else {
activeChart.value = curDemensionItem.chartTypeList[0]
if (curDemension.value === '制裁时间') {
if (selectedTime.value === '按月度统计') {
curChartData.value = curDemensionItem.data
} else if (selectedTime.value === '按季度统计') {
curChartData.value = curDemensionItem.quatarData
} else {
curChartData.value = curDemensionItem.yearData
}
} else {
curChartData.value = curDemensionItem.data
}
// })
}
}
......@@ -686,7 +686,7 @@ const handleGetProvinceList = async () => {
try {
const res = await getProvinceList()
console.log('获取省份列表', res);
if(res && res.length) {
if (res && res.length) {
provinceList.value = res.map(item => {
return {
name: item,
......@@ -1051,30 +1051,33 @@ const initParam = () => {
customTime.value = JSON.parse(route.query.selectedDate)
}
selectedCountry.value = route.query.orgnizationName ? route.query.orgnizationName : '全部国家'
selectedProvince.value = route.query.selectedProvince ? provinceList.value.filter(item => item.name.indexOf(route.query.selectedProvince) > -1)[0].name : '全部省份'
selectedCountry.value = route.query.selectedCountryId ? route.query.selectedCountryId : '全部国家'
isHalfRule.value = route.query.isHalfRule ? true : false
isCnEntityOnly.value = route.query.isCnEntityOnly ? true : false
selectedEntityType.value = route.query.selectedEntityType ? route.query.selectedEntityType : '全部实体类型'
selectedEntityType.value = route.query.selectedEntityType ? entityTypeList.value.filter(item => item.name === route.query.selectedEntityType)[0].id : '全部实体类型'
const query = route.query;
if (Object.keys(query).length > 0) {
sessionStorage.setItem('decreeRouteQuery', JSON.stringify(query));
sessionStorage.setItem('entityRouteQuery', JSON.stringify(query));
}
} else {
const savedQuery = JSON.parse(sessionStorage.getItem('decreeRouteQuery') || '{}');
const savedQuery = JSON.parse(sessionStorage.getItem('entityRouteQuery') || '{}');
selectedArea.value = savedQuery.domains ? savedQuery.domains : '全部领域'
if (savedQuery.selectedDate && Array.isArray(JSON.parse(savedQuery.selectedDate)) && JSON.parse(savedQuery.selectedDate).length) {
selectedDate.value = '自定义'
customTime.value = JSON.parse(savedQuery.selectedDate)
}
isHalfRule.value = savedQuery.isHalfRule ? true : false
selectedProvince.value = savedQuery.selectedProvince ? provinceList.value.filter(item => item.name.indexOf(savedQuery.selectedProvince) > -1)[0].name : '全部省份'
selectedCountry.value = route.query.selectedCountryId ? route.query.selectedCountryId : '全部国家'
isCnEntityOnly.value = savedQuery.isCnEntityOnly ? true : false
selectedEntityType.value = savedQuery.selectedEntityType ? savedQuery.selectedEntityType : '全部实体类型'
selectedEntityType.value = savedQuery.selectedEntityType ? entityTypeList.value.filter(item => item.name === savedQuery.selectedEntityType)[0].id : '全部实体类型'
}
}
......@@ -1129,9 +1132,9 @@ const handleExport = () => {
};
onMounted(async () => {
handleGetProvinceList() // 获取省份列表
handleGetCountryList() // 获取国家列表
handleGetEntityTypes() // 获取实体类型列表
await handleGetProvinceList() // 获取省份列表
await handleGetCountryList() // 获取国家列表
await handleGetEntityTypes() // 获取实体类型列表
initParam()
// 初始化
await fetchTableData()
......
......@@ -803,10 +803,10 @@ const initParam = () => {
const query = route.query;
if (Object.keys(query).length > 0) {
sessionStorage.setItem('decreeRouteQuery', JSON.stringify(query));
sessionStorage.setItem('entityEventRouteQuery', JSON.stringify(query));
}
} else {
const savedQuery = JSON.parse(sessionStorage.getItem('decreeRouteQuery') || '{}');
const savedQuery = JSON.parse(sessionStorage.getItem('entityEventRouteQuery') || '{}');
selectedArea.value = savedQuery.domains ? savedQuery.domains : '全部领域'
if (savedQuery.selectedDate && Array.isArray(JSON.parse(savedQuery.selectedDate)) && JSON.parse(savedQuery.selectedDate).length) {
selectedDate.value = '自定义'
......
......@@ -393,7 +393,7 @@ const timer = ref(null);
// 关闭当前标签页
const handleCloseCurTab = (tab, index) => {
if(tagsViewStore.visitedViews.length === 1) {
if (tagsViewStore.visitedViews.length === 1) {
ElMessage.warning('至少保留一个标签页')
return
}
......@@ -494,16 +494,17 @@ onMounted(() => {
siderList.value[3].isExpanded = true;
siderList.value[3].children[0].active = true;
break;
case "/dataLibrary/dataCommerceControlList":
case "/dataLibrary/dataEntityListEvent":
siderList.value[3].active = true;
siderList.value[3].isExpanded = true;
siderList.value[3].children[1].active = true;
break;
case "/dataLibrary/dataEntityListEvent":
case "/dataLibrary/dataCommerceControlList":
siderList.value[3].active = true;
siderList.value[3].isExpanded = true;
siderList.value[3].children[2].active = true;
break;
case "/dataLibrary/dataCommerceControlListEvent":
siderList.value[3].active = true;
siderList.value[3].isExpanded = true;
......
......@@ -63,66 +63,6 @@
<DivideHeader id="position1" class="divide" :titleText="'最新动态'"></DivideHeader>
<div class="home-main-center">
<div class="center-top">
<!-- <div class="box1">
<div class="box1-left" @click="handleSwithCurDecree('left')">
<div class="icon">
<img src="./assets/images/box1-left.svg" alt="" />
</div>
</div>
<div class="box1-right" @click="handleSwithCurDecree('right')">
<div class="icon">
<img src="./assets/images/box1-right.svg" alt="" />
</div>
</div>
<div class="box1-header">
<div class="box1-header-left">
<div class="icon">
<img src="./assets/images/box1-header-icon.png" alt="" />
</div>
<div class="title">{{ "最新科技政令" }}</div>
</div>
<div class="box1-header-right" @click="handleClickOrder">
{{ "查看详情 >" }}
</div>
</div>
<el-carousel ref="carouselRef" height="395px" :autoplay="true" :interval="3000" arrow="never"
indicator-position="none">
<el-carousel-item v-for="(item, index) in box1DataList" :key="index">
<div class="box1-main">
<div class="box1-main-left">
<img v-if="item.imageUrl" :src="item.imageUrl" alt="" />
<div v-else class="box1-main-left-img-mock">
<img class="img-mock-badge-img" src="./assets/images/badge.png" />
<p class="img-mock-badge-title">行政令</p>
<p class="img-mock-badge-title">{{ item.name }}</p>
</div>
</div>
<div class="box1-main-right">
<div class="box1-main-right-title">
{{ item.name }}
</div>
<div class="box1-main-right-info">
<AreaTag v-for="(tag, index) in item.industryList" :key="index" :tagName="tag.industryName" />
</div>
<div class="box1-main-right-center">
{{ item.describe }}
</div>
<div class="box1-main-right-footer">
<div class="footer-left">{{ item.postDate }}</div>
<div class="footer-right">
<div class="footer-right-item1">
{{ item.officialUrl }}
</div>
<div class="footer-right-item2">
<img src="./assets/images/open-icon.png" alt="" />
</div>
</div>
</div>
</div>
</div>
</el-carousel-item>
</el-carousel>
</div> -->
<OverviewMainBox class="box1" title="最新科技政令" @toDetail="handleClickOrder">
<template #header-icon>
<img style="width: 100%; height: 100%" src="./assets/images/box1-header-icon.png" alt="" />
......@@ -610,7 +550,6 @@ const carouselRef = ref(null);
const handleClickOrder = () => {
let index = carouselRef.value?.activeIndex || 0;
let item = box1DataList.value[index];
console.log(item)
if (item) onNavigateToDetail(item)
};
......@@ -732,10 +671,7 @@ handleGetMessage();
// 点击人物头像,跳转到人物主页
const handleClickPerson = async item => {
console.log("person", item);
const personTypeList = JSON.parse(window.sessionStorage.getItem("personTypeList"));
console.log("personTypeList", personTypeList);
let type = 0;
let personTypeName = "";
......@@ -749,12 +685,9 @@ const handleClickPerson = async item => {
const arr = personTypeList.filter(item => {
return item.typeId === res.data.personType;
});
console.log("arr", arr);
if (arr && arr.length > 0) {
personTypeName = arr[0].typeName;
console.log("personTypeName", personTypeName);
if (personTypeName === "科技企业领袖") {
type = 1;
} else if (personTypeName === "国会议员") {
......@@ -1551,12 +1484,11 @@ onMounted(async () => {
position: absolute;
right: -13px;
top: -10px;
padding: 0 8px;
height: 26px;
padding: 4px 8px 6px;
background-color: #FF4D4F;
color: white;
font-size: 16px;
line-height: 26px;
line-height: 16px;
font-family: Source Han Sans CN;
border-radius: 14px;
letter-spacing: 1px;
......
......@@ -69,85 +69,14 @@
<router-view />
</div>
</div>
<!-- <div class="layout-report-box" v-if="activeName === '法案原文'">
<div class="report-close" @click="handleSwitchActiveName('分析报告')">
<img src="./assets/images/report-close-icon.png" alt="" />
</div>
<div class="report-main">
<div class="report-header">
<div class="report-header-left">
<div class="text">法案版本:</div>
<div class="select-box">
<el-select v-model="curBill" placeholder="选择法案" style="width: 240px">
<el-option v-for="item in billList" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</div>
<div class="report-header-right">
<div class="btn">
<div class="icon">
<img src="./assets/images/report-header-icon1.png" alt="" />
</div>
<div class="text">翻译</div>
</div>
<div class="btn">
<div class="icon">
<img src="./assets/images/report-header-icon2.png" alt="" />
</div>
<div class="text">下载</div>
</div>
<div class="btn">
<div class="icon">
<img src="./assets/images/report-header-icon3.png" alt="" />
</div>
<div class="text">对比</div>
</div>
<div class="btn">
<div class="icon">
<img src="./assets/images/report-header-icon4.png" alt="" />
</div>
<div class="text">查找</div>
</div>
</div>
</div>
<div class="report-content">
<div class="content-left">
<img src="./assets/images/report1.png" alt="" />
</div>
<div class="content-right">
<img src="./assets/images/report2.png" alt="" />
</div>
</div>
</div>
</div> -->
<!-- <div class="report" v-if="isShowReport">
<div class="report-close" @click="handleCloseReport">
<img src="@/assets/icons/close.png" alt="" />
</div>
<div class="report-header">
{{ "政令原文" }}
</div>
<div class="report-main">
<div class="left">
<div v-if="!reportUrl" class="noContent">{{ "中文原文暂无数据" }}</div>
<iframe v-else :src="reportUrl" style="border: none" width="100%" height="100%"> </iframe>
</div>
<div class="right">
<div v-if="!reportUrlEn" class="noContent">{{ "英文原文暂无数据" }}</div>
<iframe v-else :src="reportUrlEn" style="border: none" width="100%" height="100%"> </iframe>
</div>
</div>
</div> -->
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from "vue";
import { ref, onMounted } from "vue";
import router from "@/router";
import { useRoute } from "vue-router";
import { getDecreeSummary } from "@/api/decree/introduction";
import { getDecreeReport } from "@/api/decree/introduction";
import search from "./assets/images/search.png";
import icon1 from "./assets/icons/icon1.svg";
import icon1Active from "./assets/icons/icon1_active.svg";
......@@ -156,7 +85,6 @@ import icon2Active from "./assets/icons/icon2_active.svg";
import icon3 from "./assets/icons/icon3.svg";
import icon3Active from "./assets/icons/icon3_active.svg";
import USALogo from "./assets/images/USA-logo.png";
import DefaultIcon2 from "@/assets/icons/default-icon2.png";
const route = useRoute();
......@@ -224,28 +152,8 @@ const handleGetSummary = async () => {
}
} catch (error) {}
document.title = pageTitle;
window.sessionStorage.setItem("curTabName", pageTitle);
};
// 获取报告原文
// const reportUrl = ref("");
// const reportUrlEn = ref("");
// const handleGetReport = async () => {
// try {
// const res = await getDecreeReport({id: route.query.id});
// console.log("报告原文", res);
// if (res.code === 200 && res.data) {
// reportUrl.value = res.data.content;
// reportUrlEn.value = res.data.contentEn;
// }
// } catch (error) {}
// };
// const isShowReport = ref(false);
// const handleCloseReport = () => {
// isShowReport.value = false;
// };
const handleShowReport = () => {
const curRoute = router.resolve({
path: "/decree/decreeOriginal",
......@@ -291,7 +199,6 @@ onMounted(() => {
} else if (route.path === "/decreeLayout/influence") {
activeTitle.value = "影响分析";
}
// handleGetReport();
});
</script>
......@@ -312,20 +219,6 @@ onMounted(() => {
height: 100%;
background: #f7f8f9;
.report-close {
position: absolute;
top: 20px;
right: 230px;
width: 20px;
height: 20px;
cursor: pointer;
img {
width: 100%;
height: 100%;
}
}
.report-header {
width: 100%;
height: 50px;
......@@ -639,130 +532,5 @@ onMounted(() => {
background-color: #f7f8f9;
}
}
.layout-report-box {
position: absolute;
z-index: 9999;
top: 154px;
left: 0;
width: 100%;
height: 926px;
background: rgba(248, 249, 250, 1);
.report-close {
position: absolute;
top: 24px;
right: 178px;
width: 32px;
height: 32px;
cursor: pointer;
img {
width: 100%;
height: 100%;
}
}
.report-main {
width: 1600px;
height: 926px;
margin: 0 auto;
background: #fff;
box-sizing: border-box;
padding: 0 69px;
.report-header {
height: 77px;
border-bottom: 1px solid rgba(240, 242, 244, 1);
display: flex;
justify-content: space-between;
.report-header-left {
display: flex;
.text {
margin-top: 32px;
width: 70px;
height: 14px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
line-height: 14px;
}
.select-box {
margin-left: 8px;
margin-top: 23px;
}
}
.report-header-right {
display: flex;
margin-top: 24px;
.btn {
display: flex;
width: 88px;
height: 32px;
margin-left: 8px;
box-sizing: border-box;
border: 1px solid rgba(230, 231, 232, 1);
border-radius: 4px;
background: rgba(255, 255, 255, 1);
display: flex;
justify-content: center;
align-items: center;
.icon {
width: 16px;
height: 16px;
img {
width: 100%;
height: 100%;
}
}
.text {
margin-left: 8px;
height: 32px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 32px;
}
}
}
}
.report-content {
display: flex;
margin-top: 35px;
.content-left {
width: 680px;
height: 786px;
img {
width: 100%;
height: 100%;
}
}
.content-right {
margin-left: 89px;
width: 680px;
height: 786px;
img {
width: 100%;
height: 100%;
}
}
}
}
}
}
</style>
\ No newline at end of file
......@@ -3,25 +3,12 @@
<div class="home-main" ref="homeMainRef">
<div class="home-top-bg"></div>
<div class="home-main-header">
<SearchContainer
style="margin-bottom: 0; margin-top: 48px; height: fit-content"
v-if="homeMainRef"
placeholder="搜索出口管制"
:containerRef="homeMainRef"
areaName="实体清单"
/>
<SearchContainer style="margin-bottom: 0; margin-top: 48px; height: fit-content" v-if="homeMainRef"
placeholder="搜索出口管制" :containerRef="homeMainRef" areaName="实体清单" />
<div class="home-main-header-footer-info">
<InfoCard
v-for="(item, index) in infoList"
:key="item.id"
:title="item.nameZh"
:subtitle="item.nameAbbr"
:description="item.description"
:quantity="item.postCount"
:unit="item.unit"
:color="infoListColor[index]"
@click="handleToEntityListNoId(item)"
/>
<InfoCard v-for="(item, index) in infoList" :key="item.id" :title="item.nameZh" :subtitle="item.nameAbbr"
:description="item.description" :quantity="item.postCount" :unit="item.unit" :color="infoListColor[index]"
@click="handleToEntityListNoId(item)" />
</div>
</div>
......@@ -47,15 +34,8 @@
<img src="./assets/images/box1-right.png" alt="" />
</div>
</div>
<el-carousel
ref="carouselRef"
height="370px"
:autoplay="true"
:interval="3000"
arrow="never"
indicator-position="none"
@change="handleCarouselChange"
>
<el-carousel ref="carouselRef" height="370px" :autoplay="true" :interval="3000" arrow="never"
indicator-position="none" @change="handleCarouselChange">
<el-carousel-item v-for="(item, index) in entitiesDataInfoList" :key="item.id + index">
<div>
<div class="box1-top">
......@@ -80,29 +60,17 @@
>
<el-tag :type="getTagType(domainItem)">{{ domainItem }}</el-tag>
</div> -->
<AreaTag
v-for="(domainItem, index) in item.domains"
:key="index"
:tagName="domainItem"
/>
<AreaTag v-for="(domainItem, index) in item.domains" :key="index" :tagName="domainItem" />
</div>
</div>
</div>
<div class="box1-bottom">
<div class="box1-bottom-title">· 涉及主要实体:</div>
<div class="box1-bottom-content">
<div
class="box1-bottom-content-item"
v-for="(ett, index) in item.sanEntities"
:key="index"
@click="handleEntityClick(ett)"
>
<el-image
v-if="ett.img"
class="box1-bottom-content-item-img"
:src="ett.img"
alt=""
></el-image>
<div class="box1-bottom-content-item" v-for="(ett, index) in item.sanEntities" :key="index"
@click="handleEntityClick(ett)">
<el-image v-if="ett.img" class="box1-bottom-content-item-img" :src="ett.img"
alt=""></el-image>
<div v-else class="box1-bottom-content-item-imgUndefined">
{{
(ett.orgName || ett.orgNameZh)?.match(
......@@ -175,14 +143,8 @@
</div>
</template>
</custom-container> -->
<RiskSignal
:list="warningList"
@item-click="handleToRiskSignalDetail"
@more-click="handleToMoreRiskSignal"
riskLevel="signalLevel"
postDate="signalTime"
name="signalTitle"
/>
<RiskSignal :list="warningList" @item-click="handleToRiskSignalDetail" @more-click="handleToMoreRiskSignal"
riskLevel="signalLevel" postDate="signalTime" name="signalTitle" />
</el-col>
</el-row>
......@@ -205,19 +167,11 @@
</custom-container>
</el-col> -->
<div class="center-center">
<NewsList
:newsList="newsList"
@item-click="handleNewsInfoClick"
@more-click="handleToMoreNews"
content="newsContent"
/>
<MessageBubble
:messageList="socialMediaList"
@person-click="handlePerClick"
imageUrl="avatar"
@more-click="handleToSocialDetail"
/>
<NewsList :newsList="newsList" @item-click="handleNewsInfoClick" @more-click="handleToMoreNews"
content="newsContent" />
<MessageBubble :messageList="socialMediaList" @person-click="handlePerClick" imageUrl="avatar"
@more-click="handleToSocialDetail" />
<!-- <custom-container title="社交媒体" :titleIcon="dialogIcon" height="450px">
<template #default>
<div class="dialog-list">
......@@ -237,25 +191,20 @@
<div class="box3">
<div class="box3-content">
<div class="box3-content-title">实体清单发布频次统计</div>
<el-table :data="entityListReleaseFreq" stripe style="width: 100%">
<el-table :data="entityListReleaseFreq" stripe style="width: 100%" @row-click="handleEntityRowClick">
<el-table-column prop="year" label="年份" width="200" />
<el-table-column label="发布次数" width="300">
<template #default="scope">
<div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<el-progress
:percentage="scope.row.percent * 100"
:show-text="false"
:status="getStatus(scope.row.percent)"
/>
<el-progress :percentage="scope.row.percent * 100" :show-text="false"
:status="getStatus(scope.row.percent)" />
</div>
</template>
</el-table-column>
<el-table-column label="重点领域" width="220" align="center">
<template #default="scope">
<div
style="display: flex; justify-content: center; align-items: center; gap: 5px"
>
<div style="display: flex; justify-content: center; align-items: center; gap: 5px">
<AreaTag v-for="tag in scope.row.tags" :key="tag" :tagName="tag" />
<!-- <el-tag v-for="tag in scope.row.tags" :key="tag" :type="getTagType(tag)">{{
tag
......@@ -277,25 +226,21 @@
</div>
<div class="box3-content">
<div class="box3-content-title">商业管制清单发布频次统计</div>
<el-table :data="commerceControlListReleaseFreq" stripe style="width: 100%">
<el-table :data="commerceControlListReleaseFreq" stripe style="width: 100%"
@row-click="handleCommercialRowClick">
<el-table-column prop="year" label="年份" width="200" />
<el-table-column label="发布次数" width="300">
<template #default="scope">
<div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<el-progress
:percentage="scope.row.percent * 100"
:show-text="false"
:status="getStatus(scope.row.percent)"
/>
<el-progress :percentage="scope.row.percent * 100" :show-text="false"
:status="getStatus(scope.row.percent)" />
</div>
</template>
</el-table-column>
<el-table-column label="重点领域" width="220" align="center">
<template #default="scope">
<div
style="display: flex; justify-content: center; align-items: center; gap: 5px"
>
<div style="display: flex; justify-content: center; align-items: center; gap: 5px">
<el-tag v-for="tag in scope.row.tags" :key="tag" :type="getTagType(tag)">{{
tag
}}</el-tag>
......@@ -324,11 +269,8 @@
<template #default="scope">
<div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<el-progress
:percentage="scope.row.percent * 100"
:show-text="false"
:status="getStatus(scope.row.percent)"
/>
<el-progress :percentage="scope.row.percent * 100" :show-text="false"
:status="getStatus(scope.row.percent)" />
</div>
</template>
</el-table-column>
......@@ -356,7 +298,8 @@
<el-checkbox v-model="domainChecked" label="50%规则" size="large" />
</template>
<template #default>
<EChart :option="radarOption" autoresize :style="{ height: '420px' }" />
<EChart :option="radarOption" autoresize :style="{ height: '420px' }"
@chart-click="handleRadarChartClick" />
<div class="data-origin-box">
<div class="data-origin-icon">
<img :src="tipsIcon" alt="" />
......@@ -381,7 +324,8 @@
</div>
</template>
<template #default>
<EChart :option="trendOption" autoresize :style="{ height: '420px' }" />
<EChart :option="trendOption" autoresize :style="{ height: '420px' }"
@chart-click="handleMultiBarChartClick" />
<div class="data-origin-box">
<div class="data-origin-icon">
<img :src="tipsIcon" alt="" />
......@@ -400,13 +344,9 @@
<el-row :gutter="20" style="width: 1600px; margin: 0 auto; margin-top: 39px; padding-bottom: 60px">
<CustomTitle id="position4" title="资源库" style="margin-top: 0px" />
<div class="resource-tabs">
<div
v-for="tab in resourceTabs"
:key="tab.value"
class="resource-tab-item"
<div v-for="tab in resourceTabs" :key="tab.value" class="resource-tab-item"
:class="{ active: activeResourceTab == tab.value, disabled: tab.disabled }"
@click="handleResourceTabClick(tab)"
>
@click="handleResourceTabClick(tab)">
{{ tab.label }}
</div>
</div>
......@@ -419,25 +359,15 @@
<div class="box4-item" v-for="(item, idx) in sanctionProcessList" :key="item.title">
<div class="box4-item-left">
<el-image :src="dotIcon" alt="图片" class="box4-item-left-icon" />
<div
class="box4-item-left-line"
v-if="idx + 1 != sanctionProcessList.length"
></div>
<div class="box4-item-left-line" v-if="idx + 1 != sanctionProcessList.length"></div>
</div>
<div class="box4-item-right">
<div class="box4-item-right-header" @click="handleSanc(item)">
<span class="box4-item-right-header-title"
>{{ item.postDate }}{{ item.title }}</span
>
<span class="box4-item-right-header-title">{{ item.postDate }}{{ item.title }}</span>
<span class="box4-item-right-header-desc">{{ item.desc }}</span>
</div>
<el-tooltip
effect="dark"
:content="item.content"
popper-class="common-prompt-popper"
placement="top"
:show-after="500"
>
<el-tooltip effect="dark" :content="item.content" popper-class="common-prompt-popper"
placement="top" :show-after="500">
<div class="box4-item-right-content">
{{ item.content }}
</div>
......@@ -445,12 +375,8 @@
</div>
</div>
</div>
<div
class="box4-footer"
:style="{ marginTop: sanctionProcessList.length > 0 ? '0px' : 'auto' }"
>
<el-button type="primary" link @click="handleGetMore"
>查看更多
<div class="box4-footer" :style="{ marginTop: sanctionProcessList.length > 0 ? '0px' : 'auto' }">
<el-button type="primary" link @click="handleGetMore">查看更多
<el-icon>
<DArrowRight />
</el-icon>
......@@ -467,24 +393,13 @@
</template>
<template #default>
<div class="box5">
<el-table
:data="entitiesList"
class="sanction-table"
stripe
empty-text="暂无数据"
height="700px"
header-row-class-name="table-header"
row-class-name="table-row"
>
<el-table :data="entitiesList" class="sanction-table" stripe empty-text="暂无数据" height="700px"
header-row-class-name="table-header" row-class-name="table-row">
<el-table-column prop="name" label="实体名称" min-width="200">
<template #default="scope">
<div class="tableName" @click="handleCompClick(scope.row)">
<el-image
v-if="scope.row.img"
class="box1-bottom-content-item-img"
:src="scope.row.img"
alt=""
></el-image>
<el-image v-if="scope.row.img" class="box1-bottom-content-item-img" :src="scope.row.img"
alt=""></el-image>
<div v-else class="box1-bottom-content-item-imgUndefined">
{{
(scope.row.name || scope.row.enName)?.match(
......@@ -538,19 +453,13 @@
<el-table-column prop="revenue" label="50%规则子企业" width="280" align="right">
<template #default="scope">
<div class="num-item" v-if="scope.row.ruleOrgCount > 0">
<div
class="name-item"
:class="[
'revenue-cell',
scope.row.revenue === '无营收数据' ? 'no-revenue' : ''
]"
>
<div class="name-item" :class="[
'revenue-cell',
scope.row.revenue === '无营收数据' ? 'no-revenue' : ''
]">
{{ scope.row.ruleOrgList[0].orgName }}...等
</div>
<div
style="width: 50px; color: #409eff; cursor: pointer"
@click="handleOrgClick(scope.row)"
>
<div style="width: 50px; color: #409eff; cursor: pointer" @click="handleOrgClick(scope.row)">
{{ scope.row.ruleOrgCount }}家>
</div>
</div>
......@@ -562,15 +471,8 @@
<!-- <div class="pagination-info">
第{{ currentPage }}页,共{{ totalPages }}页
</div> -->
<el-pagination
v-model:current-page="currentPage"
:page-size="pageSize"
:total="total"
:pager-count="5"
layout="prev, pager, next"
background
@current-change="handlePageChange"
/>
<el-pagination v-model:current-page="currentPage" :page-size="pageSize" :total="total"
:pager-count="5" layout="prev, pager, next" background @current-change="handlePageChange" />
</div>
</div>
</template>
......@@ -636,14 +538,8 @@
</div>
<div class="right-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>
</div>
</div>
......@@ -1130,11 +1026,13 @@ const handleToEntityList = item => {
"curTabName",
entitiesDataInfoList.value[currentCarouselIndex.value].postDate + " 《实体清单新增条目》"
);
let date = entitiesDataInfoList.value[currentCarouselIndex.value].postDate
const routeData = router.resolve({
path: "/exportControl/singleSanction",
query: {
id,
sanTypeId
sanTypeId,
date
}
});
// 打开一个新页面
......@@ -1182,8 +1080,20 @@ const radarOption = ref({
text: ""
},
tooltip: {
trigger: "item",
confine: true
// trigger: "item",
confine: true,
trigger: 'axis',
formatter: function (params) {
// params 包含所有系列的数据
if (!params || params.length === 0) return '';
const radarData = params[0];
const indicator = radarData.axisValue; // 当前角度对应的指标名
const value = radarData.value;
// 只显示当前角度对应的指标
return `${indicator}: ${value}`;
}
},
legend: {
show: false,
......@@ -1400,7 +1310,7 @@ const fetchSanctionList = async () => {
});
totalAll.value = res.totalElements;
}
} catch (error) {}
} catch (error) { }
};
const handlePageChangeAll = val => {
......@@ -1694,7 +1604,7 @@ const handleGetHylyList = async () => {
hylymc: "全部分类"
};
categoryList.value = [obj, ...categoryList.value];
} catch (error) {}
} catch (error) { }
};
const chart1Data = ref({
......@@ -1785,6 +1695,64 @@ const handleSearch = () => {
window.open(curRoute.href, "_blank");
};
// 点击实体清单发布频次统计
const handleEntityRowClick = (row) => {
console.log('row', row);
const params = {
domains: row.tags[0],
selectedDate: JSON.stringify([row.year + '-01-01', row.year + '-12-31'])
}
const route = router.resolve({
path: '/dataLibrary/dataEntityListEvent',
query: params
});
window.open(route.href, "_blank");
}
// 点击商业管制清单发布频次统计
const handleCommercialRowClick = (row) => {
console.log('row', row);
const params = {
domains: row.tags[0],
selectedDate: JSON.stringify([row.year + '-01-01', row.year + '-12-31'])
}
const route = router.resolve({
path: '/dataLibrary/dataCommerceControlListEvent',
query: params
});
window.open(route.href, "_blank");
}
// 点击实体清单领域分布情况
const handleRadarChartClick = (value) => {
// console.log('value', value);
// alert(domainChecked.value)
const params = {
isHalfRule: domainChecked.value
}
const route = router.resolve({
path: '/dataLibrary/dataEntityList',
query: params
});
window.open(route.href, "_blank");
}
// 点击制裁清单数量增长趋势
const handleMultiBarChartClick = (val) => {
// console.log('value', val);
const params = {
domains: val.seriesName,
selectedDate: JSON.stringify([val.name + '-01-01', val.name + '-12-31'])
}
const route = router.resolve({
path: '/dataLibrary/dataEntityListEvent',
query: params
});
window.open(route.href, "_blank");
}
onMounted(async () => {
handleGetHylyList();
let chart1 = getMultiLineChart(chart1Data.value.title, chart1Data.value.data[0].value, chart1Data.value.data[1].value);
......@@ -2194,6 +2162,7 @@ const handleMediaClick = item => {
}
.box3-content {
// flex: 1;
.el-progress--line {
width: 82px;
......@@ -3588,6 +3557,7 @@ const handleMediaClick = item => {
height: 450px;
display: flex;
gap: 20px;
.center-center-news {
flex-shrink: 0;
}
......@@ -3608,16 +3578,19 @@ const handleMediaClick = item => {
align-items: center;
justify-content: flex-start;
padding: 22px 0;
.data-origin-icon {
width: 16px;
height: 16px;
font-size: 0px;
margin-right: 8px;
img {
width: 100%;
height: 100%;
}
}
.data-origin-text {
font-family: Source Han Sans CN;
font-size: 14px;
......@@ -3630,18 +3603,23 @@ const handleMediaClick = item => {
right: 0px;
bottom: 15px;
z-index: 2;
:deep(.ai-pane-wrapper) {
display: none;
}
:deep(.ai-button-wrapper) {
display: flex;
}
&:hover {
width: 100%;
bottom: 0px;
:deep(.ai-pane-wrapper) {
display: block;
}
:deep(.ai-button-wrapper) {
display: none;
}
......
......@@ -973,7 +973,7 @@ export const getMultipleBarChart_m = object => {
const option = {
tooltip: {
trigger: "axis",
trigger: "item",
axisPointer: {
type: "shadow"
}
......
......@@ -105,7 +105,8 @@
</div>
</template>
<!-- <div class="echarts" ref="sanctionCountChartRef"></div> -->
<EChart :option="sanctionCountChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }" />
<EChart :option="sanctionCountChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }"
@chart-click="handleBarChartClick" />
<!-- <div class="bottom">
<div class="ai">
<div class="left">
......@@ -139,17 +140,14 @@
<div class="map-wrapper">
<div class="map-chart" ref="mapChartRef"></div>
<div class="rank-list">
<div class="rank-item" v-for="(item, index) in rankData" :key="index">
<div class="rank-item" v-for="(item, index) in rankData" :key="index" @click="handleClickRankChart(item)">
<div class="rank-index" :class="'rank-' + (index + 1)">{{ index + 1 }}</div>
<div class="rank-name">{{ item.name }}</div>
<div class="rank-bar-bg">
<div
class="rank-bar-fill"
:style="{
width: (item.value / maxRankValue) * 100 + '%',
background: getBarColor(index)
}"
></div>
<div class="rank-bar-fill" :style="{
width: (item.value / maxRankValue) * 100 + '%',
background: getBarColor(index)
}"></div>
</div>
<div class="rank-value">{{ item.value }}家</div>
</div>
......@@ -186,7 +184,8 @@
</el-select>
</template>
<!-- <div class="echarts" ref="domainChartRef"></div> -->
<EChart :option="domainChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }" />
<EChart :option="domainChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }"
@chart-click="handlePieChartClick" />
<!-- <div class="bottom">
<div class="ai">
<div class="left">
......@@ -218,7 +217,7 @@
</el-select>
</template>
<!-- <div class="echarts" ref="typeChartRef"></div> -->
<EChart :option="typeChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }" />
<EChart :option="typeChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }" @chart-click="handlePieChartClick1" />
<!-- <div class="bottom">
<div class="ai">
<div class="left">
......@@ -261,6 +260,7 @@ import {
} from "@/api/exportControlV2.0";
import EChart from "@/components/Chart/index.vue";
import { useRoute } from "vue-router";
import { useRouter } from "vue-router";
import tipsIcon from "../../../assets/icons/info-icon.png";
import AiButton from "@/components/base/Ai/AiButton/index.vue";
import AiPane from "@/components/base/Ai/AiPane/index.vue";
......@@ -271,6 +271,7 @@ const typeChart = useChartInterpretation();
const rankChart = useChartInterpretation();
const route = useRoute();
const router = useRouter()
// 实体清单-数据统计-制裁实体类型分布情况
const typeData = ref([]);
const getTypeCountData = async () => {
......@@ -637,6 +638,17 @@ const updateMapChart = () => {
};
mapChartInstance.setOption(option);
mapChartInstance.on('click', function (params) {
const param = {
selectedProvince: params.name,
selectedDate: regionTime.value === 'all' ? null : JSON.stringify([regionTime.value + '-01-01', regionTime.value + '-12-31'])
}
const route = router.resolve({
path: '/dataLibrary/dataEntityList',
query: param
});
window.open(route.href, "_blank");
});
};
const initMapChart = () => {
......@@ -976,10 +988,10 @@ const updateTypeChart = () => {
let data = typeData.value.length
? [...typeData.value]
: [
{ value: 50, name: "企业" },
{ value: 32, name: "高校" },
{ value: 32, name: "科研院所" }
];
{ value: 50, name: "企业" },
{ value: 32, name: "高校" },
{ value: 32, name: "科研院所" }
];
// 2. 聚合逻辑:保留前5项,其余合并为“其他”
data.sort((a, b) => b.value - a.value);
......@@ -1100,6 +1112,64 @@ const initTypeChart = () => {
};
const sanTypeId = ref("");
// 点击制裁实体数量变化情况
const handleBarChartClick = (val) => {
console.log('value', val);
const params = {
selectedDate: activeTab.value === 'year' ? JSON.stringify([val.name + '-01-01', val.name + '-12-31']) : JSON.stringify([val.name, val.name])
}
const route = router.resolve({
path: '/dataLibrary/dataEntityList',
query: params
});
window.open(route.href, "_blank");
}
// 制裁实体各省分布情况
const handleClickRankChart = (item) => {
// console.log('item', item);
const params = {
selectedProvince: item.name,
selectedDate: regionTime.value === 'all' ? null : JSON.stringify([regionTime.value + '-01-01', regionTime.value + '-12-31'])
}
const route = router.resolve({
path: '/dataLibrary/dataEntityList',
query: params
});
window.open(route.href, "_blank");
}
// 制裁实体领域分布情况
const handlePieChartClick = (val) => {
console.log('val', val);
const params = {
domains: val.name,
selectedDate: domainTime.value === 'all' ? null : JSON.stringify([domainTime.value + '-01-01', domainTime.value + '-12-31'])
}
const route = router.resolve({
path: '/dataLibrary/dataEntityList',
query: params
});
window.open(route.href, "_blank");
}
// 制裁实体类型分布情况
const handlePieChartClick1 = (val) => {
console.log('val', val);
const params = {
selectedEntityType: val.name,
selectedDate: typeTime.value === 'all' ? null : JSON.stringify([typeTime.value + '-01-01', typeTime.value + '-12-31'])
}
const route = router.resolve({
path: '/dataLibrary/dataEntityList',
query: params
});
window.open(route.href, "_blank");
}
onMounted(() => {
sanTypeId.value = route.query.sanTypeId || "";
console.log("数据统计页面接收到的 sanTypeId:", sanTypeId.value);
......@@ -1536,16 +1606,19 @@ onMounted(() => {
align-items: center;
justify-content: flex-start;
padding: 22px;
.data-origin-icon {
width: 16px;
height: 16px;
font-size: 0px;
margin-right: 8px;
img {
width: 100%;
height: 100%;
}
}
.data-origin-text {
font-family: Source Han Sans CN;
font-size: 14px;
......@@ -1558,18 +1631,23 @@ onMounted(() => {
right: 0px;
bottom: 15px;
z-index: 2;
:deep(.ai-pane-wrapper) {
display: none;
}
:deep(.ai-button-wrapper) {
display: flex;
}
&:hover {
width: 100%;
bottom: 0px;
:deep(.ai-pane-wrapper) {
display: block;
}
:deep(.ai-button-wrapper) {
display: none;
}
......
......@@ -54,7 +54,8 @@
</div>
</div>
</div> -->
<EChart :option="domainChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }" />
<EChart :option="domainChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }"
@chart-click="handlePieChartClick" />
<div class="data-origin-box">
<div class="data-origin-icon">
<img :src="tipsIcon" alt="" />
......@@ -104,7 +105,8 @@
</div>
</div>
</div> -->
<EChart :option="typeChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }" />
<EChart :option="typeChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }"
@chart-click="handlePieChartClick1" />
<div class="data-origin-box">
<div class="data-origin-icon">
<img :src="tipsIcon" alt="" />
......@@ -120,17 +122,15 @@
<div class="main-item">
<AnalysisBox title="制裁实体国家地区分布情况">
<div class="country-list">
<div class="list-item" v-for="(item, index) in countryDistribution" :key="index">
<div class="list-item" v-for="(item, index) in countryDistribution" :key="index"
@click="handleClickRankChart(item)">
<img :src="flag" alt="" class="flag" />
<div class="country-name">{{ item.name }}</div>
<div class="progress-bar-container">
<div
class="progress-bar"
:style="{
width: item.width,
background: item.gradient
}"
></div>
<div class="progress-bar" :style="{
width: item.width,
background: item.gradient
}"></div>
</div>
<div class="count" :class="{ highlight: index === 0 }">{{ item.count }}</div>
</div>
......@@ -163,17 +163,15 @@
<div class="map-wrapper">
<div class="map-chart" ref="mapChartRef"></div>
<div class="rank-list">
<div class="rank-item" v-for="(item, index) in regionDistribution" :key="index">
<div class="rank-item" v-for="(item, index) in regionDistribution" :key="index"
@click="handleRankChartClick(item)">
<div class="rank-index" :class="'rank-' + (index + 1)">{{ index + 1 }}</div>
<div class="rank-name">{{ item.name }}</div>
<div class="rank-bar-bg">
<div
class="rank-bar-fill"
:style="{
width: (maxRegionCount > 0 ? (item.count / maxRegionCount) * 100 : 0) + '%',
background: getBarColor(index)
}"
></div>
<div class="rank-bar-fill" :style="{
width: (maxRegionCount > 0 ? (item.count / maxRegionCount) * 100 : 0) + '%',
background: getBarColor(index)
}"></div>
</div>
<div class="rank-value">{{ item.count }}</div>
</div>
......@@ -474,6 +472,18 @@ const initMapChart = () => {
chart.setOption(option);
chart.on('click', function (params) {
const param = {
selectedProvince: params.name,
selectedDate: JSON.stringify([route.query.date, route.query.date])
}
const curRoute = router.resolve({
path: '/dataLibrary/dataEntityList',
query: param
});
window.open(curRoute.href, "_blank");
});
window.addEventListener("resize", () => {
chart.resize();
});
......@@ -841,6 +851,64 @@ const initTypeChart = () => {
// });
};
const sanTypeId = ref("");
// 制裁实体领域分布情况
const handlePieChartClick = (val) => {
// console.log('val', val);
const params = {
domains: val.name,
selectedDate: JSON.stringify([route.query.date, route.query.date])
}
const curRoute = router.resolve({
path: '/dataLibrary/dataEntityList',
query: params
});
window.open(curRoute.href, "_blank");
}
// 制裁实体类型分布情况
const handlePieChartClick1 = (val) => {
// console.log('val', val);
const params = {
selectedEntityType: val.name,
selectedDate: JSON.stringify([route.query.date, route.query.date])
}
const curRoute = router.resolve({
path: '/dataLibrary/dataEntityList',
query: params
});
window.open(curRoute.href, "_blank");
}
// 制裁实体国家地区分布情况
const handleClickRankChart = (item) => {
// console.log('item', item);
const params = {
selectedCountryId: item.id,
selectedDate: JSON.stringify([route.query.date, route.query.date])
}
const curRoute = router.resolve({
path: '/dataLibrary/dataEntityList',
query: params
});
window.open(curRoute.href, "_blank");
}
// 制裁实体各省分布情况
const handleRankChartClick = (item) => {
console.log('item', item);
const params = {
selectedProvince: item.name,
selectedDate: JSON.stringify([route.query.date, route.query.date])
}
const curRoute = router.resolve({
path: '/dataLibrary/dataEntityList',
query: params
});
window.open(curRoute.href, "_blank");
}
onMounted(() => {
// 获取路由参数id
sanTypeId.value = route.query.sanTypeId;
......@@ -986,6 +1054,11 @@ onMounted(() => {
display: flex;
align-items: center;
margin-bottom: 16px;
cursor: pointer;
&:hover {
background: var(--color-primary-2);
}
&:last-child {
margin-bottom: 0;
......@@ -1284,22 +1357,26 @@ onMounted(() => {
}
}
}
.data-origin-box {
width: 100%;
display: flex;
align-items: center;
justify-content: flex-start;
padding: 22px;
.data-origin-icon {
width: 16px;
height: 16px;
font-size: 0px;
margin-right: 8px;
img {
width: 100%;
height: 100%;
}
}
.data-origin-text {
font-family: Source Han Sans CN;
font-size: 14px;
......@@ -1312,18 +1389,23 @@ onMounted(() => {
right: 0px;
bottom: 15px;
z-index: 2;
:deep(.ai-pane-wrapper) {
display: none;
}
:deep(.ai-button-wrapper) {
display: flex;
}
&:hover {
width: 100%;
bottom: 0px;
:deep(.ai-pane-wrapper) {
display: block;
}
:deep(.ai-button-wrapper) {
display: none;
}
......
......@@ -48,7 +48,6 @@ const props = defineProps({
})
const onNavigateToDetail = item => {
window.sessionStorage.setItem("curTabName", item.searchname);
const curRoute = router.resolve({
path: "/marketSingleCaseLayout/overview",
query: { id: item.sortcode, searchId: item.searchid }
......
<template>
<div class="box-text-box">
<div class="box-text-item">
<div class="box-text-left">{{ "启动时间:" }}</div>
<div class="box-text-right one-line-ellipsis">{{ props.baseInfo.searchnum }}</div>
</div>
<div class="box-text-item">
<div class="box-text-left">{{ "调查概括:" }}</div>
<div class="box-text-right two-line-ellipsis">{{ props.baseInfo.product }}</div>
</div>
<div class="box-text-item">
<div class="box-text-left">{{ "调查阶段:" }}</div>
<div class="box-text-right one-line-ellipsis">{{ props.baseInfo.plaintiff }}</div>
</div>
<div class="box-text-item">
<div class="box-text-left">{{ "调查范围:" }}</div>
<div class="box-text-right five-line-ellipsis">{{ props.baseInfo.defendant }}</div>
</div>
</div>
</template>
<script setup name="CarouselItem337">
const props = defineProps({
baseInfo: {
type: Object,
default: () => ({})
}
})
</script>
<style scoped lang="scss">
.box-text-box {
width: 100%;
padding: 20px 20px 0;
height: 185px;
.box-text-item {
display: flex;
align-items: flex-start;
line-height: 30px;
margin-bottom: 8px;
&::before {
content: "";
width: 4px;
height: 4px;
border-radius: 2px;
background: rgba(59, 65, 75, 1);
margin-top: 16px;
margin-right: 12px;
}
.box-text-left {
height: 30px;
width: 100px;
color: rgba(59, 65, 75, 1);
font-family: Source Han Sans CN;
font-size: 16px;
font-weight: 700;
}
.box-text-right {
min-height: 30px;
width: 20px;
flex: auto;
color: rgba(59, 65, 75, 1);
font-family: Source Han Sans CN;
font-size: 16px;
}
.two-line-ellipsis {
max-height: 60px;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
white-space: normal;
}
.five-line-ellipsis {
max-height: 150px;
display: -webkit-box;
-webkit-line-clamp: 5;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
white-space: normal;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="box-blue-box">
<div class="box-blue-name">
<div class="box-blue-time">{{ props.baseInfo.progressdate }}</div>
<div class="box-blue-time">{{ props.baseInfo.progressresult }}</div>
</div>
<div class="box-blue-text one-line-ellipsis">{{ props.baseInfo.progressdetails }}</div>
</div>
<div class="box-text-box">
<div class="box-text-item">
<div class="box-text-left">{{ "启动时间:" }}</div>
<div class="box-text-right one-line-ellipsis">{{ props.baseInfo.searchnum }}</div>
</div>
<div class="box-text-item">
<div class="box-text-left">{{ "调查对象:" }}</div>
<div class="box-text-right one-line-ellipsis">{{ props.baseInfo.product }}</div>
</div>
<div class="box-text-item">
<div class="box-text-left">{{ "调查状态:" }}</div>
<div class="box-text-right one-line-ellipsis">{{ props.baseInfo.plaintiff }}</div>
</div>
<div class="box-text-item">
<div class="box-text-left">{{ "请愿方:" }}</div>
<div class="box-text-right three-line-ellipsis">{{ props.baseInfo.product }}</div>
</div>
</div>
</template>
<script setup name="CarouselItem337">
const props = defineProps({
baseInfo: {
type: Object,
default: () => ({})
}
})
</script>
<style scoped lang="scss">
.box-blue-box {
width: 100%;
padding: 0 20px 10px;
border: 1px solid rgba(231, 243, 255, 1);
border-radius: 4px;
background: rgba(246, 250, 255, 1);
.box-blue-name {
height: 38px;
display: flex;
align-items: center;
font-weight: bold;
font-family: Source Han Sans CN;
font-size: 16px;
line-height: 24px;
color: var(--text-primary-80-color);
&::before {
content: "";
width: 4px;
height: 4px;
border-radius: 2px;
background: var(--text-primary-80-color);
margin-right: 12px;
}
.box-blue-time {
height: 24px;
width: 100px;
}
}
.box-blue-text {
padding-left: 18px;
height: 30px;
color: rgba(59, 65, 75, 1);
font-family: Source Han Sans CN;
font-size: 16px;
line-height: 30px;
}
}
.box-text-box {
width: 100%;
padding: 20px 20px 0;
height: 185px;
.box-text-item {
display: flex;
align-items: flex-start;
line-height: 30px;
margin-bottom: 8px;
&::before {
content: "";
width: 4px;
height: 4px;
border-radius: 2px;
background: rgba(59, 65, 75, 1);
margin-top: 16px;
margin-right: 12px;
}
.box-text-left {
height: 30px;
width: 100px;
color: rgba(59, 65, 75, 1);
font-family: Source Han Sans CN;
font-size: 16px;
font-weight: 700;
}
.box-text-right {
min-height: 30px;
width: 20px;
flex: auto;
color: rgba(59, 65, 75, 1);
font-family: Source Han Sans CN;
font-size: 16px;
}
.three-line-ellipsis {
max-height: 90px;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
white-space: normal;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="box-blue-box">
<div class="box-blue-name">
<div class="box-blue-time">{{ props.baseInfo.progressdate }}</div>
<div class="box-blue-time">{{ props.baseInfo.progressresult }}</div>
</div>
<div class="box-blue-text">{{ props.baseInfo.progressdetails }}</div>
</div>
<div class="box-text-box">
<div class="box-text-item">
<div class="box-text-left">{{ "调查案号:" }}</div>
<div class="box-text-right one-line-ellipsis">{{ props.baseInfo.searchnum }}</div>
</div>
<div class="box-text-item">
<div class="box-text-left">{{ "涉及产品:" }}</div>
<div class="box-text-right one-line-ellipsis">{{ props.baseInfo.product }}</div>
</div>
<div class="box-text-item">
<div class="box-text-left">{{ "原告:" }}</div>
<div class="box-text-right one-line-ellipsis">{{ props.baseInfo.plaintiff }}</div>
</div>
<div class="box-text-item">
<div class="box-text-left">{{ "被告:" }}</div>
<div class="box-text-right one-line-ellipsis">{{ props.baseInfo.defendant }}</div>
</div>
<div class="box-text-item">
<div class="box-text-left">{{ "涉案专利:" }}</div>
<div class="box-text-right one-line-ellipsis">{{ props.baseInfo.patent }}</div>
</div>
</div>
</template>
<script setup name="CarouselItem337">
const props = defineProps({
baseInfo: {
type: Object,
default: () => ({})
}
})
</script>
<style scoped lang="scss">
.box-blue-box {
width: 100%;
padding: 0 20px 10px;
border: 1px solid rgba(231, 243, 255, 1);
border-radius: 4px;
background: rgba(246, 250, 255, 1);
.box-blue-name {
height: 38px;
display: flex;
align-items: center;
font-weight: bold;
font-family: Source Han Sans CN;
font-size: 16px;
line-height: 24px;
color: var(--text-primary-80-color);
&::before {
content: "";
width: 4px;
height: 4px;
border-radius: 2px;
background: var(--text-primary-80-color);
margin-right: 12px;
}
.box-blue-time {
height: 24px;
width: 100px;
}
}
.box-blue-text {
padding-left: 18px;
height: 60px;
color: rgba(59, 65, 75, 1);
font-family: Source Han Sans CN;
font-size: 16px;
line-height: 30px;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
white-space: normal;
}
}
.box-text-box {
width: 100%;
padding: 20px 20px 0;
height: 185px;
.box-text-item {
display: flex;
align-items: flex-start;
line-height: 30px;
margin-bottom: 8px;
&::before {
content: "";
width: 4px;
height: 4px;
border-radius: 2px;
background: rgba(59, 65, 75, 1);
margin-top: 16px;
margin-right: 12px;
}
.box-text-left {
height: 30px;
width: 100px;
color: rgba(59, 65, 75, 1);
font-family: Source Han Sans CN;
font-size: 16px;
font-weight: 700;
}
.box-text-right {
min-height: 30px;
width: 20px;
flex: auto;
color: rgba(59, 65, 75, 1);
font-family: Source Han Sans CN;
font-size: 16px;
}
}
}
</style>
\ No newline at end of file
......@@ -7,6 +7,13 @@
<SearchContainer style="margin-bottom: 0;margin-top: 48px; height: fit-content" v-if="containerRef"
placeholder="搜索市场准入限制调查" :containerRef="containerRef" areaName="" />
</div>
<div class="date-box" v-if="sortInfo.length">
<div class="date-icon">
<img :src="tipsTcon" alt="">
</div>
<div class="date-text">近期美国各联邦政府机构市场准入调查数量汇总</div>
<TimeTabPane @time-click="handleGetStatSort" activeTime="近一年" />
</div>
<div class="home-main-header-card-box">
<div :class="getCardClass(item.sortCode)" v-for="item in sortInfo" :key="item.sortCode" @click="onNavigateToCase(item)">
<div class="header">
......@@ -19,6 +26,7 @@
{{ item.sortDescription }}
</div>
</div>
<div class="item-dot">+{{ "999" }}</div>
</div>
</div>
</div>
......@@ -28,81 +36,31 @@
<div class="box1">
<overviewMainBox title="调查进展" @toDetail="handleClickToDetail()">
<template #header-icon>
<img style="width: 100%; height: 100%" src="./assets/icons/icon_1599.png" alt="" />
<img style="width:100%; height:100%" src="./assets/icons/icon_1599.png" alt="" />
</template>
<div class="box1-left" @click="handleSwithCurSurvey('left')">
<LeftBtn />
</div>
<div class="box1-right" @click="handleSwithCurSurvey('right')">
<RightBtn />
</div>
<el-carousel ref="carouselRef" height="395px" :autoplay="true" :interval="3000" arrow="never"
indicator-position="none">
<el-carousel ref="carouselRef" height="395px" :autoplay="true" :interval="3000" arrow="never" indicator-position="none">
<el-carousel-item v-for="(item, index) in box1DataList" :key="index">
<div class="box1-main">
<div class="box1-main-header">
<div class="header-left">
{{ item.searchname }}
</div>
<div class="header-right">
<div class="tag1">{{ item.searchsort }}</div>
<div class="area-tag-box" v-if="item.searchArea.length">
<AreaTag v-for="(val, idx) in item.searchArea" :key="idx" :tagName="val" />
</div>
</div>
</div>
<div class="info-box">
<div class="info-header">
<div class="icon"></div>
<div class="time">{{ item.progressdate }}</div>
<div class="title">{{ item.progressresult }}</div>
</div>
<div class="info-content">
{{ item.progressdetails }}
</div>
</div>
<div class="list-box">
<div class="list-item">
<div class="icon"></div>
<div class="list-left">{{ "调查案号:" }}</div>
<div class="list-right">{{ item.searchnum }}</div>
</div>
<div class="list-item">
<div class="icon"></div>
<div class="list-left">{{ "涉及产品:" }}</div>
<div class="list-right">
{{ item.product }}
</div>
</div>
<div class="list-item">
<div class="icon"></div>
<div class="list-left">{{ "原告:" }}</div>
<div class="list-right">
{{ item.plaintiff }}
</div>
</div>
<div class="list-item">
<div class="icon"></div>
<div class="list-left">{{ "被告:" }}</div>
<div class="list-right">
{{ item.defendant }}
</div>
</div>
<div class="list-item">
<div class="icon"></div>
<div class="list-left">{{ "涉案专利:" }}</div>
<div class="list-right">
{{ item.patent }}
</div>
<div class="box1-head-box">
<div :class="`box1-head-code box1-tags-${item.searchsort}`">{{ item.searchsort }}调查</div>
<div class="box1-head-name one-line-ellipsis">{{ item.searchname }}</div>
<div class="box1-head-tags" v-if="item.searchArea.length">
<AreaTag v-for="(val, idx) in item.searchArea.slice(0, 2)" :key="idx" :tagName="val" />
</div>
</div>
<CarouselItem337 v-if="item.searchsort==337" :baseInfo="item"></CarouselItem337>
<CarouselItem301 v-if="item.searchsort==301" :baseInfo="item"></CarouselItem301>
<CarouselItem232 v-if="item.searchsort==232" :baseInfo="item"></CarouselItem232>
</div>
</el-carousel-item>
</el-carousel>
<div class="box1-left" @click="handleSwithCurSurvey('left')"> <LeftBtn /> </div>
<div class="box1-right" @click="handleSwithCurSurvey('right')"> <RightBtn /> </div>
</overviewMainBox>
</div>
<RiskSignal :list="box2Data" @more-click="handleToMoreRiskSignal" @item-click="onNavigateToDetail" postDate="signalTime" name="signalTitle" riskLevel="signalLevel" />
</div>
<DivideHeader id="position2" class="divide-header" :titleText="'资讯要闻'"></DivideHeader>
<div class="center-center">
<NewsList :newsList="newsList" @item-click="handleToNewsAnalysis" @more-click="handleToMoreNews"
......@@ -111,6 +69,7 @@
source="orgName" content="remarks" name="personName" imageUrl="personImage">
</MessageBubble>
</div>
<DivideHeader id="position3" class="divide-header" :titleText="'数据总览'"></DivideHeader>
<div class="center-footer">
<div class="box5">
......@@ -121,18 +80,17 @@
<template #header-right>
<div class="box-header-right">
<div class="box5-header-right-btn-box">
<div class="right-box" :class="{ rightBoxActive: box5BtnActive === item.value }"
v-for="(item, index) in box5BtnList" :key="index" @click="handleChangeBox5Btn(item.value)">
{{ item.name }}
</div>
<div :class="['right-box', { 'box5-active': box5Active==1 }]" @click="hadleGetStatNum(1)">按月度</div>
<div :class="['right-box', { 'box5-active': box5Active==12 }]" @click="hadleGetStatNum(12)">按年度</div>
</div>
</div>
</template>
<div class="box5-main">
<div class="box5-main-chart" id="chart1"></div>
<div class="box5-main-footer">
<TipTab />
<div class="box-echart-main">
<div class="box-echart-content">
<el-empty v-if="!box5ChartData.title.length" description="暂无数据" style="padding: 100px 0 0;" :image-size="100" />
<div v-if="box5ChartData.title.length" style="width: 100%; height: 100%;" id="box5Chart"></div>
</div>
<TipTab style="margin-top: 6px;" />
</div>
</OverviewNormalBox>
</div>
......@@ -143,18 +101,17 @@
</template>
<template #header-right>
<div class="box-header-right">
<el-select v-model="box6SelectedYear" @change="handleChangeBox6Year" placeholder="选择时间"
style="width: 120px">
<el-select v-model="box6SelectedYear" @change="handleChangeBox6Year" placeholder="选择时间" style="width: 120px">
<el-option v-for="item in box7YearList" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</template>
<div class="box6-main">
<div class="box6-main-chart" id="chart2"></div>
<div class="box6-main-footer">
<TipTab />
<div class="box-echart-main">
<div class="box-echart-content">
<el-empty v-if="!box6Data.title.length" description="暂无数据" style="padding: 100px 0 0;" :image-size="100" />
<div v-if="box6Data.title.length" style="width: 100%; height: 100%;" id="box6Chart"></div>
</div>
<TipTab style="margin-top: 6px;" />
</div>
</OverviewNormalBox>
</div>
......@@ -168,25 +125,21 @@
<template #header-right>
<div class="box-header-right">
<div class="box7-header-right-select-box">
<el-select v-model="box7SelectedSurvey" @change="handleBox7()" placeholder="选择调查"
style="width: 120px">
<el-option v-for="item in box8SurveyList" :key="item.value" :label="item.label"
:value="item.value" />
<el-select v-model="box7SelectedSurvey" @change="handleBox7()" placeholder="选择调查" style="width: 120px">
<el-option v-for="item in box8SurveyList" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<el-select v-model="box7SelectedYear" @change="handleBox7()" placeholder="选择时间"
style="width: 120px">
<el-option v-for="item in box7YearList" :key="item.value" :label="item.label"
:value="item.value" />
<el-select v-model="box7SelectedYear" @change="handleBox7()" placeholder="选择时间" style="width: 120px">
<el-option v-for="item in box7YearList" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</div>
</template>
<div class="box7-main">
<el-empty v-if="box7Data.data.length === 0" description="暂无数据" :image-size="100" />
<div v-if="box7Data.data.length > 0" class="box7-main-chart-box" id="box7Chart"></div>
<div class="box7-main-footer">
<TipTab />
<div class="box-echart-main">
<div class="box-echart-content">
<el-empty v-if="!box7Data.data.length" description="暂无数据" style="padding: 100px 0 0;" :image-size="100" />
<div v-if="box7Data.data.length" style="width: 100%; height: 100%;" id="box7Chart"></div>
</div>
<TipTab style="margin-top: 6px;" />
</div>
</OverviewNormalBox>
</div>
......@@ -197,22 +150,23 @@
</template>
<template #header-right>
<div class="box-header-right">
<el-select v-model="box8SelectedSurvey" @change="handleBox8()" placeholder="选择调查"
style="width: 120px">
<el-option v-for="item in box8SurveyList" :key="item.value" :label="item.label"
:value="item.value" />
<el-select v-model="box8SelectedSurvey" @change="handleGetBox8Data()" placeholder="选择调查" style="width: 120px">
<el-option v-for="item in box8SurveyList" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</template>
<el-empty v-if="box8Data.length === 0" description="暂无数据" :image-size="120" style="padding-top: 100px;" />
<div v-if="box8Data.length" class="box8-main" id="box8Chart"></div>
<div class="box8-footer">
<TipTab />
<div class="box-echart-main">
<div class="box-echart-content">
<el-empty v-if="!box8Data.length" description="暂无数据" style="padding: 100px 0 0;" :image-size="100" />
<div v-if="box8Data.length" style="width: 100%; height: 100%;" id="box8Chart"></div>
</div>
<TipTab style="margin-top: 6px;" />
</div>
</OverviewNormalBox>
</div>
</div>
</div>
<div class="home-main-footer">
<DivideHeader id="position4" class="divide-header" :titleText="'资源库'"></DivideHeader>
<div class="home-main-footer-header">
......@@ -317,6 +271,10 @@ import MessageBubble from "@/components/base/messageBubble/index.vue"
import NewsList from "@/components/base/newsList/index.vue";
import DivideHeader from "@/components/DivideHeader.vue";
import SurveyHistory from "@/views/marketAccessRestrictions/com/SurveyHistory.vue"
import TimeTabPane from '@/components/base/TimeTabPane/index.vue';
import CarouselItem337 from '@/views/marketAccessRestrictions/marketAccessHome/com/CarouselItem337.vue';
import CarouselItem301 from '@/views/marketAccessRestrictions/marketAccessHome/com/CarouselItem301.vue';
import CarouselItem232 from '@/views/marketAccessRestrictions/marketAccessHome/com/CarouselItem232.vue';
import setChart from "@/utils/setChart";
import router from "@/router";
......@@ -342,8 +300,9 @@ import {
import { getRiskSignal, getNews, getRemarks } from "@/api/common/index";
import { ElMessage } from "element-plus";
import { useGotoNewsDetail } from '@/router/modules/news';
import tipsTcon from "./assets/icons/tips-icon.png";
const getCardClass = (code) => ['card', `theme-${code}`]
const getCardClass = (code) => ['theme-card', `theme-${code}`]
const handleToPosi = id => {
const element = document.getElementById(id);
......@@ -370,8 +329,9 @@ const handleToPosi = id => {
let containerRef = ref(null);
// 首页分类
const sortInfo = ref([{}]);
const handleGetStatSort = async () => {
const sortInfo = ref([]);
const handleGetStatSort = async (event) => {
console.log('周期筛选', event)
try {
const res = await getStatSort();
console.log("首页分类", res);
......@@ -402,7 +362,6 @@ const handleClickToDetail = () => {
// 跳转调查案件
const onNavigateToCase = (item) => {
window.sessionStorage.setItem("curTabName", item.sortName);
const route = router.resolve({
path: "/marketAccessLayout",
query: { id: item.sortCode }
......@@ -550,22 +509,6 @@ const handleClickPerson = async item => {
} catch (error) { }
};
// 调查数量
const box5BtnList = ref([
{
name: "按月度",
value: 1
},
{
name: "按年度",
value: 12
}
]);
const box5BtnActive = ref(1);
const handleChangeBox5Btn = val => {
box5BtnActive.value = val;
handleBox5();
};
function transformAllData(originalData) {
// 1. 提取所有年份并去重,排除null和undefined,然后按数字升序排序
const allYears = [
......@@ -658,44 +601,30 @@ function transformAllData1(originalData) {
}
const box5ChartData = ref({
title: ["2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025"],
title: [],
data: [
{
name: "337调查",
value: [73, 32, 42, 48, 38, 49, 63, 75, 70, 86, 95, 87]
},
{
name: "301调查",
value: [8, 3, 2, 8, 9, 10, 12, 18, 16, 18, 20, 22]
},
{
name: "232调查",
value: [1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 3]
}
{ name: "337调查", value: [] },
{ name: "301调查", value: [] },
{ name: "232调查", value: [] }
]
});
const hadleGetStatNum = async () => {
const params = {
byYorM: box5BtnActive.value // 月度:1 年度:12
};
const box5Active = ref(1);
const hadleGetStatNum = async (event) => {
if (event) box5Active.value = event;
try {
const res = await getStatNum(params);
let byYorM = box5Active.value
const res = await getStatNum({byYorM});
console.log("调查数量", res);
if (res.code === 200 && res.data) {
if (box5BtnActive.value === 1) {
if (byYorM === 1) {
box5ChartData.value = transformAllData1(res.data);
} else {
box5ChartData.value = transformAllData(res.data);
}
console.log("box5ChartData", box5ChartData.value);
}
} catch (error) { }
};
const handleBox5 = async () => {
await hadleGetStatNum();
let chart1 = getMultiLineChart(box5ChartData.value);
setChart(chart1, "chart1");
} catch (error) {}
let box5Chart = getMultiLineChart(box5ChartData.value);
nextTick(() => { setChart(box5Chart, "box5Chart") })
};
// 制裁领域分布
......@@ -706,18 +635,9 @@ const handleChangeBox6Year = () => {
const box6Data = ref({
title: [],
data: [
{
name: "337调查",
value: []
},
{
name: "232调查",
value: []
},
{
name: "301调查",
value: []
}
{ name: "337调查", value: [] },
{ name: "232调查", value: [] },
{ name: "301调查", value: [] }
],
maxNum: 0
});
......@@ -789,8 +709,8 @@ const handleGetStatArea = async () => {
};
const handleBox6 = async () => {
await handleGetStatArea();
let chart2 = getRadarChart(box6Data.value);
setChart(chart2, "chart2");
let box6Chart = getRadarChart(box6Data.value);
setChart(box6Chart, "box6Chart");
};
// 受调查国家分布
......@@ -852,24 +772,16 @@ const handleGetBox8Data = async () => {
const res = await getSearchResult({sortCode: box8SelectedSurvey.value});
console.log("调查结果分布", res);
if (res.code === 200 && res.data) {
box8Data.value = res.data.map(item => {
return {
name: item.RESULTNAME,
value: item.RESULTNUM
}
})
box8Data.value = res.data.map(item => ({ name: item.RESULTNAME, value: item.RESULTNUM }))
} else {
box8Data.value = []
}
} catch (error) {
console.error(error);
box8Data.value = []
}
};
const handleBox8 = async () => {
await handleGetBox8Data()
const box8Chart = getPieChart(box8Data.value);
setChart(box8Chart, "box8Chart");
}
nextTick(() => { setChart(box8Chart, "box8Chart") })
};
// 资源库
const pageSize = ref(10);
......@@ -1034,10 +946,10 @@ onMounted(async () => {
handleGetBox2Data();
handleGetBox3Data();
handleGetBox4Data();
handleBox5();
hadleGetStatNum();
handleBox6();
handleBox7();
handleBox8();
handleGetBox8Data();
handleGetAllSearchCountry()
handleGetInsList()
handleGetSearchAllArea();
......@@ -1050,6 +962,19 @@ onMounted(async () => {
box-shadow: none;
}
.box-echart-main {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
padding: 8px 22px 20px;
.box-echart-content {
width: 100%;
height: 20px;
flex: auto;
}
}
.home-wrapper {
width: 100%;
height: 100%;
......@@ -1164,15 +1089,42 @@ onMounted(async () => {
}
}
.date-box {
display: flex;
align-items: center;
width: 1600px;
margin-top: 48px;
.date-icon {
width: 16px;
height: 16px;
font-size: 0px;
margin-right: 6px;
img {
width: 100%;
height: 100%;
}
}
.date-text {
width: 20px;
flex: auto;
font-size: 18px;
line-height: 18px;
font-family: Source Han Sans CN;
color: var(--text-primary-80-color);
}
}
.home-main-header-card-box {
width: 1600px;
margin: 0 auto;
margin: 20px auto 0;
height: 142px;
margin-top: 64px;
display: flex;
justify-content: space-between;
.card {
.theme-card {
transition: transform 0.3s ease, box-shadow 0.3s ease;
width: 520px;
height: 142px;
......@@ -1185,13 +1137,26 @@ onMounted(async () => {
&::before {
content: "";
position: absolute;
z-index: 99;
left: 0;
top: 15px;
width: 4px;
height: 111px;
}
.item-dot {
position: absolute;
right: -13px;
top: -10px;
padding: 4px 8px 6px;
background-color: #FF4D4F;
color: white;
font-size: 16px;
line-height: 16px;
font-family: Source Han Sans CN;
border-radius: 14px;
letter-spacing: 1px;
}
.header {
height: 56px;
display: flex;
......@@ -1291,7 +1256,6 @@ onMounted(async () => {
.box1-left {
position: absolute;
left: 0;
z-index: 9999;
top: 220px;
width: 24px;
height: 48px;
......@@ -1307,7 +1271,6 @@ onMounted(async () => {
position: absolute;
right: 0;
top: 220px;
z-index: 9999;
width: 24px;
height: 48px;
cursor: pointer;
......@@ -1326,19 +1289,16 @@ onMounted(async () => {
.box1-header-left {
display: flex;
.icon {
width: 19px;
height: 18px;
margin-top: 15px;
margin-left: 22px;
img {
width: 100%;
height: 100%;
}
}
.title {
width: 112px;
height: 48px;
......@@ -1367,166 +1327,53 @@ onMounted(async () => {
}
.box1-main {
width: 1064px;
width: 100%;
height: 354px;
margin-top: 16px;
margin-left: 31px;
.box1-main-header {
width: 990px;
padding: 0 40px;
.box1-head-box {
width: 100%;
height: 60px;
display: flex;
justify-content: space-between;
align-items: center;
.header-left {
width: 660px;
padding-left: 22px;
color: var(--color-main-active);
font-family: Source Han Sans CN;
font-size: 20px;
font-weight: 700;
.box1-head-code {
height: 26px;
line-height: 26px;
font-size: 14px;
padding: 0 8px;
font-family: Microsoft YaHei;
border-radius: 4px;
font-weight: bold;
margin-right: 10px;
}
.header-right {
display: flex;
width: 320px;
justify-content: flex-end;
align-items: center;
flex-wrap: wrap;
.tag1 {
height: 24px;
line-height: 24px;
padding: 0 8px;
box-sizing: border-box;
color: var(--color-main-active);
border: 1px solid rgba(145, 202, 255, 1);
border-radius: 4px;
background: rgba(230, 244, 255, 1);
}
.area-tag-box {
flex: 1;
margin-left: 8px;
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.box1-tags-337 {
border: 1px solid #91caff;
background: #e6f4ff;
color: #055fc2;
}
}
.info-box {
margin-left: 6px;
width: 989px;
height: 108px;
box-sizing: border-box;
border: 1px solid rgba(231, 243, 255, 1);
border-radius: 4px;
background: rgba(246, 250, 255, 1);
.info-header {
height: 38px;
display: flex;
.icon {
width: 4px;
height: 4px;
border-radius: 2px;
background: rgba(59, 65, 75, 1);
margin-left: 24px;
margin-top: 20px;
}
.time {
width: 200px;
height: 24px;
margin-top: 10px;
margin-left: 12px;
color: rgba(59, 65, 75, 1);
font-family: Source Han Sans CN;
font-size: 16px;
font-weight: 700;
line-height: 24px;
}
.title {
width: 200px;
margin-left: 11px;
margin-top: 10px;
height: 24px;
color: rgba(59, 65, 75, 1);
font-family: Source Han Sans CN;
font-size: 16px;
font-weight: 700;
line-height: 24px;
}
.box1-tags-232 {
border: 1px solid #b37feb;
background: #f9f0ff;
color: #722ed1;
}
.info-content {
width: 909px;
height: 60px;
color: rgba(59, 65, 75, 1);
.box1-tags-301 {
border: 1px solid #ffd591;
background: #fff7e6;
color: #fa8c16;
}
.box1-head-name {
width: 20px;
flex: auto;
color: var(--color-main-active);
font-family: Source Han Sans CN;
font-size: 16px;
font-weight: 400;
line-height: 30px;
margin-left: 41px;
margin-top: 4px;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
white-space: normal;
font-size: 20px;
font-weight: bold;
line-height: 26px;
}
}
.list-box {
margin-top: 18px;
margin-left: 28px;
width: 940px;
height: 185px;
overflow: hidden;
overflow-y: auto;
.list-item {
height: 37px;
.box1-head-tags {
margin-left: 40px;
display: flex;
.icon {
width: 4px;
height: 4px;
border-radius: 2px;
background: rgba(59, 65, 75, 1);
margin-top: 16px;
}
.list-left {
margin-left: 18px;
line-height: 37px;
width: 80px;
color: rgba(59, 65, 75, 1);
font-family: Source Han Sans CN;
font-size: 16px;
font-weight: 700;
text-align: right;
}
.list-right {
line-height: 37px;
margin-left: 17px;
color: rgba(59, 65, 75, 1);
font-family: Source Han Sans CN;
font-size: 16px;
font-weight: 400;
width: 820px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
gap: 8px;
}
}
}
......@@ -1535,9 +1382,6 @@ onMounted(async () => {
.box2 {
width: 521px;
height: 450px;
// border-radius: 10px;
// box-shadow: 0px 0px 15px 0px rgba(22, 119, 255, 0.1);
// background: rgba(255, 255, 255, 1);
position: relative;
.box2-header {
......@@ -1891,7 +1735,7 @@ onMounted(async () => {
cursor: pointer;
}
.rightBoxActive {
.box5-active {
color: var(--color-main-active);
border: 1px solid var(--color-main-active);
border-radius: 4px;
......@@ -1899,17 +1743,6 @@ onMounted(async () => {
}
}
}
.box5-main {
height: 410px;
position: relative;
z-index: 0;
.box5-main-chart {
height: 370px;
}
}
}
.box6 {
......@@ -1922,25 +1755,6 @@ onMounted(async () => {
justify-content: flex-end;
align-items: center;
gap: 8px;
}
.box6-main {
height: 360px;
position: relative;
.box6-main-chart {
height: 370px;
position: relative;
z-index: 99;
}
.box6-main-footer {
width: 100%;
height: 40px;
}
}
}
}
......@@ -1967,18 +1781,6 @@ onMounted(async () => {
gap: 12px;
}
}
.box7-main {
height: 412px;
.box7-main-chart-box {
height: 372px;
}
.box7-main-footer {
height: 40px;
}
}
}
.box8 {
......@@ -1991,17 +1793,6 @@ onMounted(async () => {
justify-content: flex-end;
align-items: center;
gap: 8px;
}
.box8-main {
width: calc(100% - 40px);
margin: 0 auto;
height: 360px;
}
.box8-footer {
height: 40px;
}
}
}
......
......@@ -5,10 +5,12 @@ const getBarChart = (nameList, valueList) => {
const option = {
tooltip: {},
grid: {
top: '8%',
right: 24,
bottom: 24,
left: 24,
width: '100%',
height: '83%',
top: '15%',
right: '5%',
bottom: '2%',
left: '1%',
containLabel: true
},
yAxis: {
......
import * as echarts from 'echarts'
const getMultiLineChart = (data) => {
console.log('dataaaa', data);
return {
tooltip: {
trigger: 'axis',
trigger: 'item',
axisPointer: {
type: 'cross',
label: {
......@@ -14,44 +12,79 @@ const getMultiLineChart = (data) => {
}
},
grid: {
top: 48,
right: 24,
bottom: 24,
left: 24,
width: '95%',
height: '83%',
top: '15%',
left: '1%',
containLabel: true
},
legend: {
show: true,
top: 10,
left: '10%'
icon: 'circle',
textStyle: {
color: 'rgba(95, 101, 108, 1)',
fontFamily: 'Microsoft YaHei',
fontSize: '14px',
}
},
color: ['#0A57A6', '#FA8C16', '#722ED1'],
xAxis: [
{
type: 'category',
boundaryGap: false,
data: data.title
data: data.title,
axisLine: {
show: true,
lineStyle: {
color: '#e7f3ff',
},
},
axisLabel: {
show: true,
textStyle: {
color: 'rgba(95, 101, 108, 1)',
fontFamily: 'Microsoft YaHei',
fontsize: 14,
}
}
}
],
yAxis: [
{
type: 'value',
position: 'left',
name: '数量',
nameLocation: 'end',
nameGap: 12,
nameTextStyle: {
color: '#666',
fontSize: 14,
fontWeight: 400,
padding: [0, 0, 6, -20]
},
axisLabel: {
formatter: '{value}',
color: '#666',
fontSize: 14,
fontWeight: 400
},
splitLine: {
show: true,
lineStyle: {
type: 'dashed', // 虚线类型
color: 'rgb(231, 243, 255)', // 灰色线条
width: 1 // 线宽为1
color: '#e7f3ff',
type: 'dashed',
}
}
},
}
],
series: [
{
name: data.data[0]?.name,
type: 'line',
smooth: true,
symbol: 'emptyCircle',
symbolSize: 6,
areaStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
......@@ -69,6 +102,9 @@ const getMultiLineChart = (data) => {
{
name: data.data[1]?.name,
type: 'line',
smooth: true,
symbol: 'emptyCircle',
symbolSize: 6,
areaStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
......@@ -86,6 +122,9 @@ const getMultiLineChart = (data) => {
{
name: data.data[2]?.name,
type: 'line',
smooth: true,
symbol: 'emptyCircle',
symbolSize: 6,
areaStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
......
......@@ -200,8 +200,8 @@ const handleFetchSurveyList = async () => {
publishYear: checkedYearList.value.join(',') || null,
Area: checkedAreaList.value.join(',') || null,
searchCountry: checkedCountryList.value.join(',') || null,
caseStatus: filterStage.value ? filterStage.value : null,
keywords: searchText.value ? searchText.value : null,
caseStatus: filterStage.value || null,
keywords: searchText.value || null,
sortField: "date",
sortOrder: isSort.value ? "asc" : "desc"
};
......
......@@ -3,11 +3,11 @@
<div class="page-top">
<div class="head-box">
<div class="head-icon">
<img :src="curSurvey.image" alt="" />
<img :src="codeInfo.sortImageUrl || Img337" alt="" />
</div>
<div class="head-info">
<div class="head-name one-line-ellipsis">{{ curSurvey.title }}</div>
<div class="head-text one-line-ellipsis">{{ curSurvey.desc }}</div>
<div class="head-name one-line-ellipsis">{{ codeInfo.sortName }}</div>
<div class="head-text one-line-ellipsis">{{ codeInfo.sortDescription }}</div>
</div>
<!-- <div class="head-button">
<div class="button-icon">
......@@ -35,7 +35,7 @@
</template>
<script setup>
import { ref, computed, onMounted } from "vue";
import { ref, onMounted, reactive } from "vue";
import router from "@/router/index";
import icon1 from "./assets/icons/icon1.svg";
import icon1Active from "./assets/icons/icon1_active.svg";
......@@ -44,6 +44,7 @@ import icon2Active from "./assets/icons/icon2_active.svg";
import Img337 from "./assets/images/337.png";
import Img232 from "./assets/images/232.png";
import Img301 from "./assets/images/301.png";
import { getSurvyInfo } from "@/api/marketAccessRestrictions/index.js"
import { useRoute } from "vue-router";
const route = useRoute();
......@@ -63,27 +64,23 @@ const tabList = ref([
}
]);
const curSurvey = computed(() => {
if (route.query.id === "301") {
return {
title: "301调查",
desc: '由美国贸易代表办公室依据《1974年贸易法》第301条针对"不合理或不公正贸易做法"发起的调查',
image: Img301,
};
} else if (route.query.id === "232") {
return {
const curSurvey = [
{
title: "301调查",
desc: '由美国贸易代表办公室依据《1974年贸易法》第301条针对"不合理或不公正贸易做法"发起的调查',
image: Img301,
},
{
title: "232调查",
desc: "依据《1962年贸易扩展法》第232条款,授权美国商务部对“特定进口产品是否威胁或损害美国国家安全”而开展的全面调查。",
image: Img232,
};
} else {
return {
title: "337调查",
desc: '美国国际贸易委员会根据《1930年关税法》第337节及相关修正案进行的调查,主要针对进口贸易中的知识产权侵权行为以及其他不公平竞争行为',
image: Img337,
};
},
{
title: "337调查",
desc: '美国国际贸易委员会根据《1930年关税法》第337节及相关修正案进行的调查,主要针对进口贸易中的知识产权侵权行为以及其他不公平竞争行为',
image: Img337,
}
});
]
const activeName = ref("调查案件");
const handleClickBtn = item => {
......@@ -94,7 +91,23 @@ const handleClickBtn = item => {
});
};
const codeInfo = reactive({
sortCode: route.query.id,
sortName: "调查主页",
sortImageUrl: "",
sortDescription: "",
})
const onSurvyInfo = async () => {
const res = await getSurvyInfo({sortCode: route.query.id})
console.log("调查分类信息", res)
if (res.code == 200) {
Object.assign(codeInfo, res.data)
}
document.title = codeInfo.sortName;
}
onMounted(() => {
onSurvyInfo()
if (route.path === "/marketAccessLayout/overview") {
activeName.value = "数据统计";
} else {
......@@ -141,6 +154,7 @@ onMounted(() => {
line-height: 26px;
}
.head-text {
margin-top: 4px;
width: 100%;
height: 24px;
color: rgba(95, 101, 108, 1);
......
......@@ -3,13 +3,13 @@
<div class="page-top">
<div class="head-box">
<div class="head-icon">
<img :src="curSurvey.image" alt="" />
<img :src="codeInfo.sortImageUrl || Img337" alt="" />
</div>
<div class="head-info">
<div class="head-name one-line-ellipsis">{{ curSurvey.title }}</div>
<div class="head-text">{{ curSurvey.time }}</div>
<div class="head-name one-line-ellipsis">{{ baseInfo.SEARCHNAME }}</div>
<div class="head-text">{{ baseInfo.SEARCHDATE }}</div>
</div>
<div :class="`item-tag tag-${curSurvey.name}`">{{ curSurvey.name }}调查</div>
<div :class="`item-tag tag-${codeInfo.sortCode}`">{{ codeInfo.sortName }}</div>
</div>
<div class="page-tabs">
<div :class="['tab-item', {'tab-active': activeName==item.name}]" v-for="(item, index) in tabList" :key="index" @click="handleClickBtn(item)">
......@@ -37,15 +37,14 @@
</template>
<script setup>
import { ref, onMounted, computed } from "vue";
import { ref, onMounted, reactive } from "vue";
import router from "@/router";
import NavIcon1 from "./assets/images/nav-icon1.png";
import NavIcon1Active from "./assets/images/nav-icon1-active.png";
import NavIcon3 from "./assets/images/nav-icon2.png";
import NavIcon3Active from "./assets/images/nav-icon2-active.png";
import Img337 from "./assets/images/337.png";
import Img232 from "./assets/images/232.png";
import Img301 from "./assets/images/301.png";
import { getSurvyInfo, getSearchBlurb } from "@/api/marketAccessRestrictions/index.js"
import { useRoute } from "vue-router";
const route = useRoute();
......@@ -64,39 +63,6 @@ const tabList = ref([
}
]);
const surveyList = ref([
{
title: "337-TA-1443:外国制造的半导体器件及其下游产品和组件",
time: "2025年7月18日",
image: Img337,
name: "337"
},
{
title: "231-TA-1225:进口药及进口原材料的调查",
time: "2021年9月21日",
image: Img232,
name: "232"
},
{
title: "美国贸易代表第301条关于中国针对海事、物流和造船业以争取主导地位的行动",
time: "2025年4月17日",
image: Img301,
name: "301"
}
]);
const curSurvey = computed(() => {
let survey;
if (route.query.id === "232") {
survey = surveyList.value[1];
} else if (route.query.id === "301") {
survey = surveyList.value[2];
} else {
survey = surveyList.value[0];
}
return survey;
});
const activeName = ref("调查案件");
const handleClickBtn = item => {
activeName.value = item.name;
......@@ -106,8 +72,36 @@ const handleClickBtn = item => {
});
};
const codeInfo = reactive({
sortCode: route.query.id,
sortName: "",
sortImageUrl: "",
})
const onSurvyInfo = async () => {
const res = await getSurvyInfo({sortCode: route.query.id})
console.log("调查分类信息", res)
if (res.code == 200) {
Object.assign(codeInfo, res.data)
}
}
const baseInfo = reactive({
SEARCHNAME: "调查详情",
SEARCHDATE: "",
})
const onSearchBlurb = async () => {
const res = await getSearchBlurb({sortCode: route.query.id, searchId: route.query.searchId})
console.log("调查简介", res)
if (res.code == 200) {
baseInfo.SEARCHNAME = res.data.SEARCHNAME
baseInfo.SEARCHDATE = res.data.SEARCHDATE
}
document.title = baseInfo.SEARCHNAME;
}
onMounted(() => {
console.log('route', route);
onSurvyInfo()
onSearchBlurb()
if (route.path === "/marketSingleCaseLayout/deepdig") {
activeName.value = "影响分析";
} else {
......@@ -154,6 +148,7 @@ onMounted(() => {
line-height: 26px;
}
.head-text {
margin-top: 4px;
width: 100%;
height: 24px;
color: rgba(95, 101, 108, 1);
......
......@@ -730,8 +730,6 @@ public class RemarksVO {
}
```
# 字典
## 领域类别(id:name)
......@@ -764,7 +762,7 @@ public class RemarksVO {
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult<List<SanctionTypeBean>>
输出结果:ApiResult
## 最新出口管制政策(4条)
......@@ -782,7 +780,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult<LatestExportControlInfo>
输出结果:ApiResult
## 发布(更新)频度
......@@ -802,7 +800,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult<List<AnnualCount>>
输出结果:ApiResult
## **制裁领域分析**(20251215)
......@@ -820,7 +818,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult<List<DomainCount>>
输出结果:ApiResult
## **历次制裁过程**
......@@ -838,7 +836,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult<Page<SanctionProcess>>
输出结果:ApiResult
## **制裁实体清单**列表(20251215)
......@@ -860,7 +858,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult<Page<SanctionListBean>>
输出结果:ApiResult
## **发布机构与重点人物**
......@@ -876,7 +874,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<OrgInfo>
输出结果:ApiResult
## **领域分布查询**
......@@ -890,7 +888,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<BaseCount>>
输出结果:ApiResult
## **类型分布查询**
......@@ -904,7 +902,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<BaseCount>>
输出结果:ApiResult
## **区域分布查询**
......@@ -918,7 +916,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<RegionCount>>
输出结果:ApiResult
## **制裁理由查询**
......@@ -932,7 +930,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<String>>
输出结果:ApiResult
## **深度挖掘-制裁信息变化统计**
......@@ -946,7 +944,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<SanCountInfo>
输出结果:ApiResult
## **年度实体数统计**
......@@ -962,7 +960,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<SanCountInfo>
输出结果:ApiResult
## **重点实体列表查询**
......@@ -976,7 +974,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<OrgInfo>>
输出结果:ApiResult
## **上市企业制裁强度**
......@@ -990,7 +988,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<BaseCount>>
输出结果:ApiResult
## **上市企业融资变化情况**
......@@ -1004,7 +1002,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<BaseCount>>
输出结果:ApiResult
## **上市企业市值变化情况**
......@@ -1018,7 +1016,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<BaseCount>>
输出结果:ApiResult
## **重点上市企业列表**
......@@ -1032,7 +1030,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<OrgInfo>>
输出结果:ApiResult
## **历次制裁涉及领域数查询**
......@@ -1046,7 +1044,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<BaseCount>>
输出结果:ApiResult
## **具体领域的制裁实体数统计**
......@@ -1060,7 +1058,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<AnnualCount>>
输出结果:ApiResult
## **具体实体类型的制裁实体数统计**
......@@ -1074,7 +1072,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<AnnualCount>>
输出结果:ApiResult
## **产业链结构查询**
......@@ -1088,7 +1086,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<Chain>>
输出结果:ApiResult
## **根据领域获取产业链信息**
......@@ -1102,7 +1100,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<Chain>>
输出结果:ApiResult
## **产业链鱼骨图信息查询**
......@@ -1116,7 +1114,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<FishboneResp>
输出结果:ApiResult
## **产业链中国企业实体信息查询**
......@@ -1130,7 +1128,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<AreasStreamResp>
输出结果:ApiResult
## **实体列表查询**
......@@ -1144,7 +1142,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<OrgInfo>>
输出结果:ApiResult
## **历年制裁领域统计**
......@@ -1158,7 +1156,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<AnnualDomainCount>>
输出结果:ApiResult
## **新增实体数量增长趋势**
......@@ -1172,7 +1170,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<AnnualCount>>
输出结果:ApiResult
## **获取机构的详情信息**
......@@ -1186,7 +1184,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<Organization>
输出结果:ApiResult
## **获取美国前序事件**
......@@ -1200,7 +1198,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<Page<EventInfo>>
输出结果:ApiResult
## **新增科研机构列表**
......@@ -1214,7 +1212,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<BaseCount>>
输出结果:ApiResult
## **各类别仪器对美依赖情况**
......@@ -1224,11 +1222,11 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
输入参数:
​ 参数:List<String> orgIds 机构公司ID列表
​ 参数:List orgIds 机构公司ID列表
​ 请求头:携带token
输出结果:ApiResult<List<BaseCount>>
输出结果:ApiResult
## **仪器对美依赖度升高风险分析**
......@@ -1242,7 +1240,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<BaseCount>>
输出结果:ApiResult
## **仪器进口国可替代性分析**
......@@ -1252,11 +1250,11 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
输入参数:
​ 参数:List<String> orgIds 机构公司ID列表
​ 参数:List orgIds 机构公司ID列表
​ 请求头:携带token
输出结果:ApiResult<List<BaseCount>>
输出结果:ApiResult
## **仪器国产化降低风险分析**
......@@ -1270,7 +1268,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<BaseCount>>
输出结果:ApiResult
## **制裁实体清单50%规则实体数**
......@@ -1284,7 +1282,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<RuleEntityCount>
输出结果:ApiResult
## **科研院所类实体历史制裁情况**
......@@ -1298,7 +1296,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<AnnualCount>>
输出结果:ApiResult
## **企业类实体历史制裁情况**
......@@ -1312,7 +1310,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<AnnualCount>>
输出结果:ApiResult
## **风险信号**
......@@ -1326,7 +1324,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<RiskSignalVO>>
输出结果:ApiResult
## **新闻资讯**
......@@ -1340,7 +1338,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<NewsVO>>
输出结果:ApiResult
## **社交媒体**
......@@ -1354,4 +1352,4 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiI
​ 请求头:携带token
输出结果:ApiResult<List<RemarksVO>>
\ No newline at end of file
输出结果:ApiResult
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论