bonus-material-app/src/pages/new-purchase/bind/coding-bind.vue

370 lines
12 KiB
Vue
Raw Normal View History

2024-11-20 17:41:05 +08:00
<template>
<!-- 编码绑定-->
<view class="page-container">
2024-12-17 17:21:13 +08:00
<div class="card" style="margin-bottom: 10px">
2024-12-04 17:14:05 +08:00
<uni-forms :model="formData" label-width="100" :border="true">
<uni-forms-item label="物资名称:" name="maTypeName">
<span class="form-view">{{ queryParams.maTypeName }}</span>
</uni-forms-item>
2024-11-20 17:41:05 +08:00
2024-12-17 17:21:13 +08:00
<uni-forms-item label="物资规格:" name="typeName">
2024-12-04 17:14:05 +08:00
<span class="form-view">{{ queryParams.typeName }}</span>
</uni-forms-item>
<uni-forms-item label="到货数量:" name="purchaseNum">
<span class="form-view">{{ queryParams.purchaseNum }}</span>
</uni-forms-item>
<uni-forms-item label="待绑定数量:" name="waitBindNum">
<span style="color: #ee0a24" class="form-view">{{ waitBindNum }}</span>
2024-12-17 17:21:13 +08:00
</uni-forms-item>
2024-12-04 17:14:05 +08:00
</uni-forms>
2024-12-17 17:21:13 +08:00
</div>
2024-11-20 17:41:05 +08:00
<scroll-view scroll-y>
<view class="table-list-item">
<uni-row :gutter="24" style="display: flex; align-items: center">
<uni-col :span="4">
<view>
<text style="color: #ee0a24">*</text>
前缀
</view>
</uni-col>
<uni-col :span="10">
<view>
<uni-easyinput
v-model="queryBindForm.codePrefix"
placeholder="请输入编码前缀"
/>
</view>
</uni-col>
<uni-col :span="4">
<view
class="coding-btn"
@tap="onHandleBinding"
style="padding: 10rpx 0; color: #fff; background-color: #1989fa"
>绑定
</view>
</uni-col>
<uni-col :span="6">
<view
class="coding-btn"
style="padding: 10rpx 0; color: #fff; background-color: #2bc54f"
@tap="onCodeIdentify"
>OCR绑定
</view>
</uni-col>
</uni-row>
<uni-row :gutter="24" style="display: flex; align-items: center; margin-top: 10rpx">
<uni-col :span="4">
<view>
<text style="color: #ee0a24">*</text>
后缀
</view>
</uni-col>
<uni-col :span="8">
<view>
<uni-easyinput
v-model="queryBindForm.codeSuffixStart"
type="number"
placeholder="开始值"
/>
</view>
</uni-col>
<uni-col :span="8">
<view>
<uni-easyinput
v-model="queryBindForm.codeSuffixEnd"
type="number"
placeholder="结束值"
/>
</view>
</uni-col>
<uni-col :span="4">
<view
class="coding-btn"
@tap="onHandlerFill"
style="padding: 10rpx 0; color: #1989fa; background-color: #bfd4fa"
>填充
</view>
</uni-col>
</uni-row>
<uni-row
:gutter="24"
style="display: flex; align-items: center; margin-top: 10rpx; font-size: 20rpx"
v-for="(item, index) in codeBindingList"
:key="index"
>
<uni-col :span="1">
<view> {{ index + 1 }} </view>
</uni-col>
<uni-col :span="3">
<view> 编码</view>
</uni-col>
<uni-col :span="7">
<view>
<uni-easyinput v-model="item.maCode" placeholder="请输入" />
</view>
</uni-col>
<uni-col :span="4">
<view> 出厂编码 </view>
</uni-col>
<uni-col :span="7">
<view>
2024-12-17 17:21:13 +08:00
<uni-easyinput v-model="item.outFacCode" placeholder="请输入" />
2024-11-20 17:41:05 +08:00
</view>
</uni-col>
<!-- <uni-col :span="3">
<view> 出厂时间 </view>
</uni-col>
<uni-col :span="4">
<view>
<uni-datetime-picker
type="date"
:clear-icon="false"
@maskClick="maskClick"
/>
</view>
</uni-col> -->
<uni-col :span="2">
<view @tap="onHandelDelete(index)">
<uni-icons type="trash" size="22" style="color: #ee0a24"></uni-icons>
</view>
</uni-col>
</uni-row>
</view>
</scroll-view>
</view>
</template>
<script setup>
2024-12-17 17:21:13 +08:00
import { ref, computed, onUnmounted, reactive } from 'vue'
2024-11-20 17:41:05 +08:00
import { setBindCodingAPI } from '@/services/new-purchase/bind.js'
import { debounce } from 'lodash-es'
2024-12-17 17:21:13 +08:00
import { onLoad, onShow } from '@dcloudio/uni-app'
// const query = defineProps() // 获取上级页面传递的路由参数
// const queryParams = JSON.parse(query.queryParams)
const queryParams = ref({})
2024-11-20 17:41:05 +08:00
const codeBindingList = ref([])
2024-12-04 17:14:05 +08:00
const codeNum = ref(0)
2024-11-20 17:41:05 +08:00
const queryBindForm = ref({
typeId: '', // 物资typeId
2024-12-17 17:21:13 +08:00
typeName: '', // 规格型号
2024-11-20 17:41:05 +08:00
codePrefix: '', // 编码前缀
2024-12-17 17:21:13 +08:00
maTypeName: '', // 物资名称
2024-11-20 17:41:05 +08:00
codeSuffixEnd: '', // 后缀结束
codeSuffixStart: '', // 后缀开始
})
// 计算待绑定数量
const waitBindNum = computed(() => {
2024-12-17 17:21:13 +08:00
return queryParams.value.checkNum - queryParams.value.bindNum - codeNum.value
2024-11-20 17:41:05 +08:00
})
// 绑定按钮
const onHandleBinding = debounce(async () => {
if (codeBindingList.value.length < 1) {
uni.showToast({
title: '请填充编码',
icon: 'none',
})
return
}
// 组装参数
const bindParams = {
2024-12-17 17:21:13 +08:00
typeId: queryParams.value.typeId,
taskId: queryParams.value.taskId,
2024-11-20 17:41:05 +08:00
dtoList: codeBindingList.value,
}
console.log('绑定参数', bindParams)
const res = await setBindCodingAPI(bindParams)
if (res.code === 200) {
uni.showToast({
title: '编码绑定成功!',
icon: 'none',
})
setTimeout(() => {
// 返回上一个页面
uni.navigateBack({
delta: 1,
success() {
uni.$emit('onUpdate')
},
})
}, 500)
}
}, 500)
// 填充按钮
const onHandlerFill = () => {
const { codeSuffixEnd, codeSuffixStart, codePrefix, typeName, maTypeName } = queryBindForm.value
if (!codePrefix) {
uni.showToast({
title: '请填写编码前缀',
icon: 'none',
})
return
}
if (!codeSuffixStart) {
uni.showToast({
title: '请填写后缀开始值',
icon: 'none',
})
return
}
if (!codeSuffixEnd) {
uni.showToast({
title: '请填写后缀结束值',
icon: 'none',
})
return
}
const regex = /^[1-9][0-9]*$/
if (!regex.test(codeSuffixStart)) {
uni.showToast({
title: '后缀开始值不符合要求请填写大于0且不能以0开头的正整数',
icon: 'none',
})
return
}
if (!regex.test(codeSuffixEnd)) {
uni.showToast({
title: '后缀结束值不符合要求请填写大于0且不能以0开头的正整数',
icon: 'none',
})
return
}
if (parseInt(codeSuffixEnd) < parseInt(codeSuffixStart)) {
uni.showToast({
title: '结束值不可小于开始值',
icon: 'none',
})
return
}
// 可编码数量 如相减大于代编码数量 则取待编码数量 如小于待编码数量 则取相减后值
let passCodeNUm =
codeSuffixEnd - codeSuffixStart + 1 > waitBindNum.value
? waitBindNum.value
: codeSuffixEnd - codeSuffixStart + 1
codeBindingList.value = []
// 循环生成编码
for (let i = 0; i < passCodeNUm; i++) {
const codeItem = {
typeName,
maTypeName,
outFacCode: '',
// productDate: "",
maCode: `${codePrefix}${parseInt(codeSuffixStart) + i}`,
}
codeBindingList.value.push(codeItem)
}
}
// 删除
const onHandelDelete = (index) => {
codeBindingList.value.splice(index, 1)
}
// 编码识别按钮
2024-12-17 17:21:13 +08:00
const onCodeIdentify = () => {
uni.navigateTo({
url: `/pages/new-purchase/bind/coding-scan?queryParams=${JSON.stringify(
queryParams.value,
)}`,
})
2024-11-20 17:41:05 +08:00
}
const maskClick = () => {}
2024-12-04 17:14:05 +08:00
// 页面加载完毕
2024-12-17 17:21:13 +08:00
onLoad((options) => {
2024-12-04 17:14:05 +08:00
// 监听出库完成事件 刷新列表
uni.$on('onUpdate', (num) => {
2024-12-17 17:21:13 +08:00
console.log('监听事件', num)
if (num > 0) {
codeNum.value = num
}
2024-12-04 17:14:05 +08:00
})
2024-12-17 17:21:13 +08:00
queryParams.value = JSON.parse(options.queryParams)
queryBindForm.value.typeName = queryParams.value.typeName
queryBindForm.value.maTypeName = queryParams.value.maTypeName
})
2024-12-04 17:14:05 +08:00
// 页面销毁时移除事件监听
onUnmounted(() => {
uni.$off('onUpdate') // 移除事件监听
})
2024-11-20 17:41:05 +08:00
</script>
<style lang="scss" scoped>
.page-container {
display: flex;
height: 100%;
padding: 0 15rpx;
flex-direction: column;
background-color: #e8f5fb;
2024-12-04 17:14:05 +08:00
.card {
padding: 10px;
background-color: #fff;
border-radius: 6px;
box-shadow: 0 2upx 4upx 0 rgba(0, 0, 0, 0.1);
}
2024-11-20 17:41:05 +08:00
.table-list-item {
margin: 5rpx 0;
padding: 20rpx;
background-color: #fff;
border-radius: 10rpx;
.title {
display: flex;
justify-content: space-between;
align-items: center;
}
.coding-btn {
padding: 5rpx 0;
background-color: #409eff;
border-radius: 6rpx;
text-align: center;
color: #fff;
font-size: 14px;
}
}
2024-12-17 17:21:13 +08:00
.form-view {
width: 100%;
height: 100%;
display: flex;
align-items: center;
}
2024-11-20 17:41:05 +08:00
}
// 加载提示文字
.loading-text {
text-align: center;
font-size: 28rpx;
color: #666;
padding: 20rpx 0;
}
.outbound-btn {
position: fixed;
bottom: 15rpx;
left: 15%;
width: 70%;
height: 65rpx;
line-height: 65rpx;
text-align: center;
background-color: #19be6b;
border-radius: 12rpx;
color: #fff;
}
</style>