diff --git a/backend/app/api/v1/endpoints/tasks.py b/backend/app/api/v1/endpoints/tasks.py index a788b4c..e5065fc 100644 --- a/backend/app/api/v1/endpoints/tasks.py +++ b/backend/app/api/v1/endpoints/tasks.py @@ -154,16 +154,17 @@ async def receive_task_endpoint( task_id: str, operator_id: str | None = Query(None, description="操作人ID"), remark: str | None = Body(None, description="接收备注", embed=True), + task_name: str | None = Body(None, description="接收人选定的工序名称", embed=True), db: AsyncSession = Depends(get_db), ): """ - **确认接收任务。** + **确认接收任务。工人选定工序名称后接收。** 校验:只有状态为 PENDING 的任务可接收。 - 动作:将状态改为 WIP,记录 received_at 为当前时间,写入 remark。 + 动作:状态改为 WIP,记录 received_at,更新 task_name,同步产品宏观状态。 """ return await task_service.receive_task( - db, uuid.UUID(task_id), operator_id, remark + db, uuid.UUID(task_id), operator_id, remark, task_name ) diff --git a/backend/app/services/task_service.py b/backend/app/services/task_service.py index 01284a8..d237529 100644 --- a/backend/app/services/task_service.py +++ b/backend/app/services/task_service.py @@ -335,13 +335,13 @@ ARCHIVED_STATUS = "ARCHIVED" async def receive_task( db: AsyncSession, task_id: uuid.UUID, operator_id: str | None = None, - remark: str | None = None, + remark: str | None = None, task_name: str | None = None, ) -> TaskResponse: """ - 操作员确认接收任务。 + 操作员确认接收任务。工人选定工序名称后接收。 校验:只有状态为 PENDING 的任务可接收。 - 动作:状态改为 WIP,记录 received_at,写入 remark。 + 动作:状态改为 WIP,记录 received_at,更新 task_name,同步产品宏观状态。 """ task = await _get_task_or_404(db, task_id) @@ -364,6 +364,8 @@ async def receive_task( task.received_at = now if remark: task.remark = remark + if task_name: + task.task_name = task_name await _create_task_log( db, task_id, @@ -372,11 +374,14 @@ async def receive_task( remark=remark or f"操作员确认接收任务「{task.task_name}」", ) - # 接收时同步产品位置到接收人 + # 接收时同步产品位置到接收人 + 宏观状态同步 product_result = await db.execute(select(Product).where(Product.id == task.product_id)) product = product_result.scalar_one_or_none() - if product and task.assignee_id: - product.current_location_id = task.assignee_id + if product: + if task.assignee_id: + product.current_location_id = task.assignee_id + if task_name: + product.overall_status = task_name await db.commit() await db.refresh(task) diff --git a/track-uniapp/src/pages/scan/components/TreeCanvas.vue b/track-uniapp/src/pages/scan/components/TreeCanvas.vue index 8389a6d..5fc36eb 100644 --- a/track-uniapp/src/pages/scan/components/TreeCanvas.vue +++ b/track-uniapp/src/pages/scan/components/TreeCanvas.vue @@ -165,9 +165,9 @@ export default { .zero-icon { font-size: 40px; margin-bottom: 10px; } .zero-text { font-size: 14px; color: #9ca3af; } .canvas-hint { font-size: 11px; color: #9ca3af; text-align: center; padding: 8px 0; background: #fff; border-bottom: 1px solid #e5e7eb; flex-shrink: 0; } -.tree-movable-area { flex: 1; width: 100%; } +.tree-movable-area { flex: 1; width: 100%; background-color: #f8fafc; background-image: linear-gradient(#e5e7eb 1px, transparent 1px), linear-gradient(90deg, #e5e7eb 1px, transparent 1px); background-size: 20px 20px; } .canvas-inner { position: absolute; left: 0; top: 0; } -.canvas-node { position: absolute; width: 240px; min-height: 120px; background: #ffffff; border-radius: 12px; padding: 16px; box-shadow: 0 6px 16px rgba(0,0,0,0.06); border-left: 8px solid #3b82f6; border-top: none; z-index: 10; display: flex; flex-direction: column; gap: 8px; } +.canvas-node { position: absolute; width: 240px; min-height: 120px; background: #ffffff; border-radius: 14px; padding: 16px; box-shadow: 0 8px 24px rgba(0,0,0,0.10), 0 2px 4px rgba(0,0,0,0.06); border-left: 8px solid #3b82f6; z-index: 10; display: flex; flex-direction: column; gap: 8px; } .canvas-node.s-yellow { border-left-color: #f59e0b; } .canvas-node.s-blue { border-left-color: #3b82f6; } .canvas-node.s-green { border-left-color: #22c55e; } diff --git a/track-uniapp/src/pages/scan/components/WorkspaceArea.vue b/track-uniapp/src/pages/scan/components/WorkspaceArea.vue index 9f58fee..75dcaad 100644 --- a/track-uniapp/src/pages/scan/components/WorkspaceArea.vue +++ b/track-uniapp/src/pages/scan/components/WorkspaceArea.vue @@ -46,6 +46,8 @@ {{ statusLabel(lockedTask.status) }} ⚠返工 + 🛑 结束协助 {{ lockedTask.task_name }} @@ -80,8 +82,6 @@ @tap="$emit('action', { task: lockedTask, type: 'record' })">📝 记录/拍照 - - + {{ isWarehouseTransfer ? '📤 仓库转出派发' : '🚀 发起首道工序' }} - 工序名称 * - {{ firstForm.task_name || '请选择工序名称' }} 接收人 * - {{ firstForm.assigneeLabel || '请选择接收人' }} - 备注 * + + {{ formatName(u.name) }} + + 备注 *