#
zhou zhou
9 小时以前 f23814fcf6199cfb2d8bbc121fdccab834b374a4
pages/inbound/buffStore.vue
@@ -1,72 +1,92 @@
<template>
   <view class="has-foot">
      <form>
         <view class="flex padding-sm justify-center">
            <view class="text-orange text-center">请按下列步骤进行 “塑料粒子灌桶入库” </view>
         </view>
         <!-- step1:上新料 -->
         <view class="cu-form-group">
            <view class="title">1.新料(袋装)接驳站点:</view>
            <input placeholder="请扫描接驳站点条码" v-model="bagStaBarcode" ></input>
         </view>
         <view class="cu-bar btn-group top margin-top">
            <button class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="queryBagLocItem">1.呼叫新料(袋装)</button>
         </view>
         <!-- step2:上空桶 -->
         <view class="cu-form-group margin-top">
            <view class="title">空桶接驳站点</view>
            <input
               placeholder="请扫描空桶接驳站点条码"
               v-model="sta1"
            />
         </view>
            <view class="title">2.空桶接驳站点:</view>
            <input placeholder="请扫描接驳站点条码" v-model="palletStaBarcode"></input>
         </view>
         <view class="cu-bar btn-group top margin-top">
            <button
               class="cu-btn text-blue line-blue shadow"
               @click="sta1Click()"
            >
               1.呼叫空桶
            </button>
            <button class="cu-btn text-blue line-blue shadow" :disabled="repeatClick" @click="callEmptyPallet">2.呼叫空桶</button>
         </view>
         <!-- step3:入库 -->
         <view class="cu-form-group margin-top">
            <view class="title">袋装新料接驳站点</view>
            <input
               placeholder="请扫描袋装新料接驳站点条码"
               v-model="sta2"
            />
            <view class="title">3.待入库物料编码:</view>
            <input placeholder="" v-model="matNr"></input>
            <text class='cuIcon-search text-blue' @click="search"></text>
         </view>
         <view class="cu-bar btn-group top margin-top">
            <button
               class="cu-btn bg-blue shadow-blur"
               :disabled="repeatClick"
               @click="sta2Click()"
            >
               2.呼叫袋装新料
            </button>
         <view class="flex solid-bottom padding-sm justify-between">
            <text class="text-grey margin-left">{{ makTx }}</text>
         </view>
         <view class="cu-bar btn-group top margin-top">
            <button
               class="cu-btn bg-green shadow-blur"
               @click="toComb"
            >
               3.去组托
            </button>
         <view class="cu-form-group">
            <view class="title">&nbsp;&nbsp;&nbsp;待入库桶号:</view>
            <input placeholder="" v-model="palletBarcode"></input>
            <text class='cuIcon-search text-blue' @click="search"></text>
         </view>
         <view class="flex solid-bottom padding-sm justify-between">
            <view class="text-grey margin-left" >&nbsp;待入库物料数量:1桶</view>
         </view>
         <view class="flex solid-bottom padding-sm justify-between">
            <view class="text-grey margin-left" >&nbsp;待入库库区:2#-1F 桶装新料储位</view>
         </view>
         <view class="cu-bar btn-group top margin-top">
            <button
               class="cu-btn bg-green shadow-blur"
               @click="toIn"
            >
               4.去入库
            </button>
            <button class="cu-btn bg-green shadow-blur" :disabled="repeatClick" @click="fullInStock">3.装桶完成,点击入库</button>
         </view>
      </form>
      <view class="cu-list det menu sm-border padding">
         <block
            v-for="(item, index) in list"
            :key="index"
         >
      <!-- 新料库存信息弹窗 -->
      <view class="cu-modal" :class="modalName=='bagModal'?'show':''" @click="closeModal">
         <view class="cu-dialog" @click.stop>
            <view class="cu-bar bg-white justify-between">
               <view class="title text-bold">新料(袋装)库存信息</view>
               <view class="content" @click="closeModal">
                  <text class="cuIcon-close text-grey"></text>
               </view>
            </view>
            <view class="padding-lr" style="max-height: 70vh; overflow-y: auto;">
               <block v-for="(item, index) in bagList" :key="index">
                  <view class="cu-list menu-avatar margin-bottom-sm">
                     <view class="cu-item flex align-start">
                        <view class="content flex-1 text-left">
                           <text class="text-grey padding-right-xs">库位:{{item.locId}} </text>
                           <text class="text-grey padding-right-xs">物料:{{item.makTx}} </text>
                           <text class="text-grey padding-right-xs">托盘号:{{item.palletId}} </text>
                           <text class="text-orange">数量:{{item.anfme}} </text>
                        </view>
                        <view class="action">
                           <button class="cu-btn bg-blue shadow-blur sm" @click.stop="callBagByAGV(item)">上料</button>
                        </view>
                     </view>
                  </view>
               </block>
            </view>
         </view>
      </view>
      <!-- <view class="cu-list det menu sm-border  padding">
         <block v-for="(item, index) in list" :key="index">
            <view class="cu-bar bg-white solid-bottom margin-top-sm">
               <view class="action">
                  <view class="index">
                     {{ index + 1 }}
                     {{index+1}}
                  </view>
                  <view class="text-blue">
                     {{ `${item.maktx}` }}
                     {{`${item.maktx}`}}
                  </view>
               </view>
                  <view class="action" >
                  <text @click="remove(index)" class="cuIcon-close text-red" style="font-size: 24px;"></text>
               </view>
            </view>
@@ -75,7 +95,7 @@
                  <text class="text-black">ASN:</text>
               </view>
               <view class="action">
                  <text class="text-grey">{{ item.asnCode }}</text>
                  <text class="text-grey ">{{item.asnCode}}</text>
               </view>
            </view>
            <view class="cu-item">
@@ -83,246 +103,475 @@
                  <text class="text-black">批次:</text>
               </view>
               <view class="action">
                  <text class="text-grey">{{ item.batch }}</text>
                  <text class="text-grey ">{{item.batch}}</text>
               </view>
            </view>
            <view class="cu-item">
               <view class="content">
                  <text class="text-black">收货数量:</text>
               </view>
               <view class="action">
                  <text class="text-grey">{{ item.anfme }}</text>
                  <text class="text-grey ">{{item.anfme}}</text>
               </view>
            </view>
         </block>
      </view>
      </view> -->
   </view>
</template>
<script>
import { request } from '../../common/request.js'
import { mapState, mapMutations, mapActions, mapGetters } from 'vuex'
export default {
   data() {
      return {
         barcode: '',
         areaName: '',
         locCode: '',
         container: '',
         list: [],
         range: [],
         curCode: '',
         whAreaId: '',
         repeatClick: false,
         sta1: '',
         sta2: ''
      }
   },
   computed: {
      ...mapState('user', ['dynamicFields'])
   },
   mounted() {},
   methods: {
      async sta1Click() {
         let that = this
         const { code, data, msg } = await request(
            '/orderOut/buffStore/callEmpty',
            {
               sta1: this.sta1
            },
            'POST'
         )
         if (code === 200) {
            uni.showToast({
               title: '呼叫成功'
            })
         } else {
            uni.showToast({
               title: msg,
               icon: 'none'
            })
   import {
      request
   } from '../../common/request.js'
   import {
      mapState,
      mapMutations,
      mapActions,
      mapGetters
   } from 'vuex';
   export default {
      data() {
         return {
            // barcode: '',
            areaName: '',
            locCode: '',
            container: '',
            list: [],
            bagList: [],
            range: [],
            curCode: '',
            whAreaId:'',
            repeatClick: false,
            palletBarcode: '',
            palletTypeId: '',
            palletTypeRange: [],
            bagStaBarcode: '',
            modalName: '',
            palletStaBarcode: '',
            matNr: '',
            makTx: '',
            transferStationNo: '',
         }
      },
      async sta2Click() {
         let that = this
         const { code, data, msg } = await request(
            '/orderOut/buffStore/callNewMat',
            {
               sta1: this.sta1
            },
            'POST'
         )
         if (code === 200) {
            uni.showToast({
               title: '呼叫成功'
      computed: {
         ...mapState('user', ['dynamicFields']),
      },
      mounted() {
         this.getRece()
         this.getPalletType()
         this.whAreaId = uni.getStorageSync('whAreaId')
      },
      methods: {
         selChange(val) {
            uni.setStorageSync('whAreaId', val)
         },
         async search() {
            let that = this
            const {
               code,
               data,
               msg
            } = await request('/staBind/list', {
               sta: this.barcode
            })
         } else {
            uni.showToast({
               title: msg,
               icon: 'none'
            })
         }
      },
      toComb() {
         uni.navigateTo({
            url: '/pages/listing/matnrPalletising'
         })
      },
      toIn() {
         uni.navigateTo({
            url: '/pages/AGV/StartInTask'
         })
      },
      selChange(val) {
         uni.setStorageSync('whAreaId', val)
      },
      async search() {
         let that = this
         const { code, data, msg } = await request('/staBind/list', {
            sta: this.barcode
         })
         if (code === 200) {
            if (data.list.length > 0) {
               that.container = data.barcode
               that.list = data.list
            if (code === 200) {
               if(data.list.length >0){
                  that.container = data.barcode
                  that.list = data.list
               }
               that.range = data.warehouseAreasList.map(item => ({
                  value: item.id,
                  text: item.name
               }));
               that.whAreaId = data.area
            } else {
               uni.showToast({
                  title: msg,
                  icon: "none",
               })
            }
            that.range = data.warehouseAreasList.map((item) => ({
               value: item.id,
               text: item.name
            }))
            that.whAreaId = data.area
         } else {
            uni.showToast({
               title: msg,
               icon: 'none'
            })
         }
      },
         },
      remove(index) {
         this.list.splice(index, 1)
      },
      clear() {
         this.list = []
         remove(index) {
            this.list.splice(index, 1);
         },
         clear() {
            this.list = []
            this.container = ''
            this.barcode = ''
         },
         this.container = ''
         this.barcode = ''
      },
         open() {
            this.$refs.popup.open()
         },
      open() {
         this.$refs.popup.open()
      },
         close() {
            this.$refs.popup.close()
         },
      close() {
         this.$refs.popup.close()
      },
         popupSubmit() {
            this.$refs.popup.close()
         },
         itemChange(el) {
            this.curCode = el
         },
         // 选择新料(袋装)库存,送至灌桶站点
         async queryBagLocItem() {
            if(this.bagStaBarcode === '' || this.bagStaBarcode === null){
               uni.showToast({
                  title: "新料 (袋装) 接驳站点不能为空!!!",
                  icon: "none",
               })
               return ;
            }
            this.repeatClick = true
            try{
               const { code, data, msg } = await request('/inventory/details', {
                  wareHouseAreaId: '2--1-5'   // TODO:固定待后续替换
               })
               if (code === 200) {
                  if(data && data.length > 0){
                     // 展示查询到的数据
                     this.bagList = data
                     // 打开弹窗
                     this.modalName = 'bagModal'
                  } else {
                     uni.showToast({
                        title: '未查到新料(袋装)库存',
                        icon: 'none'
                     })
                  }
               } else {
                  uni.showToast({
                     title: msg,
                     icon: 'none',
                  })
               }
            } catch (error) {
               console.error('请求错误:', error)
               uni.showToast({
                  title: '查询失败:' + (error.message || '未知错误'),
                  icon: 'none'
               })
            }finally{
               this.repeatClick = false
            }
         },
         // 关闭弹窗
         closeModal() {
            this.modalName = null
         },
         // 为新料(袋装)上料呼叫 AGV
         async callBagByAGV(item) {
            console.log('AGV上料:新料(袋装), 数据:', item)
            if(this.item === '' || this.item === null){
               uni.showToast({
                  title: "请先选择库位出库",
                  icon: "none",
               })
               return ;
            }
            this.repeatClick = true
            try{
               const { code, data, msg } = await request('/check/non/order', {
                  transferStationNo: this.transferStationNo || this.bagStaBarcode,
                  locNo: item.locId
               })
               if (code === 200) {
                  uni.showToast({
                     title: '新料(袋装)上料中',
                     icon: 'success'
                  })
                  // 更新物料编码、物料名称
                  this.matNr = item.matNr || '',
                  this.makTx = '待入库物料名称:' + (item.makTx || '')
                  this.closeModal()
                  // // 从列表中移除该项
                  // const index = this.bagList.findIndex(i => i.palletId === item.palletId)
                  // if (index > -1) {
                  //    this.bagList.splice(index, 1)
                  // }
                  // // 如果列表为空,关闭弹窗
                  // if (this.bagList.length === 0) {
                  //    this.closeModal()
                  // }
               } else {
                  uni.showToast({
                     title: msg,
                     icon: 'none'
                  })
               }
            } catch (error) {
               console.error('AGV 呼叫失败:', error)
               uni.showToast({
                  title: 'AGV 呼叫失败',
                  icon: 'none'
               })
            } finally {
               this.repeatClick = false
            }
         },
         // 呼叫空桶
         async callEmptyPalletFromBag() {
            // 使用袋装接驳站点信息调用空托出库接口
            if(this.palletTypeId === '' || this.palletTypeId === null){
               uni.showToast({
                  title: "请先选择容器类型",
                  icon: "none",
               })
               return ;
            }
            this.repeatClick = true
            try{
               const { code, data, msg } = await request(
                  '/callForEmptyContainers',
                  {
                     staNo: this.bagBarcode,
                     type: this.palletTypeId
                  }
               )
               if (code === 200) {
                  uni.showToast({
                     title: '呼叫空托盘中,请稍作等待'
                  })
                  this.bagBarcode = ''
               } else {
                  uni.showToast({
                     title: msg,
                     icon: 'none',
                     position: 'top'
                  })
               }
            }finally{
               this.repeatClick = false
            }
         },
         // 满桶入库
         async fullInStock() {
            console.log('满桶入库:新料(袋装), 数据:', item)
            if(this.item === '' || this.item === null){
               uni.showToast({
                  title: "请先选择库位出库",
                  icon: "none",
               })
               return ;
            }
            this.repeatClick = true
            try{
               const { code, data, msg } = await request('/AGV/task/start', {
                  staNo: this.bagBarcode,
                  palletBarcode: item.palletId
               })
               if (code === 200) {
                  uni.showToast({
                     title: '新料(袋装)上料中',
                     icon: 'success'
                  })
                  // 更新物料编码、物料名称
                  this.matNr = item.matnrCode || ''
                  this.makTx = '&nbsp;待入库物料名称:' + (item.makTx || '')
                  // 从列表中移除该项
                  const index = this.bagList.findIndex(i => i.palletId === item.palletId)
                  if (index > -1) {
                     this.bagList.splice(index, 1)
                  }
                  // 如果列表为空,关闭弹窗
                  if (this.bagList.length === 0) {
                     this.closeModal()
                  }
               } else {
                  uni.showToast({
                     title: msg,
                     icon: 'none'
                  })
               }
            } catch (error) {
               console.error('AGV 呼叫失败:', error)
               uni.showToast({
                  title: 'AGV 呼叫失败',
                  icon: 'none'
               })
            } finally {
               this.repeatClick = false
            }
         },
         async callEmptyPallet() {
            if(this.staBarcode === '' || this.palletBarcode === null){
               uni.showToast({
                  title: "接驳站点不能为空",
                  icon: "none",
               })
               return ;
            }
            if(this.palletTypeId === '' || this.palletTypeId === null){
               uni.showToast({
                  title: "请选择容器类型",
                  icon: "none",
               })
               return ;
            }
            this.repeatClick = true
            try{
               const { code, data, msg } = await request(
                  '/callForEmptyContainers',
                  {
                     staNo: this.palletBarcode,
                     type: this.palletTypeId
                  }
               )
               if (code === 200) {
                  uni.showToast({
                     title: '呼叫空托盘中,请稍作等待'
                  })
                  this.palletBarcode = ''
               } else {
                  uni.showToast({
                     title: msg,
                     icon: 'none',
                     position: 'top'
                  })
               }
            }finally{
               this.repeatClick = false
            }
         },
         async getPalletType() {
            const { code, data, msg } = await request(
               '/info/palletType/list',
               {},
               'get'
            )
            if (code === 200) {
               this.palletTypeRange = data.map((item) => ({
                  value: item.value,
                  text:
                     item.group === null
                        ? item.label
                        : item.group + '-- ' + item.label
               }))
            }
         },
         palletTypeChange(val) {
            uni.setStorageSync('palletTypeId', val.value)
         },
      popupSubmit() {
         this.$refs.popup.close()
      },
      itemChange(el) {
         this.curCode = el
      },
      async confirm() {
         if (this.barcode === '' || this.barcode === null) {
            uni.showToast({
               title: '接驳站点不能为空',
               icon: 'none'
            })
            return
         }
         if (this.whAreaId === '' || this.whAreaId === null) {
            uni.showToast({
               title: '目标库区不能为空',
               icon: 'none'
            })
            return
         }
         this.repeatClick = true
         const { code, data, msg } = await request('/AGV/task/start', {
            sta: this.barcode,
            area: this.whAreaId
         })
         if (code === 200) {
            uni.showToast({
               title: '启动成功'
            })
            this.clear()
         } else {
            uni.showToast({
               title: msg,
               icon: 'none'
            })
         }
         this.repeatClick = false
      },
      async getRece() {
         const { code, data, msg } = await request(
            '/areas/receipt',
            {},
            'get'
         )
         if (code === 200) {
            this.range = data.map((item) => ({
               value: item.id,
               text: item.warehouseId$ + '-- ' + item.name
            }))
         }
         async confirm() {
            if(this.barcode === '' || this.barcode ===null){
               uni.showToast({
                  title: "接驳站点不能为空",
                  icon: "none",
               })
               return ;
            }
            if(this.whAreaId === '' || this.whAreaId ===null){
               uni.showToast({
                  title: "目标库区不能为空",
                  icon: "none",
               })
               return ;
            }
            this.repeatClick = true
            const {
               code,
               data,
               msg
            } = await request('/AGV/task/start',{
                  sta: this.barcode,
                  area: this.whAreaId
               }
            )
            if (code === 200) {
               uni.showToast({
                  title: '启动成功'
               })
               this.clear()
            } else {
               uni.showToast({
                  title: msg,
                  icon: "none",
               })
            }
            this.repeatClick = false
         },
         async getRece() {
            const {
               code,
               data,
               msg
            } = await request('/areas/receipt', {}, 'get')
            if (code === 200) {
               this.range = data.map(item => ({
                  value: item.id,
                  text: item.warehouseId$ + "-- " + item.name
               }));
            }
         },
      }
   }
}
</script>
<style>
.index {
   border: 1px solid #e54d42;
   color: #e54d42;
   border-radius: 50%;
   display: block;
   width: 50rpx;
   height: 50rpx;
   line-height: 48rpx;
   text-align: center;
   margin-right: 20rpx;
   font-size: 30rpx;
}
   .index {
      border: 1px solid #e54d42;
      color: #e54d42;
      border-radius: 50%;
      display: block;
      width: 50rpx;
      height: 50rpx;
      line-height: 48rpx;
      text-align: center;
      margin-right: 20rpx;
      font-size: 30rpx;
   }
.text-blue {
   color: #0081ff !important;
}
   .text-blue {
      color: #0081ff !important;
.item {
   position: relative;
   display: flex;
   min-height: 80upx;
   align-items: center;
}
   }
.uni-file-picker {
   width: 100%;
   margin-bottom: 10px;
}
   .item {
      position: relative;
      display: flex;
      min-height: 80upx;
      align-items: center;
   }
.uni-select__selector {
   z-index: 999;
}
   .uni-file-picker {
      width: 100%;
      margin-bottom: 10px;
   }
.tj {
   height: auto;
   padding: 6px 8px;
   display: inline-block;
   border-radius: 6px;
}
   .uni-select__selector {
      z-index: 999;
   }
.item {
   display: flex;
   justify-content: center;
}
   .tj {
      height: auto;
      padding: 6px 8px;
      display: inline-block;
      border-radius: 6px;
   }
.item .cu-btn {
   font-size: 26upx;
}
</style>
   .item {
      display: flex;
      justify-content: center;
   }
   .item .cu-btn {
      font-size: 26upx;
   }
</style>