MrShi
2025-02-07 364d3221b9a8e6dd3a19701d30c4dc4239ef8abf
h5/pages/inventory/detail.vue
@@ -32,7 +32,7 @@
                  <view class="line">规格型号:{{ item.materialAttr }}</view>
                  <view class="line" v-if="item.status == 0">
                     <view class="">账面数量:{{ item.stock }}{{ item.materialUnitName }}</view>
                     <view @click.stop="openEheck(item)" class="btn">执行盘点</view>
                     <view v-if="info.status == 1" @click.stop="openEheck(item)" class="btn">执行盘点</view>
                  </view>
                  <view class="static" v-if="item.status == 1">
                     <view class="ite">
@@ -81,13 +81,15 @@
                  <view class="line">
                     <view class="la">盘点数量:</view>
                     <view class="val">
                        <view class="wrap">
                           <template v-if="!modalForm.handleType">
                              <image v-if="!modalForm.actStock" src="@/static/side/btn_jian_grey@2x.png" mode=""></image>
                              <image v-else @click="changeAct(-1)" src="@/static/side/btn_jian@3x.png" mode=""></image>
                        <view class="wrap">
                           <template v-if="!modalForm.handleType">
                              <image v-if="!modalForm.actStock" src="@/static/side/btn_jian_grey@2x.png" mode=""></image>
                              <image v-else @click="changeAct(-1)" src="@/static/side/btn_jian@3x.png" mode=""></image>
                           </template>
                           <input :disabled="Boolean(modalForm.handleType && modalForm.handleType == 'detail')" type="digit" v-model="modalForm.actStock"></input>
                           <image v-if="!modalForm.handleType" @click="changeAct(1)" src="@/static/side/btn_jia@3x.png" mode=""></image>
                           <input :disabled="Boolean(modalForm.handleType && modalForm.handleType == 'detail')" type="digit"
                              v-model="modalForm.actStock"></input>
                           <image v-if="!modalForm.handleType" @click="changeAct(1)" src="@/static/side/btn_jia@3x.png" mode="">
                           </image>
                        </view>
                        <view class="unit">{{ modalForm.materialUnitName }}</view>
                     </view>
@@ -95,8 +97,9 @@
               </view>
               <view class="remark">
                  <view class="la">备注:</view>
                  <textarea v-model="modalForm.remark" :disabled="Boolean(modalForm.handleType && modalForm.handleType == 'detail')" placeholder="请填写备注" :maxlength="-1" placeholder-class="placeholder9"
                     cols="30" rows="10"></textarea>
                  <textarea v-model="modalForm.remark"
                     :disabled="Boolean(modalForm.handleType && modalForm.handleType == 'detail')" placeholder="请填写备注"
                     :maxlength="-1" placeholder-class="placeholder9" cols="30" rows="10"></textarea>
               </view>
               <view v-if="!modalForm.handleType" class="btns">
                  <view class="btn" @click="showModal = false">取消</view>
@@ -127,557 +130,574 @@
</template>
<script>
import {
   ywStocktakingDetail,
   getYwStocktakingRecord,
   takingDataOpen,
   ywStocktaFinishById
} from '@/api'
import {
   Html5Qrcode
} from 'html5-qrcode'
export default {
   data() {
      return {
         param: {},
         info: {},
         id: '',
         activeTab: 0,
   import {
      ywStocktakingDetail,
      getYwStocktakingRecord,
      takingDataOpen,
      ywStocktaFinishById
   } from '@/api'
   import {
      Html5Qrcode
   } from 'html5-qrcode'
   export default {
      data() {
         return {
            param: {},
            info: {},
            id: '',
            activeTab: 0,
         list: [],
         page: 0,
         total: 0,
            list: [],
            page: 0,
            total: 0,
         showModal: false,
         showTip: false,
         modalForm: {},
            showModal: false,
            showTip: false,
            modalForm: {},
         html5Qrcode: null,
         isScaning: false,
            html5Qrcode: null,
            isScaning: false,
      }
   },
   onLoad(op) {
      this.id = op.id
      this.getDetail()
      this.getList()
   },
   methods: {
      itemClick(item) {
         if(item.status == 1){
            this.showItem(item)
         }
      },
      showItem(item){
         this.showModal = true
         this.modalForm = {
            ...item,
            handleType: this.info.status != 1 ? 'detail' : ''
         }
         console.log('modalForm', this.modalForm);
      },
      getDetail() {
         const {
            id
         } = this
         ywStocktakingDetail(id).then(res => {
            this.info = res.data
         })
      },
      handleQuery(str) {
         this.list = []
         this.page = 1
         this.getList(str)
      },
      getList(str) {
         const {
            page,
            activeTab,
            id,
            param
         } = this
         getYwStocktakingRecord({
            capacity: 20,
            page,
            model: {
               status: str || activeTab,
               stocktakingId: id,
               ...param
            }
         }).then(res => {
            this.list = [...this.list, ...res.data.records]
            this.total = res.data.total
            if (this.param.materialQrcode && this.list.length == 1) {
               this.openEheck(this.list[0])
               this.$set(this.param, 'materialQrcode', null)
            }
         })
      },
      scrolltolower() {
         const {
            total,
            list
         } = this
         if (list.length < total) {
            this.page = this.page + 1
            this.getList()
         } else {
            this.showToast('暂无更多数据')
         }
      },
      openEheck(item) {
         this.modalForm = {
            ...item
         }
         this.showModal = true
      },
      onSubmit() {
         const {
            modalForm
         } = this
         if (!modalForm.actStock) return this.showToast('请输入正确的盘点数量')
         takingDataOpen({
            ...modalForm
         }).then(res => {
            if (res.code == 200) {
               this.showToast('提交成功')
               this.handleQuery()
               this.getDetail()
               this.showModal = false
            }
         })
      },
      changeAct(val) {
         const actStock = this.modalForm.actStock || 0
         this.$set(this.modalForm, 'actStock', actStock + val)
      },
      tabsClick(val) {
         this.activeTab = val
         this.page = 0
         this.list = []
      onLoad(op) {
         this.id = op.id
         this.getDetail()
         this.getList()
      },
      tipSub() {
         const { info } = this
         ywStocktaFinishById(info.id).then(res => {
            this.showTip = false
            uni.navigateBack()
         })
      },
      openQrcode() {
         this.isScaning = true
         Html5Qrcode.getCameras().then((devices) => {
            if (devices && devices.length) {
               this.html5Qrcode = new Html5Qrcode('reader')
               this.html5Qrcode.start({
                  facingMode: 'environment'
               }, {
                  focusMode: 'continuous', //设置连续聚焦模式
                  fps: 5, //设置扫码识别速度
                  qrbox: 280 //设置二维码扫描框大小
               },
                  (decodeText, decodeResult) => {
                     if (decodeText) { //这里decodeText就是通过扫描二维码得到的内容
                        this.stopScan()
                        this.$set(this.param, 'materialQrcode', decodeText)
                        this.handleQuery('null')
                     }
                  },
                  (err) => {
                     // console.log(err);  //错误信息
                  }
               )
      methods: {
         itemClick(item) {
            if (item.status == 1) {
               this.showItem(item)
            }
         })
      },
         },
         showItem(item) {
            this.showModal = true
            this.modalForm = {
               ...item,
               handleType: this.info.status != 1 ? 'detail' : ''
            }
            console.log('modalForm', this.modalForm);
         },
         getDetail() {
            const {
               id
            } = this
            ywStocktakingDetail(id).then(res => {
               this.info = res.data
      stopScan() {
         console.log('停止扫码')
         this.isScaning = false
         if (this.html5Qrcode) {
            this.html5Qrcode.stop()
            })
         },
         handleQuery() {
            this.list = []
            this.page = 1
            this.getList()
         },
         getList() {
            const {
               page,
               activeTab,
               id,
               param
            } = this
            getYwStocktakingRecord({
               capacity: 20,
               page,
               model: {
                  status: activeTab,
                  stocktakingId: id,
                  ...param
               }
            }).then(res => {
               this.list = [...this.list, ...res.data.records || []]
               this.total = res.data.total
               if (this.param.materialQrcode && this.total == 1) {
                  this.openEheck(this.list[0])
                  this.param = {}
               } else if (this.param.materialQrcode && this.total == 0) {
                  this.param = {}
                  uni.showModal({
                     content: '未匹配到物料,请重新扫码',
                     showCancel: false,
                     success: (res) => {
                        if (res.confirm) {
                           this.getList()
                        }
                     }
                  });
               }
            })
         },
         scrolltolower() {
            const {
               total,
               list
            } = this
            if (list.length < total) {
               this.page = this.page + 1
               this.getList()
            } else {
               this.showToast('暂无更多数据')
            }
         },
         openEheck(item) {
            this.modalForm = {
               ...item
            }
            this.showModal = true
         },
         onSubmit() {
            const {
               modalForm
            } = this
            if (!modalForm.actStock) return this.showToast('请输入正确的盘点数量')
            takingDataOpen({
               ...modalForm
            }).then(res => {
               if (res.code == 200) {
                  this.showToast('提交成功')
                  this.handleQuery()
                  this.getDetail()
                  this.showModal = false
               }
            })
         },
         changeAct(val) {
            const actStock = this.modalForm.actStock || 0
            this.$set(this.modalForm, 'actStock', actStock + val)
         },
         tabsClick(val) {
            this.activeTab = val
            this.page = 0
            this.list = []
            this.getList()
         },
         tipSub() {
            const {
               info
            } = this
            ywStocktaFinishById(info.id).then(res => {
               this.showTip = false
               uni.navigateBack()
            })
         },
         openQrcode() {
            this.isScaning = true
            Html5Qrcode.getCameras().then((devices) => {
               if (devices && devices.length) {
                  this.html5Qrcode = new Html5Qrcode('reader')
                  this.html5Qrcode.start({
                        facingMode: 'environment'
                     }, {
                        focusMode: 'continuous', //设置连续聚焦模式
                        fps: 5, //设置扫码识别速度
                        qrbox: 280 //设置二维码扫描框大小
                     },
                     (decodeText, decodeResult) => {
                        if (decodeText) { //这里decodeText就是通过扫描二维码得到的内容
                           this.stopScan()
                           this.$set(this.param, 'materialQrcode', decodeText)
                           this.handleQuery()
                        }
                     },
                     (err) => {
                        // console.log(err);  //错误信息
                     }
                  )
               }
            })
         },
         stopScan() {
            console.log('停止扫码')
            this.isScaning = false
            if (this.html5Qrcode) {
               this.html5Qrcode.stop()
            }
         }
      }
   }
}
</script>
<style lang="scss">
.main_app {
   padding: 0 30rpx;
   overflow: hidden;
}
   .main_app {
      padding: 0 30rpx;
      overflow: hidden;
   }
.tabs {
   display: flex;
   width: 750rpx;
   margin: 12rpx -30rpx 20rpx;
   border-bottom: 1rpx solid #E5E5E5;
   .tab {
      font-size: 30rpx;
      color: #666666;
      flex: 1;
   .tabs {
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: flex-end;
      height: 72rpx;
      width: 750rpx;
      margin: 12rpx -30rpx 20rpx;
      border-bottom: 1rpx solid #E5E5E5;
      .name {
      .tab {
         font-size: 30rpx;
         color: #666666;
         flex: 1;
         display: flex;
         flex-direction: column;
         align-items: center;
         justify-content: flex-end;
         height: 72rpx;
         .name {
            display: flex;
            align-items: center;
         }
         .border {
            width: 54rpx;
            height: 6rpx;
            background-color: #fff;
            border-radius: 3rpx;
            margin-top: 12rpx;
         }
      }
      .active {
         font-weight: 600;
         font-size: 32rpx;
         color: #222222;
         .border {
            background-color: $primaryColor;
         }
      }
   }
   .head_wrap {
      display: flex;
      align-items: center;
      margin-bottom: 36rpx;
      .search_wrap {
         display: flex;
         align-items: center;
         width: 100%;
         height: 76rpx;
         background: #F7F7F7;
         border-radius: 38rpx;
         padding-left: 30rpx;
         input {
            flex: 1;
         }
         .search {
            width: 28rpx;
            height: 28rpx;
         }
      }
      .border {
         width: 54rpx;
         height: 6rpx;
   }
   .scroll_Y {
      height: calc(100vh - 350rpx);
   }
   .list {
      .item {
         border-bottom: 1rpx solid #E5E5E5;
         padding-bottom: 24rpx;
         margin-bottom: 16rpx;
         .title {
            font-weight: 600;
            font-size: 34rpx;
            color: #222222;
            margin-bottom: 10rpx;
            flex: 1;
         }
         .head {
            display: flex;
            // align-items: center;
            justify-content: space-between;
            color: #666666;
            .status {
               width: 76rpx;
               text-align: right;
               padding-top: 3rpx;
            }
         }
         .line {
            height: 60rpx;
            display: flex;
            align-items: center;
            justify-content: space-between;
            color: #666666;
            .btn {
               display: flex;
               align-items: center;
               justify-content: center;
               height: 60rpx;
               padding: 0 20rpx;
               background: #0068FF;
               box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(0, 104, 255, 0.3);
               border-radius: 30rpx;
               font-size: 26rpx;
               color: #FFFFFF;
            }
         }
         .static {
            display: flex;
            height: 84rpx;
            background: #F7F7F7;
            font-size: 30rpx;
            margin-top: 12rpx;
            padding: 16rpx 0;
            .spi {
               border: 1rpx solid #E5E5E5;
            }
            .ite {
               flex: 1;
               display: flex;
               align-items: center;
               justify-content: center;
               .val {
                  font-weight: 500;
               }
            }
         }
      }
   }
   .footer_btn {
      padding: 20rpx 40rpx 0;
      border-top: 1px solid #e5e5e5;
      width: 750rpx;
      margin: 0 -30rpx;
      .sweep {
         display: flex;
         align-items: center;
         justify-content: center;
         font-size: 32rpx;
         font-weight: 500;
         width: 670rpx;
         height: 88rpx;
         background: #0068FF;
         box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0, 104, 255, 0.3);
         border-radius: 44rpx;
         color: #FFFFFF;
      }
      .sub_result {
         background-color: #fff;
         border-radius: 3rpx;
         margin-top: 12rpx;
         color: #FF0000;
         border: 1rpx solid #FF0000;
         box-shadow: none
      }
      image {
         width: 32rpx;
         height: 32rpx;
         margin-right: 6rpx;
      }
   }
   .active {
      font-weight: 600;
      font-size: 32rpx;
      color: #222222;
   .modal_wrap {
      padding: 36rpx 30rpx;
      .border {
         background-color: $primaryColor;
      .modal_title {
         font-weight: 500;
         font-size: 32rpx;
         color: #222222;
         margin-bottom: 40rpx;
         text-align: center;
      }
   }
}
.head_wrap {
   display: flex;
   align-items: center;
   margin-bottom: 36rpx;
   .search_wrap {
      display: flex;
      align-items: center;
      width: 100%;
      height: 76rpx;
      background: #F7F7F7;
      border-radius: 38rpx;
      padding-left: 30rpx;
      input {
         flex: 1;
      }
      .search {
         width: 28rpx;
         height: 28rpx;
      }
   }
}
.scroll_Y {
   height: calc(100vh - 350rpx);
}
.list {
   .item {
      border-bottom: 1rpx solid #E5E5E5;
      padding-bottom: 24rpx;
      margin-bottom: 16rpx;
      .title {
         font-weight: 600;
         font-size: 34rpx;
         color: #222222;
         margin-bottom: 10rpx;
         flex: 1;
      }
      .head{
         display: flex;
         // align-items: center;
         justify-content: space-between;
         color: #666666;
         .status{
            width: 76rpx;
            text-align: right;
            padding-top: 3rpx;
         }
      }
      .line {
         height: 60rpx;
      .item {
         font-size: 28rpx;
         color: #666666;
         height: 56rpx;
         display: flex;
         align-items: center;
         justify-content: space-between;
         color: #666666;
         .btn {
            display: flex;
            align-items: center;
            justify-content: center;
            height: 60rpx;
            padding: 0 20rpx;
            background: #0068FF;
            box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(0, 104, 255, 0.3);
            border-radius: 30rpx;
            font-size: 26rpx;
            color: #FFFFFF;
         }
      }
      .static {
         display: flex;
         height: 84rpx;
         background: #F7F7F7;
         font-size: 30rpx;
         margin-top: 12rpx;
         padding: 16rpx 0;
      .content {
         border-top: 1rpx solid #E5E5E5;
         margin-top: 16rpx;
         .spi {
            border: 1rpx solid #E5E5E5;
         }
         .ite {
            flex: 1;
         .line {
            height: 84rpx;
            display: flex;
            align-items: center;
            justify-content: center;
            justify-content: space-between;
            .la {
               font-weight: 500;
               font-size: 32rpx;
               color: #222222;
            }
            .val {
               font-weight: 500;
            }
         }
      }
   }
}
.footer_btn {
   padding: 20rpx 40rpx 0;
   border-top: 1px solid #e5e5e5;
   width: 750rpx;
   margin: 0 -30rpx;
   .sweep {
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 32rpx;
      font-weight: 500;
      width: 670rpx;
      height: 88rpx;
      background: #0068FF;
      box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0, 104, 255, 0.3);
      border-radius: 44rpx;
      color: #FFFFFF;
   }
   .sub_result {
      background-color: #fff;
      color: #FF0000;
      border: 1rpx solid #FF0000;
      box-shadow: none
   }
   image {
      width: 32rpx;
      height: 32rpx;
      margin-right: 6rpx;
   }
}
.modal_wrap {
   padding: 36rpx 30rpx;
   .modal_title {
      font-weight: 500;
      font-size: 32rpx;
      color: #222222;
      margin-bottom: 40rpx;
      text-align: center;
   }
   .title {
      font-weight: 600;
      font-size: 34rpx;
      color: #222222;
   }
   .item {
      font-size: 28rpx;
      color: #666666;
      height: 56rpx;
      display: flex;
      align-items: center;
   }
   .content {
      border-top: 1rpx solid #E5E5E5;
      margin-top: 16rpx;
      .line {
         height: 84rpx;
         display: flex;
         align-items: center;
         justify-content: space-between;
         .la {
            font-weight: 500;
            font-size: 32rpx;
            color: #222222;
         }
         .val {
            display: flex;
            justify-content: flex-end;
            align-items: center;
            flex: 1;
            .wrap {
               display: flex;
               justify-content: flex-end;
               align-items: center;
               flex: 1;
               input {
                  width: 120rpx;
                  height: 72rpx;
                  border-radius: 8rpx;
                  border: 2rpx solid #0068FF;
                  margin: 0 16rpx;
                  padding: 0 10rpx;
                  text-align: center;
               .wrap {
                  display: flex;
                  align-items: center;
                  input {
                     width: 120rpx;
                     height: 72rpx;
                     border-radius: 8rpx;
                     border: 2rpx solid #0068FF;
                     margin: 0 16rpx;
                     padding: 0 10rpx;
                     text-align: center;
                  }
               }
               .unit {
                  font-size: 30rpx;
                  color: #666666;
                  margin-left: 20rpx;
               }
            }
            .unit {
               font-size: 30rpx;
               color: #666666;
               margin-left: 20rpx;
            image {
               width: 72rpx;
               height: 72rpx;
            }
         }
      }
      .remark {
         margin-top: 16rpx;
         .la {
            font-size: 30rpx;
            color: #222222;
            margin-bottom: 16rpx;
         }
         textarea {
            width: 690rpx;
            height: 240rpx;
            background: #F7F7F7;
            border-radius: 12rpx;
            padding: 10rpx 20rpx;
         }
      }
      .btns {
         display: flex;
         justify-content: space-between;
         align-items: center;
         margin-top: 80rpx;
         .btn {
            width: 336rpx;
            height: 88rpx;
            border-radius: 44rpx;
            border: 2rpx solid $primaryColor;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 32rpx;
            color: $primaryColor;
         }
         .sub {
            background-color: $primaryColor;
            color: #fff;
         }
      }
   }
   .modal_t {
      width: 520rpx;
      text-align: center;
      display: flex;
      flex-direction: column;
      .h1 {
         height: 86rpx;
         font-weight: 500;
         font-size: 32rpx;
         color: #333333;
         display: flex;
         align-items: flex-end;
         justify-content: center;
      }
      .content {
         flex: 1;
         display: flex;
         flex-direction: column;
         justify-content: center;
         align-items: center;
         padding: 30rpx 0;
      }
      .btns {
         height: 102rpx;
         display: flex;
         align-items: center;
         border-top: 1rpx solid #E5E5E5;
         .btn {
            height: 102rpx;
            flex: 1;
            display: flex;
            align-items: center;
            justify-content: center;
            border-right: 1rpx solid #E5E5E5;
            font-weight: 400;
            font-size: 32rpx;
            color: #999999;
            &:nth-last-child(1) {
               border-right: none;
            }
         }
         image {
            width: 72rpx;
            height: 72rpx;
         .sub {
            color: $primaryColor;
         }
      }
   }
   .remark {
      margin-top: 16rpx;
      .la {
         font-size: 30rpx;
         color: #222222;
         margin-bottom: 16rpx;
      }
      textarea {
         width: 690rpx;
         height: 240rpx;
         background: #F7F7F7;
         border-radius: 12rpx;
         padding: 10rpx 20rpx;
      }
   .reader-box {
      position: fixed;
      top: 0;
      bottom: 0;
      left: 0;
      right: 0;
      background-color: rgba(0, 0, 0, 0.5);
   }
   .btns {
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin-top: 80rpx;
      .btn {
         width: 336rpx;
         height: 88rpx;
         border-radius: 44rpx;
         border: 2rpx solid $primaryColor;
         display: flex;
         align-items: center;
         justify-content: center;
         font-size: 32rpx;
         color: $primaryColor;
      }
      .sub {
         background-color: $primaryColor;
         color: #fff;
      }
   .reader {
      width: 100%;
      // width: 540rpx;
      // height: 540rpx;
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
   }
}
.modal_t {
   width: 520rpx;
   text-align: center;
   display: flex;
   flex-direction: column;
   .h1 {
      height: 86rpx;
      font-weight: 500;
      font-size: 32rpx;
      color: #333333;
      display: flex;
      align-items: flex-end;
      justify-content: center;
   }
   .content {
      flex: 1;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      padding: 30rpx 0;
   }
   .btns {
      height: 102rpx;
      display: flex;
      align-items: center;
      border-top: 1rpx solid #E5E5E5;
      .btn {
         height: 102rpx;
         flex: 1;
         display: flex;
         align-items: center;
         justify-content: center;
         border-right: 1rpx solid #E5E5E5;
         font-weight: 400;
         font-size: 32rpx;
         color: #999999;
         &:nth-last-child(1) {
            border-right: none;
         }
      }
      .sub {
         color: $primaryColor;
      }
   }
}
.reader-box {
   position: fixed;
   top: 0;
   bottom: 0;
   left: 0;
   right: 0;
   background-color: rgba(0, 0, 0, 0.5);
}
.reader {
   width: 100%;
   // width: 540rpx;
   // height: 540rpx;
   position: absolute;
   top: 50%;
   left: 50%;
   transform: translate(-50%, -50%);
}
</style>