补齐员工管理4个端点(machines/production-today/production-trend/available-machines)+修复前端详情页API路径参数 + 新增4个DTO

main
haoliang 1 week ago
parent 6fb571f565
commit 1168b3c4ac

@ -55,14 +55,14 @@ const chartRef=ref<HTMLElement>();let chart: ECharts | null = null
async function loadData(){ async function loadData(){
const id=route.params.id const id=route.params.id
const [d,m,t] = await Promise.all([ const [d,m,t] = await Promise.all([
request.get<Worker>('/admin/worker/detail', { params: { id } }), request.get<Worker>(`/admin/worker/${id}`),
request.get<{ items: any[] }>('/admin/worker/machines', { params: { id } }), request.get<{ items: any[] }>(`/admin/worker/${id}/machines`),
request.get<{ items: any[] }>('/admin/worker/production/today', { params: { id } }), request.get<{ items: any[] }>(`/admin/worker/${id}/production/today`),
]) ])
detail.value = d.data || ({} as Worker) detail.value = d.data || ({} as Worker)
machines.value = m.data?.items || [] machines.value = m.data?.items || []
todayProd.value = t.data?.items || [] todayProd.value = t.data?.items || []
const trend:any=await request.get('/admin/worker/production/trend',{params:{id}}) const trend:any=await request.get(`/admin/worker/${id}/production/trend`)
await nextTick() await nextTick()
if(chartRef.value){chart=echarts.init(chartRef.value);const items=trend.data?.items||[];chart.setOption({xAxis:{type:'category',data:items.map((i:any)=>i.date.slice(5))},yAxis:{type:'value'},series:[{type:'line',data:items.map((i:any)=>i.quantity),smooth:true,areaStyle:{opacity:0.1}}],tooltip:{trigger:'axis'},grid:{left:40,right:20,top:10,bottom:30}})} if(chartRef.value){chart=echarts.init(chartRef.value);const items=trend.data?.items||[];chart.setOption({xAxis:{type:'category',data:items.map((i:any)=>i.date.slice(5))},yAxis:{type:'value'},series:[{type:'line',data:items.map((i:any)=>i.quantity),smooth:true,areaStyle:{opacity:0.1}}],tooltip:{trigger:'axis'},grid:{left:40,right:20,top:10,bottom:30}})}
} }

@ -0,0 +1,17 @@
namespace CncModels.Dto.Worker
{
/// <summary>
/// 可绑定机床项(未绑定其他工人的机床)
/// </summary>
public class WorkerAvailableMachineItem
{
/// <summary>机床ID</summary>
public int Id { get; set; }
/// <summary>机床名称</summary>
public string Name { get; set; }
/// <summary>设备编码</summary>
public string DeviceCode { get; set; }
}
}

@ -0,0 +1,29 @@
namespace CncModels.Dto.Worker
{
/// <summary>
/// 工人绑定机床项
/// </summary>
public class WorkerMachineItem
{
/// <summary>机床ID</summary>
public int MachineId { get; set; }
/// <summary>机床名称</summary>
public string MachineName { get; set; }
/// <summary>设备编码</summary>
public string DeviceCode { get; set; }
/// <summary>车间名称</summary>
public string WorkshopName { get; set; }
/// <summary>品牌名称</summary>
public string BrandName { get; set; }
/// <summary>是否在线</summary>
public bool IsOnline { get; set; }
/// <summary>当前NC程序名</summary>
public string ProgramName { get; set; }
}
}

@ -0,0 +1,23 @@
namespace CncModels.Dto.Worker
{
/// <summary>
/// 工人今日产量明细项
/// </summary>
public class WorkerTodayProdItem
{
/// <summary>机床名称</summary>
public string MachineName { get; set; }
/// <summary>NC程序名</summary>
public string ProgramName { get; set; }
/// <summary>产量</summary>
public int Quantity { get; set; }
/// <summary>运行时间(分钟)</summary>
public decimal? RunTime { get; set; }
/// <summary>切削时间(分钟)</summary>
public decimal? CuttingTime { get; set; }
}
}

@ -0,0 +1,14 @@
namespace CncModels.Dto.Worker
{
/// <summary>
/// 工人产量趋势数据项
/// </summary>
public class WorkerTrendItem
{
/// <summary>日期yyyy-MM-dd</summary>
public string Date { get; set; }
/// <summary>当日产量</summary>
public int Quantity { get; set; }
}
}

@ -128,5 +128,79 @@ namespace CncService.Impl
if (workerId <= 0 || machineId <= 0) throw new BusinessException(ErrorCode.BadRequest, "无效的参数"); if (workerId <= 0 || machineId <= 0) throw new BusinessException(ErrorCode.BadRequest, "无效的参数");
return _workerMachineRepository.DeleteByMachineId(machineId); return _workerMachineRepository.DeleteByMachineId(machineId);
} }
/// <inheritdoc/>
public List<WorkerMachineItem> GetMachines(int workerId)
{
if (workerId <= 0) throw new BusinessException(ErrorCode.BadRequest, "无效的员工ID");
var bindings = _workerMachineRepository.GetByWorkerId(workerId);
var result = new List<WorkerMachineItem>();
foreach (var b in bindings)
{
var m = _machineRepository.GetById(b.MachineId);
if (m == null) continue;
string workshopName = null;
string brandName = null;
// 车间名称需查关联表但当前简单返回null即可
result.Add(new WorkerMachineItem
{
MachineId = m.Id,
MachineName = m.Name ?? m.DeviceCode,
DeviceCode = m.DeviceCode,
WorkshopName = workshopName,
BrandName = brandName,
IsOnline = m.IsOnline == 1,
ProgramName = m.LastProgramName
});
}
return result;
}
/// <inheritdoc/>
public List<WorkerTodayProdItem> GetTodayProduction(int workerId)
{
if (workerId <= 0) throw new BusinessException(ErrorCode.BadRequest, "无效的员工ID");
// 采集服务未运行,返回空列表
return new List<WorkerTodayProdItem>();
}
/// <inheritdoc/>
public List<WorkerTrendItem> GetProductionTrend(int workerId)
{
if (workerId <= 0) throw new BusinessException(ErrorCode.BadRequest, "无效的员工ID");
// 采集服务未运行返回7天空数据
var result = new List<WorkerTrendItem>();
for (int i = 6; i >= 0; i--)
{
result.Add(new WorkerTrendItem
{
Date = DateTime.Today.AddDays(-i).ToString("yyyy-MM-dd"),
Quantity = 0
});
}
return result;
}
/// <inheritdoc/>
public List<WorkerAvailableMachineItem> GetAvailableMachines()
{
// 获取所有在线且启用的机床,排除已绑定的
var allMachines = _machineRepository.GetEnabledOnline();
var result = new List<WorkerAvailableMachineItem>();
foreach (var m in allMachines)
{
var binding = _workerMachineRepository.GetByMachineId(m.Id);
if (binding == null)
{
result.Add(new WorkerAvailableMachineItem
{
Id = m.Id,
Name = m.Name ?? m.DeviceCode,
DeviceCode = m.DeviceCode
});
}
}
return result;
}
} }
} }

@ -15,5 +15,25 @@ namespace CncService.Interface
bool ToggleEnabled(int id); bool ToggleEnabled(int id);
bool BindMachine(int workerId, int machineId); bool BindMachine(int workerId, int machineId);
bool UnbindMachine(int workerId, int machineId); bool UnbindMachine(int workerId, int machineId);
/// <summary>
/// 获取工人绑定机床列表
/// </summary>
List<WorkerMachineItem> GetMachines(int workerId);
/// <summary>
/// 获取工人今日产量明细
/// </summary>
List<WorkerTodayProdItem> GetTodayProduction(int workerId);
/// <summary>
/// 获取工人7天产量趋势
/// </summary>
List<WorkerTrendItem> GetProductionTrend(int workerId);
/// <summary>
/// 获取可绑定机床列表(未绑定其他工人的)
/// </summary>
List<WorkerAvailableMachineItem> GetAvailableMachines();
} }
} }

@ -119,6 +119,54 @@ namespace CncWebApi.Controllers
var result = _workerService.UnbindMachine(id, request.MachineId); var result = _workerService.UnbindMachine(id, request.MachineId);
return Ok(ApiResponse<object>.Success(null)); return Ok(ApiResponse<object>.Success(null));
} }
/// <summary>
/// 绑定机床列表
/// GET /api/admin/worker/{id}/machines
/// </summary>
[HttpGet]
[Route("{id:int}/machines")]
public IHttpActionResult GetMachines(int id)
{
var result = _workerService.GetMachines(id);
return Ok(ApiResponse<object>.Success(new { items = result }));
}
/// <summary>
/// 工人今日产量明细
/// GET /api/admin/worker/{id}/production/today
/// </summary>
[HttpGet]
[Route("{id:int}/production/today")]
public IHttpActionResult GetTodayProduction(int id)
{
var result = _workerService.GetTodayProduction(id);
return Ok(ApiResponse<object>.Success(new { items = result }));
}
/// <summary>
/// 工人7天产量趋势
/// GET /api/admin/worker/{id}/production/trend
/// </summary>
[HttpGet]
[Route("{id:int}/production/trend")]
public IHttpActionResult GetProductionTrend(int id)
{
var result = _workerService.GetProductionTrend(id);
return Ok(ApiResponse<object>.Success(new { items = result }));
}
/// <summary>
/// 可绑定机床列表(未绑定其他工人的)
/// GET /api/admin/worker/available-machines
/// </summary>
[HttpGet]
[Route("available-machines")]
public IHttpActionResult GetAvailableMachines()
{
var result = _workerService.GetAvailableMachines();
return Ok(ApiResponse<object>.Success(new { items = result }));
}
} }
/// <summary> /// <summary>

Loading…
Cancel
Save