| | |
| | | <view> |
| | | <uni-segmented-control :current="current" :values="items" @clickItem="onClickItem"> |
| | | </uni-segmented-control> |
| | | |
| | | <!-- 入库 --> |
| | | <view v-show="current === 0"> |
| | | <view style="padding: 5%;"> |
| | | <uni-forms label-width="120"> |
| | | <uni-forms-item label="托盘编码"> |
| | | <uni-easyinput type="text" :focus="barcodeFocus" v-model="PalletCode1" placeholder="请输入托盘编码" |
| | | ref='midInput' @input="Changebarcode()"/> |
| | | ref='midInput' @input="onPalletCode1Input" /> |
| | | </uni-forms-item> |
| | | <uni-forms-item label="搬运起点"> |
| | | <uni-easyinput type="text" :focus="addressFocus" v-model="SourceAddress" placeholder="请输入起点" |
| | | ref='midInput' /> |
| | | </uni-forms-item> |
| | | <uni-forms-item label="终点区域"> |
| | | <uni-data-select :focus="!istrue" v-model="AreaId" :localdata="range" |
| | | placeholder="请输选择终点区域"></uni-data-select> |
| | | <picker mode="selector" :range="areaNames" @change="onAreaChange"> |
| | | <view style="padding: 10px; background-color: #fff; border: 1px solid #dcdfe6; border-radius: 4px; min-height: 16px; line-height: 16px;"> |
| | | {{ selectedAreaName || '请选择终点区域' }} |
| | | </view> |
| | | </picker> |
| | | </uni-forms-item> |
| | | </uni-forms> |
| | | <button @click="InboundTask" type="primary" size="default" style="margin-top: 2%;">搬运</button> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 物料绑定 --> |
| | | <view v-show="current === 1"> |
| | | <view style="padding: 5%;"> |
| | | <uni-forms label-width="120"> |
| | | <uni-forms-item label="托盘编码"> |
| | | <uni-easyinput type="text" :focus="barcodefocus" @input="inputChangebarcode" |
| | | v-model="PalletCode2" placeholder="请输入托盘编码" ref='midInput' /> |
| | | <uni-easyinput type="text" :focus="barcodefocus" v-model="PalletCode2" placeholder="请输入托盘编码" ref='midInput' @input="onMaterSnInput" /> |
| | | </uni-forms-item> |
| | | <uni-forms-item label="外箱标签:"> |
| | | <uni-forms-item label="外箱标签"> |
| | | <uni-easyinput type="text" placeholder="请扫描外箱标签" ref='midInput' :focus="focus" v-model="materSn" |
| | | @input="snInput" /> |
| | | /> |
| | | </uni-forms-item> |
| | | <view v-if="group.length" class="scan-result"> |
| | | <uni-card v-for="(item, index) in group" :key="item.orderNo"> |
| | | <view class="info-grid"> |
| | | <view class="info-row"> |
| | | <text class="label">订单编码:</text> |
| | | <text>{{ item.orderNo }}</text> |
| | | </view> |
| | | <br> |
| | | <view class="info-row"> |
| | | <text class="label">仓库名称:</text> |
| | | <text>{{ item.warehouseName }}</text> |
| | | </view><br> |
| | | <view class="info-row"> |
| | | <text class="label">物料编码:</text> |
| | | <text>{{ item.materialNo }}</text> |
| | | </view><br> |
| | | <uni-forms-item label="组盘数量"> |
| | | <uni-easyinput v-model="item.quantity" type="number" /> |
| | | </uni-forms-item> |
| | | </view> |
| | | <uni-icons type="trash" class="delete-icon" @click="removeScanItem(item.orderNo)" /> |
| | | </uni-card> |
| | | </view> |
| | | </uni-forms> |
| | | <button @click="GroupPlate" type="primary" size="default" style="margin-top: 2%;">组盘</button> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 物料解绑 --> |
| | | <view v-show="current === 2"> |
| | | <view style="padding: 5%;"> |
| | | <uni-forms label-width="120"> |
| | | <uni-forms-item label="托盘编码"> |
| | | <uni-easyinput type="text" :focus="barcodefocus" @input="inputChange" v-model="PalletCode3" |
| | | <uni-easyinput type="text" :focus="barcodefocus" @input="onPalletCode3Input" v-model="PalletCode3" |
| | | placeholder="请输入托盘编码" ref='midInput' /> |
| | | </uni-forms-item> |
| | | </uni-forms> |
| | | <button @click="SolvePlate" type="primary" size="default" style="margin-top: 2%;">解盘</button> |
| | | </view> |
| | | </view> |
| | | |
| | | <u-toast ref="luToast" /> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | import { |
| | | config |
| | | } from '../../common/config'; |
| | | const innerAudioContext = uni.createInnerAudioContext(); |
| | | |
| | | export default { |
| | | data() { |
| | | return { |
| | | barcodeFocus:true, |
| | | focus: false, |
| | | istrue: false, |
| | | addressFocus:false, |
| | | barcodefocus: false, |
| | | range: [], |
| | | rangethree:[], |
| | | group: [], |
| | | AreaId: 0, |
| | | acrossFloor:0, |
| | | quantity: "", |
| | | SourceAddress: "", |
| | | TargetAddress: "", |
| | | // 表单数据 |
| | | PalletCode1: "", |
| | | PalletCode2: "", |
| | | PalletCode3: "", |
| | | SourceAddress: "", |
| | | AreaId: "", |
| | | selectedAreaName: "", |
| | | materSn: "", |
| | | items: ['入库','物料绑定', '物料解绑'], |
| | | group: null, |
| | | |
| | | // 区域数据 |
| | | areaList: [], // 原始区域数据 [{id, name}] |
| | | areaNames: [], // 区域名称数组(用于picker显示) |
| | | |
| | | // 焦点控制 |
| | | barcodeFocus: true, |
| | | addressFocus: false, |
| | | barcodefocus: false, |
| | | focus: false, |
| | | istrue: false, |
| | | |
| | | // UI控制 |
| | | items: ['入库', '物料绑定', '物料解绑'], |
| | | current: 0 |
| | | } |
| | | }, |
| | | onLoad(res) { |
| | | this.range = config.AreaId; |
| | | this.rangethree = config.AcrossFloor; |
| | | |
| | | onLoad() { |
| | | this.QueryAreaInfo(); |
| | | }, |
| | | |
| | | methods: { |
| | | // 分段选择器点击事件 |
| | | onClickItem(e) { |
| | | if (this.current != e.currentIndex) { |
| | | if (this.current !== e.currentIndex) { |
| | | this.current = e.currentIndex; |
| | | // 切换tab时重置焦点 |
| | | this.resetFocus(); |
| | | } |
| | | }, |
| | | |
| | | // 重置焦点状态 |
| | | resetFocus() { |
| | | this.barcodeFocus = true; |
| | | this.addressFocus = false; |
| | | this.barcodefocus = false; |
| | | this.focus = false; |
| | | }, |
| | | |
| | | // 播放语音 |
| | | voiceSpeech(src) { |
| | | innerAudioContext.src = src; // '../../static/success.mp3'; |
| | | innerAudioContext.src = src; |
| | | innerAudioContext.play(); |
| | | }, |
| | | InboundTask() { |
| | | if (this.PalletCode1.length <= 0 && this.SourceAddress.length) { |
| | | |
| | | // 查询区域信息 |
| | | QueryAreaInfo() { |
| | | this.$u.post('/api/Dt_AreaInfo/QueryAreaInfo').then(res => { |
| | | if (res.status && res.data) { |
| | | // 后端返回数组格式 |
| | | this.areaList = res.data; |
| | | // 提取名称数组供picker使用 |
| | | this.areaNames = this.areaList.map(item => item.name); |
| | | |
| | | // this.$refs.luToast.show({ |
| | | // title: res.message || "加载成功", |
| | | // type: "success" |
| | | // }); |
| | | } else { |
| | | this.$refs.luToast.show({ |
| | | title: res.message || "加载失败", |
| | | type: "error" |
| | | }); |
| | | } |
| | | }).catch(err => { |
| | | console.error('QueryAreaInfo error:', err); |
| | | this.$refs.luToast.show({ |
| | | title: "托盘编码跟绑定货位不能为空", |
| | | title: "网络请求失败", |
| | | type: "error" |
| | | }) |
| | | }); |
| | | }); |
| | | }, |
| | | |
| | | // 区域选择事件 |
| | | onAreaChange(e) { |
| | | const index = e.detail.value; |
| | | if (this.areaList[index]) { |
| | | this.selectedAreaName = this.areaList[index].name; |
| | | this.AreaId = this.areaList[index].id; |
| | | } |
| | | }, |
| | | |
| | | // 入库任务 |
| | | InboundTask() { |
| | | // 验证 |
| | | if (!this.PalletCode1 || this.PalletCode1.trim() === "") { |
| | | this.$refs.luToast.show({ |
| | | title: "托盘编码不能为空", |
| | | type: "error" |
| | | }); |
| | | return; |
| | | } |
| | | var param = { |
| | | "PalletCode": this.PalletCode1, |
| | | "Position": this.SourceAddress, |
| | | "TargetAddress": this.TargetAddress, |
| | | "AreaId": this.AreaId, |
| | | |
| | | if (!this.SourceAddress || this.SourceAddress.trim() === "") { |
| | | this.$refs.luToast.show({ |
| | | title: "搬运起点不能为空", |
| | | type: "error" |
| | | }); |
| | | return; |
| | | } |
| | | |
| | | if (!this.AreaId) { |
| | | this.$refs.luToast.show({ |
| | | title: "请选择终点区域", |
| | | type: "error" |
| | | }); |
| | | return; |
| | | } |
| | | |
| | | const param = { |
| | | PalletCode: this.PalletCode1, |
| | | Position: this.SourceAddress, |
| | | AreaId: this.AreaId, |
| | | }; |
| | | |
| | | this.$u.post('/api/Task/RequestInboundTaskAsync', param).then(res => { |
| | | if (res.status) { |
| | | this.$refs.luToast.show({ |
| | | title: res.message, |
| | | title: res.message || "任务创建成功", |
| | | type: "success" |
| | | }) |
| | | }); |
| | | // 重置表单 |
| | | this.PalletCode1 = ""; |
| | | this.SourceAddress = ""; |
| | | this.TargetAddress = ""; |
| | | this.AreaId = ""; |
| | | this.istrue = false; |
| | | this.selectedAreaName = ""; |
| | | this.barcodeFocus = true; |
| | | } else { |
| | | this.$refs.luToast.show({ |
| | | title: res.message, |
| | | title: res.message || "任务创建失败", |
| | | type: "error" |
| | | }) |
| | | }); |
| | | } |
| | | }) |
| | | }, |
| | | SendTask() { |
| | | if (this.PalletCode3.length <= 0 && this.SourceAddress3.length) { |
| | | }).catch(err => { |
| | | console.error('InboundTask error:', err); |
| | | this.$refs.luToast.show({ |
| | | title: "托盘编码跟绑定货位不能为空", |
| | | title: "网络请求失败", |
| | | type: "error" |
| | | }) |
| | | return; |
| | | } |
| | | var param = { |
| | | "PalletCode": this.PalletCode3, |
| | | "Position": this.SourceAddress3, |
| | | "AreaId": this.acrossFloor, |
| | | "DoubleTray":1, |
| | | } |
| | | this.$u.post('/api/Task/RequestInboundTaskAsync', param).then(res => { |
| | | if (res.status) { |
| | | this.$refs.luToast.show({ |
| | | title: res.message, |
| | | type: "success" |
| | | }) |
| | | this.PalletCode3 = ""; |
| | | this.SourceAddress3 = ""; |
| | | this.acrossFloor = ""; |
| | | this.istrue = false; |
| | | } else { |
| | | this.$refs.luToast.show({ |
| | | title: res.message, |
| | | type: "error" |
| | | }) |
| | | } |
| | | }) |
| | | }); |
| | | }); |
| | | }, |
| | | |
| | | // 托盘编码1输入事件 |
| | | onPalletCode1Input() { |
| | | this.barcodeFocus = false; |
| | | this.$nextTick(() => { |
| | | if (this.PalletCode1 && this.PalletCode1 !== '') { |
| | | this.addressFocus = true; |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | // 组盘(物料绑定) |
| | | GroupPlate() { |
| | | if (this.PalletCode2.length <= 0 && this.InBoundOrder.length) { |
| | | if (!this.PalletCode2 || this.PalletCode2.trim() === "") { |
| | | this.$refs.luToast.show({ |
| | | title: "请输入起点站台", |
| | | title: "托盘编码不能为空", |
| | | type: "error" |
| | | }) |
| | | }); |
| | | return; |
| | | } |
| | | var param = { |
| | | "PalletCode": this.PalletCode2, |
| | | "groups": this.group |
| | | |
| | | if (!this.materSn) { |
| | | this.$refs.luToast.show({ |
| | | title: "请先扫描外箱标签", |
| | | type: "error" |
| | | }); |
| | | return; |
| | | } |
| | | |
| | | const param = { |
| | | PalletCode: this.PalletCode2, |
| | | group: this.materSn, |
| | | }; |
| | | |
| | | this.$u.post('/api/BoxingInfo/AddGroupPlateAsync', param).then(res => { |
| | | if (res.status) { |
| | | this.$refs.luToast.show({ |
| | | title: res.message, |
| | | title: res.message || "组盘成功", |
| | | type: "success" |
| | | }) |
| | | }); |
| | | // 重置表单 |
| | | this.PalletCode2 = ""; |
| | | this.group = []; |
| | | this.materSn = ""; |
| | | this.barcodefocus = false; |
| | | this.focus = false; |
| | | this.voiceSpeech('../../static/success.mp3'); |
| | | } else { |
| | | this.$refs.luToast.show({ |
| | | title: res.message, |
| | | title: res.message || "组盘失败", |
| | | type: "error" |
| | | }) |
| | | }); |
| | | } |
| | | }) |
| | | }, |
| | | |
| | | SolvePlate() { |
| | | if (this.PalletCode3.length <= 0) { |
| | | }).catch(err => { |
| | | console.error('GroupPlate error:', err); |
| | | this.$refs.luToast.show({ |
| | | title: "请输入托盘条码", |
| | | title: "网络请求失败", |
| | | type: "error" |
| | | }) |
| | | return; |
| | | } |
| | | var param = { |
| | | "PalletCode": this.PalletCode3, |
| | | } |
| | | this.$u.post('/api/BoxingInfo/DeleteGroupPlateAsync', param).then(res => { |
| | | if (res.status) { |
| | | this.$refs.luToast.show({ |
| | | title: res.message, |
| | | type: "success" |
| | | }) |
| | | this.PalletCode3 = ""; |
| | | this.barcodefocus = false; |
| | | } else { |
| | | this.$refs.luToast.show({ |
| | | title: res.message, |
| | | type: "error" |
| | | }) |
| | | } |
| | | }) |
| | | }); |
| | | }); |
| | | }, |
| | | updateFocus() { |
| | | |
| | | // 外箱标签输入事件 |
| | | onMaterSnInput() { |
| | | this.barcodefocus = false; |
| | | this.$nextTick(() => { |
| | | this.materSn = ''; |
| | | if (!this.focus) { |
| | | if (this.PalletCode2 && this.PalletCode2 !== '') { |
| | | this.focus = true; |
| | | } |
| | | }); |
| | | }, |
| | | snInput() { |
| | | this.$nextTick(() => { |
| | | var matObj = { |
| | | orderNo: this.materSn, |
| | | } |
| | | var temp = this.group.find(x => x.orderNo == matObj.orderNo); |
| | | if (!temp) { |
| | | this.$u.post('/api/InboundOrder/GetInboundOrderInfo?orderNo=' + this.materSn, "").then( |
| | | res => { |
| | | if (res.status) { |
| | | this.group.push(res.data); |
| | | setTimeout(this.updateFocus, 200); |
| | | setTimeout(() => { |
| | | this.voiceSpeech('../../static/success.mp3'); |
| | | }, 100); |
| | | } else { |
| | | this.$refs.luToast.show({ |
| | | title: res.message, |
| | | type: "error" |
| | | }) |
| | | } |
| | | }) |
| | | |
| | | |
| | | // 解盘(物料解绑) |
| | | SolvePlate() { |
| | | if (!this.PalletCode3 || this.PalletCode3.trim() === "") { |
| | | this.$refs.luToast.show({ |
| | | title: "托盘编码不能为空", |
| | | type: "error" |
| | | }); |
| | | return; |
| | | } |
| | | |
| | | const param = { |
| | | PalletCode: this.PalletCode3, |
| | | }; |
| | | |
| | | this.$u.post('/api/BoxingInfo/DeleteGroupPlateAsync', param).then(res => { |
| | | if (res.status) { |
| | | this.$refs.luToast.show({ |
| | | title: res.message || "解盘成功", |
| | | type: "success" |
| | | }); |
| | | this.PalletCode3 = ""; |
| | | this.barcodefocus = false; |
| | | } else { |
| | | this.$refs.luToast.show({ |
| | | title: "扫码重复", |
| | | title: res.message || "解盘失败", |
| | | type: "error" |
| | | }) |
| | | setTimeout(this.updateFocus, 200); |
| | | setTimeout(() => { |
| | | this.voiceSpeech('../../static/fail.mp3'); |
| | | }, 100); |
| | | }); |
| | | } |
| | | |
| | | }) |
| | | }).catch(err => { |
| | | console.error('SolvePlate error:', err); |
| | | this.$refs.luToast.show({ |
| | | title: "网络请求失败", |
| | | type: "error" |
| | | }); |
| | | }); |
| | | }, |
| | | Changebarcode() { |
| | | this.barcodeFocus = false; |
| | | this.$nextTick(function(x) { |
| | | if (this.PalletCode1 != '') { |
| | | this.addressFocus = true; |
| | | } |
| | | }) |
| | | }, |
| | | inputChangebarcode() { |
| | | this.$nextTick(() => { |
| | | this.$u.post('/api/BoxingInfo/GetPalletCodeInfo?palletCode=' + this.PalletCode2, "").then( |
| | | res => { |
| | | if (res.status) { |
| | | this.group = res.data; |
| | | console.log(this.group); |
| | | setTimeout(this.updateFocus, 200); |
| | | setTimeout(() => { |
| | | this.voiceSpeech('../../static/success.mp3'); |
| | | }, 100); |
| | | } |
| | | }) |
| | | }) |
| | | }, |
| | | removeScanItem(orderNo) { |
| | | this.group = this.group.filter(item => item.orderNo !== orderNo); |
| | | |
| | | // 托盘编码3输入事件 |
| | | onPalletCode3Input() { |
| | | this.barcodefocus = false; |
| | | } |
| | | } |
| | | } |