This commit is contained in:
2025-08-24 19:17:09 +08:00
parent 4b4d0cb755
commit 2d4f31a116
4 changed files with 124 additions and 167 deletions

View File

@@ -0,0 +1,97 @@
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 };
}