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 ?? "[]"
};
}
}
}