@ -65,7 +65,7 @@
< / div >
< / template >
< script setup lang = "ts" >
import { ref , reactive , onMounted } from 'vue'
import { ref , reactive , onMounted , watch } from 'vue'
import { useRouter } from 'vue-router'
import { ElMessage , ElMessageBox } from 'element-plus'
import request from '@/utils/request'
@ -81,6 +81,13 @@ interface MachineItem { id: number; name: string; label: string; deviceCode?: st
const availableMachines = ref < MachineItem [ ] > ( [ ] )
const query = reactive ( { isEnabled : undefined as number | undefined , keyword : '' } )
const form = reactive ( { code : '' , name : '' , machineIds : [ ] as number [ ] , bindings : [ ] as Array < { machineId : number , shiftStart : string , shiftEnd : string } > } )
watch ( ( ) => [ ... form . machineIds ] , ( newIds ) => {
const oldIds = form . bindings . map ( b => b . machineId )
const added = newIds . filter ( id => ! oldIds . includes ( id ) )
const removed = oldIds . filter ( id => ! newIds . includes ( id ) )
form . bindings = form . bindings . filter ( b => ! removed . includes ( b . machineId ) )
for ( const id of added ) form . bindings . push ( { machineId : id , shiftStart : '' , shiftEnd : '' } )
} , { deep : true } )
const workerForm = ref < FormInstance | null > ( null )
/ / 工 号 唯 一 性 校 验 规 则
const rules = reactive ( {
@ -101,7 +108,7 @@ rules.code = [{ validator: validateWorkerCode, trigger: 'blur' }]
function resetQuery ( ) { query . isEnabled = undefined ; query . keyword = '' ; loadData ( ) }
function goDetail ( id : number ) { router . push ( ( isMock . value ? '/mock/worker/' : '/worker/' ) + id ) }
async function loadData ( ) { loading . value = true ; try { const ps = pagination . value . pageSize ; const cp = pagination . value . currentPage ; const r : ApiResponse < { items : Worker [ ] ; total ? : number } > = await request . get ( '/admin/worker' , { params : { ... query , page : cp , pageSize : ps } } ) ; tableData . value = r . data ? . items || [ ] ; pagination . value . total = r . data ? . total ? ? ( r . data ? . items ? . length ? ? 0 ) } finally { loading . value = false } }
function handleAdd ( ) { editingId . value = null ; Object . assign ( form , { code : '' , name : '' , machineIds : [ ] }) ; loadTransferData ( ) ; dialogVisible . value = true }
function handleAdd ( ) { editingId . value = null ; Object . assign ( form , { code : '' , name : '' , machineIds : [ ] ,bindings : [ ] }) ; loadTransferData ( ) ; dialogVisible . value = true }
async function handleEdit ( row : Worker ) {
editingId . value = row . id
Object . assign ( form , { code : row . code , name : row . name , machineIds : [ ] } )
@ -126,6 +133,7 @@ async function loadTransferData(workerId?: number){
const items = rOwn . data ? . items ? ? [ ]
ownIds = new Set ( items . map ( ( m : any ) => m . machineId ) )
form . machineIds = items . map ( ( m : any ) => m . machineId )
form . bindings = items . map ( ( m : any ) => ( { machineId : m . machineId , shiftStart : m . shiftStart || '' , shiftEnd : m . shiftEnd || '' } ) )
} catch { }
}
/ / 只 保 留 : 未 绑 定 其 他 工 人 或 已 绑 定 当 前 工 人 的 机 床
@ -134,7 +142,7 @@ async function loadTransferData(workerId?: number){
. map ( m => ( { id : m . id , name : m . name , label : m . name , deviceCode : m . deviceCode , workshopName : m . workshopName , isOnline : m . isOnline , isEnabled : m . isEnabled } ) )
} catch { /* 接口不可用时保持为空 */ }
}
async function handleSubmit ( ) { submitting . value = true ; try { const ok = await ( workerForm . value ? . validate ? new Promise < boolean > ( ( 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 handleSubmit ( ) { submitting . value = true ; try { const ok = await ( workerForm . value ? . validate ? new Promise < boolean > ( ( 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' , { code : form . code , name : form . name , bindings : form . bindings } ) ; 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 handleBatchDelete ( ) { await ElMessageBox . confirm ( '确定删除选中的' + selectedRows . value . length + '个员工?此操作不可恢复。' , '提示' , { type : 'warning' } ) ; await request . post ( '/admin/worker/batch-delete' , { ids : selectedRows . value . map ( ( r : any ) => r . id ) } ) ; ElMessage . success ( '批量删除成功' ) ; loadData ( ) }