This commit is contained in:
2026-06-02 15:28:25 +08:00
commit b271b84f70
249 changed files with 42240 additions and 0 deletions
+302
View File
@@ -0,0 +1,302 @@
<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" style="font-size:12px;color:#999;">
{{ 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')
},
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;
}
</style>