增加二期菜单以及综合模式评估页面

This commit is contained in:
zx
2026-04-28 15:47:19 +08:00
parent 6904f960b7
commit e5a0527861
23 changed files with 1013 additions and 46 deletions

View File

@@ -18,6 +18,8 @@ const listMqttEvent = (params) => {
};
// 智能排风远程开关
const controlSocket = (data) => {
console.log(data,'controlSocket==>');
const payload = {
devEui: data.devEui,
deviceId: data.deviceId,

View File

@@ -24,7 +24,7 @@ const delUniqueCode = (params) => {
const detailUniqueCode = (params) => {
return request(`/unique/code/${params.id}`, params, 'GET');
};
// 详情:通过唯一码获取物料信息
// 扫码:通过唯一码获取物料信息
const getMaterialUnique = (params) => {
return request(`/unique/code/materialInfo/${params.code}`, params, 'GET');
};

View File

@@ -26,13 +26,47 @@
},
{
"path": "pages/intelligent/index",
"style": { "navigationBarTitleText": "智能" }
"style": { "navigationBarTitleText": "智能", "navigationStyle": "custom" }
},
{
"path": "pages/my/index",
"style": { "navigationBarTitleText": "我的" }
},
// 综合模式评估 recycling
{
"path": "pages/recycling/integratedModeAssessment/valueEvaluation",
"style": { "navigationBarTitleText": "危险废弃物回收多元价值评估" }
},
{
"path": "pages/recycling/integratedModeAssessment/results",
"style": { "navigationBarTitleText": "危险废弃物回收多元价值评估结果" }
},
// 智能处置
{
"path": "pages/recycling/leadBatteryCascadeUse/conditionAssessment",
"style": { "navigationBarTitleText": "状态评估" }
},
{
"path": "pages/recycling/leadBatteryCascadeUse/activationRecovery",
"style": { "navigationBarTitleText": "活化恢复" }
},
// 废物云控体系
{
"path": "pages/recycling/carbonFootprint/wasteCloudControl",
"style": { "navigationBarTitleText": "废物云控体系" }
},
// 危废碳足迹
{
"path": "pages/recycling/carbonFootprint/wasteCarbonFootprint",
"style": { "navigationBarTitleText": "危废碳足迹" }
},
// 铅蓄智修样机
{
"path": "pages/recycling/leadBatterySmartRepair/index",
"style": { "navigationBarTitleText": "铅蓄智修样机" }
},
{
"path": "pages/warehousing/uniqueCode/issueUniqueCode/index",
"style": {

View File

@@ -43,12 +43,9 @@
</view>
<view v-if="isSocketControlType(item.type)" class="socket-actions">
<uv-switch v-model="controlLoadingMap[item.cardKey]" active-color="#165D46"
@change="(e) => handleSocketControl(e, item)" />
@change="(e) => handleSocketControl1(item, e)" />
</view>
<!-- <view class="sensor-state">
<text class="dot"></text>
{{ item.onlineText }}
</view> -->
</view>
<view class="sensor-body">
<view class="flex justify-between align-center">
@@ -56,19 +53,20 @@
</view>
<view>
<text class="mr-4"> {{ item.summary }}</text>|
<text class="mr-4 text"> {{ item.summary }}</text>
<text class=" text">|</text>
<text :class="['sensor-state', item.statusClass, 'ml-4']"> {{ item.onlineText }}</text>
</view>
<view v-if="isSocketControlType(item.type)" class="socket-actions">
<!-- <text class="control-btn on" :disabled="!!controlLoadingMap[item.cardKey]"
<text class="control-btn on" :disabled="!!controlLoadingMap[item.cardKey]"
@tap="handleSocketControl(item, 'on')">
{{ getSocketActionText(item.type, 'on', !!controlLoadingMap[item.cardKey]) }}
</text>
<text class="control-btn off" :disabled="!!controlLoadingMap[item.cardKey]"
@tap="handleSocketControl(item, 'off')">
{{ getSocketActionText(item.type, 'off', !!controlLoadingMap[item.cardKey]) }}
</text> -->
</text>
</view>
<view v-else-if="item.type === 'switch'" class="switch-actions">
@@ -235,31 +233,47 @@ function patchRealtimeState(prev, next) {
if (socket != null) res.switchStatus = res.socket_status = res.socketStatus = socket
return res
}
async function handleSocketControl(e, item) {
console.log(e, item, '111');
const action = e ? 'on' : 'off'
console.log(action, '111');
if (action) {
const deviceId = item.id || item.deviceId
const devEui = item.devEui || item.devEUI || item.dev_eui
console.log('devEui', devEui);
if (!devEui) return uni.showToast({ title: '未找到设备', icon: 'none' })
const k = item.cardKey || String(deviceId)
if (controlLoadingMap[k]) return
controlLoadingMap[k] = true
try {
const status = action === 'on' ? 1 : 0
console.log(status, action, 'status');
await controlSocket({ devEui, deviceId, status })
syncSocketLocalState(item, status)
uni.showToast({ title: '指令已发送', icon: 'success' })
} finally {
controlLoadingMap[k] = false
}
async function handleSocketControl(item, action) {
console.log(action, controlLoadingMap, 'action111');
console.log(item, 'item111');
const deviceId = item.id || item.deviceId
const devEui = item.devEui || item.devEUI || item.dev_eui
if (!devEui) return uni.showToast({ title: '未找到设备', icon: 'none' })
const k = item.cardKey || String(deviceId)
console.log('devEui1', controlLoadingMap, k, controlLoadingMap[k]);
if (controlLoadingMap[k]) return
controlLoadingMap[k] = true
try {
const status = action === 'on' ? 1 : 0
await controlSocket({ devEui, deviceId, status })
syncSocketLocalState(item, status)
uni.showToast({ title: '指令已发送', icon: 'success' })
} finally {
controlLoadingMap[k] = false
}
}
async function handleSocketControl1(item, e) {
const action = e ? 'on' : 'off'
console.log(action, controlLoadingMap, 'action11133');
console.log(item, 'item11133');
const deviceId = item.id || item.deviceId
const devEui = item.devEui || item.devEUI || item.dev_eui
if (!devEui) return uni.showToast({ title: '未找到设备', icon: 'none' })
const k = item.cardKey || String(deviceId)
console.log('devEui', controlLoadingMap, k, controlLoadingMap[k]);
if (controlLoadingMap[k]) return
console.log('controlLoadingMap[k]', controlLoadingMap[k]);
controlLoadingMap[k] = true
try {
const status = action === 'on' ? 1 : 0
console.log(status, action, 'status===>');
await controlSocket({ devEui, deviceId, status })
syncSocketLocalState(item, status)
uni.showToast({ title: '指令已发送', icon: 'success' })
} finally {
controlLoadingMap[k] = false
}
}
@@ -709,10 +723,15 @@ onBeforeUnmount(() => {
}
.location {
font-size: 16px;
font-size: 14px;
color: #666;
}
.text {
font-size: 14px;
}
.type-name {
font-size: 16px;
font-weight: 600;
@@ -732,7 +751,7 @@ onBeforeUnmount(() => {
display: flex;
justify-content: space-between;
gap: 16rpx;
margin-top: 10px;
margin-top: 20rpx;
}
.switch-actions {
@@ -833,7 +852,7 @@ onBeforeUnmount(() => {
.summary-card {
padding: 18px 20px;
padding: 36rpx 40rpx;
border-radius: 18px;
position: relative;
overflow: hidden;
@@ -844,7 +863,7 @@ onBeforeUnmount(() => {
font-size: 13px;
font-weight: 500;
color: #334155;
margin-bottom: 6px;
margin-bottom: 12rpx;
}
.value {

View File

@@ -23,7 +23,6 @@ getMyWarehouseList()
</script>
<template>
<uv-list v-for="(item, index) in myWarehouseList" :key="index" class="list">
<view class="title line">{{ item.parentName }}</view>
<uv-list-item v-for="(i, idx) in item.items" :key="idx" link clickable @tap="onChecked(i)"
@@ -50,6 +49,7 @@ getMyWarehouseList()
}
.title {
font-size: 14px;
padding: 8px 30rpx;
}
</style>

View File

@@ -1,5 +1,6 @@
<!-- 底部导航栏智能 -->
<template>
<navigation title="智能"/>
<view class="contentBox">
<ProjectOverView />
</view>
@@ -7,15 +8,11 @@
<script setup>
import ProjectOverView from '../components/ProjectOverView.vue'
import Navigation from '../components/Navigation.vue';
</script>
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;

View File

@@ -0,0 +1,3 @@
<template>危废碳足迹</template>
<script setup></script>
<style lang="sass" scoped></style>

View File

@@ -0,0 +1,3 @@
<template>废物云控体系</template>
<script setup></script>
<style lang="sass" scoped></style>

View File

@@ -0,0 +1,508 @@
<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>

View File

@@ -0,0 +1,295 @@
<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>

View File

@@ -0,0 +1,3 @@
<template>智能处置-活化恢复</template>
<script setup></script>
<style lang="sass" scoped></style>

View File

@@ -0,0 +1,3 @@
<template>智能处置-状态评估</template>
<script setup></script>
<style lang="sass" scoped></style>

View File

@@ -0,0 +1,3 @@
<template>废铅蓄梯利用</template>
<script setup></script>
<style lang="sass" scoped></style>

View File

@@ -204,3 +204,11 @@ export function transformData(arr) {
export const getToken = () => {
return uni.getStorageSync("app_token");
};
export function getTwoOneRandom() {
// 整数部分 10~99
const int = Math.floor(Math.random() * 90) + 10;
// 小数部分 0~9
const dec = Math.floor(Math.random() * 10);
return parseFloat(`${int}.${dec}`);
}

View File

@@ -1,3 +1,4 @@
import { BASE_URL } from "../../api/request";
import { getToken } from "../until";
let ws = null;
@@ -27,7 +28,7 @@ function getWsBaseUrl() {
host = window.location.host;
} else {
// 非H5小程序/App需要你配置真实域名
host = "你的后端域名";
host = BASE_URL;
}
return `${protocol}//${host}${baseApi}`.replace(/\/$/, "");

View File

@@ -0,0 +1,3 @@
<template></template>
<script setup></script>
<style lang="sass" scoped></style>

View File

@@ -0,0 +1,3 @@
<template></template>
<script setup></script>
<style lang="sass" scoped></style>

View File

@@ -29,6 +29,10 @@ const menuList = [
title: '唯一码盘点',
click: () => {
console.log('唯一码盘点')
// pages/weif/index
uni.navigateTo({
url: '/pages/weif/index'
});
}
},
{
@@ -280,6 +284,84 @@ const menuList = [
},
]
},
{
id: 'recycling',
title: '模式评估处置',
menuItem: [
{
id: "recycling_integratedModeAssessment",
icon: '../../static/recycling/integratedModeAssessment.png',
title: '综合模式评估',
click: () => {
console.log('综合模式评估')
removeStorage()
uni.navigateTo({
url: `/pages/recycling/integratedModeAssessment/valueEvaluation`
});
}
},
{
id: "recycling_leadBatteryCascadeUse",
icon: '../../static/recycling/leadBatteryCascadeUse.png',
title: '智能处置',
click: () => {
console.log('智能处置')
removeStorage()
uni.navigateTo({
url: `/pages/recycling/leadBatteryCascadeUse/conditionAssessment`
});
}
},
]
},
{
id: 'carbonFootprint',
title: '碳足迹',
menuItem: [
{
id: "recycling_wasteCloudControlSystem",
icon: '../../static/recycling/wasteCloudControlSystem.png',
title: '废物云控体系',
click: () => {
console.log('废物云控体系')
removeStorage()
uni.navigateTo({
url: `/pages/recycling/carbonFootprint/wasteCloudControl`
});
}
},
{
id: "recycling_carbonFootprint",
icon: '../../static/recycling/carbonFootprint.png',
title: '碳足迹',
click: () => {
console.log('碳足迹')
removeStorage()
uni.navigateTo({
url: `/pages/recycling/carbonFootprint/wasteCarbonFootprint`
});
}
},
]
},
{
id: 'leadBatterySmartRepair',
title: '铅蓄智修样机',
menuItem: [
{
id: "recycling_leadBatterySmartRepair",
icon: '../../static/recycling/leadBatterySmartRepair.png',
title: '铅蓄智修样机',
click: () => {
console.log('铅蓄智修样机')
removeStorage()
uni.navigateTo({
url: `/pages/recycling/leadBatterySmartRepair/index`
});
}
},
]
},
{
id: 'transportCheckIn',
title: '运输打卡',

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB