From e91fc70ca7148b44c5d7f9193ccf359287c9acac Mon Sep 17 00:00:00 2001 From: haoliang <821644@qq.com> Date: Wed, 29 Apr 2026 22:00:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=91=98=E5=B7=A5=E7=AE=A1=E7=90=86=E7=A9=BF?= =?UTF-8?q?=E6=A2=AD=E6=A1=86=E6=94=B9=E9=80=A0=EF=BC=9A=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E6=9C=BA=E5=BA=8A+=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E8=89=B2=E7=82=B9=EF=BC=88=E7=BB=BF=E5=9C=A8=E7=BA=BF/?= =?UTF-8?q?=E7=81=B0=E7=A6=BB=E7=BA=BF/=E7=BA=A2=E5=81=9C=E7=94=A8?= =?UTF-8?q?=EF=BC=89+=E5=9B=BE=E4=BE=8B=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../管理后台/06-员工管理/06-01-员工管理页面.md | 28 ++++++---- frontend/src/views/worker/WorkerListPage.vue | 53 +++++++++++++++++-- 2 files changed, 66 insertions(+), 15 deletions(-) diff --git a/docs/02-功能清单/管理后台/06-员工管理/06-01-员工管理页面.md b/docs/02-功能清单/管理后台/06-员工管理/06-01-员工管理页面.md index 665350b..1aad554 100644 --- a/docs/02-功能清单/管理后台/06-员工管理/06-01-员工管理页面.md +++ b/docs/02-功能清单/管理后台/06-员工管理/06-01-员工管理页面.md @@ -78,14 +78,16 @@ |------|------|------|--------|------|------| | 工号 | el-input maxlength=50 | 是 | - | 必填+唯一性(新增时) | - | | 姓名 | el-input maxlength=50 | 是 | - | 必填 | - | -| 绑定机床 | el-transfer 穿梭框 | 否 | 空 | - | 左侧显示可选机床,右侧显示已绑定机床 | +| 绑定机床 | el-transfer 穿梭框 | 否 | 空 | - | 左侧显示全部机床(带状态色点),右侧显示已绑定机床 | 说明: - 弹窗中不设"状态"字段,新增默认启用 -- 绑定机床使用穿梭框(el-transfer):左侧列出可选机床,右侧显示已绑定机床 -- 穿梭框数据:查询cnc_machine中未绑定其他工人的机床(uk_machine约束确保一对一),编辑时含当前已绑定的 -- 机床不论在线/离线状态均可绑定(绑定关系不受机床在线状态限制) -- 穿梭框每项显示格式:`device_code (机床名称) - 车间` +- 绑定机床使用穿梭框(el-transfer):左侧列出全部机床,右侧显示已绑定机床 +- 穿梭框数据源:调用机床列表API(`/admin/machine`)获取全部机床,不按状态筛选 +- 每项机床名称前显示状态色点:🟢在线(绿色)、⚪离线(灰色)、🔴停用(红色) +- 穿梭框下方显示图例:绿色=在线 | 灰色=离线 | 红色=停用 +- 机床不论在线/离线/停用状态均可绑定(绑定关系不受机床状态限制) +- 穿梭框每项显示格式:`[状态点] 机床名称 (device_code) - 车间` ### 7. 状态机 @@ -123,7 +125,7 @@ | 编辑工人 | §3.6 #4 | 编辑弹窗保存 | | 删除工人 | §3.6 #5 | 删除操作 | | 启停工人 | §3.6 #6 | 启停切换 | -| 可绑定机床 | §3.6 #10 | 弹窗中机床下拉 | +| 机床列表 | §3.6 机床列表 | 弹窗中穿梭框数据源(全部机床,含在线/离线/停用状态) | #### 数据结构 @@ -145,16 +147,20 @@ Response: { "code": 0, "message": "success", "data": { "id": 4, "name": "赵六" }} ``` -**可绑定机床(§3.6 #10):** +**机床列表(穿梭框数据源):** Response: ```json { "code": 0, "data": { "items": [ - { "id": 5, "name": "东-2.5", "deviceCode": "siemens_2.5", "workshopName": "B栋" }, - { "id": 8, "name": "北-4.1", "deviceCode": "fanake_4.1", "workshopName": "C栋" } -]}} + { "id": 1, "name": "西-1.8", "deviceCode": "fanake_1.8", "workshopName": "A栋", "isOnline": 1, "isEnabled": 1 }, + { "id": 2, "name": "西-1.10", "deviceCode": "fanake_1.10", "workshopName": "A栋", "isOnline": 1, "isEnabled": 1 }, + { "id": 3, "name": "东-2.0", "deviceCode": "fanake_2.0", "workshopName": "B栋", "isOnline": 0, "isEnabled": 1 }, + { "id": 4, "name": "东-2.5", "deviceCode": "siemens_2.5", "workshopName": "B栋", "isOnline": 0, "isEnabled": 0 } +], "total": 4, "page": 1, "pageSize": 999 }} ``` +> 调用机床列表API(`GET /admin/machine?pageSize=999`),获取全部机床。前端根据isOnline和isEnabled渲染状态色点。 + **编辑工人(§3.6 #4)/ 删除工人(§3.6 #5)/ 启停工人(§3.6 #6):** Response: @@ -170,4 +176,4 @@ Response: |---------|---------|------| | 工人列表(含分页) | cnc_worker | 主表,需JOIN绑定机床数+机床名称 | | 工号唯一性校验 | cnc_worker.uk_code | 新增时实时校验 | -| 可绑定机床下拉 | cnc_machine LEFT JOIN cnc_worker_machine | 查未绑定工人(not exists in cnc_worker_machine)的机床 | +| 可绑定机床下拉 | cnc_machine | 调用机床列表API获取全部机床,前端按isOnline/isEnabled渲染状态色点 | diff --git a/frontend/src/views/worker/WorkerListPage.vue b/frontend/src/views/worker/WorkerListPage.vue index db6da3f..92b90f5 100644 --- a/frontend/src/views/worker/WorkerListPage.vue +++ b/frontend/src/views/worker/WorkerListPage.vue @@ -48,11 +48,25 @@ + > + + +
+ 在线 + 离线 + 停用 +
@@ -72,7 +86,8 @@ const loading=ref(false);const tableData=ref([]);const selectedRows=re // 分页信息 const pagination=ref<{ currentPage: number; pageSize: number; total: number }>({ currentPage: 1, pageSize: 20, total: 0 }) const dialogVisible=ref(false);const submitting=ref(false);const editingId=ref(null) -const availableMachines=ref<{ id: number; label: string; name: string }[]>([]) +interface MachineItem { id: number; name: string; label: string; deviceCode?: string; workshopName?: string; isOnline: number; isEnabled: number } +const availableMachines=ref([]) const query=reactive({isEnabled:undefined as number | undefined,keyword:''}) const form=reactive({code:'',name:'',machineIds:[] as number[]}) const workerForm=ref(null) @@ -100,8 +115,38 @@ function handleEdit(row: Worker){editingId.value=row.id;Object.assign(form,{code async function handleSubmit(){submitting.value=true;try{const ok = await (workerForm.value?.validate ? new Promise((resolve)=>workerForm.value!.validate((valid:boolean)=>resolve(valid))) : Promise.resolve(true)); if(!ok){return} await request[editingId.value?'put':'post'](editingId.value?`/admin/worker/${editingId.value}`:'/admin/worker',{...form});ElMessage.success('保存成功');dialogVisible.value=false;loadData()}finally{submitting.value=false}} async function handleDelete(row:any){await ElMessageBox.confirm('确定删除【'+row.name+'】?此操作不可恢复。','提示',{type:'warning'});await request.delete(`/admin/worker/${row.id}`);ElMessage.success('已删除');loadData()} async function batchStatus(isEnabled:number){await ElMessageBox.confirm('确定对选中的'+selectedRows.value.length+'项操作?','提示',{type:'warning'});for(const id of selectedRows.value.map((r:any)=>r.id)){await request.put(`/admin/worker/${id}/toggle`,{isEnabled})};ElMessage.success('操作成功');loadData()} -async function loadDrops(){try{const r: ApiResponse<{ items: Array<{ id: number; name: string; deviceCode?: string; workshopName?: string }> }> = await request.get('/admin/worker/available-machines'); availableMachines.value = (r.data?.items ?? []).map(m => ({ id: m.id, name: m.name, label: `${m.deviceCode || m.name} (${m.name})${m.workshopName ? ' - ' + m.workshopName : ''}` }))}catch{/* 接口不可用时保持为空,不影响其他功能 */}} +async function loadDrops(){try{const r: ApiResponse<{ items: MachineItem[] }> = await request.get('/admin/machine',{params:{pageSize:999}}); availableMachines.value = (r.data?.items ?? []).map(m => ({ id: m.id, name: m.name, label: m.name, deviceCode: m.deviceCode, workshopName: m.workshopName, isOnline: m.isOnline, isEnabled: m.isEnabled }))}catch{/* 接口不可用时保持为空,不影响其他功能 */}} +/** 根据机床在线/启用状态返回样式类 */ +function getStatusClass(m: MachineItem): string { + if (!m.isEnabled) return 'status-disabled' + if (m.isOnline) return 'status-online' + return 'status-offline' +} function handlePageChange(page:number){pagination.value.currentPage=page;loadData()} function handleSizeChange(size:number){pagination.value.pageSize=size;pagination.value.currentPage=1;loadData()} onMounted(()=>{loadData();loadDrops()}) +