首页 > 其他分享 >后台发货动态校验多包裹及校验可选择发货数量

后台发货动态校验多包裹及校验可选择发货数量

时间:2024-10-16 16:10:15浏览次数:8  
标签:校验 number 商品 发货 后台 数量 parseInt row

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

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

选择商品

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

展示

image.png

思路

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

    • 复选框的禁用
    • 商品可选择的数量
    • 商品最大值最小值的范围
  • 还有一个就是默认展示 这个只要根据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
     }
   },
 },
}

标签:校验,number,商品,发货,后台,数量,parseInt,row
From: https://www.cnblogs.com/an31742/p/18470201

相关文章

  • 网站首页在后台哪里修改?网站后台管理员密码修改?
    网站首页修改位置登录后台:首先使用管理员账号登录到网站的内容管理系统(CMS)后台。导航至页面管理:在后台管理界面中找到“页面管理”或“内容管理”的选项。选择首页编辑:在页面列表中找到网站首页对应的条目,点击进入编辑模式。进行修改并保存:根据需求修改首页内容后,记得点击保......
  • 网站后台修改模板?公司网站轮播如何修改?
    网站后台修改模板登录后台:使用管理员账号登录网站后台。导航至模板管理:在后台主界面中找到“模板管理”、“主题设置”或类似的选项。选择模板:从模板列表中选择当前使用的模板或想要切换的新模板。编辑模板:进入模板编辑页面,可以对模板的样式、布局等进行调整。......
  • 如何修改网站后台字体?公司网站修改网页内容?
    要进行网站栏目模板修改或公司地址修改,通常涉及前端HTML/CSS以及可能的后端逻辑调整。下面分别介绍这两种情况的处理方法:网站栏目模板修改定位模板文件找到存放网站栏目的模板文件,这通常位于网站的前端目录下,如templates文件夹内。备份原有文件修改前,请先备份原有的模......
  • 怎么修改公司的网站内容?网站修改后台代码?
    如何修改公司的网站内容登录内容管理系统(CMS)访问公司网站的内容管理系统(如WordPress、Drupal等),并使用管理员账号登录。进入编辑模式在CMS后台找到需要修改的内容页面,点击“编辑”或“修改”。修改文本和图片在编辑器中直接修改文本内容,替换图片或添加新的多媒......
  • 网站后台怎么修改文章?网站如何修改密码?
    网站后台修改文章步骤:登录后台管理系统使用管理员或具有编辑权限的账号登录网站后台。进入内容管理模块在后台菜单中找到“内容管理”、“文章管理”或类似命名的模块,并点击进入。查找目标文章在文章列表中通过搜索或浏览找到需要修改的文章。编辑文章点击......
  • 数据库修改网站后台密码?如何数据库修改网站密码?
    要通过数据库直接修改网站后台密码,通常需要以下几个步骤。这里假设你已经拥有数据库的访问权限,并且知道数据库中存储密码的表和字段名称。以下是一个基本的流程:确定数据库类型:确定你使用的数据库类型(如MySQL,PostgreSQL,SQLite等)。连接到数据库:使用数据库管理工具......
  • 网站如何从后台修改?企业网站修改模板?
    要修改一个企业网站的后台或模板,通常可以按照以下步骤进行:登录后台管理系统:访问网站提供的后台管理入口,输入管理员账号和密码登录。选择模板管理功能:在后台管理界面中找到“模板管理”、“主题设置”或类似名称的功能模块。编辑现有模板:如果支持直接编辑现有模板......
  • 怎么用后台修改网站?修改公司网站?
    要通过后台修改公司网站,可以按照以下步骤操作:登录后台管理系统:打开网站的后台管理地址(通常是 www.yourwebsite.com/admin 或类似的URL)。输入用户名和密码登录后台管理系统。导航到内容管理模块:在后台管理界面中找到“内容管理”、“页面管理”或“文章管理”等功能......
  • 网站单页模板修改吗?网站后台如何修改标题?
    网站单页模板修改登录后台管理系统:通常需要通过网站提供的后台管理入口登录,使用管理员账号和密码。进入页面管理:在后台找到“页面管理”或类似名称的选项,这里可以管理网站的所有页面。选择要修改的单页:在页面列表中找到需要修改的单页,点击编辑或修改按钮。修......
  • 网站后台修改首页内容?网站后台修改标题文字?
    要通过网站后台修改首页内容或标题文字,通常可以按照以下步骤操作:登录后台:打开网站后台的登录页面。输入管理员用户名和密码进行登录。导航到内容管理模块:在后台主界面找到“首页管理”、“内容管理”或类似的菜单项。点击进入相应的管理页面。编辑首页内容:查找......