kkfluous
e187c0d02e
feat(energy): 嘉燃经开站存在 JQ 单时全局过滤 GF_HECRI_BILL 历史订单
...
ci/woodpecker/push/woodpecker Pipeline was successful
业务背景:旧系统加氢账单使用 GF_HECRI_BILL 前缀,新系统统一改用 JQ 前缀。
切换期间两套数据共存,会重复计入加氢量。约定:当嘉兴嘉燃经开站出现 JQ
订单(视为切到新单号体系),全局过滤掉 GF_HECRI_BILL 前缀的历史订单。
实现:
- shouldFilterGfBills() 探测嘉兴嘉燃经开站是否有 JQ 单,结果缓存 5 分钟
- GF_EXCLUDE_CLAUSE = b.bill_code NOT LIKE 'GF\_HECRI\_BILL%' ESCAPE '\\'
- 应用到 4 处氢能查询:KPI、Top5、区域占比、daily 站点聚合
实测:当前嘉燃经开 4508 JQ + 665 GF,嘉锦 11783 JQ + 1 GF,全部 GF 已隐藏。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 20:23:03 +08:00
kkfluous
3d4d862d73
feat(energy): 氢能总览删除 4 张 KPI 卡,底部加动态幽默提示
...
ci/woodpecker/push/woodpecker Pipeline was successful
- 删除:年加氢量 / 年加氢费 / 累计羚牛承担 / 本月-今日 四张顶部 KPI 卡
(及对应的 Skeleton 占位、未用的 Fuel/Wallet/Coins/CalendarClock import 与 fmt 工具函数)
- 新增 RotatingFooterHint:底部居中蓝色脉冲点 + 6 条幽默文案 4s 轮换淡入
例如「更多统计维度接入中,欢迎您的建议 ~」「数据科学家正在深夜挖掘新维度…」
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 20:10:27 +08:00
kkfluous
23a7722583
chore(energy): 氢能总览删除「我方/客户产生」副统计
...
ci/woodpecker/push/woodpecker Pipeline was successful
年加氢量、年加氢费 卡片移除以下副信息:
- 我方 XXX
- 客户产生 XXX
只保留主标题与大数字。其他卡片(累计羚牛承担、本月/今日)保持不变。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 20:04:56 +08:00
kkfluous
213037c2ac
fix(energy): 氢能 Top5 排名圆点左侧被 SVG 视窗切掉
...
ci/woodpecker/push/woodpecker Pipeline was successful
之前 cx=-178 + YAxis.width=190 + margin.left=0:
Y 轴线 pivot 在 chart x=190;圆点 abs x=12,半径 9 → 左缘 abs x=3
紧贴 SVG viewBox 左边界,渲染时被切掉一半。
新值:margin.left=12,YAxis.width=188,circle cx=-172,text x=-154
pivot=200,圆点 abs x=28,左缘=19,离左边界 19px 缓冲,圆点完整可见。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 20:03:24 +08:00
kkfluous
3efa701395
feat(energy): 氢能总览加载骨架屏,缓解 1-2s 初始等待
...
ci/woodpecker/push/woodpecker Pipeline was successful
之前数据回来前只显示一行「加载中…」纯文本,1-2 秒等待体感差。
新增 HydrogenOverviewSkeleton:
- 4 张 KPI 卡占位(含标题/数值/副信息行)
- Top5 横向条形图占位(5 行 圆点 + 站名 + 渐变条 + 数值)
- 区域占比环 + 图例占位
- 底部蓝色脉冲点 +「正在加载氢能总览…」
全部用 animate-pulse,结构与真实页面保持一致,避免回填时跳动。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 20:00:48 +08:00
kkfluous
e775acb8fe
fix(energy): 氢能 Top5 排名圆点与站名重叠修复
...
ci/woodpecker/push/woodpecker Pipeline was successful
YAxis 宽度 170→190,圆点 cx 从 -158 → -178,文字 x 从 -144 → -160。
间距从 14px 拉到 18px+,避免在窄屏上圆点压住站名首字。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 19:59:37 +08:00
kkfluous
c788dd4577
fix(energy): 单价直接取 MAX(cost_price),不重算不返 null
...
ci/woodpecker/push/woodpecker Pipeline was successful
之前用 MIN=MAX...ELSE NULL 判定,再 NULLIF 排零,遇到「1 笔 0 元免费单 + 多笔 35 元正价单」
仍可能误判混合,最终页面显示「—」(如佛山豪汇石油加氢站)。
按业务约定:单价就是订单上记录的成本价,不做"统一性"判定,也不返 null。
改用 MAX(b.cost_price):
- 自然忽略 0 元免费/赠送单(被正价 max 掉)
- 同价组等于原价
- 极少数真正混合价组也展示该日付出过的最高单价(仍是订单上的真实数字)
回退类型:HydrogenStationRow.pricePerKg 重新固定为 number。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 19:56:26 +08:00
kkfluous
3851335843
fix(energy): 氢能单价不再加权,混合价组显示「—」并修复 hydrogen_time 歧义
...
ci/woodpecker/push/woodpecker Pipeline was successful
- pricePerKg 改为 CASE WHEN MIN=MAX THEN MIN ELSE NULL,
同价组返回原价(无小数误读),混合价组返回 null
- 类型 HydrogenStationRow.pricePerKg: number | null
- 前端 mobile/desktop 两处展示在 null 时显示「—」
- 修复 ER_NON_UNIQ_ERROR:tab_import_hydrogen_order 也有 hydrogen_time 字段,
把 SELECT/ORDER BY 中 ${HYDROGEN_LOCAL} 替换为显式 b.hydrogen_time 限定
- 实测:712 个站点-日组中 682 个同价直接显示原价,30 个混合显示「—」
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 19:51:41 +08:00
kkfluous
d0a644cf18
fix(energy): 氢能站点名补全 tab_import_hydrogen_order,单价改为按量加权
...
ci/woodpecker/push/woodpecker Pipeline was successful
站点名 fallback 链新增第三档:
内部站表 → 外部站表 → tab_import_hydrogen_order(by bill_code) → 「未关联/未知 #ID」
经此关联,原来 140 条「未知站点」补全为 9 个真实站名(洛阳新红山、佛山新城等)
单价之前用 AVG(cost_price) 简单平均,混合价组会算出 34.0334... 这种
意外小数(看起来像被「重新计算」)。改为按量加权效率价:
ROUND(SUM(cost_expense) / NULLIF(SUM(hydrogen_quantity), 0), 2)
单一价格组自动等于原价,混合价组得到真实付款单价。
Top5 与每日聚合两处 SQL 同步修改。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 19:46:56 +08:00
kkfluous
0d30ee2df5
fix(energy): 氢能站点 fallback 区分「未关联」与「未知 #ID」
...
ci/woodpecker/push/woodpecker Pipeline was successful
之前两张 site 表都查不到的账单,UI 一律显示「未知站点」。
其中 137 条 station_id 为 NULL(账单未填站点),3 条 station_id
有值但站点表没收录(站点删除/字典漂移)。账单上的 cost_price 是真实的,
所以会出现「未知站点 25 元/Kg」这种可追溯但难定位的情况。
现在 SQL fallback 改为:
- station_id IS NULL → 「未关联站点」
- station_id 不为空但 join 不上 → 「未知站点 #ID」
方便定位具体是哪条字典记录缺失。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 19:41:57 +08:00
kkfluous
9a20a7cb79
refactor(energy): 电能仅展示充电量,电/氢 daily 表格统一列宽
...
ci/woodpecker/push/woodpecker Pipeline was successful
- 电能去掉「充电费用(元)」列,只保留 月份/日期 | 充电量(度) | 环比
原列宽 auto+auto+auto 在窄屏会挤压重叠
- 改用固定 minmax(0,1fr)/120/88(移动)和 1fr/160/120(桌面)
- 氢能 daily 同步统一列宽:1fr/120/88(移动)和 1fr/140/140/120(桌面)
- 单价表头改为「单价 (元/Kg)」全展示,移动端站点行价格作为副信息缩小展示
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 19:37:26 +08:00
kkfluous
d1d79f1c7c
feat(energy): 电能统计切到 bi_ele_charge_record,外部数据接通
...
ci/woodpecker/push/woodpecker Pipeline was successful
- /api/energy/electric/overview & /electric/monthly 不再读 tab_energy_electricity_bill
- 改读 bi_ele_charge_record:kwh/fee/start_time
- 外部/我司用 vehicle_kind 区分(external/internal)
- 电能默认 customer 由 'external' 改 'lingniu',与导入页约定一致
- ElectricDaily 移除「数据对接中…」友好空状态(外部已有数据)
ele 导入页同步收紧:
- 命中系统车辆=internal,未命中(含车牌为空)一律 external
- 移除 unknown 分类、KPI 卡、批次列、过滤按钮、UploadResult 字段
- 历史 unknown 行已 UPDATE 为 external
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 19:11:52 +08:00
kkfluous
5217e19b25
fix(ele): /ele/import 同时支持 hash 路由
...
ci/woodpecker/push/woodpecker Pipeline was successful
主应用模块切换走 hash(#mileage 等),用户也会用 #/ele/import 访问。
之前只判 pathname='/ele/import',hash 形式直接落到 Shell 默认模块。
现在 path / hash 两种形式(/ele/import、#/ele/import、#ele/import)都识别。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 19:04:48 +08:00
kkfluous
57fdd346cf
feat(ele): 充电记录后台导入页面 /ele/import(隐藏入口)
...
ci/woodpecker/push/woodpecker Pipeline was successful
后端
- 新建 bi_ele_charge_record 表(首次访问自动 CREATE TABLE IF NOT EXISTS)
字段含订单编号(UNIQUE)、电站、时段、电量/费用、车牌/判定车牌、内外部分类、原始 JSON、批次号
- POST /api/ele/import:multipart 上传 xlsx,识别表头自动定位,
文件内 + 数据库双重去重(INSERT IGNORE on UNIQUE order_no)
上传时按 plate/judged_plate 在 tab_truck 中匹配,命中=internal、未命中但有牌=external、无牌=unknown
- GET /api/ele/list 分页 + kind/batch/search 过滤
- GET /api/ele/batches 批次汇总(数量、内/外/未知拆分、电量/费用合计)
- GET /api/ele/aggregate 全量与近 30 日按日 × 分类聚合
前端
- /ele/import 路径直接渲染 EleImportPage,主导航不显示,需手动输入 URL
- 拖拽/点击上传,结果卡展示解析/新增/重复/分类
- KPI 8 卡:总数、内/外/未知记录、累计电量与费用、内/外电量
- 批次列表(点击筛选)+ 最新记录表(kind 切换 + 关键字搜索)
- 上传后自动 reload 全部数据
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 19:02:38 +08:00
kkfluous
d8189329ac
chore(energy): 羚牛 tab 置前并默认选中(氢能/电能一致)
...
ci/woodpecker/push/woodpecker Pipeline was successful
- HydrogenDaily/ElectricDaily 默认 customer 改为 'lingniu'
- segmented control 顺序改为 ['lingniu', 'external']
- 进入页面立刻看到我司数据,避免空状态首屏
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 18:53:22 +08:00
kkfluous
e2d04db06d
chore(energy): 重新放开电能 tab
...
ci/woodpecker/push/woodpecker Pipeline was successful
- 取消之前的临时屏蔽,恢复氢能/电能两个顶部 tab
- 电能内部已和氢能同时支持 truck_id 区分外部/我司,外部空数据会展示「数据对接中…」
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 18:52:11 +08:00
kkfluous
5493e27e49
feat(energy): 用 truck_id 区分外部/我司,外部数据空时给友好提示
...
ci/woodpecker/push/woodpecker Pipeline was successful
- 后端 customerClause 改为基于 truck_id:外部=IS NULL,我司=IS NOT NULL
- KPI 内联条件(ourYearKg/Fee、customerYearKg、lingniuBornKg/Fee)同步切换为 truck_id
- 调用方 /hydrogen/daily 与 /electric/monthly 改传 b.truck_id / truck_id
- 当前外部账单 truck_id 尚未对接,HydrogenDaily/ElectricDaily 在 customer=external 且无数据时
改展示「数据对接中…」友好状态(插头图标 + 蓝色脉冲),替代「暂无数据」
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 17:52:03 +08:00
kkfluous
355c45a2e4
fix(assets): 区域车型分解新增「待交车」字段,并合入「其他」车型
...
ci/woodpecker/push/woodpecker Pipeline was successful
- typeBreakdown 之前只产 4.5T/18T/49T 且仅含 inventory 字段,
导致区域级 待交车 与车型级 待:N 不一致、操作中合计 != 区域合计
- 后端 getTypeBreakdown 计算 pending(status==='Pending'),
并把不属 4.5T/18T/49T 的车辆聚合为「其他」类型
- 前端区域 mobile/desktop 视图把「待:」从 inventory 改读 pending
- 点击穿透的 category 也由 'Inventory' 改 'Pending'
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 17:21:37 +08:00
kkfluous
66779a98e3
fix(mileage): 弹窗关闭改为向下滑出 + 淡出
...
ci/woodpecker/push/woodpecker Pipeline was successful
- exit 从 y:60 改为 y:'100%',整张表自顶向下滑出屏幕
- y/opacity 拆分 transition:y 走 spring,opacity 走 0.18s 淡出
- initial 也改为 y:'100%' 让出现/消失对称
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 17:16:57 +08:00
kkfluous
97ac92a0da
feat(mileage): 车辆明细弹窗新增时间范围切换、骨架加载与下滑关闭
...
ci/woodpecker/push/woodpecker Pipeline was successful
- 后端 vehicle/:plate/recent 支持 start/end 任意区间,最长 366 天
- 前端弹窗加 segmented control: 近 15 天 / 本月 / 本季度,切换重新加载
- 加载时柱状图与每日明细均显示骨架,区间合计/日均/有数据天 KPI 同步骨架
- 数据回来后柱条与每行进度条带渐入动画
- 顶部加 iOS 风格 drag handle(小白条),按住下滑超过 100px 或大速度触发关闭
- 保留点击背景与 X 按钮两种关闭方式
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 17:14:47 +08:00
kkfluous
7ca8ef24dc
feat(mileage): 点击车辆卡片展示近 15 日行驶里程明细
...
ci/woodpecker/push/woodpecker Pipeline was successful
- 后端新增 GET /api/mileage/vehicle/:plate/recent,返回近 N 天 + 今日的每日里程
- 缺失日补全为 dailyKm=0 + isDataSynced=false
- 前端新增 VehicleDetailModal:头部信息、合计/日均/有数据天 KPI、近 N 日柱状图、每日明细列表
- 移动端从底部弹起;缺失日柱条置灰,明细行标注「未对接」
- 卡片点击改为打开弹窗(不再复制车牌)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 16:16:54 +08:00
kkfluous
f9c6155ea7
fix(mileage): 修复车牌多选弹窗手机端右侧溢出与粘贴行为
...
ci/woodpecker/push/woodpecker Pipeline was successful
- 弹窗改为 right-0 锚右,宽度 min(280px, vw-24px),避免在窄列触发器下右侧溢出
- 移除 onPaste 自动 apply(避免与已输入文本拼接出非预期 token),改为粘贴入框 + 点击「添加」或 Cmd/Ctrl+Enter 确认
- placeholder 文案补充提示
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 16:12:19 +08:00
kkfluous
cab86556f3
feat(mileage): 区域与车牌列表级联,并自动剔除越界车牌
...
ci/woodpecker/push/woodpecker Pipeline was successful
- 后端: 选中 region 时基于该区域车辆重算 filters,车牌列表只展示该区域
- 前端: filterOptions.plates 收窄后自动从已选车牌中剔除不属于新区域的项
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 15:31:12 +08:00
kkfluous
e0c609168e
chore(energy): 恢复能源管理入口,仅隐藏电能 tab
...
ci/woodpecker/push/woodpecker Pipeline was successful
- 重新启用 EnergyModule 作为侧边栏入口
- EnergyModule 内部隐藏「电能」tab,只保留「氢能」(保留 Electric* 代码)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 15:25:37 +08:00
kkfluous
ebd82893bc
chore(energy): 暂时隐藏能源管理入口(发版前临时屏蔽,保留模块代码)
...
ci/woodpecker/push/woodpecker Pipeline was successful
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 15:24:19 +08:00
kkfluous
3809e785c1
feat(mileage): 外部三选筛选 + 车牌多选粘贴 + 运营区域 + xlsx 下载
...
ci/woodpecker/push/woodpecker Pipeline was successful
- 外部行改为 批次型号 / 运营区域 / 车牌多选;按部门、按客户移入详情面板
- 车牌多选支持从 Excel 粘贴(换行/逗号/空格分隔),未匹配项显示警告
- 新增运营区域筛选:基于 136 批次区域映射(华东/华南/西南/西北)
- 新增 xlsx 数据下载,导出当前筛选结果(带表头样式与列宽)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 15:19:00 +08:00
kkfluous
d1acdafa7e
refactor(energy): merge electric overview into a single page
...
Drop the 每日/总览 sub-tabs on 电能 — only 龙王路充电站 in scope, so
the overview is light (3 KPI cards + 1 bar chart) and combining
saves a click for daily ops. ElectricView now renders ElectricOverview
+ ElectricDaily back-to-back below the hint card.
氢能 keeps its sub-tabs (richer overview with Top5 + region chart).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 09:04:26 +08:00
kkfluous
c3b43837fb
fix(energy): update hint text to match real 1m cache TTL
...
The "每 5 分钟更新" copy was inherited from the BI dashboard mock and
no longer matches reality — server cache is 60s TTL.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 09:02:41 +08:00
kkfluous
c02c1aa62c
perf(energy): add 60s TTL cache for all 4 endpoints
...
Hydrogen overview was 1.8-2.0s (3 full-table aggregations on 66K rows).
With cache: cold 1 user/min eats the full query, all subsequent within
60s window return in ~10ms.
Implementation:
- New cache.ts with cached(key, loader) helper
- Per-key in-flight de-duplication: concurrent requests share one loader
- Each handler wrapped, cache key includes query params
(e.g. "hydrogen/daily?range=last30&customer=external")
- TTL 60s as requested
Measured speedups:
- hydrogen/overview: 1.96s → 12ms (165x)
- hydrogen/daily: 270ms → 11ms (24x)
- electric/overview: 93ms → 9ms (10x)
- electric/monthly: 36ms → 9ms (4x)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-28 17:50:48 +08:00
kkfluous
9a4f1945d9
feat(energy): connect to real DB (lingniu_prod)
...
Replace front-end mock data with live API backed by:
- tab_energy_hydrogen_bill (66.5K rows) joined with
tab_hydrogen_site (internal stations) and tab_outside_hydrogen_site
(external stations, joined via inner_site_id)
- tab_energy_electricity_bill (4.4K rows, all 龙王路充电站)
New server routes (src/server/routes/energy/):
- GET /api/energy/hydrogen/overview → KPI + Top5 站点 + 区域占比
- GET /api/energy/hydrogen/daily?range=&customer= → 日级 + 站点级下钻
- GET /api/energy/electric/overview → KPI + 本月柱图 (fallback to last
available month if current month has no data)
- GET /api/energy/electric/monthly?customer= → 6 个月分组日级表
Business rules encoded server-side:
- 客户类型: customer_id IS NULL = 羚牛承担, NOT NULL = 外部
- 时区: DATETIME 列字面值是 UTC,分组前 +8h 转成 CST
- 数据清理: hydrogen_time >= 2024-01-01 (排除 1900 年脏数据)
- 站点名 fallback: short_name → name → fixed_station_name → station_name → '未知站点'
- 区域归一化: SUBSTRING_INDEX(city, '-', -1) 取最后一段,去掉 '省'/'市'
让 '四川省-成都市' 和 '成都市' 合并为 '成都'
Component changes:
- All 4 components (HydrogenOverview, HydrogenDaily, ElectricOverview,
ElectricDaily) now use useEffect + fetch with loading/error states
- HydrogenDaily filtering moved to server (range + customer params)
→ drops client-side TODAY constant + isInPick switch
- ElectricOverview chart title is dynamic: shows 'YYYY-MM 每日充电'
when fallback kicks in (current month has no data)
- mock.ts deleted
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-28 16:42:37 +08:00
kkfluous
7de2d1ecd5
refactor(energy): split electric view into 总览/每日 sub-tabs
...
- Symmetry with hydrogen — both sides now have a 每日/总览 sub-tab pair
- New ElectricOverview (KPI + bar chart) and ElectricDaily (table)
- Sub-tab styling: pill fill (active = blue-50/blue-600) instead of the
underline-style used by parent — clearer visual hierarchy
- Tab order swapped to 每日 → 总览 with 每日 as default (daily ops focus)
- Today KPI: pill moves to absolute top-right corner so today's kwh
reading regains full row width (was getting truncated to "510...")
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-28 12:39:05 +08:00
kkfluous
42ec6e1c01
refactor(energy): drop anomaly coloring on hydrogen daily bars
...
All bars now use the cyan→blue gradient consistently, matching the
electric daily chart. Anomaly information stays available via the
table row tinting and the trend pills below.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-28 12:33:43 +08:00
kkfluous
313325553d
feat(energy): hydrogen daily — period bar chart with anomaly coloring
...
Mirrors the electric-view treatment: a 时段每日加氢量 bar chart sits
between the customer toggle and the table. Bars use the cyan→blue
gradient by default; days where |chainPct| >= 30% render in solid
emerald (positive) or red (negative), giving an at-a-glance view of
anomalous days that's reinforced by the table's row tinting below.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-28 12:32:40 +08:00
kkfluous
d9b9ff495e
feat(energy): electric view — daily bar chart + anomaly tint + mobile 环比
...
- New 本月每日充电 bar chart (蓝青 gradient) sits between KPI row and
table, fixing the previous "wall of numbers" feel
- Day rows now tint emerald/red when |chainPct| >= 30% (matches hydrogen)
- 环比 pill column now also shows on mobile (was desktop-only)
- Today KPI: pill moves to second line alongside kwh via justify-between
so it no longer gets clipped on narrow viewports
- Day labels in table trimmed to MM-DD (parent month row already shows year)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-28 12:05:11 +08:00
kkfluous
bdd039a2c4
refactor(energy): visual polish + KPI/table self-consistency
...
- mock: derive ELECTRIC_KPI month/today from APR_DAYS so card and table
totals always agree (previously ¥8,437 vs ¥9,151 mismatch)
- overview: Top5 bar chart now shows rank badges (1-5) and inline value
labels at bar ends — readable without hover
- overview: donut "年合计 362.43T" moves into the chart center
(previously below as a separate line, defeating the donut hole)
- daily: rows with |chainPct| ≥ 30% get a tinted background
(green for spikes, red for drops) for at-a-glance abnormal-day spotting
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-28 12:01:13 +08:00
kkfluous
2a92d991b0
fix(energy): bump KPI text-3xl to lg breakpoint to avoid landscape wrap
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-28 11:46:15 +08:00
kkfluous
ccf76cba79
feat(energy): electric view with mini KPI + month grouping
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-28 11:39:55 +08:00
kkfluous
a40fd2be34
feat(energy): hydrogen daily table with station drilldown
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-28 11:33:52 +08:00
kkfluous
c8a1e8506e
fix(energy): widen Top5 YAxis to prevent station name truncation
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-28 11:29:45 +08:00
kkfluous
dc1f0326fc
feat(energy): hydrogen overview Top5 bar + region donut
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-28 11:27:38 +08:00
kkfluous
e6880cba17
feat(energy): hydrogen overview KPI cards (4-card grid)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-28 11:20:32 +08:00
kkfluous
09b9862f1f
feat(energy): add module shell, register in nav
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-28 11:15:55 +08:00
kkfluous
deb2f2d5da
feat(energy): add types and mock data for new module
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-28 11:07:04 +08:00
kkfluous
cfe79cace2
fix(assets): correct modal filtering for 待交车/库存-其他/本周X
...
ci/woodpecker/push/woodpecker Pipeline was successful
三个弹窗筛选问题一起修:
1. 待交车 drill-in:Pending 原本错归入 weekly-detail(该接口不支持
model/batch/location 过滤),改走 /list 并给 /list 的 category 分支
补上 'Pending' 状态匹配。
2. 库存-其他:'其他' 同时存在于两个体系——资产表的"库存-其他"
(mapRegion 结果) vs 区域统计的"其他"(mapMacroRegion 结果),
过滤语义完全不同。引入 source 参数由前端传递,source==='asset'
时按 v.location 匹配(库存语义),否则按 mapMacroRegion(宏观区域)。
抽取 filterByLocation 辅助函数供 /list 与 /weekly-detail 共用。
3. 本周交车/还车/替换:/weekly-detail 接口新增 model/batch/location/source
过滤;前端 fetchWeeklyDetail 签名扩容。实现方式:SQL 结果与缓存
车辆集(按过滤条件筛)按 truck_id 取交集。
4. BIGINT 精度丢失:DELIVERED_SQL / RETURNED_SQL / REPLACED_SQL 及
pending/new 子查询原本使用裸 truck.id,mysql2 驱动把 BIGINT 当
JS Number 返回,大 id (>2^53) 尾部被截,导致 truck_id 交集永远
为空。全部改为 CAST(truck.id AS CHAR),与 MAIN_SQL 保持一致。
5. fetchVehicleList 类型补上 source,避免前端传的 source 被 URLSearchParams
构造时静默丢弃。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-24 11:00:45 +08:00
kkfluous
9ea2f306c4
feat(dev): env-gated local auth bypass for development
...
.env 里设 DEV_BYPASS_AUTH=1 + VITE_DEV_BYPASS_AUTH=1 即可本地免登录调试。
前端判定强制要求 import.meta.env.DEV,避免生产构建误启用。
后端塞入 dev 身份(含 所有权限 / BI-SCHEDULE-OPT 角色),保证 c.get('user')
下游依赖不会 crash。
新增 src/vite-env.d.ts 引入 vite/client 类型以访问 import.meta.env。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-24 11:00:30 +08:00
kkfluous
a472e543ce
refactor(scheduling): gate access strictly on BI-SCHEDULE-OPT role
...
ci/woodpecker/push/woodpecker Pipeline was successful
Remove the implicit fallback that granted scheduling access to any
FULL_ACCESS role (所有权限 / 数智中心 / BI-Leader). Access now requires
an explicit BI-SCHEDULE-OPT assignment, so the module scope is managed
purely via role assignment rather than piggy-backing on admin roles.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-17 15:50:48 +08:00
kkfluous
200172f0af
feat(scheduling): role-based access + align list count with qualifiedCount
...
ci/woodpecker/push/woodpecker Pipeline was successful
- Gate 智能调度 module on BI-SCHEDULE-OPT role (or full-access roles)
via shared canAccessScheduling helper, replacing hardcoded userId allowlist
- Thread roles[] through JWT payload → middleware → frontend nav
- Add router guard that 403s non-authorized users on /api/scheduling/*
- Emit replace_qualified suggestion for every qualified vehicle so list
count matches the 已完成考核目标 card; recalc qualifiedCount /
hopelessCount post-permission-filter for card↔list consistency
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-17 15:42:21 +08:00
kkfluous
a954fb90f6
refactor(scheduling): 考核剩余 → 年度考核剩余
...
ci/woodpecker/push/woodpecker Pipeline was successful
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-04-17 11:04:08 +08:00
kkfluous
2ea00a5383
refactor(scheduling): 拆分 reason 区为 客户/车辆 两栏
...
ci/woodpecker/push/woodpecker Pipeline was successful
详情页的指标区从单列两格网格改为 左:客户 / 右:车辆 两栏。客户日均归
左侧,考核剩余、日均需、年度完成率、可为新车贡献归右侧,便于一眼
识别数据归属。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-04-17 10:01:59 +08:00
kkfluous
cf138f67c0
refactor(scheduling): remove 7日 客户日均 趋势徽章
...
详情页和列表里的 ↗ 7日 +X% / ↘ 7日 -X% 徽章移除,客户日均只保留
30 日均这一项。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-04-17 10:00:10 +08:00