|
|
620df5ce11
|
feat(analytics): 人员视图重构为 custom 居中紧凑柱状 + 原生横向滚动
- capabilityOption 改 custom 系列,居中紧凑算法消除幽灵占位
- 柱宽保底 3px(0值/极小值也有柱子)、数字标签悬浮柱顶
- X 轴四行展示:物料名/规格型号/序列号/身份证
- 原生横向滚动容器(每设备 140px)+ custom-scrollbar 样式
- tooltip appendToBody 避免被容器裁剪
|
2026-08-14 15:43:31 +08:00 |
|
|
|
1e374e76bf
|
feat(analytics): CapabilityDevice 增加 material_name(X 轴展示物料名)
- 后端 CapabilityDevice 新增 material_name,get_capability_profile 查询并填充
- 前端类型同步 material_name
|
2026-08-14 15:43:22 +08:00 |
|
|
|
00741ae288
|
fix(analytics): 柱色对齐图例、刷新智能定位 tab、视图更名
- custom series 补 itemStyle.color,使柱色与 legend/tooltip 色点一致
- activeTab 根据 URL 参数智能初始化(选人→人员视图,选设备→轨迹流转)
- 视图及页头文案从「个人能力图谱/设备流转对比」改为「人员视图/轨迹流转」
|
2026-08-14 14:49:56 +08:00 |
|
|
|
31d9a8781a
|
feat(analytics): 筛选器体验升级(人名网格化/规格物料名/设备卡片下拉)
- 人员选择器 4 列网格 + 两字姓名对齐 + 全选/全不选
- 规格型号 2 列网格 + 物料名展示 + 全选/全不选
- 设备输入框改为卡片式下拉器(物料名/S/N/完整身份证)
- productSn(string) 改为 productSns(string[]) 多选
|
2026-08-14 14:30:43 +08:00 |
|
|
|
807df56c3a
|
feat(analytics): 规格型号带物料名 + 设备字典(/options 数据契约扩展)
- 后端新增 SpecModelOption/DeviceOption schema
- get_analytics_options 返回规格型号的物料名(同型号取首个非空名)+ 关联设备列表
- 前端同步 SpecModelOption/DeviceOption 类型
|
2026-08-14 14:30:35 +08:00 |
|
|
|
7d48daca0c
|
style(analytics): 隐去设备生命周期时间轴主干背景,仅保留柱顶总计标签
- 主干 series 的 itemStyle.color 改为 transparent,去掉灰色填充与描边
- 保留 label 的 {title|总计}\n{value|...} 文本,让总时长优雅悬浮在时间轴顶端
|
2026-08-14 11:46:44 +08:00 |
|
|
|
99235d29e0
|
feat(analytics): 设备生命周期时间轴(主干居中 + 主次分支 + 上帝视角 tooltip)
- flowOption 从堆叠柱状改为 custom 区间甘特图
- 灰色主干打底居中,主线任务绝对居中、分支任务悬挂右侧(靠透明度区分并行)
- tooltip 上帝视角:开始时间/流转周期/累计工时/中间空闲时长/人员占比(色点标识)
|
2026-08-14 11:44:55 +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 |
|
|
|
74d404cc11
|
feat(analytics): 设备流转甘特图数据底座(lead_time/started_at/task_type 主次标识)
- FlowDevice 新增 lead_time(生命周期总时长)、started_at(最早介入时间)
- FlowSeries.data 改为区间数组 [device_index, start_offset, end_offset, task_name, duration, is_main]
- get_flow_compare 按任务生成相对 T0 的偏移区间,task_type=SPAWN 标记为分支
|
2026-08-14 11:44:41 +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 |
|
|
|
f4fc23be42
|
feat(web): 人员工时台账表格+多维搜索+CSV导出+新流转红点标注+分页中文
|
2026-08-13 16:04:29 +08:00 |
|
|
|
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 |
|