Files
hazardousWaste_app/pages/recycling/integratedModeAssessment/results.vue

508 lines
13 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="result-card">
<view class="flex align-center justify-between">
<view class="cup mr-8">🏆</view>
<view>
<view>
<text class="recommend mr-4">推荐方案:</text>
<text class="plan">集中回收模式大型中心</text>
</view>
<view class="comprehensive">
<!-- <text class="mr-4">综合得分</text>
<text class="total">{{ result.total }} </text> -->
<view class="star-box">
<view class="star-item" v-for="i in 5" :key="i">
<text class="star-gray"></text>
<text class="star-yellow" :style="{ width: getStarWidth(i) }"></text>
</view>
</view>
</view>
</view>
</view>
<view>
<view class="wave-circle">
<view class="water" :style="{ height: `${result.total}%` }">
<view class="wave wave1"></view>
<view class="wave wave2"></view>
</view>
<view class="score">
{{ result.total }}
</view>
</view>
</view>
</view>
<view class="result-card">
<view style="width: 100%;">
<view class="title"> <text class="dot"></text>评估结果区 多元价值评分</view>
<view class="flex justify-between align-center">
<view>
<view class="big-score">{{ result.total }}</view>
<view class="level">良好</view>
</view>
<view class="star-box">
<view class="star-item" v-for="i in 5" :key="i">
<text class="star-gray"></text>
<text class="star-yellow" :style="{ width: getStarWidth(i) }"></text>
</view>
</view>
</view>
<view v-for="item in result.scoreCards" :key="item.label" class="score-card">
<view class="flex justify-between align-center">
<view class="card-title">{{ item.label }}</view>
<view class="score-num" :style="{ color: item.color }">
{{ item.value }}
</view>
</view>
<uv-line-progress :percentage="item.value" activeColor="#006569"></uv-line-progress>
</view>
<view class="desc-box">
<view class="card-title">评价等级说明</view>
<text>90-100优秀 <text class="stars"></text> </text>
<text>75-89良好 <text class="stars"></text> </text>
<text>60-74一般 <text class="stars"></text> </text>
<text>0-59较差 <text class="stars"></text> </text>
</view>
</view>
</view>
<view class="result-card">
<view style="width: 100%;">
<view class="title"> <text class="dot"></text>模式对比区 不同回收模式综合对比</view>
<!-- 横向滚动包裹层 -->
<scroll-view class="table-scroll" scroll-x="true" :show-scrollbar="false">
<!-- 固定宽度实现超长横向滚动 -->
<view class="uni-table-container">
<view class="uni-table">
<view class="table-tr table-th">
<view class="table-td" style="width:50rpx">评价维度</view>
<view class="table-td" style="width:100rpx">集中回收模式<br />大型中心</view>
<view class="table-td" style="width:100rpx">分散回收模式<br />多个小型站点</view>
<view class="table-td" style="width:200rpx">对比结果</view>
</view>
<view class="table-tr" v-for="(row, idx) in modeTable" :key="idx">
<view class="table-td" style="width:50rpx">{{ row.dimension }} <br />{{ row.desc }}</view>
<view class="table-td" style="width:100rpx">
<view class="mode-score green">{{ row.centralScore }}</view>
<view class="mode-desc">{{ row.centralDesc }}</view>
</view>
<view class="table-td" style="width:100rpx">
<view class="mode-score blue">{{ row.distributedScore }}</view>
<view class="mode-desc">{{ row.distributedDesc }}</view>
</view>
<view class="table-td" style="width:100rpx">
<span class="good"> {{ row.result }}</span>
</view>
</view>
</view>
</view>
</scroll-view>
<view class="summary-row">
<view>综合得分加权</view>
<view class="central">79.1</view>
<view class="distributed">74.2</view>
<view class="final-result">集中回收模式更优 👍</view>
</view>
</view>
</view>
<view class="result-card">
<view style="width: 100%;">
<view class="title"> <text class="dot"></text> 推荐结论区 系统推荐与说明</view>
<view class="desc-box">
<h4>推荐理由</h4>
<text>1. 经济效益更高规模化运营降低单位处理成本综合成本优势明显</text><br />
<text>2. 资源利用效率更高集中处理有利于提高资源回收率和再生利用水平</text><br />
<text>3. 管理效率更优集中监管与运营便于规范管理与风险控制</text>
</view>
<view class="desc-box">
<h4>建议措施</h4>
<text> 加强运输过程的风险管控与环保措施</text><br />
<text> 优化回收中心布局合理覆盖服务区域</text><br />
<text> 推动技术升级提高资源化利用效率</text>
</view>
</view>
</view>
</template>
<script setup>
import { onMounted } from 'vue';
import { ref } from "vue";
const result = ref()
// 表格数据
const modeTable = [
{
dimension: '经济价值',
desc: '(成本/收益)',
centralScore: 80.1,
centralDesc: '成本较低,规模效益明显',
distributedScore: 63.2,
distributedDesc: '建设与运营成本较高',
result: '集中回收更优'
},
{
dimension: '环境价值',
desc: '(污染/生态)',
centralScore: 72.4,
centralDesc: '运输距离较长,排放略高',
distributedScore: 85.6,
distributedDesc: '就近处理,环境影响较小',
result: '分散回收更优'
},
{
dimension: '社会价值',
desc: '(安全/就业)',
centralScore: 76.3,
centralDesc: '管理集中,就业带动中等',
distributedScore: 78.7,
distributedDesc: '就近服务,就业带动较好',
result: '分散回收更优'
},
{
dimension: '资源价值',
desc: '(再生利用)',
centralScore: 83.2,
centralDesc: '资源集中,利用效率高',
distributedScore: 75.1,
distributedDesc: '资源分散,利用效率一般',
result: '集中回收更优'
}
]
onMounted(() => {
const res = uni.getStorageSync('app_integratedModeAssessment_result')
if (res) result.value = res
})
// 半星计算 保留原有
const getStarWidth = (index) => {
const score = Number(result.value?.total || 0)
const perStar = 20
const current = index * perStar
const prev = (index - 1) * perStar
if (score >= current) return '100%'
if (score > prev) return `${((score - prev) / perStar) * 100}%`
return '0%'
}
</script>
<style lang="scss" scss>
$gw-green: #006569;
$gw-light: #409E99;
$gw-bg: #e8f2f1;
/* 标题小圆点 */
.dot {
width: 12rpx;
height: 12rpx;
background-color: $gw-green;
// border-radius: 50%;
display: inline-block;
margin-right: 12rpx;
}
.result-card {
margin: 20rpx;
background-color: #fff;
padding: 20rpx;
border-radius: 32rpx;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 16rpx;
}
.wave-circle {
width: 80rpx;
height: 80rpx;
border-radius: 50%;
background-color: #f5f7f9;
overflow: hidden;
position: relative;
border: 1rpx solid #eee;
}
.water {
position: absolute;
left: 0;
bottom: 0;
width: 100%;
background: linear-gradient(360deg, $gw-green 0%, $gw-light 100%);
transition: height 0.8s ease;
}
.wave {
width: 200%;
height: 24rpx;
position: absolute;
top: -12rpx;
left: -50%;
background: $gw-bg;
border-radius: 50%;
opacity: 0.8;
}
.wave1 {
animation: wave-animate 4s linear infinite;
}
.wave2 {
animation: wave-animate 6s linear infinite reverse;
opacity: 0.5;
top: -18rpx;
}
.score {
position: absolute;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 16rpx;
font-weight: bold;
color: #fff;
z-index: 99;
}
@keyframes wave-animate {
0% {
transform: translateX(0);
}
100% {
transform: translateX(50%);
}
}
.cup {
font-size: 48rpx;
}
.recommend {
font-size: 14rpx;
color: $gw-green;
font-weight: 600;
}
.plan {
font-size: 16rpx;
font-weight: 600;
color: $gw-green;
}
.comprehensive {
font-size: 14rpx;
display: flex;
align-items: center;
gap: 10rpx;
margin-top: 20rpx;
.total {
font-size: 16rpx;
}
}
/* 五星精确评分(支持半星) */
.star-box {
display: flex;
align-items: center;
}
.star-item {
position: relative;
width: 20rpx;
height: 20rpx;
line-height: 20rpx;
margin-right: 4rpx;
}
.star-gray,
.star-yellow {
position: absolute;
left: 0;
top: 0;
font-size: 20rpx;
}
.star-gray {
color: #e0e0e0;
z-index: 1;
}
.star-yellow {
color: #f7b500;
z-index: 2;
overflow: hidden;
white-space: nowrap;
}
.card-title {
font-size: 14rpx;
}
.big-score {
display: inline-block;
font-size: 32rpx;
color: #18a84f;
font-weight: 700;
}
.level {
display: inline-block;
color: #18a84f;
margin-left: 6rpx;
}
.score-num {
font-size: 24rpx;
font-weight: 700;
margin-bottom: 10rpx;
}
.level-card {
text-align: left;
line-height: 1.7;
}
/* 说明面板 */
.desc-box {
background: #f2f9f9;
border-left: 6rpx solid $gw-green;
border-radius: 8rpx;
padding: 10rpx 24rpx;
font-size: 14px;
color: #333;
margin-top: 20rpx;
h4 {
margin-bottom: 8rpx;
}
}
/* =========== 新增 UniApp 表格样式 完全替代el-table =========== */
.uni-table {
width: 100%;
border: 1rpx solid #e5e7eb;
border-radius: 16rpx;
overflow: hidden;
margin: 8rpx 0;
}
.table-tr {
display: flex;
width: 100%;
}
.table-th {
background-color: #f5f7fa;
font-weight: 500;
}
.table-td {
flex: 1;
text-align: center;
font-size: 16rpx;
padding: 16rpx 8rpx;
border-right: 1rpx solid #eee;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.table-td:last-child {
border-right: none;
}
.table-tr:not(.table-th) {
border-top: 1rpx solid #eee;
}
.mode-score {
font-size: 14rpx;
font-weight: bold;
}
.mode-score.green {
color: $gw-green;
}
.mode-score.blue {
color: $gw-light;
}
.mode-desc {
font-size: 12rpx;
color: #666;
margin-top: 6rpx;
line-height: 1.4;
}
.good {
color: $gw-green;
font-weight: 500;
}
.summary-row {
display: flex;
justify-content: space-around;
padding: 16rpx;
background: #f8f9fa;
border-radius: 12rpx;
margin-top: 8rpx;
font-size: 12rpx;
}
.central {
color: $gw-green;
font-weight: bold;
}
.distributed {
color: $gw-light;
font-weight: bold;
}
.final-result {
color: $gw-green;
font-weight: bold;
}
/* 横向滚动表格 */
.table-scroll {
width: 100%;
}
.uni-table-container {
width: fit-content;
/* 最小总宽度,保证可以横向滚动 */
min-width: 100%;
}
.title {
margin-bottom: 8rpx;
font-size: 16rpx;
}
.stars {
margin-top: 8px;
color: #f7b500;
font-size: 12rpx;
}
</style>