diff --git a/.gitignore b/.gitignore index e6cef14..cb37afc 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ target/ .idea/modules.xml .idea/jarRepositories.xml .idea/compiler.xml +.idea/workspace.xml .idea/libraries/ *.iws *.iml @@ -41,4 +42,5 @@ build/ /logs .idea/* + *.log \ No newline at end of file diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysDeviceModelController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysDeviceModelController.java index e9796eb..13d9bbd 100644 --- a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysDeviceModelController.java +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysDeviceModelController.java @@ -3,37 +3,20 @@ package com.maibu.web.controller.system; import cn.hutool.core.convert.Convert; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.maibu.annotation.Log; -import com.maibu.core.business.Device; -import com.maibu.core.business.DeviceModel;import com.maibu.core.business.DeviceRunStatistics; +import com.maibu.core.business.DeviceModel; import com.maibu.core.controller.BaseController; import com.maibu.core.domain.AjaxResult; import com.maibu.core.enums.ConnectType; import com.maibu.core.page.TableDataInfo; import com.maibu.enums.BusinessType; -import com.maibu.mapper.DeviceRunStatisticsMapper; -import com.maibu.mybatis.LambdaQueryWrapperX; -import com.maibu.service.IDeviceService; -import com.maibu.service.SysDeviceModelService; +import com.maibu.service.impl.SysDeviceModelService; import com.maibu.utils.ServletUtils; -import com.maibu.utils.StringUtils; -import com.maibu.utils.poi.ExcelUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.collections4.CollectionUtils; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletResponse; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysIotCommDeviceController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysIotCommDeviceController.java index 0336d1e..fdb5159 100644 --- a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysIotCommDeviceController.java +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysIotCommDeviceController.java @@ -1,25 +1,19 @@ package com.maibu.web.controller.system; import cn.hutool.core.convert.Convert; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.maibu.core.business.IoTCommonDevice; -import com.maibu.core.business.Product; import com.maibu.core.business.dto.DeviceConfigDTO; -import com.maibu.core.business.dto.ProductDTO; import com.maibu.core.controller.BaseController; import com.maibu.core.domain.AjaxResult; import com.maibu.core.page.TableDataInfo; import com.maibu.memory.GlobalMemory; -import com.maibu.service.DeviceProductService; -import com.maibu.service.IotDeviceCommonService; +import com.maibu.service.impl.IotDeviceCommonService; import com.maibu.utils.ServletUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -84,10 +78,11 @@ public class SysIotCommDeviceController extends BaseController { /** * 删除设备 */ - @DeleteMapping("/{id}") + @PostMapping("/delete") @ApiOperation("删除设备") - public AjaxResult remove(@PathVariable Long id) { - return toAjax(deviceService.removeById(id) ? 1 : 0); + public AjaxResult remove(@RequestBody List ids) { + deviceService.removeByIds(ids); + return AjaxResult.success(); } @@ -119,4 +114,5 @@ public class SysIotCommDeviceController extends BaseController { return AjaxResult.success("缓存更新成功"); } + } diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysProductController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysProductController.java index 4340d27..6d996f9 100644 --- a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysProductController.java +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysProductController.java @@ -1,25 +1,16 @@ package com.maibu.web.controller.system; -import cn.hutool.core.convert.Convert; -import com.maibu.core.business.DeviceModel; import com.maibu.core.business.Product; import com.maibu.core.business.dto.ProductDTO; import com.maibu.core.controller.BaseController; import com.maibu.core.domain.AjaxResult; import com.maibu.core.page.TableDataInfo; -import com.maibu.service.DeviceProductService; -import com.maibu.service.SysDeviceModelService; -import com.maibu.utils.ServletUtils; +import com.maibu.service.impl.DeviceProductService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.commons.collections4.CollectionUtils; -import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import java.time.LocalDateTime; import java.util.List; /** @@ -39,92 +30,30 @@ public class SysProductController extends BaseController { @GetMapping("/list") @ApiOperation("查询产品列表") public TableDataInfo list(ProductDTO productDTO) { - Integer pageNum = Convert.toInt(ServletUtils.getParameter("pageNum"), 1); - Integer pageSize = Convert.toInt(ServletUtils.getParameter("pageSize"), 10); - - Page page = new Page<>(pageNum, pageSize); - - // DTO 转 Entity 用于查询筛选 - Product product = new Product(); - BeanUtils.copyProperties(productDTO, product); - - Page resultPage = productService.selectProductPage(page, product); - return getDataTable(resultPage.getRecords(), resultPage.getTotal()); + List resultPage = productService.selectProductPage(productDTO); + return getDataTable(resultPage); } /** - * 新增产品 + * 新增产品/修改 */ //@PreAuthorize("@ss.hasPermi('iot:product:add')") - @PostMapping("/add") + @PostMapping("/save") @ApiOperation("新增产品") - public AjaxResult add(@RequestBody ProductDTO productDTO) { - if (productDTO.getName() == null || productDTO.getName().isEmpty()) { - return AjaxResult.error("产品名称不能为空"); - } - if (productDTO.getCode() == null || productDTO.getCode().isEmpty()) { - return AjaxResult.error("产品编码不能为空"); - } - - // 检查编码是否重复 - Product existProduct = productService.selectByCode(productDTO.getCode()); - if (existProduct != null) { - return AjaxResult.error("产品编码已存在"); - } - - // DTO 转 Entity - Product product = new Product(); - BeanUtils.copyProperties(productDTO, product); - product.setCreateTime(LocalDateTime.now()); - product.setDelFlag(false); - - boolean success = productService.save(product); - return toAjax(success ? 1 : 0); + public AjaxResult add(@RequestBody Product product) { + return AjaxResult.success(productService.save(product)); } - /** - * 修改产品 - */ - @PostMapping("/update") - @ApiOperation("修改产品") - public AjaxResult edit(@RequestBody ProductDTO productDTO) { - if (productDTO.getId() == null) { - return AjaxResult.error("产品 ID 不能为空"); - } - - Product existProduct = productService.getById(productDTO.getId()); - if (existProduct == null) { - return AjaxResult.error("产品不存在"); - } - - // 如果修改了编码,检查是否重复 - if (productDTO.getCode() != null && !productDTO.getCode().equals(existProduct.getCode())) { - Product duplicate = productService.selectByCode(productDTO.getCode()); - if (duplicate != null) { - return AjaxResult.error("产品编码已存在"); - } - } - - // DTO 转 Entity - Product product = new Product(); - BeanUtils.copyProperties(productDTO, product); - product.setUpdateTime(LocalDateTime.now()); - - boolean success = productService.updateById(product); - return toAjax(success ? 1 : 0); - } /** * 删除产品 */ //@PreAuthorize("@ss.hasPermi('iot:product:remove')") - @DeleteMapping("delete/{id}") + @PostMapping("delete") @ApiOperation("删除产品") - public AjaxResult remove(@PathVariable Long id) { - boolean success = productService.removeById(id); - return toAjax(success ? 1 : 0); + public AjaxResult remove(@RequestBody List ids) { + return AjaxResult.success(productService.removeByIds(ids)); } - } diff --git a/maibu-common/src/main/java/com/maibu/config/DeviceTask.java b/maibu-common/src/main/java/com/maibu/config/DeviceTask.java index 53660a5..f100037 100644 --- a/maibu-common/src/main/java/com/maibu/config/DeviceTask.java +++ b/maibu-common/src/main/java/com/maibu/config/DeviceTask.java @@ -102,6 +102,11 @@ public class DeviceTask { return builder(FastBeeConstant.TASK.DEVICE_TASK_HANDLER); } + @Bean(FastBeeConstant.TASK.COMMON_DEVICE_MONITOR) + public Executor commonDeviceMonitor() { + return builder(FastBeeConstant.TASK.COMMON_DEVICE_MONITOR); + } + /*组装线程池*/ private ThreadPoolTaskExecutor builder(String threadNamePrefix) { diff --git a/maibu-common/src/main/java/com/maibu/constant/FastBeeConstant.java b/maibu-common/src/main/java/com/maibu/constant/FastBeeConstant.java index 0b53109..8e215bb 100644 --- a/maibu-common/src/main/java/com/maibu/constant/FastBeeConstant.java +++ b/maibu-common/src/main/java/com/maibu/constant/FastBeeConstant.java @@ -105,6 +105,11 @@ public interface FastBeeConstant { */ String DEVICE_TASK_HANDLER = "deviceTaskHandler"; + /** + * 其他设备接入 数据状态 + */ + String COMMON_DEVICE_MONITOR = "commonDeviceMonitor"; + } interface MQTT { diff --git a/maibu-common/src/main/java/com/maibu/core/business/dto/ProductDTO.java b/maibu-common/src/main/java/com/maibu/core/business/dto/ProductDTO.java index 6ebab07..5ec5371 100644 --- a/maibu-common/src/main/java/com/maibu/core/business/dto/ProductDTO.java +++ b/maibu-common/src/main/java/com/maibu/core/business/dto/ProductDTO.java @@ -3,49 +3,40 @@ package com.maibu.core.business.dto; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.maibu.core.business.ProductInterface; -import com.maibu.core.domain.BaseDO; +import com.maibu.core.domain.BaseEntity; import lombok.Data; -import lombok.EqualsAndHashCode; -import java.util.List; import java.util.Map; - @Data -public class ProductDTO extends BaseDO { - private static final long serialVersionUID = 1L; +public class ProductDTO extends BaseEntity { + private static final long serialVersionUID = 1L; - @TableId(type = IdType.AUTO) - private Long id; + @TableId(type = IdType.AUTO) + private Long id; - private String code; + private String code; - private String name; + private String name; - private String manufacturer; + private String manufacturer; - private Long categoryId; + private Long categoryId; - private String protocolCode; + private String protocolCode; - private String transport; + private String transport; - private String uploadTopic; - - private String subscribeTopic; - - private Integer status; - - @TableField(typeHandler = JacksonTypeHandler.class) - private Map thingsModels; + private String uploadTopic; + private String subscribeTopic; + private Integer status; + @TableField(typeHandler = JacksonTypeHandler.class) + private Map thingsModels; } diff --git a/maibu-common/src/main/java/com/maibu/memory/SiteMemory.java b/maibu-common/src/main/java/com/maibu/memory/SiteMemory.java index ea3f56f..666b329 100644 --- a/maibu-common/src/main/java/com/maibu/memory/SiteMemory.java +++ b/maibu-common/src/main/java/com/maibu/memory/SiteMemory.java @@ -56,12 +56,36 @@ public class SiteMemory { deviceMap.put(device.getSerialNumber(), device); } - public static void removeDevice(String deviceId) { + public void removeDevice(String deviceId) { if (!StringUtils.isEmpty(deviceId)) { deviceMap.remove(deviceId); } } + public void saveCommonDevice(IoTCommonDevice device) { + commonDeviceMap.put(device.getSn(), device); + } + + public IoTCommonDevice getCommonDevice(String sn) { + if (!StringUtils.isEmpty(sn)) { + return commonDeviceMap.get(sn); + } + return null; + } + + public List getAllCommonDevice() { + if (!CollectionUtils.isEmpty(commonDeviceMap)) { + return (List) commonDeviceMap.values(); + } + return null; + } + + public void removeCommonDevice(String sn) { + if (!StringUtils.isEmpty(sn)) { + commonDeviceMap.remove(sn); + } + } + public void saveDeviceRunParam(DeviceRunParam deviceRunParam) { deviceRunParamMap.put(deviceRunParam.getDeviceId(), deviceRunParam); } @@ -90,7 +114,7 @@ public class SiteMemory { // 替换已存在的记录,兼容后续保存 int index = -1; for (int i = 0; i < list.size(); i++) { - if (Objects.equals(list.get(i).getErrorCode(), errorIdentificationStandard.getErrorCode())){ + if (Objects.equals(list.get(i).getErrorCode(), errorIdentificationStandard.getErrorCode())) { index = i; break; } diff --git a/maibu-netty-server/src/main/java/com/maibu/init/InitThread.java b/maibu-netty-server/src/main/java/com/maibu/init/InitThread.java index e6bf684..565a168 100644 --- a/maibu-netty-server/src/main/java/com/maibu/init/InitThread.java +++ b/maibu-netty-server/src/main/java/com/maibu/init/InitThread.java @@ -7,6 +7,7 @@ import java.util.concurrent.Executor; import javax.annotation.Resource; +import com.maibu.service.impl.IotDeviceCommonService; import org.eclipse.paho.client.mqttv3.MqttException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; @@ -49,6 +50,9 @@ public class InitThread implements ApplicationRunner { @Resource(name = FastBeeConstant.TASK.DEVICE_ERROR_MONITOR) private Executor deviceErrorMonitorExecutor; + @Resource(name = FastBeeConstant.TASK.COMMON_DEVICE_MONITOR) + private Executor commonDeviceMonitorExecutor; + @Resource(name = FastBeeConstant.TASK.DEVICE_TASK_HANDLER) private Executor deviceTaskHandlerExecutor; @@ -76,6 +80,9 @@ public class InitThread implements ApplicationRunner { @Autowired private AlarmOrderConfigMapper alarmOrderConfigMapper; + @Autowired + private IotDeviceCommonService commonService; + @Value("${influxdb.url}") private String influxDBUrl; @@ -138,6 +145,9 @@ public class InitThread implements ApplicationRunner { throw new RuntimeException(e); } }); + commonDeviceMonitorExecutor.execute(() -> { + commonService.commonDeviceMonitor(); + }); } /** diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/mapper/DeviceProductMapper.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/mapper/DeviceProductMapper.java index a4bbf9c..b3b9118 100644 --- a/maibu-service/maibu-system-service/src/main/java/com/maibu/mapper/DeviceProductMapper.java +++ b/maibu-service/maibu-system-service/src/main/java/com/maibu/mapper/DeviceProductMapper.java @@ -1,18 +1,13 @@ package com.maibu.mapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.maibu.core.business.Product; +import com.maibu.mybatis.mapper.BaseMapperX; import org.apache.ibatis.annotations.Mapper; -/** - * @author jsmbz - * @description 针对表【device_product(产品表)】的数据库操作Mapper - * @createDate 2026-05-08 13:45:57 - * @Entity abbc.domain.DeviceProduct - */ + @Mapper -public interface DeviceProductMapper extends BaseMapper { +public interface DeviceProductMapper extends BaseMapperX { } diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/mapper/IotDeviceCommonMapper.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/mapper/IotDeviceCommonMapper.java index f4700bc..4bb4199 100644 --- a/maibu-service/maibu-system-service/src/main/java/com/maibu/mapper/IotDeviceCommonMapper.java +++ b/maibu-service/maibu-system-service/src/main/java/com/maibu/mapper/IotDeviceCommonMapper.java @@ -1,15 +1,10 @@ package com.maibu.mapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.maibu.core.business.IoTCommonDevice; +import com.maibu.mybatis.mapper.BaseMapperX; -/** - * @author jsmbz - * @description 针对表【iot_device_common(通用设备表)】的数据库操作Mapper - * @createDate 2026-05-09 14:38:50 - * @Entity abbc.domain.IotDeviceCommon - */ -public interface IotDeviceCommonMapper extends BaseMapper { + +public interface IotDeviceCommonMapper extends BaseMapperX { } diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/DeviceProductInterfaceService.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/DeviceProductInterfaceService.java deleted file mode 100644 index cca3b39..0000000 --- a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/DeviceProductInterfaceService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.maibu.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.maibu.core.business.ProductInterface; - -/** - * @author jsmbz - * @description 针对表【device_product_interface(产品接口表)】的数据库操作Service - * @createDate 2026-05-08 15:37:53 - */ -public interface DeviceProductInterfaceService extends IService { - -} diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/DeviceProductService.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/DeviceProductService.java deleted file mode 100644 index 2861047..0000000 --- a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/DeviceProductService.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.maibu.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.maibu.core.business.Product; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -/** - * @author jsmbz - * @description 针对表【device_product(产品表)】的数据库操作Service - * @createDate 2026-05-08 13:45:57 - */ -public interface DeviceProductService extends IService { - - - - /** - * 分页查询产品列表 - */ - Page selectProductPage(Page page, Product product); - - /** - * 根据编码查询产品 - */ - Product selectByCode(String code); - - - - /** - * 新增产品(含接口表入库) - */ - boolean insertProduct(Product product); - /** - * 修改产品(含接口表入库) - */ - boolean updateProduct(Product product); - - -} diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/IotDeviceCommonService.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/IotDeviceCommonService.java deleted file mode 100644 index ce6eb10..0000000 --- a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/IotDeviceCommonService.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.maibu.service; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.IService; -import com.maibu.core.business.IoTCommonDevice; -import com.maibu.core.business.dto.DeviceConfigDTO; - -import java.util.List; - -/** - * @author jsmbz - * @description 针对表【iot_device_common(通用设备表)】的数据库操作Service - * @createDate 2026-05-09 14:38:50 - */ -public interface IotDeviceCommonService extends IService { - - - /** - * 设备录入:连接测试成功后放入未注册缓存 - */ - void addDeviceToUnRegisterCache(DeviceConfigDTO deviceDTO) throws Exception; - - /** - * 查询未注册设备列表 - */ - List getUnRegisterDevices(); - - /** - * 分页查询已注册设备列表 - */ - Page selectDevicePage(Page page, IoTCommonDevice device); - - /** - * 根据 SN 查询设备 - */ - IoTCommonDevice getBySn(String sn); - - /** - * 从未注册缓存注册到组织/场站,并落库 - */ - void registerDevice(Long deviceId, Long orgId, Long siteId); - - /** - * 编辑设备 - * @param deviceDTO - * @return - */ - - boolean updateDevice(DeviceConfigDTO deviceDTO); - - /** - * - * @param sn - * @return - */ - IoTCommonDevice getFromUnRegisterCache(String sn); - - /** - * - * @param cacheDevice - */ - void updateUnRegisterCache(IoTCommonDevice cacheDevice); -} diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/SysDeviceActionService.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/SysDeviceActionService.java deleted file mode 100644 index 34b2cb2..0000000 --- a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/SysDeviceActionService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.maibu.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.maibu.core.business.DeviceAction; - -/** - * @author jsmbz - * @description 针对表【iot_device_action(设备动作定义表)】的数据库操作Service - * @createDate 2026-05-07 12:33:48 - */ -public interface SysDeviceActionService extends IService { - -} diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/SysDeviceModelPropertyMappingService.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/SysDeviceModelPropertyMappingService.java deleted file mode 100644 index 350941f..0000000 --- a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/SysDeviceModelPropertyMappingService.java +++ /dev/null @@ -1 +0,0 @@ -package com.maibu.service; import com.baomidou.mybatisplus.extension.service.IService; import com.maibu.core.business.DeviceModelPropertyMapping; /** * @author jsmbz * @description 针对表【iot_device_model_property_mapping(设备模型属性映射表)】的数据库操作Service * @createDate 2026-05-07 12:33:48 */ public interface SysDeviceModelPropertyMappingService extends IService { } \ No newline at end of file diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/SysDeviceModelService.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/SysDeviceModelService.java deleted file mode 100644 index 78a6743..0000000 --- a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/SysDeviceModelService.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.maibu.service; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.maibu.core.business.DeviceModel; - -/** - * @author jsmbz - * @description 针对表【iot_device_model(设备模型表)】的数据库操作Service - * @createDate 2026-05-07 11:36:11 - */ -public interface SysDeviceModelService { - /** - * 新增设备模型 - * - * @param deviceModel - * @return - */ - int insertDeviceModel(DeviceModel deviceModel); - - /** - * 分页查询设备模型列表 - * - * @param page 分页对象 - * @param deviceModel 查询条件 - * @return 分页结果 - */ - Page selectDeviceModelPage(Page page, DeviceModel deviceModel); - - /** - * selectDeviceModelById - * - * @param id - * @return - */ - DeviceModel selectDeviceModelById(Long id); - - /** - * updateDeviceModel - * - * @param deviceModel - * @return - */ - int updateDeviceModel(DeviceModel deviceModel); - - /** - * 删除(逻辑删除模型) - * - * @param id - * @return - */ - int deleteDeviceModelById(Long id); -} diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/SysDevicePropertyService.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/SysDevicePropertyService.java deleted file mode 100644 index dd6b55a..0000000 --- a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/SysDevicePropertyService.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.maibu.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.maibu.core.business.DeviceModelProperty; - -import java.util.List; - -/** - * @author jsmbz - * @description 针对表【iot_device_property(设备属性定义表)】的数据库操作Service - * @createDate 2026-05-07 12:33:48 - */ -public interface SysDevicePropertyService extends IService { - - /** - * - * @param id - * @return - */ - List selectByModelId(Long id); -} diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/DeviceProductInterfaceService.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/DeviceProductInterfaceService.java new file mode 100644 index 0000000..9e1db48 --- /dev/null +++ b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/DeviceProductInterfaceService.java @@ -0,0 +1,9 @@ +package com.maibu.service.impl; + +import org.springframework.stereotype.Service; + + +@Service +public class DeviceProductInterfaceService { + +} diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/DeviceProductInterfaceServiceImpl.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/DeviceProductInterfaceServiceImpl.java deleted file mode 100644 index 9e87286..0000000 --- a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/DeviceProductInterfaceServiceImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.maibu.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.maibu.core.business.ProductInterface; -import com.maibu.mapper.DeviceProductInterfaceMapper; -import com.maibu.service.DeviceProductInterfaceService; -import org.springframework.stereotype.Service; - -/** - * @author jsmbz - * @description 针对表【device_product_interface(产品接口表)】的数据库操作Service实现 - * @createDate 2026-05-08 15:37:53 - */ -@Service -public class DeviceProductInterfaceServiceImpl extends ServiceImpl - implements DeviceProductInterfaceService { - -} diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/DeviceProductServiceImpl.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/DeviceProductService.java similarity index 91% rename from maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/DeviceProductServiceImpl.java rename to maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/DeviceProductService.java index 0995dff..0b3d7ec 100644 --- a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/DeviceProductServiceImpl.java +++ b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/DeviceProductService.java @@ -2,14 +2,12 @@ package com.maibu.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.maibu.core.business.Product; import com.maibu.core.business.ProductInterface; +import com.maibu.core.business.dto.ProductDTO; import com.maibu.exception.ServiceException; import com.maibu.mapper.DeviceProductInterfaceMapper; import com.maibu.mapper.DeviceProductMapper; -import com.maibu.service.DeviceProductService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,8 +26,7 @@ import java.util.stream.Collectors; * @createDate 2026-05-08 13:45:57 */ @Service -public class DeviceProductServiceImpl extends ServiceImpl - implements DeviceProductService { +public class DeviceProductService { @@ -41,8 +38,12 @@ public class DeviceProductServiceImpl extends ServiceImpl selectProductPage(Page page, Product product) { + + public boolean save(Product product){ + return productMapper.saveOrUpdate(product); + } + + public List selectProductPage(ProductDTO product) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); // 精确查询产品编码 @@ -57,7 +58,7 @@ public class DeviceProductServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Product::getCode, code) .eq(Product::getDelFlag, 0); - return this.getOne(wrapper); + return productMapper.selectOne(wrapper); } - @Override + @Transactional(rollbackFor = Exception.class) public boolean insertProduct(Product product) { // 1. 插入产品主表 @@ -108,7 +109,7 @@ public class DeviceProductServiceImpl extends ServiceImpl ids) { + if (CollectionUtils.isEmpty(ids)) return 0; + return productMapper.deleteBatchIds(ids); + } } diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/IotDeviceCommonServiceImpl.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/IotDeviceCommonService.java similarity index 86% rename from maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/IotDeviceCommonServiceImpl.java rename to maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/IotDeviceCommonService.java index c04b4ac..0a0888f 100644 --- a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/IotDeviceCommonServiceImpl.java +++ b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/IotDeviceCommonService.java @@ -2,16 +2,17 @@ package com.maibu.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.maibu.core.business.IoTCommonDevice; import com.maibu.core.business.dto.DeviceConfigDTO; +import com.maibu.core.enums.ConnectType; import com.maibu.mapper.IotDeviceCommonMapper; import com.maibu.memory.GlobalMemory; -import com.maibu.service.IotDeviceCommonService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import java.time.LocalDateTime; import java.util.ArrayList; @@ -24,11 +25,12 @@ import java.util.List; */ @Slf4j @Service -public class IotDeviceCommonServiceImpl extends ServiceImpl - implements IotDeviceCommonService { +public class IotDeviceCommonService { - @Override + @Autowired + private IotDeviceCommonMapper iotDeviceCommonMapper; + public void addDeviceToUnRegisterCache(DeviceConfigDTO deviceDTO) throws Exception { // 1. 检查 SN 是否已存在(缓存 + 数据库) if (GlobalMemory.unRegisterCommonDeviceMap.containsKey(deviceDTO.getSn())) { @@ -64,12 +66,12 @@ public class IotDeviceCommonServiceImpl extends ServiceImpl getUnRegisterDevices() { return new ArrayList<>(GlobalMemory.unRegisterCommonDeviceMap.values()); } - @Override + public Page selectDevicePage(Page page, IoTCommonDevice device) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); @@ -88,18 +90,18 @@ public class IotDeviceCommonServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); wrapper.eq(IoTCommonDevice::getDeviceId, sn) .eq(IoTCommonDevice::getDelFlag, false); - return this.getOne(wrapper); + return iotDeviceCommonMapper.selectOne(wrapper); } - @Override + @Transactional(rollbackFor = Exception.class) public void registerDevice(Long deviceId, Long orgId, Long siteId) { // TODO: 从未注册缓存取出设备,绑定组织/场站,落库 @@ -107,12 +109,10 @@ public class IotDeviceCommonServiceImpl extends ServiceImpl ids) { + if (CollectionUtils.isEmpty(ids)) return; + iotDeviceCommonMapper.deleteBatchIds(ids); + + } + + + public void commonDeviceMonitor() { + //先初始化 外部设备连接 + GlobalMemory.getAllSiteMemory().forEach(x -> { + List list = x.getAllCommonDevice(); + if (!CollectionUtils.isEmpty(list)) { + list.forEach(y -> { + if (ConnectType.MQTT.equals(y.getConnectType())) { + String ip = y.getNetworkIp(); + Integer port = y.getPort(); + } + }); + } + }); + } } diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysConfigServiceImpl.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysConfigServiceImpl.java index 7f9161d..94be618 100644 --- a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysConfigServiceImpl.java +++ b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysConfigServiceImpl.java @@ -1,12 +1,10 @@ package com.maibu.service.impl; -import com.maibu.annotation.DataSource; import com.maibu.constant.CacheConstants; import com.maibu.constant.UserConstants; import com.maibu.core.redis.RedisCache; import com.maibu.core.text.Convert; import com.maibu.domain.SysConfig; -import com.maibu.enums.DataSourceType; import com.maibu.exception.ServiceException; import com.maibu.mapper.SysConfigMapper; import com.maibu.service.ISysConfigService; diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceActionService.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceActionService.java new file mode 100644 index 0000000..bb47795 --- /dev/null +++ b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceActionService.java @@ -0,0 +1 @@ +package com.maibu.service.impl; import org.springframework.stereotype.Service; /** * @author jsmbz * @description 针对表【iot_device_action(设备动作定义表)】的数据库操作Service实现 * @createDate 2026-05-07 12:33:48 */ @Service public class SysDeviceActionService { } \ No newline at end of file diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceActionServiceImpl.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceActionServiceImpl.java deleted file mode 100644 index 5628a6e..0000000 --- a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceActionServiceImpl.java +++ /dev/null @@ -1 +0,0 @@ -package com.maibu.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.maibu.core.business.DeviceAction; import com.maibu.mapper.SysDeviceActionMapper; import com.maibu.service.SysDeviceActionService; import org.springframework.stereotype.Service; /** * @author jsmbz * @description 针对表【iot_device_action(设备动作定义表)】的数据库操作Service实现 * @createDate 2026-05-07 12:33:48 */ @Service public class SysDeviceActionServiceImpl extends ServiceImpl implements SysDeviceActionService { } \ No newline at end of file diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceModelPropertyMappingService.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceModelPropertyMappingService.java new file mode 100644 index 0000000..bb0b630 --- /dev/null +++ b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceModelPropertyMappingService.java @@ -0,0 +1,13 @@ +package com.maibu.service.impl; + +import org.springframework.stereotype.Service; + +/** + * @author jsmbz + * @description 针对表【iot_device_model_property_mapping(设备模型属性映射表)】的数据库操作Service实现 + * @createDate 2026-05-07 12:33:48 + */ +@Service +public class SysDeviceModelPropertyMappingService { + +} diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceModelPropertyMappingServiceImpl.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceModelPropertyMappingServiceImpl.java deleted file mode 100644 index dbdd0cd..0000000 --- a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceModelPropertyMappingServiceImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.maibu.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.maibu.core.business.DeviceModelPropertyMapping; -import com.maibu.mapper.SysDeviceModelPropertyMappingMapper; -import com.maibu.service.SysDeviceModelPropertyMappingService; -import org.springframework.stereotype.Service; - -/** - * @author jsmbz - * @description 针对表【iot_device_model_property_mapping(设备模型属性映射表)】的数据库操作Service实现 - * @createDate 2026-05-07 12:33:48 - */ -@Service -public class SysDeviceModelPropertyMappingServiceImpl extends ServiceImpl - implements SysDeviceModelPropertyMappingService { - -} diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceModelService.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceModelService.java new file mode 100644 index 0000000..93d8ebb --- /dev/null +++ b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceModelService.java @@ -0,0 +1 @@ +package com.maibu.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.maibu.core.business.DeviceAction; import com.maibu.core.business.DeviceModel; import com.maibu.core.business.DeviceModelProperty; import com.maibu.exception.ServiceException; import com.maibu.mapper.SysDeviceActionMapper; import com.maibu.mapper.SysDeviceModelMapper; import com.maibu.mapper.SysDevicePropertyMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; /** * @author jsmbz * @description 针对表【iot_device_model(设备模型表)】的数据库操作Service实现 * @createDate 2026-05-07 11:36:11 */ @Service public class SysDeviceModelService { @Autowired private SysDeviceModelMapper deviceModelMapper; @Autowired private SysDeviceActionMapper actionMapper; @Autowired private SysDevicePropertyMapper propertyMapper; @Transactional(rollbackFor = Exception.class) // ⭐ 关键 public int insertDeviceModel(DeviceModel deviceModel) { // 1. 插入模型主表 deviceModel.setCreateTime(LocalDateTime.now()); deviceModel.setDelFlag(false); int rows = deviceModelMapper.insert(deviceModel); if (rows <= 0) { throw new ServiceException("模型创建失败"); } Long modelId = deviceModel.getId(); // 2. 插入属性列表 if (!CollectionUtils.isEmpty(deviceModel.getSupportProperties())) { LocalDateTime now = LocalDateTime.now(); for (DeviceModelProperty prop : deviceModel.getSupportProperties()) { prop.setModelId(modelId); prop.setCreateTime(now); prop.setDelFlag(false); propertyMapper.insert(prop); } } // 3. 插入动作列表 if (!CollectionUtils.isEmpty(deviceModel.getSupportActions())) { LocalDateTime now = LocalDateTime.now(); for (DeviceAction action : deviceModel.getSupportActions()) { action.setModelId(modelId); action.setCreateTime(now); action.setDelFlag(false); actionMapper.insert(action); } } return 1; } public Page selectDeviceModelPage(Page page, DeviceModel deviceModel) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); if (deviceModel.getName() != null && !deviceModel.getName().isEmpty()) { wrapper.like(DeviceModel::getName, deviceModel.getName()); } if (deviceModel.getConnectType() != null) { wrapper.eq(DeviceModel::getConnectType, deviceModel.getConnectType()); } if (deviceModel.getDeviceType() != null) { wrapper.eq(DeviceModel::getDeviceType, deviceModel.getDeviceType()); } wrapper.eq(DeviceModel::getDelFlag, false); wrapper.orderByDesc(DeviceModel::getCreateTime); Page resultPage = deviceModelMapper.selectPage(page, wrapper); if (!CollectionUtils.isEmpty(resultPage.getRecords())) { resultPage.getRecords().forEach(model -> { List properties = propertyMapper.selectList( new LambdaQueryWrapper() .eq(DeviceModelProperty::getModelId, model.getId()) .eq(DeviceModelProperty::getDelFlag, false) .orderByAsc(DeviceModelProperty::getId) ); model.setSupportProperties(properties); List actions = actionMapper.selectList( new LambdaQueryWrapper() .eq(DeviceAction::getModelId, model.getId()) .eq(DeviceAction::getDelFlag, false) .orderByAsc(DeviceAction::getId) ); model.setSupportActions(actions); }); } return resultPage; } public DeviceModel selectDeviceModelById(Long id) { // 1. 查主表 DeviceModel model = deviceModelMapper.selectById(id); if (model == null) return null; // 2. 查属性 List properties = propertyMapper.selectList( new LambdaQueryWrapper() .eq(DeviceModelProperty::getModelId, id) .eq(DeviceModelProperty::getDelFlag, false) ); model.setSupportProperties(properties); // 3. 查动作 List actions = actionMapper.selectList( new LambdaQueryWrapper() .eq(DeviceAction::getModelId, id) .eq(DeviceAction::getDelFlag, false) ); model.setSupportActions(actions); return model; } @Transactional(rollbackFor = Exception.class) public int updateDeviceModel(DeviceModel deviceModel) { // 1. 更新模型主表 deviceModel.setUpdateTime(LocalDateTime.now()); deviceModelMapper.updateById(deviceModel); Long modelId = deviceModel.getId(); // 2. 处理属性列表(按 property_key 精准更新) if (deviceModel.getSupportProperties() != null) { // 2.1 查询数据库已有的所有属性 List existingProperties = propertyMapper.selectList( new LambdaQueryWrapper() .eq(DeviceModelProperty::getModelId, modelId) ); // 2.2 构建已有属性的 property_key → ID 映射 java.util.Map existingKeyMap = existingProperties.stream() .collect(Collectors.toMap(DeviceModelProperty::getPropertyKey, DeviceModelProperty::getId)); // 2.3 收集前端传来的所有 property_key java.util.Set receivedKeys = deviceModel.getSupportProperties().stream() .map(DeviceModelProperty::getPropertyKey) .collect(Collectors.toSet()); LocalDateTime now = LocalDateTime.now(); // 2.4 处理前端传来的属性:有 ID 则更新,无 ID 则新增 for (DeviceModelProperty prop : deviceModel.getSupportProperties()) { Long existingId = existingKeyMap.get(prop.getPropertyKey()); if (prop.getId() != null && prop.getId() > 0) { // 前端传了 ID → 执行 UPDATE prop.setUpdateTime(now); propertyMapper.updateById(prop); } else if (existingId != null) { // 前端没传 ID,但数据库有该 property_key → 用已有 ID 执行 UPDATE prop.setId(existingId); prop.setUpdateTime(now); propertyMapper.updateById(prop); } else { // 全新的 property_key → 执行 INSERT prop.setModelId(modelId); prop.setCreateTime(now); prop.setUpdateTime(now); prop.setDelFlag(false); propertyMapper.insert(prop); } } // 2.5 删除前端没传的属性(数据库有,但前端没传的) List toDeleteIds = existingProperties.stream() .filter(prop -> !receivedKeys.contains(prop.getPropertyKey())) .map(DeviceModelProperty::getId) .collect(Collectors.toList()); if (!toDeleteIds.isEmpty()) { propertyMapper.deleteBatchIds(toDeleteIds); } } // 3. 处理动作列表(同理,按 action_id 精准更新) if (deviceModel.getSupportActions() != null) { List existingActions = actionMapper.selectList( new LambdaQueryWrapper() .eq(DeviceAction::getModelId, modelId) ); java.util.Map existingActionMap = existingActions.stream() .collect(Collectors.toMap(DeviceAction::getActionId, DeviceAction::getId)); java.util.Set receivedActionIds = deviceModel.getSupportActions().stream() .map(DeviceAction::getActionId) .collect(Collectors.toSet()); LocalDateTime now = LocalDateTime.now(); for (DeviceAction action : deviceModel.getSupportActions()) { Long existingId = existingActionMap.get(action.getActionId()); if (action.getId() != null && action.getId() > 0) { action.setUpdateTime(now); actionMapper.updateById(action); } else if (existingId != null) { action.setId(existingId); action.setUpdateTime(now); actionMapper.updateById(action); } else { action.setModelId(modelId); action.setCreateTime(now); action.setUpdateTime(now); action.setDelFlag(false); actionMapper.insert(action); } } List toDeleteActionIds = existingActions.stream() .filter(action -> !receivedActionIds.contains(action.getActionId())) .map(DeviceAction::getId) .collect(Collectors.toList()); if (!toDeleteActionIds.isEmpty()) { actionMapper.deleteBatchIds(toDeleteActionIds); } } return 1; } @Transactional(rollbackFor = Exception.class) public int deleteDeviceModelById(Long id) { // 1. 检查模型是否存在 DeviceModel model = deviceModelMapper.selectById(id); if (model == null) { throw new ServiceException("模型不存在"); } // 2. 逻辑删除模型主表(使用 MyBatis-Plus 内置方法自动处理逻辑删除) int success = deviceModelMapper.deleteById(id); if (success != 1) { throw new ServiceException("模型删除失败"); } // 3. 逻辑删除关联的属性(使用 deleteById 自动处理逻辑删除) List properties = propertyMapper.selectList( new LambdaQueryWrapper() .eq(DeviceModelProperty::getModelId, id) ); if (!CollectionUtils.isEmpty(properties)) { for (DeviceModelProperty prop : properties) { propertyMapper.deleteById(prop.getId()); } } // 4. 逻辑删除关联的动作(使用 deleteById 自动处理逻辑删除) List actions = actionMapper.selectList( new LambdaQueryWrapper() .eq(DeviceAction::getModelId, id) ); if (!CollectionUtils.isEmpty(actions)) { for (DeviceAction action : actions) { actionMapper.deleteById(action.getId()); } } return 1; } } \ No newline at end of file diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceModelServiceImpl.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceModelServiceImpl.java deleted file mode 100644 index 801fa9a..0000000 --- a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDeviceModelServiceImpl.java +++ /dev/null @@ -1 +0,0 @@ -package com.maibu.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.maibu.core.business.DeviceAction; import com.maibu.core.business.DeviceModel; import com.maibu.core.business.DeviceModelProperty; import com.maibu.exception.ServiceException; import com.maibu.mapper.SysDeviceActionMapper; import com.maibu.mapper.SysDeviceModelMapper; import com.maibu.mapper.SysDevicePropertyMapper; import com.maibu.service.SysDeviceModelService; import com.maibu.service.SysDevicePropertyService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.time.LocalDateTime; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; /** * @author jsmbz * @description 针对表【iot_device_model(设备模型表)】的数据库操作Service实现 * @createDate 2026-05-07 11:36:11 */ @Service public class SysDeviceModelServiceImpl extends ServiceImpl implements SysDeviceModelService { @Autowired private SysDeviceModelMapper deviceModelMapper; @Autowired private SysDeviceActionMapper actionMapper; @Autowired private SysDevicePropertyMapper propertyMapper; @Override @Transactional(rollbackFor = Exception.class) // ⭐ 关键 public int insertDeviceModel(DeviceModel deviceModel) { // 1. 插入模型主表 deviceModel.setCreateTime(LocalDateTime.now()); deviceModel.setDelFlag(false); int rows = deviceModelMapper.insert(deviceModel); if (rows <= 0) { throw new ServiceException("模型创建失败"); } Long modelId = deviceModel.getId(); // 2. 插入属性列表 if (!CollectionUtils.isEmpty(deviceModel.getSupportProperties())) { LocalDateTime now = LocalDateTime.now(); for (DeviceModelProperty prop : deviceModel.getSupportProperties()) { prop.setModelId(modelId); prop.setCreateTime(now); prop.setDelFlag(false); propertyMapper.insert(prop); } } // 3. 插入动作列表 if (!CollectionUtils.isEmpty(deviceModel.getSupportActions())) { LocalDateTime now = LocalDateTime.now(); for (DeviceAction action : deviceModel.getSupportActions()) { action.setModelId(modelId); action.setCreateTime(now); action.setDelFlag(false); actionMapper.insert(action); } } return 1; } @Override public Page selectDeviceModelPage(Page page, DeviceModel deviceModel) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); if (deviceModel.getName() != null && !deviceModel.getName().isEmpty()) { wrapper.like(DeviceModel::getName, deviceModel.getName()); } if (deviceModel.getConnectType() != null) { wrapper.eq(DeviceModel::getConnectType, deviceModel.getConnectType()); } if (deviceModel.getDeviceType() != null) { wrapper.eq(DeviceModel::getDeviceType, deviceModel.getDeviceType()); } wrapper.eq(DeviceModel::getDelFlag, false); wrapper.orderByDesc(DeviceModel::getCreateTime); Page resultPage = deviceModelMapper.selectPage(page, wrapper); if (!CollectionUtils.isEmpty(resultPage.getRecords())) { resultPage.getRecords().forEach(model -> { List properties = propertyMapper.selectList( new LambdaQueryWrapper() .eq(DeviceModelProperty::getModelId, model.getId()) .eq(DeviceModelProperty::getDelFlag, false) .orderByAsc(DeviceModelProperty::getId) ); model.setSupportProperties(properties); List actions = actionMapper.selectList( new LambdaQueryWrapper() .eq(DeviceAction::getModelId, model.getId()) .eq(DeviceAction::getDelFlag, false) .orderByAsc(DeviceAction::getId) ); model.setSupportActions(actions); }); } return resultPage; } @Override public DeviceModel selectDeviceModelById(Long id) { // 1. 查主表 DeviceModel model = deviceModelMapper.selectById(id); if (model == null) return null; // 2. 查属性 List properties = propertyMapper.selectList( new LambdaQueryWrapper() .eq(DeviceModelProperty::getModelId, id) .eq(DeviceModelProperty::getDelFlag, false) ); model.setSupportProperties(properties); // 3. 查动作 List actions = actionMapper.selectList( new LambdaQueryWrapper() .eq(DeviceAction::getModelId, id) .eq(DeviceAction::getDelFlag, false) ); model.setSupportActions(actions); return model; } @Override @Transactional(rollbackFor = Exception.class) public int updateDeviceModel(DeviceModel deviceModel) { // 1. 更新模型主表 deviceModel.setUpdateTime(LocalDateTime.now()); deviceModelMapper.updateById(deviceModel); Long modelId = deviceModel.getId(); // 2. 处理属性列表(按 property_key 精准更新) if (deviceModel.getSupportProperties() != null) { // 2.1 查询数据库已有的所有属性 List existingProperties = propertyMapper.selectList( new LambdaQueryWrapper() .eq(DeviceModelProperty::getModelId, modelId) ); // 2.2 构建已有属性的 property_key → ID 映射 java.util.Map existingKeyMap = existingProperties.stream() .collect(Collectors.toMap(DeviceModelProperty::getPropertyKey, DeviceModelProperty::getId)); // 2.3 收集前端传来的所有 property_key java.util.Set receivedKeys = deviceModel.getSupportProperties().stream() .map(DeviceModelProperty::getPropertyKey) .collect(Collectors.toSet()); LocalDateTime now = LocalDateTime.now(); // 2.4 处理前端传来的属性:有 ID 则更新,无 ID 则新增 for (DeviceModelProperty prop : deviceModel.getSupportProperties()) { Long existingId = existingKeyMap.get(prop.getPropertyKey()); if (prop.getId() != null && prop.getId() > 0) { // 前端传了 ID → 执行 UPDATE prop.setUpdateTime(now); propertyMapper.updateById(prop); } else if (existingId != null) { // 前端没传 ID,但数据库有该 property_key → 用已有 ID 执行 UPDATE prop.setId(existingId); prop.setUpdateTime(now); propertyMapper.updateById(prop); } else { // 全新的 property_key → 执行 INSERT prop.setModelId(modelId); prop.setCreateTime(now); prop.setUpdateTime(now); prop.setDelFlag(false); propertyMapper.insert(prop); } } // 2.5 删除前端没传的属性(数据库有,但前端没传的) List toDeleteIds = existingProperties.stream() .filter(prop -> !receivedKeys.contains(prop.getPropertyKey())) .map(DeviceModelProperty::getId) .collect(Collectors.toList()); if (!toDeleteIds.isEmpty()) { propertyMapper.deleteBatchIds(toDeleteIds); } } // 3. 处理动作列表(同理,按 action_id 精准更新) if (deviceModel.getSupportActions() != null) { List existingActions = actionMapper.selectList( new LambdaQueryWrapper() .eq(DeviceAction::getModelId, modelId) ); java.util.Map existingActionMap = existingActions.stream() .collect(Collectors.toMap(DeviceAction::getActionId, DeviceAction::getId)); java.util.Set receivedActionIds = deviceModel.getSupportActions().stream() .map(DeviceAction::getActionId) .collect(Collectors.toSet()); LocalDateTime now = LocalDateTime.now(); for (DeviceAction action : deviceModel.getSupportActions()) { Long existingId = existingActionMap.get(action.getActionId()); if (action.getId() != null && action.getId() > 0) { action.setUpdateTime(now); actionMapper.updateById(action); } else if (existingId != null) { action.setId(existingId); action.setUpdateTime(now); actionMapper.updateById(action); } else { action.setModelId(modelId); action.setCreateTime(now); action.setUpdateTime(now); action.setDelFlag(false); actionMapper.insert(action); } } List toDeleteActionIds = existingActions.stream() .filter(action -> !receivedActionIds.contains(action.getActionId())) .map(DeviceAction::getId) .collect(Collectors.toList()); if (!toDeleteActionIds.isEmpty()) { actionMapper.deleteBatchIds(toDeleteActionIds); } } return 1; } @Override @Transactional(rollbackFor = Exception.class) public int deleteDeviceModelById(Long id) { // 1. 检查模型是否存在 DeviceModel model = deviceModelMapper.selectById(id); if (model == null) { throw new ServiceException("模型不存在"); } // 2. 逻辑删除模型主表(使用 MyBatis-Plus 内置方法自动处理逻辑删除) boolean success = this.removeById(id); if (!success) { throw new ServiceException("模型删除失败"); } // 3. 逻辑删除关联的属性(使用 deleteById 自动处理逻辑删除) List properties = propertyMapper.selectList( new LambdaQueryWrapper() .eq(DeviceModelProperty::getModelId, id) ); if (!CollectionUtils.isEmpty(properties)) { for (DeviceModelProperty prop : properties) { propertyMapper.deleteById(prop.getId()); } } // 4. 逻辑删除关联的动作(使用 deleteById 自动处理逻辑删除) List actions = actionMapper.selectList( new LambdaQueryWrapper() .eq(DeviceAction::getModelId, id) ); if (!CollectionUtils.isEmpty(actions)) { for (DeviceAction action : actions) { actionMapper.deleteById(action.getId()); } } return 1; } } \ No newline at end of file diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDevicePropertyService.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDevicePropertyService.java new file mode 100644 index 0000000..9dc5e97 --- /dev/null +++ b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDevicePropertyService.java @@ -0,0 +1 @@ +package com.maibu.service.impl; import com.maibu.core.business.DeviceModelProperty; import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; /** * @author jsmbz * @description 针对表【iot_device_property(设备属性定义表)】的数据库操作Service实现 * @createDate 2026-05-07 12:33:48 */ @Service public class SysDevicePropertyService { public List selectByModelId(Long id) { return Collections.emptyList(); } } \ No newline at end of file diff --git a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDevicePropertyServiceImpl.java b/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDevicePropertyServiceImpl.java deleted file mode 100644 index 73b7005..0000000 --- a/maibu-service/maibu-system-service/src/main/java/com/maibu/service/impl/SysDevicePropertyServiceImpl.java +++ /dev/null @@ -1 +0,0 @@ -package com.maibu.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.maibu.core.business.DeviceModelProperty; import com.maibu.mapper.SysDevicePropertyMapper; import com.maibu.service.SysDevicePropertyService; import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; /** * @author jsmbz * @description 针对表【iot_device_property(设备属性定义表)】的数据库操作Service实现 * @createDate 2026-05-07 12:33:48 */ @Service public class SysDevicePropertyServiceImpl extends ServiceImpl implements SysDevicePropertyService { @Override public List selectByModelId(Long id) { return Collections.emptyList(); } } \ No newline at end of file