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

295 lines
8.5 KiB
Vue
Raw Normal View History

<template>
<view style="background-color: #fff;">
<view class="inter-card">
<uv-form labelPosition="left" :model="formModel" :rules="formRules" labelWidth="130" ref="formRef">
<text class="title">
<text class="dot"></text>
基本条件
</text>
<uv-form-item label="废弃物产生量(吨/年)" prop="amount" borderBottom>
<uv-input v-model="formModel.amount" border="none" placeholderStyle="text-align: right;"
placeholder="请输入废弃物产生量" />
</uv-form-item>
<uv-form-item label="运输距离" prop="distance" borderBottom>
<uv-input v-model="formModel.distance" placeholder="请选择运输距离" placeholderStyle="text-align:right"
border="none" right-icon="arrow-right" @click="openRiskPopup('distance')" />
</uv-form-item>
<uv-form-item label="环境风险等级" prop="risk" borderBottom>
<uv-input v-model="formModel.risk" placeholder="请选择环境风险等级" placeholderStyle="text-align:right"
border="none" right-icon="arrow-right" @click="openRiskPopup('risk')" />
</uv-form-item>
<uv-form-item label="处理成本水平" prop="cost" borderBottom>
<uv-input v-model="formModel.cost" placeholder="请选择处理成本水平" placeholderStyle="text-align:right"
border="none" right-icon="arrow-right" @click="openRiskPopup('cost')" />
</uv-form-item>
<text class="title">
<text class="dot"></text>
多元价值权重设置
</text>
<uv-form-item borderBottom :label="i.label" v-for="i in weights" :key="i.key">
<view class="slider-row">
<slider class="sg-slider" :value="formModel[i.key]"
@changing="formModel[i.key] = $event.detail.value" />
<text class="percent">{{ formModel[i.key] }}%</text>
</view>
</uv-form-item>
</uv-form>
<view class="desc-box mt-8">
<h4>参数说明</h4>
<text>· 经济价值回收成本收益资源利用收益等</text><br />
<text>· 环境价值污染排放生态影响环境修复等</text><br />
<text>· 社会价值公共安全就业带动合规性等</text><br />
<text>· 资源价值资源再生利用率循环利用价值等</text>
</view>
</view>
<view class="bottom">
<uv-button type="primary" @tap="submitForm">
<uv-icon name="grid-fill" :loading="loading" class="mr-4" color="#fff" size="20" />
开始评估
</uv-button>
</view>
<uv-popup ref="popup" mode="bottom" custom-style="height: 200rpx;">
<view class="content">
<text @tap="onCheck(item)" v-for="item in selectOption" :key="item.value">{{ item.label }}</text>
</view>
</uv-popup>
</view>
</template>
<script setup>
import { getTwoOneRandom } from '../..//until'
import { ref, reactive, computed } from "vue";
const clickName = ref('')
const loading = ref(false)
const popup = ref(null)
const formRef = ref();
// 权重
const weights = reactive([
{ key: 'economic', label: '经济价值权重' },
{ key: 'environment', label: '环境价值权重' },
{ key: 'social', label: '社会价值权重' },
{ key: 'resource', label: '资源价值权重' }
])
// 结果
const result = reactive({
total: 78.6,
economic: 81.4,
environment: 72.3,
social: 76.8,
resource: 83.6,
scoreCards: ''
})
// const result = reactive({
// total: getTwoOneRandom(),
// economic: getTwoOneRandom(),
// environment: getTwoOneRandom(),
// social: getTwoOneRandom(),
// resource: getTwoOneRandom()
// })
const scoreCards = computed(() => [
{ label: '经济价值得分', value: result.economic, color: '#246fe5' },
{ label: '环境价值得分', value: result.environment, color: '#22b85a' },
{ label: '社会价值得分', value: result.social, color: '#8b45f7' },
{ label: '资源价值得分', value: result.resource, color: '#f5a400' }
])
// const formRules = {
// amount: {
// type: "string",
// required: true,
// message: "请输入废弃物产生量",
// trigger: ["blur", "change"],
// },
// distance: {
// type: "string",
// required: true,
// message: "请选择运输距离",
// trigger: ['blur', 'change']
// },
// risk: {
// type: "string",
// required: true,
// message: "请选择环境风险等级",
// trigger: ['blur', 'change']
// },
// cost: {
// type: "string",
// required: true,
// message: "请选择处理成本水平",
// trigger: ['blur', 'change']
// },
// }
const selectOption = [
{ value: 'low', label: '低等' },
{ value: 'middle', label: '中等' },
{ value: 'high', label: '高等' },
]
const formModel = reactive({
total: 78.6,
economic: 40,
environment: 30,
social: 20,
resource: 10,
amount: '',
distance: '',
risk: '',
cost: '',
})
const openRiskPopup = (val) => {
clickName.value = val
popup.value.open()
}
const onCheck = (item) => {
formModel[clickName.value] = item.label
popup.value.close()
}
const submitForm = () => {
formRef.value.validate().then(res => {
const totalWeight =
formModel.economic +
formModel.environment +
formModel.social +
formModel.resource
if (!formModel.amount || !formModel.cost || !formModel.distance || !formModel.risk) {
uni.showToast({
title: '请完善基本条件',
icon: 'none'
})
return
}
if (Math.round(totalWeight) !== 100) {
uni.showToast({
title: '权重合计必须为 100%',
icon: 'none'
})
return
}
result.total = (
result.economic * formModel.economic / 100 +
result.environment * formModel.environment / 100 +
result.social * formModel.social / 100 +
result.resource * formModel.resource / 100
).toFixed(1)
result.scoreCards = scoreCards
console.log(result, 'result===>');
uni.setStorageSync('app_integratedModeAssessment_result', result)
uni.showToast({
title: '评估成功',
icon: 'success'
})
uni.navigateTo({
url: '/pages/recycling/integratedModeAssessment/results'
})
})
}
</script>
<style scoped lang="scss">
/* 国网绿主色 */
$gw-green: #006569;
$gw-light: #409E99;
.inter-card {
padding: 20rpx;
}
/* 底部按钮 */
.bottom {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
}
:deep(.uv-button--primary) {
background-color: $gw-green !important;
border-color: $gw-green !important;
}
/* 说明面板 */
.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: 4rpx;
}
uni-text {
display: inline-block;
margin-bottom: 8rpx;
}
}
/* 标题 */
.title {
font-size: 16px;
font-weight: 500;
color: $gw-green;
margin: 14rpx 0 0 0;
display: flex;
align-items: center;
}
/* 标题小圆点 */
.dot {
width: 12rpx;
height: 12rpx;
background-color: $gw-green;
// border-radius: 50%;
display: inline-block;
margin-right: 12rpx;
}
/* 滑块布局 */
.slider-row {
display: flex;
align-items: center;
flex: 1;
}
/* 国网绿滑块 */
.sg-slider {
flex: 1;
--slider-track-color: #d9eaea;
--slider-active-color: $gw-light;
--slider-thumb-color: $gw-green;
}
.percent {
width: 80rpx;
text-align: right;
font-size: 12px;
color: $gw-green;
font-weight: 500;
margin-left: 10rpx;
}
.content {
display: flex;
flex-direction: column;
padding: 20rpx;
text {
text-align: center;
width: 100%;
padding: 16rpx 0;
border-bottom: 2rpx solid #F5F5F5;
}
}
</style>