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">&#xe621;</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">&#xe61f;</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">&#xe621;</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">&#xe61f;</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">&#xe621;</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">&#xe61f;</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">&#xe621;</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">&#xe61f;</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;
+    }
 }