之前通过多级动态表单获取到多包裹,接下来就是再根据多包裹来判断可选择发货数量
要结合之前的多级表单动态添加包裹会更好理解

目前这个只是一种方法,我相信还有别的方法,可能会更简单

选择商品

  • 选择商品里面选择可选择发货数量,
    • 可选择的发货数量是总数量-每个包裹选择的当前商品的数量-已发货数量
  • 可选择发货数量为0时禁用
  • 默认展开时全选商品
  • 默认展开时可选择商品数默认展示

展示

思路

  • 只要把可选择商品把选择商品的数量解决来其他的都好说

    • 复选框的禁用
    • 商品可选择的数量
    • 商品最大值最小值的范围
  • 还有一个就是默认展示 这个只要根据element 的toggleRowSelection方法就可以默认全选选中了

页面代码

  <BaseDialog title="选择商品" v-model="goodsModel" @close="closegoodGroup">
    <div>
      <el-table
        ref="shopTable"
        :data="newTableData"
        style="width: 100%"
        @selection-change="handleSelectionChange"
        :row-key="getRowKey"
      >
        <el-table-column
          type="selection"
          :selectable="selected"
          :reserve-selection="true"
          width="55"
        ></el-table-column>
        <el-table-column label="SKUID" prop="outerSkuId"></el-table-column>
        <el-table-column label="商品名称" prop="skuName"></el-table-column>
        <el-table-column label="所属组合商品" prop="packageSkuName" width="200">
        </el-table-column>
        <el-table-column
          v-if="!subDeliver"
          label="商品规格"
          prop="specs"
        ></el-table-column>
        <el-table-column
          v-if="!subDeliver"
          label="总数量"
          prop="number"
        ></el-table-column>
        <el-table-column
          v-if="!subDeliver"
          label="已发货数量"
          prop="hadDeliveryNumber"
        ></el-table-column>
        <el-table-column
          v-if="!subDeliver"
          label="本次发货数量"
          prop=""
          width="200"
        >
          <template #default="{ row, $index }">
            <el-input-number
              :disabled="getMaxNumber(row) === 0 ? true : false"
              :max="getMaxNumber(row, $index)"
              :min="0"
              v-model="row.theSendGoods"
            ></el-input-number>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <template #footer>
      <div class="dialog-footer">
        <el-button type="default" @click="closegoodGroup">取消</el-button>
        <el-button type="primary" @click="submitGood">确认</el-button>
      </div>
    </template>
  </BaseDialog>

逻辑代码

export default {
 name: '',
 props: {
   subDeliver: {
     type: Boolean,
     default: null,
   },
   goodsModel: {
     type: Boolean,
     default: null,
   },
   newGoodList: {
     type: Array,
     default: () => {
       return []
     },
   },
 },

 data() {
   return {
     // goodsModel: false, // 选择商品弹框
     pitchData: [],
     flagNum: false,
     newTableData: [],
     tableData: [],
   }
 },

 watch: {
   tableData: {
     deep: true,
     immediate: true,
     handler(newVal, oldVal) {
       console.log('newVal: ', newVal)
       this.newTableData = JSON.parse(JSON.stringify(newVal))
       this.newTableData.forEach((v) => {
         this.$nextTick(() => {
           v.selectFlagState = false
           v.theSendGoods = this.setSelectNum(v)
           this.$refs.shopTable.toggleRowSelection(v, true)
         })
       })
     },
   },
 },

 methods: {
   selected(row, index) {
     if (this.subDeliver) {
       return true
     } else {
       return this.setSelectNum(row) === 0 ? false : true
     }
   },
   getMaxNumber(row) {
     return this.setSelectNum(row)
   },
   // 返回唯一值
   getRowKey(row) {
     return row.id
   },
   closegoodGroup() {
     // this.goodsModel = false
     this.$emit('closeGood', false)
   },
   submitGood() {
     // this.goodsModel = false

     if (this.pitchData.length > 0) {
       if (this.subDeliver) {
         if (this.flagSelect) {
           this.$emit('subPitchData', this.pitchData)
         } else {
           this.$message.warning('请选择子商品')
           this.$emit('subPitchData', [])
         }
       } else {
         let selectEditData = []
         JSON.parse(JSON.stringify(this.newTableData)).map((i) => {
           i.isCommonProduct = i.packageSkuName ? true : false
           i.isCommonProduct
             ? (i.newSkuId = i.skuId + i.outerSkuId)
             : (i.newSkuId = i.skuId)
           this.pitchData.map((v) => {
             v.isCommonProduct
               ? (v.newSkuId = v.skuId + v.outerSkuId)
               : (v.newSkuId = v.skuId)
             if (v.selectFlagState && v.newSkuId === i.newSkuId) {
               selectEditData.push({
                 orderItemId: i.id,
                 skuId: i.skuId,
                 skuName: i.skuName,
                 storeOuCode: i.storeOuCode,
                 theSendGoods: i.theSendGoods,
                 number: i.theSendGoods,
                 totalNumber: i.number,
                 outerSkuId: v.outerSkuId,
                 packageSkuName: v.packageSkuName,
               })
             }
           })
         })

         try {
           let isHasProduct = selectEditData.every((item) => item.number === 0)
           if (isHasProduct) {
             throw new Error('请选择商品')
           } else {
           }
           selectEditData = selectEditData.filter((item) => item.number !== 0)
         } catch (error) {
           this.$message.error(error.message)
         }

         this.$emit('pitchData', selectEditData)
       }
     } else {
       this.$message({
         type: 'warning', // success error warning
         message: '请选择商品',
         duration: 2000,
       })
     }
     this.flagSelect = false
   },
   handleSelectionChange(data) {
     this.pitchData = []
     this.pitchData = JSON.parse(JSON.stringify(data)).map((v) => {
       return {
         orderItemId: v.id,
         skuId: v.skuId,
         skuName: v.skuName,
         storeOuCode: v.storeOuCode,
         number: this.subDeliver ? '0' : v.number,
         selectFlagState: true,
         outerSkuId: v.outerSkuId,
         packageSkuName: v.packageSkuName,
         isCommonProduct: v.packageSkuName ? true : false,
       }
     })

     this.flagSelect = this.pitchData.length > 0 ? true : false
   },
   //默认展示最发货数量 及
   setSelectNum(row) {
     // 当前包裹没有商品可选择的商品数量
     let selectCanNumber = 0

     // 有多个包裹那么此商品累计的数量
     let selectNumber = 0

     // 当前包裹有商品可选择的商品数量
     let selectFlagNumber = 0

     // 判断当前包裹是否有商品
     let flagNum = false

     this.newGoodList.forEach((item) => {
       console.log('item: ', item)
       //如果该项目有多个 packageList,则进一步遍历每个包裹
       if (item.packageList.length > 0) {
         item.packageList.forEach((v) => {
           // 对于每个包裹,判断里面是否有商品,如果有 packageSkuList 商品
           // 如果包裹里面有商品
           if (v.packageSkuList.length > 0) {
             // 遍历每一个商品
             v.packageSkuList.forEach((value) => {
               // 如果包裹里面的商品与可选择的表格商品中每一个商品保持一致
               if (value.skuId == row.skuId) {
                 selectNumber += value.number
                 // 累计其他包裹中该商品的数量
                 // 可选择的商品数量 等于总的商品数量减去已发货数量减去其他包裹的该商品的数量
                 selectFlagNumber =
                   parseInt(row.number) -
                   parseInt(row.hadDeliveryNumber) -
                   parseInt(selectNumber)

                 // 做一步校验如果总数量等于已发货数量,则可选择的数量为0
                 if (
                   selectNumber >=
                   parseInt(row.number) - parseInt(row.hadDeliveryNumber)
                 ) {
                   selectFlagNumber = 0
                 }
                 flagNum = true
               } else {
                 // 其他包裹中该商品不包含当前表格中的商品

                 // 可选择的商品等总数量的商品减去已发货的商品
                 selectFlagNumber =
                   parseInt(row.number) - parseInt(row.hadDeliveryNumber)
                 // 做一步校验如果总数量等于已发货数量,则可选择的数量为0
                 console.log('selectNumber: ', selectNumber)
                 console.log('row.number: ', row.number)
                 console.log('row.hadDeliveryNumber: ', row.hadDeliveryNumber)

                 if (
                   selectNumber >=
                   parseInt(row.number) - parseInt(row.hadDeliveryNumber)
                 ) {
                   selectFlagNumber = 0
                 } else {
                   // 其他包裹中该商品不包含当前表格中的商品 且总数量减去发货数量不等于0 那么得需要再减去其他包裹已选择的发货数量
                   selectFlagNumber =
                     parseInt(row.number) -
                     parseInt(row.hadDeliveryNumber) -
                     parseInt(selectNumber)
                 }
                 flagNum = true
               }
             })
           } else {
             // 如果包裹里面没有商品 那么可以选择商品数量等于总数量减去已发货的数量
             selectCanNumber =
               parseInt(row.number) - parseInt(row.hadDeliveryNumber)
           }
         })
       } else {
         // 如果当前包裹的数量只有一个  那么可以选择的商品等于总数量减去已发货的商品数量
         selectCanNumber =
           parseInt(row.number) - parseInt(row.hadDeliveryNumber)
       }
     })

     if (flagNum) {
       // 如果包裹里面有商品 那么可选择的商品数量就是 selectFlagNumber
       return selectFlagNumber
     } else {
       // 如果包裹里面没有商品 那么可选择的商品数量就是 selectCanNumber
       return selectCanNumber
     }
   },
 },
}
posted on 2024-10-16 16:17  awite  阅读(66)  评论(3编辑  收藏  举报