Commit Graph

376 Commits

Author SHA1 Message Date
93e4714019 chore: 修正 sync-watch.sh 同步方向为 src/ → HBuilderX 项目根
原脚本按 track-uniapp/ ↔ track-app/track/ 双向对拷,方向完全错误:
HBuilderX 是以 G:\Track\track-app\track 为项目根打开的(经典布局,
pages.json/App.vue/manifest.json 都在根目录),该目录是 track-uniapp/src/
的扁平镜像。证据:test_wgt_local.bat 写明 "build WGT in HBuilderX first",
且两侧文件时间戳逐项吻合。

按旧规则运行会造成三处破坏:
- 正向把 src/ 整个塞成 track/src/,并用 WSL 的 337B index.html 覆盖
  HBuilderX 的 637B 入口文件
- 反向把 Windows 项目根的文件搬回 WSL 根目录,让刚清理的幽灵文件复活
- 用 src/manifest.json(T1.0.8) 覆盖 HBuilderX 里维护的 T1.0.44 + 存储权限

改动:
- 改为单向 src/ → 项目根,并显式排除 13 类仅在 Windows 侧存在的项
  (manifest.json / index.html / static/ / uni.scss / unpackage/ / *.bak-* 等),
  --delete 因此不会误伤它们,同时能让 WSL 侧的删除传播过去
- 不用 -a:/mnt/g 是 drvfs,POSIX 权限/属主恒为 777,-p/-o/-g 每次都判定为有差异,
  产生无谓 chmod 与刷屏的 p 标记;改用 -rlt --no-perms --no-owner --no-group
- inotifywait 在 WSL 里并未安装,旧脚本 2>/dev/null 把 command not found 吞掉了
  (表现为「脚本像在跑但 G 盘不更新」);改为明确提示 + 3 秒轮询兜底
- 不再吞 rsync 报错,失败时打印退出码;新增 once / dry 子命令
2026-09-15 15:51:24 +08:00
ab75b9613f chore: 删除 track-uniapp 根目录与 src/ 重复的陈旧副本
构建实际读取的是 track-uniapp/src/ —— @dcloudio/vite-plugin-uni 的
UNI_INPUT_DIR 默认取 path.resolve(cwd, 'src'),检测到 src/manifest.json
即以其为输入目录。根目录那套 pages.json / App.vue / main.js / manifest.json
停留在 2026-08-04,是早期 HBuilderX 布局的遗留,早已不参与构建。

危害在于「同名同结构」:IDE 搜索 pages/profile/index.vue 会命中两个结果,
改到根目录那份既不编译也不报错,表现为「代码明明改了,App 里没变化」,
排查成本极高。

- 删除 pages/(4 个 .vue)、pages.json、App.vue、main.js、manifest.json
- 根 manifest.json 版本号为 T1.0.0(字符串),src/ 已是 T1.0.8(108),
  且缺 Barcode/Camera 模块与图标配置
- 保留 index.html:它是生效的 H5 入口模板,内容引用 /src/main.js,
  uni-app CLI 布局中本就在项目根
- 保留 static/:src/ 下无同名目录,非重复项
2026-09-15 15:51:19 +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
6b3f14e8fd fix: 移动端驳回支持传图、422 报错可读化、修复详情页图片破图
车间的驳回操作不再强制拍照(编号错误等场景无需照片),移动端同步放开。

- utils/request.js: 新增 extractErrorDetail 统一解析后端 detail 的三种形态
  (字符串 / FastAPI 校验错误数组 / 对象),新增 422 拦截分支,并把
  400/403/409 及兜底分支的 `res.data?.detail || x` 全部换掉 —— 原写法在
  detail 是数组时会把整个数组丢给 showToast,弹出 [object Object]
- pages/scan/detail.vue: 驳回弹窗新增与「追加记录」一致的选图/传图 UI,
  doReject 携带 { reason, images }(允许空数组);选图上传流程抽成通用的
  pickAndUploadImages,与追加记录共用
- pages/scan/detail.vue: 新增 imageUrl() 补全后端返回的相对路径
  (/api/v1/upload/files/xxx.jpg 直接给 <image> 会破图),缩略图渲染与
  previewImage 预览均已接入;逻辑与 records.vue / TaskTreeNode.vue 对齐
2026-09-15 10:57:49 +08:00
0d1e45e3fb feat: 管理层数据大屏(后端聚合接口 + 前端全屏页面)
PC 管理端新增独立全屏数据大屏,供管理层查看直通率/产量趋势/不良分布,
替代原 AdminDashboard 上零散的手工下钻。

后端:
- endpoints/screen.py + services/screen_service.py: 大屏聚合接口
  (复用 lifecycle 的售后工序归一,保证统计口径与展示一致)
- router.py: 注册 screen_router

前端:
- pages/admin/ScreenDashboard.tsx: 全屏大屏页(自带鉴权守卫,无侧边栏)
- services/screenApi.ts: 大屏数据接口封装
- components/admin/UserOperationDetailDrawer.tsx: 人员操作明细抽屉,
  由 AdminDashboard 的原生 state 抽成独立组件(含命令式 handle)
- AdminDashboard.tsx: 改为使用该抽屉组件,移除内联的下钻状态
- MatrixBoard.tsx / App.tsx / AdminLayout.tsx: 挂载路由与导航入口
- BaseEChart.tsx: 注册 GaugeChart 与 GraphicComponent
  (graphic 需显式注册,否则饼图中心文字静默不渲染)
2026-09-15 10:57:46 +08:00
71e660b428 feat: 驳回图片改为选填,驳回原因/转交备注落库留痕
业务调整:车间驳回不必须拍照(编号错误、选错工序等场景无需照片举证)。

- schemas/task.py: TaskRejectRequest.images 由必填(min_length=1)改为
  default_factory=list,保留 max_length=9 与 URL 总长保护;reason 增加
  mode="before" 的 strip 校验器,堵住纯空格凑长度绕过 min_length 的口子
  (顺带保证落库的 reject_reason 不带首尾空白)
- task_service.py: 驳回时把原因+图片写入 TaskRecord 挂到被驳回任务下,
  修复前端时间线看不到驳回详情的问题;转交时把交接备注也挂一条记录到
  下家任务,补齐接手人的上下文视角
- task_service.py: create_task / receive_task 写入 overall_status 后调用
  sync_product_status 对齐 status 字段
2026-09-15 10:57:35 +08:00
f22eae315f fix: 售后回流口径统一 — 状态双字段同步、工序名归一、标签配色
产品存在 overall_status 与 status 两个状态字段,此前各写入点各写一份映射、
甚至只改 overall_status 不改 status,导致回流设备(product.status 停留在
OUTBOUND)污染看板统计口径。

- lifecycle.py: 把映射表收敛为单一来源 overall_to_product_status /
  sync_product_status;新增 normalize_after_sales_step,将售后设备沿用生产
  阶段写法的历史工序名(测试/维修)折算到售后区独立工序名
- product_service.py: 删除本地 _OVERALL_TO_STATUS 副本,改用共享函数
- dashboard_service.py: WIP 矩阵补出 lifecycle_phase 列,活跃任务判定
  (is_active) 提前到所有终结态判定之前,避免残留 OUTBOUND 被误判为完结
- scripts/fix_product_status.py: 历史数据修复脚本(一次性)
- constants/task.ts: 售后工序标签由红色改紫色 —— 红色在本系统是「驳回/危险」
  语义色,售后只是另一条流转支线,用红色会让操作员误以为设备报错
2026-09-15 10:57:29 +08:00
31d085881b feat: 移动端工序选项隔离与售后标签 2026-09-14 14:49:38 +08:00
3238e4819a feat: 网页端渲染售后回流标签(发货测试/售后维修) 2026-09-14 14:49:38 +08:00
db3bafcc66 feat: 前端补充生命周期类型定义与工序词表 2026-09-14 14:49:38 +08:00
2de95799c6 feat: 售后回流判定与工序选项隔离守卫(建单/接收/转交) 2026-09-14 14:49:34 +08:00
b40340ea55 feat: 产品接口暴露lifecycle_phase并做阶段感知状态校验 2026-09-14 14:49:34 +08:00
b9f9b897a1 feat: 新增产品生命周期阶段字段lifecycle_phase与售后工序词表 2026-09-14 14:49:34 +08:00
3568d17865 fix: 转交时动态推导task_type,避免协助分支转交被误升为主线 2026-09-14 14:49:26 +08:00
b088d25df9 feat: 任务树/流转卡展示驳回原因与返工备注(网页SlimCard,移动端FlowCard/SwipeCards) 2026-09-09 17:29:40 +08:00
7b7dbbb0d8 fix: WIP矩阵-左外连接纳入无任务新品归待接收,PENDING并入待接收,空负责人显式计数为未分配; 表头去待确认列并做TOP N折叠 2026-09-09 17:29:36 +08:00
d757c7985b fix: WIP矩阵口径重构-在制无条件计入,终结态按完工时间锚点(completed_at兜底created_at)过滤,多维终结归类(含扫码入库/出库节点),下钻同步 2026-09-07 14:46:58 +08:00
2925eb8e0b feat: 产品管理页新增状态收口按钮,倒计时+输入产品身份证双重确认防误触 2026-09-07 13:43:09 +08:00
70c8357bc0 feat: 后端新增产品收口接口(已入库/已出库,管理员,含扫码节点与操作日志,可反向纠错与强收口) 2026-09-07 13:43:06 +08:00
ba96937933 fix: 移动端产品详情锁定工作区操作栏固定底部并加内容底部占位 2026-09-07 11:08:52 +08:00
109f45f22a feat: 产品/任务搜索支持业务序列号(external_serial)检索 2026-09-07 11:08:49 +08:00
b4795181ee feat: 人员视图X轴改为四行展示(名称/规格/序列号/身份证)并加大底部空间 2026-09-03 16:35:35 +08:00
09984951fb feat: 全局概览/产品管理/人员看板跳转统一改为新标签页打开 2026-09-03 16:27:18 +08:00
f65f6e12c6 fix: 效能分析默认时间恢复今天,删除伪造1h兜底,轨迹流转X轴四行展示 2026-09-03 16:27:10 +08:00
cd5a904a16 fix: 效能分析flow时间筛选改为设备级(该时间有活动即入选),任务完整返回不切片 2026-09-03 16:27:04 +08:00
fe495ad707 fix: 前端生产构建放宽node堆内存并跳过basicSsl避免服务器卡死 2026-09-02 10:39:05 +08:00
06337fc8eb feat: 效能分析X轴四行标签/flow分块/自然工作日即时切换/时间快捷选项 2026-09-02 10:39:01 +08:00
3c6c8c0c53 feat: WIP矩阵单表化/固定表头/首列复合/下钻日志弹窗/时间联动 2026-09-02 10:38:58 +08:00
2d8c937189 feat: 效能分析flow区间携带自然/工作日双时长并支持时间过滤 2026-09-02 10:38:53 +08:00
3019653dfa refactor: 宏观状态统一(待仓库收货/已入库)废弃"在库"; WIP矩阵返回product_name并新增下钻明细 2026-09-02 10:38:49 +08:00
e194b97649 fix: 全状态对齐 - 已出库(OUTBOUND)覆盖所有看板
- 看板产品流转 finished_cond 加'已出库',已出库归入已完结
- WIP 矩阵区分'已出库'维度
- MyTasksPage tab 加'已出库'
- 移动端 detail/WorkspaceArea STATUS_MAP 补 OUTBOUND
2026-09-02 09:07:37 +08:00
ccc5a23a77 deploy: Track 部署脚本改为免 sudo(与 MOM deploy_code.sh 一致)
- 去掉所有 sudo 与 ssh -t
- 前提:服务器 /opt/Track 属主改为 dxc(一次性 chown)
2026-09-01 18:26:53 +08:00
9eb66fa29f fix: Track 服务器备份排除 venv/node_modules,修复备份极慢
- 原命令无 --exclude,把 backend/venv(140M)+frontend/node_modules(519M)打包 gzip 导致极慢
- 补排除与本地打包一致,备份耗时大幅下降
2026-09-01 18:24:48 +08:00
619f224030 deploy: Track prod 补充 TRACK_WEBHOOK_KEY 验签
- MOM 入库/出库 Webhook 回调鉴权必需,与 MOM 侧 Key 一致
2026-09-01 18:02:38 +08:00
6c93b98190 fix: 移动端全览树/卡片模式兼容 WAREHOUSE 仓储节点
- WorkspaceArea/TaskSwipeCards 的 isMainFn 与主线子任务过滤加 WAREHOUSE
- 扫码入库/出库节点回到中央主干道,不再渲染在左侧分支
- TaskSwipeCards 操作人防御性渲染:仓储任务显示 📦 MOM 仓储系统,不崩不丢
2026-09-01 17:42:57 +08:00
262e28b9f2 fix: 仓储任务节点修复(assignee=None + WAREHOUSE 类型) + 前端防御性渲染
- webhook 生成任务 assignee_id 置 None,不再填中文,避免前端解析报错跳过渲染
- task_type=WAREHOUSE,并同步 isMain 判断(后端+双端前端)使其画在中央主干道
- 前端对扫码入库/出库任务:不请求用户数据,直接显示 📦 + 'MOM 仓储系统'
2026-09-01 17:25:22 +08:00
5407e2135f feat: Webhook 入库/出库后动态生成扫码任务节点与操作日志
- mom-inbound/mom-outbound 在标记已入库/已出库后,追加'扫码入库/扫码出库'主线任务
- 新任务 parent_task_id 取最后一个主线任务,task_type=TRANSFER 保证画在主干道
- 生成 TaskRecord 操作日志,前端流转树最底部长出节点
- 幂等:已存在同名任务则不重复插入
2026-09-01 16:55:13 +08:00
2b889b99d6 fix: webhook 匹配支持 external_serial 外部业务序列号
- mom-inbound/mom-outbound 用 or_ 双字段联合匹配 serial_number 与 external_serial
- MOM 推送 ceshi123 等自定义序列号时也能精准认领产品并闭环状态
2026-09-01 15:25:42 +08:00
3749aa766b style: 移动端流转树视觉降噪与分支箭头方向修复
- 已完成卡片降透明度/浅灰底/深灰字;进行中卡片纯白+蓝色边框+外发光
- 分支箭头改为从主干道指向分支(左翼←右翼→),橙色虚线
2026-09-01 15:02:20 +08:00
b766e35db6 fix: 移动端流转树修复进行中任务消失与日志条对齐 Web
- scroll-view 补 scroll-y:多条主线垂直堆叠时底部进行中任务不再被截断
- FlowCard 补 IN_PROGRESS 状态(橙色'待收货'),与 Web 端一致
- 操作日志改为卡片底部全宽蓝色条块,删除时间右侧角标
2026-09-01 14:55:16 +08:00
9c1246e2c9 style: 网页端操作日志条铺满卡片宽度并加可点击箭头
- 负 margin 精确抵消 padding+border,蓝条真正贯穿卡片宽度
- 日志文字加粗 + 末尾蓝色 › 箭头提示可点击
2026-09-01 14:44:18 +08:00
84af09ea75 style: 移动端流转树主轴连线与卡片排版优化
- 中央垂直线首行从 50% 起、末行到 50% 止,不再冒出
- FlowCard 时间独占一行,操作日志独立一行靠右对齐
2026-09-01 14:42:59 +08:00
34618579c8 style: 网页端流转树主轴连线与日志条优化
- 中央垂直线按行渲染:首行从卡片中间起、末行到卡片中间止
- 操作日志改为全行蓝色横条(查看操作日志 x条),整条可点击
2026-09-01 14:42:59 +08:00
327f5f7829 refactor: 移动端流转树全面复刻 Web 端 childMap 左中右布局
- 废弃递归纵向排版(FlowTree),改用拍平 + childMap 重构
- 横向 scroll-x + 每条主线一个 Row:[左翼]-[中央]-[右翼]
- 中央绝对定位垂直线贯穿;分支按奇偶拆左右翼,横向展开
- 新建 FlowCard(节点卡片)与 FlowBranch(递归分支)
2026-09-01 14:37:29 +08:00
9808742f94 fix: 移动端流转树修复分支视觉脱节(先分支后主干道)
- 调换渲染顺序:先渲染分支(紧贴父节点),再渲染主干道(向下延伸)
- 分支容器加 ↳ 分支延伸 指示符 + 左侧虚线边框
- 主线每个子节点前恒画 ↓ 箭头(含父到长子)
2026-09-01 14:29:58 +08:00
a3aa012d6c fix: 移动端流转树修复断条箭头与分支层级塌陷
- 父节点与第一个主线子节点之间补 ↓ 连线箭头
- 新增 isBranchContext prop:进入分支后子子孙孙强制缩进,不再回主干道
2026-09-01 14:25:17 +08:00
6ff3ee06de fix: template v-for 的 key 移到 template 标签,修复编译报错
- Vue 要求 <template v-for> 的 key 放在 template 标签上,而非内部元素
2026-09-01 14:14:27 +08:00
25ad5156f8 style: 移动端流转树主干道对齐与连线箭头
- 主线(含 TRANSFER 子任务)左边缘对齐,消除缩进形成笔直主干道
- 主线卡片之间加向下连线箭头(↓)
- 分支(SPAWN 协助)保留缩进 + 左边线
2026-09-01 14:10:40 +08:00
9d1e6c8466 style: 网页端流转树卡片 UI 优化
- 时间精确到分钟(去 split 截断)
- 主线/分支标签改为卡片左上角与状态标签并排
- 操作人前加用户小图标
- 日志入口去掉浅蓝条块,改右下角文本链接 + 蓝色 > 箭头
2026-09-01 14:10:35 +08:00
547c113b09 fix: 移动端 formatUserName 挂载到 methods,修复流转树渲染报错
- Vue2 Options API 中 import 的函数不暴露给模板,需挂到 methods
- FlowTree/TaskTreeNode 补 formatUserName 方法
2026-09-01 13:59:56 +08:00