|
@@ -25,6 +25,7 @@ import ImageSelector from '@/client/admin-shadcn/components/ImageSelector';
|
|
|
import GoodsCategorySelector from '@/client/admin-shadcn/components/GoodsCategorySelector';
|
|
import GoodsCategorySelector from '@/client/admin-shadcn/components/GoodsCategorySelector';
|
|
|
import GoodsCategoryCascadeSelector from '@/client/admin-shadcn/components/GoodsCategoryCascadeSelector';
|
|
import GoodsCategoryCascadeSelector from '@/client/admin-shadcn/components/GoodsCategoryCascadeSelector';
|
|
|
import SupplierSelector from '@/client/admin-shadcn/components/SupplierSelector';
|
|
import SupplierSelector from '@/client/admin-shadcn/components/SupplierSelector';
|
|
|
|
|
+import MerchantSelector from '@/client/admin-shadcn/components/MerchantSelector';
|
|
|
import { Search, Plus, Edit, Trash2, Package } from 'lucide-react';
|
|
import { Search, Plus, Edit, Trash2, Package } from 'lucide-react';
|
|
|
|
|
|
|
|
type CreateRequest = InferRequestType<typeof goodsClient.$post>['json'];
|
|
type CreateRequest = InferRequestType<typeof goodsClient.$post>['json'];
|
|
@@ -55,6 +56,7 @@ export const GoodsPage = () => {
|
|
|
categoryId3: 0,
|
|
categoryId3: 0,
|
|
|
goodsType: 1,
|
|
goodsType: 1,
|
|
|
supplierId: null,
|
|
supplierId: null,
|
|
|
|
|
+ merchantId: null,
|
|
|
imageFileId: null,
|
|
imageFileId: null,
|
|
|
slideImageIds: [],
|
|
slideImageIds: [],
|
|
|
detail: '',
|
|
detail: '',
|
|
@@ -174,6 +176,7 @@ export const GoodsPage = () => {
|
|
|
categoryId3: goods.categoryId3,
|
|
categoryId3: goods.categoryId3,
|
|
|
goodsType: goods.goodsType,
|
|
goodsType: goods.goodsType,
|
|
|
supplierId: goods.supplierId,
|
|
supplierId: goods.supplierId,
|
|
|
|
|
+ merchantId: goods.merchantId,
|
|
|
imageFileId: goods.imageFileId,
|
|
imageFileId: goods.imageFileId,
|
|
|
slideImageIds: goods.slideImages?.map(img => img.id) || [],
|
|
slideImageIds: goods.slideImages?.map(img => img.id) || [],
|
|
|
detail: goods.detail || '',
|
|
detail: goods.detail || '',
|
|
@@ -252,6 +255,7 @@ export const GoodsPage = () => {
|
|
|
<TableHead>库存</TableHead>
|
|
<TableHead>库存</TableHead>
|
|
|
<TableHead>销量</TableHead>
|
|
<TableHead>销量</TableHead>
|
|
|
<TableHead>供应商</TableHead>
|
|
<TableHead>供应商</TableHead>
|
|
|
|
|
+ <TableHead>商户</TableHead>
|
|
|
<TableHead>状态</TableHead>
|
|
<TableHead>状态</TableHead>
|
|
|
<TableHead>创建时间</TableHead>
|
|
<TableHead>创建时间</TableHead>
|
|
|
<TableHead className="text-right">操作</TableHead>
|
|
<TableHead className="text-right">操作</TableHead>
|
|
@@ -278,6 +282,7 @@ export const GoodsPage = () => {
|
|
|
<TableCell>{goods.stock}</TableCell>
|
|
<TableCell>{goods.stock}</TableCell>
|
|
|
<TableCell>{goods.salesNum}</TableCell>
|
|
<TableCell>{goods.salesNum}</TableCell>
|
|
|
<TableCell>{goods.supplier?.name || '-'}</TableCell>
|
|
<TableCell>{goods.supplier?.name || '-'}</TableCell>
|
|
|
|
|
+ <TableCell>{goods.merchant?.name || goods.merchant?.username || '-'}</TableCell>
|
|
|
<TableCell>
|
|
<TableCell>
|
|
|
<Badge variant={goods.state === 1 ? 'default' : 'secondary'}>
|
|
<Badge variant={goods.state === 1 ? 'default' : 'secondary'}>
|
|
|
{goods.state === 1 ? '可用' : '不可用'}
|
|
{goods.state === 1 ? '可用' : '不可用'}
|
|
@@ -402,6 +407,25 @@ export const GoodsPage = () => {
|
|
|
)}
|
|
)}
|
|
|
/>
|
|
/>
|
|
|
|
|
|
|
|
|
|
+ <FormField
|
|
|
|
|
+ control={createForm.control}
|
|
|
|
|
+ name="merchantId"
|
|
|
|
|
+ render={({ field }) => (
|
|
|
|
|
+ <FormItem>
|
|
|
|
|
+ <FormLabel>商户</FormLabel>
|
|
|
|
|
+ <FormControl>
|
|
|
|
|
+ <MerchantSelector
|
|
|
|
|
+ value={field.value || undefined}
|
|
|
|
|
+ onChange={field.onChange}
|
|
|
|
|
+ />
|
|
|
|
|
+ </FormControl>
|
|
|
|
|
+ <FormMessage />
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ )}
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div className="grid grid-cols-2 gap-4">
|
|
|
<FormField
|
|
<FormField
|
|
|
control={createForm.control}
|
|
control={createForm.control}
|
|
|
name="goodsType"
|
|
name="goodsType"
|
|
@@ -426,6 +450,20 @@ export const GoodsPage = () => {
|
|
|
</FormItem>
|
|
</FormItem>
|
|
|
)}
|
|
)}
|
|
|
/>
|
|
/>
|
|
|
|
|
+
|
|
|
|
|
+ <FormField
|
|
|
|
|
+ control={createForm.control}
|
|
|
|
|
+ name="stock"
|
|
|
|
|
+ render={({ field }) => (
|
|
|
|
|
+ <FormItem>
|
|
|
|
|
+ <FormLabel>库存 <span className="text-red-500">*</span></FormLabel>
|
|
|
|
|
+ <FormControl>
|
|
|
|
|
+ <Input type="number" placeholder="0" {...field} />
|
|
|
|
|
+ </FormControl>
|
|
|
|
|
+ <FormMessage />
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ )}
|
|
|
|
|
+ />
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<FormField
|
|
<FormField
|
|
@@ -571,6 +609,42 @@ export const GoodsPage = () => {
|
|
|
|
|
|
|
|
<GoodsCategoryCascadeSelector />
|
|
<GoodsCategoryCascadeSelector />
|
|
|
|
|
|
|
|
|
|
+ <div className="grid grid-cols-2 gap-4">
|
|
|
|
|
+ <FormField
|
|
|
|
|
+ control={updateForm.control}
|
|
|
|
|
+ name="supplierId"
|
|
|
|
|
+ render={({ field }) => (
|
|
|
|
|
+ <FormItem>
|
|
|
|
|
+ <FormLabel>供应商</FormLabel>
|
|
|
|
|
+ <FormControl>
|
|
|
|
|
+ <SupplierSelector
|
|
|
|
|
+ value={field.value || undefined}
|
|
|
|
|
+ onChange={field.onChange}
|
|
|
|
|
+ />
|
|
|
|
|
+ </FormControl>
|
|
|
|
|
+ <FormMessage />
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ )}
|
|
|
|
|
+ />
|
|
|
|
|
+
|
|
|
|
|
+ <FormField
|
|
|
|
|
+ control={updateForm.control}
|
|
|
|
|
+ name="merchantId"
|
|
|
|
|
+ render={({ field }) => (
|
|
|
|
|
+ <FormItem>
|
|
|
|
|
+ <FormLabel>商户</FormLabel>
|
|
|
|
|
+ <FormControl>
|
|
|
|
|
+ <MerchantSelector
|
|
|
|
|
+ value={field.value || undefined}
|
|
|
|
|
+ onChange={field.onChange}
|
|
|
|
|
+ />
|
|
|
|
|
+ </FormControl>
|
|
|
|
|
+ <FormMessage />
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ )}
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
<div className="grid grid-cols-2 gap-4">
|
|
<div className="grid grid-cols-2 gap-4">
|
|
|
<FormField
|
|
<FormField
|
|
|
control={updateForm.control}
|
|
control={updateForm.control}
|