【代码评审】IOT:物模型的 review

This commit is contained in:
YunaiV 2024-09-16 20:00:47 +08:00
parent 2932314ee0
commit c0e2bdbdd4
4 changed files with 46 additions and 45 deletions

View File

@ -13,7 +13,7 @@ import java.util.Set;
/** /**
* 基于 MyBatis Plus 多租户的功能实现 DB 层面的多租户的功能 * 基于 MyBatis Plus 多租户的功能实现 DB 层面的多租户的功能
* *
* @author 芋道源码 * @author
*/ */
public class TenantDatabaseInterceptor implements TenantLineHandler { public class TenantDatabaseInterceptor implements TenantLineHandler {

View File

@ -1,7 +1,6 @@
package cn.iocoder.yudao.module.iot.dal.mysql.thinkmodelfunction; package cn.iocoder.yudao.module.iot.dal.mysql.thinkmodelfunction;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.iot.dal.dataobject.thinkmodelfunction.IotThinkModelFunctionDO; import cn.iocoder.yudao.module.iot.dal.dataobject.thinkmodelfunction.IotThinkModelFunctionDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@ -16,16 +15,17 @@ import java.util.List;
public interface IotThinkModelFunctionMapper extends BaseMapperX<IotThinkModelFunctionDO> { public interface IotThinkModelFunctionMapper extends BaseMapperX<IotThinkModelFunctionDO> {
default IotThinkModelFunctionDO selectByProductIdAndIdentifier(Long productId, String identifier) { default IotThinkModelFunctionDO selectByProductIdAndIdentifier(Long productId, String identifier) {
return selectOne(new LambdaQueryWrapperX<IotThinkModelFunctionDO>().eq(IotThinkModelFunctionDO::getProductId, productId) return selectOne(IotThinkModelFunctionDO::getProductId, productId,
.eq(IotThinkModelFunctionDO::getIdentifier, identifier)); IotThinkModelFunctionDO::getIdentifier, identifier);
} }
default List<IotThinkModelFunctionDO> selectListByProductId(Long productId) { default List<IotThinkModelFunctionDO> selectListByProductId(Long productId) {
return selectList(new LambdaQueryWrapperX<IotThinkModelFunctionDO>().eq(IotThinkModelFunctionDO::getProductId, productId)); return selectList(IotThinkModelFunctionDO::getProductId, productId);
} }
default List<IotThinkModelFunctionDO> selectListByProductIdAndType(Long productId, Integer type) { default List<IotThinkModelFunctionDO> selectListByProductIdAndType(Long productId, Integer type) {
return selectList(new LambdaQueryWrapperX<IotThinkModelFunctionDO>().eq(IotThinkModelFunctionDO::getProductId, productId) return selectList(IotThinkModelFunctionDO::getProductId, productId,
.eq(IotThinkModelFunctionDO::getType, type)); IotThinkModelFunctionDO::getType, type);
} }
} }

View File

@ -14,7 +14,7 @@ import java.util.List;
public interface IotThinkModelFunctionService { public interface IotThinkModelFunctionService {
/** /**
* 创建IoT 产品物模型 * 创建产品物模型
* *
* @param createReqVO 创建信息 * @param createReqVO 创建信息
* @return 编号 * @return 编号
@ -23,32 +23,32 @@ public interface IotThinkModelFunctionService {
/** /**
* 更新IoT 产品物模型 * 更新产品物模型
* *
* @param updateReqVO 更新信息 * @param updateReqVO 更新信息
*/ */
void updateThinkModelFunction(@Valid IotThinkModelFunctionSaveReqVO updateReqVO); void updateThinkModelFunction(@Valid IotThinkModelFunctionSaveReqVO updateReqVO);
/** /**
* 删除IoT 产品物模型 * 删除产品物模型
* *
* @param id 编号 * @param id 编号
*/ */
void deleteThinkModelFunction(Long id); void deleteThinkModelFunction(Long id);
/** /**
* 获得IoT 产品物模型 * 获得产品物模型
* *
* @param id 编号 * @param id 编号
* @return IoT 产品物模型 * @return 产品物模型
*/ */
IotThinkModelFunctionDO getThinkModelFunction(Long id); IotThinkModelFunctionDO getThinkModelFunction(Long id);
/** /**
* 获得IoT 产品物模型列表 * 获得产品物模型列表
* *
* @param productId 产品编号 * @param productId 产品编号
* @return IoT 产品物模型列表 * @return 产品物模型列表
*/ */
List<IotThinkModelFunctionDO> getThinkModelFunctionListByProductId(Long productId); List<IotThinkModelFunctionDO> getThinkModelFunctionListByProductId(Long productId);
} }

View File

@ -1,6 +1,5 @@
package cn.iocoder.yudao.module.iot.service.thinkmodelfunction; package cn.iocoder.yudao.module.iot.service.thinkmodelfunction;
import cn.iocoder.yudao.framework.common.validation.Telephone;
import cn.iocoder.yudao.module.iot.controller.admin.thinkmodelfunction.thingModel.ThingModelEvent; import cn.iocoder.yudao.module.iot.controller.admin.thinkmodelfunction.thingModel.ThingModelEvent;
import cn.iocoder.yudao.module.iot.controller.admin.thinkmodelfunction.thingModel.ThingModelProperty; import cn.iocoder.yudao.module.iot.controller.admin.thinkmodelfunction.thingModel.ThingModelProperty;
import cn.iocoder.yudao.module.iot.controller.admin.thinkmodelfunction.thingModel.ThingModelService; import cn.iocoder.yudao.module.iot.controller.admin.thinkmodelfunction.thingModel.ThingModelService;
@ -16,7 +15,6 @@ import cn.iocoder.yudao.module.iot.enums.product.IotThingModelTypeEnum;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import java.util.ArrayList; import java.util.ArrayList;
@ -28,81 +26,83 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.THINK_MODEL_FUNCTION_EXISTS_BY_IDENTIFIER; import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.THINK_MODEL_FUNCTION_EXISTS_BY_IDENTIFIER;
import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.THINK_MODEL_FUNCTION_NOT_EXISTS; import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.THINK_MODEL_FUNCTION_NOT_EXISTS;
@Slf4j /**
* IoT 产品物模型 Service 实现类
*
* @author 芋道源码
*/
@Service @Service
@Validated @Validated
@Slf4j
public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionService { public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionService {
@Resource @Resource
private IotThinkModelFunctionMapper thinkModelFunctionMapper; private IotThinkModelFunctionMapper thinkModelFunctionMapper;
@Override @Override
// TODO @haohao事务
public Long createThinkModelFunction(IotThinkModelFunctionSaveReqVO createReqVO) { public Long createThinkModelFunction(IotThinkModelFunctionSaveReqVO createReqVO) {
// 校验功能标识符在同一产品下是否唯一 // 1. 校验功能标识符在同一产品下是否唯一
validateIdentifierUnique(createReqVO.getProductId(), createReqVO.getIdentifier()); validateIdentifierUnique(createReqVO.getProductId(), createReqVO.getIdentifier());
// 转换请求对象为数据对象 // 2. 插入数据库
IotThinkModelFunctionDO thinkModelFunction = IotThinkModelFunctionConvert.INSTANCE.convert(createReqVO); IotThinkModelFunctionDO function = IotThinkModelFunctionConvert.INSTANCE.convert(createReqVO);
thinkModelFunctionMapper.insert(function);
// 插入数据库 // 3. 如果创建的是属性需要更新默认的事件和服务
thinkModelFunctionMapper.insert(thinkModelFunction);
// 如果创建的是属性需要更新默认的事件和服务
if (Objects.equals(createReqVO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) { if (Objects.equals(createReqVO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) {
// TODO @haohao最好使用 createDefaultEventsAndServices原因是generate 更多在目前项目里是创建对象不涉及到 insert db
generateDefaultEventsAndServices(createReqVO.getProductId(), createReqVO.getProductKey()); generateDefaultEventsAndServices(createReqVO.getProductId(), createReqVO.getProductKey());
} }
return function.getId();
// 返回生成的 ID
return thinkModelFunction.getId();
} }
private void validateIdentifierUnique(Long productId, String identifier) { private void validateIdentifierUnique(Long productId, String identifier) {
IotThinkModelFunctionDO existingFunction = thinkModelFunctionMapper.selectByProductIdAndIdentifier(productId, identifier); IotThinkModelFunctionDO function = thinkModelFunctionMapper.selectByProductIdAndIdentifier(productId, identifier);
if (existingFunction != null) { if (function != null) {
throw exception(THINK_MODEL_FUNCTION_EXISTS_BY_IDENTIFIER); throw exception(THINK_MODEL_FUNCTION_EXISTS_BY_IDENTIFIER);
} }
} }
@Override @Override
// TODO @haohao事务
public void updateThinkModelFunction(IotThinkModelFunctionSaveReqVO updateReqVO) { public void updateThinkModelFunction(IotThinkModelFunctionSaveReqVO updateReqVO) {
// 校验功能是否存在 // 1.1 校验功能是否存在
validateThinkModelFunctionExists(updateReqVO.getId()); validateThinkModelFunctionExists(updateReqVO.getId());
// 1.2 校验功能标识符是否唯一
// 校验功能标识符是否唯一
validateIdentifierUniqueForUpdate(updateReqVO.getId(), updateReqVO.getProductId(), updateReqVO.getIdentifier()); validateIdentifierUniqueForUpdate(updateReqVO.getId(), updateReqVO.getProductId(), updateReqVO.getIdentifier());
// 转换请求对象为数据对象 // 2. 更新数据库
IotThinkModelFunctionDO thinkModelFunction = IotThinkModelFunctionConvert.INSTANCE.convert(updateReqVO); IotThinkModelFunctionDO thinkModelFunction = IotThinkModelFunctionConvert.INSTANCE.convert(updateReqVO);
// 更新数据库
thinkModelFunctionMapper.updateById(thinkModelFunction); thinkModelFunctionMapper.updateById(thinkModelFunction);
// 如果更新的是属性需要更新默认的事件和服务 // 3. 如果更新的是属性需要更新默认的事件和服务
if (Objects.equals(updateReqVO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) { if (Objects.equals(updateReqVO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) {
generateDefaultEventsAndServices(updateReqVO.getProductId(), updateReqVO.getProductKey()); generateDefaultEventsAndServices(updateReqVO.getProductId(), updateReqVO.getProductKey());
} }
} }
private void validateIdentifierUniqueForUpdate(Long id, Long productId, String identifier) { private void validateIdentifierUniqueForUpdate(Long id, Long productId, String identifier) {
IotThinkModelFunctionDO existingFunction = thinkModelFunctionMapper.selectByProductIdAndIdentifier(productId, identifier); IotThinkModelFunctionDO function = thinkModelFunctionMapper.selectByProductIdAndIdentifier(productId, identifier);
if (existingFunction != null && !existingFunction.getId().equals(id)) { // TODO !function.getId().equals(id) 使用 ObjectUtil.notEquals 逻辑里尽量避免 ! 取反用不等于会比 ! 更容易理解
if (function != null && !function.getId().equals(id)) {
throw exception(THINK_MODEL_FUNCTION_EXISTS_BY_IDENTIFIER); throw exception(THINK_MODEL_FUNCTION_EXISTS_BY_IDENTIFIER);
} }
} }
@Override @Override
// TODO @haohao事务
public void deleteThinkModelFunction(Long id) { public void deleteThinkModelFunction(Long id) {
// 校验功能是否存在 // 1. 校验功能是否存在
IotThinkModelFunctionDO functionDO = thinkModelFunctionMapper.selectById(id); IotThinkModelFunctionDO functionDO = thinkModelFunctionMapper.selectById(id);
if (functionDO == null) { if (functionDO == null) {
throw exception(THINK_MODEL_FUNCTION_NOT_EXISTS); throw exception(THINK_MODEL_FUNCTION_NOT_EXISTS);
} }
// 删除功能 // 2. 删除功能
thinkModelFunctionMapper.deleteById(id); thinkModelFunctionMapper.deleteById(id);
// 如果删除的是属性需要更新默认的事件和服务 // 3. 如果删除的是属性需要更新默认的事件和服务
if (Objects.equals(functionDO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) { if (Objects.equals(functionDO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) {
generateDefaultEventsAndServices(functionDO.getProductId(), functionDO.getProductKey()); generateDefaultEventsAndServices(functionDO.getProductId(), functionDO.getProductKey());
} }
@ -159,10 +159,12 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe
* 生成属性上报事件 * 生成属性上报事件
*/ */
private ThingModelEvent generatePropertyPostEvent(List<IotThinkModelFunctionDO> propertyList) { private ThingModelEvent generatePropertyPostEvent(List<IotThinkModelFunctionDO> propertyList) {
// TODO @haohao CollUtil.isNotEmpty 会更容易哈
if (propertyList == null || propertyList.isEmpty()) { if (propertyList == null || propertyList.isEmpty()) {
return null; return null;
} }
// TODO @haohao可以考虑链式调用简化整个方法的长度然后把相同类型的户型尽量再放同一行看起来轻松点其它类似的也可以试试看哈
ThingModelEvent event = new ThingModelEvent(); ThingModelEvent event = new ThingModelEvent();
event.setIdentifier("post"); event.setIdentifier("post");
event.setName("属性上报"); event.setName("属性上报");
@ -183,7 +185,6 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe
outputData.add(arg); outputData.add(arg);
} }
event.setOutputData(outputData); event.setOutputData(outputData);
return event; return event;
} }
@ -222,7 +223,6 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe
service.setInputData(inputData); service.setInputData(inputData);
// 属性设置服务一般不需要输出参数 // 属性设置服务一般不需要输出参数
service.setOutputData(new ArrayList<>()); service.setOutputData(new ArrayList<>());
return service; return service;
} }
@ -237,6 +237,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe
List<ThingModelArgument> outputData = new ArrayList<>(); List<ThingModelArgument> outputData = new ArrayList<>();
for (IotThinkModelFunctionDO functionDO : propertyList) { for (IotThinkModelFunctionDO functionDO : propertyList) {
ThingModelProperty property = functionDO.getProperty(); ThingModelProperty property = functionDO.getProperty();
// TODO @haohaorrw 是不是枚举起来
if ("r".equals(property.getAccessMode()) || "rw".equals(property.getAccessMode())) { if ("r".equals(property.getAccessMode()) || "rw".equals(property.getAccessMode())) {
ThingModelArgument arg = new ThingModelArgument(); ThingModelArgument arg = new ThingModelArgument();
arg.setIdentifier(property.getIdentifier()); arg.setIdentifier(property.getIdentifier());
@ -279,7 +280,6 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe
service.setInputData(Collections.singletonList(inputArg)); service.setInputData(Collections.singletonList(inputArg));
service.setOutputData(outputData); service.setOutputData(outputData);
return service; return service;
} }
@ -298,6 +298,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe
functionDO.setType(IotThingModelTypeEnum.EVENT.getType()); functionDO.setType(IotThingModelTypeEnum.EVENT.getType());
functionDO.setEvent(event); functionDO.setEvent(event);
// TODO @haohao会不会存在删除的情况哈另外项目里有 diffList 方法看看是不是可以方便的适合这个场景具体怎么用可以全局搜
if (existingEvent != null) { if (existingEvent != null) {
// 更新事件 // 更新事件
functionDO.setId(existingEvent.getId()); functionDO.setId(existingEvent.getId());