diff --git a/pages/product/components/propertyDetail.vue b/pages/product/components/propertyDetail.vue
index 9c7a76f..17da832 100644
--- a/pages/product/components/propertyDetail.vue
+++ b/pages/product/components/propertyDetail.vue
@@ -1,77 +1,84 @@
-
-
-
-
- 规格名
- {{ item.name }}
-
-
- 规格值
-
- {{ sitem.name }}
-
-
-
-
-
+
+
+
+
+ 规格名
+ {{ item.name }}
+
+
+ 规格值
+
+ {{ sitem.name }}
+
+
+
+
+
diff --git a/pages/product/js/sku.js b/pages/product/js/sku.js
index 56cc18b..1273e46 100644
--- a/pages/product/js/sku.js
+++ b/pages/product/js/sku.js
@@ -1,101 +1,163 @@
-import { ref, computed } from "vue";
-import { onLoad } from "@dcloudio/uni-app";
-import peach from "@/peach";
-import GoodsApi from "@/peach/api/trade/goods";
-import { SPEC_TYPE } from "./config";
+import { ref, computed } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import peach from '@/peach'
+import GoodsApi from '@/peach/api/trade/goods'
+import { SPEC_TYPE } from './config'
-const pickerRef = ref(null);
+const pickerRef = ref(null)
// 多属性商品 sku 列表
-const skus = ref([]);
+const skus = ref([])
-const propertyList = ref([]);
+const propertyList = ref([])
-const goodsPropertyList = ref([]);
+const goodsPropertyList = ref([])
-const propertyListRef = ref(null);
+const propertyListRef = ref(null)
const formData = ref({
- specType: true,
- specText: SPEC_TYPE[0].label,
-});
+ specType: true,
+ specText: SPEC_TYPE[0].label,
+})
async function showPropertyList() {
- await getGoodsProperty();
- propertyListRef.value.onOpen();
+ await getGoodsProperty()
+ propertyListRef.value.onOpen()
}
function onRDPickerConfirm(e) {
- peach.$store("trade").specType = SPEC_TYPE[e.value[0]].value;
- formData.value.specText = SPEC_TYPE[e.value[0]].label;
- formData.value.specType = SPEC_TYPE[e.value[0]].value;
+ peach.$store('trade').specType = SPEC_TYPE[e.value[0]].value
+ formData.value.specText = SPEC_TYPE[e.value[0]].label
+ formData.value.specType = SPEC_TYPE[e.value[0]].value
}
function pickerProperty() {
- let index = specType.value ? 1 : 0;
- pickerRef.value.onOpen([index]);
+ let index = specType.value ? 1 : 0
+ pickerRef.value.onOpen([index])
}
async function onPropertyConfirm(e) {
- await getGoodsProperty();
- console.log(e);
+ await getGoodsProperty()
+ console.log(e)
}
async function getGoodsProperty() {
- let { data } = await GoodsApi.getHistoryProperty();
+ let { data } = await GoodsApi.getHistoryProperty()
- // 把 propertyList 中 id 相同的属性合并,并去重
- propertyList.value = peach.$store("trade").selectedProperty;
+ // 把 propertyList 中 id 相同的属性合并,并去重
+ propertyList.value = peach.$store('trade').selectedProperty
- console.log(propertyList.value);
+ console.log(propertyList.value)
- // 根据已经选择数据,设置默认选中
- data.forEach((item) => {
- // 判断属性是否已经选中
- let propertyParent = propertyList.value.find(
- (sitem) => sitem?.id === item.id
- );
+ // 根据已经选择数据,设置默认选中
+ data.forEach((item) => {
+ // 判断属性是否已经选中
+ let propertyParent = propertyList.value.find((sitem) => sitem?.id === item.id)
- item.checked = propertyParent ? true : false;
+ item.checked = propertyParent ? true : false
- // 如果属性已经选中,查询子类中是否有选中
- if (item.checked) {
- item.propertyValues.forEach((child) => {
- let childResult = propertyParent?.children.some(
- (schild) => schild === child.id
- );
- console.log(childResult);
- child.checked = childResult ? true : false;
- });
- }
- });
+ // 如果属性已经选中,查询子类中是否有选中
+ if (item.checked) {
+ item.propertyValues.forEach((child) => {
+ let childResult = propertyParent?.children.some((schild) => schild === child.id)
+ child.checked = childResult ? true : false
+ })
+ }
+ })
- goodsPropertyList.value = data;
+ goodsPropertyList.value = data
+ console.log(goodsPropertyList.value)
}
-const specType = computed(() => peach.$store("trade").goodsInfo.specType);
+function changeSubProperty() {
+ // 修改子属性状态,需要同步更新 skus 的显示
+ console.log(goodsPropertyList.value)
+ // 过滤父属性 checked 选项,深拷贝避免后面循环改变元数据内容
+ let temp = JSON.parse(JSON.stringify(goodsPropertyList.value.filter((item) => item.checked)))
+ temp.forEach((item) => {
+ item.propertyValues = item.propertyValues.filter((child) => child.checked)
+ })
+
+ let result = temp.map((item) => {
+ return item.propertyValues.map((child) => ({
+ propertyId: item.id,
+ propertyName: item.name,
+ valueId: child.id,
+ valueName: child.name,
+ }))
+ })
+
+ let tempSkus = []
+
+ for (let item of reduceArr(result)) {
+ let obj = {
+ picUrl: '',
+ barCode: '',
+ price: 0,
+ marketPrice: 0,
+ costPrice: 0,
+ stock: 0,
+ weight: 0,
+ volume: 0,
+ properties: item,
+ }
+ tempSkus.push(obj)
+ }
+
+ skus.value = tempSkus
+}
+
+function reduceArr(arr) {
+ return arr.reduce((acc, cur) => {
+ let tempAcc = []
+
+ if (acc.length < 1) {
+ cur.forEach((item, index) => {
+ if (tempAcc[index]) {
+ tempAcc[index].push(item)
+ } else {
+ tempAcc[index] = [item]
+ }
+ })
+ } else {
+ acc.forEach((item, index) => {
+ cur.forEach((sitem, sindex) => {
+ tempAcc.push([...item, sitem])
+ })
+ })
+
+ if (cur.length < 1) {
+ tempAcc = acc
+ }
+ }
+ return tempAcc
+ }, [])
+}
+
+const specType = computed(() => peach.$store('trade').goodsInfo.specType)
function initial() {
- onLoad(() => {
- formData.value.specType = specType.value ? true : false;
- formData.value.specText = SPEC_TYPE[specType.value ? 1 : 0].label;
- skus.value = peach.$store("trade").skus;
- if (specType.value) {
- getGoodsProperty();
- }
- });
+ onLoad(() => {
+ formData.value.specType = specType.value ? true : false
+ formData.value.specText = SPEC_TYPE[specType.value ? 1 : 0].label
+ skus.value = peach.$store('trade').skus
+ if (specType.value) {
+ getGoodsProperty()
+ }
+ })
}
export {
- initial,
- skus,
- pickerRef,
- pickerProperty,
- propertyListRef,
- formData,
- onRDPickerConfirm,
- onPropertyConfirm,
- propertyList,
- showPropertyList,
- goodsPropertyList,
-};
+ initial,
+ skus,
+ pickerRef,
+ pickerProperty,
+ propertyListRef,
+ formData,
+ onRDPickerConfirm,
+ onPropertyConfirm,
+ propertyList,
+ showPropertyList,
+ goodsPropertyList,
+ changeSubProperty,
+}
diff --git a/pages/product/sku.vue b/pages/product/sku.vue
index 1f80a78..a19143c 100644
--- a/pages/product/sku.vue
+++ b/pages/product/sku.vue
@@ -1,34 +1,57 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
+
-
-
+
+