fix: 更新商品代號驗證規則為 2-8 碼
All checks were successful
Koori-ERP-Deploy-System / deploy-demo (push) Has been skipped
Koori-ERP-Deploy-System / deploy-production (push) Successful in 52s

1. ProductImport.php: 匯入規則調整
2. ProductController.php: 新增/編輯 API 規則調整
3. UI: 匯入與編輯視窗提示更新
This commit is contained in:
2026-02-02 15:07:12 +08:00
parent b0192e9b66
commit f87310e707
4 changed files with 10 additions and 10 deletions

View File

@@ -114,7 +114,7 @@ class ProductController extends Controller
public function store(Request $request) public function store(Request $request)
{ {
$validated = $request->validate([ $validated = $request->validate([
'code' => 'required|string|min:1|max:5|unique:products,code', 'code' => 'required|string|min:2|max:8|unique:products,code',
'barcode' => 'required|string|unique:products,barcode', 'barcode' => 'required|string|unique:products,barcode',
'name' => 'required|string|max:255', 'name' => 'required|string|max:255',
'category_id' => 'required|exists:categories,id', 'category_id' => 'required|exists:categories,id',
@@ -127,8 +127,8 @@ class ProductController extends Controller
'purchase_unit_id' => 'nullable|exists:units,id', 'purchase_unit_id' => 'nullable|exists:units,id',
], [ ], [
'code.required' => '商品代號為必填', 'code.required' => '商品代號為必填',
'code.max' => '商品代號最多 5 碼', 'code.max' => '商品代號最多 8 碼',
'code.min' => '商品代號最少 1 碼', 'code.min' => '商品代號最少 2 碼',
'code.unique' => '商品代號已存在', 'code.unique' => '商品代號已存在',
'barcode.required' => '條碼編號為必填', 'barcode.required' => '條碼編號為必填',
'barcode.unique' => '條碼編號已存在', 'barcode.unique' => '條碼編號已存在',
@@ -153,7 +153,7 @@ class ProductController extends Controller
public function update(Request $request, Product $product) public function update(Request $request, Product $product)
{ {
$validated = $request->validate([ $validated = $request->validate([
'code' => 'required|string|min:1|max:5|unique:products,code,' . $product->id, 'code' => 'required|string|min:2|max:8|unique:products,code,' . $product->id,
'barcode' => 'required|string|unique:products,barcode,' . $product->id, 'barcode' => 'required|string|unique:products,barcode,' . $product->id,
'name' => 'required|string|max:255', 'name' => 'required|string|max:255',
'category_id' => 'required|exists:categories,id', 'category_id' => 'required|exists:categories,id',
@@ -165,8 +165,8 @@ class ProductController extends Controller
'purchase_unit_id' => 'nullable|exists:units,id', 'purchase_unit_id' => 'nullable|exists:units,id',
], [ ], [
'code.required' => '商品代號為必填', 'code.required' => '商品代號為必填',
'code.max' => '商品代號最多 5 碼', 'code.max' => '商品代號最多 8 碼',
'code.min' => '商品代號最少 1 碼', 'code.min' => '商品代號最少 2 碼',
'code.unique' => '商品代號已存在', 'code.unique' => '商品代號已存在',
'barcode.required' => '條碼編號為必填', 'barcode.required' => '條碼編號為必填',
'barcode.unique' => '條碼編號已存在', 'barcode.unique' => '條碼編號已存在',

View File

@@ -80,7 +80,7 @@ class ProductImport implements ToModel, WithHeadingRow, WithValidation, WithMapp
public function rules(): array public function rules(): array
{ {
return [ return [
'商品代號' => ['required', 'string', 'min:1', 'max:5', 'unique:products,code'], '商品代號' => ['required', 'string', 'min:2', 'max:8', 'unique:products,code'],
'條碼' => ['required', 'string', 'unique:products,barcode'], '條碼' => ['required', 'string', 'unique:products,barcode'],
'商品名稱' => ['required', 'string'], '商品名稱' => ['required', 'string'],
'類別名稱' => ['required', function($attribute, $value, $fail) { '類別名稱' => ['required', function($attribute, $value, $fail) {

View File

@@ -160,8 +160,8 @@ export default function ProductDialog({
id="code" id="code"
value={data.code} value={data.code}
onChange={(e) => setData("code", e.target.value)} onChange={(e) => setData("code", e.target.value)}
placeholder="例A1 (最多2碼)" placeholder="例A1 (2-8碼)"
maxLength={2} maxLength={8}
className={errors.code ? "border-red-500" : ""} className={errors.code ? "border-red-500" : ""}
/> />
{errors.code && <p className="text-sm text-red-500">{errors.code}</p>} {errors.code && <p className="text-sm text-red-500">{errors.code}</p>}

View File

@@ -111,7 +111,7 @@ export default function ProductImportDialog({ open, onOpenChange }: ProductImpor
<AccordionContent> <AccordionContent>
<div className="text-sm text-gray-600 space-y-2 pb-2 pl-6"> <div className="text-sm text-gray-600 space-y-2 pb-2 pl-6">
<ul className="list-disc space-y-1"> <ul className="list-disc space-y-1">
<li><span className="font-medium text-gray-700"></span> (1-5 )</li> <li><span className="font-medium text-gray-700"></span> (2-8 )</li>
<li><span className="font-medium text-gray-700"></span></li> <li><span className="font-medium text-gray-700"></span></li>
<li><span className="font-medium text-gray-700"></span></li> <li><span className="font-medium text-gray-700"></span></li>
<li><span className="font-medium text-gray-700"></span> 0</li> <li><span className="font-medium text-gray-700"></span> 0</li>