worker-shift-fix: Step1-Step4完成——代码修复+拆分员工+重放38647条

main
haoliang 1 month ago
parent 357b89a3fa
commit b0bcc61213

@ -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()}

@ -95,8 +95,9 @@ namespace CncCollector.Core
new
{
r.MachineId,
WorkerId = r.WorkerId,
CollectTime = r.CollectTime,
DeviceTime = r.DeviceTime,
r.DeviceTime,
ProgramName = r.ProgramName ?? (string)null,
PartCount = r.PartCount,
DeviceStatus = r.DeviceStatus ?? (string)null,
@ -232,6 +233,7 @@ namespace CncCollector.Core
new
{
r.MachineId,
WorkerId = r.WorkerId,
CollectTime = r.CollectTime,
r.DeviceTime,
ProgramName = r.ProgramName ?? (string)null,

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Dapper;
using MySqlConnector;
using log4net;
@ -190,7 +191,7 @@ namespace CncCollector.Core
public decimal EndTotalCount { get; set; }
}
private class WorkerMachine { public int WorkerId; public TimeSpan? ShiftStart; public TimeSpan? ShiftEnd; }
private class WorkerMachine { public int WorkerId { get; set; } public TimeSpan? ShiftStart { get; set; } public TimeSpan? ShiftEnd { get; set; } }
public void Dispose() { }
}

@ -12,7 +12,7 @@ namespace CncRepository.Impl
{
public WorkerMachineRepository(string connectionString) : base(connectionString) { }
private const string SelectColumns = @"id as Id, worker_id as WorkerId, machine_id as MachineId, created_at as CreatedAt";
private const string SelectColumns = @"id as Id, worker_id as WorkerId, machine_id as MachineId, shift_start as ShiftStart, shift_end as ShiftEnd, created_at as CreatedAt";
public List<WorkerMachine> GetByMachineId(int machineId)
{

@ -239,8 +239,8 @@ namespace CncService.Impl
var result = new List<WorkerAvailableMachineItem>();
foreach (var m in allMachines)
{
var binding = _workerMachineRepository.GetByMachineId(m.Id);
if (binding == null)
var bindings = _workerMachineRepository.GetByMachineId(m.Id);
if (bindings.Count < 2)
{
result.Add(new WorkerAvailableMachineItem
{

Loading…
Cancel
Save