Commit Graph

131 Commits

Author SHA1 Message Date
ba96937933 fix: 移动端产品详情锁定工作区操作栏固定底部并加内容底部占位 2026-09-07 11:08:52 +08:00
e194b97649 fix: 全状态对齐 - 已出库(OUTBOUND)覆盖所有看板
- 看板产品流转 finished_cond 加'已出库',已出库归入已完结
- WIP 矩阵区分'已出库'维度
- MyTasksPage tab 加'已出库'
- 移动端 detail/WorkspaceArea STATUS_MAP 补 OUTBOUND
2026-09-02 09:07:37 +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
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
84af09ea75 style: 移动端流转树主轴连线与卡片排版优化
- 中央垂直线首行从 50% 起、末行到 50% 止,不再冒出
- FlowCard 时间独占一行,操作日志独立一行靠右对齐
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
547c113b09 fix: 移动端 formatUserName 挂载到 methods,修复流转树渲染报错
- Vue2 Options API 中 import 的函数不暴露给模板,需挂到 methods
- FlowTree/TaskTreeNode 补 formatUserName 方法
2026-09-01 13:59:56 +08:00
a04989afd3 fix: 修复移动端流转树全览空白,改用独立 FlowTree 递归树组件
- 修复 scroll-view 高度为 0 导致内容不可见
- 新建 FlowTree.vue 独立递归渲染(主线/分支标记、状态、转入在库、时间、记录)
- 不依赖 TaskTreeNode,展示更贴近网页端流转树
2026-09-01 13:57:56 +08:00
cf2609d87a feat: Track 移动端状态展示与流转树全览改造
- 宏观状态栏补已入库/已出库语义色;OVERALL_OPTIONS 补已入库/已出库
- 在库任务'转入在库'显示实际操作人(assignee);补 OUTBOUND 状态色
- 流转树全览(TreeCanvas)由可移动 canvas 改为纵向递归树,复用 TaskTreeNode
2026-09-01 13:53:35 +08:00
beeee57b75 feat(移动端): 流转树在库任务显示『谁转入在库』
- TreeCanvas 全屏流转树 + TaskTreeNode 内嵌树节点,在库/入库任务显示『📥 转入在库: 创建人』
- 复用 formatUserName 中文名映射
2026-08-31 17:20:52 +08:00
dd14185ab4 feat(APP): 记录页实现编辑记录弹窗,替代占位的「返回详情页」提示
- 点击✏️直接弹出编辑弹窗:修改备注文本 + 图片预览/删除/新增上传
- 保存走 PUT /records/{id} 更新,本地列表同步刷新
- 删除图片同样走5秒倒计时双重确认
2026-08-28 13:02:29 +08:00
d5315cb9a1 fix(APP): 撤回转交也加入5秒倒计时确认
- 撤回转交与其他破坏性操作(删除/结束分支/驳回)一致,确认前需5秒等待防误触
2026-08-28 12:12:27 +08:00
8537bce30c fix(APP): 倒计时期间确认按钮禁用虚化 + 收窄倒计时范围
- 5秒倒计时期间确认按钮虚化禁用(点不了),只有取消可用,倒计时结束按钮解锁再点击才执行
- 收窄范围:仅 删除记录/删除图片/结束分支/驳回 保留5秒等待;接收/转交/派发/保存/创建/撤回转交 恢复直接确认
2026-08-28 12:05:13 +08:00
d8e08497f6 fix(APP): 记录页删除也改为5秒倒计时双重确认
- records.vue 删除记录从 uni.showModal 改为自定义倒计时确认弹窗
- 取消逻辑由 Vue 控制,杜绝原生弹窗取消失效
2026-08-28 11:49:48 +08:00
5f8eeda818 fix(APP): 操作确认改为5秒倒计时双重确认,杜绝误触
- 接收/驳回/转交/派发/保存记录/创建首道工序 确认按钮:首次点击进入5秒倒计时,期间再点=取消反悔,倒计时结束再点才执行
- 结束分支/撤回转交/删除记录/删除图片:改为自定义倒计时确认弹窗,替换 uni.showModal(APP端原生弹窗取消行为异常)
- 修复 canDeleteImage 权限误判(严格===只比username→宽松双向比较),负责人不再看不到删图按钮
- 页面卸载清理定时器;操作失败增加错误提示消除静默
2026-08-28 11:49:43 +08:00
3288223a92 refactor(mobile): 移动端上传/展示去 IP 化,统一公网域名并支持 NODE_ENV 环境感知 2026-08-13 10:34:56 +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
d9c875924c feat: 移动端扫码页手动输入框增加一键清除×按钮 2026-08-12 17:23:20 +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
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
8e8d23010f fix: 留言板未读数退出重进后重置 — lastMsgSeenAt持久化到storage 2026-08-12 13:16:11 +08:00
b731144a5a fix: 移动端通知已读状态无法持久化
根因:
  handleCardTap 中 try { await markNotificationRead(); item.is_read = true } catch {}
  静默吞噬了 API 错误。PUT /notifications/{id}/read 调用失败时,本地 is_read
  仍被设为 true,红点消失。下次进入页面重新拉取,服务端仍为未读状态。

修复:
  - API 失败时保留 is_read = false,不更新本地状态
  - 弹出Toast提示用户下拉刷新重试
  - 失败时 return 阻止跳转,避免用户误以为已处理
2026-08-12 12:15:36 +08:00
d32a3dce49 chore: UniApp OTA静默更新 + 项目分析报告
1. UniApp OTA更新优化
   - 移除进度条和下载中Toast(静默后台下载)
   - 安装成功后3秒自动重启,无用户感知
   - 失败时仅console.error,不弹窗打扰用户

2. 项目分析报告
   - 新增PROJECT_ANALYSIS_REPORT.md
   - 涵盖技术栈、数据模型、核心业务流程、潜在痛点和架构建议
2026-08-12 12:04:51 +08:00
991d713777 feat(backend): 新增留言通知 — add_task_record 自动推送给任务负责人
触发条件:
- 有人对任务添加流转记录(留言/备注)
- 任务有 assignee_id
- 留言人 != 任务负责人 (不给自己发通知)

通知内容:
- title: 💬 收到新留言
- content: 产品[SN]的「任务名」有新留言:{前30字摘要}
- type: COMMENT

额外:
- Notification 模型新增 NOTIFY_COMMENT 常量
- 前端 notify 页新增 COMMENT 图标(💬)和标题(收到新留言)
2026-08-11 18:17:52 +08:00
7e4d796ce3 perf(app): OTA下载进度节流 — 20%步进轻提示根治卡顿
问题: plus.nativeUI.showWaiting 每次下载回调都触发原生等待框更新,
      高频调用导致主线程阻塞产生无响应/掉帧。

修复:
1. 废除 plus.nativeUI.showWaiting 全系列调用
2. 改用 uni.showToast + position:'top' 顶部轻提示
3. 核心: 节流阀 lastProgress — 每跨越20%才触发一次UI更新
   整个下载过程最多5次toast (20/40/60/80/100%),根治跨端卡顿
4. 初始toast '已转入后台下载...' 给用户明确反馈
5. 安装/重启逻辑保持不变(静默安装+2s自动重启)
2026-08-11 18:01:17 +08:00
3cb85f28b4 fix(frontend): 宏观状态前端UX重构 — 非权限人员隐藏箭头+拦截点击
1. 新增 canEditOverallStatus computed:
   - SUPER_ADMIN 直接放行
   - 递归遍历 task_tree,仅 WIP/PENDING 主线任务负责人有权
   - 严格对齐后端 update_overall_status 的 main_task 判断

2. handleOverallBarClick 增加权限拦截:
   无权限点击 → Toast '仅超级管理员或当前主线负责人可修改状态'

3. overall-arrow 增加 canEditOverallStatus 条件:
   无权限用户不显示 ▾ 箭头,视觉上明确不可操作
2026-08-11 17:48:51 +08:00
9064973a3f fix(app): onShow 中增加更新检查 — 用户无需杀后台即可感知新版本
问题: checkUpdate 仅在 onLaunch 执行,App 常驻内存时永不复用。
      用户部署更新后,不杀后台就永远感知不到新版本。

修复:
1. onShow 中追加 checkUpdate(),每次回到前台自动检测
2. checkUpdate 顶部加 5分钟节流,避免频繁切后台时重复弹窗
2026-08-11 16:56:22 +08:00
01b8601dcd fix(app): OTA更新体验重构 — 废除闪烁弹窗 + 自动重启
问题:
1. uni.showLoading 每次调用都是关→开,进度回调中连续调用导致疯狂闪烁
2. 安装完成后弹窗询问重启,用户选「稍后」则必须手动杀后台

修复:
1. 替换 uni.showLoading → plus.nativeUI.showWaiting
   原生等待框支持原地更新文字,下载进度平滑过渡,零闪烁
2. 安装成功后移除重启询问弹窗,改为:
   plus.nativeUI.toast('新版本已就绪,即将重启...')
   → 2秒后 setTimeout → plus.runtime.restart()
   用户无需任何操作,2秒后自动生效
2026-08-11 16:53:35 +08:00
5b5f4a6b0e fix(frontend): TreeCanvas 坐标+连线三重修复 — 根治箭头悬空
1. calcSubtreeHeight: Math.max(CARD_H+GAP, totalChildrenHeight)
   → 首子与父平齐,父级高度取 max 而非无脑叠加

2. placeChildren: startY = parentNode.y (水平对齐)
   → 移除初始化 GAP,累加改为 startY += subtreeH

3. lines(): 动态追踪 Y 坐标
   → y1 = isLeft? n.y+40 : parent.y+40
   → y2 = isLeft? parent.y+40 : n.y+40
   → lineStyle 的 Math.atan2 自动画出完美对角线
2026-08-11 16:42:14 +08:00
0a1c2f4dcf fix(frontend): 打印按钮被挤出画面 — card-header 防溢出
根因: card-header 一行塞入 4 个元素(标题+3按钮),
      card-header-right 无 flex-wrap/无 flex-shrink,
      窄屏上打印标签按钮溢出视口不可见。

修复:
- card-header-right: gap 8→4, 加 flex-wrap, flex-shrink:0
- 所有子元素: flex-shrink:0 + white-space:nowrap
- mode-toggle/print-label-btn: 缩小字号+padding节省空间
2026-08-11 16:07:19 +08:00
40a2d87345 fix: 消息通知页不能点进详情 — 补全 product_serial_number
问题: 点击通知卡片跳转 detail?taskId=xxx,但 detail.vue onLoad 只认 serial 参数导致空白页

修复:
1. 后端 NotificationResponse 新增 product_serial_number 字段
2. 后端 notifications API 联表 tasks+products 批量填充 serial
3. 前端 notify/index.vue handleCardTap 优先用 product_serial_number 跳转,兜底从 content 正则解析
4. 前端 detail.vue onLoad 新增 taskId 兜底 → doQueryByTask 反查 product_sn
2026-08-11 15:56:25 +08:00
30a48d90fc fix(frontend): 流转蓝图 + 聊天室 + 卡片布局 + 打印功能修复
1. TreeCanvas.vue - Y轴坐标算法重构:
   - calcSubtreeHeight 改为兄弟累加 (reduce) 替代 Math.max,彻底杜绝垂直重叠
   - childNode.y = parentNode.y + CARD_H + VERTICAL_GAP 严格向下延伸
   - 同级子节点按子树高度累加 startY,各占独立 Y 区域
   - 加宽画布默认尺寸 (400→800, padding +300/+400)

2. detail.vue - onShow 生命周期修复:
   - 新增 onShow() 钩子调用 fetchMessages(),解决聊天室退回不刷新问题

3. TaskSwipeCards.vue + detail.vue - CSS 防跳动:
   - .ss-swiper-h / .ss-card-wrapper 添加 min-height: 220px
   - .card 添加 min-height: 120px

4. detail.vue - 移动端打印标签:
   - 新增「🖨️ 打印标签」按钮
   - 双方案 ActionSheet: 网络打印机(后端API) / 蓝牙打印机(ESC/POS)
   - 对接现有 /print/execute 端点
2026-08-11 15:05:39 +08:00
6755dfeae3 feat(mobile): 登录修复 + 人名字典 + 留言板FAB + 流转算法重构
- login: catch补齐toast,修复密码错误静默失败
- detail: formatUserName渲染当前位置,dictVersion驱动响应式重绘
- detail: 留言板改为悬浮按钮+底部抽屉,未读徽标逻辑
- TaskSwipeCards: lanes终极递归算法,SPAWN不限层级开辟新Tab,先序push修复Tab顺序
- TreeCanvas: 父子相对坐标延伸算法,替代旧版奇偶距离递增
2026-08-11 10:02:12 +08:00
567f7175da fix: :key 强制子组件重建 + 拆除嵌套滚动锁
- detail.vue: 新增 dictVersion,loadUsers 后自增驱动子组件 :key 重建
- WorkspaceArea/TaskSwipeCards/TreeCanvas 绑定 :key='...-'+dictVersion
- .page-container: flex → block,让页面自然流式撑开
- .workspace-area: flex:1+overflow:hidden → height:auto
- .is-locked: 仅锁定任务模式下才 height:100vh+overflow:hidden
- .task-list: flex:1+overflow-y:auto → height:auto
2026-08-10 18:08:13 +08:00
051a075e9d fix: 留言板层级修复 + 人名映射防降级
- 留言板移除 currentMode 限制,产品级功能所有模式可见
- .page-container: min-height + overflow-y:auto 替代 height:100vh + overflow:hidden
- loadUsers 加 console.error 日志 + $forceUpdate 防字典空窗期
2026-08-10 17:56:47 +08:00
f9451b104b feat: 移动端全局人名映射 + 协同留言板 UI
- detail.vue: 留言板聊天室 UI + 乐观更新 + loadUsers 填充全局字典
- WorkspaceArea.vue: 任务列表/上游/下游负责人全部走 formatUserName
- TreeCanvas.vue: 节点负责人 + 嵌套协助提示走 formatUserName
- TaskSwipeCards.vue: 卡片负责人走 formatUserName
- 留言板头像取中文名末字(formatUserAvatar)
2026-08-10 17:37:25 +08:00
05003d3053 feat: 全局人名映射工具 — 拼音 ID → 中文姓名转换
- formatUserName(userId): 查全局字典翻译为中文名,降级返回原 ID
- formatUserAvatar(userId): 中文名取末字作为头像文字
- setUserNameMap(users): 批量注册用户字典
2026-08-10 17:37:16 +08:00
ba060cbb5e refactor(mobile): 流转树固定100%比例,移除双指缩放功能
- 移除 movable-view 的 :scale/:scale-min/:scale-max/:scale-value 属性
- 移除 onScale/zoomIn/zoomOut 方法及工具栏缩放按钮
- 移除顶部双指缩放·单指拖拽提示文字
- fitAll 简化为纯居中定位 (mvX/mvY),不再调整缩放比
- 工具栏仅保留: 返回 | 流转蓝图 | 卡片切换 | 全览
2026-08-10 15:25:56 +08:00