You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
248 lines
6.3 KiB
248 lines
6.3 KiB
<!--扫描组件-->
|
|
<template>
|
|
<view>
|
|
<view class="pop_tab">
|
|
<view class="tab_info">
|
|
<view class="conbox">
|
|
<textarea v-model="scanMsg" trim="all" maxlength="1000" style="margin-left: 5px; width: 90%"
|
|
:focus="boxfocus" :placeholder="placeholderValue" @input="handelScanMsg"
|
|
@blur="handleBlur" @focus="handleFocus"
|
|
:cursor="cursorIndex"></textarea>
|
|
</view>
|
|
|
|
<view class="uni-flex uni-row space-between u-col-center">
|
|
<view class="uni-flex">
|
|
<button class="clean_scan_btn" @touchend.prevent="clearScanValue()">清空</button>
|
|
<button class="scan_btn" @click="clickScanMsg()">扫描</button>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<view style="width: 100%">
|
|
<view style="width: 100%" v-if="scanList.length > 0 && isShowHistory">
|
|
<view class="uni-flex uni-row space-between u-col-center">
|
|
<view class="" style="padding: 10rpx"> 历史记录 </view>
|
|
<view class="" style="padding-right: 10rpx">
|
|
<u-icon :name="expendIcon" size="35rpx" @click="expands()"></u-icon>
|
|
</view>
|
|
</view>
|
|
<u-line class="line_color" style="padding-top: 10rpx; padding-bottom: 20rpx"></u-line>
|
|
<scroll-view scroll-y="true" class="scroll-view" v-if="expand" style="height: 70px">
|
|
<view class="uni-flex u-col" v-for="(item, index) in scanList" :key="index">
|
|
<view style="width: 100%; max-height: 100px">
|
|
<view class="uni-flex u-row space-between u-col-center" @click="showItem(item)">
|
|
<view class="text_ellipsis" style="padding: 15rpx">
|
|
{{ item }}
|
|
</view>
|
|
<view class="">
|
|
<u-icon name="arrow-right"></u-icon>
|
|
</view>
|
|
</view>
|
|
<u-line class="line_color"></u-line>
|
|
</view>
|
|
</view>
|
|
</scroll-view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<com-message ref="comMessageRef" />
|
|
</view>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { ref, getCurrentInstance, onMounted, nextTick, watch } from 'vue'
|
|
import { getLabelInfo } from '../../common/label.js'
|
|
|
|
const props = defineProps({
|
|
placeholder: {
|
|
type: String,
|
|
default: '请扫描标签'
|
|
},
|
|
clearResult: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
// boxFocus: {
|
|
// type: Boolean,
|
|
// default: true
|
|
// },
|
|
isShowHistory: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
headerType: {
|
|
type: String,
|
|
default: 'HPQ' // HLB HMQ HCQ HPQ
|
|
}
|
|
})
|
|
|
|
const scanMsg = ref('')
|
|
const boxfocus = ref(false)
|
|
const placeholderValue = ref('')
|
|
const scanResult = ref({})
|
|
const scanList = ref([])
|
|
const expand = ref(true)
|
|
const expendIcon = ref('arrow-down')
|
|
const cursorIndex = ref(0)
|
|
const comMessageRef = ref('')
|
|
placeholderValue.value = `请扫描${props.placeholder}`
|
|
onMounted(() => {
|
|
|
|
})
|
|
// 监视属性
|
|
watch(
|
|
() => props.placeholder,
|
|
(val) => {
|
|
placeholderValue.value = `请扫描${val}`
|
|
}
|
|
)
|
|
const setItemCodeSimulate = () => {
|
|
scanMsg.value = scanMsg
|
|
}
|
|
const hide = () => {
|
|
// #ifdef APP-PLUS
|
|
// 只是解决软键盘的闪现
|
|
const interval = setInterval(function () {
|
|
uni.hideKeyboard() // 隐藏软键盘
|
|
}, 5)
|
|
setTimeout(() => {
|
|
clearInterval(interval)
|
|
}, 1000)
|
|
// #endif
|
|
}
|
|
const getValue = () => {
|
|
return scanMsg.value
|
|
}
|
|
const setValue = (val) => {
|
|
scanMsg.value = val
|
|
}
|
|
const clearScanValue = () => {
|
|
scanMsg.value = ''
|
|
// this.cursorIndex = 0
|
|
getfocus()
|
|
}
|
|
const clickScanMsg = () => {
|
|
scanMsg.value += '\n'
|
|
handelScanMsg()
|
|
}
|
|
const handelScanMsg = () => {
|
|
// 点击了回车
|
|
if (scanMsg.value.indexOf('\n')) {
|
|
// that.scanMsg = 'HPQ;V1.0;ICE115F11161AG;PP20230427000027;B20230427002;Q50';
|
|
setTimeout(() => {
|
|
losefocus()
|
|
const content = scanMsg.value.trim()
|
|
if (content == '') {
|
|
// getfocus()
|
|
comMessageRef.value.showErrorMessage('扫描内容为空,请重新扫描', (res) => {
|
|
if (res) {
|
|
scanMsg.value = ''
|
|
getfocus()
|
|
}
|
|
})
|
|
return
|
|
}
|
|
if (props.isShowHistory) {
|
|
scanList.value.unshift(content)
|
|
}
|
|
getLabelInfo(content, props.headerType, (callback) => {
|
|
// uni.hideLoading();
|
|
const scanResult = callback
|
|
scanResult.scanMessage = content
|
|
if (scanResult.success) {
|
|
clear()
|
|
// that.getfocus();//不能自动获取焦点
|
|
emit('getResult', scanResult)
|
|
} else {
|
|
clear()
|
|
losefocus()
|
|
comMessageRef.value.showErrorMessage(scanResult.message, (res) => {
|
|
if (res) {
|
|
getfocus()
|
|
}
|
|
})
|
|
}
|
|
})
|
|
}, 200)
|
|
}
|
|
}
|
|
const handleFocus = ()=> {}
|
|
|
|
const handleBlur = ()=> {
|
|
// setTimeout(res=>{
|
|
// uni.hideKeyboard();
|
|
// },200)
|
|
}
|
|
const getfocus = () => {
|
|
nextTick((r) => {
|
|
boxfocus.value = true
|
|
})
|
|
// hide()
|
|
}
|
|
const losefocus = () => {
|
|
nextTick((r) => {
|
|
boxfocus.value = false
|
|
uni.hideKeyboard()
|
|
})
|
|
}
|
|
const clear = () => {
|
|
if(props.clearResult){
|
|
cursorIndex.value = 0
|
|
scanMsg.value = ''
|
|
}
|
|
}
|
|
const iconClick = (type) => {
|
|
emit('clearResult', scanMsg.value)
|
|
}
|
|
const expands = () => {
|
|
expand.value = !expand.value
|
|
expendIcon.value = expand.value == true ? 'arrow-down' : 'arrow-up'
|
|
}
|
|
const scanClick = () => {
|
|
handelScanMsg()
|
|
}
|
|
const cancelClick = () => {
|
|
clear()
|
|
getfocus()
|
|
}
|
|
const showItem = (item) => {
|
|
comMessageRef.value.showErrorMessage(item, (res) => {
|
|
if (res) {
|
|
}
|
|
})
|
|
}
|
|
const scanQRCode = () => {
|
|
uni.scanCode({
|
|
onlyFromCamera: true,
|
|
success: (res) => {
|
|
scanMsg.value = res.result
|
|
emit('getResult', res.result)
|
|
// console.log('扫描二维码成功,结果:' + res.result);
|
|
},
|
|
fail: (res) => {
|
|
showItem(`扫描出现错误:${res.result}`)
|
|
console.log(`扫描出现错误:${res.result}`)
|
|
}
|
|
})
|
|
}
|
|
|
|
// 传递给父类
|
|
const emit = defineEmits(['getResult', 'clearResult'])
|
|
defineExpose({
|
|
getfocus,
|
|
handelScanMsg,
|
|
clearScanValue,
|
|
clear,
|
|
clickScanMsg,
|
|
losefocus,
|
|
setItemCodeSimulate,
|
|
})
|
|
</script>
|
|
<script module="textarea" lang="renderjs">
|
|
// onMounted(() => {
|
|
// document.querySelector('textarea').setAttribute('inputmode', 'none')
|
|
// })
|
|
//
|
|
</script>
|
|
|
|
<style scoped lang="scss"></style>
|
|
|