240 lines
6.4 KiB
JavaScript
240 lines
6.4 KiB
JavaScript
/**
|
||
* 建制数据格式化工具类
|
||
*/
|
||
export class InstitutionalDataFormatter {
|
||
/**
|
||
* 格式化金额
|
||
* @param {number} amount 金额
|
||
* @returns {string} 格式化后的金额字符串
|
||
*/
|
||
static formatAmount(amount) {
|
||
if (!amount) return "不详";
|
||
|
||
// 超过一亿以亿为单位
|
||
if (amount >= 100000000) {
|
||
return `约${(amount / 100000000).toFixed(1)}亿`;
|
||
} else if (amount >= 10000) {
|
||
return `约${(amount / 10000).toFixed(1)}万`;
|
||
} else {
|
||
return `约${amount.toLocaleString()}元`;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 格式化历史金额(适用于古代项目)
|
||
* @param {number} amount 金额
|
||
* @param {string} currency 货币单位
|
||
* @returns {string} 格式化后的金额字符串
|
||
*/
|
||
static formatHistoricalAmount(amount, currency = "银元") {
|
||
if (!amount) return "不详";
|
||
|
||
// 超过一亿以亿为单位
|
||
if (amount >= 100000000) {
|
||
return `约${currency}${(amount / 100000000).toFixed(1)}亿`;
|
||
} else if (amount >= 10000) {
|
||
return `约${currency}${(amount / 10000).toFixed(0)}万`;
|
||
} else {
|
||
return `约${currency}${amount.toLocaleString()}`;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 格式化左上角内容
|
||
* @param {string} projectName 项目名称
|
||
* @returns {string} 格式化后的内容
|
||
*/
|
||
static formatTopLeft(projectName) {
|
||
// 如果年份和项目名称都为空,返回暂无数据
|
||
if (!projectName) return "暂无数据";
|
||
return projectName;
|
||
}
|
||
|
||
/**
|
||
* 格式化项目名称
|
||
* @param {string} projectName 项目名称
|
||
* @param {boolean} isHistorical 是否为历史项目
|
||
* @returns {string} 格式化后的项目名称
|
||
*/
|
||
static formatProjectName(projectName, isHistorical = false) {
|
||
if (!projectName) return "暂无数据";
|
||
|
||
// 如果是历史项目,可能需要特殊处理
|
||
if (isHistorical && projectName.includes("寺")) {
|
||
// 对于寺庙项目,保持原有格式
|
||
return projectName;
|
||
}
|
||
|
||
return projectName;
|
||
}
|
||
|
||
/**
|
||
* 格式化年份显示
|
||
* @param {string} year 年份
|
||
* @returns {string} 格式化后的年份
|
||
*/
|
||
static formatYear(year) {
|
||
if (!year) return "暂无数据";
|
||
|
||
// 如果已经是格式化过的字符串(包含"年"字),直接返回
|
||
if (typeof year === "string" && year.includes("年")) {
|
||
return year;
|
||
}
|
||
|
||
return `${year}年`;
|
||
}
|
||
|
||
/**
|
||
* 格式化历史年份(适用于古代项目)
|
||
* @param {string} year 年份
|
||
* @returns {string} 格式化后的年份
|
||
*/
|
||
static formatHistoricalYear(year) {
|
||
if (!year) return "暂无数据";
|
||
|
||
// 如果已经是格式化过的字符串,直接返回
|
||
if (typeof year === "string") {
|
||
if (year.includes("年")) {
|
||
return year;
|
||
}
|
||
if (year.includes("时期") || year.includes("朝代")) {
|
||
return year;
|
||
}
|
||
}
|
||
|
||
// 如果是公元前的年份
|
||
if (year < 0) {
|
||
return `公元前${Math.abs(year)}年`;
|
||
}
|
||
|
||
// 如果是公元后的年份,但小于1000年
|
||
if (year < 1000) {
|
||
return `${year}年`;
|
||
}
|
||
|
||
// 正常年份
|
||
return `${year}年`;
|
||
}
|
||
|
||
/**
|
||
* 获取状态文本
|
||
* @param {string} state 状态码
|
||
* @returns {string} 状态文本
|
||
*/
|
||
static getStatusText(state) {
|
||
switch (state) {
|
||
case "1":
|
||
return "规划";
|
||
case "2":
|
||
return "进行中";
|
||
case "3":
|
||
return "已完成";
|
||
case "4":
|
||
return "已取消";
|
||
default:
|
||
return "未知状态";
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 判断是否为历史项目
|
||
* @param {string} year 年份
|
||
* @returns {boolean} 是否为历史项目
|
||
*/
|
||
static isHistoricalProject(year) {
|
||
if (!year) return false;
|
||
|
||
// 处理字符串格式的年份(如"916年"、"明末时期")
|
||
if (typeof year === "string") {
|
||
// 如果包含"年"字,提取数字部分
|
||
if (year.includes("年")) {
|
||
const yearNum = parseInt(year.replace("年", ""));
|
||
return yearNum < 1900;
|
||
}
|
||
|
||
// 如果包含历史时期描述,认为是历史项目
|
||
if (
|
||
year.includes("时期") ||
|
||
year.includes("朝代") ||
|
||
year.includes("古代")
|
||
) {
|
||
return true;
|
||
}
|
||
|
||
// 尝试解析纯数字
|
||
const yearNum = parseInt(year);
|
||
if (!isNaN(yearNum)) {
|
||
return yearNum < 1900;
|
||
}
|
||
}
|
||
|
||
// 处理数字格式的年份
|
||
const yearNum = parseInt(year);
|
||
return yearNum < 1900;
|
||
}
|
||
|
||
/**
|
||
* 格式化捐赠人数
|
||
* @param {number} count 人数
|
||
* @param {boolean} isHistorical 是否为历史项目
|
||
* @returns {string} 格式化后的人数
|
||
*/
|
||
static formatDonorCount(count, isHistorical = false) {
|
||
if (!count || count === 0) return "持续招募中";
|
||
|
||
if (isHistorical) {
|
||
return `约${count}人`;
|
||
} else {
|
||
return `${count}人`;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 转换后端数据为前端格式
|
||
* @param {Array} rows 后端数据
|
||
* @returns {Array} 转换后的数据
|
||
*/
|
||
static transformData(rows) {
|
||
console.log("原始数据:", rows); // 添加调试日志
|
||
|
||
return rows.map((item) => {
|
||
console.log("处理项目:", item); // 添加调试日志
|
||
|
||
const year =
|
||
item.formedYear || item.startYear || item.start_year || item.year;
|
||
const isHistorical = InstitutionalDataFormatter.isHistoricalProject(year);
|
||
|
||
const projectName = item.proName || item.pro_name || item.projectName;
|
||
|
||
return {
|
||
topLeft: InstitutionalDataFormatter.formatTopLeft(
|
||
InstitutionalDataFormatter.formatProjectName(
|
||
projectName,
|
||
isHistorical,
|
||
),
|
||
),
|
||
topRight: InstitutionalDataFormatter.getStatusText(item.state),
|
||
year: isHistorical
|
||
? InstitutionalDataFormatter.formatHistoricalYear(year)
|
||
: InstitutionalDataFormatter.formatYear(year),
|
||
amount: isHistorical
|
||
? // ? InstitutionalDataFormatter.formatHistoricalAmount(
|
||
InstitutionalDataFormatter.formatAmount(
|
||
item.totalAmount || item.total_amount,
|
||
)
|
||
: InstitutionalDataFormatter.formatAmount(
|
||
item.totalAmount || item.total_amount,
|
||
),
|
||
donorCount: InstitutionalDataFormatter.formatDonorCount(
|
||
item.donorCount || item.donor_count || 0,
|
||
isHistorical,
|
||
),
|
||
// 保存原始数据,用于跳转
|
||
formedId: item.id,
|
||
// 保存项目类型信息
|
||
isHistorical: isHistorical,
|
||
};
|
||
});
|
||
}
|
||
}
|