98 lines
4.2 KiB
JavaScript
98 lines
4.2 KiB
JavaScript
import { addToFavorites, getBySkuid } from "@/api/system/favoriteProduct";
|
|
|
|
function parseMaybeJson(str) {
|
|
if (!str || typeof str !== 'string') return null;
|
|
try { return JSON.parse(str); } catch(e) { return null; }
|
|
}
|
|
|
|
function getNested(obj, path) {
|
|
try {
|
|
if (!obj) return null;
|
|
const segs = path.split('.');
|
|
let cur = obj;
|
|
for (const k of segs) {
|
|
if (cur && typeof cur === 'object' && k in cur) cur = cur[k]; else return null;
|
|
}
|
|
return cur;
|
|
} catch(e) { return null; }
|
|
}
|
|
|
|
export function parsePublishResponse(res) {
|
|
try {
|
|
const d = res && res.data ? res.data : res;
|
|
const productId = d?.product_id ?? d?.productId ?? d?.data?.product_id ?? d?.data?.productId ?? null;
|
|
const productStatus = d?.product_status ?? d?.productStatus ?? d?.data?.product_status ?? d?.data?.productStatus ?? null;
|
|
const outerId = d?.outer_id ?? d?.outerId ?? d?.data?.outer_id ?? d?.data?.outerId ?? null;
|
|
return { productId, productStatus, outerId };
|
|
} catch(e) { return { productId: null, productStatus: null, outerId: null }; }
|
|
}
|
|
|
|
function buildFavoriteFromTransfer(product, pub) {
|
|
const spuid = product?.spuid || product?.skuId || product?.skuid || '';
|
|
return {
|
|
skuid: spuid,
|
|
productName: product?.skuName || product?.title || '',
|
|
shopName: product?.shopName || '',
|
|
productUrl: product?.url || '',
|
|
productImage: Array.isArray(product?.images) && product.images.length ? product.images[0] : '',
|
|
price: (product?.price != null ? String(product.price) : (product?.lowestCouponPrice != null ? String(product.lowestCouponPrice) : '')),
|
|
commissionInfo: product?.commissionShare ? `${product.commissionShare}%` : (product?.commission != null ? String(product.commission) : ''),
|
|
remark: `自动添加 - 发品时间: ${new Date().toLocaleString()}${pub.outerId ? `, 商家编码: ${pub.outerId}` : ''}`,
|
|
productId: pub.productId,
|
|
productStatus: pub.productStatus
|
|
};
|
|
}
|
|
|
|
function buildFavoriteFromXb(child, pub) {
|
|
const jq = parseMaybeJson(child?.jsonQueryResult);
|
|
const spuid = (jq && (jq.spuid || getNested(jq, 'spuid'))) || child?.spuid || child?.skuid || '';
|
|
const shopName = getNested(jq, 'shopInfo.shopName') || child?.shopName || '';
|
|
const shopId = getNested(jq, 'shopInfo.shopId') || child?.shopId || '';
|
|
const productUrl = jq?.materialUrl || jq?.url || child?.materialUrl || child?.productUrl || '';
|
|
const productImage = getNested(jq, 'imageInfo.mainImage') || child?.productImage || '';
|
|
const price = child?.firstPrice || getNested(jq, 'priceInfo.lowestCouponPrice') || getNested(jq, 'priceInfo.price') || '';
|
|
const commissionInfo = getNested(jq, 'commissionInfo.commissionShare') ? `${getNested(jq, 'commissionInfo.commissionShare')}%` : (getNested(jq, 'commissionInfo.commission') || '');
|
|
return {
|
|
skuid: spuid,
|
|
productName: child?.skuName || child?.productName || '',
|
|
shopName,
|
|
shopId,
|
|
productUrl,
|
|
productImage,
|
|
price,
|
|
commissionInfo,
|
|
productId: pub.productId,
|
|
productStatus: pub.productStatus,
|
|
remark: `自动添加 - 发品时间: ${new Date().toLocaleString()}${pub.outerId ? `, 商家编码: ${pub.outerId}` : ''}`
|
|
};
|
|
}
|
|
|
|
export async function addToFavoritesAfterPublishFromTransfer(product, res) {
|
|
const pub = parsePublishResponse(res);
|
|
const spuid = product?.spuid || product?.skuId || product?.skuid || '';
|
|
if (!spuid) return { success: false, reason: 'no_spuid' };
|
|
try {
|
|
const exist = await getBySkuid(spuid);
|
|
if (exist && exist.data) return { success: true, skipped: true };
|
|
} catch(e) {}
|
|
const payload = buildFavoriteFromTransfer(product, pub);
|
|
const addRes = await addToFavorites(payload);
|
|
return { success: addRes && addRes.code === 200 };
|
|
}
|
|
|
|
export async function addToFavoritesAfterPublishFromXb(child, res) {
|
|
const pub = parsePublishResponse(res);
|
|
const jq = parseMaybeJson(child?.jsonQueryResult);
|
|
const spuid = (jq && (jq.spuid || getNested(jq, 'spuid'))) || child?.spuid || child?.skuid || '';
|
|
if (!spuid) return { success: false, reason: 'no_spuid' };
|
|
try {
|
|
const exist = await getBySkuid(spuid);
|
|
if (exist && exist.data) return { success: true, skipped: true };
|
|
} catch(e) {}
|
|
const payload = buildFavoriteFromXb(child, pub);
|
|
const addRes = await addToFavorites(payload);
|
|
return { success: addRes && addRes.code === 200 };
|
|
}
|
|
|
|
|