优化:商品编辑增加按件卖(默认)/按批卖设置

This commit is contained in:
wuhui_zzw 2023-09-20 16:37:49 +08:00
parent 19df41c8d4
commit 3c62e8af7d
6 changed files with 117 additions and 20 deletions

View File

@ -44,6 +44,10 @@ class ProductRequest extends FormRequest
if($this->active == 1){
$rules['minimum_order'] = 'required|numeric|gt:0';
}
// 判断:销售方式为按 批 卖每批的数量必须大于0
if($this->sales_method == 'batches'){
$rules['piece_to_batch'] = 'required|numeric|gt:0';
}
return $rules;
}
@ -58,6 +62,7 @@ class ProductRequest extends FormRequest
'skus.*.origin_price' => trans('product.origin_price'),
// 'skus.*.cost_price' => trans('product.cost_price'),
'minimum_order' => trans('product.minimum_order'),
'piece_to_batch' => trans('product.one_batch_is_equal_to'),
];
}
}

View File

@ -11,7 +11,24 @@ class Product extends Base
use HasFactory;
use SoftDeletes;
protected $fillable = ['images', 'video', 'position', 'brand_id', 'tax_class_id', 'weight', 'weight_class', 'active', 'variables', 'price_setting', 'length', 'width', 'height', 'minimum_order'];
protected $fillable = [
'images',
'video',
'position',
'brand_id',
'tax_class_id',
'weight',
'weight_class',
'active',
'variables',
'price_setting',
'length',
'width',
'height',
'minimum_order',
'sales_method',
'piece_to_batch'
];
protected $casts = [
'active' => 'boolean',

View File

@ -95,21 +95,31 @@
<x-admin-form-input name="position" :title="__('common.sort_order')" :value="old('position', $product->position ?? '0')" />
<x-admin::form.row :title="__('admin/product.length_width_height')">
<div class="d-flex wp-400">
<input type="text" name="length" placeholder="{{ __('admin/product.length') }}" value="{{ old('weight', $product->length ?? '') }}" class="form-control" style="flex: 0 0 95px" /><div style="width: 40px;line-height: 34px;text-align:center">CM X</div>
<input type="text" name="width" placeholder="{{ __('admin/product.width') }}" value="{{ old('weight', $product->width ?? '') }}" class="form-control" style="flex: 0 0 95px" /><div style="width: 40px;line-height: 34px;text-align:center">CM X</div>
<input type="text" name="height" placeholder="{{ __('admin/product.height') }}" value="{{ old('weight', $product->height ?? '') }}" class="form-control" style="flex: 0 0 95px" /><div style="width: 30px;line-height: 34px;text-align:center">CM</div>
<div class="d-flex wp-500">
<input type="text" name="length" placeholder="{{ __('admin/product.length') }}" value="{{ old('weight', $product->length ?? '') }}" class="form-control" style="flex: 0 0 95px" />
<div style="width: 40px;line-height: 34px;text-align:center">CM X</div>
<input type="text" name="width" placeholder="{{ __('admin/product.width') }}" value="{{ old('weight', $product->width ?? '') }}" class="form-control" style="flex: 0 0 95px" />
<div style="width: 40px;line-height: 34px;text-align:center">CM X</div>
<input type="text" name="height" placeholder="{{ __('admin/product.height') }}" value="{{ old('weight', $product->height ?? '') }}" class="form-control" style="flex: 0 0 95px" />
<div style="width: 30px;line-height: 34px;text-align:center">CM</div>
<div v-if="form.sales_method == 'piece'" style="width: 30px;line-height: 34px;text-align:center">/{{ __('product.piece') }}</div>
<div v-else style="width: 30px;line-height: 34px;text-align:center">/{{ __('product.batches') }}</div>
</div>
</x-admin::form.row>
<x-admin::form.row :title="__('admin/product.weight_text')">
<div class="d-flex wp-400">
<div class="d-flex wp-500">
<input type="text" name="weight" placeholder="{{ __('admin/product.weight_text') }}" value="{{ old('weight', $product->weight ?? '') }}" class="form-control" style="flex: 0 0 260px" />
<select class="form-select ms-4 bg-white" name="weight_class">
<select class="form-select ms-4 bg-white wp-100" name="weight_class">
@foreach ($weight_classes as $item)
<option value="{{ $item }}" {{ $product->weight_class == $item ? 'selected' : '' }}>{{ __('product.' . $item) }}</option>
@endforeach
</select>
<div v-if="form.sales_method == 'piece'" style="width: 30px;line-height: 34px;text-align:center">/{{ __('product.piece') }}</div>
<div v-else style="width: 30px;line-height: 34px;text-align:center">/{{ __('product.batches') }}</div>
</div>
</x-admin::form.row>
@ -138,6 +148,28 @@
{{--计量单位--}}
<x-admin-form-input-locale :width="600" name="descriptions.*.unit" title="{{ __('product.unit_of_measurement') }}" :value="$descriptions" :required="true" />
{{--销售方式--}}
<x-admin::form.row title="{{ __('product.sales_method') }}">
<div class="mb-1 mt-2">
<div class="form-check form-check-inline">
<input v-model="form.sales_method" class="form-check-input" id="sales_method-piece" type="radio" name="sales_method" value="piece">
<label class="form-check-label" for="sales_method-piece">{{ __('product.sales_method_piece') }}</label>
</div>
<div class="form-check form-check-inline">
<input v-model="form.sales_method" class="form-check-input" id="sales_method-batches" type="radio" name="sales_method" value="batches">
<label class="form-check-label" for="sales_method-batches">{{ __('product.sales_method_batches') }}</label>
</div>
</div>
</x-admin::form.row>
<template v-if="form.sales_method == 'batches'">
<x-admin::form.row :title="__('product.one_batch_is_equal_to')" required>
<div class="d-flex wp-400">
<input type="number" v-model="form.piece_to_batch" name="piece_to_batch" class="form-control" style="flex: 0 0 95px" />
<div style="width: 40px;line-height: 34px;text-align:center">{{ __('product.piece') }}</div>
</div>
</x-admin::form.row>
</template>
{{--状态--}}
<x-admin::form.row title="{{ __('common.status') }}">
<div class="mb-1 mt-2">
@ -183,14 +215,26 @@
<div class="num">
<div class="top">
<div class="title"></div>
<input type="number" :name="'numPrices[' + index + '][num]'" v-model="item.num" value="" placeholder="数量" required="required" class="form-control wp-100">
</div>
<div class="tip" ><span style="visibility: hidden;">_</span><span v-if="item.num">@{{ item.num }}</span></div>
<input type="number" :name="'numPrices[' + index + '][num]'" v-model="item.num" value="" placeholder="数量" required="required" class="form-control wp-100">
<div v-if="form.sales_method == 'piece'" style="width: 30px;line-height: 34px;text-align:center">/{{ __('product.piece') }}</div>
<div v-else style="width: 30px;line-height: 34px;text-align:center">/{{ __('product.batches') }}</div>
</div>
<div class="tip" >
<span style="visibility: hidden;">_</span>
<span v-if="item.num">@{{ form.sales_method == 'piece' ? item.num : item.num * form.piece_to_batch }}{{ __('product.piece') }}</span>
</div>
</div>
<div class="price">
<input type="number" :name="'numPrices[' + index + '][price]'" v-model="item.price" value="" placeholder="价格" required="required" step="any" class="form-control wp-100">
<div class="tip" v-if="item.price">@{{ item.num }}件等于价格:@{{ item.num * item.price }}</div>
<input type="number" :name="'numPrices[' + index + '][price]'" v-model="item.price" value="" placeholder="价格" required="required" step="any" class="form-control wp-100">
<div class="tip" v-if="item.price">
<tmplate v-if="form.sales_method == 'piece'">
@{{ item.num }}件等于价格:@{{ (item.num * item.price).toFixed(2) }}
</tmplate>
<template v-else>
@{{ item.num }}批含@{{ item.num * form.piece_to_batch }}件商品($@{{ item.price }}/件),@{{ item.num }}批总价$@{{ ((item.num * form.piece_to_batch) * item.price).toFixed(2) }}
</template>
</div>
</div>
<div class="delete" @click="removeNumPrices(index)"><a style="cursor: pointer;color: #0072ff;">删除</a></div>
</div>
</div>
@ -204,8 +248,10 @@
</div>
<div class="body">
<div class="item" v-for="(item,index) in form.numPrices">
<div class="num" v-if="index < form.numPrices.length - 1">@{{ item.num }} ~ @{{ form.numPrices[index + 1].num - 1 }}</div>
<div class="num" v-else-if="item.num">@{{ item.num }}</div>
<div class="num" v-if="index < form.numPrices.length - 1">
@{{ form.sales_method == 'piece' ? item.num : item.num * form.piece_to_batch }} ~ @{{ form.sales_method == 'piece' ? (form.numPrices[index + 1].num - 1) : form.numPrices[index + 1].num * form.piece_to_batch - 1 }}
</div>
<div class="num" v-else-if="item.num">@{{ form.sales_method == 'piece' ? item.num : item.num * form.piece_to_batch }}</div>
<div class="price" v-if="item.price">价格@{{ item.price }}</div>
</div>
</div>
@ -396,19 +442,31 @@
{{-- 未开启根据数量设置价格、直接下单产品 --}}
<template v-if="form.price_setting === 'sku' && form.active == 1">
<x-admin::form.row :title="__('admin/product.minimum_order')" required>
<input type="number" name="minimum_order" v-model="form.minimum_order" class="form-control wp-400"/>
<div class="d-flex wp-500">
<input type="number" name="minimum_order" v-model="form.minimum_order" class="form-control"/>
<div v-if="form.sales_method == 'piece'" style="width: 30px;line-height: 34px;text-align:center">/{{ __('product.piece') }}</div>
<div v-else style="width: 30px;line-height: 34px;text-align:center">/{{ __('product.batches') }}</div>
</div>
</x-admin::form.row>
</template>
{{-- 未开启根据数量设置价格、非直接下单商品 --}}
<template v-else-if="form.price_setting === 'sku' && form.active != 1">
<x-admin::form.row :title="__('admin/product.minimum_order')">
<input type="number" name="minimum_order" v-model="form.minimum_order" class="form-control wp-400" />
<div class="d-flex wp-500">
<input type="number" name="minimum_order" v-model="form.minimum_order" class="form-control"/>
<div v-if="form.sales_method == 'piece'" style="width: 30px;line-height: 34px;text-align:center">/{{ __('product.piece') }}</div>
<div v-else style="width: 30px;line-height: 34px;text-align:center">/{{ __('product.batches') }}</div>
</div>
</x-admin::form.row>
</template>
{{--开启根据数量设置价格 - 数量固定为最小起订量--}}
<template v-else>
<x-admin::form.row :title="__('admin/product.minimum_order')" required>
<input type="number" name="minimum_order" :value="form.numPrices.length !== 0 ? form.numPrices[0].num : 0" class="form-control wp-400" readonly/>
<div class="d-flex wp-500">
<input type="number" name="minimum_order" :value="form.numPrices.length !== 0 ? form.numPrices[0].num : 0" class="form-control" readonly/>
<div v-if="form.sales_method == 'piece'" style="width: 30px;line-height: 34px;text-align:center">/{{ __('product.piece') }}</div>
<div v-else style="width: 30px;line-height: 34px;text-align:center">/{{ __('product.batches') }}</div>
</div>
</x-admin::form.row>
</template>
@ -672,6 +730,8 @@
price_setting: @json(old('price_setting', $product->price_setting) ?? 'sku'),
numPrices: @json(old('numPrices', $product->numprices) ?? []),
minimum_order: {{$product->minimum_order ?? 0}},
sales_method: '{{$product->sales_method ?? 'piece'}}',
piece_to_batch: {{$product->piece_to_batch ?? 1}}
},
variablesBatch: {

View File

@ -50,7 +50,10 @@ return [
'width' => 'Width',
'height' => 'Height',
'weight_class' => 'weight unit',
'price_setting_by' =>[
'sku' => 'Set prices based on specifications',
'num' => 'Set prices based on quantity',
],
'confirm_batch_product' => 'Are you sure you want to delete the selected products in batches? ',
'confirm_batch_status' => 'Confirm to modify the status of the selected products in batches? ',
'confirm_batch_restore' => 'Confirm to restore the selected product? ',

View File

@ -30,5 +30,11 @@ return [
'has_been_inactive' => 'The product has been inactive',
'minimum_order' => 'Min Order',
'minimum_order_error' => 'The purchase quantity must be greater than or equal to :num',
'unit_of_measurement' => 'Unit of measurement'
'unit_of_measurement' => 'Unit of measurement',
'sales_method' => 'Sales method',
'sales_method_piece' => 'Sell by piece',
'sales_method_batches' => 'Sold in batches',
'one_batch_is_equal_to' => 'one batch is equal to',
'piece' => 'piece',
'batches' => 'batches',
];

View File

@ -31,5 +31,11 @@ return [
'has_been_inactive' => '该商品已下架',
'minimum_order' => '起订量',
'minimum_order_error' => '采购数量必须大于等于:num',
'unit_of_measurement' => '计量单位'
'unit_of_measurement' => '计量单位',
'sales_method' => '销售方式',
'sales_method_piece' => '按件卖',
'sales_method_batches' => '按批卖',
'one_batch_is_equal_to' => '1批等于',
'piece' => '件',
'batches' => '批',
];