#
lty
12 小时以前 40866099bebc0dd34412c7e88e349b8a66f88580
pages/basics/saless.vue
@@ -1,341 +1,306 @@
<template>
   <view>
      <scroll-view scroll-y>
         <view>
            <view class="search-box">
               <view class="search-area">
                  <view class="search-icon"><uni-icons type="search" size="25" color="#a5a5a5"></uni-icons></view>
                  <input type="text" v-model="orderNo" placeholder="扫码 / 输入(订单编号)" @input="search()"/>
                  <view class="close-icon" @click="reset()"><uni-icons type="closeempty" size="25" color="#a5a5a5"></uni-icons></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-combox">
                  <uni-combox
                     emptyTips="暂无数据"
                     :candidates="floorList"
                     v-model="staNo"
                     placeholder="站点编号">
                  </uni-combox>
               </view>
            </view>
            <checkbox-group @change="checkbox">
               <label v-for="(item,index) in data" :key="index" class="demo-list bg-false" :class="'bg-'+item.checked" >
                  <view class="demo-list-left">
                     <checkbox :value="item.id+''" :checked="item.checked" style="display: block;" />
                  </view>
                  <view class="demo-list-right">
                     <!-- <view><text style="font-weight: bold;">序号:{{index+1}}</text></view> -->
                     <view class="order-ditel"><text class="index">No.{{index+1}}</text><text class="orderNo">{{item.orderNo}}</text></view>
                     <view><text style="width: 400rpx;">商品编码:{{item.matnr}}</text></view>
                     <view>
                        <text>应入数量:{{item.anfme}}</text>
                        <text>商品名称:{{item.maktx}}</text>
                     </view>
                     <view>
                        <text>已入数量:{{item.inQty}}</text>
                        <text style="width: auto;">订单状态:</text><text :class="state$"> {{item.state$}}</text>
                     </view>
                  </view>
               </label>
            </checkbox-group>
         </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
                     ref="barcodeInput"
                     v-model="barcode"
                     type="text"
                     :focus="barcodeFocus"
                     placeholder="扫码 / 输入"
                     placeholder-style="line-height: 85rpx;"
                     @confirm="submit"
                  />
               </view>
            </view>
         </view>
      </scroll-view>
      <!-- 底部按钮 -->
      <view class="footer flex justify-around">
         <label class="label-btn" style="width: 150rpx;">
            <checkbox :checked="check" @click="allChecked()">{{checkText}}</checkbox>
         <label class="label-btn flex justify-center align-center">
            <button class="cu-btn" @click="reset">重置</button>
         </label>
         <label class="label-btn" style="width: 100rpx;">
            <text  @click="reChecked()">反选</text>
         </label>
         <label class="label-btn" style="width: 170rpx;">
            <button class="cu-btn bg-red ">撤销上架</button>
         </label>
         <label class="label-btn">
            <button class="cu-btn bg-blue " @click="shangjia()">上架</button>
         <label class="label-btn flex justify-center align-center">
            <button class="cu-btn bg-blue" :disabled="submitting" @click="submit">
               {{ submitting ? '提交中...' : '启动' }}
            </button>
         </label>
      </view>
   </view>
</template>
<script>
   export default {
      data() {
         return {
            data: [],
            orderNo:'',
            needData:{},
            check:false,
            checkText:'全选',
            checkedData:[],
            state$:'',
         }
export default {
   data() {
      return {
         barcode: '',
         staNo: '',
         floorList: ['2102', '2105', '2112', '2115'],
         apiUrl: 'http://10.10.10.235:9090/jshdwcs/open/hd/task/cs/barcode/default/v1',
         // ✅ 防重复提交锁
         submitting: false,
         // ✅ 扫码框自动聚焦
         barcodeFocus: true
      }
   },
   mounted() {
      this.refocus()
   },
   methods: {
      // ✅ 强制重新聚焦扫码框
      refocus() {
         this.barcodeFocus = false
         this.$nextTick(() => {
            this.barcodeFocus = true
         })
      },
      mounted() {
         const UIP = uni.getStorageSync('UIP');
         this.baseIP = UIP;
         const UPORT = uni.getStorageSync('UPORT');
         this.basePORT = UPORT;
         this.render()
      // ✅ 重置
      reset() {
         this.barcode = ''
         this.refocus()
         uni.vibrateShort()
      },
      methods: {
         // 搜索
         search() {
            let that = this;
            // that.tabData.forEach(function(e){
            //    that.searchData = e.orderNo
            // })
            this.render(that.orderNo)
         },
         // 重置
         reset() {
            let that = this;
            if (that.orderNo == '') {
               uni.vibrateShort();
            } else {
               uni.vibrateLong();
            }
            that.orderNo = '';
            that.needData['order_no'] = '';
            that.getData();
         },
         // 表格加载
         render(param) {
            let that = this;
            if(param) {
               that.needData['order_no'] = param;
               that.getData();
            } else {
               that.getData();
            }
         },
         getData() {
            let that = this
            uni.request({
               url: that.baseHttp + that.baseIP + ':' +that.basePORT + that.baseUrl + "/receiveDetl/list/auth",
               header:{'token':uni.getStorageSync('token')},
               data: that.needData,
               success(res) {
                  var res = res.data
                  if (res.code === 200) {
                     that.data = res.data.records
                  }
                  for (var i = 0; i < that.data.length; i++) {
                     if (that.data[i].state$ == "未入库") {
                        that.state$ = 'color-red'
                     } else {
                        console.log(2)
                     }
                  }
               }
      // ✅ 提交(防重复 + 自动回焦)
      submit() {
         // 防重复点击
         if (this.submitting) return
         if (!this.barcode || !this.staNo) {
            uni.showToast({
               title: '请先选择站点并扫码',
               icon: 'none',
               position: 'top'
            })
         },
         checkbox: function (e) {
            var items = this.data,
               values = e.detail.value;
            for (var i = 0, lenI = items.length; i < lenI; ++i) {
               const item = items[i]
               item.id = item.id + ''
               if(values.indexOf(item.id) >= 0){
                  this.$set(item,'checked',true)
               }else{
                  this.$set(item,'checked',false)
               }
            }
            if (values.length == items.length) {
               this.check = true
               this.checkText = "取消全选"
            } else {
               this.check = false
               this.checkText = "全选"
            }
            uni.vibrateShort();
         },
         reChecked() { // 反选
            var checkArr = []
            for (var i = 0; i < this.data.length;i++) {
               if (this.data[i].checked == true) {
                  this.$set(this.data[i],'checked',false)
               }else{
                  this.$set(this.data[i],'checked',true)
               }
               if (this.data[i].checked == true) {
                  checkArr.push(this.data[i].checked)
               }
            }
            if (checkArr.length == this.data.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.data.length;i++) {
                  this.$set(this.data[i],'checked',false)
               }
               this.check = false
               this.checkText = "全选"
            } else {
               for (var i = 0; i < this.data.length;i++) {
                  this.$set(this.data[i],'checked',true)
               }
               this.check = true
               this.checkText = "取消全选"
            }
            uni.vibrateShort();
         },
         shangjia() {
            this.checkedData = []
            for (var i = 0; i < this.data.length; i++) {
               if (this.data[i].checked == true) {
                  this.checkedData.push(this.data[i])
               }
            }
            uni.vibrateShort();
            console.log(this.checkedData)
            return
         }
         this.submitting = true
         uni.showLoading({ title: '提交中...' })
         uni.request({
            url: this.apiUrl,
            method: 'POST',
            data: {
               barcode: this.barcode,
               siteId: this.staNo
            },
            header: {
               'token': uni.getStorageSync('token'),
               'appkey': 'ea1f0459efc02a79f046f982767939ae'
            },
            success: res => {
               uni.hideLoading()
               if (res.data.code === 200) {
                  uni.showToast({
                     title: '成功',
                     icon: 'success',
                     position: 'bottom'
                  })
                  // ✅ 成功 → 清空条码 → 自动回焦
                  this.barcode = ''
                  this.refocus()
               } else {
                  uni.showToast({
                     title: res.data.msg || '失败',
                     icon: 'none',
                     position: 'top'
                  })
               }
            },
            fail: () => {
               uni.hideLoading()
               uni.showToast({
                  title: '网络异常',
                  icon: 'none',
                  position: 'top'
               })
            },
            complete: () => {
               // ✅ 成功 / 失败 都释放锁
               this.submitting = false
            }
         })
      }
   }
}
</script>
<style>
   .search-box {
      position: fixed;
      left: 0;
      top: 0;
      width: 100%;
      height: 100rpx;
      background-color: #FFF;
      border-bottom: 1px solid #d8d8d8;
      border-radius: 0 0 20rpx 20rpx;
      z-index: 1;
   }
   /*#ifdef H5 */
   .search-box {
      position: fixed;
      left: 0;
      top: 60rpx;
      width: 100%;
      height: 100rpx;
      background-color: #ffffff;
      border-bottom: 1px solid #d8d8d8;
      border-radius: 0 0 20rpx 20rpx;
      z-index: 1;
   }
   /* #endif */
   .search-area {
      background-color: #F1F1F1;
      width: 96%;
      height: 70%;
      margin: 15rpx;
      border-radius: 15rpx;
   }
   .search-area input {
      display: inline-block;
      height: 70rpx;
      width: 70%;
      line-height: 70rpx;
      font-size: 25rpx;
      font-weight: 400;
   }
   .search-icon {
      display: inline-block;
      float: left;
      width: 70rpx;
      height: 70rpx;
      text-align: center;
      line-height: 70rpx;
   }
   .close-icon {
      display: inline-block;
      float: right;
      width: 70rpx;
      height: 70rpx;
      text-align: center;
      line-height: 70rpx;
   }
   .bg-false {
      background-color: #FFFFFF;
   }
   .bg-true {
      background-color: #ebebeb;
   }
   .demo-list {
      border-bottom: 1px solid #d8d8d8;
      height: 180rpx;
      margin: 15rpx;
      border-radius: 20rpx;
   }
   .demo-list:first-child {
      margin-top: 120rpx;
   }
   .demo-list:last-child {
      margin-bottom: 120rpx;
   }
   label {
      display: block;
   }
   .demo-list-left {
      display: inline-block;
      float: left;
      text-align: center;
      width: 100rpx;
      height: 180rpx;
      line-height: 180rpx;
   }
   .demo-list-right {
      display: inline-block;
      float: left;
      height: 180rpx;
      color: #828282;
   }
   .order-ditel {
      height: 60rpx;
      width: 600rpx;
      line-height: 60rpx;
   }
/* ✅ 完整保留你原来的 style,不做任何破坏 */
   .demo-list-right .index {
      width: 120rpx;
      height: 25rpx;
      line-height: 25rpx;
      font-size: 40rpx;
      border-right: 4rpx solid #6f6f6f;
      padding-left: 0px;
      padding-right: 10rpx;
      color: #3b3b3b;
      /* background-color: #007AFF; */
   }
   .demo-list-right .orderNo {
      padding-left: 30rpx;
      font-size: 35rpx;
      width: 400rpx;
      color: #3b3b3b;
      /* background-color: #0A98D5; */
   }
   .demo-list-right .vertical-bar { // 竖杠
      /* background-color: #6739B6; */
      width: 50rpx;
      font-size: 30rpx;
      text-align: center;
   }
   .demo-list-right text {
      display: inline-block;
      width: 250rpx;
      font-size: 25rpx;
   }
   .color-red {
      width: auto;
      font-weight: 700;
      color: #e74f4f;
   }
   .label-btn {
      width: 100rpx;
   }
   checkbox {
      /* transform:scale(0.7) */
   }
.item-text {
   display: inline-block;
   width: 500rpx;
   line-height: 55rpx;
   font-size: 30rpx;
}
.item-sign {
   float: left;
   width: 2em;
   height: 50rpx;
}
.revise-box {
   position: relative;
   width: 500rpx;
   height: 470rpx;
   border-radius: 15px;
   background-color: #FFFFFF;
}
.revise-box-top {
   width: 400rpx;
   height: 120rpx;
   border-radius: 25px;
}
.changeBox {
   width: 400rpx;
   height: 100rpx;
}
.num-box {
   margin-left: 100rpx;
}
.revise-box-buttom {
   margin-left: 190rpx;
}
.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: 65%;
   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-data-box {
   background-color: #F1F1F1;
   margin: 15rpx;
   width: 96%;
   height: 70rpx;
   border-radius: 20rpx;
}
.bg-false {
   background-color: #FFFFFF;
}
.bg-true {
   background-color: #ebebeb;
}
.data-list {
   border-bottom: 1px solid #d8d8d8;
   margin: 15rpx;
   border-radius: 20rpx;
}
.footer {
   position: fixed;
   bottom: 0;
   left: 0;
   right: 0;
   display: flex;
   justify-content: space-around;
   background: #fff;
   padding: 20rpx;
}
.bg-blue {
   background-color: #1E9FFF;
   color: #fff;
}
</style>