using System; using System.Linq; using System.Collections.Generic; using CncModels.Dto; using CncModels.Dto.CollectAddress; using CncRepository.Interface; using CncService.Interface; using CncService; using CncModels.Entity; namespace CncService.Impl { /// /// 采集地址实现 /// public class CollectAddressService : ICollectAddressService { 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, IWorkshopRepository workshopRepository, ICollectRawRepository collectRawRepository) { _collectAddressRepository = collectAddressRepository; _machineRepository = machineRepository; _brandRepository = brandRepository; _workshopRepository = workshopRepository; _collectRawRepository = collectRawRepository; } public PagedResult GetList(CollectAddressQuery query) { return _collectAddressRepository.GetList(query); } public CollectAddressDetailResponse GetById(int id) { var detail = _collectAddressRepository.GetById(id); if (detail == null) throw new BusinessException(CncModels.Constants.ErrorCode.NotFound, "采集地址不存在"); string brandName = null; var brand = _brandRepository.GetById(detail.BrandId); if (brand != null) brandName = brand.BrandName; // 直接映射到输出 DTO return new CollectAddressDetailResponse { Id = detail.Id, Name = detail.Name, Url = detail.Url, BrandId = detail.BrandId, BrandName = brandName, CollectInterval = detail.CollectInterval, IsEnabled = detail.IsEnabled == 1 }; } public int Create(CreateCollectAddressRequest request) { if (request == null) throw new CncService.BusinessException(CncModels.Constants.ErrorCode.BadRequest, "请求参数错误"); if (_brandRepository.GetById(request.BrandId) == null) throw new CncService.BusinessException(CncModels.Constants.ErrorCode.NotFound, "品牌不存在"); var entity = new CollectAddress { Name = request.Name, Url = request.Url, BrandId = request.BrandId, CollectInterval = request.CollectInterval, IsEnabled = 1, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now }; var id = _collectAddressRepository.Create(entity); // 绑定机床 if (request.MachineIds != null) { foreach (var mid in request.MachineIds) { _machineRepository.SetCollectAddress(mid, id); } } return id; } public bool Update(int id, UpdateCollectAddressRequest request) { var address = _collectAddressRepository.GetById(id); if (address == null) throw new CncService.BusinessException(CncModels.Constants.ErrorCode.NotFound, "采集地址不存在"); if (request == null) throw new CncService.BusinessException(CncModels.Constants.ErrorCode.BadRequest, "请求参数错误"); address.Name = request.Name ?? address.Name; address.Url = request.Url ?? address.Url; address.BrandId = (request.BrandId != 0) ? request.BrandId : address.BrandId; address.CollectInterval = (request.CollectInterval != 0) ? request.CollectInterval : address.CollectInterval; address.UpdatedAt = DateTime.Now; _collectAddressRepository.Update(address); // 全量替换机床关联 if (request.MachineIds != null) { // 先清除该地址下所有机床的关联 var currentMachines = _machineRepository.GetEnabledByAddressId(id); foreach (var m in currentMachines) { _machineRepository.SetCollectAddress(m.Id, null); } // 再绑定新选中的机床 foreach (var mid in request.MachineIds) { _machineRepository.SetCollectAddress(mid, id); } } return true; } public bool Delete(int id) { // 检查关联机床数量 if (_collectAddressRepository.GetMachineCount(id) > 0) return false; return _collectAddressRepository.Delete(id); } public bool ToggleEnabled(int id) { 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 { MachineId = m.Id, 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 ?? "[]" }; } } }