feat: 添加 UI 状态管理,支持新增记录底部弹窗功能,优化设置和主页交互

This commit is contained in:
2025-12-02 16:22:46 +08:00
parent a81b106ac8
commit 629a54c92d
12 changed files with 265 additions and 47 deletions

View File

@@ -187,26 +187,59 @@ const extractAmount = (text = '') => {
return loose?.[1] ? Math.abs(parseFloat(loose[1])) : 0
}
// 判断字符串是否更像是「金额」而不是商户名用于避免把「1.00元」当成商户
const looksLikeAmount = (raw = '') => {
const value = String(raw).trim()
if (!value) return false
const amountPattern = /^[-\d.,]+\s*(?:元|块钱|¥|¥|人民币)?$/
return amountPattern.test(value)
}
const extractMerchant = (text, rule) => {
const content = text || ''
if (rule?.merchantPattern instanceof RegExp) {
const m = text.match(rule.merchantPattern)
const m = content.match(rule.merchantPattern)
if (m?.[1]) return m[1].trim()
}
// 通用的「站点 A -> 站点 B」线路模式公交/地铁通知),
// 即使未命中专用规则也尝试提取避免退化为金额或「Unknown」
const routeMatch = content.match(
/([\u4e00-\u9fa5]{2,}\s*(?:-|—|>|→|至|到|->)\s*[\u4e00-\u9fa5]{2,})/,
)
if (routeMatch?.[1]) {
return routeMatch[1].trim()
}
const genericPatterns = [
/向\s*([\u4e00-\u9fa5A-Za-z0-9\-\s&]+)/,
/商户[:]?\s*([\u4e00-\u9fa5A-Za-z0-9\-\s&]+)/,
]
for (const pattern of genericPatterns) {
const m = text.match(pattern)
const m = content.match(pattern)
if (m?.[1]) return m[1].trim()
}
const parts = text.split(/|:/)
// 针对「……支出(消费支付宝-上海拉扎斯信息科技有限公司)3.23元」这类银行通知,
// 优先尝试从括号中的「支付宝-商户名」结构中提取真正的商户名
const parenMatch = content.match(/\(([^)]+)\)/)
if (parenMatch?.[1]) {
const inner = parenMatch[1]
const payMatch = inner.match(/(?:支付宝|微信支付|微信)[-—\s]*([^\d元¥¥]+)$/)
if (payMatch?.[1]) {
const candidate = payMatch[1].trim()
if (candidate && !looksLikeAmount(candidate)) {
return candidate
}
}
}
const parts = content.split(/|:/)
if (parts.length > 1) {
const candidate = parts[1].split(/[,\s]/)[0]
if (candidate) return candidate.trim()
if (candidate && !looksLikeAmount(candidate)) return candidate.trim()
}
return 'Unknown'