wo 1
This commit is contained in:
@@ -316,12 +316,25 @@ export default function WorkersPage() {
|
|||||||
// 处理编辑工人
|
// 处理编辑工人
|
||||||
const handleEditWorker = (worker: any) => {
|
const handleEditWorker = (worker: any) => {
|
||||||
setEditingWorker(worker)
|
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({
|
setEditWorker({
|
||||||
id: worker.id,
|
id: worker.id,
|
||||||
name: worker.name,
|
name: worker.name,
|
||||||
phone: worker.phone,
|
phone: worker.phone,
|
||||||
dealerId: worker.dealerId,
|
dealerId: worker.dealerId,
|
||||||
province: worker.province,
|
province: provinceValue,
|
||||||
skillLevel: worker.skillLevel,
|
skillLevel: worker.skillLevel,
|
||||||
specialties: worker.specialties.join(','),
|
specialties: worker.specialties.join(','),
|
||||||
jobNum: worker.workerId,
|
jobNum: worker.workerId,
|
||||||
@@ -445,15 +458,21 @@ export default function WorkersPage() {
|
|||||||
const mapWorkOrderStatus = (status: string | null) => {
|
const mapWorkOrderStatus = (status: string | null) => {
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case "1":
|
case "1":
|
||||||
return "assigned"
|
return "pending-accept"
|
||||||
case "2":
|
case "2":
|
||||||
return "in-progress"
|
return "accepted"
|
||||||
case "3":
|
case "3":
|
||||||
return "completed"
|
return "in-progress"
|
||||||
case "4":
|
case "4":
|
||||||
return "cancelled"
|
return "repairing"
|
||||||
|
case "5":
|
||||||
|
return "checking-info"
|
||||||
|
case "6":
|
||||||
|
return "waiting-signature"
|
||||||
|
case "7":
|
||||||
|
return "completed"
|
||||||
default:
|
default:
|
||||||
return "assigned"
|
return "pending-accept"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -535,14 +554,20 @@ export default function WorkersPage() {
|
|||||||
|
|
||||||
const getWorkOrderStatusBadge = (status: string) => {
|
const getWorkOrderStatusBadge = (status: string) => {
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case "completed":
|
case "pending-accept":
|
||||||
return <Badge className="bg-green-100 text-green-800">已完成</Badge>
|
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":
|
case "in-progress":
|
||||||
return <Badge className="bg-blue-100 text-blue-800">处理中</Badge>
|
return <Badge className="bg-cyan-100 text-cyan-800">订单进行中</Badge>
|
||||||
case "assigned":
|
case "repairing":
|
||||||
return <Badge className="bg-yellow-100 text-yellow-800">待处理</Badge>
|
return <Badge className="bg-purple-100 text-purple-800">订单维修中</Badge>
|
||||||
case "cancelled":
|
case "checking-info":
|
||||||
return <Badge className="bg-red-100 text-red-800">已取消</Badge>
|
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:
|
default:
|
||||||
return <Badge variant="outline">{status}</Badge>
|
return <Badge variant="outline">{status}</Badge>
|
||||||
}
|
}
|
||||||
@@ -623,24 +648,6 @@ export default function WorkersPage() {
|
|||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
</div>
|
</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">
|
<div className="grid gap-2">
|
||||||
<Label htmlFor="jobNum">工号</Label>
|
<Label htmlFor="jobNum">工号</Label>
|
||||||
<Input
|
<Input
|
||||||
@@ -650,16 +657,6 @@ export default function WorkersPage() {
|
|||||||
placeholder="请输入工号(可选,系统自动生成)"
|
placeholder="请输入工号(可选,系统自动生成)"
|
||||||
/>
|
/>
|
||||||
</div>
|
</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>
|
</div>
|
||||||
<DialogFooter>
|
<DialogFooter>
|
||||||
<Button variant="outline" onClick={() => setIsAddDialogOpen(false)} disabled={isSubmitting}>
|
<Button variant="outline" onClick={() => setIsAddDialogOpen(false)} disabled={isSubmitting}>
|
||||||
@@ -712,7 +709,7 @@ export default function WorkersPage() {
|
|||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
<SelectContent>
|
<SelectContent>
|
||||||
{provinces.map((province) => (
|
{provinces.map((province) => (
|
||||||
<SelectItem key={province.code} value={province.name}>
|
<SelectItem key={province.code} value={province.code}>
|
||||||
{province.name}
|
{province.name}
|
||||||
</SelectItem>
|
</SelectItem>
|
||||||
))}
|
))}
|
||||||
@@ -737,57 +734,14 @@ export default function WorkersPage() {
|
|||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
</div>
|
</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">
|
<div className="grid gap-2">
|
||||||
<Label htmlFor="edit-jobNum">工号</Label>
|
<Label htmlFor="edit-jobNum">工号</Label>
|
||||||
<Input
|
<Input
|
||||||
id="edit-jobNum"
|
id="edit-jobNum"
|
||||||
value={editWorker.jobNum}
|
value={editWorker.jobNum}
|
||||||
onChange={(e) => setEditWorker({ ...editWorker, jobNum: e.target.value })}
|
disabled
|
||||||
placeholder="请输入工号"
|
placeholder="工号不可更改"
|
||||||
/>
|
className="bg-gray-100 cursor-not-allowed"
|
||||||
</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}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -906,7 +860,7 @@ export default function WorkersPage() {
|
|||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<div className="text-2xl font-bold">
|
<div className="text-2xl font-bold">
|
||||||
{workers.filter((w) => w.rating > 0).length > 0
|
{workers.filter((w) => w.rating > 0).length > 0
|
||||||
? (workers.reduce((sum, w) => sum + w.rating, 0) / workers.filter((w) => w.rating > 0).length).toFixed(1)
|
? (workers.reduce((sum, w) => sum + w.rating, 0) / workers.filter((w) => w.rating > 0).length).toFixed(1)
|
||||||
: '-'}
|
: '-'}
|
||||||
</div>
|
</div>
|
||||||
@@ -1007,10 +961,6 @@ export default function WorkersPage() {
|
|||||||
{worker.province} | 完成: {worker.completedOrders} 单
|
{worker.province} | 完成: {worker.completedOrders} 单
|
||||||
</div>
|
</div>
|
||||||
</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="flex space-x-1">
|
||||||
<div
|
<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"
|
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>
|
<h5 className="font-medium text-sm text-gray-700 mb-2">基本信息</h5>
|
||||||
<div className="space-y-1 text-sm">
|
<div className="space-y-1 text-sm">
|
||||||
<p>入职时间: {worker.joinDate}</p>
|
<p>入职时间: {worker.joinDate}</p>
|
||||||
<p>服务评分: {worker.rating > 0 ? `${worker.rating}/5.0` : "暂无评分"}</p>
|
|
||||||
<p>完成工单: {worker.completedOrders} 单</p>
|
<p>完成工单: {worker.completedOrders} 单</p>
|
||||||
</div>
|
</div>
|
||||||
</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>
|
</div>
|
||||||
|
|
||||||
<h4 className="font-medium mb-3">工作记录</h4>
|
<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>
|
<TableHead>状态</TableHead>
|
||||||
<TableHead>时间信息</TableHead>
|
|
||||||
<TableHead>评分</TableHead>
|
|
||||||
</TableRow>
|
</TableRow>
|
||||||
</TableHeader>
|
</TableHeader>
|
||||||
<TableBody>
|
<TableBody>
|
||||||
@@ -1091,41 +1029,6 @@ export default function WorkersPage() {
|
|||||||
</div>
|
</div>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
<TableCell>{getWorkOrderStatusBadge(order.status)}</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>
|
</TableRow>
|
||||||
))}
|
))}
|
||||||
</TableBody>
|
</TableBody>
|
||||||
|
Reference in New Issue
Block a user