21 Commits

Author SHA1 Message Date
freedakgmail 0fd8489c22 feat(auth): 登出留痕审计
- 原登出为纯前端清 token,不发请求,故无记录
- 新增 POST /api/auth/logout 端点(无状态,仅供审计留痕),deriveActionLabel 加「登出」标签
- 前端 logout 先带 token 通知后端再清本地,失败不阻塞
- 审计中间件经 authMiddleware 解析操作人,记录谁/何时登出
2026-06-14 11:15:00 +08:00
freedakgmail 8bac14ef44 fix(calibration): 校准幂等+已校准状态显示,解决重复提示
根因:预测准确度卡的偏差来自历史回填项目的预测vs实际,属既成事实,
不会因校准改变;且原 apply 公式 next=current+dev 会累加,反复点越推越高。

修复:
- 校准建议/应用均基于未校准原始基准(env/默认)计算,保证幂等
- GET /api/calibration 返回 uncalibratedBase 与 calibrated 标志
- 卡片:已校准时显示「已按当前偏差校准:基准X%」绿色状态,不再出现按钮;
  未校准时按钮明示「X% → Y%」
- 补充说明:历史偏差不会因校准改变,校准仅调整后续承接建议阈值
2026-06-14 11:01:55 +08:00
freedakgmail c715dbb306 fix(dashboard): 风控/管理层列表精简列+表格横向滚动,避免溢出
- Table 组件统一加横向滚动容器(overflowX:auto),列多时不撑破卡片
- 参考销售列表精简列:风控/管理层待处理去掉「可接受性」「最近处理」,
  评估历史去掉「可接受性」(与承接建议重复)
- 待处理仍保留指派审批人与操作列
2026-06-14 10:53:44 +08:00
freedakgmail f42c04da8b feat(logs): 日志管理增加筛选维度(操作人/角色/请求方法)
- 后端 querySystemLogs 支持 role/method 过滤;新增 distinctRoles/distinctActors
- 关键词搜索补充 target_name 匹配
- /api/system-logs 返回 roles 与 actors 供前端下拉
- 前端独立筛选工具条:操作人/角色/动作/方法/结果/日期范围 + 清除筛选
- 结束日期改为当日 23:59:59 含当天
2026-06-14 10:27:24 +08:00
freedakgmail 3716564b58 feat(profitability): 第⑤步报价填写时实时提示报价口径不足
- 新增 revenueWarning 实时计算:随岗位单价/加成率/管理费/合同总额变化即时判断
- 报价信息不足时在报价模式区下方显示醒目橙色 alert 横幅,明确指出该填哪个字段
- 与运行前 handleRun 校验形成双重保障(填写时提示+运行时拦截)
2026-06-14 10:20:53 +08:00
freedakgmail 0501e6e8c2 feat(profitability): 运行前校验报价口径,避免静默生成收入0元的盈利分析
- handleRun 在运行前按报价模式校验收入口径:
  - per_head/volume: 无对客单价且无管理费 → 提示并阻止
  - cost_plus: 无成本加成率且无岗位人月单价 → 提示并阻止
  - fixed_total: 无合同总额 → 提示并阻止
- 成本加成率字段 hint 补充必填说明
2026-06-14 10:15:52 +08:00
freedakgmail 36ac4e7a87 详情页项目汇总:发起人显示姓名(assessorName)而非用户ID 2026-06-14 10:03:57 +08:00
freedakgmail 9ddada15a8 销售列表精简列(去承接建议/最近处理),避免审批进度撑宽导致操作列被挤出可见区 2026-06-14 09:52:52 +08:00
freedakgmail b43452f981 销售首页显示自己申报项目的审批进度(阶段+当前审批人) 2026-06-14 09:49:50 +08:00
freedakgmail 75033739aa 编辑评估:遇乐观锁409时自动拉取最新版本重试一次,仅真并发冲突才提示 2026-06-14 09:29:37 +08:00
freedakgmail a9c41bba57 日志管理增强:登录补全角色、IP兜底、记录业务对象与决策
- 登录日志从用户表补全 actorId/actorName/role
- IP 兜底:X-Forwarded-For/X-Real-IP → 否则用连接信息(getConnInfo)
- 业务动作记录目标项目名(target_name)与决策(风控审核·通过/管理层审批·驳回/红线裁定·命中)
- system_logs 增加 target_name 列;前端日志页显示项目名
2026-06-14 09:02:05 +08:00
freedakgmail 1a37daea68 系统管理员:新增日志管理(全系统操作审计)
- system_logs 表 + 持久化(查询/筛选/分页/动作枚举)
- 全局审计中间件:记录全部写操作(POST/PUT/DELETE)+登录,含操作人(JWT)/角色/中文动作/方法/路径/目标/状态/成功/耗时/IP/查询参数
- 中文动作标签按路由推导,目标ID从路径提取
- GET /api/system-logs(仅系统管理员)支持按动作/关键词/时间/成功失败筛选
- 前端「日志管理」页:筛选+分页+明细展开;导航与路由接入
2026-06-14 08:49:26 +08:00
freedakgmail aff293d40e 汇总/分析卡按用户口径对齐:销售统计仅本人;隐藏面向管理的组合分析
- countsByStatus 支持 assessorId 过滤;summary 端点对销售按 JWT.uid 强制本人统计
- 看板汇总卡销售看本人(我的评估/被驳回/我的待风控/我的已通过)
- 预测准确度/驳回Top/到期/超时 仅风控与管理层展示,销售不再看到跨人数据
2026-06-13 19:50:49 +08:00
freedakgmail a3906fc1b6 数据隔离:销售只可见本人发起的评估(行级权限)
- listPage 支持 assessorId 过滤;列表端点对已鉴权销售强制按 JWT.uid 过滤(防伪造)
- 看板历史与待办对销售按本人 user.id 过滤;风控/管理层仍可见全部
- 前端 fetchAssessmentsPage 支持 assessorId 参数
2026-06-13 19:36:28 +08:00
freedakgmail 8a1afb0c29 看板:行业列不再按单字竖排换行(nowrap),业务类型按词不拆字 2026-06-13 19:21:15 +08:00
freedakgmail 5afe021b56 大改动:全部人员用ID关联(JWT带uid + audit actor_id + assessorId改用户ID + 看板按ID匹配 + 历史回填)
- JWT 载荷增加 uid;登录返回 id;前端持久化 uid 并在变更请求中携带 userId
- 操作人服务端解析(优先JWT.uid,回退body.userId),审计写入 actor_id + 当时显示名
- audit_logs 增加 actor_id 列;持久化与加载带 actorId
- assessments.assessorId 改存用户ID,列表/详情按ID解析显示名(assessorName)
- 看板待办「分给我的」改为按 userId 匹配;发起人显示真实姓名
- 审批线指派按 salesId(用户ID) 计算
- scripts/backfill-actor-ids.sql 回填历史(旧账号名→当前用户ID),本地+生产已执行
2026-06-13 19:18:17 +08:00
freedakgmail e86e60208f 登录页快速登录改为真实姓名账号并列出全部(张伟/王芳/李娜/刘洋/陈静/赵磊/孙莉/周强) 2026-06-13 18:32:18 +08:00
freedakgmail 11997e6104 审批流程:用户名改为常见人名 + 按销售归属的审批线指派(软约束)
- 用户名改为常见人名(张伟/王芳/李娜/刘洋/陈静/赵磊/孙莉/周强)
- 审批线模型:每个销售→指定风控+管理层审批人(含默认线兜底),resolveAssignees 纯函数+4单测
- 提交时按销售归属计算并落库指派(assessment_assignments 表)
- 软约束:待办默认只看分给我的(含未指派),同角色他人仍可代审;详情页显示指派审批人
- 审批流程页新增「审批人指派·审批线」配置区(启用/默认线/按销售配线)
- 配置 GET/PUT 扩展 assignment;getApprovalConfig 向后兼容回填
2026-06-13 18:26:48 +08:00
freedakgmail 757b9c4a69 审批流程管理(系统管理员)+ 系统管理员去首页
- 审批规则引擎 evaluateApproval(纯函数+8单测):有序条件规则决定风控通过后是否需管理层终审
- approval_config 表 + 持久化 + 默认规则种子(红线/不可接受/高风险/低毛利/大合同→需管理层;低风险达标→风控终批)
- 风控审核接入规则:低风险达标可风控终批,否则转管理层;审计记录命中规则
- GET/PUT /api/approval-config(PUT 限系统管理员);overdue SLA 改为读配置
- 审批流程配置页 WorkflowManagement(全局SLA/默认/驳回去向 + 规则与条件编辑器)
- 系统管理员去掉首页,登录落地用户管理;导航=用户管理+审批流程
2026-06-13 17:55:28 +08:00
freedakgmail 6562208b13 多用户与角色:新增系统管理员 + 用户管理
- 新增 users 表(scrypt 口令哈希)与持久化层,启动兜底种子账号
- 登录改为后端用户表校验账号密码;JWT 带角色;保留无DB演示回退
- 新增系统管理员角色 + 用户管理页(增删改/改角色/启停/重置密码)
- 用户管理端点按 系统管理员 角色强制校验(RBAC)
- 各角色可建任意多个账号(多销售/多风控/多管理)
- 更新登录页快速登录与首屏快照
2026-06-13 17:35:52 +08:00
freedakgmail c670b9e454 外包风险评估系统:领域引擎+前端+服务端持久化与生产部署
- 确定性领域引擎(分类/评分/分级/红线/费用/裁决)+LLM(通义千问)语言理解
- 6步评估向导、服务端草稿持久化(跨设备/编辑草稿保护)
- 工作流(草稿→风控→管理层)、RBAC、报告导出、校准、客户/费率/红线/最低工资管理
- 专业图标体系替换全部emoji、看板美化
- 生产化:API_BASE可配置(同源反代)、auth密钥惰性读取修复RBAC
- 444单测+204前端测试+51 e2e
2026-06-13 01:06:39 +08:00