fix: 修复 SkuList TODO 优化相关算法

This commit is contained in:
puhui999 2023-05-17 01:39:51 +08:00
parent 6ac8c78d57
commit 9c06832d7e

View File

@ -1,6 +1,6 @@
<template> <template>
<el-table <el-table
:data="isBatch ? SkuData : formData.skus" :data="isBatch ? skuList : formData.skus"
border border
class="tabNumWidth" class="tabNumWidth"
max-height="500" max-height="500"
@ -14,7 +14,7 @@
<template v-if="formData.specType && !isBatch"> <template v-if="formData.specType && !isBatch">
<!-- 根据商品属性动态添加 --> <!-- 根据商品属性动态添加 -->
<el-table-column <el-table-column
v-for="(item, index) in tableHeaderList" v-for="(item, index) in tableHeaders"
:key="index" :key="index"
:label="item.label" :label="item.label"
align="center" align="center"
@ -32,65 +32,45 @@
</template> </template>
</el-table-column> </el-table-column>
<!-- TODO @puhui999用户输入的时候是按照元分主要是我们自己用 --> <!-- TODO @puhui999用户输入的时候是按照元分主要是我们自己用 -->
<el-table-column align="center" label="销售价()" min-width="168"> <el-table-column align="center" label="销售价()" min-width="168">
<template #default="{ row }"> <template #default="{ row }">
<el-input-number v-model="row.price" :min="0" class="w-100%" controls-position="right" /> <el-input-number v-model="row.price" :min="0" class="w-100%" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="市场价()" min-width="168"> <el-table-column align="center" label="市场价()" min-width="168">
<template #default="{ row }"> <template #default="{ row }">
<el-input-number <el-input-number v-model="row.marketPrice" :min="0" class="w-100%" />
v-model="row.marketPrice"
:min="0"
class="w-100%"
controls-position="right"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="成本价()" min-width="168"> <el-table-column align="center" label="成本价(元)" min-width="168">
<template #default="{ row }"> <template #default="{ row }">
<el-input-number <el-input-number v-model="row.costPrice" :min="0" class="w-100%" />
v-model="row.costPrice"
:min="0"
class="w-100%"
controls-position="right"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="库存" min-width="168"> <el-table-column align="center" label="库存" min-width="168">
<template #default="{ row }"> <template #default="{ row }">
<el-input-number v-model="row.stock" :min="0" class="w-100%" controls-position="right" /> <el-input-number v-model="row.stock" :min="0" class="w-100%" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="重量(kg)" min-width="168"> <el-table-column align="center" label="重量(kg)" min-width="168">
<template #default="{ row }"> <template #default="{ row }">
<el-input-number v-model="row.weight" :min="0" class="w-100%" controls-position="right" /> <el-input-number v-model="row.weight" :min="0" class="w-100%" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="体积(m^3)" min-width="168"> <el-table-column align="center" label="体积(m^3)" min-width="168">
<template #default="{ row }"> <template #default="{ row }">
<el-input-number v-model="row.volume" :min="0" class="w-100%" controls-position="right" /> <el-input-number v-model="row.volume" :min="0" class="w-100%" />
</template> </template>
</el-table-column> </el-table-column>
<template v-if="formData.subCommissionType"> <template v-if="formData.subCommissionType">
<el-table-column align="center" label="一级返佣()" min-width="168"> <el-table-column align="center" label="一级返佣()" min-width="168">
<template #default="{ row }"> <template #default="{ row }">
<el-input-number <el-input-number v-model="row.subCommissionFirstPrice" :min="0" class="w-100%" />
v-model="row.subCommissionFirstPrice"
:min="0"
class="w-100%"
controls-position="right"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="二级返佣()" min-width="168"> <el-table-column align="center" label="二级返佣(元)" min-width="168">
<template #default="{ row }"> <template #default="{ row }">
<el-input-number <el-input-number v-model="row.subCommissionSecondPrice" :min="0" class="w-100%" />
v-model="row.subCommissionSecondPrice"
:min="0"
class="w-100%"
controls-position="right"
/>
</template> </template>
</el-table-column> </el-table-column>
</template> </template>
@ -107,9 +87,8 @@
<script lang="ts" name="SkuList" setup> <script lang="ts" name="SkuList" setup>
import { UploadImg } from '@/components/UploadFile' import { UploadImg } from '@/components/UploadFile'
import { PropType } from 'vue' import { PropType } from 'vue'
import { SpuType } from '@/api/mall/product/management/type/spuType' import type { Property, SkuType, SpuType } from '@/api/mall/product/spu'
import { propTypes } from '@/utils/propTypes' import { propTypes } from '@/utils/propTypes'
import { SkuType } from '@/api/mall/product/management/type/skuType'
import { copyValueToTarget } from '@/utils' import { copyValueToTarget } from '@/utils'
const props = defineProps({ const props = defineProps({
@ -121,66 +100,35 @@ const props = defineProps({
type: Array, type: Array,
default: () => [] default: () => []
}, },
isBatch: propTypes.bool.def(false) // isBatch: propTypes.bool.def(false) //
}) })
const formData = ref<SpuType>() // const formData = ref<SpuType>() //
// TODO @puhui999 const skuList = ref<SkuType[]>([
const SkuData = ref<SkuType[]>([
{ {
/** price: 0, //
* 商品价格单位 marketPrice: 0, //
*/ costPrice: 0, //
price: 0, barCode: '', //
/** picUrl: '', //
* 市场价单位 stock: 0, //
*/ weight: 0, //
marketPrice: 0, volume: 0, //
/** subCommissionFirstPrice: 0, //
* 成本价单位 subCommissionSecondPrice: 0 //
*/
costPrice: 0,
/**
* 商品条码
*/
barCode: '',
/**
* 图片地址
*/
picUrl: '',
/**
* 库存
*/
stock: 0,
/**
* 商品重量单位kg 千克
*/
weight: 0,
/**
* 商品体积单位m^3 平米
*/
volume: 0,
/**
* 一级分销的佣金单位
*/
subCommissionFirstPrice: 0,
/**
* 二级分销的佣金单位
*/
subCommissionSecondPrice: 0
} }
]) ]) //
/** 批量添加 */ /** 批量添加 */
const batchAdd = () => { const batchAdd = () => {
formData.value.skus.forEach((item) => { formData.value.skus.forEach((item) => {
copyValueToTarget(item, SkuData.value[0]) copyValueToTarget(item, skuList.value[0])
}) })
} }
const tableHeaderList = ref<{ prop: string; label: string }[]>([]) const tableHeaders = ref<{ prop: string; label: string }[]>([]) //
/** /**
* 将传进来的值赋值给SkuData * 将传进来的值赋值给skuList
*/ */
watch( watch(
() => props.propFormData, () => props.propFormData,
@ -197,21 +145,18 @@ watch(
// TODO @ chatgpt // TODO @ chatgpt
/** 生成表数据 */ /** 生成表数据 */
const generateTableData = (data: any[]) => { const generateTableData = (data: any[]) => {
// // fix: 使mapfor
const propertiesItemList = [] const propertiesItemList = data.map((item) =>
for (const item of data) { item.values.map((v) => ({
const objList = [] propertyId: item.id,
for (const v of item.values) { propertyName: item.name,
const obj = { propertyId: 0, valueId: 0, valueName: '' } valueId: v.id,
obj.propertyId = item.id valueName: v.name
obj.valueId = v.id }))
obj.valueName = v.name )
objList.push(obj)
}
propertiesItemList.push(objList)
}
const buildList = build(propertiesItemList) const buildList = build(propertiesItemList)
// sku, // sku,
// fix:
if ( if (
buildList.length === formData.value.skus.length || buildList.length === formData.value.skus.length ||
data.some((item) => item.values.length === 0) data.some((item) => item.values.length === 0)
@ -222,7 +167,7 @@ const generateTableData = (data: any[]) => {
formData.value!.skus = [] formData.value!.skus = []
buildList.forEach((item) => { buildList.forEach((item) => {
const row = { const row = {
properties: [], properties: Array.isArray(item) ? item : [item],
price: 0, price: 0,
marketPrice: 0, marketPrice: 0,
costPrice: 0, costPrice: 0,
@ -234,32 +179,25 @@ const generateTableData = (data: any[]) => {
subCommissionFirstPrice: 0, subCommissionFirstPrice: 0,
subCommissionSecondPrice: 0 subCommissionSecondPrice: 0
} }
//
if (Array.isArray(item)) {
row.properties = item
} else {
row.properties.push(item)
}
formData.value.skus.push(row) formData.value.skus.push(row)
}) })
} }
/** 构建所有排列组合 */ /** 构建所有排列组合 */
const build = (list: any[]) => { const build = (propertyValuesList: Property[][]) => {
if (list.length === 0) { if (propertyValuesList.length === 0) {
return [] return []
} else if (list.length === 1) { } else if (propertyValuesList.length === 1) {
return list[0] return propertyValuesList[0]
} else { } else {
const result = [] const result: Property[][] = []
const rest = build(list.slice(1)) const rest = build(propertyValuesList.slice(1))
for (let i = 0; i < list[0].length; i++) { for (let i = 0; i < propertyValuesList[0].length; i++) {
for (let j = 0; j < rest.length; j++) { for (let j = 0; j < rest.length; j++) {
// //
if (Array.isArray(rest[j])) { if (Array.isArray(rest[j])) {
result.push([list[0][i], ...rest[j]]) result.push([propertyValuesList[0][i], ...rest[j]])
} else { } else {
result.push([list[0][i], rest[j]]) result.push([propertyValuesList[0][i], rest[j]])
} }
} }
} }
@ -270,12 +208,12 @@ const build = (list: any[]) => {
/** 监听属性列表生成相关参数和表头 */ /** 监听属性列表生成相关参数和表头 */
watch( watch(
() => props.attributeList, () => props.attributeList,
(data) => { (attributeList) => {
// //
if (!formData.value.specType) return if (!formData.value.specType) return
// 使 // 使
if (props.isBatch) { if (props.isBatch) {
SkuData.value = [ skuList.value = [
{ {
price: 0, price: 0,
marketPrice: 0, marketPrice: 0,
@ -291,15 +229,15 @@ watch(
] ]
} }
// //
if (JSON.stringify(data) === '[]') return if (JSON.stringify(attributeList) === '[]') return
// //
tableHeaderList.value = [] tableHeaders.value = []
// //
data.forEach((item, index) => { attributeList.forEach((item, index) => {
// nameindex // nameindex
tableHeaderList.value.push({ prop: `name${index}`, label: item.name }) tableHeaders.value.push({ prop: `name${index}`, label: item.name })
}) })
generateTableData(data) generateTableData(attributeList)
}, },
{ {
deep: true, deep: true,