#
lty
16 小时以前 40866099bebc0dd34412c7e88e349b8a66f88580
pages/basics/codePakin.vue
@@ -1,898 +1,830 @@
<template>
   <view>
      <scroll-view scroll-y catch:touchmove="touchmove">
         <view class="square-2">
            <view class="square-title">
               <view class="title-sign">
                  <view class="sign"></view>
               </view>
               <view class="title-text"><text>托盘条码</text></view>
            </view>
            <view class="square-content">
               <view class="content-input">
                  <input v-model="barcode" type="text" placeholder="扫码 / 输入" maxlength="10" :focus="barcodeFocus"
                     @input="barcodeInput" placeholder-style="line-height:  85rpx;">
                  <uni-icons type="closeempty" size="20" color="#dadada" @click="removeBarcode()"></uni-icons>
               </view>
            </view>
         </view>
  <view>
    <scroll-view scroll-y catch:touchmove="touchmove">
      <!-- 托盘条码 -->
      <view class="square-2">
        <view class="square-title">
          <view class="title-sign"><view class="sign"></view></view>
          <view class="title-text"><text>托盘条码</text></view>
        </view>
        <view class="square-content">
          <view class="content-input">
            <input
              v-model="barcode"
              type="text"
              placeholder="扫码 / 输入"
              maxlength="10"
              :focus="barcodeFocus"
              @input="barcodeInput"
              placeholder-style="line-height: 85rpx;"
            />
            <uni-icons type="closeempty" size="20" color="#dadada" @click="removeBarcode" />
          </view>
        </view>
      </view>
     <!-- 库位条码 -->
     <view class="square-2">
       <view class="square-title">
         <view class="title-sign"><view class="sign"></view></view>
         <view class="title-text"><text>库位条码</text></view>
       </view>
       <view class="square-content">
         <view class="content-input">
           <input
             v-model="locNo"
             type="text"
             placeholder="扫码 / 输入"
             maxlength="7"
             :focus="locNoFocus"
             @input="locNoInput"
             placeholder-style="line-height: 85rpx;"
           />
           <uni-icons type="closeempty" size="20" color="#dadada" @click="removeLocNo" />
         </view>
       </view>
     </view>
         <view class="square-2">
            <view class="square-title">
               <view class="title-sign">
                  <view class="sign"></view>
               </view>
               <view class="title-text"><text>商品条码</text></view>
            </view>
            <view class="square-content">
               <view class="content-input">
                  <input v-model="code" type="text" placeholder="扫码 / 输入" :focus="codeFocus" @input="codeInput"
                     placeholder-style="line-height:  85rpx;">
                  <uni-icons type="closeempty" size="20" color="#dadada" @click="removeCode()()"></uni-icons>
               </view>
            </view>
         </view>
      <!-- 商品条码 -->
      <view class="square-2">
        <view class="square-title">
          <view class="title-sign"><view class="sign"></view></view>
          <view class="title-text"><text>商品条码</text></view>
        </view>
        <view class="square-content">
          <view class="content-input">
            <input
              v-model="code"
              type="text"
              placeholder="扫码 / 输入"
              :focus="codeFocus"
              @input="codeInput"
              placeholder-style="line-height: 85rpx;"
            />
            <uni-icons type="closeempty" size="20" color="#dadada" @click="removeCode" />
          </view>
        </view>
      </view>
      <!-- 商品列表头(含操作) -->
      <view class="square-1">
        <view class="square-title">
          <view class="title-sign"><view class="sign"></view></view>
          <view class="title-text" style="width: 200rpx;"><text>商品列表</text></view>
         <view class="square-1">
            <view class="square-title">
               <view class="title-sign">
                  <view class="sign"></view>
               </view>
               <view class="title-text" style="width: 200rpx;"><text>商品列表</text></view>
               <view v-show="matList.length != 0" class="lable">
                  <label class="label-btn" style="width: 170rpx;line-height: 95rpx;">
                     <checkbox :checked="check" @click="allChecked()">{{checkText}}</checkbox>
                  </label>
                  <label class="label-btn">
                     <text @click="reChecked()">反选</text>
                  </label>
                  <label>
                     <uni-icons type="trash" size="25" color="#a5a5a5" @click="remove()"></uni-icons>
                  </label>
               </view>
            </view>
          <view v-show="matList.length" class="lable">
            <label class="label-btn" style="width: 170rpx;line-height: 95rpx;">
              <checkbox :checked="check" @click="allChecked">{{ checkText }}</checkbox>
            </label>
            <label class="label-btn"><text @click="reChecked">反选</text></label>
            <label><uni-icons type="trash" size="25" color="#a5a5a5" @click="removeSelected" /></label>
          </view>
        </view>
      </view>
         </view>
         <view class="square-none" v-show="matList.length === 0">
            <view class="v-show">暂无更多数据...</view>
         </view>
      <view class="square-none" v-show="matList.length === 0">
        <view class="v-show">暂无更多数据...</view>
      </view>
         <checkbox-group @change="checkbox">
            <view v-for="(item,index) in matList" :key="index" class="data-list bg-false"
               :class="'bg-'+item.checked">
               <label class="left-check-box">
                  <checkbox :value="item.id+''" :checked="item.checked" style="display: block;" />
               </label>
               <view class="data-list-left">
                  <view class="matnr"><text style="width: 500rpx;">编码:{{item.matnr}}</text>
                     <text style="margin-left: 100rpx;">名称:{{item.maktx}}</text>
                  </view>
                  <view><text style="width: 500rpx;">PO:{{item.standby1}}</text>
                     <text style="margin-left: 100rpx;">SKU:{{item.standby3}}</text>
                  </view>
                  <view><text style="width: 500rpx;">UPC:{{item.standby2}}</text></view>
                  <view><text style="width: 500rpx;">采购单:{{item.boxType3}}</text>
                     <text style="margin-left: 100rpx;">数量:{{item.anfme}}</text>
                  </view>
               </view>
               <view class="data-list-right">
                  <label><uni-icons type="compose" size="20" color="#a5a5a5"
                        @click="revise(item,index)"></uni-icons></label>
                  <!-- list中删除键 -->
                  <!-- <label><uni-icons type="trash" size="25" color="#a5a5a5" @click="remove(item,index)"></uni-icons></label> -->
               </view>
            </view>
         </checkbox-group>
      </scroll-view>
      <!-- 列表(使用 checkbox-group 统一管理) -->
      <checkbox-group @change="checkboxChanged">
        <view
          v-for="(item, index) in matList"
          :key="item.id || index"
          class="data-list bg-false"
          :class="'bg-' + (item.checked ? 'true' : 'false')"
        >
          <label class="left-check-box">
            <checkbox :value="(item.id + '')" :checked="item.checked" style="display:block;" />
          </label>
      <!-- 底部按钮 -->
      <view class="footer flex justify-around">
         <!-- 底部全选 反选按钮 -->
         <!-- <label class="label-btn" style="width: 170rpx;">
            <checkbox :checked="check" @click="allChecked()">{{checkText}}</checkbox>
         </label>
         <label class="label-btn" style="width: 100rpx;">
            <text  @click="reChecked()">反选</text>
         </label> -->
          <view class="data-list-left">
            <view class="matnr">
              <text style="width: 500rpx;">编码:{{ item.matnr }}</text>
              <text style="margin-left: 100rpx;">名称:{{ item.maktx }}</text>
            </view>
            <view>
              <text style="width: 500rpx;">PO:{{ item.standby1 }}</text>
              <text style="margin-left: 100rpx;">SKU:{{ item.standby3 }}</text>
            </view>
            <view><text style="width: 500rpx;">UPC:{{ item.standby2 }}</text></view>
            <view>
              <text style="width: 500rpx;">采购单:{{ item.boxType3 }}</text>
              <text style="margin-left: 100rpx;">
                数量:{{ item.current }} / {{ item.maxAnfme }}
              </text>
            </view>
          </view>
         <label class="label-btn flex justify-center align-center">
            <button class="cu-btn" @click="resst()">重置</button>
         </label>
         <label class="label-btn flex justify-center align-center">
            <button class="cu-btn bg-blue " @click="comb()">组托</button>
         </label>
      </view>
          <view class="data-list-right">
            <label>
              <uni-icons type="compose" size="20" color="#a5a5a5" @click="openRevise(item, index)" />
            </label>
          </view>
        </view>
      </checkbox-group>
    </scroll-view>
      <view>
         <!-- 修改数量 -->
         <uni-popup ref="revise" background-color="#fff" @change="change">
            <view class="revise-box">
               <view class="revise-box-top">
                  <view class="color-block-blue"></view>
                  <text class="title">组托数量</text>
               </view>
               <view class="text-box">
                  <text>可组数量:{{enableQty}}</text>
               </view>
               <view class="changeBox flex justify-around">
                  <view class="num-box">
                     <uni-number-box v-model="count" :min="minCount" :max="maxCount" color="#747474"
                        @change="changeValue" />
                  </view>
    <!-- 底部操作 -->
    <view class="footer flex justify-around">
      <label class="label-btn flex justify-center align-center">
        <button class="cu-btn" @click="resst">重置</button>
      </label>
      <label class="label-btn flex justify-center align-center">
        <button class="cu-btn bg-blue" @click="comb">组托</button>
      </label>
    </view>
               </view>
               <view class="revise-box-buttom">
                  <view>
                     <button class="cu-btn bg-blue" @click="confirm()">确认</button>
                  </view>
               </view>
    <!-- 修改数量弹窗 -->
    <uni-popup ref="revise" background-color="#fff" @change="change">
      <view class="revise-box">
        <view class="revise-box-top">
          <view class="color-block-blue"></view>
          <text class="title">组托数量</text>
        </view>
            </view>
         </uni-popup>
      </view>
   </view>
        <view class="text-box">
          <text>可组数量:{{ enableQty }}</text>
        </view>
        <view class="changeBox flex justify-around">
          <view class="num-box">
            <uni-number-box v-model="count" :min="minCount" :max="maxCount" color="#747474" @change="changeValue" />
          </view>
        </view>
        <view class="revise-box-buttom">
          <view>
            <button class="cu-btn bg-blue" @click="confirm">确认</button>
          </view>
        </view>
      </view>
    </uni-popup>
  </view>
</template>
<script>
   import permision from "@/common/permission.js"
   export default {
      data() {
         return {
            commonUrl: null,
            barcode: '',
            barcodeFocus: true,
            focus: false,
            type: 'center',
            searchBox: 'hide',
            pick: 'hide',
            order: null,
            matList: [],
            result: '',
            count: '',
            minCount: 0,
            maxCount: '',
            rowNum: '',
            enableQty: '',
            check: false,
            checkText: '全选',
            checkedData: [],
            orderNo: '',
            orderNoList: [],
            showDropdown: false,
            code: '',
            codeFocus: true,
import permision from "@/common/permission.js";
export default {
  data() {
    return {
      commonUrl: null,
      barcode: "",
      barcodeFocus: true,
      focus: false,
      type: "center",
      order: null,
      matList: [], // 每个 item: { id, matnr, maktx, standby1, standby2, standby3, boxType3, current, maxAnfme, checked }
      count: 0,
      minCount: 0,
      maxCount: 0,
      rowNum: null,
      enableQty: 0,
      check: false,
      checkText: "全选",
      orderNo: "",
      orderNoList: [],
      showDropdown: false,
      code: "",
      codeFocus: true,
     locNo: "",
     locNoFocus: true,
    };
  },
  mounted() {
    const UIP = uni.getStorageSync("UIP");
    this.baseIP = UIP;
    const UPORT = uni.getStorageSync("UPORT");
    this.basePORT = UPORT;
    const PROJ = uni.getStorageSync("UPROJ");
    this.baseUrl = PROJ;
    this.getUrl();
  },
  methods: {
    // 构建 base url
    getUrl() {
      this.commonUrl = this.baseHttp + this.baseIP + ":" + this.basePORT + "/" + this.baseUrl;
    },
    /* -------------------------
       获取订单明细(接口返回 combMats)
       初始化每个 item 的 current / maxAnfme / checked
       ------------------------- */
    getOrderDetlByOrderNo() {
      if (!this.orderNo) {
        uni.showToast({ title: "请选择订单", icon: "none" });
        return;
      }
      const that = this;
      uni.request({
        url: that.commonUrl + "/mobile/order/search/orderNo/auth",
        data: { orderNo: that.orderNo },
        header: { token: uni.getStorageSync("token") },
        success(result) {
          const res = result.data;
          if (res.code === 200 && res.data && res.data[0]) {
            uni.showLoading();
            // 原始 combMats 可能包含 backend 的 anfme,作为 max 使用
            that.matList = (res.data[0].combMats || []).map(it => {
              // 规范字段名(boxType3 / boxtype3)
              it.boxType3 = it.boxType3 || it.boxtype3 || "";
              return {
                ...it,
                maxAnfme: Number(it.anfme || 0), // 后端最大可组托数量
                current: 0, // 当前已组数量(前端维护)
                checked: false,
              };
            });
            that.initAnfme();
            uni.hideLoading();
          } else if (res.code == 403) {
            uni.showToast({ title: res.msg, icon: "none", position: "top" });
            setTimeout(() => uni.reLaunch({ url: "../login/login" }), 1000);
          } else {
            uni.showToast({ title: res.msg || "获取失败", icon: "none" });
          }
        },
      });
    },
    // 初始化:把后端的 anfme 保存为 enableQty(显示用),并把 current 置 0
    initAnfme() {
      for (let i = 0; i < this.matList.length; i++) {
        this.matList[i].enableQty = this.matList[i].maxAnfme || 0;
        // ensure current exists
        if (typeof this.matList[i].current !== "number") this.matList[i].current = 0;
        if (typeof this.matList[i].checked !== "boolean") this.matList[i].checked = false;
      }
      this.checkList();
    },
    /* -------------------------
       扫码/输入逻辑
       barcodeInput: 托盘码(校验长度)
       codeInput: 商品码(解析并请求明细接口 / 合并到 matList)
       ------------------------- */
    barcodeInput() {
      const len = this.barcode.length;
      if (len !== 6) {
        // 6 位托盘码规则:若非 6 位则不给予进一步处理,但不要频繁弹框,只有明确错误时弹
        // 这里保持原判定逻辑:如果长度不是 6 则提示
        uni.showToast({ title: "托盘码有误请重试", icon: "none", position: "top" });
        this.barcodeFocuss();
        return;
      }
      // 若长度合规,可聚焦到商品输入
      this.focuss();
    },
   locNoInput() {
     const len = this.locNo.length;
     if (len !== 7) {
       // 6 位托盘码规则:若非 6 位则不给予进一步处理,但不要频繁弹框,只有明确错误时弹
       // 这里保持原判定逻辑:如果长度不是 6 则提示
       uni.showToast({ title: "库位有误请重试", icon: "none", position: "top" });
       this.locNoFocuss();
       return;
     }
     // 若长度合规,可聚焦到商品输入
     this.focuss();
   },
   codeInput() {
     const that = this;
     const m = (that.code || "").split(";");
     if (!m[1] || !m[5] || !m[9]) {
      uni.showToast({ title: "条码有误", icon: "none", position: "top" });
      this.codeFocuss();
      return;
     }
     uni.request({
      url: that.commonUrl + "/mobile/order/search/orderDetl/auth",
      data: JSON.stringify({
        orderNo: m[1],
        sku: m[5],
        upc: m[9],
      }),
      method: "POST",
      header: { token: uni.getStorageSync("token") },
      success(result) {
        const res = result.data;
        if (res.code === 200 && res.data && Array.isArray(res.data.combMats)) {
         const firstBoxType = that.matList[0]?.boxType3; // 第一个物料的 boxType3
         let inconsistent = false;
         res.data.combMats.forEach(serverItem => {
           serverItem.boxType3 = serverItem.boxType3 || serverItem.boxtype3 || "";
           // ❌ 检查 boxType3 是否一致
           if (firstBoxType && serverItem.boxType3 !== firstBoxType) {
            inconsistent = true;
            return;
           }
           const max = Number(serverItem.anfme || 0);
           if (max <= 0) {
            uni.showToast({ title: "当前物料单据无数据", icon: "none" });
            return;
           }
           const existItem = that.matList.find(
            m =>
              m.matnr === serverItem.matnr &&
              (m.standby2 || "") === (serverItem.standby2 || "") &&
              (m.standby3 || "") === (serverItem.standby3 || "") &&
              (m.boxType3 || "") === (serverItem.boxType3 || "")
           );
           if (existItem) {
            existItem.current = Math.min(existItem.current + 1, existItem.maxAnfme);
           } else {
            that.matList.push({
              ...serverItem,
              maxAnfme: max,
              current: 1,
              checked: false,
            });
           }
         });
         if (inconsistent) {
           uni.showToast({ title: "单据不一致,请检查", icon: "none", position: "top" });
           that.codeFocuss();
           return;
         }
         that.codeFocuss();
         that.checkList();
        } else if (res.code == 403) {
         uni.showToast({ title: res.msg, icon: "none", position: "top" });
         setTimeout(() => uni.reLaunch({ url: "../login/login" }), 1000);
        } else {
         uni.showToast({ title: res.msg || "获取条码商品失败", icon: "none" });
        }
      },
      mounted() {
         const UIP = uni.getStorageSync('UIP');
         this.baseIP = UIP;
         const UPORT = uni.getStorageSync('UPORT');
         this.basePORT = UPORT
         const PROJ = uni.getStorageSync('UPROJ');
         this.baseUrl = PROJ
         this.getUrl()
      fail() {
        uni.showToast({ title: "请求失败", icon: "none" });
      },
      methods: {
         getOrderDet(orderNo) {
            if (!orderNo || orderNo.trim() === '') return;
            uni.request({
               url: this.commonUrl + '/mobile/order/search/orderNoList/auth',
               method: 'GET',
               data: {
                  orderNo
               },
               header: {
                  token: uni.getStorageSync('token')
               },
               success: res => {
                  const list = res.data.data || [];
                  this.orderNoList = list.map(o => o.orderNo);
               }
            });
         },
         onOrderSelect(order) {
            this.orderNo = order;
            // 可选:自动触发查询
            // this.getOrderDetlByOrderNo();
         },
         getOrderDetlByOrderNo() {
            if (!this.orderNo) {
               uni.showToast({
                  title: '请选择订单',
                  icon: 'none'
               });
               return;
            }
            let that = this;
            uni.request({
               url: that.commonUrl + '/mobile/order/search/orderNo/auth',
               data: {
                  orderNo: that.orderNo
               },
               header: {
                  token: uni.getStorageSync('token')
               },
               success(result) {
                  let res = result.data;
                  console.log(res.data[0]);
                  if (res.code === 200) {
                     if (res.data) {
                        uni.showLoading();
                        that.matList = res.data[0].combMats;
                        that.initAnfme();
                        console.log(that.matList);
                     }
                  } else if (res.code == 403) {
                     uni.showToast({
                        title: res.msg,
                        icon: "none",
                        position: 'top'
                     });
                     setTimeout(() => {
                        uni.reLaunch({
                           url: '../login/login'
                        });
                     }, 1000);
                  } else {
                     uni.showToast({
                        title: res.msg,
                        icon: "none",
                        position: 'top'
                     });
                  }
               }
            });
         },
     });
   },
    // 失焦 / 重置焦点的方法
    codeFocuss() {
      this.codeFocus = false;
      setTimeout(() => {
        this.code = "";
        this.codeFocus = true;
      }, 100);
    },
   locNoFocuss() {
     this.locNoFocus = false;
     setTimeout(() => {
       this.locNo = "";
       this.locNoFocus = true;
     }, 100);
   },
    barcodeFocuss() {
      this.barcodeFocus = false;
      setTimeout(() => {
        this.barcode = "";
        this.barcodeFocus = true;
      }, 100);
    },
    focuss() {
      this.focus = false;
      setTimeout(() => {
        this.matnrId = "";
        this.focus = true;
      }, 100);
    },
         selectOrder(orderNo) {
            this.order = orderNo
            this.showDropdown = false
         },
         removeOrder() {
            this.order = ''
            this.orderSuggestions = []
            this.showDropdown = false
         },
         // 获取url
         getUrl() {
            this.commonUrl = this.baseHttp + this.baseIP + ':' + this.basePORT + "/" + this.baseUrl
         },
         // barcode input 事件
         barcodeInput() {
            var len = this.barcode.length
            if (len != 6) {
               uni.showToast({
                  title: '托盘码有误请重试',
                  icon: "none",
                  position: 'top'
               });
               this.barcodeFocuss()
               return;
            }
            if (len == 6) {
               this.focuss()
            }
         },
         codeInput() {
            const that = this;
            let m = that.code.split(";")
            if (!m[1] || !m[5] || !m[9]) {
               uni.showToast({
                  title: '条码有误',
                  icon: "none",
                  position: 'top'
               });
               this.codeFocuss()
               return;
            }
            uni.request({
               url: that.commonUrl + '/mobile/order/search/orderDetl/auth',
               data: JSON.stringify({
                  orderNo: m[1],
                  sku: m[5],
                  upc: m[9],
               }),
               method: 'POST',
               header: {
                  'token': uni.getStorageSync('token'),
               },
               success(result) {
                  var res = result.data;
                  if (res.code === 200) {
                     res.data.combMats.forEach(item => {
                        const existItem = that.matList.find(m => m.matnr === item.matnr &&
                           m.standby2 === item.standby2 &&
                           m.standby3 === item.standby3 &&
                           m.boxtype3 === item.boxtype3
                        )
                        if (existItem) {
                           existItem.anfme = (existItem.anfme || 0) + (item.anfme || 1)
                        } else {
                           item.anfme = 1
                           that.matList.push(item)
                        }
                     })
                     that.codeFocuss()
                  } else if (res.code == 403) {
                     uni.showToast({
                        title: res.msg,
                        icon: "none",
                        position: 'top'
                     });
                     setTimeout(() => {
                        uni.reLaunch({
                           url: '../login/login'
                        });
                     }, 1000);
                  } else {
                     uni.showToast({
                        title: res.msg,
                        icon: "none",
                        position: 'top'
                     });
                  }
               }
            });
            console.log(m)
         },
         // 托盘码有误重置
         codeFocuss() {
    /* -------------------------
       编辑数量弹窗(打开/确认)
       ------------------------- */
    openRevise(item, index) {
      // 更新 maxCount / enableQty / count
      this.rowNum = index;
      this.enableQty = item.maxAnfme || 0;
      this.minCount = 0;
      this.maxCount = item.maxAnfme || 0;
      this.count = item.current || 0;
      this.$refs.revise.open();
    },
            let that = this;
            that.codeFocus = false;
            setTimeout(() => {
               that.code = '';
               that.codeFocus = true;
            }, 100);
    confirm() {
      // 限制范围然后写回 matList
      const idx = this.rowNum;
      if (idx == null || !this.matList[idx]) {
        this.$refs.revise.close();
        return;
      }
      let v = Number(this.count) || 0;
      v = Math.max(0, Math.min(v, this.matList[idx].maxAnfme || 0));
      this.matList[idx].current = v;
      this.$refs.revise.close();
    },
         },
         barcodeFocuss() {
            // #ifdef APP
            let that = this;
            that.barcodeFocus = false;
            setTimeout(() => {
               that.barcode = '';
               that.barcodeFocus = true;
            }, 100);
            // #endif
         },
         focuss() {
            // #ifdef APP
            let that = this;
            that.focus = false;
            setTimeout(() => {
               that.matnrId = '';
               that.focus = true;
            }, 100);
            // #endif
         },
         resst() {
            this.matList = []
            this.barcode = ''
            this.order = ''
            this.orderNo = '';
            this.barcodeFocuss()
            uni.vibrateShort();
         },
         removeBarcode() {
            this.barcode = ''
            uni.vibrateShort();
            this.barcodeFocus = false;
            this.$nextTick(function() {
               this.barcodeFocus = true;
            });
         },
         removeCode() {
            this.code = ''
            uni.vibrateShort();
            this.codeFocus = false;
            this.$nextTick(function() {
               this.codeFocus = true;
            });
         },
         removeOrder() {
            this.order = ''
            uni.vibrateShort();
            this.focus = false;
            this.$nextTick(function() {
               this.focus = true;
            });
         },
         eject(type) {
            this.type = type
            // open 方法传入参数 等同在 uni-popup 组件上绑定 type属性
            this.$refs.revise.open(type)
         },
         initAnfme() {
    changeValue() {
      // 可在这里添加实时校验(当前使用 uni-number-box 自带 min/max)
    },
            for (var i = 0; i < this.matList.length; i++) {
               this.matList[i].enableQty = this.matList[i].anfme
               this.matList[i].anfme = 0
            }
            uni.hideLoading();
         },
         revise(item, index) {
            var maxCount = this.matList[index].maxCount
            if (maxCount == undefined) {
               this.matList[index]["maxCount"] = item.enableQty
            }
            this.enableQty = item.enableQty
            this.count = this.minCount
            this.maxCount = item.maxCount
            this.rowNum = index
            this.eject()
         },
         changeMax() {
            this.count = this.enableQty
         },
         changeValue() {
    /* -------------------------
       组托(提交)
       ------------------------- */
    comb() {
      uni.vibrateShort();
      const that = this;
         },
         remove() {
            console.log(this.matList.filter(item => item.checked !== true))
            this.matList = this.matList.filter(item => item.checked !== true)
      if (!that.barcode) {
        uni.showToast({ title: "请扫描托盘条码", icon: "none", position: "top" });
        return;
      }
     if (!that.locNo) {
       uni.showToast({ title: "请扫描库位条码", icon: "none", position: "top" });
       return;
     }
      if (that.barcode.length !== 6) {
        uni.showToast({ title: "托盘码必须为6位", icon: "none", position: "top" });
        return;
      }
      if (!that.matList.length) {
        uni.showToast({ title: "请添加商品列表", icon: "none", position: "top" });
        return;
      }
            // this.matList.splice(i,1)
      // 只取 current > 0 的条目,并映射为后端需要的字段(注意这里仍使用后端期望字段名 anfme)
      const validMats = that.matList
        .filter(item => Number(item.current || 0) > 0)
        .map(item => {
          return {
            ...item,
            anfme: Number(item.current || 0),
          };
        });
            // for (var i = 0; i < this.matList.length; i++) {
            //    if (this.matList[i].checked == true) {
      if (!validMats.length) {
        uni.showToast({ title: "所有商品组托数量为0,无法组托", icon: "none", position: "top" });
        return;
      }
            //    }
            // }
            this.checkList();
            uni.vibrateShort();
         },
         // 列表中删除
         // remove(item,index) {
         //    this.matList.splice(index,1)
         //    uni.vibrateShort();
         // },
         confirm() {
            this.matList[this.rowNum].anfme = this.count
            this.$refs.revise.close()
         },
         comb() {
            uni.vibrateShort();
            let that = this;
      // 更新界面列表为仅剩有效条目(删除数量为0的)
      that.matList = that.matList.filter(item => Number(item.current || 0) > 0);
            if (that.barcode === '') {
               uni.showToast({
                  title: '请扫描托盘条码',
                  icon: "none",
                  position: 'top'
               });
               return;
            }
            if (that.barcode.length !== 6) {
               uni.showToast({
                  title: '托盘码必须为6位',
                  icon: "none",
                  position: 'top'
               });
               return;
            }
            if (that.matList.length === 0) {
               uni.showToast({
                  title: '请添加商品列表',
                  icon: "none",
                  position: 'top'
               });
               return;
            }
      uni.showLoading();
      uni.request({
        url: that.commonUrl + "/mobile/comb/auth",
        data: JSON.stringify({
          billNo: that.orderNo,
          orderNo: that.orderNo,
          barcode: that.barcode,
        locNo: that.locNo,
          combMats: validMats,
        }),
        method: "POST",
        header: { token: uni.getStorageSync("token") },
        success(result) {
          uni.hideLoading();
          const res = result.data;
          if (res.code === 200) {
            uni.showToast({ title: res.msg, position: "top", duration: 1000 });
            that.resst();
          } else if (res.code == 403) {
            uni.showToast({ title: res.msg, icon: "none", position: "top" });
            setTimeout(() => uni.reLaunch({ url: "../login/login" }), 1000);
          } else {
            uni.showToast({ title: res.msg || "组托失败", icon: "none" });
          }
        },
        fail() {
          uni.hideLoading();
          uni.showToast({ title: "请求失败", icon: "none" });
        },
      });
    },
            // 过滤出数量大于0的商品
            const validMats = that.matList.filter(item => item.anfme > 0);
    /* -------------------------
       删除已选 / 重置
       ------------------------- */
    removeSelected() {
      this.matList = this.matList.filter(item => !item.checked);
      this.checkList();
      uni.vibrateShort();
    },
            if (validMats.length === 0) {
               uni.showToast({
                  title: '所有商品组托数量为0,无法组托',
                  icon: "none",
                  position: 'top'
               });
               return;
            }
    resst() {
      this.matList = [];
      this.barcode = "";
     this.locNo = ""
      this.order = "";
      this.orderNo = "";
      this.barcodeFocuss();
      uni.vibrateShort();
      this.checkList();
    },
            // 删除数量为0的商品
            that.matList = validMats;
    /* -------------------------
       checkbox 相关(统一管理:checkbox-group -> change)
       ------------------------- */
    checkboxChanged(e) {
      const values = e.detail.value || [];
      this.matList.forEach(item => {
        item.checked = values.includes(item.id + "");
      });
      this.checkList();
      uni.vibrateShort();
    },
            uni.showLoading();
    // 反选
    reChecked() {
      if (!this.matList.length) return;
      this.matList.forEach(item => {
        item.checked = !item.checked;
      });
      this.checkList();
      uni.vibrateShort();
    },
            uni.request({
               url: that.commonUrl + '/mobile/comb/auth',
               data: JSON.stringify({
                  billNo: that.orderNo,
                  orderNo: that.orderNo,
                  barcode: that.barcode,
                  combMats: validMats
               }),
               method: 'POST',
               header: {
                  'token': uni.getStorageSync('token'),
               },
               success(result) {
                  uni.showLoading();
                  var res = result.data;
                  if (res.code === 200) {
                     uni.showToast({
                        title: res.msg,
                        position: 'top',
                        duration: 1000
                     });
                     that.resst();
                  } else if (res.code == 403) {
                     uni.showToast({
                        title: res.msg,
                        icon: "none",
                        position: 'top'
                     });
                     setTimeout(() => {
                        uni.reLaunch({
                           url: '../login/login'
                        });
                     }, 1000);
                  } else {
                     uni.showToast({
                        title: res.msg,
                        icon: "none",
                        position: 'top'
                     });
                  }
               }
            });
         },
    // 全选 / 取消全选
    allChecked() {
      this.check = !this.check;
      this.matList.forEach(item => (item.checked = this.check));
      this.checkText = this.check ? "取消全选" : "全选";
      uni.vibrateShort();
    },
         findOrder() {
            let that = this
            uni.request({
               url: that.commonUrl + '/mobile/order/search/orderNo/auth',
               data: {
                  orderNo: that.order
               },
               header: {
                  'token': uni.getStorageSync('token')
               },
               success(result) {
                  let res = result.data
                  console.log(res.data[0])
                  if (res.code === 200) {
                     if (res.data) {
                        uni.showLoading();
                        that.matList = res.data[0].combMats;
                        that.orderNo = that.order
                        that.initAnfme()
                        console.log(that.matList)
                     }
                  } else if (res.code == 403) {
                     uni.showToast({
                        title: res.msg,
                        icon: "none",
                        position: 'top'
                     })
                     setTimeout(() => {
                        uni.reLaunch({
                           url: '../login/login'
                        });
                     }, 1000);
                  } else {
                     uni.showToast({
                        title: res.msg,
                        icon: "none",
                        position: 'top'
                     })
                  }
               }
            });
         },
         change(e) {
            // console.log('当前模式:' + e.type + ',状态:' + e.show);
         },
         toggle(type) {
            this.type = type
            // open 方法传入参数 等同在 uni-popup 组件上绑定 type属性
            this.$refs.goodsSearch.open(type)
         },
         // 列表选择
         checkbox(e) {
            const values = e.detail.value;
            this.matList.forEach(item => {
               // 确保 item.id 是字符串
               const itemId = item.id + '';
               item.checked = values.includes(itemId);
            });
    // 更新页面顶部全选文案状态
    checkList() {
      if (!this.matList.length) {
        this.check = false;
        this.checkText = "全选";
        return;
      }
      const all = this.matList.every(item => item.checked);
      this.check = all;
      this.checkText = all ? "取消全选" : "全选";
    },
            if (values.length === this.matList.length) {
               this.check = true;
               this.checkText = "取消全选";
            } else {
               this.check = false;
               this.checkText = "全选";
            }
    /* -------------------------
       根据输入查订单建议(未改动)
       ------------------------- */
    getOrderDet(orderNo) {
      if (!orderNo || orderNo.trim() === "") return;
      uni.request({
        url: this.commonUrl + "/mobile/order/search/orderNoList/auth",
        method: "GET",
        data: { orderNo },
        header: { token: uni.getStorageSync("token") },
        success: res => {
          const list = res.data.data || [];
          this.orderNoList = list.map(o => o.orderNo);
        },
      });
    },
            uni.vibrateShort();
         },
    onOrderSelect(order) {
      this.orderNo = order;
    },
         // 列表反选
         reChecked() {
            if (this.matList.length == 0) {
               return;
            }
            var checkArr = []
            for (var i = 0; i < this.matList.length; i++) {
               if (this.matList[i].checked == true) {
                  this.$set(this.matList[i], 'checked', false)
               } else {
                  this.$set(this.matList[i], 'checked', true)
               }
               if (this.matList[i].checked == true) {
                  checkArr.push(this.matList[i].checked)
               }
            }
            if (checkArr.length == this.matList.length) {
               this.check = true
               this.checkText = "取消全选"
            } else {
               this.check = false
               this.checkText = "全选"
            }
            uni.vibrateShort();
         },
         // 列表全选
         allChecked(e) {
            if (this.check == true) {
               for (var i = 0; i < this.matList.length; i++) {
                  this.$set(this.matList[i], 'checked', false)
               }
               this.check = false
               this.checkText = "全选"
            } else {
               for (var i = 0; i < this.matList.length; i++) {
                  this.$set(this.matList[i], 'checked', true)
               }
               this.check = true
               this.checkText = "取消全选"
            }
            uni.vibrateShort();
         },
         // 检验列表长度 等于0 显示全选
         checkList() {
            if (this.matList.length == 0) {
               this.check = false
               this.checkText = "全选"
               return;
            }
         }
      }
   }
    findOrder() {
      if (!this.order) return;
      const that = this;
      uni.request({
        url: that.commonUrl + "/mobile/order/search/orderNo/auth",
        data: { orderNo: that.order },
        header: { token: uni.getStorageSync("token") },
        success(result) {
          const res = result.data;
          if (res.code === 200 && res.data && res.data[0]) {
            uni.showLoading();
            that.matList = (res.data[0].combMats || []).map(it => {
              it.boxType3 = it.boxType3 || it.boxtype3 || "";
              return {
                ...it,
                maxAnfme: Number(it.anfme || 0),
                current: 0,
                checked: false,
              };
            });
            that.orderNo = that.order;
            that.initAnfme();
            uni.hideLoading();
          } else if (res.code == 403) {
            uni.showToast({ title: res.msg, icon: "none", position: "top" });
            setTimeout(() => uni.reLaunch({ url: "../login/login" }), 1000);
          } else {
            uni.showToast({ title: res.msg || "查无数据", icon: "none" });
          }
        },
      });
    },
    // 移除 code / barcode 等小工具
    removeBarcode() {
      this.barcode = "";
      uni.vibrateShort();
      this.barcodeFocus = false;
      this.$nextTick(() => (this.barcodeFocus = true));
    },
   removeLocNo() {
     this.locNo = "";
     uni.vibrateShort();
     this.locNoFocus = false;
     this.$nextTick(() => (this.locNoFocus = true));
   },
    removeCode() {
      this.code = "";
      uni.vibrateShort();
      this.codeFocus = false;
      this.$nextTick(() => (this.codeFocus = true));
    },
  },
};
</script>
<style>
   /* @import "../../colorui/main.css";
   @import "../../colorui/icon.css"; */
   .square-1 .lable {
      display: inline-block;
      float: right;
      height: 100%;
      width: 400rpx;
   }
   .square-1 .lable label {
      display: inline-block;
      float: left;
      height: 100%;
      width: 90rpx;
      line-height: 100rpx;
   }
   .pak-seach-box {
      background-color: #FFFFFF;
      margin: 15rpx 15rpx 0rpx 15rpx;
      width: 96%;
      height: 150rpx;
      border-radius: 20rpx;
   }
   .box-top {
      display: block;
      height: 60rpx;
      width: 720rpx;
   }
   .color-block-blue {
      background-color: #1E9FFF;
      display: inline-block;
      float: left;
      margin: 15rpx 15rpx 0 15rpx;
      width: 12rpx;
      height: 40rpx;
      border: 5rpx solid #1E9FFF;
      border-radius: 20rpx;
   }
   .title {
      display: inline-block;
      float: left;
      font-size: 34rpx;
      font-weight: 700;
      height: 50rpx;
      line-height: 50rpx;
      margin-top: 10rpx;
   }
   .box-buttom {
      display: inline-block;
      background-color: #ededed;
      width: 96%;
      height: 60rpx;
      border-radius: 20rpx;
      margin: 15rpx 15rpx 0rpx 15rpx;
   }
   .box-buttom input {
      width: 75%;
      float: left;
      margin: 8rpx 10rpx 0rpx 25rpx;
   }
   .box-buttom .search-icon {
      width: 60rpx;
      height: 60rpx;
      float: right;
      margin-top: 5rpx;
      margin-right: 10rpx;
   }
   .pak-seach-box button {
      background-color: #1E9FFF;
      color: #ffffff;
      display: inline-block;
      float: right;
      width: 150rpx;
      height: 60rpx;
      margin: 15rpx 15rpx 0rpx 15rpx;
      line-height: 60rpx;
   }
   .pakin-btn {
      background-color: #1E9FFF;
   }
   .pak-data-box {
      background-color: #F1F1F1;
      margin: 15rpx 15rpx 0rpx 15rpx;
      width: 96%;
      height: 70rpx;
      border-radius: 20rpx;
   }
   .pak-data-box .box-top {
      background-color: #FFFFFF;
      height: 70rpx;
      border-radius: 20rpx 20rpx 20rpx 20rpx;
   }
   .bg-false {
      background-color: #FFFFFF;
   }
   .bg-true {
      background-color: #ebebeb;
   }
   .data-list {
      border-bottom: 1px solid #d8d8d8;
      height: 180rpx;
      margin: 15rpx;
      border-radius: 20rpx;
   }
   .data-list:first-child {
      margin-top: 20rpx;
   }
   .data-list:last-child {
      margin-bottom: 160rpx;
   }
   /* .data-list-left {
      display: inline-block;
      float: left;
      text-align: center;
      width: 100rpx;
      height: 180rpx;
      line-height: 180rpx;
   } */
   .left-check-box {
      display: inline-block;
      /* background-color: #1E9FFF; */
      float: left;
      height: 100%;
      width: 100rpx;
      text-align: center;
      line-height: 170rpx;
   }
   .data-list-left {
      /* background-color: #ffff7f; */
      display: inline-block;
      float: left;
      height: 180rpx;
      width: 500rpx;
      color: #676767;
   }
   .matnr {
      padding-top: 10rpx;
   }
   .data-list-right {
      /* background-color: #55ffff; */
      display: inline-block;
      float: right;
      width: 100rpx;
      height: 180rpx;
      line-height: 180rpx;
   }
   .data-list-right label {
      display: inline-block;
      float: left;
      width: 100rpx;
      height: 180rpx;
   }
   .revise-box {
      width: 500rpx;
      height: 500rpx;
   }
   .revise-box-top {
      width: 100%;
      height: 100rpx;
      background-color: #fff;
      padding: 10rpx;
   }
   .changeBox {
      width: 100%;
      height: 100rpx;
      line-height: 120rpx;
      text-align: center;
      background-color: #FFF;
      margin-top: 20rpx;
      border-bottom: 1px solid #e3e3e3;
   }
   .text-box {
      width: 100%;
      height: 100rpx;
      line-height: 120rpx;
      text-align: center;
      /* padding-left: 120rpx; */
      background-color: #FFF;
      margin-top: 20rpx;
      border-bottom: 1px solid #e3e3e3;
   }
   .changeBox .num-box {
      display: inline-block;
      float: left;
   }
   .changeBox button {
      float: left;
   }
   .revise-box-buttom {
      position: absolute;
      width: 100%;
      height: 100rpx;
      line-height: 100rpx;
      background-color: #FFFFFF;
      bottom: 0;
      text-align: center;
   }
</style>
/* 你的样式我保留并做小幅清理 */
.square-1 .lable {
  display: inline-block;
  float: right;
  height: 100%;
  width: 400rpx;
}
.square-1 .lable label {
  display: inline-block;
  float: left;
  height: 100%;
  width: 90rpx;
  line-height: 100rpx;
}
.pak-seach-box {
  background-color: #FFFFFF;
  margin: 15rpx 15rpx 0rpx 15rpx;
  width: 96%;
  height: 150rpx;
  border-radius: 20rpx;
}
.box-top {
  display: block;
  height: 60rpx;
  width: 720rpx;
}
.color-block-blue {
  background-color: #1E9FFF;
  display: inline-block;
  float: left;
  margin: 15rpx 15rpx 0 15rpx;
  width: 12rpx;
  height: 40rpx;
  border: 5rpx solid #1E9FFF;
  border-radius: 20rpx;
}
.title {
  display: inline-block;
  float: left;
  font-size: 34rpx;
  font-weight: 700;
  height: 50rpx;
  line-height: 50rpx;
  margin-top: 10rpx;
}
.box-buttom {
  display: inline-block;
  background-color: #ededed;
  width: 96%;
  height: 60rpx;
  border-radius: 20rpx;
  margin: 15rpx 15rpx 0rpx 15rpx;
}
.box-buttom input {
  width: 75%;
  float: left;
  margin: 8rpx 10rpx 0rpx 25rpx;
}
.box-buttom .search-icon {
  width: 60rpx;
  height: 60rpx;
  float: right;
  margin-top: 5rpx;
  margin-right: 10rpx;
}
.pak-seach-box button {
  background-color: #1E9FFF;
  color: #ffffff;
  display: inline-block;
  float: right;
  width: 150rpx;
  height: 60rpx;
  margin: 15rpx 15rpx 0rpx 15rpx;
  line-height: 60rpx;
}
.pakin-btn {
  background-color: #1E9FFF;
}
.pak-data-box {
  background-color: #F1F1F1;
  margin: 15rpx 15rpx 0rpx 15rpx;
  width: 96%;
  height: 70rpx;
  border-radius: 20rpx;
}
.pak-data-box .box-top {
  background-color: #FFFFFF;
  height: 70rpx;
  border-radius: 20rpx 20rpx 20rpx 20rpx;
}
.bg-false {
  background-color: #FFFFFF;
}
.bg-true {
  background-color: #ebebeb;
}
.data-list {
  border-bottom: 1px solid #d8d8d8;
  height: 180rpx;
  margin: 15rpx;
  border-radius: 20rpx;
}
.data-list:first-child {
  margin-top: 20rpx;
}
.data-list:last-child {
  margin-bottom: 160rpx;
}
.left-check-box {
  display: inline-block;
  float: left;
  height: 100%;
  width: 100rpx;
  text-align: center;
  line-height: 170rpx;
}
.data-list-left {
  display: inline-block;
  float: left;
  height: 180rpx;
  width: 500rpx;
  color: #676767;
}
.matnr {
  padding-top: 10rpx;
}
.data-list-right {
  display: inline-block;
  float: right;
  width: 100rpx;
  height: 180rpx;
  line-height: 180rpx;
}
.data-list-right label {
  display: inline-block;
  float: left;
  width: 100rpx;
  height: 180rpx;
}
.revise-box {
  width: 500rpx;
  height: 500rpx;
}
.revise-box-top {
  width: 100%;
  height: 100rpx;
  background-color: #fff;
  padding: 10rpx;
}
.changeBox {
  width: 100%;
  height: 100rpx;
  line-height: 120rpx;
  text-align: center;
  background-color: #FFF;
  margin-top: 20rpx;
  border-bottom: 1px solid #e3e3e3;
}
.text-box {
  width: 100%;
  height: 100rpx;
  line-height: 120rpx;
  text-align: center;
  background-color: #FFF;
  margin-top: 20rpx;
  border-bottom: 1px solid #e3e3e3;
}
.changeBox .num-box {
  display: inline-block;
  float: left;
}
.changeBox button {
  float: left;
}
.revise-box-buttom {
  position: absolute;
  width: 100%;
  height: 100rpx;
  line-height: 100rpx;
  background-color: #FFFFFF;
  bottom: 0;
  text-align: center;
}
</style>