fix: 移除规避率30%打折,已解决风险直接用预估损失作为规避价值
- 后端移除 RISK_AVOIDANCE_RATE,adjustedLossAvoided = lossAvoided - 前端移除规避率列和30%说明,表格直接展示预估损失=规避损失 - 价值计算说明更新:系统已发现并解决,全部潜在损失即为规避价值
This commit is contained in:
@@ -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%
|
||||||
|
|||||||
@@ -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" />
|
||||||
|
|||||||
Reference in New Issue
Block a user