diff --git a/apps/shopping/controllers/cart.js b/apps/shopping/controllers/cart.js index af87a31..68f81c0 100644 --- a/apps/shopping/controllers/cart.js +++ b/apps/shopping/controllers/cart.js @@ -64,11 +64,6 @@ exports.changeProductNum = (req, res) => { } }); - // res.json({ - // code: '1000', - // num: parseInt(changeTo, 10) - 1, - // changed: false - // }); } else if (changeType === 'DECREASE') { cartModel.modifyProductNum({ decreaseNum: 1, // 默认是1 diff --git a/apps/shopping/helpers/index.js b/apps/shopping/helpers/index.js index a3792da..a4f60eb 100644 --- a/apps/shopping/helpers/index.js +++ b/apps/shopping/helpers/index.js @@ -10,7 +10,6 @@ * 乘法 * @param {[Number]} num1 * @param {[Number]} num2 - * @param {[object]} options 上下文环境,一般不手动传 * @return {[boolen]} */ exports.multiple = (num1, num2) => { @@ -23,3 +22,20 @@ exports.multiple = (num1, num2) => { console.error('multiplication needs two number parameters'); } }; + +/** + * 小于等于 + * @param {[Number]} num1 + * @param {[Number]} num2 + * @param {[object]} options 上下文环境,一般不手动传 + * @return {[boolen]} + */ +exports.lte = (num1, num2, options) => { + num1 = typeof num1 === 'number' ? num1 : parseFloat(num1, 10); + num2 = typeof num2 === 'number' ? num2 : parseFloat(num2, 10); + + if (num1 <= num2) { + return options.fn(this); + } + return options.inverse(this); +}; diff --git a/apps/shopping/models/cart.js b/apps/shopping/models/cart.js index 8a218c8..05bfc25 100644 --- a/apps/shopping/models/cart.js +++ b/apps/shopping/models/cart.js @@ -218,6 +218,9 @@ const filterCartData = (result, uid) => { _.forEach(advancedGoods, function(good) { buyNumber = parseInt(good.buy_number, 10); totalNum += buyNumber; + _.merge(good, { + left_number: parseInt(good.storage_number, 10) - buyNumber + }); if (good.selected === 'Y') { selectedAdvanceNum += buyNumber; } @@ -236,13 +239,16 @@ const filterCartData = (result, uid) => { _.forEach(ordinaryGoods, function(good) { buyNumber = parseInt(good.buy_number, 10); totalNum += buyNumber; + _.merge(good, { + left_number: parseInt(good.storage_number, 10) - buyNumber + }); if (good.selected === 'Y') { selectedOrdinaryNum += buyNumber; } }); } - // console.log('ordinaryGoods:', ordinaryGoods); + console.log('ordinaryGoods:', ordinaryGoods); return _.merge(resData, { @@ -273,7 +279,10 @@ const modifyProductNum = (options) => { const uid = options.uid; const shoppingKey = options.shoppingKey; const sku = options.sku; - const goodType = options.goodType; + const goodType = options.goodTpye; + + let buyNumber, + storageNumber; let params = { product_sku: options.sku @@ -309,14 +318,48 @@ const modifyProductNum = (options) => { product_sku: sku }); + console.log('goodType-----:', goodType); + return getCartData(shoppingKey, uid).then(function(result) { - console.log('getCartData--pre-callback-result:', result); + console.log('getCartData--pre-callback-result:', JSON.stringify(result, '', 4)); console.log('modifyProductNum---params:', params); + if (goodType === 'advance') { // 检查库存量 } else if (goodType === 'ordinary') { // 检查库存量 + _.find(result.data.ordinary_cart_data.goods_list, (goodItem) => { + if (goodItem.product_sku === sku) { + buyNumber = parseInt(goodItem.buy_number, 10); + storageNumber = parseInt(goodItem.storage_number, 10); + + // 计算剩余多少 + _.merge(goodItem, { + left_number: storageNumber - buyNumber + }); + } + }); + + // 增加 + if (increaseNum && (buyNumber + increaseNum) > storageNumber) { + return { + code: '1000', + message: '商品库存不足' + }; + } + + // else if(increaseNum && (buyNumber + 4) >= storageNumber) { + // leftNumber = storageNumber - buyNumber - 1; + // } } + + // 显示仅剩3, 2, 1件 + // if(leftNumber) { + // return api.get('', params).then(changeResult => { + // return _.merge(changeResult, {leftNumber}) + // }); + // } + return api.get('', params); }); diff --git a/apps/shopping/views/partial/cart-list.hbs b/apps/shopping/views/partial/cart-list.hbs index 891fd90..a36d1a7 100644 --- a/apps/shopping/views/partial/cart-list.hbs +++ b/apps/shopping/views/partial/cart-list.hbs @@ -58,16 +58,25 @@ </li> <li class="price-num"> <span class="price sale-price">¥\{{sales_price}}</span> - <div class="stepper" data-productId=\{{productId}}> - <div class="minus action"> + <div class="stepper" data-productType=\{{goods_type}}> + <div class="minus action \{{#isEqual buy_number 1}}disable\{{/isEqual}}"> <span class="iconfont"></span> </div> <div class="num"> <input type="text" class="input" value=\{{buy_number}} /> </div> - <div class="plus action"> + <div class="plus action \{{#isEqual left_number 0}}disable\{{/isEqual}}"> <span class="iconfont"></span> </div> + <div class="warning"> + \{{#lte left_number 3}} + \{{#if left_number}} + 仅剩\{{left_number}}件 + \{{^}} + 仅剩0件 + \{{/if}} + \{{/lte}} + </div> </div> </li> <li class="total-price-action"> @@ -122,16 +131,25 @@ </li> <li class="price-num"> <span class="price sale-price">¥\{{sales_price}}</span> - <div class="stepper" data-productId=\{{productId}}> - <div class="minus action"> + <div class="stepper" data-productType=\{{goods_type}}> + <div class="minus action \{{#isEqual buy_number 1}}disable\{{/isEqual}}"> <span class="iconfont"></span> </div> <div class="num"> <input type="text" class="input" value=\{{buy_number}} /> </div> - <div class="plus action"> + <div class="plus action \{{#isEqual left_number 0}}disable\{{/isEqual}}"> <span class="iconfont"></span> </div> + <div class="warning"> + \{{#lte left_number 3}} + \{{#if left_number}} + 仅剩\{{left_number}}件 + \{{^}} + 仅剩0件 + \{{/if}} + \{{/lte}} + </div> </div> </li> <li class="total-price-action"> @@ -175,16 +193,25 @@ </li> <li class="price-num"> <span class="price sale-price">¥\{{salesPrice}}</span> - <div class="stepper" data-productId=\{{productId}}> - <div class="minus action"> + <div class="stepper" data-productType=\{{goods_type}}> + <div class="minus action \{{#isEqual buy_number 1}}disable\{{/isEqual}}"> <span class="iconfont"></span> </div> <div class="num"> <input type="text" class="input" value=\{{buy_number}} /> </div> - <div class="plus action"> + <div class="plus action \{{#isEqual left_number 0}}disable\{{/isEqual}}"> <span class="iconfont"></span> </div> + <div class="warning"> + \{{#lte left_number 3}} + \{{#if left_number}} + 仅剩\{{left_number}}件 + \{{^}} + 仅剩0件 + \{{/if}} + \{{/lte}} + </div> </div> </li> <li class="total-price-action"> @@ -211,7 +238,7 @@ </div> <div id="remove_selected" class="action hoverable">删除选中的商品</div> <div id="send_favorite" class="action hoverable">移入收藏夹</div> - <div id="clear_invalid" class="action hoverable">清除实效商品</div> + <div id="warning_invalid" class="action hoverable">清除实效商品</div> <div class="selected-num">已选<span>\{{selectedNum}}</span>件</div> <div class="checkout-total"> <div class="total-title">商品金额:</div> diff --git a/apps/shopping/views/partial/cart/stepper.hbs b/apps/shopping/views/partial/cart/stepper.hbs index 0a6f742..4a25f6a 100644 --- a/apps/shopping/views/partial/cart/stepper.hbs +++ b/apps/shopping/views/partial/cart/stepper.hbs @@ -1,11 +1,20 @@ <div class="stepper" data-productType={{goods_type}}> - <div class="minus action"> + <div class="minus action {{#isEqual buy_number 1}}disable{{/isEqual}}"> <span class="iconfont"></span> </div> <div class="num"> <input type="text" class="input" value={{buy_number}} /> </div> - <div class="plus action"> + <div class="plus action {{#isEqual left_number 0}}disable{{/isEqual}}"> <span class="iconfont"></span> </div> + <div class="warning"> + {{#lte left_number 3}} + {{#if left_number}} + 仅剩{{left_number}}件 + {{^}} + 仅剩0件 + {{/if}} + {{/lte}} + </div> </div> \ No newline at end of file diff --git a/public/js/shopping/cart/stepper.js b/public/js/shopping/cart/stepper.js index 20413c1..a6e93c2 100644 --- a/public/js/shopping/cart/stepper.js +++ b/public/js/shopping/cart/stepper.js @@ -21,8 +21,6 @@ var Stepper = { changeType: 'DECREASE', sku: sku, goodType: goodType - - // changeTo: parseInt(currNum, 10) - 1 }, success: function(res) { Util.refreshCart(res, function() { @@ -43,15 +41,8 @@ var Stepper = { changeType: 'INCREASE', sku: sku, goodType: goodType - - // changeTo: parseInt(currNum, 10) + 1 }, success: function(res) { - // if (res.code === '0') { - // return callback(res.num, res.changed); - // } else { - // return callback(res.num, res.changed, res.code === '1000'); - // } Util.refreshCart(res, function() { Stepper.init(); }); @@ -101,7 +92,6 @@ var Stepper = { if (changed && plus.hasClass('disable')) { plus.removeClass('disable'); } - }); } }); diff --git a/public/js/shopping/cart/util.js b/public/js/shopping/cart/util.js index e743229..5e3505e 100644 --- a/public/js/shopping/cart/util.js +++ b/public/js/shopping/cart/util.js @@ -55,6 +55,16 @@ var Util = { return options.inverse(this); }); + hbs.registerHelper('lte', function(num1, num2, options) { + num1 = typeof num1 === 'number' ? num1 : parseFloat(num1, 10); + num2 = typeof num2 === 'number' ? num2 : parseFloat(num2, 10); + + if (num1 <= num2) { + return options.fn(this); + } + return options.inverse(this); + }); + hbs.registerHelper('image', function(url, width, height, mode) { mode = parseInt(mode, 10) ? mode : 2; url = url || ''; diff --git a/public/scss/shopping/_stepper.css b/public/scss/shopping/_stepper.css index 2dcd536..9226efe 100644 --- a/public/scss/shopping/_stepper.css +++ b/public/scss/shopping/_stepper.css @@ -39,4 +39,14 @@ height: 28px; text-align: center; } + + .warning { + clear: both; + text-align: center; + width: 100%; + margin-top: 5px; + color: #e8044f; + font-size: 13px; + font-weight: bold; + } }