|
|
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 |
|
|
|
d666bbd4ed
|
feat: 直接完结通道与报表口径收口(后端)
【直接完结:保留动作,剥离状态】
- transfer_task 权限硬拦截:仅 SUPER_ADMIN / SUPERVISOR。判据取签名保护的
operator_role,刻意不用客户端可通过 ?operator_id= 伪造的 operator_id
- 直接完结【不再改写】overall_status —— 它只是任务闭环动作,不改变物理状态。
已出库设备完结后依然是「已出库」,回归 WIP 矩阵的已出库列
- 物理终态保护:create_task / receive_task / transfer_task 三处写入点统一加
_is_physical_terminal 守卫,禁止用任务名覆写 已入库/在库/已出库。
历史缺陷:「发货测试」会把设备的「已出库」标识静默抹掉,跨报表口径随之打架
【位置与工序口径】
- _recalc_product_location:已出库且闲置 → 位置清空(货发走就离场)。
只清「已出库」;已入库/在库的设备确实还在仓库里,位置必须保留
- MOM 出库回调同步清空 current_location_id
- 新增 ProductResponse.current_step:只认活跃主干任务,无活跃任务时返回
宏观终态或空。不再让已 COMPLETED 的历史工序(扫码出库/测试…)冒充"当前工序"
【售后烙印去死锁】
- 拆分 OUTBOUND_QC_STEPS(发货测试) / AFTER_SALES_REPAIR_STEPS(售后维修)
- resolve_phase_for_step 与 _mark_after_sales_if_reactivated 双双改为仅
「售后维修」触发 AFTER_SALES,解除「已出库 + 发货测试」被永久烙印的死锁
- PRODUCTION_OVERALL_STEPS 补入「发货测试」,使出厂质检在生产阶段合法
(否则 _enforce_step_isolation 会把已出库设备的发货测试直接 400)
【游魂收口】
- get_wip_matrix / get_wip_matrix_detail 的 is_terminal 增加"名下再无任何活跃
任务则视同终结态",让被直接完结的生产设备接受时间筛选,不再恒挂在看板上
冒充在制。两处必须一字不差同步,否则会出现"矩阵有数、下钻为空"
|
2026-09-17 17:05:42 +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 |
|
|
|
1e6c006360
|
feat: MES/MOM 出入库状态解绑与直接完结通道(后端契约 + 移动端)
- TaskTransferRequest 新增 finish_directly 开关:闭环当前任务但不产生任何下游任务,
产品 overall_status 保持原样,工人无需再借道「入库(virtual_warehouse)」来关闭任务,
从根源上避免产品被误标「待仓库收货」而卡住 MOM 对账
- 空 assignees 分支加防呆校验:想直接完结必须显式传 finish_directly=true,
杜绝漏填导致「转交」静默退化成「直接完结」的丢件级隐患
- 直接完结跳过 _mark_after_sales_if_reactivated:不产生新任务即不构成「回流返厂」信号,
否则已出库设备的正常收官会把产品误翻成售后机(该标志单向不可回退)
- 补齐直接完结的独立响应文案,不再拼出「已创建 0 个下一道工序任务「None」」
- 移动端转交弹窗改为「转交个人 / 入库 / 直接完结」三选一互斥
|
2026-09-17 14:07:02 +08:00 |
|
|
|
2539bede3c
|
chore: 看板页头副标题改用车间口语措辞
原标题「产品 = 物理实体(身份证)| 任务 = 工序节点」偏学术抽象,车间管理人员
不易一眼建立对应关系。改为按「产品盯物、任务盯人」的直觉表述:
产品 = 车间里的物理设备 | 任务 = 派发给工人的生产指令(派工单)
配合卡片上已加的「待流转 / 待接收」口径 Tooltip,共同消除「产品数 > 任务数」
带来的误判。
|
2026-09-16 14:41:33 +08:00 |
|
|
|
dcc92b223e
|
feat: 生产看板多维度重构(全量在制品、时间维度联动、口径提示)
本次只含后端看板接口与 PC 端页面。移动端的体验优化已在之前的 12 个提交中
入库,不在本提交范围内。
后端 · 服务层 dashboard_service.py
- 在制品列表不再按 20 条静默截断:此前 `.limit(limit*2)` 预取再排序切片,
前端又拿数组长度当总数,表现为「卡片 23、列表却写共 20 个」的数据被吞。
现默认返回全量,limit 降级为防御性上限
- 产品流转「已完结」接入右上角时间筛选(since/until),废弃硬编码「本月」。
此前选「今天」也会看到整月产出,业务语义分裂;待流转/流转中仍为实时快照。
Product 表无 completed_at,以名下工序的完成时间锚定「完结时刻」
- 返工任务可见性:未完结卡点永远展示,已了结的仅限本月,且与卡片数字共用
同一份条件,避免「按钮显示 2、点开共 0 条」
- 驳回明细的「返工给」改为真实溯源:直接查派生出的返工任务当前 assignee_id,
不再复刻 reject_task 的推算逻辑(返工任务事后被转交时会显示旧名字)
后端 · 接口层 dashboard.py
- /wip-tasks 的 limit 默认 20→500、上限 100→1000
- /my-stats 支持 since/until,新增接收/转交/上传备注口径(与 PC 人员操作统计
逐字段交叉验证一致)
PC 端
- AdminDashboard: 在制品计数绑定真实总数并加截断提示、列表改为容器内滚动;
驳回明细只展示「已驳回」行(返工行不再独立成行,其信息已由「返工给」承载);
「待流转」「待接收」图例新增口径 Tooltip,消除「产品数 > 任务数」的误解;
移除已失真的时间筛选提示条
- App.tsx: dayjs 中文 locale 上提到应用根。此前散落在 AdminPeoplePage /
AnalyticsDashboard 两个页面里,而路由是 lazy 分割的 —— 直接打开概览页时
那两个模块未加载,日期面板就露出 Sep/Su/Mo
- AdminPeoplePage / AnalyticsDashboard: 移除重复的页面级 locale 设置
- dashboardApi.ts: fetchWipTasks 默认值同步为 500
|
2026-09-16 14:29:56 +08:00 |
|
|
|
6bc6531e6a
|
chore: 开发环境 CORS 补齐 uniapp H5 调试来源
原先只放行 PC 管理端(8010),移动端 H5 调试的服务起不来联调。
- 8010 = PC 管理端;5173/8020 = track-uniapp 的 H5 调试服务
- HBuilderX「运行到浏览器」起在 5173,直接跑 vite(按 track-uniapp/vite.config.ts)
是 8020
- 漏了 uniapp 来源时,浏览器会在 CORS 预检阶段就掐掉请求,
表现是「点登录没反应」,且控制台只报一句笼统的 404/400
|
2026-09-15 15:52:09 +08:00 |
|
|
|
a5fa789657
|
chore: 移除已废弃的工序树组件 FlowTree / TaskTreeNode
两者已被 TreeCanvas 取代:detail.vue 的 components 只注册
WorkspaceArea / TreeCanvas / TaskSwipeCards,全项目对 FlowTree 与
TaskTreeNode 已无任何 import(仅 detail.vue 内一句注释还提及后者)。
uni-app 不会编译未被引用的 .vue,留着不报错但会持续误导后续排查,
故清理。
|
2026-09-15 15:52:08 +08:00 |
|
|
|
1e46d6edd9
|
fix: 沉浸工作区不再自建滚动容器,滚动统一交还原生页面
is-locked 时锁定 height:100vh + overflow:hidden,会造出「卡片内部滚动 +
原生页面滚动」两个滚动容器并存的局面:卡片滚到顶之后再往下拉,手势会穿透
到页面层,误触发下拉刷新,工人根本没法往上翻内容。
- .workspace-area.is-locked 去掉 height:100vh + overflow:hidden,高度交还
给内容自然撑开
- .focus-card 去掉 overflow-y:auto,随页面一起滚;
padding-bottom 仍保留 160rpx,用来让内容避开底部固定操作栏
|
2026-09-15 15:52:08 +08:00 |
|
|
|
5cd08b551a
|
fix: 扫码取码兼容带域名的完整 URL 二维码
二维码内容有两种可能,旧逻辑只做「去掉非字母数字后截前 16 位」,扫到带域名
的 URL 时会把 "https"、主机名一起当成 SN 的前半段,截出来是个完全不存在的
号,永远提示「未找到该产品」。
- 先把 "协议://主机名" 整段剥掉,否则域名会被当成候选 SN
(如 trackbackirisrscn 这类 17 位串,恰好能通过长度校验)
- 在剩余内容里找长度 >= 8 的连续字母数字串,取最长的一段;
等长时取靠后的 —— URL 里 SN 通常在路径末尾
|
2026-09-15 15:52:02 +08:00 |
|
|
|
a7d1c53b1f
|
feat: 消息与任务列表改为分页加载
此前一次性拉全量(硬编码 limit:100),任务/通知多了会拖慢首屏。
- 分页状态:page / pageSize(20) / hasMore / loadingMore,触底加载下一页
- 下拉刷新回到第 1 页并清空重载 —— 分页后必须重置,否则新旧页会错位
- 任务列表按 id 去重后追加:翻页期间若有新任务插入,分页边界会错位导致
重复项
- hasMore 优先以响应里的 total 为准,缺失时退回「本页是否满员」判断
- 底部新增状态提示(加载中 / 没有更多了 / 上拉加载更多),
让工人知道是「到底了」还是「还在拉」
|
2026-09-15 15:52:02 +08:00 |
|
|
|
c7f046a993
|
feat: 个人中心补齐工作统计/设置/帮助与反馈三个模块
原先三个菜单都是空壳,点「帮助与反馈」只弹「敬请期待」。
工作统计(statistics.vue)
- 时段切换:今日 / 本周 / 本月 / 自定义(含起止日期选择器)
- 「生产战绩」完成 / 被驳回 / 参与产品;「操作统计」接收 / 转交 / 上传备注
后者的口径与 PC「人员操作统计」严格同源,已逐字段交叉验证(4 人 × 4 指标
全部相等),工人自查的数与主管看到的面板对得上
- 时段边界显式拼 "+08:00":车间按北京时间作息,发裸字符串会被后端按服务器
本地时间解释,边界整体偏 8 小时
设置(settings.vue)
- 清理缓存:黑名单式,只删登记过的业务缓存(当前为 msg_seen_<product_id>,
即留言抽屉的已读位点,随扫过的设备数无上限增长)。未登记的 key 一律保留,
新增插件天然免疫;另有 NEVER_DELETE 兜底,任何情况下不动登录凭证与环境
配置。副标题实时显示待清理条数,卡片下方说明「不动什么」
- 检查更新:调用 utils/ota.js 的 checkAppUpdate({ manual: true })
- 退出登录:由 profile/index 迁入,加确认弹窗防误触
帮助与反馈(feedback.vue)
- 问题类型(系统问题/设备故障/其他)、描述文本域(500 字计数)、
图片上传最多 4 张,复用 utils/upload.js 的并发上传池
- api/feedback.js 采用「先真后假」:先按最终契约 POST /feedback/,
仅当 404(端点尚未实现)才回退本地 mock。后端补上接口后前端零改动即可
接上;而 400/422/断网仍照常抛出,不会被 mock 悄悄吞掉
路由
- pages.json 注册三个新页面(工作统计开启下拉刷新)
- profile/index.vue 用 MENU_ROUTES 映射 uni.navigateTo,移除「敬请期待」拦截
与退出登录按钮
|
2026-09-15 15:51:50 +08:00 |
|
|
|
7fca315ff4
|
feat: 图片上传抽离公共模块,统一成功角标并修复记录拍照无法删除
上传模块 utils/upload.js(新增)
此前 detail.vue 与 records.vue 各写一份 uni.uploadFile 封装,超时与并发策略
容易漂移,且都是串行上传 —— 9 张图排队一张张传完,弱网下工人要干等半分钟。
- uploadImage:单张上传,UPLOAD_TIMEOUT 防弱网永久挂起;非 2xx 时后端返回的
是 {detail:...} 而非 {url},必须当失败处理,否则图片被静默丢弃
- uploadImages:有界并发池(并发 3),onEachDone 对每张图恰好回调一次,
成功与失败都精确回收一个 ⏳ 占位符
- isUploadedUrl:判定「是否已真正上传成功」。成功 resolve 的是后端 URL
(/api/v1/upload/files/… 或 http(s)://),未完成的拿到的是本地临时地址
(blob: / file:// / _doc/ / wxfile://)
上传成功绿勾角标
- 应用到 detail.vue(记录表单 + 驳回表单)与 records.vue(编辑记录弹窗)
- 角标仅在 isUploadedUrl 判定为真时渲染;⏳ 占位与失败项结构上不可能出现
角标,因为角标只存在于「已上传」的那个循环里
- 圆角与裁剪改由 .success-badge-wrapper 负责,图片只负责填满
修复:记录/拍照里已选图片无法删除
删除按钮原为 v-if="canDeleteImage",而该项在「任务已定稿
(COMPLETED/REJECTED/ARCHIVED/CANCELED)」或「非本人任务」时返回 false。
但 handleTaskAction 里 type === "record" 是无条件打开弹窗的,工人完全可能
在已完成任务上打开「记录/拍照」,于是刚选、尚未提交的图也被一并锁死 ——
那些图只存在于内存里,删掉不产生任何服务端影响。
- 新增 recordForm.savedCount(打开弹窗时已落库的张数),
新增 canDeleteRecordImage(i) = canDeleteImage || i >= savedCount:
本次新选的图永远可删,已落库的才受「任务已定稿」约束
- 未落库的图免去 5 秒倒计时 —— 该机制本是为不可逆的服务器删除设计的,
刚选错的图重拍一张即可,没必要卡 5 秒
- openEditRecord 由 images: record.images || [] 改为 saved.slice():
原先按引用赋值,删图会直接改动底层记录对象,此时点「取消」被删的图
在本地列表里也已经没了
|
2026-09-15 15:51:44 +08:00 |
|
|
|
eef4e5b72d
|
refactor: OTA 热更新抽离为公共模块 utils/ota.js
原先 checkUpdate / parseVersionCode / downloadAndInstall / downloadWgt /
installWgt / otaFailed 整个长在 App.vue 的 methods 里,个人中心「设置 →
检查更新」想手动触发一次根本做不到。抽到 utils/ota.js 后两处共用同一份
实现,改版本比对规则或下载策略只需改一处。
- 节流状态从 this._lastUpdateCheck 改为模块级单例
- 新增 checkAppUpdate({ manual }),manual 模式跳过节流、显示「检查中」、
并在「已是最新 / 检查失败」时给出明确反馈 —— 用户主动点的按钮必须有回音,
自动检查才静默收场
- App.vue 的 onLaunch/onShow 改为调用同一函数,自动模式行为不变
同时 App.vue 的全局样式新增 .success-badge-wrapper / .success-badge
(上传成功绿勾角标,供各页面图片列表复用):
- 直角三角形用 border-top(实色) + border-left(透明),直角落在右上;
写成 border-top + border-right 会得到左上角的三角,方向是反的
- 白勾用两条边框旋转 -45° 画成,不用 "✓" 字符 —— 该字形在安卓与 iOS 上
的字形和基线差异很大,对不齐
- 容器 overflow:hidden 只包图片本身,不能包住单元格:各页面的删除按钮
.img-del 定位在 -12rpx 处(单元格之外),包进去会被一并裁掉
|
2026-09-15 15:51:38 +08:00 |
|
|
|
44ca09ae22
|
feat: 新增个人效能统计接口 /dashboard/my-stats(支持自选时段)
移动端「个人中心 → 工作统计」的数据源。现有接口拿不到这份数据:
/dashboard/people-history 支持 assignee_id 但只返回 WIP/PENDING/COMPLETED,
不含 REJECTED;/dashboard/rejected-tasks 则根本没有 assignee_id 参数 ——
「今日被驳回数」按现有接口无论如何都过滤不到个人。故补一个薄桥接端点。
服务端 get_my_stats(db, assignee_id, since, until) 返回两组指标:
生产战绩(按 Task.assignee_id 归因)
- tasks_completed / tasks_rejected:status 判定 + completed_at 落在区间,
与 get_dashboard_stats 的 t_done_q 同一口径,只多了 assignee_id 过滤
- products_touched:按 product_id 去重,同一台设备做多道工序只算一台
操作统计(与 PC /dashboard/user-operations 严格同口径)
- receive/transfer:task_logs 的 receive / complete,按 operator_id 归因
- record:task_records 按 Task.assignee_id 归因,排除 '[' 开头的系统自动备注
- 前两项归因 operator_id、第三项归因 assignee_id 是 PC 端既有口径,
此处刻意保持一致,便于工人自查的数与主管看到的面板对得上
端点侧新增 _parse_bound():裸时间字符串(无时区偏移)按北京时间解释,
否则会被当作服务器本地时间,边界整体偏 8 小时,出现「选了今日却统计到
昨天下午」。since/until 缺省为「本月 1 日 ~ 此刻」。
|
2026-09-15 15:51:34 +08:00 |
|
|
|
242a6d5463
|
refactor: 环境地址收口到 utils/config.js,请求层新增 silent 静默模式
config.js(新增)作为后端域名/接口地址的唯一来源。此前 request.js 与 App.vue
各硬编码一份生产域名,改域名要改两处,漏一处就会出现「接口通了但 OTA 检查
更新接不上」这类极难排查的偏差。
request.js 改动:
- PROD_URL / LOCAL_URL 改为从 ./config 引入,不再就地硬编码
- 新增 options.silent:调用方自行兜底提示时跳过通用错误 toast。
用于 feedback 的 404 回退 mock —— 否则用户会先看到「请求失败 (404)」
再看到「感谢反馈」,两句自相矛盾。HTTP 错误与 fail 两个分支都受其控制
- fail 回调保留原始 errMsg 并打上 isNetworkError / isTimeout 标记:
fail 表示压根没拿到后端响应(超时/断网),与 4xx/5xx 有本质区别 ——
后端可能已执行成功只是响应没回来,上层需要据此打断用户的连点重试
|
2026-09-15 15:51:30 +08:00 |
|
|
|
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 |
|