Files
2026-07-03 11:45:16 +08:00

308 lines
9.3 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="page-container">
<scroll-view class="page-body" scroll-y>
<view class="device-section">
<!-- 打印设备 -->
<view class="device-card">
<view class="device-header">
<uni-icons custom-prefix="iconfont" type="icon-dayinji"size="20" color="#1890ff"></uni-icons>
<text class="device-title">打印设备</text>
</view>
<view class="device-status">
<view class="device-dot" :class="printerStatus.dotClass"></view>
<text :style="{ color: printerStatus.color }">{{ printerStatus.text }}</text>
<text style="color:#1890ff;margin-left:auto;">蓝牙</text>
</view>
<view class="device-info">
<view class="info-row"><text class="label">连接方式</text><text class="value">蓝牙</text></view>
<view class="info-row"><text class="label">打印机型号</text><text class="value">{{ printer.deviceName }}</text></view>
<view class="info-row"><text class="label">标签尺寸</text><text class="value">{{ printer.size }}</text></view>
</view>
<view class="device-actions">
<button class="btn btn-primary" @click="handlePrinter">配置</button>
<button class="btn btn-primary" @click="testPrinter">测试设备</button>
<button class="btn btn-outline" @click="debugPrinter">调试打印</button>
</view>
</view>
<!-- 扫码配置 -->
<view class="device-card">
<view class="device-header">
<uni-icons type="scan" size="20" color="#1890ff"></uni-icons>
<text class="device-title">扫码配置</text>
</view>
<view class="device-status">
<view class="device-dot paired"></view>
<text style="color:#1890ff;">{{ scanModeText }}</text>
</view>
<view class="device-info">
<view class="info-row">
<text class="label">当前模式</text>
<text class="value">{{ scanModeText }}</text>
</view>
<view class="info-row">
<text class="label">说明</text>
<text class="value value-desc">{{ scanMode === 'uniapp' ? '使用默认摄像头扫码' : scanMode === 'idata' ? '仅支持 iData 设备内置扫码' : '通用 Android PDA 设备' }}
</text>
</view>
</view>
<view class="device-actions">
<button class="btn btn-primary" @click="selectScanMode">切换扫码模式</button>
</view>
</view>
<!-- 称重设备 -->
<view class="device-card">
<view class="device-header">
<uni-icons custom-prefix="iconfont" type="icon-chengzhong"size="20" color="#1890ff"></uni-icons>
<text class="device-title">称重设备</text>
</view>
<view class="device-status">
<view class="device-dot" :class="scaleStatus.dotClass"></view>
<text :style="{ color: scaleStatus.color }">{{ scaleStatus.text }}</text>
<text style="color:#1890ff;margin-left:auto;">蓝牙</text>
</view>
<view class="device-info">
<view class="info-row"><text class="label">连接方式</text><text class="value">蓝牙</text></view>
<view class="info-row"><text class="label">称重仪器</text><text class="value">{{ scale.model }}</text></view>
<view class="info-row"><text class="label">小数精度</text><text class="value">{{ scale.precision }}</text></view>
<view class="info-row"><text class="label">重量单位</text><text class="value">{{ scale.unit }}</text></view>
</view>
<view class="device-actions">
<button class="btn btn-outline" @click="handleScale">配置</button>
<button class="btn btn-primary" @click="testScale">测试设备</button>
</view>
</view>
</view>
</scroll-view>
</view>
</template>
<script>
import { mapGetters, mapState } from 'vuex';
export default {
computed: {
...mapState('print', ['printerConfig']),
...mapState('scale', ['scaleConfig']),
...mapState('scan', ['scanMode']),
// 打印机状态计算(只有未配置和已配对两种)
printerStatus() {
const config = this.printerConfig
if (config.deviceId) {
return { text: '已配对', color: '#1890ff', dotClass: 'paired' }
}
return { text: '未配置', color: '#999', dotClass: 'offline' }
},
// 打印机信息
printer() {
const config = this.printerConfig
return {
deviceName: config.deviceName || '-',
size: config.paperWidth && config.paperHeight
? `${config.paperWidth}×${config.paperHeight}mm`
: '-'
}
},
// 称重设备状态计算
scaleStatus() {
const config = this.scaleConfig
if (config.deviceId) {
return { text: '已配对', color: '#1890ff', dotClass: 'paired' }
}
return { text: '未配置', color: '#999', dotClass: 'offline' }
},
// 称重设备信息
scale() {
const config = this.scaleConfig
return {
model: config.model || '-',
precision: config.precision ? `${config.precision}` : '-',
unit: config.unit || '-'
}
},
// 扫码模式文字
scanModeText() {
const map = {
uniapp: '安卓设备',
idata: 'IDATA PDA设备',
android: '带扫码PDA设备'
}
return map[this.scanMode] || '安卓设备'
}
},
onLoad() {
this.$store.dispatch('scan/initScanMode')
this.$store.dispatch('scale/initScaleConfig') // 初始化称重配置
},
methods: {
handlePrinter() {
uni.navigateTo({
url: '/pages/settings/devices/printer'
})
},
handleScale() {
uni.navigateTo({
url: '/pages/settings/devices/scale'
})
},
testPrinter() {
uni.navigateTo({
url: '/pages/settings/devices/configPrinter'
})
},
testScale() {
uni.navigateTo({
url: '/pages/settings/devices/scaleTest'
})
},
debugPrinter() {
uni.navigateTo({
// url: '/pages/testpages/blerinte'
url: '/pages/settings/devices/printTest'
})
},
// === 扫码模式切换 ===
async selectScanMode() {
try {
// 使用对象数组,key:value 形式定义选项
const modeOptions = [
{ key: 'uniapp', label: '安卓设备' },
{ key: 'idata', label: 'IDATA PDA设备' },
{ key: 'android', label: '带扫码PDA设备' }
]
const res = await uni.showActionSheet({
itemList: modeOptions.map(m => m.label) // 提取标签显示
})
// 兼容不同平台的返回值格式
// 注意:某些情况下返回值可能是数组 [null, {errMsg, tapIndex}]
let tapIndex = null
if (Array.isArray(res)) {
// 数组格式:[null, {errMsg: "showActionSheet:ok", tapIndex: 0}]
const data = res[1] || res[0]
tapIndex = data ? (data.tapIndex !== undefined ? data.tapIndex : data.index) : null
} else if (res && typeof res === 'object') {
// 对象格式:{errMsg: "showActionSheet:ok", tapIndex: 0}
tapIndex = res.tapIndex !== undefined ? res.tapIndex : res.index
}
if (tapIndex === undefined || tapIndex === null) {
console.error('[Device] 无法获取用户选择:', res)
return
}
const mode = modeOptions[tapIndex].key // 直接获取对应的 key
if (!mode) {
console.error('[Device] 无效的模式索引:', tapIndex)
return
}
console.log('[Device] 切换扫码模式为:', mode)
this.$store.dispatch('scan/setScanMode', mode)
uni.showToast({ title: '已切换为' + this.scanModeText, icon: 'none' })
} catch (err) {
// 用户取消选择,不处理
console.log('[Device] 用户取消扫码模式选择')
}
}
}
}
</script>
<style lang="scss" scoped>
.device-section {
padding: $spacing-md;
}
.device-card {
background: #ffffff;
border-radius: $border-radius-md;
padding: $spacing-md;
margin-bottom: $spacing-base;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
}
.device-header {
display: flex;
align-items: center;
gap: $spacing-sm;
margin-bottom: $spacing-base;
}
.device-title {
font-size: $font-size-md;
color: $text-primary;
font-weight: 600;
}
.device-status {
display: flex;
align-items: center;
gap: $spacing-sm;
margin-bottom: $spacing-base;
}
.device-dot {
width: 8px;
height: 8px;
border-radius: 50%;
&.online {
background: #52c41a;
}
&.paired {
background: #1890ff;
}
&.offline {
background: #999;
}
}
.device-info {
border-top: 1px solid $border-light;
padding-top: $spacing-sm;
}
.info-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: $spacing-sm 0;
border-bottom: 1px solid $border-light;
font-size: $font-size-sm;
&:last-child {
border-bottom: none;
}
.label {
color: $text-secondary;
}
.value {
color: $text-primary;
}
}
.device-actions {
display: flex;
gap: $spacing-sm;
margin-top: $spacing-base;
}
.value-desc {
font-size: $font-size-xs;
color: #999;
}
</style>