【代码评审】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 层面的多租户的功能
*
* @author 芋道源码
* @author
*/
public class TenantDatabaseInterceptor implements TenantLineHandler {

View File

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

View File

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

View File

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