Commit Graph

254 Commits

Author SHA1 Message Date
91b1426ccb feat(dashboard): 人员工时台账——平铺明细+多维筛选+时间交集+动态工时+备注+CSV导出 2026-08-13 16:04:23 +08:00
c2e6ed240b feat(dashboard): 看板增强——流转完成率下钻明细 + 人员看板(按人聚合在制品设备) 2026-08-13 12:00:12 +08:00
b6ef0751e0 fix(web): 列表最新动态显示操作人、流转树焦点模式保留活跃并发分支 2026-08-13 11:17:13 +08:00
e5829c7d06 fix(backend): 修复并发任务聚合——当前位置汇总全部负责人、最新动态携带操作人、状态聚合补齐 REJECTED 2026-08-13 11:17:10 +08:00
3288223a92 refactor(mobile): 移动端上传/展示去 IP 化,统一公网域名并支持 NODE_ENV 环境感知 2026-08-13 10:34:56 +08:00
77137cfced feat(deploy): 隔离上传目录 uploads_prod,清理部署脚本无效排除项 2026-08-13 10:34:50 +08:00
11ae3260ac fix(web): 修复图片 URL 拼接逻辑,/api/ 路径支持公网域名去重拼接 2026-08-13 10:34:45 +08:00
f056cc8625 fix: 图片URL双重/api/v1前缀导致404
根因: 后端返回 /api/v1/upload/files/xxx.jpg
      前端imageUrl又拼VITE_API_BASE_URL=/api/v1
      → /api/v1/api/v1/upload/files/xxx.jpg → 404
修复: /api/开头的URL直接返回, 不再拼接前缀
2026-08-13 09:07:10 +08:00
b8ade13b61 fix: TaskRecordResponse改用field_validator — 不再污染ORM对象导致图片列表写回VARCHAR报错
根因: model_validate直接obj.images=json.loads()把ORM对象的字符串改成列表
     SQLAlchemy autoflush时把列表写回VARCHAR列 → DataError
修复: field_validator(mode=before)在序列化层转换, 不修改ORM源对象
2026-08-13 09:03:17 +08:00
abc8999358 hotfix: get_product_by_serial补全func导入 — 修复500错误 2026-08-13 09:01:34 +08:00
997e16d9ba fix: 移除manifest.json中残留的push SDK配置 2026-08-12 18:05:52 +08:00
d8d42e9613 feat: 上游显示真实发送人 — 从task_logs追溯created_by 2026-08-12 17:52:35 +08:00
2170e2e9cf fix: 转交通知中product_sn始终为空 — product查询移到通知循环之前
根因: transfer_task中 product_result 查询在通知创建循环之后
     通知内容 product_sn 引用未初始化的 product 变量 → 始终为空字符串
修复: 将 product 查询提前到 flush() 之后、通知循环之前
2026-08-12 17:33:32 +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
d9c875924c feat: 移动端扫码页手动输入框增加一键清除×按钮 2026-08-12 17:23:20 +08:00
eba0c3be98 fix: 端点层operator_id兜底current_user.username — 管理员代办检测生效
根因: 移动端不传?operator_id=参数, 后端收到None
      _admin_proxy_note(None, assignee) → 不触发标记

修复: 6个端点(receive/reject/transfer/end/recall/spawn)
      operator_id or current_user.get(username) 兜底
2026-08-12 17:19:56 +08:00
828aee5161 feat: 任务全景搜索框增加一键清除(×)按钮 2026-08-12 17:14:09 +08:00
e7bfdc261b fix: TaskRecord也加入管理员代办审计标记 — 看板最新动态可见代理操作
新增 _admin_proxy_note() 辅助函数
receive/transfer 的 TaskRecord.remark 自动拼接 [管理员xx代办]
这样看板\最新动态\列就能显示管理员代操作记录
2026-08-12 17:11:07 +08:00
74cb77f547 refactor: 扫码页简化为单页模式 — 拍照按钮+手动输入 2026-08-12 17:06:40 +08:00
f6ba1d1740 fix: 扫码页优化 — 修复黑屏+右下角相册+Webview透明+扫描框位置调整 2026-08-12 17:05:42 +08:00
a09d4481a3 feat: 扫码页双模式 — 主页+微信级全屏扫码(plus.barcode原生摄像头) 2026-08-12 16:59:33 +08:00
2ca382bb2c refactor: 删除扫码页相册选择功能,仅保留拍照扫码+手动输入 2026-08-12 16:55:43 +08:00
9f3deb5b6c revert: 恢复扫码页为双按钮版本(拍照+相册) 2026-08-12 16:53:31 +08:00
8303c8b93f fix: 滑动卡片指示器联动 — _cardIdx从computed迁移到data独立管理
根因: _cardIdx存在computed lane对象中, computed重新计算时重置为0
修复: cardIndices{}独立data管理, keyed by lane._key
      新增watch product重置 + getCardIdx/setCardIdx方法
2026-08-12 16:11:22 +08:00
a5e256330a fix: parseImages支持数组输入 — Pydantic序列化后images已是数组非字符串 2026-08-12 16:08:37 +08:00
a38be2c568 fix: TaskRecordResponse类型匹配后端schema — 补全images字段 2026-08-12 16:05:05 +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
6016f92dd0 hotfix: func→sa_func 解决局部变量遮蔽 2026-08-12 15:52:06 +08:00
b21df33e0a hotfix: 补充 product_service.py 顶部缺失的 func 导入 2026-08-12 15:50:01 +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
1fdc607c07 feat: 管理员代工模式 — 前端权限放开 + 后端审计留痕
前端:
  - WorkspaceArea 新增 currentUserRole prop
  - isAssignee/canRecall: SUPER_ADMIN/SUPERVISOR 上帝视角直接放行
  - 管理员代操作时显示黄色提示条: 正在以管理员身份代[原负责人]操作
  - detail.vue: loadCurrentUser 提取并保存 user.role

后端:
  - _create_task_log 新增 task_assignee_id 参数
  - operator_id!=task_assignee_id 时自动拼接 [管理员xx代办操作]
  - 12处调用点全部传入 task_assignee_id
  - receive_task 位置赋值确认为 task.assignee_id(非 operator_id)
2026-08-12 15:24:50 +08:00
49cbf22854 fix: 修复or_局部导入遮蔽模块级导入导致UnboundLocalError + Drawer改用size
1. product_service.py: 删除函数内两处 from sqlalchemy import or_
   Python解析器看到函数内的import就把or_当局部变量, 在赋值前使用就报UnboundLocalError
   模块顶部已有 import or_, 函数内无需重复导入

2. AdminDashboard.tsx: Drawer width→size (Antd v6 deprecation)
2026-08-12 15:05:39 +08:00
9b59521746 feat: 看板在制品点击跳转任务全景并自动展开流转树
Dashboard: WipRow 点击改为 nav(/admin/tasks?sn=xxx)
AdminTasksPage: 读取 ?sn= 参数 → 自动搜索 → 产品加载后自动展开流转树
2026-08-12 15:00:37 +08:00
fd289db0fc hotfix: 修复模板字符串转义错误导致的编译失败 2026-08-12 14:54:06 +08:00
e0a5a572cc feat: 扫码页双模式 — 看板跳转显示任务全景(无摄像头), 直接访问保留扫码 2026-08-12 14:51:36 +08:00
c90b77801d feat: 扫码页支持URL参数自动查询 — /scan?sn=xxx 直接展示流转树 2026-08-12 14:50:44 +08:00
ddc34182dd fix: 在制品点击改为应用内跳转扫码详情页(流转树) 2026-08-12 14:45:09 +08:00
729de138cd feat: 在制品附加信息补全 — 设备名称|规格型号|序列号|身份证
后端: WipTask 新增 spec_model, 查询关联 Product.spec_model
前端: 第二行格式改为 物料|规格|序列号:xxx|身份证:xxx
2026-08-12 14:43:20 +08:00
f608f6bf81 fix: SLA阈值调整 — <24h绿 24-48h橙 >48h红 2026-08-12 14:35:07 +08:00
9460a8492a feat: 在制品列表信息层级重构 + SLA预警色 + 点击跳转
1. 信息层级重构:
   主信息: [状态Tag] 任务名 | 负责人: 张三  ⏰3h
   附加信息: 物料名 SN:25022 ...A1B2C3  08-12 10:00
   新增后端 material_name 字段, 前端卡片式布局

2. SLA滞留预警色:
   <12h → 绿色(正常) | 12-24h → 橙色(警告) | >24h → 红色加粗(危险)

3. 交互: 点击卡片新窗口打开对应产品扫码详情页
2026-08-12 14:33:56 +08:00
42544d7485 fix: get_wip_tasks 解包错误 — 新增 external_serial 后 rows 变3列但解包仍是2变量 2026-08-12 14:28:00 +08:00
079b65e761 feat: 在制品加业务序列号 + 追溯码改名为身份证
1. 在制品行: 显示 external_serial(业务序列号)
   优先 external_serial → 兜底 product_sn
   旧: 装配 A1B2C3D4  张三
   新: 装配 25022  张三

2. 留言板: 追溯码 → 身份证
   旧: 追溯码: 000000000000000D
   新: 身份证: 000000000000000D

3. 后端: WipTask 新增 external_serial 字段
   关联查询 Product.external_serial
2026-08-12 14:23:23 +08:00
ff7c791d49 fix: 留言板区分业务序列号与系统追溯码
语义修正:
  Product.serial_number  = 16位HEX系统追溯码(如000000000000000D)
  Product.external_serial = 业务产品序列号(如25022)

后端:
  - ProductMessageItem 新增 external_serial 字段
  - search_product_messages 关联查询 Product.external_serial
  - 关键词搜索也支持按 external_serial 匹配

前端显示:
  样品升降台V1J · 序列号: 25022          ← 醒目
  追溯码: 000000000000000D               ← 10px浅灰小字
2026-08-12 14:20:38 +08:00
c14bbeb891 fix: 3个逻辑/UI Bug修复
Bug1 — 任务总数与进度条不匹配:
  tasks_total 从全库历史总数改为 PENDING+WIP+COMPLETED(时段)+REJECTED(时段)
  确保进度条4段之和 = 显示的总数, 不再出现11≠9的缺口

Bug2 — 在制品排序混乱:
  移除DB层order_by, 改为Python统一按duration_hours降序
  无视status, 纯数值排序, 滞留最久排最前
  取limit*2条后在Python中排序再截断

Bug3 — 留言板产品显示割裂:
  [Tag:SN] 物料名 → 物料名 (SN: A1B2C3D4...)
  物料名加粗, SN等宽灰色, 阅读更顺畅
2026-08-12 14:13:26 +08:00
7906b8834a style: 留言板SN标签改用等宽字体更醒目 2026-08-12 14:05:46 +08:00