提交 6e82db52 authored 作者: 张伊明's avatar 张伊明

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

stages:
- build
- deploy
# cache:
# key: "$CI_COMMIT_REF_SLUG"
# paths:
# - .npm/
build_pre:
stage: build
image: node:20-bullseye
tags:
- risk-monitor-frontend
only:
- pre
script:
- node -v
- npm -v
- npm config set cache .npm --global
- npm ci --prefer-offline --no-audit --no-fund
- npm run build
artifacts:
paths:
- dist/
expire_in: 1 hour
deploy_pre:
stage: deploy
image: alpine:3.20
tags:
- risk-monitor-frontend
only:
- pre
dependencies:
- build_pre
script:
- apk add --no-cache rsync
- rsync -av --delete dist/ /nas/kjb_service/zm/pre-project/html/
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -5,6 +5,8 @@ import request from "@/api/request.js"; ...@@ -5,6 +5,8 @@ import request from "@/api/request.js";
* @param {Object} params * @param {Object} params
* @param {string} [params.id] - 行业领域id(全部领域不传) * @param {string} [params.id] - 行业领域id(全部领域不传)
* @param {string} [params.companyName] - 公司名称(搜索框为空不传) * @param {string} [params.companyName] - 公司名称(搜索框为空不传)
* @returns {Array<{id: string, name: string, marketChange: number|null, chainCompanyId: string|number}>}
* 说明:右侧详情查询当前建议优先使用 chainCompanyId;若缺失可回退 id,兼容后续接口调整
*/ */
export function getCompanyList(params) { export function getCompanyList(params) {
return request({ return request({
......
...@@ -662,10 +662,10 @@ const handleGetBillsPerson = async () => { ...@@ -662,10 +662,10 @@ const handleGetBillsPerson = async () => {
sortFun: !memberSortFun.value sortFun: !memberSortFun.value
}; };
if (footerSelect1.value !== "全部委员会") params.committeeId = footerSelect1.value; if (footerSelect1.value !== "全部委员会") params.committeeIds = footerSelect1.value;
if (!activeYyList.value.includes("全部议院")) params.congressIds = activeYyList.value; if (!activeYyList.value.includes("全部议院")) params.congressIds = activeYyList.value.join(",");
if (!activeDpList.value.includes("全部党派")) params.partyIds = activeDpList.value; if (!activeDpList.value.includes("全部党派")) params.partyIds = activeDpList.value.join(",");
if (!activeAreaList.value.includes("全部领域")) params.domainIds = activeAreaList.value; if (!activeAreaList.value.includes("全部领域")) params.domainIds = activeAreaList.value.join(",");
const formatDateYm = dateStr => { const formatDateYm = dateStr => {
if (!dateStr) return ""; if (!dateStr) return "";
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
<div class="committee-cards-filter"> <div class="committee-cards-filter">
<span class="committee-cards-desc">近期美国国会各委员会涉华提案数量汇总</span> <span class="committee-cards-desc">近期美国国会各委员会涉华提案数量汇总</span>
<el-radio-group v-model="committeeTimeRange" class="committee-time-switch" size="default"> <el-radio-group v-model="committeeTimeRange" class="committee-time-switch" size="default">
<el-radio-button v-for="item in committeeTimeOptions" :key="item.value" :label="item.value"> <el-radio-button v-for="item in committeeTimeOptions" :key="item.value" :value="item.value">
<span class="committee-time-switch-inner"> <span class="committee-time-switch-inner">
<el-icon v-if="committeeTimeRange === item.value" class="committee-time-switch-icon"> <el-icon v-if="committeeTimeRange === item.value" class="committee-time-switch-icon">
<Calendar /> <Calendar />
...@@ -146,7 +146,7 @@ ...@@ -146,7 +146,7 @@
<div v-else id="box5Chart" class="overview-chart"></div> <div v-else id="box5Chart" class="overview-chart"></div>
</div> </div>
<div class="overview-tip-row"> <div class="overview-tip-row">
<TipTab class="overview-tip" :text="'图表说明:xxxxx,数据来源:美国国会官网'" /> <TipTab class="overview-tip" :text="'涉华科技法案数量及通过率变化趋势,数据来源:美国国会官网'" />
<AiButton class="overview-tip-action" @mouseenter="handleShowAiPane('box5')" /> <AiButton class="overview-tip-action" @mouseenter="handleShowAiPane('box5')" />
</div> </div>
<div v-if="aiPaneVisible.box5" class="overview-ai-pane" @mouseleave="handleHideAiPane('box5')"> <div v-if="aiPaneVisible.box5" class="overview-ai-pane" @mouseleave="handleHideAiPane('box5')">
...@@ -171,7 +171,7 @@ ...@@ -171,7 +171,7 @@
<div v-else id="box9Chart" class="overview-chart"></div> <div v-else id="box9Chart" class="overview-chart"></div>
</div> </div>
<div class="overview-tip-row"> <div class="overview-tip-row">
<TipTab class="overview-tip" :text="'图表说明:xxxxx,数据来源:美国国会官网'" /> <TipTab class="overview-tip" :text="'涉华科技法案领域分布情况,数据来源:美国国会官网'" />
<AiButton class="overview-tip-action" @mouseenter="handleShowAiPane('box6')" /> <AiButton class="overview-tip-action" @mouseenter="handleShowAiPane('box6')" />
</div> </div>
<div v-if="aiPaneVisible.box6" class="overview-ai-pane" @mouseleave="handleHideAiPane('box6')"> <div v-if="aiPaneVisible.box6" class="overview-ai-pane" @mouseleave="handleHideAiPane('box6')">
...@@ -193,7 +193,7 @@ ...@@ -193,7 +193,7 @@
<div v-else id="box7Chart" class="overview-chart"></div> <div v-else id="box7Chart" class="overview-chart"></div>
</div> </div>
<div class="overview-tip-row"> <div class="overview-tip-row">
<TipTab class="overview-tip" :text="'图表说明:xxxxx,数据来源:美国国会官网'" /> <TipTab class="overview-tip" :text="'提出涉华科技法案委员会分布情况,数据来源:美国国会官网'" />
<AiButton class="overview-tip-action" @mouseenter="handleShowAiPane('box7')" /> <AiButton class="overview-tip-action" @mouseenter="handleShowAiPane('box7')" />
</div> </div>
<div v-if="aiPaneVisible.box7" class="overview-ai-pane" @mouseleave="handleHideAiPane('box7')"> <div v-if="aiPaneVisible.box7" class="overview-ai-pane" @mouseleave="handleHideAiPane('box7')">
...@@ -216,7 +216,7 @@ ...@@ -216,7 +216,7 @@
</template> </template>
</div> </div>
<div class="overview-tip-row"> <div class="overview-tip-row">
<TipTab class="overview-tip" :text="'图表说明:xxxxx,数据来源:美国国会官网'" /> <TipTab class="overview-tip" :text="'涉华科技法案立法进展分布情况,数据来源:美国国会官网'" />
<AiButton class="overview-tip-action" @mouseenter="handleShowAiPane('box8')" /> <AiButton class="overview-tip-action" @mouseenter="handleShowAiPane('box8')" />
</div> </div>
<div v-if="aiPaneVisible.box8" class="overview-ai-pane" @mouseleave="handleHideAiPane('box8')"> <div v-if="aiPaneVisible.box8" class="overview-ai-pane" @mouseleave="handleHideAiPane('box8')">
...@@ -231,7 +231,7 @@ ...@@ -231,7 +231,7 @@
<WordCloundChart v-else class="overview-chart" width="100%" height="100%" :data="wordCloudData" /> <WordCloundChart v-else class="overview-chart" width="100%" height="100%" :data="wordCloudData" />
</div> </div>
<div class="overview-tip-row"> <div class="overview-tip-row">
<TipTab class="overview-tip" :text="'图表说明:xxxxx,数据来源:美国国会官网'" /> <TipTab class="overview-tip" :text="'涉华科技法案关键条款词云,数据来源:美国国会官网'" />
<AiButton class="overview-tip-action" @mouseenter="handleShowAiPane('box9')" /> <AiButton class="overview-tip-action" @mouseenter="handleShowAiPane('box9')" />
</div> </div>
<div v-if="aiPaneVisible.box9" class="overview-ai-pane" @mouseleave="handleHideAiPane('box9')"> <div v-if="aiPaneVisible.box9" class="overview-ai-pane" @mouseleave="handleHideAiPane('box9')">
...@@ -271,7 +271,7 @@ import { ...@@ -271,7 +271,7 @@ import {
import { getPersonSummaryInfo } from "@/api/common/index"; import { getPersonSummaryInfo } from "@/api/common/index";
import { getChartAnalysis } from "@/api/aiAnalysis/index"; import { getChartAnalysis } from "@/api/aiAnalysis/index";
import DivideHeader from "@/components/DivideHeader.vue"; import DivideHeader from "@/components/DivideHeader.vue";
import overviewMainBox from "@/components/base/BoxBackground/OverviewMainBox.vue"; import overviewMainBox from "@/components/base/boxBackground/overviewMainBox.vue";
import OverviewCard from "./OverviewCard.vue"; import OverviewCard from "./OverviewCard.vue";
import ResourceLibrarySection from "./ResourceLibrarySection.vue"; import ResourceLibrarySection from "./ResourceLibrarySection.vue";
import { useContainerScroll } from "@/hooks/useScrollShow"; import { useContainerScroll } from "@/hooks/useScrollShow";
...@@ -904,12 +904,16 @@ const handleGetKeyTK = async () => { ...@@ -904,12 +904,16 @@ const handleGetKeyTK = async () => {
const res = await getBillOverviewKeyTK(); const res = await getBillOverviewKeyTK();
console.log("关键条款", res); console.log("关键条款", res);
if (res.code === 200 && res.data) { if (res.code === 200 && res.data) {
wordCloudData.value = res.data.map(item => { wordCloudData.value = res.data
.slice()
.sort((a, b) => (b.count ?? 0) - (a.count ?? 0))
.slice(0, 20)
.map(item => {
return { return {
name: item.clause, name: item.clause,
value: item.count value: item.count
}; };
}); });
} }
} catch (error) { } catch (error) {
console.error("获取关键条款error", error); console.error("获取关键条款error", error);
......
...@@ -72,12 +72,12 @@ const mainHeaderBtnList = ref([ ...@@ -72,12 +72,12 @@ const mainHeaderBtnList = ref([
name: "影响分析", name: "影响分析",
path: "/billLayout/influence" path: "/billLayout/influence"
}, },
{ // {
icon: icon4, // icon: icon4,
activeIcon: icon4Active, // activeIcon: icon4Active,
name: "相关情况", // name: "相关情况",
path: "/billLayout/relevantCircumstance" // path: "/billLayout/relevantCircumstance"
} // }
]); ]);
const activeTitle = ref("法案概况"); const activeTitle = ref("法案概况");
......
...@@ -16,6 +16,9 @@ import { onMounted, ref, computed, watch } from "vue"; ...@@ -16,6 +16,9 @@ import { onMounted, ref, computed, watch } from "vue";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import router from '@/router' import router from '@/router'
import SiderTabs from "@/components/base/SiderTabs/index.vue"; import SiderTabs from "@/components/base/SiderTabs/index.vue";
//分支pre自动部署测试:
//第一次测试
//第二次测试
const route = useRoute(); const route = useRoute();
......
...@@ -72,12 +72,9 @@ const emit = defineEmits<{ ...@@ -72,12 +72,9 @@ const emit = defineEmits<{
const predictionData = ref<PredictionAnalysis | null>(null) const predictionData = ref<PredictionAnalysis | null>(null)
// 获取预测分析数据 // 获取预测分析数据
onMounted(async () => { onMounted(async () => {
console.log('[v0] Step3 mounted, fetching data...') const data = await fetchPredictionAnalysis()
const data = await fetchPredictionAnalysis() predictionData.value = data
console.log('[v0] Data fetched:', data)
predictionData.value = data
console.log('[v0] predictionData set:', predictionData.value)
}) })
// 根据索引和progressLevel返回进度条格子的类名 // 根据索引和progressLevel返回进度条格子的类名
......
...@@ -78,7 +78,7 @@ onMounted(async () => { ...@@ -78,7 +78,7 @@ onMounted(async () => {
const [stepsData, predictionData] = await Promise.all([ const [stepsData, predictionData] = await Promise.all([
fetchSteps(), fetchSteps(),
getProgressPrediction(billId.value).catch(err => { getProgressPrediction(billId.value).catch(err => {
console.error('[v0] 获取预测数据失败:', err) console.error(' 获取预测数据失败:', err)
return null return null
}) })
]) ])
......
...@@ -160,7 +160,8 @@ const curCompanyId = ref(""); ...@@ -160,7 +160,8 @@ const curCompanyId = ref("");
const handleClickCompany = (val, index) => { const handleClickCompany = (val, index) => {
companyActiveIndex.value = (currentPage.value - 1) * pageSize.value + index; companyActiveIndex.value = (currentPage.value - 1) * pageSize.value + index;
if (val) { if (val) {
curCompanyId.value = val.id; // 右侧鱼骨图查询:当前优先使用 chainCompanyId,后续可平滑切换到 id
curCompanyId.value = val.chainCompanyId || val.id;
// handleGetCompanyDetail(); // handleGetCompanyDetail();
companyInfo.value.name = val.name; companyInfo.value.name = val.name;
companyInfo.value.status = val.status || companyInfo.value.status; companyInfo.value.status = val.status || companyInfo.value.status;
...@@ -308,10 +309,10 @@ const headerChartData = (row) => { ...@@ -308,10 +309,10 @@ const headerChartData = (row) => {
switch (contentType.value) { switch (contentType.value) {
case 1: case 1:
onDecreeRelatedChain(row.id) onDecreeRelatedChain(row.chainCompanyId)
break; break;
case 2: case 2:
onDecreeRelatedEntitie(row.id) onDecreeRelatedEntitie(row.chainCompanyId)
break; break;
} }
}; };
......
...@@ -106,7 +106,7 @@ ...@@ -106,7 +106,7 @@
<div class="image-change"> <div class="image-change">
<img src="../assets/images/plus.png" alt="" v-if="!selectedIds.has(item.id)" <img src="../assets/images/plus.png" alt="" v-if="!selectedIds.has(item.id)"
@click="toggleSelected(item.id, item)" /> @click="toggleSelected(item.id, item)" />
<img src="../assets/images/Minus.png" alt="" v-else @click="toggleSelected(item.id, item)" /> <img src="../assets/images/minus.png" alt="" v-else @click="toggleSelected(item.id, item)" />
</div> </div>
</div> </div>
</div> </div>
...@@ -146,7 +146,7 @@ ...@@ -146,7 +146,7 @@
<div class="image-change"> <div class="image-change">
<img src="../assets/images/plus.png" alt="" v-if="!selectedIds.has(item.id)" <img src="../assets/images/plus.png" alt="" v-if="!selectedIds.has(item.id)"
@click="toggleSelected(item.id, item)" /> @click="toggleSelected(item.id, item)" />
<img src="../assets/images/Minus.png" alt="" v-else @click="toggleSelected(item.id, item)" /> <img src="../assets/images/minus.png" alt="" v-else @click="toggleSelected(item.id, item)" />
</div> </div>
</div> </div>
</div> </div>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论