|
|
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 |
|
|
|
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 |
|
|
|
73faa1fd93
|
feat: Track 打通已完成/已入库/已出库状态闭环与外部联动
- 完工转交入库同步 status=COMPLETED;MOM 入库/出库回调同步 status
- 新增 mom-outbound webhook(发货出库标记已出库),lookup 返回 material_id
- VALID_OVERALL_STATUS 新增已出库;update_overall_status 同步 status 字段
- WIP 矩阵区分已入库/待仓库收货;虚拟节点正确处理已出库/转入在库人
|
2026-09-01 13:53:24 +08:00 |
|
|
|
7f5bedf87c
|
fix(流转树): 在库设备无在库任务时追加虚拟在库节点
- 设备在库(virtual_warehouse)但无在库任务时,流转树追加虚拟「在库」节点
- 转入人用最后一道主工序负责人兜底(近似),显示在库归属
- 递归检查任务树避免重复追加(在库任务可能是子任务)
|
2026-08-31 17:38:38 +08:00 |
|
|
|
39019f4312
|
fix(流转树): 在库任务无创建日志时兜底显示转入人
- 有 create 日志的在库任务用真实转入人(张欣欣/孔贺等)
- 无日志的历史在库任务,用该产品在库前最近一道主工序的负责人兜底
- 解决『流转树到负责人就结束、不显示谁入库』的问题
|
2026-08-31 17:26:57 +08:00 |
|
|
|
0fc061728c
|
fix(透视表): 在库按设备实际位置判断,修复数量不匹配
- 之前按最新主任务 task_name='在库' 判断,漏掉实际在库但无在库任务的历史设备
- 改为 current_location_id='virtual_warehouse' → 在库(生产完成)
- 其他设备按最新主任务工序归属(活跃/完成态都归该工序)
- 在库数量与实际在库设备一致
|
2026-08-31 17:24:38 +08:00 |
|
|
|
0dea116faa
|
feat(backend): 流转树 created_by 加入中文名映射
- get_product_by_serial 把任务创建人(created_by)纳入 assignee_names 中文名映射
- 前端可显示『谁转入在库』等创建人信息
|
2026-08-31 17:20:41 +08:00 |
|
|
|
c3e03bb177
|
fix(透视表): 不再把任意已完成工序强制归在库
- 设备当前工序 = 最新主任务的工序名(task_name),不区分状态
- 「在库」只在该设备最新主任务真为在库工序时出现
- 完成的测试/生产等工序按原工序显示,不再误归在库
|
2026-08-28 16:57:02 +08:00 |
|
|
|
b57ae19b44
|
fix(透视表): 每台设备只按当前工序统计一次,修复待确认重复计数
- 取每台设备最新主任务作为当前状态
- 活跃任务(WIP/PENDING)→归属对应工序(待确认=转交未接收)
- 完成态任务→归属「在库」(生产完成)
- 上一步已完成+下一步待确认时只算一次,不再重复
- 时间筛选按设备最新主任务创建时间
|
2026-08-28 16:54:43 +08:00 |
|
|
|
0dcdb5dad7
|
fix(透视表): WIP 分布矩阵只统计主分支
- get_wip_matrix 过滤 parent_task_id IS NULL 或 TRANSFER/RECOVERY 的主线任务
- 排除 SPAWN 协助分支与返工任务,避免同一设备/工序重复计数
|
2026-08-28 16:51:46 +08:00 |
|
|
|
41dd257260
|
feat(透视表): 工序分布包含在库/完成 + 增加时间筛选
- wip-matrix 去掉状态过滤,全量分布,工序包含「在库」(生产完成)
- 后端加 since/until 按任务接手/创建时间过滤
- 前端 MatrixBoard 加 RangePicker 日期筛选 + 全部清除
|
2026-08-28 16:32:01 +08:00 |
|
|
|
7547a886cc
|
feat(backend): 新增 /dashboard/wip-matrix 在制品交叉聚合接口
- 规格型号×人员/工序 的设备数量聚合(WIP/PENDING任务)
- dimension 参数: assignee(中文姓名)/task_name(工序名)
- 返回扁平数组含 count + assignees(该交叉点主负责人列表)
|
2026-08-28 16:25:20 +08:00 |
|
|
|
907473b18c
|
feat(效能分析): 人员视图也支持自然天/工作日耗时切换
- capability 接口加 mode 参数,natural 用自然小时、workdays 用工作小时
- 人员视图柱状图随顶部按钮切换,排除休息日的耗时
- 切换按钮自动重新请求 capability 与 flow
|
2026-08-28 15:38:32 +08:00 |
|
|
|
4447a1f52d
|
feat(效能分析): 轨迹流转图时间轴支持工作日/自然天切换
- flow 接口加 mode 参数,workdays 模式把时间偏移换算为排除周末/节假日的工作小时
- 轨迹流转图的横轴随顶部按钮(自然天/工作日)切换,休息日被压缩
- 按钮切换自动重新请求 flow
|
2026-08-28 15:34:17 +08:00 |
|
|
|
b09187ac6e
|
feat(backend): 生产总天数返回自然天+工作日两个口径
- ProductResponse 加 production_days(自然天)/production_days_workdays(工作日)
- get_all_products 计算:自然天自创建至今,工作日用 working_duration_hours 排除周末/节假日
- FlowDevice 加 total_days/total_workdays(设备生产总天数,自最早介入至今)
|
2026-08-28 15:28:56 +08:00 |
|
|
|
451e24c34c
|
fix(workload): get_people_workload 内嵌 _to_bj 改用 to_beijing,修复 BEIJING_TZ 未定义
- 移除 import 后内嵌 _to_bj 仍引用 BEIJING_TZ 导致 NameError
|
2026-08-28 15:13:18 +08:00 |
|
|
|
bad0941d67
|
fix(时长): 所有时长计算排除非工作日 + 修复两处时区多算8小时
- get_wip_tasks/get_people_workload/get_people_history/product active_duration_hours/analytics 均改用 working_duration_hours
- 修复 get_wip_tasks 与 active_duration_hours 的 naive 时间误标北京时间 bug(DB实存UTC,原多算8小时)
- 每处读取 holidays 表排除配置的放假日期
|
2026-08-28 15:08:10 +08:00 |
|
|
|
ad4b55dece
|
feat(工作日): 新增工作小时计算工具 + 节假日表与管理接口
- time_utils 新增 to_beijing(统一naive按UTC转北京时间) + working_duration_hours(排除周末/节假日)
- Holiday 模型 + alembic 迁移建 holidays 表
- GET/POST/DELETE /holidays 节假日管理接口,可随时配置放假日期
|
2026-08-28 15:08:05 +08:00 |
|
|
|
7205de369a
|
feat(backend): 新增 /dashboard/user-operations/detail 操作明细下钻接口
- 按人+操作类型(receive/transfer/record)查询明细:任务/产品/备注/时间
- record 明细与该人统计口径一致(名下任务手动备注,排除系统自动)
|
2026-08-28 13:36:23 +08:00 |
|
|
|
477a187fc1
|
fix(操作统计): 上传备注改为按任务负责人归因,历史数据可回溯
- 备注统计不用 task_logs(历史无record日志),改为 task_records 按任务 assignee 归因
- 排除系统自动生成的备注(以'['开头的接收/转交/撤回等),只计手动上传
- 移除 add_task_record 冗余的 record 日志(不再用于统计)
- 不改数据库,历史182条备注也能正确归属到人
|
2026-08-28 13:26:26 +08:00 |
|
|
|
41c19242cf
|
fix(操作统计): 返回全部人员而非仅有操作的人
- get_user_operations 先取全部 IRIS 人员清单,再合并各自操作次数
- 无操作的显示 0,避免只看得到当前有操作记录的人(如只看自己)
|
2026-08-28 13:22:56 +08:00 |
|
|
|
b85188e625
|
feat(backend): 新增 /dashboard/user-operations 人员操作统计接口
- add_task_record 补 action_type=record 日志,使上传备注可统计到人
- get_user_operations 按人聚合 接收(receive)/转交(complete)/上传备注(record) 次数,时间筛选,中文名映射
- 复用 get_display_names,不新增数据库字段
|
2026-08-28 13:14:09 +08:00 |
|
|
|
90f5718e68
|
fix(驳回/返工): 抽屉与卡片数字口径一致,同时展示已驳回+返工任务
- 根因:卡片数字含返工任务(tasks_rework 实时快照),但抽屉只列已驳回 → 点开为空
- get_rejected_tasks 扩展返回两类(kind=rejected 按时间过滤 / kind=rework 实时不过滤)
- 前端抽屉按「已驳回」「返工任务」分组展示,数字与明细一一对应
|
2026-08-28 11:33:54 +08:00 |
|
|
|
7e00683a21
|
feat(backend): 新增 /dashboard/rejected-tasks 驳回/返工下钻接口
- RejectedTask schema: 设备/工序/驳回人/返工负责人/原因/时间
- get_rejected_tasks 批量窗口取驳回人(reject log) + 复刻 reject_task 的返工负责人追溯逻辑(create log→父任务→自身)
- 复用 get_display_names 中文名映射、BEIJING_TZ 时间转换
|
2026-08-28 11:18:58 +08:00 |
|
|
|
90d615cbb0
|
feat(backend): 产品列表返回当前人滞留时长 active_duration_hours
- ProductResponse 增加 active_duration_hours(小时) 字段
- get_all_products 批量计算每个产品活跃任务(WIP/PENDING)最早接手时间到现在的时长
- 复用 get_people_workload 相同的北京时间口径,前端无需额外请求
|
2026-08-28 10:46:10 +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 |
|
|
|
807df56c3a
|
feat(analytics): 规格型号带物料名 + 设备字典(/options 数据契约扩展)
- 后端新增 SpecModelOption/DeviceOption schema
- get_analytics_options 返回规格型号的物料名(同型号取首个非空名)+ 关联设备列表
- 前端同步 SpecModelOption/DeviceOption 类型
|
2026-08-14 14:30:35 +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 |
|
|
|
91b1426ccb
|
feat(dashboard): 人员工时台账——平铺明细+多维筛选+时间交集+动态工时+备注+CSV导出
|
2026-08-13 16:04:23 +08:00 |
|
|
|
c2e6ed240b
|
feat(dashboard): 看板增强——流转完成率下钻明细 + 人员看板(按人聚合在制品设备)
|
2026-08-13 12:00:12 +08:00 |
|
|
|
e5829c7d06
|
fix(backend): 修复并发任务聚合——当前位置汇总全部负责人、最新动态携带操作人、状态聚合补齐 REJECTED
|
2026-08-13 11:17: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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
e7bfdc261b
|
fix: TaskRecord也加入管理员代办审计标记 — 看板最新动态可见代理操作
新增 _admin_proxy_note() 辅助函数
receive/transfer 的 TaskRecord.remark 自动拼接 [管理员xx代办]
这样看板\最新动态\列就能显示管理员代操作记录
|
2026-08-12 17:11:07 +08:00 |
|
|
|
e511952ea0
|
feat: 最新动态列支持图片展示 — 纯文字/纯图片/图文混合三种模式
后端: ProductResponse 新增 latest_record_has_images
前端: 📷图标 + 纯图片时显示"图片记录" + Tooltip标注[含图片]
|
2026-08-12 16:01:24 +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 |
|
|
|
729de138cd
|
feat: 在制品附加信息补全 — 设备名称|规格型号|序列号|身份证
后端: WipTask 新增 spec_model, 查询关联 Product.spec_model
前端: 第二行格式改为 物料|规格|序列号:xxx|身份证:xxx
|
2026-08-12 14:43:20 +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 |
|