diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/ProductController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/IotProductController.java similarity index 64% rename from yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/ProductController.java rename to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/IotProductController.java index 7e68d2c20..fe2f1de17 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/ProductController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/IotProductController.java @@ -6,11 +6,11 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.module.iot.controller.admin.product.vo.ProductPageReqVO; -import cn.iocoder.yudao.module.iot.controller.admin.product.vo.ProductRespVO; -import cn.iocoder.yudao.module.iot.controller.admin.product.vo.ProductSaveReqVO; -import cn.iocoder.yudao.module.iot.dal.dataobject.product.ProductDO; -import cn.iocoder.yudao.module.iot.service.product.ProductService; +import cn.iocoder.yudao.module.iot.controller.admin.product.vo.IotProductPageReqVO; +import cn.iocoder.yudao.module.iot.controller.admin.product.vo.IotProductRespVO; +import cn.iocoder.yudao.module.iot.controller.admin.product.vo.IotProductSaveReqVO; +import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO; +import cn.iocoder.yudao.module.iot.service.product.IotProductService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -27,27 +27,26 @@ import java.util.List; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -// TODO @haohao:Iot 前缀要加,不然很容易重复哈 @Tag(name = "管理后台 - IOT 产品") @RestController @RequestMapping("/iot/product") @Validated -public class ProductController { +public class IotProductController { @Resource - private ProductService productService; + private IotProductService productService; @PostMapping("/create") @Operation(summary = "创建产品") @PreAuthorize("@ss.hasPermission('iot:product:create')") - public CommonResult createProduct(@Valid @RequestBody ProductSaveReqVO createReqVO) { + public CommonResult createProduct(@Valid @RequestBody IotProductSaveReqVO createReqVO) { return success(productService.createProduct(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新产品") @PreAuthorize("@ss.hasPermission('iot:product:update')") - public CommonResult updateProduct(@Valid @RequestBody ProductSaveReqVO updateReqVO) { + public CommonResult updateProduct(@Valid @RequestBody IotProductSaveReqVO updateReqVO) { productService.updateProduct(updateReqVO); return success(true); } @@ -76,30 +75,17 @@ public class ProductController { @Operation(summary = "获得产品") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('iot:product:query')") - public CommonResult getProduct(@RequestParam("id") Long id) { - ProductDO product = productService.getProduct(id); - return success(BeanUtils.toBean(product, ProductRespVO.class)); + public CommonResult getProduct(@RequestParam("id") Long id) { + IotProductDO product = productService.getProduct(id); + return success(BeanUtils.toBean(product, IotProductRespVO.class)); } @GetMapping("/page") @Operation(summary = "获得产品分页") @PreAuthorize("@ss.hasPermission('iot:product:query')") - public CommonResult> getProductPage(@Valid ProductPageReqVO pageReqVO) { - PageResult pageResult = productService.getProductPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, ProductRespVO.class)); - } - - @GetMapping("/export-excel") - @Operation(summary = "导出产品 Excel") - @PreAuthorize("@ss.hasPermission('iot:product:export')") - @ApiAccessLog(operateType = EXPORT) - public void exportProductExcel(@Valid ProductPageReqVO pageReqVO, - HttpServletResponse response) throws IOException { - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = productService.getProductPage(pageReqVO).getList(); - // 导出 Excel - ExcelUtils.write(response, "产品.xls", "数据", ProductRespVO.class, - BeanUtils.toBean(list, ProductRespVO.class)); + public CommonResult> getProductPage(@Valid IotProductPageReqVO pageReqVO) { + PageResult pageResult = productService.getProductPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, IotProductRespVO.class)); } } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/IotProductPageReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/IotProductPageReqVO.java new file mode 100644 index 000000000..afc3aafa0 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/IotProductPageReqVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.iot.controller.admin.product.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +// TODO @haohao:涉及到 iot 的拼写,要不都用 IoT,貌似更规范 +@Schema(description = "管理后台 - iot 产品分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class IotProductPageReqVO extends PageParam { + + @Schema(description = "产品名称", example = "李四") + private String name; + + @Schema(description = "产品标识") + private String productKey; + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/ProductRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/IotProductRespVO.java similarity index 98% rename from yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/ProductRespVO.java rename to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/IotProductRespVO.java index 1a60f0290..066efca93 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/ProductRespVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/IotProductRespVO.java @@ -10,7 +10,7 @@ import java.time.LocalDateTime; @Schema(description = "管理后台 - iot 产品 Response VO") @Data @ExcelIgnoreUnannotated -public class ProductRespVO { +public class IotProductRespVO { @Schema(description = "产品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26087") @ExcelProperty("产品ID") diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/ProductSaveReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/IotProductSaveReqVO.java similarity index 85% rename from yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/ProductSaveReqVO.java rename to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/IotProductSaveReqVO.java index ecbbb03c9..ad01bcd03 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/ProductSaveReqVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/IotProductSaveReqVO.java @@ -3,13 +3,13 @@ package cn.iocoder.yudao.module.iot.controller.admin.product.vo; import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.module.iot.enums.product.*; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.util.*; -import jakarta.validation.constraints.*; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; @Schema(description = "管理后台 - iot 产品新增/修改 Request VO") @Data -public class ProductSaveReqVO { +public class IotProductSaveReqVO { @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.AUTO, example = "1") private Long id; @@ -26,15 +26,15 @@ public class ProductSaveReqVO { @NotNull(message = "设备类型不能为空") private Integer deviceType; - @Schema(description = "联网方式", requiredMode = Schema.RequiredMode.REQUIRED,example = "0") + @Schema(description = "联网方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") @InEnum(value = IotNetTypeEnum.class, message = "联网方式必须是 {value}") private Integer netType; - @Schema(description = "接入网关协议", requiredMode = Schema.RequiredMode.REQUIRED,example = "0") + @Schema(description = "接入网关协议", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") @InEnum(value = IotProtocolTypeEnum.class, message = "接入网关协议必须是 {value}") private Integer protocolType; - @Schema(description = "数据格式",requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @Schema(description = "数据格式", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") @InEnum(value = IotDataFormatEnum.class, message = "数据格式必须是 {value}") @NotNull(message = "数据格式不能为空") private Integer dataFormat; diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/ProductPageReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/ProductPageReqVO.java deleted file mode 100644 index dc0ae9d65..000000000 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/ProductPageReqVO.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.iocoder.yudao.module.iot.controller.admin.product.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -// TODO @haohao:涉及到 iot 的拼写,要不都用 IoT,貌似更规范 -// TODO 芋艿:需要清理掉一些无用字段 -@Schema(description = "管理后台 - iot 产品分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ProductPageReqVO extends PageParam { - - @Schema(description = "产品名称", example = "李四") - private String name; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - - @Schema(description = "产品标识") - private String productKey; - - @Schema(description = "接入网关协议", example = "2") - private Integer protocolType; - - @Schema(description = "协议编号(脚本解析 id)", example = "13177") - private Long protocolId; - - @Schema(description = "产品所属品类标识符", example = "14237") - private Long categoryId; - - @Schema(description = "产品描述", example = "你猜") - private String description; - - @Schema(description = "数据校验级别", example = "1") - private Integer validateType; - - @Schema(description = "产品状态", example = "1") - private Integer status; - - @Schema(description = "设备类型", example = "2") - private Integer deviceType; - - @Schema(description = "联网方式", example = "2") - private Integer netType; - - @Schema(description = "数据格式", example = "0") - private Integer dataFormat; - -} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/product/ProductDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/product/IotProductDO.java similarity index 94% rename from yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/product/ProductDO.java rename to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/product/IotProductDO.java index 37c1eb513..1fa22c7d1 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/product/ProductDO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/product/IotProductDO.java @@ -19,7 +19,7 @@ import lombok.*; @Builder @NoArgsConstructor @AllArgsConstructor -public class ProductDO extends BaseDO { +public class IotProductDO extends BaseDO { /** * 产品ID @@ -37,7 +37,7 @@ public class ProductDO extends BaseDO { private String productKey; /** * 产品所属品类编号 - * + *

* TODO 外键:后续加 */ private Long categoryId; @@ -48,44 +48,44 @@ public class ProductDO extends BaseDO { /** * 产品状态 - * + *

* 枚举 {@link cn.iocoder.yudao.module.iot.enums.product.IotProductStatusEnum} */ private Integer status; /** * 设备类型 - * + *

* 枚举 {@link cn.iocoder.yudao.module.iot.enums.product.IotProductDeviceTypeEnum} */ private Integer deviceType; /** * 联网方式 - * + *

* 枚举 {@link cn.iocoder.yudao.module.iot.enums.product.IotNetTypeEnum} */ private Integer netType; /** * 接入网关协议 - * + *

* 枚举 {@link cn.iocoder.yudao.module.iot.enums.product.IotProtocolTypeEnum} */ private Integer protocolType; /** * 协议编号 - * + *

* TODO 外键:后续加 */ private Long protocolId; /** * 数据格式 - * + *

* 枚举 {@link cn.iocoder.yudao.module.iot.enums.product.IotDataFormatEnum} */ private Integer dataFormat; /** * 数据校验级别 - * + *

* 枚举 {@link cn.iocoder.yudao.module.iot.enums.product.IotValidateTypeEnum} */ private Integer validateType; diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/product/IotProductMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/product/IotProductMapper.java new file mode 100644 index 000000000..111ed4969 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/product/IotProductMapper.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.iot.dal.mysql.product; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.iot.controller.admin.product.vo.IotProductPageReqVO; +import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * iot 产品 Mapper + * + * @author ahh + */ +@Mapper +public interface IotProductMapper extends BaseMapperX { + + default PageResult selectPage(IotProductPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(IotProductDO::getName, reqVO.getName()) + .likeIfPresent(IotProductDO::getProductKey, reqVO.getProductKey()) + .orderByDesc(IotProductDO::getId)); + } + + default IotProductDO selectByProductKey(String productKey) { + return selectOne(new LambdaQueryWrapperX().eq(IotProductDO::getProductKey, productKey)); + } +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/product/ProductMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/product/ProductMapper.java deleted file mode 100644 index d9af9b4b9..000000000 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/product/ProductMapper.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.iocoder.yudao.module.iot.dal.mysql.product; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.module.iot.controller.admin.product.vo.ProductPageReqVO; -import cn.iocoder.yudao.module.iot.dal.dataobject.product.ProductDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * iot 产品 Mapper - * - * @author ahh - */ -@Mapper -public interface ProductMapper extends BaseMapperX { - - default PageResult selectPage(ProductPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(ProductDO::getName, reqVO.getName()) - .betweenIfPresent(ProductDO::getCreateTime, reqVO.getCreateTime()) - .likeIfPresent(ProductDO::getProductKey, reqVO.getProductKey()) - .eqIfPresent(ProductDO::getProtocolId, reqVO.getProtocolId()) - .eqIfPresent(ProductDO::getCategoryId, reqVO.getCategoryId()) - .eqIfPresent(ProductDO::getDescription, reqVO.getDescription()) - .eqIfPresent(ProductDO::getValidateType, reqVO.getValidateType()) - .eqIfPresent(ProductDO::getStatus, reqVO.getStatus()) - .eqIfPresent(ProductDO::getDeviceType, reqVO.getDeviceType()) - .eqIfPresent(ProductDO::getNetType, reqVO.getNetType()) - .eqIfPresent(ProductDO::getProtocolType, reqVO.getProtocolType()) - .eqIfPresent(ProductDO::getDataFormat, reqVO.getDataFormat()) - .orderByDesc(ProductDO::getId)); - } - -} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/ProductService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/IotProductService.java similarity index 62% rename from yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/ProductService.java rename to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/IotProductService.java index 8d4fdf801..14f408030 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/ProductService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/IotProductService.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.iot.service.product; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.iot.controller.admin.product.vo.ProductPageReqVO; -import cn.iocoder.yudao.module.iot.controller.admin.product.vo.ProductSaveReqVO; -import cn.iocoder.yudao.module.iot.dal.dataobject.product.ProductDO; +import cn.iocoder.yudao.module.iot.controller.admin.product.vo.IotProductPageReqVO; +import cn.iocoder.yudao.module.iot.controller.admin.product.vo.IotProductSaveReqVO; +import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO; import jakarta.validation.Valid; /** @@ -11,7 +11,7 @@ import jakarta.validation.Valid; * * @author ahh */ -public interface ProductService { +public interface IotProductService { /** * 创建产品 @@ -19,14 +19,14 @@ public interface ProductService { * @param createReqVO 创建信息 * @return 编号 */ - Long createProduct(@Valid ProductSaveReqVO createReqVO); + Long createProduct(@Valid IotProductSaveReqVO createReqVO); /** * 更新产品 * * @param updateReqVO 更新信息 */ - void updateProduct(@Valid ProductSaveReqVO updateReqVO); + void updateProduct(@Valid IotProductSaveReqVO updateReqVO); /** * 删除产品 @@ -41,7 +41,7 @@ public interface ProductService { * @param id 编号 * @return 产品 */ - ProductDO getProduct(Long id); + IotProductDO getProduct(Long id); /** * 获得产品分页 @@ -49,7 +49,7 @@ public interface ProductService { * @param pageReqVO 分页查询 * @return 产品分页 */ - PageResult getProductPage(ProductPageReqVO pageReqVO); + PageResult getProductPage(IotProductPageReqVO pageReqVO); /** * 更新产品状态 diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/IotProductServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/IotProductServiceImpl.java new file mode 100644 index 000000000..65686f533 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/IotProductServiceImpl.java @@ -0,0 +1,117 @@ +package cn.iocoder.yudao.module.iot.service.product; + +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.iot.controller.admin.product.vo.IotProductPageReqVO; +import cn.iocoder.yudao.module.iot.controller.admin.product.vo.IotProductSaveReqVO; +import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO; +import cn.iocoder.yudao.module.iot.dal.mysql.product.IotProductMapper; +import cn.iocoder.yudao.module.iot.enums.product.IotProductStatusEnum; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.Objects; +import java.util.UUID; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.PRODUCT_NOT_EXISTS; +import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.PRODUCT_STATUS_NOT_DELETE; + +/** + * IOT 产品 Service 实现类 + * + * @author ahh + */ +@Service +@Validated +public class IotProductServiceImpl implements IotProductService { + + @Resource + private IotProductMapper productMapper; + + @Override + public Long createProduct(IotProductSaveReqVO createReqVO) { + // 1. 生成 ProductKey + createProductKey(createReqVO); + // 2. 插入 + IotProductDO product = BeanUtils.toBean(createReqVO, IotProductDO.class); + productMapper.insert(product); + return product.getId(); + } + + /** + * 创建 ProductKey + * + * @param createReqVO 创建信息 + */ + private void createProductKey(IotProductSaveReqVO createReqVO) { + String productKey = createReqVO.getProductKey(); + // 1. productKey为空,生成随机的 11 位字符串 + if (StrUtil.isEmpty(productKey)) { + productKey = UUID.randomUUID().toString().replace("-", "").substring(0, 11); + } + // 2. 校验唯一性 + if (productMapper.selectByProductKey(productKey) != null) { + throw exception(PRODUCT_NOT_EXISTS); + } + createReqVO.setProductKey(productKey); + } + + @Override + public void updateProduct(IotProductSaveReqVO updateReqVO) { + updateReqVO.setProductKey(null); // 不更新产品标识 + // 1.1 校验存在 + IotProductDO iotProductDO = validateProductExists(updateReqVO.getId()); + // 1.2 发布状态不可更新 + validateProductStatus(iotProductDO); + // 2. 更新 + IotProductDO updateObj = BeanUtils.toBean(updateReqVO, IotProductDO.class); + productMapper.updateById(updateObj); + } + + @Override + public void deleteProduct(Long id) { + // 1.1 校验存在 + IotProductDO iotProductDO = validateProductExists(id); + // 1.2 发布状态不可删除 + validateProductStatus(iotProductDO); + // 2. 删除 + productMapper.deleteById(id); + } + + private IotProductDO validateProductExists(Long id) { + IotProductDO iotProductDO = productMapper.selectById(id); + if (iotProductDO == null) { + throw exception(PRODUCT_NOT_EXISTS); + } + return iotProductDO; + } + + private void validateProductStatus(IotProductDO iotProductDO) { + if (Objects.equals(iotProductDO.getStatus(), IotProductStatusEnum.PUBLISHED.getType())) { + throw exception(PRODUCT_STATUS_NOT_DELETE); + } + } + + @Override + public IotProductDO getProduct(Long id) { + return productMapper.selectById(id); + } + + @Override + public PageResult getProductPage(IotProductPageReqVO pageReqVO) { + return productMapper.selectPage(pageReqVO); + } + + @Override + public void updateProductStatus(Long id, Integer status) { + // 1. 校验存在 + validateProductExists(id); + // 2. 更新 + IotProductDO updateObj = IotProductDO.builder().id(id).status(status).build(); + productMapper.updateById(updateObj); + } + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/ProductServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/ProductServiceImpl.java deleted file mode 100644 index e5e3bc421..000000000 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/ProductServiceImpl.java +++ /dev/null @@ -1,109 +0,0 @@ -package cn.iocoder.yudao.module.iot.service.product; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.iot.controller.admin.product.vo.ProductPageReqVO; -import cn.iocoder.yudao.module.iot.controller.admin.product.vo.ProductSaveReqVO; -import cn.iocoder.yudao.module.iot.dal.dataobject.product.ProductDO; -import cn.iocoder.yudao.module.iot.dal.mysql.product.ProductMapper; -import cn.iocoder.yudao.module.iot.enums.product.IotProductStatusEnum; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import java.util.Objects; -import java.util.UUID; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.PRODUCT_NOT_EXISTS; -import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.PRODUCT_STATUS_NOT_DELETE; - -/** - * IOT 产品 Service 实现类 - * - * @author ahh - */ -@Service -@Validated -public class ProductServiceImpl implements ProductService { - - @Resource - private ProductMapper productMapper; - - @Override - public Long createProduct(ProductSaveReqVO createReqVO) { - // 生成 ProductKey - createProductKey(createReqVO); - // 插入 - ProductDO product = BeanUtils.toBean(createReqVO, ProductDO.class); - productMapper.insert(product); - return product.getId(); - } - - /** - * 创建 ProductKey - * - * @param createReqVO 创建信息 - */ - private void createProductKey(ProductSaveReqVO createReqVO) { - // TODO @haohao:应该前端没传递的时候,才生成哇?ps:需要校验下唯一性,万一有重复; - // 生成随机的 11 位字符串 - String productKey = UUID.randomUUID().toString().replace("-", "").substring(0, 11); - createReqVO.setProductKey(productKey); - } - - @Override - public void updateProduct(ProductSaveReqVO updateReqVO) { - updateReqVO.setProductKey(null); // 不更新产品标识 - // 校验存在 - validateProductExists(updateReqVO.getId()); - // TODO @haohao:如果已经发布,允许编辑么? - // 更新 - ProductDO updateObj = BeanUtils.toBean(updateReqVO, ProductDO.class); - productMapper.updateById(updateObj); - } - - @Override - public void deleteProduct(Long id) { - // TODO @haohao:这里最好只查询一次哈 - // 1.1 校验存在 - validateProductExists(id); - // 1.2 发布状态不可删除 - validateProductStatus(id); - // 2. 删除 - productMapper.deleteById(id); - } - - private void validateProductExists(Long id) { - if (productMapper.selectById(id) == null) { - throw exception(PRODUCT_NOT_EXISTS); - } - } - - private void validateProductStatus(Long id) { - ProductDO product = productMapper.selectById(id); - if (Objects.equals(product.getStatus(), IotProductStatusEnum.PUBLISHED.getType())) { - throw exception(PRODUCT_STATUS_NOT_DELETE); - } - } - - @Override - public ProductDO getProduct(Long id) { - return productMapper.selectById(id); - } - - @Override - public PageResult getProductPage(ProductPageReqVO pageReqVO) { - return productMapper.selectPage(pageReqVO); - } - - @Override - public void updateProductStatus(Long id, Integer status) { - // 校验存在 - validateProductExists(id); - // 更新 - ProductDO updateObj = ProductDO.builder().id(id).status(status).build(); - productMapper.updateById(updateObj); - } - -} \ No newline at end of file