提交 68717834 authored 作者: coderBryanFu's avatar coderBryanFu

feat更新出口管制跳转资源库,更新数据资源库

流水线 #388 已通过 于阶段
in 1 分 28 秒
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://172.19.21.9:8003/out/img` // 写报图片URL
\ No newline at end of file
......@@ -123,7 +123,7 @@ export function getSanctionsInfoCount() {
* sanReason: string
* }[]>}
*/
export function getSanctionProcess(sanTypeIds = "1", pageNum = 1, pageSize = 10, isCn = false) {
export function getSanctionProcess(sanTypeIds = ["1"], pageNum = 1, pageSize = 10, isCn = false) {
return request200(
request({
method: "POST",
......
......@@ -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;
}
}
......
......@@ -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,7 @@ 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);
}
};
......@@ -571,7 +570,6 @@ export const useWrittingAsstaintStore = defineStore('writtingAsstaint', {
streamBuffer += str;
updateFlushIndexByBoundary();
flushToReport(false);
console.log(streamBuffer,456)
console.log(msgData,'data')
} else {
// 结束时把剩余内容强制 flush
......@@ -663,7 +661,6 @@ export const useWrittingAsstaintStore = defineStore('writtingAsstaint', {
};
await this.fetchReportData(params);
} else {
console.log(10101010101010)
// 政令模板需要先解析PDF
if (this.curTempTitle === '政令') {
if (this.uploadFileList.length === 0) {
......
......@@ -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
......@@ -545,37 +545,17 @@
</div>
</el-col>
</template>
<template v-if="activeResourceTab === 'commerce'">
<listPage />
</template>
</el-row>
</div>
<!-- <el-dialog v-model="dialogVisible" width="800" :before-close="handleClose">
<template #title>
<div class="dialog-title">50%规则子企业</div>
</template>
<div class="dialog-ett-wrpper">
<div
class="box1-bottom-content-item"
v-for="(ett, index) in currentOrgList"
: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.enName)?.match(/[\u4e00-\u9fa5a-zA-Z0-9]/)?.[0] }}
</div>
<div class="box1-bottom-content-item-txt">
{{ ett.orgName || ett.orgNameZh }}
</div>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="dialogVisible = false"> 确定 </el-button>
</div>
</template>
</el-dialog> -->
<RuleSubsidiaryDialog v-model="dialogVisible" :company-name="currentRuleCompany" :total-count="currentRuleCount"
:data-list="currentOrgList" />
<RuleSubsidiaryDialog
v-model="dialogVisible"
:company-name="currentRuleCompany"
:total-count="currentRuleCount"
:data-list="currentOrgList"
/>
</div>
<el-dialog v-model="mediaVisible" title="社交媒体信息" width="500" :before-close="handleMediaClose">
<div class="dialog-content">
......@@ -601,6 +581,7 @@ const { isShow } = useContainerScroll(homeMainRef);
import * as echarts from "echarts";
import setChart from "@/utils/setChart";
import { ElMessage, ElMessageBox } from "element-plus";
import listPage from "./v2.0CommercialControlList/components/sanctionsOverview/components/listPage/index.vue";
import { DArrowRight, Warning, Search } from "@element-plus/icons-vue";
import EChart from "@/components/Chart/index.vue";
......@@ -855,11 +836,11 @@ onMounted(async () => {
resourceTabs.value = infoList.value.map(item => ({
label: item.nameZh,
value: tabMap[item.id],
id: [item.id],
id: item.id,
disabled: false
}));
resourceTabs.value.unshift({ label: "全部制裁", value: "all", id: "", disabled: false });
console.log("返回的数据结构 infoList =》", infoList.value);
console.log("返回的数据结构 infoList =》", resourceTabs.value);
const entityList = _.map(entitiesDataInfo?.sanEntities ?? [], ({ entityNameZh, entityName }) => {
return { name: entityNameZh, enName: entityName };
});
......@@ -1394,7 +1375,8 @@ watch(
const fetchEntitiesList = async (page = 1, size = 10) => {
try {
console.log("activeResourceTabItem.value.id", activeResourceTabItem.value.id);
const res = await getEntitiesList(activeResourceTabItem.value.id.join(","), page, size);
if (!activeResourceTabItem.value.id) return;
const res = await getEntitiesList(activeResourceTabItem.value.id, page, size);
if (res) {
entitiesList.value = res.content.map(item => ({
...item,
......@@ -1414,7 +1396,7 @@ const fetchEntitiesList = async (page = 1, size = 10) => {
const handleGetMore = async () => {
sanctionPage.value++;
try {
const sanTypeid = activeResourceTabItem.value.id ? activeResourceTabItem.value.id : allSanTypeIds.value;
const sanTypeid = activeResourceTabItem.value.id ? [activeResourceTabItem.value.id] : allSanTypeIds.value;
const res = await getSanctionProcess(sanTypeid, sanctionPage.value, 10);
if (res && res.content) {
// 将新数据合并到现有列表中
......@@ -1441,7 +1423,7 @@ const handleGetMore = async () => {
const fetchSanctionProcess = async (page = 1, size = 10) => {
try {
const res = await getSanctionProcess(
activeResourceTabItem.value.id ? activeResourceTabItem.value.id : allSanTypeIds.value,
activeResourceTabItem.value.id ? [activeResourceTabItem.value.id] : allSanTypeIds.value,
page,
size
);
......@@ -1486,12 +1468,13 @@ const tabMap = {
};
const handleResourceTabClick = tab => {
if (tab.disabled) return;
// if (tab.disabled) return;
console.log("选项点击", tab);
activeResourceTab.value = tab.value;
activeResourceTabItem.value = tab;
fetchSanctionProcess();
console.log("tabMap[tab.id]", tabMap[tab.id]);
if (tabMap[tab.id] === "entity") {
if (tab.value === "entity") {
fetchEntitiesList();
}
};
......@@ -1658,7 +1641,7 @@ const handleSanc = item => {
path: "/exportControl/singleSanction",
query: {
id: item.id,
sanTypeId: activeResourceTabItem.value.id.join(",")
sanTypeId: activeResourceTabItem.value.id
}
});
window.open(route.href, "_blank");
......@@ -1811,6 +1794,10 @@ const handleMediaClick = item => {
// box-shadow: none;
}
.list-page {
padding-top: 0;
}
.home-header {
height: 64px;
background: url("@/assets/images/nav-bg.png");
......
......@@ -43,7 +43,7 @@
/>
</div>
</div>
<div class="right">
<div class="right" v-loading="loading">
<AnalysisBox title="CCL清单列表" :showAllBtn="false">
<div class="right-table">
<div class="list" v-for="(item, i) in cclList" :key="i">
......@@ -212,7 +212,7 @@ const getCclList = async () => {
if (!allReason || !allReason.checked) {
controls = controlReason.value.filter(item => item.checked && item.id !== "all").map(item => item.id);
}
loading.value = true;
const params = {
categoryCode: currentCCLType.value,
techDomainIds: techDomains,
......@@ -252,8 +252,10 @@ const getCclList = async () => {
});
console.log("----getCclList 11", cclList.value);
loading.value = false;
}
} catch (error) {
loading.value = false;
console.error("获取 ccl 清单列表失败:", error);
}
};
......@@ -342,35 +344,9 @@ watch(searchKeyword, newValue => {
console.log("-----searchKey", newValue);
getCclList();
});
const loading = ref(false);
// 模拟清单列表
const cclList = ref([
{
name: "类别 0-核材料、设施和设备、枪支、弹药[以及其他物品]",
desc: 'A."最终产品"、"设备"、"附件"、"附加装置"、"零件"、"组件"和"系统"',
isExpand: true,
list: [
{
code: "0A002",
name: '发电或推进设备,"专门设计"用于与太空、海洋或移动"核反应堆"一起使用。(这些项目"受 ITAR 管辖。"参见 22 CFR 第 120 至 130 部分。)',
isExpand: false,
isDot: false
},
{
code: "0A501",
name: "枪支(不包括 0A502 霰弹枪、0A506 半自动步枪、0A507 半自动手枪和 0A508 半自动霰弹枪)及相关商品(不包括在 Eccn 0A509 中列举或以其他方式描述的与半自动相关的商品,用于 Eccn 0A506、0A507 或 0A508)如下(参见受控物品清单)",
isExpand: true,
isDot: true
},
{
code: "0A501",
name: "枪支(不包括 0A502 霰弹枪、0A506 半自动步枪、0A507 半自动手枪和 0A508 半自动霰弹枪)及相关商品(不包括在 Eccn 0A509 中列举或以其他方式描述的与半自动相关的商品,用于 Eccn 0A506、0A507 或 0A508)如下(参见受控物品清单)",
isExpand: false,
isDot: true
}
]
}
]);
const cclList = ref([]);
onMounted(async () => {
// 获取类别字段
......@@ -410,9 +386,9 @@ onMounted(async () => {
:deep(.el-input__wrapper) {
padding: 0 11px;
// border: 1px solid rgba(0, 0, 0, 0.2);
border: 1.5px solid #dcdfe6;
background-color: #fff;
border-radius: 3px;
border-radius: 4px;
}
:deep(.el-input__inner) {
......
......@@ -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
......@@ -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);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论