From 6fb571f56562436fc88aedf30982518aed40ee68 Mon Sep 17 00:00:00 2001 From: haoliang <821644@qq.com> Date: Wed, 29 Apr 2026 04:27:41 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E9=BD=90=E9=87=87=E9=9B=86=E5=9C=B0?= =?UTF-8?q?=E5=9D=803=E4=B8=AA=E8=AF=A6=E6=83=85=E5=AD=90=E7=AB=AF?= =?UTF-8?q?=E7=82=B9=EF=BC=88machines/collect-records/raw-json=EF=BC=89+?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=89=8D=E7=AB=AF=E8=AF=A6=E6=83=85=E9=A1=B5?= =?UTF-8?q?API=E8=B7=AF=E5=BE=84=E5=8F=82=E6=95=B0=20+=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E3=E4=B8=AADTO=20+=20DI=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CollectAddressDetailPage.vue | 8 +- .../CollectAddressMachineItem.cs | 23 ++++++ .../CollectAddressRawJsonResponse.cs | 11 +++ .../CollectAddressRecordItem.cs | 23 ++++++ src/CncService/Impl/CollectAddressService.cs | 77 ++++++++++++++++++- .../Interface/ICollectAddressService.cs | 16 ++++ .../Controllers/CollectAddressController.cs | 36 +++++++++ .../Infrastructure/ServiceResolver.cs | 4 +- tests/CncService.Tests/ServiceFactory.cs | 4 +- tests/CncWebApi.Tests/ControllerFactory.cs | 3 +- 10 files changed, 196 insertions(+), 9 deletions(-) create mode 100644 src/CncModels/Dto/CollectAddress/CollectAddressMachineItem.cs create mode 100644 src/CncModels/Dto/CollectAddress/CollectAddressRawJsonResponse.cs create mode 100644 src/CncModels/Dto/CollectAddress/CollectAddressRecordItem.cs diff --git a/frontend/src/views/collect-address/CollectAddressDetailPage.vue b/frontend/src/views/collect-address/CollectAddressDetailPage.vue index e714bf0..eadc4f9 100644 --- a/frontend/src/views/collect-address/CollectAddressDetailPage.vue +++ b/frontend/src/views/collect-address/CollectAddressDetailPage.vue @@ -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('/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(`/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 ?? [] diff --git a/src/CncModels/Dto/CollectAddress/CollectAddressMachineItem.cs b/src/CncModels/Dto/CollectAddress/CollectAddressMachineItem.cs new file mode 100644 index 0000000..b0df429 --- /dev/null +++ b/src/CncModels/Dto/CollectAddress/CollectAddressMachineItem.cs @@ -0,0 +1,23 @@ +namespace CncModels.Dto.CollectAddress +{ + /// + /// 采集地址下关联机床项 + /// + public class CollectAddressMachineItem + { + /// 机床名称 + public string MachineName { get; set; } + + /// 设备编码 + public string DeviceCode { get; set; } + + /// 车间名称 + public string WorkshopName { get; set; } + + /// 是否在线 + public bool IsOnline { get; set; } + + /// 当前NC程序名 + public string ProgramName { get; set; } + } +} diff --git a/src/CncModels/Dto/CollectAddress/CollectAddressRawJsonResponse.cs b/src/CncModels/Dto/CollectAddress/CollectAddressRawJsonResponse.cs new file mode 100644 index 0000000..cbe6e0f --- /dev/null +++ b/src/CncModels/Dto/CollectAddress/CollectAddressRawJsonResponse.cs @@ -0,0 +1,11 @@ +namespace CncModels.Dto.CollectAddress +{ + /// + /// 采集地址原始JSON响应 + /// + public class CollectAddressRawJsonResponse + { + /// 原始JSON字符串 + public string RawJson { get; set; } + } +} diff --git a/src/CncModels/Dto/CollectAddress/CollectAddressRecordItem.cs b/src/CncModels/Dto/CollectAddress/CollectAddressRecordItem.cs new file mode 100644 index 0000000..66bf75f --- /dev/null +++ b/src/CncModels/Dto/CollectAddress/CollectAddressRecordItem.cs @@ -0,0 +1,23 @@ +namespace CncModels.Dto.CollectAddress +{ + /// + /// 采集地址采集记录项 + /// + public class CollectAddressRecordItem + { + /// 请求时间 + public string RequestTime { get; set; } + + /// 耗时(毫秒) + public int Duration { get; set; } + + /// 是否成功 + public bool IsSuccess { get; set; } + + /// 采集到的机床数 + public int MachineCount { get; set; } + + /// 机床名称(用于原始JSON弹窗标题) + public string MachineName { get; set; } + } +} diff --git a/src/CncService/Impl/CollectAddressService.cs b/src/CncService/Impl/CollectAddressService.cs index 0f94f91..43c0039 100644 --- a/src/CncService/Impl/CollectAddressService.cs +++ b/src/CncService/Impl/CollectAddressService.cs @@ -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 GetList(CollectAddressQuery query) @@ -94,5 +101,73 @@ namespace CncService.Impl { return _collectAddressRepository.ToggleEnabled(id); } + + /// + public List GetMachines(int collectAddressId) + { + var machines = _machineRepository.GetEnabledByAddressId(collectAddressId); + var result = new List(); + 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; + } + + /// + public List GetCollectRecords(int collectAddressId) + { + var paged = _collectRawRepository.GetByAddressId(collectAddressId, 1, 20); + var result = new List(); + 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; + } + + /// + 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 ?? "[]" + }; + } } } diff --git a/src/CncService/Interface/ICollectAddressService.cs b/src/CncService/Interface/ICollectAddressService.cs index ac2b27c..a31e8b3 100644 --- a/src/CncService/Interface/ICollectAddressService.cs +++ b/src/CncService/Interface/ICollectAddressService.cs @@ -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); + + /// + /// 获取采集地址下关联机床列表 + /// + List GetMachines(int collectAddressId); + + /// + /// 获取采集地址近期采集记录 + /// + List GetCollectRecords(int collectAddressId); + + /// + /// 获取最新原始采集JSON + /// + CollectAddressRawJsonResponse GetRawJson(int collectAddressId, string recordId = null); } } diff --git a/src/CncWebApi/Controllers/CollectAddressController.cs b/src/CncWebApi/Controllers/CollectAddressController.cs index 3736096..328f744 100644 --- a/src/CncWebApi/Controllers/CollectAddressController.cs +++ b/src/CncWebApi/Controllers/CollectAddressController.cs @@ -95,5 +95,41 @@ namespace CncWebApi.Controllers var result = _collectAddressService.ToggleEnabled(id); return Ok(ApiResponse.Success(null)); } + + /// + /// 地址下关联机床列表 + /// GET /api/admin/collect-address/{id}/machines + /// + [HttpGet] + [Route("{id:int}/machines")] + public IHttpActionResult GetMachines(int id) + { + var result = _collectAddressService.GetMachines(id); + return Ok(ApiResponse.Success(new { items = result })); + } + + /// + /// 地址近期采集记录 + /// GET /api/admin/collect-address/{id}/collect-records + /// + [HttpGet] + [Route("{id:int}/collect-records")] + public IHttpActionResult GetCollectRecords(int id) + { + var result = _collectAddressService.GetCollectRecords(id); + return Ok(ApiResponse.Success(new { items = result })); + } + + /// + /// 地址最新原始JSON + /// GET /api/admin/collect-address/{id}/raw-json + /// + [HttpGet] + [Route("{id:int}/raw-json")] + public IHttpActionResult GetRawJson(int id, string recordId = null) + { + var result = _collectAddressService.GetRawJson(id, recordId); + return Ok(ApiResponse.Success(result)); + } } } diff --git a/src/CncWebApi/Infrastructure/ServiceResolver.cs b/src/CncWebApi/Infrastructure/ServiceResolver.cs index f6968cb..2cf7cb3 100644 --- a/src/CncWebApi/Infrastructure/ServiceResolver.cs +++ b/src/CncWebApi/Infrastructure/ServiceResolver.cs @@ -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() diff --git a/tests/CncService.Tests/ServiceFactory.cs b/tests/CncService.Tests/ServiceFactory.cs index a30a2aa..1847ba4 100644 --- a/tests/CncService.Tests/ServiceFactory.cs +++ b/tests/CncService.Tests/ServiceFactory.cs @@ -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 /// 创建CollectAddressService public static CollectAddressService CreateCollectAddressService() { - return new CollectAddressService(NewCollectAddressRepo(), NewMachineRepo(), NewBrandRepo()); + return new CollectAddressService(NewCollectAddressRepo(), NewMachineRepo(), NewBrandRepo(), NewWorkshopRepo(), NewCollectRawRepo()); } /// 创建WorkerService diff --git a/tests/CncWebApi.Tests/ControllerFactory.cs b/tests/CncWebApi.Tests/ControllerFactory.cs index ff3e1e7..dd3717a 100644 --- a/tests/CncWebApi.Tests/ControllerFactory.cs +++ b/tests/CncWebApi.Tests/ControllerFactory.cs @@ -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());