This commit is contained in:
menxipeng
2025-10-20 21:38:27 +08:00
parent 8551f0a572
commit 6ba8b1409c

View File

@@ -316,12 +316,25 @@ export default function WorkersPage() {
// 处理编辑工人
const handleEditWorker = (worker: any) => {
setEditingWorker(worker)
// 尝试根据省份名称查找省份代码
let provinceValue = worker.province
const provinceByName = provinces.find(p => p.name === worker.province)
const provinceByCode = provinces.find(p => p.code === worker.province)
// 如果找到匹配的省份,使用其代码
if (provinceByName) {
provinceValue = provinceByName.code
} else if (provinceByCode) {
provinceValue = provinceByCode.code
}
setEditWorker({
id: worker.id,
name: worker.name,
phone: worker.phone,
dealerId: worker.dealerId,
province: worker.province,
province: provinceValue,
skillLevel: worker.skillLevel,
specialties: worker.specialties.join(','),
jobNum: worker.workerId,
@@ -445,15 +458,21 @@ export default function WorkersPage() {
const mapWorkOrderStatus = (status: string | null) => {
switch (status) {
case "1":
return "assigned"
return "pending-accept"
case "2":
return "in-progress"
return "accepted"
case "3":
return "completed"
return "in-progress"
case "4":
return "cancelled"
return "repairing"
case "5":
return "checking-info"
case "6":
return "waiting-signature"
case "7":
return "completed"
default:
return "assigned"
return "pending-accept"
}
}
@@ -535,14 +554,20 @@ export default function WorkersPage() {
const getWorkOrderStatusBadge = (status: string) => {
switch (status) {
case "completed":
return <Badge className="bg-green-100 text-green-800"></Badge>
case "pending-accept":
return <Badge className="bg-orange-100 text-orange-800"></Badge>
case "accepted":
return <Badge className="bg-blue-100 text-blue-800"></Badge>
case "in-progress":
return <Badge className="bg-blue-100 text-blue-800"></Badge>
case "assigned":
return <Badge className="bg-yellow-100 text-yellow-800"></Badge>
case "cancelled":
return <Badge className="bg-red-100 text-red-800"></Badge>
return <Badge className="bg-cyan-100 text-cyan-800"></Badge>
case "repairing":
return <Badge className="bg-purple-100 text-purple-800"></Badge>
case "checking-info":
return <Badge className="bg-yellow-100 text-yellow-800"></Badge>
case "waiting-signature":
return <Badge className="bg-pink-100 text-pink-800"></Badge>
case "completed":
return <Badge className="bg-green-100 text-green-800"></Badge>
default:
return <Badge variant="outline">{status}</Badge>
}
@@ -623,24 +648,6 @@ export default function WorkersPage() {
</SelectContent>
</Select>
</div>
<div className="grid gap-2">
<Label htmlFor="skillLevel"></Label>
<Select
value={newWorker.skillLevel}
onValueChange={(value) => setNewWorker({ ...newWorker, skillLevel: value })}
>
<SelectTrigger>
<SelectValue placeholder="选择技能等级" />
</SelectTrigger>
<SelectContent>
{skillLevels.map((level) => (
<SelectItem key={level} value={level}>
{SKILL_LEVEL_MAP[level]}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
<div className="grid gap-2">
<Label htmlFor="jobNum"></Label>
<Input
@@ -650,16 +657,6 @@ export default function WorkersPage() {
placeholder="请输入工号(可选,系统自动生成)"
/>
</div>
<div className="grid gap-2">
<Label htmlFor="specialties"></Label>
<Textarea
id="specialties"
value={newWorker.specialties}
onChange={(e) => setNewWorker({ ...newWorker, specialties: e.target.value })}
placeholder="请输入专业技能,用逗号分隔(如:焊接,电工,管道安装)"
rows={3}
/>
</div>
</div>
<DialogFooter>
<Button variant="outline" onClick={() => setIsAddDialogOpen(false)} disabled={isSubmitting}>
@@ -712,7 +709,7 @@ export default function WorkersPage() {
</SelectTrigger>
<SelectContent>
{provinces.map((province) => (
<SelectItem key={province.code} value={province.name}>
<SelectItem key={province.code} value={province.code}>
{province.name}
</SelectItem>
))}
@@ -737,57 +734,14 @@ export default function WorkersPage() {
</SelectContent>
</Select>
</div>
<div className="grid gap-2">
<Label htmlFor="edit-skillLevel"></Label>
<Select
value={editWorker.skillLevel}
onValueChange={(value) => setEditWorker({ ...editWorker, skillLevel: value })}
>
<SelectTrigger>
<SelectValue placeholder="选择技能等级" />
</SelectTrigger>
<SelectContent>
{skillLevels.map((level) => (
<SelectItem key={level} value={level}>
{SKILL_LEVEL_MAP[level]}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
<div className="grid gap-2">
<Label htmlFor="edit-jobNum"></Label>
<Input
id="edit-jobNum"
value={editWorker.jobNum}
onChange={(e) => setEditWorker({ ...editWorker, jobNum: e.target.value })}
placeholder="请输入工号"
/>
</div>
<div className="grid gap-2">
<Label htmlFor="edit-job"></Label>
<Select
value={editWorker.job}
onValueChange={(value) => setEditWorker({ ...editWorker, job: value })}
>
<SelectTrigger>
<SelectValue placeholder="选择工作状态" />
</SelectTrigger>
<SelectContent>
<SelectItem value="1"></SelectItem>
<SelectItem value="2"></SelectItem>
<SelectItem value="3"></SelectItem>
</SelectContent>
</Select>
</div>
<div className="grid gap-2">
<Label htmlFor="edit-specialties"></Label>
<Textarea
id="edit-specialties"
value={editWorker.specialties}
onChange={(e) => setEditWorker({ ...editWorker, specialties: e.target.value })}
placeholder="请输入专业技能,用逗号分隔(如:焊接,电工,管道安装)"
rows={3}
disabled
placeholder="工号不可更改"
className="bg-gray-100 cursor-not-allowed"
/>
</div>
</div>
@@ -1007,10 +961,6 @@ export default function WorkersPage() {
{worker.province} | : {worker.completedOrders}
</div>
</div>
<div className="flex flex-col space-y-1">
{getSkillBadge(worker.skillLevel)}
{getStatusBadge(worker.status)}
</div>
<div className="flex space-x-1">
<div
className="inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:bg-accent hover:text-accent-foreground h-9 px-3 cursor-pointer"
@@ -1041,20 +991,10 @@ export default function WorkersPage() {
<h5 className="font-medium text-sm text-gray-700 mb-2"></h5>
<div className="space-y-1 text-sm">
<p>: {worker.joinDate}</p>
<p>: {worker.rating > 0 ? `${worker.rating}/5.0` : "暂无评分"}</p>
<p>: {worker.completedOrders} </p>
</div>
</div>
<div className="md:col-span-2">
<h5 className="font-medium text-sm text-gray-700 mb-2"></h5>
<div className="flex flex-wrap gap-1">
{worker.specialties.map((specialty: string, index: number) => (
<Badge key={index} variant="outline" className="text-xs">
{specialty}
</Badge>
))}
</div>
</div>
</div>
<h4 className="font-medium mb-3"></h4>
@@ -1067,8 +1007,6 @@ export default function WorkersPage() {
<TableHead></TableHead>
<TableHead></TableHead>
<TableHead></TableHead>
<TableHead></TableHead>
<TableHead></TableHead>
</TableRow>
</TableHeader>
<TableBody>
@@ -1091,41 +1029,6 @@ export default function WorkersPage() {
</div>
</TableCell>
<TableCell>{getWorkOrderStatusBadge(order.status)}</TableCell>
<TableCell>
<div className="text-sm">
{order.status === "completed" ? (
<p className="flex items-center">
<Calendar className="h-3 w-3 mr-1 text-green-500" />
: {order.completedDate || '未知'}
</p>
) : order.status === "in-progress" ? (
<p className="flex items-center">
<Calendar className="h-3 w-3 mr-1 text-blue-500" />
: {order.startDate || '未知'}
</p>
) : order.status === "cancelled" ? (
<p className="flex items-center">
<Calendar className="h-3 w-3 mr-1 text-red-500" />
</p>
) : (
<p className="flex items-center">
<Calendar className="h-3 w-3 mr-1 text-yellow-500" />
: {order.assignedDate || '未知'}
</p>
)}
</div>
</TableCell>
<TableCell>
{order.status === "completed" && order.rating ? (
<div className="flex items-center">
<span className="text-yellow-500 mr-1"></span>
<span className="text-sm font-medium">{order.rating}/5</span>
</div>
) : (
<span className="text-xs text-gray-400">-</span>
)}
</TableCell>
</TableRow>
))}
</TableBody>