diff --git a/src/views/commodity/commoditySystem/addCommodity.vue b/src/views/commodity/commoditySystem/addCommodity.vue index d44411c..2f1f4ac 100644 --- a/src/views/commodity/commoditySystem/addCommodity.vue +++ b/src/views/commodity/commoditySystem/addCommodity.vue @@ -472,7 +472,9 @@ export default { creditLimit: [{ required: true, message: this.$t('product.credit_limit_hint'), trigger: 'blur' }] }, integralList: [], - integralProportion: '' // 积分兑换金额比例 + integralProportion: '', // 积分兑换金额比例 + beforeModifySkuIds: '', // 修改之前的sku集合 + beforeModifySkuValueIndexs: [] // 修改之前sku的valueCode index值数组 } }, watch: { @@ -505,10 +507,10 @@ export default { methods: { handleChangeCascader() { - console.log(this.form.classifyId) + // console.log(this.form.classifyId) }, handleChangePlatformCascader() { - console.log(this.form.classifyBusinessId) + // console.log(this.form.classifyBusinessId) }, async getBrandList() { const { data } = await getBrandList() @@ -799,7 +801,51 @@ export default { this.initLangInfo(itemData) this.initSkuLangInfo(itemData) this.form = { ...itemData, attrStyle: itemData.skus[0].style } + this.handleBeforeSku() + this.beforeModifySkuValueIndexs = this.handleValueCode() + console.log("detail--->skus--->", this.form.skus) }, + + handleBeforeSku() { + let beforeModifySkuIdArr = [] + if(this.form.names) { + for (let name of this.form.names) { + for (let skuValue of name.values){ + if (skuValue.langInfoMap) { + let skuId = '' + if (skuValue.langInfoMap["zh"]) { + skuId = skuValue.langInfoMap["zh"].skuUniId.split('-')[0] + } else if (skuValue.langInfoMap["en"]) { + skuId = skuValue.langInfoMap["en"].skuUniId.split('-')[0] + } + beforeModifySkuIdArr.push(skuId) + } + } + } + } + + if (beforeModifySkuIdArr.length > 0) { + this.beforeModifySkuIds = beforeModifySkuIdArr.join(',') + } + + }, + + // 处理修改前sku的valueCode值 + handleValueCode() { + let skuValueIndexs = [] + if (this.form.names && this.form.names.length === 1) { + // valueCode只对单组规格处理 + skuValueIndexs = this.form.names[0].values.map(item => { + const valueCodeArr = item.valueCode.split('_') + const valueCodeIndex = valueCodeArr[valueCodeArr.length - 1] + return valueCodeIndex + }) + } + + return skuValueIndexs; + + }, + initSkuLangInfo(itemData){ if(itemData && itemData.names){ itemData.names.forEach(nameItemData => { @@ -869,9 +915,10 @@ export default { }) return data }, - skuFormat() { + skuFormat(isMultiChange) { const skuListArray = [] const result = { + skuId: undefined, productId: '', isDelete: 0, skuAttrCodeDTOList: [ @@ -898,6 +945,7 @@ export default { for (var i = 0; i < arr[depth].length; i++) { map.arr.push(arr[depth][i]) const { code, valueCode, attrId } = arr[depth][i] + result.skuId = arr[depth][i].skuId result.skuAttrCodeDTOList[depth] = { code, valueCode, @@ -915,12 +963,39 @@ export default { const values = [] //重新生成规格数据 this.form.names.map((skuItem, index) => { + let difValueCodeIndexs = [] + if (this.form.names.length === 1) { + // 单组规格 + const currentValueCodeIndexs = this.handleValueCode() + // 收集被删除的规格值的valueCode顺序 + difValueCodeIndexs = this.beforeModifySkuValueIndexs.filter(x => !currentValueCodeIndexs.includes(x)); + // 升序排序 + difValueCodeIndexs.sort((a, b) => a - b) + } const attrList = [] skuItem.code = skuItem.code || 'attr_code_' + index const { code } = skuItem skuItem.values && skuItem.values.map((attrItem, index1) => { - attrItem.valueCode = attrItem.valueCode || code + '_value_' + index1 - const skuId = attrItem.skuId + if (!attrItem.valueCode) { + // 单组规格被删除的规格值。解决删除中间某规格值,然后再新增规格值,保存错乱问题. + if (difValueCodeIndexs.length > 0) { + // 取出被删除的规格值valueCode顺序,填充到新增的规格值valueCode顺序 + attrItem.valueCode = code + '_value_' + difValueCodeIndexs[0] + difValueCodeIndexs.splice(0, 1) + } else { + attrItem.valueCode = code + '_value_' + index1 + } + } + //attrItem.valueCode = attrItem.valueCode || code + '_value_' + index1 + let skuId = undefined + if (attrItem.langInfoMap){ + if (attrItem.langInfoMap["zh"]) { + skuId = attrItem.langInfoMap["zh"].skuUniId.split('-')[0] + } else if (attrItem.langInfoMap["en"]) { + skuId = attrItem.langInfoMap["en"].skuUniId.split('-')[0] + } + } + // const skuId = attrItem.skuId const attrId = attrItem.attrId if (attrItem.skuValue_EN || attrItem.skuValue_ZH) { attrList.push({ @@ -940,15 +1015,23 @@ export default { if (values.length) { doExchange(values, 0) } + this.form.skus = skuListArray.map(sku1 => { const findSku = this.form.skus.find(sku2 => { + if (isMultiChange) { + // 多组规格变动,则保持现状,不从原先的sku中取值 + return false + } if (!sku2.skuAttrCodeDTOList) { return false } if (sku2.skuAttrCodeDTOList.length != sku1.skuAttrCodeDTOList.length) { return false } + if (!sku1.skuId) { + return false + } const valueCodeList = sku2.skuAttrCodeDTOList.map(item => item.valueCode) var result = sku1.skuAttrCodeDTOList.every(item => valueCodeList.indexOf(item.valueCode) !== -1) @@ -960,29 +1043,106 @@ export default { return sku1 } }) + }, showEditSkuAttr(){ this.newSkuAttrList = JSON.parse(JSON.stringify(this.form.names)) this.editSkuAttrDialogVisible = true; }, editSkuAttrCancel(){ - console.log('cancel') this.editSkuAttrDialogVisible = false; }, editSkuAttrSure(){ - console.log('save') - this.editSkuAttrDialogVisible = false; - this.form.names = JSON.parse(JSON.stringify(this.newSkuAttrList)) - console.log(this.form.names) - this.skuFormat() + const currentSkuIds = this.getCurrentSkuIds(); + if (this.isEqual(this.beforeModifySkuIds, currentSkuIds)){ + // 规格没有变动 + this.editSkuAttrDialogVisible = false; + this.form.names = JSON.parse(JSON.stringify(this.newSkuAttrList)) + this.skuFormat() + } else { + // 规格有变动,判断原先的规格有没有库存。若有库存,则不允许修改规格 + if (this.form.skus && this.form.skus.length > 0) { + for (const sku of this.form.skus) { + if (sku.stockNumber > 0) { + this.$message.error('之前规格有库存,不允许修改') + return + } + } + } + + + this.form.names = JSON.parse(JSON.stringify(this.newSkuAttrList)) + + + if (this.form.names.length === 1) { + // 单组规格变动处理 + const currentSkuArr = currentSkuIds.split(',') + const beforeModifySkuArr = this.beforeModifySkuIds.split(',') + const differenceArr = beforeModifySkuArr.filter(x => !currentSkuArr.includes(x)); + this.form.deletes = differenceArr + this.skuFormat() + } else { + // 多组规格变动处理。后台直接删除原先的所有规格数据,重新保存所有修改规格 + this.form.deletes = this.beforeModifySkuIds.split(',') + this.skuFormat(true) + } + this.editSkuAttrDialogVisible = false; + } + }, + + // 有逗号分隔的字符串,不分先后顺序判断 + isEqual(a, b) { + let c = a.split(','), d = b.split(','); + if (c.length != d.length) { + return false; + } + for (let i = 0; i < c.length; i++) { + let isMatch = false; + for (let j = 0; j < d.length; j++) { + if (c[i] == d[j]) { + isMatch = true; + break; + } + } + if (!isMatch) { + return false; + } + } + return true; + }, + + getCurrentSkuIds() { + let currentChangeSkuIds = '' + const currentChangeSkuIdArr = [] + if (this.newSkuAttrList) { + for (const skuArrItem of this.newSkuAttrList) { + for (const skuValue of skuArrItem.values){ + if (skuValue.langInfoMap) { + let skuId = '' + if (skuValue.langInfoMap["zh"]) { + skuId = skuValue.langInfoMap["zh"].skuUniId.split('-')[0] + } else if (skuValue.langInfoMap["en"]) { + skuId = skuValue.langInfoMap["en"].skuUniId.split('-')[0] + } + currentChangeSkuIdArr.push(skuId) + } else { + currentChangeSkuIdArr.push(0) + } + } + } + } + + if (currentChangeSkuIdArr.length > 0) { + currentChangeSkuIds = currentChangeSkuIdArr.join(',') + } + return currentChangeSkuIds }, showOneSetting() { this.$refs.oneSetting.showOnSetDialog = true }, - onOnSetting(settingInfo){ - console.log('onOnSetting--->', settingInfo) + onOnSetting(settingInfo) { this.form.skus.forEach(sku => { sku.price = settingInfo.price sku.originalPrice = settingInfo.originalPrice