剩余模块:生产退料
This commit is contained in:
parent
a12f56d2be
commit
a59dd54c27
140
components/architecture/architecture.vue
Normal file
140
components/architecture/architecture.vue
Normal file
@ -0,0 +1,140 @@
|
||||
<template>
|
||||
<view>
|
||||
<view class="input-box">
|
||||
<view class="input-item" v-if="state.show">
|
||||
<up-input :placeholder="props.placeholder" border="none" clearable inputAlign="left" v-model="state.inputText"
|
||||
@confirm="confirmfun">
|
||||
<template #prefix>
|
||||
<up-icon :name="props.icon" color="#2979ff" size="24"></up-icon>
|
||||
</template>
|
||||
</up-input>
|
||||
</view>
|
||||
<view class="codeBox" v-else>
|
||||
<tki-qrcode cid="qrcode" ref="qrcode" :val="state.inputText" :size="170" unit="upx" :loadMake="true"
|
||||
:usingComponents="true" />
|
||||
<view class="codeBoxText">
|
||||
<view>单据:{{ props.dataType }}</view>
|
||||
<view>编码:</view>
|
||||
<view class="container chinese-text">{{ state.inputText }}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- #ifdef APP-PLUS -->
|
||||
<qs-scanlistener @scan="scanFun" />
|
||||
<!-- #endif -->
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { reactive, nextTick, defineProps, defineEmits, defineExpose,watch } from 'vue';
|
||||
import { useI18n } from 'vue-i18n'
|
||||
const getI18n = useI18n()
|
||||
const { t, locale } = getI18n
|
||||
const emits = defineEmits(['inputConfirm', 'scanConfirm'])
|
||||
const props = defineProps({
|
||||
icon: {
|
||||
type: String,
|
||||
default: () => 'search'
|
||||
},
|
||||
placeholder: {
|
||||
type: String,
|
||||
default: () => '请输入内容'
|
||||
},
|
||||
dataType: {
|
||||
type: String,
|
||||
default: () => '来料验证'
|
||||
},
|
||||
fence: {
|
||||
type: Array,
|
||||
default: () => {
|
||||
return [false]
|
||||
}
|
||||
}
|
||||
})
|
||||
watch(()=> props.fence,(val1,val2) => {
|
||||
console.log(val1,val2);
|
||||
})
|
||||
const state = reactive({
|
||||
inputText: '',
|
||||
show: true
|
||||
})
|
||||
const scanFun = (res : any) => {
|
||||
console.log(props.fence.filter((item : any) => item));
|
||||
if (props.fence.filter((item : any) => item).length === 0) {
|
||||
state.inputText = res
|
||||
state.show = false
|
||||
console.log(res);
|
||||
emits('scanConfirm', res)
|
||||
}
|
||||
}
|
||||
const confirmfun = (e : any) => {
|
||||
emits('inputConfirm', e)
|
||||
}
|
||||
const closeFun = (time : number = 2000) => {
|
||||
setTimeout(() => {
|
||||
state.inputText = ''
|
||||
state.show = true
|
||||
emits('inputConfirm', '')
|
||||
},time)
|
||||
}
|
||||
defineExpose({
|
||||
closeFun
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.container {
|
||||
overflow-wrap: break-word;
|
||||
word-break: normal;
|
||||
hyphens: auto;
|
||||
/* 支持连字符换行 */
|
||||
}
|
||||
|
||||
/* 中文强制换行 */
|
||||
.chinese-text {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.input-box {
|
||||
background-color: white;
|
||||
box-sizing: border-box;
|
||||
padding: 0 16rpx;
|
||||
border-radius: 24rpx;
|
||||
margin: 0 0 32rpx 0;
|
||||
|
||||
.u-textarea {
|
||||
padding: 0 !important;
|
||||
font-size: 24rpx !important;
|
||||
color: #999999 !important;
|
||||
}
|
||||
|
||||
.input-item {
|
||||
box-sizing: border-box;
|
||||
padding: 16rpx 0;
|
||||
color: #222222;
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
|
||||
.item-title {
|
||||
//font-weight: 500;
|
||||
font-size: 32rpx;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.item-text {
|
||||
font-weight: 400;
|
||||
font-size: 27rpx;
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.codeBox {
|
||||
padding: 36rpx 24rpx 24rpx 18rpx;
|
||||
display: flex;
|
||||
|
||||
.codeBoxText {
|
||||
margin-left: 32rpx;
|
||||
}
|
||||
}
|
||||
</style>
|
40
components/inputCode/inputCode.vue
Normal file
40
components/inputCode/inputCode.vue
Normal file
@ -0,0 +1,40 @@
|
||||
<template>
|
||||
<fuiInput :focus="state.focusState" @focus="inputFocusFun">
|
||||
<template #left>
|
||||
<up-icon name="search" color="#2979ff" size="28" style="margin-right: 8rpx;"></up-icon>
|
||||
</template>
|
||||
</fuiInput>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { reactive, ref, defineEmits, defineProps, computed, watch } from 'vue';
|
||||
import fuiInput from '../fui-input/fui-input.vue'
|
||||
import i18n from '../../locale/index'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
const getI18n = useI18n()
|
||||
const { t, locale } = getI18n
|
||||
const props = defineProps({
|
||||
icon:{
|
||||
type:String,
|
||||
default: ''
|
||||
}
|
||||
})
|
||||
const state = reactive({
|
||||
focusState: true
|
||||
})
|
||||
const inputFocusFun = (e:any) => {
|
||||
|
||||
uni.onKeyboardHeightChange(res => {
|
||||
console.log(res.height)
|
||||
if(res.height > 0){
|
||||
uni.hideKeyboard()
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.fui-input__wrap{
|
||||
padding: 0 !important;
|
||||
}
|
||||
</style>
|
136
pages/BatchOutOftock/index.vue
Normal file
136
pages/BatchOutOftock/index.vue
Normal file
@ -0,0 +1,136 @@
|
||||
<template>
|
||||
<view class="app status-bar-gap">
|
||||
<l-header title="批量销售出库" sticky #right>
|
||||
<view style="margin-right: 32rpx;" v-if="state.tabsIndex === '1'" @click="submit()">{{ t('verify.tj') }}</view>
|
||||
</l-header>
|
||||
<view class="page">
|
||||
<view class="input-box">
|
||||
<up-tabs :scrollable="false" :list="state.tabsList" @click="upTabsItemFun"></up-tabs>
|
||||
</view>
|
||||
<architecture ref="architectureRef" :dataType="t('home.scrk')" :placeholder="t('receive.djbh')"
|
||||
@scanConfirm="scanConfirmFun" @inputConfirm="changeFun" />
|
||||
<packing ref="packingRef" v-if="state.tabsIndex === '1'" :queryString="state.queryString"
|
||||
@clearOut="clearOut()" />
|
||||
<scattered v-if="state.tabsIndex === '2'" :queryString="state.queryString" @clearOut="clearOut()" />
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { reactive, nextTick, onMounted, ref, computed } from 'vue';
|
||||
import { onLoad, onShow, onReachBottom } from '@dcloudio/uni-app'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { parseTime } from '../../utils/tools.js';
|
||||
import { PRD_MORPTList, receiveBillList } from '../../common/request/api/api';
|
||||
import packing from './packing.vue'
|
||||
import scattered from './scattered.vue'
|
||||
const architectureRef = ref()
|
||||
const packingRef = ref()
|
||||
const getI18n = useI18n()
|
||||
const { t, locale } = getI18n
|
||||
const state = reactive({
|
||||
queryString: '',
|
||||
tabsIndex: '1',
|
||||
tabsList: [
|
||||
{ name: computed(() => '所选单据'), type: '1' },
|
||||
{ name: computed(() => '验证单据'), type: '2' },
|
||||
],
|
||||
})
|
||||
const scanConfirmFun = (e : any) => {
|
||||
state.queryString = e
|
||||
architectureRef.value.closeFun()
|
||||
}
|
||||
const changeFun = (e : any) => {
|
||||
if (e != '') state.queryString = e
|
||||
}
|
||||
const upTabsItemFun = (e : any) => {
|
||||
state.tabsIndex = e.type
|
||||
}
|
||||
const clearOut = () => {
|
||||
state.queryString = ''
|
||||
}
|
||||
const submit = () => {
|
||||
packingRef.value.dataPushNotification()
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.app {
|
||||
background-color: #F5F5F5;
|
||||
|
||||
.page {
|
||||
padding: 18px 32rpx;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
flex: 1;
|
||||
|
||||
.input-box {
|
||||
background-color: white;
|
||||
box-sizing: border-box;
|
||||
padding: 0 16rpx;
|
||||
border-radius: 24rpx;
|
||||
margin: 0 0 32rpx 0;
|
||||
|
||||
.u-textarea {
|
||||
padding: 0 !important;
|
||||
font-size: 24rpx !important;
|
||||
color: #999999 !important;
|
||||
}
|
||||
|
||||
.input-item {
|
||||
box-sizing: border-box;
|
||||
padding: 16rpx 0;
|
||||
color: #222222;
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
|
||||
.item-title {
|
||||
//font-weight: 500;
|
||||
font-size: 32rpx;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.item-text {
|
||||
font-weight: 400;
|
||||
font-size: 27rpx;
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.receive-listBox {
|
||||
flex: 1;
|
||||
|
||||
.list-box-list {
|
||||
width: 100%;
|
||||
|
||||
// margin: 20rpx auto;
|
||||
.data-item {
|
||||
border: 1px solid #efeaea;
|
||||
border-radius: 20rpx;
|
||||
box-shadow: 0rpx 15rpx 15rpx #efeaea;
|
||||
padding: 20rpx 20rpx 0;
|
||||
margin-bottom: 20rpx;
|
||||
background-color: #ffffff;
|
||||
|
||||
.tit {
|
||||
font-size: 30rpx;
|
||||
font-weight: bold;
|
||||
padding: 20rpx 0;
|
||||
}
|
||||
|
||||
.line-p {
|
||||
border: 1px solid #efeaea;
|
||||
}
|
||||
|
||||
.b-font {
|
||||
font-size: 25rpx;
|
||||
padding: 20rpx 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
427
pages/BatchOutOftock/material.vue
Normal file
427
pages/BatchOutOftock/material.vue
Normal file
@ -0,0 +1,427 @@
|
||||
<template>
|
||||
<view class="app status-bar-gap">
|
||||
<view class="page">
|
||||
<l-header :title="state.FBillNo" sticky #right>
|
||||
<view style="margin-right: 32rpx;" @click="dataPushNotification">{{ t('receive.tj') }}</view>
|
||||
</l-header>
|
||||
<architecture ref="architectureRef" :dataType="t('home.llyz')" icon="scan" :placeholder="t('verify.tm')"
|
||||
@scanConfirm="scanConfirmFun" @inputConfirm="changeFun"
|
||||
:fence="[state.scanFrameRefShow,state.shortcutRefShow]" />
|
||||
<view class="material-listBox">
|
||||
<scroll-view id="scroll-box1" class="scroll-box" scroll-y="true" :style="{'height':state.scrollHeight+'px'}">
|
||||
<view class="list-box-list" v-if="state.dataList.length > 0">
|
||||
<view class="data-item" v-for="(item, index) in state.dataList"
|
||||
:style="[{'background-color':interpolation(item)},{'margin-bottom':index + 1 === state.dataList.length ? '80px' : '20px'}]"
|
||||
:key="index">
|
||||
<view class="text" style="margin-bottom: 20px;display: flex;">
|
||||
<view>{{ item.MaterialName }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>{{t('receive.djbh')}}</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ state.FBillNo }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>{{t('receive.wlbm')}}</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ item.MaterialNo }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>{{t('receive.ph')}}</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ item.Lot }}</view>
|
||||
</view>
|
||||
<!-- <view class="itemBox">
|
||||
<view>仓库</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ item.MultiLanguageText }}</view>
|
||||
</view> -->
|
||||
<view class="itemBox">
|
||||
<view>{{t('receive.ys')}}</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ item.CheckJoinQty }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>{{t('receive.ws')}}</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ item.NoCheckQty }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>{{t('receive.yss')}}</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ item.CheckQty }}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view style="text-align: center;color: #F5F5F5;height: 20px;"></view>
|
||||
</view>
|
||||
<view v-if="state.dataList.length==0">
|
||||
<up-empty mode="list"></up-empty>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<scanFrame ref="scanFrameRef" @confirmation="scanFrameCnfirmation"
|
||||
@scanFrameDataFeedback="(res:object)=>{state.scanFrameDataFeedback = res}"
|
||||
@fast="(row:any)=>{state.scanFrameDataFeedback = row}" @err="scanFrameErrFun" @boxShow="scanFrameBoxShowShow" />
|
||||
<shortcut ref="shortcutRef" @dataToscanFrame="dataToscanFrameFun" @boxShow="shortcutBoxShowShow" />
|
||||
<tools ref="toolsRef" @defaultPopup="defaultPopupFun" @scanRecord="scanRecordFun" />
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { reactive, nextTick, onMounted, ref, computed, watch } from 'vue';
|
||||
import { onLoad, onShow, onReachBottom, } from '@dcloudio/uni-app'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { parseTime } from '../../utils/tools.js';
|
||||
import { PRD_MORPTPush, PRD_MORPTScanData, PRD_MORPTView, SAL_OUTSTOCKCheck, SAL_OUTSTOCKScanData, SAL_OUTSTOCKView, fStockFlexDetailDelete, temporaryScanDraftSave, temporaryScanList } from '../../common/request/api/api';
|
||||
import scanFrame from '../../components/scan-frame/scan-frame.vue'
|
||||
import tools from '../../components/tools/tools.vue'
|
||||
import shortcut from '../../components/tools/shortcut.vue'
|
||||
import { sqlite } from '../../stores/sqlite'
|
||||
const architectureRef = ref()
|
||||
const DB = sqlite()
|
||||
const inputRef = ref()
|
||||
const scanFrameRef = ref()
|
||||
const shortcutRef = ref()
|
||||
const getI18n = useI18n()
|
||||
const { t, locale } = getI18n
|
||||
const state = reactive({
|
||||
scanFrameRefShow: false,
|
||||
shortcutRefShow: false,
|
||||
|
||||
queryString: '',
|
||||
dataList: [],
|
||||
scrollHeight: 0,
|
||||
page: {
|
||||
pageIndex: 1,
|
||||
pageSize: 200,
|
||||
totalCount: 0
|
||||
},
|
||||
tabsIndex: '1',
|
||||
FBillNo: '',
|
||||
materialId: '',
|
||||
supplierName: '',
|
||||
inputFocus: true,
|
||||
scanFrameDataFeedback: {},
|
||||
shortcutDataFeedback: {},
|
||||
})
|
||||
onLoad((pageData : any) => {
|
||||
console.log(pageData);
|
||||
state.materialId = pageData.id
|
||||
state.FBillNo = pageData.fBillNo
|
||||
fnDataList(state.materialId);
|
||||
})
|
||||
onShow(() => {
|
||||
if (state.materialId) {
|
||||
fnDataList(state.materialId);
|
||||
}
|
||||
})
|
||||
onMounted(() => {
|
||||
const query = uni.createSelectorQuery().in(this);
|
||||
query.select(".material-listBox").boundingClientRect((data) => {
|
||||
state.scrollHeight = data.height
|
||||
}).exec();
|
||||
// scanFrameRef.value.stateShow(true)
|
||||
})
|
||||
const scanConfirmFun = (e : any) => {
|
||||
getReceiveBillScanData(e)
|
||||
}
|
||||
const shortcutBoxShowShow = (val : boolean) => {
|
||||
state.shortcutRefShow = val
|
||||
}
|
||||
const scanFrameBoxShowShow = (val : boolean) => {
|
||||
state.scanFrameRefShow = val
|
||||
}
|
||||
/**
|
||||
* 数据逻辑
|
||||
*/
|
||||
const interpolation = (item : any) => {
|
||||
if (item.CheckJoinQty === 0 && item.CheckJoinQty + item.NoCheckQty === item.CheckQty) {
|
||||
return '#ffffff'
|
||||
}
|
||||
if (item.CheckJoinQty !== 0 && item.NoCheckQty !== 0 && item.CheckJoinQty + item.NoCheckQty === item.CheckQty) {
|
||||
return 'rgb(254 227 87)'
|
||||
}
|
||||
if (item.CheckJoinQty === item.CheckQty) {
|
||||
return 'rgb(87 191 254)'
|
||||
}
|
||||
}
|
||||
//防抖输入
|
||||
const debounceTimer = ref()
|
||||
const changeFun = (e : any) => {
|
||||
if (debounceTimer.value !== null) clearTimeout(debounceTimer.value)
|
||||
debounceTimer.value = setTimeout(() => {
|
||||
state.queryString = e
|
||||
if (state.queryString !== '') getReceiveBillScanData(e)
|
||||
})
|
||||
}
|
||||
//查询录入
|
||||
const getReceiveBillScanData = (val : string) => {
|
||||
SAL_OUTSTOCKScanData({
|
||||
FBarCode: val,
|
||||
FBillNo: state.FBillNo,
|
||||
}).then((res : any) => {
|
||||
if (res.data !== null) {
|
||||
console.log(res);
|
||||
scanFrameRef.value.getreceiveBillScanData({ ...res.data, queryString: state.queryString, scanFrameShowSate: state.shortcutDataFeedback.scanFrameShowSate, stashVerify: true })
|
||||
if (Object.keys(state.shortcutDataFeedback).length) {
|
||||
if (state.shortcutDataFeedback.scanFrameShowSate) {
|
||||
scanFrameRef.value.stateShow(true)
|
||||
} else {
|
||||
postTemporaryScanDraftSaveFun(state.scanFrameDataFeedback)
|
||||
}
|
||||
} else {
|
||||
scanFrameRef.value.stateShow(true)
|
||||
}
|
||||
} else {
|
||||
uni.$u.toast(t('index.bmygtsj'))
|
||||
state.queryString = ''
|
||||
}
|
||||
architectureRef.value.closeFun()
|
||||
})
|
||||
}
|
||||
//固定弹窗数据传输
|
||||
const scanFrameCnfirmation = (row : any) => {
|
||||
state.scanFrameDataFeedback = row
|
||||
postTemporaryScanDraftSaveFun(state.scanFrameDataFeedback)
|
||||
}
|
||||
const scanFrameErrFun = () => {
|
||||
scanFrameRef.value.stateShow(true)
|
||||
}
|
||||
//数据记录暂存
|
||||
const postTemporaryScanDraftSaveFun = (item : any) => {
|
||||
const obj = {};
|
||||
if (item.warehouseData.FIsOpenLocation) {
|
||||
const key = `FVHUBSTOCKFLEX__FF${item.warehouseData.FFlexId}`; //仓位Id
|
||||
obj[key] = { FNumber: item.locationData.FlexEntryId.Number }; //仓位编码
|
||||
}
|
||||
const str = JSON.stringify(obj);
|
||||
console.log(item);
|
||||
temporaryScanDraftSave({
|
||||
FVHUBFormId: "SAL_DELIVERYNOTICE", //数据类型
|
||||
FVHUBFBillNo: state.FBillNo, //单据编号
|
||||
FVHUBScanNumber: state.queryString, //条码
|
||||
FVHUBMaterialNumber: item.articlesStr, //物料编码
|
||||
FVHUBScanQty: item.quantityStr + '', //扫描数量
|
||||
FVHUBEntryId: scanFrameRef.value.state.receiveBillScanData.Id, //物料ID
|
||||
FVHUBFlot: item.batchNumberStr, //批号
|
||||
FVHUBStock: {
|
||||
FNUMBER: item.warehouseData.FNUMBER //仓库编号
|
||||
},
|
||||
FVHUBMaterial: {
|
||||
FNUMBER: item.articlesStr
|
||||
},
|
||||
...JSON.parse(str),
|
||||
}).then((res : any) => {
|
||||
console.log(res);
|
||||
state.queryString = ''
|
||||
if (res.data.IsSuccess) {
|
||||
fnDataList(state.materialId);
|
||||
uni.$u.toast('成功')
|
||||
scanFrameRef.value.stateShow(false)
|
||||
}
|
||||
})
|
||||
}
|
||||
//默认值传递
|
||||
const dataToscanFrameFun = (res : object) => {
|
||||
state.shortcutDataFeedback = res
|
||||
scanFrameRef.value.getComponentsData(res)
|
||||
shortcutRef.value.stateShow(false)
|
||||
}
|
||||
//唤起默认值弹窗
|
||||
const defaultPopupFun = () => {
|
||||
shortcutRef.value.stateShow(true)
|
||||
}
|
||||
const scanRecordFun = () => {
|
||||
toPages('/pages/records/index', {
|
||||
FormId: 'SAL_DELIVERYNOTICE',
|
||||
FbillNo: state.FBillNo
|
||||
})
|
||||
}
|
||||
/**
|
||||
* 数据推送
|
||||
*/
|
||||
const dataPushNotification = () => {
|
||||
uni.showModal({
|
||||
title: t('public.ts'), content: t('public.tjMessage'), cancelText: t('public.cancel'), confirmText: t('public.confirm'),
|
||||
success(res) {
|
||||
if (res.confirm) {
|
||||
let EntryIds : any = []
|
||||
let ids : any = []
|
||||
let ScanEntry : any = []
|
||||
let param = {
|
||||
FormId: 'SAL_DELIVERYNOTICE',
|
||||
UserId: uni.getStorageSync('userInfo').Context.UserId,
|
||||
FbillNo: state.FBillNo
|
||||
};
|
||||
uni.showLoading({ mask: true });
|
||||
//获取扫描数据里的所有数据
|
||||
temporaryScanList(param).then(res => {
|
||||
if (res.code == 200) {
|
||||
if (res.data.list.length != 0) {
|
||||
res.data.list.forEach((item : any) => {
|
||||
EntryIds.push(item.FVHUBEntryId)
|
||||
ids.push(item.FID)
|
||||
ScanEntry.push({
|
||||
FENTRYID: item.FVHUBEntryId,
|
||||
Qty: item.FVHUBScanQty,
|
||||
Flot: item.FVHUBFlot,
|
||||
StockId: item.FVHUBStock,
|
||||
StockFlex: item.FVHUBStockFlex,
|
||||
Sno: item.FVHUBJSON
|
||||
})
|
||||
})
|
||||
//推送数据
|
||||
SAL_OUTSTOCKCheck({
|
||||
Ids: ids,
|
||||
EntryIds: EntryIds.toString(),
|
||||
}).then((res : any) => {
|
||||
if (res.code === 200) {
|
||||
fStockFlexDetailDelete({ Ids: ids.toString() }).then((res : any) => {
|
||||
if (res.code === 200) {
|
||||
fnDataList(state.materialId);
|
||||
uni.$u.toast('操作成功')
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
})
|
||||
} else {
|
||||
uni.$u.toast('暂无扫描数据')
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
} else if (res.cancel) {
|
||||
console.log('用户点击取消');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
/**
|
||||
* 数据请求
|
||||
*/
|
||||
const fnDataList = (FBillNo : any) => {
|
||||
let param = {
|
||||
id: FBillNo,
|
||||
};
|
||||
uni.showLoading({ mask: true });
|
||||
SAL_OUTSTOCKView(param).then(res => {
|
||||
uni.hideLoading();
|
||||
if (res.code == 200) {
|
||||
state.dataList = []
|
||||
let dataListArray = res.data.Entry;
|
||||
if (dataListArray.length > 0) {
|
||||
dataListArray.forEach((p : any) => {
|
||||
let item = {
|
||||
Id: p.Id,
|
||||
MaterialNo: p.MaterialNumber,//物料编码
|
||||
MaterialName: formatLangTextValue(p.MaterialName),//物料名称
|
||||
Lot: p.FLot_Text,//批号
|
||||
CheckQty: p.Qty, //应扫数量
|
||||
CheckJoinQty: p.ScanedQty,//已扫数量
|
||||
NoCheckQty: p.UnScanQty,//未扫数量
|
||||
MultiLanguageText: Object.keys(p.StockId).length ? formatLangTextValue(p.StockId.Name) : '暂无仓库'
|
||||
};
|
||||
state.dataList.push(item);
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
//中英切换
|
||||
const formatLangTextValue = (val : any) => {
|
||||
let lang_Id = uni.getStorageSync('locale')
|
||||
let item = val.find(p => p.Key == (lang_Id == 'cn' ? 2052 : 1033));
|
||||
if (item != null) {
|
||||
return item.Value;
|
||||
}
|
||||
return val[0].Value;
|
||||
}
|
||||
const toPages = (url : string, data : any = {}) => {
|
||||
uni.$u.route({
|
||||
url: url,
|
||||
params: data
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.app {
|
||||
background-color: #F5F5F5;
|
||||
|
||||
.page {
|
||||
padding: 18px 32rpx;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
flex: 1;
|
||||
|
||||
.input-box {
|
||||
background-color: white;
|
||||
box-sizing: border-box;
|
||||
padding: 0 16rpx;
|
||||
border-radius: 24rpx;
|
||||
margin: 0 0 32rpx 0;
|
||||
|
||||
.u-textarea {
|
||||
padding: 0 !important;
|
||||
font-size: 24rpx !important;
|
||||
color: #999999 !important;
|
||||
}
|
||||
|
||||
.input-item {
|
||||
box-sizing: border-box;
|
||||
padding: 16rpx 0;
|
||||
color: #222222;
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
|
||||
.item-title {
|
||||
//font-weight: 500;
|
||||
font-size: 32rpx;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.item-text {
|
||||
font-weight: 400;
|
||||
font-size: 27rpx;
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.material-listBox {
|
||||
flex: 1;
|
||||
|
||||
.list-box-list {
|
||||
width: 100%;
|
||||
|
||||
.data-item {
|
||||
border: 1px solid #efeaea;
|
||||
border-radius: 20rpx;
|
||||
box-shadow: 0rpx 15rpx 15rpx #efeaea;
|
||||
padding: 20rpx 22rpx;
|
||||
margin-bottom: 16rpx;
|
||||
background-color: #ffffff;
|
||||
|
||||
.itemBox {
|
||||
line-height: 50rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
.zongjian {
|
||||
height: 1px;
|
||||
flex: 1;
|
||||
background-color: #f0f0f0;
|
||||
margin: 0 16rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
264
pages/BatchOutOftock/packing.vue
Normal file
264
pages/BatchOutOftock/packing.vue
Normal file
@ -0,0 +1,264 @@
|
||||
<template>
|
||||
<view class="material-listBox1">
|
||||
<scroll-view id="scroll-box1" class="scroll-box1" scroll-y="true" :style="{'height':state.scrollHeight+'px'}">
|
||||
<view class="list-box-list">
|
||||
<uni-swipe-action>
|
||||
<uni-swipe-action-item :right-options="state.options" v-for="(item, index) in state.dataList">
|
||||
<template #right>
|
||||
<view class="itemRight" @click="fStockFlexDetailDeleteFun(item)">
|
||||
<up-icon name="trash" color="#ffffff" size="28"></up-icon>
|
||||
</view>
|
||||
</template>
|
||||
<view class="data-item" :style="[{'background-color':'#ffffff'}]" :key="index">
|
||||
<view class="text" style="margin-bottom: 20px;display: flex;">
|
||||
<view>{{ item['FVHUBMaterial.FName'] }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>{{ t('receive.wlbm') }}</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ item.FVHUBMaterialNumber }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>{{ t('public.qty') }}</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ item.FVHUBScanQty }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>{{ t('index.ck') }}</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ item['FVHUBStock.FName'] }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>{{ t('receive.ph') }}</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ item.FVHUBFlot }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>{{ t('public.xxh') }}</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ item.FVHUBJSON }}</view>
|
||||
</view>
|
||||
</view>
|
||||
</uni-swipe-action-item>
|
||||
</uni-swipe-action>
|
||||
</view>
|
||||
<view v-if="state.dataList.length==0">
|
||||
<up-empty mode="list"></up-empty>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { reactive, nextTick, onMounted, ref, computed, watch, defineProps, defineEmits, defineExpose } from 'vue';
|
||||
import { onLoad, onShow, onReachBottom, } from '@dcloudio/uni-app'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { parseTime } from '../../utils/tools.js';
|
||||
import { BarcodePackBillList, BarcodePackBillSave, BarcodePackBillScanData, PRD_MORPTPush, PRD_MORPTScanData, PURReceiveBillScanCheck, PURReceiveBillScanData, PURReceiveBillView, SAL_DELIVERYNOTICEPush, ScanDataAndSave, fStockFlexDetailDelete, temporaryScanDraftSave, temporaryScanList } from '../../common/request/api/api';
|
||||
import scanFrame from '../../components/scan-frame/scan-frame.vue'
|
||||
import shortcut from '../../components/tools/shortcut.vue'
|
||||
const emits = defineEmits(['clearOut'])
|
||||
const inputRef = ref()
|
||||
const scanFrameRef = ref()
|
||||
const shortcutRef = ref()
|
||||
const getI18n = useI18n()
|
||||
const { t, locale } = getI18n
|
||||
const props = defineProps({
|
||||
queryString: {
|
||||
type: String,
|
||||
default: () => {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
})
|
||||
const state = reactive({
|
||||
dataList: [],
|
||||
scrollHeight: 0,
|
||||
options: []
|
||||
})
|
||||
watch(() => props.queryString, () => {
|
||||
if (props.queryString !== '') getReceiveBillScanData(props.queryString)
|
||||
})
|
||||
onShow(() => {
|
||||
// fnDataList()
|
||||
})
|
||||
onMounted(() => {
|
||||
const query = uni.createSelectorQuery().in(this);
|
||||
query.select(".material-listBox1").boundingClientRect((data : any) => {
|
||||
state.scrollHeight = data.height
|
||||
}).exec();
|
||||
fnDataList()
|
||||
})
|
||||
//查询录入
|
||||
const getReceiveBillScanData = (val : string) => {
|
||||
ScanDataAndSave({
|
||||
FBillNo: val,
|
||||
}).then((res : any) => {
|
||||
emits('clearOut')
|
||||
if (res.code === 200) {
|
||||
fnDataList()
|
||||
}
|
||||
})
|
||||
}
|
||||
//删除数据
|
||||
const fStockFlexDetailDeleteFun = (item : any) => {
|
||||
uni.showModal({
|
||||
title: t('index.ts'), content: t('index.qdysc'), cancelText: t('index.qx'), confirmText: t('index.qd'),
|
||||
success(res) {
|
||||
if (res.confirm) {
|
||||
fStockFlexDetailDelete({ Ids: item.FID + '' }).then((res : any) => {
|
||||
if (res.code === 200) {
|
||||
uni.$u.toast(t('index.ysc'))
|
||||
fnDataList()
|
||||
}
|
||||
})
|
||||
} else if (res.cancel) {
|
||||
console.log('用户点击取消');
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 数据推送
|
||||
*/
|
||||
const dataPushNotification = () => {
|
||||
uni.showModal({
|
||||
title: t('public.ts'), content: t('public.tjMessage'), cancelText: t('public.cancel'), confirmText: t('public.confirm'),
|
||||
success(res) {
|
||||
if (res.confirm) {
|
||||
let EntryIds : any = []
|
||||
let ids : any = []
|
||||
let ScanEntry : any = []
|
||||
let param = {
|
||||
FormId: 'SAL_DELIVERYNOTICE',
|
||||
UserId: uni.getStorageSync('userInfo').Context.UserId,
|
||||
FbillNo: state.FBillNo,
|
||||
FType: "Whole"
|
||||
};
|
||||
uni.showLoading({ mask: true });
|
||||
//获取扫描数据里的所有数据
|
||||
temporaryScanList(param).then(res => {
|
||||
if (res.code == 200) {
|
||||
if (res.data.list.length != 0) {
|
||||
res.data.list.forEach((item : any) => {
|
||||
EntryIds.push(item.FVHUBEntryId)
|
||||
ids.push(item.FID)
|
||||
ScanEntry.push({
|
||||
FENTRYID: item.FVHUBEntryId,
|
||||
Qty: item.FVHUBScanQty,
|
||||
Flot: item.FVHUBFlot,
|
||||
StockId: item.FVHUBStock,
|
||||
StockFlex: item.FVHUBStockFlex,
|
||||
Sno: item.FVHUBJSON
|
||||
})
|
||||
})
|
||||
//推送数据
|
||||
SAL_DELIVERYNOTICEPush({
|
||||
EntryIds: EntryIds.toString(),
|
||||
TargetFormId: 'SAL_OUTSTOCK',
|
||||
IsEnableDefaultRule: 'true',
|
||||
CustomParams: {
|
||||
AutoAudit: 'true',
|
||||
ScanEntry: ScanEntry
|
||||
}
|
||||
}).then((res : any) => {
|
||||
if (res.code === 200) {
|
||||
fStockFlexDetailDelete({ Ids: ids.toString() }).then((res : any) => {
|
||||
if (res.code === 200) {
|
||||
fnDataList();
|
||||
uni.$u.toast(t('public.cg'))
|
||||
}
|
||||
})
|
||||
} else {
|
||||
uni.$u.toast(res.msg)
|
||||
}
|
||||
|
||||
})
|
||||
} else {
|
||||
uni.$u.toast(t('index.zwsmsj'))
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
} else if (res.cancel) {
|
||||
console.log('用户点击取消');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
/**
|
||||
* 数据请求
|
||||
*/
|
||||
const fnDataList = () => {
|
||||
uni.showLoading({ mask: true });
|
||||
temporaryScanList({
|
||||
FormId: 'SAL_DELIVERYNOTICE',
|
||||
UserId: uni.getStorageSync('userInfo').Context.UserId,
|
||||
FType: "Whole"
|
||||
}).then((res : any) => {
|
||||
if (res.code == 200) {
|
||||
state.dataList = res.data.list
|
||||
}
|
||||
});
|
||||
}
|
||||
//中英切换
|
||||
const formatLangTextValue = (val : any) => {
|
||||
let lang_Id = uni.getStorageSync('locale')
|
||||
let item = val.find(p => p.Key == (lang_Id == 'cn' ? 2052 : 1033));
|
||||
if (item != null) {
|
||||
return item.Value;
|
||||
}
|
||||
return val[0].Value;
|
||||
}
|
||||
const toPages = (url : string, data : any = {}) => {
|
||||
uni.$u.route({
|
||||
url: url,
|
||||
params: data
|
||||
})
|
||||
}
|
||||
defineExpose({
|
||||
dataPushNotification
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.material-listBox1 {
|
||||
flex: 1;
|
||||
|
||||
.list-box-list {
|
||||
width: 100%;
|
||||
|
||||
.itemRight {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 34rpx;
|
||||
background-color: #ff5a5d;
|
||||
border-radius: 20rpx;
|
||||
}
|
||||
|
||||
.data-item {
|
||||
border: 1px solid #efeaea;
|
||||
border-radius: 20rpx;
|
||||
box-shadow: 0rpx 15rpx 15rpx #efeaea;
|
||||
padding: 20rpx 22rpx;
|
||||
margin-bottom: 16rpx;
|
||||
background-color: #ffffff;
|
||||
|
||||
.itemBox {
|
||||
line-height: 50rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
.zongjian {
|
||||
height: 1px;
|
||||
flex: 1;
|
||||
background-color: #f0f0f0;
|
||||
margin: 0 16rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
148
pages/BatchOutOftock/scattered.vue
Normal file
148
pages/BatchOutOftock/scattered.vue
Normal file
@ -0,0 +1,148 @@
|
||||
<template>
|
||||
<view class="receive-listBox">
|
||||
<scroll-view id="scroll-box" class="scroll-box" scroll-y="true"
|
||||
:style="{'height':state.scrollHeight+'px'}" @scrolltolower="fnScrollBottom()">
|
||||
<view class="list-box-list" v-if="state.dataList.length > 0">
|
||||
<view class="data-item" @click.stop="fnToUrl(item)"
|
||||
v-for="(item, index) in state.dataList" :key="index">
|
||||
<view class="tit">销售出库单单号:{{item.FBillNo}}</view>
|
||||
<view class="line-p"></view>
|
||||
<view class="b-font">{{ t('receive.rq') }}:{{item.FDateFormat}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="state.dataList.length==0">
|
||||
<up-empty mode="list"></up-empty>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { reactive, nextTick, onMounted,watch, ref,computed,defineProps } from 'vue';
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { parseTime } from '../../utils/tools.js';
|
||||
import { PRD_MORPTList, SAL_OUTSTOCKList, receiveBillList } from '../../common/request/api/api';
|
||||
const getI18n = useI18n()
|
||||
const { t, locale } = getI18n
|
||||
const props = defineProps({
|
||||
queryString: {
|
||||
type: String,
|
||||
default: () => {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
})
|
||||
const state = reactive({
|
||||
queryString: '',
|
||||
dataList: [],
|
||||
scrollHeight: 0,
|
||||
tabsIndex:'1',
|
||||
page: {
|
||||
pageIndex: 1,
|
||||
pageSize: 200,
|
||||
totalCount: 0
|
||||
},
|
||||
})
|
||||
watch(() => props.queryString, () => {
|
||||
if (props.queryString !== ''){
|
||||
state.page.pageIndex = 1
|
||||
state.queryString = props.queryString
|
||||
fnDataList()
|
||||
}
|
||||
})
|
||||
onMounted(() => {
|
||||
initialization()
|
||||
})
|
||||
const initialization = () => {
|
||||
const query = uni.createSelectorQuery().in(this);
|
||||
query.select(".receive-listBox").boundingClientRect((data:any) => {
|
||||
state.scrollHeight = data.height
|
||||
}).exec();
|
||||
fnDataList()
|
||||
}
|
||||
const upTabsItemFun = (e:any) => {
|
||||
state.tabsIndex = e.type
|
||||
}
|
||||
const fnScrollBottom = () => {
|
||||
console.log(state.page.pageIndex * state.page.pageSize,state.page.totalCount);
|
||||
if (state.page.pageIndex * state.page.pageSize <= state.page.totalCount) {
|
||||
state.page.pageIndex ++;
|
||||
uni.showLoading({ mask: true });
|
||||
setTimeout(() => {
|
||||
fnDataList();
|
||||
}, 500);
|
||||
}
|
||||
}
|
||||
const fnToUrl = (item : any) => {
|
||||
toPages('/pages/BatchOutOftock/material',{id:item.FID,fBillNo:item.FBillNo})
|
||||
}
|
||||
const fnDataList = () => {
|
||||
let param = {
|
||||
queryString: state.queryString,
|
||||
pageIndex: state.page.pageIndex,
|
||||
pageSize: state.page.pageSize,
|
||||
};
|
||||
if (state.page.pageIndex == 1) {
|
||||
uni.showLoading({ mask: true });
|
||||
}
|
||||
SAL_OUTSTOCKList(param).then(res => {
|
||||
uni.hideLoading();
|
||||
if (res.code == 200) {
|
||||
let result = res.data;
|
||||
let dataArray = result.list;
|
||||
dataArray.forEach(p => {
|
||||
p.FDateFormat = parseTime(p.FDate, '{y}-{m}-{d}');
|
||||
});
|
||||
|
||||
if (state.page.pageIndex == 1) {
|
||||
state.dataList = dataArray;
|
||||
}
|
||||
else {
|
||||
state.dataList = state.dataList.concat(dataArray);
|
||||
}
|
||||
state.page.totalCount = result.total;
|
||||
|
||||
if (state.dataList.length == state.page.totalCount) {
|
||||
// more_status.value = 'nomore';
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
const toPages = (url : string, data : any = {}) => {
|
||||
uni.$u.route({
|
||||
url: url,
|
||||
params: data
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.receive-listBox {
|
||||
flex: 1;
|
||||
|
||||
.list-box-list{
|
||||
width: 100%;
|
||||
// margin: 20rpx auto;
|
||||
.data-item{
|
||||
border: 1px solid #efeaea;
|
||||
border-radius: 20rpx;
|
||||
box-shadow: 0rpx 15rpx 15rpx #efeaea;
|
||||
padding: 20rpx 20rpx 0;
|
||||
margin-bottom: 20rpx;
|
||||
background-color: #ffffff;
|
||||
.tit{
|
||||
font-size: 30rpx;
|
||||
font-weight: bold;
|
||||
padding: 20rpx 0;
|
||||
}
|
||||
.line-p{
|
||||
border: 1px solid #efeaea;
|
||||
}
|
||||
.b-font{
|
||||
font-size: 25rpx;
|
||||
padding: 20rpx 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
142
pages/split/bluetoothList.vue
Normal file
142
pages/split/bluetoothList.vue
Normal file
@ -0,0 +1,142 @@
|
||||
<template>
|
||||
<up-popup :show="state.show" @close="close">
|
||||
<view class="warehouse-listBox" ref="listBoxRef">
|
||||
<scroll-view id="scroll-box" class="scroll-box" scroll-y="true" :style="{'height':state.scrollHeight+'px'}" >
|
||||
<view class="list-box-list">
|
||||
<view class="data-item" v-for="(item, index) of state.dataList" :key="index" @click="getAddressFun(item)">
|
||||
<view class="tit">{{ t('index.sbmc') }}:{{ item.name }}</view>
|
||||
<view class="line-p"></view>
|
||||
<view class="b-font">{{ t('index.sbbm') }}:{{ item.address }}</view>
|
||||
</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</up-popup>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { reactive, nextTick, onMounted, ref, computed, defineProps, defineEmits, watch } from 'vue';
|
||||
import { onLoad, onShow, onReachBottom, } from '@dcloudio/uni-app'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
const getI18n = useI18n()
|
||||
const { t, locale } = getI18n
|
||||
const emits = defineEmits(['getAddress'])
|
||||
const state = reactive({
|
||||
show:false,
|
||||
dataList: [],
|
||||
scrollHeight: 0,
|
||||
})
|
||||
const getAddressFun = (row:any) => {
|
||||
emits('getAddress',row)
|
||||
}
|
||||
const open = () => {
|
||||
state.show = true
|
||||
nextTick(() => {
|
||||
if (state.show) {
|
||||
const query = uni.createSelectorQuery().in(this);
|
||||
query.select(".warehouse-listBox").boundingClientRect((data : any) => {
|
||||
state.scrollHeight = data.height
|
||||
}).exec();
|
||||
}
|
||||
})
|
||||
}
|
||||
const getList = (item:any) => {
|
||||
state.dataList.push(item)
|
||||
}
|
||||
const close = () => {
|
||||
state.show = false
|
||||
state.dataList = []
|
||||
}
|
||||
defineExpose({
|
||||
open,
|
||||
close,
|
||||
getList
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
:deep(.u-popup__content) {
|
||||
border-top-left-radius: 16rpx;
|
||||
border-top-right-radius: 16rpx;
|
||||
box-sizing: border-box;
|
||||
padding: 32rpx;
|
||||
background-color: #F5F5F5;
|
||||
min-height: 85vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.popupText {
|
||||
text-align: center;
|
||||
font-size: 32rpx;
|
||||
margin: 16rpx 0;
|
||||
}
|
||||
|
||||
.input-box {
|
||||
background-color: white;
|
||||
box-sizing: border-box;
|
||||
padding: 0 16rpx;
|
||||
border-radius: 24rpx;
|
||||
margin: 0 0 16rpx 0;
|
||||
|
||||
.u-textarea {
|
||||
padding: 0 !important;
|
||||
font-size: 24rpx !important;
|
||||
color: #999999 !important;
|
||||
}
|
||||
|
||||
.input-item {
|
||||
box-sizing: border-box;
|
||||
padding: 16rpx 0;
|
||||
color: #222222;
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
|
||||
.item-title {
|
||||
//font-weight: 500;
|
||||
font-size: 32rpx;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.item-text {
|
||||
font-weight: 400;
|
||||
font-size: 27rpx;
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.warehouse-listBox {
|
||||
display: block;
|
||||
flex: 1;
|
||||
|
||||
.list-box-list {
|
||||
width: 100%;
|
||||
|
||||
// margin: 20rpx auto;
|
||||
.data-item {
|
||||
border: 1px solid #efeaea;
|
||||
border-radius: 20rpx;
|
||||
box-shadow: 0rpx 15rpx 15rpx #efeaea;
|
||||
padding: 20rpx 20rpx 0;
|
||||
margin-bottom: 20rpx;
|
||||
background-color: #ffffff;
|
||||
|
||||
.tit {
|
||||
font-size: 30rpx;
|
||||
font-weight: bold;
|
||||
padding: 20rpx 0;
|
||||
}
|
||||
|
||||
.line-p {
|
||||
border: 1px solid #efeaea;
|
||||
}
|
||||
|
||||
.b-font {
|
||||
font-size: 25rpx;
|
||||
padding: 20rpx 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
230
pages/split/index.vue
Normal file
230
pages/split/index.vue
Normal file
@ -0,0 +1,230 @@
|
||||
<template>
|
||||
<view class="app status-bar-gap">
|
||||
<view class="page">
|
||||
<l-header title="Split" sticky #right>
|
||||
<view style="margin-right: 32rpx;">{{ t('receive.tj') }}</view>
|
||||
</l-header>
|
||||
<architecture ref="architectureRef" :dataType="t('home.scfl')" icon="scan" :placeholder="t('verify.tm')"
|
||||
@scanConfirm="scanConfirmFun" @inputConfirm="changeFun" />
|
||||
<view class="material-listBox">
|
||||
<scroll-view id="scroll-box" class="scroll-box" scroll-y="true" :style="{'height':state.scrollHeight+'px'}">
|
||||
<view class="list-box-list" v-if="Object.keys(state.pageData).length > 0">
|
||||
<view class="data-item" :style="{'height':state.scrollHeight+'px'}">
|
||||
<view class="itemBox">
|
||||
<view>Supplier Name</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ state.pageData.FSupplierId }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>P/N</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ state.pageData.FMaterialId }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>Qty</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ state.pageData.FQty }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>Batch No</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ state.pageData.FLotText }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>Supplier Lot No</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ state.pageData.FSupplierLot }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>PO</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ state.pageData.PO }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>Delivery Date</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ state.pageData.Date }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>GRN #</view>
|
||||
<view class="zongjian"></view>
|
||||
<view>{{ state.pageData.FBillCode }}</view>
|
||||
</view>
|
||||
<view class="itemBox">
|
||||
<view>Take it out:</view>
|
||||
<up-input clearable inputmode="numeric" v-model="state.qty"></up-input>
|
||||
</view>
|
||||
<up-button style="margin-top: 36px;width: 70vw;" class="btnItem" type="primary" shape="circle" :text="t('public.confirm')" @click="toPrint"></up-button>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="Object.keys(state.pageData).length === 0">
|
||||
<up-empty mode="list"></up-empty>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { reactive, nextTick, onMounted, ref, computed, watch } from 'vue';
|
||||
import { onLoad, onShow, onReachBottom, } from '@dcloudio/uni-app'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { parseTime } from '../../utils/tools.js';
|
||||
import { UHIK_BD_BarCodeMainFileView } from '../../common/request/api/api';
|
||||
const architectureRef = ref()
|
||||
const getI18n = useI18n()
|
||||
const { t, locale } = getI18n
|
||||
const state = reactive({
|
||||
qty: 0,
|
||||
queryString: '',
|
||||
pageData: {},
|
||||
scrollHeight: 0
|
||||
})
|
||||
onLoad(() => { })
|
||||
onShow(() => { })
|
||||
onMounted(() => {
|
||||
const query = uni.createSelectorQuery().in(this);
|
||||
query.select(".material-listBox").boundingClientRect((data) => {
|
||||
state.scrollHeight = data.height
|
||||
}).exec();
|
||||
})
|
||||
/**
|
||||
* 数据逻辑
|
||||
*/
|
||||
const interpolation = (item : any) => {
|
||||
if (item.CheckJoinQty === 0 && item.CheckJoinQty + item.NoCheckQty === item.CheckQty) {
|
||||
return '#ffffff'
|
||||
}
|
||||
if (item.CheckJoinQty !== 0 && item.NoCheckQty !== 0 && item.CheckJoinQty + item.NoCheckQty === item.CheckQty) {
|
||||
return 'rgb(254 227 87)'
|
||||
}
|
||||
if (item.CheckJoinQty === item.CheckQty) {
|
||||
return 'rgb(87 191 254)'
|
||||
}
|
||||
}
|
||||
//防抖输入
|
||||
const debounceTimer = ref()
|
||||
const changeFun = (e : any) => {
|
||||
if (debounceTimer.value !== null) clearTimeout(debounceTimer.value)
|
||||
debounceTimer.value = setTimeout(() => {
|
||||
state.queryString = e
|
||||
if (state.queryString !== '') getReceiveBillScanData(e)
|
||||
})
|
||||
}
|
||||
const scanConfirmFun = (e : any) => {
|
||||
getReceiveBillScanData(e)
|
||||
}
|
||||
const toPrint = () => {
|
||||
if(state.qty === 0){
|
||||
uni.$u.toast('Qty cannot be empty')
|
||||
return
|
||||
}
|
||||
toPages('/pages/split/print',{data:JSON.stringify({...state.pageData,splitQty:state.qty})})
|
||||
}
|
||||
//查询录入
|
||||
const getReceiveBillScanData = (val : string) => {
|
||||
UHIK_BD_BarCodeMainFileView({
|
||||
FBarCode: val,
|
||||
}).then((res : any) => {
|
||||
console.log(res);
|
||||
state.pageData = res.data[0]
|
||||
architectureRef.value.closeFun()
|
||||
})
|
||||
}
|
||||
|
||||
//中英切换
|
||||
const formatLangTextValue = (val : any) => {
|
||||
let lang_Id = uni.getStorageSync('locale')
|
||||
let item = val.find(p => p.Key == (lang_Id == 'cn' ? 2052 : 1033));
|
||||
if (item != null) {
|
||||
return item.Value;
|
||||
}
|
||||
return val[0].Value;
|
||||
}
|
||||
const toPages = (url : string, data : any = {}) => {
|
||||
uni.$u.route({
|
||||
url: url,
|
||||
params: data
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.app {
|
||||
background-color: #F5F5F5;
|
||||
|
||||
.page {
|
||||
padding: 18px 32rpx;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
flex: 1;
|
||||
|
||||
.input-box {
|
||||
background-color: white;
|
||||
box-sizing: border-box;
|
||||
padding: 0 16rpx;
|
||||
border-radius: 24rpx;
|
||||
margin: 0 0 32rpx 0;
|
||||
|
||||
.u-textarea {
|
||||
padding: 0 !important;
|
||||
font-size: 24rpx !important;
|
||||
color: #999999 !important;
|
||||
}
|
||||
|
||||
.input-item {
|
||||
box-sizing: border-box;
|
||||
padding: 16rpx 0;
|
||||
color: #222222;
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
|
||||
.item-title {
|
||||
//font-weight: 500;
|
||||
font-size: 32rpx;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.item-text {
|
||||
font-weight: 400;
|
||||
font-size: 27rpx;
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.material-listBox {
|
||||
flex: 1;
|
||||
|
||||
.list-box-list {
|
||||
width: 100%;
|
||||
|
||||
.data-item {
|
||||
border: 1px solid #efeaea;
|
||||
border-radius: 20rpx;
|
||||
box-shadow: 0rpx 15rpx 15rpx #efeaea;
|
||||
padding: 20rpx 22rpx;
|
||||
margin-bottom: 16rpx;
|
||||
background-color: #ffffff;
|
||||
|
||||
.itemBox {
|
||||
line-height: 50rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
.zongjian {
|
||||
height: 1px;
|
||||
flex: 1;
|
||||
background-color: #f0f0f0;
|
||||
margin: 0 16rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
382
pages/split/print.vue
Normal file
382
pages/split/print.vue
Normal file
@ -0,0 +1,382 @@
|
||||
<template>
|
||||
<view class="app status-bar-gap">
|
||||
<view class="page">
|
||||
<l-header :title="t('index.zbdy')" sticky></l-header>
|
||||
<view class="input-box" @click="printingMachineSelectFun">
|
||||
<view class="input-item">
|
||||
<up-input :placeholder="t('index.qxzdyj')" border="none" clearable inputAlign="left" v-model="state.printingMachine.name"
|
||||
confirmType="next" :disabled="true">
|
||||
<template #prefix>
|
||||
<view class="item-title" style="margin-right: 16rpx;">{{ t('index.dyj') }}</view>
|
||||
</template>
|
||||
<template #suffix>
|
||||
<up-icon name="search" color="#6c6c6c" size="24"></up-icon>
|
||||
</template>
|
||||
</up-input>
|
||||
</view>
|
||||
</view>
|
||||
<view class="btnList" style="margin-top: 32rpx;">
|
||||
<up-button class="btnItem" type="primary" shape="circle" :text="t('index.dyj')" @click="sendHexStr"></up-button>
|
||||
</view>
|
||||
</view>
|
||||
<bluetoothList ref="bluetoothListRef" :dataList="state.bluetoothList" @getAddress="getAddressFun" />
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { reactive, nextTick, onMounted, ref, computed, watch } from 'vue';
|
||||
import { onLoad, onShow, onReachBottom, } from '@dcloudio/uni-app'
|
||||
import tkiQrcode from '@/components/tki-qrcode/tki-qrcode.vue'
|
||||
import { PRD_MOEnterIntoPro, PRD_MORPTGetPrintData, UHIK_BD_BarCodeMainFileSave } from '../../common/request/api/api';
|
||||
import { timeFormat } from '@/uni_modules/uview-plus';
|
||||
import bluetoothList from './bluetoothList.vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
const getI18n = useI18n()
|
||||
const { t, locale } = getI18n
|
||||
const bluetoothListRef = ref()
|
||||
// #ifdef APP-PLUS
|
||||
const blueModule = uni.requireNativePlugin("gp-bluetooth")
|
||||
import * as tsc from '../../components/gprint/tsc.js'
|
||||
// #endif
|
||||
|
||||
const state = reactive({
|
||||
id: '',
|
||||
FBillNo: '',
|
||||
pageData: {},
|
||||
printingMachine: {
|
||||
name: '',
|
||||
address: ''
|
||||
},
|
||||
bluetoothList: [],
|
||||
sendData: undefined,
|
||||
prontList: [],
|
||||
timer: null,
|
||||
printState: '0'
|
||||
})
|
||||
onLoad((pageData : any) => {
|
||||
state.pageData = JSON.parse(pageData.data)
|
||||
console.log(state.pageData);
|
||||
})
|
||||
onShow(() => {
|
||||
uni.getLocation({
|
||||
type: 'wgs84',
|
||||
success(res) {
|
||||
console.log('开启定位权限', res)
|
||||
},
|
||||
fail: (err:any) => { }
|
||||
});
|
||||
// #ifdef APP-PLUS
|
||||
hasPermission()
|
||||
// #endif
|
||||
})
|
||||
|
||||
//获取蓝牙权限并打开蓝牙
|
||||
const hasPermission = () => {
|
||||
console.log(uni.getStorageSync('printInfo'));
|
||||
blueModule.checkConnect({
|
||||
mac: uni.getStorageSync('printInfo').address,
|
||||
uuid: '00001101-0000-1000-8000-00805f9b34fb'
|
||||
}, (ret : any) => {
|
||||
console.log(ret);
|
||||
if (!ret.success) {
|
||||
uni.setStorageSync('printInfo', {})
|
||||
state.printingMachine = {
|
||||
name: '',
|
||||
address: ''
|
||||
}
|
||||
setTimeout(() => {
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
mask: true,
|
||||
title: t('index.ljydk'),
|
||||
})
|
||||
}, 500)
|
||||
}
|
||||
});
|
||||
blueModule.hasPermission((res : any) => {
|
||||
if (res.success) {
|
||||
blueModule.isOpen((isOpenRes : any) => {
|
||||
console.log(isOpenRes)
|
||||
if (isOpenRes.success) {
|
||||
state.printingMachine.name = uni.getStorageSync('printInfo').name
|
||||
state.printingMachine.address = uni.getStorageSync('printInfo').address
|
||||
} else {
|
||||
uni.setStorageSync('printInfo', {})
|
||||
state.printingMachine.name = ''
|
||||
state.printingMachine.address = ''
|
||||
blueModule.openBT((openBTRes : any) => {
|
||||
console.log(openBTRes)
|
||||
});
|
||||
}
|
||||
});
|
||||
} else {
|
||||
uni.$u.toast(t('index.'))
|
||||
}
|
||||
});
|
||||
}
|
||||
//读取附近蓝牙设备
|
||||
const ReadTheAttachedBluetoothDevice = () => {
|
||||
state.bluetoothList = []
|
||||
blueModule.searchBT((res : any) => {
|
||||
if (res.success) {
|
||||
console.log(res);
|
||||
if (res.data?.name) {
|
||||
bluetoothListRef.value.getList(res.data)
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
const printingMachineSelectFun = () => {
|
||||
ReadTheAttachedBluetoothDevice()
|
||||
bluetoothListRef.value.open()
|
||||
}
|
||||
const getAddressFun = (row : any) => {
|
||||
blueModule.connect({
|
||||
MACAddress: row.address,
|
||||
uuid: '00001101-0000-1000-8000-00805f9b34fb',
|
||||
sleepTime: 50
|
||||
}, (result : any) => {
|
||||
if (result.success) {
|
||||
uni.$u.toast(t('index.ljcg'))
|
||||
state.printingMachine.name = row.name
|
||||
state.printingMachine.address = row.address
|
||||
bluetoothListRef.value.close()
|
||||
uni.setStorageSync('printInfo', { name: row.name, address: row.address })
|
||||
} else {
|
||||
uni.$u.toast(t('index.ljsb'))
|
||||
}
|
||||
}, (data : any) => { })
|
||||
}
|
||||
|
||||
const createLabel = (item : any) => {
|
||||
var command = tsc.default.createNew()
|
||||
command.setSize(100, 50)
|
||||
command.setGap(2)
|
||||
command.setCls()
|
||||
command.setQR(15, 15, "L", 3, "A", item.FBarCode)
|
||||
command.setText(120, 15, "TSS24.BF2", 1, 1, `Date:${item.FDate.split('T')[0]}`)
|
||||
command.setText(120, 40, "TSS24.BF2", 1, 1, `MO#:${item.FSrcBillNo}`)
|
||||
command.setText(120, 65, "TSS24.BF2", 1, 1, `P/N:${item.FMaterialId}`)
|
||||
command.setText(120, 90, "TSS24.BF2", 1, 1, `SN#:${item.FSno}`)
|
||||
command.setPagePrint()
|
||||
state.sendData = command.getData();
|
||||
}
|
||||
const sendHexStr = () => {
|
||||
let arr = []
|
||||
let data1 = {
|
||||
FBarCodeRule: "171064",
|
||||
FBarCode: `${state.pageData.FBillCode}*${state.pageData.FMaterialId}*${state.pageData.FLotText}*${Number(state.pageData.FQty) - Number(state.pageData.splitQty)}`,
|
||||
FBillCode:state.pageData.FBillCode,
|
||||
FMaterialId: state.pageData.FMaterialId,
|
||||
FSupplierLot: state.pageData.FSupplierId,
|
||||
FQty: Number(state.pageData.FQty) - Number(state.pageData.splitQty)
|
||||
}
|
||||
let data2 = {
|
||||
FBarCodeRule: "171064",
|
||||
FBarCode: `${state.pageData.FBillCode}*${state.pageData.FMaterialId}*${state.pageData.FLotText}*${Number(state.pageData.splitQty)}`,
|
||||
FBillCode:state.pageData.FBillCode,
|
||||
FMaterialId: state.pageData.FMaterialId,
|
||||
FSupplierLot: state.pageData.FSupplierId,
|
||||
FQty: Number(state.pageData.splitQty)
|
||||
}
|
||||
arr = [data1,data2]
|
||||
UHIK_BD_BarCodeMainFileSave({
|
||||
Key: 'qwe123!@#',
|
||||
Items: arr
|
||||
},true).then((res : any) => {
|
||||
console.log(res);
|
||||
// if (res.code == 200) {
|
||||
// let i : number = 0;
|
||||
// state.timer = setInterval(() => {
|
||||
// if (state.printState === '0') {
|
||||
// createLabel(state.prontList[i])
|
||||
// initPrint()
|
||||
// i++;
|
||||
// }
|
||||
// if (state.prontList.length == i) {
|
||||
// clearInterval(state.timer);
|
||||
// state.timer = null;
|
||||
// state.printState = '0';
|
||||
// }
|
||||
// }, 2000);
|
||||
// } else {
|
||||
// let str = JSON.stringify(res)
|
||||
// if(str.indexOf('违反字段唯一性要求') !== -1 || str.indexOf('is already been used') !== -1){
|
||||
// let i : number = 0;
|
||||
// state.timer = setInterval(() => {
|
||||
// if (state.printState === '0') {
|
||||
// createLabel(state.prontList[i])
|
||||
// initPrint()
|
||||
// i++;
|
||||
// }
|
||||
// if (state.prontList.length == i) {
|
||||
// clearInterval(state.timer);
|
||||
// state.timer = null;
|
||||
// state.printState = '0';
|
||||
// }
|
||||
// }, 2000);
|
||||
// } else {
|
||||
// uni.$u.toast(t('index.cjbqsb'))
|
||||
// }
|
||||
// }
|
||||
})
|
||||
|
||||
}
|
||||
const initPrint = () => {
|
||||
if (state.sendData == null) {
|
||||
// uni.$u.toast('请先生成指令')
|
||||
return
|
||||
}
|
||||
state.printState = '1';
|
||||
let hexStr = ''
|
||||
var data = Array.from(state.sendData)
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
var str = Number(data[i]).toString(16)
|
||||
str = str.length == 1 ? "0" + str : str
|
||||
hexStr += str
|
||||
}
|
||||
|
||||
function splitString(str, length) {
|
||||
var strLen = str.length
|
||||
var resArr = []
|
||||
for (var i = 0; i < strLen; i += length) {
|
||||
resArr.push(str.substring(i, i + length))
|
||||
}
|
||||
return resArr
|
||||
}
|
||||
|
||||
var sendloop = splitString(hexStr, 250);
|
||||
console.log(sendloop.length)
|
||||
function realWriteData(sendloop, i) {
|
||||
var data = sendloop[i]
|
||||
if (typeof (data) == "undefined") {
|
||||
return
|
||||
}
|
||||
console.log("第【" + i + "】次写数据" + data)
|
||||
var ret = blueModule.sendHexStr(data, (result) => {
|
||||
//结果
|
||||
console.log('发送结果')
|
||||
console.log(result)
|
||||
if (!result.success) {
|
||||
uni.$u.toast(t('index.ljydk'))
|
||||
uni.setStorageSync('printInfo', {})
|
||||
state.printingMachine = {
|
||||
name: '',
|
||||
address: ''
|
||||
}
|
||||
return
|
||||
}
|
||||
if (result.success) {
|
||||
realWriteData(sendloop, i + 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
var i = 0;
|
||||
realWriteData(sendloop, i);
|
||||
state.printState = '0';
|
||||
}
|
||||
const formatLangTextValue = (val : any) => {
|
||||
let lang_Id = uni.getStorageSync('locale')
|
||||
let item = val.find(p => p.Key == (lang_Id == 'cn' ? 2052 : 1033));
|
||||
if (item != null) {
|
||||
return item.Value;
|
||||
}
|
||||
return val[0].Value;
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
:deep(.uni-date__x-input) {
|
||||
color: black !important;
|
||||
}
|
||||
|
||||
:deep(.u-input) {
|
||||
background-color: #ffffff !important;
|
||||
}
|
||||
|
||||
.app {
|
||||
background-color: #F5F5F5;
|
||||
|
||||
.page {
|
||||
padding: 18px 32rpx;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
flex: 1;
|
||||
|
||||
.input-box {
|
||||
background-color: white;
|
||||
box-sizing: border-box;
|
||||
padding: 0 16rpx;
|
||||
border-radius: 16rpx;
|
||||
margin: 16rpx 0;
|
||||
|
||||
.u-textarea {
|
||||
padding: 0 !important;
|
||||
font-size: 24rpx !important;
|
||||
color: #999999 !important;
|
||||
}
|
||||
|
||||
.input-item {
|
||||
box-sizing: border-box;
|
||||
padding: 16rpx 0;
|
||||
color: #222222;
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
|
||||
.item-title {
|
||||
//font-weight: 500;
|
||||
font-size: 28rpx;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.item-text {
|
||||
font-weight: 400;
|
||||
font-size: 27rpx;
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.data-item {
|
||||
border: 1px solid #efeaea;
|
||||
border-radius: 20rpx;
|
||||
padding: 20rpx 22rpx;
|
||||
background-color: #ffffff;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
|
||||
.btnList {
|
||||
display: flex;
|
||||
margin-bottom: 32rpx;
|
||||
|
||||
.btnItem {
|
||||
width: 40%;
|
||||
}
|
||||
}
|
||||
|
||||
.timebox {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-top: 32rpx;
|
||||
}
|
||||
|
||||
.itemBox {
|
||||
line-height: 50rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 8rpx;
|
||||
|
||||
.zongjian {
|
||||
height: 1px;
|
||||
flex: 1;
|
||||
background-color: #f0f0f0;
|
||||
margin: 0 16rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
54
scanInput.js
Normal file
54
scanInput.js
Normal file
@ -0,0 +1,54 @@
|
||||
let main, receiver, filter, _codeQueryTag = false, temp = [], init = false, start = false;
|
||||
export default {
|
||||
initScan() {
|
||||
if(init) return
|
||||
let _this = this;
|
||||
main = plus.android.runtimeMainActivity(); //获取activity
|
||||
var IntentFilter = plus.android.importClass('android.content.IntentFilter');
|
||||
filter = new IntentFilter();
|
||||
//android.intent.ACTION_DECODE_DATA
|
||||
filter.addAction(uni._qs_scanlistener_action || "com.uniappPda.ACTION"); // 换你的广播动作,你的pda设备里面看
|
||||
receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
|
||||
onReceive: function(context, intent) {
|
||||
plus.android.importClass(intent);
|
||||
let code = intent.getStringExtra(uni._qs_scanlistener_label || "com.uniapp.gatedge"); // 换你的广播标签,你的pda设备里面看
|
||||
_this.queryCode(code);
|
||||
}
|
||||
});
|
||||
init = true
|
||||
},
|
||||
startScan() {
|
||||
if(!start) {
|
||||
start = true
|
||||
main.registerReceiver(receiver, filter);
|
||||
}
|
||||
},
|
||||
stopScan() {
|
||||
if(start) {
|
||||
start = false
|
||||
main.unregisterReceiver(receiver);
|
||||
}
|
||||
},
|
||||
install(fn) {
|
||||
if(typeof fn == 'function' && !~temp.indexOf(fn)) temp.push(fn)
|
||||
},
|
||||
uninstall(fn) {
|
||||
if(typeof fn == 'function') {
|
||||
const index = temp.find(i=>i == fn)
|
||||
if(~index) temp.splice(index, 1)
|
||||
}
|
||||
},
|
||||
queryCode: function(code) {
|
||||
//防重复
|
||||
// if (_codeQueryTag) return false;
|
||||
// _codeQueryTag = true;
|
||||
// setTimeout(function() {
|
||||
// _codeQueryTag = false;
|
||||
// }, 150);
|
||||
if(temp && temp.length) {
|
||||
temp[temp.length - 1](code)
|
||||
}
|
||||
uni.vibrateShort()
|
||||
uni.$emit("qs_scanlistener_handle", code);
|
||||
}
|
||||
}
|
2
uni_modules/qs-scanlistener/changelog.md
Normal file
2
uni_modules/qs-scanlistener/changelog.md
Normal file
@ -0,0 +1,2 @@
|
||||
## 1.0.0(2022-12-17)
|
||||
create
|
@ -0,0 +1,73 @@
|
||||
<template>
|
||||
<view></view>
|
||||
</template>
|
||||
|
||||
|
||||
<script>
|
||||
import scaninput from './scanInput.js'
|
||||
// #ifdef APP-PLUS
|
||||
scaninput.initScan()
|
||||
scaninput.startScan()
|
||||
// #endif
|
||||
export default {
|
||||
name:"scan-listener",
|
||||
created() {
|
||||
scaninput.install(this.scanHandle)
|
||||
uni.$on('scan_handle', this.scanHandle)
|
||||
},
|
||||
beforeDestroy() {
|
||||
scaninput.uninstall(this.scanHandle)
|
||||
},
|
||||
methods: {
|
||||
changeFun(str) {
|
||||
if (this.debounceTimer !== null) clearTimeout(this.debounceTimer)
|
||||
this.debounceTimer = setTimeout(() => {
|
||||
this.$emit('scan', this.inputVal)
|
||||
this.inputVal = ''
|
||||
}, 500)
|
||||
},
|
||||
onEvent(event) {
|
||||
console.log(event);
|
||||
if (event.key != 'Enter' && event.key != 'PrintScreen' && event.key != 'Shift' && event.key != 'Unidentified') { // 拼接输入的值,Enter与PrintScreen是物理按钮要排除
|
||||
this.inputVal = this.inputVal + event.key
|
||||
}
|
||||
if(this.inputVal) {
|
||||
this.changeFun(this.inputVal)
|
||||
}
|
||||
},
|
||||
scanHandle(code) {
|
||||
this.$emit('scan', code)
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
inputVal: '',
|
||||
debounceTimer:null
|
||||
};
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<script module="keyboard" lang="renderjs">
|
||||
export default {
|
||||
mounted () {
|
||||
const onKey = (event) => {
|
||||
const keys1 = ['type', 'timeStamp']
|
||||
const keys2 = ['altKey', 'code', 'ctrlKey', 'isComposing', 'key', 'location', 'metaKey', 'repeat', 'shiftKey']
|
||||
const keys3 = ['char', 'charCode', 'keyCode', 'keyIdentifier', 'keyLocation', 'which']
|
||||
const data = {}
|
||||
keys1.concat(keys2, keys3).forEach(key => {
|
||||
data[key] = event[key]
|
||||
})
|
||||
this.$ownerInstance.callMethod('onEvent', data)
|
||||
}
|
||||
const names = ['keyup'] //'keydown',
|
||||
names.forEach(name => {
|
||||
document.addEventListener(name, onKey, false)
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
</style>
|
@ -0,0 +1,55 @@
|
||||
let main, receiver, filter, _codeQueryTag = false, temp = [], init = false, start = false;
|
||||
export default {
|
||||
initScan() {
|
||||
if(init) return
|
||||
let _this = this;
|
||||
main = plus.android.runtimeMainActivity(); //获取activity
|
||||
var IntentFilter = plus.android.importClass('android.content.IntentFilter');
|
||||
filter = new IntentFilter();
|
||||
//android.intent.ACTION_DECODE_DATA
|
||||
filter.addAction("com.uniappPda.ACTION"); // 换你的广播动作,你的pda设备里面看
|
||||
receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
|
||||
onReceive: function(context, intent) {
|
||||
plus.android.importClass(intent);
|
||||
let code = intent.getStringExtra("com.uniapp.gatedge"); // 换你的广播标签,你的pda设备里面看
|
||||
_this.queryCode(code);
|
||||
|
||||
}
|
||||
});
|
||||
init = true
|
||||
},
|
||||
startScan() {
|
||||
if(!start) {
|
||||
start = true
|
||||
main.registerReceiver(receiver, filter);
|
||||
}
|
||||
},
|
||||
stopScan() {
|
||||
if(start) {
|
||||
start = false
|
||||
main.unregisterReceiver(receiver);
|
||||
}
|
||||
},
|
||||
install(fn) {
|
||||
if(typeof fn == 'function' && !~temp.indexOf(fn)) temp.push(fn)
|
||||
},
|
||||
uninstall(fn) {
|
||||
if(typeof fn == 'function') {
|
||||
const index = temp.find(i=>i == fn)
|
||||
if(~index) temp.splice(index, 1)
|
||||
}
|
||||
},
|
||||
queryCode: function(code) {
|
||||
//防重复
|
||||
// if (_codeQueryTag) return false;
|
||||
// _codeQueryTag = true;
|
||||
// setTimeout(function() {
|
||||
// _codeQueryTag = false;
|
||||
// }, 150);
|
||||
if(temp && temp.length) {
|
||||
temp[temp.length - 1](code)
|
||||
}
|
||||
uni.vibrateShort()
|
||||
uni.$emit("qs_scanlistener_handle", code);
|
||||
}
|
||||
}
|
82
uni_modules/qs-scanlistener/package.json
Normal file
82
uni_modules/qs-scanlistener/package.json
Normal file
@ -0,0 +1,82 @@
|
||||
{
|
||||
"id": "qs-scanlistener",
|
||||
"displayName": "qs-scanlistener PDA扫码",
|
||||
"version": "1.0.0",
|
||||
"description": "PDA扫码 兼容广播和键盘",
|
||||
"keywords": [
|
||||
"pda",
|
||||
"扫码"
|
||||
],
|
||||
"repository": "",
|
||||
"engines": {
|
||||
"HBuilderX": "^3.1.0"
|
||||
},
|
||||
"dcloudext": {
|
||||
"type": "component-vue",
|
||||
"sale": {
|
||||
"regular": {
|
||||
"price": "0.00"
|
||||
},
|
||||
"sourcecode": {
|
||||
"price": "0.00"
|
||||
}
|
||||
},
|
||||
"contact": {
|
||||
"qq": ""
|
||||
},
|
||||
"declaration": {
|
||||
"ads": "无",
|
||||
"data": "无",
|
||||
"permissions": "无"
|
||||
},
|
||||
"npmurl": ""
|
||||
},
|
||||
"uni_modules": {
|
||||
"dependencies": [],
|
||||
"encrypt": [],
|
||||
"platforms": {
|
||||
"cloud": {
|
||||
"tcb": "y",
|
||||
"aliyun": "y"
|
||||
},
|
||||
"client": {
|
||||
"Vue": {
|
||||
"vue2": "y",
|
||||
"vue3": "y"
|
||||
},
|
||||
"App": {
|
||||
"app-vue": "y",
|
||||
"app-nvue": "n"
|
||||
},
|
||||
"H5-mobile": {
|
||||
"Safari": "n",
|
||||
"Android Browser": "n",
|
||||
"微信浏览器(Android)": "n",
|
||||
"QQ浏览器(Android)": "n"
|
||||
},
|
||||
"H5-pc": {
|
||||
"Chrome": "n",
|
||||
"IE": "n",
|
||||
"Edge": "n",
|
||||
"Firefox": "n",
|
||||
"Safari": "n"
|
||||
},
|
||||
"小程序": {
|
||||
"微信": "n",
|
||||
"阿里": "n",
|
||||
"百度": "n",
|
||||
"字节跳动": "n",
|
||||
"QQ": "n",
|
||||
"钉钉": "n",
|
||||
"快手": "n",
|
||||
"飞书": "n",
|
||||
"京东": "n"
|
||||
},
|
||||
"快应用": {
|
||||
"华为": "n",
|
||||
"联盟": "n"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
20
uni_modules/qs-scanlistener/readme.md
Normal file
20
uni_modules/qs-scanlistener/readme.md
Normal file
@ -0,0 +1,20 @@
|
||||
## qs-scanlistener PDA扫码
|
||||
## 支持广播和键盘
|
||||
---
|
||||
### 广播动作可在main.js设置uni._qs_scanlistener_action = 你的广播动作名称, 默认android.intent.ACTION_DECODE_DATA
|
||||
### 广播标签可在main.js设置uni._qs_scanlistener_label = 你的广播标签名称, 默认barcode_string
|
||||
---
|
||||
### 扫码结果也可以uni.$on('qs_scanlistener_handle', code=>{}) 中获取
|
||||
---
|
||||
Template
|
||||
```html
|
||||
<qs-scanlistener @scan="scan"></qs-scanlistener>
|
||||
```
|
||||
js
|
||||
```javascript
|
||||
methods: {
|
||||
scan(code) {
|
||||
console.log(code)
|
||||
}
|
||||
}
|
||||
```
|
1
unpackage/dist/build/app-plus/pages/BatchOutOftock/index.css
vendored
Normal file
1
unpackage/dist/build/app-plus/pages/BatchOutOftock/index.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
unpackage/dist/build/app-plus/pages/BatchOutOftock/material.css
vendored
Normal file
1
unpackage/dist/build/app-plus/pages/BatchOutOftock/material.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
unpackage/dist/build/app-plus/pages/returnMaterials/index.css
vendored
Normal file
1
unpackage/dist/build/app-plus/pages/returnMaterials/index.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
unpackage/dist/build/app-plus/pages/returnMaterials/material.css
vendored
Normal file
1
unpackage/dist/build/app-plus/pages/returnMaterials/material.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1148
unpackage/dist/dev/app-plus/pages/BatchOutOftock/index.css
vendored
Normal file
1148
unpackage/dist/dev/app-plus/pages/BatchOutOftock/index.css
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2269
unpackage/dist/dev/app-plus/pages/BatchOutOftock/material.css
vendored
Normal file
2269
unpackage/dist/dev/app-plus/pages/BatchOutOftock/material.css
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1167
unpackage/dist/dev/app-plus/pages/split/index.css
vendored
Normal file
1167
unpackage/dist/dev/app-plus/pages/split/index.css
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1126
unpackage/dist/dev/app-plus/pages/split/print.css
vendored
Normal file
1126
unpackage/dist/dev/app-plus/pages/split/print.css
vendored
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user