增加二期菜单以及综合模式评估页面
This commit is contained in:
@@ -18,6 +18,8 @@ const listMqttEvent = (params) => {
|
|||||||
};
|
};
|
||||||
// 智能排风远程开关
|
// 智能排风远程开关
|
||||||
const controlSocket = (data) => {
|
const controlSocket = (data) => {
|
||||||
|
console.log(data,'controlSocket==>');
|
||||||
|
|
||||||
const payload = {
|
const payload = {
|
||||||
devEui: data.devEui,
|
devEui: data.devEui,
|
||||||
deviceId: data.deviceId,
|
deviceId: data.deviceId,
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ const delUniqueCode = (params) => {
|
|||||||
const detailUniqueCode = (params) => {
|
const detailUniqueCode = (params) => {
|
||||||
return request(`/unique/code/${params.id}`, params, 'GET');
|
return request(`/unique/code/${params.id}`, params, 'GET');
|
||||||
};
|
};
|
||||||
// 详情:通过唯一码获取物料信息
|
// 扫码:通过唯一码获取物料信息
|
||||||
const getMaterialUnique = (params) => {
|
const getMaterialUnique = (params) => {
|
||||||
return request(`/unique/code/materialInfo/${params.code}`, params, 'GET');
|
return request(`/unique/code/materialInfo/${params.code}`, params, 'GET');
|
||||||
};
|
};
|
||||||
|
|||||||
36
pages.json
36
pages.json
@@ -26,13 +26,47 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "pages/intelligent/index",
|
"path": "pages/intelligent/index",
|
||||||
"style": { "navigationBarTitleText": "智能" }
|
"style": { "navigationBarTitleText": "智能", "navigationStyle": "custom" }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "pages/my/index",
|
"path": "pages/my/index",
|
||||||
"style": { "navigationBarTitleText": "我的" }
|
"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",
|
"path": "pages/warehousing/uniqueCode/issueUniqueCode/index",
|
||||||
"style": {
|
"style": {
|
||||||
|
|||||||
@@ -43,12 +43,9 @@
|
|||||||
</view>
|
</view>
|
||||||
<view v-if="isSocketControlType(item.type)" class="socket-actions">
|
<view v-if="isSocketControlType(item.type)" class="socket-actions">
|
||||||
<uv-switch v-model="controlLoadingMap[item.cardKey]" active-color="#165D46"
|
<uv-switch v-model="controlLoadingMap[item.cardKey]" active-color="#165D46"
|
||||||
@change="(e) => handleSocketControl(e, item)" />
|
@change="(e) => handleSocketControl1(item, e)" />
|
||||||
</view>
|
</view>
|
||||||
<!-- <view class="sensor-state">
|
|
||||||
<text class="dot"></text>
|
|
||||||
{{ item.onlineText }}
|
|
||||||
</view> -->
|
|
||||||
</view>
|
</view>
|
||||||
<view class="sensor-body">
|
<view class="sensor-body">
|
||||||
<view class="flex justify-between align-center">
|
<view class="flex justify-between align-center">
|
||||||
@@ -56,19 +53,20 @@
|
|||||||
</view>
|
</view>
|
||||||
|
|
||||||
<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>
|
<text :class="['sensor-state', item.statusClass, 'ml-4']"> {{ item.onlineText }}</text>
|
||||||
</view>
|
</view>
|
||||||
<view v-if="isSocketControlType(item.type)" class="socket-actions">
|
<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')">
|
@tap="handleSocketControl(item, 'on')">
|
||||||
{{ getSocketActionText(item.type, 'on', !!controlLoadingMap[item.cardKey]) }}
|
{{ getSocketActionText(item.type, 'on', !!controlLoadingMap[item.cardKey]) }}
|
||||||
</text>
|
</text>
|
||||||
<text class="control-btn off" :disabled="!!controlLoadingMap[item.cardKey]"
|
<text class="control-btn off" :disabled="!!controlLoadingMap[item.cardKey]"
|
||||||
@tap="handleSocketControl(item, 'off')">
|
@tap="handleSocketControl(item, 'off')">
|
||||||
{{ getSocketActionText(item.type, 'off', !!controlLoadingMap[item.cardKey]) }}
|
{{ getSocketActionText(item.type, 'off', !!controlLoadingMap[item.cardKey]) }}
|
||||||
</text> -->
|
</text>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<view v-else-if="item.type === 'switch'" class="switch-actions">
|
<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
|
if (socket != null) res.switchStatus = res.socket_status = res.socketStatus = socket
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
async function handleSocketControl(item, action) {
|
||||||
async function handleSocketControl(e, item) {
|
console.log(action, controlLoadingMap, 'action111');
|
||||||
console.log(e, item, '111');
|
console.log(item, 'item111');
|
||||||
const action = e ? 'on' : 'off'
|
const deviceId = item.id || item.deviceId
|
||||||
console.log(action, '111');
|
const devEui = item.devEui || item.devEUI || item.dev_eui
|
||||||
if (action) {
|
if (!devEui) return uni.showToast({ title: '未找到设备', icon: 'none' })
|
||||||
const deviceId = item.id || item.deviceId
|
const k = item.cardKey || String(deviceId)
|
||||||
const devEui = item.devEui || item.devEUI || item.dev_eui
|
console.log('devEui1', controlLoadingMap, k, controlLoadingMap[k]);
|
||||||
console.log('devEui', devEui);
|
if (controlLoadingMap[k]) return
|
||||||
|
controlLoadingMap[k] = true
|
||||||
if (!devEui) return uni.showToast({ title: '未找到设备', icon: 'none' })
|
try {
|
||||||
const k = item.cardKey || String(deviceId)
|
const status = action === 'on' ? 1 : 0
|
||||||
if (controlLoadingMap[k]) return
|
await controlSocket({ devEui, deviceId, status })
|
||||||
controlLoadingMap[k] = true
|
syncSocketLocalState(item, status)
|
||||||
try {
|
uni.showToast({ title: '指令已发送', icon: 'success' })
|
||||||
const status = action === 'on' ? 1 : 0
|
} finally {
|
||||||
console.log(status, action, 'status');
|
controlLoadingMap[k] = false
|
||||||
|
|
||||||
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 {
|
.location {
|
||||||
font-size: 16px;
|
font-size: 14px;
|
||||||
color: #666;
|
color: #666;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
font-size: 14px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
.type-name {
|
.type-name {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
@@ -732,7 +751,7 @@ onBeforeUnmount(() => {
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
gap: 16rpx;
|
gap: 16rpx;
|
||||||
margin-top: 10px;
|
margin-top: 20rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.switch-actions {
|
.switch-actions {
|
||||||
@@ -833,7 +852,7 @@ onBeforeUnmount(() => {
|
|||||||
|
|
||||||
|
|
||||||
.summary-card {
|
.summary-card {
|
||||||
padding: 18px 20px;
|
padding: 36rpx 40rpx;
|
||||||
border-radius: 18px;
|
border-radius: 18px;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@@ -844,7 +863,7 @@ onBeforeUnmount(() => {
|
|||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
color: #334155;
|
color: #334155;
|
||||||
margin-bottom: 6px;
|
margin-bottom: 12rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.value {
|
.value {
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ getMyWarehouseList()
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
|
|
||||||
<uv-list v-for="(item, index) in myWarehouseList" :key="index" class="list">
|
<uv-list v-for="(item, index) in myWarehouseList" :key="index" class="list">
|
||||||
<view class="title line">{{ item.parentName }}</view>
|
<view class="title line">{{ item.parentName }}</view>
|
||||||
<uv-list-item v-for="(i, idx) in item.items" :key="idx" link clickable @tap="onChecked(i)"
|
<uv-list-item v-for="(i, idx) in item.items" :key="idx" link clickable @tap="onChecked(i)"
|
||||||
@@ -50,6 +49,7 @@ getMyWarehouseList()
|
|||||||
}
|
}
|
||||||
|
|
||||||
.title {
|
.title {
|
||||||
|
font-size: 14px;
|
||||||
padding: 8px 30rpx;
|
padding: 8px 30rpx;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
<!-- 底部导航栏:智能 -->
|
<!-- 底部导航栏:智能 -->
|
||||||
<template>
|
<template>
|
||||||
|
<navigation title="智能"/>
|
||||||
<view class="contentBox">
|
<view class="contentBox">
|
||||||
<ProjectOverView />
|
<ProjectOverView />
|
||||||
</view>
|
</view>
|
||||||
@@ -7,15 +8,11 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import ProjectOverView from '../components/ProjectOverView.vue'
|
import ProjectOverView from '../components/ProjectOverView.vue'
|
||||||
|
import Navigation from '../components/Navigation.vue';
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.content {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo {
|
.logo {
|
||||||
height: 200rpx;
|
height: 200rpx;
|
||||||
|
|||||||
3
pages/recycling/carbonFootprint/wasteCarbonFootprint.vue
Normal file
3
pages/recycling/carbonFootprint/wasteCarbonFootprint.vue
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<template>危废碳足迹</template>
|
||||||
|
<script setup></script>
|
||||||
|
<style lang="sass" scoped></style>
|
||||||
3
pages/recycling/carbonFootprint/wasteCloudControl.vue
Normal file
3
pages/recycling/carbonFootprint/wasteCloudControl.vue
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<template>废物云控体系</template>
|
||||||
|
<script setup></script>
|
||||||
|
<style lang="sass" scoped></style>
|
||||||
508
pages/recycling/integratedModeAssessment/results.vue
Normal file
508
pages/recycling/integratedModeAssessment/results.vue
Normal 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>
|
||||||
295
pages/recycling/integratedModeAssessment/valueEvaluation.vue
Normal file
295
pages/recycling/integratedModeAssessment/valueEvaluation.vue
Normal 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>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<template>智能处置-活化恢复</template>
|
||||||
|
<script setup></script>
|
||||||
|
<style lang="sass" scoped></style>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<template>智能处置-状态评估</template>
|
||||||
|
<script setup></script>
|
||||||
|
<style lang="sass" scoped></style>
|
||||||
3
pages/recycling/leadBatterySmartRepair/index.vue
Normal file
3
pages/recycling/leadBatterySmartRepair/index.vue
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<template>废铅蓄梯利用</template>
|
||||||
|
<script setup></script>
|
||||||
|
<style lang="sass" scoped></style>
|
||||||
@@ -204,3 +204,11 @@ export function transformData(arr) {
|
|||||||
export const getToken = () => {
|
export const getToken = () => {
|
||||||
return uni.getStorageSync("app_token");
|
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}`);
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { BASE_URL } from "../../api/request";
|
||||||
import { getToken } from "../until";
|
import { getToken } from "../until";
|
||||||
|
|
||||||
let ws = null;
|
let ws = null;
|
||||||
@@ -27,7 +28,7 @@ function getWsBaseUrl() {
|
|||||||
host = window.location.host;
|
host = window.location.host;
|
||||||
} else {
|
} else {
|
||||||
// 非H5(小程序/App)需要你配置真实域名
|
// 非H5(小程序/App)需要你配置真实域名
|
||||||
host = "你的后端域名";
|
host = BASE_URL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return `${protocol}//${host}${baseApi}`.replace(/\/$/, "");
|
return `${protocol}//${host}${baseApi}`.replace(/\/$/, "");
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<template></template>
|
||||||
|
<script setup></script>
|
||||||
|
<style lang="sass" scoped></style>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<template></template>
|
||||||
|
<script setup></script>
|
||||||
|
<style lang="sass" scoped></style>
|
||||||
@@ -29,6 +29,10 @@ const menuList = [
|
|||||||
title: '唯一码盘点',
|
title: '唯一码盘点',
|
||||||
click: () => {
|
click: () => {
|
||||||
console.log('唯一码盘点')
|
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',
|
id: 'transportCheckIn',
|
||||||
title: '运输打卡',
|
title: '运输打卡',
|
||||||
|
|||||||
BIN
static/recycling/carbonFootprint.png
Normal file
BIN
static/recycling/carbonFootprint.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.9 KiB |
BIN
static/recycling/integratedModeAssessment.png
Normal file
BIN
static/recycling/integratedModeAssessment.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.3 KiB |
BIN
static/recycling/leadBatteryCascadeUse.png
Normal file
BIN
static/recycling/leadBatteryCascadeUse.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.7 KiB |
BIN
static/recycling/leadBatterySmartRepair.png
Normal file
BIN
static/recycling/leadBatterySmartRepair.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.1 KiB |
BIN
static/recycling/wasteCloudControlSystem.png
Normal file
BIN
static/recycling/wasteCloudControlSystem.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.1 KiB |
Reference in New Issue
Block a user