2025-04-01 21:35:30 +08:00
|
|
|
|
<template>
|
|
|
|
|
|
<view class="page">
|
|
|
|
|
|
<u-navbar title="添加设备" :border-bottom="false" :background="bgc" title-color='#262B37' title-size='38'
|
2025-07-15 17:36:34 +08:00
|
|
|
|
height='50' :custom-back="btnfh"></u-navbar>
|
2025-04-01 21:35:30 +08:00
|
|
|
|
<view class="iptbox" @click="backpage()">
|
|
|
|
|
|
|
|
|
|
|
|
<input type="text" class="ips" v-model="mac" placeholder=" " style="margin-left: 32rpx;" disabled
|
|
|
|
|
|
placeholder-class="my-placeholder" />
|
|
|
|
|
|
<view class="iconfont icon-xiangyou1 ">
|
|
|
|
|
|
|
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="iptbox">
|
|
|
|
|
|
<view class="qrcode" @click="qrcode()">
|
|
|
|
|
|
<image src="https://api.ccttiot.com/smartmeter/img/static/uy7BNwAMIKwvstqFnRhs" mode=""></image>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<input type="text" class="ips" v-model="sn" placeholder="请扫描设备上的二维码" style="margin-left: 32rpx;"
|
|
|
|
|
|
placeholder-class="my-placeholder" />
|
|
|
|
|
|
</view>
|
2026-04-28 14:01:46 +08:00
|
|
|
|
<!-- <view class="iptbox" @click="kashow=true">
|
2025-08-19 17:02:14 +08:00
|
|
|
|
<view class="" v-if="kaname">
|
|
|
|
|
|
卡商:{{kaname}}
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="" v-else>
|
|
|
|
|
|
请点击选择卡商
|
|
|
|
|
|
</view>
|
2026-04-28 14:01:46 +08:00
|
|
|
|
</view> -->
|
|
|
|
|
|
<!-- <u-select v-model="kashow" :list="kalist" title='选择卡商' @confirm="confirmka"></u-select> -->
|
|
|
|
|
|
<view class="hardware-block">
|
|
|
|
|
|
<view class="iptbox iptbox--hw-line" style="margin-top: 0rpx;" @click="openHardwarePicker">
|
|
|
|
|
|
<view v-if="hardwareInfo.version">硬件:{{ hardwareInfo.version }}</view>
|
|
|
|
|
|
<view v-else>请点击选择版本</view>
|
2025-04-01 21:35:30 +08:00
|
|
|
|
</view>
|
2026-04-28 14:01:46 +08:00
|
|
|
|
<view class="hardware-block__intro" v-if="hardwareInfo.version && hardwareInfo.instructions">
|
|
|
|
|
|
<text class="hardware-block__intro-label">介绍:</text>
|
|
|
|
|
|
<text class="hardware-block__intro-text">{{ hardwareInfo.instructions }}</text>
|
2025-04-01 21:35:30 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
2026-04-28 14:01:46 +08:00
|
|
|
|
|
|
|
|
|
|
<u-mask :show="show" :z-index="100" @click="show = false" />
|
|
|
|
|
|
<view v-if="show" class="hw-picker-sheet" @click.stop>
|
|
|
|
|
|
<view class="hw-picker__toolbar">
|
|
|
|
|
|
<text class="hw-picker__tb-side" @click="show = false">取消</text>
|
|
|
|
|
|
<text class="hw-picker__tb-title">选择硬件</text>
|
|
|
|
|
|
<view class="hw-picker__tb-spacer" />
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<scroll-view
|
|
|
|
|
|
scroll-y
|
|
|
|
|
|
class="hw-picker__scroll"
|
|
|
|
|
|
:show-scrollbar="true"
|
|
|
|
|
|
>
|
|
|
|
|
|
<view
|
|
|
|
|
|
v-for="(row, idx) in list"
|
|
|
|
|
|
:key="row.value + '-' + idx"
|
|
|
|
|
|
class="hw-picker__row"
|
|
|
|
|
|
@click="onPickHardwareItem(idx)"
|
|
|
|
|
|
>
|
|
|
|
|
|
<view class="hw-picker__row-line">
|
|
|
|
|
|
<text v-if="row.ver" class="hw-picker__ver">{{ row.ver }}</text>
|
|
|
|
|
|
<text v-if="row.rest" class="hw-picker__rest">
|
|
|
|
|
|
{{ row.ver ? ' ' : '' }}{{ row.rest }}
|
|
|
|
|
|
</text>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</scroll-view>
|
2025-04-01 21:35:30 +08:00
|
|
|
|
</view>
|
2026-04-28 14:01:46 +08:00
|
|
|
|
<view class="device-and-apn-card">
|
|
|
|
|
|
<view class="device-telemetry--grid">
|
|
|
|
|
|
<view
|
|
|
|
|
|
v-for="(gRow, ri) in telemetryLayoutRows"
|
|
|
|
|
|
:key="ri"
|
|
|
|
|
|
:class="gRow.kind === 'full' ? 'device-telemetry__grid-row device-telemetry__grid-row--full' : 'device-telemetry__grid-row'"
|
|
|
|
|
|
>
|
|
|
|
|
|
<template v-if="gRow.kind === 'pair'">
|
|
|
|
|
|
<view
|
|
|
|
|
|
v-for="(cell, ci) in gRow.cells"
|
|
|
|
|
|
:key="ci"
|
|
|
|
|
|
class="device-telemetry__cell"
|
|
|
|
|
|
:class="{ 'device-telemetry__cell--has-coeff': cell.isCoeff }"
|
|
|
|
|
|
>
|
|
|
|
|
|
<view v-if="cell.isCoeff" class="device-telemetry__apn-line">
|
|
|
|
|
|
<view class="device-telemetry__apn-line-main">
|
|
|
|
|
|
<text class="device-telemetry__k">系数:</text>
|
|
|
|
|
|
<text class="device-telemetry__v device-telemetry__v--apn-inline">{{ cell.value }}</text>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="device-telemetry__apn-edit" @click="openCoeffDialog">修改</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view v-else class="device-telemetry__pair-cell-inner">
|
|
|
|
|
|
<text class="device-telemetry__k">{{ cell.label }}:</text>
|
|
|
|
|
|
<text class="device-telemetry__v">{{ cell.value }}</text>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
<view v-else class="device-telemetry__cell device-telemetry__cell--full">
|
|
|
|
|
|
<!-- 定位:与 APN 同排横条样式,整行一列、长文省略,无侧栏按钮 -->
|
|
|
|
|
|
<view
|
|
|
|
|
|
v-if="gRow.label === '定位'"
|
|
|
|
|
|
class="device-telemetry__apn-line device-telemetry__loc-line"
|
|
|
|
|
|
>
|
|
|
|
|
|
<view class="device-telemetry__apn-line-main">
|
|
|
|
|
|
<text class="device-telemetry__k">定位:</text>
|
|
|
|
|
|
<text class="device-telemetry__v device-telemetry__v--apn-inline">{{ gRow.value }}</text>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<!-- APN:值过长省略,「修改」固定右侧整行一直展示 -->
|
|
|
|
|
|
<view
|
|
|
|
|
|
v-else-if="gRow.label === 'APN'"
|
|
|
|
|
|
class="device-telemetry__apn-line"
|
|
|
|
|
|
>
|
|
|
|
|
|
<view class="device-telemetry__apn-line-main">
|
|
|
|
|
|
<text class="device-telemetry__k">APN:</text>
|
|
|
|
|
|
<text class="device-telemetry__v device-telemetry__v--apn-inline">{{ gRow.value }}</text>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="device-telemetry__apn-edit" @click="openApnDialog">修改</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view v-else>
|
|
|
|
|
|
<text class="device-telemetry__k">{{ gRow.label }}:</text>
|
|
|
|
|
|
<text class="device-telemetry__v">{{ gRow.value }}</text>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
2025-04-01 21:35:30 +08:00
|
|
|
|
</view>
|
2026-04-28 14:01:46 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
|
|
<view class="page-bottom-dock">
|
|
|
|
|
|
<view class="apn-below-actions" @click.stop>
|
|
|
|
|
|
<view class="apn-below-actions__btns">
|
|
|
|
|
|
<view class="btn1" @click="btnfh">返回</view>
|
|
|
|
|
|
<view class="btn1" @click="findDevice()">连接</view>
|
|
|
|
|
|
<view class="btn1" @click="qrcode">扫码</view>
|
|
|
|
|
|
</view>
|
2025-04-01 21:35:30 +08:00
|
|
|
|
</view>
|
2026-04-28 14:01:46 +08:00
|
|
|
|
<view class="btn-bind btn-bind--full" @click="bind()">确认添加</view>
|
|
|
|
|
|
<view class="bot_btn bot_btn--grid" style="gap:2rpx;padding-bottom:0;">
|
|
|
|
|
|
<view style="width:18%;margin-top:10rpx;" class="btn1" @click="ring()">响铃</view>
|
|
|
|
|
|
<view style="width:18%;margin-top:10rpx;" class="btn1" @click="open()">开锁</view>
|
|
|
|
|
|
<view style="width:18%;margin-top:10rpx;" class="btn1" @click="close()">关锁</view>
|
|
|
|
|
|
<view style="width:18%;margin-top:10rpx;" class="btn1" @click="shaoru">烧录</view>
|
|
|
|
|
|
<view style="width:18%;margin-top:10rpx;" class="btn1" @click="reboot()">重启</view>
|
|
|
|
|
|
<!-- <view class="btn1" @click="Binddevice()" v-if="isbands">接口响铃</view> -->
|
2025-04-01 21:35:30 +08:00
|
|
|
|
</view>
|
2026-04-28 14:01:46 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
<u-mask :show="showApnModal" :z-index="102" @click="showApnModal = false" />
|
|
|
|
|
|
<view class="apn_box" v-if="showApnModal" @click.stop>
|
|
|
|
|
|
<view class="top">
|
|
|
|
|
|
<view class="tip">设置 APN</view>
|
|
|
|
|
|
<view class="apn_ipt">
|
|
|
|
|
|
<textarea
|
|
|
|
|
|
v-model="apnInput"
|
|
|
|
|
|
class="apn_ipt__field"
|
|
|
|
|
|
:auto-height="false"
|
|
|
|
|
|
:maxlength="200"
|
|
|
|
|
|
:show-confirm-bar="false"
|
|
|
|
|
|
placeholder="请输入 APN"
|
|
|
|
|
|
placeholder-class="apn-placeholder"
|
|
|
|
|
|
/>
|
|
|
|
|
|
</view>
|
2025-04-01 21:35:30 +08:00
|
|
|
|
</view>
|
2026-04-28 14:01:46 +08:00
|
|
|
|
<view class="bots">
|
|
|
|
|
|
<view class="bot_left" @click="showApnModal = false">取消</view>
|
|
|
|
|
|
<view class="bot_right" @click="submitApn">确定</view>
|
2025-06-06 11:32:12 +08:00
|
|
|
|
</view>
|
2026-04-28 14:01:46 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
<u-mask :show="showCoeffModal" :z-index="103" @click="showCoeffModal = false" />
|
|
|
|
|
|
<view class="apn_box coeff_box" v-if="showCoeffModal" @click.stop>
|
|
|
|
|
|
<view class="top">
|
|
|
|
|
|
<view class="tip">设置系数</view>
|
|
|
|
|
|
<view class="coeff-modal-hint">新系数 = 设置电压 ÷ 现电压 × 现系数</view>
|
|
|
|
|
|
<view class="coeff-modal-readonly">
|
|
|
|
|
|
<view class="coeff-modal-row">
|
|
|
|
|
|
<text class="coeff-modal-k">现电压</text>
|
|
|
|
|
|
<text class="coeff-modal-v">{{ coeffModalBatDisplay || '(暂无)' }}</text>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="coeff-modal-row">
|
|
|
|
|
|
<text class="coeff-modal-k">现系数</text>
|
|
|
|
|
|
<text class="coeff-modal-v">{{ coeffModalXsDisplay || '(暂无)' }}</text>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="coeff-modal-row">
|
|
|
|
|
|
<text class="coeff-modal-k">设置电压</text>
|
|
|
|
|
|
<input
|
|
|
|
|
|
v-model="coeffSetVoltageInput"
|
|
|
|
|
|
class="coeff-modal-input"
|
|
|
|
|
|
type="digit"
|
|
|
|
|
|
placeholder="默认 50"
|
|
|
|
|
|
/>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view v-if="previewCoeffToSend" class="coeff-modal-row">
|
|
|
|
|
|
<text class="coeff-modal-k">将下发</text>
|
|
|
|
|
|
<text class="coeff-modal-v coeff-modal-v--em">{{ previewCoeffToSend }}</text>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
2025-04-01 21:35:30 +08:00
|
|
|
|
</view>
|
2026-04-28 14:01:46 +08:00
|
|
|
|
<view class="bots">
|
|
|
|
|
|
<view class="bot_left" @click="showCoeffModal = false">取消</view>
|
|
|
|
|
|
<view class="bot_right" @click="submitCoeff">确定</view>
|
2025-04-01 21:35:30 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<u-mask :show="showbind" :z-index='100' />
|
|
|
|
|
|
<view class="tip_box" v-if="showbind">
|
|
|
|
|
|
<view class="top" v-if="showbind">
|
|
|
|
|
|
<view class="tip">
|
|
|
|
|
|
操作提示
|
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
|
|
<view class="ipt_box" style="justify-content: center;">
|
|
|
|
|
|
<view class="text" style="width: 80%;text-align: center;">
|
|
|
|
|
|
该mac号已有绑定sn码是否修改为当前sn码
|
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="bots">
|
|
|
|
|
|
<view class="bot_left" @click="showbind=false ">
|
|
|
|
|
|
取消
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="bot_right" @click="changeBind()">
|
|
|
|
|
|
确定
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<!-- <view class="bot">
|
|
|
|
|
|
<view class="btn">
|
|
|
|
|
|
退款
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view> -->
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
|
const app = getApp();
|
|
|
|
|
|
var xBlufi = require("@/components/blufi/xBlufi.js");
|
|
|
|
|
|
let _this = null;
|
|
|
|
|
|
export default {
|
|
|
|
|
|
data() {
|
|
|
|
|
|
return {
|
2025-06-13 17:00:24 +08:00
|
|
|
|
devicesarr:[],
|
2025-04-01 21:35:30 +08:00
|
|
|
|
devicesList: [
|
|
|
|
|
|
// {name:'110000',
|
|
|
|
|
|
// mac:'11111'}
|
|
|
|
|
|
],
|
|
|
|
|
|
searching: false,
|
|
|
|
|
|
texts: '正在扫描蓝牙设备...',
|
|
|
|
|
|
btnflag: true,
|
|
|
|
|
|
tishiflag: false,
|
|
|
|
|
|
option: '',
|
|
|
|
|
|
bluthlist: [], //蓝牙数组
|
|
|
|
|
|
// status: 'loading',
|
|
|
|
|
|
statusflag: false,
|
|
|
|
|
|
Bluetoothmac: '',
|
|
|
|
|
|
mac: '',
|
|
|
|
|
|
ishave: false,
|
|
|
|
|
|
ver_data: null,
|
|
|
|
|
|
deviceInfoss: {},
|
|
|
|
|
|
gps: {},
|
|
|
|
|
|
isband: false,
|
|
|
|
|
|
// status: false,
|
|
|
|
|
|
deviceIds: '',
|
|
|
|
|
|
name: '',
|
|
|
|
|
|
orderinfo: {},
|
|
|
|
|
|
dl: 0,
|
|
|
|
|
|
czmoney: true,
|
|
|
|
|
|
iscz: true,
|
|
|
|
|
|
bgc: {
|
|
|
|
|
|
backgroundColor: "#F7FAFE",
|
|
|
|
|
|
},
|
|
|
|
|
|
sn: '',
|
|
|
|
|
|
carstause: false,
|
|
|
|
|
|
isbands: false,
|
|
|
|
|
|
show: false,
|
|
|
|
|
|
list: [],
|
2026-04-28 14:01:46 +08:00
|
|
|
|
hwPickerActiveIndex: 0,
|
|
|
|
|
|
hardwareVersionId: '',
|
2025-04-01 21:35:30 +08:00
|
|
|
|
hardwareInfo: {},
|
2025-06-13 17:00:24 +08:00
|
|
|
|
showbind:false,
|
2025-08-19 17:02:14 +08:00
|
|
|
|
deviceid:'',
|
|
|
|
|
|
kalist:[],
|
|
|
|
|
|
kashow:false,
|
|
|
|
|
|
kaname:'',
|
2026-04-28 14:01:46 +08:00
|
|
|
|
kaid:'',
|
|
|
|
|
|
deviceDataPairs: [],
|
|
|
|
|
|
apnDisplay: '',
|
|
|
|
|
|
showApnModal: false,
|
|
|
|
|
|
apnInput: '',
|
|
|
|
|
|
/* 系数弹窗:设置电压默认 50,下发 11bxs{值}@ */
|
|
|
|
|
|
showCoeffModal: false,
|
|
|
|
|
|
coeffSetVoltageInput: '50'
|
2025-04-01 21:35:30 +08:00
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
onLoad(e) {
|
2025-06-13 17:00:24 +08:00
|
|
|
|
xBlufi.notifyStartDiscoverBle({
|
|
|
|
|
|
'isStart': true
|
|
|
|
|
|
})
|
|
|
|
|
|
xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent);
|
2025-04-01 21:35:30 +08:00
|
|
|
|
this.mac = e.mac
|
2026-04-28 14:01:46 +08:00
|
|
|
|
if (e.sn != null && String(e.sn).trim() !== '') {
|
|
|
|
|
|
this.sn = String(e.sn).trim()
|
|
|
|
|
|
}
|
2025-06-13 17:00:24 +08:00
|
|
|
|
this.findDevice()
|
2025-04-01 21:35:30 +08:00
|
|
|
|
this.isbands = false
|
|
|
|
|
|
this.carstause = false
|
|
|
|
|
|
},
|
|
|
|
|
|
onShow() {
|
|
|
|
|
|
this.getlist()
|
2025-08-19 17:02:14 +08:00
|
|
|
|
this.getka()
|
2025-04-01 21:35:30 +08:00
|
|
|
|
},
|
|
|
|
|
|
watch: {
|
|
|
|
|
|
|
2026-04-28 14:01:46 +08:00
|
|
|
|
},
|
|
|
|
|
|
computed: {
|
|
|
|
|
|
/** 设备推送解析后的 name:value 映射(name 已 toLowerCase;系数字段为 xs,APN 为 apn) */
|
|
|
|
|
|
deviceDataMap() {
|
|
|
|
|
|
const map = {}
|
|
|
|
|
|
if (this.deviceDataPairs && this.deviceDataPairs.length) {
|
|
|
|
|
|
this.deviceDataPairs.forEach((p) => {
|
|
|
|
|
|
if (p && p.name) map[p.name.toLowerCase()] = p.value
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
return map
|
|
|
|
|
|
},
|
|
|
|
|
|
coeffModalBatDisplay() {
|
|
|
|
|
|
return this.formatDeviceBatText(this.deviceDataMap['bat'])
|
|
|
|
|
|
},
|
|
|
|
|
|
coeffModalXsDisplay() {
|
|
|
|
|
|
return this.formatDeviceCoeffText(this.pickCoeffRaw(this.deviceDataMap))
|
|
|
|
|
|
},
|
|
|
|
|
|
/** 根据设置电压预览将下发的系数(用于弹窗展示) */
|
|
|
|
|
|
previewCoeffToSend() {
|
|
|
|
|
|
const map = this.deviceDataMap
|
|
|
|
|
|
const curV = this.parseNumericBat(map['bat'])
|
|
|
|
|
|
const curXs = this.parseNumericCoeff(this.pickCoeffRaw(map))
|
|
|
|
|
|
const setV = parseFloat(String(this.coeffSetVoltageInput || '').trim())
|
|
|
|
|
|
if (!isFinite(setV) || setV <= 0) return ''
|
|
|
|
|
|
if (!(curV > 0) || !isFinite(curXs)) return ''
|
|
|
|
|
|
const n = (setV / curV) * curXs
|
|
|
|
|
|
return this.formatXsForBluetooth(n)
|
|
|
|
|
|
},
|
|
|
|
|
|
// 电门/状态、网络/卫星、电压/系数 为两列;定位、APN 各独占一行(先定位后 APN)
|
|
|
|
|
|
telemetryLayoutRows() {
|
|
|
|
|
|
const map = this.deviceDataMap
|
|
|
|
|
|
let statusVal = map['status']
|
|
|
|
|
|
if (statusVal === undefined || statusVal === null || statusVal === '') {
|
|
|
|
|
|
statusVal = map['statue']
|
|
|
|
|
|
}
|
|
|
|
|
|
const coeffRaw = this.pickCoeffRaw(map)
|
|
|
|
|
|
const apnStr =
|
|
|
|
|
|
this.apnDisplay != null && String(this.apnDisplay).trim() !== ''
|
|
|
|
|
|
? String(this.apnDisplay).trim()
|
|
|
|
|
|
: ''
|
|
|
|
|
|
const loc = this.formatDeviceLocation(map['lat'], map['lon'])
|
|
|
|
|
|
return [
|
|
|
|
|
|
{
|
|
|
|
|
|
kind: 'pair',
|
|
|
|
|
|
cells: [
|
|
|
|
|
|
{ label: '电门', value: this.formatDeviceDoorText(map['q']) },
|
|
|
|
|
|
{ label: '状态', value: this.formatDeviceStatusText(statusVal) }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
kind: 'pair',
|
|
|
|
|
|
cells: [
|
|
|
|
|
|
{ label: '网络', value: this.fmtStr(map['csq']) },
|
|
|
|
|
|
{ label: '卫星', value: this.fmtStr(map['s']) }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
kind: 'pair',
|
|
|
|
|
|
cells: [
|
|
|
|
|
|
{ label: '电压', value: this.formatDeviceBatText(map['bat']) },
|
|
|
|
|
|
{ label: '系数', value: this.formatDeviceCoeffText(coeffRaw), isCoeff: true }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
{ kind: 'full', label: '定位', value: loc },
|
|
|
|
|
|
{ kind: 'full', label: 'APN', value: apnStr }
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
2025-04-01 21:35:30 +08:00
|
|
|
|
},
|
|
|
|
|
|
methods: {
|
2026-04-28 14:01:46 +08:00
|
|
|
|
/** 系数字段:推送为 xs;兼容旧名 */
|
|
|
|
|
|
pickCoeffRaw(map) {
|
|
|
|
|
|
if (!map) return undefined
|
|
|
|
|
|
return map['xs'] ?? map['coeff'] ?? map['coff'] ?? map['ratio'] ?? map['coefficient'] ?? map['系数'] ?? map['k']
|
|
|
|
|
|
},
|
|
|
|
|
|
parseNumericBat(raw) {
|
|
|
|
|
|
if (raw === undefined || raw === null || raw === '') return NaN
|
|
|
|
|
|
const s = String(raw).trim()
|
|
|
|
|
|
const numStr = s.replace(/V$/i, '').trim()
|
|
|
|
|
|
return parseFloat(numStr)
|
|
|
|
|
|
},
|
|
|
|
|
|
parseNumericCoeff(raw) {
|
|
|
|
|
|
if (raw === undefined || raw === null || raw === '') return NaN
|
|
|
|
|
|
return parseFloat(String(raw).trim())
|
|
|
|
|
|
},
|
|
|
|
|
|
/** 蓝牙 11bxs 中的数值字符串 */
|
|
|
|
|
|
formatXsForBluetooth(n) {
|
|
|
|
|
|
if (!isFinite(n)) return ''
|
|
|
|
|
|
if (Math.abs(n - Math.round(n)) < 1e-8) return String(Math.round(n))
|
|
|
|
|
|
const r = Math.round(n * 10000) / 10000
|
|
|
|
|
|
return String(r)
|
|
|
|
|
|
},
|
|
|
|
|
|
openCoeffDialog() {
|
|
|
|
|
|
this.coeffSetVoltageInput = '50'
|
|
|
|
|
|
this.showCoeffModal = true
|
|
|
|
|
|
},
|
|
|
|
|
|
submitCoeff() {
|
|
|
|
|
|
const map = this.deviceDataMap
|
|
|
|
|
|
const curV = this.parseNumericBat(map['bat'])
|
|
|
|
|
|
const curXs = this.parseNumericCoeff(this.pickCoeffRaw(map))
|
|
|
|
|
|
const setV = parseFloat(String(this.coeffSetVoltageInput || '').trim())
|
|
|
|
|
|
if (!isFinite(setV) || setV <= 0) {
|
|
|
|
|
|
uni.showToast({ title: '请输入有效的设置电压', icon: 'none' })
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!(curV > 0)) {
|
|
|
|
|
|
uni.showToast({ title: '暂无现电压,请等待设备推送', icon: 'none' })
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!isFinite(curXs)) {
|
|
|
|
|
|
uni.showToast({ title: '暂无现系数,请等待设备推送', icon: 'none' })
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
const newXs = (setV / curV) * curXs
|
|
|
|
|
|
const xsPayload = this.formatXsForBluetooth(newXs)
|
|
|
|
|
|
if (!xsPayload) {
|
|
|
|
|
|
uni.showToast({ title: '系数计算无效', icon: 'none' })
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
const self = this
|
|
|
|
|
|
const cmd = '11bxs' + xsPayload + '@'
|
|
|
|
|
|
uni.getNetworkType({
|
|
|
|
|
|
success(res) {
|
|
|
|
|
|
if (res.networkType === 'none') {
|
|
|
|
|
|
uni.showToast({ title: '请连接网络后重试', icon: 'none' })
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
uni.getConnectedBluetoothDevices({
|
|
|
|
|
|
success() {
|
|
|
|
|
|
xBlufi.notifySendCustomData({ customData: cmd })
|
|
|
|
|
|
self.showCoeffModal = false
|
|
|
|
|
|
uni.showToast({ title: '已发送', icon: 'none' })
|
|
|
|
|
|
},
|
|
|
|
|
|
fail() {
|
|
|
|
|
|
uni.showToast({ title: '请先连接蓝牙', icon: 'none' })
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
},
|
|
|
|
|
|
fmtStr(v) {
|
|
|
|
|
|
if (v === undefined || v === null || v === '') return ''
|
|
|
|
|
|
return String(v)
|
|
|
|
|
|
},
|
|
|
|
|
|
formatDeviceCoeffText(raw) {
|
|
|
|
|
|
if (raw === undefined || raw === null || String(raw).trim() === '') return ''
|
|
|
|
|
|
return String(raw).trim()
|
|
|
|
|
|
},
|
|
|
|
|
|
formatDeviceStatusText(raw) {
|
|
|
|
|
|
if (raw === undefined || raw === null || raw === '' || String(raw).trim() === '') return ''
|
|
|
|
|
|
const n = parseInt(String(raw), 10)
|
|
|
|
|
|
if (isNaN(n)) return String(raw)
|
|
|
|
|
|
const t = {
|
|
|
|
|
|
0: '断电',
|
|
|
|
|
|
1: '上电',
|
|
|
|
|
|
2: '轮动抱死',
|
|
|
|
|
|
3: '强制锁车',
|
|
|
|
|
|
4: '临时锁车'
|
|
|
|
|
|
}
|
|
|
|
|
|
return Object.prototype.hasOwnProperty.call(t, n) ? t[n] : `未知(${raw})`
|
|
|
|
|
|
},
|
|
|
|
|
|
formatDeviceBatText(raw) {
|
|
|
|
|
|
if (raw === undefined || raw === null || raw === '') return ''
|
|
|
|
|
|
const s = String(raw).trim()
|
|
|
|
|
|
const numStr = s.replace(/V$/i, '').trim()
|
|
|
|
|
|
const n = parseFloat(numStr)
|
|
|
|
|
|
if (isNaN(n)) {
|
|
|
|
|
|
return /V$/i.test(s) ? s : `${s}V`
|
|
|
|
|
|
}
|
|
|
|
|
|
return `${n.toFixed(1)}V`
|
|
|
|
|
|
},
|
|
|
|
|
|
formatDeviceDoorText(raw) {
|
|
|
|
|
|
if (raw === undefined || raw === null || raw === '') return ''
|
|
|
|
|
|
const s = String(raw).trim()
|
|
|
|
|
|
if (s === '0') return '关'
|
|
|
|
|
|
if (s === '1') return '开'
|
|
|
|
|
|
return s
|
|
|
|
|
|
},
|
|
|
|
|
|
formatDeviceLocation(lat, lon) {
|
|
|
|
|
|
const a = lat != null && lat !== '' ? String(lat).trim() : ''
|
|
|
|
|
|
const b = lon != null && lon !== '' ? String(lon).trim() : ''
|
|
|
|
|
|
if (!a && !b) return ''
|
|
|
|
|
|
if (!a) return b
|
|
|
|
|
|
if (!b) return a
|
|
|
|
|
|
return `${a},${b}`
|
|
|
|
|
|
},
|
|
|
|
|
|
// 解析设备自定义数据,如 status:0,bat:0.0,csq:0 → [{name, value}, ...]
|
|
|
|
|
|
parseDeviceCustomData(raw) {
|
|
|
|
|
|
if (raw == null || raw === '') return []
|
|
|
|
|
|
const s = typeof raw === 'string' ? raw : String(raw)
|
|
|
|
|
|
const pairs = []
|
|
|
|
|
|
s.split(',').forEach((part) => {
|
|
|
|
|
|
const t = part.trim()
|
|
|
|
|
|
if (!t) return
|
|
|
|
|
|
const idx = t.indexOf(':')
|
|
|
|
|
|
if (idx < 0) {
|
|
|
|
|
|
pairs.push({ name: t, value: '' })
|
|
|
|
|
|
} else {
|
|
|
|
|
|
pairs.push({
|
|
|
|
|
|
name: t.slice(0, idx).trim(),
|
|
|
|
|
|
value: t.slice(idx + 1).trim()
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
return pairs
|
|
|
|
|
|
},
|
|
|
|
|
|
// 设备推送 APN 字段名为 apn
|
|
|
|
|
|
syncApnFromDevicePairs(pairs) {
|
|
|
|
|
|
if (!pairs || !pairs.length) return
|
|
|
|
|
|
const apnRow = pairs.find(
|
|
|
|
|
|
(p) => p.name && p.name.toLowerCase() === 'apn'
|
|
|
|
|
|
)
|
|
|
|
|
|
if (apnRow) this.apnDisplay = (apnRow.value != null) ? String(apnRow.value).trim() : ''
|
|
|
|
|
|
},
|
|
|
|
|
|
openApnDialog() {
|
|
|
|
|
|
this.apnInput = this.apnDisplay || ''
|
|
|
|
|
|
this.showApnModal = true
|
|
|
|
|
|
},
|
|
|
|
|
|
submitApn() {
|
|
|
|
|
|
const v = (this.apnInput || '').trim()
|
|
|
|
|
|
if (!v) {
|
|
|
|
|
|
uni.showToast({ title: '请输入 APN', icon: 'none' })
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
const self = this
|
|
|
|
|
|
uni.getNetworkType({
|
|
|
|
|
|
success(res) {
|
|
|
|
|
|
if (res.networkType === 'none') {
|
|
|
|
|
|
uni.showToast({ title: '请连接网络后重试', icon: 'none' })
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
uni.getConnectedBluetoothDevices({
|
|
|
|
|
|
success() {
|
|
|
|
|
|
const cmd = '11apn' + v + '@'
|
|
|
|
|
|
xBlufi.notifySendCustomData({ customData: cmd })
|
|
|
|
|
|
self.apnDisplay = v
|
|
|
|
|
|
self.showApnModal = false
|
|
|
|
|
|
uni.showToast({ title: '已发送', icon: 'none' })
|
|
|
|
|
|
},
|
|
|
|
|
|
fail() {
|
|
|
|
|
|
uni.showToast({ title: '请先连接蓝牙', icon: 'none' })
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
},
|
2025-08-19 17:02:14 +08:00
|
|
|
|
// 点击确认卡商
|
|
|
|
|
|
confirmka(e){
|
|
|
|
|
|
this.kaname = e[0].label
|
|
|
|
|
|
this.kaid = e[0].value
|
2025-09-22 17:08:55 +08:00
|
|
|
|
uni.setStorageSync('kashang',this.kaid)
|
2025-08-19 17:02:14 +08:00
|
|
|
|
},
|
|
|
|
|
|
// 请求所有卡商
|
|
|
|
|
|
getka(){
|
|
|
|
|
|
this.$u.get(`/system/dict/data/type/device_sim_producer`).then((res) => {
|
|
|
|
|
|
if (res.code === 200) {
|
2025-09-22 17:08:55 +08:00
|
|
|
|
let id = uni.getStorageSync('kashang')
|
|
|
|
|
|
res.data.some(item =>{
|
|
|
|
|
|
if(item.dictValue == id){
|
|
|
|
|
|
this.kaname = item.dictLabel
|
|
|
|
|
|
this.kaid = item.dictValue
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
2025-08-19 17:02:14 +08:00
|
|
|
|
this.kalist = res.data.map(item => ({
|
|
|
|
|
|
value: item.dictValue,
|
|
|
|
|
|
label: item.dictLabel
|
|
|
|
|
|
}))
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2025-07-15 17:36:34 +08:00
|
|
|
|
btnfh(){
|
|
|
|
|
|
uni.reLaunch({
|
|
|
|
|
|
url:'/page_user/luru/index'
|
|
|
|
|
|
})
|
|
|
|
|
|
},
|
2025-06-06 16:53:36 +08:00
|
|
|
|
btngx(){
|
|
|
|
|
|
// this.$u.post('/app/device/ring?sn=' + this.sn).then((res) => {
|
|
|
|
|
|
// if (res.code == 200) {
|
|
|
|
|
|
// uni.showToast({
|
|
|
|
|
|
// title: res.msg,
|
|
|
|
|
|
// icon: 'success',
|
|
|
|
|
|
// duration: 2000
|
|
|
|
|
|
// })
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// uni.showToast({
|
|
|
|
|
|
// title: res.msg,
|
|
|
|
|
|
// icon: 'none',
|
|
|
|
|
|
// duration: 3000
|
|
|
|
|
|
// })
|
|
|
|
|
|
// }
|
|
|
|
|
|
// })
|
|
|
|
|
|
},
|
2025-04-01 21:35:30 +08:00
|
|
|
|
confirm(e) {
|
|
|
|
|
|
// console.log(e);
|
|
|
|
|
|
uni.setStorageSync('hardwareVersionId', e[0].value);
|
|
|
|
|
|
this.hardwareVersionId = e[0].value
|
|
|
|
|
|
const hardwareVersionId =this.hardwareVersionId
|
|
|
|
|
|
if (hardwareVersionId) {
|
|
|
|
|
|
const matchedVersion = this.Versionlist.find(version => version.id ===
|
|
|
|
|
|
hardwareVersionId);
|
|
|
|
|
|
if (matchedVersion) {
|
|
|
|
|
|
this.hardwareInfo = matchedVersion;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
2026-04-28 14:01:46 +08:00
|
|
|
|
openHardwarePicker() {
|
|
|
|
|
|
if (!this.list || !this.list.length) {
|
|
|
|
|
|
uni.showToast({ title: '暂无硬件列表,请稍后重试', icon: 'none' })
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
this.syncHwPickerActiveIndex()
|
|
|
|
|
|
this.show = true
|
|
|
|
|
|
},
|
|
|
|
|
|
syncHwPickerActiveIndex() {
|
|
|
|
|
|
const id = this.hardwareVersionId !== null && this.hardwareVersionId !== ''
|
|
|
|
|
|
? this.hardwareVersionId
|
|
|
|
|
|
: uni.getStorageSync('hardwareVersionId')
|
|
|
|
|
|
const i = this.list.findIndex((x) => String(x.value) === String(id))
|
|
|
|
|
|
this.hwPickerActiveIndex = i >= 0 ? i : 0
|
|
|
|
|
|
},
|
|
|
|
|
|
/** 点击行即选中并关闭,无需再点确认 */
|
|
|
|
|
|
onPickHardwareItem(idx) {
|
|
|
|
|
|
if (!this.list || !this.list.length) return
|
|
|
|
|
|
const item = this.list[idx]
|
|
|
|
|
|
if (!item) return
|
|
|
|
|
|
this.hwPickerActiveIndex = idx
|
|
|
|
|
|
this.confirm([item])
|
|
|
|
|
|
this.show = false
|
|
|
|
|
|
},
|
2025-04-01 21:35:30 +08:00
|
|
|
|
getlist() {
|
2025-04-27 17:37:23 +08:00
|
|
|
|
this.$u.get('/bst/hardwareVersion/all').then((res) => {
|
2025-04-01 21:35:30 +08:00
|
|
|
|
if (res.code === 200) {
|
2026-04-28 14:01:46 +08:00
|
|
|
|
const filtered = res.data.filter((item) => item.parentId != 0)
|
|
|
|
|
|
// 倒序:接口里越靠后的越排前面
|
|
|
|
|
|
const ordered = filtered.slice().reverse()
|
|
|
|
|
|
this.Versionlist = ordered
|
2025-04-01 21:35:30 +08:00
|
|
|
|
const hardwareVersionId = uni.getStorageSync('hardwareVersionId');
|
|
|
|
|
|
if (hardwareVersionId) {
|
|
|
|
|
|
this.hardwareVersionId=hardwareVersionId
|
|
|
|
|
|
const matchedVersion = this.Versionlist.find(version => version.id ===
|
|
|
|
|
|
hardwareVersionId);
|
|
|
|
|
|
if (matchedVersion) {
|
|
|
|
|
|
this.hardwareInfo = matchedVersion;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-04-28 14:01:46 +08:00
|
|
|
|
this.list = ordered.map((item) => {
|
|
|
|
|
|
const rest = (item.instructions && String(item.instructions).trim()) || ''
|
|
|
|
|
|
const name = (item.version && String(item.version).trim()) || ''
|
|
|
|
|
|
const label = rest && name ? `${name} ${rest}` : (name || rest)
|
|
|
|
|
|
return {
|
|
|
|
|
|
value: item.id,
|
|
|
|
|
|
label,
|
|
|
|
|
|
ver: name,
|
|
|
|
|
|
rest
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
2025-06-13 17:00:24 +08:00
|
|
|
|
console.log(JSON.stringify(this.list, null, 2));
|
2025-04-01 21:35:30 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title: res.msg,
|
|
|
|
|
|
icon: 'none',
|
|
|
|
|
|
duration: 2000
|
2025-06-06 16:53:36 +08:00
|
|
|
|
})
|
2025-04-01 21:35:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
},
|
|
|
|
|
|
send() {
|
|
|
|
|
|
this.$u.post('/app/device/ring?sn=' + this.sn).then((res) => {
|
|
|
|
|
|
if (res.code === 200) {
|
|
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title: res.msg,
|
|
|
|
|
|
icon: 'none',
|
|
|
|
|
|
duration: 2000
|
2025-06-06 16:53:36 +08:00
|
|
|
|
})
|
2025-04-01 21:35:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
},
|
|
|
|
|
|
changeBind(){
|
|
|
|
|
|
this.$u.post(`/appVerify/updateSn?sn=` + this.sn + '&mac=' + this.mac+'&hardwareVersionId='+this.hardwareVersionId).then((res) => {
|
|
|
|
|
|
if (res.code === 200) {
|
|
|
|
|
|
uni.showToast({
|
2025-04-27 17:37:23 +08:00
|
|
|
|
title: '操作成功',
|
2025-04-01 21:35:30 +08:00
|
|
|
|
icon: 'none',
|
|
|
|
|
|
duration: 2000
|
|
|
|
|
|
});
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
// uni.navigateBack({
|
|
|
|
|
|
// delta: 1 // delta值为1时表示返回的页面层数
|
|
|
|
|
|
// });
|
|
|
|
|
|
uni.navigateTo({
|
|
|
|
|
|
url:'/page_user/luru/controlDevice?sn='+this.sn
|
|
|
|
|
|
})
|
|
|
|
|
|
}, 2000)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title: res.msg,
|
|
|
|
|
|
icon: 'none',
|
|
|
|
|
|
duration: 2000
|
2025-06-06 16:53:36 +08:00
|
|
|
|
})
|
2025-04-01 21:35:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
},
|
|
|
|
|
|
backpage() {
|
|
|
|
|
|
uni.navigateBack({
|
|
|
|
|
|
delta: 1 // delta值为1时表示返回的页面层数
|
2025-06-06 16:53:36 +08:00
|
|
|
|
})
|
2025-04-01 21:35:30 +08:00
|
|
|
|
},
|
|
|
|
|
|
bind() {
|
2025-08-19 17:02:14 +08:00
|
|
|
|
let data = {
|
|
|
|
|
|
sn:this.sn,
|
|
|
|
|
|
mac:this.mac,
|
|
|
|
|
|
hardwareVersionId:this.hardwareVersionId,
|
2026-01-19 15:27:10 +08:00
|
|
|
|
simProducer:this.kaid,
|
|
|
|
|
|
appId:this.$store.state.appid
|
2025-08-19 17:02:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
console.log(data,'111');
|
|
|
|
|
|
this.$u.post(`/bst/device`,data).then((res) => {
|
|
|
|
|
|
if (res.code == 200) {
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title: '操作成功',
|
|
|
|
|
|
icon: 'success',
|
|
|
|
|
|
duration: 2000
|
|
|
|
|
|
});
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
uni.navigateTo({
|
|
|
|
|
|
url:'/page_user/luru/controlDevice?sn='+this.sn
|
|
|
|
|
|
})
|
|
|
|
|
|
}, 2000)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title: res.msg,
|
|
|
|
|
|
icon: 'none',
|
|
|
|
|
|
duration: 2000
|
|
|
|
|
|
})
|
2025-04-27 17:37:23 +08:00
|
|
|
|
}
|
2025-08-19 17:02:14 +08:00
|
|
|
|
})
|
2025-04-01 21:35:30 +08:00
|
|
|
|
},
|
|
|
|
|
|
qrcode() {
|
|
|
|
|
|
uni.scanCode({
|
|
|
|
|
|
onlyFromCamera: true,
|
|
|
|
|
|
scanType: ['qrCode'],
|
|
|
|
|
|
success: res => {
|
|
|
|
|
|
let sn = null;
|
|
|
|
|
|
let queryParams = res.result.split('?')[1];
|
|
|
|
|
|
if (queryParams) {
|
|
|
|
|
|
let params = queryParams.split('&');
|
|
|
|
|
|
params.forEach(param => {
|
|
|
|
|
|
let [key, value] = param.split('=');
|
2025-04-27 17:37:23 +08:00
|
|
|
|
if (key === 's') {
|
2025-04-01 21:35:30 +08:00
|
|
|
|
sn = value;
|
|
|
|
|
|
}
|
2025-06-06 16:53:36 +08:00
|
|
|
|
})
|
2025-04-01 21:35:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
this.sn = sn
|
|
|
|
|
|
console.log(res.result);
|
|
|
|
|
|
if (this.sn != '') {
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
fail: err => {
|
2025-04-27 17:37:23 +08:00
|
|
|
|
console.error('扫描失败:', err)
|
2025-04-01 21:35:30 +08:00
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title: '扫描失败',
|
|
|
|
|
|
icon: 'none'
|
2025-04-27 17:37:23 +08:00
|
|
|
|
})
|
2025-04-01 21:35:30 +08:00
|
|
|
|
}
|
2025-04-27 17:37:23 +08:00
|
|
|
|
})
|
2025-04-01 21:35:30 +08:00
|
|
|
|
},
|
2025-06-13 17:00:24 +08:00
|
|
|
|
findDevice() {
|
|
|
|
|
|
// 使用 find 方法查找匹配的设备
|
|
|
|
|
|
const matchedDevice = this.devicesarr.find(device => {
|
|
|
|
|
|
console.log(this.mac, '111')
|
|
|
|
|
|
return device.name.slice(-12) == this.mac.slice(-12)
|
2025-04-01 21:35:30 +08:00
|
|
|
|
})
|
2025-06-13 17:00:24 +08:00
|
|
|
|
if (matchedDevice) {
|
|
|
|
|
|
// 找到匹配的设备
|
2025-04-01 21:35:30 +08:00
|
|
|
|
xBlufi.notifyStartDiscoverBle({
|
|
|
|
|
|
'isStart': false
|
2025-04-27 17:37:23 +08:00
|
|
|
|
})
|
2025-06-13 17:00:24 +08:00
|
|
|
|
xBlufi.notifyConnectBle({
|
|
|
|
|
|
isStart: true,
|
|
|
|
|
|
deviceId: matchedDevice.deviceId,
|
|
|
|
|
|
name: matchedDevice.name
|
|
|
|
|
|
})
|
|
|
|
|
|
this.deviceid = matchedDevice.deviceId
|
|
|
|
|
|
} else {
|
|
|
|
|
|
this.findDeviceTimer = setTimeout(this.findDevice.bind(this), 1000) // 使用 bind 保持 this 上下文
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
// 获取附近蓝牙设备列表
|
|
|
|
|
|
funListenDeviceMsgEvent: function(options) {
|
|
|
|
|
|
switch (options.type) {
|
|
|
|
|
|
case xBlufi.XBLUFI_TYPE.TYPE_STATUS_CONNECTED:
|
|
|
|
|
|
if (!options.result) {
|
|
|
|
|
|
this.carstause = false
|
|
|
|
|
|
console.log('断开断开');
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS:
|
|
|
|
|
|
if (options.result) {
|
|
|
|
|
|
this.devicesarr = options.data
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case xBlufi.XBLUFI_TYPE.TYPE_CONNECTED:
|
|
|
|
|
|
console.log("连接回调:" + JSON.stringify(options))
|
|
|
|
|
|
if (options.result == true) {
|
|
|
|
|
|
this.carstause = true
|
|
|
|
|
|
xBlufi.notifyInitBleEsp32({
|
|
|
|
|
|
deviceId: this.deviceid
|
2025-04-27 17:37:23 +08:00
|
|
|
|
})
|
2025-06-13 17:00:24 +08:00
|
|
|
|
|
|
|
|
|
|
}else{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
2026-04-28 14:01:46 +08:00
|
|
|
|
case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA: {
|
2025-06-13 17:00:24 +08:00
|
|
|
|
console.log("1收到设备发来的自定义数据结果:", options.data)
|
2026-04-28 14:01:46 +08:00
|
|
|
|
this.deviceDataPairs = this.parseDeviceCustomData(options.data)
|
|
|
|
|
|
this.syncApnFromDevicePairs(this.deviceDataPairs)
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
2025-06-13 17:00:24 +08:00
|
|
|
|
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_START:
|
|
|
|
|
|
if (!options.result) {
|
|
|
|
|
|
console.log('蓝牙未开启')
|
|
|
|
|
|
return
|
2025-04-01 21:35:30 +08:00
|
|
|
|
} else {
|
2025-06-13 17:00:24 +08:00
|
|
|
|
|
2025-04-01 21:35:30 +08:00
|
|
|
|
}
|
2025-06-13 17:00:24 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2025-04-01 21:35:30 +08:00
|
|
|
|
},
|
2025-06-13 17:00:24 +08:00
|
|
|
|
// Binddevice() {
|
|
|
|
|
|
// uni.showLoading({
|
|
|
|
|
|
// title: '连接中..'
|
|
|
|
|
|
// })
|
|
|
|
|
|
// console.log("xBlufi", xBlufi.XMQTT_SYSTEM)
|
|
|
|
|
|
// xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent)
|
|
|
|
|
|
// xBlufi.notifyStartDiscoverBle({
|
|
|
|
|
|
// 'isStart': true
|
|
|
|
|
|
// })
|
|
|
|
|
|
// // 两秒后停止蓝牙搜索
|
|
|
|
|
|
// setTimeout(() => {
|
|
|
|
|
|
// xBlufi.notifyStartDiscoverBle({
|
|
|
|
|
|
// 'isStart': false
|
|
|
|
|
|
// })
|
|
|
|
|
|
// setTimeout(() => {
|
|
|
|
|
|
// uni.hideLoading()
|
|
|
|
|
|
// if (this.devicesList.length == 0) {
|
|
|
|
|
|
// uni.showToast({
|
|
|
|
|
|
// title: '暂无发现对应设备,请靠近设备',
|
|
|
|
|
|
// icon: 'none'
|
|
|
|
|
|
// })
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// let uniqueDevicesList = Array.from(new Set(this.devicesList))
|
|
|
|
|
|
// // 将去重后的数组重新赋值给 this.devicesList
|
|
|
|
|
|
// this.devicesList = uniqueDevicesList
|
|
|
|
|
|
// this.devicesList.forEach(device => {
|
|
|
|
|
|
// // 从设备名称中提取 MAC 地址(假设 MAC 地址是设备名称的后6个字符)
|
|
|
|
|
|
// let macFromName = device.name.substring(device.name.length - 12)
|
|
|
|
|
|
// console.log(macFromName, 'macFromNamemacFromName')
|
|
|
|
|
|
// // 与 this.mac 进行比较
|
|
|
|
|
|
// if (macFromName == this.mac) {
|
|
|
|
|
|
// // 如果相同,则将 this.ishave 设置为 true
|
|
|
|
|
|
// console.log(device)
|
|
|
|
|
|
// this.deviceInfoss = device
|
|
|
|
|
|
// this.createBLEConnection(device)
|
|
|
|
|
|
// console.log('对比正确1111111111')
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// console.log('对比错误')
|
|
|
|
|
|
// }
|
|
|
|
|
|
// })
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }, 200)
|
|
|
|
|
|
// }, 2000)
|
|
|
|
|
|
// },
|
2025-04-01 21:35:30 +08:00
|
|
|
|
reboot() {
|
2025-04-27 17:37:23 +08:00
|
|
|
|
let vm = this // 将外部的 this 绑定到 vm 上
|
2025-04-01 21:35:30 +08:00
|
|
|
|
uni.getNetworkType({
|
|
|
|
|
|
success(res) {
|
|
|
|
|
|
if (res.networkType !== 'none') {
|
|
|
|
|
|
uni.getConnectedBluetoothDevices({
|
|
|
|
|
|
success(res) {
|
2025-04-27 17:37:23 +08:00
|
|
|
|
console.log('已连接的蓝牙设备信息:', res)
|
2025-04-01 21:35:30 +08:00
|
|
|
|
xBlufi.notifySendCustomData({
|
|
|
|
|
|
customData: "11reboot"
|
2025-04-27 17:37:23 +08:00
|
|
|
|
})
|
2025-04-01 21:35:30 +08:00
|
|
|
|
},
|
|
|
|
|
|
fail(err) {
|
|
|
|
|
|
uni.hideLoading()
|
2025-04-27 17:37:23 +08:00
|
|
|
|
console.error('获取已连接蓝牙设备信息失败:', err)
|
2025-04-01 21:35:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
} else {
|
2025-04-27 17:37:23 +08:00
|
|
|
|
console.log('手机未连接网络')
|
2025-04-01 21:35:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-06-06 16:53:36 +08:00
|
|
|
|
})
|
2025-04-01 21:35:30 +08:00
|
|
|
|
},
|
|
|
|
|
|
open() {
|
2025-04-27 17:37:23 +08:00
|
|
|
|
let vm = this // 将外部的 this 绑定到 vm 上
|
2025-04-01 21:35:30 +08:00
|
|
|
|
uni.getNetworkType({
|
|
|
|
|
|
success(res) {
|
|
|
|
|
|
if (res.networkType !== 'none') {
|
|
|
|
|
|
uni.getConnectedBluetoothDevices({
|
|
|
|
|
|
success(res) {
|
2025-04-27 17:37:23 +08:00
|
|
|
|
console.log('已连接的蓝牙设备信息:', res)
|
2025-04-01 21:35:30 +08:00
|
|
|
|
xBlufi.notifySendCustomData({
|
|
|
|
|
|
customData: "11open"
|
2025-04-27 17:37:23 +08:00
|
|
|
|
})
|
2025-04-01 21:35:30 +08:00
|
|
|
|
},
|
|
|
|
|
|
fail(err) {
|
|
|
|
|
|
uni.hideLoading()
|
2025-04-27 17:37:23 +08:00
|
|
|
|
console.error('获取已连接蓝牙设备信息失败:', err)
|
2025-04-01 21:35:30 +08:00
|
|
|
|
}
|
2025-06-06 16:53:36 +08:00
|
|
|
|
})
|
2025-04-01 21:35:30 +08:00
|
|
|
|
} else {
|
2025-04-27 17:37:23 +08:00
|
|
|
|
console.log('手机未连接网络')
|
2025-04-01 21:35:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-04-27 17:37:23 +08:00
|
|
|
|
})
|
2025-04-01 21:35:30 +08:00
|
|
|
|
},
|
2025-06-06 11:32:12 +08:00
|
|
|
|
shaoru(){
|
|
|
|
|
|
let vm = this; // 将外部的 this 绑定到 vm 上
|
|
|
|
|
|
uni.getNetworkType({
|
|
|
|
|
|
success(res) {
|
|
|
|
|
|
if (res.networkType !== 'none') {
|
|
|
|
|
|
uni.getConnectedBluetoothDevices({
|
|
|
|
|
|
success(res) {
|
|
|
|
|
|
console.log('已连接的蓝牙设备信息:', res)
|
|
|
|
|
|
xBlufi.notifySendCustomData({
|
|
|
|
|
|
customData: "11resetGG"
|
|
|
|
|
|
})
|
|
|
|
|
|
},
|
|
|
|
|
|
fail(err) {
|
|
|
|
|
|
uni.hideLoading()
|
|
|
|
|
|
console.error('获取已连接蓝牙设备信息失败:', err)
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
} else {
|
|
|
|
|
|
console.log('手机未连接网络')
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
},
|
2025-04-01 21:35:30 +08:00
|
|
|
|
close() {
|
|
|
|
|
|
let vm = this; // 将外部的 this 绑定到 vm 上
|
|
|
|
|
|
uni.getNetworkType({
|
|
|
|
|
|
success(res) {
|
|
|
|
|
|
if (res.networkType !== 'none') {
|
|
|
|
|
|
uni.getConnectedBluetoothDevices({
|
|
|
|
|
|
success(res) {
|
2025-04-27 17:37:23 +08:00
|
|
|
|
console.log('已连接的蓝牙设备信息:', res)
|
2025-04-01 21:35:30 +08:00
|
|
|
|
xBlufi.notifySendCustomData({
|
|
|
|
|
|
customData: "11close"
|
2025-04-27 17:37:23 +08:00
|
|
|
|
})
|
2025-04-01 21:35:30 +08:00
|
|
|
|
},
|
|
|
|
|
|
fail(err) {
|
|
|
|
|
|
uni.hideLoading()
|
2025-04-27 17:37:23 +08:00
|
|
|
|
console.error('获取已连接蓝牙设备信息失败:', err)
|
2025-04-01 21:35:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
} else {
|
2025-04-27 17:37:23 +08:00
|
|
|
|
console.log('手机未连接网络')
|
2025-04-01 21:35:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
},
|
|
|
|
|
|
ring() {
|
2025-04-27 17:37:23 +08:00
|
|
|
|
let vm = this // 将外部的 this 绑定到 vm 上
|
2025-04-01 21:35:30 +08:00
|
|
|
|
uni.getNetworkType({
|
|
|
|
|
|
success(res) {
|
|
|
|
|
|
if (res.networkType !== 'none') {
|
|
|
|
|
|
uni.getConnectedBluetoothDevices({
|
|
|
|
|
|
success(res) {
|
2025-04-27 17:37:23 +08:00
|
|
|
|
console.log('已连接的蓝牙设备信息:', res)
|
2025-04-01 21:35:30 +08:00
|
|
|
|
xBlufi.notifySendCustomData({
|
|
|
|
|
|
customData: "11play1@"
|
2025-04-27 17:37:23 +08:00
|
|
|
|
})
|
2025-04-01 21:35:30 +08:00
|
|
|
|
},
|
|
|
|
|
|
fail(err) {
|
|
|
|
|
|
uni.hideLoading()
|
2025-04-27 17:37:23 +08:00
|
|
|
|
console.error('获取已连接蓝牙设备信息失败:', err)
|
2025-04-01 21:35:30 +08:00
|
|
|
|
}
|
2025-04-27 17:37:23 +08:00
|
|
|
|
})
|
2025-04-01 21:35:30 +08:00
|
|
|
|
} else {
|
2025-04-27 17:37:23 +08:00
|
|
|
|
console.log('手机未连接网络')
|
2025-04-01 21:35:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-04-27 17:37:23 +08:00
|
|
|
|
})
|
2025-04-01 21:35:30 +08:00
|
|
|
|
},
|
|
|
|
|
|
btnyc() {
|
|
|
|
|
|
this.titleflag = false
|
|
|
|
|
|
},
|
2025-06-13 17:00:24 +08:00
|
|
|
|
// // 解析自定义数据
|
|
|
|
|
|
// funListenDeviceMsgEvent: function(options) {
|
|
|
|
|
|
// switch (options.type) {
|
|
|
|
|
|
// case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS:
|
|
|
|
|
|
// if (options.result) {
|
|
|
|
|
|
// this.devicesarr = options.data
|
|
|
|
|
|
// // devicesarr.forEach(device => {
|
|
|
|
|
|
// // this.devicesList.push(device)
|
|
|
|
|
|
// // let uniqueDevicesList = Array.from(new Set(this.devicesList))
|
|
|
|
|
|
// // // 将去重后的数组重新赋值给 this.devicesList
|
|
|
|
|
|
// // this.devicesList = uniqueDevicesList
|
|
|
|
|
|
// // })
|
|
|
|
|
|
// }
|
|
|
|
|
|
// break;
|
2025-04-27 17:37:23 +08:00
|
|
|
|
|
2025-06-13 17:00:24 +08:00
|
|
|
|
// case xBlufi.XBLUFI_TYPE.TYPE_CONNECTED:
|
|
|
|
|
|
// console.log("连接回调:" + JSON.stringify(options));
|
|
|
|
|
|
// if (options.result) {
|
|
|
|
|
|
// uni.hideLoading();
|
|
|
|
|
|
// uni.showToast({
|
|
|
|
|
|
// title: '连接成功',
|
|
|
|
|
|
// icon: 'none'
|
|
|
|
|
|
// }); {
|
|
|
|
|
|
|
|
|
|
|
|
// xBlufi.notifyInitBleEsp32({
|
|
|
|
|
|
// deviceId: options.data.deviceId
|
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
|
|
// xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvents);
|
|
|
|
|
|
|
|
|
|
|
|
// this.deviceIds = options.data.deviceId
|
|
|
|
|
|
// this.name = options.data.name
|
|
|
|
|
|
// // 连接成功绑定设备
|
|
|
|
|
|
// // let params = {
|
|
|
|
|
|
// // mac: this.Bluetoothmac,
|
|
|
|
|
|
// // userId: this.$store.state.user.userId
|
|
|
|
|
|
// // }
|
|
|
|
|
|
// let systemInfo = uni.getSystemInfoSync();
|
|
|
|
|
|
// if (systemInfo.platform === 'android') {
|
|
|
|
|
|
// // 当前设备是 Android
|
|
|
|
|
|
|
|
|
|
|
|
// } else if (systemInfo.platform === 'ios') {
|
|
|
|
|
|
// // 当前设备是 iOS
|
|
|
|
|
|
// // uni.navigateTo({
|
|
|
|
|
|
// // url: '/pages/wifilist/index?deviceId=' + options
|
|
|
|
|
|
// // .data.deviceId + '&name=' + options.data.name
|
|
|
|
|
|
// // })
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA:
|
|
|
|
|
|
|
|
|
|
|
|
// // this.ver_data = this.parseCustomData(options.data)
|
|
|
|
|
|
// if (options.data) {
|
|
|
|
|
|
// this.carstause = true
|
|
|
|
|
|
// }
|
|
|
|
|
|
// // console.log("1收到设备发来的自定义数据结果:", this.ver_data);
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_STOP:
|
|
|
|
|
|
// if (options.result) {
|
|
|
|
|
|
// let uniqueDevicesList = Array.from(new Set(this.devicesList));
|
|
|
|
|
|
|
|
|
|
|
|
// // 过滤出名称字段的前五个字母为 "CTPOW" 的项
|
|
|
|
|
|
// let filteredDevices = uniqueDevicesList.filter(device => device.name.substring(0, 4) ===
|
|
|
|
|
|
// "BBLE");
|
|
|
|
|
|
|
|
|
|
|
|
// // 将过滤后的数组重新赋值给 this.devicesList
|
|
|
|
|
|
// this.devicesList = filteredDevices;
|
|
|
|
|
|
|
|
|
|
|
|
// // console.log('蓝牙停止搜索ok',this.devicesList);
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// //蓝牙停止搜索失败
|
|
|
|
|
|
// // console.log('蓝牙停止搜索失败');
|
|
|
|
|
|
// }
|
|
|
|
|
|
// this.searching = false
|
|
|
|
|
|
// // _this.setData({
|
|
|
|
|
|
// // searching: false
|
|
|
|
|
|
// // });
|
|
|
|
|
|
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// },
|
2025-04-01 21:35:30 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//4、建立连接
|
|
|
|
|
|
createBLEConnection(e) {
|
|
|
|
|
|
console.log('调用了');
|
|
|
|
|
|
xBlufi.notifyStartDiscoverBle({
|
|
|
|
|
|
'isStart': false
|
|
|
|
|
|
});
|
|
|
|
|
|
console.log(e, '蓝牙信息')
|
|
|
|
|
|
const deviceId = e.deviceId
|
|
|
|
|
|
// this.Bluetoothmac = e.localName.substring(5) //从第七位开始截取 只取后面的mac号
|
|
|
|
|
|
// console.log(this.Bluetoothmac, '11111');
|
|
|
|
|
|
let name = e.name;
|
|
|
|
|
|
console.log('点击了,蓝牙准备连接的deviceId:' + e.deviceId);
|
|
|
|
|
|
xBlufi.notifyConnectBle({
|
|
|
|
|
|
isStart: true,
|
|
|
|
|
|
deviceId: e.deviceId,
|
|
|
|
|
|
name
|
|
|
|
|
|
});
|
|
|
|
|
|
// for (var i = 0; i < this.devicesList.length; i++) {
|
|
|
|
|
|
// if (e.deviceId === this.devicesList[i].deviceId) {
|
|
|
|
|
|
|
|
|
|
|
|
// uni.showLoading({
|
|
|
|
|
|
// title: '连接蓝牙设备中...'
|
|
|
|
|
|
// });
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
},
|
|
|
|
|
|
// 点击重新搜索
|
|
|
|
|
|
Search() {
|
|
|
|
|
|
if (this.status) {
|
|
|
|
|
|
xBlufi.notifyStartDiscoverBle({
|
|
|
|
|
|
'isStart': true
|
|
|
|
|
|
});
|
|
|
|
|
|
// 重新搜索清空蓝牙数组
|
|
|
|
|
|
this.bluthlist = []
|
|
|
|
|
|
this.devicesList = []
|
|
|
|
|
|
// 重新搜索
|
|
|
|
|
|
// this.startBluetoothDevicesDiscovery()
|
|
|
|
|
|
this.statusflag = true
|
|
|
|
|
|
this.status = false
|
|
|
|
|
|
this.texts = '正在扫描蓝牙设备...'
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
this.statusflag = false
|
|
|
|
|
|
this.status = true
|
|
|
|
|
|
if (this.searching) {
|
|
|
|
|
|
xBlufi.notifyStartDiscoverBle({
|
|
|
|
|
|
'isStart': false
|
|
|
|
|
|
});
|
|
|
|
|
|
// 判断是否存在浇花器设备
|
|
|
|
|
|
if (this.devicesList.length == 0) {
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title: '暂无发现对应设备,请靠近设备',
|
|
|
|
|
|
icon: 'none'
|
|
|
|
|
|
});
|
|
|
|
|
|
} else {
|
|
|
|
|
|
this.texts = '扫描到以下设备,请点击连接!'
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
xBlufi.notifyStartDiscoverBle({
|
|
|
|
|
|
'isStart': true
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 2000)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
},
|
2025-06-13 17:00:24 +08:00
|
|
|
|
// funListenDeviceMsgEvents: function(options) {
|
|
|
|
|
|
// let that = this;
|
|
|
|
|
|
// switch (options.type) {
|
|
|
|
|
|
// case xBlufi.XBLUFI_TYPE.TYPE_STATUS_CONNECTED: {
|
|
|
|
|
|
// console.log('状态', options.result)
|
|
|
|
|
|
// if (options.result == false) {
|
|
|
|
|
|
// this.carstause = false
|
|
|
|
|
|
// uni.showToast({
|
|
|
|
|
|
// title: '设备断开链接,请重新点击蓝牙链接',
|
|
|
|
|
|
// icon: 'none'
|
|
|
|
|
|
// });
|
|
|
|
|
|
// // uni.showModal({
|
|
|
|
|
|
// // title: '很抱歉提醒你!',
|
|
|
|
|
|
// // content: '小程序与设备异常断开',
|
|
|
|
|
|
// // showCancel: false,
|
|
|
|
|
|
// // success: function(res) {
|
|
|
|
|
|
// // // uni.navigateBack({
|
|
|
|
|
|
// // // url: '../search/search'
|
|
|
|
|
|
// // // });
|
|
|
|
|
|
// // }
|
|
|
|
|
|
// // });
|
|
|
|
|
|
// // this.statusflag = false
|
|
|
|
|
|
// uni.hideLoading();
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// break;
|
|
|
|
|
|
|
|
|
|
|
|
// case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_MY_DATA:
|
|
|
|
|
|
// this.loadPercent = options.data;
|
|
|
|
|
|
// this.loadText = '文件读取中'
|
|
|
|
|
|
// console.log("文件读取中", options.data);
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA:
|
|
|
|
|
|
// // this.isband = true
|
|
|
|
|
|
// // this.ver_data = this.parseCustomData(options.data)
|
|
|
|
|
|
// console.log("1收到设备发来的自定义数据结果:", options.data);
|
|
|
|
|
|
// if (options.data) {
|
|
|
|
|
|
// this.carstause = true
|
|
|
|
|
|
// }
|
|
|
|
|
|
// break;
|
|
|
|
|
|
|
|
|
|
|
|
// case xBlufi.XBLUFI_TYPE.TYPE_INIT_ESP32_RESULT:
|
|
|
|
|
|
// uni.hideLoading();
|
|
|
|
|
|
// if (options.result) {
|
|
|
|
|
|
// console.log('初始化成功');
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// console.log('初始化失败');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// },
|
2025-04-01 21:35:30 +08:00
|
|
|
|
// 点击隐藏没有设备提示
|
|
|
|
|
|
btnhd() {
|
|
|
|
|
|
this.tishiflag = false
|
|
|
|
|
|
},
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style lang="scss">
|
|
|
|
|
|
page {
|
|
|
|
|
|
overflow-x: hidden;
|
|
|
|
|
|
background-color: #F3F3F3;
|
|
|
|
|
|
}
|
2026-04-28 14:01:46 +08:00
|
|
|
|
.apn-placeholder {
|
|
|
|
|
|
color: #9a9a9a;
|
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
.page {
|
|
|
|
|
|
padding-bottom: 280rpx;
|
2025-04-01 21:35:30 +08:00
|
|
|
|
width: 750rpx;
|
2026-04-28 14:01:46 +08:00
|
|
|
|
.hardware-block {
|
|
|
|
|
|
margin: 28rpx auto 0;
|
|
|
|
|
|
width: 658rpx;
|
|
|
|
|
|
background: #ffffff;
|
|
|
|
|
|
border-radius: 20rpx;
|
|
|
|
|
|
box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0, 0, 0, 0.15);
|
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
}
|
|
|
|
|
|
.iptbox--hw-line {
|
|
|
|
|
|
margin: 0;
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 88rpx;
|
|
|
|
|
|
border-radius: 0;
|
|
|
|
|
|
box-shadow: none;
|
|
|
|
|
|
}
|
|
|
|
|
|
.hardware-block__intro {
|
|
|
|
|
|
margin: 0;
|
|
|
|
|
|
padding: 20rpx 22rpx 24rpx;
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
background: #ffffff;
|
|
|
|
|
|
border-top: 1rpx solid #E8ECF0;
|
|
|
|
|
|
}
|
|
|
|
|
|
.hardware-block__intro-label {
|
|
|
|
|
|
font-size: 26rpx;
|
|
|
|
|
|
color: #666;
|
|
|
|
|
|
}
|
|
|
|
|
|
.hardware-block__intro-text {
|
|
|
|
|
|
font-size: 26rpx;
|
|
|
|
|
|
color: #262b37;
|
|
|
|
|
|
line-height: 1.55;
|
|
|
|
|
|
word-break: break-all;
|
|
|
|
|
|
}
|
|
|
|
|
|
.apn-below-actions {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
|
margin: 28rpx auto 0;
|
|
|
|
|
|
width: 658rpx;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
background: #ffffff;
|
|
|
|
|
|
border-radius: 20rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
// .apn-below-actions__img {
|
|
|
|
|
|
// flex-shrink: 0;
|
|
|
|
|
|
// width: 120rpx;
|
|
|
|
|
|
// height: 120rpx;
|
|
|
|
|
|
// margin-left: 20rpx;
|
|
|
|
|
|
// margin-right: 0;
|
|
|
|
|
|
// border-radius: 16rpx;
|
|
|
|
|
|
// overflow: hidden;
|
|
|
|
|
|
// background: #f5f7fa;
|
|
|
|
|
|
// image {
|
|
|
|
|
|
// width: 120rpx;
|
|
|
|
|
|
// height: 120rpx;
|
|
|
|
|
|
// display: block;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
.apn-below-actions__btns {
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
|
flex-wrap: nowrap;
|
|
|
|
|
|
width: 658rpx;
|
|
|
|
|
|
/* 与 page 内 .bot_btn .btn1 同套样式(此处 btn 未包在 .bot_btn 下需单独写) */
|
|
|
|
|
|
.btn1 {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
width: 164rpx;
|
|
|
|
|
|
height: 80rpx;
|
|
|
|
|
|
background: #E2F2FF;
|
|
|
|
|
|
border: 2rpx solid #4C97E7;
|
|
|
|
|
|
border-radius: 0rpx;
|
|
|
|
|
|
font-weight: 400;
|
|
|
|
|
|
font-size: 28rpx;
|
|
|
|
|
|
color: #3D3D3D;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
flex: 0 0 auto;
|
|
|
|
|
|
margin: 0;
|
|
|
|
|
|
border-radius: 10rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
.btn1 + .btn1 {
|
|
|
|
|
|
margin-left: 12rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/* 自定义选择硬件:底部弹层,列表文案左对齐 */
|
|
|
|
|
|
.hw-picker-sheet {
|
|
|
|
|
|
position: fixed;
|
|
|
|
|
|
left: 0;
|
|
|
|
|
|
right: 0;
|
|
|
|
|
|
bottom: 0;
|
|
|
|
|
|
z-index: 101;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
max-height: 72vh;
|
|
|
|
|
|
background: #ffffff;
|
|
|
|
|
|
border-radius: 24rpx 24rpx 0 0;
|
|
|
|
|
|
box-shadow: 0 -8rpx 32rpx rgba(0, 0, 0, 0.08);
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
|
}
|
|
|
|
|
|
.hw-picker__toolbar {
|
|
|
|
|
|
position: relative;
|
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-direction: row;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
|
height: 96rpx;
|
|
|
|
|
|
padding: 0 28rpx;
|
|
|
|
|
|
border-bottom: 1rpx solid #ececec;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
}
|
|
|
|
|
|
.hw-picker__tb-title {
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
left: 0;
|
|
|
|
|
|
right: 0;
|
|
|
|
|
|
top: 0;
|
|
|
|
|
|
bottom: 0;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
font-weight: 600;
|
|
|
|
|
|
color: #262b37;
|
|
|
|
|
|
pointer-events: none;
|
|
|
|
|
|
}
|
|
|
|
|
|
.hw-picker__tb-side {
|
|
|
|
|
|
position: relative;
|
|
|
|
|
|
z-index: 1;
|
|
|
|
|
|
font-size: 30rpx;
|
|
|
|
|
|
color: #3d3d3d;
|
|
|
|
|
|
padding: 12rpx 8rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
/* 与左侧「取消」对称占位,保持标题真正居中 */
|
|
|
|
|
|
.hw-picker__tb-spacer {
|
|
|
|
|
|
position: relative;
|
|
|
|
|
|
z-index: 1;
|
|
|
|
|
|
width: 100rpx;
|
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
.hw-picker__scroll {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
min-height: 240rpx;
|
|
|
|
|
|
max-height: 58vh;
|
|
|
|
|
|
height: 48vh;
|
|
|
|
|
|
margin-top: 20rpx;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
}
|
|
|
|
|
|
.hw-picker__row {
|
|
|
|
|
|
padding: 26rpx 28rpx;
|
|
|
|
|
|
border-bottom: 1rpx solid #f0f2f5;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
text-align: left;
|
|
|
|
|
|
}
|
|
|
|
|
|
.hw-picker__row-line {
|
|
|
|
|
|
text-align: left;
|
|
|
|
|
|
line-height: 1.55;
|
|
|
|
|
|
}
|
|
|
|
|
|
.hw-picker__ver {
|
|
|
|
|
|
font-size: 28rpx;
|
|
|
|
|
|
font-weight: 600;
|
|
|
|
|
|
color: #4c97e7;
|
|
|
|
|
|
margin-right: 8rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
.hw-picker__rest {
|
|
|
|
|
|
font-size: 28rpx;
|
|
|
|
|
|
font-weight: 400;
|
|
|
|
|
|
color: #3d3d3d;
|
|
|
|
|
|
word-break: break-all;
|
|
|
|
|
|
}
|
|
|
|
|
|
.device-and-apn-card {
|
|
|
|
|
|
margin: 28rpx auto 0;
|
|
|
|
|
|
width: 658rpx;
|
|
|
|
|
|
background: #ffffff;
|
|
|
|
|
|
border-radius: 20rpx;
|
|
|
|
|
|
box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0, 0, 0, 0.12);
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
|
.device-telemetry--grid {
|
|
|
|
|
|
margin: 0;
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
padding: 20rpx 20rpx 24rpx;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
}
|
|
|
|
|
|
.device-telemetry__grid-row {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-direction: row;
|
|
|
|
|
|
align-items: flex-start;
|
|
|
|
|
|
margin-top: 20rpx;
|
|
|
|
|
|
&:first-of-type {
|
|
|
|
|
|
margin-top: 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.device-telemetry__grid-row--full {
|
|
|
|
|
|
.device-telemetry__cell--full {
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
min-width: 0;
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
padding: 0 8rpx;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
font-size: 26rpx;
|
|
|
|
|
|
line-height: 1.5;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.device-telemetry__cell {
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
width: 0;
|
|
|
|
|
|
min-width: 0;
|
|
|
|
|
|
padding: 0 8rpx;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
font-size: 26rpx;
|
|
|
|
|
|
line-height: 1.5;
|
|
|
|
|
|
&--has-coeff {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.device-telemetry__pair-cell-inner {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
flex-wrap: wrap;
|
|
|
|
|
|
.device-telemetry__v {
|
|
|
|
|
|
display: inline;
|
|
|
|
|
|
margin-top: 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.device-telemetry__k {
|
|
|
|
|
|
color: #666;
|
|
|
|
|
|
}
|
|
|
|
|
|
.device-telemetry__v {
|
|
|
|
|
|
display: block;
|
|
|
|
|
|
margin-top: 4rpx;
|
|
|
|
|
|
color: #262b37;
|
|
|
|
|
|
word-break: break-all;
|
|
|
|
|
|
}
|
|
|
|
|
|
/* APN/定位 行:不在中间换行,长内容省略;定位无侧栏 */
|
|
|
|
|
|
.device-telemetry__apn-line {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-direction: row;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
|
flex-wrap: nowrap;
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
min-width: 0;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
}
|
|
|
|
|
|
.device-telemetry__apn-line.device-telemetry__loc-line {
|
|
|
|
|
|
justify-content: flex-start;
|
|
|
|
|
|
}
|
|
|
|
|
|
.device-telemetry__apn-line-main {
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
min-width: 0;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-direction: row;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
flex-wrap: nowrap;
|
|
|
|
|
|
}
|
|
|
|
|
|
.device-telemetry__v--apn-inline {
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
min-width: 0;
|
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
|
text-overflow: ellipsis;
|
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
|
margin-top: 0;
|
|
|
|
|
|
color: #262b37;
|
|
|
|
|
|
}
|
|
|
|
|
|
.device-telemetry__apn-edit {
|
|
|
|
|
|
flex: 0 0 auto;
|
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
|
margin-left: 16rpx;
|
|
|
|
|
|
padding: 6rpx 20rpx;
|
|
|
|
|
|
font-size: 26rpx;
|
|
|
|
|
|
color: #4c97e7;
|
|
|
|
|
|
border: 2rpx solid #4c97e7;
|
|
|
|
|
|
border-radius: 10rpx;
|
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.coeff_box {
|
|
|
|
|
|
.coeff-modal-hint {
|
|
|
|
|
|
margin-top: 16rpx;
|
|
|
|
|
|
font-size: 24rpx;
|
|
|
|
|
|
color: #888;
|
|
|
|
|
|
line-height: 1.45;
|
|
|
|
|
|
text-align: left;
|
|
|
|
|
|
}
|
|
|
|
|
|
.coeff-modal-readonly {
|
|
|
|
|
|
margin-top: 20rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
.coeff-modal-row {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-direction: row;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
|
margin-top: 16rpx;
|
|
|
|
|
|
font-size: 28rpx;
|
|
|
|
|
|
&:first-child {
|
|
|
|
|
|
margin-top: 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.coeff-modal-k {
|
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
|
color: #666;
|
|
|
|
|
|
margin-right: 16rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
.coeff-modal-v {
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
min-width: 0;
|
|
|
|
|
|
color: #262b37;
|
|
|
|
|
|
text-align: right;
|
|
|
|
|
|
word-break: break-all;
|
|
|
|
|
|
&--em {
|
|
|
|
|
|
color: #4c97e7;
|
|
|
|
|
|
font-weight: 600;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.coeff-modal-input {
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
min-width: 0;
|
|
|
|
|
|
height: 72rpx;
|
|
|
|
|
|
padding: 0 20rpx;
|
|
|
|
|
|
font-size: 30rpx;
|
|
|
|
|
|
color: #262b37;
|
|
|
|
|
|
text-align: right;
|
|
|
|
|
|
border: 2rpx solid #979797;
|
|
|
|
|
|
border-radius: 12rpx;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.apn-row {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
|
margin: 28rpx auto 0;
|
|
|
|
|
|
padding: 22rpx 24rpx;
|
|
|
|
|
|
width: 658rpx;
|
|
|
|
|
|
min-height: 88rpx;
|
|
|
|
|
|
background: #ffffff;
|
|
|
|
|
|
box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0, 0, 0, 0.15);
|
|
|
|
|
|
border-radius: 20rpx;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
&__text {
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
min-width: 0;
|
|
|
|
|
|
padding-right: 20rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
&__label {
|
|
|
|
|
|
font-size: 28rpx;
|
|
|
|
|
|
color: #666;
|
|
|
|
|
|
}
|
|
|
|
|
|
&__val {
|
|
|
|
|
|
display: block;
|
|
|
|
|
|
margin-top: 8rpx;
|
|
|
|
|
|
font-size: 30rpx;
|
|
|
|
|
|
color: #262b37;
|
|
|
|
|
|
word-break: break-all;
|
|
|
|
|
|
}
|
|
|
|
|
|
&__edit {
|
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
|
padding: 10rpx 24rpx;
|
|
|
|
|
|
font-size: 28rpx;
|
|
|
|
|
|
color: #4c97e7;
|
|
|
|
|
|
border: 2rpx solid #4c97e7;
|
|
|
|
|
|
border-radius: 12rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.apn_box {
|
|
|
|
|
|
position: fixed;
|
|
|
|
|
|
left: 72rpx;
|
|
|
|
|
|
top: 500rpx;
|
|
|
|
|
|
width: 610rpx;
|
|
|
|
|
|
background: #ffffff;
|
|
|
|
|
|
border-radius: 30rpx;
|
|
|
|
|
|
z-index: 110;
|
|
|
|
|
|
padding-bottom: 100rpx;
|
|
|
|
|
|
.top {
|
|
|
|
|
|
padding: 44rpx 36rpx 32rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
.tip {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
font-weight: 700;
|
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
color: #3d3d3d;
|
|
|
|
|
|
}
|
|
|
|
|
|
.apn_ipt {
|
|
|
|
|
|
margin-top: 28rpx;
|
|
|
|
|
|
&__field {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 160rpx;
|
|
|
|
|
|
padding: 24rpx 24rpx;
|
|
|
|
|
|
font-size: 34rpx;
|
|
|
|
|
|
line-height: 1.5;
|
|
|
|
|
|
color: #262b37;
|
|
|
|
|
|
border: 2rpx solid #979797;
|
|
|
|
|
|
border-radius: 16rpx;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.bots {
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
width: 610rpx;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-wrap: nowrap;
|
|
|
|
|
|
bottom: -20rpx;
|
|
|
|
|
|
.bot_left {
|
|
|
|
|
|
border-radius: 0rpx 0rpx 0rpx 30rpx;
|
|
|
|
|
|
width: 50%;
|
|
|
|
|
|
height: 86rpx;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
font-weight: 500;
|
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
color: #3d3d3d;
|
|
|
|
|
|
background: #eeeeee;
|
|
|
|
|
|
}
|
|
|
|
|
|
.bot_right {
|
|
|
|
|
|
border-radius: 0rpx 0rpx 30rpx 0rpx;
|
|
|
|
|
|
width: 50%;
|
|
|
|
|
|
height: 86rpx;
|
|
|
|
|
|
background: #4c97e7;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
color: #ffffff;
|
|
|
|
|
|
font-weight: 500;
|
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-04-01 21:35:30 +08:00
|
|
|
|
.tip_box {
|
|
|
|
|
|
position: fixed;
|
|
|
|
|
|
left: 72rpx;
|
|
|
|
|
|
top: 628rpx;
|
|
|
|
|
|
width: 610rpx;
|
|
|
|
|
|
background: #FFFFFF;
|
|
|
|
|
|
border-radius: 30rpx 30rpx 30rpx 30rpx;
|
|
|
|
|
|
z-index: 110;
|
|
|
|
|
|
padding-bottom: 100rpx;
|
|
|
|
|
|
.top {
|
|
|
|
|
|
padding: 52rpx 38rpx 42rpx 36rpx;
|
|
|
|
|
|
.ipt_box {
|
|
|
|
|
|
margin-top: 22rpx;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-wrap: nowrap;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
.text {
|
|
|
|
|
|
width: 350rpx;
|
|
|
|
|
|
font-weight: 400;
|
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
color: #3D3D3D;
|
|
|
|
|
|
}
|
|
|
|
|
|
.ipt {
|
|
|
|
|
|
padding: 10rpx 18rpx;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
|
margin-left: 26rpx;
|
|
|
|
|
|
width: 420rpx;
|
|
|
|
|
|
height: 64rpx;
|
|
|
|
|
|
border-radius: 0rpx 0rpx 0rpx 0rpx;
|
|
|
|
|
|
border: 2rpx solid #979797;
|
|
|
|
|
|
.input {
|
|
|
|
|
|
width: 80%;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.tip {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
font-weight: 700;
|
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
color: #3D3D3D;
|
|
|
|
|
|
}
|
|
|
|
|
|
.txt {
|
|
|
|
|
|
margin-top: 32rpx;
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
font-weight: 500;
|
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
color: #3D3D3D;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.bots {
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
width: 610rpx;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-wrap: nowrap;
|
|
|
|
|
|
bottom: -20rpx;
|
|
|
|
|
|
.bot_left {
|
|
|
|
|
|
border-radius: 0rpx 0rpx 0rpx 30rpx;
|
|
|
|
|
|
width: 50%;
|
|
|
|
|
|
height: 86rpx;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
font-weight: 500;
|
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
color: #3D3D3D;
|
|
|
|
|
|
background: #EEEEEE;
|
|
|
|
|
|
}
|
|
|
|
|
|
.bot_right {
|
|
|
|
|
|
border-radius: 0rpx 0rpx 30rpx 0rpx;
|
|
|
|
|
|
width: 50%;
|
|
|
|
|
|
height: 86rpx;
|
|
|
|
|
|
background: #4C97E7;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
color: #FFFFFF;
|
|
|
|
|
|
font-weight: 500;
|
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-04-28 14:01:46 +08:00
|
|
|
|
.page-bottom-dock {
|
|
|
|
|
|
position: fixed;
|
|
|
|
|
|
left: 0;
|
|
|
|
|
|
bottom: 0rpx;
|
|
|
|
|
|
padding-bottom: 30rpx;
|
|
|
|
|
|
width: 750rpx;
|
|
|
|
|
|
z-index: 8;
|
|
|
|
|
|
background: #fff;
|
|
|
|
|
|
box-shadow: 0rpx -6rpx 24rpx rgba(0, 0, 0, 0.06);
|
2025-04-01 21:35:30 +08:00
|
|
|
|
}
|
2026-04-28 14:01:46 +08:00
|
|
|
|
.btn-bind {
|
2025-04-01 21:35:30 +08:00
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
background: #27c2fd;
|
|
|
|
|
|
font-weight: 500;
|
2026-04-28 14:01:46 +08:00
|
|
|
|
color: #ffffff;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
}
|
|
|
|
|
|
.btn-bind--full {
|
|
|
|
|
|
width: 658rpx;
|
|
|
|
|
|
max-width: calc(100% - 48rpx);
|
|
|
|
|
|
height: 88rpx;
|
|
|
|
|
|
margin: 20rpx auto 0;
|
|
|
|
|
|
padding: 0 20rpx;
|
|
|
|
|
|
border-radius: 20rpx;
|
2025-04-01 21:35:30 +08:00
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
.tips {
|
2026-04-28 14:01:46 +08:00
|
|
|
|
margin: 20rpx auto 0;
|
2025-04-01 21:35:30 +08:00
|
|
|
|
width: 658rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.iptbox {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
flex-wrap: nowrap;
|
|
|
|
|
|
padding: 22rpx;
|
|
|
|
|
|
margin: 28rpx auto 0;
|
|
|
|
|
|
width: 658rpx;
|
2026-04-28 14:01:46 +08:00
|
|
|
|
min-height: 88rpx;
|
2025-04-01 21:35:30 +08:00
|
|
|
|
background: #FFFFFF;
|
|
|
|
|
|
box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0, 0, 0, 0.15);
|
|
|
|
|
|
border-radius: 20rpx 20rpx 20rpx 20rpx;
|
|
|
|
|
|
|
|
|
|
|
|
.qrcode {
|
|
|
|
|
|
padding-right: 20rpx;
|
|
|
|
|
|
border-right: 2rpx solid #D8D8D8;
|
|
|
|
|
|
|
|
|
|
|
|
image {
|
|
|
|
|
|
width: 54rpx;
|
|
|
|
|
|
height: 54rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.ips {
|
|
|
|
|
|
width: 630rpx;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
image {
|
|
|
|
|
|
width: 18rpx;
|
|
|
|
|
|
height: 32rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.my-placeholder {
|
|
|
|
|
|
font-weight: 400;
|
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
color: #808080;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.bot_btn {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-wrap: wrap;
|
2026-04-28 14:01:46 +08:00
|
|
|
|
padding: 20rpx 18rpx 32rpx;
|
2025-04-01 21:35:30 +08:00
|
|
|
|
width: 750rpx;
|
|
|
|
|
|
background: #fff;
|
2026-04-28 14:01:46 +08:00
|
|
|
|
box-sizing: border-box;
|
2025-04-01 21:35:30 +08:00
|
|
|
|
|
|
|
|
|
|
.btn:nth-child(4n) {
|
|
|
|
|
|
margin-right: 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.btn1 {
|
|
|
|
|
|
margin-top: 10rpx;
|
|
|
|
|
|
margin-right: 12rpx;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
width: 164rpx;
|
|
|
|
|
|
height: 66rpx;
|
|
|
|
|
|
background: #E2F2FF;
|
|
|
|
|
|
border-radius: 0rpx 0rpx 0rpx 0rpx;
|
|
|
|
|
|
border: 2rpx solid #4C97E7;
|
|
|
|
|
|
font-weight: 400;
|
|
|
|
|
|
font-size: 28rpx;
|
|
|
|
|
|
color: #3D3D3D;
|
2026-04-28 14:01:46 +08:00
|
|
|
|
border-radius: 10rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.bot_btn--grid {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-wrap: wrap;
|
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
|
width: 658rpx;
|
|
|
|
|
|
max-width: 100%;
|
|
|
|
|
|
margin: 0 auto;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
background: #fff;
|
|
|
|
|
|
.btn1 {
|
|
|
|
|
|
margin: 0 0 20rpx 0;
|
|
|
|
|
|
width: 31.6%;
|
|
|
|
|
|
max-width: 210rpx;
|
|
|
|
|
|
height: 80rpx;
|
|
|
|
|
|
box-sizing: border-box;
|
2025-04-01 21:35:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
</style>
|