diff --git a/app/admin/controller/Payment.php b/app/admin/controller/Payment.php index 8509e03a1..00134140a 100755 --- a/app/admin/controller/Payment.php +++ b/app/admin/controller/Payment.php @@ -67,8 +67,6 @@ class Payment extends Common // 插件更新信息 $upgrade = PaymentService::PaymentUpgradeInfo($ret['data']); MyViewAssign('upgrade_info', $upgrade['data']); - // print_r($upgrade); - // print_r($ret['data']); return MyView(); } diff --git a/app/api/controller/Goods.php b/app/api/controller/Goods.php index 26f40166a..a5c3bdb2a 100755 --- a/app/api/controller/Goods.php +++ b/app/api/controller/Goods.php @@ -187,6 +187,26 @@ class Goods extends Common return ApiService::ApiDataReturn($ret); } + /** + * 商品数量选择 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2018-12-14 + * @desc description + */ + public function Stock() + { + // 开始处理 + $params = $this->data_post; + $ret = GoodsService::GoodsStock($params); + if($ret['code'] == 0) + { + $ret['data'] = $ret['data']['spec_base']; + } + return ApiService::ApiDataReturn($ret); + } + /** * 商品分类 * @author Devil diff --git a/app/index/controller/Goods.php b/app/index/controller/Goods.php index f2db61aca..aeef4728b 100755 --- a/app/index/controller/Goods.php +++ b/app/index/controller/Goods.php @@ -179,7 +179,7 @@ class Goods extends Common $this->IsLogin(); // 开始处理 - $params = input('post.'); + $params = $this->data_post; $params['user'] = $this->user; return GoodsFavorService::GoodsFavorCancel($params); } @@ -201,7 +201,7 @@ class Goods extends Common } // 开始处理 - $params = input('post.'); + $params = $this->data_post; return GoodsService::GoodsSpecType($params); } @@ -222,10 +222,31 @@ class Goods extends Common } // 开始处理 - $params = input('post.'); + $params = $this->data_post; return GoodsService::GoodsSpecDetail($params); } + /** + * 商品数量选择 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2018-12-14 + * @desc description + */ + public function Stock() + { + // 是否ajax请求 + if(!IS_AJAX) + { + return $this->error('非法访问'); + } + + // 开始处理 + $params = $this->data_post; + return GoodsService::GoodsStock($params); + } + /** * 商品评论 * @author Devil diff --git a/app/index/view/default/cart/index.html b/app/index/view/default/cart/index.html index a478bcf19..9eafd8d82 100755 --- a/app/index/view/default/cart/index.html +++ b/app/index/view/default/cart/index.html @@ -17,7 +17,7 @@ {{include file="public/goods_category" /}} -
+
{{if !empty($cart_list)}} @@ -79,7 +79,6 @@ {{$currency_symbol}}{{$goods.original_price}} {{/if}} {{$currency_symbol}}{{$goods.price}} - x{{$goods.stock}} @@ -182,9 +181,9 @@ {{if $goods['is_error'] eq 0}} -
+
- - + +
{{else /}} diff --git a/app/index/view/default/goods/index.html b/app/index/view/default/goods/index.html index ff12ce00e..0def5a674 100755 --- a/app/index/view/default/goods/index.html +++ b/app/index/view/default/goods/index.html @@ -380,7 +380,7 @@
- +
库存{{$goods.inventory}}{{$goods.inventory_unit}} diff --git a/app/service/BuyService.php b/app/service/BuyService.php index e5a193eba..3138cc1d4 100755 --- a/app/service/BuyService.php +++ b/app/service/BuyService.php @@ -248,13 +248,13 @@ class BuyService $v['spec'] = empty($v['spec']) ? null : json_decode($v['spec'], true); // 获取商品基础信息 - $goods_base = GoodsService::GoodsSpecDetail(['id'=>$v['goods_id'], 'spec'=>$v['spec']]); + $goods_base = GoodsService::GoodsSpecDetail(['id'=>$v['goods_id'], 'spec'=>$v['spec'], 'stock'=>$v['stock']]); $v['is_invalid'] = 0; if($goods_base['code'] == 0) { $v['inventory'] = $goods_base['data']['spec_base']['inventory']; - $v['price'] = (float) $goods_base['data']['spec_base']['price']; - $v['original_price'] = (float) $goods_base['data']['spec_base']['original_price']; + $v['price'] = $goods_base['data']['spec_base']['price']; + $v['original_price'] = $goods_base['data']['spec_base']['original_price']; $v['spec_weight'] = $goods_base['data']['spec_base']['weight']; $v['spec_coding'] = $goods_base['data']['spec_base']['coding']; $v['spec_barcode'] = $goods_base['data']['spec_base']['barcode']; @@ -278,7 +278,7 @@ class BuyService $v['goods_url'] = MyUrl('index/goods/index', ['id'=>$v['goods_id']]); $v['images_old'] = $v['images']; $v['images'] = ResourcesService::AttachmentPathViewHandle($v['images']); - $v['total_price'] = $v['stock']* ((float) $v['price']); + $v['total_price'] = PriceNumberFormat($v['stock']* $v['price']); $v['buy_max_number'] = ($v['buy_max_number'] <= 0) ? $v['inventory']: $v['buy_max_number']; // 错误处理 @@ -432,28 +432,54 @@ class BuyService $stock = intval($params['stock']); // 获取购物车数据 - $cart = Db::name('Cart')->where($where)->select()->toArray(); - if(empty($cart)) + $data = Db::name('Cart')->where($where)->field('goods_id,title,price,stock,spec')->find(); + if(empty($data)) { return DataReturn('请先加入购物车', -1); } - $cart[0]['stock'] = $stock; + $data['stock'] = $stock; + $data['spec'] = empty($data['spec']) ? null : json_decode($data['spec'], true); // 商品校验 - $ret = self::BuyGoodsCheck(['goods'=>$cart]); + $ret = self::BuyGoodsCheck(['goods'=>[$data]]); if($ret['code'] != 0) { return $ret; } // 更新数据 - $data = [ + $upd_data = [ 'stock' => $stock, 'upd_time' => time(), ]; - if(Db::name('Cart')->where($where)->update($data)) + if(Db::name('Cart')->where($where)->update($upd_data)) { - return DataReturn('更新成功', 0); + // 获取商品基础信息、更新商品价格信息 + $goods_base = GoodsService::GoodsSpecDetail(['id'=>$data['goods_id'], 'spec'=>$data['spec'], 'stock'=>$data['stock']]); + if($goods_base['code'] == 0) + { + $data['price'] = (float) $goods_base['data']['spec_base']['price']; + $data['original_price'] = (float) $goods_base['data']['spec_base']['original_price']; + } + + // 增加价格总计 + $data['total_price'] = PriceNumberFormat($data['stock']*$data['price']); + + // 购物车更新成功钩子 + $hook_name = 'plugins_service_cart_update_success'; + $ret = EventReturnHandle(MyEventTrigger($hook_name, [ + 'hook_name' => $hook_name, + 'is_backend' => true, + 'params' => $params, + 'data' => &$data, + 'goods_id' => $params['goods_id'] + ])); + if(isset($ret['code']) && $ret['code'] != 0) + { + return $ret; + } + + return DataReturn('更新成功', 0, $data); } return DataReturn('更新失败', -100); } @@ -519,7 +545,7 @@ class BuyService $goods['spec'] = self::GoodsSpecificationsHandle($params); // 获取商品基础信息 - $goods_base = GoodsService::GoodsSpecDetail(['id'=>$goods['goods_id'], 'spec'=>$goods['spec']]); + $goods_base = GoodsService::GoodsSpecDetail(['id'=>$goods['goods_id'], 'spec'=>$goods['spec'], 'stock'=>$params['stock']]); if($goods_base['code'] == 0) { $goods['inventory'] = $goods_base['data']['spec_base']['inventory']; diff --git a/app/service/GoodsService.php b/app/service/GoodsService.php index 50225d8f7..c6efa2719 100755 --- a/app/service/GoodsService.php +++ b/app/service/GoodsService.php @@ -2341,6 +2341,46 @@ class GoodsService return DataReturn('没有相关规格类型', -100); } + /** + * 商品购买数量获取商品信息 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2021-10-05 + * @desc description + * @param [array] $params [输入参数] + */ + public static function GoodsStock($params = []) + { + // 请求参数 + $p = [ + [ + 'checked_type' => 'empty', + 'key_name' => 'id', + 'error_msg' => '商品id有误', + ], + [ + 'checked_type' => 'empty', + 'key_name' => 'stock', + 'error_msg' => '购买数量有误', + ], + [ + 'checked_type' => 'min', + 'key_name' => 'stock', + 'checked_data' => 1, + 'error_msg' => '购买数量有误', + ], + ]; + $ret = ParamsChecked($params, $p); + if($ret !== true) + { + return DataReturn($ret, -1); + } + + // 获取商品基础信息 + return self::GoodsSpecDetail($params); + } + /** * 获取商品分类节点数据 * @author Devil diff --git a/app/service/SystemBaseService.php b/app/service/SystemBaseService.php index 46bae15c8..b12e73e58 100644 --- a/app/service/SystemBaseService.php +++ b/app/service/SystemBaseService.php @@ -317,7 +317,7 @@ class SystemBaseService * @desc description * @param [int] $goods_id [商品id] * @param [string] $plugins [插件名称] - * @param [int] $is_use [是否使用(0否, 1是)] + * @param [int] $is_use [是否使用(0否, 1是)] */ public static function GoodsDiscountRecord($goods_id, $plugins, $is_use = 0) { diff --git a/public/static/index/default/js/cart.js b/public/static/index/default/js/cart.js index 133cb19b0..7f24004b3 100755 --- a/public/static/index/default/js/cart.js +++ b/public/static/index/default/js/cart.js @@ -17,8 +17,9 @@ $(function() { if($(this).prop('checked')) { - var stock = parseInt($(this).parents('tr').find('.stock-tag input').val()); - var price = parseFloat($(this).parents('tr').find('.stock-tag').data('price')); + var $stock = $(this).parents('tr').find('.stock-tag'); + var stock = parseInt($stock.find('input').val()); + var price = parseFloat($stock.attr('data-price')); total_stock += stock; total_price += stock*price; ids.push($(this).val()); @@ -63,28 +64,28 @@ $(function() // ajax请求 $.ajax({ - url: self.parents('.stock-tag').data('ajax-url'), + url: $('.cart-content').data('ajax-url'), type: 'post', dataType: "json", timeout: 10000, data: {"id": id, "goods_id": goods_id, "stock": stock}, - success: function(result) + success: function(res) { $.AMUI.progress.done(); - if(result.code == 0) + if(res.code == 0) { - self.parents('.stock-tag').find('input').val(stock); - self.parents('tr').find('.total-price-content').text(__currency_symbol__+FomatFloat(stock*price, 2)); - - Prompt(result.msg, 'success'); + var $stock = self.parents('.stock-tag'); + $stock.find('input').val(res.data.stock); + $stock.attr('data-price', res.data.price); + $stock.find('input').val(res.data.stock); + self.parents('tr').find('.total-price-content').text(__currency_symbol__+res.data.total_price); - // 数量更新 - self.parents('tr').find('.wap-number').text('x'+stock); + Prompt(res.msg, 'success'); // 计算选择的商品总数和总价 CartBaseTotal(); } else { - Prompt(result.msg); + Prompt(res.msg); } }, error: function(xhr, type) @@ -98,19 +99,56 @@ $(function() // 购物车数量操作 $('.stock-tag .stock-submit').on('click', function() { - var stock = parseInt($(this).parents('.stock-tag').find('input').val()); + // 数量参数 + var $parent = $(this).parents('.stock-tag'); + var $input = $parent.find('input[type="number"]'); + var min = parseInt($input.data('min-limit')); + var max = parseInt($input.data('max-limit')); + var unit = $input.data('unit') || ''; + var stock = parseInt($input.val()); var type = $(this).data('type'); - var temp_stock = (type == 'add') ? stock+1 : stock-1; + if(type == 'add') + { + var temp_stock = stock+1; + if(max > 0 && temp_stock > max) + { + $input.val(max); + Prompt('最大限购数量'+max+unit); + return false; + } + } else { + var temp_stock = stock-1; + if(temp_stock < min) + { + $input.val(min); + Prompt('最低起购数量'+min+unit); + return false; + } + } + CardNumberUpdate($(this), temp_stock); }); // 输入事件 $('.stock-tag input[type="number"]').on('blur', function() { - var stock = $(this).val() || null; - if(stock == null) + // 数量参数 + var $input = $(this); + var min = parseInt($input.data('min-limit')); + var max = parseInt($input.data('max-limit')); + var unit = $input.data('unit') || ''; + var stock = parseInt($input.val()); + if(isNaN(stock)) { - stock = 1; + stock = min; + } + if(max > 0 && stock > max) + { + stock = max; + } + if(stock < min) + { + stock = min; } $(this).val(stock); CardNumberUpdate($(this), stock); diff --git a/public/static/index/default/js/goods.js b/public/static/index/default/js/goods.js index c77a4ffaf..f6af60135 100755 --- a/public/static/index/default/js/goods.js +++ b/public/static/index/default/js/goods.js @@ -41,13 +41,13 @@ function GoodsCommentsHtml(page) type: 'POST', data: {"goods_id": $('.goods-comment').data('goods-id'), "page": page || 1}, dataType: 'json', - success: function(result) + success: function(res) { $('.goods-page-no-data').addClass('none'); - if(result.code == 0) + if(res.code == 0) { - $('.goods-comment-content').html(result.data.data); - $('.goods-page-container').html(PageLibrary(result.data.total, result.data.number, page, 2)); + $('.goods-comment-content').html(res.data.data); + $('.goods-page-container').html(PageLibrary(res.data.total, res.data.number, page, 2)); } // 没有数据 @@ -65,6 +65,34 @@ function GoodsCommentsHtml(page) }); } +/** + * 已选规格 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2021-10-05 + * @desc description + */ +function GoodsSelectedSpec() +{ + // 规格 + var spec = []; + var sku_count = $('.sku-items').length; + if(sku_count > 0) + { + var spec_count = $('.sku-line.selected').length; + if(spec_count >= sku_count) + { + $('.iteminfo_parameter .sku-items').removeClass('sku-not-active'); + $('.theme-signin-left .sku-items li.selected').each(function(k, v) + { + spec.push({"type": $(this).data('type-value'), "value": $(this).data('value')}) + }); + } + } + return spec; +} + /** * 购买/加入购物车校验 * @author Devil @@ -115,18 +143,17 @@ function BuyCartCheck(e) }); Prompt('请选择规格'); return false; - } else { - $('.iteminfo_parameter .sku-items').removeClass('sku-not-active'); - $('.theme-signin-left .sku-items li.selected').each(function(k, v) - { - spec.push({"type": $(this).data('type-value'), "value": $(this).data('value')}) - }); } + + // 已选规格 + spec = GoodsSelectedSpec(); } + var type =( typeof(e) == 'object') ? e.attr('data-type') : null; return { + "id": $('.goods-detail').data('id'), "stock": stock, "spec": spec, - "type": e.attr('data-type') + "type": type }; } @@ -175,6 +202,50 @@ function BuyCartHandle(e) return true; } +/** + * 商品规格详情返回数据处理 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2021-10-05 + * @desc description + * @param {[object]} data [后端返回数据] + */ +function GoodsSpecDetailBackHandle(data) +{ + $('.text-info .price-now').text(__currency_symbol__+data.spec_base.price); + $('.goods-price').text(data.spec_base.price); + $('.number-tag input[type="number"]').attr('max', data.spec_base.inventory); + $('.stock-tips .stock').text(data.spec_base.inventory); + if(data.spec_base.original_price > 0) + { + $('.goods-original-price').text(__currency_symbol__+data.spec_base.original_price); + $('.goods-original-price').parents('.items').show(); + } else { + $('.goods-original-price').parents('.items').hide(); + } + + // 已选数量校验、超出规格数量则以规格数量为准 + var stock = parseInt($('#text_box').val()); + if(stock > data.spec_base.inventory) + { + $('#text_box').val(data.spec_base.inventory); + } + + // 扩展数据处理 + var extends_element = data.extends_element || []; + if(extends_element.length > 0) + { + for(var i in extends_element) + { + if((extends_element[i]['element'] || null) != null && extends_element[i]['content'] !== null) + { + $(extends_element[i]['element']).html(extends_element[i]['content']); + } + } + } +} + /** * 获取规格详情 * @author Devil @@ -200,6 +271,9 @@ function GoodsSpecDetail() spec.push({"type": $(this).data('type-value'), "value": $(this).data('value')}) }); + // 已填写数量 + var stock = parseInt($('#text_box').val()) || 1; + // 开启进度条 $.AMUI.progress.start(); @@ -209,38 +283,19 @@ function GoodsSpecDetail() type: 'post', dataType: "json", timeout: 10000, - data: {"id": $('.goods-detail').data('id'), "spec": spec}, - success: function(result) + data: { + "id": $('.goods-detail').data('id'), + "stock": stock, + "spec": spec + }, + success: function(res) { $.AMUI.progress.done(); - if(result.code == 0) + if(res.code == 0) { - $('.text-info .price-now').text(__currency_symbol__+result.data.spec_base.price); - $('.goods-price').text(result.data.spec_base.price); - $('.number-tag input[type="number"]').attr('max', result.data.spec_base.inventory); - $('.stock-tips .stock').text(result.data.spec_base.inventory); - if(result.data.spec_base.original_price > 0) - { - $('.goods-original-price').text(__currency_symbol__+result.data.spec_base.original_price); - $('.goods-original-price').parents('.items').show(); - } else { - $('.goods-original-price').parents('.items').hide(); - } - - // 扩展数据处理 - var extends_element = result.data.extends_element || []; - if(extends_element.length > 0) - { - for(var i in extends_element) - { - if((extends_element[i]['element'] || null) != null && extends_element[i]['content'] !== null) - { - $(extends_element[i]['element']).html(extends_element[i]['content']); - } - } - } + GoodsSpecDetailBackHandle(res.data); } else { - Prompt(result.msg); + Prompt(res.msg); } }, error: function(xhr, type) @@ -286,10 +341,10 @@ function GoodsSpecType() dataType: "json", timeout: 10000, data: {"id": $('.goods-detail').data('id'), "spec": spec}, - success: function(result) + success: function(res) { $.AMUI.progress.done(); - if(result.code == 0) + if(res.code == 0) { var spec_count = spec.length; var index = (spec_count > 0) ? spec_count : 0; @@ -299,7 +354,7 @@ function GoodsSpecType() { $(this).removeClass('sku-dont-choose'); var value = $(this).data('value').toString(); - if(result.data.spec_type.indexOf(value) == -1) + if(res.data.spec_type.indexOf(value) == -1) { $(this).addClass('sku-items-disabled'); } else { @@ -309,7 +364,7 @@ function GoodsSpecType() } // 扩展数据处理 - var extends_element = result.data.extends_element || []; + var extends_element = res.data.extends_element || []; if(extends_element.length > 0) { for(var i in extends_element) @@ -321,7 +376,7 @@ function GoodsSpecType() } } } else { - Prompt(result.msg); + Prompt(res.msg); } }, error: function(xhr, type) @@ -361,6 +416,64 @@ function GoodsBaseRestore() } } +/** + * 数量值改变 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2021-10-05 + * @desc description + */ +function GoodsNumberChange() +{ + var stock = parseInt($('#text_box').val()) || 1; + var spec = []; + var sku_count = $('.sku-items').length; + if(sku_count > 0) + { + // 未完全选择规格则返回 + var spec_count = $('.sku-line.selected').length; + if(spec_count < sku_count) + { + return false; + } + + // 已选规格 + spec = GoodsSelectedSpec(); + } + + // 开启进度条 + $.AMUI.progress.start(); + + // ajax请求 + $.ajax({ + url: $('#text_box').data('ajax-url'), + type: 'post', + dataType: "json", + timeout: 10000, + data: { + "id": $('.goods-detail').data('id'), + "stock": stock, + "spec": spec + }, + success: function(res) + { + $.AMUI.progress.done(); + if(res.code == 0) + { + GoodsSpecDetailBackHandle(res.data); + } else { + Prompt(res.msg); + } + }, + error: function(xhr, type) + { + $.AMUI.progress.done(); + Prompt(HtmlToString(xhr.responseText) || '异常错误', null, 30); + } + }); +} + /** * 规格选择显示 * @author Devil @@ -386,13 +499,9 @@ $(function() { { $(this).find('ul>li').on('click', function() { - // 切换规格购买数量清空 - $('#text_box').val($('.stock-tips .stock').data('min-limit') || 1); - // 规格处理 var length = $('.theme-signin-left .sku-container .sku-items').length; var index = $(this).parents('.sku-items').index(); - if($(this).hasClass('selected')) { $(this).removeClass('selected'); @@ -527,24 +636,24 @@ $(function() { dataType: "json", timeout: 10000, data: {"id": $('.goods-detail').data('id')}, - success: function(result) + success: function(res) { $.AMUI.progress.done(); PoptitClose(); - if(result.code == 0) + if(res.code == 0) { - $this.find('.goods-favor-text').text(result.data.text); - $this.find('.goods-favor-count').text('('+result.data.count+')'); - if(result.data.status == 1) + $this.find('.goods-favor-text').text(res.data.text); + $this.find('.goods-favor-count').text('('+res.data.count+')'); + if(res.data.status == 1) { $this.addClass('text-active'); } else { $this.removeClass('text-active'); } - Prompt(result.msg, 'success'); + Prompt(res.msg, 'success'); } else { - Prompt(result.msg); + Prompt(res.msg); } }, error: function(xhr, type) @@ -572,54 +681,75 @@ $(function() { }); //获得文本框对象 - var $sotck = $('#text_box'); - var min = $('.stock-tips .stock').data('min-limit') || 1; - var max = $('.stock-tips .stock').data('max-limit') || 0; - var unit = $('.stock-tips .stock').data('unit') || ''; + var $input = $('#text_box'); + var $stock_tips = $('.stock-tips .stock'); + var min = parseInt($stock_tips.data('min-limit')) || 1; + var max = parseInt($stock_tips.data('max-limit')) || 0; + var unit = $stock_tips.data('unit') || ''; // 手动输入 - $sotck.on('blur', function() + $input.on('blur', function() { - var number = parseInt($(this).val()); - var inventory = parseInt($('.stock-tips .stock').text()); - if(number > inventory) + var stock = parseInt($(this).val()); + var inventory = parseInt($stock_tips.text()); + if(isNaN(stock)) { - number = inventory; + stock = min; } - if(number <= 1 || isNaN(number)) + if(max > 0 && stock > max) { - number = min; + stock = max; } - $sotck.val(number); + if(stock < min) + { + stock = min; + } + if(stock > inventory) + { + stock = inventory; + } + $input.val(stock); + + // 数量更新事件 + GoodsNumberChange(); }); //数量增加操作 $('#add').on('click', function() { - var inventory = parseInt($('.stock-tips .stock').text()); - var number = parseInt($sotck.val())+1; - if(max > 0 && number > max) + var inventory = parseInt($stock_tips.text()); + var stock = parseInt($input.val())+1; + if(max > 0 && stock > max) { + $input.val(max); Prompt('最大限购数量'+max+unit); return false; } - if(number > inventory) + if(stock > inventory) { + $input.val(min); Prompt('库存数量'+inventory+unit); return false; } - $sotck.val(number); + $input.val(stock); + + // 数量更新事件 + GoodsNumberChange(); }); //数量减少操作 $('#min').on('click', function() { - var value = parseInt($sotck.val())-1 || 1; + var value = parseInt($input.val())-1; if(value < min) { + $input.val(min); Prompt('最低起购数量'+min+unit); return false; } - $sotck.val(value); + $input.val(value); + + // 数量更新事件 + GoodsNumberChange(); }); // 评论