301 lines
6.8 KiB
JavaScript
301 lines
6.8 KiB
JavaScript
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, SKU_RULE_CONFIG } from "./config";
|
||
|
||
const pickerRef = ref(null);
|
||
|
||
// 多属性商品 sku 列表
|
||
const skus = ref([]);
|
||
|
||
const propertyList = ref([]);
|
||
|
||
const goodsPropertyList = ref([]);
|
||
|
||
const propertyListRef = ref(null);
|
||
|
||
const canEdit = computed(() => peach.$store("trade").canEdit);
|
||
|
||
const formData = ref({
|
||
specType: true,
|
||
specText: SPEC_TYPE[0].label,
|
||
});
|
||
|
||
async function showPropertyList() {
|
||
await getGoodsProperty();
|
||
propertyListRef.value.onOpen();
|
||
}
|
||
|
||
function onRDPickerConfirm(e) {
|
||
formData.value.specType = SPEC_TYPE[e.value[0]].value;
|
||
formData.value.specText = SPEC_TYPE[e.value[0]].label;
|
||
|
||
// 如果商品规格不一致,则需要重新初始化 sku 列表
|
||
initSku();
|
||
|
||
peach.$store("trade").specType = SPEC_TYPE[e.value[0]].value;
|
||
}
|
||
|
||
function pickerProperty() {
|
||
if (canEdit.value) {
|
||
let index = formData.value.specType ? 1 : 0;
|
||
|
||
console.log(index);
|
||
|
||
pickerRef.value.onOpen([index]);
|
||
}
|
||
}
|
||
|
||
async function onPropertyConfirm(e) {
|
||
await getGoodsProperty();
|
||
console.log(e);
|
||
}
|
||
|
||
function onConfirm() {
|
||
console.log(skus.value);
|
||
}
|
||
|
||
async function getGoodsProperty() {
|
||
let { data } = await GoodsApi.getHistoryProperty();
|
||
|
||
// 把 propertyList 中 id 相同的属性合并,并去重
|
||
propertyList.value = peach.$store("trade").selectedProperty;
|
||
|
||
console.log(propertyList.value);
|
||
|
||
if (propertyList.value) {
|
||
// 根据已经选择数据,设置默认选中
|
||
data.forEach((item) => {
|
||
// 判断属性是否已经选中
|
||
let propertyParent = propertyList.value.find(
|
||
(sitem) => sitem?.id === item.id
|
||
);
|
||
|
||
item.checked = propertyParent ? 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;
|
||
} else {
|
||
goodsPropertyList.value = [];
|
||
}
|
||
|
||
console.log(goodsPropertyList.value);
|
||
}
|
||
|
||
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;
|
||
}
|
||
|
||
/**
|
||
* @author Ankkaya
|
||
* @description 新增商品初始化商品 sku
|
||
* @param {Type} -
|
||
* @returns {Type}
|
||
*/
|
||
function initSku() {
|
||
// 单规格
|
||
if (!formData.value.specType) {
|
||
let obj = {
|
||
picUrl: "",
|
||
barCode: "",
|
||
price: 0,
|
||
marketPrice: 0,
|
||
costPrice: 0,
|
||
stock: 0,
|
||
weight: null,
|
||
volume: null,
|
||
properties: [
|
||
{
|
||
propertyId: 0,
|
||
propertyName: "默认",
|
||
valueId: 0,
|
||
valueName: "默认",
|
||
},
|
||
],
|
||
};
|
||
|
||
skus.value = [obj];
|
||
} else {
|
||
// 多规格
|
||
skus.value = [];
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @author Ankkaya
|
||
* @description 确认属性
|
||
* @param {Type} -
|
||
* @returns {Type}
|
||
*/
|
||
function submitProperty() {
|
||
try {
|
||
validateSku(skus.value);
|
||
peach.$store("trade").skus = skus.value;
|
||
peach.$router.back();
|
||
} catch (e) {
|
||
console.log(skus.value);
|
||
console.log(e, "校验失败");
|
||
}
|
||
}
|
||
|
||
function validateSku(skus) {
|
||
let warningInfo = "请检查商品各行相关属性配置,";
|
||
let validateStatue = true;
|
||
let skusValue = skus ?? peach.$store("trade").skus;
|
||
|
||
// 判断如果是多规格,并且 skusValue 为空 [],则提示
|
||
if (formData.value.specType && skusValue.length < 1) {
|
||
uni.showToast({
|
||
title: "请选择商品规格",
|
||
icon: "none",
|
||
duration: 4000,
|
||
});
|
||
throw new Error("请选择商品规格");
|
||
}
|
||
for (const sku of skusValue) {
|
||
for (const rule of SKU_RULE_CONFIG) {
|
||
const arg = getValue(sku, rule.name);
|
||
if (!rule.rule(arg)) {
|
||
validateStatue = false;
|
||
warningInfo += rule.message;
|
||
break;
|
||
}
|
||
}
|
||
if (!validateStatue) {
|
||
uni.showToast({
|
||
title: warningInfo,
|
||
icon: "none",
|
||
duration: 4000,
|
||
});
|
||
throw new Error(warningInfo);
|
||
}
|
||
}
|
||
}
|
||
|
||
function getValue(obj, arg) {
|
||
const keys = arg.split(".");
|
||
let value = obj;
|
||
for (const key of keys) {
|
||
if (value && typeof value === "object" && key in value) {
|
||
value = value[key];
|
||
} else {
|
||
value = undefined;
|
||
break;
|
||
}
|
||
}
|
||
return value;
|
||
}
|
||
|
||
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 || false
|
||
);
|
||
|
||
function initial() {
|
||
onLoad(() => {
|
||
formData.value.specType = specType.value ? true : false;
|
||
formData.value.specText = SPEC_TYPE[specType.value ? 1 : 0].label;
|
||
skus.value = JSON.parse(JSON.stringify(peach.$store("trade").skus));
|
||
// 如果新增商品 sku,并且是单规格,初始化 sku
|
||
|
||
if (!skus.value) {
|
||
initSku();
|
||
}
|
||
if (specType.value) {
|
||
getGoodsProperty();
|
||
}
|
||
});
|
||
}
|
||
|
||
export {
|
||
initial,
|
||
canEdit,
|
||
skus,
|
||
pickerRef,
|
||
pickerProperty,
|
||
validateSku,
|
||
onConfirm,
|
||
submitProperty,
|
||
propertyListRef,
|
||
formData,
|
||
onRDPickerConfirm,
|
||
onPropertyConfirm,
|
||
propertyList,
|
||
showPropertyList,
|
||
goodsPropertyList,
|
||
changeSubProperty,
|
||
};
|