补齐采集地址3个详情子端点(machines/collect-records/raw-json)+修复前端详情页API路径参数 + 新增3个DTO + DI注册

main
haoliang 1 week ago
parent 7052cbf5a1
commit 6fb571f565

@ -68,7 +68,7 @@ const rawJsonTitle = ref('原始采集数据')
async function viewRawJson(record: CollectRecordRow){
// JSON
const id = route.params.id
const resp = await request.get<{ rawJson: string }>('/admin/collect-address/raw-json', { params: { id, recordId: record.requestTime } })
const resp = await request.get<{ rawJson: string }>(`/admin/collect-address/${id}/raw-json`, { params: { recordId: record.requestTime } })
const raw = resp.data?.rawJson ?? '[]'
let parsed: unknown
try { parsed = JSON.parse(raw) } catch { parsed = raw }
@ -80,9 +80,9 @@ async function viewRawJson(record: CollectRecordRow){
async function loadData(){
const id=route.params.id
const [d,m,r] = await Promise.all([
request.get<CollectAddress>('/admin/collect-address/detail', { params: { id } }),
request.get<{ items: CollectMachineRow[] }>('/admin/collect-address/machines', { params: { id } }),
request.get<{ items: CollectRecordRow[] }>('/admin/collect-address/collect-records', { params: { id } }),
request.get<CollectAddress>(`/admin/collect-address/${id}`),
request.get<{ items: CollectMachineRow[] }>(`/admin/collect-address/${id}/machines`),
request.get<{ items: CollectRecordRow[] }>(`/admin/collect-address/${id}/collect-records`),
])
detail.value = d.data ?? ({} as CollectAddress)
machines.value = m.data?.items ?? []

@ -0,0 +1,23 @@
namespace CncModels.Dto.CollectAddress
{
/// <summary>
/// 采集地址下关联机床项
/// </summary>
public class CollectAddressMachineItem
{
/// <summary>机床名称</summary>
public string MachineName { get; set; }
/// <summary>设备编码</summary>
public string DeviceCode { get; set; }
/// <summary>车间名称</summary>
public string WorkshopName { get; set; }
/// <summary>是否在线</summary>
public bool IsOnline { get; set; }
/// <summary>当前NC程序名</summary>
public string ProgramName { get; set; }
}
}

@ -0,0 +1,11 @@
namespace CncModels.Dto.CollectAddress
{
/// <summary>
/// 采集地址原始JSON响应
/// </summary>
public class CollectAddressRawJsonResponse
{
/// <summary>原始JSON字符串</summary>
public string RawJson { get; set; }
}
}

@ -0,0 +1,23 @@
namespace CncModels.Dto.CollectAddress
{
/// <summary>
/// 采集地址采集记录项
/// </summary>
public class CollectAddressRecordItem
{
/// <summary>请求时间</summary>
public string RequestTime { get; set; }
/// <summary>耗时(毫秒)</summary>
public int Duration { get; set; }
/// <summary>是否成功</summary>
public bool IsSuccess { get; set; }
/// <summary>采集到的机床数</summary>
public int MachineCount { get; set; }
/// <summary>机床名称用于原始JSON弹窗标题</summary>
public string MachineName { get; set; }
}
}

@ -1,5 +1,6 @@
using System;
using System.Linq;
using System.Collections.Generic;
using CncModels.Dto;
using CncModels.Dto.CollectAddress;
using CncRepository.Interface;
@ -17,14 +18,20 @@ namespace CncService.Impl
private readonly ICollectAddressRepository _collectAddressRepository;
private readonly IMachineRepository _machineRepository;
private readonly IBrandRepository _brandRepository;
private readonly IWorkshopRepository _workshopRepository;
private readonly ICollectRawRepository _collectRawRepository;
public CollectAddressService(ICollectAddressRepository collectAddressRepository,
IMachineRepository machineRepository,
IBrandRepository brandRepository)
IBrandRepository brandRepository,
IWorkshopRepository workshopRepository,
ICollectRawRepository collectRawRepository)
{
_collectAddressRepository = collectAddressRepository;
_machineRepository = machineRepository;
_brandRepository = brandRepository;
_workshopRepository = workshopRepository;
_collectRawRepository = collectRawRepository;
}
public PagedResult<CollectAddressListItem> GetList(CollectAddressQuery query)
@ -94,5 +101,73 @@ namespace CncService.Impl
{
return _collectAddressRepository.ToggleEnabled(id);
}
/// <inheritdoc/>
public List<CollectAddressMachineItem> GetMachines(int collectAddressId)
{
var machines = _machineRepository.GetEnabledByAddressId(collectAddressId);
var result = new List<CollectAddressMachineItem>();
foreach (var m in machines)
{
string workshopName = null;
if (m.WorkshopId > 0)
{
var workshop = _workshopRepository.GetById(m.WorkshopId);
if (workshop != null) workshopName = workshop.Name;
}
result.Add(new CollectAddressMachineItem
{
MachineName = m.Name ?? m.DeviceCode,
DeviceCode = m.DeviceCode,
WorkshopName = workshopName,
IsOnline = m.IsOnline == 1,
ProgramName = m.LastProgramName
});
}
return result;
}
/// <inheritdoc/>
public List<CollectAddressRecordItem> GetCollectRecords(int collectAddressId)
{
var paged = _collectRawRepository.GetByAddressId(collectAddressId, 1, 20);
var result = new List<CollectAddressRecordItem>();
foreach (var r in paged.Items)
{
result.Add(new CollectAddressRecordItem
{
RequestTime = r.RequestTime.ToString("yyyy-MM-dd HH:mm:ss"),
Duration = r.ResponseDuration ?? 0,
IsSuccess = r.IsSuccess == 1,
MachineCount = 0, // 采集服务运行时从JSON解析得到
MachineName = ""
});
}
return result;
}
/// <inheritdoc/>
public CollectAddressRawJsonResponse GetRawJson(int collectAddressId, string recordId = null)
{
// 优先按 recordId请求时间查找否则取最新一条
CollectRaw raw = null;
if (!string.IsNullOrEmpty(recordId))
{
var paged = _collectRawRepository.GetByAddressId(collectAddressId, 1, 100);
DateTime dt;
if (DateTime.TryParse(recordId, out dt))
{
raw = paged.Items.FirstOrDefault(r => r.RequestTime.ToString("yyyy-MM-dd HH:mm:ss") == recordId);
}
}
if (raw == null)
{
raw = _collectRawRepository.GetLatestByAddressId(collectAddressId);
}
return new CollectAddressRawJsonResponse
{
RawJson = raw?.RawJson ?? "[]"
};
}
}
}

@ -1,3 +1,4 @@
using System.Collections.Generic;
using CncModels.Dto;
using CncModels.Dto.CollectAddress;
namespace CncService.Interface
@ -13,5 +14,20 @@ namespace CncService.Interface
bool Update(int id, UpdateCollectAddressRequest request);
bool Delete(int id);
bool ToggleEnabled(int id);
/// <summary>
/// 获取采集地址下关联机床列表
/// </summary>
List<CollectAddressMachineItem> GetMachines(int collectAddressId);
/// <summary>
/// 获取采集地址近期采集记录
/// </summary>
List<CollectAddressRecordItem> GetCollectRecords(int collectAddressId);
/// <summary>
/// 获取最新原始采集JSON
/// </summary>
CollectAddressRawJsonResponse GetRawJson(int collectAddressId, string recordId = null);
}
}

@ -95,5 +95,41 @@ namespace CncWebApi.Controllers
var result = _collectAddressService.ToggleEnabled(id);
return Ok(ApiResponse<object>.Success(null));
}
/// <summary>
/// 地址下关联机床列表
/// GET /api/admin/collect-address/{id}/machines
/// </summary>
[HttpGet]
[Route("{id:int}/machines")]
public IHttpActionResult GetMachines(int id)
{
var result = _collectAddressService.GetMachines(id);
return Ok(ApiResponse<object>.Success(new { items = result }));
}
/// <summary>
/// 地址近期采集记录
/// GET /api/admin/collect-address/{id}/collect-records
/// </summary>
[HttpGet]
[Route("{id:int}/collect-records")]
public IHttpActionResult GetCollectRecords(int id)
{
var result = _collectAddressService.GetCollectRecords(id);
return Ok(ApiResponse<object>.Success(new { items = result }));
}
/// <summary>
/// 地址最新原始JSON
/// GET /api/admin/collect-address/{id}/raw-json
/// </summary>
[HttpGet]
[Route("{id:int}/raw-json")]
public IHttpActionResult GetRawJson(int id, string recordId = null)
{
var result = _collectAddressService.GetRawJson(id, recordId);
return Ok(ApiResponse<CollectAddressRawJsonResponse>.Success(result));
}
}
}

@ -129,7 +129,9 @@ namespace CncWebApi.Infrastructure
return new CncService.Impl.CollectAddressService(
new CncRepository.Impl.CollectAddressRepository(_businessConn),
new CncRepository.Impl.MachineRepository(_businessConn),
new CncRepository.Impl.BrandRepository(_businessConn));
new CncRepository.Impl.BrandRepository(_businessConn),
new CncRepository.Impl.WorkshopRepository(_businessConn),
new CncRepository.Impl.Log.CollectRawRepository(_logConn));
}
private IWorkerService ResolveWorkerService()

@ -34,7 +34,7 @@ namespace CncService.Tests
// ======== Repository 创建(日志库) ========
private static CollectorHeartbeatRepository NewCollectorHeartbeatRepo() => new CollectorHeartbeatRepository(ConnStrLog);
private static CollectRawRepository NewCollectRawRepo() => new CollectRawRepository(ConnStrLog);
private static CollectRawRepository NewCollectRawRepo() => new CncRepository.Impl.Log.CollectRawRepository(ConnStrLog);
// ======== Service 创建 ========
@ -65,7 +65,7 @@ namespace CncService.Tests
/// <summary>创建CollectAddressService</summary>
public static CollectAddressService CreateCollectAddressService()
{
return new CollectAddressService(NewCollectAddressRepo(), NewMachineRepo(), NewBrandRepo());
return new CollectAddressService(NewCollectAddressRepo(), NewMachineRepo(), NewBrandRepo(), NewWorkshopRepo(), NewCollectRawRepo());
}
/// <summary>创建WorkerService</summary>

@ -41,6 +41,7 @@ namespace CncWebApi.Tests
private static IDashboardRepository DashboardRepo() => new DashboardRepository(_conn);
private static ICollectorHeartbeatRepository HeartbeatRepo() => new CollectorHeartbeatRepository(_conn);
private static ISystemLogRepository SystemLogRepo() => new SystemLogRepository(_conn);
private static ICollectRawRepository CollectRawRepo() => new CncRepository.Impl.Log.CollectRawRepository(_conn);
#endregion
@ -50,7 +51,7 @@ namespace CncWebApi.Tests
private static IDashboardService CreateDashboardService() => new DashboardService(DashboardRepo(), HeartbeatRepo());
private static IMachineService CreateMachineService() => new MachineService(MachineRepo(), CollectAddressRepo(), WorkerMachineRepo(), BrandRepo());
private static IBrandService CreateBrandService() => new BrandService(BrandRepo(), BrandFieldMappingRepo(), CollectAddressRepo());
private static ICollectAddressService CreateCollectAddressService() => new CollectAddressService(CollectAddressRepo(), MachineRepo(), BrandRepo());
private static ICollectAddressService CreateCollectAddressService() => new CollectAddressService(CollectAddressRepo(), MachineRepo(), BrandRepo(), WorkshopRepo(), CollectRawRepo());
private static IWorkerService CreateWorkerService() => new WorkerService(WorkerRepo(), WorkerMachineRepo(), MachineRepo());
private static IProductionService CreateProductionService() => new ProductionService(DailyProductionRepo(), ProductionSegmentRepo(), ProductionAdjustmentRepo());
private static IAlertService CreateAlertService() => new AlertService(AlertRepo());

Loading…
Cancel
Save