删除设备模板时检查和删除区域主控时检查

This commit is contained in:
2025-11-03 17:11:51 +08:00
parent f569876225
commit f0b71b47a0
7 changed files with 274 additions and 43 deletions

View File

@@ -12,8 +12,16 @@ import (
"git.huangwc.com/pig/pig-farm-controller/internal/infra/repository"
)
// ErrDeviceInUse 表示设备正在被任务使用,无法删除
var ErrDeviceInUse = errors.New("设备正在被一个或多个任务使用,无法删除")
var (
// ErrDeviceInUse 表示设备正在被任务使用,无法删除
ErrDeviceInUse = errors.New("设备正在被一个或多个任务使用,无法删除")
// ErrAreaControllerInUse 表示区域主控正在被设备使用,无法删除
ErrAreaControllerInUse = errors.New("区域主控正在被一个或多个设备使用,无法删除")
// ErrDeviceTemplateInUse 表示设备模板正在被设备使用,无法删除
ErrDeviceTemplateInUse = errors.New("设备模板正在被一个或多个设备使用,无法删除")
)
// DeviceService 定义了应用层的设备服务接口,用于协调设备相关的业务逻辑。
type DeviceService interface {
@@ -272,15 +280,27 @@ func (s *deviceService) UpdateAreaController(id string, req *dto.UpdateAreaContr
func (s *deviceService) DeleteAreaController(id string) error {
idUint, err := strconv.ParseUint(id, 10, 64)
if err != nil {
return err
return fmt.Errorf("无效的ID格式: %w", err)
}
acID := uint(idUint)
_, err = s.areaControllerRepo.FindByID(uint(idUint))
// 1. 检查是否存在
_, err = s.areaControllerRepo.FindByID(acID)
if err != nil {
return err
return err // 如果未找到gorm会返回 ErrRecordNotFound
}
return s.areaControllerRepo.Delete(uint(idUint))
// 2. 检查是否被使用(业务逻辑)
inUse, err := s.deviceRepo.IsAreaControllerInUse(acID)
if err != nil {
return err // 返回数据库检查错误
}
if inUse {
return ErrAreaControllerInUse // 返回业务错误
}
// 3. 执行删除
return s.areaControllerRepo.Delete(acID)
}
// --- Device Templates ---
@@ -378,13 +398,25 @@ func (s *deviceService) UpdateDeviceTemplate(id string, req *dto.UpdateDeviceTem
func (s *deviceService) DeleteDeviceTemplate(id string) error {
idUint, err := strconv.ParseUint(id, 10, 64)
if err != nil {
return err
return fmt.Errorf("无效的ID格式: %w", err)
}
dtID := uint(idUint)
_, err = s.deviceTemplateRepo.FindByID(uint(idUint))
// 1. 检查是否存在
_, err = s.deviceTemplateRepo.FindByID(dtID)
if err != nil {
return err
}
return s.deviceTemplateRepo.Delete(uint(idUint))
// 2. 检查是否被使用(业务逻辑)
inUse, err := s.deviceTemplateRepo.IsInUse(dtID)
if err != nil {
return err
}
if inUse {
return ErrDeviceTemplateInUse // 返回业务错误
}
// 3. 执行删除
return s.deviceTemplateRepo.Delete(dtID)
}