From b500d1c6bdd6e8fa70d34e6964cc8daaa390a4ec Mon Sep 17 00:00:00 2001 From: Tyke Chen <190473011+chentyke@users.noreply.github.com> Date: Mon, 20 Jul 2026 11:59:24 +0800 Subject: [PATCH] fix(manager-api): avoid duplicate address book insert mapping --- .../device/dao/DeviceAddressBookDao.java | 7 ++- .../impl/DeviceAddressBookServiceImpl.java | 2 +- .../mapper/device/DeviceAddressBookDao.xml | 4 +- .../DeviceAddressBookServiceImplTest.java | 46 +++++++++++++++++++ 4 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 main/manager-api/src/test/java/xiaozhi/modules/device/service/impl/DeviceAddressBookServiceImplTest.java diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/dao/DeviceAddressBookDao.java b/main/manager-api/src/main/java/xiaozhi/modules/device/dao/DeviceAddressBookDao.java index c6ead166..fc7d6428 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/dao/DeviceAddressBookDao.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/dao/DeviceAddressBookDao.java @@ -12,6 +12,11 @@ import xiaozhi.modules.device.entity.DeviceAddressBookEntity; @Mapper public interface DeviceAddressBookDao extends BaseMapper { + /** + * 新增设备通讯录记录 + */ + int insertAddressBook(DeviceAddressBookEntity entity); + /** * 获取设备通讯录列表 */ @@ -31,4 +36,4 @@ public interface DeviceAddressBookDao extends BaseMapper macAddresses); -} \ No newline at end of file +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceAddressBookServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceAddressBookServiceImpl.java index 8b6ce468..ff2e4317 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceAddressBookServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceAddressBookServiceImpl.java @@ -167,7 +167,7 @@ public class DeviceAddressBookServiceImpl implements DeviceAddressBookService { alias = generateUniqueAlias(macAddress, targetMac, alias); entity.setAlias(alias); entity.setHasPermission(hasPermission); - deviceAddressBookDao.insert(entity); + deviceAddressBookDao.insertAddressBook(entity); } else { if (alias != null) { updateAlias(macAddress, targetMac, alias); diff --git a/main/manager-api/src/main/resources/mapper/device/DeviceAddressBookDao.xml b/main/manager-api/src/main/resources/mapper/device/DeviceAddressBookDao.xml index 9a74946f..2601f60e 100644 --- a/main/manager-api/src/main/resources/mapper/device/DeviceAddressBookDao.xml +++ b/main/manager-api/src/main/resources/mapper/device/DeviceAddressBookDao.xml @@ -21,7 +21,7 @@ WHERE mac_address = #{macAddress} AND target_mac = #{targetMac} - + INSERT INTO ai_device_address_book (mac_address, target_mac, alias, has_permission, creator, create_date, updater, update_date) VALUES (#{macAddress}, #{targetMac}, #{alias}, #{hasPermission}, #{creator}, NOW(), #{updater}, NOW()) @@ -36,4 +36,4 @@ #{mac} - \ No newline at end of file + diff --git a/main/manager-api/src/test/java/xiaozhi/modules/device/service/impl/DeviceAddressBookServiceImplTest.java b/main/manager-api/src/test/java/xiaozhi/modules/device/service/impl/DeviceAddressBookServiceImplTest.java new file mode 100644 index 00000000..69ae3b6d --- /dev/null +++ b/main/manager-api/src/test/java/xiaozhi/modules/device/service/impl/DeviceAddressBookServiceImplTest.java @@ -0,0 +1,46 @@ +package xiaozhi.modules.device.service.impl; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; + +import xiaozhi.common.redis.RedisUtils; +import xiaozhi.modules.device.dao.DeviceAddressBookDao; +import xiaozhi.modules.device.entity.DeviceAddressBookEntity; +import xiaozhi.modules.device.service.DeviceService; +import xiaozhi.modules.sys.service.SysParamsService; + +class DeviceAddressBookServiceImplTest { + + @Test + void newEntryUsesTheDedicatedAddressBookInsertMapping() { + DeviceAddressBookDao addressBookDao = mock(DeviceAddressBookDao.class); + RedisUtils redisUtils = mock(RedisUtils.class); + DeviceService deviceService = mock(DeviceService.class); + SysParamsService sysParamsService = mock(SysParamsService.class); + DeviceAddressBookServiceImpl service = new DeviceAddressBookServiceImpl( + addressBookDao, redisUtils, deviceService, sysParamsService); + when(addressBookDao.selectOne(any())).thenReturn(null); + when(addressBookDao.selectList(null)).thenReturn(List.of()); + + service.saveOrUpdate("00:11:22:33:44:55", "00:11:22:33:44:66", "living-room", true); + + ArgumentCaptor entityCaptor = ArgumentCaptor.forClass(DeviceAddressBookEntity.class); + verify(addressBookDao).insertAddressBook(entityCaptor.capture()); + DeviceAddressBookEntity entity = entityCaptor.getValue(); + assertEquals("00:11:22:33:44:55", entity.getMacAddress()); + assertEquals("00:11:22:33:44:66", entity.getTargetMac()); + assertEquals("living-room", entity.getAlias()); + assertTrue(entity.getHasPermission()); + verify(addressBookDao, never()).insert(any(DeviceAddressBookEntity.class)); + } +}