hbsmUniapp/src/pagesCompany/pages/companyPortrait/index.vue
2025-08-28 15:16:48 +08:00

391 lines
10 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="portrait-page" :style="backgroundStyle">
<view :style="topGradientStyle"></view>
<view class="portrait-page-contain">
<!-- 搜索 -->
<wd-search v-model="searchValue" :placeholder-left="placeholderLeft" cancel-txt="搜索" placeholder="请输入企业名称" />
<!--企业卡片 -->
<view class="portrait-card">
<view class="portrait-card-title">
<view class="portrait-card-title-circle"></view>
{{company.company_name}}
</view>
<view class="portrait-card-info">
<view class="portrait-card-info-item">
<view class="portrait-card-info-item-label">联系人:</view>
<view class="portrait-card-info-item-value">{{company.company_contact}}</view>
</view>
<view class="portrait-card-info-item">
<view class="portrait-card-info-item-label">联系电话:</view>
<view class="portrait-card-info-item-value">{{company.company_mobile}}</view>
</view>
<view class="portrait-card-info-item">
<view class="portrait-card-info-item-label">邮箱:</view>
<view class="portrait-card-info-item-value">{{company.company_email}}</view>
</view>
<view class="portrait-card-info-item">
<view class="portrait-card-info-item-label">地址:</view>
<view class="portrait-card-info-item-value">{{company.company_address}}</view>
</view>
</view>
</view>
<!-- tab -->
<wd-tabs v-model="tabChange" @change="tabIndex">
<block v-for="(item,index) in tabList" :key="item">
<wd-tab :title="item">
<!-- 贸易数据 -->
<view class="content-trade" v-if="item=='贸易数据'">
<MarketTitle title='市场趋势分析'>
<view class="content-right">
<text>2025年</text>
<image :src="imgsUrl.lower_img"></image>
</view>
</MarketTitle>
<view class="content-trade-stat">
<view v-for="(item,index) in tradeData.market_analysis_board" :key="index"
@click="handleStatClick(index)" class="content-trade-stat-item"
:class="{ 'content-trade-stat-item-active': activeIndex === index }">
<text class="content-trade-stat-value">{{item.value}}</text>
<text class="content-trade-stat-label">{{item.name}}</text>
</view>
</view>
<!-- 图表 -->
<qiun-data-charts type="column" :opts="tradeOpts" :chartData="tradeCharts" class="trade-charts" />
<MarketTitle title='近三个月'></MarketTitle>
<wd-table :data="tradeDataList" :stripe="true" rowHeight="10" class="table">
<wd-table-col v-for="(column, index) in tableColumns" :key="index" :prop="column.prop"
:label="column.label" :width="index==0?100:80" align="center" ellipsis="true"></wd-table-col>
</wd-table>
</view>
<!-- 出口数据 -->
<view class="content-trade" v-if="item=='出口数据'">
<MarketTitle title='出口数据分析'>
<view class="content-right">
<wd-search v-model="exportSeach" :placeholder-left="placeholderLeft" cancel-txt=" "
placeholder="请搜索" />
</view>
</MarketTitle>
<block v-for="(item,index) in exportData" :key="index">
<DataCard :data="item"></DataCard>
</block>
</view>
</wd-tab>
</block>
</wd-tabs>
</view>
</view>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { useHomePage } from '@/composables/useHomePage'
import { postCompanyDataThirdDataViewApi, postDataViewExportApi } from '@/api/portrait'
import { onLoad } from '@dcloudio/uni-app'
import MarketTitle from './components/market-title.vue'
import DataCard from './components/data-card.vue'
const {
backgroundStyle,
topGradientStyle
} = useHomePage()
// 图片数据
const imgsUrl = ref({})
// 搜索值
const searchValue = ref('')
// tab选中
const tabChange = ref()
// tabl列表
const tabList = ref(["贸易数据", "出口数据", "贸易伙伴", "HS编码", "出口产品"])
// 请求参数
const params = {
page: 1,
page_size: 10
}
// 贸易数据
const tradeData = ref({})
// 企业信息
const company = ref({})
// 记录当前统计信息选中的索引(-1表示未选中
const activeIndex = ref(-1);
// 贸易数据图表
const tradeCharts = ref({
categories: [],
series: []
})
// 市场趋势分析图表opt配置
const tradeOpts = ref({
color: ["#A2D2FF"],
padding: [15, 15, 0, 5],
dataLabel: false,//数据文案
legend: {
show: false
},
extra: {
column: {
type: "group",
width: 23,
activeBgColor: "#000000",
seriesGap: 5,
linearOpacity: 1,
barBorderCircle: true
},
},
yAxis: {
data: [
{
min: 0,
axisLine: false
}
]
}
})
// 近三月数据
const tradeDataList = ref([])
// 表格列配置
const tableColumns = ref([])
// 出口数据搜索
const exportSeach = ref('')
// 出口数据内容
const exportData = ref({})
// 搜索框设置
const placeholderLeft = ref(true)
onLoad(() => {
getCompanyDataThirdDataView()
getDataViewExport()
})
// tab函数
const tabIndex = (index) => {
if (index == 1) {
getDataViewExport()
}
}
// 企业画像
const getCompanyDataThirdDataView = () => {
postCompanyDataThirdDataViewApi(params).then(res => {
if (res.code == 1) {
tradeData.value = res.data
// 图片数据
imgsUrl.value = res.data.other
// 市场趋势数据处理
company.value = res.data.company
tradeCharts.value.categories = res.data.market_analysis_charts.name
let charts = res.data.market_analysis_charts.charts
let chartsObj = {
name: res.data.market_analysis_charts.title,
data: res.data.market_analysis_charts.value
}
tradeCharts.value.series[0] = chartsObj
// 近三月数据处理
let originalData = res.data.market_analysis_list
tradeDataList.value = originalData.list.map(item => {
return {
[originalData.name[0]]: item[0], // 最近日期
[originalData.name[1]]: item[1], // 交易次数
[originalData.name[2]]: item[2], // 交易笔数
[originalData.name[3]]: item[3] // 交易重量
};
})
extractTableColumns(tradeDataList.value)
}
})
}
// 点击统计信息
const handleStatClick = (index) => {
activeIndex.value = index;
}
// 提取表格列信息
const extractTableColumns = (data) => {
if (data.length > 0) {
// 获取第一个对象的所有键
const keys = Object.keys(data[0]);
// 转换为表格列配置
tableColumns.value = keys.map(key => ({
prop: key,
// 这里直接用键作为label也可以根据需要进行格式化
label: key
}))
}
}
// 出口数据请求
const getDataViewExport = () => {
postDataViewExportApi(params).then(res => {
if (res.code == 1) {
exportData.value = res.data
}
})
}
</script>
<style lang="scss" scoped>
::v-deep .portrait-page {
width: 100%;
position: relative;
min-height: 100vh;
overflow-y: hidden;
padding: 0 30rpx;
// 底部状态栏一般建议预留60rpx-100rpx具体根据实际底部栏高度调整
padding-bottom: 60rpx;
background: #FFFFFF !important;
&-contain {
position: relative;
z-index: 1;
padding-top: 32rpx;
}
}
// 头部搜索框
.wd-search {
background-color: #E9F3FF;
height: 80rpx;
border-radius: 24rpx;
}
::v-deep .wd-search__block {
background-color: #E9F3FF;
}
::v-deep .wd-search__cancel {
color: #0478F4;
font-size: 28rpx;
}
// 企业卡片
.portrait-card {
width: 100%;
height: 280rpx;
margin-top: 30rpx;
background: linear-gradient(to bottom, #1975C3, #85BCFF);
border-radius: 20rpx;
padding: 30rpx;
color: #fff;
&-title {
display: flex;
align-items: center;
font-size: 28rpx;
font-weight: 600;
&-circle {
width: 30rpx;
height: 30rpx;
background: #FFFFFF;
border-radius: 50%;
margin-right: 10rpx;
}
}
&-info {
width: 100%;
display: flex;
flex-direction: column;
justify-content: space-around;
padding-bottom: 30rpx;
&-item {
display: flex;
align-items: center;
font-size: 24rpx;
margin-top: 10rpx;
&-label {
width: 120rpx;
}
&-value {
flex: 1;
text-align: right;
}
}
}
}
::v-deep .is-active {
color: #0478F4;
}
.content-right {
display: flex;
align-items: center;
font-size: 24rpx;
color: #666666;
image {
width: 15rpx;
height: 13rpx;
margin-left: 10rpx;
}
.wd-search {
width: 400rpx;
height: 50rpx;
}
::v-deep .wd-search__cover {
background: none;
box-sizing: border-box;
}
::v-deep .wd-search__input {
height: 20rpx;
}
}
.content-trade {
&-stat {
display: flex;
justify-content: space-between;
margin: 30rpx 0;
&-item {
width: 200rpx;
height: 100rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: 24rpx;
color: #333333;
background-color: #EEEEEE;
border-radius: 10px;
}
&-item-active {
background-color: #B9C3FF;
color: #1159C0;
border: 1px solid #1159C0;
}
&-value {
font-size: 28rpx;
font-weight: 600;
}
}
}
.trade-charts {
height: 360rpx;
}
::v-deep .is-border {
border-right: none !important;
}
::v-deep .wd-table__cell {
background-color: #F8F8F8 !important;
min-height: 80rpx !important;
}
::v-deep .is-stripe {
background-color: #CCE6FF !important;
}
.table {
width: 100%;
margin-top: 30rpx;
}
</style>