smartswrtch-app/page_components/eletj.vue

2046 lines
56 KiB
Vue
Raw Normal View History

<template>
2025-03-04 16:13:46 +08:00
<view class="page" style="width: 100%;height: 90vh;overflow: scroll;">
<u-navbar :title="tittxt" :border-bottom="false" :background="bgc" back-icon-color="#fff" title-color='#fff'
:custom-back="btns" title-size='36' height='50' id="navbar">
</u-navbar>
2025-03-04 16:13:46 +08:00
<!-- 操作 -->
<view class="card2" style="height: 130rpx;padding-top: 28rpx;" v-if="detaobj.suitFeeType == 1 || detaobj.suitFeeType == 4">
<view class="" style="display: flex;box-sizing: border-box;width: 100%;
height: 80rpx;align-items: center;justify-content: space-between;border-radius: 20rpx;font-size: 32rpx;color: #3D3D3D;">
<view class="bot" style="display: flex;align-items: center;"><image style="width: 42rpx;height: 42rpx;margin-right: 10rpx;" src="https://api.ccttiot.com/smartmeter/img/static/uHhpYbtWtakjIWbBdfkU" mode=""></image> 临时开关{{tdtxt}}</view>
<view class="cont" @click="btnkq">
<view class="top" style="padding-top: 10rpx;">
<view class="rt">
<image v-if="tdtxt == '开启'" style="width: 160rpx;height: 80rpx;"
src="https://api.ccttiot.com/smartmeter/img/static/uccaWar4FDp37op7haWM " mode="aspectFit">
</image>
<image style="width: 160rpx;height: 80rpx;" v-else
src="https://api.ccttiot.com/smartmeter/img/static/ur9HRtZKY7YcxGewJARz" mode="aspectFit">
</image>
</view>
</view>
</view>
</view>
</view>
<view class="" style="background-color: #fff;padding: 30rpx;border-radius: 20rpx;box-sizing: border-box;box-shadow: 0rpx 10rpx 64rpx 0rpx rgba(0,0,0,0.08);margin-top: 30rpx;">
<view class="dltop">
<view class="dian_list">
<view class="">
{{sbobj.voltage == undefined ? '--' : sbobj.voltage}}
</view>
<view class="">
{{sbobj.electricity == undefined ? '--' : sbobj.electricity}}
</view>
<view class="">
{{sbobj.realTimePower == undefined ? '--' : sbobj.realTimePower}}
</view>
</view>
2025-03-04 16:13:46 +08:00
<view class="dian_list">
<view class="">
电压V
</view>
<view class="">
电流A
</view>
<view class="">
功率W
</view>
</view>
2025-03-04 16:13:46 +08:00
<view class="botwz">
<!-- 点击刷新实时信息 -->
<view @click="shuaxin(1)" style="width: 100%;display: flex;color: #fff;justify-content: center;align-items: center;padding-top:40rpx;padding-bottom: 30rpx;box-sizing: border-box;">
点击刷新实时信息
</view>
</view>
</view>
2025-03-04 16:13:46 +08:00
<view class="wz" v-if="onlineStatus == 0">
<view v-if="ver_dataflag == 1" style="color: #8883F0;">
<image src="https://api.ccttiot.com/smartmeter/img/static/u6akzRBuxxP94XlUcMtV" mode=""></image>
未连接
</view>
2025-03-04 16:13:46 +08:00
<view v-if="ver_dataflag == 2" style="color: #8883F0;">
<image src="https://api.ccttiot.com/smartmeter/img/static/u6akzRBuxxP94XlUcMtV" mode=""></image>
连接中
</view>
2025-03-04 16:13:46 +08:00
<view v-if="ver_dataflag == 3" style="color: #8883F0;">
<image src="https://api.ccttiot.com/smartmeter/img/static/usSHAkmok1YIdjsgRECI" mode=""></image>
已连接
</view>
</view>
2025-03-04 16:13:46 +08:00
<view class="time_list">
<view class="time_top">
<view class="">
<text v-if="detaobj.suitFeeType == 2 || detaobj.suitFeeType == 3">{{du}}</text>
<text v-if="detaobj.suitFeeType == 1 || detaobj.suitFeeType == 4">{{formattedTime == '1秒' ? '0' : formattedTime}}</text>
</view>
<view class="" v-if="detaobj.suitEndTime">
{{detaobj.money}}
</view>
<view class="" v-else>
<text v-if="detaobj.suitFeeType == 3 || detaobj.suitFeeType == 4">{{feeprice}}</text> <text
v-else>{{detaobj.suitPrice == null ? '--' : detaobj.suitPrice}}</text>
</view>
</view>
2025-03-04 16:13:46 +08:00
<view class="time_bot" v-if="!detaobj.suitEndTime || detaobj.suitFeeType == 1">
<view class="">
<text >订单剩余</text>
</view>
<view class="">
<text v-if="detaobj.suitFeeType == 3 || detaobj.suitFeeType == 4">预估金额,以实际金额为准</text>
<text v-else>金额</text>
</view>
</view>
</view>
</view>
<view class="price_list">
<view class="top_price">
价格明细
</view>
2025-03-04 16:13:46 +08:00
<!-- <u-collapse>
<u-collapse-item title="价格明细"> -->
<view class="qian">
<view class="yajin">
<text v-if="detaobj.suitFeeMode == 2">押金</text>
<text v-else>
<text v-if="detaobj.suitFeeType == 1">{{detaobj.suitTime == null ? '--' : detaobj.suitTime}}<text
v-if="detaobj.suitTimeUnit == 2"></text> <text v-if="detaobj.suitTimeUnit == 3">分钟</text>
<text v-if="detaobj.suitTimeUnit == 4"></text></text>
<text v-if="detaobj.suitFeeType == 2">{{detaobj.suitTime}}</text>
</text>
</view>
<view class="yuan" v-if="detaobj.suitFeeMode == 2">
{{detaobj.suitDeposit == null ? '--' : detaobj.suitDeposit}}
</view>
2025-03-04 16:13:46 +08:00
<view class="yuan" v-else>
{{detaobj.suitPrice == null ? '--' : detaobj.suitPrice}}
</view>
</view>
<view class="jisuan">
计价方式<text v-if="detaobj.suitFeeType == 1">计时收费</text>
<text v-if="detaobj.suitFeeType == 2">按量收费</text>
<text v-if="detaobj.suitFeeType == 3">分时段按量收费</text>
<text v-if="detaobj.suitFeeType == 4">分时段按时收费</text>
</view>
2025-03-04 16:13:46 +08:00
<view class="list_box" style="width: 100%" v-if="detaobj.suitFeeType == 3 || detaobj.suitFeeType == 4">
<view class="ulbox">
<view class="ulli">
<view class="li" v-for="(val,gearAmountindex) in newArr" :key="gearAmountindex">
{{val}}
</view>
</view>
<view class="olli">
<view class="li" v-for="(vals,timeindex) in 24" :key="timeindex">
{{timeindex + ':00'}}
</view>
</view>
</view>
<view class="" style="margin-top: 16rpx;margin-bottom: 10rpx;width: 100%;text-align: center;color: #666;font-size: 24rpx;">
左滑查看全部时段收费价格
</view>
</view>
2025-03-04 16:13:46 +08:00
<!-- </u-collapse-item>
</u-collapse> -->
</view>
<view class="zujie">
2025-03-04 16:13:46 +08:00
<u-collapse>
<u-collapse-item title="订单信息">
<view class="emilist">
<view class="">
开始时间
</view>
<view class="">
{{detaobj.suitStartTime == null ? '--' : detaobj.suitStartTime}}
</view>
</view>
<view class="emilist">
<view class="">
店铺名称
</view>
<view class="">
{{detaobj.storeName == null ? '--' : detaobj.storeName}}
</view>
</view>
<view class="emilist">
<view class="">
详细地址
</view>
<view class="">
{{detaobj.storeAddress == null ? '--' : detaobj.storeAddress}}
</view>
</view>
<view class="emilist">
<view class="">
套餐名称
</view>
<view class="">
{{detaobj.suitName == null ? '--' : detaobj.suitName}}
</view>
</view>
<view class="emilist">
<view class="">
设备编号
</view>
<view class="">
{{detaobj.deviceNo == null ? '--' : detaobj.deviceNo}}
</view>
</view>
<view class="emilist">
<view class="">
订单编号
</view>
<view class="">
{{detaobj.billNo == null ? '--' : detaobj.billNo}}
</view>
</view>
</u-collapse-item>
</u-collapse>
</view>
2025-03-04 16:13:46 +08:00
<view class="zujie" v-if="detaobj.suitFeeType == 3">
<u-collapse>
<u-collapse-item title="电量记录">
<view class="emilist" v-for="(item,index) in yongdianlist" :key="index">
<view class="">
{{item.timeStart}}-{{item.timeEnd}}
</view>
<view class="">
{{item.usedEle}}
</view>
</view>
<view class="" style="width: 100%;text-align: center;margin-top: 10rpx;color: #ccc;">
暂时没有更多记录了
</view>
</u-collapse-item>
</u-collapse>
</view>
<view class="">
<view class="jieshu" v-if="jieshuflag">
<text style="justify-content: center;" v-if="detaobj.status == 1">立即支付</text>
<text style="justify-content: center" v-else>结束订单</text>
</view>
2025-03-04 16:13:46 +08:00
<view class="jieshu" v-else @click="btnjieshu">
<!-- <text style="justify-content: center;" v-if="detaobj.status == 1" @click="btnljzf">立即支付</text> -->
2025-03-04 16:13:46 +08:00
<text style="justify-content: center;width: 350rpx;">结束订单</text>
</view>
</view>
<view class="mask" v-if="jieshufalg"></view>
<!-- 点击结束弹窗 -->
<view class="truebox" v-if="trueboxfalg">
<view class="titvalue">
您要提前结束此订单吗
</view>
<view class="titvalue">
当前预估消费金额为{{feeprice}},实际消费以实际金额为准 <text
v-if="detaobj.suitFeeMode == 2 && detaobj.suitFeeType == 3">用电量为{{Number(totalElectriQuantity) - Number(suitStartEle)}}</text>
</view>
<view class="truebtn">
<view class="quxiao" @click="trueboxfalg = false">
取消
</view>
<view class="queding" @click="btnbox">
确定
</view>
</view>
</view>
<view class="mask" v-if="trueboxfalg"></view>
2025-03-04 16:13:46 +08:00
<view class="xuanfu">
<image @click="btnxudan" src="https://api.ccttiot.com/smartmeter/img/static/uoWjvyL09yb5K2BBVXPI" mode=""></image>
<image @click="btncall" src="https://api.ccttiot.com/smartmeter/img/static/u8TAJX3G33gR7SPKtauw" mode=""></image>
</view>
</view>
</template>
<script>
var xBlufi = require("@/page_components/blufi/xBlufi.js")
import uniEcCanvas from '@/components/uni-ec-canvas/uni-ec-canvas.vue'
import * as echarts from '@/components/uni-ec-canvas/echarts'
2025-03-04 16:13:46 +08:00
import { Counter } from './blufi/crypto/aes'
let chart = null
export default {
components: {
uniEcCanvas
},
data() {
return {
tdtxt: '开启',
imgflag: false,
checkeds: false,
trueboxfalg: false,
bgc: {
backgroundColor: "#8883f0",
},
ec: {
lazyLoad: true
},
deviceInfo: {},
loadings: false,
info: '',
tittxt: "设备详情",
titlist: [
"全部",
"电表",
"水表",
],
czflag:false,
curtitidx: 0,
id: '',
timeday: '',
imglist: '',
token: '',
userImgs: '',
imgflag: true,
mac: "",
name: '',
deviceId: '',
storeId: '',
qrResult: '',
devicesList: [],
setMode: null,
vipflag: false,
cztime: '',
opflag: '',
timer: null,
newArr: [],
detaobj: {},
timeDifferenceString: 0,
timerId: null,
sbid: '',
onlineStatus: '',
billId: '',
orderno: '',
jieshuflag: false,
feeprice: '',
temperature: null,
du: '',
totalElectriQuantity: '',
suitStartEle: '',
sbobj: {},
jieshufalg:false,
channelId:'',
dingobj: '',
timerone:null,
hasCalledGetczly:false,
timerIds: null ,
formattedTime:'',
ver_data:null,
2025-02-11 17:34:32 +08:00
ver_dataflag:1,
modelId:[],
2025-02-15 14:15:36 +08:00
devicesarr:[],
timedingshi: null, // 定时器
countdown: 30, // 倒计时时间
2025-03-04 16:13:46 +08:00
yongdianlist:[]
}
},
onLoad(option) {
this.id = option.id
this.deviceId = option.deviceId
this.name = option.name
this.$u.put(`/app/bill/${this.id}/refreshPayResult`).then(res => {
this.getDevice()
})
2025-02-11 17:34:32 +08:00
if(option.deviceId){
this.ver_dataflag = 3
xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent)
2025-02-15 14:15:36 +08:00
this.startTimerdingshi()
2025-02-11 17:34:32 +08:00
}else{
xBlufi.notifyStartDiscoverBle({'isStart': true})
xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent)
}
if (option.flag) {
this.opflag = option.flag
}
setTimeout(()=>{
this.startTimerone()
},1500)
},
computed: {
},
onUnload: function() {
2025-03-04 16:13:46 +08:00
console.log("unload");
this.stopTimer();
2025-02-15 14:15:36 +08:00
this.clearTimer()
clearInterval(this.timerone);
this.timerone= null
xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent);
xBlufi.notifyConnectBle({
2025-02-11 17:34:32 +08:00
isStart: false,
deviceId: this.deviceId,
name: this.name
})
},
mounted() {
// 组件挂载后启动定时器
},
// 分享到好友(会话)
onShareAppMessage: function() {
return {
title: '创想物联',
path: '/pages/shouye/index'
}
},
// 分享到朋友圈
onShareTimeline: function() {
return {
title: '创想物联',
query: '',
path: '/pages/shouye/index'
}
},
onShow() {
clearInterval(this.timerIds);
this.timeday = ''
setTimeout(() => {
this.startTimers()
this.gethuidaio()
if (this.id) {
//判断有没有id 没有的话则直接返回首页
} else {
uni.reLaunch({
url: '/pages/shouye/index'
})
}
}, 1000)
2025-02-27 17:56:35 +08:00
console.log("页面显示");
this.handleScreenOn();
},
beforeDestroy() {
uni.navigateBack()
// 组件销毁前清除定时器,防止内存泄漏
if (this.timerIds) {
clearInterval(this.timerIds);
}
if (this.timer) {
clearInterval(this.timer)
this.timer = null;
console.log('已销毁')
}
},
2025-02-27 17:56:35 +08:00
onHide() {
2025-03-04 16:13:46 +08:00
console.log("页面隐藏")
this.handleScreenOff()
2025-02-27 17:56:35 +08:00
uni.navigateBack()
},
methods: {
2025-02-27 17:56:35 +08:00
// 处理息屏事件
2025-03-04 16:13:46 +08:00
handleScreenOff() {
2025-03-12 17:04:47 +08:00
console.log("处理息屏事件")
2025-03-04 16:13:46 +08:00
xBlufi.notifyConnectBle({
isStart: false,
deviceId: this.deviceId,
name: this.name
})
this.clearTimer() // 倒计时结束,清除定时器
uni.reLaunch({
url:'/pages/shouye/index'
})
},
// 处理亮屏事件
handleScreenOn() {
console.log("处理亮屏事件");
},
2025-02-15 14:15:36 +08:00
// 启动定时器
startTimerdingshi() {
let that = this
2025-03-12 17:04:47 +08:00
that.clearTimer() // 先清除之前的定时器
2025-02-15 14:15:36 +08:00
that.timedingshi = setInterval(() => {
2025-03-12 17:04:47 +08:00
that.countdown-- // 倒计时减 1
console.log(that.countdown,that.deviceId)
2025-02-15 14:15:36 +08:00
if (that.countdown <= 0) {
xBlufi.notifyConnectBle({
isStart: false,
deviceId: that.deviceId,
name: that.name
})
that.clearTimer() // 倒计时结束,清除定时器
uni.reLaunch({
url:'/pages/shouye/index'
})
}
}, 1000); // 每秒执行一次
},
// 清除定时器
clearTimer() {
if (this.timedingshi) {
2025-03-12 17:04:47 +08:00
clearInterval(this.timedingshi) // 清除定时器
this.timedingshi = null
2025-02-15 14:15:36 +08:00
}
},
// 点击续单 跳转到重新下单
btnxudan(){
let that = this
uni.showModal({
title: '温馨提示',
content: '您是否需要前去续单?',
showCancel: true,
success: function(res) {
if (res.confirm) {
uni.navigateTo({
url:'/page_components/fuwu/index?id=' + that.sbobj.deviceNo
})
} else if (res.cancel) {
console.log('取消'); // 用户点击取消
}
}
})
},
start() {
this.timerIds = setInterval(() => {
// 首先处理秒数的递减
if (this.timeday.seconds > 0) {
2025-03-12 17:04:47 +08:00
this.timeday.seconds--
} else {
// 如果秒数为0则处理分钟数的递减并重置秒数为59
if (this.timeday.minutes > 0) {
2025-03-12 17:04:47 +08:00
this.timeday.seconds = 59
this.timeday.minutes--
} else {
// 如果分钟数为0则处理小时数的递减并重置分钟和秒数为59
if (this.timeday.hours > 0) {
2025-03-12 17:04:47 +08:00
this.timeday.minutes = 59
this.timeday.seconds = 59
this.timeday.hours--
} else {
// 如果小时数为0则处理天数的递减并重置小时、分钟和秒数为最大值
if (this.timeday.days > 0) {
2025-03-12 17:04:47 +08:00
this.timeday.hours = 23
this.timeday.minutes = 59
this.timeday.seconds = 59
this.timeday.days--
} else {
// 当天数也为0时清除定时器并执行所需操作
2025-03-12 17:04:47 +08:00
clearInterval(this.timerIds)
this.getDevice()
return // 这里可以添加return来退出函数但实际上由于setInterval是异步的它不会阻止后续的console.log执行但在这个上下文中它是多余的
}
}
}
}
// 格式化时间并打印到控制台
2025-03-12 17:04:47 +08:00
this.formattedTime = this.formatTime(this.timeday)
}, 1000) // 每1000毫秒1秒执行一次
},
formatTime(timeObj) {
// 根据时间的不同部分构建格式化的字符串
if (timeObj.days > 0) {
2025-03-12 17:04:47 +08:00
return `${timeObj.days}${timeObj.hours.toString().padStart(2, '0')}小时 ${timeObj.minutes.toString().padStart(2, '0')}分钟 ${timeObj.seconds.toString().padStart(2, '0')}`
} else if (timeObj.hours > 0) {
2025-03-12 17:04:47 +08:00
return `${timeObj.hours}小时 ${timeObj.minutes.toString().padStart(2, '0')}分钟 ${timeObj.seconds.toString().padStart(2, '0')}`
} else if (timeObj.minutes > 0) {
2025-03-12 17:04:47 +08:00
return `${timeObj.minutes}分钟 ${timeObj.seconds.toString().padStart(2, '0')}`
} else {
2025-03-12 17:04:47 +08:00
return `${timeObj.seconds}`
}
},
startTimerone() {
// 清除之前可能存在的定时器,防止重复设置
2025-03-12 17:04:47 +08:00
clearInterval(this.timerone)
this.timerone = setInterval(() => {
this.shuaxin()
this.gethuidaio()
2025-03-12 17:04:47 +08:00
}, 2000)
},
// 判断是否充值失败 充值失败启用蓝牙离线充值
gethuidaio() {
this.$u.get('/app/bill/recharge/device/fail/list').then(res => {
if (res.code == 200) {
if (res.data.length > 0) {
this.czflag = true
this.dingobj = res.data
2025-03-12 17:04:47 +08:00
clearInterval(this.timerone)
this.timerone= null
} else {
uni.removeStorageSync('time')
}
}
})
},
// 点击进行蓝牙离线充值
tocz() {
this.czflag = false
uni.navigateTo({
url: '/page_fenbao/chongzhi?dingobj=' + JSON.stringify(this.dingobj)
})
},
// 点击拨打客服电话
btncall(){
let phoneNumber = ''
phoneNumber = this.sbobj.userMobile
uni.makePhoneCall({
phoneNumber: phoneNumber,
success: function(res) {
console.log('拨打电话成功', res)
},
fail: function(err) {
console.error('拨打电话失败', err)
uni.showToast({
title: '拨打电话失败',
icon: 'none'
})
}
})
},
// 开启和关闭
btnkq() {
if (this.onlineStatus == 1) {
if (this.tdtxt == '开启') {
this.$u.put(`/app/bill/switchDevice?billId=${this.billId}&open=false`).then((res) => {
if (res.code == 200) {
this.tdtxt = '关闭'
this.imgflag = false
uni.showToast({
title: res.msg,
icon: 'success',
duration: 2000
})
} else {
this.imgflag = true
this.tdtxt = '开启'
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
})
} else {
this.$u.put(`/app/bill/switchDevice?billId=${this.billId}&open=true`).then((res) => {
if (res.code == 200) {
this.imgflag = true
this.tdtxt = '开启'
uni.showToast({
title: res.msg,
icon: 'success',
duration: 2000
})
} else {
this.imgflag = false
this.tdtxt = '关闭'
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
})
}
} else {
2025-03-12 17:04:47 +08:00
let currentTime = new Date()
let endTimeString = this.detaobj.suitEndTime
let endTimeParts = endTimeString.split(/[- :]/)
2025-03-12 17:04:47 +08:00
let endTime = new Date(endTimeParts[0], endTimeParts[1] - 1, endTimeParts[2], endTimeParts[3], endTimeParts[4], endTimeParts[5])
// 比较当前时间和结束时间
if (currentTime > endTime) {
uni.showToast({
title: '该订单已结束,不能进行操作',
icon: 'none',
duration: 2000
})
} else {
2025-02-11 17:34:32 +08:00
if (this.ver_dataflag != 3) {
let that = this
uni.showModal({
title: '温馨提示',
content: '正在连接蓝牙,请尽量靠近设备!',
showCancel: false,
success: function(res) {
}
})
} else {
// console.log(this.tdtxt,'020202');
if (this.tdtxt == '开启') {
2025-03-12 17:04:47 +08:00
this.countdown = 30 // 重置倒计时时间
2025-02-15 14:15:36 +08:00
this.startTimerdingshi()
let that = this
uni.getNetworkType({
success(res) {
if (res.networkType !== 'none') {
that.tdtxt = '关闭'
that.imgflag = false
xBlufi.notifySendCustomData({
customData: 'close'
})
xBlufi.notifySendCustomData({
customData: '11close'
})
let datas = {
mac:that.qrResult,
reason:'用户临时开关关闭',
command:'11close',
result:'成功'
}
2025-03-12 17:04:47 +08:00
console.log(datas,'111')
}
}
})
} else {
2025-03-12 17:04:47 +08:00
this.countdown = 30 // 重置倒计时时间
2025-02-15 14:15:36 +08:00
this.startTimerdingshi()
let that = this
uni.getNetworkType({
success(res) {
if (res.networkType !== 'none') {
that.tdtxt = '开启'
that.imgflag = true
xBlufi.notifySendCustomData({
customData: 'open'
})
xBlufi.notifySendCustomData({
customData: '11open'
})
let datas = {
mac:that.qrResult,
reason:'用户临时开关开启',
command:'11open',
result:'成功'
}
that.$u.post(`/app/commandLog/bluetooth`,datas).then(res => {})
}
}
})
}
}
}
}
},
// 点击进行强刷数据
shuaxin(txt){
clearInterval(this.timerIds);
this.timeday = ''
this.$u.get(`/app/device/${this.sbid}/refreshIot`).then((res) => {
if(res.code == 200){
this.getDevice()
this.getsb()
if(txt == 1){
uni.showToast({
title: res.msg,
icon: 'success',
duration: 1500
})
}
}else{
uni.showToast({
title: res.msg,
icon: 'none',
duration: 1500
})
}
})
},
// 点击默认返回首页
btns() {
uni.reLaunch({
url: '/pages/shouye/index'
})
},
// 点击结束订单
btnjieshu() {
if (this.detaobj.suitFeeType == 2 || this.detaobj.suitFeeType == 3){
if (this.onlineStatus == 1) {
let that = this
uni.showModal({
title: '提示',
content: '您确定要提前结束订单吗?',
success: function(res) {
if (res.confirm) {
let data = {
billId: that.billId
}
that.$u.put(`/app/bill/endUse`, data).then(res => {
if (res.code == 200) {
uni.showToast({
title: '结束成功',
icon: 'success',
duration: 1000
})
setTimeout(()=>{
uni.reLaunch({
url: '/pages/shouye/index'
})
},1000)
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 1000
})
setTimeout(()=>{
uni.reLaunch({
url: '/pages/shouye/index'
})
},1000)
}
})
}
}
})
} else {
2025-02-11 17:34:32 +08:00
if (this.ver_dataflag != 3) {
let that = this
uni.showModal({
title: '温馨提示',
content: '正在连接蓝牙,请尽量靠近设备。',
showCancel: false,
success: function(res) {
}
})
} else {
2025-02-27 17:56:35 +08:00
let that = this
uni.showModal({
title: '提示',
content: '您确定要提前结束订单吗?',
success: function(res) {
if (res.confirm) {
that.jieshufalg = true
let data = {
billId: that.billId,
}
that.$u.put(`/app/bill/endUse`, data).then(res => {
if (res.code == 200) {
setTimeout(() => {
xBlufi.notifySendCustomData({
customData: 'time0@'
})
xBlufi.notifySendCustomData({
customData: '11time0@'
})
let datas = {
mac:that.qrResult,
reason:'用户结束订单操作',
command:'11time0@',
result:'成功'
}
that.$u.post(`/app/commandLog/bluetooth`,datas).then(res => {})
that.jieshufalg = false
uni.showToast({
title:'结束成功',
icon: 'success',
duration: 2000
})
xBlufi.notifyStartDiscoverBle({
'isStart': false
})
xBlufi.notifyConnectBle({
isStart: false,
deviceId: that.deviceId,
name: that.name
})
setTimeout(() => {
uni.reLaunch({
url: '/pages/shouye/index'
})
}, 2000)
}, 1000)
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
2025-02-11 17:34:32 +08:00
})
2025-02-27 17:56:35 +08:00
}
}
})
}
}
}else{
2025-03-12 17:04:47 +08:00
let currentTime = new Date()
let endTimeString = this.detaobj.suitEndTime
let endTimeParts = endTimeString.split(/[- :]/)
2025-03-12 17:04:47 +08:00
let endTime = new Date(endTimeParts[0], endTimeParts[1] - 1, endTimeParts[2], endTimeParts[3], endTimeParts[4], endTimeParts[5])
// 比较当前时间和结束时间
if (currentTime > endTime) {
uni.reLaunch({
url:'/pages/shouye/index'
})
}else if (this.onlineStatus == 1) {
let that = this
uni.showModal({
title: '提示',
content: '您确定要提前结束订单吗?',
success: function(res) {
if (res.confirm) {
let data = {
billId: that.billId
}
that.$u.put(`/app/bill/endUse`, data).then(res => {
if (res.code == 200) {
uni.showToast({
title: '结束成功',
icon: 'success',
duration: 1000
})
2025-02-11 17:34:32 +08:00
xBlufi.notifyConnectBle({
isStart: false,
deviceId: that.deviceId,
name: that.name
})
setTimeout(()=>{
uni.reLaunch({
url: '/pages/shouye/index'
})
},500)
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 1000
})
setTimeout(()=>{
uni.reLaunch({
url: '/pages/shouye/index'
})
},500)
}
})
}
}
})
} else {
2025-02-11 17:34:32 +08:00
if (this.ver_dataflag != 3) {
let that = this
uni.showModal({
title: '温馨提示',
content: '正在连接蓝牙,请尽量靠近设备',
showCancel: false,
success: function(res) {
}
})
} else {
2025-02-27 17:56:35 +08:00
let that = this
uni.showModal({
title: '提示',
content: '您确定要提前结束订单吗?',
success: function(res) {
if (res.confirm) {
that.jieshufalg = true
let data = {
billId: that.billId,
}
that.$u.put(`/app/bill/endUse`, data).then(res => {
if (res.code == 200) {
setTimeout(() => {
xBlufi.notifySendCustomData({
customData: 'time0@'
})
xBlufi.notifySendCustomData({
customData: '11time0@'
})
let datas = {
mac:that.qrResult,
reason:'用户结束订单操作',
command:'11time0@',
result:'成功'
}
that.$u.post(`/app/commandLog/bluetooth`,datas).then(res => {})
that.jieshufalg = false
uni.showToast({
title:'结束成功',
icon: 'success',
duration: 2000
})
setTimeout(() => {
uni.reLaunch({
url: '/pages/shouye/index'
})
}, 2000)
}, 1000)
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
})
2025-02-27 17:56:35 +08:00
}
}
})
}
}
}
},
// 每一分钟请求更新一次
startTimers() {
// 确保没有重复的定时器
if (this.timerId !== null) {
clearInterval(this.timerId)
}
// 设置定时器,每分钟执行一次 timerCallback 函数
this.timerId = setInterval(() => {
this.shuaxin()
}, 60000);
},
// 销毁定时器
stopTimer() {
if (this.timerId !== null) {
clearInterval(this.timerId)
this.timerId = null
}
},
// 预估金额
getprice() {
this.$u.get(`app/bill/calcPrice?billId=${this.billId}`).then(res => {
if (res.code == 200) {
this.feeprice = res.data.toFixed(2)
}
})
},
2025-03-04 16:13:46 +08:00
// 获取分时段用电量
getyongdian() {
this.$u.get(`/app/billEleRecord/listByBill?billId=${this.billId}`).then(res => {
if (res.code == 200) {
this.yongdianlist = res.data
}
})
},
// 获取订单详情
getDevice() {
this.$u.get(`/app/bill/byNo/${this.id}`).then(res => {
if (res.code == 200) {
this.sbid = res.data.deviceId
this.suitStartEle = res.data.suitStartEle //设备开始前用电
this.getsb()
this.detaobj = res.data
this.billId = res.data.billId
this.orderno = res.data.billNo
2025-03-04 16:13:46 +08:00
this.getyongdian()
if(res.data.deviceRechargeStatus == 1){
2025-03-12 17:04:47 +08:00
clearInterval(this.timerone)
this.timerone = null
}
this.getprice()
let dateTimeString = res.data.suitStartTime // 示例时间字符串
2025-03-12 17:04:47 +08:00
this.timeDifferenceString = this.calculateTimeDifference(dateTimeString) // 调用函数
if (res.data.suitGearAmount.length > 0) {
this.newArr = []
for (let i = 0; i < res.data.suitGearTime.length; i++) {
let value = res.data.suitGearAmount[res.data.suitGearTime[i]];
this.newArr.push(value)
}
}
if (this.detaobj.suitEndEle) {
let du = Number(this.detaobj.suitEndEle) - Number(this.detaobj.deviceTotalEle)
this.du = du.toFixed(2)
}
if (res.data.deviceExpireTime == null) {
this.timeday = 0
console.log(res.data.deviceExpireTime,'000');
} else {
console.log(res.data.deviceExpireTime,'111');
let expireTimeStr = ''
expireTimeStr = res.data.deviceExpireTime
let expireTimeParts = expireTimeStr.split(" ")
let expireDateParts = expireTimeParts[0].split("-")
let expireTimePartsTime = expireTimeParts[1].split(":")
let expireDate = new Date(expireDateParts[0], expireDateParts[1] - 1, expireDateParts[2], expireTimePartsTime[0], expireTimePartsTime[1], expireTimePartsTime[2])
let now = new Date()
let differenceInMs = expireDate - now
this.timeday == ''
if (differenceInMs <= 0) {
this.timeday = 0
} else {
if (this.timeday == '') {
this.timeday = this.formatMilliseconds(differenceInMs)
this.start()
}
}
}
}
})
},
getsb() {
this.$u.get(`/app/device/${this.sbid}`).then(res => {
if (res.code == 200) {
this.sbobj = res.data
if (this.sbobj.powerStatus == 0) {
this.imgflag = false
} else {
this.imgflag = true
}
this.onlineStatus = res.data.onlineStatus
this.qrResult = res.data.mac
2025-02-15 14:15:36 +08:00
if(this.ver_dataflag != 3){
this.deviceId = res.data.mac.match(/.{2}/g).reverse().join(':')
}
2025-02-11 17:34:32 +08:00
this.modelId = res.data.modelTags
if(this.ver_dataflag != 3){
this.getlanya()
}
this.totalElectriQuantity = res.data.totalElectriQuantity
}
})
},
2025-02-11 17:34:32 +08:00
getlanya(){
if (this.ver_dataflag != 3) {
this.czflag = true
this.ver_dataflag = 2
let that = this
if (that.deviceId != '') {
let systemInfo = uni.getSystemInfoSync()
2025-03-04 16:13:46 +08:00
if (systemInfo.platform == 'android') {
that.modelId.some(item => {
if(item == 2){
console.log('配网');
let zuih = ''
if(that.deviceId.slice(-1) == 8){
zuih = 'A'
}else if(that.deviceId.slice(-1) == 9){
zuih = 'B'
}else if(that.deviceId.slice(-1) == 'A'){
zuih = 'C'
}else if(that.deviceId.slice(-1) == 'B'){
zuih = 'D'
}else if(that.deviceId.slice(-1) == 'C'){
zuih = 'E'
}else if(that.deviceId.slice(-1) == 'D'){
zuih = 'F'
}else{
zuih = Number(that.deviceId.slice(-1)) + 2
}
that.deviceId = that.deviceId.slice(0, -1) + zuih
console.log(that.modelId,zuih,that.deviceId.slice(0, -1),'...........')
xBlufi.notifyStartDiscoverBle({
'isStart': false
})
console.log("进入蓝牙连接", that.deviceId)
console.log("进入that.name", that.name)
xBlufi.notifyConnectBle({
isStart: true,
deviceId: that.deviceId,
name: that.name
})
}else{
console.log('无配网');
xBlufi.notifyStartDiscoverBle({
'isStart': false
})
console.log("进入蓝牙连接", that.deviceId)
console.log("进入that.name", that.name)
xBlufi.notifyConnectBle({
isStart: true,
deviceId: that.deviceId,
name: that.name
})
}
})
} else if (systemInfo.platform == 'ios') {
// 当前设备是 iOS
that.findDevice()
2025-02-11 17:34:32 +08:00
}
}
}
},
findDevice() {
// 使用 find 方法查找匹配的设备
const matchedDevice = this.devicesarr.find(device => {
console.log(device.name, this.qrResult, '111')
console.log("IOSMAC", device)
return device.name.slice(-12) == this.qrResult.slice(-12)
})
if (matchedDevice) {
// 找到匹配的设备
xBlufi.notifyStartDiscoverBle({
'isStart': false
})
xBlufi.notifyConnectBle({
isStart: true,
deviceId: matchedDevice.deviceId,
name: matchedDevice.name
})
this.deviceId = matchedDevice.deviceId
this.name = matchedDevice.name
console.log(this.deviceId, '11221')
} else {
console.log("未找到匹配的设备,继续查找...")
setTimeout(this.findDevice.bind(this), 1000) // 使用 bind 保持 this 上下文
}
},
calculateTimeDifference(dateTimeString) {
// 将时间字符串转换为Date对象
const date = new Date(dateTimeString)
// 获取当前时间
const now = new Date()
// 计算时间差(毫秒)
const diff = now - date
// 将毫秒转换为天、小时、分钟和秒
const days = Math.floor(diff / (1000 * 60 * 60 * 24))
const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))
const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60))
const seconds = Math.floor((diff % (1000 * 60)) / 1000)
// 创建一个对象来存储结果,并忽略零值
const timeDifference = {
days: days > 0 ? days : undefined,
hours: hours > 0 ? hours : undefined,
minutes: minutes > 0 ? minutes : undefined,
seconds: seconds > 0 ? seconds : undefined
}
// 转换为字符串,忽略未定义的属性
let result = ''
if (timeDifference.days !== undefined) {
result += `${timeDifference.days}`
}
if (timeDifference.hours !== undefined) {
result += `${timeDifference.hours}`
}
if (timeDifference.minutes !== undefined) {
result += `${timeDifference.minutes + 1}`
}
return result
},
// 计算天时分秒
formatMilliseconds(milliseconds) {
// 计算天数
let days = Math.floor(milliseconds / (1000 * 60 * 60 * 24))
// 计算剩余的小时数
let hours = Math.floor((milliseconds % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))
// 计算剩余的分钟数
let minutes = Math.floor((milliseconds % (1000 * 60 * 60)) / (1000 * 60))
// 计算剩余的秒数
let seconds = Math.floor((milliseconds % (1000 * 60)) / 1000)
// 返回一个对象,包含天、小时、分钟和秒
return {
days: days,
hours: hours,
minutes: minutes,
seconds: seconds
}
},
funListenDeviceMsgEvent: function(options) {
switch (options.type) {
2025-02-11 17:34:32 +08:00
case xBlufi.XBLUFI_TYPE.TYPE_STATUS_CONNECTED:
if (!options.result) {
this.ver_dataflag = 1
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS:
if (options.result) {
2025-02-11 17:34:32 +08:00
this.devicesarr = options.data
2025-03-04 16:13:46 +08:00
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_CONNECTED:
console.log("连接回调:" + JSON.stringify(options))
2025-02-11 17:34:32 +08:00
if (options.result == true) {
// console.log('125451245')
setTimeout(()=>{
this.ver_dataflag = 3
},2000)
2025-02-15 14:15:36 +08:00
this.startTimerdingshi()
2025-02-11 17:34:32 +08:00
xBlufi.notifyInitBleEsp32({
deviceId: this.deviceId
})
xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvents)
this.deviceIds = options.data.deviceId
this.name = this.name
2025-03-12 17:04:47 +08:00
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA:
this.ver_data = this.parseCustomData(options.data)
console.log("1收到设备发来的自定义数据结果", this.ver_data)
this.temperature = this.ver_data.temperature / 1000
this.ver_dataflag = 3
this.jieshuflag = false
this.jieshufalg = false
uni.hideLoading()
break
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_START:
if (!options.result) {
this.lanyaflag = true
return
} else {
this.lanyaflag = false
}
break
}
},
parseCustomData(data) {
// 将字符串按照 "@" 分割成数组
const dataArray = data.split('@')
// 初始化一个空对象来存储解析后的数据
const parsedData = {}
// 前缀到属性名的映射
const prefixMap = {
'V': 'voltage',
'S': 'switchState',
'A': 'current',
'P': 'power',
'M': 'remainingPower',
'T': 'setMode',
'W': 'temperature'
};
// 遍历数组并解析每个字段
for (let i = 0; i < dataArray.length; i++) {
const field = dataArray[i];
for (const prefix in prefixMap) {
if (field.startsWith(prefix)) {
// 去除前缀并将剩余部分转换为适当的类型(这里默认为浮点数或字符串)
const value = field.substring(1);
const propertyName = prefixMap[prefix]
// 根据需要,这里可以添加更复杂的类型转换逻辑
// 但为了简单起见,我们总是尝试将其转换为浮点数,如果失败则保留为字符串
parsedData[propertyName] = isNaN(parseFloat(value)) ? value : parseFloat(value)
// 找到了匹配的前缀,跳出内层循环
break
}
}
}
// 返回解析后的数据对象
return parsedData
},
}
}
</script>
<style lang="scss">
2025-03-04 16:13:46 +08:00
/deep/ .u-collapse-title{
font-weight: 600;
font-size: 32rpx;
}
/deep/ .u-title {
padding-bottom: 22rpx;
}
/deep/ .u-icon__icon {
2025-03-04 16:13:46 +08:00
padding-bottom: 12rpx;
}
.xuanfu{
position: fixed;
top: 66%;
right: 0;
image{
width: 114rpx;
height: 114rpx;
margin-top: 40rpx;
display: block;
}
}
.imgtel{
position: fixed;
left: 36rpx;
bottom: 78rpx;
width: 90rpx;
height: 90rpx;
z-index: 99;
}
page {
background-color: #F7FAFE;
padding: 0 30rpx;
box-sizing: border-box;
2025-02-27 17:56:35 +08:00
-ms-overflow-style: none;
/* 去除IE和Edge的默认滚动条 */
scrollbar-width: none;
/* 去除Firefox的默认滚动条 */
&::-webkit-scrollbar {
display: none;
}
}
.wz {
font-weight: 400;
font-size: 32rpx;
margin-top: 30rpx;
view{
display: flex;
align-items: center;
image{
width: 80rpx;
height: 80rpx;
margin-right: 10rpx;
}
}
}
.card2 {
2025-03-04 16:13:46 +08:00
padding-bottom: 30rpx;box-sizing: border-box;margin-top: 0;margin-top: 20rpx;padding: 0 20rpx;box-sizing: border-box;box-shadow: 0rpx 10rpx 64rpx 0rpx rgba(0,0,0,0.08);
margin-top: 30rpx;
max-height: 314rpx;
border-radius: 28rpx;
.aa{
padding-left: 40rpx;
padding-right: 40rpx;
box-sizing: border-box;
display: flex;
justify-content: space-between;
margin-top: 10rpx;
font-size: 28rpx;
color: #808080;
}
.tit {
margin-left: 40rpx;
font-size: 36rpx;
color: #3D3D3D;
font-weight: 600;
}
.cont_box {
margin-top: 32rpx;
display: flex;
flex-wrap: nowrap;
justify-content: space-around;
.cont {
width: 25%;
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
text-align: center;
.top {
width: 100%;
font-size: 32rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 400;
color: #262B37;
}
.bot {
margin-top: 20rpx;
font-size: 26rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 400;
color: #262B37;
}
}
}
}
.truebox {
width: 500rpx;
max-height: 380rpx;
border-radius: 20rpx;
background-color: #fff;
position: fixed;
top: 40%;
left: 50%;
transform: translateX(-50%);
z-index: 99;
padding: 30rpx;
box-sizing: border-box;
.titvalue {
width: 100%;
text-align: center;
margin-top: 30rpx;
font-size: 32rpx;
}
.truebtn {
display: flex;
margin-top: 30rpx;
.quxiao {
border-right: 1px solid #ccc;
}
view {
width: 50%;
text-align: center;
height: 90rpx;
line-height: 90rpx;
border-top: 1px solid #ccc;
}
}
}
.jieshu {
width: 558rpx;
height: 90rpx;
line-height: 90rpx;
background: #8883F0;
border-radius: 54rpx 54rpx 54rpx 54rpx;
font-size: 36rpx;
color: #FFFFFF;
text-align: center;
position: fixed;
2025-03-04 16:13:46 +08:00
bottom: 50rpx;
left: 50%;
transform: translateX(-50%);
}
.zujie {
margin-top: 32rpx;
2025-03-04 16:13:46 +08:00
width: 100%;
background: #FFFFFF;
border-radius: 20rpx;
padding: 10rpx 20rpx;
box-sizing: border-box;
box-shadow: 0rpx 10rpx 64rpx 0rpx rgba(0,0,0,0.08);
.toptit {
font-size: 32rpx;
color: #333333;
font-weight: 600;
}
.emilist {
display: flex;
justify-content: space-between;
2025-03-04 16:13:46 +08:00
margin-bottom: 28rpx;
view {
font-size: 24rpx;
color: #808080;
}
}
}
.price_list {
2025-03-04 16:13:46 +08:00
padding: 20rpx;
margin-top: 30rpx;
box-sizing: border-box;
2025-03-04 16:13:46 +08:00
background-color: #fff;
border-radius: 20rpx;
.top_price {
font-size: 32rpx;
color: #333333;
font-weight: 600;
2025-03-04 16:13:46 +08:00
margin-bottom: 14rpx;
}
.jisuan {
font-size: 24rpx;
color: #333333;
2025-03-04 16:13:46 +08:00
margin-top: 16rpx;
margin-bottom: 10rpx;
}
.qian {
width: 100%;
display: flex;
justify-content: space-between;
.yuan {
font-size: 24rpx;
color: #333333;
}
.yajin {
font-size: 24rpx;
color: #808080;
}
}
}
.list_box {
.ulbox {
width: 100%;
overflow: scroll;
2025-03-04 16:13:46 +08:00
margin-top: 20rpx;
.ulli {
display: flex;
width: 170vh;
.li {
flex: 1;
border: 1rpx solid #ccc;
text-align: center;
font-size: 32rpx;
color: #8883F0;
height: 88rpx;
line-height: 88rpx;
}
}
.olli {
display: flex;
width: 170vh;
.li {
flex: 1;
border: 1rpx solid #ccc;
text-align: center;
font-size: 22rpx;
color: #262B37;
height: 88rpx;
line-height: 88rpx;
}
}
}
}
.time_list {
width: 100%;
box-sizing: border-box;
.time_top {
display: flex;
justify-content: space-between;
margin-top: 20rpx;
view {
font-size: 40rpx;
color: #3D3D3D;
font-weight: 600;
}
}
.time_bot {
display: flex;
justify-content: space-between;
margin-top: 30rpx;
view {
font-size: 24rpx;
color: #666666;
}
}
}
.dltop {
width: 100%;
height: 224rpx;
background: #8883F0;
border-radius: 16rpx 16rpx 16rpx 16rpx;
margin: auto;
2025-03-04 16:13:46 +08:00
// margin-top: 36rpx;
padding-bottom: 20rpx;
box-sizing: border-box;
.dian_list {
display: flex;
justify-content: space-between;
text-align: center;
font-size: 34rpx;
color: #FFFFFF;
view {
width: 180rpx;
text-align: center;
margin-top: 22rpx;
}
}
.botwz {
font-size: 28rpx;
color: #FFFFFF;
width: 100%;
text-align: center;
}
}
.mask {
width: 750rpx;
height: 100vh;
background: #000000;
border-radius: 0rpx 0rpx 0rpx 0rpx;
opacity: 0.2;
z-index: 1;
position: fixed;
top: 0;
left: 0;
}
.tanc {
width: 610rpx;
height: 282rpx;
background: #FFFFFF;
border-radius: 30rpx 30rpx 30rpx 30rpx;
position: fixed;
top: 628rpx;
left: 50%;
transform: translateX(-50%);
z-index: 2;
.tit {
width: 100%;
text-align: center;
margin-top: 28rpx;
font-weight: 500;
font-size: 32rpx;
color: #3D3D3D;
}
input {
width: 504rpx;
height: 62rpx;
background: #EEEEEE;
border-radius: 6rpx 6rpx 6rpx 6rpx;
margin: auto;
margin-top: 22rpx;
padding-left: 20rpx;
}
.xian {
width: 610rpx;
height: 2rpx;
background: #D8D8D8;
border-radius: 0rpx 0rpx 0rpx 0rpx;
margin-top: 26rpx;
}
.anniu {
display: flex;
justify-content: space-between;
height: 98rpx;
text {
padding: 24rpx;
text-align: center;
box-sizing: border-box;
font-weight: 500;
font-size: 36rpx;
color: #3D3D3D;
display: inline-block;
width: 100%;
height: 100rpx;
}
}
}
.masks {
width: 100%;
height: 100vh;
position: fixed;
top: 0;
left: 50%;
transform: translateX(-50%);
background-color: #000;
opacity: .6;
z-index: 998;
}
.tip_box {
position: fixed;
left: 72rpx;
top: 700rpx;
width: 610rpx;
background: #F7FAFE;
border-radius: 30rpx 30rpx 30rpx 30rpx;
z-index: 10000000;
.top {
padding: 52rpx 38rpx 42rpx 36rpx;
.txt {
width: 100%;
text-align: center;
font-weight: 500;
font-size: 32rpx;
color: #3D3D3D;
}
}
.bot {
border-top: 2rpx solid #D8D8D8;
display: flex;
flex-wrap: nowrap;
height: 100%;
.bot_left {
width: 50%;
height: 98rpx;
display: flex;
align-items: center;
justify-content: center;
font-weight: 500;
font-size: 36rpx;
color: #3D3D3D;
}
.bot_right {
width: 50%;
height: 98rpx;
display: flex;
align-items: center;
justify-content: center;
border-left: 2rpx solid #D8D8D8;
font-weight: 500;
font-size: 36rpx;
color: #8883F0;
}
}
}
.page {
2025-02-27 17:56:35 +08:00
-ms-overflow-style: none;
/* 去除IE和Edge的默认滚动条 */
scrollbar-width: none;
/* 去除Firefox的默认滚动条 */
&::-webkit-scrollbar {
display: none;
}
.zhuhu {
margin-top: 60rpx;
padding: 0 40rpx;
.card1 {
padding: 34rpx 0 0 40rpx;
width: 670rpx;
height: 260rpx;
background: #FFFFFF;
box-shadow: 0rpx 14rpx 35rpx 0rpx rgba(53, 140, 255, 0.1);
border-radius: 28rpx 28rpx 0rpx 0rpx;
.top {
display: flex;
flex-wrap: nowrap;
justify-content: space-between;
align-items: center;
.left {
font-size: 35rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 400;
color: #8883F0;
}
.right {
margin-right: 56rpx;
.img1 {
width: 76rpx;
height: 76rpx;
}
}
}
.mid {
margin-top: 20rpx;
display: flex;
flex-wrap: nowrap;
align-content: flex-start;
.mid_left {
image {
width: 160rpx;
height: 160rpx;
border-radius: 20rpx;
}
}
.mid_right {
margin-left: 40rpx;
display: flex;
flex-wrap: wrap;
.mid_top {
width: 100%;
font-size: 42rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 400;
color: #262B37;
}
.mid_bot {
display: flex;
flex-wrap: nowrap;
align-items: center;
.txt {
font-size: 26rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 400;
color: #95989D;
}
.tip {
display: flex;
align-items: center;
justify-content: center;
margin-left: 19rpx;
// width: 38rpx;
// height: 23rpx;
padding: 0 10rpx;
box-sizing: border-box;
background: rgba(204, 204, 204, 0);
opacity: 1;
border: 2rpx solid #8883F0;
border-radius: 15rpx;
font-size: 26rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 400;
color: #8883F0;
}
}
}
}
.bot {
margin-top: 53rpx;
display: flex;
flex-wrap: nowrap;
align-items: center;
.bot_left {
width: 210rpx;
height: 180rpx;
margin-right: 34rpx;
.echarts {
// width: 210rpx;
height: 200rpx;
.uni-ec-canvas {
width: 100%;
height: 100rpx !important;
display: block;
// margin-top: 30rpx;
}
}
}
.bot_right {
// margin-top: 50rpx;
display: flex;
// flex-wrap: nowrap;
width: 100%;
justify-content: space-between;
padding-left: 210rpx;
padding-right: 80rpx;
box-sizing: border-box;
.cont {
.tit {
font-size: 28rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 600;
color: #262B37;
line-height: 49rpx;
}
.txt {
font-size: 26rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 400;
color: #262B37;
}
}
}
}
}
.bot_right {
// margin-top: 50rpx;
display: flex;
// flex-wrap: nowrap;
width: 100%;
justify-content: space-between;
padding-left: 220rpx;
padding-right: 80rpx;
box-sizing: border-box;
.cont {
.tit {
font-size: 28rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 600;
color: #262B37;
line-height: 49rpx;
margin-left: 0;
}
.txt {
font-size: 26rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 400;
color: #262B37;
}
}
}
.card2 {
padding-top: 0rpx;
width: 100%;
height: 60rpx;
// background: #FFFFFF;
border-radius: 0 0 28rpx 28rpx;
2025-03-04 16:13:46 +08:00
padding-bottom: 30rpx;box-sizing: border-box;margin-top: 0;margin-top: 20rpx;padding: 0 20rpx;box-sizing: border-box;box-shadow: 0rpx 10rpx 64rpx 0rpx rgba(0,0,0,0.08);
.tit {
margin-left: 40rpx;
font-size: 35rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 400;
color: #8883F0;
}
.cont_box {
margin-top: 32rpx;
display: flex;
flex-wrap: nowrap;
justify-content: space-around;
.cont {
width: 25%;
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
text-align: center;
.top {
width: 110rpx;
font-size: 32rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 400;
color: #262B37;
}
.bot {
margin-top: 20rpx;
font-size: 26rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 400;
color: #262B37;
}
}
}
}
.card3 {
padding-top: 40rpx;
margin-top: 24rpx;
width: 670rpx;
// height: 318rpx;
background: #FFFFFF;
// box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(53, 140, 255, 0.1);
border-radius: 28rpx;
padding-bottom: 20rpx;
.tit {
margin-left: 40rpx;
font-size: 35rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 400;
color: #8883F0;
}
.cont_box {
// padding-left: 30rpx;
// padding-right: 30rpx;
padding: 0 40rpx;
margin-top: 32rpx;
display: flex;
flex-wrap: nowrap;
justify-content: space-around;
.cont:last-child {
margin-right: 0rpx;
}
.cont {
width: 112rpx;
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
margin-right: 80rpx;
.top {
image {
width: 56rpx;
height: 56rpx;
}
}
.bot {
margin-top: 15rpx;
font-size: 28rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 400;
color: #808080;
}
}
}
}
.button {
margin-left: 76rpx;
margin-top: 178rpx;
display: flex;
justify-content: center;
align-items: center;
width: 520rpx;
height: 104rpx;
background: #8883F0;
box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(42, 130, 228, 0.1);
border-radius: 52rpx 52rpx 52rpx 52rpx;
font-size: 32rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 400;
color: #FFFFFF;
}
}
}
2024-03-13 10:54:22 +08:00
</style>