refactor: 提取收视颜色函数到公共 utils

This commit is contained in:
simonkoson
2026-07-03 10:17:52 +08:00
parent 886ddd8e88
commit 1c4cbd84e5
2 changed files with 45 additions and 30 deletions
+1 -30
View File
@@ -14,39 +14,10 @@ import useAuthStore from '../../stores/authStore'
import { listEpisodes } from '../../services/episodeService'
import { listTargets } from '../../services/yearlyTargetService'
import { getCurrentCover, getUpcomingSchedules } from '../../services/dashboardService'
import { getShareColor, getColorLabel } from '../../utils/ratingColors'
import ChangeCoverModal from './ChangeCoverModal'
import './Dashboard.css'
/**
* 收视份额颜色判定(极易写反,禁止凭直觉):
* audience_share > stretch_target → 🔴 红(优秀)
* base_target ≤ audience_share ≤ stretch_target → 🔵 蓝(达标)
* audience_share < base_target → 🟢 绿(待提升)
* 判色取该期 air_date 所属年份的 yearly_targets 行(不是当前年)。
*/
function getShareColor(share, targets, airYear) {
const n = Number(share)
const target = (targets || []).find(t => Number(t.year) === Number(airYear))
if (!target) return '#999'
if (isNaN(n)) return '#999'
const stretch = Number(target.stretch_target)
const base = Number(target.base_target)
if (n > stretch) return '#c0584f' // 红=超过摸高目标(优秀)
if (n >= base) return '#5b8db8' // 蓝=未达摸高目标(达标)
return '#7aa874' // 绿=未达基础目标(待提升)
}
function getColorLabel(share, targets, airYear) {
const n = Number(share)
const target = (targets || []).find(t => Number(t.year) === Number(airYear))
if (!target) return '未知'
const stretch = Number(target.stretch_target)
const base = Number(target.base_target)
if (n > stretch) return '优秀'
if (n >= base) return '达标'
return '待提升'
}
function getBarHeight(share) {
return Math.round((Number(share) / 1.0) * 160)
}
+44
View File
@@ -0,0 +1,44 @@
/**
* 收视份额颜色判定(极易写反,禁止凭直觉):
* audience_share > stretch_target → 🔴 红(优秀)
* base_target ≤ audience_share ≤ stretch_target → 🔵 蓝(达标)
* audience_share < base_target → 🟢 绿(待提升)
* 判色取该期 air_date 所属年份的 yearly_targets 行(不是当前年)。
*/
/**
* 根据收视份额和年度目标返回对应的颜色代码
* @param {number|null} share - 收视份额
* @param {Array} targets - 年度目标数组
* @param {number} airYear - 播出年份
* @returns {string} 颜色代码
*/
export function getShareColor(share, targets, airYear) {
const n = Number(share)
const target = (targets || []).find(t => Number(t.year) === Number(airYear))
if (!target) return '#999'
if (isNaN(n)) return '#999'
const stretch = Number(target.stretch_target)
const base = Number(target.base_target)
if (n > stretch) return '#c0584f' // 红=超过摸高目标(优秀)
if (n >= base) return '#5b8db8' // 蓝=未达摸高目标(达标)
return '#7aa874' // 绿=未达基础目标(待提升)
}
/**
* 根据收视份额和年度目标返回颜色标签
* @param {number|null} share - 收视份额
* @param {Array} targets - 年度目标数组
* @param {number} airYear - 播出年份
* @returns {string} 颜色标签
*/
export function getColorLabel(share, targets, airYear) {
const n = Number(share)
const target = (targets || []).find(t => Number(t.year) === Number(airYear))
if (!target) return '未知'
const stretch = Number(target.stretch_target)
const base = Number(target.base_target)
if (n > stretch) return '优秀'
if (n >= base) return '达标'
return '待提升'
}