huangxiaoqiang
14 小时以前 960b33fa24c47a330e51a2c24859d681ae62caeb
Code Management/PDA-FG/pages/Inbound/Inbound.vue
@@ -2,312 +2,332 @@
   <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;
         }
      }
   }