title: '系统故障高优先级修复 - 数据统计与考勤模块' slug: 'system-faults-high-priority-fix' created: '2026-03-06T12:30:00Z' status: 'ready-for-dev' stepsCompleted: [1, 2, 3, 4] adversarialReviewCompleted: true adversarialReviewFindings: 18 adversarialReviewApplied: true tech_stack: ['React', 'TypeScript', 'Taro', 'React Query', 'RPC Client'] files_to_modify: [ 'allin-packages/order-management-ui/src/components/OrderDetailModal.tsx', 'mini-ui-packages/yongren-dashboard-ui/src/pages/Dashboard/Dashboard.tsx', 'mini-ui-packages/yongren-order-management-ui/src/pages/OrderDetail/OrderDetail.tsx', 'mini-ui-packages/yongren-statistics-ui/src/pages/Statistics/Statistics.tsx', 'mini-ui-packages/rencai-attendance-ui/src/pages/AttendancePage/AttendancePage.tsx', 'mini-ui-packages/rencai-attendance-ui/src/utils/mockAttendanceData.ts', 'mini-ui-packages/rencai-dashboard-ui/src/pages/Dashboard/Dashboard.tsx', 'mini-ui-packages/rencai-employment-ui/src/pages/EmploymentPage/EmploymentPage.tsx' ] code_patterns: ['桥接文件模式', 'React Query hooks', 'RPC 客户端', 'Mock 数据']
Created: 2026-03-06
根据 2026-03-06 系统故障文档,共有 9 个故障问题,涉及网页端、企业端和人才端:
问题2:企业端-数据统计模块无数据展示
docs/系统故障20260306_images/image2.png问题6:人才端-本月出勤与考勤数据不一致
docs/系统故障20260306_images/image6.png问题9:人才端-出勤率计算异常
docs/系统故障20260306_images/image9.jpeg问题1:网页端-订单管理薪资改为可手动输入修改项
docs/系统故障20260306_images/image1.png问题3:企业端-订单详情打卡数据需修改为固定内容
docs/系统故障20260306_images/image3.png问题5:人才端-小程序远程打卡提示修改
docs/系统故障20260306_images/image5.png问题4:企业端-首页人才库点击无跳转
docs/系统故障20260306_images/image4.png问题7:人才端-薪资记录显示范围修改
docs/系统故障20260306_images/image7.png问题8:企业端-首页去掉最新通知模块
docs/系统故障20260306_images/image8.png按优先级修复各类问题:
高优先级(数据类):
中优先级(功能完善):
低优先级(优化类):
In Scope: 全部 9 个故障问题的修复:
高优先级(3个):
中优先级(3个):
低优先级(3个):
Out of Scope:
Gray Area(需要判断):
项目架构:
代码模式:
桥接文件模式:小程序页面作为桥接,从 UI 包导入实际组件
// mini/src/pages/yongren/statistics/index.tsx
import Statistics from '@d8d/yongren-statistics-ui/pages/Statistics/Statistics'
export default Statistics
API 客户端模式:使用 Hono RPC 客户端调用后端接口
export const enterpriseStatisticsClient = rpcClient<typeof statisticsRoutes>('/api/v1/yongren/statistics')
React Query 模式:使用 useQuery hook 进行数据获取和缓存
const { data, isLoading } = useQuery({
queryKey: ['statistics', 'employment-count'],
queryFn: async () => { ... }
})
| 文件 | 用途 | 关键问题 |
|---|---|---|
mini-ui-packages/yongren-statistics-ui/src/pages/Statistics/Statistics.tsx |
企业端数据统计页面 | API 返回数据为 0 |
mini-ui-packages/yongren-statistics-ui/src/api/enterpriseStatisticsClient.ts |
统计 API 客户端 | 调用 /api/v1/yongren/statistics/* |
mini-ui-packages/rencai-attendance-ui/src/pages/AttendancePage/AttendancePage.tsx |
人才端考勤记录页面 | 使用 Mock 数据,未连接真实 API |
mini-ui-packages/rencai-attendance-ui/src/utils/mockAttendanceData.ts |
Mock 数据生成工具 | 出勤率计算逻辑错误 |
mini-ui-packages/yongren-dashboard-ui/src/pages/Dashboard/Dashboard.tsx |
企业端首页仪表板 | 人才库跳转、通知模块 |
问题根源分析:
问题2(企业端数据统计为0):
enterpriseStatisticsClient 调用 API/api/v1/yongren/statistics/*问题6(人才端考勤数据为0):
generateMockAttendanceData)normalDays: 0 可能导致显示问题问题9(人才端出勤率计算136%):
计算逻辑在 calculateAttendanceStats 函数:
const attendanceRate = workDays.length > 0
? Math.round((normalDays / workDays.length) * 100)
: 0
问题:normalDays 包含周末,但 workDays 应排除周末
修复方向:修正计算公式,确保出勤率不超过 100%
需求:改为固定值(22天,100%)
✅ 所有前置任务已完成(通过9个并行Agent探索)
[x] 前置任务 0.1:解决测试账号 401 认证问题
13800013800(对应公司127,有3个在职人员)13800138004[x] 前置任务 0.2:API 发现
/api/v1/yongren/statistics/*/api/v1/yongren/order/company-orders/:id/stats/api/v1/talent/employment/salary-records?month=YYYY-MM&take=N[x] 前置任务 0.3:代码调查
allin-packages/order-management-ui/src/components/OrderDetailModal.tsxmini-ui-packages/yongren-order-management-ui/src/pages/OrderDetail/OrderDetail.tsxmini-ui-packages/rencai-dashboard-ui/src/pages/Dashboard/Dashboard.tsx 第151行mini-ui-packages/rencai-employment-ui/src/pages/EmploymentPage/EmploymentPage.tsx针对问题6和问题9的矛盾,明确选择:
本次修复采用 方案 A(短期修复):
理由:真实 API 端点未知,连接成本高。先用 Mock 修复前端显示问题,后续再连接真实 API。
长期计划(可选,非本次范围):
问题2:企业端-数据统计模块无数据展示
[x] 探索完成 - 数据库中实际有数据!
[x] 验证完成 - 使用正确账号登录后数据正常显示!
13800013800 / 123123(明文密码,用于测试)问题6:人才端-本月出勤数据为0
[x] 探索完成 - 问题根源已定位
mini-ui-packages/rencai-attendance-ui/src/pages/AttendancePage/AttendancePage.tsxnormalDays: 0[ ] 任务 6.1:修复初始状态
mini-ui-packages/rencai-attendance-ui/src/pages/AttendancePage/AttendancePage.tsx 第37-43行修改前:
const [stats, setStats] = useState<AttendanceStatsType>(() => ({
attendanceRate: 100,
normalDays: 0, // ← 问题根源
lateCount: 0,
earlyLeaveCount: 0,
absentCount: 0
}))
修改后:
const [stats, setStats] = useState<AttendanceStatsType>(() => {
const { year, month } = getCurrentYearMonth()
return generateMockAttendanceData(year, month).stats
})
验证:首次渲染时应显示正确的统计数据,而非0
问题9:人才端-出勤率计算异常
[x] 探索完成 - 问题根源已定位
mini-ui-packages/rencai-attendance-ui/src/utils/mockAttendanceData.tscalculateAttendanceStats 函数normalDays 从所有记录统计,包含周末的 NORMAL 状态[ ] 任务 9.1:修复 normalDays 计算逻辑
mini-ui-packages/rencai-attendance-ui/src/utils/mockAttendanceData.ts 第58行修改前:
const normalDays = records.filter(r => r.status === AttendanceStatus.NORMAL).length
修改后:
const normalDays = workDays.filter(r => r.status === AttendanceStatus.NORMAL).length
说明:只从工作日(workDays)中统计 NORMAL 状态,排除周末
[ ] 任务 9.2:改为固定值(展示层修复)
mini-ui-packages/rencai-attendance-ui/src/utils/mockAttendanceData.ts 第133-135行generateMockAttendanceData 函数返回值修改:
const stats: AttendanceStats = {
attendanceRate: 100,
normalDays: 22,
lateCount: 0,
earlyLeaveCount: 0,
absentCount: 0
}
备注:根据业务需求直接返回固定值(22天,100%)
问题1:网页端-订单管理薪资改为可手动输入
[x] 探索完成 - 文件和代码位置已定位
allin-packages/order-management-ui/src/components/OrderDetailModal.tsx[ ] 任务 1.1:添加薪资编辑功能
allin-packages/order-management-ui/src/components/OrderDetailModal.tsxhandleUpdateSalary 处理函数修改前:
<TableCell>¥{person.salaryDetail || 0}</TableCell>
修改后:
<TableCell>
<Input
type="number"
defaultValue={person.salaryDetail || 0}
onBlur={(e) => {
const value = parseFloat(e.target.value);
if (!isNaN(value) && value !== (person.salaryDetail || 0)) {
handleUpdateSalary(person.personId, value);
}
}}
className="w-24"
/>
</TableCell>
注意:需确认后端 API PUT /orders/persons/salary 是否存在
问题3:企业端-订单详情打卡数据改为固定内容
[x] 探索完成 - 文件和代码位置已定位
mini-ui-packages/yongren-order-management-ui/src/pages/OrderDetail/OrderDetail.tsx/api/v1/yongren/order/company-orders/:id/stats[ ] 任务 3.1:修改打卡数据显示为固定值
mini-ui-packages/yongren-order-management-ui/src/pages/OrderDetail/OrderDetail.tsx修改前:
<Text className="text-xs text-gray-500">{statistics?.checkinStats.percentage || 0}%</Text>
<Text className="text-xs text-gray-500">{statistics?.salaryVideoStats.percentage || 0}%</Text>
<Text className="text-xs text-gray-500">{statistics?.taxVideoStats.percentage || 0}%</Text>
修改后:
<Text className="text-xs text-gray-500">100%</Text>
<Text className="text-xs text-gray-500">100%</Text>
<Text className="text-xs text-gray-500">100%</Text>
说明:保持 current/total 的动态显示,只将百分比固定为 100%
问题5:人才端-小程序远程打卡提示修改
[x] 探索完成 - 文件和代码位置已定位
mini-ui-packages/rencai-dashboard-ui/src/pages/Dashboard/Dashboard.tsxhandleClockIn 函数[ ] 任务 5.1:修改远程打卡提示文案
mini-ui-packages/rencai-dashboard-ui/src/pages/Dashboard/Dashboard.tsx 第151行修改前:
const handleClockIn = () => {
Taro.showToast({ title: '远程打卡功能开发中', icon: 'none' })
}
修改后:
const handleClockIn = () => {
Taro.showToast({ title: '已打卡成功', icon: 'success' })
}
说明:纯文案修改,图标从 none 改为 success
问题4:企业端-首页人才库点击无跳转
[x] 探索完成 - 问题根源已定位
mini-ui-packages/yongren-dashboard-ui/src/pages/Dashboard/Dashboard.tsxTaro.navigateTo 而非 Taro.switchTabnavigateTo 无法跳转[ ] 任务 4.1:修复跳转方法
mini-ui-packages/yongren-dashboard-ui/src/pages/Dashboard/Dashboard.tsx 第130行修改前:
case 'talentPool':
Taro.navigateTo({
url: '/pages/yongren/talent/list/index'
})
break
修改后:
case 'talentPool':
Taro.switchTab({
url: '/pages/yongren/talent/list/index'
})
break
问题7:人才端-薪资记录显示范围修改
[x] 探索完成 - 文件和代码位置已定位
mini-ui-packages/rencai-employment-ui/src/pages/EmploymentPage/EmploymentPage.tsxmonth 参数过滤[ ] 任务 7.1:修改薪资查询时间范围
mini-ui-packages/rencai-employment-ui/src/pages/EmploymentPage/EmploymentPage.tsx 第60-72行修改前:
const res = await talentEmploymentClient.employment['salary-records'].$get({
query: { take: 3 }
})
修改后:
const now = new Date()
const lastMonth = new Date(now.getFullYear(), now.getMonth() - 1, 1)
const monthStr = `${lastMonth.getFullYear()}-${String(lastMonth.getMonth() + 1).padStart(2, '0')}`
const res = await talentEmploymentClient.employment['salary-records'].$get({
query: { month: monthStr, take: 3 }
})
说明:只修改前端,后端已支持 month 参数
问题8:人才端-首页去掉最新通知模块
[x] 探索完成 - 文件和代码位置已定位
mini-ui-packages/rencai-dashboard-ui/src/pages/Dashboard/Dashboard.tsx[ ] 任务 8.1:移除最新通知模块
mini-ui-packages/rencai-dashboard-ui/src/pages/Dashboard/Dashboard.tsxNotification 接口定义notifications 常量数组问题2:企业端-数据统计模块
问题6:人才端-本月出勤数据
问题9:人才端-出勤率计算
问题1:订单管理薪资输入
问题3:订单详情打卡数据
问题5:远程打卡提示
问题4:人才库跳转
问题7:薪资记录范围
问题8:首页通知模块
前端依赖:
@tanstack/react-query - 数据获取和缓存@tarojs/components - Taro 小程序组件库@d8d/mini-shared-ui-components - 共享 UI 组件@d8d/yongren-shared-ui - 企业端共享组件@d8d/rencai-shared-ui - 人才端共享组件后端依赖:
/api/v1/yongren/statistics/* - 企业端统计 API其他依赖:
E2E 测试:
单元测试:
calculateAttendanceStats 函数的各种边界情况单元测试用例(出勤率计算):
describe('calculateAttendanceStats', () => {
it('正常情况:20天工作日,出勤20天 → 100%', () => {
const result = calculateAttendanceStats(/* 20 work days, 20 present */)
expect(result.attendanceRate).toBe(100)
expect(result.normalDays).toBe(20)
})
it('全勤:22天工作日,出勤22天 → 100%', () => {
const result = calculateAttendanceStats(/* 22 work days, 22 present */)
expect(result.attendanceRate).toBe(100)
})
it('缺勤:22天工作日,出勤15天 → 68%', () => {
const result = calculateAttendanceStats(/* 22 work days, 15 present */)
expect(result.attendanceRate).toBe(68)
})
it('边界:22天工作日,出勤0天 → 0%', () => {
const result = calculateAttendanceStats(/* 22 work days, 0 present */)
expect(result.attendanceRate).toBe(0)
})
it('边界:22天工作日,出勤30天 → 100%(上限)', () => {
const result = calculateAttendanceStats(/* 22 work days, 30 present */)
expect(result.attendanceRate).toBe(100) // 不超过100
})
})
固定值验证测试: ```typescript describe('generateMockAttendanceData - 固定值模式', () => { it('应返回固定的出勤率100%和22天', () => {
const { stats } = generateMockAttendanceData(2026, 3)
expect(stats.attendanceRate).toBe(100)
expect(stats.normalDays).toBe(22)
}) })
手动测试:
探索完成后的新发现:
测试账号信息更新:
13800013800(对应公司127,有3个在职人员)1380013800413800138005 可能不正确数据库状态(公司127):
问题8端点说明:
rencai-dashboard-ui)yongren-dashboard-ui)本身就没有通知模块高风险项目:
问题1(订单薪资编辑):需要新增后端 API
PUT /persons/work-status、PUT /persons/datesPUT /persons/salary - 薪资更新接口order-custom.routes.ts 中添加新的薪资更新路由问题2(数据统计):已验证 - 使用正确账号 13800013800 / 123123 后数据正常显示
已知限制:
后续考虑: