fix: 移除规避率30%打折,已解决风险直接用预估损失作为规避价值

- 后端移除 RISK_AVOIDANCE_RATE,adjustedLossAvoided = lossAvoided
- 前端移除规避率列和30%说明,表格直接展示预估损失=规避损失
- 价值计算说明更新:系统已发现并解决,全部潜在损失即为规避价值
This commit is contained in:
selfrelease
2026-07-31 09:29:51 +08:00
parent f5a03f82bc
commit c7f270e8df
2 changed files with 8 additions and 16 deletions
+4 -6
View File
@@ -1630,8 +1630,6 @@ export async function getAnnualValueReport(orgId: string, year: number) {
}),
])
const RISK_AVOIDANCE_RATE = 0.3
// 按身份证号去重(同一人可能有多条 Employee 记录),无身份证号时回退到 employeeId
// 同时按风险类型去重(同一风险被重复创建解决多次,只取 estimatedLoss 最大的一条)
const personBreakdown: Record<string, {
@@ -1712,7 +1710,7 @@ export async function getAnnualValueReport(orgId: string, year: number) {
department: p.department,
riskCount: details.length,
lossAvoided,
adjustedLoss: Math.round(lossAvoided * RISK_AVOIDANCE_RATE),
adjustedLoss: lossAvoided,
details,
}
})
@@ -1730,10 +1728,10 @@ export async function getAnnualValueReport(orgId: string, year: number) {
}))
// 价值计算
// 1. 规避损失 = 已解决风险的预估损失之和 × 0.3(规避率30%,非每项风险都会演变为实际仲裁
// 1. 规避损失 = 已解决风险的预估损失之和(系统已发现并解决,全部潜在损失即为规避价值
// 2. 节约工时 = AI 查询 * 0.5h + 合同审查 * 1h + 算薪批次 * 2h + 制度公示 * 1h
// 3. 节约成本 = 节约工时 * 100 元/h(HR 平均时薪)
const adjustedLossAvoided = Math.round(lossAvoided * RISK_AVOIDANCE_RATE)
const adjustedLossAvoided = lossAvoided
const aiTimeSaved = aiConversations * 0.5 + aiReviews * 1.0
const payrollTimeSaved = payrollBatches * 2.0
const policyTimeSaved = policiesPublished * 1.0
@@ -1741,7 +1739,7 @@ export async function getAnnualValueReport(orgId: string, year: number) {
const timeSaved = Math.round(aiTimeSaved + payrollTimeSaved + policyTimeSaved + contractTimeSaved)
const costSaved = timeSaved * 100
// 总价值 = 规避损失(打折后) + 节约成本
// 总价值 = 规避损失 + 节约成本
const totalValue = adjustedLossAvoided + costSaved
// ROI = 总价值 / 系统成本(年费 12000 元),上限 9999%
+4 -10
View File
@@ -231,9 +231,7 @@ export default function AnnualValueReport() {
<th className="text-left py-2 px-2 font-medium"></th>
<th className="text-left py-2 px-2 font-medium"></th>
<th className="text-center py-2 px-2 font-medium"></th>
<th className="text-right py-2 px-2 font-medium"></th>
<th className="text-right py-2 px-2 font-medium"></th>
<th className="text-right py-2 px-2 font-medium">(×30%)</th>
<th className="text-right py-2 px-2 font-medium"></th>
<th className="text-left py-2 px-2 font-medium"></th>
</tr>
</thead>
@@ -243,8 +241,6 @@ export default function AnnualValueReport() {
<td className="py-2 px-2 font-medium">{emp.name}</td>
<td className="py-2 px-2 text-gray-600">{emp.department}</td>
<td className="py-2 px-2 text-center">{emp.riskCount}</td>
<td className="py-2 px-2 text-right text-gray-600">¥{emp.lossAvoided.toLocaleString()}</td>
<td className="py-2 px-2 text-right text-gray-400">30%</td>
<td className="py-2 px-2 text-right font-bold text-safe">¥{emp.adjustedLoss.toLocaleString()}</td>
<td className="py-2 px-2">
<div className="space-y-0.5">
@@ -264,9 +260,7 @@ export default function AnnualValueReport() {
</tbody>
<tfoot>
<tr className="border-t-2 border-gray-200 font-bold">
<td className="py-2 px-2" colSpan={3}></td>
<td className="py-2 px-2 text-right">¥{(report.lossAvoided || 0).toLocaleString()}</td>
<td className="py-2 px-2"></td>
<td className="py-2 px-2" colSpan={2}></td>
<td className="py-2 px-2 text-right text-safe">¥{(report.adjustedLossAvoided || 0).toLocaleString()}</td>
<td className="py-2 px-2"></td>
</tr>
@@ -282,7 +276,7 @@ export default function AnnualValueReport() {
<div className="space-y-1 text-xs text-gray-600">
<div className="flex items-start gap-1.5">
<span className="w-1.5 h-1.5 rounded-full bg-safe mt-1 flex-shrink-0" />
<span><b></b> × 30%</span>
<span><b></b></span>
</div>
<div className="flex items-start gap-1.5">
<span className="w-1.5 h-1.5 rounded-full bg-blue-500 mt-1 flex-shrink-0" />
@@ -294,7 +288,7 @@ export default function AnnualValueReport() {
</div>
<div className="flex items-start gap-1.5">
<span className="w-1.5 h-1.5 rounded-full bg-amber-500 mt-1 flex-shrink-0" />
<span><b></b> + </span>
<span><b></b> + </span>
</div>
<div className="flex items-start gap-1.5">
<span className="w-1.5 h-1.5 rounded-full bg-gray-400 mt-1 flex-shrink-0" />