You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
haoliang-net/src/CncService/Impl/BrandService.cs

173 lines
6.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using CncModels.Dto.Brand;
using CncModels.Entity;
using CncRepository.Interface;
using CncService.Interface;
using CncService;
using CncModels.Constants;
namespace CncService.Impl
{
/// <summary>
/// 品牌模板实现
/// </summary>
public class BrandService : IBrandService
{
private readonly IBrandRepository _brandRepository;
private readonly IBrandFieldMappingRepository _mappingRepository;
private readonly ICollectAddressRepository _collectAddressRepository;
public BrandService(IBrandRepository brandRepository,
IBrandFieldMappingRepository mappingRepository,
ICollectAddressRepository collectAddressRepository)
{
_brandRepository = brandRepository;
_mappingRepository = mappingRepository;
_collectAddressRepository = collectAddressRepository;
}
public List<BrandListItem> GetList()
{
var brands = _brandRepository.GetAll();
return brands.Select(b => new BrandListItem
{
Id = b.Id,
BrandName = b.BrandName,
DeviceField = b.DeviceField,
TagsPath = b.TagsPath,
IsEnabled = b.IsEnabled,
FieldCount = _brandRepository.GetFieldMappingCount(b.Id)
}).ToList();
}
public BrandDetailResponse GetById(int id)
{
var brand = _brandRepository.GetById(id);
if (brand == null) throw new BusinessException(ErrorCode.NotFound, "品牌不存在");
var mappings = _mappingRepository.GetByBrandId(id);
var detail = new BrandDetailResponse
{
Id = brand.Id,
BrandName = brand.BrandName,
DeviceField = brand.DeviceField,
TagsPath = brand.TagsPath,
IsEnabled = brand.IsEnabled,
FieldCount = mappings?.Count ?? 0,
Mappings = mappings?.Select(m => new BrandFieldMappingDto
{
StandardField = m.StandardField,
FieldName = m.FieldName,
MatchBy = m.MatchBy,
DataType = m.DataType,
IsRequired = m.IsRequired
}).ToList() ?? new List<BrandFieldMappingDto>()
};
return detail;
}
public int Create(CreateBrandRequest request)
{
if (request == null) throw new BusinessException(ErrorCode.BadRequest, "请求参数错误");
// 验证唯一性
if (_brandRepository.GetAll().Any(b => string.Equals(b.BrandName, request.BrandName, StringComparison.OrdinalIgnoreCase)))
{
throw new BusinessException(ErrorCode.Conflict, "品牌名称已存在");
}
var entity = new Brand
{
BrandName = request.BrandName,
DeviceField = request.DeviceField,
TagsPath = request.TagsPath,
IsEnabled = 1,
CreatedAt = DateTime.Now,
UpdatedAt = DateTime.Now
};
return _brandRepository.Create(entity);
}
public bool Update(int id, UpdateBrandRequest request)
{
var brand = _brandRepository.GetById(id);
if (brand == null) throw new BusinessException(ErrorCode.NotFound, "品牌不存在");
if (request == null) throw new BusinessException(ErrorCode.BadRequest, "请求参数错误");
brand.BrandName = request.BrandName ?? brand.BrandName;
brand.DeviceField = request.DeviceField ?? brand.DeviceField;
brand.TagsPath = request.TagsPath ?? brand.TagsPath;
brand.UpdatedAt = DateTime.Now;
return _brandRepository.Update(brand);
}
public bool Delete(int id)
{
var brand = _brandRepository.GetById(id);
if (brand == null) throw new BusinessException(ErrorCode.NotFound, "品牌不存在");
// 删除前检查是否有关联的采集地址
var countCollectAddress = _collectAddressRepository.GetList(new CncModels.Dto.CollectAddress.CollectAddressQuery { BrandId = id }).Total;
if (countCollectAddress > 0) return false;
return _brandRepository.Delete(id);
}
public bool ToggleEnabled(int id)
{
return _brandRepository.ToggleEnabled(id);
}
public int Copy(int id)
{
var brand = _brandRepository.GetById(id);
if (brand == null) throw new BusinessException(ErrorCode.NotFound, "品牌不存在");
var newBrand = new Brand
{
BrandName = brand.BrandName + "_Copy",
DeviceField = brand.DeviceField,
TagsPath = brand.TagsPath,
IsEnabled = brand.IsEnabled,
CreatedAt = DateTime.Now,
};
int newBrandId = _brandRepository.Create(newBrand);
// 复制字段映射
var mappings = _mappingRepository.GetByBrandId(id);
if (mappings != null && mappings.Count > 0)
{
var newMappings = mappings.Select(m => new BrandFieldMapping
{
BrandId = newBrandId,
StandardField = m.StandardField,
FieldName = m.FieldName,
MatchBy = m.MatchBy,
DataType = m.DataType,
IsRequired = m.IsRequired,
CreatedAt = DateTime.Now
}).ToList();
_mappingRepository.BatchCreate(newBrandId, newMappings);
}
return newBrandId;
}
public List<StandardFieldResponse> GetStandardFields()
{
// 硬编码的16个标准字段示例
var list = new List<StandardFieldResponse>();
for (int i = 1; i <= 16; i++)
{
list.Add(new StandardFieldResponse
{
StandardField = $"Field{i}",
Description = $"标准字段描述{i}"
});
}
return list;
}
}
}