Commit Graph

159 Commits

Author SHA1 Message Date
eb9028dcc6 fix: 任务进度条补全驳回段 + 在制品名称旁显示SN
1. 任务进度条: 3段→4段 (PENDING|WIP|COMPLETED|REJECTED)
   解决总数11但进度条只覆盖9的视觉缺口
   驳回以红色段显示, 拼图完整

2. 在制品行: 产品SN从第二行移到任务名旁边
   旧: 装配  张三  → 新: 装配 A1B2C3D4  张三
   一行看清: 做什么工序+哪台设备+谁在做
2026-08-12 14:04:14 +08:00
32c234fea1 fix: 在制品按滞留时间降序 + 留言抽屉UI美化
1. 在制品排序: nulls_first → nulls_last
   已接收任务按receipt_at升序(最早=滞留最久)排最前
   未接收任务(null)排最后

2. 留言抽屉UI重设计:
   - 卡片式布局: 彩色头像圆+边框阴影+hover效果
   - 头像颜色按姓名首字自动分配7色
   - Input.Search替代普通Input+Search图标
   - 灰色背景区分卡片, 时间格式改为YYYY-MM-DD HH:mm
   - 手动分页按钮替代Antd分页器
2026-08-12 13:59:39 +08:00
3b53db03c1 feat: 看板全局时间筛选 + 协同留言抽屉
任务1 — 后端时间快照逻辑:
  get_dashboard_stats 新增 since/until 参数
  PENDING/WIP/总数 → 永远实时快照(忽略时间筛选)
  COMPLETED/REJECTED → 严格按时段过滤
  完成率基于过滤后的COMPLETED计算

任务2 — 前端时间筛选器:
  Radio.Button: 今天 | 近7天 | 近30天 | 自定义
  DatePicker.RangePicker 自定义区间
  切换时重新拉取 /dashboard/stats

任务3 — 协同留言抽屉:
  后端: GET /dashboard/messages(上帝视角全厂数据)
    JOIN Product → serial_number + material_name
    支持 keyword 搜: SN/物料名/留言人/内容
    按 created_at 倒序
  前端: Drawer + Input.Search + List
    点击"留言"数字打开抽屉
    分页展示: 留言人/内容/SN标签/物料名/时间
2026-08-12 13:50:56 +08:00
39377ae5e4 feat: 看板重构 — 在制品看板 + 留言未读数
核心理念转变:
  旧: 最近操作历史(谁做了什么)
  新: 当前在制品状态(谁的活卡了多久)

后端:
  - DashboardStats 新增 unread_messages(协同留言总数)
  - 新增 GET /dashboard/wip-tasks(在制品端点)
  - 按滞留时间升序排列,PENDING/WIP 任务倒计时
  - 自动计算 duration_hours(已滞留小时数)

前端:
  - 品质卡片: 新增留言未读数(紫色)
  - 在制品看板: 替换原最近动态
    每行显示: 状态徽标 | 任务名+负责人+身份证 | 滞留时长
  - 滞留颜色: 48h+红 | 24h+橙 | 8h+黄 | <8h灰
  - 系统通知可点击跳转
2026-08-12 13:40:08 +08:00
00fae01eed fix: 看板4项体验修复 — 时间/身份证/日期筛选/通知跳转
1. 完整16位产品身份证号显示(不再截断)
2. 日期筛选栏: 今天 | 近7天 | 近30天 | 全部
   - 后端 recent-activity 支持 since/until ISO参数
   - 默认展示今天动态,可按时间范围切换
3. 操作人兜底: TaskLog无operator_id时用任务assignee_id
4. 未读通知可点击跳转通知页面 + 快捷入口增加通知中心
2026-08-12 13:35:23 +08:00
658fc28b9b feat: 管理看板全面改版 — 增强可读性 + 填充空白区域
后端增强:
  - DashboardStats 新增 tasks_rejected, tasks_rework, unread_notifications
  - 新增 GET /dashboard/recent-activity 最近动态端点
  - 关联 Task + Product 表返回完整动态信息

前端改版 (AdminDashboard.tsx):
  - 4 张概览卡片: 产品流转 | 任务状态 | 品质通知 | 完成率
  - 每张卡片含进度条(百分比标注) + 中文说明
  - SVG 环形图展示任务完成率
  - 最近流转动态时间线 (8条)
  - 快捷入口: 创建产品/任务管理/打印配置/扫码干活
  - 底部说明卡片解释"产品 vs 任务"的区别
  - 响应式网格填满全屏, 无空白区域
2026-08-12 13:25:49 +08:00
0e3eb6a35a fix(frontend): 根治双重渲染 — 侧翼过滤主线,主轴归主轴
回滚此前错误的 allMains 根级过滤,恢复所有 TRANSFER/RECOVERY
任务进入中央垂直主轴。

真正修复:directChildren 加 .filter(c => !isMain(c))
→ 左右翼严格排除主线任务,仅保留 SPAWN 协助分支

原理: 主线→中央垂直时间线, 分支→左右翼, 各行其道不再重复
2026-08-11 15:40:43 +08:00
974f4b9d01 fix(frontend): TaskFlowView 根治双重渲染 — allMains 仅含根级节点
生产数据问题:16个任务中15个TRANSFER子节点全部挂在同一个root下,
isMain() 将它们同时放入 allMains 和 childMap,导致每个子节点渲染2次。

修复:
1. allMains 改为仅收集 parent_task_id IS NULL 的根级主干
   - TRANSFER 子节点仅通过 childMap → renderBranch 递归渲染
   - 彻底杜绝同一任务在时间线 + 分支中双重出现
2. 统一焦点/全景为同一套垂直时间线 JSX 布局
   - 删除旧焦点模式的独立 flex-row 排版
   - visibleMains useMemo 负责数据过滤 (active() 过滤)
3. 清理死代码: getRootMainId() / rootMainMap / srm / flatMap
2026-08-11 15:37:04 +08:00
d3def15bb3 feat(web): TaskFlowView 递归渲染重构
- 废弃拍平算法,构建全局childMap保留真实树结构
- 新增renderBranch递归渲染函数,子子孙孙向外延伸
- 焦点/全景模式统一应用递归算法,连线从真实父节点引出
2026-08-11 10:02:06 +08:00
6373dca4f6 refactor: Web 端十字星流转树 — 3层嵌套协助降维渲染
- isMain() 移除危险的 parent.status 兜底判定,仅凭基因字段
- 新增 getRootMainId() 寻根算法,向上攀爬找视觉主干
- subsByRootMain 虚拟扁平化:孙子协助挂在顶级主干下
- 层级排序:直接子节点 → 孙子按父链收集
- SlimCard 新增嵌套协助标识:协助: {真实parent.assignee_id}
2026-08-10 17:37:30 +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
4d93844637 fix: 箭头语义方向修正—永远背离主干指向分支(左翼◀+右翼▶) 2026-08-10 13:29:35 +08:00
fba3589d0d feat: 焦点/全景模式双翼flex-col纵向堆叠+SVG箭头+实线虚线区分 2026-08-10 13:26:31 +08:00
87296af139 refactor: 水平对称双翼布局—左翼(偶索引)+中央主干+右翼(奇索引),实线/虚线区分 2026-08-10 13:21:30 +08:00
ae520e49d7 refactor: 双模式流转树—焦点模式(活跃+遗留分支) + 全景模式(完整历史时间轴) + 极简卡片 2026-08-10 13:12:23 +08:00
5d6e2135c0 feat: 任务全景默认按设备分组+全展开+全部展开/折叠按钮(与产品管理一致) 2026-08-10 11:47:03 +08:00
b43bded0ef feat: 宏观状态动态从主干任务获取+任务树assignee中文姓名映射(后端+前端) 2026-08-10 11:25:44 +08:00
c0fe7c94bb feat: 产品管理默认按设备分组+自动全部展开+全部展开/折叠按钮 2026-08-10 11:18:01 +08:00
2eed7db82d refactor: 产品管理页全面升级—分组折叠面板+搜索/状态过滤+序列号列+与任务全景体验一致 2026-08-10 11:07:53 +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
d8623df7de refactor: 废弃flattenLevels拍平→递归TaskNode渲染—主干同缩进+SPAWN分支缩进紫色左边线 2026-08-09 18:16:47 +08:00
f33396b9f1 fix: 位置回溯父任务优先 + Tab筛选改为本地calcProductStatus过滤 2026-08-09 18:10:13 +08:00
3c4c16a1cc fix: 四Bug—权限互斥+中文姓名+记录弹窗+后端位置回溯(含RecordsModal) 2026-08-09 17:55:40 +08:00
ab935a8c95 refactor: Web端FlowCard与移动端100%对齐—主线/分支标签/备注/记录/时间格式/三种权限模式 2026-08-07 17:29:36 +08:00
65ff05fb2f feat: 状态渲染修复+中文姓名映射+SUPERVISOR/SUPER_ADMIN权限控制(前端+后端) 2026-08-07 17:26:14 +08:00
704af0b2a4 chore: Web端泳道→分支 统一命名 2026-08-07 16:51:56 +08:00
bc43b5a732 feat: 产品管理 — 当前位置显示真实姓名 + 编辑弹窗 + 删除确认 2026-08-07 15:38:01 +08:00
d3d501dfeb fix: 产品管理页响应式Grid + 丰富卡片信息(物料/规格/位置/状态) 2026-08-07 15:14:11 +08:00
1b4af0a7af fix: 全端隐藏用户角色标签(SUPER_ADMIN/操作员等) 2026-08-07 14:53:46 +08:00
6382aa6d45 feat: Web端关于弹窗 + 帮助反馈Toast + 版本号T1.0.3 2026-08-07 13:49:06 +08:00
41dfc53f83 chore: Docker生产部署配置 + 部署脚本 2026-08-07 11:53:40 +08:00
721cfe1504 feat: Web端401队列拦截器 + 消息/任务/个人中心重写 + TabBar红点 + Admin页面完善 2026-08-07 11:44:12 +08:00
dc97a7385f perf(frontend): Context value useMemo 稳定化
AuthContext.Provider 和 ToastContext.Provider 的 value 对象
用 useMemo 包裹,避免每次 Provider render 产生新引用导致
所有消费者不必要的 re-render。
2026-08-06 17:34:05 +08:00
b725599cb0 perf(frontend): Vite 构建分包 — manualChunks 拆分 vendor
将 react/react-dom/react-router-dom → vendor-react
将 antd/@ant-design/icons → vendor-antd
将 html5-qrcode → vendor-qrcode
第三方巨头的独立 chunk 可被浏览器长期缓存,业务代码更新时无需重新下载。
2026-08-06 17:34:00 +08:00
3d164159ac perf(frontend): 递归组件 Memo 优化 — React.memo + useMemo
TaskTreeViewer:
- Modal/ReceiveConfirmModal/RejectModal/TransferModal 加 React.memo
- TaskNodeCard 递归组件加 React.memo,阻断父节点状态变更引发的整树重渲染
- countAllTasks 用 useMemo 缓存,仅在 task_tree 引用变化时重新计算

TaskListCard:
- TaskNode 递归组件加 React.memo
- countAll 用 useMemo 缓存
2026-08-06 17:33:54 +08:00
9d204a57d8 perf(frontend): 路由级代码分割 — React.lazy + Suspense
将所有页面组件改为按路由懒加载,Layout 组件保持静态导入。
新增 LoadingSpinner 作为 Suspense 回退组件。
html5-qrcode (~200KB) 和 antd 仅在访问扫码/管理后台路由时加载。
2026-08-06 17:33:48 +08:00
3176bcde6f 标签float环绕布局: QR左浮+文字自然折行+clear:both防序列号乱入 2026-08-06 11:04:03 +08:00
49c8707955 标签防御: height:fit-content+maxHeight物理切断+12px小字号防重叠 2026-08-06 11:02:16 +08:00
5f7b8e9394 标签预览彻底改为内联样式Flex: QR锁110px+line-clamp截断+无class依赖防重叠 2026-08-06 10:56:29 +08:00
1ba44d4b0a 打印所见即所得: iframe克隆DOM+全局样式+静默打印 2026-08-06 10:52:29 +08:00
81e41bc38b 标签预览重构: 固定QR120px+Flex分栏+line-clamp3截断+CSS类名化 2026-08-06 10:51:28 +08:00
f4ff4b5ecb 标签打印防御性布局: Flex分栏+line-clamp截断+分割线+预览同款 2026-08-06 10:44:22 +08:00
bdc861cf8e Web端创建产品成功弹窗: 打开二维码→直接打印标签(window.print+隐式窗口) 2026-08-06 10:37:08 +08:00
59c182a743 feat(frontend): 管理端页面 — 任务全景树/创建产品/标签打印/认证守卫
App.tsx:
- AntApp + AuthProvider + ToastProvider 三层包裹
- /admin/login 独立登录页
- /admin/* 路由认证守卫

AdminLayout:
- 未登录→跳转登录; 顶部栏显示用户名+登出
- 侧边栏: 全局概览/产品管理/任务全景

CreateProductDialog (Ant Design 重写):
- MOM物料手风琴选择器 (Collapse+Table)
- 分组懒加载 + useRef缓存 + 防抖搜索
- HEX ID只读展示 + 序列号/订单号选填

AdminProductsPage:
- 打印预览弹窗 (Base64标签预览 + 份数选择)
- 打印机设置入口 → AdminPrintConfigPage

扫码组件对齐:
- ProductCard: material_name/spec_model/current_location
- TaskListCard: 递归 task_tree + 状态配色 + 返工/裂变标签
- QueryResult: task_tree 优先
- ScanPage: 宏观状态栏
2026-08-05 14:01:36 +08:00
d04085fc38 feat(frontend): 认证体系 + 类型定义 + API 服务层
认证:
- AuthContext + useAuth (JWT token 持久化, 登录/登出)
- AdminLoginPage (登录表单, 对接 POST /auth/login)
- axios 拦截器自动注入 Authorization header
- 401 自动清除 token 并跳转登录页

类型:
- api.ts: TASK_STATUS 常量, TaskResponse/ProductScanResponse 扩展字段
- admin.ts: ProductResponse 扩展 + MaterialOption/BomItem

API 服务:
- authApi: login() + getMe()
- materialApi: fetchMaterialGroups() + fetchMaterialItems()
- printApi: getLabelPreview() + executePrint() + getPrinterConfig()
- antd 6.5.3 依赖

字体: simhei.ttf (标签打印用)
2026-08-05 14:01:08 +08:00