|
|
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 |
|
|
|
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 |
|
|
|
3238e4819a
|
feat: 网页端渲染售后回流标签(发货测试/售后维修)
|
2026-09-14 14:49:38 +08:00 |
|
|
|
b088d25df9
|
feat: 任务树/流转卡展示驳回原因与返工备注(网页SlimCard,移动端FlowCard/SwipeCards)
|
2026-09-09 17:29:40 +08:00 |
|
|
|
262e28b9f2
|
fix: 仓储任务节点修复(assignee=None + WAREHOUSE 类型) + 前端防御性渲染
- webhook 生成任务 assignee_id 置 None,不再填中文,避免前端解析报错跳过渲染
- task_type=WAREHOUSE,并同步 isMain 判断(后端+双端前端)使其画在中央主干道
- 前端对扫码入库/出库任务:不请求用户数据,直接显示 📦 + 'MOM 仓储系统'
|
2026-09-01 17:25:22 +08:00 |
|
|
|
9c1246e2c9
|
style: 网页端操作日志条铺满卡片宽度并加可点击箭头
- 负 margin 精确抵消 padding+border,蓝条真正贯穿卡片宽度
- 日志文字加粗 + 末尾蓝色 › 箭头提示可点击
|
2026-09-01 14:44:18 +08:00 |
|
|
|
34618579c8
|
style: 网页端流转树主轴连线与日志条优化
- 中央垂直线按行渲染:首行从卡片中间起、末行到卡片中间止
- 操作日志改为全行蓝色横条(查看操作日志 x条),整条可点击
|
2026-09-01 14:42:59 +08:00 |
|
|
|
9d1e6c8466
|
style: 网页端流转树卡片 UI 优化
- 时间精确到分钟(去 split 截断)
- 主线/分支标签改为卡片左上角与状态标签并排
- 操作人前加用户小图标
- 日志入口去掉浅蓝条块,改右下角文本链接 + 蓝色 > 箭头
|
2026-09-01 14:10:35 +08:00 |
|
|
|
6cb7731cbb
|
feat: Track 网页端已完成/已入库/已出库状态展示与筛选
- ProductCard/ScanPage 徽标改用整体状态,补全宏观状态中文映射
- 产品管理/任务全景/我的任务/看板/WIP分析 状态筛选与徽标区分
- 转入在库显示在库实际操作人;新增已出库/OUTBOUND 状态色
|
2026-09-01 13:53:30 +08:00 |
|
|
|
6eb81953f5
|
feat(网页端): 流转树在库任务显示『谁转入在库』
- TaskFlowView 在库/入库任务节点显示『📥 转入在库: 创建人中文名』
- TaskResponse 类型补 created_by 字段
|
2026-08-31 17:20:47 +08:00 |
|
|
|
fdd7465afb
|
feat(前端): 新增 WIP 分布矩阵透视表页面
- MatrixBoard.tsx: Radio切换 按人员/按工序,动态交叉表转换(规格型号为行)
- 单元格显示设备数量+主负责人,首列规格固定左、末列合计固定右,bordered Excel风格
- 路由 /admin/matrix 注册,侧边栏新增「WIP 分布矩阵」入口
|
2026-08-28 16:25:26 +08:00 |
|
|
|
88f02cbdcf
|
fix(图片): 记录弹窗图片从页面跳转改为点击放大预览
- TaskFlowView 记录图片 window.open 跳转 → antd Image.PreviewGroup 点击放大
- 与人员看板/效能分析的图片查看模式全局统一
|
2026-08-28 11:33:46 +08:00 |
|
|
|
1bb93e0a5f
|
fix(流转树): 弹窗打开时锁定背景滚动,消除滚动穿透
- 通用 Modal 打开时 body overflow=hidden,关闭时恢复
- 修复流转树宽屏弹窗滚动时背景看板跟随滚动的问题
- TaskFlowView 记录弹窗同步加锁(覆盖无外层弹窗的页面内打开场景)
|
2026-08-28 11:24:59 +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 |
|
|
|
2b17dde42e
|
feat(analytics): 前端 ECharts CustomChart 注册 + 数据契约类型扩展
- BaseEChart 注册 CustomChart 支持区间渲染
- FlowInterval 类型扩为 6 位(含 isMain)
- FlowDevice 增加 lead_time/started_at
|
2026-08-14 11:44:48 +08:00 |
|
|
|
54b5ea00f1
|
feat: 新增效能分析看板(个人能力图谱 + 设备人员耗时对比)
- 前端:AnalyticsDashboard 页面 + BaseEChart 封装 + analyticsApi,路由与导航
- 后端:/analytics 系列接口(capability/flow/options/device-records)
- 能力图谱单机颗粒度、流转对比按人堆叠识别瓶颈、点击下钻备注、筛选动态联动
- 依赖:引入 echarts,移除 echarts-for-react
|
2026-08-14 10:19:44 +08:00 |
|
|
|
c2e6ed240b
|
feat(dashboard): 看板增强——流转完成率下钻明细 + 人员看板(按人聚合在制品设备)
|
2026-08-13 12:00:12 +08:00 |
|
|
|
b6ef0751e0
|
fix(web): 列表最新动态显示操作人、流转树焦点模式保留活跃并发分支
|
2026-08-13 11:17:13 +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 |
|
|
|
a5e256330a
|
fix: parseImages支持数组输入 — Pydantic序列化后images已是数组非字符串
|
2026-08-12 16:08:37 +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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
1b4af0a7af
|
fix: 全端隐藏用户角色标签(SUPER_ADMIN/操作员等)
|
2026-08-07 14:53:46 +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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
8fcb33ab5e
|
chore(frontend): 新增全局 Toast 通知组件与入场动画
components/ui/Toast.tsx:
- Context + Provider 模式,全局可用 useToast() hook
- 支持 success / error / info 三种类型,颜色自动适配
- 3.5s 自动消失,支持手动关闭
- 固定右下角渲染,z-[9999]
index.css:
- 新增 @keyframes slide-in 右侧滑入动画
|
2026-08-04 17:30:17 +08:00 |
|
|
|
340a09007e
|
feat: 实现前端管理看板与移动端扫码视图组件
|
2026-08-04 17:10:01 +08:00 |
|