From b76a59cddf0087a56fa9d091d5e4bf0b75efcf30 Mon Sep 17 00:00:00 2001 From: DU Date: Thu, 15 Oct 2026 18:49:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=95=B0=E6=8D=AE=E5=88=86?= =?UTF-8?q?=E6=9E=90=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 src/views/analysis/index.vue:处理时效与积分排行左右一行、分类/级别分布(echarts)、月度运营报告+导出 - 新增 src/api/analysis/index.js:stats/timeliness/ranking/report 相关接口封装 - 修正 report/monthly 与 /export 需必填 year(文档未写),补年份选择 - 按甲方调整:去掉隐患热力图与顶部筛选列 - 同步更新 PAGES_TODO / CURRENT_STATUS / DEVELOPMENT_LOG;提交前 eslint 与 build:prod 通过 --- docs/development/CURRENT_STATUS.md | 1 + docs/development/DEVELOPMENT_LOG.md | 11 + docs/development/PAGES_TODO.md | 6 +- src/api/analysis/index.js | 46 ++++ src/views/analysis/index.vue | 365 ++++++++++++++++++++++++++++ 5 files changed, 427 insertions(+), 2 deletions(-) create mode 100644 src/api/analysis/index.js create mode 100644 src/views/analysis/index.vue diff --git a/docs/development/CURRENT_STATUS.md b/docs/development/CURRENT_STATUS.md index 9de162e..01210ab 100644 --- a/docs/development/CURRENT_STATUS.md +++ b/docs/development/CURRENT_STATUS.md @@ -40,6 +40,7 @@ | 积分管理 | `src/views/points/management/index.vue` | `points/management/index` | 已完成积分规则 Tab、统一 Card 列表、厂区列、分页、详情、新增、启停和删除;超管可筛选/选择厂区,厂区管理员可管理本厂区规则。**流水冲正 Tab 已开发(2026-10-15,待测试)**;申诉处理 Tab 已启用(复用独立「申诉台账」页同一组件 `AppealLedgerPanel`);手动调整 Tab 因 `balance/adjust` 接口定义不完整暂缓 | | 申诉台账 | `src/views/points/appeal/index.vue` | `points/appeal/index` | 已开发(2026-10-15),待测试。独立页(抄隐患台账 + 审批):列表 `appeal/todoList`、详情 `appeal/detail/{id}`、审批 `appeal/completeFlow`(taskId 由 `flowable/busiInfo/getProcessDetail` 补全)。待联调确认:completeFlow 的 taskId 来源、改判补分 `adjustPoints` 传参 | | 安全兑换管理 | `src/views/exchange/security/index.vue` | `exchange/security/index` | 已开发(2026-10-15),待测试。安全校验总开关 + 兑换限额 + 预警与大额审批 + 防刷配置;接口 `exchange/config/*`、`anti/farm/*`。“校验配置”为前端本地一致性校验 | +| 数据分析 | `src/views/analysis/index.vue` | `analysis/index` | 已开发(2026-10-15),待测试。处理时效(按级别)与积分排行(积分/上报/兑换)左右一行;分类/级别分布用 echarts;月度运营报告 + 导出。按甲方要求无隐患热力图、无顶部筛选列;“超期未处理表”无接口未做 | | 隐患流程配置 | `src/views/flowable/hazardConfig/index.vue` | `flowable/hazardConfig/index` | 已完成列表、筛选、分页、新增、修改、状态 Tag、删除和厂区权限展示;新增“流程类型”字段(`bizType`,字典 `flow_biz_type`)并在列表以 Tag 展示;分页按真实 `data.list/data.total` 解析 | | 切换日志 | `src/views/flowable/switchLog/index.vue` | `flowable/switchLog/index` | 空白页面,无明确列表接口 | diff --git a/docs/development/DEVELOPMENT_LOG.md b/docs/development/DEVELOPMENT_LOG.md index b0224cf..56593c3 100644 --- a/docs/development/DEVELOPMENT_LOG.md +++ b/docs/development/DEVELOPMENT_LOG.md @@ -1,5 +1,16 @@ # 开发日志 +## 2026-10-15:新增 Web 数据分析页面(W6) + +- 新增 `src/views/analysis/index.vue` + `src/api/analysis/index.js`。 +- 布局:处理时效(按级别)与积分排行(积分/上报/兑换三 Tab)左右一行;隐患分类分布(echarts 横向柱状)、隐患级别分布(echarts 饼图);底部月度安全运营报告(月份选择 + 导出)。 +- 接口:`analysis/stats/category`·`stats/level`·`timeliness/level`·`ranking/points|report|exchange`·`report/monthly`(+`/export`)。 +- 接口修正:`report/monthly` 与 `/export` 实际还需**必填参数 `year`**(api.json 文档未写,联调报错 500 `Required request parameter 'year' ... is not present`);已补 `year` 并新增年份选择(默认当前年)。 +- 按甲方调整:**去掉隐患热力图、去掉顶部筛选列**;“处理时效漏斗”与“积分排行”改为左右布局占一行。 +- 说明:原型“超期未处理表”无对应接口,未实现;导出用 `file-saver` + `blobValidate` 处理。 +- 菜单(需后端配置):一级「分析与风控」→「数据分析」,路由 `analysis/index`,组件 `analysis/index`(`/analysis/index`)。 +- 验证:`eslint --no-ignore` 通过、`npm run build:prod` 通过(仅既有 warning)。 + ## 2026-10-15:新增 Web 安全兑换管理页面(W5) - 新增 `src/views/exchange/security/index.vue`:安全校验总开关(`switch/status` + `switch/toggle`)、兑换限额(每日/每月/每年/次数/单笔最小最大)、预警与大额审批(快速兑换阈值+窗口、大额阈值、大额审批开关)、防刷配置(上报/积分获取/兑换/自报自审)。 diff --git a/docs/development/PAGES_TODO.md b/docs/development/PAGES_TODO.md index 1ea4b66..fbec35c 100644 --- a/docs/development/PAGES_TODO.md +++ b/docs/development/PAGES_TODO.md @@ -39,7 +39,7 @@ | 15 | 积分与商城 | 商城运营 › 日常积分兑换管理 | ❌ | ⛔ | ⛔ | 同上 | | 16 | 积分与商城 | 商城运营 › 日常积分兑换专区 | ❌ | ⛔ | ⛔ | 同上 | | 17 | 安全兑换管理 | 安全兑换管理(总开关/限额/大额审批/防刷配置) | ⚠️ 待测试 | ✅ | ✅ | **已开发(2026-10-15)**:`src/views/exchange/security/index.vue` + `src/api/exchange/config.js`。接口 `exchange/config/active`·`switch/status`·`switch/toggle`·`add`·`updateById`、`anti/farm/active`·`updateById`。注:“校验配置”为前端本地一致性校验(无后端校验配置接口) | -| 18 | 分析与风控 | 数据分析(时效漏斗/排行/分类分布/导出;**无热力图、无顶部筛选列**) | ❌ | ✅ | ✅ | 20 个接口齐全([数据分析](../api/modules/15-data-analysis.md));“超期未处理表”可用隐患待办列表拼接。**页面调整(2026-10-15 甲方)**:去掉隐患热力图、去掉顶部筛选列;“处理时效漏斗”与“积分排行”改为左右布局占一行 | +| 18 | 分析与风控 | 数据分析(时效/排行/分类分布/级别分布/月度报告导出;无热力图、无顶部筛选) | ⚠️ 待测试 | ✅ | ✅ | **已开发(2026-10-15)**:`src/views/analysis/index.vue` + `src/api/analysis/index.js`。接口 `stats/category`·`stats/level`·`timeliness/level`·`ranking/points|report|exchange`·`report/monthly`(+`/export`)。“超期未处理表”无接口,暂未做 | | 19 | 分析与风控 | 风控与审计(Tab1 风控预警 + Tab2 审计日志) | ❌ | ⚠️ | ⚠️ | 审计日志 ✅:`audit/log/getListByPage`、`audit/log/biz/{bizId}`([操作审计日志](../api/modules/16-audit-log.md));**风控预警列表 + 处置(放行/冻结 24h/黑名单)无接口**,Tab1 需等后端 | | 20 | 流程管理 | 隐患流程配置 | ✅ | ✅ | — | [flowable/hazardConfig](../../src/views/flowable/hazardConfig/index.vue) | | 21 | 流程管理 | 隐患上报(流程发起) | ✅ | ✅ | — | [flowable/task/myProcess](../../src/views/flowable/task/myProcess) | @@ -162,6 +162,8 @@ **A. 需后端确认(接口 / 字段 / 入参)** +- [x] `analysis/report/monthly`(+`/export`) 实际需**必填 `year`**(api.json 未写),已在 W6 补齐(`year` + `month`)。 + - [ ] `completeFlow` 请求体结构:`taskId`、通过/驳回标识、`adjustPoints` 传参位置(每节点 or 结束节点)、审批意见字段名。 > **W2 落地假设(2026-10-15,待联调确认)**:审批 body 采用 `{ taskId, instanceId, type: 'appeal', result: '1'|'2', comment }`;`taskId` 由 `flowable/busiInfo/getProcessDetail?id=flowInstanceId` 取当前待办任务补全(沿用隐患审核做法);**改判补分的 `adjustPoints` 暂放入 `variables`**——若后端实际从申诉记录字段读取,需改为“先 `appeal/updateById` 更新记录再 `completeFlow`”。 @@ -203,7 +205,7 @@ | W3 | Web | 积分管理 · 手动调整 Tab | `balance/adjust`、`balance/getByUserId/{userId}` | `src/views/points/management/index.vue` + `src/api/points/balance.js` | 高 | ⛔ 需确认 | **接口定义不完整**:`balance/adjust` 文档仅声明 `application/x-www-form-urlencoded` + 单个整数,缺 `userId`/`points`/原因字段结构,无法开工;**后端计划 2026-10-16 更新该接口并补参数**,更新后即可开发 | | W4 | Web | 积分管理 · 流水冲正 Tab | `transaction/getListByPage`、`transaction/reverse/{logId}` | `src/views/points/management/components/TransactionReversePanel.vue` + `src/api/points/transaction.js` | 中 | ◐ 待测试 | **已开发(2026-10-15)**,待测试。积分管理第 4 个 Tab;仅 status=1(有效)可冲正,二次确认。流水无用户姓名字段,列表显示 userId | | W5 | Web | 安全兑换管理 | `exchange/config/active`·`switch/status`·`switch/toggle`·`add`·`updateById`、`anti/farm/active`·`updateById` | `src/views/exchange/security/index.vue` + `src/api/exchange/config.js` | 中 | ◐ 待测试 | **已开发(2026-10-15)**,待测试。菜单:一级「安全兑换管理」,路由 `exchange/security`,组件 `exchange/security/index`(`/exchange/security`) | -| W6 | Web | 数据分析 | `analysis/stats/*`、`ranking/*`、`timeliness/level`、`report/monthly`(+`/export`)、`stats/category`·`stats/level` | `src/views/analysis/index.vue` + `src/api/analysis/index.js` | 中 | ☐ | **页面调整(2026-10-15)**:① 去掉隐患热力图(`heatmap/*` 接口暂不接);② 去掉顶部筛选列;③「处理时效漏斗」与「积分排行」改为左右布局占一行。图表用已装 `echarts` | +| W6 | Web | 数据分析 | `analysis/stats/category`·`stats/level`·`timeliness/level`·`ranking/points|report|exchange`·`report/monthly`(+`/export`) | `src/views/analysis/index.vue` + `src/api/analysis/index.js` | 中 | ◐ 待测试 | **已开发(2026-10-15)**,待测试。菜单:一级「分析与风控」→「数据分析」,路由 `analysis/index`,组件 `analysis/index`(`/analysis/index`)。按调整:无热力图、无顶部筛选;时效与积分排行左右一行;分类/级别分布用 echarts;“超期未处理表”无接口未做 | | A1 | APP | 设置(推送/声音/震动/关于/清缓存/退出) | 纯本地(AsyncStorage) | `src/screens/home/SettingsScreen.tsx` | 中 | ☐ | 参考原型 `scr-settings` | | A2 | APP | 我的兑换 | `exchange/order/myList` | `src/screens/home/MyExchangeScreen.tsx` + `src/api/exchange.ts` | 中 | ☐ | 入口:我的 → 我的兑换 | | A3 | APP | 通知提醒卡片 | `message/unread-count`、`message/list` | `src/components/NoticeReminderCard.tsx` | 中 | ☐ | 首页顶部条,点击跳 `Messages` | diff --git a/src/api/analysis/index.js b/src/api/analysis/index.js new file mode 100644 index 0000000..4bc1567 --- /dev/null +++ b/src/api/analysis/index.js @@ -0,0 +1,46 @@ +import request from '@/utils/request' + +// 隐患统计-按分类(饼图/柱状) +export function getStatsCategory() { + return request({ url: '/business/points/analysis/stats/category', method: 'get' }) +} + +// 隐患统计-按级别 +export function getStatsLevel() { + return request({ url: '/business/points/analysis/stats/level', method: 'get' }) +} + +// 处理时效-按级别(平均处理时长 / 已完成数) +export function getTimelinessByLevel() { + return request({ url: '/business/points/analysis/timeliness/level', method: 'get' }) +} + +// 积分排行榜-总入账 +export function getRankingPoints() { + return request({ url: '/business/points/analysis/ranking/points', method: 'get' }) +} + +// 上报积分排行 +export function getRankingReport() { + return request({ url: '/business/points/analysis/ranking/report', method: 'get' }) +} + +// 兑换排行统计(按单位) +export function getRankingExchange() { + return request({ url: '/business/points/analysis/ranking/exchange', method: 'get' }) +} + +// 月度安全运营报告(year 必填;month=0 全年,1~12 指定月份) +export function getMonthlyReport(params) { + return request({ url: '/business/points/analysis/report/monthly', method: 'get', params }) +} + +// 月度安全运营报告导出(Excel,直接下载;year 必填) +export function exportMonthlyReport(params) { + return request({ + url: '/business/points/analysis/report/monthly/export', + method: 'get', + params, + responseType: 'blob' + }) +} diff --git a/src/views/analysis/index.vue b/src/views/analysis/index.vue new file mode 100644 index 0000000..a273671 --- /dev/null +++ b/src/views/analysis/index.vue @@ -0,0 +1,365 @@ + + + + +