This commit is contained in:
menxipeng
2025-10-25 15:16:06 +08:00
parent b7fd1eadbb
commit c79456dd55

View File

@@ -78,6 +78,14 @@ export default function WorkersPage() {
// 工单选择相关状态 // 工单选择相关状态
const [workOrders, setWorkOrders] = useState<any[]>([]) const [workOrders, setWorkOrders] = useState<any[]>([])
const [selectedWorkOrder, setSelectedWorkOrder] = useState("all") const [selectedWorkOrder, setSelectedWorkOrder] = useState("all")
// 每个工人的工单分页状态
const [workerOrdersPagination, setWorkerOrdersPagination] = useState<{
[workerId: string]: {
currentPage: number
pageSize: number
total: number
}
}>({})
// 获取工人工单列表 // 获取工人工单列表
const fetchWorkOrdersList = async (workersId?: string) => { const fetchWorkOrdersList = async (workersId?: string) => {
@@ -108,6 +116,23 @@ export default function WorkersPage() {
} }
} }
// 获取工人完成工单数量
const fetchCompletedOrdersCount = async (workersId: string) => {
try {
const result = await apiGet<any>(`/back/orders/list?pageNum=1&pageSize=999&workersId=${workersId}&status=7`)
if (result && result.code === 200) {
const count = parseInt(result.total) || 0
console.log(`工人 ${workersId} 完成工单数量:`, count)
return count
}
return 0
} catch (error) {
console.error(`获取工人 ${workersId} 完成工单数量失败:`, error)
return 0
}
}
// 获取工人列表 // 获取工人列表
const fetchWorkersList = async (pageNum = currentPage, pageSizeParam = pageSize) => { const fetchWorkersList = async (pageNum = currentPage, pageSizeParam = pageSize) => {
try { try {
@@ -117,24 +142,33 @@ export default function WorkersPage() {
console.log('工人列表API返回结果:', result) console.log('工人列表API返回结果:', result)
if (result && result.code === 200 && result.rows) { if (result && result.code === 200 && result.rows) {
const processedWorkers = result.rows.map((worker: any) => ({ console.log('开始获取工人完成工单数量...')
id: worker.id, const processedWorkers = await Promise.all(result.rows.map(async (worker: any) => {
name: worker.name, // 获取该工人的完成工单数量
workerId: worker.jobNum || worker.workersId || `W${worker.id}`, const workersIdForQuery = worker.workersId || worker.jobNum || worker.id
phone: worker.phone, console.log(`正在获取工人 ${worker.name}(${workersIdForQuery}) 的完成工单数量`)
dealerId: worker.distributorUserId, const completedCount = await fetchCompletedOrdersCount(workersIdForQuery)
dealerName: worker.distributorUser || '未知经销商',
province: worker.province, return {
skillLevel: mapAPISkillLevelToDisplay(worker.skillLevel), id: worker.id,
joinDate: worker.createdAt, name: worker.name,
status: mapJobStatusToDisplay(worker.job), workerId: worker.jobNum || worker.workersId || `W${worker.id}`,
completedOrders: 0, phone: worker.phone,
rating: 0, dealerId: worker.distributorUserId,
specialties: worker.professionalSkills ? worker.professionalSkills.split(',').map((s: string) => s.trim()) : [], dealerName: worker.distributorUser || '未知经销商',
workOrders: [], province: worker.province,
apiData: worker skillLevel: mapAPISkillLevelToDisplay(worker.skillLevel),
joinDate: worker.createdAt,
status: mapJobStatusToDisplay(worker.job),
completedOrders: completedCount,
rating: 0,
specialties: worker.professionalSkills ? worker.professionalSkills.split(',').map((s: string) => s.trim()) : [],
workOrders: [],
apiData: worker
}
})) }))
console.log('工人列表及完成工单数量处理完成:', processedWorkers)
setWorkers(processedWorkers) setWorkers(processedWorkers)
setTotal(parseInt(result.total) || 0) setTotal(parseInt(result.total) || 0)
} else { } else {
@@ -442,6 +476,60 @@ export default function WorkersPage() {
} }
} }
// 获取指定工人的工单列表(支持分页)
const fetchWorkerOrders = async (workerId: string, pageNum: number = 1, pageSizeParam: number = 10) => {
const currentWorker = workers.find(w => w.id === workerId)
if (!currentWorker || !currentWorker.apiData) return
try {
console.log(`获取工人 ${workerId} 的工单数据,页码: ${pageNum}, 每页: ${pageSizeParam}`)
const workersIdParam = currentWorker.apiData.workersId || currentWorker.apiData.jobNum || workerId
const result = await apiGet<any>(`/back/orders/list?pageNum=${pageNum}&pageSize=${pageSizeParam}&workersId=${workersIdParam}`)
if (result && result.code === 200 && result.rows) {
const processedWorkOrders = result.rows.map((order: any) => ({
id: order.workOrderNumber,
type: order.workOrderType,
merchant: order.merchantName,
mall: order.merchantLocation || order.merchantAddress || '地址未知',
equipment: order.equipmentName,
status: mapWorkOrderStatus(order.status),
completedDate: order.completedDate,
updatedAt: order.updatedAt,
startDate: order.scheduledDate || order.createdDate,
assignedDate: order.createdDate,
rating: null,
priority: order.priority,
responsiblePerson: order.responsiblePerson,
responsiblePhone: order.responsibleVirtualPhone,
workerPhone: order.workerVirtualPhone,
originalData: order
}))
setWorkers(prev => prev.map(worker =>
worker.id === workerId
? { ...worker, workOrders: processedWorkOrders }
: worker
))
// 更新该工人的工单分页状态
setWorkerOrdersPagination(prev => ({
...prev,
[workerId]: {
currentPage: pageNum,
pageSize: pageSizeParam,
total: parseInt(result.total) || 0
}
}))
} else {
console.error('获取工单数据失败:', result?.msg || '未知错误')
}
} catch (error) {
console.error('请求工单数据失败:', error)
}
}
const toggleWorkerExpansion = async (workerId: string) => { const toggleWorkerExpansion = async (workerId: string) => {
const isCurrentlyExpanded = expandedWorkers.includes(workerId) const isCurrentlyExpanded = expandedWorkers.includes(workerId)
@@ -449,47 +537,8 @@ export default function WorkersPage() {
setExpandedWorkers((prev) => prev.filter((id) => id !== workerId)) setExpandedWorkers((prev) => prev.filter((id) => id !== workerId))
} else { } else {
setExpandedWorkers((prev) => [...prev, workerId]) setExpandedWorkers((prev) => [...prev, workerId])
// 初始化分页并获取第一页数据
const currentWorker = workers.find(w => w.id === workerId) await fetchWorkerOrders(workerId, 1, 10)
if (currentWorker && currentWorker.apiData) {
try {
console.log(`获取工人 ${workerId} 的工单数据`)
const workersIdParam = currentWorker.apiData.workersId || currentWorker.apiData.jobNum || workerId
const result = await apiGet<any>(`/back/orders/list?pageNum=1&pageSize=10&workersId=${workersIdParam}`)
if (result && result.code === 200 && result.rows) {
const processedWorkOrders = result.rows.map((order: any) => ({
id: order.workOrderNumber,
type: order.workOrderType,
merchant: order.merchantName,
mall: order.merchantLocation || order.merchantAddress || '地址未知',
equipment: order.equipmentName,
status: mapWorkOrderStatus(order.status),
completedDate: order.completedDate,
updatedAt: order.updatedAt,
startDate: order.scheduledDate || order.createdDate,
assignedDate: order.createdDate,
rating: null,
priority: order.priority,
responsiblePerson: order.responsiblePerson,
responsiblePhone: order.responsibleVirtualPhone,
workerPhone: order.workerVirtualPhone,
originalData: order
}))
setWorkers(prev => prev.map(worker =>
worker.id === workerId
? { ...worker, workOrders: processedWorkOrders }
: worker
))
} else {
console.error('获取工单数据失败:', result?.msg || '未知错误')
}
} catch (error) {
console.error('请求工单数据失败:', error)
}
}
} }
} }
@@ -929,48 +978,135 @@ export default function WorkersPage() {
<h4 className="font-medium mb-3"></h4> <h4 className="font-medium mb-3"></h4>
{worker.workOrders.length > 0 ? ( {worker.workOrders.length > 0 ? (
<Table> <>
<TableHeader> <Table>
<TableRow> <TableHeader>
<TableHead></TableHead> <TableRow>
<TableHead></TableHead> <TableHead></TableHead>
<TableHead></TableHead> <TableHead></TableHead>
<TableHead></TableHead> <TableHead></TableHead>
<TableHead></TableHead> <TableHead></TableHead>
<TableHead></TableHead> <TableHead></TableHead>
</TableRow> <TableHead></TableHead>
</TableHeader>
<TableBody>
{worker.workOrders.map((order: any) => (
<TableRow key={order.id}>
<TableCell className="font-medium text-blue-600">{order.id}</TableCell>
<TableCell>
<Badge variant="outline">{order.type}</Badge>
</TableCell>
<TableCell>
<div>
<p className="font-medium">{order.merchant}</p>
<p className="text-sm text-gray-500">{order.mall}</p>
</div>
</TableCell>
<TableCell>
<div className="flex items-center">
<Wrench className="h-4 w-4 mr-2 text-gray-400" />
{order.equipment}
</div>
</TableCell>
<TableCell>{getWorkOrderStatusBadge(order.status)}</TableCell>
<TableCell>
{order.status === "completed" && order.updatedAt ? (
<span className="text-sm">{order.updatedAt}</span>
) : (
<span className="text-sm text-gray-400">-</span>
)}
</TableCell>
</TableRow> </TableRow>
))} </TableHeader>
</TableBody> <TableBody>
</Table> {worker.workOrders.map((order: any) => (
<TableRow key={order.id}>
<TableCell className="font-medium text-blue-600">{order.id}</TableCell>
<TableCell>
<Badge variant="outline">{order.type}</Badge>
</TableCell>
<TableCell>
<div>
<p className="font-medium">{order.merchant}</p>
<p className="text-sm text-gray-500">{order.mall}</p>
</div>
</TableCell>
<TableCell>
<div className="flex items-center">
<Wrench className="h-4 w-4 mr-2 text-gray-400" />
{order.equipment}
</div>
</TableCell>
<TableCell>{getWorkOrderStatusBadge(order.status)}</TableCell>
<TableCell>
{order.status === "completed" && order.updatedAt ? (
<span className="text-sm">{order.updatedAt}</span>
) : (
<span className="text-sm text-gray-400">-</span>
)}
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
{/* 工单分页组件 */}
{workerOrdersPagination[worker.id] && workerOrdersPagination[worker.id].total > 0 && (
<div className="flex items-center justify-between px-2 py-4 border-t mt-4">
<div className="flex items-center space-x-2">
<p className="text-sm text-gray-700">
{Math.min((workerOrdersPagination[worker.id].currentPage - 1) * workerOrdersPagination[worker.id].pageSize + 1, workerOrdersPagination[worker.id].total)} {" "}
{Math.min(workerOrdersPagination[worker.id].currentPage * workerOrdersPagination[worker.id].pageSize, workerOrdersPagination[worker.id].total)} {workerOrdersPagination[worker.id].total}
</p>
</div>
<div className="flex items-center space-x-2">
<div className="flex items-center space-x-2">
<p className="text-sm text-gray-700"></p>
<Select
value={workerOrdersPagination[worker.id].pageSize.toString()}
onValueChange={(value) => {
const newPageSize = parseInt(value)
fetchWorkerOrders(worker.id, 1, newPageSize)
}}
>
<SelectTrigger className="w-20">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="10">10</SelectItem>
<SelectItem value="20">20</SelectItem>
<SelectItem value="50">50</SelectItem>
<SelectItem value="100">100</SelectItem>
</SelectContent>
</Select>
<p className="text-sm text-gray-700"></p>
</div>
<div className="flex items-center space-x-1">
<Button
variant="outline"
size="sm"
onClick={() => fetchWorkerOrders(worker.id, 1, workerOrdersPagination[worker.id].pageSize)}
disabled={workerOrdersPagination[worker.id].currentPage === 1}
>
</Button>
<Button
variant="outline"
size="sm"
onClick={() => fetchWorkerOrders(worker.id, workerOrdersPagination[worker.id].currentPage - 1, workerOrdersPagination[worker.id].pageSize)}
disabled={workerOrdersPagination[worker.id].currentPage === 1}
>
</Button>
<div className="flex items-center space-x-1">
{Array.from({ length: Math.min(5, Math.ceil(workerOrdersPagination[worker.id].total / workerOrdersPagination[worker.id].pageSize)) }, (_, i) => {
const pageNum = Math.max(1, workerOrdersPagination[worker.id].currentPage - 2) + i
if (pageNum > Math.ceil(workerOrdersPagination[worker.id].total / workerOrdersPagination[worker.id].pageSize)) return null
return (
<Button
key={pageNum}
variant={workerOrdersPagination[worker.id].currentPage === pageNum ? "default" : "outline"}
size="sm"
onClick={() => fetchWorkerOrders(worker.id, pageNum, workerOrdersPagination[worker.id].pageSize)}
className="w-8 h-8 p-0"
>
{pageNum}
</Button>
)
})}
</div>
<Button
variant="outline"
size="sm"
onClick={() => fetchWorkerOrders(worker.id, workerOrdersPagination[worker.id].currentPage + 1, workerOrdersPagination[worker.id].pageSize)}
disabled={workerOrdersPagination[worker.id].currentPage >= Math.ceil(workerOrdersPagination[worker.id].total / workerOrdersPagination[worker.id].pageSize)}
>
</Button>
<Button
variant="outline"
size="sm"
onClick={() => fetchWorkerOrders(worker.id, Math.ceil(workerOrdersPagination[worker.id].total / workerOrdersPagination[worker.id].pageSize), workerOrdersPagination[worker.id].pageSize)}
disabled={workerOrdersPagination[worker.id].currentPage >= Math.ceil(workerOrdersPagination[worker.id].total / workerOrdersPagination[worker.id].pageSize)}
>
</Button>
</div>
</div>
</div>
)}
</>
) : ( ) : (
<div className="text-center py-8 text-gray-500"> <div className="text-center py-8 text-gray-500">
<Wrench className="h-8 w-8 mx-auto mb-2 opacity-50" /> <Wrench className="h-8 w-8 mx-auto mb-2 opacity-50" />