Browse Source

refactor 产品服务

jay 2 years ago
parent
commit
e441a507e3

+ 4 - 0
iot-module/iot-manager/pom.xml

@@ -112,6 +112,10 @@
             <groupId>cc.iotkit</groupId>
             <artifactId>iot-common-excel</artifactId>
         </dependency>
+        <dependency>
+            <groupId>cc.iotkit</groupId>
+            <artifactId>iot-common-log</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 78 - 134
iot-module/iot-manager/src/main/java/cc/iotkit/manager/controller/ProductController.java

@@ -10,38 +10,30 @@
 package cc.iotkit.manager.controller;
 
 import cc.iotkit.common.api.PageRequest;
-import cc.iotkit.common.enums.ErrCode;
-import cc.iotkit.common.exception.BizException;
-import cc.iotkit.common.satoken.utils.AuthUtil;
-import cc.iotkit.common.utils.JsonUtils;
-import cc.iotkit.data.manager.ICategoryData;
-import cc.iotkit.data.manager.IProductData;
-import cc.iotkit.data.manager.IProductModelData;
-import cc.iotkit.data.manager.IThingModelData;
-import cc.iotkit.manager.config.AliyunConfig;
-import cc.iotkit.manager.service.DataOwnerService;
+import cc.iotkit.common.api.Request;
+import cc.iotkit.common.log.annotation.Log;
+import cc.iotkit.common.log.enums.BusinessType;
+import cc.iotkit.common.validate.AddGroup;
+import cc.iotkit.manager.dto.bo.category.CategoryBo;
+import cc.iotkit.manager.dto.bo.product.ProductBo;
+import cc.iotkit.manager.dto.bo.productmodel.ProductModelBo;
+import cc.iotkit.manager.dto.bo.thingmodel.ThingModelBo;
+import cc.iotkit.manager.dto.vo.thingmodel.ThingModelVo;
+import cc.iotkit.manager.dto.vo.category.CategoryVo;
+import cc.iotkit.manager.dto.vo.product.ProductVo;
+import cc.iotkit.manager.dto.vo.productmodel.ProductModelVo;
 import cc.iotkit.common.api.Paging;
-import cc.iotkit.model.alert.AlertConfig;
-import cc.iotkit.model.product.Category;
-import cc.iotkit.model.product.Product;
-import cc.iotkit.model.product.ProductModel;
-import cc.iotkit.model.product.ThingModel;
-import cc.iotkit.temporal.IDbStructureData;
+import cc.iotkit.manager.service.IProductService;
 import cn.dev33.satoken.annotation.SaCheckRole;
-import com.aliyun.oss.OSS;
-import com.aliyun.oss.OSSClientBuilder;
-import com.aliyun.oss.model.PutObjectResult;
 import io.swagger.annotations.Api;
-import lombok.SneakyThrows;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.validation.Valid;
-import java.util.Date;
 import java.util.List;
 
 @Api(tags = {"产品"})
@@ -50,150 +42,102 @@ import java.util.List;
 @RequestMapping("/product")
 public class ProductController {
 
-    @Autowired
-    @Qualifier("productDataCache")
-    private IProductData productData;
-    @Autowired
-    @Qualifier("thingModelDataCache")
-    private IThingModelData thingModelData;
-    @Autowired
-    @Qualifier("categoryDataCache")
-    private ICategoryData categoryData;
-    @Autowired
-    private DataOwnerService dataOwnerService;
-    @Autowired
-    private AliyunConfig aliyunConfig;
-    @Autowired
-    @Qualifier("productModelDataCache")
-    private IProductModelData productModelData;
-    @Autowired
-    private IDbStructureData dbStructureData;
 
 
-    private OSS ossClient;
+    @Autowired
+    private IProductService productService;
 
     @PostMapping("/list")
-    public Paging<Product> getProducts(
-            PageRequest<Product> request) {
-        if (!AuthUtil.isAdmin()) {
-            return productData.findByUid(AuthUtil.getUserId(), request.getPageNum(), request.getPageSize());
-        }
-
-        return productData.findAll(request);
+    public Paging<ProductVo> getProducts(@Validated @RequestBody
+            PageRequest<ProductBo> request) {
+        return productService.selectPageList(request);
     }
 
-    @PostMapping("/save")
-    public void save(Product product) {
-        dataOwnerService.checkOwnerSave(productData, product);
+    @ApiOperation("新建")
+    @PostMapping(value = "/add")
+    @Log(title = "产品", businessType = BusinessType.INSERT)
+    public ProductVo create(@Validated(AddGroup.class) @RequestBody Request<ProductBo> request) {
+
+        return productService.addEntity(request.getData());
 
-        if (product.getCreateAt() == null) {
-            product.setCreateAt(System.currentTimeMillis());
-        }
-        productData.save(product);
     }
 
-    @GetMapping("/{productKey}")
-    public Product getProduct(@PathVariable("productKey") String productKey) {
-        return dataOwnerService.checkOwner(productData.findById(productKey));
+    @ApiOperation(value = "编辑产品")
+    @PostMapping("/edit")
+    @Log(title = "产品", businessType = BusinessType.UPDATE)
+    public boolean edit(@RequestBody @Validated ProductBo productBo) {
+        return productService.updateEntity(productBo);
     }
 
-    @GetMapping("/thingModel/{productKey}")
-    public ThingModel getThingModel(@PathVariable("productKey") String productKey) {
-        checkProductOwner(productKey);
-        return thingModelData.findById(productKey);
+
+    @ApiOperation("查看详情")
+    @PostMapping(value = "/getDetail")
+    public ProductVo getDetail(@RequestParam  @Validated Request<String> request) {
+        ProductVo dto = productService.getDetail(request.getData());
+        return dto;
     }
+    @GetMapping("/getThingModelByProductKey")
+    @ApiOperation("查看物模型")
+    public ThingModelVo getThingModelByProductKey(@RequestParam  @Validated Request<String> request) {
+
+        return productService.getThingModelByProductKey(request.getData());
 
-    @PostMapping("/thingModel/save")
-    public void saveThingModel(String productKey, String model) {
-        checkProductOwner(productKey);
-        ThingModel oldData = thingModelData.findById(productKey);
-        ThingModel thingModel = new ThingModel(productKey, productKey, JsonUtils.parseObject(model, ThingModel.Model.class));
-        if (oldData == null) {
-            //定义时序数据库物模型数据结构
-            dbStructureData.defineThingModel(thingModel);
-        } else {
-            //更新时序数据库物模型数据结构
-            dbStructureData.updateThingModel(thingModel);
-        }
-        thingModelData.save(thingModel);
     }
 
-    @PostMapping("/thingModel/{productKey}/delete")
-    public void deleteThingModel(String productKey) {
-        checkProductOwner(productKey);
-        ThingModel thingModel = thingModelData.findById(productKey);
-        //删除时序数据库物模型数据结构
-        dbStructureData.defineThingModel(thingModel);
-        thingModelData.deleteById(productKey);
+    @ApiOperation("保存物模型")
+    @PostMapping("/thingModel/save")
+    public boolean saveThingModel(@Validated @RequestBody Request<ThingModelBo> request) {
+
+        return productService.saveThingModel(request.getData());
+
+
     }
 
-    private void checkProductOwner(String productKey) {
-        dataOwnerService.checkOwner(productData.findById(productKey));
+    @PostMapping("/thingModel/delete")
+    @ApiOperation("删除物模型")
+    @Log(title = "物模型", businessType = BusinessType.DELETE)
+    public boolean deleteThingModel(@Validated @RequestBody Request<String> productKey) {
+       return productService.deleteThingModel(productKey.getData());
     }
 
-    @GetMapping("/categories")
-    public List<Category> getCategories() {
-        return categoryData.findAll();
+
+    @PostMapping("/category/list")
+    @ApiOperation("产品品类展示")
+    public Paging<CategoryVo> getCategories(@Validated @RequestBody PageRequest<CategoryBo> request) {
+        return productService.selectCategoryPageList(request);
     }
 
     @SaCheckRole("iot_admin")
-    @PostMapping("/saveCategory")
-    public void saveCategory(Category cate) {
-        cate.setCreateAt(System.currentTimeMillis());
-        categoryData.save(cate);
+    @ApiOperation("品类编辑")
+    @PostMapping("/category/edit")
+    public boolean saveCategory(@Validated @RequestBody CategoryBo req) {
+
+        return productService.editCategory(req);
     }
 
     @SaCheckRole("iot_admin")
-    @PostMapping("/delCategory")
-    public void delCategory(String id) {
-        categoryData.deleteById(id);
+    @PostMapping("/category/delete")
+    @ApiOperation("删除品类")
+    public boolean delCategory(@Validated @RequestBody Request<String> req) {
+        return productService.deleteCategory(req.getData());
+
     }
 
-    @SneakyThrows
     @PostMapping("/uploadImg/{productKey}")
     public String uploadImg(@PathVariable("productKey") String productKey,
                             @RequestParam("file") MultipartFile file) {
-        productKey = getProduct(productKey).getId();
-
-        String fileName = file.getOriginalFilename();
-        String end = fileName.substring(fileName.lastIndexOf("."));
-        if (ossClient == null) {
-            // 创建OSSClient实例。
-            ossClient = new OSSClientBuilder().build(aliyunConfig.getEndpoint(),
-                    aliyunConfig.getAccessKeyId(), aliyunConfig.getAccessKeySecret());
-        }
-
-        fileName = "product/" + productKey + "/cover" + end;
-        String bucket = aliyunConfig.getBucketId();
-        // 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
-        PutObjectResult result = ossClient.putObject(bucket, fileName,
-                file.getInputStream());
-        return ossClient.generatePresignedUrl(bucket, fileName,
-                new Date(new Date().getTime() + 3600L * 1000 * 24 * 365 * 10)).toString();
+       return productService.uploadImg(productKey,file);
     }
 
-    @GetMapping("/{productKey}/models")
-    public List<ProductModel> getModels(@PathVariable("productKey") String productKey) {
-        dataOwnerService.checkOwner(productData, productKey);
-        return productModelData.findByProductKey(productKey);
+    @PostMapping("/getModelsByProductKey")
+    @ApiModelProperty("获取产品型号")
+    public List<ProductModelVo> getModels(String productKey) {
+        return productService.getModels(productKey);
     }
 
-    @PostMapping("/saveProductModel")
-    public void saveProductModel(ProductModel productModel) {
-        String model = productModel.getModel();
-        String productKey = productModel.getProductKey();
-        Product product = productData.findById(productKey);
-        if (product == null) {
-            throw new BizException(ErrCode.PRODUCT_NOT_FOUND);
-        }
-        dataOwnerService.checkOwner(product);
-
-        ProductModel oldScript = productModelData.findByModel(model);
-        if (oldScript != null && !oldScript.getProductKey().equals(productKey)) {
-            throw new BizException(ErrCode.MODEL_ALREADY);
-        }
-
-        productModel.setModifyAt(System.currentTimeMillis());
-        productModelData.save(productModel);
+    @PostMapping("/productModel/edit")
+    @ApiOperation("编辑产品型号")
+    public boolean saveProductModel(ProductModelBo productModel) {
+        return productService.editProductModel(productModel);
     }
 }

+ 46 - 0
iot-module/iot-manager/src/main/java/cc/iotkit/manager/dto/bo/category/CategoryBo.java

@@ -0,0 +1,46 @@
+package cc.iotkit.manager.dto.bo.category;
+
+import cc.iotkit.model.product.Category;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.Size;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import cc.iotkit.common.api.BaseDto;
+import cc.iotkit.common.validate.AddGroup;
+import cc.iotkit.common.validate.EditGroup;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+@ApiModel(value = "CategoryBo")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = Category.class, reverseConvertGenerate = false)
+public class CategoryBo extends BaseDto  {
+
+	private static final long serialVersionUID = -1L;
+
+
+	@ApiModelProperty(value="id")
+	private String id;
+
+	@ApiModelProperty(value="分类描述")
+    	private Long createAt;
+
+    	@ApiModelProperty(value="分类名称")
+	@Size(max = 255, message = "分类名称长度不正确")
+    	private String name;
+
+    }

+ 65 - 0
iot-module/iot-manager/src/main/java/cc/iotkit/manager/dto/bo/product/ProductBo.java

@@ -0,0 +1,65 @@
+package cc.iotkit.manager.dto.bo.product;
+
+import cc.iotkit.model.product.Product;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.Size;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import cc.iotkit.common.api.BaseDto;
+import cc.iotkit.common.validate.AddGroup;
+import cc.iotkit.common.validate.EditGroup;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+@ApiModel(value = "ProductBo")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = Product.class, reverseConvertGenerate = false)
+public class ProductBo extends BaseDto  {
+
+	private static final long serialVersionUID = -1L;
+
+
+	@ApiModelProperty(value="id")
+	private String id;
+
+	@ApiModelProperty(value="品类")
+	@Size(max = 255, message = "品类长度不正确")
+    	private String category;
+
+    	@ApiModelProperty(value="创建时间")
+    	private Long createAt;
+
+    	@ApiModelProperty(value="图片")
+	@Size(max = 255, message = "图片长度不正确")
+    	private String img;
+
+    	@ApiModelProperty(value="产品名称")
+	@Size(max = 255, message = "产品名称长度不正确")
+    	private String name;
+
+    	@ApiModelProperty(value="节点类型")
+    	private Integer nodeType;
+
+    	@ApiModelProperty(value="是否透传,true/false")
+	@Size(max = 255, message = "是否透传,true/false长度不正确")
+    	private String transparent;
+
+    	@ApiModelProperty(value="用户ID")
+	@Size(max = 255, message = "用户ID长度不正确")
+    	private String uid;
+
+    }

+ 65 - 0
iot-module/iot-manager/src/main/java/cc/iotkit/manager/dto/bo/productmodel/ProductModelBo.java

@@ -0,0 +1,65 @@
+package cc.iotkit.manager.dto.bo.productmodel;
+
+import cc.iotkit.model.product.ProductModel;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.Size;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import cc.iotkit.common.api.BaseDto;
+import cc.iotkit.common.validate.AddGroup;
+import cc.iotkit.common.validate.EditGroup;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+@ApiModel(value = "ProductModelBo")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductModel.class, reverseConvertGenerate = false)
+public class ProductModelBo extends BaseDto  {
+
+	private static final long serialVersionUID = -1L;
+
+	@ApiModelProperty(value="id")
+	private String id;
+
+	@ApiModelProperty(value="型号")
+	@Size(max = 255, message = "型号长度不正确")
+    	private String model;
+
+    	@ApiModelProperty(value="修改时间")
+    	private Long modifyAt;
+
+    	@ApiModelProperty(value="名称")
+	@Size(max = 255, message = "名称长度不正确")
+    	private String name;
+
+    	@ApiModelProperty(value="产品Key")
+	@Size(max = 255, message = "产品Key长度不正确")
+    	private String productKey;
+
+    	@ApiModelProperty(value="脚本内容")
+	@Size(max = 65535, message = "脚本内容长度不正确")
+    	private String script;
+
+    	@ApiModelProperty(value="脚本状态")
+	@Size(max = 255, message = "脚本状态长度不正确")
+    	private String state;
+
+    	@ApiModelProperty(value="脚本类型")
+	@Size(max = 255, message = "脚本类型长度不正确")
+    	private String type;
+
+    }

+ 43 - 0
iot-module/iot-manager/src/main/java/cc/iotkit/manager/dto/bo/thingmodel/ThingModelBo.java

@@ -0,0 +1,43 @@
+package cc.iotkit.manager.dto.bo.thingmodel;
+
+import cc.iotkit.model.product.ThingModel;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.Size;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import cc.iotkit.common.api.BaseDto;
+import cc.iotkit.common.validate.AddGroup;
+import cc.iotkit.common.validate.EditGroup;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+@ApiModel(value = "ThingModelBo")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ThingModel.class, reverseConvertGenerate = false)
+public class ThingModelBo extends BaseDto  {
+
+	private static final long serialVersionUID = -1L;
+
+	@ApiModelProperty(value="模型内容")
+	@Size(max = 65535, message = "模型内容长度不正确")
+    	private String model;
+
+    	@ApiModelProperty(value="产品key")
+	@Size(max = 255, message = "产品key长度不正确")
+    	private String productKey;
+
+    }

+ 40 - 0
iot-module/iot-manager/src/main/java/cc/iotkit/manager/dto/vo/category/CategoryVo.java

@@ -0,0 +1,40 @@
+package cc.iotkit.manager.dto.vo.category;
+
+import cc.iotkit.model.product.Category;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+import java.util.Date;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+
+
+@ApiModel(value = "CategoryVo")
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = Category.class)
+
+public class CategoryVo implements Serializable  {
+
+	private static final long serialVersionUID = -1L;
+
+	@ApiModelProperty(value="分类id")
+    @ExcelProperty(value = "分类id")
+		private String id;
+
+	@ApiModelProperty(value="分类描述")
+    @ExcelProperty(value = "分类描述")
+		private Long createAt;
+
+	@ApiModelProperty(value="分类名称")
+    @ExcelProperty(value = "分类名称")
+		private String name;
+
+
+
+}

+ 60 - 0
iot-module/iot-manager/src/main/java/cc/iotkit/manager/dto/vo/product/ProductVo.java

@@ -0,0 +1,60 @@
+package cc.iotkit.manager.dto.vo.product;
+
+import cc.iotkit.model.product.Product;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+import java.util.Date;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+
+
+@ApiModel(value = "ProductVo")
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = Product.class)
+
+public class ProductVo implements Serializable  {
+
+	private static final long serialVersionUID = -1L;
+
+	@ApiModelProperty(value="产品id")
+    @ExcelProperty(value = "产品id")
+		private String id;
+
+	@ApiModelProperty(value="品类")
+    @ExcelProperty(value = "品类")
+		private String category;
+
+	@ApiModelProperty(value="创建时间")
+    @ExcelProperty(value = "创建时间")
+		private Long createAt;
+
+	@ApiModelProperty(value="图片")
+    @ExcelProperty(value = "图片")
+		private String img;
+
+	@ApiModelProperty(value="产品名称")
+    @ExcelProperty(value = "产品名称")
+		private String name;
+
+	@ApiModelProperty(value="节点类型")
+    @ExcelProperty(value = "节点类型")
+		private Integer nodeType;
+
+	@ApiModelProperty(value="是否透传,true/false")
+    @ExcelProperty(value = "是否透传,true/false")
+		private String transparent;
+
+	@ApiModelProperty(value="用户ID")
+    @ExcelProperty(value = "用户ID")
+		private String uid;
+
+
+
+}

+ 60 - 0
iot-module/iot-manager/src/main/java/cc/iotkit/manager/dto/vo/productmodel/ProductModelVo.java

@@ -0,0 +1,60 @@
+package cc.iotkit.manager.dto.vo.productmodel;
+
+import cc.iotkit.model.product.ProductModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+import java.util.Date;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+
+
+@ApiModel(value = "ProductModelVo")
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductModel.class)
+
+public class ProductModelVo implements Serializable  {
+
+	private static final long serialVersionUID = -1L;
+
+	@ApiModelProperty(value="型号id")
+    @ExcelProperty(value = "型号id")
+		private String id;
+
+	@ApiModelProperty(value="型号")
+    @ExcelProperty(value = "型号")
+		private String model;
+
+	@ApiModelProperty(value="修改时间")
+    @ExcelProperty(value = "修改时间")
+		private Long modifyAt;
+
+	@ApiModelProperty(value="名称")
+    @ExcelProperty(value = "名称")
+		private String name;
+
+	@ApiModelProperty(value="产品Key")
+    @ExcelProperty(value = "产品Key")
+		private String productKey;
+
+	@ApiModelProperty(value="脚本内容")
+    @ExcelProperty(value = "脚本内容")
+		private String script;
+
+	@ApiModelProperty(value="脚本状态")
+    @ExcelProperty(value = "脚本状态")
+		private String state;
+
+	@ApiModelProperty(value="脚本类型")
+    @ExcelProperty(value = "脚本类型")
+		private String type;
+
+
+
+}

+ 40 - 0
iot-module/iot-manager/src/main/java/cc/iotkit/manager/dto/vo/thingmodel/ThingModelVo.java

@@ -0,0 +1,40 @@
+package cc.iotkit.manager.dto.vo.thingmodel;
+
+import cc.iotkit.model.product.ThingModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+import java.util.Date;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+
+
+@ApiModel(value = "ThingModelVo")
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ThingModel.class)
+
+public class ThingModelVo implements Serializable  {
+
+	private static final long serialVersionUID = -1L;
+
+	@ApiModelProperty(value="主键")
+    @ExcelProperty(value = "主键")
+		private String id;
+
+	@ApiModelProperty(value="模型内容")
+    @ExcelProperty(value = "模型内容")
+		private String model;
+
+	@ApiModelProperty(value="产品key")
+    @ExcelProperty(value = "产品key")
+		private String productKey;
+
+
+
+}

+ 51 - 0
iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/IProductService.java

@@ -0,0 +1,51 @@
+package cc.iotkit.manager.service;
+
+import cc.iotkit.common.api.PageRequest;
+import cc.iotkit.common.api.Paging;
+import cc.iotkit.manager.dto.bo.category.CategoryBo;
+import cc.iotkit.manager.dto.bo.product.ProductBo;
+import cc.iotkit.manager.dto.bo.productmodel.ProductModelBo;
+import cc.iotkit.manager.dto.bo.thingmodel.ThingModelBo;
+import cc.iotkit.manager.dto.vo.thingmodel.ThingModelVo;
+import cc.iotkit.manager.dto.vo.product.ProductVo;
+import cc.iotkit.manager.dto.vo.category.CategoryVo;
+import cc.iotkit.manager.dto.vo.productmodel.ProductModelVo;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * @Author: jay
+ * @Date: 2023/5/30 16:23
+ * @Version: V1.0
+ * @Description: 产品服务接口
+ */
+public interface IProductService {
+    ProductVo addEntity(ProductBo data);
+
+    boolean updateEntity(ProductBo productBo);
+
+    ProductVo getDetail(String data);
+
+    ThingModelVo getThingModelByProductKey(String data);
+
+    boolean saveThingModel(ThingModelBo data);
+
+    boolean deleteThingModel(String data);
+
+
+
+    boolean deleteCategory(String data);
+
+    boolean editCategory(CategoryBo req);
+
+    String uploadImg(String productKey, MultipartFile file);
+
+    Paging<ProductVo> selectPageList(PageRequest<ProductBo> request);
+
+    Paging<CategoryVo> selectCategoryPageList(PageRequest<CategoryBo> request);
+
+    List<ProductModelVo> getModels(String productKey);
+
+    boolean editProductModel(ProductModelBo productModel);
+}

+ 236 - 0
iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/impl/ProductServiceImpl.java

@@ -0,0 +1,236 @@
+package cc.iotkit.manager.service.impl;
+
+import cc.iotkit.common.api.PageRequest;
+import cc.iotkit.common.api.Paging;
+import cc.iotkit.common.enums.ErrCode;
+import cc.iotkit.common.exception.BizException;
+import cc.iotkit.common.satoken.utils.AuthUtil;
+import cc.iotkit.common.utils.JsonUtils;
+import cc.iotkit.common.utils.MapstructUtils;
+import cc.iotkit.data.manager.ICategoryData;
+import cc.iotkit.data.manager.IProductData;
+import cc.iotkit.data.manager.IProductModelData;
+import cc.iotkit.data.manager.IThingModelData;
+import cc.iotkit.manager.config.AliyunConfig;
+import cc.iotkit.manager.dto.bo.category.CategoryBo;
+import cc.iotkit.manager.dto.bo.product.ProductBo;
+import cc.iotkit.manager.dto.bo.productmodel.ProductModelBo;
+import cc.iotkit.manager.dto.bo.thingmodel.ThingModelBo;
+import cc.iotkit.manager.dto.vo.thingmodel.ThingModelVo;
+import cc.iotkit.manager.dto.vo.category.CategoryVo;
+import cc.iotkit.manager.dto.vo.product.ProductVo;
+import cc.iotkit.manager.dto.vo.productmodel.ProductModelVo;
+import cc.iotkit.manager.service.DataOwnerService;
+import cc.iotkit.manager.service.IProductService;
+import cc.iotkit.model.product.Category;
+import cc.iotkit.model.product.Product;
+import cc.iotkit.model.product.ProductModel;
+import cc.iotkit.model.product.ThingModel;
+import cc.iotkit.temporal.IDbStructureData;
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.model.PutObjectResult;
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Author: jay
+ * @Date: 2023/5/30 17:00
+ * @Version: V1.0
+ * @Description: 产品服务实现类
+ */
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ProductServiceImpl implements IProductService {
+
+    @Autowired
+    @Qualifier("productDataCache")
+    private IProductData productData;
+    @Autowired
+    @Qualifier("thingModelDataCache")
+    private IThingModelData thingModelData;
+    @Autowired
+    @Qualifier("categoryDataCache")
+    private ICategoryData categoryData;
+    @Autowired
+    private DataOwnerService dataOwnerService;
+    @Autowired
+    private AliyunConfig aliyunConfig;
+    @Autowired
+    @Qualifier("productModelDataCache")
+    private IProductModelData productModelData;
+    @Autowired
+    private IDbStructureData dbStructureData;
+
+
+    private OSS ossClient;
+
+    @Override
+    public ProductVo addEntity(ProductBo data) {
+        Product product = data.to(Product.class);
+
+        dataOwnerService.checkOwnerSave(productData, product);
+
+        if (product.getCreateAt() == null) {
+            product.setCreateAt(System.currentTimeMillis());
+        }
+        productData.save(product);
+        return MapstructUtils.convert(product, ProductVo.class);
+}
+
+    @Override
+    public boolean updateEntity(ProductBo productBo) {
+        Product product = productBo.to(Product.class);
+
+        dataOwnerService.checkOwnerSave(productData, product);
+
+        if (product.getCreateAt() == null) {
+            product.setCreateAt(System.currentTimeMillis());
+        }
+        productData.save(product);
+        return true;
+    }
+
+    @Override
+    public ProductVo getDetail(String productKey) {
+       return MapstructUtils.convert(dataOwnerService.checkOwner(productData.findById(productKey)), ProductVo.class);
+    }
+
+    @Override
+    public ThingModelVo getThingModelByProductKey(String productKey) {
+        checkProductOwner(productKey);
+        ThingModel thingModel = thingModelData.findById(productKey);
+        return MapstructUtils.convert(thingModel, ThingModelVo.class);
+    }
+
+    @Override
+    public boolean saveThingModel(ThingModelBo data) {
+        String productKey = data.getProductKey();
+        checkProductOwner(productKey);
+        String model = data.getModel();
+        ThingModel oldData = thingModelData.findById(productKey);
+        ThingModel thingModel = new ThingModel(productKey, productKey, JsonUtils.parseObject(model, ThingModel.Model.class));
+        if (oldData == null) {
+            //定义时序数据库物模型数据结构
+            dbStructureData.defineThingModel(thingModel);
+        } else {
+            //更新时序数据库物模型数据结构
+            dbStructureData.updateThingModel(thingModel);
+        }
+        thingModelData.save(thingModel);
+        return true;
+    }
+
+    @Override
+    public boolean deleteThingModel(String productKey) {
+        checkProductOwner(productKey);
+        ThingModel thingModel = thingModelData.findById(productKey);
+        //删除时序数据库物模型数据结构
+        dbStructureData.defineThingModel(thingModel);
+        thingModelData.deleteById(productKey);
+        return true;
+    }
+
+
+
+    @Override
+    public boolean deleteCategory(String id) {
+        categoryData.deleteById(id);
+        return true;
+    }
+
+    @Override
+    public boolean editCategory(CategoryBo req) {
+        Category cate = req.to(Category.class);
+        cate.setCreateAt(System.currentTimeMillis());
+        categoryData.save(cate);
+        return true;
+    }
+
+    @Override
+    @SneakyThrows
+
+    public String uploadImg(String productKey, MultipartFile file) {
+        productKey = getProduct(productKey).getId();
+
+        String fileName = file.getOriginalFilename();
+        String end = fileName.substring(fileName.lastIndexOf("."));
+        if (ossClient == null) {
+            // 创建OSSClient实例。
+            ossClient = new OSSClientBuilder().build(aliyunConfig.getEndpoint(),
+                    aliyunConfig.getAccessKeyId(), aliyunConfig.getAccessKeySecret());
+        }
+
+        fileName = "product/" + productKey + "/cover" + end;
+        String bucket = aliyunConfig.getBucketId();
+        // 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
+        PutObjectResult result = ossClient.putObject(bucket, fileName,
+                file.getInputStream());
+        return ossClient.generatePresignedUrl(bucket, fileName,
+                new Date(new Date().getTime() + 3600L * 1000 * 24 * 365 * 10)).toString();
+    }
+
+    @Override
+    public Paging<ProductVo> selectPageList(PageRequest<ProductBo> request) {
+        if (!AuthUtil.isAdmin()) {
+            return productData.findByUid(AuthUtil.getUserId(), request.getPageNum(), request.getPageSize()).to(ProductVo.class);
+        }
+
+        return productData.findAll(request.to(Product.class)).to(ProductVo.class);
+    }
+
+    @Override
+    public Paging<CategoryVo> selectCategoryPageList(PageRequest<CategoryBo> request) {
+        return MapstructUtils.convert(categoryData.findAll(request.to(Category.class)), CategoryVo.class);
+
+    }
+
+    @Override
+    public List<ProductModelVo> getModels(String productKey) {
+        dataOwnerService.checkOwner(productData, productKey);
+        return MapstructUtils.convert(productModelData.findByProductKey(productKey), ProductModelVo.class);
+
+    }
+
+    @Override
+    public boolean editProductModel(ProductModelBo productModelBo) {
+        ProductModel productModel = productModelBo.to(ProductModel.class);
+        String model = productModel.getModel();
+        String productKey = productModel.getProductKey();
+        Product product = productData.findById(productKey);
+        if (product == null) {
+            throw new BizException(ErrCode.PRODUCT_NOT_FOUND);
+        }
+        dataOwnerService.checkOwner(product);
+
+        ProductModel oldScript = productModelData.findByModel(model);
+        if (oldScript != null && !oldScript.getProductKey().equals(productKey)) {
+            throw new BizException(ErrCode.MODEL_ALREADY);
+        }
+
+        productModel.setModifyAt(System.currentTimeMillis());
+        productModelData.save(productModel);
+        return false;
+    }
+
+    private Product getProduct(String productKey) {
+       return dataOwnerService.checkOwner(productData.findById(productKey));
+    }
+
+
+    /***********/
+    private void checkProductOwner(String productKey) {
+        dataOwnerService.checkOwner(productData.findById(productKey));
+    }
+
+}