Commit Graph

36 Commits

Author SHA1 Message Date
e45c97bd1f feat: 组织隔离(IRIS 单实例)与出料功能基础
本轮之前累积的未提交工作,一并固化:

- 组织隔离:同一份代码部署给不同部门只需改 config 的 ORG_DEPARTMENT 与
  MATERIAL_CATEGORY_PREFIX。过滤点在登录/人员列表/物料/MOM 出库单四处,
  全部服务端钉死,客户端传什么都放不大。
  ★ 物料必须用**前缀** LIKE,不能反推成 ILIKE '%IRIS%':MOM 里 LICA 的物料是
  `LICA/<中文>`,而本部门分类树里另有 `IRIS/成品/LICA/…`(本就属于本部门),
  前缀匹配天然区分得开。
- MOM 出库单只读查询(直连 MOM 库):不走 MOM 现成的 /outbound 接口 ——
  那个要 JWT + permission_required,且对非特权账号按 consumer_name 做行级
  隔离,服务账号只能拿到自己名下的单。分页必须两段式(先按单号 GROUP BY
  分页,再 IN 捞明细),对宽表直接分页会得到明细行数而不是单据数。
- 出料功能:产品 ↔ 出库单存档(product_outbounds)与任务 ↔ 出库明细
  (task_outbound_materials),供「这台设备对应 MOM 哪张单」的展示。
  ⚠️ 快照一律由后端拿 ID 去 MOM 现查,不接受前端传入,否则前端可伪造单据。
2026-09-23 15:18:06 +08:00
ee25b8fd23 feat: PC 端直接完结入口与当前工序口径(前端)
【直接完结入口】
- 共享 TransferModal 新增「🏁 直接完结」开关,与「入库」互斥;选中后下游字段
  禁用(保留输入便于反悔)、标题/预览/按钮切换为独立视觉
- 入口仅超管/主管可见(useAuth + isAdminRole),并加防御性 useEffect 清掉
  非管理员的残留选中态,避免提交出 finish_directly
- 表单重置改为「打开时重置」:TransferModal 被 memo 后常驻挂载会跨次残留状态,
  且原实现于提交时清空会让等待期主题从「直接完结」闪回普通转交

【角色判断收口】
- 新增 ADMIN_ROLES / isAdminRole(与后端 task_service.ADMIN_ROLES 对齐)
  此前该判断散落在 TaskFlowView / AdminProductsPage 各处,移动端那份还只判了
  SUPER_ADMIN 漏了 SUPERVISOR,导致主管被前端误挡

【当前工序口径】
- 「当前工序」列改用后端派生的 current_step,不再用 overall_status ——
  后者会被"最新主干任务名"覆盖,让已 COMPLETED 的历史工序(扫码出库/测试…)
  冒充当前工序。显示与筛选值一并切换以保持一致
- ProductResponse 类型补齐 current_step
2026-09-17 17:05:51 +08:00
e707f3673d feat: PC 端补齐直接完结通道
- taskApi.transferTask 增 finishDirectly 参数,按新 Schema 发送
  { next_tasks: [], finish_directly: true, note }
- TaskTransferPayload 支持 next_tasks / finish_directly,旧版单线字段降为可选
  (后端仍兼容 next_assignees / next_task_name,存量调用不受影响)
- 共享 TransferModal 新增「🏁 直接完结(无下游,不入库)」开关:
  与入库互斥,选中后下游字段禁用(保留输入便于反悔切回)、
  切换独立标题/提示/预览/提交按钮,不再套用「将创建 N 个任务」模板
- 表单重置改为「展开时重置」:TransferModal 被 memo 后常驻挂载会跨次残留状态,
  且原实现于提交时清空会让等待期主题从「直接完结」闪回普通转交
- TaskTreeViewer 与 AdminTasksPage 两个入口的 handleTransfer 签名对齐
2026-09-17 14:08:30 +08:00
7b8084a43d fix: 前端统一解析后端 detail 报错,杜绝 [object Object]
各处 catch 里直接 `toast(err?.response?.data?.detail ?? "xx失败")` 有坑:
请求体校验失败(422)时 detail 是数组,React 会把每个对象渲染成 [object Object]。

- utils/errorMessage.ts(新增): extractErrorMessage 统一解析三种形态 ——
  字符串 / FastAPI 校验错误数组 / 对象;数组取 msg 并剥掉 Pydantic 的
  "Value error, " 前缀、带上字段名、同字段去重后用「;」拼接;解析不出内容
  则回落到调用方给的兜底文案。行为与移动端 extractErrorDetail 对齐
- 19 处调用点全部替换:AdminTasksPage(4) / AdminProductsPage(5) /
  TaskTreeViewer(4) / AdminPrintConfigPage(2) / ScanPage / CreateProductDialog /
  ImageUploader / authApi
- TaskRejectPayload.images 与 taskApi.rejectTask 的注释同步为「选填,支持空数组」
- 新增 components/ui/ImageUploader.tsx(驳回弹窗选图上传组件),
  RejectModal 同步放开无图拦截:去掉 images 非空校验、提交按钮不再因
  无图禁用、标签由必填星号改为「(选填,最多 9 张)」,并移除因此失效的
  error 状态
- AdminTasksPage.tsx: 支持大屏下钻的 ?search / ?status / ?stage 预设参数,
  新增「售后流转中」状态 Tab(按 lifecycle_phase 判定)与全局重置;
  ?stage 只在跳入时生效一次,用户手动改条件即解除锁定
- 杂项清理: TaskFlowView 移除透传的 assigneeNames、TaskListCard/MyTasksPage
  移除未使用导入、QrScanner 关闭 verbose 日志
2026-09-15 10:57:56 +08:00
3238e4819a feat: 网页端渲染售后回流标签(发货测试/售后维修) 2026-09-14 14:49:38 +08:00
109f45f22a feat: 产品/任务搜索支持业务序列号(external_serial)检索 2026-09-07 11:08:49 +08:00
3c6c8c0c53 feat: WIP矩阵单表化/固定表头/首列复合/下钻日志弹窗/时间联动 2026-09-02 10:38:58 +08:00
6cb7731cbb feat: Track 网页端已完成/已入库/已出库状态展示与筛选
- ProductCard/ScanPage 徽标改用整体状态,补全宏观状态中文映射
- 产品管理/任务全景/我的任务/看板/WIP分析 状态筛选与徽标区分
- 转入在库显示在库实际操作人;新增已出库/OUTBOUND 状态色
2026-09-01 13:53:30 +08:00
1e6adeb576 fix(二维码): 弹窗打开时锁定背景滚动
- 与流转树弹窗一致,二维码弹窗打开时 body overflow=hidden 防止滚动穿透
2026-08-28 11:33:49 +08:00
ddb1b4364b feat(任务全景): 新增列显隐控制,可勾选去掉不想要的列
- 工具栏新增「列设置」按钮,弹出 checkbox 列表控制列显示/隐藏
- 勾选=显示,取消=去掉该列(如不需要宏观状态可直接取消勾选)
- 操作列(流转树)固定显示不可隐藏,提供「全部显示」重置
- 表格列数与网格跨度按实际显示列动态计算,原有排序/筛选/拖拽保留
2026-08-28 11:21:22 +08:00
7cfaf4b04b feat(任务全景): 流转树改为宽屏弹窗并放大字体
- TaskFlowView 增加 size prop(sm默认/lg放大),弹窗模式卡片/字体/按钮全部放大
- TaskTreeViewer 通用 Modal 导出并支持 widthClass/bodyClassName 定制
- AdminTasksPage 内嵌展开改为宽屏 Modal(max-w-6xl),保留接收/转交/驳回操作
- 记录弹窗放大且 z-index 提升到 z-[60] 保证覆盖弹窗
- 修复 TaskRecordResponse 无 note 字段的类型错误,清理未使用 import
2026-08-28 11:19:08 +08:00
19c7c7bbf1 feat(任务全景): 表头排序/筛选/列拖拽 + 新增当前人滞留列
- 状态筛选 tabs 去掉「已入库」并支持多选
- 表头点击排序:身份证/序列号/当前人滞留/最新动态/创建时间,三态循环(升/降/取消)
- 表头漏斗筛选:文本列模糊过滤,枚举列(宏观状态/任务状态/当前位置)多选过滤
- 列头拖拽调整列显示顺序
- 新增「当前人滞留」列,读 active_duration_hours 按天/小时/分钟着色展示
- 修复 handleSearch 引用不存在的 setExpandedProducts(应为此前的展开状态) 导致的查询报错
2026-08-28 10:46:20 +08:00
b6ef0751e0 fix(web): 列表最新动态显示操作人、流转树焦点模式保留活跃并发分支 2026-08-13 11:17:13 +08:00
badb470ea9 Revert "fix: 表格grid 16→14列对齐 — 身份证列宽更充足"
This reverts commit f0503f8800.
2026-08-12 17:31:22 +08:00
f0503f8800 fix: 表格grid 16→14列对齐 — 身份证列宽更充足 2026-08-12 17:29:15 +08:00
5062745c14 Revert "fix: 序列号列兜底显示 — external_serial为空时展示身份证后6位"
This reverts commit 8ac4c425a5.
2026-08-12 17:28:04 +08:00
8ac4c425a5 fix: 序列号列兜底显示 — external_serial为空时展示身份证后6位 2026-08-12 17:24:37 +08:00
828aee5161 feat: 任务全景搜索框增加一键清除(×)按钮 2026-08-12 17:14:09 +08:00
e511952ea0 feat: 最新动态列支持图片展示 — 纯文字/纯图片/图文混合三种模式
后端: ProductResponse 新增 latest_record_has_images
前端: 📷图标 + 纯图片时显示"图片记录" + Tooltip标注[含图片]
2026-08-12 16:01:24 +08:00
92c388190c fix: grid-cols-[16]改为inline style避免Tailwind任意值不生效导致表头竖排 2026-08-12 16:00:03 +08:00
b21b9ed0e2 fix: 表格布局恢复原始列宽 — 规格型号/创建时间各2列, 总16列 2026-08-12 15:56:48 +08:00
163d9c20bb feat: 任务全景表格新增"最新动态"列
后端:
  - ProductResponse 新增 latest_record_time/content 字段
  - get_all_products 批量查询活跃任务(WIP/PENDING)的最新 task_records
  - 使用窗口函数 ROW_NUMBER() PARTITION BY product_id

前端:
  - AdminTasksPage: grid-cols-12→grid-cols-[14]
  - 表头+数据行新增"最新动态"列
  - Tooltip悬浮显示完整内容, 截断+灰字二级排版
2026-08-12 15:43:33 +08:00
9b59521746 feat: 看板在制品点击跳转任务全景并自动展开流转树
Dashboard: WipRow 点击改为 nav(/admin/tasks?sn=xxx)
AdminTasksPage: 读取 ?sn= 参数 → 自动搜索 → 产品加载后自动展开流转树
2026-08-12 15:00:37 +08:00
51ca05d737 fix: 全览按钮z-index修复+产品ID点击弹二维码 2026-08-10 14:30:50 +08:00
38263291d1 perf: 流转树排他展开(手风琴模式)-同时只展开一个产品 2026-08-10 13:40:46 +08:00
5d6e2135c0 feat: 任务全景默认按设备分组+全展开+全部展开/折叠按钮(与产品管理一致) 2026-08-10 11:47:03 +08:00
b43bded0ef feat: 宏观状态动态从主干任务获取+任务树assignee中文姓名映射(后端+前端) 2026-08-10 11:25:44 +08:00
2880ea6df7 fix: Grid回退grid-cols-12精确对齐+分组标题按device/order切换+宏观状态receive/transfer只主线 2026-08-10 10:58:33 +08:00
26dc05cc2f fix: 修复JSX style属性语法错误(grid-template-columns) 2026-08-10 10:43:31 +08:00
4854eb626e feat: 宏观状态只同步主线+删除5s倒计时+序列号确认+分组切换(订单/设备)+序列号列 2026-08-10 10:37:56 +08:00
ffab378700 refactor: 单一数据源—Tab过滤+表格列统一使用macro_status||status,删除calcProductStatus 2026-08-09 18:37:02 +08:00
45b5376537 fix: 三致命Bug—macro_status预计算+排除已完工脏读+flush落盘+递归深度限制10 2026-08-09 18:23:55 +08:00
f33396b9f1 fix: 位置回溯父任务优先 + Tab筛选改为本地calcProductStatus过滤 2026-08-09 18:10:13 +08:00
65ff05fb2f feat: 状态渲染修复+中文姓名映射+SUPERVISOR/SUPER_ADMIN权限控制(前端+后端) 2026-08-07 17:26:14 +08:00
721cfe1504 feat: Web端401队列拦截器 + 消息/任务/个人中心重写 + TabBar红点 + Admin页面完善 2026-08-07 11:44:12 +08:00
8458b99782 feat(frontend): 实现任务全景树组件与三大操作弹窗
TaskTreeViewer (components/TaskTree/):
- 搜索栏: 输入 16 位序列号 → getTaskTree() → 递归渲染产品任务树
- 状态标签: PENDING(黄)/WIP(蓝)/COMPLETED(绿)/REJECTED(红)/ARCHIVED(灰)
- 返工警告: is_rework → 红色脉冲 ⚠返工 标签 + 红色 ring 边框
- 裂变标识: child_tasks>1 → 紫色 裂变×N 标签 + 树形连接线
- 产品摘要栏: 序列号/订单/当前位置(virtual_warehouse→🏭仓库)/任务总数

三大操作弹窗 (替换 alert 占位符):
- ReceiveConfirmModal: 二次确认 → receiveTask() → Toast + 刷新树
- RejectModal: 驳回原因必填(≤500字) → rejectTask() → 自动返工提示
- TransferModal: 工序名称 + 多接收人标签输入(Enter添加/X删除)
  + 🏭虚拟入库勾选 + 备注 + 实时裂变预览 → transferTask()

路由接入:
- App.tsx: 包裹 ToastProvider, 新增 /admin/tasks 路由
- AdminLayout: 侧边栏新增「任务全景」菜单 (GitBranch 图标)
- AdminTasksPage: 薄封装层
2026-08-04 17:30:26 +08:00