diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml index eb2d8e7..a677692 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml @@ -4,13 +4,13 @@ - + + - - + @@ -29,7 +29,7 @@ - Id, product_id, version_file, version, owner, dscn, create_time, create_user_id + id, product_id, version_file, version_name, version, owner, version_desc, create_time, create_user_id @@ -40,7 +40,7 @@ deptid, dv.create_time AS "createTime", dv.version, - dv.dscn, + dv.version_desc, dv.owner FROM ( SELECT * diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java index 8d1aa68..3b82878 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java @@ -8,18 +8,21 @@ @ApiModel public class ProductListDTO { - @ApiModelProperty(value = "产品名称", dataType = "String") - private String productName; - - @ApiModelProperty(value = "产品编号", dataType = "String") private String productNo; + @ApiModelProperty(value = "产品名称", dataType = "String") + private String productName; - @ApiModelProperty(value = "开始时间", dataType = "String") - private String beginTime; + @ApiModelProperty(value = "设备类型", dataType = "String") + private String productType; + @ApiModelProperty(value = "设备型号", dataType = "String") + private String model; - @ApiModelProperty(value = "结束时间", dataType = "String") - private String endTime; + @ApiModelProperty(value = "数据加密方式", dataType = "String") + private String encipherType; + + @ApiModelProperty(value = "接入方式", dataType = "String") + private String accessType; } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml index eb2d8e7..a677692 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml @@ -4,13 +4,13 @@ - + + - - + @@ -29,7 +29,7 @@ - Id, product_id, version_file, version, owner, dscn, create_time, create_user_id + id, product_id, version_file, version_name, version, owner, version_desc, create_time, create_user_id @@ -40,7 +40,7 @@ deptid, dv.create_time AS "createTime", dv.version, - dv.dscn, + dv.version_desc, dv.owner FROM ( SELECT * diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java index 8d1aa68..3b82878 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java @@ -8,18 +8,21 @@ @ApiModel public class ProductListDTO { - @ApiModelProperty(value = "产品名称", dataType = "String") - private String productName; - - @ApiModelProperty(value = "产品编号", dataType = "String") private String productNo; + @ApiModelProperty(value = "产品名称", dataType = "String") + private String productName; - @ApiModelProperty(value = "开始时间", dataType = "String") - private String beginTime; + @ApiModelProperty(value = "设备类型", dataType = "String") + private String productType; + @ApiModelProperty(value = "设备型号", dataType = "String") + private String model; - @ApiModelProperty(value = "结束时间", dataType = "String") - private String endTime; + @ApiModelProperty(value = "数据加密方式", dataType = "String") + private String encipherType; + + @ApiModelProperty(value = "接入方式", dataType = "String") + private String accessType; } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java index 6f33b9d..dba6fcb 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("Id") + @TableId("id") private Long id; /** @@ -40,10 +40,10 @@ * 升级包文件 */ @TableField("version_file") - private String versionFile; + private byte[] versionFile; /** - * 升级包文件 + * 升级包文件名 */ @TableField("version_name") private String versionName; @@ -64,8 +64,8 @@ /** * 升级包描述 */ - @TableField("dscn") - private String descn; + @TableField("version_desc") + private String versionDesc; /** * 创建日期 默认为当前时间 @@ -83,8 +83,7 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java index 8404470..d831622 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java @@ -4,17 +4,14 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; /** *

@@ -24,8 +21,7 @@ * @author cz * @since 2023-11-22 */ -@Getter -@Setter +@Data @ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -35,7 +31,7 @@ /** * 产品id */ - @TableId("Id") + @TableId("id") private Long id; @@ -63,6 +59,17 @@ @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") private String accessTypeName; + /** + * 供电方式 直流、电池 + */ + @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) + private Integer powerType; + + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 加密类型 加密类型-tea.sm4,明文 @@ -89,25 +96,6 @@ private String communicationProtocolName; /** - * 供电方式 直流、电池 - */ - @TableField("power_type") - @ApiModelProperty(value = "供电方式", dataType = "Integer") - @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) - private Integer powerType; - - @TableField(exist = false) - @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") - private String powerTypeName; - - /** - * 产品描述 产品介绍描述 - */ - @TableField("descn") - @ApiModelProperty(value = "产品描述", dataType = "String") - private String descn; - - /** * 产品类别 */ @TableField("product_type") @@ -120,6 +108,21 @@ @ApiModelProperty(value = "产品类别", dataType = "String") private String productTypeName; + /** + * 型号 + */ + @TableField("model") + @ApiModelProperty(value = "型号", dataType = "String") + private String model; + + + /** + * 产品描述 产品介绍描述 + */ + @TableField("description") + @ApiModelProperty(value = "产品描述", dataType = "String") + private String description; + /** * 产品负责人(技术) @@ -138,7 +141,7 @@ /** * 创建人id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; /** @@ -147,12 +150,4 @@ @TableField("create_user_id") private Long createUserId; - @TableField(exist = false) - @ApiModelProperty(value = "产品配置项内容", dataType = "String") - List productConfigItems; - - @TableField(exist = false) - @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") - List productDataItems; - } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml index eb2d8e7..a677692 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml @@ -4,13 +4,13 @@ - + + - - + @@ -29,7 +29,7 @@ - Id, product_id, version_file, version, owner, dscn, create_time, create_user_id + id, product_id, version_file, version_name, version, owner, version_desc, create_time, create_user_id @@ -40,7 +40,7 @@ deptid, dv.create_time AS "createTime", dv.version, - dv.dscn, + dv.version_desc, dv.owner FROM ( SELECT * diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java index 8d1aa68..3b82878 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java @@ -8,18 +8,21 @@ @ApiModel public class ProductListDTO { - @ApiModelProperty(value = "产品名称", dataType = "String") - private String productName; - - @ApiModelProperty(value = "产品编号", dataType = "String") private String productNo; + @ApiModelProperty(value = "产品名称", dataType = "String") + private String productName; - @ApiModelProperty(value = "开始时间", dataType = "String") - private String beginTime; + @ApiModelProperty(value = "设备类型", dataType = "String") + private String productType; + @ApiModelProperty(value = "设备型号", dataType = "String") + private String model; - @ApiModelProperty(value = "结束时间", dataType = "String") - private String endTime; + @ApiModelProperty(value = "数据加密方式", dataType = "String") + private String encipherType; + + @ApiModelProperty(value = "接入方式", dataType = "String") + private String accessType; } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java index 6f33b9d..dba6fcb 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("Id") + @TableId("id") private Long id; /** @@ -40,10 +40,10 @@ * 升级包文件 */ @TableField("version_file") - private String versionFile; + private byte[] versionFile; /** - * 升级包文件 + * 升级包文件名 */ @TableField("version_name") private String versionName; @@ -64,8 +64,8 @@ /** * 升级包描述 */ - @TableField("dscn") - private String descn; + @TableField("version_desc") + private String versionDesc; /** * 创建日期 默认为当前时间 @@ -83,8 +83,7 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java index 8404470..d831622 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java @@ -4,17 +4,14 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; /** *

@@ -24,8 +21,7 @@ * @author cz * @since 2023-11-22 */ -@Getter -@Setter +@Data @ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -35,7 +31,7 @@ /** * 产品id */ - @TableId("Id") + @TableId("id") private Long id; @@ -63,6 +59,17 @@ @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") private String accessTypeName; + /** + * 供电方式 直流、电池 + */ + @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) + private Integer powerType; + + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 加密类型 加密类型-tea.sm4,明文 @@ -89,25 +96,6 @@ private String communicationProtocolName; /** - * 供电方式 直流、电池 - */ - @TableField("power_type") - @ApiModelProperty(value = "供电方式", dataType = "Integer") - @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) - private Integer powerType; - - @TableField(exist = false) - @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") - private String powerTypeName; - - /** - * 产品描述 产品介绍描述 - */ - @TableField("descn") - @ApiModelProperty(value = "产品描述", dataType = "String") - private String descn; - - /** * 产品类别 */ @TableField("product_type") @@ -120,6 +108,21 @@ @ApiModelProperty(value = "产品类别", dataType = "String") private String productTypeName; + /** + * 型号 + */ + @TableField("model") + @ApiModelProperty(value = "型号", dataType = "String") + private String model; + + + /** + * 产品描述 产品介绍描述 + */ + @TableField("description") + @ApiModelProperty(value = "产品描述", dataType = "String") + private String description; + /** * 产品负责人(技术) @@ -138,7 +141,7 @@ /** * 创建人id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; /** @@ -147,12 +150,4 @@ @TableField("create_user_id") private Long createUserId; - @TableField(exist = false) - @ApiModelProperty(value = "产品配置项内容", dataType = "String") - List productConfigItems; - - @TableField(exist = false) - @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") - List productDataItems; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java new file mode 100644 index 0000000..31a37ab --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java @@ -0,0 +1,71 @@ +package com.casic.missiles.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 产品扩展信息表 AEP平台相关 + *

+ * + * @author tanyue + * @since 2025-01-02 + */ +@Data +@ApiModel +@TableName("product_info_aep_ext") +public class ProductInfoAepExt implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 产品id + */ + @TableId("product_id") + private Long productId; + + + @TableField("aep_product_id") + @ApiModelProperty(value = "AEP平台的产品ID", dataType = "String") + private String aepProductId; + + + /** + * AEP平台的产品Master-APIkey + */ + @TableField("aep_master_key") + @ApiModelProperty(value = "AEP平台的产品Master-APIkey", dataType = "String") + private String aepMasterKey; + + /** + * AEP平台SDK的key值 + */ + @TableField("aep_sdk_key") + @ApiModelProperty(value = "AEP平台SDK的key值", dataType = "String") + private String aepSdkKey; + + /** + * AEP平台SDK的secret值 + */ + @TableField("aep_sdk_secret") + @ApiModelProperty(value = "AEP平台SDK的secret值AEP平台SDK的secret值", dataType = "String") + private String aepSdkSecret; + + /** + * AEP平台的接入地址 + */ + @TableField("aep_base_url") + @ApiModelProperty(value = "AEP平台的接入地址", dataType = "String") + private Integer aepBaseUrl; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java index dbb7edf..80cb895 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.version.DeviceVersionDTO; import com.casic.missiles.dto.version.DeviceVersionListVO; import com.casic.missiles.model.DeviceVersion; +import org.apache.ibatis.annotations.CacheNamespace; import java.util.List; @@ -18,6 +19,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface IDeviceVersionService extends IService { Page listPage(Page page, DeviceVersionDTO deviceVersionDTO) throws Exception; diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml index eb2d8e7..a677692 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml @@ -4,13 +4,13 @@ - + + - - + @@ -29,7 +29,7 @@ - Id, product_id, version_file, version, owner, dscn, create_time, create_user_id + id, product_id, version_file, version_name, version, owner, version_desc, create_time, create_user_id @@ -40,7 +40,7 @@ deptid, dv.create_time AS "createTime", dv.version, - dv.dscn, + dv.version_desc, dv.owner FROM ( SELECT * diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java index 8d1aa68..3b82878 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java @@ -8,18 +8,21 @@ @ApiModel public class ProductListDTO { - @ApiModelProperty(value = "产品名称", dataType = "String") - private String productName; - - @ApiModelProperty(value = "产品编号", dataType = "String") private String productNo; + @ApiModelProperty(value = "产品名称", dataType = "String") + private String productName; - @ApiModelProperty(value = "开始时间", dataType = "String") - private String beginTime; + @ApiModelProperty(value = "设备类型", dataType = "String") + private String productType; + @ApiModelProperty(value = "设备型号", dataType = "String") + private String model; - @ApiModelProperty(value = "结束时间", dataType = "String") - private String endTime; + @ApiModelProperty(value = "数据加密方式", dataType = "String") + private String encipherType; + + @ApiModelProperty(value = "接入方式", dataType = "String") + private String accessType; } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java index 6f33b9d..dba6fcb 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("Id") + @TableId("id") private Long id; /** @@ -40,10 +40,10 @@ * 升级包文件 */ @TableField("version_file") - private String versionFile; + private byte[] versionFile; /** - * 升级包文件 + * 升级包文件名 */ @TableField("version_name") private String versionName; @@ -64,8 +64,8 @@ /** * 升级包描述 */ - @TableField("dscn") - private String descn; + @TableField("version_desc") + private String versionDesc; /** * 创建日期 默认为当前时间 @@ -83,8 +83,7 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java index 8404470..d831622 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java @@ -4,17 +4,14 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; /** *

@@ -24,8 +21,7 @@ * @author cz * @since 2023-11-22 */ -@Getter -@Setter +@Data @ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -35,7 +31,7 @@ /** * 产品id */ - @TableId("Id") + @TableId("id") private Long id; @@ -63,6 +59,17 @@ @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") private String accessTypeName; + /** + * 供电方式 直流、电池 + */ + @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) + private Integer powerType; + + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 加密类型 加密类型-tea.sm4,明文 @@ -89,25 +96,6 @@ private String communicationProtocolName; /** - * 供电方式 直流、电池 - */ - @TableField("power_type") - @ApiModelProperty(value = "供电方式", dataType = "Integer") - @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) - private Integer powerType; - - @TableField(exist = false) - @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") - private String powerTypeName; - - /** - * 产品描述 产品介绍描述 - */ - @TableField("descn") - @ApiModelProperty(value = "产品描述", dataType = "String") - private String descn; - - /** * 产品类别 */ @TableField("product_type") @@ -120,6 +108,21 @@ @ApiModelProperty(value = "产品类别", dataType = "String") private String productTypeName; + /** + * 型号 + */ + @TableField("model") + @ApiModelProperty(value = "型号", dataType = "String") + private String model; + + + /** + * 产品描述 产品介绍描述 + */ + @TableField("description") + @ApiModelProperty(value = "产品描述", dataType = "String") + private String description; + /** * 产品负责人(技术) @@ -138,7 +141,7 @@ /** * 创建人id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; /** @@ -147,12 +150,4 @@ @TableField("create_user_id") private Long createUserId; - @TableField(exist = false) - @ApiModelProperty(value = "产品配置项内容", dataType = "String") - List productConfigItems; - - @TableField(exist = false) - @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") - List productDataItems; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java new file mode 100644 index 0000000..31a37ab --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java @@ -0,0 +1,71 @@ +package com.casic.missiles.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 产品扩展信息表 AEP平台相关 + *

+ * + * @author tanyue + * @since 2025-01-02 + */ +@Data +@ApiModel +@TableName("product_info_aep_ext") +public class ProductInfoAepExt implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 产品id + */ + @TableId("product_id") + private Long productId; + + + @TableField("aep_product_id") + @ApiModelProperty(value = "AEP平台的产品ID", dataType = "String") + private String aepProductId; + + + /** + * AEP平台的产品Master-APIkey + */ + @TableField("aep_master_key") + @ApiModelProperty(value = "AEP平台的产品Master-APIkey", dataType = "String") + private String aepMasterKey; + + /** + * AEP平台SDK的key值 + */ + @TableField("aep_sdk_key") + @ApiModelProperty(value = "AEP平台SDK的key值", dataType = "String") + private String aepSdkKey; + + /** + * AEP平台SDK的secret值 + */ + @TableField("aep_sdk_secret") + @ApiModelProperty(value = "AEP平台SDK的secret值AEP平台SDK的secret值", dataType = "String") + private String aepSdkSecret; + + /** + * AEP平台的接入地址 + */ + @TableField("aep_base_url") + @ApiModelProperty(value = "AEP平台的接入地址", dataType = "String") + private Integer aepBaseUrl; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java index dbb7edf..80cb895 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.version.DeviceVersionDTO; import com.casic.missiles.dto.version.DeviceVersionListVO; import com.casic.missiles.model.DeviceVersion; +import org.apache.ibatis.annotations.CacheNamespace; import java.util.List; @@ -18,6 +19,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface IDeviceVersionService extends IService { Page listPage(Page page, DeviceVersionDTO deviceVersionDTO) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java index 6871472..99cd389 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java @@ -1,42 +1,31 @@ package com.casic.missiles.service.impl; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.group.DeviceGroupListVO; import com.casic.missiles.dto.product.ProductListDTO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.mapper.ProductConfigItemMapper; -import com.casic.missiles.mapper.ProductDataItemMapper; import com.casic.missiles.mapper.ProductInfoMapper; -import com.casic.missiles.mapper.common.SysCommonMapper; -import com.casic.missiles.model.Device; import com.casic.missiles.model.ProductConfigItem; import com.casic.missiles.model.ProductDataItem; import com.casic.missiles.model.ProductInfo; -import com.casic.missiles.service.IProductConfigItemService; -import com.casic.missiles.service.IProductDataItemService; import com.casic.missiles.service.IProductInfoService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.NumberGeneratorUtil; -import io.swagger.annotations.Api; import lombok.RequiredArgsConstructor; -import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; /** *

@@ -50,9 +39,6 @@ @RequiredArgsConstructor public class ProductInfoServiceImpl extends ServiceImpl implements IProductInfoService { - private final IProductConfigItemService productConfigItemService; - private final IProductDataItemService productDataItemService; - @Override public Page listPage(Page page, ProductListDTO request, DataScope dataScope) throws Exception { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -60,12 +46,6 @@ "product_name", request.getProductName()); queryWrapper.like(StringUtils.isNotBlank(request.getProductNo()), "product_no", request.getProductNo()); - if (org.apache.commons.lang3.StringUtils.isNotBlank(request.getBeginTime())) { - queryWrapper.apply("{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getBeginTime().split(" ")[0]); - } - if (org.apache.commons.lang3.StringUtils.isNotBlank(request.getEndTime())) { - queryWrapper.apply("{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime().split(" ")[0]); - } page = this.baseMapper.selectPage(page, queryWrapper); for (ProductInfo productInfo : page.getRecords()) { DictCodeUtils.convertDictCodeToName(productInfo); @@ -82,35 +62,13 @@ productInfo.setProductNo(productNo); productInfo.setCreateUserName(shiroUser.getName()); productInfo.setCreateUserId(shiroUser.getId()); - if (this.baseMapper.insert(productInfo) > 0) { - for (ProductConfigItem productConfigItem : productInfo.getProductConfigItems()) { - productConfigItem.setProductId(productInfo.getId()); - } - for (ProductDataItem productDataItem : productInfo.getProductDataItems()) { - productDataItem.setProductId(productInfo.getId()); - } - if ((CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productDataItemService.saveBatch(productInfo.getProductDataItems())) - && (CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productConfigItemService.saveBatch(productInfo.getProductConfigItems()))) { - return ReturnUtil.success(); - } - } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @Override public ReturnDTO updateProduct(ProductInfo productInfo) { - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.eq("product_id", productInfo.getId()); - productConfigItemService.remove(configQueryWrapper); - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.eq("product_id", productInfo.getId()); - productDataItemService.remove(productDataItemList); if (this.baseMapper.updateById(productInfo) > 0) { - //重新添加 - if ((CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productDataItemService.saveBatch(productInfo.getProductDataItems())) - && (CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productConfigItemService.saveBatch(productInfo.getProductConfigItems()))) { - return ReturnUtil.success(); - } + return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -118,30 +76,13 @@ @Override public ProductInfo productDetail(Long id) throws Exception{ ProductInfo productInfo = this.baseMapper.selectById(id); - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.eq("product_id", id); - List productConfigItemList = productConfigItemService.list(configQueryWrapper); - if (CollectionUtils.isNotEmpty(productConfigItemList)) { - productInfo.setProductConfigItems(productConfigItemList); - } - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.eq("product_id", productInfo.getId()); - List productDataItems = productDataItemService.list(productDataItemList); - if (CollectionUtils.isNotEmpty(productDataItems)) { - productInfo.setProductDataItems(productDataItems); - } + DictCodeUtils.convertDictCodeToName(productInfo); return productInfo; } @Override public ReturnDTO deleteProduct(List ids) { - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.in("product_id", ids); - productConfigItemService.remove(configQueryWrapper); - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.in("product_id", ids); - productDataItemService.remove(productDataItemList); if ((this.baseMapper.deleteBatchIds(ids)) > 0) { return ReturnUtil.success(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java index f42012a..1d625f6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java @@ -15,6 +15,7 @@ boolean validateCRC(byte[] frameBytes); String calculateCRC(String toBeVerified); + String calculateCRC(byte[] toBeVerifiedBytes); boolean validateLength(byte[] tagBytes, int length); diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml index eb2d8e7..a677692 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml @@ -4,13 +4,13 @@ - + + - - + @@ -29,7 +29,7 @@ - Id, product_id, version_file, version, owner, dscn, create_time, create_user_id + id, product_id, version_file, version_name, version, owner, version_desc, create_time, create_user_id @@ -40,7 +40,7 @@ deptid, dv.create_time AS "createTime", dv.version, - dv.dscn, + dv.version_desc, dv.owner FROM ( SELECT * diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java index 8d1aa68..3b82878 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java @@ -8,18 +8,21 @@ @ApiModel public class ProductListDTO { - @ApiModelProperty(value = "产品名称", dataType = "String") - private String productName; - - @ApiModelProperty(value = "产品编号", dataType = "String") private String productNo; + @ApiModelProperty(value = "产品名称", dataType = "String") + private String productName; - @ApiModelProperty(value = "开始时间", dataType = "String") - private String beginTime; + @ApiModelProperty(value = "设备类型", dataType = "String") + private String productType; + @ApiModelProperty(value = "设备型号", dataType = "String") + private String model; - @ApiModelProperty(value = "结束时间", dataType = "String") - private String endTime; + @ApiModelProperty(value = "数据加密方式", dataType = "String") + private String encipherType; + + @ApiModelProperty(value = "接入方式", dataType = "String") + private String accessType; } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java index 6f33b9d..dba6fcb 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("Id") + @TableId("id") private Long id; /** @@ -40,10 +40,10 @@ * 升级包文件 */ @TableField("version_file") - private String versionFile; + private byte[] versionFile; /** - * 升级包文件 + * 升级包文件名 */ @TableField("version_name") private String versionName; @@ -64,8 +64,8 @@ /** * 升级包描述 */ - @TableField("dscn") - private String descn; + @TableField("version_desc") + private String versionDesc; /** * 创建日期 默认为当前时间 @@ -83,8 +83,7 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java index 8404470..d831622 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java @@ -4,17 +4,14 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; /** *

@@ -24,8 +21,7 @@ * @author cz * @since 2023-11-22 */ -@Getter -@Setter +@Data @ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -35,7 +31,7 @@ /** * 产品id */ - @TableId("Id") + @TableId("id") private Long id; @@ -63,6 +59,17 @@ @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") private String accessTypeName; + /** + * 供电方式 直流、电池 + */ + @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) + private Integer powerType; + + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 加密类型 加密类型-tea.sm4,明文 @@ -89,25 +96,6 @@ private String communicationProtocolName; /** - * 供电方式 直流、电池 - */ - @TableField("power_type") - @ApiModelProperty(value = "供电方式", dataType = "Integer") - @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) - private Integer powerType; - - @TableField(exist = false) - @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") - private String powerTypeName; - - /** - * 产品描述 产品介绍描述 - */ - @TableField("descn") - @ApiModelProperty(value = "产品描述", dataType = "String") - private String descn; - - /** * 产品类别 */ @TableField("product_type") @@ -120,6 +108,21 @@ @ApiModelProperty(value = "产品类别", dataType = "String") private String productTypeName; + /** + * 型号 + */ + @TableField("model") + @ApiModelProperty(value = "型号", dataType = "String") + private String model; + + + /** + * 产品描述 产品介绍描述 + */ + @TableField("description") + @ApiModelProperty(value = "产品描述", dataType = "String") + private String description; + /** * 产品负责人(技术) @@ -138,7 +141,7 @@ /** * 创建人id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; /** @@ -147,12 +150,4 @@ @TableField("create_user_id") private Long createUserId; - @TableField(exist = false) - @ApiModelProperty(value = "产品配置项内容", dataType = "String") - List productConfigItems; - - @TableField(exist = false) - @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") - List productDataItems; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java new file mode 100644 index 0000000..31a37ab --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java @@ -0,0 +1,71 @@ +package com.casic.missiles.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 产品扩展信息表 AEP平台相关 + *

+ * + * @author tanyue + * @since 2025-01-02 + */ +@Data +@ApiModel +@TableName("product_info_aep_ext") +public class ProductInfoAepExt implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 产品id + */ + @TableId("product_id") + private Long productId; + + + @TableField("aep_product_id") + @ApiModelProperty(value = "AEP平台的产品ID", dataType = "String") + private String aepProductId; + + + /** + * AEP平台的产品Master-APIkey + */ + @TableField("aep_master_key") + @ApiModelProperty(value = "AEP平台的产品Master-APIkey", dataType = "String") + private String aepMasterKey; + + /** + * AEP平台SDK的key值 + */ + @TableField("aep_sdk_key") + @ApiModelProperty(value = "AEP平台SDK的key值", dataType = "String") + private String aepSdkKey; + + /** + * AEP平台SDK的secret值 + */ + @TableField("aep_sdk_secret") + @ApiModelProperty(value = "AEP平台SDK的secret值AEP平台SDK的secret值", dataType = "String") + private String aepSdkSecret; + + /** + * AEP平台的接入地址 + */ + @TableField("aep_base_url") + @ApiModelProperty(value = "AEP平台的接入地址", dataType = "String") + private Integer aepBaseUrl; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java index dbb7edf..80cb895 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.version.DeviceVersionDTO; import com.casic.missiles.dto.version.DeviceVersionListVO; import com.casic.missiles.model.DeviceVersion; +import org.apache.ibatis.annotations.CacheNamespace; import java.util.List; @@ -18,6 +19,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface IDeviceVersionService extends IService { Page listPage(Page page, DeviceVersionDTO deviceVersionDTO) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java index 6871472..99cd389 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java @@ -1,42 +1,31 @@ package com.casic.missiles.service.impl; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.group.DeviceGroupListVO; import com.casic.missiles.dto.product.ProductListDTO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.mapper.ProductConfigItemMapper; -import com.casic.missiles.mapper.ProductDataItemMapper; import com.casic.missiles.mapper.ProductInfoMapper; -import com.casic.missiles.mapper.common.SysCommonMapper; -import com.casic.missiles.model.Device; import com.casic.missiles.model.ProductConfigItem; import com.casic.missiles.model.ProductDataItem; import com.casic.missiles.model.ProductInfo; -import com.casic.missiles.service.IProductConfigItemService; -import com.casic.missiles.service.IProductDataItemService; import com.casic.missiles.service.IProductInfoService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.NumberGeneratorUtil; -import io.swagger.annotations.Api; import lombok.RequiredArgsConstructor; -import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; /** *

@@ -50,9 +39,6 @@ @RequiredArgsConstructor public class ProductInfoServiceImpl extends ServiceImpl implements IProductInfoService { - private final IProductConfigItemService productConfigItemService; - private final IProductDataItemService productDataItemService; - @Override public Page listPage(Page page, ProductListDTO request, DataScope dataScope) throws Exception { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -60,12 +46,6 @@ "product_name", request.getProductName()); queryWrapper.like(StringUtils.isNotBlank(request.getProductNo()), "product_no", request.getProductNo()); - if (org.apache.commons.lang3.StringUtils.isNotBlank(request.getBeginTime())) { - queryWrapper.apply("{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getBeginTime().split(" ")[0]); - } - if (org.apache.commons.lang3.StringUtils.isNotBlank(request.getEndTime())) { - queryWrapper.apply("{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime().split(" ")[0]); - } page = this.baseMapper.selectPage(page, queryWrapper); for (ProductInfo productInfo : page.getRecords()) { DictCodeUtils.convertDictCodeToName(productInfo); @@ -82,35 +62,13 @@ productInfo.setProductNo(productNo); productInfo.setCreateUserName(shiroUser.getName()); productInfo.setCreateUserId(shiroUser.getId()); - if (this.baseMapper.insert(productInfo) > 0) { - for (ProductConfigItem productConfigItem : productInfo.getProductConfigItems()) { - productConfigItem.setProductId(productInfo.getId()); - } - for (ProductDataItem productDataItem : productInfo.getProductDataItems()) { - productDataItem.setProductId(productInfo.getId()); - } - if ((CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productDataItemService.saveBatch(productInfo.getProductDataItems())) - && (CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productConfigItemService.saveBatch(productInfo.getProductConfigItems()))) { - return ReturnUtil.success(); - } - } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @Override public ReturnDTO updateProduct(ProductInfo productInfo) { - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.eq("product_id", productInfo.getId()); - productConfigItemService.remove(configQueryWrapper); - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.eq("product_id", productInfo.getId()); - productDataItemService.remove(productDataItemList); if (this.baseMapper.updateById(productInfo) > 0) { - //重新添加 - if ((CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productDataItemService.saveBatch(productInfo.getProductDataItems())) - && (CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productConfigItemService.saveBatch(productInfo.getProductConfigItems()))) { - return ReturnUtil.success(); - } + return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -118,30 +76,13 @@ @Override public ProductInfo productDetail(Long id) throws Exception{ ProductInfo productInfo = this.baseMapper.selectById(id); - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.eq("product_id", id); - List productConfigItemList = productConfigItemService.list(configQueryWrapper); - if (CollectionUtils.isNotEmpty(productConfigItemList)) { - productInfo.setProductConfigItems(productConfigItemList); - } - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.eq("product_id", productInfo.getId()); - List productDataItems = productDataItemService.list(productDataItemList); - if (CollectionUtils.isNotEmpty(productDataItems)) { - productInfo.setProductDataItems(productDataItems); - } + DictCodeUtils.convertDictCodeToName(productInfo); return productInfo; } @Override public ReturnDTO deleteProduct(List ids) { - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.in("product_id", ids); - productConfigItemService.remove(configQueryWrapper); - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.in("product_id", ids); - productDataItemService.remove(productDataItemList); if ((this.baseMapper.deleteBatchIds(ids)) > 0) { return ReturnUtil.success(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java index f42012a..1d625f6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java @@ -15,6 +15,7 @@ boolean validateCRC(byte[] frameBytes); String calculateCRC(String toBeVerified); + String calculateCRC(byte[] toBeVerifiedBytes); boolean validateLength(byte[] tagBytes, int length); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java index d047453..219dd84 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java @@ -55,9 +55,14 @@ public String calculateCRC(String toBeVerified) { byte[] bytes = HexUtils.fromHexString(toBeVerified); + return calculateCRC(bytes); + } + + @Override + public String calculateCRC(byte[] toBeVerifiedBytes) { // 计算CRC值 CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); - long crcVal = crcUtil.calculateCRC(bytes); + long crcVal = crcUtil.calculateCRC(toBeVerifiedBytes); // 格式化输出 String crcStr = String.format("%0" + BirmmFrameAttributeEnums.CRC.getLength() * 2 + "X", crcVal); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 446078c..997971c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -53,6 +53,9 @@ IDeviceUpgradeTaskService otaService; @Resource + IDeviceVersionService versionService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -316,7 +319,7 @@ @Override public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame); if (null != replyFrame) { replyFrame.setDevCode(uploadFrame.getDevCode()); @@ -446,16 +449,25 @@ return baseFrame; } - private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + private BirmmBaseReply createBirmmReplyFrame(BirmmBaseFrame uploadFrame) { BirmmBaseReply baseReply = null; + String operaType = uploadFrame.getOperationType(); + String devCode = uploadFrame.getDevCode(); + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); if (ObjectUtil.isNotNull(operationTypeEnums)) { switch (operationTypeEnums) { case UP_GET_REQUEST: // GetRequest回复类型为GetResponse - // TODO - replyGetRequestHandler(baseReply); + baseReply = SpringContextUtil.getBean(BirmmGetResponse.class); + BirmmGetResponse getResponse = (BirmmGetResponse) baseReply; + + getResponse.setReqSize(((BirmmGetRequest) uploadFrame).getRequestSize()); + getResponse.setReqOffset(((BirmmGetRequest) uploadFrame).getRequestOffset()); + + // 执行组装升级包的操作 + replyGetRequestHandler(devCode, getResponse); break; case UP_TRAP_REQUEST: @@ -469,7 +481,7 @@ baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 // 组装需要下发的配置项Tag - baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + baseReply.setReplyTagList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); replyTrapRequestHandler(latestConfig); } else { // 没有配置时回复TrapResponse @@ -483,7 +495,7 @@ baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 // 需要判断是否有升级任务 - replyOnlineRequestHandler(baseReply); + replyOnlineRequestHandler(devCode, (BirmmOnlineResponse) baseReply); break; case UP_STARTUP_REQUEST: @@ -502,17 +514,42 @@ return baseReply; } - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + private void replyGetRequestHandler(String devCode, BirmmGetResponse getResponse) { + // 查找升级包 + Device device = deviceService.getDeviceByDeviceCode(devCode); if (ObjectUtil.isNotNull(device)) { DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); if (ObjectUtil.isNotNull(task)) { - log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + // 查找升级包 计算升级包的大小和CRC + DeviceVersion otaVersion = versionService.getById(task.getVersionId()); + + log.info("本次发送包数据:{},[{}, 总包大小:{}, 本次起始偏移量:{}, 本次请求大小:{}]", + devCode, task.getUpgradeVersionName(), otaVersion.getVersionFile().length, getResponse.getReqOffset(), getResponse.getReqSize()); + + // 设置本次要下发的数据 + byte[] dataThisTime = new byte[getResponse.getReqSize()]; + System.arraycopy(otaVersion.getVersionFile(), getResponse.getReqOffset(), dataThisTime, 0, getResponse.getReqSize()); + getResponse.setReqData(dataThisTime); + } + } + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(String devCode, BirmmOnlineResponse onlineResponse) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + // 需要升级 + onlineResponse.setNeedOTA(true); + + // 查找升级包 计算升级包的大小和CRC + DeviceVersion otaVersion = versionService.getById(task.getVersionId()); + onlineResponse.setPackageSize(otaVersion.getVersionFile().length); + onlineResponse.setPackageCrc(protocol.calculateCRC(otaVersion.getVersionFile())); + + log.info("找到待升级的任务:{},[{}, 总包大小:{}, CRC校验值:{}]", devCode, task.getUpgradeVersionName(), onlineResponse.getPackageSize(), onlineResponse.getPackageCrc()); } } } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml index eb2d8e7..a677692 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml @@ -4,13 +4,13 @@ - + + - - + @@ -29,7 +29,7 @@ - Id, product_id, version_file, version, owner, dscn, create_time, create_user_id + id, product_id, version_file, version_name, version, owner, version_desc, create_time, create_user_id @@ -40,7 +40,7 @@ deptid, dv.create_time AS "createTime", dv.version, - dv.dscn, + dv.version_desc, dv.owner FROM ( SELECT * diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java index 8d1aa68..3b82878 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java @@ -8,18 +8,21 @@ @ApiModel public class ProductListDTO { - @ApiModelProperty(value = "产品名称", dataType = "String") - private String productName; - - @ApiModelProperty(value = "产品编号", dataType = "String") private String productNo; + @ApiModelProperty(value = "产品名称", dataType = "String") + private String productName; - @ApiModelProperty(value = "开始时间", dataType = "String") - private String beginTime; + @ApiModelProperty(value = "设备类型", dataType = "String") + private String productType; + @ApiModelProperty(value = "设备型号", dataType = "String") + private String model; - @ApiModelProperty(value = "结束时间", dataType = "String") - private String endTime; + @ApiModelProperty(value = "数据加密方式", dataType = "String") + private String encipherType; + + @ApiModelProperty(value = "接入方式", dataType = "String") + private String accessType; } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java index 6f33b9d..dba6fcb 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("Id") + @TableId("id") private Long id; /** @@ -40,10 +40,10 @@ * 升级包文件 */ @TableField("version_file") - private String versionFile; + private byte[] versionFile; /** - * 升级包文件 + * 升级包文件名 */ @TableField("version_name") private String versionName; @@ -64,8 +64,8 @@ /** * 升级包描述 */ - @TableField("dscn") - private String descn; + @TableField("version_desc") + private String versionDesc; /** * 创建日期 默认为当前时间 @@ -83,8 +83,7 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java index 8404470..d831622 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java @@ -4,17 +4,14 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; /** *

@@ -24,8 +21,7 @@ * @author cz * @since 2023-11-22 */ -@Getter -@Setter +@Data @ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -35,7 +31,7 @@ /** * 产品id */ - @TableId("Id") + @TableId("id") private Long id; @@ -63,6 +59,17 @@ @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") private String accessTypeName; + /** + * 供电方式 直流、电池 + */ + @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) + private Integer powerType; + + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 加密类型 加密类型-tea.sm4,明文 @@ -89,25 +96,6 @@ private String communicationProtocolName; /** - * 供电方式 直流、电池 - */ - @TableField("power_type") - @ApiModelProperty(value = "供电方式", dataType = "Integer") - @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) - private Integer powerType; - - @TableField(exist = false) - @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") - private String powerTypeName; - - /** - * 产品描述 产品介绍描述 - */ - @TableField("descn") - @ApiModelProperty(value = "产品描述", dataType = "String") - private String descn; - - /** * 产品类别 */ @TableField("product_type") @@ -120,6 +108,21 @@ @ApiModelProperty(value = "产品类别", dataType = "String") private String productTypeName; + /** + * 型号 + */ + @TableField("model") + @ApiModelProperty(value = "型号", dataType = "String") + private String model; + + + /** + * 产品描述 产品介绍描述 + */ + @TableField("description") + @ApiModelProperty(value = "产品描述", dataType = "String") + private String description; + /** * 产品负责人(技术) @@ -138,7 +141,7 @@ /** * 创建人id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; /** @@ -147,12 +150,4 @@ @TableField("create_user_id") private Long createUserId; - @TableField(exist = false) - @ApiModelProperty(value = "产品配置项内容", dataType = "String") - List productConfigItems; - - @TableField(exist = false) - @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") - List productDataItems; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java new file mode 100644 index 0000000..31a37ab --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java @@ -0,0 +1,71 @@ +package com.casic.missiles.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 产品扩展信息表 AEP平台相关 + *

+ * + * @author tanyue + * @since 2025-01-02 + */ +@Data +@ApiModel +@TableName("product_info_aep_ext") +public class ProductInfoAepExt implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 产品id + */ + @TableId("product_id") + private Long productId; + + + @TableField("aep_product_id") + @ApiModelProperty(value = "AEP平台的产品ID", dataType = "String") + private String aepProductId; + + + /** + * AEP平台的产品Master-APIkey + */ + @TableField("aep_master_key") + @ApiModelProperty(value = "AEP平台的产品Master-APIkey", dataType = "String") + private String aepMasterKey; + + /** + * AEP平台SDK的key值 + */ + @TableField("aep_sdk_key") + @ApiModelProperty(value = "AEP平台SDK的key值", dataType = "String") + private String aepSdkKey; + + /** + * AEP平台SDK的secret值 + */ + @TableField("aep_sdk_secret") + @ApiModelProperty(value = "AEP平台SDK的secret值AEP平台SDK的secret值", dataType = "String") + private String aepSdkSecret; + + /** + * AEP平台的接入地址 + */ + @TableField("aep_base_url") + @ApiModelProperty(value = "AEP平台的接入地址", dataType = "String") + private Integer aepBaseUrl; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java index dbb7edf..80cb895 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.version.DeviceVersionDTO; import com.casic.missiles.dto.version.DeviceVersionListVO; import com.casic.missiles.model.DeviceVersion; +import org.apache.ibatis.annotations.CacheNamespace; import java.util.List; @@ -18,6 +19,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface IDeviceVersionService extends IService { Page listPage(Page page, DeviceVersionDTO deviceVersionDTO) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java index 6871472..99cd389 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java @@ -1,42 +1,31 @@ package com.casic.missiles.service.impl; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.group.DeviceGroupListVO; import com.casic.missiles.dto.product.ProductListDTO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.mapper.ProductConfigItemMapper; -import com.casic.missiles.mapper.ProductDataItemMapper; import com.casic.missiles.mapper.ProductInfoMapper; -import com.casic.missiles.mapper.common.SysCommonMapper; -import com.casic.missiles.model.Device; import com.casic.missiles.model.ProductConfigItem; import com.casic.missiles.model.ProductDataItem; import com.casic.missiles.model.ProductInfo; -import com.casic.missiles.service.IProductConfigItemService; -import com.casic.missiles.service.IProductDataItemService; import com.casic.missiles.service.IProductInfoService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.NumberGeneratorUtil; -import io.swagger.annotations.Api; import lombok.RequiredArgsConstructor; -import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; /** *

@@ -50,9 +39,6 @@ @RequiredArgsConstructor public class ProductInfoServiceImpl extends ServiceImpl implements IProductInfoService { - private final IProductConfigItemService productConfigItemService; - private final IProductDataItemService productDataItemService; - @Override public Page listPage(Page page, ProductListDTO request, DataScope dataScope) throws Exception { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -60,12 +46,6 @@ "product_name", request.getProductName()); queryWrapper.like(StringUtils.isNotBlank(request.getProductNo()), "product_no", request.getProductNo()); - if (org.apache.commons.lang3.StringUtils.isNotBlank(request.getBeginTime())) { - queryWrapper.apply("{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getBeginTime().split(" ")[0]); - } - if (org.apache.commons.lang3.StringUtils.isNotBlank(request.getEndTime())) { - queryWrapper.apply("{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime().split(" ")[0]); - } page = this.baseMapper.selectPage(page, queryWrapper); for (ProductInfo productInfo : page.getRecords()) { DictCodeUtils.convertDictCodeToName(productInfo); @@ -82,35 +62,13 @@ productInfo.setProductNo(productNo); productInfo.setCreateUserName(shiroUser.getName()); productInfo.setCreateUserId(shiroUser.getId()); - if (this.baseMapper.insert(productInfo) > 0) { - for (ProductConfigItem productConfigItem : productInfo.getProductConfigItems()) { - productConfigItem.setProductId(productInfo.getId()); - } - for (ProductDataItem productDataItem : productInfo.getProductDataItems()) { - productDataItem.setProductId(productInfo.getId()); - } - if ((CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productDataItemService.saveBatch(productInfo.getProductDataItems())) - && (CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productConfigItemService.saveBatch(productInfo.getProductConfigItems()))) { - return ReturnUtil.success(); - } - } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @Override public ReturnDTO updateProduct(ProductInfo productInfo) { - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.eq("product_id", productInfo.getId()); - productConfigItemService.remove(configQueryWrapper); - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.eq("product_id", productInfo.getId()); - productDataItemService.remove(productDataItemList); if (this.baseMapper.updateById(productInfo) > 0) { - //重新添加 - if ((CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productDataItemService.saveBatch(productInfo.getProductDataItems())) - && (CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productConfigItemService.saveBatch(productInfo.getProductConfigItems()))) { - return ReturnUtil.success(); - } + return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -118,30 +76,13 @@ @Override public ProductInfo productDetail(Long id) throws Exception{ ProductInfo productInfo = this.baseMapper.selectById(id); - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.eq("product_id", id); - List productConfigItemList = productConfigItemService.list(configQueryWrapper); - if (CollectionUtils.isNotEmpty(productConfigItemList)) { - productInfo.setProductConfigItems(productConfigItemList); - } - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.eq("product_id", productInfo.getId()); - List productDataItems = productDataItemService.list(productDataItemList); - if (CollectionUtils.isNotEmpty(productDataItems)) { - productInfo.setProductDataItems(productDataItems); - } + DictCodeUtils.convertDictCodeToName(productInfo); return productInfo; } @Override public ReturnDTO deleteProduct(List ids) { - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.in("product_id", ids); - productConfigItemService.remove(configQueryWrapper); - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.in("product_id", ids); - productDataItemService.remove(productDataItemList); if ((this.baseMapper.deleteBatchIds(ids)) > 0) { return ReturnUtil.success(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java index f42012a..1d625f6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java @@ -15,6 +15,7 @@ boolean validateCRC(byte[] frameBytes); String calculateCRC(String toBeVerified); + String calculateCRC(byte[] toBeVerifiedBytes); boolean validateLength(byte[] tagBytes, int length); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java index d047453..219dd84 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java @@ -55,9 +55,14 @@ public String calculateCRC(String toBeVerified) { byte[] bytes = HexUtils.fromHexString(toBeVerified); + return calculateCRC(bytes); + } + + @Override + public String calculateCRC(byte[] toBeVerifiedBytes) { // 计算CRC值 CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); - long crcVal = crcUtil.calculateCRC(bytes); + long crcVal = crcUtil.calculateCRC(toBeVerifiedBytes); // 格式化输出 String crcStr = String.format("%0" + BirmmFrameAttributeEnums.CRC.getLength() * 2 + "X", crcVal); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 446078c..997971c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -53,6 +53,9 @@ IDeviceUpgradeTaskService otaService; @Resource + IDeviceVersionService versionService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -316,7 +319,7 @@ @Override public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame); if (null != replyFrame) { replyFrame.setDevCode(uploadFrame.getDevCode()); @@ -446,16 +449,25 @@ return baseFrame; } - private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + private BirmmBaseReply createBirmmReplyFrame(BirmmBaseFrame uploadFrame) { BirmmBaseReply baseReply = null; + String operaType = uploadFrame.getOperationType(); + String devCode = uploadFrame.getDevCode(); + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); if (ObjectUtil.isNotNull(operationTypeEnums)) { switch (operationTypeEnums) { case UP_GET_REQUEST: // GetRequest回复类型为GetResponse - // TODO - replyGetRequestHandler(baseReply); + baseReply = SpringContextUtil.getBean(BirmmGetResponse.class); + BirmmGetResponse getResponse = (BirmmGetResponse) baseReply; + + getResponse.setReqSize(((BirmmGetRequest) uploadFrame).getRequestSize()); + getResponse.setReqOffset(((BirmmGetRequest) uploadFrame).getRequestOffset()); + + // 执行组装升级包的操作 + replyGetRequestHandler(devCode, getResponse); break; case UP_TRAP_REQUEST: @@ -469,7 +481,7 @@ baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 // 组装需要下发的配置项Tag - baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + baseReply.setReplyTagList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); replyTrapRequestHandler(latestConfig); } else { // 没有配置时回复TrapResponse @@ -483,7 +495,7 @@ baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 // 需要判断是否有升级任务 - replyOnlineRequestHandler(baseReply); + replyOnlineRequestHandler(devCode, (BirmmOnlineResponse) baseReply); break; case UP_STARTUP_REQUEST: @@ -502,17 +514,42 @@ return baseReply; } - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + private void replyGetRequestHandler(String devCode, BirmmGetResponse getResponse) { + // 查找升级包 + Device device = deviceService.getDeviceByDeviceCode(devCode); if (ObjectUtil.isNotNull(device)) { DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); if (ObjectUtil.isNotNull(task)) { - log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + // 查找升级包 计算升级包的大小和CRC + DeviceVersion otaVersion = versionService.getById(task.getVersionId()); + + log.info("本次发送包数据:{},[{}, 总包大小:{}, 本次起始偏移量:{}, 本次请求大小:{}]", + devCode, task.getUpgradeVersionName(), otaVersion.getVersionFile().length, getResponse.getReqOffset(), getResponse.getReqSize()); + + // 设置本次要下发的数据 + byte[] dataThisTime = new byte[getResponse.getReqSize()]; + System.arraycopy(otaVersion.getVersionFile(), getResponse.getReqOffset(), dataThisTime, 0, getResponse.getReqSize()); + getResponse.setReqData(dataThisTime); + } + } + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(String devCode, BirmmOnlineResponse onlineResponse) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + // 需要升级 + onlineResponse.setNeedOTA(true); + + // 查找升级包 计算升级包的大小和CRC + DeviceVersion otaVersion = versionService.getById(task.getVersionId()); + onlineResponse.setPackageSize(otaVersion.getVersionFile().length); + onlineResponse.setPackageCrc(protocol.calculateCRC(otaVersion.getVersionFile())); + + log.info("找到待升级的任务:{},[{}, 总包大小:{}, CRC校验值:{}]", devCode, task.getUpgradeVersionName(), onlineResponse.getPackageSize(), onlineResponse.getPackageCrc()); } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java index 89571b0..64eefe0 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -15,7 +15,7 @@ public class BirmmBaseReply extends BirmmBaseFrame { // 待下发的配置项 - List configItemList; + List replyTagList; public void replyBizTag() { tagList = new HashMap<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java new file mode 100644 index 0000000..07087db --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("GetRequest") +@Scope("prototype") +public class BirmmGetRequest extends BirmmBaseFrame { + + public int getRequestOffset() { + if (getTagList().containsKey(RequestOffsetTag.class.getSimpleName())) { + return ((RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0)).getRequestOffset(); + } + return 0; + } + + public int getRequestSize() { + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + return ((RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0)).getRequestSize(); + } + return 0; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestOffsetTag.class.getSimpleName())) { + RequestOffsetTag offsetTag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("offset", offsetTag.getRequestOffset()); + } + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag sizeTag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("size", sizeTag.getRequestSize()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml index eb2d8e7..a677692 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml @@ -4,13 +4,13 @@ - + + - - + @@ -29,7 +29,7 @@ - Id, product_id, version_file, version, owner, dscn, create_time, create_user_id + id, product_id, version_file, version_name, version, owner, version_desc, create_time, create_user_id @@ -40,7 +40,7 @@ deptid, dv.create_time AS "createTime", dv.version, - dv.dscn, + dv.version_desc, dv.owner FROM ( SELECT * diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java index 8d1aa68..3b82878 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java @@ -8,18 +8,21 @@ @ApiModel public class ProductListDTO { - @ApiModelProperty(value = "产品名称", dataType = "String") - private String productName; - - @ApiModelProperty(value = "产品编号", dataType = "String") private String productNo; + @ApiModelProperty(value = "产品名称", dataType = "String") + private String productName; - @ApiModelProperty(value = "开始时间", dataType = "String") - private String beginTime; + @ApiModelProperty(value = "设备类型", dataType = "String") + private String productType; + @ApiModelProperty(value = "设备型号", dataType = "String") + private String model; - @ApiModelProperty(value = "结束时间", dataType = "String") - private String endTime; + @ApiModelProperty(value = "数据加密方式", dataType = "String") + private String encipherType; + + @ApiModelProperty(value = "接入方式", dataType = "String") + private String accessType; } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java index 6f33b9d..dba6fcb 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("Id") + @TableId("id") private Long id; /** @@ -40,10 +40,10 @@ * 升级包文件 */ @TableField("version_file") - private String versionFile; + private byte[] versionFile; /** - * 升级包文件 + * 升级包文件名 */ @TableField("version_name") private String versionName; @@ -64,8 +64,8 @@ /** * 升级包描述 */ - @TableField("dscn") - private String descn; + @TableField("version_desc") + private String versionDesc; /** * 创建日期 默认为当前时间 @@ -83,8 +83,7 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java index 8404470..d831622 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java @@ -4,17 +4,14 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; /** *

@@ -24,8 +21,7 @@ * @author cz * @since 2023-11-22 */ -@Getter -@Setter +@Data @ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -35,7 +31,7 @@ /** * 产品id */ - @TableId("Id") + @TableId("id") private Long id; @@ -63,6 +59,17 @@ @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") private String accessTypeName; + /** + * 供电方式 直流、电池 + */ + @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) + private Integer powerType; + + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 加密类型 加密类型-tea.sm4,明文 @@ -89,25 +96,6 @@ private String communicationProtocolName; /** - * 供电方式 直流、电池 - */ - @TableField("power_type") - @ApiModelProperty(value = "供电方式", dataType = "Integer") - @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) - private Integer powerType; - - @TableField(exist = false) - @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") - private String powerTypeName; - - /** - * 产品描述 产品介绍描述 - */ - @TableField("descn") - @ApiModelProperty(value = "产品描述", dataType = "String") - private String descn; - - /** * 产品类别 */ @TableField("product_type") @@ -120,6 +108,21 @@ @ApiModelProperty(value = "产品类别", dataType = "String") private String productTypeName; + /** + * 型号 + */ + @TableField("model") + @ApiModelProperty(value = "型号", dataType = "String") + private String model; + + + /** + * 产品描述 产品介绍描述 + */ + @TableField("description") + @ApiModelProperty(value = "产品描述", dataType = "String") + private String description; + /** * 产品负责人(技术) @@ -138,7 +141,7 @@ /** * 创建人id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; /** @@ -147,12 +150,4 @@ @TableField("create_user_id") private Long createUserId; - @TableField(exist = false) - @ApiModelProperty(value = "产品配置项内容", dataType = "String") - List productConfigItems; - - @TableField(exist = false) - @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") - List productDataItems; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java new file mode 100644 index 0000000..31a37ab --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java @@ -0,0 +1,71 @@ +package com.casic.missiles.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 产品扩展信息表 AEP平台相关 + *

+ * + * @author tanyue + * @since 2025-01-02 + */ +@Data +@ApiModel +@TableName("product_info_aep_ext") +public class ProductInfoAepExt implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 产品id + */ + @TableId("product_id") + private Long productId; + + + @TableField("aep_product_id") + @ApiModelProperty(value = "AEP平台的产品ID", dataType = "String") + private String aepProductId; + + + /** + * AEP平台的产品Master-APIkey + */ + @TableField("aep_master_key") + @ApiModelProperty(value = "AEP平台的产品Master-APIkey", dataType = "String") + private String aepMasterKey; + + /** + * AEP平台SDK的key值 + */ + @TableField("aep_sdk_key") + @ApiModelProperty(value = "AEP平台SDK的key值", dataType = "String") + private String aepSdkKey; + + /** + * AEP平台SDK的secret值 + */ + @TableField("aep_sdk_secret") + @ApiModelProperty(value = "AEP平台SDK的secret值AEP平台SDK的secret值", dataType = "String") + private String aepSdkSecret; + + /** + * AEP平台的接入地址 + */ + @TableField("aep_base_url") + @ApiModelProperty(value = "AEP平台的接入地址", dataType = "String") + private Integer aepBaseUrl; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java index dbb7edf..80cb895 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.version.DeviceVersionDTO; import com.casic.missiles.dto.version.DeviceVersionListVO; import com.casic.missiles.model.DeviceVersion; +import org.apache.ibatis.annotations.CacheNamespace; import java.util.List; @@ -18,6 +19,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface IDeviceVersionService extends IService { Page listPage(Page page, DeviceVersionDTO deviceVersionDTO) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java index 6871472..99cd389 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java @@ -1,42 +1,31 @@ package com.casic.missiles.service.impl; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.group.DeviceGroupListVO; import com.casic.missiles.dto.product.ProductListDTO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.mapper.ProductConfigItemMapper; -import com.casic.missiles.mapper.ProductDataItemMapper; import com.casic.missiles.mapper.ProductInfoMapper; -import com.casic.missiles.mapper.common.SysCommonMapper; -import com.casic.missiles.model.Device; import com.casic.missiles.model.ProductConfigItem; import com.casic.missiles.model.ProductDataItem; import com.casic.missiles.model.ProductInfo; -import com.casic.missiles.service.IProductConfigItemService; -import com.casic.missiles.service.IProductDataItemService; import com.casic.missiles.service.IProductInfoService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.NumberGeneratorUtil; -import io.swagger.annotations.Api; import lombok.RequiredArgsConstructor; -import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; /** *

@@ -50,9 +39,6 @@ @RequiredArgsConstructor public class ProductInfoServiceImpl extends ServiceImpl implements IProductInfoService { - private final IProductConfigItemService productConfigItemService; - private final IProductDataItemService productDataItemService; - @Override public Page listPage(Page page, ProductListDTO request, DataScope dataScope) throws Exception { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -60,12 +46,6 @@ "product_name", request.getProductName()); queryWrapper.like(StringUtils.isNotBlank(request.getProductNo()), "product_no", request.getProductNo()); - if (org.apache.commons.lang3.StringUtils.isNotBlank(request.getBeginTime())) { - queryWrapper.apply("{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getBeginTime().split(" ")[0]); - } - if (org.apache.commons.lang3.StringUtils.isNotBlank(request.getEndTime())) { - queryWrapper.apply("{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime().split(" ")[0]); - } page = this.baseMapper.selectPage(page, queryWrapper); for (ProductInfo productInfo : page.getRecords()) { DictCodeUtils.convertDictCodeToName(productInfo); @@ -82,35 +62,13 @@ productInfo.setProductNo(productNo); productInfo.setCreateUserName(shiroUser.getName()); productInfo.setCreateUserId(shiroUser.getId()); - if (this.baseMapper.insert(productInfo) > 0) { - for (ProductConfigItem productConfigItem : productInfo.getProductConfigItems()) { - productConfigItem.setProductId(productInfo.getId()); - } - for (ProductDataItem productDataItem : productInfo.getProductDataItems()) { - productDataItem.setProductId(productInfo.getId()); - } - if ((CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productDataItemService.saveBatch(productInfo.getProductDataItems())) - && (CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productConfigItemService.saveBatch(productInfo.getProductConfigItems()))) { - return ReturnUtil.success(); - } - } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @Override public ReturnDTO updateProduct(ProductInfo productInfo) { - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.eq("product_id", productInfo.getId()); - productConfigItemService.remove(configQueryWrapper); - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.eq("product_id", productInfo.getId()); - productDataItemService.remove(productDataItemList); if (this.baseMapper.updateById(productInfo) > 0) { - //重新添加 - if ((CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productDataItemService.saveBatch(productInfo.getProductDataItems())) - && (CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productConfigItemService.saveBatch(productInfo.getProductConfigItems()))) { - return ReturnUtil.success(); - } + return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -118,30 +76,13 @@ @Override public ProductInfo productDetail(Long id) throws Exception{ ProductInfo productInfo = this.baseMapper.selectById(id); - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.eq("product_id", id); - List productConfigItemList = productConfigItemService.list(configQueryWrapper); - if (CollectionUtils.isNotEmpty(productConfigItemList)) { - productInfo.setProductConfigItems(productConfigItemList); - } - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.eq("product_id", productInfo.getId()); - List productDataItems = productDataItemService.list(productDataItemList); - if (CollectionUtils.isNotEmpty(productDataItems)) { - productInfo.setProductDataItems(productDataItems); - } + DictCodeUtils.convertDictCodeToName(productInfo); return productInfo; } @Override public ReturnDTO deleteProduct(List ids) { - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.in("product_id", ids); - productConfigItemService.remove(configQueryWrapper); - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.in("product_id", ids); - productDataItemService.remove(productDataItemList); if ((this.baseMapper.deleteBatchIds(ids)) > 0) { return ReturnUtil.success(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java index f42012a..1d625f6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java @@ -15,6 +15,7 @@ boolean validateCRC(byte[] frameBytes); String calculateCRC(String toBeVerified); + String calculateCRC(byte[] toBeVerifiedBytes); boolean validateLength(byte[] tagBytes, int length); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java index d047453..219dd84 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java @@ -55,9 +55,14 @@ public String calculateCRC(String toBeVerified) { byte[] bytes = HexUtils.fromHexString(toBeVerified); + return calculateCRC(bytes); + } + + @Override + public String calculateCRC(byte[] toBeVerifiedBytes) { // 计算CRC值 CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); - long crcVal = crcUtil.calculateCRC(bytes); + long crcVal = crcUtil.calculateCRC(toBeVerifiedBytes); // 格式化输出 String crcStr = String.format("%0" + BirmmFrameAttributeEnums.CRC.getLength() * 2 + "X", crcVal); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 446078c..997971c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -53,6 +53,9 @@ IDeviceUpgradeTaskService otaService; @Resource + IDeviceVersionService versionService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -316,7 +319,7 @@ @Override public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame); if (null != replyFrame) { replyFrame.setDevCode(uploadFrame.getDevCode()); @@ -446,16 +449,25 @@ return baseFrame; } - private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + private BirmmBaseReply createBirmmReplyFrame(BirmmBaseFrame uploadFrame) { BirmmBaseReply baseReply = null; + String operaType = uploadFrame.getOperationType(); + String devCode = uploadFrame.getDevCode(); + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); if (ObjectUtil.isNotNull(operationTypeEnums)) { switch (operationTypeEnums) { case UP_GET_REQUEST: // GetRequest回复类型为GetResponse - // TODO - replyGetRequestHandler(baseReply); + baseReply = SpringContextUtil.getBean(BirmmGetResponse.class); + BirmmGetResponse getResponse = (BirmmGetResponse) baseReply; + + getResponse.setReqSize(((BirmmGetRequest) uploadFrame).getRequestSize()); + getResponse.setReqOffset(((BirmmGetRequest) uploadFrame).getRequestOffset()); + + // 执行组装升级包的操作 + replyGetRequestHandler(devCode, getResponse); break; case UP_TRAP_REQUEST: @@ -469,7 +481,7 @@ baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 // 组装需要下发的配置项Tag - baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + baseReply.setReplyTagList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); replyTrapRequestHandler(latestConfig); } else { // 没有配置时回复TrapResponse @@ -483,7 +495,7 @@ baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 // 需要判断是否有升级任务 - replyOnlineRequestHandler(baseReply); + replyOnlineRequestHandler(devCode, (BirmmOnlineResponse) baseReply); break; case UP_STARTUP_REQUEST: @@ -502,17 +514,42 @@ return baseReply; } - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + private void replyGetRequestHandler(String devCode, BirmmGetResponse getResponse) { + // 查找升级包 + Device device = deviceService.getDeviceByDeviceCode(devCode); if (ObjectUtil.isNotNull(device)) { DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); if (ObjectUtil.isNotNull(task)) { - log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + // 查找升级包 计算升级包的大小和CRC + DeviceVersion otaVersion = versionService.getById(task.getVersionId()); + + log.info("本次发送包数据:{},[{}, 总包大小:{}, 本次起始偏移量:{}, 本次请求大小:{}]", + devCode, task.getUpgradeVersionName(), otaVersion.getVersionFile().length, getResponse.getReqOffset(), getResponse.getReqSize()); + + // 设置本次要下发的数据 + byte[] dataThisTime = new byte[getResponse.getReqSize()]; + System.arraycopy(otaVersion.getVersionFile(), getResponse.getReqOffset(), dataThisTime, 0, getResponse.getReqSize()); + getResponse.setReqData(dataThisTime); + } + } + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(String devCode, BirmmOnlineResponse onlineResponse) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + // 需要升级 + onlineResponse.setNeedOTA(true); + + // 查找升级包 计算升级包的大小和CRC + DeviceVersion otaVersion = versionService.getById(task.getVersionId()); + onlineResponse.setPackageSize(otaVersion.getVersionFile().length); + onlineResponse.setPackageCrc(protocol.calculateCRC(otaVersion.getVersionFile())); + + log.info("找到待升级的任务:{},[{}, 总包大小:{}, CRC校验值:{}]", devCode, task.getUpgradeVersionName(), onlineResponse.getPackageSize(), onlineResponse.getPackageCrc()); } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java index 89571b0..64eefe0 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -15,7 +15,7 @@ public class BirmmBaseReply extends BirmmBaseFrame { // 待下发的配置项 - List configItemList; + List replyTagList; public void replyBizTag() { tagList = new HashMap<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java new file mode 100644 index 0000000..07087db --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("GetRequest") +@Scope("prototype") +public class BirmmGetRequest extends BirmmBaseFrame { + + public int getRequestOffset() { + if (getTagList().containsKey(RequestOffsetTag.class.getSimpleName())) { + return ((RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0)).getRequestOffset(); + } + return 0; + } + + public int getRequestSize() { + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + return ((RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0)).getRequestSize(); + } + return 0; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestOffsetTag.class.getSimpleName())) { + RequestOffsetTag offsetTag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("offset", offsetTag.getRequestOffset()); + } + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag sizeTag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("size", sizeTag.getRequestSize()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetResponse.java new file mode 100644 index 0000000..16a8dc0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetResponse.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; + +@EqualsAndHashCode(callSuper = true) +@Component("GetResponse") +@Scope("prototype") +@Data +public class BirmmGetResponse extends BirmmBaseReply { + + int reqOffset; + int reqSize; + byte[] reqData; + + public BirmmGetResponse() { + operationType = BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 回复OTA_REQUEST_OFFSET + OTA_REQUEST_DATA + tagList = new LinkedHashMap<>(); // 有顺序的Map + + // 第一个Tag为:RequestOffsetTag + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(reqOffset); + tagList.put(offsetTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(offsetTag))); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(reqData); + tagList.put(dataTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(dataTag))); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java index d277bde..ed15672 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -2,15 +2,26 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.tag.ota.NeedOTATag; +import com.casic.missiles.frame.tag.ota.PackageCRCTag; +import com.casic.missiles.frame.tag.ota.PackageSizeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; +@EqualsAndHashCode(callSuper = true) @Component("OnlineResponse") +@Scope("prototype") +@Data public class BirmmOnlineResponse extends BirmmBaseReply { + boolean needOTA; + + int packageSize; + String packageCrc; + public BirmmOnlineResponse() { operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); @@ -20,16 +31,22 @@ public void replyBizTag() { // 无需升级 回复NeedOTATag // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); + tagList = new LinkedHashMap<>(); // 有顺序的Map - Map> tagList = getTagList(); + // 第一个Tag必须为:NeedOTATag NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); + needTag.setNeed(needOTA); + tagList.put(needTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(needTag))); + + if (needOTA) { + // 有升级任务则增加回复PackageSizeTag 和 PackageCRCTag + PackageSizeTag sizeTag = new PackageSizeTag(); + sizeTag.setPackSize(packageSize); + tagList.put(sizeTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(sizeTag))); + + PackageCRCTag crcTag = new PackageCRCTag(); + crcTag.setPackCRC(packageCrc); + tagList.put(crcTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(crcTag))); + } } } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml index eb2d8e7..a677692 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml @@ -4,13 +4,13 @@ - + + - - + @@ -29,7 +29,7 @@ - Id, product_id, version_file, version, owner, dscn, create_time, create_user_id + id, product_id, version_file, version_name, version, owner, version_desc, create_time, create_user_id @@ -40,7 +40,7 @@ deptid, dv.create_time AS "createTime", dv.version, - dv.dscn, + dv.version_desc, dv.owner FROM ( SELECT * diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java index 8d1aa68..3b82878 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java @@ -8,18 +8,21 @@ @ApiModel public class ProductListDTO { - @ApiModelProperty(value = "产品名称", dataType = "String") - private String productName; - - @ApiModelProperty(value = "产品编号", dataType = "String") private String productNo; + @ApiModelProperty(value = "产品名称", dataType = "String") + private String productName; - @ApiModelProperty(value = "开始时间", dataType = "String") - private String beginTime; + @ApiModelProperty(value = "设备类型", dataType = "String") + private String productType; + @ApiModelProperty(value = "设备型号", dataType = "String") + private String model; - @ApiModelProperty(value = "结束时间", dataType = "String") - private String endTime; + @ApiModelProperty(value = "数据加密方式", dataType = "String") + private String encipherType; + + @ApiModelProperty(value = "接入方式", dataType = "String") + private String accessType; } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java index 6f33b9d..dba6fcb 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("Id") + @TableId("id") private Long id; /** @@ -40,10 +40,10 @@ * 升级包文件 */ @TableField("version_file") - private String versionFile; + private byte[] versionFile; /** - * 升级包文件 + * 升级包文件名 */ @TableField("version_name") private String versionName; @@ -64,8 +64,8 @@ /** * 升级包描述 */ - @TableField("dscn") - private String descn; + @TableField("version_desc") + private String versionDesc; /** * 创建日期 默认为当前时间 @@ -83,8 +83,7 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java index 8404470..d831622 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java @@ -4,17 +4,14 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; /** *

@@ -24,8 +21,7 @@ * @author cz * @since 2023-11-22 */ -@Getter -@Setter +@Data @ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -35,7 +31,7 @@ /** * 产品id */ - @TableId("Id") + @TableId("id") private Long id; @@ -63,6 +59,17 @@ @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") private String accessTypeName; + /** + * 供电方式 直流、电池 + */ + @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) + private Integer powerType; + + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 加密类型 加密类型-tea.sm4,明文 @@ -89,25 +96,6 @@ private String communicationProtocolName; /** - * 供电方式 直流、电池 - */ - @TableField("power_type") - @ApiModelProperty(value = "供电方式", dataType = "Integer") - @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) - private Integer powerType; - - @TableField(exist = false) - @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") - private String powerTypeName; - - /** - * 产品描述 产品介绍描述 - */ - @TableField("descn") - @ApiModelProperty(value = "产品描述", dataType = "String") - private String descn; - - /** * 产品类别 */ @TableField("product_type") @@ -120,6 +108,21 @@ @ApiModelProperty(value = "产品类别", dataType = "String") private String productTypeName; + /** + * 型号 + */ + @TableField("model") + @ApiModelProperty(value = "型号", dataType = "String") + private String model; + + + /** + * 产品描述 产品介绍描述 + */ + @TableField("description") + @ApiModelProperty(value = "产品描述", dataType = "String") + private String description; + /** * 产品负责人(技术) @@ -138,7 +141,7 @@ /** * 创建人id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; /** @@ -147,12 +150,4 @@ @TableField("create_user_id") private Long createUserId; - @TableField(exist = false) - @ApiModelProperty(value = "产品配置项内容", dataType = "String") - List productConfigItems; - - @TableField(exist = false) - @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") - List productDataItems; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java new file mode 100644 index 0000000..31a37ab --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java @@ -0,0 +1,71 @@ +package com.casic.missiles.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 产品扩展信息表 AEP平台相关 + *

+ * + * @author tanyue + * @since 2025-01-02 + */ +@Data +@ApiModel +@TableName("product_info_aep_ext") +public class ProductInfoAepExt implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 产品id + */ + @TableId("product_id") + private Long productId; + + + @TableField("aep_product_id") + @ApiModelProperty(value = "AEP平台的产品ID", dataType = "String") + private String aepProductId; + + + /** + * AEP平台的产品Master-APIkey + */ + @TableField("aep_master_key") + @ApiModelProperty(value = "AEP平台的产品Master-APIkey", dataType = "String") + private String aepMasterKey; + + /** + * AEP平台SDK的key值 + */ + @TableField("aep_sdk_key") + @ApiModelProperty(value = "AEP平台SDK的key值", dataType = "String") + private String aepSdkKey; + + /** + * AEP平台SDK的secret值 + */ + @TableField("aep_sdk_secret") + @ApiModelProperty(value = "AEP平台SDK的secret值AEP平台SDK的secret值", dataType = "String") + private String aepSdkSecret; + + /** + * AEP平台的接入地址 + */ + @TableField("aep_base_url") + @ApiModelProperty(value = "AEP平台的接入地址", dataType = "String") + private Integer aepBaseUrl; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java index dbb7edf..80cb895 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.version.DeviceVersionDTO; import com.casic.missiles.dto.version.DeviceVersionListVO; import com.casic.missiles.model.DeviceVersion; +import org.apache.ibatis.annotations.CacheNamespace; import java.util.List; @@ -18,6 +19,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface IDeviceVersionService extends IService { Page listPage(Page page, DeviceVersionDTO deviceVersionDTO) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java index 6871472..99cd389 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java @@ -1,42 +1,31 @@ package com.casic.missiles.service.impl; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.group.DeviceGroupListVO; import com.casic.missiles.dto.product.ProductListDTO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.mapper.ProductConfigItemMapper; -import com.casic.missiles.mapper.ProductDataItemMapper; import com.casic.missiles.mapper.ProductInfoMapper; -import com.casic.missiles.mapper.common.SysCommonMapper; -import com.casic.missiles.model.Device; import com.casic.missiles.model.ProductConfigItem; import com.casic.missiles.model.ProductDataItem; import com.casic.missiles.model.ProductInfo; -import com.casic.missiles.service.IProductConfigItemService; -import com.casic.missiles.service.IProductDataItemService; import com.casic.missiles.service.IProductInfoService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.NumberGeneratorUtil; -import io.swagger.annotations.Api; import lombok.RequiredArgsConstructor; -import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; /** *

@@ -50,9 +39,6 @@ @RequiredArgsConstructor public class ProductInfoServiceImpl extends ServiceImpl implements IProductInfoService { - private final IProductConfigItemService productConfigItemService; - private final IProductDataItemService productDataItemService; - @Override public Page listPage(Page page, ProductListDTO request, DataScope dataScope) throws Exception { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -60,12 +46,6 @@ "product_name", request.getProductName()); queryWrapper.like(StringUtils.isNotBlank(request.getProductNo()), "product_no", request.getProductNo()); - if (org.apache.commons.lang3.StringUtils.isNotBlank(request.getBeginTime())) { - queryWrapper.apply("{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getBeginTime().split(" ")[0]); - } - if (org.apache.commons.lang3.StringUtils.isNotBlank(request.getEndTime())) { - queryWrapper.apply("{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime().split(" ")[0]); - } page = this.baseMapper.selectPage(page, queryWrapper); for (ProductInfo productInfo : page.getRecords()) { DictCodeUtils.convertDictCodeToName(productInfo); @@ -82,35 +62,13 @@ productInfo.setProductNo(productNo); productInfo.setCreateUserName(shiroUser.getName()); productInfo.setCreateUserId(shiroUser.getId()); - if (this.baseMapper.insert(productInfo) > 0) { - for (ProductConfigItem productConfigItem : productInfo.getProductConfigItems()) { - productConfigItem.setProductId(productInfo.getId()); - } - for (ProductDataItem productDataItem : productInfo.getProductDataItems()) { - productDataItem.setProductId(productInfo.getId()); - } - if ((CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productDataItemService.saveBatch(productInfo.getProductDataItems())) - && (CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productConfigItemService.saveBatch(productInfo.getProductConfigItems()))) { - return ReturnUtil.success(); - } - } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @Override public ReturnDTO updateProduct(ProductInfo productInfo) { - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.eq("product_id", productInfo.getId()); - productConfigItemService.remove(configQueryWrapper); - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.eq("product_id", productInfo.getId()); - productDataItemService.remove(productDataItemList); if (this.baseMapper.updateById(productInfo) > 0) { - //重新添加 - if ((CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productDataItemService.saveBatch(productInfo.getProductDataItems())) - && (CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productConfigItemService.saveBatch(productInfo.getProductConfigItems()))) { - return ReturnUtil.success(); - } + return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -118,30 +76,13 @@ @Override public ProductInfo productDetail(Long id) throws Exception{ ProductInfo productInfo = this.baseMapper.selectById(id); - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.eq("product_id", id); - List productConfigItemList = productConfigItemService.list(configQueryWrapper); - if (CollectionUtils.isNotEmpty(productConfigItemList)) { - productInfo.setProductConfigItems(productConfigItemList); - } - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.eq("product_id", productInfo.getId()); - List productDataItems = productDataItemService.list(productDataItemList); - if (CollectionUtils.isNotEmpty(productDataItems)) { - productInfo.setProductDataItems(productDataItems); - } + DictCodeUtils.convertDictCodeToName(productInfo); return productInfo; } @Override public ReturnDTO deleteProduct(List ids) { - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.in("product_id", ids); - productConfigItemService.remove(configQueryWrapper); - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.in("product_id", ids); - productDataItemService.remove(productDataItemList); if ((this.baseMapper.deleteBatchIds(ids)) > 0) { return ReturnUtil.success(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java index f42012a..1d625f6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java @@ -15,6 +15,7 @@ boolean validateCRC(byte[] frameBytes); String calculateCRC(String toBeVerified); + String calculateCRC(byte[] toBeVerifiedBytes); boolean validateLength(byte[] tagBytes, int length); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java index d047453..219dd84 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java @@ -55,9 +55,14 @@ public String calculateCRC(String toBeVerified) { byte[] bytes = HexUtils.fromHexString(toBeVerified); + return calculateCRC(bytes); + } + + @Override + public String calculateCRC(byte[] toBeVerifiedBytes) { // 计算CRC值 CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); - long crcVal = crcUtil.calculateCRC(bytes); + long crcVal = crcUtil.calculateCRC(toBeVerifiedBytes); // 格式化输出 String crcStr = String.format("%0" + BirmmFrameAttributeEnums.CRC.getLength() * 2 + "X", crcVal); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 446078c..997971c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -53,6 +53,9 @@ IDeviceUpgradeTaskService otaService; @Resource + IDeviceVersionService versionService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -316,7 +319,7 @@ @Override public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame); if (null != replyFrame) { replyFrame.setDevCode(uploadFrame.getDevCode()); @@ -446,16 +449,25 @@ return baseFrame; } - private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + private BirmmBaseReply createBirmmReplyFrame(BirmmBaseFrame uploadFrame) { BirmmBaseReply baseReply = null; + String operaType = uploadFrame.getOperationType(); + String devCode = uploadFrame.getDevCode(); + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); if (ObjectUtil.isNotNull(operationTypeEnums)) { switch (operationTypeEnums) { case UP_GET_REQUEST: // GetRequest回复类型为GetResponse - // TODO - replyGetRequestHandler(baseReply); + baseReply = SpringContextUtil.getBean(BirmmGetResponse.class); + BirmmGetResponse getResponse = (BirmmGetResponse) baseReply; + + getResponse.setReqSize(((BirmmGetRequest) uploadFrame).getRequestSize()); + getResponse.setReqOffset(((BirmmGetRequest) uploadFrame).getRequestOffset()); + + // 执行组装升级包的操作 + replyGetRequestHandler(devCode, getResponse); break; case UP_TRAP_REQUEST: @@ -469,7 +481,7 @@ baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 // 组装需要下发的配置项Tag - baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + baseReply.setReplyTagList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); replyTrapRequestHandler(latestConfig); } else { // 没有配置时回复TrapResponse @@ -483,7 +495,7 @@ baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 // 需要判断是否有升级任务 - replyOnlineRequestHandler(baseReply); + replyOnlineRequestHandler(devCode, (BirmmOnlineResponse) baseReply); break; case UP_STARTUP_REQUEST: @@ -502,17 +514,42 @@ return baseReply; } - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + private void replyGetRequestHandler(String devCode, BirmmGetResponse getResponse) { + // 查找升级包 + Device device = deviceService.getDeviceByDeviceCode(devCode); if (ObjectUtil.isNotNull(device)) { DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); if (ObjectUtil.isNotNull(task)) { - log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + // 查找升级包 计算升级包的大小和CRC + DeviceVersion otaVersion = versionService.getById(task.getVersionId()); + + log.info("本次发送包数据:{},[{}, 总包大小:{}, 本次起始偏移量:{}, 本次请求大小:{}]", + devCode, task.getUpgradeVersionName(), otaVersion.getVersionFile().length, getResponse.getReqOffset(), getResponse.getReqSize()); + + // 设置本次要下发的数据 + byte[] dataThisTime = new byte[getResponse.getReqSize()]; + System.arraycopy(otaVersion.getVersionFile(), getResponse.getReqOffset(), dataThisTime, 0, getResponse.getReqSize()); + getResponse.setReqData(dataThisTime); + } + } + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(String devCode, BirmmOnlineResponse onlineResponse) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + // 需要升级 + onlineResponse.setNeedOTA(true); + + // 查找升级包 计算升级包的大小和CRC + DeviceVersion otaVersion = versionService.getById(task.getVersionId()); + onlineResponse.setPackageSize(otaVersion.getVersionFile().length); + onlineResponse.setPackageCrc(protocol.calculateCRC(otaVersion.getVersionFile())); + + log.info("找到待升级的任务:{},[{}, 总包大小:{}, CRC校验值:{}]", devCode, task.getUpgradeVersionName(), onlineResponse.getPackageSize(), onlineResponse.getPackageCrc()); } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java index 89571b0..64eefe0 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -15,7 +15,7 @@ public class BirmmBaseReply extends BirmmBaseFrame { // 待下发的配置项 - List configItemList; + List replyTagList; public void replyBizTag() { tagList = new HashMap<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java new file mode 100644 index 0000000..07087db --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("GetRequest") +@Scope("prototype") +public class BirmmGetRequest extends BirmmBaseFrame { + + public int getRequestOffset() { + if (getTagList().containsKey(RequestOffsetTag.class.getSimpleName())) { + return ((RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0)).getRequestOffset(); + } + return 0; + } + + public int getRequestSize() { + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + return ((RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0)).getRequestSize(); + } + return 0; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestOffsetTag.class.getSimpleName())) { + RequestOffsetTag offsetTag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("offset", offsetTag.getRequestOffset()); + } + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag sizeTag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("size", sizeTag.getRequestSize()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetResponse.java new file mode 100644 index 0000000..16a8dc0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetResponse.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; + +@EqualsAndHashCode(callSuper = true) +@Component("GetResponse") +@Scope("prototype") +@Data +public class BirmmGetResponse extends BirmmBaseReply { + + int reqOffset; + int reqSize; + byte[] reqData; + + public BirmmGetResponse() { + operationType = BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 回复OTA_REQUEST_OFFSET + OTA_REQUEST_DATA + tagList = new LinkedHashMap<>(); // 有顺序的Map + + // 第一个Tag为:RequestOffsetTag + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(reqOffset); + tagList.put(offsetTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(offsetTag))); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(reqData); + tagList.put(dataTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(dataTag))); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java index d277bde..ed15672 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -2,15 +2,26 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.tag.ota.NeedOTATag; +import com.casic.missiles.frame.tag.ota.PackageCRCTag; +import com.casic.missiles.frame.tag.ota.PackageSizeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; +@EqualsAndHashCode(callSuper = true) @Component("OnlineResponse") +@Scope("prototype") +@Data public class BirmmOnlineResponse extends BirmmBaseReply { + boolean needOTA; + + int packageSize; + String packageCrc; + public BirmmOnlineResponse() { operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); @@ -20,16 +31,22 @@ public void replyBizTag() { // 无需升级 回复NeedOTATag // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); + tagList = new LinkedHashMap<>(); // 有顺序的Map - Map> tagList = getTagList(); + // 第一个Tag必须为:NeedOTATag NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); + needTag.setNeed(needOTA); + tagList.put(needTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(needTag))); + + if (needOTA) { + // 有升级任务则增加回复PackageSizeTag 和 PackageCRCTag + PackageSizeTag sizeTag = new PackageSizeTag(); + sizeTag.setPackSize(packageSize); + tagList.put(sizeTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(sizeTag))); + + PackageCRCTag crcTag = new PackageCRCTag(); + crcTag.setPackCRC(packageCrc); + tagList.put(crcTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(crcTag))); + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java index 71e053b..a5225db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -3,8 +3,6 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseReply; -import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import lombok.EqualsAndHashCode; @@ -13,6 +11,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.Map; @EqualsAndHashCode(callSuper = true) @@ -28,12 +27,13 @@ @Override public void replyBizTag() { - super.replyBizTag(); +// super.replyBizTag(); + tagList = new HashMap<>(); // SetRequest的时候要带上其他的配置项 // 有其他的配置项 - if (ObjectUtil.isNotEmpty(getConfigItemList())) { - for (Map configItem : getConfigItemList()) { + if (ObjectUtil.isNotEmpty(getReplyTagList())) { + for (Map configItem : getReplyTagList()) { for (Object configItemName : configItem.keySet()) { Object configItemValue = configItem.get(configItemName); @@ -41,7 +41,7 @@ BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); if (ObjectUtil.isNotNull(tag)) { tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index a139db6..54b6a75 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -28,14 +28,15 @@ @Slf4j public class MethaneTrapRequestFrame extends BirmmBaseFrame { - private List bizDataList; - private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; + List bizDataList; + final String MESSAGE_TYPE = "Data"; + final String DEV_TYPE = "Methane"; + final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", getDeviceTypeName()); + json.put("devType", DEV_TYPE); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml index eb2d8e7..a677692 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml @@ -4,13 +4,13 @@ - + + - - + @@ -29,7 +29,7 @@ - Id, product_id, version_file, version, owner, dscn, create_time, create_user_id + id, product_id, version_file, version_name, version, owner, version_desc, create_time, create_user_id @@ -40,7 +40,7 @@ deptid, dv.create_time AS "createTime", dv.version, - dv.dscn, + dv.version_desc, dv.owner FROM ( SELECT * diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java index 8d1aa68..3b82878 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java @@ -8,18 +8,21 @@ @ApiModel public class ProductListDTO { - @ApiModelProperty(value = "产品名称", dataType = "String") - private String productName; - - @ApiModelProperty(value = "产品编号", dataType = "String") private String productNo; + @ApiModelProperty(value = "产品名称", dataType = "String") + private String productName; - @ApiModelProperty(value = "开始时间", dataType = "String") - private String beginTime; + @ApiModelProperty(value = "设备类型", dataType = "String") + private String productType; + @ApiModelProperty(value = "设备型号", dataType = "String") + private String model; - @ApiModelProperty(value = "结束时间", dataType = "String") - private String endTime; + @ApiModelProperty(value = "数据加密方式", dataType = "String") + private String encipherType; + + @ApiModelProperty(value = "接入方式", dataType = "String") + private String accessType; } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java index 6f33b9d..dba6fcb 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("Id") + @TableId("id") private Long id; /** @@ -40,10 +40,10 @@ * 升级包文件 */ @TableField("version_file") - private String versionFile; + private byte[] versionFile; /** - * 升级包文件 + * 升级包文件名 */ @TableField("version_name") private String versionName; @@ -64,8 +64,8 @@ /** * 升级包描述 */ - @TableField("dscn") - private String descn; + @TableField("version_desc") + private String versionDesc; /** * 创建日期 默认为当前时间 @@ -83,8 +83,7 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java index 8404470..d831622 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java @@ -4,17 +4,14 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; /** *

@@ -24,8 +21,7 @@ * @author cz * @since 2023-11-22 */ -@Getter -@Setter +@Data @ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -35,7 +31,7 @@ /** * 产品id */ - @TableId("Id") + @TableId("id") private Long id; @@ -63,6 +59,17 @@ @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") private String accessTypeName; + /** + * 供电方式 直流、电池 + */ + @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) + private Integer powerType; + + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 加密类型 加密类型-tea.sm4,明文 @@ -89,25 +96,6 @@ private String communicationProtocolName; /** - * 供电方式 直流、电池 - */ - @TableField("power_type") - @ApiModelProperty(value = "供电方式", dataType = "Integer") - @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) - private Integer powerType; - - @TableField(exist = false) - @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") - private String powerTypeName; - - /** - * 产品描述 产品介绍描述 - */ - @TableField("descn") - @ApiModelProperty(value = "产品描述", dataType = "String") - private String descn; - - /** * 产品类别 */ @TableField("product_type") @@ -120,6 +108,21 @@ @ApiModelProperty(value = "产品类别", dataType = "String") private String productTypeName; + /** + * 型号 + */ + @TableField("model") + @ApiModelProperty(value = "型号", dataType = "String") + private String model; + + + /** + * 产品描述 产品介绍描述 + */ + @TableField("description") + @ApiModelProperty(value = "产品描述", dataType = "String") + private String description; + /** * 产品负责人(技术) @@ -138,7 +141,7 @@ /** * 创建人id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; /** @@ -147,12 +150,4 @@ @TableField("create_user_id") private Long createUserId; - @TableField(exist = false) - @ApiModelProperty(value = "产品配置项内容", dataType = "String") - List productConfigItems; - - @TableField(exist = false) - @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") - List productDataItems; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java new file mode 100644 index 0000000..31a37ab --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java @@ -0,0 +1,71 @@ +package com.casic.missiles.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 产品扩展信息表 AEP平台相关 + *

+ * + * @author tanyue + * @since 2025-01-02 + */ +@Data +@ApiModel +@TableName("product_info_aep_ext") +public class ProductInfoAepExt implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 产品id + */ + @TableId("product_id") + private Long productId; + + + @TableField("aep_product_id") + @ApiModelProperty(value = "AEP平台的产品ID", dataType = "String") + private String aepProductId; + + + /** + * AEP平台的产品Master-APIkey + */ + @TableField("aep_master_key") + @ApiModelProperty(value = "AEP平台的产品Master-APIkey", dataType = "String") + private String aepMasterKey; + + /** + * AEP平台SDK的key值 + */ + @TableField("aep_sdk_key") + @ApiModelProperty(value = "AEP平台SDK的key值", dataType = "String") + private String aepSdkKey; + + /** + * AEP平台SDK的secret值 + */ + @TableField("aep_sdk_secret") + @ApiModelProperty(value = "AEP平台SDK的secret值AEP平台SDK的secret值", dataType = "String") + private String aepSdkSecret; + + /** + * AEP平台的接入地址 + */ + @TableField("aep_base_url") + @ApiModelProperty(value = "AEP平台的接入地址", dataType = "String") + private Integer aepBaseUrl; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java index dbb7edf..80cb895 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.version.DeviceVersionDTO; import com.casic.missiles.dto.version.DeviceVersionListVO; import com.casic.missiles.model.DeviceVersion; +import org.apache.ibatis.annotations.CacheNamespace; import java.util.List; @@ -18,6 +19,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface IDeviceVersionService extends IService { Page listPage(Page page, DeviceVersionDTO deviceVersionDTO) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java index 6871472..99cd389 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java @@ -1,42 +1,31 @@ package com.casic.missiles.service.impl; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.group.DeviceGroupListVO; import com.casic.missiles.dto.product.ProductListDTO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.mapper.ProductConfigItemMapper; -import com.casic.missiles.mapper.ProductDataItemMapper; import com.casic.missiles.mapper.ProductInfoMapper; -import com.casic.missiles.mapper.common.SysCommonMapper; -import com.casic.missiles.model.Device; import com.casic.missiles.model.ProductConfigItem; import com.casic.missiles.model.ProductDataItem; import com.casic.missiles.model.ProductInfo; -import com.casic.missiles.service.IProductConfigItemService; -import com.casic.missiles.service.IProductDataItemService; import com.casic.missiles.service.IProductInfoService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.NumberGeneratorUtil; -import io.swagger.annotations.Api; import lombok.RequiredArgsConstructor; -import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; /** *

@@ -50,9 +39,6 @@ @RequiredArgsConstructor public class ProductInfoServiceImpl extends ServiceImpl implements IProductInfoService { - private final IProductConfigItemService productConfigItemService; - private final IProductDataItemService productDataItemService; - @Override public Page listPage(Page page, ProductListDTO request, DataScope dataScope) throws Exception { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -60,12 +46,6 @@ "product_name", request.getProductName()); queryWrapper.like(StringUtils.isNotBlank(request.getProductNo()), "product_no", request.getProductNo()); - if (org.apache.commons.lang3.StringUtils.isNotBlank(request.getBeginTime())) { - queryWrapper.apply("{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getBeginTime().split(" ")[0]); - } - if (org.apache.commons.lang3.StringUtils.isNotBlank(request.getEndTime())) { - queryWrapper.apply("{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime().split(" ")[0]); - } page = this.baseMapper.selectPage(page, queryWrapper); for (ProductInfo productInfo : page.getRecords()) { DictCodeUtils.convertDictCodeToName(productInfo); @@ -82,35 +62,13 @@ productInfo.setProductNo(productNo); productInfo.setCreateUserName(shiroUser.getName()); productInfo.setCreateUserId(shiroUser.getId()); - if (this.baseMapper.insert(productInfo) > 0) { - for (ProductConfigItem productConfigItem : productInfo.getProductConfigItems()) { - productConfigItem.setProductId(productInfo.getId()); - } - for (ProductDataItem productDataItem : productInfo.getProductDataItems()) { - productDataItem.setProductId(productInfo.getId()); - } - if ((CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productDataItemService.saveBatch(productInfo.getProductDataItems())) - && (CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productConfigItemService.saveBatch(productInfo.getProductConfigItems()))) { - return ReturnUtil.success(); - } - } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @Override public ReturnDTO updateProduct(ProductInfo productInfo) { - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.eq("product_id", productInfo.getId()); - productConfigItemService.remove(configQueryWrapper); - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.eq("product_id", productInfo.getId()); - productDataItemService.remove(productDataItemList); if (this.baseMapper.updateById(productInfo) > 0) { - //重新添加 - if ((CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productDataItemService.saveBatch(productInfo.getProductDataItems())) - && (CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productConfigItemService.saveBatch(productInfo.getProductConfigItems()))) { - return ReturnUtil.success(); - } + return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -118,30 +76,13 @@ @Override public ProductInfo productDetail(Long id) throws Exception{ ProductInfo productInfo = this.baseMapper.selectById(id); - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.eq("product_id", id); - List productConfigItemList = productConfigItemService.list(configQueryWrapper); - if (CollectionUtils.isNotEmpty(productConfigItemList)) { - productInfo.setProductConfigItems(productConfigItemList); - } - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.eq("product_id", productInfo.getId()); - List productDataItems = productDataItemService.list(productDataItemList); - if (CollectionUtils.isNotEmpty(productDataItems)) { - productInfo.setProductDataItems(productDataItems); - } + DictCodeUtils.convertDictCodeToName(productInfo); return productInfo; } @Override public ReturnDTO deleteProduct(List ids) { - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.in("product_id", ids); - productConfigItemService.remove(configQueryWrapper); - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.in("product_id", ids); - productDataItemService.remove(productDataItemList); if ((this.baseMapper.deleteBatchIds(ids)) > 0) { return ReturnUtil.success(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java index f42012a..1d625f6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java @@ -15,6 +15,7 @@ boolean validateCRC(byte[] frameBytes); String calculateCRC(String toBeVerified); + String calculateCRC(byte[] toBeVerifiedBytes); boolean validateLength(byte[] tagBytes, int length); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java index d047453..219dd84 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java @@ -55,9 +55,14 @@ public String calculateCRC(String toBeVerified) { byte[] bytes = HexUtils.fromHexString(toBeVerified); + return calculateCRC(bytes); + } + + @Override + public String calculateCRC(byte[] toBeVerifiedBytes) { // 计算CRC值 CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); - long crcVal = crcUtil.calculateCRC(bytes); + long crcVal = crcUtil.calculateCRC(toBeVerifiedBytes); // 格式化输出 String crcStr = String.format("%0" + BirmmFrameAttributeEnums.CRC.getLength() * 2 + "X", crcVal); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 446078c..997971c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -53,6 +53,9 @@ IDeviceUpgradeTaskService otaService; @Resource + IDeviceVersionService versionService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -316,7 +319,7 @@ @Override public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame); if (null != replyFrame) { replyFrame.setDevCode(uploadFrame.getDevCode()); @@ -446,16 +449,25 @@ return baseFrame; } - private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + private BirmmBaseReply createBirmmReplyFrame(BirmmBaseFrame uploadFrame) { BirmmBaseReply baseReply = null; + String operaType = uploadFrame.getOperationType(); + String devCode = uploadFrame.getDevCode(); + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); if (ObjectUtil.isNotNull(operationTypeEnums)) { switch (operationTypeEnums) { case UP_GET_REQUEST: // GetRequest回复类型为GetResponse - // TODO - replyGetRequestHandler(baseReply); + baseReply = SpringContextUtil.getBean(BirmmGetResponse.class); + BirmmGetResponse getResponse = (BirmmGetResponse) baseReply; + + getResponse.setReqSize(((BirmmGetRequest) uploadFrame).getRequestSize()); + getResponse.setReqOffset(((BirmmGetRequest) uploadFrame).getRequestOffset()); + + // 执行组装升级包的操作 + replyGetRequestHandler(devCode, getResponse); break; case UP_TRAP_REQUEST: @@ -469,7 +481,7 @@ baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 // 组装需要下发的配置项Tag - baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + baseReply.setReplyTagList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); replyTrapRequestHandler(latestConfig); } else { // 没有配置时回复TrapResponse @@ -483,7 +495,7 @@ baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 // 需要判断是否有升级任务 - replyOnlineRequestHandler(baseReply); + replyOnlineRequestHandler(devCode, (BirmmOnlineResponse) baseReply); break; case UP_STARTUP_REQUEST: @@ -502,17 +514,42 @@ return baseReply; } - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + private void replyGetRequestHandler(String devCode, BirmmGetResponse getResponse) { + // 查找升级包 + Device device = deviceService.getDeviceByDeviceCode(devCode); if (ObjectUtil.isNotNull(device)) { DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); if (ObjectUtil.isNotNull(task)) { - log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + // 查找升级包 计算升级包的大小和CRC + DeviceVersion otaVersion = versionService.getById(task.getVersionId()); + + log.info("本次发送包数据:{},[{}, 总包大小:{}, 本次起始偏移量:{}, 本次请求大小:{}]", + devCode, task.getUpgradeVersionName(), otaVersion.getVersionFile().length, getResponse.getReqOffset(), getResponse.getReqSize()); + + // 设置本次要下发的数据 + byte[] dataThisTime = new byte[getResponse.getReqSize()]; + System.arraycopy(otaVersion.getVersionFile(), getResponse.getReqOffset(), dataThisTime, 0, getResponse.getReqSize()); + getResponse.setReqData(dataThisTime); + } + } + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(String devCode, BirmmOnlineResponse onlineResponse) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + // 需要升级 + onlineResponse.setNeedOTA(true); + + // 查找升级包 计算升级包的大小和CRC + DeviceVersion otaVersion = versionService.getById(task.getVersionId()); + onlineResponse.setPackageSize(otaVersion.getVersionFile().length); + onlineResponse.setPackageCrc(protocol.calculateCRC(otaVersion.getVersionFile())); + + log.info("找到待升级的任务:{},[{}, 总包大小:{}, CRC校验值:{}]", devCode, task.getUpgradeVersionName(), onlineResponse.getPackageSize(), onlineResponse.getPackageCrc()); } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java index 89571b0..64eefe0 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -15,7 +15,7 @@ public class BirmmBaseReply extends BirmmBaseFrame { // 待下发的配置项 - List configItemList; + List replyTagList; public void replyBizTag() { tagList = new HashMap<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java new file mode 100644 index 0000000..07087db --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("GetRequest") +@Scope("prototype") +public class BirmmGetRequest extends BirmmBaseFrame { + + public int getRequestOffset() { + if (getTagList().containsKey(RequestOffsetTag.class.getSimpleName())) { + return ((RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0)).getRequestOffset(); + } + return 0; + } + + public int getRequestSize() { + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + return ((RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0)).getRequestSize(); + } + return 0; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestOffsetTag.class.getSimpleName())) { + RequestOffsetTag offsetTag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("offset", offsetTag.getRequestOffset()); + } + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag sizeTag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("size", sizeTag.getRequestSize()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetResponse.java new file mode 100644 index 0000000..16a8dc0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetResponse.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; + +@EqualsAndHashCode(callSuper = true) +@Component("GetResponse") +@Scope("prototype") +@Data +public class BirmmGetResponse extends BirmmBaseReply { + + int reqOffset; + int reqSize; + byte[] reqData; + + public BirmmGetResponse() { + operationType = BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 回复OTA_REQUEST_OFFSET + OTA_REQUEST_DATA + tagList = new LinkedHashMap<>(); // 有顺序的Map + + // 第一个Tag为:RequestOffsetTag + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(reqOffset); + tagList.put(offsetTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(offsetTag))); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(reqData); + tagList.put(dataTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(dataTag))); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java index d277bde..ed15672 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -2,15 +2,26 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.tag.ota.NeedOTATag; +import com.casic.missiles.frame.tag.ota.PackageCRCTag; +import com.casic.missiles.frame.tag.ota.PackageSizeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; +@EqualsAndHashCode(callSuper = true) @Component("OnlineResponse") +@Scope("prototype") +@Data public class BirmmOnlineResponse extends BirmmBaseReply { + boolean needOTA; + + int packageSize; + String packageCrc; + public BirmmOnlineResponse() { operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); @@ -20,16 +31,22 @@ public void replyBizTag() { // 无需升级 回复NeedOTATag // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); + tagList = new LinkedHashMap<>(); // 有顺序的Map - Map> tagList = getTagList(); + // 第一个Tag必须为:NeedOTATag NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); + needTag.setNeed(needOTA); + tagList.put(needTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(needTag))); + + if (needOTA) { + // 有升级任务则增加回复PackageSizeTag 和 PackageCRCTag + PackageSizeTag sizeTag = new PackageSizeTag(); + sizeTag.setPackSize(packageSize); + tagList.put(sizeTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(sizeTag))); + + PackageCRCTag crcTag = new PackageCRCTag(); + crcTag.setPackCRC(packageCrc); + tagList.put(crcTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(crcTag))); + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java index 71e053b..a5225db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -3,8 +3,6 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseReply; -import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import lombok.EqualsAndHashCode; @@ -13,6 +11,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.Map; @EqualsAndHashCode(callSuper = true) @@ -28,12 +27,13 @@ @Override public void replyBizTag() { - super.replyBizTag(); +// super.replyBizTag(); + tagList = new HashMap<>(); // SetRequest的时候要带上其他的配置项 // 有其他的配置项 - if (ObjectUtil.isNotEmpty(getConfigItemList())) { - for (Map configItem : getConfigItemList()) { + if (ObjectUtil.isNotEmpty(getReplyTagList())) { + for (Map configItem : getReplyTagList()) { for (Object configItemName : configItem.keySet()) { Object configItemValue = configItem.get(configItemName); @@ -41,7 +41,7 @@ BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); if (ObjectUtil.isNotNull(tag)) { tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index a139db6..54b6a75 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -28,14 +28,15 @@ @Slf4j public class MethaneTrapRequestFrame extends BirmmBaseFrame { - private List bizDataList; - private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; + List bizDataList; + final String MESSAGE_TYPE = "Data"; + final String DEV_TYPE = "Methane"; + final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", getDeviceTypeName()); + json.put("devType", DEV_TYPE); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java index a251c26..8957063 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -27,14 +27,15 @@ @Scope("prototype") public class SentinelTrapRequestFrame extends BirmmBaseFrame { - private List bizDataList; - private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; + List bizDataList; + final String MESSAGE_TYPE = "Data"; + final String DEV_TYPE = "Tube"; + final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", getDeviceTypeName()); + json.put("devType", DEV_TYPE); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 2b7ab1e..abc2e7a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -15,6 +15,8 @@ public static BirmmBaseTag createTagByOid(String oid) { BirmmTagTypeEnums tag = BirmmTagTypeEnums.toType(oid); if (null != tag) { + BirmmBaseTag baseTag = null; + switch (tag) { case RETRY_TIMES_TAG: return SpringContextUtil.getBean(RetryTimesTag.class); @@ -79,7 +81,8 @@ return new SNRTag(); default: - return null; + baseTag = SpringContextUtil.getBean(tag.getAlias()); + return baseTag; } } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml index eb2d8e7..a677692 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml @@ -4,13 +4,13 @@ - + + - - + @@ -29,7 +29,7 @@ - Id, product_id, version_file, version, owner, dscn, create_time, create_user_id + id, product_id, version_file, version_name, version, owner, version_desc, create_time, create_user_id @@ -40,7 +40,7 @@ deptid, dv.create_time AS "createTime", dv.version, - dv.dscn, + dv.version_desc, dv.owner FROM ( SELECT * diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java index 8d1aa68..3b82878 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java @@ -8,18 +8,21 @@ @ApiModel public class ProductListDTO { - @ApiModelProperty(value = "产品名称", dataType = "String") - private String productName; - - @ApiModelProperty(value = "产品编号", dataType = "String") private String productNo; + @ApiModelProperty(value = "产品名称", dataType = "String") + private String productName; - @ApiModelProperty(value = "开始时间", dataType = "String") - private String beginTime; + @ApiModelProperty(value = "设备类型", dataType = "String") + private String productType; + @ApiModelProperty(value = "设备型号", dataType = "String") + private String model; - @ApiModelProperty(value = "结束时间", dataType = "String") - private String endTime; + @ApiModelProperty(value = "数据加密方式", dataType = "String") + private String encipherType; + + @ApiModelProperty(value = "接入方式", dataType = "String") + private String accessType; } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java index 6f33b9d..dba6fcb 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("Id") + @TableId("id") private Long id; /** @@ -40,10 +40,10 @@ * 升级包文件 */ @TableField("version_file") - private String versionFile; + private byte[] versionFile; /** - * 升级包文件 + * 升级包文件名 */ @TableField("version_name") private String versionName; @@ -64,8 +64,8 @@ /** * 升级包描述 */ - @TableField("dscn") - private String descn; + @TableField("version_desc") + private String versionDesc; /** * 创建日期 默认为当前时间 @@ -83,8 +83,7 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java index 8404470..d831622 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java @@ -4,17 +4,14 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; /** *

@@ -24,8 +21,7 @@ * @author cz * @since 2023-11-22 */ -@Getter -@Setter +@Data @ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -35,7 +31,7 @@ /** * 产品id */ - @TableId("Id") + @TableId("id") private Long id; @@ -63,6 +59,17 @@ @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") private String accessTypeName; + /** + * 供电方式 直流、电池 + */ + @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) + private Integer powerType; + + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 加密类型 加密类型-tea.sm4,明文 @@ -89,25 +96,6 @@ private String communicationProtocolName; /** - * 供电方式 直流、电池 - */ - @TableField("power_type") - @ApiModelProperty(value = "供电方式", dataType = "Integer") - @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) - private Integer powerType; - - @TableField(exist = false) - @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") - private String powerTypeName; - - /** - * 产品描述 产品介绍描述 - */ - @TableField("descn") - @ApiModelProperty(value = "产品描述", dataType = "String") - private String descn; - - /** * 产品类别 */ @TableField("product_type") @@ -120,6 +108,21 @@ @ApiModelProperty(value = "产品类别", dataType = "String") private String productTypeName; + /** + * 型号 + */ + @TableField("model") + @ApiModelProperty(value = "型号", dataType = "String") + private String model; + + + /** + * 产品描述 产品介绍描述 + */ + @TableField("description") + @ApiModelProperty(value = "产品描述", dataType = "String") + private String description; + /** * 产品负责人(技术) @@ -138,7 +141,7 @@ /** * 创建人id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; /** @@ -147,12 +150,4 @@ @TableField("create_user_id") private Long createUserId; - @TableField(exist = false) - @ApiModelProperty(value = "产品配置项内容", dataType = "String") - List productConfigItems; - - @TableField(exist = false) - @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") - List productDataItems; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java new file mode 100644 index 0000000..31a37ab --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java @@ -0,0 +1,71 @@ +package com.casic.missiles.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 产品扩展信息表 AEP平台相关 + *

+ * + * @author tanyue + * @since 2025-01-02 + */ +@Data +@ApiModel +@TableName("product_info_aep_ext") +public class ProductInfoAepExt implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 产品id + */ + @TableId("product_id") + private Long productId; + + + @TableField("aep_product_id") + @ApiModelProperty(value = "AEP平台的产品ID", dataType = "String") + private String aepProductId; + + + /** + * AEP平台的产品Master-APIkey + */ + @TableField("aep_master_key") + @ApiModelProperty(value = "AEP平台的产品Master-APIkey", dataType = "String") + private String aepMasterKey; + + /** + * AEP平台SDK的key值 + */ + @TableField("aep_sdk_key") + @ApiModelProperty(value = "AEP平台SDK的key值", dataType = "String") + private String aepSdkKey; + + /** + * AEP平台SDK的secret值 + */ + @TableField("aep_sdk_secret") + @ApiModelProperty(value = "AEP平台SDK的secret值AEP平台SDK的secret值", dataType = "String") + private String aepSdkSecret; + + /** + * AEP平台的接入地址 + */ + @TableField("aep_base_url") + @ApiModelProperty(value = "AEP平台的接入地址", dataType = "String") + private Integer aepBaseUrl; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java index dbb7edf..80cb895 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.version.DeviceVersionDTO; import com.casic.missiles.dto.version.DeviceVersionListVO; import com.casic.missiles.model.DeviceVersion; +import org.apache.ibatis.annotations.CacheNamespace; import java.util.List; @@ -18,6 +19,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface IDeviceVersionService extends IService { Page listPage(Page page, DeviceVersionDTO deviceVersionDTO) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java index 6871472..99cd389 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java @@ -1,42 +1,31 @@ package com.casic.missiles.service.impl; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.group.DeviceGroupListVO; import com.casic.missiles.dto.product.ProductListDTO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.mapper.ProductConfigItemMapper; -import com.casic.missiles.mapper.ProductDataItemMapper; import com.casic.missiles.mapper.ProductInfoMapper; -import com.casic.missiles.mapper.common.SysCommonMapper; -import com.casic.missiles.model.Device; import com.casic.missiles.model.ProductConfigItem; import com.casic.missiles.model.ProductDataItem; import com.casic.missiles.model.ProductInfo; -import com.casic.missiles.service.IProductConfigItemService; -import com.casic.missiles.service.IProductDataItemService; import com.casic.missiles.service.IProductInfoService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.NumberGeneratorUtil; -import io.swagger.annotations.Api; import lombok.RequiredArgsConstructor; -import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; /** *

@@ -50,9 +39,6 @@ @RequiredArgsConstructor public class ProductInfoServiceImpl extends ServiceImpl implements IProductInfoService { - private final IProductConfigItemService productConfigItemService; - private final IProductDataItemService productDataItemService; - @Override public Page listPage(Page page, ProductListDTO request, DataScope dataScope) throws Exception { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -60,12 +46,6 @@ "product_name", request.getProductName()); queryWrapper.like(StringUtils.isNotBlank(request.getProductNo()), "product_no", request.getProductNo()); - if (org.apache.commons.lang3.StringUtils.isNotBlank(request.getBeginTime())) { - queryWrapper.apply("{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getBeginTime().split(" ")[0]); - } - if (org.apache.commons.lang3.StringUtils.isNotBlank(request.getEndTime())) { - queryWrapper.apply("{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime().split(" ")[0]); - } page = this.baseMapper.selectPage(page, queryWrapper); for (ProductInfo productInfo : page.getRecords()) { DictCodeUtils.convertDictCodeToName(productInfo); @@ -82,35 +62,13 @@ productInfo.setProductNo(productNo); productInfo.setCreateUserName(shiroUser.getName()); productInfo.setCreateUserId(shiroUser.getId()); - if (this.baseMapper.insert(productInfo) > 0) { - for (ProductConfigItem productConfigItem : productInfo.getProductConfigItems()) { - productConfigItem.setProductId(productInfo.getId()); - } - for (ProductDataItem productDataItem : productInfo.getProductDataItems()) { - productDataItem.setProductId(productInfo.getId()); - } - if ((CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productDataItemService.saveBatch(productInfo.getProductDataItems())) - && (CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productConfigItemService.saveBatch(productInfo.getProductConfigItems()))) { - return ReturnUtil.success(); - } - } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @Override public ReturnDTO updateProduct(ProductInfo productInfo) { - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.eq("product_id", productInfo.getId()); - productConfigItemService.remove(configQueryWrapper); - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.eq("product_id", productInfo.getId()); - productDataItemService.remove(productDataItemList); if (this.baseMapper.updateById(productInfo) > 0) { - //重新添加 - if ((CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productDataItemService.saveBatch(productInfo.getProductDataItems())) - && (CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productConfigItemService.saveBatch(productInfo.getProductConfigItems()))) { - return ReturnUtil.success(); - } + return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -118,30 +76,13 @@ @Override public ProductInfo productDetail(Long id) throws Exception{ ProductInfo productInfo = this.baseMapper.selectById(id); - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.eq("product_id", id); - List productConfigItemList = productConfigItemService.list(configQueryWrapper); - if (CollectionUtils.isNotEmpty(productConfigItemList)) { - productInfo.setProductConfigItems(productConfigItemList); - } - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.eq("product_id", productInfo.getId()); - List productDataItems = productDataItemService.list(productDataItemList); - if (CollectionUtils.isNotEmpty(productDataItems)) { - productInfo.setProductDataItems(productDataItems); - } + DictCodeUtils.convertDictCodeToName(productInfo); return productInfo; } @Override public ReturnDTO deleteProduct(List ids) { - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.in("product_id", ids); - productConfigItemService.remove(configQueryWrapper); - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.in("product_id", ids); - productDataItemService.remove(productDataItemList); if ((this.baseMapper.deleteBatchIds(ids)) > 0) { return ReturnUtil.success(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java index f42012a..1d625f6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java @@ -15,6 +15,7 @@ boolean validateCRC(byte[] frameBytes); String calculateCRC(String toBeVerified); + String calculateCRC(byte[] toBeVerifiedBytes); boolean validateLength(byte[] tagBytes, int length); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java index d047453..219dd84 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java @@ -55,9 +55,14 @@ public String calculateCRC(String toBeVerified) { byte[] bytes = HexUtils.fromHexString(toBeVerified); + return calculateCRC(bytes); + } + + @Override + public String calculateCRC(byte[] toBeVerifiedBytes) { // 计算CRC值 CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); - long crcVal = crcUtil.calculateCRC(bytes); + long crcVal = crcUtil.calculateCRC(toBeVerifiedBytes); // 格式化输出 String crcStr = String.format("%0" + BirmmFrameAttributeEnums.CRC.getLength() * 2 + "X", crcVal); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 446078c..997971c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -53,6 +53,9 @@ IDeviceUpgradeTaskService otaService; @Resource + IDeviceVersionService versionService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -316,7 +319,7 @@ @Override public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame); if (null != replyFrame) { replyFrame.setDevCode(uploadFrame.getDevCode()); @@ -446,16 +449,25 @@ return baseFrame; } - private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + private BirmmBaseReply createBirmmReplyFrame(BirmmBaseFrame uploadFrame) { BirmmBaseReply baseReply = null; + String operaType = uploadFrame.getOperationType(); + String devCode = uploadFrame.getDevCode(); + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); if (ObjectUtil.isNotNull(operationTypeEnums)) { switch (operationTypeEnums) { case UP_GET_REQUEST: // GetRequest回复类型为GetResponse - // TODO - replyGetRequestHandler(baseReply); + baseReply = SpringContextUtil.getBean(BirmmGetResponse.class); + BirmmGetResponse getResponse = (BirmmGetResponse) baseReply; + + getResponse.setReqSize(((BirmmGetRequest) uploadFrame).getRequestSize()); + getResponse.setReqOffset(((BirmmGetRequest) uploadFrame).getRequestOffset()); + + // 执行组装升级包的操作 + replyGetRequestHandler(devCode, getResponse); break; case UP_TRAP_REQUEST: @@ -469,7 +481,7 @@ baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 // 组装需要下发的配置项Tag - baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + baseReply.setReplyTagList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); replyTrapRequestHandler(latestConfig); } else { // 没有配置时回复TrapResponse @@ -483,7 +495,7 @@ baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 // 需要判断是否有升级任务 - replyOnlineRequestHandler(baseReply); + replyOnlineRequestHandler(devCode, (BirmmOnlineResponse) baseReply); break; case UP_STARTUP_REQUEST: @@ -502,17 +514,42 @@ return baseReply; } - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + private void replyGetRequestHandler(String devCode, BirmmGetResponse getResponse) { + // 查找升级包 + Device device = deviceService.getDeviceByDeviceCode(devCode); if (ObjectUtil.isNotNull(device)) { DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); if (ObjectUtil.isNotNull(task)) { - log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + // 查找升级包 计算升级包的大小和CRC + DeviceVersion otaVersion = versionService.getById(task.getVersionId()); + + log.info("本次发送包数据:{},[{}, 总包大小:{}, 本次起始偏移量:{}, 本次请求大小:{}]", + devCode, task.getUpgradeVersionName(), otaVersion.getVersionFile().length, getResponse.getReqOffset(), getResponse.getReqSize()); + + // 设置本次要下发的数据 + byte[] dataThisTime = new byte[getResponse.getReqSize()]; + System.arraycopy(otaVersion.getVersionFile(), getResponse.getReqOffset(), dataThisTime, 0, getResponse.getReqSize()); + getResponse.setReqData(dataThisTime); + } + } + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(String devCode, BirmmOnlineResponse onlineResponse) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + // 需要升级 + onlineResponse.setNeedOTA(true); + + // 查找升级包 计算升级包的大小和CRC + DeviceVersion otaVersion = versionService.getById(task.getVersionId()); + onlineResponse.setPackageSize(otaVersion.getVersionFile().length); + onlineResponse.setPackageCrc(protocol.calculateCRC(otaVersion.getVersionFile())); + + log.info("找到待升级的任务:{},[{}, 总包大小:{}, CRC校验值:{}]", devCode, task.getUpgradeVersionName(), onlineResponse.getPackageSize(), onlineResponse.getPackageCrc()); } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java index 89571b0..64eefe0 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -15,7 +15,7 @@ public class BirmmBaseReply extends BirmmBaseFrame { // 待下发的配置项 - List configItemList; + List replyTagList; public void replyBizTag() { tagList = new HashMap<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java new file mode 100644 index 0000000..07087db --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("GetRequest") +@Scope("prototype") +public class BirmmGetRequest extends BirmmBaseFrame { + + public int getRequestOffset() { + if (getTagList().containsKey(RequestOffsetTag.class.getSimpleName())) { + return ((RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0)).getRequestOffset(); + } + return 0; + } + + public int getRequestSize() { + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + return ((RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0)).getRequestSize(); + } + return 0; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestOffsetTag.class.getSimpleName())) { + RequestOffsetTag offsetTag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("offset", offsetTag.getRequestOffset()); + } + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag sizeTag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("size", sizeTag.getRequestSize()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetResponse.java new file mode 100644 index 0000000..16a8dc0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetResponse.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; + +@EqualsAndHashCode(callSuper = true) +@Component("GetResponse") +@Scope("prototype") +@Data +public class BirmmGetResponse extends BirmmBaseReply { + + int reqOffset; + int reqSize; + byte[] reqData; + + public BirmmGetResponse() { + operationType = BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 回复OTA_REQUEST_OFFSET + OTA_REQUEST_DATA + tagList = new LinkedHashMap<>(); // 有顺序的Map + + // 第一个Tag为:RequestOffsetTag + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(reqOffset); + tagList.put(offsetTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(offsetTag))); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(reqData); + tagList.put(dataTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(dataTag))); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java index d277bde..ed15672 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -2,15 +2,26 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.tag.ota.NeedOTATag; +import com.casic.missiles.frame.tag.ota.PackageCRCTag; +import com.casic.missiles.frame.tag.ota.PackageSizeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; +@EqualsAndHashCode(callSuper = true) @Component("OnlineResponse") +@Scope("prototype") +@Data public class BirmmOnlineResponse extends BirmmBaseReply { + boolean needOTA; + + int packageSize; + String packageCrc; + public BirmmOnlineResponse() { operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); @@ -20,16 +31,22 @@ public void replyBizTag() { // 无需升级 回复NeedOTATag // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); + tagList = new LinkedHashMap<>(); // 有顺序的Map - Map> tagList = getTagList(); + // 第一个Tag必须为:NeedOTATag NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); + needTag.setNeed(needOTA); + tagList.put(needTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(needTag))); + + if (needOTA) { + // 有升级任务则增加回复PackageSizeTag 和 PackageCRCTag + PackageSizeTag sizeTag = new PackageSizeTag(); + sizeTag.setPackSize(packageSize); + tagList.put(sizeTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(sizeTag))); + + PackageCRCTag crcTag = new PackageCRCTag(); + crcTag.setPackCRC(packageCrc); + tagList.put(crcTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(crcTag))); + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java index 71e053b..a5225db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -3,8 +3,6 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseReply; -import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import lombok.EqualsAndHashCode; @@ -13,6 +11,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.Map; @EqualsAndHashCode(callSuper = true) @@ -28,12 +27,13 @@ @Override public void replyBizTag() { - super.replyBizTag(); +// super.replyBizTag(); + tagList = new HashMap<>(); // SetRequest的时候要带上其他的配置项 // 有其他的配置项 - if (ObjectUtil.isNotEmpty(getConfigItemList())) { - for (Map configItem : getConfigItemList()) { + if (ObjectUtil.isNotEmpty(getReplyTagList())) { + for (Map configItem : getReplyTagList()) { for (Object configItemName : configItem.keySet()) { Object configItemValue = configItem.get(configItemName); @@ -41,7 +41,7 @@ BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); if (ObjectUtil.isNotNull(tag)) { tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index a139db6..54b6a75 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -28,14 +28,15 @@ @Slf4j public class MethaneTrapRequestFrame extends BirmmBaseFrame { - private List bizDataList; - private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; + List bizDataList; + final String MESSAGE_TYPE = "Data"; + final String DEV_TYPE = "Methane"; + final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", getDeviceTypeName()); + json.put("devType", DEV_TYPE); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java index a251c26..8957063 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -27,14 +27,15 @@ @Scope("prototype") public class SentinelTrapRequestFrame extends BirmmBaseFrame { - private List bizDataList; - private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; + List bizDataList; + final String MESSAGE_TYPE = "Data"; + final String DEV_TYPE = "Tube"; + final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", getDeviceTypeName()); + json.put("devType", DEV_TYPE); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 2b7ab1e..abc2e7a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -15,6 +15,8 @@ public static BirmmBaseTag createTagByOid(String oid) { BirmmTagTypeEnums tag = BirmmTagTypeEnums.toType(oid); if (null != tag) { + BirmmBaseTag baseTag = null; + switch (tag) { case RETRY_TIMES_TAG: return SpringContextUtil.getBean(RetryTimesTag.class); @@ -79,7 +81,8 @@ return new SNRTag(); default: - return null; + baseTag = SpringContextUtil.getBean(tag.getAlias()); + return baseTag; } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java index da2c510..4ed18b9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -23,7 +23,7 @@ String result = ""; result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + result += packCRC; return result; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java index facb19e..79584ab 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -23,7 +23,7 @@ public String toProtocolString() { String result = ""; result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getOid(); // OID - result += String.format("%04d", data.length); // 长度 + result += String.format("%04X", data.length); // 长度, 16进制 result += HexUtils.toHexString(data); return result; diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml index eb2d8e7..a677692 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceVersionMapper.xml @@ -4,13 +4,13 @@ - + + - - + @@ -29,7 +29,7 @@ - Id, product_id, version_file, version, owner, dscn, create_time, create_user_id + id, product_id, version_file, version_name, version, owner, version_desc, create_time, create_user_id @@ -40,7 +40,7 @@ deptid, dv.create_time AS "createTime", dv.version, - dv.dscn, + dv.version_desc, dv.owner FROM ( SELECT * diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java index 8d1aa68..3b82878 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/product/ProductListDTO.java @@ -8,18 +8,21 @@ @ApiModel public class ProductListDTO { - @ApiModelProperty(value = "产品名称", dataType = "String") - private String productName; - - @ApiModelProperty(value = "产品编号", dataType = "String") private String productNo; + @ApiModelProperty(value = "产品名称", dataType = "String") + private String productName; - @ApiModelProperty(value = "开始时间", dataType = "String") - private String beginTime; + @ApiModelProperty(value = "设备类型", dataType = "String") + private String productType; + @ApiModelProperty(value = "设备型号", dataType = "String") + private String model; - @ApiModelProperty(value = "结束时间", dataType = "String") - private String endTime; + @ApiModelProperty(value = "数据加密方式", dataType = "String") + private String encipherType; + + @ApiModelProperty(value = "接入方式", dataType = "String") + private String accessType; } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java index 6f33b9d..dba6fcb 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceVersion.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("Id") + @TableId("id") private Long id; /** @@ -40,10 +40,10 @@ * 升级包文件 */ @TableField("version_file") - private String versionFile; + private byte[] versionFile; /** - * 升级包文件 + * 升级包文件名 */ @TableField("version_name") private String versionName; @@ -64,8 +64,8 @@ /** * 升级包描述 */ - @TableField("dscn") - private String descn; + @TableField("version_desc") + private String versionDesc; /** * 创建日期 默认为当前时间 @@ -83,8 +83,7 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java index 8404470..d831622 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfo.java @@ -4,17 +4,14 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.enums.DictCodeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; /** *

@@ -24,8 +21,7 @@ * @author cz * @since 2023-11-22 */ -@Getter -@Setter +@Data @ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -35,7 +31,7 @@ /** * 产品id */ - @TableId("Id") + @TableId("id") private Long id; @@ -63,6 +59,17 @@ @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") private String accessTypeName; + /** + * 供电方式 直流、电池 + */ + @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) + private Integer powerType; + + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 加密类型 加密类型-tea.sm4,明文 @@ -89,25 +96,6 @@ private String communicationProtocolName; /** - * 供电方式 直流、电池 - */ - @TableField("power_type") - @ApiModelProperty(value = "供电方式", dataType = "Integer") - @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) - private Integer powerType; - - @TableField(exist = false) - @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") - private String powerTypeName; - - /** - * 产品描述 产品介绍描述 - */ - @TableField("descn") - @ApiModelProperty(value = "产品描述", dataType = "String") - private String descn; - - /** * 产品类别 */ @TableField("product_type") @@ -120,6 +108,21 @@ @ApiModelProperty(value = "产品类别", dataType = "String") private String productTypeName; + /** + * 型号 + */ + @TableField("model") + @ApiModelProperty(value = "型号", dataType = "String") + private String model; + + + /** + * 产品描述 产品介绍描述 + */ + @TableField("description") + @ApiModelProperty(value = "产品描述", dataType = "String") + private String description; + /** * 产品负责人(技术) @@ -138,7 +141,7 @@ /** * 创建人id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; /** @@ -147,12 +150,4 @@ @TableField("create_user_id") private Long createUserId; - @TableField(exist = false) - @ApiModelProperty(value = "产品配置项内容", dataType = "String") - List productConfigItems; - - @TableField(exist = false) - @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") - List productDataItems; - } diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java new file mode 100644 index 0000000..31a37ab --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/ProductInfoAepExt.java @@ -0,0 +1,71 @@ +package com.casic.missiles.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 产品扩展信息表 AEP平台相关 + *

+ * + * @author tanyue + * @since 2025-01-02 + */ +@Data +@ApiModel +@TableName("product_info_aep_ext") +public class ProductInfoAepExt implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 产品id + */ + @TableId("product_id") + private Long productId; + + + @TableField("aep_product_id") + @ApiModelProperty(value = "AEP平台的产品ID", dataType = "String") + private String aepProductId; + + + /** + * AEP平台的产品Master-APIkey + */ + @TableField("aep_master_key") + @ApiModelProperty(value = "AEP平台的产品Master-APIkey", dataType = "String") + private String aepMasterKey; + + /** + * AEP平台SDK的key值 + */ + @TableField("aep_sdk_key") + @ApiModelProperty(value = "AEP平台SDK的key值", dataType = "String") + private String aepSdkKey; + + /** + * AEP平台SDK的secret值 + */ + @TableField("aep_sdk_secret") + @ApiModelProperty(value = "AEP平台SDK的secret值AEP平台SDK的secret值", dataType = "String") + private String aepSdkSecret; + + /** + * AEP平台的接入地址 + */ + @TableField("aep_base_url") + @ApiModelProperty(value = "AEP平台的接入地址", dataType = "String") + private Integer aepBaseUrl; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java index dbb7edf..80cb895 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceVersionService.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.version.DeviceVersionDTO; import com.casic.missiles.dto.version.DeviceVersionListVO; import com.casic.missiles.model.DeviceVersion; +import org.apache.ibatis.annotations.CacheNamespace; import java.util.List; @@ -18,6 +19,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface IDeviceVersionService extends IService { Page listPage(Page page, DeviceVersionDTO deviceVersionDTO) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java index 6871472..99cd389 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductInfoServiceImpl.java @@ -1,42 +1,31 @@ package com.casic.missiles.service.impl; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.group.DeviceGroupListVO; import com.casic.missiles.dto.product.ProductListDTO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.mapper.ProductConfigItemMapper; -import com.casic.missiles.mapper.ProductDataItemMapper; import com.casic.missiles.mapper.ProductInfoMapper; -import com.casic.missiles.mapper.common.SysCommonMapper; -import com.casic.missiles.model.Device; import com.casic.missiles.model.ProductConfigItem; import com.casic.missiles.model.ProductDataItem; import com.casic.missiles.model.ProductInfo; -import com.casic.missiles.service.IProductConfigItemService; -import com.casic.missiles.service.IProductDataItemService; import com.casic.missiles.service.IProductInfoService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.NumberGeneratorUtil; -import io.swagger.annotations.Api; import lombok.RequiredArgsConstructor; -import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; /** *

@@ -50,9 +39,6 @@ @RequiredArgsConstructor public class ProductInfoServiceImpl extends ServiceImpl implements IProductInfoService { - private final IProductConfigItemService productConfigItemService; - private final IProductDataItemService productDataItemService; - @Override public Page listPage(Page page, ProductListDTO request, DataScope dataScope) throws Exception { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -60,12 +46,6 @@ "product_name", request.getProductName()); queryWrapper.like(StringUtils.isNotBlank(request.getProductNo()), "product_no", request.getProductNo()); - if (org.apache.commons.lang3.StringUtils.isNotBlank(request.getBeginTime())) { - queryWrapper.apply("{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getBeginTime().split(" ")[0]); - } - if (org.apache.commons.lang3.StringUtils.isNotBlank(request.getEndTime())) { - queryWrapper.apply("{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime().split(" ")[0]); - } page = this.baseMapper.selectPage(page, queryWrapper); for (ProductInfo productInfo : page.getRecords()) { DictCodeUtils.convertDictCodeToName(productInfo); @@ -82,35 +62,13 @@ productInfo.setProductNo(productNo); productInfo.setCreateUserName(shiroUser.getName()); productInfo.setCreateUserId(shiroUser.getId()); - if (this.baseMapper.insert(productInfo) > 0) { - for (ProductConfigItem productConfigItem : productInfo.getProductConfigItems()) { - productConfigItem.setProductId(productInfo.getId()); - } - for (ProductDataItem productDataItem : productInfo.getProductDataItems()) { - productDataItem.setProductId(productInfo.getId()); - } - if ((CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productDataItemService.saveBatch(productInfo.getProductDataItems())) - && (CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productConfigItemService.saveBatch(productInfo.getProductConfigItems()))) { - return ReturnUtil.success(); - } - } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @Override public ReturnDTO updateProduct(ProductInfo productInfo) { - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.eq("product_id", productInfo.getId()); - productConfigItemService.remove(configQueryWrapper); - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.eq("product_id", productInfo.getId()); - productDataItemService.remove(productDataItemList); if (this.baseMapper.updateById(productInfo) > 0) { - //重新添加 - if ((CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productDataItemService.saveBatch(productInfo.getProductDataItems())) - && (CollectionUtils.isEmpty(productInfo.getProductDataItems()) || productConfigItemService.saveBatch(productInfo.getProductConfigItems()))) { - return ReturnUtil.success(); - } + return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -118,30 +76,13 @@ @Override public ProductInfo productDetail(Long id) throws Exception{ ProductInfo productInfo = this.baseMapper.selectById(id); - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.eq("product_id", id); - List productConfigItemList = productConfigItemService.list(configQueryWrapper); - if (CollectionUtils.isNotEmpty(productConfigItemList)) { - productInfo.setProductConfigItems(productConfigItemList); - } - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.eq("product_id", productInfo.getId()); - List productDataItems = productDataItemService.list(productDataItemList); - if (CollectionUtils.isNotEmpty(productDataItems)) { - productInfo.setProductDataItems(productDataItems); - } + DictCodeUtils.convertDictCodeToName(productInfo); return productInfo; } @Override public ReturnDTO deleteProduct(List ids) { - QueryWrapper configQueryWrapper = new QueryWrapper<>(); - configQueryWrapper.in("product_id", ids); - productConfigItemService.remove(configQueryWrapper); - QueryWrapper productDataItemList = new QueryWrapper<>(); - productDataItemList.in("product_id", ids); - productDataItemService.remove(productDataItemList); if ((this.baseMapper.deleteBatchIds(ids)) > 0) { return ReturnUtil.success(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java index f42012a..1d625f6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java @@ -15,6 +15,7 @@ boolean validateCRC(byte[] frameBytes); String calculateCRC(String toBeVerified); + String calculateCRC(byte[] toBeVerifiedBytes); boolean validateLength(byte[] tagBytes, int length); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java index d047453..219dd84 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java @@ -55,9 +55,14 @@ public String calculateCRC(String toBeVerified) { byte[] bytes = HexUtils.fromHexString(toBeVerified); + return calculateCRC(bytes); + } + + @Override + public String calculateCRC(byte[] toBeVerifiedBytes) { // 计算CRC值 CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); - long crcVal = crcUtil.calculateCRC(bytes); + long crcVal = crcUtil.calculateCRC(toBeVerifiedBytes); // 格式化输出 String crcStr = String.format("%0" + BirmmFrameAttributeEnums.CRC.getLength() * 2 + "X", crcVal); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 446078c..997971c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -53,6 +53,9 @@ IDeviceUpgradeTaskService otaService; @Resource + IDeviceVersionService versionService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -316,7 +319,7 @@ @Override public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame); if (null != replyFrame) { replyFrame.setDevCode(uploadFrame.getDevCode()); @@ -446,16 +449,25 @@ return baseFrame; } - private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + private BirmmBaseReply createBirmmReplyFrame(BirmmBaseFrame uploadFrame) { BirmmBaseReply baseReply = null; + String operaType = uploadFrame.getOperationType(); + String devCode = uploadFrame.getDevCode(); + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); if (ObjectUtil.isNotNull(operationTypeEnums)) { switch (operationTypeEnums) { case UP_GET_REQUEST: // GetRequest回复类型为GetResponse - // TODO - replyGetRequestHandler(baseReply); + baseReply = SpringContextUtil.getBean(BirmmGetResponse.class); + BirmmGetResponse getResponse = (BirmmGetResponse) baseReply; + + getResponse.setReqSize(((BirmmGetRequest) uploadFrame).getRequestSize()); + getResponse.setReqOffset(((BirmmGetRequest) uploadFrame).getRequestOffset()); + + // 执行组装升级包的操作 + replyGetRequestHandler(devCode, getResponse); break; case UP_TRAP_REQUEST: @@ -469,7 +481,7 @@ baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 // 组装需要下发的配置项Tag - baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + baseReply.setReplyTagList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); replyTrapRequestHandler(latestConfig); } else { // 没有配置时回复TrapResponse @@ -483,7 +495,7 @@ baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 // 需要判断是否有升级任务 - replyOnlineRequestHandler(baseReply); + replyOnlineRequestHandler(devCode, (BirmmOnlineResponse) baseReply); break; case UP_STARTUP_REQUEST: @@ -502,17 +514,42 @@ return baseReply; } - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + private void replyGetRequestHandler(String devCode, BirmmGetResponse getResponse) { + // 查找升级包 + Device device = deviceService.getDeviceByDeviceCode(devCode); if (ObjectUtil.isNotNull(device)) { DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); if (ObjectUtil.isNotNull(task)) { - log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + // 查找升级包 计算升级包的大小和CRC + DeviceVersion otaVersion = versionService.getById(task.getVersionId()); + + log.info("本次发送包数据:{},[{}, 总包大小:{}, 本次起始偏移量:{}, 本次请求大小:{}]", + devCode, task.getUpgradeVersionName(), otaVersion.getVersionFile().length, getResponse.getReqOffset(), getResponse.getReqSize()); + + // 设置本次要下发的数据 + byte[] dataThisTime = new byte[getResponse.getReqSize()]; + System.arraycopy(otaVersion.getVersionFile(), getResponse.getReqOffset(), dataThisTime, 0, getResponse.getReqSize()); + getResponse.setReqData(dataThisTime); + } + } + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(String devCode, BirmmOnlineResponse onlineResponse) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + // 需要升级 + onlineResponse.setNeedOTA(true); + + // 查找升级包 计算升级包的大小和CRC + DeviceVersion otaVersion = versionService.getById(task.getVersionId()); + onlineResponse.setPackageSize(otaVersion.getVersionFile().length); + onlineResponse.setPackageCrc(protocol.calculateCRC(otaVersion.getVersionFile())); + + log.info("找到待升级的任务:{},[{}, 总包大小:{}, CRC校验值:{}]", devCode, task.getUpgradeVersionName(), onlineResponse.getPackageSize(), onlineResponse.getPackageCrc()); } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java index 89571b0..64eefe0 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -15,7 +15,7 @@ public class BirmmBaseReply extends BirmmBaseFrame { // 待下发的配置项 - List configItemList; + List replyTagList; public void replyBizTag() { tagList = new HashMap<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java new file mode 100644 index 0000000..07087db --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("GetRequest") +@Scope("prototype") +public class BirmmGetRequest extends BirmmBaseFrame { + + public int getRequestOffset() { + if (getTagList().containsKey(RequestOffsetTag.class.getSimpleName())) { + return ((RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0)).getRequestOffset(); + } + return 0; + } + + public int getRequestSize() { + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + return ((RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0)).getRequestSize(); + } + return 0; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestOffsetTag.class.getSimpleName())) { + RequestOffsetTag offsetTag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("offset", offsetTag.getRequestOffset()); + } + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag sizeTag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("size", sizeTag.getRequestSize()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetResponse.java new file mode 100644 index 0000000..16a8dc0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmGetResponse.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; + +@EqualsAndHashCode(callSuper = true) +@Component("GetResponse") +@Scope("prototype") +@Data +public class BirmmGetResponse extends BirmmBaseReply { + + int reqOffset; + int reqSize; + byte[] reqData; + + public BirmmGetResponse() { + operationType = BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 回复OTA_REQUEST_OFFSET + OTA_REQUEST_DATA + tagList = new LinkedHashMap<>(); // 有顺序的Map + + // 第一个Tag为:RequestOffsetTag + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(reqOffset); + tagList.put(offsetTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(offsetTag))); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(reqData); + tagList.put(dataTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(dataTag))); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java index d277bde..ed15672 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -2,15 +2,26 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.tag.ota.NeedOTATag; +import com.casic.missiles.frame.tag.ota.PackageCRCTag; +import com.casic.missiles.frame.tag.ota.PackageSizeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; +@EqualsAndHashCode(callSuper = true) @Component("OnlineResponse") +@Scope("prototype") +@Data public class BirmmOnlineResponse extends BirmmBaseReply { + boolean needOTA; + + int packageSize; + String packageCrc; + public BirmmOnlineResponse() { operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); @@ -20,16 +31,22 @@ public void replyBizTag() { // 无需升级 回复NeedOTATag // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); + tagList = new LinkedHashMap<>(); // 有顺序的Map - Map> tagList = getTagList(); + // 第一个Tag必须为:NeedOTATag NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); + needTag.setNeed(needOTA); + tagList.put(needTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(needTag))); + + if (needOTA) { + // 有升级任务则增加回复PackageSizeTag 和 PackageCRCTag + PackageSizeTag sizeTag = new PackageSizeTag(); + sizeTag.setPackSize(packageSize); + tagList.put(sizeTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(sizeTag))); + + PackageCRCTag crcTag = new PackageCRCTag(); + crcTag.setPackCRC(packageCrc); + tagList.put(crcTag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(crcTag))); + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java index 71e053b..a5225db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -3,8 +3,6 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseReply; -import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import lombok.EqualsAndHashCode; @@ -13,6 +11,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.Map; @EqualsAndHashCode(callSuper = true) @@ -28,12 +27,13 @@ @Override public void replyBizTag() { - super.replyBizTag(); +// super.replyBizTag(); + tagList = new HashMap<>(); // SetRequest的时候要带上其他的配置项 // 有其他的配置项 - if (ObjectUtil.isNotEmpty(getConfigItemList())) { - for (Map configItem : getConfigItemList()) { + if (ObjectUtil.isNotEmpty(getReplyTagList())) { + for (Map configItem : getReplyTagList()) { for (Object configItemName : configItem.keySet()) { Object configItemValue = configItem.get(configItemName); @@ -41,7 +41,7 @@ BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); if (ObjectUtil.isNotNull(tag)) { tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index a139db6..54b6a75 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -28,14 +28,15 @@ @Slf4j public class MethaneTrapRequestFrame extends BirmmBaseFrame { - private List bizDataList; - private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; + List bizDataList; + final String MESSAGE_TYPE = "Data"; + final String DEV_TYPE = "Methane"; + final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", getDeviceTypeName()); + json.put("devType", DEV_TYPE); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java index a251c26..8957063 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -27,14 +27,15 @@ @Scope("prototype") public class SentinelTrapRequestFrame extends BirmmBaseFrame { - private List bizDataList; - private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; + List bizDataList; + final String MESSAGE_TYPE = "Data"; + final String DEV_TYPE = "Tube"; + final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", getDeviceTypeName()); + json.put("devType", DEV_TYPE); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 2b7ab1e..abc2e7a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -15,6 +15,8 @@ public static BirmmBaseTag createTagByOid(String oid) { BirmmTagTypeEnums tag = BirmmTagTypeEnums.toType(oid); if (null != tag) { + BirmmBaseTag baseTag = null; + switch (tag) { case RETRY_TIMES_TAG: return SpringContextUtil.getBean(RetryTimesTag.class); @@ -79,7 +81,8 @@ return new SNRTag(); default: - return null; + baseTag = SpringContextUtil.getBean(tag.getAlias()); + return baseTag; } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java index da2c510..4ed18b9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -23,7 +23,7 @@ String result = ""; result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + result += packCRC; return result; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java index facb19e..79584ab 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -23,7 +23,7 @@ public String toProtocolString() { String result = ""; result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getOid(); // OID - result += String.format("%04d", data.length); // 长度 + result += String.format("%04X", data.length); // 长度, 16进制 result += HexUtils.toHexString(data); return result; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java index bc6c09c..05cda9f 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -2,11 +2,16 @@ import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("reqOffset") +@Scope("prototype") public class RequestOffsetTag extends BirmmBaseTag { final String REQUEST_OFFSET_TAG_OID = "20000102"; @@ -24,7 +29,7 @@ String result = ""; result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); + result += BytesUtil.reverseHexString(String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset)); // 顺序与请求的时候相反 return result; } @@ -32,6 +37,6 @@ @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - requestOffset = Integer.parseInt(valueStr); + requestOffset = Integer.parseInt(valueStr, 16); } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java index 50b0b72..e889883 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java @@ -3,9 +3,13 @@ import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("reqSize") +@Scope("prototype") public class RequestSizeTag extends BirmmBaseTag { final String REQUEST_SIZE_TAG_OID = "20000100"; @@ -21,6 +25,6 @@ @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - requestSize = Integer.parseInt(valueStr); + requestSize = Integer.parseInt(valueStr, 16); } }