Authored by 陈峰

Merge branch 'gray' into 'master'

Gray



See merge request !361
... ... @@ -13,7 +13,7 @@
<div class="text-info">
<p>
<strong>客户服务:</strong><br/>
电话:4008899646(工作日9:00-22:30)<br/>
电话:4008899646<br/>
EMAIL:service#yoho.cn (发送邮件时请将#换成@)
</p><br/>
<p>
... ...
... ... @@ -22,7 +22,9 @@ const stepper = [
];
const index = (req, res, next) => {
let cartType = req.query.type === '2' ? 'advance' : 'ordinary';
// 6.7.5 web端下架预售购物车功能
// let cartType = req.query.type === '2' ? 'advance' : 'ordinary';
let cartType = 'ordinary';
req.ctx(oeModel).index(req.user.uid, cartType).then(result => {
let header = headerModel.setSimpleHeaderData() || {};
... ... @@ -69,7 +71,9 @@ const getGiftCards = (req, res, next) => {
// 订单金额计算
const compute = (req, res, next) => {
let params = req.body;
let cartType = params.cartType === '2' ? 'advance' : 'ordinary';
// 6.7.5 web端下架预售购物车功能
// let cartType = req.query.type === '2' ? 'advance' : 'ordinary';
let cartType = 'ordinary';
if (params.sku) { // 快捷结算
req.ctx(easypayModel).getOrderComputeData(req.user.uid, 'ordinary', params).then(result => {
... ... @@ -118,7 +122,9 @@ const submitCheck = (req, res, next) => {
// 提交订单
const submit = (req, res, next) => {
let params = req.body;
let cartType = params.cartType === '2' ? 'advance' : 'ordinary';
// 6.7.5 web端下架预售购物车功能
// let cartType = req.query.type === '2' ? 'advance' : 'ordinary';
let cartType = 'ordinary';
let uid = req.user.uid;
let remoteIp = req.ip;
... ...
... ... @@ -564,7 +564,6 @@ const formatCart = (cartDataRet, uid, shoppingKey, cartDelList) => {
// 调用接口,获取购物车数据
// let cartDataRet = yield cartApi.cartData(uid, shoppingKey);
let cartData = cartDataRet && cartDataRet.data;
let advCartData = _.get(cartData, 'advance_cart_data');
let ordCartData = _.get(cartData, 'ordinary_cart_data');
// 移除的商品列表
... ... @@ -582,20 +581,23 @@ const formatCart = (cartDataRet, uid, shoppingKey, cartDelList) => {
// 预售购物车,普通购物车 凑单链接
result.moreGoodsLink = '//list.yohobuy.com/new';
result.advanceCart = {
// 未参加活动的商品
// goodsList: chelper.formatCartGoods(_.get(advCartData, 'goods_list'), true, false, false, analysisData),
pools: formatPromotionPools(_.get(advCartData, 'goods_pool_list'), null, true, analysisData),
offShelves: formatOffShelves(_.get(advCartData, 'off_shelves_goods_list'), true, analysisData),
soldOuts: formatSoldOuts(_.get(advCartData, 'sold_out_goods_list'), true, analysisData),
promotionInfos: formatPromotionInfos(_.get(advCartData, 'promotion_info')),
stat: formatShoppingCartData(_.get(advCartData, 'shopping_cart_data')),
isShippingCostFree: _.get(advCartData, 'shipping_cost_prompt.is_shipping_cost_free', '') === 'Y',
tips: _.get(advCartData, 'shipping_cost_prompt.shipping_cost_tips', ''),
ensureUrl: helpers.urlFormat('/cart/ensure', {
type: 2
})
};
// 6.7.5 web端下架预售购物车功能
result.advanceCart = {};
// let advCartData = _.get(cartData, 'advance_cart_data');
// result.advanceCart = {
// // 未参加活动的商品
// // goodsList: chelper.formatCartGoods(_.get(advCartData, 'goods_list'), true, false, false, analysisData),
// pools: formatPromotionPools(_.get(advCartData, 'goods_pool_list'), null, true, analysisData),
// offShelves: formatOffShelves(_.get(advCartData, 'off_shelves_goods_list'), true, analysisData),
// soldOuts: formatSoldOuts(_.get(advCartData, 'sold_out_goods_list'), true, analysisData),
// promotionInfos: formatPromotionInfos(_.get(advCartData, 'promotion_info')),
// stat: formatShoppingCartData(_.get(advCartData, 'shopping_cart_data')),
// isShippingCostFree: _.get(advCartData, 'shipping_cost_prompt.is_shipping_cost_free', '') === 'Y',
// tips: _.get(advCartData, 'shipping_cost_prompt.shipping_cost_tips', ''),
// ensureUrl: helpers.urlFormat('/cart/ensure', {
// type: 2
// })
// };
// let giftsList = formatPriceGifts(_.get(ordCartData, 'gift_list'));
// let priceGifts = formatPriceGifts(_.get(ordCartData, 'price_gift'));
... ...
... ... @@ -10,12 +10,15 @@ const cache = global.yoho.cache;
const logger = global.yoho.logger;
const helpers = global.yoho.helpers;
const _ = require('lodash');
const $ = require('cheerio');
const SearchServiceModel = require('./search-api');
const GuangServiceModel = require('../../guang/models/guang-service');
const productProcess = require('../../../utils/product-process');
const uuid = require('uuid');
const specialDescCache = {};
function _cacheGet(key) {
return cache.get(key).then((data) => {
if (data) {
... ... @@ -236,6 +239,36 @@ module.exports = class extends global.yoho.BaseModel {
});
}
/**
* 特别说明
*/
getSpecialDesc(skn) {
let now = new Date().getTime();
if (specialDescCache.time && now - specialDescCache.time < ONE_HOUR * 1000) {
return Promise.resolve(specialDescCache.value);
}
return this.get({
data: {
method: 'app.product.intro',
product_skn: skn,
app_version: '5.6.0'
},
param: {cache: true}
}).then(result => {
result = _.isString(result) ? result : '';
result = $.load(result);
result = result('.price-description > .price-desc-detail');
specialDescCache.time = now;
specialDescCache.value = result.html() || '';
return specialDescCache.value;
});
}
// 根据mid_sort从redis获取分类下的hot关键词
_getRecommendHotKeywords(midSort, skn) { // eslint-disable-line
return redis.all([['get', `global:yoho:seo:hot:keywords:${midSort}:page`]]).then(res => {
... ...
... ... @@ -46,7 +46,8 @@ function _getProductIntroAsync(productId, productSkn) {
sizeInfo: this.productAPI.sizeInfoAsync(productSkn),
productComfort: this.productAPI.getProductComfortAsync(productId),
productModelTry: this.productAPI.getProductModelTryAsync(productSkn),
banner: this.productAPI.getProductBannerAsync(productId)
banner: this.productAPI.getProductBannerAsync(productId),
specialDesc: this.productAPI.getSpecialDesc(productSkn)
});
return result;
... ... @@ -911,6 +912,9 @@ function _getIntroInfo(productSkn, maxSortId, additionalData) {
// 商品详情页介绍
result.details = _getDetailDataBySizeInfo(sizeInfo);
// 特别说明
result.specialDesc = additionalData.specialDesc;
return result;
}
... ... @@ -1036,6 +1040,9 @@ function _detailDataPkg(origin, uid, vipLevel, cookies) {
result.goCartUrl = helpers.urlFormat('/cart/cart');
// 普通预售
result.presale = propOrigin('is_advance', 'N');
// 定金预售
result.deposit = propOrigin('is_deposit_advance', 'N');
... ... @@ -1194,9 +1201,6 @@ function _detailDataPkg(origin, uid, vipLevel, cookies) {
result.presalePrice = result.marketPrice;
delete result.marketPrice;
}
// 普通预售
result.presale = 'Y';
}
result.img = skuData.defaultImage;
... ... @@ -1252,6 +1256,7 @@ function _detailDataPkg(origin, uid, vipLevel, cookies) {
// 是否显示虚拟商品,立即购买按钮
result.isVirtualBtn = soldOut ? false : true;
result.hideCollect = true;
}
if (!soldOut && !notForSale && !virtualGoods) {
... ... @@ -1270,6 +1275,12 @@ function _detailDataPkg(origin, uid, vipLevel, cookies) {
delete result.fashTopGoods;
}
// 普通预售商品
if (result.presale === 'Y') {
result.addToCart = false;
result.hideCollect = true;
}
// 预上架普通商品
let isPreShelve = _isPreShelves(origin); // 预上架普通商品
... ... @@ -1576,6 +1587,7 @@ function showMainAsync(req, data) {
// 最近浏览,最多5条记录
result.detail.latestWalk = 5;
return result;
}).bind(this)().catch(console.log);
}
... ...
... ... @@ -37,6 +37,7 @@
{{> product/introduction}}
{{> product/comment}}
{{> product/consult}}
{{> product/special-desc}}
</div>
</div>
... ...
... ... @@ -161,7 +161,7 @@
<span id="enable-notify" class="buy-btn hide"> <i class="iconfont">
&#xe6e2;</i> <span>到货通知</span></span>
{{#unless isVirtualBtn}}
{{#unless hideCollect}}
<span id="collect-product" class="{{#if isCollect}}coled {{/if}}collect-product">
<i class="iconfont">&#xe641;</i> {{#if isCollect}} <em>已收藏</em> {{^}} <em>收藏商品</em> {{/if}}
</span>
... ...
{{#if specialDesc}}
<div class="special-desc info-block getnav">
<p class="block-title">
<span class="title-head"> <span class="title cur">特别说明</span> </span>
</p>
<div class="special-desc-content">
{{{specialDesc}}}
</div>
</div>
{{/if}}
... ...
{
"name": "yohobuy-node",
"version": "6.6.11",
"version": "6.6.12",
"private": true,
"description": "A New Yohobuy Project With Express",
"repository": {
... ...
... ... @@ -1765,6 +1765,31 @@
}
}
.special-desc {
margin-top: 82px;
.special-desc-content {
font-size: 14px;
line-height: 1.5;
font-weight: 300;
margin-top: -10px;
> p {
margin-bottom: 14px;
}
.price-item-name {
color: #000;
padding-top: 6px;
font-weight: normal;
}
.price-summary {
margin-top: 28px;
}
}
}
.after-service {
text-align: center;
margin-top: 30px;
... ...