first version

This commit is contained in:
liu
2026-07-23 20:41:25 +08:00
parent 00a0938a1b
commit 10cff754a4
211 changed files with 11577 additions and 842 deletions
@@ -0,0 +1,39 @@
<?php
namespace App\Http\Requests\Customer;
use Illuminate\Validation\Rule;
use Modules\Common\Http\Requests\BaseFormRequest;
/**
* 客户等级 创建/编辑 验证
*/
class CustomerLevelFormRequest extends BaseFormRequest
{
protected $stopOnFirstFailure = true;
public function rules(): array
{
$unique = Rule::unique('customer_level', 'name');
if ($this->isUpdate()) {
$unique = $unique->ignore($this->route('id'));
}
return [
'name' => ['required', 'string', 'max:50', $unique],
'sort' => 'nullable|integer',
'status' => 'nullable|integer|in:0,1',
'remark' => 'nullable|string|max:255',
];
}
public function messages(): array
{
return [
'name.required' => '等级名称不能为空',
'name.max' => '等级名称最长 50 个字符',
'name.unique' => '等级名称已存在',
'status.in' => '状态值不正确',
];
}
}
@@ -0,0 +1,34 @@
<?php
namespace App\Http\Requests\Customer;
use Modules\Common\Http\Requests\BaseFormRequest;
/**
* 小程序用户绑定 验证(type=1 门店需 store_idtype=2 供应商需 supplier_id
*/
class MiniUserBindRequest extends BaseFormRequest
{
protected $stopOnFirstFailure = true;
public function rules(): array
{
return [
'type' => 'required|integer|in:1,2',
'store_id' => 'required_if:type,1|nullable|integer|min:1',
'supplier_id' => 'required_if:type,2|nullable|integer|min:1',
];
}
public function messages(): array
{
return [
'type.required' => '请选择用户类型',
'type.in' => '用户类型只能是门店或供应商',
'store_id.required_if' => '绑定门店时必须选择门店',
'store_id.min' => '门店ID不正确',
'supplier_id.required_if' => '绑定供应商时必须选择供应商',
'supplier_id.min' => '供应商ID不正确',
];
}
}
@@ -0,0 +1,39 @@
<?php
namespace App\Http\Requests\Customer;
use Modules\Common\Http\Requests\BaseFormRequest;
/**
* 通知 创建 验证(user_id 留空 = 全员广播)
*/
class NoticeFormRequest extends BaseFormRequest
{
protected $stopOnFirstFailure = true;
protected function prepareForValidation(): void
{
$this->merge(['user_id' => (int) ($this->input('user_id') ?? 0)]);
}
public function rules(): array
{
return [
'user_id' => 'required|integer|min:0',
'type' => 'required|string|in:order,price,system',
'title' => 'required|string|max:100',
'content' => 'nullable|string|max:500',
];
}
public function messages(): array
{
return [
'type.required' => '通知类型不能为空',
'type.in' => '通知类型只能是 order/price/system',
'title.required' => '通知标题不能为空',
'title.max' => '通知标题最长 100 个字符',
'content.max' => '通知内容最长 500 个字符',
];
}
}
@@ -0,0 +1,49 @@
<?php
namespace App\Http\Requests\Customer;
use Illuminate\Validation\Rule;
use Modules\Common\Http\Requests\BaseFormRequest;
/**
* 门店 创建/编辑 验证
*/
class StoreFormRequest extends BaseFormRequest
{
protected $stopOnFirstFailure = true;
public function rules(): array
{
$unique = Rule::unique('store', 'code');
if ($this->isUpdate()) {
$unique = $unique->ignore($this->route('id'));
}
return [
'name' => 'required|string|max:100',
'code' => ['required', 'string', 'max:50', $unique],
'level_id' => 'required|integer|exists:customer_level,id',
'contact' => 'nullable|string|max:50',
'phone' => 'nullable|string|max:20',
'address' => 'nullable|string|max:255',
'payment_cycle_days' => 'nullable|integer|min:0',
'status' => 'nullable|integer|in:0,1',
'remark' => 'nullable|string|max:255',
];
}
public function messages(): array
{
return [
'name.required' => '门店名称不能为空',
'name.max' => '门店名称最长 100 个字符',
'code.required' => '门店编码不能为空',
'code.unique' => '门店编码已存在',
'level_id.required' => '请选择客户等级',
'level_id.exists' => '客户等级不存在',
'payment_cycle_days.integer' => '回款周期必须为整数',
'payment_cycle_days.min' => '回款周期不能小于 0',
'status.in' => '状态值不正确',
];
}
}
@@ -0,0 +1,35 @@
<?php
namespace App\Http\Requests\Customer;
use Modules\Common\Http\Requests\BaseFormRequest;
/**
* 供应商 创建/编辑 验证
*/
class SupplierFormRequest extends BaseFormRequest
{
protected $stopOnFirstFailure = true;
public function rules(): array
{
return [
'name' => 'required|string|max:100',
'contact' => 'nullable|string|max:50',
'phone' => 'nullable|string|max:20',
'address' => 'nullable|string|max:255',
'main_products' => 'nullable|string|max:255',
'status' => 'nullable|integer|in:0,1',
'remark' => 'nullable|string|max:255',
];
}
public function messages(): array
{
return [
'name.required' => '供应商名称不能为空',
'name.max' => '供应商名称最长 100 个字符',
'status.in' => '状态值不正确',
];
}
}
@@ -0,0 +1,37 @@
<?php
namespace App\Http\Requests\Mini;
use Modules\Common\Http\Requests\BaseFormRequest;
/**
* 小程序下单 验证(金额一律服务端重算,前端不传金额字段)
*/
class MiniOrderRequest extends BaseFormRequest
{
protected $stopOnFirstFailure = true;
public function rules(): array
{
return [
'items' => 'required|array|min:1',
'items.*.product_id' => 'required|integer|exists:product,id',
'items.*.quantity' => 'required|numeric|min:0.01',
'remark' => 'nullable|string|max:255',
];
}
public function messages(): array
{
return [
'items.required' => '请至少选择一件商品',
'items.min' => '请至少选择一件商品',
'items.*.product_id.required' => '下单商品不能为空',
'items.*.product_id.exists' => '商品不存在',
'items.*.quantity.required' => '订货数量不能为空',
'items.*.quantity.numeric' => '订货数量必须为数字',
'items.*.quantity.min' => '订货数量必须大于 0',
'remark.max' => '订单备注最长 255 个字符',
];
}
}
@@ -0,0 +1,38 @@
<?php
namespace App\Http\Requests\Product;
use Modules\Common\Http\Requests\BaseFormRequest;
/**
* 批量调价 验证(A2 价格矩阵编辑提交)
*/
class BatchPriceRequest extends BaseFormRequest
{
protected $stopOnFirstFailure = true;
public function rules(): array
{
return [
'updates' => 'required|array|min:1',
'updates.*.product_id' => 'required|integer|exists:product,id',
'updates.*.level_id' => 'required|integer|exists:customer_level,id',
'updates.*.price' => 'required|numeric|min:0',
];
}
public function messages(): array
{
return [
'updates.required' => '请至少提交一条价格调整',
'updates.min' => '请至少提交一条价格调整',
'updates.*.product_id.required' => '调价行缺少商品',
'updates.*.product_id.exists' => '商品不存在',
'updates.*.level_id.required' => '调价行缺少客户等级',
'updates.*.level_id.exists' => '客户等级不存在',
'updates.*.price.required' => '调价行缺少单价',
'updates.*.price.numeric' => '单价必须为数字',
'updates.*.price.min' => '单价不能小于 0',
];
}
}
@@ -0,0 +1,38 @@
<?php
namespace App\Http\Requests\Product;
use Modules\Common\Http\Requests\BaseFormRequest;
/**
* 商品分类 创建/编辑 验证
*/
class ProductCategoryFormRequest extends BaseFormRequest
{
protected $stopOnFirstFailure = true;
protected function prepareForValidation(): void
{
$this->merge(['parent_id' => (int) ($this->input('parent_id') ?? 0)]);
}
public function rules(): array
{
return [
'name' => 'required|string|max:50',
'parent_id' => 'required|integer|min:0',
'sort' => 'nullable|integer',
'status' => 'nullable|integer|in:0,1',
];
}
public function messages(): array
{
return [
'name.required' => '分类名称不能为空',
'name.max' => '分类名称最长 50 个字符',
'parent_id.min' => '父级分类ID不正确',
'status.in' => '状态值不正确',
];
}
}
@@ -0,0 +1,49 @@
<?php
namespace App\Http\Requests\Product;
use Modules\Common\Http\Requests\BaseFormRequest;
/**
* 商品档案 创建/编辑 验证(含多等级价格 prices 数组)
*/
class ProductFormRequest extends BaseFormRequest
{
protected $stopOnFirstFailure = true;
public function rules(): array
{
return [
'name' => 'required|string|max:100',
'spec' => 'nullable|string|max:100',
'grade' => 'nullable|string|max:50',
'unit' => 'nullable|string|max:20',
'category_id' => 'required|integer|exists:product_category,id',
'supplier_id' => 'nullable|integer|exclude_if:supplier_id,0|exists:supplier,id',
'image' => 'nullable|string|max:255',
'sort' => 'nullable|integer',
'status' => 'nullable|integer|in:0,1',
'remark' => 'nullable|string|max:255',
'prices' => 'nullable|array',
'prices.*.level_id' => 'required|integer|exists:customer_level,id',
'prices.*.price' => 'required|numeric|min:0',
];
}
public function messages(): array
{
return [
'name.required' => '商品名称不能为空',
'name.max' => '商品名称最长 100 个字符',
'category_id.required' => '请选择商品分类',
'category_id.exists' => '商品分类不存在',
'supplier_id.exists' => '供应商不存在',
'status.in' => '状态值不正确',
'prices.*.level_id.required' => '价格行缺少客户等级',
'prices.*.level_id.exists' => '客户等级不存在',
'prices.*.price.required' => '价格行缺少单价',
'prices.*.price.numeric' => '单价必须为数字',
'prices.*.price.min' => '单价不能小于 0',
];
}
}
@@ -0,0 +1,39 @@
<?php
namespace App\Http\Requests\Purchase;
use Modules\Common\Http\Requests\BaseFormRequest;
/**
* 采购明细修改 验证(C4amount 由后端按 weight>0 ? weight×price : quantity×price 重算)
*/
class PurchaseItemUpdateRequest extends BaseFormRequest
{
protected $stopOnFirstFailure = true;
public function rules(): array
{
return [
'product_name' => 'nullable|string|max:100',
'product_spec' => 'nullable|string|max:100',
'price' => 'required|numeric|min:0',
'quantity' => 'required|numeric|min:0',
'weight' => 'nullable|numeric|min:0',
'remark' => 'nullable|string|max:255',
];
}
public function messages(): array
{
return [
'price.required' => '采购单价不能为空',
'price.numeric' => '采购单价必须为数字',
'price.min' => '采购单价不能小于 0',
'quantity.required' => '采购量不能为空',
'quantity.numeric' => '采购量必须为数字',
'quantity.min' => '采购量不能小于 0',
'weight.numeric' => '实际称重必须为数字',
'weight.min' => '实际称重不能小于 0',
];
}
}
@@ -0,0 +1,38 @@
<?php
namespace App\Http\Requests\Recon;
use Modules\Common\Http\Requests\BaseFormRequest;
/**
* 对账明细修改 验证(D4:订货量/称重/数量/金额/商品信息;diff 与头汇总由后端重算)
*/
class ReconItemUpdateRequest extends BaseFormRequest
{
protected $stopOnFirstFailure = true;
public function rules(): array
{
return [
'product_name' => 'nullable|string|max:100',
'quantity' => 'nullable|numeric|min:0',
'weight' => 'nullable|numeric|min:0',
'publish_amount' => 'nullable|numeric|min:0',
'actual_amount' => 'nullable|numeric|min:0',
];
}
public function messages(): array
{
return [
'quantity.numeric' => '订货量必须为数字',
'quantity.min' => '订货量不能小于 0',
'weight.numeric' => '称重必须为数字',
'weight.min' => '称重不能小于 0',
'publish_amount.numeric' => '公布金额必须为数字',
'publish_amount.min' => '公布金额不能小于 0',
'actual_amount.numeric' => '实际金额必须为数字',
'actual_amount.min' => '实际金额不能小于 0',
];
}
}
@@ -0,0 +1,46 @@
<?php
namespace App\Http\Requests\Recon;
use Modules\Common\Http\Requests\BaseFormRequest;
/**
* 财务对账单 创建/编辑 验证
*/
class ReconciliationFormRequest extends BaseFormRequest
{
protected $stopOnFirstFailure = true;
protected function prepareForValidation(): void
{
$this->merge([
'category_id' => (int) ($this->input('category_id') ?? 0),
'supplier_id' => (int) ($this->input('supplier_id') ?? 0),
]);
}
public function rules(): array
{
return [
'title' => 'required|string|max:100',
'period_start' => 'required|date_format:Y-m-d',
'period_end' => 'required|date_format:Y-m-d|after_or_equal:period_start',
'category_id' => 'required|integer|min:0',
'supplier_id' => 'required|integer|min:0',
'remark' => 'nullable|string|max:255',
];
}
public function messages(): array
{
return [
'title.required' => '对账标题不能为空',
'title.max' => '对账标题最长 100 个字符',
'period_start.required' => '请选择对账周期开始日期',
'period_start.date_format' => '开始日期格式为 Y-m-d',
'period_end.required' => '请选择对账周期结束日期',
'period_end.date_format' => '结束日期格式为 Y-m-d',
'period_end.after_or_equal' => '结束日期不能早于开始日期',
];
}
}