起购数和限购数提升到商品规格级别

feat/task1-c-wallet
gongfuxiang 2023-02-23 15:35:30 +08:00
parent ae419296d0
commit 234d207873
19 changed files with 451 additions and 205 deletions

View File

@ -59,6 +59,8 @@
<th>{{:MyLang('common_service.goods.form_spec_thead_price_title')}}</th>
<th>{{:MyLang('common_service.goods.form_spec_thead_original_price_title')}}</th>
<th>{{:MyLang('common_service.goods.form_spec_thead_inventory_title')}}</th>
<th>{{:MyLang('common_service.goods.form_spec_thead_buy_min_number_title')}}</th>
<th>{{:MyLang('common_service.goods.form_spec_thead_buy_max_number_title')}}</th>
<th>{{:MyLang('common_service.goods.form_spec_thead_weight_title')}}</th>
<th>{{:MyLang('common_service.goods.form_spec_thead_volume_title')}}</th>
<th>{{:MyLang('common_service.goods.form_spec_thead_coding_title')}}</th>
@ -79,6 +81,10 @@
<td class="am-text-middle">{{if isset($v['data']['price'])}}{{$v.data.price}}{{/if}}</td>
<td class="am-text-middle">{{if isset($v['data']['original_price']) and $v['data']['original_price'] gt 0}}{{$v.data.original_price}}{{/if}}</td>
<td class="am-text-middle">{{if isset($v['data']['inventory'])}}{{$v.data.inventory}}{{/if}}</td>
<td class="am-text-middle">{{if isset($v['data']['buy_min_number']) and $v['data']['buy_min_number']
gt 0}}{{$v.data.buy_min_number}}{{/if}}</td>
<td class="am-text-middle">{{if isset($v['data']['buy_max_number']) and $v['data']['buy_max_number']
gt 0}}{{$v.data.buy_max_number}}{{/if}}</td>
<td class="am-text-middle">{{if isset($v['data']['weight']) and $v['data']['weight']
gt 0}}{{$v.data.weight}}{{/if}}</td>
<td class="am-text-middle">{{if isset($v['data']['volume']) and $v['data']['volume']

View File

@ -135,21 +135,6 @@
</div>
</div>
<div class="am-cf">
<div class="am-u-sm-6 am-padding-horizontal-0">
<div class="am-form-group">
<label>{{:MyLang('common_service.goods.form_item_buy_min_number')}}<span class="am-form-group-label-tips-must">*</span></label>
<input type="number" name="buy_min_number" placeholder="{{:MyLang('common_service.goods.form_item_buy_min_number_message')}}" min="1" max="100000000" data-validation-message="{{:MyLang('common_service.goods.form_item_buy_min_number_message')}}" class="am-radius" value="{{if empty($data) or empty($data['buy_min_number'])}}1{{else /}}{{$data.buy_min_number}}{{/if}}" required />
</div>
</div>
<div class="am-u-sm-6 am-padding-horizontal-0">
<div class="am-form-group">
<label>{{:MyLang('common_service.goods.form_item_buy_max_number')}}{{if is_array(MyLang('common_service.goods.form_item_buy_max_number_tips'))}}<a href="javascript:;" class="am-icon-question-circle am-text-warning am-margin-left-sm" data-am-popover="{content: '{{:implode('<br />', MyLang('common_service.goods.form_item_buy_max_number_tips'))}}', trigger: 'hover focus', theme: 'sm'}"></a>{{/if}}</label>
<input type="number" name="buy_max_number" placeholder="{{:MyLang('common_service.goods.form_item_buy_max_number_message')}}" min="0" max="100000000" data-validation-message="{{:MyLang('common_service.goods.form_item_buy_max_number_message')}}" class="am-radius" {{if !empty($data['buy_max_number'])}} value="{{$data.buy_max_number}}"{{/if}} />
</div>
</div>
</div>
<div class="am-cf">
<div class="am-u-md-6 am-padding-horizontal-0">
<div class="am-form-group">

View File

@ -109,6 +109,14 @@
<span>{{:MyLang('common_service.goods.form_spec_thead_original_price_title')}}</span>
<i class="am-icon-edit"></i>
</th>
<th>
<span>{{:MyLang('common_service.goods.form_spec_thead_buy_min_number_title')}}</span>
<i class="am-icon-edit"></i>
</th>
<th>
<span>{{:MyLang('common_service.goods.form_spec_thead_buy_max_number_title')}}</span>
<i class="am-icon-edit"></i>
</th>
<th>
<span>{{:MyLang('common_service.goods.form_spec_thead_weight_title')}}</span>
<i class="am-icon-edit"></i>
@ -133,25 +141,31 @@
{{if empty($specifications['value'])}}
<tr class="line-0" data-line-tag=".line-0">
<td class="am-text-middle value-start">
<input type="text" name="specifications_price[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_price_title')}}" class="am-radius" pattern="{{$default_price_regex}}" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_price_message')}}" required />
<input type="text" name="specifications_price[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_price_title')}}" class="am-radius" pattern="{{$default_price_regex}}" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_price_message')}}" data-is-clearout="0" required />
</td>
<td class="am-text-middle">
<input type="text" name="specifications_original_price[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_original_price_title')}}" class="am-radius" pattern="{{$default_price_regex}}" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_original_price_message')}}" />
<input type="text" name="specifications_original_price[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_original_price_title')}}" class="am-radius" pattern="{{$default_price_regex}}" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_original_price_message')}}" data-is-clearout="0" />
</td>
<td class="am-text-middle">
<input type="number" name="specifications_weight[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_weight_title')}}" class="am-radius" min="0.00" max="100000000.00" step="0.01" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_weight_message')}}" />
<input type="number" name="specifications_buy_min_number[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_buy_min_number_title')}}" class="am-radius" min="0" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_buy_min_number_message')}}" data-is-clearout="0" />
</td>
<td class="am-text-middle">
<input type="number" name="specifications_volume[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_volume_title')}}" class="am-radius" min="0.00" max="100000000.00" step="0.01" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_volume_message')}}" />
<input type="number" name="specifications_buy_max_number[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_buy_max_number_title')}}" class="am-radius" min="0" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_buy_max_number_message')}}" data-is-clearout="0" />
</td>
<td class="am-text-middle">
<input type="text" name="specifications_coding[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_coding_title')}}" class="am-radius" maxlength="60" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_coding_message')}}" />
<input type="number" name="specifications_weight[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_weight_title')}}" class="am-radius" min="0.00" max="100000000.00" step="0.01" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_weight_message')}}" data-is-clearout="0" />
</td>
<td class="am-text-middle">
<input type="text" name="specifications_barcode[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_barcode_title')}}" class="am-radius" maxlength="60" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_barcode_message')}}" />
<input type="number" name="specifications_volume[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_volume_title')}}" class="am-radius" min="0.00" max="100000000.00" step="0.01" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_volume_message')}}" data-is-clearout="0" />
</td>
<td class="am-text-middle">
<input type="hidden" name="specifications_extends[]" value="" class="line-extend-input" />
<input type="text" name="specifications_coding[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_coding_title')}}" class="am-radius" maxlength="60" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_coding_message')}}" data-is-clearout="0" />
</td>
<td class="am-text-middle">
<input type="text" name="specifications_barcode[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_barcode_title')}}" class="am-radius" maxlength="60" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_barcode_message')}}" data-is-clearout="0" />
</td>
<td class="am-text-middle">
<input type="hidden" name="specifications_extends[]" class="line-extend-input" />
<a href="javascript:;" class="am-text-xs am-text-secondary line-extend-btn">{{:MyLang('edit_title')}}</a>
</td>
<td class="am-text-middle">
@ -171,28 +185,34 @@
{{switch v.data_type}}
{{case spec}}
<td class="am-text-middle table-value table-value-{{$v.data.key}}">
<input type="text" name="specifications_value_{{$v.data.key}}[]" placeholder="{{:MyLang('common_service.goods.form_spec_value_title')}}" value="{{$v.data.value}}" data-validation-message="{{:MyLang('common_service.goods.form_spec_value_message')}}" required />
<input type="text" name="specifications_value_{{$v.data.key}}[]" placeholder="{{:MyLang('common_service.goods.form_spec_value_title')}}" value="{{$v.data.value}}" data-validation-message="{{:MyLang('common_service.goods.form_spec_value_message')}}" data-is-clearout="0" required />
</td>
{{/case}}
{{case base}}
<td class="am-text-middle value-start">
<input type="text" name="specifications_price[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_price_title')}}" class="am-radius" pattern="{{$default_price_regex}}" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_price_message')}}" value="{{if isset($v['data']['price'])}}{{$v.data.price}}{{/if}}" required />
<input type="text" name="specifications_price[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_price_title')}}" class="am-radius" pattern="{{$default_price_regex}}" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_price_message')}}" value="{{if isset($v['data']['price'])}}{{$v.data.price}}{{/if}}" data-is-clearout="0" required />
</td>
<td class="am-text-middle">
<input type="text" name="specifications_original_price[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_original_price_title')}}" class="am-radius" pattern="{{$default_price_regex}}" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_original_price_message')}}" value="{{if $v['data']['original_price'] gt 0}}{{$v.data.original_price}}{{/if}}" />
<input type="text" name="specifications_original_price[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_original_price_title')}}" class="am-radius" pattern="{{$default_price_regex}}" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_original_price_message')}}" value="{{if $v['data']['original_price'] gt 0}}{{$v.data.original_price}}{{/if}}" data-is-clearout="0" />
</td>
<td class="am-text-middle">
<input type="number" name="specifications_weight[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_weight_title')}}" class="am-radius" min="0.00" max="100000000.00" step="0.01" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_weight_message')}}" value="{{if isset($v['data']['weight']) and $v['data']['weight'] gt 0}}{{$v.data.weight}}{{/if}}" />
<input type="number" name="specifications_buy_min_number[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_buy_min_number_title')}}" class="am-radius" min="0" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_buy_min_number_message')}}" value="{{if !empty($v['data']['buy_min_number'])}}{{$v.data.buy_min_number}}{{/if}}" data-is-clearout="0" />
</td>
<td class="am-text-middle">
<input type="number" name="specifications_volume[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_volume_title')}}" class="am-radius" max="100000000" min="0.00" max="100000000.00" step="0.01" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_volume_message')}}" value="{{if isset($v['data']['volume']) and $v['data']['volume'] gt 0}}{{$v.data.volume}}{{/if}}" />
<input type="number" name="specifications_buy_max_number[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_buy_max_number_title')}}" class="am-radius" min="0" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_buy_max_number_message')}}" value="{{if !empty($v['data']['buy_max_number'])}}{{$v.data.buy_max_number}}{{/if}}" data-is-clearout="0" />
</td>
<td class="am-text-middle">
<input type="text" name="specifications_coding[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_coding_title')}}" class="am-radius" maxlength="60" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_coding_message')}}" value="{{if isset($v['data']['coding'])}}{{$v.data.coding}}{{/if}}" />
<input type="number" name="specifications_weight[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_weight_title')}}" class="am-radius" min="0.00" max="100000000.00" step="0.01" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_weight_message')}}" value="{{if isset($v['data']['weight']) and $v['data']['weight'] gt 0}}{{$v.data.weight}}{{/if}}" data-is-clearout="0" />
</td>
<td class="am-text-middle">
<input type="text" name="specifications_barcode[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_barcode_title')}}" class="am-radius" maxlength="60" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_barcode_message')}}" value="{{if isset($v['data']['barcode'])}}{{$v.data.barcode}}{{/if}}" />
<input type="number" name="specifications_volume[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_volume_title')}}" class="am-radius" max="100000000" min="0.00" max="100000000.00" step="0.01" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_volume_message')}}" value="{{if isset($v['data']['volume']) and $v['data']['volume'] gt 0}}{{$v.data.volume}}{{/if}}" data-is-clearout="0" />
</td>
<td class="am-text-middle">
<input type="text" name="specifications_coding[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_coding_title')}}" class="am-radius" maxlength="60" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_coding_message')}}" value="{{if isset($v['data']['coding'])}}{{$v.data.coding}}{{/if}}" data-is-clearout="0" />
</td>
<td class="am-text-middle">
<input type="text" name="specifications_barcode[]" placeholder="{{:MyLang('common_service.goods.form_spec_thead_barcode_title')}}" class="am-radius" maxlength="60" data-validation-message="{{:MyLang('common_service.goods.form_spec_thead_barcode_message')}}" value="{{if isset($v['data']['barcode'])}}{{$v.data.barcode}}{{/if}}" data-is-clearout="0" />
</td>
<td class="am-text-middle">
<input type="hidden" name="specifications_extends[]" value="{{$v.data.extends}}" class="line-extend-input" />

View File

@ -69,7 +69,7 @@ class Buy extends Common
$buy_data = MySession('buy_post_data');
if(empty($buy_data) || (empty($buy_data['goods_data']) && empty($buy_data['ids'])))
{
MyViewAssign('msg', MyLang('buy.gooods_data_no_data_tips'));
MyViewAssign('msg', MyLang('goods_data_empty_tips'));
return MyView('public/tips_error');
}

View File

@ -125,7 +125,6 @@ return [
// 基础
'browser_seo_title' => 'Order Confirm',
'exhibition_not_allow_submit_tips' => 'Order submission is not allowed for display type',
'gooods_data_no_data_tips' => 'Goods Info is empty',
'buy_item_order_title' => 'Order Info',
'buy_item_payment_title' => 'Choice Payment',
'confirm_delivery_address_name' => 'Confirm delivery address',

View File

@ -125,7 +125,6 @@ return [
// 基础
'browser_seo_title' => '订单确认',
'exhibition_not_allow_submit_tips' => '展示型不允许提交订单',
'gooods_data_no_data_tips' => '商品信息为空',
'buy_item_order_title' => '订单信息',
'buy_item_payment_title' => '选择支付',
'confirm_delivery_address_name' => '确认收货地址',

View File

@ -45,10 +45,10 @@
<div class="spec-options am-margin-top-sm">
<div class="am-input-group am-input-group-sm number-operate">
<span class="am-input-group-label am-radius stock-submit" data-type="min">-</span>
<input type="number" name="stock" class="am-form-field am-text-center" value="{{$goods.buy_min_number}}" min="{{$goods.buy_min_number}}" max="{{if empty($goods['buy_max_number'])}}{{$goods.inventory}}{{else /}}{{$goods.buy_max_number}}{{/if}}" data-original-max="{{if empty($goods['buy_max_number'])}}{{$goods.inventory}}{{else /}}{{$goods.buy_max_number}}{{/if}}" data-is-clearout="0" />
<input type="number" name="stock" class="am-form-field am-text-center" value="{{$goods.buy_min_number}}" min="{{$goods.buy_min_number}}" max="{{if empty($goods['buy_max_number'])}}{{$goods.inventory}}{{else /}}{{$goods.buy_max_number}}{{/if}}" data-original-buy-min-number="{{$goods.buy_min_number}}" data-original-buy-max-number="{{$goods.buy_max_number}}" data-is-clearout="0" />
<span class="am-input-group-label am-radius stock-submit" data-type="add">+</span>
</div>
<span class="am-margin-left-sm stock-tips">{{:MyLang('inventory_title')}}<span class="stock" data-original-stock="{{$goods.inventory}}" data-min-limit="{{$goods.buy_min_number}}" data-max-limit="{{$goods.buy_max_number}}" data-unit="{{$goods.inventory_unit}}">{{$goods.inventory}}</span>{{$goods.inventory_unit}}</span>
<span class="am-margin-left-sm stock-tips">{{:MyLang('inventory_title')}}<span class="stock" data-original-max="{{if empty($goods['buy_max_number'])}}{{$goods.inventory}}{{else /}}{{$goods.buy_max_number}}{{/if}}" data-original-inventory="{{$goods.inventory}}" data-min-limit="{{$goods.buy_min_number}}" data-max-limit="{{$goods.buy_max_number}}" data-unit="{{$goods.inventory_unit}}">{{$goods.inventory}}</span>{{$goods.inventory_unit}}</span>
</div>
</div>
{{else /}}

View File

@ -378,10 +378,10 @@
<dd>
<div class="am-input-group am-input-group-sm number-tag">
<button class="am-input-group-label am-radius" id="min" type="button">-</button>
<input type="number" class="am-form-field" value="{{$goods.buy_min_number}}" id="text_box" min="{{$goods.buy_min_number}}" max="{{if empty($goods['buy_max_number'])}}{{$goods.inventory}}{{else /}}{{$goods.buy_max_number}}{{/if}}" data-original-max="{{$goods.inventory}}" data-ajax-url="{{:MyUrl('index/goods/stock')}}" />
<input type="number" class="am-form-field" value="{{$goods.buy_min_number}}" id="text_box" min="{{$goods.buy_min_number}}" max="{{if empty($goods['buy_max_number'])}}{{$goods.inventory}}{{else /}}{{$goods.buy_max_number}}{{/if}}" data-original-buy-min-number="{{$goods.buy_min_number}}" data-original-buy-max-number="{{$goods.buy_max_number}}" data-is-clearout="0" />
<button class="am-input-group-label am-radius" id="add" type="button">+</button>
</div>
<span class="tb-hidden stock-tips"><span>{{:MyLang('inventory_title')}}</span><span class="stock" data-original-stock="{{$goods.inventory}}" data-min-limit="{{$goods.buy_min_number}}" data-max-limit="{{$goods.buy_max_number}}" data-unit="{{$goods.inventory_unit}}">{{$goods.inventory}}</span><span>{{$goods.inventory_unit}}</span></span>
<span class="tb-hidden stock-tips"><span>{{:MyLang('inventory_title')}}</span><span class="stock" data-original-max="{{if empty($goods['buy_max_number'])}}{{$goods.inventory}}{{else /}}{{$goods.buy_max_number}}{{/if}}" data-original-inventory="{{$goods.inventory}}" data-min-limit="{{$goods.buy_min_number}}" data-max-limit="{{$goods.buy_max_number}}" data-unit="{{$goods.inventory_unit}}">{{$goods.inventory}}</span><span>{{$goods.inventory_unit}}</span></span>
</dd>
</div>

View File

@ -111,6 +111,7 @@
var __load_map_type__ = '{{$load_map_type}}';
var __goods_spec_type_url__ = '{{:MyUrl("index/goods/spectype")}}';
var __goods_spec_detail_url__ = '{{:MyUrl("index/goods/specdetail")}}';
var __goods_stock_url__ = '{{:MyUrl("index/goods/stock")}}';
var __goods_cart_save_url__ = '{{:MyUrl("index/cart/save")}}';
var __goods_cart_info_url__ = '{{:MyUrl("index/goods/cartinfo")}}';
// 语言定义用于js调用、模板引擎直接使用$lang_data.xxx获取对应语言即可

View File

@ -60,7 +60,7 @@
{{/if}}
<!-- 字段选择 -->
{{if !empty($admin) and (!isset($form_table['base']['is_fields_sel']) or $form_table['base']['is_fields_sel'] eq 1)}}
{{if !empty($user) and (!isset($form_table['base']['is_fields_sel']) or $form_table['base']['is_fields_sel'] eq 1)}}
<div class="am-fr am-nbfc">
<button type="button" class="am-btn am-btn-default am-radius am-btn-xs am-icon-cog" data-am-modal="{target: '#form-table-fields-popup'}"> {{:MyLang('setup_title')}}</button>
</div>

View File

@ -456,6 +456,7 @@ return [
'goods_category_title' => 'Goods Category',
'goods_inventory_insufficient_min_number_tips' => 'Initial purchase quantity of insufficient inventory',
'goods_more_total_tips' => '{:total} items in total',
'goods_data_empty_tips' => 'Goods Info is empty',
// 验证码相关
'verify_type_error_tips' => 'Wrong verification type',
'verify_code_empty_tips' => 'Verification code cannot be empty',
@ -1403,13 +1404,6 @@ return [
],
'form_item_give_integral_placeholder' => 'Purchase free points',
'form_item_give_integral_message' => 'Purchase a number with a percentage of 0 to 100 points',
'form_item_buy_min_number' => 'Minimum purchase quantity',
'form_item_buy_min_number_message' => 'The minimum purchase quantity ranges from 1 to 100000000',
'form_item_buy_max_number' => 'Maximum quantity of single purchase',
'form_item_buy_max_number_tips' => [
'1. Single maximum value 100000000',
'2. No limit if less than or equal to 0 or empty',
],
'form_item_buy_max_number_message' => 'The maximum number of single purchase ranges from 1 to 100000000',
'form_item_site_type' => 'Goods Type',
'form_item_site_type_tips' => [
@ -1458,6 +1452,10 @@ return [
'form_spec_thead_price_message' => 'Please fill in valid sales amount',
'form_spec_thead_original_price_title' => 'Original price (yuan)',
'form_spec_thead_original_price_message'=> 'Please fill in valid original price',
'form_spec_thead_buy_min_number_title' => 'Min number',
'form_spec_thead_buy_min_number_message'=> 'Please fill in the valid starting number',
'form_spec_thead_buy_max_number_title' => 'Max number',
'form_spec_thead_buy_max_number_message'=> 'Please fill in the valid purchase limit',
'form_spec_thead_inventory_title' => 'Inventory',
'form_spec_thead_weight_title' => 'Weight (kg)',
'form_spec_thead_weight_message' => 'Specification and weight 0~100000000',
@ -1521,6 +1519,7 @@ return [
'delete_spec_type_fail_tips' => 'Specification type deletion failed',
'delete_spec_value_fail_tips' => 'Specification value deletion failed',
'delete_spec_base_fail_tips' => 'Failed to delete the specification base',
'delete_goods_category_join_fail_tips' => 'Failed to delete the commodity association classification',
'delete_goods_photo_fail_tips' => 'Photo album deletion failed',
'delete_app_content_fail_tips' => 'Mobile content deletion failed',
'delete_params_fail_tips' => 'Parameter deletion failed',

View File

@ -457,6 +457,7 @@ return [
'goods_category_title' => '商品分类',
'goods_inventory_insufficient_min_number_tips' => '库存不足起购数',
'goods_more_total_tips' => '共 {:total} 种商品',
'goods_data_empty_tips' => '商品信息为空',
// 验证码相关
'verify_type_error_tips' => '验证类型有误',
'verify_code_empty_tips' => '验证码不能为空',
@ -1409,14 +1410,6 @@ return [
],
'form_item_give_integral_placeholder' => '购买赠送积分',
'form_item_give_integral_message' => '购买赠送积分比例0~100的数字',
'form_item_buy_min_number' => '最低起购数量',
'form_item_buy_min_number_message' => '最低起购数量1~100000000范围',
'form_item_buy_max_number' => '单次最大购买数量',
'form_item_buy_max_number_tips' => [
'1. 单次最大数值100000000',
'2. 小于等于0或空则不限',
],
'form_item_buy_max_number_message' => '单次最大购买数量 1~100000000范围',
'form_item_site_type' => '商品类型',
'form_item_site_type_tips' => [
'1. 当前系统配置的站点类型为( 站点类型 )',
@ -1464,6 +1457,10 @@ return [
'form_spec_thead_price_message' => '请填写有效的销售金额',
'form_spec_thead_original_price_title' => '原价(元)',
'form_spec_thead_original_price_message'=> '请填写有效的原价',
'form_spec_thead_buy_min_number_title' => '起购数',
'form_spec_thead_buy_min_number_message'=> '请填写有效的起购数',
'form_spec_thead_buy_max_number_title' => '限购数',
'form_spec_thead_buy_max_number_message'=> '请填写有效的限购数',
'form_spec_thead_inventory_title' => '库存',
'form_spec_thead_weight_title' => '重量(kg)',
'form_spec_thead_weight_message' => '规格重量0~100000000',
@ -1527,6 +1524,7 @@ return [
'delete_spec_type_fail_tips' => '规格类型删除失败',
'delete_spec_value_fail_tips' => '规格值删除失败',
'delete_spec_base_fail_tips' => '规格基础删除失败',
'delete_goods_category_join_fail_tips' => '商品关联分类删除失败',
'delete_goods_photo_fail_tips' => '相册删除失败',
'delete_app_content_fail_tips' => '手机端内容删除失败',
'delete_params_fail_tips' => '参数删除失败',

View File

@ -75,7 +75,7 @@
data-config-images-tips="请先添加图片并配置"
data-upload-video-tips="请上传视频"
data-choice-goods-tips="请选择商品"
data-goods-data-empty-tips="{{:MyLang('gooods_data_no_data_tips')}}"
data-goods-data-empty-tips="{{:MyLang('goods_data_empty_tips')}}"
data-choice-goods-category-tips="{{:MyLang('form_goods_category_message')}}"
data-data-type-tips="数据类型有误"
data-main-title-tips="请填写主标题"

View File

@ -69,7 +69,7 @@ class BuyService
['is_delete_time', '=', 0],
['is_shelves', '=', 1],
],
'field' => 'id,id AS goods_id, title, images, inventory_unit, buy_min_number, buy_max_number, model',
'field' => 'id,id AS goods_id,title,images,inventory_unit,is_shelves,buy_min_number,buy_max_number,model,site_type',
]);
$ret = GoodsService::GoodsList($goods_params);
if(empty($ret['data'][0]))
@ -105,6 +105,9 @@ class BuyService
$goods['inventory'] = $goods_base['data']['spec_base']['inventory'];
$goods['price'] = (float) $goods_base['data']['spec_base']['price'];
$goods['original_price'] = (float) $goods_base['data']['spec_base']['original_price'];
$goods['spec_base_id'] = $goods_base['data']['spec_base']['id'];
$goods['spec_buy_min_number'] = $goods_base['data']['spec_base']['buy_min_number'];
$goods['spec_buy_max_number'] = $goods_base['data']['spec_base']['buy_max_number'];
$goods['spec_weight'] = $goods_base['data']['spec_base']['weight'];
$goods['spec_volume'] = $goods_base['data']['spec_base']['volume'];
$goods['spec_coding'] = $goods_base['data']['spec_base']['coding'];
@ -489,7 +492,7 @@ class BuyService
[
'checked_type' => 'empty',
'key_name' => 'goods',
'error_msg' => MyLang('gooods_data_no_data_tips'),
'error_msg' => MyLang('goods_data_empty_tips'),
],
[
'checked_type' => 'is_array',
@ -503,72 +506,97 @@ class BuyService
return DataReturn($ret, -1);
}
// 商品总数
$count = count($params['goods']);
// 是否需要校验商品类型、is_buy、1校验、默认0不校验
// 商品小于等于1不校验
$is_check_goods_site_type = (isset($params['is_buy']) && $params['is_buy'] == 1) ? 1 : 0;
if($is_check_goods_site_type == 1 &&
$count <= 1)
count($params['goods']) <= 1)
{
$is_check_goods_site_type = 0;
}
// 是否存在字段缺失
$goods_data = [];
if(!array_key_exists('is_shelves', $params['goods'][0]))
{
$goods_data = Db::name('Goods')->where(['id'=>array_column($params['goods'], 'goods_id')])->column('is_shelves,buy_min_number,buy_max_number,site_type', 'id');
}
// 数据校验
foreach($params['goods'] as $v)
{
// 获取商品信息
$goods = Db::name('Goods')->field('id,title,price,is_shelves,inventory,buy_min_number,buy_max_number,site_type')->find($v['goods_id']);
if(empty($goods))
// 数据合并
if(!empty($goods_data) && array_key_exists($v['goods_id'], $goods_data))
{
return DataReturn(MyLang('common_service.buy.goods_no_exist_tips').'['.$v['title'].']', -1);
$v = array_merge($v, $goods_data[$v['goods_id']]);
}
// 是否存在规格所属数据
if(!array_key_exists('spec_buy_min_number', $v) || !array_key_exists('spec_buy_max_number', $v))
{
$goods_base = GoodsService::GoodsSpecDetail(array_merge($params, [
'id' => $v['goods_id'],
'spec' => isset($v['spec']) ? $v['spec'] : [],
]));
if($goods_base['code'] == 0)
{
$v['price'] = $goods_base['data']['spec_base']['price'];
$v['inventory'] = $goods_base['data']['spec_base']['inventory'];
$v['spec_buy_min_number'] = $goods_base['data']['spec_base']['buy_min_number'];
$v['spec_buy_max_number'] = $goods_base['data']['spec_base']['buy_max_number'];
} else {
return $goods_base;
}
}
// 基础判断
if($goods['is_shelves'] != 1)
if($v['is_shelves'] != 1)
{
return DataReturn(MyLang('common_service.buy.goods_already_shelves_tips').'['.$goods['title'].']', -1);
return DataReturn(MyLang('common_service.buy.goods_already_shelves_tips').'['.$v['title'].']', -1);
}
// 限购
if($goods['buy_min_number'] > 1 && $v['stock'] < $goods['buy_min_number'])
// 先判断规格的起购数、则再判断商品的起购数
if(isset($v['spec_buy_min_number']) && $v['spec_buy_min_number'] > 0)
{
return DataReturn(MyLang('common_service.buy.goods_buy_min_error_tips').'['.$goods['title'].']['.$v['stock'].'<'.$goods['buy_min_number'].']', -1);
if($v['stock'] < $v['spec_buy_min_number'])
{
return DataReturn(MyLang('common_service.buy.goods_buy_min_error_tips').'['.$v['title'].']['.$v['stock'].'<'.$v['spec_buy_min_number'].']', -1);
}
} else {
if(isset($v['buy_min_number']) && $v['buy_min_number'] > 1 && $v['stock'] < $v['buy_min_number'])
{
return DataReturn(MyLang('common_service.buy.goods_buy_min_error_tips').'['.$v['title'].']['.$v['stock'].'<'.$v['buy_min_number'].']', -1);
}
}
if($goods['buy_max_number'] > 0 && $v['stock'] > $goods['buy_max_number'])
// 先判断规格的限购数、则再判断商品的限购数
if(isset($v['spec_buy_max_number']) && $v['spec_buy_max_number'] > 0)
{
return DataReturn(MyLang('common_service.buy.goods_buy_max_error_tips').'['.$goods['title'].']['.$v['stock'].'>'.$goods['buy_max_number'].']', -1);
if($v['stock'] > $v['spec_buy_max_number'])
{
return DataReturn(MyLang('common_service.buy.goods_buy_max_error_tips').'['.$v['title'].']['.$v['stock'].'>'.$v['spec_buy_max_number'].']', -1);
}
} else {
if(isset($v['buy_max_number']) && $v['buy_max_number'] > 0 && $v['stock'] > $v['buy_max_number'])
{
return DataReturn(MyLang('common_service.buy.goods_buy_max_error_tips').'['.$v['title'].']['.$v['stock'].'>'.$v['buy_max_number'].']', -1);
}
}
// 是否支持购物车操作
if($is_check_goods_site_type)
{
$ret = GoodsService::IsGoodsSiteTypeConsistent($goods['id'], $goods['site_type']);
$ret = GoodsService::IsGoodsSiteTypeConsistent($v['goods_id'], $v['site_type']);
if($ret['code'] != 0)
{
return DataReturn($ret['msg'].'['.$v['title'].']', $ret['code']);
}
}
// 规格
$spec_params = array_merge($params, [
'id' => $v['goods_id'],
'spec' => isset($v['spec']) ? $v['spec'] : [],
]);
$goods_base = GoodsService::GoodsSpecDetail($spec_params);
if($goods_base['code'] == 0)
{
$goods['price'] = $goods_base['data']['spec_base']['price'];
$goods['inventory'] = $goods_base['data']['spec_base']['inventory'];
} else {
return $goods_base;
}
// 库存
if($v['stock'] > $goods['inventory'])
if($v['stock'] > $v['inventory'])
{
return DataReturn(MyLang('common_service.buy.goods_buy_exceed_inventory_tips').'['.$goods['title'].']['.$v['stock'].'>'.$goods['inventory'].']', -1);
return DataReturn(MyLang('common_service.buy.goods_buy_exceed_inventory_tips').'['.$v['title'].']['.$v['stock'].'>'.$v['inventory'].']', -1);
}
}
return DataReturn(MyLang('check_success'), 0);

View File

@ -54,7 +54,7 @@ class GoodsCartService
// 基础参数
$where = (!empty($params['where']) && is_array($params['where'])) ? $params['where'] : [];
$where[] = ['c.user_id', '=', $params['user']['id']];
$field = 'c.*, g.inventory_unit, g.is_shelves, g.is_delete_time, g.buy_min_number, g.buy_max_number, g.model, g.site_type';
$field = 'c.*,g.inventory_unit,g.is_shelves,g.is_delete_time,g.buy_min_number,g.buy_max_number,g.model,g.site_type';
// 购物车列表读取前钩子
$hook_name = 'plugins_service_cart_goods_list_begin';
@ -91,6 +91,9 @@ class GoodsCartService
$v['inventory'] = $goods_base['data']['spec_base']['inventory'];
$v['price'] = $goods_base['data']['spec_base']['price'];
$v['original_price'] = $goods_base['data']['spec_base']['original_price'];
$v['spec_base_id'] = $goods_base['data']['spec_base']['id'];
$v['spec_buy_min_number'] = $goods_base['data']['spec_base']['buy_min_number'];
$v['spec_buy_max_number'] = $goods_base['data']['spec_base']['buy_max_number'];
$v['spec_weight'] = $goods_base['data']['spec_base']['weight'];
$v['spec_volume'] = $goods_base['data']['spec_base']['volume'];
$v['spec_coding'] = $goods_base['data']['spec_base']['coding'];
@ -99,6 +102,9 @@ class GoodsCartService
} else {
$v['is_invalid'] = 1;
$v['inventory'] = 0;
$v['spec_base_id'] = 0;
$v['spec_buy_min_number'] = 0;
$v['spec_buy_max_number'] = 0;
$v['spec_weight'] = 0;
$v['spec_volume'] = 0;
$v['spec_coding'] = '';
@ -391,26 +397,29 @@ class GoodsCartService
return $ret;
}
// 条件
$where = [
'id' => intval($params['id']),
'goods_id' => intval($params['goods_id']),
'user_id' => intval($params['user']['id']),
// 获取购物车商品
$params['where'] = [
['c.id', '=', intval($params['id'])],
['c.goods_id', '=', intval($params['goods_id'])],
];
// 数量
$stock = intval($params['stock']);
// 获取购物车数据
$data = Db::name('Cart')->where($where)->field('goods_id,title,price,stock,spec')->find();
if(empty($data))
$cart = self::GoodsCartList($params);
if($cart['code'] != 0)
{
return $cart;
}
if(empty($cart['data']) || empty($cart['data'][0]))
{
return DataReturn(MyLang('common_service.goodscart.save_stock_update_data_empty_tips'), -1);
}
$data['stock'] = $stock;
$data['spec'] = empty($data['spec']) ? null : json_decode($data['spec'], true);
$data = $cart['data'][0];
// 是否存在错误
if($data['is_error'] == 1)
{
return DataReturn($data['error_msg'], -1);
}
// 商品校验
$data['stock'] = intval($params['stock']);
$ret = BuyService::BuyGoodsCheck(['goods'=>[$data]]);
if($ret['code'] != 0)
{
@ -419,25 +428,12 @@ class GoodsCartService
// 更新数据
$upd_data = [
'stock' => $stock,
'stock' => $data['stock'],
'upd_time' => time(),
];
if(Db::name('Cart')->where($where)->update($upd_data))
if(Db::name('Cart')->where(['id'=>$data['id']])->update($upd_data))
{
// 获取商品基础信息、更新商品价格信息
$spec_params = array_merge($params, [
'id' => $data['goods_id'],
'spec' => $data['spec'],
'stock' => $data['stock'],
]);
$goods_base = GoodsService::GoodsSpecDetail($spec_params);
if($goods_base['code'] == 0)
{
$data['price'] = $goods_base['data']['spec_base']['price'];
$data['original_price'] = $goods_base['data']['spec_base']['original_price'];
}
// 增加价格总计
// 重新计算总价
$data['total_price'] = PriceNumberFormat($data['stock']*$data['price']);
// 购物车更新成功钩子

View File

@ -966,11 +966,6 @@ class GoodsService
'checked_data' => '1,6',
'error_msg' => MyLang('common_service.goods.form_item_inventory_unit_message'),
],
[
'checked_type' => 'empty',
'key_name' => 'buy_min_number',
'error_msg' => MyLang('common_service.goods.form_item_buy_min_number_message'),
],
[
'checked_type' => 'in',
'key_name' => 'site_type',
@ -1019,7 +1014,7 @@ class GoodsService
{
return $specifications;
}
// 相册
$photo = self::GetFormGoodsPhotoParams($params);
if($photo['code'] != 0)
@ -1057,8 +1052,6 @@ class GoodsService
'model' => empty($params['model']) ? '' : $params['model'],
'place_origin' => isset($params['place_origin']) ? intval($params['place_origin']) : 0,
'inventory_unit' => $params['inventory_unit'],
'buy_min_number' => max(1, isset($params['buy_min_number']) ? intval($params['buy_min_number']) : 1),
'buy_max_number' => isset($params['buy_max_number']) ? intval($params['buy_max_number']) : 0,
'is_deduction_inventory' => isset($params['is_deduction_inventory']) ? intval($params['is_deduction_inventory']) : 0,
'is_shelves' => isset($params['is_shelves']) ? intval($params['is_shelves']) : 0,
'content_web' => $content_web,
@ -1233,11 +1226,28 @@ class GoodsService
*/
public static function GoodsSaveBaseUpdate($goods_id, $params = [])
{
$data = Db::name('GoodsSpecBase')->field('min(price) AS min_price, max(price) AS max_price, sum(inventory) AS inventory, min(original_price) AS min_original_price, max(original_price) AS max_original_price')->where(['goods_id'=>$goods_id])->find();
if(empty($data))
// 商品基础数据
$base = Db::name('GoodsSpecBase')->where(['goods_id'=>$goods_id])->select()->toArray();
if(empty($base))
{
return DataReturn(MyLang('common_service.goods.save_goods_base_empty_tips'), -1);
}
// 汇总处理
$data = [
'min_price' => min(array_column($base, 'price')),
'max_price' => max(array_column($base, 'price')),
'min_original_price' => min(array_column($base, 'original_price')),
'max_original_price' => max(array_column($base, 'original_price')),
'inventory' => array_sum(array_column($base, 'inventory')),
];
// 起购数、限购数处理
$data['buy_min_number'] = min(array_column($base, 'buy_min_number'));
if($data['buy_min_number'] <= 0)
{
$data['buy_min_number'] = 1;
}
$buy_max_number = max(array_column($base, 'buy_max_number'));
$data['buy_max_number'] = ($buy_max_number > 0 && min(array_column($base, 'buy_max_number')) > 0) ? $buy_max_number : 0;
// 销售价格 - 展示价格
$data['price'] = (!empty($data['max_price']) && $data['min_price'] != $data['max_price']) ? $data['min_price'].'-'.$data['max_price'] : $data['min_price'];
@ -1284,8 +1294,8 @@ class GoodsService
$images = [];
// 基础字段数据字段长度
// 销售价、原价、重量、体积、编码、条形码、扩展
$base_count = 7;
// 销售价、原价、起购数、限购数、重量、体积、编码、条形码、扩展
$base_count = 9;
// 规格值
foreach($params as $k=>$v)
@ -1670,7 +1680,7 @@ class GoodsService
{
// 基础字段
$count = count($data['data'][0]);
$temp_key = ['price', 'original_price', 'weight', 'volume', 'coding', 'barcode', 'extends'];
$temp_key = ['price', 'original_price', 'buy_min_number', 'buy_max_number', 'weight', 'volume', 'coding', 'barcode', 'extends'];
$key_count = count($temp_key);
// 等于key总数则只有一列基础规格
@ -1822,6 +1832,12 @@ class GoodsService
throw new \Exception(MyLang('common_service.goods.delete_spec_base_fail_tips'));
}
// 关联分类
if(Db::name('GoodsCategoryJoin')->where(['goods_id'=>$goods_ids])->delete() === false)
{
throw new \Exception(MyLang('common_service.goods.delete_goods_category_fail_tips'));
}
// 相册
if(Db::name('GoodsPhoto')->where(['goods_id'=>$goods_ids])->delete() === false)
{
@ -2071,7 +2087,7 @@ class GoodsService
{
if(!is_array($params['spec']))
{
$spec = json_decode(htmlspecialchars_decode($params['spec']), true);
$params['spec'] = json_decode(htmlspecialchars_decode($params['spec']), true);
}
$spec = array_column($params['spec'], 'value');
}

View File

@ -24,8 +24,7 @@ ul, li, ol {list-style: none;}
/*标题*/
.items-nav-title{text-align: center;width: 100%;overflow: hidden;background:#eee;}
.items-nav-title .floor-title {font-size: 14px;margin:20px 0px;line-height: 1px;border-left: 60px solid #d2364c;border-right: 60px solid #d2364c;
text-align: center;float:none}
.items-nav-title .floor-title {font-size: 14px;margin:20px 0px;line-height: 1px;border-left: 60px solid #d2364c;border-right: 60px solid #d2364c;text-align: center;float:none;font-weight: 600;}
.items-nav-title .floor-desc,.items-nav-title .today-brands,.items-nav-title .more{display: none;}
/*楼层*/
@ -71,7 +70,7 @@ text-align: center;float:none}
.banner-news li{ font-size:12px; padding:0px 0px;height: 30px;float: right;width:30% ;}
/*标题*/
.items-nav-title .floor-title {border: none;font-size:18px;line-height: 24px;margin:5px 0px ;font-weight: 600;}
.items-nav-title .floor-title {border: none;font-size:18px;line-height: 24px;margin:5px 0px;}
.items-nav-title .floor-desc {display:block;font-size: 14px;color: #999;line-height:18px;margin-bottom: 5px;}
/*楼层*/

View File

@ -23,6 +23,7 @@ function GoodsCartInfoSpecDetail()
{
spec.push({"type": $(this).data('type-value'), "value": $(this).data('value')})
});
// 数量
var stock = $cart_info_goods_spec.find('.number-operate input[type="number"]').val() || 1;
// 开启进度条
@ -35,42 +36,20 @@ function GoodsCartInfoSpecDetail()
dataType: 'json',
timeout: 10000,
data: {"id": $('.goods-spec-content').data('id'), "spec": spec, "stock": stock},
success: function(result)
success: function(res)
{
$.AMUI.progress.done();
if(result.code == 0)
if(res.code == 0)
{
// 售价
$cart_info_goods_spec.find('.price').text(__currency_symbol__+result.data.spec_base.price);
// 限购数量是否已大于库存
var max = parseInt(result.data.spec_base.inventory);
var $stock = $cart_info_goods_spec.find('.stock-tips .stock');
var limit_max = parseInt($stock.attr('data-max-limit') || 0);
if(limit_max > 0)
{
max = (max < limit_max) ? max : limit_max;
$stock.attr('data-max-limit', max);
}
$cart_info_goods_spec.find('.number-operate input[type="number"]').attr('max', max);
// 库存
$stock.text(result.data.spec_base.inventory);
if(result.data.spec_base.original_price > 0)
{
$cart_info_goods_spec.find('.original-price').attr('data-price', result.data.spec_base.original_price);
$cart_info_goods_spec.find('.original-price').text(__currency_symbol__+result.data.spec_base.original_price);
$cart_info_goods_spec.find('.original-price').show();
} else {
$('.original-price').hide();
}
GoodsCartInfoSpecDetailBackHandle(res.data);
} else {
Prompt(result.msg);
Prompt(res.msg);
}
},
error: function(xhr, type)
{
$.AMUI.progress.done();
Prompt(HtmlToString(xhr.responseText) || '异常错误', null, 30);
Prompt(HtmlToString(xhr.responseText) || (window['lang_error_text'] || '异常错误'), null, 30);
}
});
}
@ -110,10 +89,10 @@ function GoodsCartInfoSpecType()
dataType: 'json',
timeout: 10000,
data: {"id": $('.goods-spec-content').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;
@ -123,7 +102,7 @@ function GoodsCartInfoSpecType()
{
$(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 {
@ -132,17 +111,152 @@ function GoodsCartInfoSpecType()
});
}
} else {
Prompt(result.msg);
Prompt(res.msg);
}
},
error: function(xhr, type)
{
$.AMUI.progress.done();
Prompt(HtmlToString(xhr.responseText) || '异常错误', null, 30);
Prompt(HtmlToString(xhr.responseText) || (window['lang_error_text'] || '异常错误'), null, 30);
}
});
}
/**
* 数量值改变
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-10-05
* @desc description
*/
function GoodsNumberChange()
{
var stock = $cart_info_goods_spec.find('.number-operate input[type="number"]').val() || 1;
var spec = [];
var sku_count = $('.goods-spec-content .sku-items').length;
if(sku_count > 0)
{
// 未完全选择规格则返回
var spec_count = $('.sku-line.selected').length;
if(spec_count < sku_count)
{
return false;
}
// 已选规格
$('.goods-spec-content .sku-items li.selected').each(function(k, v)
{
spec.push({"type": $(this).data('type-value'), "value": $(this).data('value')})
});
}
// 开启进度条
$.AMUI.progress.start();
// ajax请求
$.ajax({
url: RequestUrlHandle(__goods_stock_url__),
type: 'post',
dataType: "json",
timeout: 10000,
data: {
"id": $('.goods-spec-content').data('id'),
"stock": stock,
"spec": spec
},
success: function(res)
{
$.AMUI.progress.done();
if(res.code == 0)
{
GoodsCartInfoSpecDetailBackHandle(res.data);
} else {
Prompt(res.msg);
}
},
error: function(xhr, type)
{
$.AMUI.progress.done();
Prompt(HtmlToString(xhr.responseText) || (window['lang_error_text'] || '异常错误'), null, 30);
}
});
}
/**
* 商品规格详情返回数据处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-10-05
* @desc description
* @param {[object]} data [后端返回数据]
*/
function GoodsCartInfoSpecDetailBackHandle(data)
{
// 售价
$cart_info_goods_spec.find('.price').text(__currency_symbol__+data.spec_base.price);
// 数量处理
var inventory = parseInt(data.spec_base.inventory);
var $input = $cart_info_goods_spec.find('.number-operate input[type="number"]');
var $stock = $cart_info_goods_spec.find('.stock-tips .stock');
var $origina_price = $cart_info_goods_spec.find('.original-price');
// 起购数
var min = parseInt($input.data('original-buy-min-number'));
var buy_min_number = parseInt(data.spec_base.buy_min_number);
if(buy_min_number > 0)
{
min = buy_min_number;
}
$input.attr('min', min);
// 限购数
var max = inventory;
var buy_max_number = parseInt(data.spec_base.buy_max_number);
if(buy_max_number > 0 && buy_max_number < max)
{
max = buy_max_number;
}
$input.attr('max', max);
$stock.text(inventory);
// 原价
if(data.spec_base.original_price > 0)
{
$origina_price.text(__currency_symbol__+data.spec_base.original_price);
$origina_price.parents('.items').show();
} else {
$origina_price.parents('.items').hide();
}
// 已选数量校验、超出规格数量则以规格数量为准
var stock = parseInt($input.val());
if(min > 0 && stock < min)
{
stock = min;
}
if(max > 0 && stock > max)
{
stock = max;
}
if(stock > inventory)
{
stock = inventory;
}
$input.val(stock);
// 起购/限购
if(min > 0)
{
$stock.attr('data-min-limit', min);
}
if(max > 0)
{
$stock.attr('data-max-limit', max);
}
}
/**
* 商品基础数据恢复
* @author Devil
@ -153,12 +267,19 @@ function GoodsCartInfoSpecType()
*/
function GoodsCartInfoBaseRestore()
{
$cart_info_goods_spec.find('.price').text(__currency_symbol__+$cart_info_goods_spec.find('.price').data('default-price'));
$cart_info_goods_spec.find('.number-operate input[type="number"]').attr('max', $cart_info_goods_spec.find('.number-operate input[type="number"]').data('original-max'));
$cart_info_goods_spec.find('.stock-tips .stock').text($cart_info_goods_spec.find('.stock-tips .stock').data('original-stock'));
if($cart_info_goods_spec.find('.original-price').length > 0)
var $input = $cart_info_goods_spec.find('.number-operate input[type="number"]');
var $stock = $cart_info_goods_spec.find('.stock-tips .stock');
var $price = $cart_info_goods_spec.find('.price');
var $original_price = $cart_info_goods_spec.find('.original-price');
$input.attr('min', $input.data('original-buy-min-number'));
$input.attr('max', $stock.data('original-max'));
$stock.text($stock.data('original-inventory'));
$stock.attr('data-min-limit', $input.attr('data-original-buy-min-number'));
$stock.attr('data-max-limit', $input.attr('data-original-buy-max-number'));
$price.text(__currency_symbol__+$price.data('default-price'));
if($original_price.length > 0)
{
$cart_info_goods_spec.find('.original-price').text(__currency_symbol__+$cart_info_goods_spec.find('.original-price').data('default-price'));
$original_price.text(__currency_symbol__+$original_price.data('default-price'));
}
}
@ -176,8 +297,8 @@ function GoodsCartInfoBuyCartCheck()
var $stock = $cart_info_goods_spec.find('.stock-tips .stock');
var stock = parseInt($cart_info_goods_spec.find('.number-operate input').val() || 1);
var inventory = parseInt($stock.text());
var min = $stock.data('min-limit') || 1;
var max = $stock.data('max-limit') || 0;
var min = $stock.attr('data-min-limit') || 1;
var max = $stock.attr('data-max-limit') || 0;
var unit = $stock.data('unit') || '';
if(stock < min)
{
@ -254,10 +375,7 @@ $(function()
{
// 商品规格选择
$(document).on('click', '.spec-options ul>li', function()
{
// 切换规格购买数量清空
$cart_info_goods_spec.find('.number-operate input').val($cart_info_goods_spec.find('.stock-tips .stock').data('min-limit') || 1);
{
// 规格处理
var length = $('.goods-spec-content .sku-items').length;
var index = $(this).parents('.sku-items').index();
@ -322,24 +440,52 @@ $(function()
var stock = parseInt($input.val());
var type = $(this).data('type');
var temp_stock = (type == 'add') ? stock+1 : stock-1;
var unit = $cart_info_goods_spec.find('.stock-tips .stock').data('unit') || '';
if(temp_stock < min)
{
temp_stock = min;
Prompt('不能小于最低限购('+min+')');
$input.val(min);
Prompt((window['lang_goods_stock_min_tips'] || '最低起购数量')+min+unit);
return false;
}
if(temp_stock > max)
{
temp_stock = max;
Prompt('超过最大限购('+max+')');
$input.val(max);
Prompt((window['lang_goods_stock_max_tips'] || '最大限购数量')+max+unit);
return false;
}
$input.val(temp_stock).blur();
$input.val(temp_stock);
// 数量更新事件
GoodsNumberChange();
});
// 手动输入、失去焦点
$(document).on('blur', '.goods-spec-content .number-operate input', function()
{
if(parseInt($(this).val() || 0) <= 0)
var $stock_tips = $cart_info_goods_spec.find('.stock-tips .stock');
var min = parseInt($stock_tips.attr('data-min-limit')) || 1;
var max = parseInt($stock_tips.attr('data-max-limit')) || 0;
var stock = parseInt($(this).val());
var inventory = parseInt($stock_tips.text());
if(isNaN(stock))
{
$(this).val($(this).attr('min'));
stock = min;
}
if(max > 0 && stock > max)
{
stock = max;
}
if(stock < min)
{
stock = min;
}
if(stock > inventory)
{
stock = inventory;
}
$(this).val(stock);
// 数量更新事件
GoodsNumberChange();
});
$(document).on('focus', '.goods-spec-content .number-operate input', function()
{

View File

@ -106,8 +106,8 @@ function BuyCartCheck(e)
// 参数
var stock = parseInt($('#text_box').val()) || 1;
var inventory = parseInt($('.stock-tips .stock').text());
var min = $('.stock-tips .stock').data('min-limit') || 1;
var max = $('.stock-tips .stock').data('max-limit') || 0;
var min = $('.stock-tips .stock').attr('data-min-limit') || 1;
var max = $('.stock-tips .stock').attr('data-max-limit') || 0;
var unit = $('.stock-tips .stock').data('unit') || '';
if(stock < min)
{
@ -216,24 +216,58 @@ function BuyCartHandle(e)
*/
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);
// 数量处理
var inventory = parseInt(data.spec_base.inventory);
var $input = $('#text_box');
var $stock = $('.stock-tips .stock');
var $origina_price = $('.goods-original-price');
// 起购数
var min = parseInt($input.data('original-buy-min-number'));
var buy_min_number = parseInt(data.spec_base.buy_min_number);
if(buy_min_number > 0)
{
min = buy_min_number;
}
$input.attr('min', min);
// 限购数
var max = inventory;
var buy_max_number = parseInt(data.spec_base.buy_max_number);
if(buy_max_number > 0 && buy_max_number < max)
{
max = buy_max_number;
}
$input.attr('max', max);
$stock.text(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();
$origina_price.text(__currency_symbol__+data.spec_base.original_price);
$origina_price.parents('.items').show();
} else {
$('.goods-original-price').parents('.items').hide();
$origina_price.parents('.items').hide();
}
// 已选数量校验、超出规格数量则以规格数量为准
var stock = parseInt($('#text_box').val());
if(stock > data.spec_base.inventory)
var stock = parseInt($input.val());
if(min > 0 && stock < min)
{
$('#text_box').val(data.spec_base.inventory);
stock = min;
}
if(max > 0 && stock > max)
{
stock = max;
}
if(stock > inventory)
{
stock = inventory;
}
$input.val(stock);
// 扩展数据处理
var extends_element = data.extends_element || [];
@ -247,6 +281,16 @@ function GoodsSpecDetailBackHandle(data)
}
}
}
// 起购/限购
if(min > 0)
{
$stock.attr('data-min-limit', min);
}
if(max > 0)
{
$stock.attr('data-max-limit', max);
}
}
/**
@ -396,15 +440,23 @@ function GoodsSpecType()
*/
function GoodsBaseRestore()
{
$('.text-info .price-now').text(__currency_symbol__+$('.text-info .price-now').data('original-price'));
$('.goods-price').text($('.goods-price').data('original-price'));
$('.number-tag input[type="number"]').attr('max', $('.number-tag input[type="number"]').data('original-max'));
$('.stock-tips .stock').text($('.stock-tips .stock').data('original-stock'));
var $input = $('#text_box');
var $stock = $('.stock-tips .stock');
var $price = $('.goods-price');
var $price_now = $('.text-info .price-now');
var $original_price_value = $('.tb-detail-price .original-price-value');
$input.attr('min', $input.data('original-buy-min-number'));
$input.attr('max', $stock.data('original-max'));
$stock.text($stock.data('original-inventory'));
$stock.attr('data-min-limit', $input.attr('data-original-buy-min-number'));
$stock.attr('data-max-limit', $input.attr('data-original-buy-max-number'));
// 价格处理
if($('.tb-detail-price .original-price-value').length > 0)
$price_now.text(__currency_symbol__+$price_now.data('original-price'));
$price.text($price.data('original-price'));
if($original_price_value.length > 0)
{
$('.tb-detail-price .original-price-value').each(function(k, v)
$original_price_value.each(function(k, v)
{
var price = $(this).data('original-price');
if(price !== undefined)
@ -446,7 +498,7 @@ function GoodsNumberChange()
// ajax请求
$.ajax({
url: RequestUrlHandle($('#text_box').data('ajax-url')),
url: RequestUrlHandle(__goods_stock_url__),
type: 'post',
dataType: "json",
timeout: 10000,
@ -699,13 +751,13 @@ $(function() {
//获得文本框对象
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') || '';
// 手动输入
$input.on('blur', function()
{
var min = parseInt($stock_tips.attr('data-min-limit')) || 1;
var max = parseInt($stock_tips.attr('data-max-limit')) || 0;
var stock = parseInt($(this).val());
var inventory = parseInt($stock_tips.text());
if(isNaN(stock))
@ -733,6 +785,7 @@ $(function() {
//数量增加操作
$('#add').on('click', function()
{
var max = parseInt($stock_tips.attr('data-max-limit')) || 0;
var inventory = parseInt($stock_tips.text());
var stock = parseInt($input.val())+1;
if(max > 0 && stock > max)
@ -743,7 +796,7 @@ $(function() {
}
if(stock > inventory)
{
$input.val(min);
$input.val(inventory);
Prompt((window['lang_goods_inventory_number_tips'] || '库存数量')+inventory+unit);
return false;
}
@ -755,6 +808,7 @@ $(function() {
//数量减少操作
$('#min').on('click', function()
{
var min = parseInt($stock_tips.attr('data-min-limit')) || 1;
var value = parseInt($input.val())-1;
if(value < min)
{