提交 96a019fe authored 作者: 张烨's avatar 张烨

feat:市场准入限制-对接相关事件/调查公告等接口

上级 62a01ebb
差异被折叠。
...@@ -178,7 +178,7 @@ export function getSearchBlurb(params) { ...@@ -178,7 +178,7 @@ export function getSearchBlurb(params) {
}) })
} }
// 获取相关事件getRelatedEvents // 获取相关事件
export function getRelatedEvents(params) { export function getRelatedEvents(params) {
return request({ return request({
method: 'GET', method: 'GET',
...@@ -186,8 +186,16 @@ export function getRelatedEvents(params) { ...@@ -186,8 +186,16 @@ export function getRelatedEvents(params) {
params params
}) })
} }
// 获取相关行政举措
export function getSearchAOMeasures(params) {
return request({
method: 'GET',
url: `/api/marketsearchDetails/getSearchAOMeasures`,
params
})
}
// 获取事件脉络 getSearchContext // 获取事件脉络
export function getSearchContext(params) { export function getSearchContext(params) {
return request({ return request({
method: 'GET', method: 'GET',
......
<template> <template>
<AnalysisBox :title="props.title" :showAllBtn="false" height="auto"> <AnalysisBox :title="props.title" :showAllBtn="false" height="auto">
<div class="box-main"> <div class="box-main">
<el-empty v-if="!props.listData?.length" description="暂无数据" :image-size="200" />
<div v-for="(item, index) in props.listData" :key="index" class="box-item"> <div v-for="(item, index) in props.listData" :key="index" class="box-item">
<div class="item-tag">行政令</div> <div class="item-tag" :class="getClassName(item)">{{ item.TYPE }}</div>
<div class="item-right"> <div class="item-right" @click="onNavigateTo(item)">
<div class="item-head"> <div class="item-head">
<div class="item-name one-line-ellipsis">{{ item.name }}</div> <div class="item-name one-line-ellipsis text-click-hover">{{ item.NAME }}</div>
<div class="item-time">{{ item.time }}</div> <div class="item-time">{{ item.DATE }}</div>
</div> </div>
<div class="item-text one-line-ellipsis">{{ item.text }}</div> <div class="item-text one-line-ellipsis">{{ item.SUMMARY }}</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -16,6 +17,8 @@ ...@@ -16,6 +17,8 @@
</template> </template>
<script setup lang="ts" name="RelatedEvent"> <script setup lang="ts" name="RelatedEvent">
import router from "@/router";
import { useGotoNewsDetail } from '@/router/modules/news';
const props = defineProps({ const props = defineProps({
listData: { listData: {
...@@ -28,6 +31,43 @@ const props = defineProps({ ...@@ -28,6 +31,43 @@ const props = defineProps({
} }
}) })
const getClassName = (item: any) => {
switch (item.TYPE) {
case "行政令":
return "theme1"
case "新闻":
return "theme2"
case "法案":
return "theme3"
default:
return "theme1"
}
}
// 跳转相关事件
const gotoNewsDetail = useGotoNewsDetail()
const onNavigateTo = (item: any) => {
switch (item.TYPE) {
case "行政令":
let route1 = router.resolve({
path: "/decreeLayout",
query: { id: item.ID }
});
window.open(route1.href, "_blank");
break;
case "新闻":
gotoNewsDetail(item.ID)
break;
case "法案":
let route2 = router.resolve({
path: "/billLayout",
query: { billId: item.ID }
});
window.open(route2.href, "_blank");
break;
}
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
...@@ -47,10 +87,9 @@ const props = defineProps({ ...@@ -47,10 +87,9 @@ const props = defineProps({
text-align: center; text-align: center;
margin-right: 16px; margin-right: 16px;
margin-top: 7px; margin-top: 7px;
color: var(--color-yellow-100);
background-color: var(--color-yellow-10);
} }
.item-right { .item-right {
cursor: pointer;
width: 20px; width: 20px;
flex: auto; flex: auto;
line-height: 30px; line-height: 30px;
...@@ -77,4 +116,17 @@ const props = defineProps({ ...@@ -77,4 +116,17 @@ const props = defineProps({
border-bottom: 1px solid var(--bg-black-5); border-bottom: 1px solid var(--bg-black-5);
} }
} }
.theme1 {
background-color: var(--color-yellow-10);
color: var(--color-yellow-100);
}
.theme2 {
background-color: var(--color-green-10);
color: var(--color-green-100);
}
.theme3 {
background-color: var(--color-orange-10);
color: var(--color-orange-100);
}
</style> </style>
\ No newline at end of file
<template>
<AnalysisBox :title="props.title" :showAllBtn="false" height="auto">
<div class="box-main">
<el-empty v-if="!props.listData?.length" description="暂无数据" :image-size="100" />
<div v-for="(item, index) in props.listData" :key="index" class="box-item">
<div class="item-icon">
<img src="@/views/marketAccessRestrictions/singleCaseLayout/assets/images/icon_affiche.png" alt="">
</div>
<div class="item-right">
<div class="item-time">{{ item.time }}</div>
<div class="item-text">{{ item.content }}</div>
</div>
</div>
</div>
</AnalysisBox>
</template>
<script setup lang="ts" name="SurveyAffiche">
const props = defineProps({
listData: {
type: Array as any,
default: () => ([])
},
title: {
type: String,
default: ""
}
})
</script>
<style scoped lang="scss">
.box-main {
padding: 0 16px 16px;
.box-item {
border-top: 1px solid var(--bg-black-5);
padding: 6px;
display: flex;
.item-icon {
width: 15px;
height: 15px;
font-size: 0px;
margin-right: 16px;
margin-top: 7px;
img {
width: 100%;
height: 100%;
}
}
.item-right {
width: 20px;
flex: auto;
font-family: Source Han Sans CN;
font-size: 16px;
line-height: 30px;
.item-time {
font-weight: bold;
color: var(--text-primary-80-color);
}
.item-text {
color: var(--text-primary-65-color);
}
}
}
.box-item:last-child {
border-bottom: 1px solid var(--bg-black-5);
}
}
</style>
\ No newline at end of file
<template> <template>
<div class="view-box"> <div class="view-box">
<el-empty v-if="!props.surveyList?.length" description="当前条件下暂无数据" :image-size="200" /> <el-empty v-if="!props.surveyList?.length" description="暂无数据" :image-size="100" />
<div class="timeline-item" v-for="(item, index) in props.surveyList" :key="item.searchid" @click="onNavigateToDetail(item)"> <div class="timeline-item" v-for="(item, index) in props.surveyList" :key="item.searchid" @click="onNavigateToDetail(item)">
<div class="timeline-date"> <div class="timeline-date">
<div class="date-text">{{ item.searchdatezh.slice(0,4) }}</div> <div class="date-text">{{ item.searchdatezh.slice(0,4) }}</div>
......
...@@ -49,8 +49,8 @@ ...@@ -49,8 +49,8 @@
</div> </div>
<div class="left-main"> <div class="left-main">
<el-checkbox-group class="check-list" v-model="checkedYearList" @change="handleCheckedYearsChange"> <el-checkbox-group class="check-list" v-model="checkedYearList" @change="handleCheckedYearsChange">
<el-checkbox class="check-item" v-for="year in surveyYearList" :key="year.id" :label="year.id"> <el-checkbox class="check-item" v-for="item in surveyYearList" :key="item.id" :label="item.id">
{{ year.name }} {{ item.name }}
</el-checkbox> </el-checkbox>
</el-checkbox-group> </el-checkbox-group>
</div> </div>
......
...@@ -38,8 +38,8 @@ ...@@ -38,8 +38,8 @@
</div> </div>
<div class="left-main"> <div class="left-main">
<el-checkbox-group class="check-list" v-model="checkedYearList" @change="handleCheckedYearsChange"> <el-checkbox-group class="check-list" v-model="checkedYearList" @change="handleCheckedYearsChange">
<el-checkbox class="check-item" v-for="year in surveyYearList" :key="year.id" :label="year.id"> <el-checkbox class="check-item" v-for="item in surveyYearList" :key="item.id" :label="item.id">
{{ year.name }} {{ item.name }}
</el-checkbox> </el-checkbox>
</el-checkbox-group> </el-checkbox-group>
</div> </div>
......
...@@ -50,8 +50,8 @@ ...@@ -50,8 +50,8 @@
</div> </div>
<div class="left-main"> <div class="left-main">
<el-checkbox-group class="check-list" v-model="checkedYearList" @change="handleCheckedYearsChange"> <el-checkbox-group class="check-list" v-model="checkedYearList" @change="handleCheckedYearsChange">
<el-checkbox class="check-item" v-for="year in surveyYearList" :key="year.id" :label="year.id"> <el-checkbox class="check-item" v-for="item in surveyYearList" :key="item.id" :label="item.id">
{{ year.name }} {{ item.name }}
</el-checkbox> </el-checkbox>
</el-checkbox-group> </el-checkbox-group>
</div> </div>
...@@ -63,8 +63,8 @@ ...@@ -63,8 +63,8 @@
</div> </div>
<div class="left-main"> <div class="left-main">
<el-checkbox-group class="check-list" v-model="checkedCountryList" @change="handleCheckedCountriesChange"> <el-checkbox-group class="check-list" v-model="checkedCountryList" @change="handleCheckedCountriesChange">
<el-checkbox class="check-item" v-for="area in surveyCountryList" :key="area.id" :label="area.id"> <el-checkbox class="check-item" v-for="item in surveyCountryList" :key="item.id" :label="item.id">
{{ area.name }} {{ item.name }}
</el-checkbox> </el-checkbox>
</el-checkbox-group> </el-checkbox-group>
</div> </div>
......
...@@ -100,7 +100,12 @@ ...@@ -100,7 +100,12 @@
<script setup> <script setup>
import { ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import { getSearchBlurb, getSearchContext, getSearchConclusion } from "@/api/marketAccessRestrictions"; import {
getSearchBlurb,
getSearchContext,
getSearchConclusion,
getRelatedEvents,
} from "@/api/marketAccessRestrictions";
import RelatedEvent from "@/views/marketAccessRestrictions/com/RelatedEvent.vue"; import RelatedEvent from "@/views/marketAccessRestrictions/com/RelatedEvent.vue";
import SurveyConclusion from "@/views/marketAccessRestrictions/com/SurveyConclusion.vue"; import SurveyConclusion from "@/views/marketAccessRestrictions/com/SurveyConclusion.vue";
...@@ -181,26 +186,21 @@ const handleGetSearchConclusion = async () => { ...@@ -181,26 +186,21 @@ const handleGetSearchConclusion = async () => {
}; };
// 相关行政举措 // 相关行政举措
const eventList = ref([ const eventList = ref([])
{ const handleGetRelatedEvents = async () => {
name: "某些特定外国制造的半导体器件及其下游产品和组件;委员会最终裁定未违反第337条的通知;调查终止", try {
text: "特此通知,2025 年 2 月 18 日,根据 1930 年《关税法》第 337 条(经修订)已代表爱尔兰 Longitude Licensing Ltd.和爱尔", const res = await getRelatedEvents({
time: "2025年4月15日" searchId: route.query.searchId
}, });
{ if(res.code === 200) eventList.value = res.data || [];
name: "某些特定外国制造的半导体器件及其下游产品和组件;委员会最终裁定未违反第337条的通知;调查终止", } catch (error) {
text: "特此通知,2025 年 2 月 18 日,根据 1930 年《关税法》第 337 条(经修订)已代表爱尔兰 Longitude Licensing Ltd.和爱尔", console.error("获取相关行政举措失败", error);
time: "2025年4月15日" }
}, };
{
name: "某些特定外国制造的半导体器件及其下游产品和组件;委员会最终裁定未违反第337条的通知;调查终止",
text: "特此通知,2025 年 2 月 18 日,根据 1930 年《关税法》第 337 条(经修订)已代表爱尔兰 Longitude Licensing Ltd.和爱尔",
time: "2025年4月15日"
},
])
onMounted(() => { onMounted(() => {
handleGetSearchBlurb(); handleGetSearchBlurb();
handleGetRelatedEvents();
handleGetSearchContext(); handleGetSearchContext();
handleGetSearchConclusion(); handleGetSearchConclusion();
}); });
......
...@@ -30,37 +30,13 @@ ...@@ -30,37 +30,13 @@
<div class="box1-item"> <div class="box1-item">
<div class="box1-item-left">{{ "调查领域:" }}</div> <div class="box1-item-left">{{ "调查领域:" }}</div>
<div class="box1-item-right1"> <div class="box1-item-right1">
<div class="tag" v-for="(item, index) in baseInfo.areaData" :key="index">{{ item }}</div> <AreaTag v-for="(item, num) in baseInfo.areaData" :key="num" :tagName="item"></AreaTag>
<div v-if="!baseInfo.areaData || !baseInfo.areaData.length">-</div> <div v-if="!baseInfo.areaData?.length">-</div>
</div>
</div>
<div class="box1-item">
<div class="box1-item-left">{{ "案件进展:" }}</div>
<div class="box1-item-right2">
<div class="box1-item-right2-item" v-for="(item, index) in processList" :key="index">
<div class="icon">
<img src="./assets/images/icon1.png" alt="" />
</div>
<div class="time">{{ item.time }}</div>
<div class="title">{{ item.title }}</div>
</div>
</div> </div>
</div> </div>
</div> </div>
</AnalysisBox> </AnalysisBox>
<AnalysisBox title="调查公告" :showAllBtn="false" height="auto"> <SurveyAffiche title="调查公告" :listData="processList"></SurveyAffiche>
<div class="box4-main">
<div v-for="(item, index) in afficheList" :key="index" class="box4-item">
<div class="item-icon">
<img src="@/views/marketAccessRestrictions/singleCaseLayout/assets/images/icon_affiche.png" alt="">
</div>
<div class="item-right">
<div class="item-time">{{ item.time }}</div>
<div class="item-text">{{ item.text }}</div>
</div>
</div>
</div>
</AnalysisBox>
</div> </div>
<div class="right"> <div class="right">
<AnalysisBox title="原告信息" :showAllBtn="false" height="auto"> <AnalysisBox title="原告信息" :showAllBtn="false" height="auto">
...@@ -99,19 +75,20 @@ ...@@ -99,19 +75,20 @@
<script setup> <script setup>
import { ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import { getSearchBlurb } from "@/api/marketAccessRestrictions"; import { getSearchBlurb , getRelatedEvents} from "@/api/marketAccessRestrictions";
import AiTips from "@/views/marketAccessRestrictions/com/AiTips.vue"; import AiTips from "@/views/marketAccessRestrictions/com/AiTips.vue";
import RelatedEvent from "@/views/marketAccessRestrictions/com/RelatedEvent.vue"; import RelatedEvent from "@/views/marketAccessRestrictions/com/RelatedEvent.vue";
import SurveyAffiche from "@/views/marketAccessRestrictions/com/SurveyAffiche.vue";
const tips = `Pantech是韩国的一家通信设备公司,曾经是手机制造商,但现在可能已转型为专利持有实体。这类公司常被称为"非执业实体"(NPE)或"专利断言实体"(PAE),通过专利授权和诉讼获取收益。这些企业曾经是行业龙头,但因科技和市场形态巨变,加上自身改革步伐缓慢,经营状况每况愈下。卖掉实体业务部门后,留下来的是高达几万件的专利。` const tips = `Pantech是韩国的一家通信设备公司,曾经是手机制造商,但现在可能已转型为专利持有实体。这类公司常被称为"非执业实体"(NPE)或"专利断言实体"(PAE),通过专利授权和诉讼获取收益。这些企业曾经是行业龙头,但因科技和市场形态巨变,加上自身改革步伐缓慢,经营状况每况愈下。卖掉实体业务部门后,留下来的是高达几万件的专利。`
const route = useRoute(); const route = useRoute();
const loading = ref(false); const loading = ref(false);
const baseInfo = ref({}); const baseInfo = ref({});
const processList = ref([]);
const caseList = ref([]); const caseList = ref([]);
// 调查概况 // 调查概况
const processList = ref([]);
const handleGetSearchBlurb = async () => { const handleGetSearchBlurb = async () => {
loading.value = true; loading.value = true;
try { try {
...@@ -126,10 +103,7 @@ const handleGetSearchBlurb = async () => { ...@@ -126,10 +103,7 @@ const handleGetSearchBlurb = async () => {
// 案件进展 // 案件进展
if (data.progress) { if (data.progress) {
processList.value = data.progress.map(p => ({ processList.value = data.progress.map(p => ({ time: p.PROGRESSDATE, content: p.PROGRESSSTAGE }));
time: p.PROGRESSDATE,
title: p.PROGRESSSTAGE
}));
} }
// 被告信息分组 // 被告信息分组
...@@ -157,51 +131,22 @@ const handleGetSearchBlurb = async () => { ...@@ -157,51 +131,22 @@ const handleGetSearchBlurb = async () => {
loading.value = false; loading.value = false;
}; };
// 调查公告
const afficheList = ref([
{
time: "2025-03-30",
text: "美国ITC正式对外国制造的半导体器件及其下游产品和组件启动337调查"
},
{
time: "2025-03-30",
text: "美国ITC正式对外国制造的半导体器件及其下游产品和组件启动337调查"
},
{
time: "2025-03-30",
text: "美国ITC正式对外国制造的半导体器件及其下游产品和组件启动337调查"
},
{
time: "2025-03-30",
text: "美国ITC正式对外国制造的半导体器件及其下游产品和组件启动337调查"
},
{
time: "2025-03-30",
text: "美国ITC正式对外国制造的半导体器件及其下游产品和组件启动337调查"
},
]);
// 相关事件 // 相关事件
const eventList = ref([ const eventList = ref([])
{ const handleGetRelatedEvents = async () => {
name: "某些特定外国制造的半导体器件及其下游产品和组件;委员会最终裁定未违反第337条的通知;调查终止", try {
text: "特此通知,2025 年 2 月 18 日,根据 1930 年《关税法》第 337 条(经修订)已代表爱尔兰 Longitude Licensing Ltd.和爱尔", const res = await getRelatedEvents({
time: "2025年4月15日" searchId: route.query.searchId
}, });
{ if(res.code === 200) eventList.value = res.data || [];
name: "某些特定外国制造的半导体器件及其下游产品和组件;委员会最终裁定未违反第337条的通知;调查终止", } catch (error) {
text: "特此通知,2025 年 2 月 18 日,根据 1930 年《关税法》第 337 条(经修订)已代表爱尔兰 Longitude Licensing Ltd.和爱尔", console.error("获取相关事件失败", error);
time: "2025年4月15日" }
}, };
{
name: "某些特定外国制造的半导体器件及其下游产品和组件;委员会最终裁定未违反第337条的通知;调查终止",
text: "特此通知,2025 年 2 月 18 日,根据 1930 年《关税法》第 337 条(经修订)已代表爱尔兰 Longitude Licensing Ltd.和爱尔",
time: "2025年4月15日"
},
])
onMounted(() => { onMounted(() => {
handleGetSearchBlurb(); handleGetSearchBlurb();
handleGetRelatedEvents()
}); });
</script> </script>
...@@ -346,59 +291,6 @@ onMounted(() => { ...@@ -346,59 +291,6 @@ onMounted(() => {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
gap: 8px; gap: 8px;
.tag {
margin-top: 3px;
margin-bottom: 3px;
height: 24px;
box-sizing: border-box;
border: 1px solid rgba(135, 232, 222, 1);
border-radius: 4px;
background: rgba(230, 255, 251, 1);
line-height: 24px;
text-align: center;
padding: 0 8px;
color: rgba(19, 168, 168, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
}
}
.box1-item-right2 {
.box1-item-right2-item {
width: 332px;
height: 36px;
display: flex;
.icon {
width: 10px;
height: 10px;
margin-left: 17px;
margin-top: 10px;
img {
width: 100%;
height: 100%;
}
}
.time {
height: 24px;
margin-left: 16px;
margin-top: 6px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 700;
line-height: 24px;
}
.title {
height: 24px;
margin-left: 16px;
margin-top: 6px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
}
}
} }
} }
} }
...@@ -513,41 +405,4 @@ onMounted(() => { ...@@ -513,41 +405,4 @@ onMounted(() => {
} }
} }
} }
.box4-main {
padding: 0 16px 16px;
.box4-item {
border-top: 1px solid var(--bg-black-5);
padding: 6px;
display: flex;
.item-icon {
width: 15px;
height: 15px;
font-size: 0px;
margin-right: 16px;
margin-top: 7px;
img {
width: 100%;
height: 100%;
}
}
.item-right {
width: 20px;
flex: auto;
font-family: Source Han Sans CN;
font-size: 16px;
line-height: 30px;
.item-time {
font-weight: bold;
color: var(--text-primary-80-color);
}
.item-text {
color: var(--text-primary-65-color);
}
}
}
.box4-item:last-child {
border-bottom: 1px solid var(--bg-black-5);
}
}
</style> </style>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论