Authored by 郝肖肖

门票

@@ -10,6 +10,8 @@ const api = global.yoho.API; @@ -10,6 +10,8 @@ const api = global.yoho.API;
10 const _ = require('lodash'); 10 const _ = require('lodash');
11 const helpers = global.yoho.helpers; 11 const helpers = global.yoho.helpers;
12 12
  13 +const SINGLE_TICKETS_SKN = 51257524;// 展览票
  14 +
13 /** 15 /**
14 * 获取用户数据信息 16 * 获取用户数据信息
15 * @param {[string]} uid 17 * @param {[string]} uid
@@ -147,8 +149,10 @@ const _detailDataPkg = (origin, uid, vipLevel, ua) => { @@ -147,8 +149,10 @@ const _detailDataPkg = (origin, uid, vipLevel, ua) => {
147 } 149 }
148 150
149 dest.goodsName = origin.productName; 151 dest.goodsName = origin.productName;
150 - //是否是虚拟商品 152 +
  153 + // 是否是虚拟商品
151 dest.virtualGoods = origin.attribute * 1 === 3 ? true : false; 154 dest.virtualGoods = origin.attribute * 1 === 3 ? true : false;
  155 +
152 // 用户未登录时 156 // 用户未登录时
153 if (!uid) { 157 if (!uid) {
154 let params = {}; 158 let params = {};
@@ -528,6 +532,31 @@ const _detailDataPkg = (origin, uid, vipLevel, ua) => { @@ -528,6 +532,31 @@ const _detailDataPkg = (origin, uid, vipLevel, ua) => {
528 dest.introUrl = '/product/detail/intro/' + origin.erpProductId; 532 dest.introUrl = '/product/detail/intro/' + origin.erpProductId;
529 dest.id = origin.id; 533 dest.id = origin.id;
530 534
  535 + // 虚拟商品(门票)
  536 + if (origin.attribute * 1 === 3) {
  537 + dest.tickets = true;
  538 + dest.ticketsConfirm = helpers.urlFormat('/cart/index/ticketsConfirm');
  539 +
  540 + // 展览票
  541 + if (origin.id * 1 === SINGLE_TICKETS_SKN) {
  542 + dest.single = true;
  543 + } else {
  544 + // 套票
  545 + dest.package = true;
  546 + }
  547 +
  548 + // 购票限制
  549 + dest.cartInfo.limit = 4;
  550 +
  551 + // 清空活动
  552 + dest.goodsDiscount = [];
  553 +
  554 + // 来自登录页,自动弹出选择框
  555 + // if (isset($_GET['product_type']) && $_GET['product_type'] == 'ticket') {
  556 + // $result['showPannel'] = true;
  557 + // }
  558 + }
  559 +
531 return dest; 560 return dest;
532 }; 561 };
533 562
@@ -135,7 +135,7 @@ @@ -135,7 +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="javascript:;" class="addto-cart">{{#if ../virtualGoods}}立即购买{{else}}加入购物车{{/if}}</a> 138 + <a id="addtoCart" href="javascript:;" class="addto-cart">{{#if ../tickets}}立即购买{{else}}加入购物车{{/if}}</a>
139 {{/if}} 139 {{/if}}
140 140
141 {{#if soldOut}} 141 {{#if soldOut}}
@@ -182,5 +182,16 @@ @@ -182,5 +182,16 @@
182 <input type="hidden" name="loginUrl" id="loginUrl" value="{{.}}"> 182 <input type="hidden" name="loginUrl" id="loginUrl" value="{{.}}">
183 {{/loginUrl}} 183 {{/loginUrl}}
184 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 +
185 </div> 196 </div>
186 {{/ 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>{{#if ../virtualGoods}}日期{{else}}颜色{{/if}}</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>{{#if ../virtualGoods}}区域{{else}}尺码{{/if}}</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}}
@@ -55,14 +55,16 @@ @@ -55,14 +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>
59 60
60 </div> 61 </div>
61 </div> 62 </div>
62 <div class="btn-wrap"> 63 <div class="btn-wrap">
63 - <button id="chose-btn-sure" class="btn btn-sure">{{#if ../virtualGoods}}立即购买{{else}}加入购物车{{/if}}</button> 64 + <button id="chose-btn-sure" class="btn btn-sure">{{#if ../tickets}}立即购买{{else}}加入购物车{{/if}}</button>
64 </div> 65 </div>
65 </div> 66 </div>
66 </div> 67 </div>
67 {{/cartInfo}} 68 {{/cartInfo}}
68 -<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');
@@ -127,6 +134,14 @@ function removePannel() { @@ -127,6 +134,14 @@ function removePannel() {
127 } 134 }
128 135
129 function checkColorSizeNum() { 136 function checkColorSizeNum() {
  137 +
  138 + if (ticketsLimit) {
  139 + // 门票
  140 + if (!checkTickets()) {
  141 + return;
  142 + }
  143 + }
  144 +
130 if (!hasChooseColor && !hasChooseSize) { 145 if (!hasChooseColor && !hasChooseSize) {
131 tip.show('请选择颜色和尺码~'); 146 tip.show('请选择颜色和尺码~');
132 return false; 147 return false;
@@ -140,6 +155,24 @@ function checkColorSizeNum() { @@ -140,6 +155,24 @@ function checkColorSizeNum() {
140 return true; 155 return true;
141 } 156 }
142 157
  158 +// 检查门票选择
  159 +function checkTickets() {
  160 + if (!hasChooseColor && !hasChooseSize) {
  161 + if (single) {
  162 + tip.show('请选择日期~');
  163 + } else {
  164 + tip.show('请选择日期和区域~');
  165 + }
  166 + return false;
  167 + } else if (!hasChooseColor) {
  168 + tip.show('请选择日期~');
  169 + return false;
  170 + } else if (!hasChooseSize && !single) {
  171 + tip.show('请选择区域~');
  172 + return false;
  173 + }
  174 + return true;
  175 +}
143 176
144 177
145 function show(html, cb) { 178 function show(html, cb) {
@@ -172,9 +205,9 @@ function hide() { @@ -172,9 +205,9 @@ function hide() {
172 // 修改加入购物车的文字和背景 205 // 修改加入购物车的文字和背景
173 function updateConformButtonClassAndText() { 206 function updateConformButtonClassAndText() {
174 $chosed = $allChoseItems.find('.chosed'); 207 $chosed = $allChoseItems.find('.chosed');
175 - if ($chosed.closest('.zero-stock').length === 2) { 208 + if (2 === $chosed.closest('.zero-stock').length) {
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,39 @@ function changeColorChosed(newColorIndex) { @@ -247,6 +288,39 @@ 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 + var refer = window.location.href;
  308 + window.location.href = '//m.yohobuy.com/signin.html?refer=' + refer;
  309 + }
  310 + tip.show(addRestult.message);
  311 + } else {
  312 + $productSku.val(productSku);
  313 + $buyNumber.val(buyNumber);
  314 + $buyNowForm.submit();
  315 + }
  316 + },
  317 + error: function() {
  318 + tip.show('网络异常~');
  319 + }
  320 +
  321 + });
  322 +}
  323 +
250 init(); 324 init();
251 325
252 326
@@ -314,7 +388,7 @@ $yohoPage.on('touchstart', '.color-list .block', function() { @@ -314,7 +388,7 @@ $yohoPage.on('touchstart', '.color-list .block', function() {
314 $this.siblings('.chosed').removeClass('chosed'); 388 $this.siblings('.chosed').removeClass('chosed');
315 389
316 // 特殊处理: 老的选中尺码在新选中的颜色对应尺码中不存在, 需要将颜色的第一行对应的颜色块加上勾选样式. 390 // 特殊处理: 老的选中尺码在新选中的颜色对应尺码中不存在, 需要将颜色的第一行对应的颜色块加上勾选样式.
317 - if (curGoodNum === -1) { 391 + if (-1 === curGoodNum) {
318 $curColorBlock = $($colorRowList.eq(0).children().get(index)); 392 $curColorBlock = $($colorRowList.eq(0).children().get(index));
319 $curColorBlock.addClass('chosed'); 393 $curColorBlock.addClass('chosed');
320 394
@@ -327,6 +401,20 @@ $yohoPage.on('touchstart', '.color-list .block', function() { @@ -327,6 +401,20 @@ $yohoPage.on('touchstart', '.color-list .block', function() {
327 401
328 // 设置按钮的样式和文字 402 // 设置按钮的样式和文字
329 updateConformButtonClassAndText(); 403 updateConformButtonClassAndText();
  404 +
  405 + // 展览票
  406 + if (ticketsLimit && single) {
  407 + // 选中日期
  408 + $curSizeBlock = $('.size-list .size-row .block').eq(index + 1);
  409 + $curSizeBlock.addClass('chosed');
  410 +
  411 + // 显示剩余数量
  412 + displayGoodNum($curColorBlock.data('num'));
  413 + hasChooseSize = true;
  414 + return false;
  415 + }
  416 +
  417 +
330 }).on('touchstart', '.size-list .block', function() { 418 }).on('touchstart', '.size-list .block', function() {
331 var $this = $(this), 419 var $this = $(this),
332 index, 420 index,
@@ -391,7 +479,7 @@ $yohoPage.on('touchstart', '.btn-minus', function() { @@ -391,7 +479,7 @@ $yohoPage.on('touchstart', '.btn-minus', function() {
391 return; 479 return;
392 } 480 }
393 481
394 - if (num === 1 || (leftNum - 0) === 0) { 482 + if (num === 1 || 0 === leftNum - 0) {
395 tip.show('您选择的数量不能为零~'); 483 tip.show('您选择的数量不能为零~');
396 return; 484 return;
397 } 485 }
@@ -402,21 +490,22 @@ $yohoPage.on('touchstart', '.btn-minus', function() { @@ -402,21 +490,22 @@ $yohoPage.on('touchstart', '.btn-minus', function() {
402 490
403 $num.val(num - 1); 491 $num.val(num - 1);
404 }).on('touchstart', '.btn-plus', function() { 492 }).on('touchstart', '.btn-plus', function() {
405 - var num = parseInt($num.val(), 10); 493 + var num = parseInt($num.val(), 10),
  494 + maxTips = ticketsLimit ? '每人只可购买' + ticketsLimit + '张当日门票' : '您选择的数量超过了最大库存量~';
406 495
407 - leftNum = $('#left-num').val(); 496 + leftNum = ticketsLimit || $('#left-num').val();
408 497
409 if (!checkColorSizeNum()) { 498 if (!checkColorSizeNum()) {
410 return; 499 return;
411 } 500 }
412 501
413 - if (num - 0 === leftNum || leftNum === 0) { 502 + if (num - 0 === leftNum || 0 === leftNum) {
414 return; 503 return;
415 } 504 }
416 505
417 // TODO:库存数验证 506 // TODO:库存数验证
418 if (num > leftNum - 1) { 507 if (num > leftNum - 1) {
419 - tip.show('您选择的数量超过了最大库存量~'); 508 + tip.show(maxTips);
420 return; 509 return;
421 } 510 }
422 $num.val(num + 1); 511 $num.val(num + 1);
@@ -451,16 +540,25 @@ $yohoPage.on('touchstart', '.btn-minus', function() { @@ -451,16 +540,25 @@ $yohoPage.on('touchstart', '.btn-minus', function() {
451 } 540 }
452 $chosed = $('.block-list>ul>li.chosed'); 541 $chosed = $('.block-list>ul>li.chosed');
453 542
454 - if ($chosed.length === 2 && $chosed.closest('.zero-stock').length === 0) { 543 + if (2 === $chosed.length && 0 === $chosed.closest('.zero-stock').length) {
455 productSku = $curSizeBlock.data('skuid'); 544 productSku = $curSizeBlock.data('skuid');
456 promotionId = $('#promotionId').val(); 545 promotionId = $('#promotionId').val();
457 if (confirming) { 546 if (confirming) {
458 return false; 547 return false;
459 } 548 }
460 549
461 - confirming = true; 550 + if (!ticketsLimit) {
  551 + confirming = true;
  552 + }
  553 +
462 loading.showLoadingMask(); 554 loading.showLoadingMask();
463 555
  556 + // 立即购买门票
  557 + if (ticketsLimit) {
  558 + addTickets(productSku, buyNumber);
  559 + return;
  560 + }
  561 +
464 // 针对是否处于编辑模式设置不同的url和需要post的数据 562 // 针对是否处于编辑模式设置不同的url和需要post的数据
465 if (isEdit) { 563 if (isEdit) {
466 cartGoodData = { 564 cartGoodData = {