'use strict'; require('../app'); const _ = require('lodash'); const helpers = global.yoho.helpers; /** * 根据性别来决定 默认图片获取字段 如果是 2、3 * * 则优先从cover_2 --》 cover_1 -- 》 images_url * 否则优先从cover_1 --》 cover_2 -- 》 images_url * */ // const _procProductImg = (product, gender, yhChannel) => { // if (gender === '2,3' || gender === '2' || gender === '3' && yhChannel === '2') { // return product.cover_2 || product.images_url || product.cover_1 || ''; // } // // return product.cover_1 || product.images_url || product.cover_2 || ''; // }; const productNameProcess = require('./product-name-process'); const toArray = (obj) => { if (_.isArray(obj)) { return obj; } let arr = []; _.forEach(obj, (v, k) => { if (_.isObject(v)) { v._key = k; } else { v = { _key: k, _value: v }; } arr.push(v); }); return arr; }; /** * 按照数组中指定字段排序二维数组 * * @param array list 需要排序的数组 * @param string key 字段名称 * @param boolean 有 desc 时候降序排列,默认为false */ const _sortListByField = (list, key, desc) => { let array = toArray(list); return array.sort(function(a, b) { a = a._key.split(',')[0] * 1; b = b._key.split(',')[0] * 1; return desc ? a < b : a > b; }); /* array = array.sort((a, b) => { let matchNumber = /([\d]+)/g; // 有键,使用键的值排序 if (a[key] && b[key]) { let numA = +(_.toArray(a[key].match(matchNumber))[0] || 0); // 取第一个出现的数字排序,如果不存在,取0 let numB = +(_.toArray(b[key].match(matchNumber))[0] || 0); return (desc ? numA > numB : numA < numB) ? -1 : 1; } // 无键, 使用本身 let numA = +(_.toArray(a._value.match(matchNumber))[0] || 0); let numB = +(_.toArray(b._value.match(matchNumber))[0] || 0); return numA < numB ? -1 : 1; }); return array;*/ }; /** * 商品搜索商品数据处理 */ exports.processProductList = (list, options) => { const pruductList = []; options = Object.assign({ showTags: true, showNew: true, showSale: true, width: 290, height: 388, isApp: false, showPoint: true, gender: '2,3' }, options); _.forEach(list, (product) => { if (!product) { return; } // 商品信息有问题,则不显示 if (!( (product.product_id && _.get(product, 'goods_list.length', 0)) || product.recommend_type )) { return; } if (product.recommend_type) { // recommend_type 对应 附加属性 let flagMap = { fashionArticle: '_isFashionArticle', seasonSort: '_isSeasonSort', hotShop: '_isHotShop', hotSearchTerm: '_isHotSearchTerm', }; let extraAttr = flagMap[product.recommend_type]; if (extraAttr) { product[extraAttr] = true; pruductList.push(product); } return; } // 如果库存为0,显示已抢完 // if (product.storage_num === 0) { // product.noStorage = true; // } // 市场价和售价一样,则不显示市场价 if (product.market_price === product.sales_price) { product.market_price = false; } // 判别默认的商品是否将默认的图片URL赋值到skn // let flag = false; // 如果设置了默认图片,就取默认的图片 // _.forEach(product.goods_list, (goods) => { // if (flag) { // return; // } // if (goods.is_default === 'Y') { // // product.default_images = procProductImg(goods); // // product.default_images = product.default_images; // flag = true; // } // }); // 如果还未赋值,则取第一个skc产品的默认图片 // if (!flag) { // product.default_images = _procProductImg(product.goods_list[0], product.gender, options.yh_channel); // } product.is_soon_sold_out = product.is_soon_sold_out === 'Y'; if (product.cn_alphabet) { product.cn_alphabet = productNameProcess(product.cn_alphabet); } product.url = helpers.urlFormat(`/product/pro_${product.product_id}_${product.goods_list[0].goods_id}/${product.cn_alphabet}.html`); // eslint-disable-line // APP访问需要加附加的参数 // 备注:如果以后APP的接口太多,可以把这边参数提取出来,变成一个公共的方法来生成,便于以后管理维护 if (options.isApp) { product.url += `?openby:yohobuy={"action":"go.productDetail","params":{"product_skn":"${product.product_skn}"}}`; // eslint-disable-line } if (options.showTags) { let tags = {}; _.forEach(product.tags, tag => { tags[tag] = true; }); product.tags = tags; if (tags.is_solded === true) { product.is_solded = true; } product.is_soon_sold_out = tags.is_soon_sold_out; } pruductList.push(product); }); return pruductList; }; /** * 处理筛选数据 * @param list * @param string | options * @return array 处理之后的筛选数据 */ exports.processFilter = (list, options) => { const filters = { classify: [] }; const filtersType = { brand: { name: '所有品牌', title: '品牌', dataId: 'id', subsName: 'brand_name', firstSub: 0, dataType: 'brand', sortNum: '1' }, color: { name: '所有颜色', title: '颜色', dataId: 'color_id', subsName: 'color_name', firstSub: 0, dataType: 'color', sortNum: '4' }, discount: { name: '所有商品', title: '折扣', dataId: 'key', subsName: 'name', firstSub: '0.1,0.9', dataType: 'p_d', sortNum: '7' }, gender: { name: '所有性别', title: '性别', dataId: 'key', subsName: 'flag', firstSub: '1,2,3', dataType: 'gender', sortNum: '0' }, group_sort: { name: '所有品类', title: '品类', dataId: 'relation_parameter', subsName: 'category_name', firstSub: 0, dataType: 'sort', sortNum: '3' }, priceRange: { name: '所有价格', title: '价格', dataId: 'key', subsName: 'flag', firstSub: 0, dataType: 'price', sortNum: '6' }, size: { name: '所有尺码', title: '尺码', dataId: 'size_id', subsName: 'size_name', firstSub: 0, dataType: 'size', sortNum: '5' }, ageLevel: { name: '所有人群', title: '人群', dataId: 'id', subsName: 'name', firstSub: 0, dataType: 'ageLevel', sortNum: '2' } }; options = Object.assign({ gender: '1,2,3', // 默认选择的性别,默认1,2,3表示所有 exclude: null // 需要排除的字段 }, options); _.forEach(list, (item, key) => { let classify = { subs: [] }; if (!filtersType[key]) { return; } if ((options.hideSize && key === 'size') || (options.hideSort && key === 'group_sort')) { return; } classify.dataType = filtersType[key].dataType; classify.name = filtersType[key].name; classify.title = filtersType[key].title; classify.subs.push({ chosed: true, dataId: filtersType[key].firstSub, name: filtersType[key].name }); // 折扣,价格区间,需要排序 if (key === 'discount' || key === 'priceRange') { item = _sortListByField(item, 'name'); } _.forEach(item, (sub, index) => { let subs = {}; if (key === 'discount') { subs.dataId = sub._key; } else if (key === 'priceRange') { subs.dataId = sub._key; } else if (filtersType[key].dataId === 'key') { subs.dataId = index; } else if (filtersType[key].dataId === 'relation_parameter') { subs.dataId = sub.relation_parameter['sort']; // eslint-disable-line } else { subs.dataId = sub[filtersType[key].dataId]; } if (key === 'priceRange') { subs.name = sub._value; } else if (filtersType[key].subsName === 'flag') { subs.name = sub; } else { subs.name = sub[filtersType[key].subsName]; if (key === 'discount') { subs.name = subs.name + '折商品'; } } classify.subs.push(subs); }); filters.classify[filtersType[key].sortNum] = classify; }); return filters; }; /** * 解析尺码弹出框数据 */ exports.processSizeInfo = (origin) => { let cartInfo = {}, thumbImageList = [], colorGroup = {}, sizeGroup = [], totalStorageNum = 0; if (origin.goods_list.length) { let goodsGroup = [], sizeName = '', colorList = [], sizeList = {}, allSizeList = {}, colorStorageGroup = {}, colorStorageNum = 0; _.forEach(origin.goods_list, function(value) { // 未上架也显示 // if (value.status === 0) { // return; // } colorStorageNum = 0; // 商品分组 if (value.images_list) { _.forEach(value.images_list, function(good) { goodsGroup.push({ goodsId: value.goods_id, img: good.image_url }); }); } // 商品的尺码列表 colorStorageGroup[value.product_skc] = {}; if (value.size_list) { sizeList[value.product_skc] = []; _.forEach(value.size_list, function(size) { sizeList[value.product_skc].push({ id: size.size_id, skuId: size.product_sku, goodsId: value.goods_id, colorId: value.color_id, name: size.size_name, sizeNum: size.storage_number, sizeInfo: size.size_info ? size.size_info : '' }); sizeName = size.size_name; // 所有尺码列表,赋值用于前端展示默认尺码的时候 // 判断出没有库存则显示灰色 let build = { id: size.size_id, storage: size.storage_number, sizeInfo: size.size_info ? size.size_info : '' }; allSizeList[sizeName] = (allSizeList[sizeName] === null || typeof allSizeList[sizeName] === 'undefined') ? build : allSizeList[sizeName]; colorStorageNum += parseInt(size.storage_number, 10); colorStorageGroup[value.product_skc][sizeName] = parseInt(size.storage_number, 10); }); // 颜色分组 colorList.push({ id: value.color_id, skcId: value.product_skc, name: value.factory_goods_name || value.color_name, colorNum: colorStorageNum }); } // 缩略图 thumbImageList.push({ img: helpers.image(value.color_image, 300, 395) }); // 商品库存总数 totalStorageNum += _.toNumber(colorStorageNum); }); // 遍历所有尺码,构建颜色显示数据 let i = 1; sizeGroup[0] = { size: [] }; _.forEach(allSizeList, (value, key) => { // 默认尺码 sizeGroup[0].size.push({ name: key, sizeNum: _.toNumber(value.storage) > 0 ? true : false, id: value.id, sizeInfo: value.sizeInfo }); colorGroup[i] = { color: [] }; // 各个颜色的尺码, 每行显示一个尺码对应的颜色 _.forEach(colorList, (colorArr) => { let tempColorArr = _.cloneDeep(colorArr); if (colorStorageGroup[tempColorArr.skcId] && colorStorageGroup[tempColorArr.skcId][key]) { tempColorArr.colorNum = colorStorageGroup[tempColorArr.skcId][key]; } else { tempColorArr.colorNum = 0; } colorGroup[i].color.push(Object.assign({}, tempColorArr)); }); colorGroup[i].id = value.id; ++i; }); colorGroup[0] = { color: [] }; // 遍历所有颜色, 构建尺码显示数据 i = 1; _.forEach(colorList, function(value) { // 各个尺码的颜色, 每行显示一个颜色的对应尺码 sizeGroup[i] = { size: sizeList[value.skcId], colorId: value.skcId }; // 默认颜色 colorGroup[0].color.push(value); ++i; }); _.orderBy(colorGroup); Object.assign(cartInfo, { productId: origin.product_id, thumbs: thumbImageList, name: origin.product_name || '', totalNum: totalStorageNum, colors: _.toArray(colorGroup), sizes: sizeGroup }); } return cartInfo; };