pang.jiabao
2025-12-21 f512b30f112a4f5c60c6d4cb6f94ee032480adc3
PDA相关功能开发
2个文件已添加
4个文件已修改
504 ■■■■■ 已修改文件
pages.json 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/home/home.vue 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/order/callEmptyTray.vue 213 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/order/orderComb.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/order/orderSelect.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/order/trayReturn.vue 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages.json
@@ -283,6 +283,20 @@
            }
        },
        {
            "path" : "pages/order/callEmptyTray",
            "style" :
            {
                "navigationStyle": "custom"
            }
        },
        {
            "path" : "pages/order/trayReturn",
            "style" :
            {
                "navigationStyle": "custom"
            }
        },
        {
            "path" : "pages/order/orderPickConfirm",
            "style" : 
            {
pages/home/home.vue
@@ -41,19 +41,33 @@
                store: '',
                elements: [],
                elements2: [
                    {
                        title: '组托入库',
                        name: 'pakin',
                        color: 'cyan',
                        cuIcon: 'pullup',
                        url: '/pakin/pakin'
                    },
                    // {
                    //     title: '组托入库',
                    //     name: 'pakin',
                    //     color: 'cyan',
                    //     cuIcon: 'pullup',
                    //     url: '/pakin/pakin'
                    // },
                    {
                    title: '订单组托',
                    name: 'orderComb',
                    color: 'olive',
                    cuIcon: 'pulldown',
                    url: '/order/orderComb'
                    },
                    {
                        title: '呼叫空托',
                        name: 'callEmptyTray',
                        color: 'orange',
                        cuIcon: 'pullup',
                        url: '/order/callEmptyTray'
                    },
                    {
                        title: '托盘回库',
                        name: 'trayReturn',
                        color: 'yellow',
                        cuIcon: 'pullup',
                        url: '/order/trayReturn'
                    },
                    // {
                    //     title: '平库组托',
@@ -62,20 +76,20 @@
                    //     cuIcon: 'pullup',
                    //     url: '/pakin/putOn'
                    // },
                    {
                        title: '平库上架',
                        name: 'WarehouseIn',
                        color: 'purple',
                        cuIcon: 'text',
                        url: '/pakin/WarehouseIn'
                    },
                    {
                        title: '平库下架',
                        name: 'orderPutOn',
                        color: 'yellow',
                        cuIcon: 'pullup',
                        url: '/warehouse/orderList'
                    },
                    // {
                    //     title: '平库上架',
                    //     name: 'WarehouseIn',
                    //     color: 'purple',
                    //     cuIcon: 'text',
                    //     url: '/pakin/WarehouseIn'
                    // },
                    // {
                    //     title: '平库下架',
                    //     name: 'orderPutOn',
                    //     color: 'yellow',
                    //     cuIcon: 'pullup',
                    //     url: '/warehouse/orderList'
                    // },
                    // ,
                    // {
                    //     title: '并板入库',
pages/order/callEmptyTray.vue
New file
@@ -0,0 +1,213 @@
    <template>
        <view class="container">
            <uni-nav-bar left-icon="left" title="呼叫空料框出库" @clickLeft="back" :fixed="true" :border="false" />
            <!-- 输入区 -->
            <view class="code">
                <!-- 目标站点 -->
                <view class="item full-item">
                    <view class="code-decs">目标站点:</view>
                    <input type="text" placeholder="扫码 / 输入" v-model="staNo" class="full-input" />
                </view>
                <!-- 托盘类型 -->
                <view class="item full-item">
                    <view class="code-decs">托盘类型:</view>
                    <radio-group @change="onLocTypeChange" class="full-radio">
                        <label class="radio">
                            <radio value="1" :checked="locType === '1'" />窄
                        </label>
                        <label class="radio">
                            <radio value="2" :checked="locType === '2'" />宽
                        </label>
                    </radio-group>
                </view>
                <!-- 数量 -->
                <view class="item full-item">
                    <view class="code-decs">数量:</view>
                    <view class="count-box full-count">
                        <button class="count-btn" @click="decreaseCount">-</button>
                        <input type="number" v-model.number="count" min="1" class="count-input" />
                        <button class="count-btn" @click="increaseCount">+</button>
                    </view>
                </view>
            </view>
            <!-- 底部按钮 -->
            <view class="buttom">
                <button size="mini" @click="reset">重置</button>
                <button size="mini" type="primary" @click="submitCall">提交</button>
            </view>
        </view>
    </template>
    <script>
        export default {
            data() {
                return {
                    baseUrl: '',
                    token: '',
                    staNo: '',
                    locType: '1', // 默认窄
                    count: 1
                }
            },
            onShow() {
                this.baseUrl = uni.getStorageSync('baseUrl')
                this.token = uni.getStorageSync('token')
            },
            methods: {
                back() {
                    uni.navigateBack()
                },
                onLocTypeChange(e) {
                    this.locType = e.detail.value
                },
                increaseCount() {
                    this.count++
                },
                decreaseCount() {
                    if (this.count > 1) this.count--
                },
                reset() {
                    this.staNo = ''
                    this.locType = '1'
                    this.count = 1
                },
                submitCall() {
                    if (!this.staNo) {
                        uni.showToast({
                            title: '请输入目标站点',
                            icon: 'none'
                        })
                        return
                    }
                    uni.request({
                        url: this.baseUrl + '/mobile/callEmptyBinOutBound',
                        method: 'POST',
                        header: {
                            token: this.token,
                            'Content-Type': 'application/json'
                        },
                        data: {
                            staNo: this.staNo,
                            locType: this.locType,
                            count: this.count
                        },
                        success: res => {
                            res = res.data
                            if (res.code === 200) {
                                uni.showToast({
                                    title: '呼叫成功',
                                    icon: 'success'
                                })
                                this.reset()
                            } else {
                                uni.showToast({
                                    title: res.msg || '呼叫失败',
                                    icon: 'none'
                                })
                            }
                        }
                    })
                }
            }
        }
    </script>
    <style>
        @import url('../../static/css/wms.css/wms.css');
        .container {
            height: 100vh;
            display: flex;
            flex-direction: column;
            /* justify-content: space-between; */
        }
        /* 底部按钮 */
        .buttom {
            width: 100%;
            display: flex;
            justify-content: space-around;
            padding: 20rpx 0;
        }
        /* 输入行 */
        .full-item {
            height: 100rpx;
            display: flex;
            align-items: center;
            padding: 0 20rpx;
        }
        /* 左侧文字固定宽度 */
        .code-decs {
            width: 200rpx;
            /* 可根据实际调节 */
            font-size: 36rpx;
            color: #303133;
        }
        /* 右侧控件占剩余空间 */
        .full-input,
        .full-radio,
        .full-count {
            flex: 1;
        }
        /* 输入框 */
        .full-input {
            height: 80rpx;
            line-height: 80rpx;
            font-size: 36rpx;
            padding: 0 20rpx;
            border-radius: 12rpx;
            border: 1px solid #dcdcdc;
        }
        /* 单选按钮 */
        .full-radio {
            display: flex;
            justify-content: flex-start;
        }
        .radio {
            padding: 20rpx 40rpx;
            border: 1px solid #dcdcdc;
            border-radius: 16rpx;
            margin-right: 20rpx;
            font-size: 36rpx;
            display: flex;
            align-items: center;
        }
        /* 数量 */
        .count-box {
            display: flex;
            align-items: center;
            border-radius: 12rpx;
            overflow: hidden;
            border: 1px solid #dcdcdc;
        }
        .count-btn {
            width: 100rpx;
            height: 80rpx;
            line-height: 80rpx;
            font-size: 40rpx;
            background-color: #f5f5f5;
            text-align: center;
            border: none;
        }
        .count-input {
            width: 120rpx;
            height: 80rpx;
            line-height: 80rpx;
            font-size: 36rpx;
            text-align: center;
            border: none;
            outline: none;
        }
    </style>
pages/order/orderComb.vue
@@ -218,7 +218,7 @@
            getOrderDet() {
                let that = this
                uni.request({
                    url: that.baseUrl + '/order/list/orderNo',
                    url: that.baseUrl + '/order/pakin/order/list/orderNo',
                    data: {orderNo: that.orderNo} ,
                    method: 'GET',
                    success(res) {
@@ -237,7 +237,7 @@
            getOrderNoList() {
                let that = this
                uni.request({
                    url: this.baseUrl + '/order/comb/list/all',
                    url: this.baseUrl + '/order/pakin/order/nav/list/auth',
                    header: {
                        'token': uni.getStorageSync('token')
                    },
pages/order/orderSelect.vue
@@ -144,7 +144,7 @@
            getOrderNoList() {
                let that = this
                uni.request({
                    url: this.baseUrl + '/order/comb/list/all',
                    url: this.baseUrl + '/order/pakin/order/nav/list/auth',
                    header: {
                        'token': uni.getStorageSync('token')
                    },
pages/order/trayReturn.vue
New file
@@ -0,0 +1,215 @@
<template>
  <view>
    <uni-nav-bar
      left-icon="left"
      title="托盘回库"
      @clickLeft="back"
      :fixed="true"
      :border="false"
    />
    <!-- 输入区 -->
    <view class="code">
      <!-- 起始站点 -->
      <view class="item">
        <view class="code-decs">起始站点:</view>
        <input
          type="text"
          placeholder="扫码 / 输入"
          v-model="site"
          :focus="siteFocus"
          @confirm="siteConfirm"
        />
      </view>
      <!-- 托盘条码 -->
      <view class="item">
        <view class="code-decs">托盘条码:</view>
        <input
          type="text"
          placeholder="扫码 / 输入"
          v-model="barcode"
          :focus="barcodeFocus"
        />
      </view>
      <!-- 托盘状态 -->
      <view class="item">
        <view class="code-decs">托盘状态:</view>
        <radio-group @change="onEmptyFlagChange">
          <label class="radio">
            <radio value="1" :checked="emptyFlag === '1'" /> 有货
          </label>
          <label class="radio">
            <radio value="2" :checked="emptyFlag === '2'" /> 空托
          </label>
        </radio-group>
      </view>
    </view>
    <!-- 底部按钮 -->
    <view class="buttom">
      <button size="mini" @click="reset">重置</button>
      <button size="mini" type="primary" @click="confirmCall">确认</button>
    </view>
  </view>
</template>
<script>
export default {
  data() {
    return {
      baseUrl: '',
      token: '',
      site: '',
      barcode: '',
      emptyFlag: '1', // 默认有货
      siteFocus: true,     // 默认聚焦 site
      barcodeFocus: false
    }
  },
  onShow() {
    this.baseUrl = uni.getStorageSync('baseUrl')
    this.token = uni.getStorageSync('token')
  },
  methods: {
    back() {
      uni.navigateBack()
    },
    // 扫完 site 自动跳到 barcode
    siteConfirm() {
      if (!this.site) return
      this.siteFocus = false
      this.$nextTick(() => {
        this.barcodeFocus = true
      })
    },
    onEmptyFlagChange(e) {
      this.emptyFlag = e.detail.value
    },
    confirmCall() {
      if (!this.site) {
        uni.showToast({ title: '请输入起始站点', icon: 'none' })
        return
      }
      if (!this.barcode) {
        uni.showToast({ title: '请扫描托盘条码', icon: 'none' })
        return
      }
      uni.request({
        url: this.baseUrl + '/mobile/callEmptyBinInBound',
        method: 'POST',
        header: {
          token: this.token,
          'Content-Type': 'application/json'
        },
        data: {
          site: this.site,
          barcode: this.barcode,
          emptyFlag: this.emptyFlag
        },
        success: res => {
          res = res.data
          if (res.code === 200) {
            uni.showToast({ title: '回库呼叫成功', icon: 'success' })
            this.reset()
          } else {
            uni.showToast({ title: res.msg || '回库失败', icon: 'none' })
          }
        }
      })
    },
    reset() {
      this.site = ''
      this.barcode = ''
      this.emptyFlag = '1'
      // 重置焦点
      this.barcodeFocus = false
      this.$nextTick(() => {
        this.siteFocus = true
      })
    }
  }
}
</script>
<style>
@import url('../../static/css/wms.css/wms.css');
/* 输入区整体 */
.code {
  width: 100%;
  background-color: #fff;
  padding-top: 0;        /* 解决“目标站点上方大空白” */
}
/* 每一行 */
.item {
  display: flex;
  align-items: center;
  height: 120rpx;        /* 行高拉开 */
  padding: 0 24rpx;
  border-bottom: 1px solid #ebeef5;
}
/* 左侧文字 */
.code-decs {
  width: 220rpx;         /* 左右严格对齐关键 */
  font-size: 38rpx;
  font-weight: 500;
  color: #303133;
}
/* 输入框统一 */
.item input {
  flex: 1;
  height: 80rpx;
  line-height: 80rpx;
  font-size: 38rpx;
  padding: 0 20rpx;
  border: 1px solid #dcdfe6;
  border-radius: 10rpx;
  box-sizing: border-box;
}
/* 单选框区域 */
radio-group {
  display: flex;
  align-items: center;
}
/* 单选项 */
.radio {
  margin-right: 40rpx;
  font-size: 36rpx;
  display: flex;
  align-items: center;
}
/* radio 本体放大一点(PDA 好点) */
.radio radio {
  transform: scale(1.2);
  margin-right: 10rpx;
}
/* 底部按钮 */
.buttom {
  position: fixed;
  bottom: 20rpx;
  width: 100%;
  display: flex;
  justify-content: space-around;
}
</style>