Authored by 郭成尧

'合并门票'

@@ -136,7 +136,7 @@ const _getChannelResource = (params) => { @@ -136,7 +136,7 @@ const _getChannelResource = (params) => {
136 if (result && result.code === 200) { 136 if (result && result.code === 200) {
137 return resourcesProcess(result.data.list); 137 return resourcesProcess(result.data.list);
138 } else { 138 } else {
139 - logger.error('api index content resource code no 200'); 139 + logger.error('index resouce is not 200');
140 return result; 140 return result;
141 } 141 }
142 }); 142 });
@@ -156,7 +156,7 @@ const _getLeftNav = (choosed) => { @@ -156,7 +156,7 @@ const _getLeftNav = (choosed) => {
156 if (result && result.code === 200) { 156 if (result && result.code === 200) {
157 return _processSideBar(result.data, choosed); 157 return _processSideBar(result.data, choosed);
158 } else { 158 } else {
159 - logger.error('api left nav code no 200'); 159 + logger.error('sidebar code is not 200');
160 return result; 160 return result;
161 } 161 }
162 }); 162 });
@@ -191,7 +191,7 @@ const _getChannelList = () => { @@ -191,7 +191,7 @@ const _getChannelList = () => {
191 }); 191 });
192 return Object.keys(list).length ? list : channelList; 192 return Object.keys(list).length ? list : channelList;
193 } else { 193 } else {
194 - logger.error('api channel select data code no 200'); 194 + logger.error('channel select code is not 200');
195 return channelList; 195 return channelList;
196 } 196 }
197 }); 197 });
@@ -210,7 +210,7 @@ const _getChannelBg = () => { @@ -210,7 +210,7 @@ const _getChannelBg = () => {
210 if (result && result.code === 200) { 210 if (result && result.code === 200) {
211 return result.data.length && result.data[0] && result.data[0].data && result.data[0].data.list[0]; 211 return result.data.length && result.data[0] && result.data[0].data && result.data[0].data.list[0];
212 } else { 212 } else {
213 - logger.error('api background img of channel select page code no 200'); 213 + logger.error('channel select background code is not 200');
214 return { 214 return {
215 src: '' 215 src: ''
216 }; 216 };
@@ -12,6 +12,8 @@ const comment = require('./consult-comment'); @@ -12,6 +12,8 @@ const comment = require('./consult-comment');
12 const api = global.yoho.API; 12 const api = global.yoho.API;
13 const helpers = global.yoho.helpers; 13 const helpers = global.yoho.helpers;
14 14
  15 +const SINGLE_TICKETS_SKN = 51257524;// 展览票
  16 +
15 /** 17 /**
16 * 获取用户数据信息 18 * 获取用户数据信息
17 * @param {[string]} uid 19 * @param {[string]} uid
@@ -150,6 +152,9 @@ const _detailDataPkg = (origin, uid, vipLevel, ua) => { @@ -150,6 +152,9 @@ const _detailDataPkg = (origin, uid, vipLevel, ua) => {
150 152
151 dest.goodsName = origin.productName; 153 dest.goodsName = origin.productName;
152 154
  155 + // 是否是虚拟商品
  156 + dest.virtualGoods = origin.attribute * 1 === 3 ? true : false;
  157 +
153 // 用户未登录时 158 // 用户未登录时
154 if (!uid) { 159 if (!uid) {
155 let params = {}; 160 let params = {};
@@ -507,6 +512,31 @@ const _detailDataPkg = (origin, uid, vipLevel, ua) => { @@ -507,6 +512,31 @@ const _detailDataPkg = (origin, uid, vipLevel, ua) => {
507 dest.introUrl = '/product/detail/intro/' + origin.erpProductId; 512 dest.introUrl = '/product/detail/intro/' + origin.erpProductId;
508 dest.id = origin.id; 513 dest.id = origin.id;
509 514
  515 + // 虚拟商品(门票)
  516 + if (origin.attribute * 1 === 3) {
  517 + dest.tickets = true;
  518 + dest.ticketsConfirm = helpers.urlFormat('/cart/index/ticketsConfirm');
  519 +
  520 + // 展览票
  521 + if (origin.erpProductId * 1 === SINGLE_TICKETS_SKN) {
  522 + dest.single = true;
  523 + } else {
  524 + // 套票
  525 + dest.package = true;
  526 + }
  527 +
  528 + // 购票限制
  529 + dest.cartInfo.limit = 4;
  530 +
  531 + // 清空活动
  532 + dest.goodsDiscount = [];
  533 +
  534 + // 来自登录页,自动弹出选择框
  535 + // if (isset($_GET['product_type']) && $_GET['product_type'] == 'ticket') {
  536 + // $result['showPannel'] = true;
  537 + // }
  538 + }
  539 +
510 return dest; 540 return dest;
511 }; 541 };
512 542
@@ -135,8 +135,7 @@ @@ -135,8 +135,7 @@
135 <a href="{{cartUrl}}" class="num-incart iconfont"><span class="num-tag hide"></span>&#xe62c;</a> 135 <a href="{{cartUrl}}" class="num-incart iconfont"><span class="num-tag hide"></span>&#xe62c;</a>
136 136
137 {{#if addToCartUrl}} 137 {{#if addToCartUrl}}
138 - <!-- <a id="addtoCart" href="{{addToCartUrl}}" class="addto-cart">加入购物车</a> -->  
139 - <a id="addtoCart" href="javascript:;" class="addto-cart">加入购物车</a> 138 + <a id="addtoCart" href="javascript:;" class="addto-cart">{{#if ../tickets}}立即购买{{else}}加入购物车{{/if}}</a>
140 {{/if}} 139 {{/if}}
141 140
142 {{#if soldOut}} 141 {{#if soldOut}}
@@ -183,5 +182,16 @@ @@ -183,5 +182,16 @@
183 <input type="hidden" name="loginUrl" id="loginUrl" value="{{.}}"> 182 <input type="hidden" name="loginUrl" id="loginUrl" value="{{.}}">
184 {{/loginUrl}} 183 {{/loginUrl}}
185 184
  185 + {{#if tickets}}
  186 + <form id="buyNowForm" method="post" action="{{ticketsConfirm}}">
  187 + <input type="hidden" name="productSku" id="productSku">
  188 + <input type="hidden" name="buyNumber" id="buyNumber">
  189 + </form>
  190 + {{/if}}
  191 +
  192 + {{#if showPannel}}
  193 + <input type="hidden" id="showPannel" value="1">
  194 + {{/if}}
  195 +
186 </div> 196 </div>
187 {{/ result}} 197 {{/ result}}
1 {{#cartInfo}} 1 {{#cartInfo}}
2 <div class="chose-panel"> 2 <div class="chose-panel">
3 <div class="main"> 3 <div class="main">
4 - <div class="infos"> 4 + <div class="infos {{#if ../tickets}}tickets-info{{/if}}">
5 <div class="basic-info" > 5 <div class="basic-info" >
6 {{#thumbs}} 6 {{#thumbs}}
7 <img class="thumb {{#unless @first}}hide{{/unless}}" src={{image img 60 60}}> 7 <img class="thumb {{#unless @first}}hide{{/unless}}" src={{image img 60 60}}>
@@ -18,7 +18,7 @@ @@ -18,7 +18,7 @@
18 </div> 18 </div>
19 <div class="chose-items"> 19 <div class="chose-items">
20 <div class="color-list block-list"> 20 <div class="color-list block-list">
21 - <span>颜色</span> 21 + <span>{{#if ../tickets}}日期{{else}}颜色{{/if}}</span>
22 {{# colors}} 22 {{# colors}}
23 <ul id="{{id}}" data-index="{{@index}}" class="size-row clearfix {{#unless @first}}hide{{/unless}}"> 23 <ul id="{{id}}" data-index="{{@index}}" class="size-row clearfix {{#unless @first}}hide{{/unless}}">
24 {{# color}} 24 {{# color}}
@@ -29,8 +29,8 @@ @@ -29,8 +29,8 @@
29 </ul> 29 </ul>
30 {{/ colors}} 30 {{/ colors}}
31 </div> 31 </div>
32 - <div class="size-list block-list">  
33 - <span>尺码</span> 32 + <div class="size-list block-list {{#if ../single}}hide{{/if}}">
  33 + <span>{{#if ../tickets}}区域{{else}}尺码{{/if}}</span>
34 {{# sizes}} 34 {{# sizes}}
35 <ul class="size-row clearfix {{#unless @first}}hide{{/unless}}"> 35 <ul class="size-row clearfix {{#unless @first}}hide{{/unless}}">
36 {{# size}} 36 {{# size}}
@@ -41,7 +41,7 @@ @@ -41,7 +41,7 @@
41 </ul> 41 </ul>
42 {{/ sizes}} 42 {{/ sizes}}
43 </div> 43 </div>
44 - <p> 44 +
45 <div class="num"> 45 <div class="num">
46 <span>数量</span> 46 <span>数量</span>
47 <div class="clearfix"> 47 <div class="clearfix">
@@ -55,13 +55,16 @@ @@ -55,13 +55,16 @@
55 </div> 55 </div>
56 <span class="left-num"></span> 56 <span class="left-num"></span>
57 <input id="left-num" type="hidden" value="0"> 57 <input id="left-num" type="hidden" value="0">
  58 + <input id="limitNum" type="hidden" value="{{limit}}">
58 </div> 59 </div>
  60 +
59 </div> 61 </div>
60 </div> 62 </div>
61 <div class="btn-wrap"> 63 <div class="btn-wrap">
62 - <button id="chose-btn-sure" class="btn btn-sure">加入购物车</button> 64 + <button id="chose-btn-sure" class="btn btn-sure">{{#if ../tickets}}立即购买{{else}}加入购物车{{/if}}</button>
63 </div> 65 </div>
64 </div> 66 </div>
65 </div> 67 </div>
66 {{/cartInfo}} 68 {{/cartInfo}}
67 -<input id="promotionId" type="hidden" value="{{promotionId}}">  
  69 +<input id="promotionId" type="hidden" value="{{promotionId}}">
  70 +<input id="single" type="hidden" value="{{single}}">
@@ -10,6 +10,7 @@ @@ -10,6 +10,7 @@
10 // 增加init函数,异步请求的接口需要重新初始化一下选择列表 10 // 增加init函数,异步请求的接口需要重新初始化一下选择列表
11 // 异步渲染的模板统一插入 #chose-panel ,兼容页面多个选择框 11 // 异步渲染的模板统一插入 #chose-panel ,兼容页面多个选择框
12 12
  13 +
13 var $ = require('yoho-jquery'), 14 var $ = require('yoho-jquery'),
14 tip = require('../plugin/tip'), 15 tip = require('../plugin/tip'),
15 loading = require('../plugin/loading'); 16 loading = require('../plugin/loading');
@@ -37,7 +38,14 @@ var $chosePanel = $('#chose-panel'), @@ -37,7 +38,14 @@ var $chosePanel = $('#chose-panel'),
37 $choseArea, 38 $choseArea,
38 $cartBar, 39 $cartBar,
39 $soonSoldOut = $('.soonSoldOut-tag'), 40 $soonSoldOut = $('.soonSoldOut-tag'),
40 - $yohoPage = $('.yoho-page'); 41 + $yohoPage = $('.yoho-page'),
  42 +
  43 + // 门票 限购数量
  44 + ticketsLimit = $('#limitNum').val() || 0,
  45 + single = $('#single').val() || 0,
  46 + $productSku = $('#productSku'),
  47 + $buyNumber = $('#buyNumber'),
  48 + $buyNowForm = $('#buyNowForm');
41 49
42 // 购物车编辑标相关变量 50 // 购物车编辑标相关变量
43 var isEdit, 51 var isEdit,
@@ -66,7 +74,6 @@ function init() { @@ -66,7 +74,6 @@ function init() {
66 hasChooseColor = false; 74 hasChooseColor = false;
67 hasChooseSize = false; 75 hasChooseSize = false;
68 $curSizeBlock = null; 76 $curSizeBlock = null;
69 -  
70 queryString = $.queryString(); 77 queryString = $.queryString();
71 $imgsThumb = $('.chose-panel').find('.thumb'); 78 $imgsThumb = $('.chose-panel').find('.thumb');
72 $choseArea = $('.chose-panel .main .chose-items'); 79 $choseArea = $('.chose-panel .main .chose-items');
@@ -126,7 +133,35 @@ function removePannel() { @@ -126,7 +133,35 @@ function removePannel() {
126 } 133 }
127 } 134 }
128 135
  136 +// 检查门票选择
  137 +function checkTickets() {
  138 + if (!hasChooseColor && !hasChooseSize) {
  139 + if (single) {
  140 + tip.show('请选择日期~');
  141 + } else {
  142 + tip.show('请选择日期和区域~');
  143 + }
  144 + return false;
  145 + } else if (!hasChooseColor) {
  146 + tip.show('请选择日期~');
  147 + return false;
  148 + } else if (!hasChooseSize && !single) {
  149 + tip.show('请选择区域~');
  150 + return false;
  151 + }
  152 + return true;
  153 +}
  154 +
129 function checkColorSizeNum() { 155 function checkColorSizeNum() {
  156 +
  157 + if (ticketsLimit) {
  158 +
  159 + // 门票
  160 + if (!checkTickets()) {
  161 + return;
  162 + }
  163 + }
  164 +
130 if (!hasChooseColor && !hasChooseSize) { 165 if (!hasChooseColor && !hasChooseSize) {
131 tip.show('请选择颜色和尺码~'); 166 tip.show('请选择颜色和尺码~');
132 return false; 167 return false;
@@ -140,8 +175,6 @@ function checkColorSizeNum() { @@ -140,8 +175,6 @@ function checkColorSizeNum() {
140 return true; 175 return true;
141 } 176 }
142 177
143 -  
144 -  
145 function show(html, cb) { 178 function show(html, cb) {
146 if (html) { 179 if (html) {
147 $chosePanel.html(html); 180 $chosePanel.html(html);
@@ -174,7 +207,7 @@ function updateConformButtonClassAndText() { @@ -174,7 +207,7 @@ function updateConformButtonClassAndText() {
174 $chosed = $allChoseItems.find('.chosed'); 207 $chosed = $allChoseItems.find('.chosed');
175 if ($chosed.closest('.zero-stock').length === 2) { 208 if ($chosed.closest('.zero-stock').length === 2) {
176 $('#chose-btn-sure').css('background-color', '#c0c0c0').html('已售罄'); 209 $('#chose-btn-sure').css('background-color', '#c0c0c0').html('已售罄');
177 - } else if (limitProductCode) { 210 + } else if (limitProductCode || ticketsLimit) {
178 $('#chose-btn-sure').css('background-color', '#eb0313').html('立即购买'); 211 $('#chose-btn-sure').css('background-color', '#eb0313').html('立即购买');
179 } else { 212 } else {
180 $('#chose-btn-sure').css('background-color', '#eb0313').html(isEdit ? '确认' : '加入购物车'); 213 $('#chose-btn-sure').css('background-color', '#eb0313').html(isEdit ? '确认' : '加入购物车');
@@ -184,7 +217,14 @@ function updateConformButtonClassAndText() { @@ -184,7 +217,14 @@ function updateConformButtonClassAndText() {
184 // 显示剩余件数 217 // 显示剩余件数
185 function displayGoodNum(curGoodNum) { 218 function displayGoodNum(curGoodNum) {
186 219
187 - // 数量大于0 220 + // 门票限购
  221 + if (ticketsLimit) {
  222 + $allChoseItems.find('.num .left-num').html('限购' + ticketsLimit + '件');
  223 + $leftNum.val(curGoodNum);
  224 + return;
  225 + }
  226 +
  227 + // 数量大于
188 if (curGoodNum > 0) { 228 if (curGoodNum > 0) {
189 if ($soonSoldOut.length > 0) { 229 if ($soonSoldOut.length > 0) {
190 $allChoseItems.find('.num .left-num').html('即将售罄'); 230 $allChoseItems.find('.num .left-num').html('即将售罄');
@@ -204,6 +244,7 @@ function displayGoodNum(curGoodNum) { @@ -204,6 +244,7 @@ function displayGoodNum(curGoodNum) {
204 // 老的选中尺码去掉勾选,新的选中尺码加上勾选 244 // 老的选中尺码去掉勾选,新的选中尺码加上勾选
205 function changeSizeChosed(newSizeIndex) { 245 function changeSizeChosed(newSizeIndex) {
206 var sizes, 246 var sizes,
  247 + queryString,
207 i; 248 i;
208 249
209 if (curColorIndex && $curSizeBlock && $curSizeBlock.length > 0) { 250 if (curColorIndex && $curSizeBlock && $curSizeBlock.length > 0) {
@@ -247,6 +288,38 @@ function changeColorChosed(newColorIndex) { @@ -247,6 +288,38 @@ function changeColorChosed(newColorIndex) {
247 return 0; 288 return 0;
248 } 289 }
249 290
  291 +// 添加门票
  292 +function addTickets(productSku, buyNumber) {
  293 + var data = {
  294 + productSku: productSku,
  295 + buyNumber: buyNumber
  296 + };
  297 +
  298 + // 校验电子票
  299 + $.ajax({
  300 + url: '/cart/index/checkTickets',
  301 + dataType: 'json',
  302 + data: data,
  303 + type: 'post',
  304 + success: function(addRestult) {
  305 + if (addRestult.code !== 200) {
  306 + if (addRestult.code === 401) {
  307 + window.location.href = '//m.yohobuy.com/signin.html?refer=' + window.location.href;
  308 + }
  309 + tip.show(addRestult.message);
  310 + } else {
  311 + $productSku.val(productSku);
  312 + $buyNumber.val(buyNumber);
  313 + $buyNowForm.submit();
  314 + }
  315 + },
  316 + error: function() {
  317 + tip.show('网络异常~');
  318 + }
  319 +
  320 + });
  321 +}
  322 +
250 init(); 323 init();
251 324
252 325
@@ -327,6 +400,20 @@ $yohoPage.on('touchstart', '.color-list .block', function() { @@ -327,6 +400,20 @@ $yohoPage.on('touchstart', '.color-list .block', function() {
327 400
328 // 设置按钮的样式和文字 401 // 设置按钮的样式和文字
329 updateConformButtonClassAndText(); 402 updateConformButtonClassAndText();
  403 +
  404 + // 展览票
  405 + if (ticketsLimit && single) {
  406 + // 选中日期
  407 + $curSizeBlock = $('.size-list .size-row .block').eq(index + 1);
  408 + $curSizeBlock.addClass('chosed');
  409 +
  410 + // 显示剩余数量
  411 + displayGoodNum($curColorBlock.data('num'));
  412 + hasChooseSize = true;
  413 + return false;
  414 + }
  415 +
  416 +
330 }).on('touchstart', '.size-list .block', function() { 417 }).on('touchstart', '.size-list .block', function() {
331 var $this = $(this), 418 var $this = $(this),
332 index, 419 index,
@@ -391,7 +478,7 @@ $yohoPage.on('touchstart', '.btn-minus', function() { @@ -391,7 +478,7 @@ $yohoPage.on('touchstart', '.btn-minus', function() {
391 return; 478 return;
392 } 479 }
393 480
394 - if (num === 1 || (leftNum - 0) === 0) { 481 + if (num === 1 || leftNum - 0 === 0) {
395 tip.show('您选择的数量不能为零~'); 482 tip.show('您选择的数量不能为零~');
396 return; 483 return;
397 } 484 }
@@ -402,9 +489,10 @@ $yohoPage.on('touchstart', '.btn-minus', function() { @@ -402,9 +489,10 @@ $yohoPage.on('touchstart', '.btn-minus', function() {
402 489
403 $num.val(num - 1); 490 $num.val(num - 1);
404 }).on('touchstart', '.btn-plus', function() { 491 }).on('touchstart', '.btn-plus', function() {
405 - var num = parseInt($num.val(), 10); 492 + var num = parseInt($num.val(), 10),
  493 + maxTips = ticketsLimit ? '每人只可购买' + ticketsLimit + '张当日门票' : '您选择的数量超过了最大库存量~';
406 494
407 - leftNum = $('#left-num').val(); 495 + leftNum = ticketsLimit || $('#left-num').val();
408 496
409 if (!checkColorSizeNum()) { 497 if (!checkColorSizeNum()) {
410 return; 498 return;
@@ -416,7 +504,7 @@ $yohoPage.on('touchstart', '.btn-minus', function() { @@ -416,7 +504,7 @@ $yohoPage.on('touchstart', '.btn-minus', function() {
416 504
417 // TODO:库存数验证 505 // TODO:库存数验证
418 if (num > leftNum - 1) { 506 if (num > leftNum - 1) {
419 - tip.show('您选择的数量超过了最大库存量~'); 507 + tip.show(maxTips);
420 return; 508 return;
421 } 509 }
422 $num.val(num + 1); 510 $num.val(num + 1);
@@ -458,9 +546,18 @@ $yohoPage.on('touchstart', '.btn-minus', function() { @@ -458,9 +546,18 @@ $yohoPage.on('touchstart', '.btn-minus', function() {
458 return false; 546 return false;
459 } 547 }
460 548
461 - confirming = true; 549 + if (!ticketsLimit) {
  550 + confirming = true;
  551 + }
  552 +
462 loading.showLoadingMask(); 553 loading.showLoadingMask();
463 554
  555 + // 立即购买门票
  556 + if (ticketsLimit) {
  557 + addTickets(productSku, buyNumber);
  558 + return;
  559 + }
  560 +
464 // 针对是否处于编辑模式设置不同的url和需要post的数据 561 // 针对是否处于编辑模式设置不同的url和需要post的数据
465 if (isEdit) { 562 if (isEdit) {
466 cartGoodData = { 563 cartGoodData = {