qqq
This commit is contained in:
@@ -380,7 +380,7 @@ export default function EquipmentPage() {
|
||||
<Filter className="h-4 w-4 mr-2" />
|
||||
<SelectValue placeholder="筛选状态" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
<SelectItem value="all">全部状态</SelectItem>
|
||||
<SelectItem value="1">正常</SelectItem>
|
||||
<SelectItem value="2">即将到期</SelectItem>
|
||||
@@ -420,10 +420,10 @@ export default function EquipmentPage() {
|
||||
onValueChange={(value) => setNewEquipment({ ...newEquipment, type: value })}
|
||||
disabled={loadingEquipmentTypes}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectTrigger className="w-full">
|
||||
<SelectValue placeholder={loadingEquipmentTypes ? "加载中..." : "选择设备类型"} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
{Object.entries(equipmentTypes).map(([key, value]) => (
|
||||
<SelectItem key={key} value={key}>
|
||||
{value}
|
||||
@@ -462,7 +462,7 @@ export default function EquipmentPage() {
|
||||
: "选择商户"
|
||||
} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px] overflow-y-auto">
|
||||
{merchants.length === 0 && !loadingMerchants ? (
|
||||
<SelectItem value="no-data" disabled>
|
||||
点击加载商户数据
|
||||
@@ -501,10 +501,10 @@ export default function EquipmentPage() {
|
||||
value={newEquipment.status}
|
||||
onValueChange={(value) => setNewEquipment({ ...newEquipment, status: value })}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectTrigger className="w-full">
|
||||
<SelectValue placeholder="选择设备状态" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
<SelectItem value="normal">正常</SelectItem>
|
||||
<SelectItem value="expiring">即将到期</SelectItem>
|
||||
<SelectItem value="expired">已到期</SelectItem>
|
||||
@@ -564,10 +564,10 @@ export default function EquipmentPage() {
|
||||
onValueChange={(value) => setEditEquipment({ ...editEquipment, type: value })}
|
||||
disabled={loadingEquipmentTypes}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectTrigger className="w-full">
|
||||
<SelectValue placeholder={loadingEquipmentTypes ? "加载中..." : "选择设备类型"} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
{Object.entries(equipmentTypes).map(([key, value]) => (
|
||||
<SelectItem key={key} value={key}>
|
||||
{value}
|
||||
@@ -592,10 +592,10 @@ export default function EquipmentPage() {
|
||||
onValueChange={(value) => setEditEquipment({ ...editEquipment, merchantId: value })}
|
||||
disabled={loadingMerchants}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectTrigger className="w-full">
|
||||
<SelectValue placeholder={loadingMerchants ? "加载中..." : "选择商户"} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
{merchants.map((merchant) => (
|
||||
<SelectItem key={merchant.id} value={merchant.merchantsId || merchant.id}>
|
||||
{merchant.merchantName}
|
||||
@@ -628,10 +628,10 @@ export default function EquipmentPage() {
|
||||
value={editEquipment.status}
|
||||
onValueChange={(value) => setEditEquipment({ ...editEquipment, status: value })}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectTrigger className="w-full">
|
||||
<SelectValue placeholder="选择设备状态" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
<SelectItem value="normal">正常</SelectItem>
|
||||
<SelectItem value="expiring">即将到期</SelectItem>
|
||||
<SelectItem value="expired">已到期</SelectItem>
|
||||
@@ -745,7 +745,7 @@ export default function EquipmentPage() {
|
||||
<div className="space-y-1">
|
||||
<div className="flex items-center space-x-2">
|
||||
<Shield className="h-4 w-4 text-blue-600" />
|
||||
<span className="font-medium text-blue-600">{item.equId}</span>
|
||||
<span className="font-medium text-blue-600">{item.equipmentId}</span>
|
||||
</div>
|
||||
<div className="text-sm font-medium">{item.equipmentName}</div>
|
||||
<div className="text-xs text-gray-500">类型: {equipmentTypeDisplay}</div>
|
||||
|
||||
@@ -416,10 +416,10 @@ export default function MallsPage() {
|
||||
onValueChange={(value) => setNewMall({ ...newMall, provinceCode: value })}
|
||||
disabled={loading}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectTrigger className="w-full">
|
||||
<SelectValue placeholder="请选择省份" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
{provinces.map((province) => (
|
||||
<SelectItem key={province.code} value={province.code}>
|
||||
{province.name}
|
||||
@@ -435,7 +435,7 @@ export default function MallsPage() {
|
||||
onValueChange={(value) => setNewMall({ ...newMall, mallUserId: value })}
|
||||
disabled={loading || !newMall.provinceCode}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectTrigger className="w-full">
|
||||
<SelectValue placeholder={
|
||||
!newMall.provinceCode
|
||||
? "请先选择省份"
|
||||
@@ -444,7 +444,7 @@ export default function MallsPage() {
|
||||
: "请选择商场"
|
||||
} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
{mallUsers.map((mallUser) => (
|
||||
<SelectItem key={mallUser.userId} value={mallUser.userId}>
|
||||
<div className="flex flex-col items-start">
|
||||
|
||||
@@ -676,7 +676,7 @@ export default function MerchantsPage() {
|
||||
{merchant.mallLocation || "无"}
|
||||
</div>
|
||||
</TableCell>
|
||||
<TableCell>{merchant.dealerId || "无"}</TableCell>
|
||||
<TableCell>{merchant.dealerName || "无"}</TableCell>
|
||||
<TableCell>
|
||||
<div className="flex items-start">
|
||||
<MapPin className="h-4 w-4 mr-1 text-gray-400 mt-0.5 flex-shrink-0" />
|
||||
@@ -774,139 +774,141 @@ export default function MerchantsPage() {
|
||||
</Card>
|
||||
|
||||
<Dialog open={isAddMerchantOpen} onOpenChange={setIsAddMerchantOpen}>
|
||||
<DialogContent className="max-w-2xl">
|
||||
<DialogHeader>
|
||||
<DialogContent className="max-w-2xl max-h-[90vh] flex flex-col">
|
||||
<DialogHeader className="flex-shrink-0">
|
||||
<DialogTitle>添加新商户</DialogTitle>
|
||||
<DialogDescription>填写商户基本信息和地址详情</DialogDescription>
|
||||
</DialogHeader>
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="province">选择省份</Label>
|
||||
<Select
|
||||
value={newMerchant.province}
|
||||
onValueChange={handleProvinceChange}
|
||||
disabled={loadingProvinces}
|
||||
onOpenChange={(open) => {
|
||||
if (open && provinces.length === 0 && !loadingProvinces) {
|
||||
fetchProvinces()
|
||||
}
|
||||
}}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder={loadingProvinces ? "加载中..." : "选择省份"} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{provinces.length === 0 && !loadingProvinces ? (
|
||||
<SelectItem value="no-data" disabled>
|
||||
点击加载省份数据
|
||||
</SelectItem>
|
||||
) : (
|
||||
provinces.map((province) => (
|
||||
<SelectItem key={province.code} value={province.code}>
|
||||
{province.name}
|
||||
</SelectItem>
|
||||
))
|
||||
)}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="mall">所属商场(可选)</Label>
|
||||
<Select
|
||||
value={newMerchant.mall}
|
||||
onValueChange={(value) => {
|
||||
const selectedMall = malls.find(mall => mall.mallUser === value)
|
||||
setNewMerchant({
|
||||
...newMerchant,
|
||||
mall: selectedMall?.mallId || value,
|
||||
mallUserId: value
|
||||
})
|
||||
}}
|
||||
disabled={loadingMalls || !newMerchant.province}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder={
|
||||
!newMerchant.province
|
||||
? "请先选择省份"
|
||||
: loadingMalls
|
||||
? "加载中..."
|
||||
: "选择商场(可选)"
|
||||
} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{malls.map((mall) => (
|
||||
<SelectItem key={mall.mallUser || mall.id} value={mall.mallUser}>
|
||||
{mall.mallName}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="name">商户名称</Label>
|
||||
<Input
|
||||
id="name"
|
||||
value={newMerchant.name}
|
||||
onChange={(e) => setNewMerchant({ ...newMerchant, name: e.target.value })}
|
||||
placeholder="请输入商户名称"
|
||||
/>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="contact">联系人</Label>
|
||||
<Input
|
||||
id="contact"
|
||||
value={newMerchant.contact}
|
||||
onChange={(e) => setNewMerchant({ ...newMerchant, contact: e.target.value })}
|
||||
placeholder="请输入联系人姓名"
|
||||
/>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="phone">联系电话</Label>
|
||||
<Input
|
||||
id="phone"
|
||||
value={newMerchant.phone}
|
||||
onChange={(e) => setNewMerchant({ ...newMerchant, phone: e.target.value })}
|
||||
placeholder="请输入联系电话"
|
||||
/>
|
||||
</div>
|
||||
{userRole === "admin" && (
|
||||
<div className="flex-1 overflow-y-auto pr-2">
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="totalMerchant">选择总商户(可选)</Label>
|
||||
<Label htmlFor="province">选择省份</Label>
|
||||
<Select
|
||||
value={newMerchant.totalMerchant}
|
||||
onValueChange={(value) => setNewMerchant({ ...newMerchant, totalMerchant: value })}
|
||||
disabled={loadingTotalMerchants}
|
||||
value={newMerchant.province}
|
||||
onValueChange={handleProvinceChange}
|
||||
disabled={loadingProvinces}
|
||||
onOpenChange={(open) => {
|
||||
if (open && totalMerchants.length === 0 && !loadingTotalMerchants) {
|
||||
fetchTotalMerchants()
|
||||
if (open && provinces.length === 0 && !loadingProvinces) {
|
||||
fetchProvinces()
|
||||
}
|
||||
}}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder={loadingTotalMerchants ? "加载中..." : "选择总商户(可选)"} />
|
||||
<SelectTrigger className="w-full">
|
||||
<SelectValue placeholder={loadingProvinces ? "加载中..." : "选择省份"} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{totalMerchants.map((merchant) => (
|
||||
<SelectItem key={merchant.userId} value={merchant.userId}>
|
||||
{merchant.nickName}
|
||||
<SelectContent className="max-h-[300px]">
|
||||
{provinces.length === 0 && !loadingProvinces ? (
|
||||
<SelectItem value="no-data" disabled>
|
||||
点击加载省份数据
|
||||
</SelectItem>
|
||||
) : (
|
||||
provinces.map((province) => (
|
||||
<SelectItem key={province.code} value={province.code}>
|
||||
{province.name}
|
||||
</SelectItem>
|
||||
))
|
||||
)}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="mall">所属商场(可选)</Label>
|
||||
<Select
|
||||
value={newMerchant.mall}
|
||||
onValueChange={(value) => {
|
||||
const selectedMall = malls.find(mall => mall.mallUser === value)
|
||||
setNewMerchant({
|
||||
...newMerchant,
|
||||
mall: selectedMall?.mallId || value,
|
||||
mallUserId: value
|
||||
})
|
||||
}}
|
||||
disabled={loadingMalls || !newMerchant.province}
|
||||
>
|
||||
<SelectTrigger className="w-full">
|
||||
<SelectValue placeholder={
|
||||
!newMerchant.province
|
||||
? "请先选择省份"
|
||||
: loadingMalls
|
||||
? "加载中..."
|
||||
: "选择商场(可选)"
|
||||
} />
|
||||
</SelectTrigger>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
{malls.map((mall) => (
|
||||
<SelectItem key={mall.mallUser || mall.id} value={mall.mallUser}>
|
||||
{mall.mallName}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
)}
|
||||
<div className="col-span-2 space-y-2">
|
||||
<Label htmlFor="detailedAddress">详细地址</Label>
|
||||
<Textarea
|
||||
id="detailedAddress"
|
||||
value={newMerchant.detailedAddress}
|
||||
onChange={(e) => setNewMerchant({ ...newMerchant, detailedAddress: e.target.value })}
|
||||
placeholder="请输入详细地址"
|
||||
rows={3}
|
||||
/>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="name">商户名称</Label>
|
||||
<Input
|
||||
id="name"
|
||||
value={newMerchant.name}
|
||||
onChange={(e) => setNewMerchant({ ...newMerchant, name: e.target.value })}
|
||||
placeholder="请输入商户名称"
|
||||
/>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="contact">联系人</Label>
|
||||
<Input
|
||||
id="contact"
|
||||
value={newMerchant.contact}
|
||||
onChange={(e) => setNewMerchant({ ...newMerchant, contact: e.target.value })}
|
||||
placeholder="请输入联系人姓名"
|
||||
/>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="phone">联系电话</Label>
|
||||
<Input
|
||||
id="phone"
|
||||
value={newMerchant.phone}
|
||||
onChange={(e) => setNewMerchant({ ...newMerchant, phone: e.target.value })}
|
||||
placeholder="请输入联系电话"
|
||||
/>
|
||||
</div>
|
||||
{userRole === "admin" && (
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="totalMerchant">选择总商户(可选)</Label>
|
||||
<Select
|
||||
value={newMerchant.totalMerchant}
|
||||
onValueChange={(value) => setNewMerchant({ ...newMerchant, totalMerchant: value })}
|
||||
disabled={loadingTotalMerchants}
|
||||
onOpenChange={(open) => {
|
||||
if (open && totalMerchants.length === 0 && !loadingTotalMerchants) {
|
||||
fetchTotalMerchants()
|
||||
}
|
||||
}}
|
||||
>
|
||||
<SelectTrigger className="w-full">
|
||||
<SelectValue placeholder={loadingTotalMerchants ? "加载中..." : "选择总商户(可选)"} />
|
||||
</SelectTrigger>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
{totalMerchants.map((merchant) => (
|
||||
<SelectItem key={merchant.userId} value={merchant.userId}>
|
||||
{merchant.nickName}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
)}
|
||||
<div className="col-span-2 space-y-2">
|
||||
<Label htmlFor="detailedAddress">详细地址</Label>
|
||||
<Textarea
|
||||
id="detailedAddress"
|
||||
value={newMerchant.detailedAddress}
|
||||
onChange={(e) => setNewMerchant({ ...newMerchant, detailedAddress: e.target.value })}
|
||||
placeholder="请输入详细地址"
|
||||
rows={3}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex justify-end space-x-2 mt-6">
|
||||
<div className="flex justify-end space-x-2 mt-6 flex-shrink-0 pt-4 border-t">
|
||||
<Button
|
||||
variant="outline"
|
||||
onClick={() => setIsAddMerchantOpen(false)}
|
||||
@@ -946,10 +948,10 @@ export default function MerchantsPage() {
|
||||
value={newEquipment.type}
|
||||
onValueChange={(value) => setNewEquipment({ ...newEquipment, type: value })}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectTrigger className="w-full">
|
||||
<SelectValue placeholder="选择设备类型" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
<SelectItem value="干粉灭火器">干粉灭火器</SelectItem>
|
||||
<SelectItem value="烟雾探测器">烟雾探测器</SelectItem>
|
||||
<SelectItem value="自动喷淋">自动喷淋</SelectItem>
|
||||
@@ -1016,128 +1018,130 @@ export default function MerchantsPage() {
|
||||
|
||||
{/* 编辑商户对话框 */}
|
||||
<Dialog open={isEditMerchantOpen} onOpenChange={setIsEditMerchantOpen}>
|
||||
<DialogContent className="max-w-2xl">
|
||||
<DialogHeader>
|
||||
<DialogContent className="max-w-2xl max-h-[90vh] flex flex-col">
|
||||
<DialogHeader className="flex-shrink-0">
|
||||
<DialogTitle>编辑商户</DialogTitle>
|
||||
<DialogDescription>修改商户基本信息和地址详情</DialogDescription>
|
||||
</DialogHeader>
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="edit-province">选择省份</Label>
|
||||
<Select
|
||||
value={editMerchant.province}
|
||||
onValueChange={handleEditProvinceChange}
|
||||
disabled={loadingProvinces}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder={loadingProvinces ? "加载中..." : "选择省份"} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{provinces.map((province) => (
|
||||
<SelectItem key={province.code} value={province.code}>
|
||||
{province.name}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="edit-mall">所属商场(可选)</Label>
|
||||
<Select
|
||||
value={editMerchant.mallUserId}
|
||||
onValueChange={(value) => {
|
||||
const selectedMall = malls.find(mall => mall.mallUser === value)
|
||||
setEditMerchant({
|
||||
...editMerchant,
|
||||
mall: selectedMall?.mallId || value,
|
||||
mallUserId: value
|
||||
})
|
||||
}}
|
||||
disabled={loadingMalls || !editMerchant.province}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder={
|
||||
!editMerchant.province
|
||||
? "请先选择省份"
|
||||
: loadingMalls
|
||||
? "加载中..."
|
||||
: "选择商场(可选)"
|
||||
} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{malls.map((mall) => (
|
||||
<SelectItem key={mall.mallUser || mall.id} value={mall.mallUser}>
|
||||
{mall.mallName}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="edit-name">商户名称</Label>
|
||||
<Input
|
||||
id="edit-name"
|
||||
value={editMerchant.name}
|
||||
onChange={(e) => setEditMerchant({ ...editMerchant, name: e.target.value })}
|
||||
placeholder="请输入商户名称"
|
||||
/>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="edit-contact">联系人</Label>
|
||||
<Input
|
||||
id="edit-contact"
|
||||
value={editMerchant.contact}
|
||||
onChange={(e) => setEditMerchant({ ...editMerchant, contact: e.target.value })}
|
||||
placeholder="请输入联系人姓名"
|
||||
/>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="edit-phone">联系电话</Label>
|
||||
<Input
|
||||
id="edit-phone"
|
||||
value={editMerchant.phone}
|
||||
onChange={(e) => setEditMerchant({ ...editMerchant, phone: e.target.value })}
|
||||
placeholder="请输入联系电话"
|
||||
/>
|
||||
</div>
|
||||
{userRole === "admin" && (
|
||||
<div className="flex-1 overflow-y-auto pr-2">
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="edit-totalMerchant">选择总商户(可选)</Label>
|
||||
<Label htmlFor="edit-province">选择省份</Label>
|
||||
<Select
|
||||
value={editMerchant.totalMerchant}
|
||||
onValueChange={(value) => setEditMerchant({ ...editMerchant, totalMerchant: value })}
|
||||
disabled={loadingTotalMerchants}
|
||||
onOpenChange={(open) => {
|
||||
if (open && totalMerchants.length === 0 && !loadingTotalMerchants) {
|
||||
fetchTotalMerchants()
|
||||
}
|
||||
}}
|
||||
value={editMerchant.province}
|
||||
onValueChange={handleEditProvinceChange}
|
||||
disabled={loadingProvinces}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder={loadingTotalMerchants ? "加载中..." : "选择总商户(可选)"} />
|
||||
<SelectTrigger className="w-full">
|
||||
<SelectValue placeholder={loadingProvinces ? "加载中..." : "选择省份"} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{totalMerchants.map((merchant) => (
|
||||
<SelectItem key={merchant.userId} value={merchant.userId}>
|
||||
{merchant.nickName}
|
||||
<SelectContent className="max-h-[300px]">
|
||||
{provinces.map((province) => (
|
||||
<SelectItem key={province.code} value={province.code}>
|
||||
{province.name}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
)}
|
||||
<div className="col-span-2 space-y-2">
|
||||
<Label htmlFor="edit-detailedAddress">详细地址</Label>
|
||||
<Textarea
|
||||
id="edit-detailedAddress"
|
||||
value={editMerchant.detailedAddress}
|
||||
onChange={(e) => setEditMerchant({ ...editMerchant, detailedAddress: e.target.value })}
|
||||
placeholder="请输入详细地址"
|
||||
rows={3}
|
||||
/>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="edit-mall">所属商场(可选)</Label>
|
||||
<Select
|
||||
value={editMerchant.mallUserId}
|
||||
onValueChange={(value) => {
|
||||
const selectedMall = malls.find(mall => mall.mallUser === value)
|
||||
setEditMerchant({
|
||||
...editMerchant,
|
||||
mall: selectedMall?.mallId || value,
|
||||
mallUserId: value
|
||||
})
|
||||
}}
|
||||
disabled={loadingMalls || !editMerchant.province}
|
||||
>
|
||||
<SelectTrigger className="w-full">
|
||||
<SelectValue placeholder={
|
||||
!editMerchant.province
|
||||
? "请先选择省份"
|
||||
: loadingMalls
|
||||
? "加载中..."
|
||||
: "选择商场(可选)"
|
||||
} />
|
||||
</SelectTrigger>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
{malls.map((mall) => (
|
||||
<SelectItem key={mall.mallUser || mall.id} value={mall.mallUser}>
|
||||
{mall.mallName}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="edit-name">商户名称</Label>
|
||||
<Input
|
||||
id="edit-name"
|
||||
value={editMerchant.name}
|
||||
onChange={(e) => setEditMerchant({ ...editMerchant, name: e.target.value })}
|
||||
placeholder="请输入商户名称"
|
||||
/>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="edit-contact">联系人</Label>
|
||||
<Input
|
||||
id="edit-contact"
|
||||
value={editMerchant.contact}
|
||||
onChange={(e) => setEditMerchant({ ...editMerchant, contact: e.target.value })}
|
||||
placeholder="请输入联系人姓名"
|
||||
/>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="edit-phone">联系电话</Label>
|
||||
<Input
|
||||
id="edit-phone"
|
||||
value={editMerchant.phone}
|
||||
onChange={(e) => setEditMerchant({ ...editMerchant, phone: e.target.value })}
|
||||
placeholder="请输入联系电话"
|
||||
/>
|
||||
</div>
|
||||
{userRole === "admin" && (
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="edit-totalMerchant">选择总商户(可选)</Label>
|
||||
<Select
|
||||
value={editMerchant.totalMerchant}
|
||||
onValueChange={(value) => setEditMerchant({ ...editMerchant, totalMerchant: value })}
|
||||
disabled={loadingTotalMerchants}
|
||||
onOpenChange={(open) => {
|
||||
if (open && totalMerchants.length === 0 && !loadingTotalMerchants) {
|
||||
fetchTotalMerchants()
|
||||
}
|
||||
}}
|
||||
>
|
||||
<SelectTrigger className="w-full">
|
||||
<SelectValue placeholder={loadingTotalMerchants ? "加载中..." : "选择总商户(可选)"} />
|
||||
</SelectTrigger>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
{totalMerchants.map((merchant) => (
|
||||
<SelectItem key={merchant.userId} value={merchant.userId}>
|
||||
{merchant.nickName}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
)}
|
||||
<div className="col-span-2 space-y-2">
|
||||
<Label htmlFor="edit-detailedAddress">详细地址</Label>
|
||||
<Textarea
|
||||
id="edit-detailedAddress"
|
||||
value={editMerchant.detailedAddress}
|
||||
onChange={(e) => setEditMerchant({ ...editMerchant, detailedAddress: e.target.value })}
|
||||
placeholder="请输入详细地址"
|
||||
rows={3}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex justify-end space-x-2 mt-6">
|
||||
<div className="flex justify-end space-x-2 mt-6 flex-shrink-0 pt-4 border-t">
|
||||
<Button
|
||||
variant="outline"
|
||||
onClick={() => setIsEditMerchantOpen(false)}
|
||||
|
||||
@@ -298,7 +298,7 @@ export default function WorkOrdersPage() {
|
||||
创建工单
|
||||
</Button>
|
||||
</DialogTrigger>
|
||||
<DialogContent className="max-w-2xl">
|
||||
<DialogContent className="max-w-2xl max-h-[90vh] overflow-y-auto">
|
||||
<DialogHeader>
|
||||
<DialogTitle>创建新工单</DialogTitle>
|
||||
<DialogDescription>选择商户和设备,然后分配给维修人员</DialogDescription>
|
||||
@@ -394,7 +394,7 @@ export default function WorkOrdersPage() {
|
||||
<SelectTrigger className="w-full sm:w-32">
|
||||
<SelectValue placeholder="状态" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
<SelectItem value="all">全部状态</SelectItem>
|
||||
<SelectItem value="1">待接单</SelectItem>
|
||||
<SelectItem value="2">已接单</SelectItem>
|
||||
@@ -410,7 +410,7 @@ export default function WorkOrdersPage() {
|
||||
<SelectTrigger className="w-full sm:w-32">
|
||||
<SelectValue placeholder="工人" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
<SelectItem value="all">全部工人</SelectItem>
|
||||
{uniqueWorkers.map((worker) => (
|
||||
<SelectItem key={worker} value={worker}>
|
||||
@@ -723,10 +723,10 @@ function CreateWorkOrderForm({ onClose }: { onClose: () => void }) {
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder={loadingMerchants ? "加载中..." : "请先选择商户"} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px] overflow-y-auto">
|
||||
{merchants.map((merchant) => (
|
||||
<SelectItem key={merchant.id} value={merchant.id}>
|
||||
{merchant.merchantName} - {merchant.mallLocation || "无商场"}
|
||||
{merchant.merchantName} - {merchant.contactPerson} - {merchant.mallLocation || "无商场"}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
@@ -751,7 +751,7 @@ function CreateWorkOrderForm({ onClose }: { onClose: () => void }) {
|
||||
: "选择设备"
|
||||
} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px] overflow-y-auto">
|
||||
{availableEquipment.map((equipment) => (
|
||||
<SelectItem key={equipment.id} value={equipment.equipmentId}>
|
||||
{equipment.equipmentName} ({equipment.equipmentType})
|
||||
@@ -764,10 +764,10 @@ function CreateWorkOrderForm({ onClose }: { onClose: () => void }) {
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="type">工单类型</Label>
|
||||
<Select value={formData.type} onValueChange={(value) => setFormData({ ...formData, type: value })}>
|
||||
<SelectTrigger>
|
||||
<SelectTrigger className="w-full">
|
||||
<SelectValue placeholder="选择类型" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
<SelectItem value="设备检测">设备检测</SelectItem>
|
||||
<SelectItem value="故障维修">故障维修</SelectItem>
|
||||
<SelectItem value="设备安装">设备安装</SelectItem>
|
||||
@@ -790,7 +790,7 @@ function CreateWorkOrderForm({ onClose }: { onClose: () => void }) {
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder={loadingWorkers ? "加载中..." : "选择维修工人"} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px] overflow-y-auto">
|
||||
{workers.map((worker) => (
|
||||
<SelectItem key={worker.id} value={worker.id}>
|
||||
{worker.name} - {worker.province} ({worker.phone})
|
||||
|
||||
@@ -622,7 +622,7 @@ export default function WorkersPage() {
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="选择省份" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
{provinces.map((province) => (
|
||||
<SelectItem key={province.code} value={province.code}>
|
||||
{province.name}
|
||||
@@ -640,7 +640,7 @@ export default function WorkersPage() {
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="选择经销商" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
{dealers.map((dealer) => (
|
||||
<SelectItem key={dealer.userId} value={dealer.userId}>
|
||||
{dealer.userName}
|
||||
@@ -708,7 +708,7 @@ export default function WorkersPage() {
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="选择省份" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
{provinces.map((province) => (
|
||||
<SelectItem key={province.code} value={province.code}>
|
||||
{province.name}
|
||||
@@ -726,7 +726,7 @@ export default function WorkersPage() {
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="选择经销商" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
{dealers.map((dealer) => (
|
||||
<SelectItem key={dealer.userId} value={dealer.userId}>
|
||||
{dealer.userName}
|
||||
@@ -889,7 +889,7 @@ export default function WorkersPage() {
|
||||
<SelectTrigger className="w-32">
|
||||
<SelectValue placeholder="省份" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
<SelectItem value="all">全部省份</SelectItem>
|
||||
{provinces.map((province) => (
|
||||
<SelectItem key={province.code} value={province.code}>
|
||||
@@ -902,7 +902,7 @@ export default function WorkersPage() {
|
||||
<SelectTrigger className="w-32">
|
||||
<SelectValue placeholder="技能等级" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
<SelectItem value="all">全部等级</SelectItem>
|
||||
<SelectItem value="高级技师">高级技师</SelectItem>
|
||||
<SelectItem value="中级技师">中级技师</SelectItem>
|
||||
@@ -913,7 +913,7 @@ export default function WorkersPage() {
|
||||
<SelectTrigger className="w-64">
|
||||
<SelectValue placeholder="选择工单" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectContent className="max-h-[300px]">
|
||||
<SelectItem value="all">全部工单</SelectItem>
|
||||
{workOrders.map((order) => (
|
||||
<SelectItem key={order.value} value={order.value}>
|
||||
|
||||
@@ -61,7 +61,7 @@ function SelectContent({
|
||||
<SelectPrimitive.Content
|
||||
data-slot="select-content"
|
||||
className={cn(
|
||||
"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md",
|
||||
"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-[300px] min-w-[8rem] overflow-hidden rounded-md border shadow-md",
|
||||
position === "popper" &&
|
||||
"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
|
||||
className
|
||||
@@ -72,9 +72,9 @@ function SelectContent({
|
||||
<SelectScrollUpButton />
|
||||
<SelectPrimitive.Viewport
|
||||
className={cn(
|
||||
"p-1",
|
||||
"p-1 max-h-[280px] overflow-y-auto",
|
||||
position === "popper" &&
|
||||
"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"
|
||||
"w-full min-w-[var(--radix-select-trigger-width)]"
|
||||
)}
|
||||
>
|
||||
{children}
|
||||
|
||||
@@ -47,3 +47,4 @@ export async function deleteService(id: string): Promise<ServiceResponse> {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -10,3 +10,4 @@ export async function getUserByRoleKey(roleKey: string): Promise<UserByRoleRespo
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -42,3 +42,4 @@ export interface UserByRoleResponse {
|
||||
data: User[]
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user