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 // 按身份证号去重(同一人可能有多条 Employee 记录),无身份证号时回退到 employeeId
// 同时按风险类型去重(同一风险被重复创建解决多次,只取 estimatedLoss 最大的一条) // 同时按风险类型去重(同一风险被重复创建解决多次,只取 estimatedLoss 最大的一条)
const personBreakdown: Record<string, { const personBreakdown: Record<string, {
@@ -1712,7 +1710,7 @@ export async function getAnnualValueReport(orgId: string, year: number) {
department: p.department, department: p.department,
riskCount: details.length, riskCount: details.length,
lossAvoided, lossAvoided,
adjustedLoss: Math.round(lossAvoided * RISK_AVOIDANCE_RATE), adjustedLoss: lossAvoided,
details, 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 // 2. 节约工时 = AI 查询 * 0.5h + 合同审查 * 1h + 算薪批次 * 2h + 制度公示 * 1h
// 3. 节约成本 = 节约工时 * 100 元/h(HR 平均时薪) // 3. 节约成本 = 节约工时 * 100 元/h(HR 平均时薪)
const adjustedLossAvoided = Math.round(lossAvoided * RISK_AVOIDANCE_RATE) const adjustedLossAvoided = lossAvoided
const aiTimeSaved = aiConversations * 0.5 + aiReviews * 1.0 const aiTimeSaved = aiConversations * 0.5 + aiReviews * 1.0
const payrollTimeSaved = payrollBatches * 2.0 const payrollTimeSaved = payrollBatches * 2.0
const policyTimeSaved = policiesPublished * 1.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 timeSaved = Math.round(aiTimeSaved + payrollTimeSaved + policyTimeSaved + contractTimeSaved)
const costSaved = timeSaved * 100 const costSaved = timeSaved * 100
// 总价值 = 规避损失(打折后) + 节约成本 // 总价值 = 规避损失 + 节约成本
const totalValue = adjustedLossAvoided + costSaved const totalValue = adjustedLossAvoided + costSaved
// ROI = 总价值 / 系统成本(年费 12000 元),上限 9999% // 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-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-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"></th>
<th className="text-right py-2 px-2 font-medium">(×30%)</th>
<th className="text-left py-2 px-2 font-medium"></th> <th className="text-left py-2 px-2 font-medium"></th>
</tr> </tr>
</thead> </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 font-medium">{emp.name}</td>
<td className="py-2 px-2 text-gray-600">{emp.department}</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-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 text-right font-bold text-safe">¥{emp.adjustedLoss.toLocaleString()}</td>
<td className="py-2 px-2"> <td className="py-2 px-2">
<div className="space-y-0.5"> <div className="space-y-0.5">
@@ -264,9 +260,7 @@ export default function AnnualValueReport() {
</tbody> </tbody>
<tfoot> <tfoot>
<tr className="border-t-2 border-gray-200 font-bold"> <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" colSpan={2}></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 text-right text-safe">¥{(report.adjustedLossAvoided || 0).toLocaleString()}</td> <td className="py-2 px-2 text-right text-safe">¥{(report.adjustedLossAvoided || 0).toLocaleString()}</td>
<td className="py-2 px-2"></td> <td className="py-2 px-2"></td>
</tr> </tr>
@@ -282,7 +276,7 @@ export default function AnnualValueReport() {
<div className="space-y-1 text-xs text-gray-600"> <div className="space-y-1 text-xs text-gray-600">
<div className="flex items-start gap-1.5"> <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 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>
<div className="flex items-start gap-1.5"> <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" /> <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>
<div className="flex items-start gap-1.5"> <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 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>
<div className="flex items-start gap-1.5"> <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" /> <span className="w-1.5 h-1.5 rounded-full bg-gray-400 mt-1 flex-shrink-0" />