diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java index 071387d..108f0e4 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java @@ -13,4 +13,5 @@ */ public interface ProductInfoMapper extends BaseMapper { + Long selectMaxNo(); } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java index 071387d..108f0e4 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java @@ -13,4 +13,5 @@ */ public interface ProductInfoMapper extends BaseMapper { + Long selectMaxNo(); } diff --git a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml index 27b551d..26f3cb3 100644 --- a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml +++ b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml @@ -8,8 +8,6 @@ - - @@ -22,4 +20,11 @@ Id, name, access_type, encipher_type, protocol_type, model, descn, product_type, owners, CreatorName, create_time, create_user_id + + + + diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java index 071387d..108f0e4 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java @@ -13,4 +13,5 @@ */ public interface ProductInfoMapper extends BaseMapper { + Long selectMaxNo(); } diff --git a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml index 27b551d..26f3cb3 100644 --- a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml +++ b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml @@ -8,8 +8,6 @@ - - @@ -22,4 +20,11 @@ Id, name, access_type, encipher_type, protocol_type, model, descn, product_type, owners, CreatorName, create_time, create_user_id + + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index f7dd974..92465e5 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -9,7 +9,8 @@ */ public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { - HANDLE_FAILED(500, "操作失败"); + HANDLE_FAILED(500, "操作失败"), + GROUP_BIND_DEVICE(2023, "删除失败,设备组绑定的有设备"); private Integer code; private String message; diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java index 071387d..108f0e4 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java @@ -13,4 +13,5 @@ */ public interface ProductInfoMapper extends BaseMapper { + Long selectMaxNo(); } diff --git a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml index 27b551d..26f3cb3 100644 --- a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml +++ b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml @@ -8,8 +8,6 @@ - - @@ -22,4 +20,11 @@ Id, name, access_type, encipher_type, protocol_type, model, descn, product_type, owners, CreatorName, create_time, create_user_id + + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index f7dd974..92465e5 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -9,7 +9,8 @@ */ public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { - HANDLE_FAILED(500, "操作失败"); + HANDLE_FAILED(500, "操作失败"), + GROUP_BIND_DEVICE(2023, "删除失败,设备组绑定的有设备"); private Integer code; private String message; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index efbc561..da221ae 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -53,7 +53,7 @@ /** * 协议类型 */ - String protocol_type = "protocolType"; + String COMMUNICATION_PROTOCOL = "communicationProtocol"; /** * 产品类型 diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java index 071387d..108f0e4 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java @@ -13,4 +13,5 @@ */ public interface ProductInfoMapper extends BaseMapper { + Long selectMaxNo(); } diff --git a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml index 27b551d..26f3cb3 100644 --- a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml +++ b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml @@ -8,8 +8,6 @@ - - @@ -22,4 +20,11 @@ Id, name, access_type, encipher_type, protocol_type, model, descn, product_type, owners, CreatorName, create_time, create_user_id + + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index f7dd974..92465e5 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -9,7 +9,8 @@ */ public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { - HANDLE_FAILED(500, "操作失败"); + HANDLE_FAILED(500, "操作失败"), + GROUP_BIND_DEVICE(2023, "删除失败,设备组绑定的有设备"); private Integer code; private String message; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index efbc561..da221ae 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -53,7 +53,7 @@ /** * 协议类型 */ - String protocol_type = "protocolType"; + String COMMUNICATION_PROTOCOL = "communicationProtocol"; /** * 产品类型 diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index f62583a..1169ca3 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -14,6 +14,7 @@ import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -41,6 +42,7 @@ * 设备编号 */ @TableField("devcode") + @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") private String devcode; diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java index 071387d..108f0e4 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java @@ -13,4 +13,5 @@ */ public interface ProductInfoMapper extends BaseMapper { + Long selectMaxNo(); } diff --git a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml index 27b551d..26f3cb3 100644 --- a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml +++ b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml @@ -8,8 +8,6 @@ - - @@ -22,4 +20,11 @@ Id, name, access_type, encipher_type, protocol_type, model, descn, product_type, owners, CreatorName, create_time, create_user_id + + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index f7dd974..92465e5 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -9,7 +9,8 @@ */ public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { - HANDLE_FAILED(500, "操作失败"); + HANDLE_FAILED(500, "操作失败"), + GROUP_BIND_DEVICE(2023, "删除失败,设备组绑定的有设备"); private Integer code; private String message; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index efbc561..da221ae 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -53,7 +53,7 @@ /** * 协议类型 */ - String protocol_type = "protocolType"; + String COMMUNICATION_PROTOCOL = "communicationProtocol"; /** * 产品类型 diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index f62583a..1169ca3 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -14,6 +14,7 @@ import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -41,6 +42,7 @@ * 设备编号 */ @TableField("devcode") + @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") private String devcode; 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 f979eac..fe2d10a 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 @@ -6,8 +6,12 @@ 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; @@ -21,6 +25,7 @@ */ @Getter @Setter +@ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -32,60 +37,94 @@ @TableId("Id") private Long id; + + @TableField("product_no") + @ApiModelProperty(value = "产品编号", dataType = "String") + private String productNo; + + /** * 产品名称 */ @TableField("name") + @ApiModelProperty(value = "产品名称", dataType = "String") private String name; /** * 接入类型 直连,集中器,AEP电信平台等 */ @TableField("access_type") + @DictCodeField(message = "接入类型不合法", cacheName = ACCESS_TYPE) + @ApiModelProperty(value = "接入类型", dataType = "Integer") private Integer accessType; + @TableField(exist = false) + @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") + private String accessTypeName; + + /** * 加密类型 加密类型-tea.sm4,明文 */ @TableField("encipher_type") + @ApiModelProperty(value = "加密类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = ENCIPHER_TYPE) private Integer encipherType; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String encipherTypeName; + /** * 协议类型 mqtt,tcp等协议类型 */ - @TableField("protocol_type") - private Integer protocolType; + @TableField("communication_protocol") + @ApiModelProperty(value = "协议类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = COMMUNICATION_PROTOCOL) + private Integer communicationProtocol; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String communicationProtocolName; /** * 供电方式 直流、电池 */ @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) private Integer powerType; - - /** - * 型号 - */ - @TableField("model") - private Integer model; + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 产品描述 产品介绍描述 */ @TableField("descn") + @ApiModelProperty(value = "产品描述", dataType = "String") private String descn; /** * 产品类别 */ @TableField("product_type") + @ApiModelProperty(value = "产品类别", dataType = "Integer") + @DictCodeField(message = "产品类别不合法", cacheName = PRODUCT_TYPE) private Integer productType; + + @TableField(exist = false) + @ApiModelProperty(value = "产品类别", dataType = "String") + private String productTypeName; + + /** * 产品负责人(技术) */ @TableField("owners") + @ApiModelProperty(value = "产品负责人(技术)", dataType = "String") private String owners; /** @@ -100,5 +139,12 @@ @TableField("create_user_name") private String createUserName; + @TableField(exist = false) + @ApiModelProperty(value = "产品配置项内容", dataType = "String") + List productConfigItems; + + @TableField(exist = false) + @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") + List productDataItems; } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java index 071387d..108f0e4 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java @@ -13,4 +13,5 @@ */ public interface ProductInfoMapper extends BaseMapper { + Long selectMaxNo(); } diff --git a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml index 27b551d..26f3cb3 100644 --- a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml +++ b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml @@ -8,8 +8,6 @@ - - @@ -22,4 +20,11 @@ Id, name, access_type, encipher_type, protocol_type, model, descn, product_type, owners, CreatorName, create_time, create_user_id + + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index f7dd974..92465e5 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -9,7 +9,8 @@ */ public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { - HANDLE_FAILED(500, "操作失败"); + HANDLE_FAILED(500, "操作失败"), + GROUP_BIND_DEVICE(2023, "删除失败,设备组绑定的有设备"); private Integer code; private String message; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index efbc561..da221ae 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -53,7 +53,7 @@ /** * 协议类型 */ - String protocol_type = "protocolType"; + String COMMUNICATION_PROTOCOL = "communicationProtocol"; /** * 产品类型 diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index f62583a..1169ca3 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -14,6 +14,7 @@ import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -41,6 +42,7 @@ * 设备编号 */ @TableField("devcode") + @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") private String devcode; 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 f979eac..fe2d10a 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 @@ -6,8 +6,12 @@ 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; @@ -21,6 +25,7 @@ */ @Getter @Setter +@ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -32,60 +37,94 @@ @TableId("Id") private Long id; + + @TableField("product_no") + @ApiModelProperty(value = "产品编号", dataType = "String") + private String productNo; + + /** * 产品名称 */ @TableField("name") + @ApiModelProperty(value = "产品名称", dataType = "String") private String name; /** * 接入类型 直连,集中器,AEP电信平台等 */ @TableField("access_type") + @DictCodeField(message = "接入类型不合法", cacheName = ACCESS_TYPE) + @ApiModelProperty(value = "接入类型", dataType = "Integer") private Integer accessType; + @TableField(exist = false) + @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") + private String accessTypeName; + + /** * 加密类型 加密类型-tea.sm4,明文 */ @TableField("encipher_type") + @ApiModelProperty(value = "加密类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = ENCIPHER_TYPE) private Integer encipherType; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String encipherTypeName; + /** * 协议类型 mqtt,tcp等协议类型 */ - @TableField("protocol_type") - private Integer protocolType; + @TableField("communication_protocol") + @ApiModelProperty(value = "协议类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = COMMUNICATION_PROTOCOL) + private Integer communicationProtocol; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String communicationProtocolName; /** * 供电方式 直流、电池 */ @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) private Integer powerType; - - /** - * 型号 - */ - @TableField("model") - private Integer model; + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 产品描述 产品介绍描述 */ @TableField("descn") + @ApiModelProperty(value = "产品描述", dataType = "String") private String descn; /** * 产品类别 */ @TableField("product_type") + @ApiModelProperty(value = "产品类别", dataType = "Integer") + @DictCodeField(message = "产品类别不合法", cacheName = PRODUCT_TYPE) private Integer productType; + + @TableField(exist = false) + @ApiModelProperty(value = "产品类别", dataType = "String") + private String productTypeName; + + /** * 产品负责人(技术) */ @TableField("owners") + @ApiModelProperty(value = "产品负责人(技术)", dataType = "String") private String owners; /** @@ -100,5 +139,12 @@ @TableField("create_user_name") private String createUserName; + @TableField(exist = false) + @ApiModelProperty(value = "产品配置项内容", dataType = "String") + List productConfigItems; + + @TableField(exist = false) + @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") + List productDataItems; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java new file mode 100644 index 0000000..44d9833 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductConfigItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductConfigItemService extends IService { + +} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java index 071387d..108f0e4 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java @@ -13,4 +13,5 @@ */ public interface ProductInfoMapper extends BaseMapper { + Long selectMaxNo(); } diff --git a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml index 27b551d..26f3cb3 100644 --- a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml +++ b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml @@ -8,8 +8,6 @@ - - @@ -22,4 +20,11 @@ Id, name, access_type, encipher_type, protocol_type, model, descn, product_type, owners, CreatorName, create_time, create_user_id + + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index f7dd974..92465e5 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -9,7 +9,8 @@ */ public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { - HANDLE_FAILED(500, "操作失败"); + HANDLE_FAILED(500, "操作失败"), + GROUP_BIND_DEVICE(2023, "删除失败,设备组绑定的有设备"); private Integer code; private String message; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index efbc561..da221ae 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -53,7 +53,7 @@ /** * 协议类型 */ - String protocol_type = "protocolType"; + String COMMUNICATION_PROTOCOL = "communicationProtocol"; /** * 产品类型 diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index f62583a..1169ca3 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -14,6 +14,7 @@ import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -41,6 +42,7 @@ * 设备编号 */ @TableField("devcode") + @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") private String devcode; 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 f979eac..fe2d10a 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 @@ -6,8 +6,12 @@ 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; @@ -21,6 +25,7 @@ */ @Getter @Setter +@ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -32,60 +37,94 @@ @TableId("Id") private Long id; + + @TableField("product_no") + @ApiModelProperty(value = "产品编号", dataType = "String") + private String productNo; + + /** * 产品名称 */ @TableField("name") + @ApiModelProperty(value = "产品名称", dataType = "String") private String name; /** * 接入类型 直连,集中器,AEP电信平台等 */ @TableField("access_type") + @DictCodeField(message = "接入类型不合法", cacheName = ACCESS_TYPE) + @ApiModelProperty(value = "接入类型", dataType = "Integer") private Integer accessType; + @TableField(exist = false) + @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") + private String accessTypeName; + + /** * 加密类型 加密类型-tea.sm4,明文 */ @TableField("encipher_type") + @ApiModelProperty(value = "加密类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = ENCIPHER_TYPE) private Integer encipherType; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String encipherTypeName; + /** * 协议类型 mqtt,tcp等协议类型 */ - @TableField("protocol_type") - private Integer protocolType; + @TableField("communication_protocol") + @ApiModelProperty(value = "协议类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = COMMUNICATION_PROTOCOL) + private Integer communicationProtocol; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String communicationProtocolName; /** * 供电方式 直流、电池 */ @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) private Integer powerType; - - /** - * 型号 - */ - @TableField("model") - private Integer model; + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 产品描述 产品介绍描述 */ @TableField("descn") + @ApiModelProperty(value = "产品描述", dataType = "String") private String descn; /** * 产品类别 */ @TableField("product_type") + @ApiModelProperty(value = "产品类别", dataType = "Integer") + @DictCodeField(message = "产品类别不合法", cacheName = PRODUCT_TYPE) private Integer productType; + + @TableField(exist = false) + @ApiModelProperty(value = "产品类别", dataType = "String") + private String productTypeName; + + /** * 产品负责人(技术) */ @TableField("owners") + @ApiModelProperty(value = "产品负责人(技术)", dataType = "String") private String owners; /** @@ -100,5 +139,12 @@ @TableField("create_user_name") private String createUserName; + @TableField(exist = false) + @ApiModelProperty(value = "产品配置项内容", dataType = "String") + List productConfigItems; + + @TableField(exist = false) + @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") + List productDataItems; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java new file mode 100644 index 0000000..44d9833 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductConfigItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductConfigItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java new file mode 100644 index 0000000..0a248fa --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductDataItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductDataItemService extends IService { + +} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java index 071387d..108f0e4 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java @@ -13,4 +13,5 @@ */ public interface ProductInfoMapper extends BaseMapper { + Long selectMaxNo(); } diff --git a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml index 27b551d..26f3cb3 100644 --- a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml +++ b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml @@ -8,8 +8,6 @@ - - @@ -22,4 +20,11 @@ Id, name, access_type, encipher_type, protocol_type, model, descn, product_type, owners, CreatorName, create_time, create_user_id + + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index f7dd974..92465e5 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -9,7 +9,8 @@ */ public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { - HANDLE_FAILED(500, "操作失败"); + HANDLE_FAILED(500, "操作失败"), + GROUP_BIND_DEVICE(2023, "删除失败,设备组绑定的有设备"); private Integer code; private String message; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index efbc561..da221ae 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -53,7 +53,7 @@ /** * 协议类型 */ - String protocol_type = "protocolType"; + String COMMUNICATION_PROTOCOL = "communicationProtocol"; /** * 产品类型 diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index f62583a..1169ca3 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -14,6 +14,7 @@ import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -41,6 +42,7 @@ * 设备编号 */ @TableField("devcode") + @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") private String devcode; 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 f979eac..fe2d10a 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 @@ -6,8 +6,12 @@ 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; @@ -21,6 +25,7 @@ */ @Getter @Setter +@ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -32,60 +37,94 @@ @TableId("Id") private Long id; + + @TableField("product_no") + @ApiModelProperty(value = "产品编号", dataType = "String") + private String productNo; + + /** * 产品名称 */ @TableField("name") + @ApiModelProperty(value = "产品名称", dataType = "String") private String name; /** * 接入类型 直连,集中器,AEP电信平台等 */ @TableField("access_type") + @DictCodeField(message = "接入类型不合法", cacheName = ACCESS_TYPE) + @ApiModelProperty(value = "接入类型", dataType = "Integer") private Integer accessType; + @TableField(exist = false) + @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") + private String accessTypeName; + + /** * 加密类型 加密类型-tea.sm4,明文 */ @TableField("encipher_type") + @ApiModelProperty(value = "加密类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = ENCIPHER_TYPE) private Integer encipherType; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String encipherTypeName; + /** * 协议类型 mqtt,tcp等协议类型 */ - @TableField("protocol_type") - private Integer protocolType; + @TableField("communication_protocol") + @ApiModelProperty(value = "协议类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = COMMUNICATION_PROTOCOL) + private Integer communicationProtocol; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String communicationProtocolName; /** * 供电方式 直流、电池 */ @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) private Integer powerType; - - /** - * 型号 - */ - @TableField("model") - private Integer model; + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 产品描述 产品介绍描述 */ @TableField("descn") + @ApiModelProperty(value = "产品描述", dataType = "String") private String descn; /** * 产品类别 */ @TableField("product_type") + @ApiModelProperty(value = "产品类别", dataType = "Integer") + @DictCodeField(message = "产品类别不合法", cacheName = PRODUCT_TYPE) private Integer productType; + + @TableField(exist = false) + @ApiModelProperty(value = "产品类别", dataType = "String") + private String productTypeName; + + /** * 产品负责人(技术) */ @TableField("owners") + @ApiModelProperty(value = "产品负责人(技术)", dataType = "String") private String owners; /** @@ -100,5 +139,12 @@ @TableField("create_user_name") private String createUserName; + @TableField(exist = false) + @ApiModelProperty(value = "产品配置项内容", dataType = "String") + List productConfigItems; + + @TableField(exist = false) + @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") + List productDataItems; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java new file mode 100644 index 0000000..44d9833 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductConfigItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductConfigItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java new file mode 100644 index 0000000..0a248fa --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductDataItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductDataItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java index d5cc3e5..62cdcd9 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java @@ -19,12 +19,14 @@ */ public interface IProductInfoService extends IService { - Page listPage(Page page, ProductListDTO request, DataScope dataScope); + Page listPage(Page page, ProductListDTO request, DataScope dataScope)throws Exception; ReturnDTO addProduct(ProductInfo productInfo); ReturnDTO updateProduct(ProductInfo productInfo); + ProductInfo productDetail(Long id); + ReturnDTO deleteProduct(List ids); } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java index 071387d..108f0e4 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java @@ -13,4 +13,5 @@ */ public interface ProductInfoMapper extends BaseMapper { + Long selectMaxNo(); } diff --git a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml index 27b551d..26f3cb3 100644 --- a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml +++ b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml @@ -8,8 +8,6 @@ - - @@ -22,4 +20,11 @@ Id, name, access_type, encipher_type, protocol_type, model, descn, product_type, owners, CreatorName, create_time, create_user_id + + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index f7dd974..92465e5 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -9,7 +9,8 @@ */ public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { - HANDLE_FAILED(500, "操作失败"); + HANDLE_FAILED(500, "操作失败"), + GROUP_BIND_DEVICE(2023, "删除失败,设备组绑定的有设备"); private Integer code; private String message; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index efbc561..da221ae 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -53,7 +53,7 @@ /** * 协议类型 */ - String protocol_type = "protocolType"; + String COMMUNICATION_PROTOCOL = "communicationProtocol"; /** * 产品类型 diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index f62583a..1169ca3 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -14,6 +14,7 @@ import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -41,6 +42,7 @@ * 设备编号 */ @TableField("devcode") + @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") private String devcode; 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 f979eac..fe2d10a 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 @@ -6,8 +6,12 @@ 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; @@ -21,6 +25,7 @@ */ @Getter @Setter +@ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -32,60 +37,94 @@ @TableId("Id") private Long id; + + @TableField("product_no") + @ApiModelProperty(value = "产品编号", dataType = "String") + private String productNo; + + /** * 产品名称 */ @TableField("name") + @ApiModelProperty(value = "产品名称", dataType = "String") private String name; /** * 接入类型 直连,集中器,AEP电信平台等 */ @TableField("access_type") + @DictCodeField(message = "接入类型不合法", cacheName = ACCESS_TYPE) + @ApiModelProperty(value = "接入类型", dataType = "Integer") private Integer accessType; + @TableField(exist = false) + @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") + private String accessTypeName; + + /** * 加密类型 加密类型-tea.sm4,明文 */ @TableField("encipher_type") + @ApiModelProperty(value = "加密类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = ENCIPHER_TYPE) private Integer encipherType; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String encipherTypeName; + /** * 协议类型 mqtt,tcp等协议类型 */ - @TableField("protocol_type") - private Integer protocolType; + @TableField("communication_protocol") + @ApiModelProperty(value = "协议类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = COMMUNICATION_PROTOCOL) + private Integer communicationProtocol; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String communicationProtocolName; /** * 供电方式 直流、电池 */ @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) private Integer powerType; - - /** - * 型号 - */ - @TableField("model") - private Integer model; + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 产品描述 产品介绍描述 */ @TableField("descn") + @ApiModelProperty(value = "产品描述", dataType = "String") private String descn; /** * 产品类别 */ @TableField("product_type") + @ApiModelProperty(value = "产品类别", dataType = "Integer") + @DictCodeField(message = "产品类别不合法", cacheName = PRODUCT_TYPE) private Integer productType; + + @TableField(exist = false) + @ApiModelProperty(value = "产品类别", dataType = "String") + private String productTypeName; + + /** * 产品负责人(技术) */ @TableField("owners") + @ApiModelProperty(value = "产品负责人(技术)", dataType = "String") private String owners; /** @@ -100,5 +139,12 @@ @TableField("create_user_name") private String createUserName; + @TableField(exist = false) + @ApiModelProperty(value = "产品配置项内容", dataType = "String") + List productConfigItems; + + @TableField(exist = false) + @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") + List productDataItems; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java new file mode 100644 index 0000000..44d9833 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductConfigItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductConfigItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java new file mode 100644 index 0000000..0a248fa --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductDataItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductDataItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java index d5cc3e5..62cdcd9 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java @@ -19,12 +19,14 @@ */ public interface IProductInfoService extends IService { - Page listPage(Page page, ProductListDTO request, DataScope dataScope); + Page listPage(Page page, ProductListDTO request, DataScope dataScope)throws Exception; ReturnDTO addProduct(ProductInfo productInfo); ReturnDTO updateProduct(ProductInfo productInfo); + ProductInfo productDetail(Long id); + ReturnDTO deleteProduct(List ids); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 823eb98..b7277cf 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,5 +1,9 @@ package com.casic.missiles.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; @@ -12,11 +16,19 @@ import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.ProductConfigItem; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.RedisCommon; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; +import java.nio.charset.Charset; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** *

@@ -27,8 +39,11 @@ * @since 2023-11-20 */ @Service +@RequiredArgsConstructor public class BusConfigServiceImpl extends ServiceImpl implements IBusConfigService { + private final RedisCommon redisCommon; + @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { List busConfigList = this.baseMapper.listPage(page, request, dataScope); @@ -41,6 +56,7 @@ AuthUser shiroUser = ShiroKit.getUser(); busConfig.setCreateUserId(shiroUser.getId()); if (this.baseMapper.insert(busConfig) > 0) { + convertParamItemToSend(busConfig.getConfigJson(), busConfig.getDevcodeList()); return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); @@ -53,4 +69,42 @@ } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + + /** + * 将参数配置项内容转换为配置项内容 + * + * @return + */ + private void convertParamItemToSend(String configJson, List devcodeList) { + if (StringUtils.isBlank(configJson) || CollectionUtils.isEmpty(devcodeList)) { + return; + } + List productConfigItemList = JSON.parseArray(configJson, ProductConfigItem.class); + if (CollectionUtils.isEmpty(productConfigItemList)) { + return; + } + Map bizDataMap = new HashMap<>(); + for (ProductConfigItem productConfigItem : productConfigItemList) { + Object value = ConvertStringToOther(productConfigItem.getParamValue(), productConfigItem.getParamType()); + bizDataMap.put(productConfigItem.getParamName(), value); + } + for (String devcode : devcodeList) { + redisCommon.setRedisConfig(devcode, bizDataMap); + } + } + + private Object ConvertStringToOther(String paramValue, Integer paramType) { + //健壮性校验 + if (StringUtils.isBlank(paramValue)) { + return null; + } + switch (paramType) { + case 1: + return Float.valueOf(paramValue); + case 2: + return Integer.valueOf(paramValue); + default: + return paramValue; + } + } } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java index 071387d..108f0e4 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java @@ -13,4 +13,5 @@ */ public interface ProductInfoMapper extends BaseMapper { + Long selectMaxNo(); } diff --git a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml index 27b551d..26f3cb3 100644 --- a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml +++ b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml @@ -8,8 +8,6 @@ - - @@ -22,4 +20,11 @@ Id, name, access_type, encipher_type, protocol_type, model, descn, product_type, owners, CreatorName, create_time, create_user_id + + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index f7dd974..92465e5 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -9,7 +9,8 @@ */ public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { - HANDLE_FAILED(500, "操作失败"); + HANDLE_FAILED(500, "操作失败"), + GROUP_BIND_DEVICE(2023, "删除失败,设备组绑定的有设备"); private Integer code; private String message; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index efbc561..da221ae 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -53,7 +53,7 @@ /** * 协议类型 */ - String protocol_type = "protocolType"; + String COMMUNICATION_PROTOCOL = "communicationProtocol"; /** * 产品类型 diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index f62583a..1169ca3 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -14,6 +14,7 @@ import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -41,6 +42,7 @@ * 设备编号 */ @TableField("devcode") + @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") private String devcode; 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 f979eac..fe2d10a 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 @@ -6,8 +6,12 @@ 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; @@ -21,6 +25,7 @@ */ @Getter @Setter +@ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -32,60 +37,94 @@ @TableId("Id") private Long id; + + @TableField("product_no") + @ApiModelProperty(value = "产品编号", dataType = "String") + private String productNo; + + /** * 产品名称 */ @TableField("name") + @ApiModelProperty(value = "产品名称", dataType = "String") private String name; /** * 接入类型 直连,集中器,AEP电信平台等 */ @TableField("access_type") + @DictCodeField(message = "接入类型不合法", cacheName = ACCESS_TYPE) + @ApiModelProperty(value = "接入类型", dataType = "Integer") private Integer accessType; + @TableField(exist = false) + @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") + private String accessTypeName; + + /** * 加密类型 加密类型-tea.sm4,明文 */ @TableField("encipher_type") + @ApiModelProperty(value = "加密类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = ENCIPHER_TYPE) private Integer encipherType; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String encipherTypeName; + /** * 协议类型 mqtt,tcp等协议类型 */ - @TableField("protocol_type") - private Integer protocolType; + @TableField("communication_protocol") + @ApiModelProperty(value = "协议类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = COMMUNICATION_PROTOCOL) + private Integer communicationProtocol; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String communicationProtocolName; /** * 供电方式 直流、电池 */ @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) private Integer powerType; - - /** - * 型号 - */ - @TableField("model") - private Integer model; + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 产品描述 产品介绍描述 */ @TableField("descn") + @ApiModelProperty(value = "产品描述", dataType = "String") private String descn; /** * 产品类别 */ @TableField("product_type") + @ApiModelProperty(value = "产品类别", dataType = "Integer") + @DictCodeField(message = "产品类别不合法", cacheName = PRODUCT_TYPE) private Integer productType; + + @TableField(exist = false) + @ApiModelProperty(value = "产品类别", dataType = "String") + private String productTypeName; + + /** * 产品负责人(技术) */ @TableField("owners") + @ApiModelProperty(value = "产品负责人(技术)", dataType = "String") private String owners; /** @@ -100,5 +139,12 @@ @TableField("create_user_name") private String createUserName; + @TableField(exist = false) + @ApiModelProperty(value = "产品配置项内容", dataType = "String") + List productConfigItems; + + @TableField(exist = false) + @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") + List productDataItems; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java new file mode 100644 index 0000000..44d9833 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductConfigItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductConfigItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java new file mode 100644 index 0000000..0a248fa --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductDataItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductDataItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java index d5cc3e5..62cdcd9 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java @@ -19,12 +19,14 @@ */ public interface IProductInfoService extends IService { - Page listPage(Page page, ProductListDTO request, DataScope dataScope); + Page listPage(Page page, ProductListDTO request, DataScope dataScope)throws Exception; ReturnDTO addProduct(ProductInfo productInfo); ReturnDTO updateProduct(ProductInfo productInfo); + ProductInfo productDetail(Long id); + ReturnDTO deleteProduct(List ids); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 823eb98..b7277cf 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,5 +1,9 @@ package com.casic.missiles.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; @@ -12,11 +16,19 @@ import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.ProductConfigItem; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.RedisCommon; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; +import java.nio.charset.Charset; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** *

@@ -27,8 +39,11 @@ * @since 2023-11-20 */ @Service +@RequiredArgsConstructor public class BusConfigServiceImpl extends ServiceImpl implements IBusConfigService { + private final RedisCommon redisCommon; + @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { List busConfigList = this.baseMapper.listPage(page, request, dataScope); @@ -41,6 +56,7 @@ AuthUser shiroUser = ShiroKit.getUser(); busConfig.setCreateUserId(shiroUser.getId()); if (this.baseMapper.insert(busConfig) > 0) { + convertParamItemToSend(busConfig.getConfigJson(), busConfig.getDevcodeList()); return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); @@ -53,4 +69,42 @@ } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + + /** + * 将参数配置项内容转换为配置项内容 + * + * @return + */ + private void convertParamItemToSend(String configJson, List devcodeList) { + if (StringUtils.isBlank(configJson) || CollectionUtils.isEmpty(devcodeList)) { + return; + } + List productConfigItemList = JSON.parseArray(configJson, ProductConfigItem.class); + if (CollectionUtils.isEmpty(productConfigItemList)) { + return; + } + Map bizDataMap = new HashMap<>(); + for (ProductConfigItem productConfigItem : productConfigItemList) { + Object value = ConvertStringToOther(productConfigItem.getParamValue(), productConfigItem.getParamType()); + bizDataMap.put(productConfigItem.getParamName(), value); + } + for (String devcode : devcodeList) { + redisCommon.setRedisConfig(devcode, bizDataMap); + } + } + + private Object ConvertStringToOther(String paramValue, Integer paramType) { + //健壮性校验 + if (StringUtils.isBlank(paramValue)) { + return null; + } + switch (paramType) { + case 1: + return Float.valueOf(paramValue); + case 2: + return Integer.valueOf(paramValue); + default: + return paramValue; + } + } } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java index c9c2e30..00d2b4d 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java @@ -3,6 +3,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.excel.EasyExcel; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -17,9 +18,11 @@ import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceGroupMapper; import com.casic.missiles.mapper.common.SysCommonMapper; +import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; import com.casic.missiles.service.IDeviceGroupService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.NumberGeneratorUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -42,6 +45,7 @@ public class DeviceGroupServiceImpl extends ServiceImpl implements IDeviceGroupService { private final SysCommonMapper sysCommonMapper; + private final IDeviceService deviceService; @Override public Page listPage(Page page, DeviceGroupListRequest request, DataScope dataScope) { @@ -62,6 +66,12 @@ } + /** + * 添加到redis + * + * @param deviceGroup + * @return + */ @Override public ReturnDTO addDeviceGroup(DeviceGroup deviceGroup) { AuthUser shiroUser = ShiroKit.getUser(); @@ -87,6 +97,12 @@ @Transactional public ReturnDTO deleteDeviceGroup(List ids) { //如果分组有设备,是清空设备分组的情况,还是强制删除 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("group_id", ids); + List deviceList = deviceService.list(queryWrapper); + if (deviceList.size() > 0) { + throw new BusinessException(BusinessExceptionEnum.GROUP_BIND_DEVICE); + } if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); } @@ -106,4 +122,6 @@ return this.baseMapper.selectById(id); } + + } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java index 071387d..108f0e4 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java @@ -13,4 +13,5 @@ */ public interface ProductInfoMapper extends BaseMapper { + Long selectMaxNo(); } diff --git a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml index 27b551d..26f3cb3 100644 --- a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml +++ b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml @@ -8,8 +8,6 @@ - - @@ -22,4 +20,11 @@ Id, name, access_type, encipher_type, protocol_type, model, descn, product_type, owners, CreatorName, create_time, create_user_id + + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index f7dd974..92465e5 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -9,7 +9,8 @@ */ public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { - HANDLE_FAILED(500, "操作失败"); + HANDLE_FAILED(500, "操作失败"), + GROUP_BIND_DEVICE(2023, "删除失败,设备组绑定的有设备"); private Integer code; private String message; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index efbc561..da221ae 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -53,7 +53,7 @@ /** * 协议类型 */ - String protocol_type = "protocolType"; + String COMMUNICATION_PROTOCOL = "communicationProtocol"; /** * 产品类型 diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index f62583a..1169ca3 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -14,6 +14,7 @@ import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -41,6 +42,7 @@ * 设备编号 */ @TableField("devcode") + @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") private String devcode; 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 f979eac..fe2d10a 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 @@ -6,8 +6,12 @@ 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; @@ -21,6 +25,7 @@ */ @Getter @Setter +@ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -32,60 +37,94 @@ @TableId("Id") private Long id; + + @TableField("product_no") + @ApiModelProperty(value = "产品编号", dataType = "String") + private String productNo; + + /** * 产品名称 */ @TableField("name") + @ApiModelProperty(value = "产品名称", dataType = "String") private String name; /** * 接入类型 直连,集中器,AEP电信平台等 */ @TableField("access_type") + @DictCodeField(message = "接入类型不合法", cacheName = ACCESS_TYPE) + @ApiModelProperty(value = "接入类型", dataType = "Integer") private Integer accessType; + @TableField(exist = false) + @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") + private String accessTypeName; + + /** * 加密类型 加密类型-tea.sm4,明文 */ @TableField("encipher_type") + @ApiModelProperty(value = "加密类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = ENCIPHER_TYPE) private Integer encipherType; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String encipherTypeName; + /** * 协议类型 mqtt,tcp等协议类型 */ - @TableField("protocol_type") - private Integer protocolType; + @TableField("communication_protocol") + @ApiModelProperty(value = "协议类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = COMMUNICATION_PROTOCOL) + private Integer communicationProtocol; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String communicationProtocolName; /** * 供电方式 直流、电池 */ @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) private Integer powerType; - - /** - * 型号 - */ - @TableField("model") - private Integer model; + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 产品描述 产品介绍描述 */ @TableField("descn") + @ApiModelProperty(value = "产品描述", dataType = "String") private String descn; /** * 产品类别 */ @TableField("product_type") + @ApiModelProperty(value = "产品类别", dataType = "Integer") + @DictCodeField(message = "产品类别不合法", cacheName = PRODUCT_TYPE) private Integer productType; + + @TableField(exist = false) + @ApiModelProperty(value = "产品类别", dataType = "String") + private String productTypeName; + + /** * 产品负责人(技术) */ @TableField("owners") + @ApiModelProperty(value = "产品负责人(技术)", dataType = "String") private String owners; /** @@ -100,5 +139,12 @@ @TableField("create_user_name") private String createUserName; + @TableField(exist = false) + @ApiModelProperty(value = "产品配置项内容", dataType = "String") + List productConfigItems; + + @TableField(exist = false) + @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") + List productDataItems; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java new file mode 100644 index 0000000..44d9833 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductConfigItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductConfigItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java new file mode 100644 index 0000000..0a248fa --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductDataItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductDataItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java index d5cc3e5..62cdcd9 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java @@ -19,12 +19,14 @@ */ public interface IProductInfoService extends IService { - Page listPage(Page page, ProductListDTO request, DataScope dataScope); + Page listPage(Page page, ProductListDTO request, DataScope dataScope)throws Exception; ReturnDTO addProduct(ProductInfo productInfo); ReturnDTO updateProduct(ProductInfo productInfo); + ProductInfo productDetail(Long id); + ReturnDTO deleteProduct(List ids); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 823eb98..b7277cf 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,5 +1,9 @@ package com.casic.missiles.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; @@ -12,11 +16,19 @@ import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.ProductConfigItem; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.RedisCommon; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; +import java.nio.charset.Charset; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** *

@@ -27,8 +39,11 @@ * @since 2023-11-20 */ @Service +@RequiredArgsConstructor public class BusConfigServiceImpl extends ServiceImpl implements IBusConfigService { + private final RedisCommon redisCommon; + @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { List busConfigList = this.baseMapper.listPage(page, request, dataScope); @@ -41,6 +56,7 @@ AuthUser shiroUser = ShiroKit.getUser(); busConfig.setCreateUserId(shiroUser.getId()); if (this.baseMapper.insert(busConfig) > 0) { + convertParamItemToSend(busConfig.getConfigJson(), busConfig.getDevcodeList()); return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); @@ -53,4 +69,42 @@ } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + + /** + * 将参数配置项内容转换为配置项内容 + * + * @return + */ + private void convertParamItemToSend(String configJson, List devcodeList) { + if (StringUtils.isBlank(configJson) || CollectionUtils.isEmpty(devcodeList)) { + return; + } + List productConfigItemList = JSON.parseArray(configJson, ProductConfigItem.class); + if (CollectionUtils.isEmpty(productConfigItemList)) { + return; + } + Map bizDataMap = new HashMap<>(); + for (ProductConfigItem productConfigItem : productConfigItemList) { + Object value = ConvertStringToOther(productConfigItem.getParamValue(), productConfigItem.getParamType()); + bizDataMap.put(productConfigItem.getParamName(), value); + } + for (String devcode : devcodeList) { + redisCommon.setRedisConfig(devcode, bizDataMap); + } + } + + private Object ConvertStringToOther(String paramValue, Integer paramType) { + //健壮性校验 + if (StringUtils.isBlank(paramValue)) { + return null; + } + switch (paramType) { + case 1: + return Float.valueOf(paramValue); + case 2: + return Integer.valueOf(paramValue); + default: + return paramValue; + } + } } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java index c9c2e30..00d2b4d 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java @@ -3,6 +3,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.excel.EasyExcel; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -17,9 +18,11 @@ import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceGroupMapper; import com.casic.missiles.mapper.common.SysCommonMapper; +import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; import com.casic.missiles.service.IDeviceGroupService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.NumberGeneratorUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -42,6 +45,7 @@ public class DeviceGroupServiceImpl extends ServiceImpl implements IDeviceGroupService { private final SysCommonMapper sysCommonMapper; + private final IDeviceService deviceService; @Override public Page listPage(Page page, DeviceGroupListRequest request, DataScope dataScope) { @@ -62,6 +66,12 @@ } + /** + * 添加到redis + * + * @param deviceGroup + * @return + */ @Override public ReturnDTO addDeviceGroup(DeviceGroup deviceGroup) { AuthUser shiroUser = ShiroKit.getUser(); @@ -87,6 +97,12 @@ @Transactional public ReturnDTO deleteDeviceGroup(List ids) { //如果分组有设备,是清空设备分组的情况,还是强制删除 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("group_id", ids); + List deviceList = deviceService.list(queryWrapper); + if (deviceList.size() > 0) { + throw new BusinessException(BusinessExceptionEnum.GROUP_BIND_DEVICE); + } if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); } @@ -106,4 +122,6 @@ return this.baseMapper.selectById(id); } + + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java new file mode 100644 index 0000000..11b6590 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl; + +import com.casic.missiles.model.ProductConfigItem; +import com.casic.missiles.mapper.ProductConfigItemMapper; +import com.casic.missiles.service.IProductConfigItemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +@Service +public class ProductConfigItemServiceImpl extends ServiceImpl implements IProductConfigItemService { + +} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java index 071387d..108f0e4 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java @@ -13,4 +13,5 @@ */ public interface ProductInfoMapper extends BaseMapper { + Long selectMaxNo(); } diff --git a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml index 27b551d..26f3cb3 100644 --- a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml +++ b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml @@ -8,8 +8,6 @@ - - @@ -22,4 +20,11 @@ Id, name, access_type, encipher_type, protocol_type, model, descn, product_type, owners, CreatorName, create_time, create_user_id + + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index f7dd974..92465e5 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -9,7 +9,8 @@ */ public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { - HANDLE_FAILED(500, "操作失败"); + HANDLE_FAILED(500, "操作失败"), + GROUP_BIND_DEVICE(2023, "删除失败,设备组绑定的有设备"); private Integer code; private String message; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index efbc561..da221ae 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -53,7 +53,7 @@ /** * 协议类型 */ - String protocol_type = "protocolType"; + String COMMUNICATION_PROTOCOL = "communicationProtocol"; /** * 产品类型 diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index f62583a..1169ca3 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -14,6 +14,7 @@ import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -41,6 +42,7 @@ * 设备编号 */ @TableField("devcode") + @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") private String devcode; 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 f979eac..fe2d10a 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 @@ -6,8 +6,12 @@ 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; @@ -21,6 +25,7 @@ */ @Getter @Setter +@ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -32,60 +37,94 @@ @TableId("Id") private Long id; + + @TableField("product_no") + @ApiModelProperty(value = "产品编号", dataType = "String") + private String productNo; + + /** * 产品名称 */ @TableField("name") + @ApiModelProperty(value = "产品名称", dataType = "String") private String name; /** * 接入类型 直连,集中器,AEP电信平台等 */ @TableField("access_type") + @DictCodeField(message = "接入类型不合法", cacheName = ACCESS_TYPE) + @ApiModelProperty(value = "接入类型", dataType = "Integer") private Integer accessType; + @TableField(exist = false) + @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") + private String accessTypeName; + + /** * 加密类型 加密类型-tea.sm4,明文 */ @TableField("encipher_type") + @ApiModelProperty(value = "加密类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = ENCIPHER_TYPE) private Integer encipherType; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String encipherTypeName; + /** * 协议类型 mqtt,tcp等协议类型 */ - @TableField("protocol_type") - private Integer protocolType; + @TableField("communication_protocol") + @ApiModelProperty(value = "协议类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = COMMUNICATION_PROTOCOL) + private Integer communicationProtocol; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String communicationProtocolName; /** * 供电方式 直流、电池 */ @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) private Integer powerType; - - /** - * 型号 - */ - @TableField("model") - private Integer model; + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 产品描述 产品介绍描述 */ @TableField("descn") + @ApiModelProperty(value = "产品描述", dataType = "String") private String descn; /** * 产品类别 */ @TableField("product_type") + @ApiModelProperty(value = "产品类别", dataType = "Integer") + @DictCodeField(message = "产品类别不合法", cacheName = PRODUCT_TYPE) private Integer productType; + + @TableField(exist = false) + @ApiModelProperty(value = "产品类别", dataType = "String") + private String productTypeName; + + /** * 产品负责人(技术) */ @TableField("owners") + @ApiModelProperty(value = "产品负责人(技术)", dataType = "String") private String owners; /** @@ -100,5 +139,12 @@ @TableField("create_user_name") private String createUserName; + @TableField(exist = false) + @ApiModelProperty(value = "产品配置项内容", dataType = "String") + List productConfigItems; + + @TableField(exist = false) + @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") + List productDataItems; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java new file mode 100644 index 0000000..44d9833 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductConfigItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductConfigItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java new file mode 100644 index 0000000..0a248fa --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductDataItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductDataItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java index d5cc3e5..62cdcd9 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java @@ -19,12 +19,14 @@ */ public interface IProductInfoService extends IService { - Page listPage(Page page, ProductListDTO request, DataScope dataScope); + Page listPage(Page page, ProductListDTO request, DataScope dataScope)throws Exception; ReturnDTO addProduct(ProductInfo productInfo); ReturnDTO updateProduct(ProductInfo productInfo); + ProductInfo productDetail(Long id); + ReturnDTO deleteProduct(List ids); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 823eb98..b7277cf 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,5 +1,9 @@ package com.casic.missiles.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; @@ -12,11 +16,19 @@ import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.ProductConfigItem; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.RedisCommon; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; +import java.nio.charset.Charset; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** *

@@ -27,8 +39,11 @@ * @since 2023-11-20 */ @Service +@RequiredArgsConstructor public class BusConfigServiceImpl extends ServiceImpl implements IBusConfigService { + private final RedisCommon redisCommon; + @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { List busConfigList = this.baseMapper.listPage(page, request, dataScope); @@ -41,6 +56,7 @@ AuthUser shiroUser = ShiroKit.getUser(); busConfig.setCreateUserId(shiroUser.getId()); if (this.baseMapper.insert(busConfig) > 0) { + convertParamItemToSend(busConfig.getConfigJson(), busConfig.getDevcodeList()); return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); @@ -53,4 +69,42 @@ } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + + /** + * 将参数配置项内容转换为配置项内容 + * + * @return + */ + private void convertParamItemToSend(String configJson, List devcodeList) { + if (StringUtils.isBlank(configJson) || CollectionUtils.isEmpty(devcodeList)) { + return; + } + List productConfigItemList = JSON.parseArray(configJson, ProductConfigItem.class); + if (CollectionUtils.isEmpty(productConfigItemList)) { + return; + } + Map bizDataMap = new HashMap<>(); + for (ProductConfigItem productConfigItem : productConfigItemList) { + Object value = ConvertStringToOther(productConfigItem.getParamValue(), productConfigItem.getParamType()); + bizDataMap.put(productConfigItem.getParamName(), value); + } + for (String devcode : devcodeList) { + redisCommon.setRedisConfig(devcode, bizDataMap); + } + } + + private Object ConvertStringToOther(String paramValue, Integer paramType) { + //健壮性校验 + if (StringUtils.isBlank(paramValue)) { + return null; + } + switch (paramType) { + case 1: + return Float.valueOf(paramValue); + case 2: + return Integer.valueOf(paramValue); + default: + return paramValue; + } + } } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java index c9c2e30..00d2b4d 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java @@ -3,6 +3,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.excel.EasyExcel; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -17,9 +18,11 @@ import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceGroupMapper; import com.casic.missiles.mapper.common.SysCommonMapper; +import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; import com.casic.missiles.service.IDeviceGroupService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.NumberGeneratorUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -42,6 +45,7 @@ public class DeviceGroupServiceImpl extends ServiceImpl implements IDeviceGroupService { private final SysCommonMapper sysCommonMapper; + private final IDeviceService deviceService; @Override public Page listPage(Page page, DeviceGroupListRequest request, DataScope dataScope) { @@ -62,6 +66,12 @@ } + /** + * 添加到redis + * + * @param deviceGroup + * @return + */ @Override public ReturnDTO addDeviceGroup(DeviceGroup deviceGroup) { AuthUser shiroUser = ShiroKit.getUser(); @@ -87,6 +97,12 @@ @Transactional public ReturnDTO deleteDeviceGroup(List ids) { //如果分组有设备,是清空设备分组的情况,还是强制删除 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("group_id", ids); + List deviceList = deviceService.list(queryWrapper); + if (deviceList.size() > 0) { + throw new BusinessException(BusinessExceptionEnum.GROUP_BIND_DEVICE); + } if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); } @@ -106,4 +122,6 @@ return this.baseMapper.selectById(id); } + + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java new file mode 100644 index 0000000..11b6590 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl; + +import com.casic.missiles.model.ProductConfigItem; +import com.casic.missiles.mapper.ProductConfigItemMapper; +import com.casic.missiles.service.IProductConfigItemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +@Service +public class ProductConfigItemServiceImpl extends ServiceImpl implements IProductConfigItemService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductDataItemServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductDataItemServiceImpl.java new file mode 100644 index 0000000..6468775 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductDataItemServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl; + +import com.casic.missiles.model.ProductDataItem; +import com.casic.missiles.mapper.ProductDataItemMapper; +import com.casic.missiles.service.IProductDataItemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +@Service +public class ProductDataItemServiceImpl extends ServiceImpl implements IProductDataItemService { + +} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java index 071387d..108f0e4 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java @@ -13,4 +13,5 @@ */ public interface ProductInfoMapper extends BaseMapper { + Long selectMaxNo(); } diff --git a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml index 27b551d..26f3cb3 100644 --- a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml +++ b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml @@ -8,8 +8,6 @@ - - @@ -22,4 +20,11 @@ Id, name, access_type, encipher_type, protocol_type, model, descn, product_type, owners, CreatorName, create_time, create_user_id + + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index f7dd974..92465e5 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -9,7 +9,8 @@ */ public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { - HANDLE_FAILED(500, "操作失败"); + HANDLE_FAILED(500, "操作失败"), + GROUP_BIND_DEVICE(2023, "删除失败,设备组绑定的有设备"); private Integer code; private String message; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index efbc561..da221ae 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -53,7 +53,7 @@ /** * 协议类型 */ - String protocol_type = "protocolType"; + String COMMUNICATION_PROTOCOL = "communicationProtocol"; /** * 产品类型 diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index f62583a..1169ca3 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -14,6 +14,7 @@ import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -41,6 +42,7 @@ * 设备编号 */ @TableField("devcode") + @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") private String devcode; 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 f979eac..fe2d10a 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 @@ -6,8 +6,12 @@ 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; @@ -21,6 +25,7 @@ */ @Getter @Setter +@ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -32,60 +37,94 @@ @TableId("Id") private Long id; + + @TableField("product_no") + @ApiModelProperty(value = "产品编号", dataType = "String") + private String productNo; + + /** * 产品名称 */ @TableField("name") + @ApiModelProperty(value = "产品名称", dataType = "String") private String name; /** * 接入类型 直连,集中器,AEP电信平台等 */ @TableField("access_type") + @DictCodeField(message = "接入类型不合法", cacheName = ACCESS_TYPE) + @ApiModelProperty(value = "接入类型", dataType = "Integer") private Integer accessType; + @TableField(exist = false) + @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") + private String accessTypeName; + + /** * 加密类型 加密类型-tea.sm4,明文 */ @TableField("encipher_type") + @ApiModelProperty(value = "加密类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = ENCIPHER_TYPE) private Integer encipherType; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String encipherTypeName; + /** * 协议类型 mqtt,tcp等协议类型 */ - @TableField("protocol_type") - private Integer protocolType; + @TableField("communication_protocol") + @ApiModelProperty(value = "协议类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = COMMUNICATION_PROTOCOL) + private Integer communicationProtocol; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String communicationProtocolName; /** * 供电方式 直流、电池 */ @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) private Integer powerType; - - /** - * 型号 - */ - @TableField("model") - private Integer model; + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 产品描述 产品介绍描述 */ @TableField("descn") + @ApiModelProperty(value = "产品描述", dataType = "String") private String descn; /** * 产品类别 */ @TableField("product_type") + @ApiModelProperty(value = "产品类别", dataType = "Integer") + @DictCodeField(message = "产品类别不合法", cacheName = PRODUCT_TYPE) private Integer productType; + + @TableField(exist = false) + @ApiModelProperty(value = "产品类别", dataType = "String") + private String productTypeName; + + /** * 产品负责人(技术) */ @TableField("owners") + @ApiModelProperty(value = "产品负责人(技术)", dataType = "String") private String owners; /** @@ -100,5 +139,12 @@ @TableField("create_user_name") private String createUserName; + @TableField(exist = false) + @ApiModelProperty(value = "产品配置项内容", dataType = "String") + List productConfigItems; + + @TableField(exist = false) + @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") + List productDataItems; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java new file mode 100644 index 0000000..44d9833 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductConfigItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductConfigItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java new file mode 100644 index 0000000..0a248fa --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductDataItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductDataItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java index d5cc3e5..62cdcd9 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java @@ -19,12 +19,14 @@ */ public interface IProductInfoService extends IService { - Page listPage(Page page, ProductListDTO request, DataScope dataScope); + Page listPage(Page page, ProductListDTO request, DataScope dataScope)throws Exception; ReturnDTO addProduct(ProductInfo productInfo); ReturnDTO updateProduct(ProductInfo productInfo); + ProductInfo productDetail(Long id); + ReturnDTO deleteProduct(List ids); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 823eb98..b7277cf 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,5 +1,9 @@ package com.casic.missiles.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; @@ -12,11 +16,19 @@ import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.ProductConfigItem; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.RedisCommon; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; +import java.nio.charset.Charset; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** *

@@ -27,8 +39,11 @@ * @since 2023-11-20 */ @Service +@RequiredArgsConstructor public class BusConfigServiceImpl extends ServiceImpl implements IBusConfigService { + private final RedisCommon redisCommon; + @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { List busConfigList = this.baseMapper.listPage(page, request, dataScope); @@ -41,6 +56,7 @@ AuthUser shiroUser = ShiroKit.getUser(); busConfig.setCreateUserId(shiroUser.getId()); if (this.baseMapper.insert(busConfig) > 0) { + convertParamItemToSend(busConfig.getConfigJson(), busConfig.getDevcodeList()); return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); @@ -53,4 +69,42 @@ } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + + /** + * 将参数配置项内容转换为配置项内容 + * + * @return + */ + private void convertParamItemToSend(String configJson, List devcodeList) { + if (StringUtils.isBlank(configJson) || CollectionUtils.isEmpty(devcodeList)) { + return; + } + List productConfigItemList = JSON.parseArray(configJson, ProductConfigItem.class); + if (CollectionUtils.isEmpty(productConfigItemList)) { + return; + } + Map bizDataMap = new HashMap<>(); + for (ProductConfigItem productConfigItem : productConfigItemList) { + Object value = ConvertStringToOther(productConfigItem.getParamValue(), productConfigItem.getParamType()); + bizDataMap.put(productConfigItem.getParamName(), value); + } + for (String devcode : devcodeList) { + redisCommon.setRedisConfig(devcode, bizDataMap); + } + } + + private Object ConvertStringToOther(String paramValue, Integer paramType) { + //健壮性校验 + if (StringUtils.isBlank(paramValue)) { + return null; + } + switch (paramType) { + case 1: + return Float.valueOf(paramValue); + case 2: + return Integer.valueOf(paramValue); + default: + return paramValue; + } + } } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java index c9c2e30..00d2b4d 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java @@ -3,6 +3,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.excel.EasyExcel; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -17,9 +18,11 @@ import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceGroupMapper; import com.casic.missiles.mapper.common.SysCommonMapper; +import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; import com.casic.missiles.service.IDeviceGroupService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.NumberGeneratorUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -42,6 +45,7 @@ public class DeviceGroupServiceImpl extends ServiceImpl implements IDeviceGroupService { private final SysCommonMapper sysCommonMapper; + private final IDeviceService deviceService; @Override public Page listPage(Page page, DeviceGroupListRequest request, DataScope dataScope) { @@ -62,6 +66,12 @@ } + /** + * 添加到redis + * + * @param deviceGroup + * @return + */ @Override public ReturnDTO addDeviceGroup(DeviceGroup deviceGroup) { AuthUser shiroUser = ShiroKit.getUser(); @@ -87,6 +97,12 @@ @Transactional public ReturnDTO deleteDeviceGroup(List ids) { //如果分组有设备,是清空设备分组的情况,还是强制删除 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("group_id", ids); + List deviceList = deviceService.list(queryWrapper); + if (deviceList.size() > 0) { + throw new BusinessException(BusinessExceptionEnum.GROUP_BIND_DEVICE); + } if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); } @@ -106,4 +122,6 @@ return this.baseMapper.selectById(id); } + + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java new file mode 100644 index 0000000..11b6590 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl; + +import com.casic.missiles.model.ProductConfigItem; +import com.casic.missiles.mapper.ProductConfigItemMapper; +import com.casic.missiles.service.IProductConfigItemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +@Service +public class ProductConfigItemServiceImpl extends ServiceImpl implements IProductConfigItemService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductDataItemServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductDataItemServiceImpl.java new file mode 100644 index 0000000..6468775 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductDataItemServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl; + +import com.casic.missiles.model.ProductDataItem; +import com.casic.missiles.mapper.ProductDataItemMapper; +import com.casic.missiles.service.IProductDataItemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +@Service +public class ProductDataItemServiceImpl extends ServiceImpl implements IProductDataItemService { + +} 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 b225bb0..b6cc8dc 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,22 +1,42 @@ 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.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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; /** *

@@ -27,36 +47,100 @@ * @since 2023-11-20 */ @Service +@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) { - - - return null; + public Page listPage(Page page, ProductListDTO request, DataScope dataScope) throws Exception { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like(StringUtils.isNotBlank(request.getProductName()), + "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); + } + return page; } @Override + @Transactional public ReturnDTO addProduct(ProductInfo productInfo) { AuthUser shiroUser = ShiroKit.getUser(); + Long maxNo = this.baseMapper.selectMaxNo(); + String productNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DEVICE_GROUP, maxNo); + productInfo.setProductNo(productNo); productInfo.setCreateUserName(shiroUser.getName()); if (this.baseMapper.insert(productInfo) > 0) { - return ReturnUtil.success(); + 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) { - return ReturnUtil.success(); + //重新添加 + 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 ProductInfo productDetail(Long id) { + 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); + } + return productInfo; + } + + @Override public ReturnDTO deleteProduct(List ids) { - if (this.baseMapper.deleteBatchIds(ids) > 0) { + 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(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java index 071387d..108f0e4 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java @@ -13,4 +13,5 @@ */ public interface ProductInfoMapper extends BaseMapper { + Long selectMaxNo(); } diff --git a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml index 27b551d..26f3cb3 100644 --- a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml +++ b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml @@ -8,8 +8,6 @@ - - @@ -22,4 +20,11 @@ Id, name, access_type, encipher_type, protocol_type, model, descn, product_type, owners, CreatorName, create_time, create_user_id + + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index f7dd974..92465e5 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -9,7 +9,8 @@ */ public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { - HANDLE_FAILED(500, "操作失败"); + HANDLE_FAILED(500, "操作失败"), + GROUP_BIND_DEVICE(2023, "删除失败,设备组绑定的有设备"); private Integer code; private String message; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index efbc561..da221ae 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -53,7 +53,7 @@ /** * 协议类型 */ - String protocol_type = "protocolType"; + String COMMUNICATION_PROTOCOL = "communicationProtocol"; /** * 产品类型 diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index f62583a..1169ca3 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -14,6 +14,7 @@ import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -41,6 +42,7 @@ * 设备编号 */ @TableField("devcode") + @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") private String devcode; 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 f979eac..fe2d10a 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 @@ -6,8 +6,12 @@ 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; @@ -21,6 +25,7 @@ */ @Getter @Setter +@ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -32,60 +37,94 @@ @TableId("Id") private Long id; + + @TableField("product_no") + @ApiModelProperty(value = "产品编号", dataType = "String") + private String productNo; + + /** * 产品名称 */ @TableField("name") + @ApiModelProperty(value = "产品名称", dataType = "String") private String name; /** * 接入类型 直连,集中器,AEP电信平台等 */ @TableField("access_type") + @DictCodeField(message = "接入类型不合法", cacheName = ACCESS_TYPE) + @ApiModelProperty(value = "接入类型", dataType = "Integer") private Integer accessType; + @TableField(exist = false) + @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") + private String accessTypeName; + + /** * 加密类型 加密类型-tea.sm4,明文 */ @TableField("encipher_type") + @ApiModelProperty(value = "加密类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = ENCIPHER_TYPE) private Integer encipherType; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String encipherTypeName; + /** * 协议类型 mqtt,tcp等协议类型 */ - @TableField("protocol_type") - private Integer protocolType; + @TableField("communication_protocol") + @ApiModelProperty(value = "协议类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = COMMUNICATION_PROTOCOL) + private Integer communicationProtocol; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String communicationProtocolName; /** * 供电方式 直流、电池 */ @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) private Integer powerType; - - /** - * 型号 - */ - @TableField("model") - private Integer model; + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 产品描述 产品介绍描述 */ @TableField("descn") + @ApiModelProperty(value = "产品描述", dataType = "String") private String descn; /** * 产品类别 */ @TableField("product_type") + @ApiModelProperty(value = "产品类别", dataType = "Integer") + @DictCodeField(message = "产品类别不合法", cacheName = PRODUCT_TYPE) private Integer productType; + + @TableField(exist = false) + @ApiModelProperty(value = "产品类别", dataType = "String") + private String productTypeName; + + /** * 产品负责人(技术) */ @TableField("owners") + @ApiModelProperty(value = "产品负责人(技术)", dataType = "String") private String owners; /** @@ -100,5 +139,12 @@ @TableField("create_user_name") private String createUserName; + @TableField(exist = false) + @ApiModelProperty(value = "产品配置项内容", dataType = "String") + List productConfigItems; + + @TableField(exist = false) + @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") + List productDataItems; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java new file mode 100644 index 0000000..44d9833 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductConfigItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductConfigItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java new file mode 100644 index 0000000..0a248fa --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductDataItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductDataItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java index d5cc3e5..62cdcd9 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java @@ -19,12 +19,14 @@ */ public interface IProductInfoService extends IService { - Page listPage(Page page, ProductListDTO request, DataScope dataScope); + Page listPage(Page page, ProductListDTO request, DataScope dataScope)throws Exception; ReturnDTO addProduct(ProductInfo productInfo); ReturnDTO updateProduct(ProductInfo productInfo); + ProductInfo productDetail(Long id); + ReturnDTO deleteProduct(List ids); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 823eb98..b7277cf 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,5 +1,9 @@ package com.casic.missiles.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; @@ -12,11 +16,19 @@ import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.ProductConfigItem; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.RedisCommon; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; +import java.nio.charset.Charset; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** *

@@ -27,8 +39,11 @@ * @since 2023-11-20 */ @Service +@RequiredArgsConstructor public class BusConfigServiceImpl extends ServiceImpl implements IBusConfigService { + private final RedisCommon redisCommon; + @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { List busConfigList = this.baseMapper.listPage(page, request, dataScope); @@ -41,6 +56,7 @@ AuthUser shiroUser = ShiroKit.getUser(); busConfig.setCreateUserId(shiroUser.getId()); if (this.baseMapper.insert(busConfig) > 0) { + convertParamItemToSend(busConfig.getConfigJson(), busConfig.getDevcodeList()); return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); @@ -53,4 +69,42 @@ } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + + /** + * 将参数配置项内容转换为配置项内容 + * + * @return + */ + private void convertParamItemToSend(String configJson, List devcodeList) { + if (StringUtils.isBlank(configJson) || CollectionUtils.isEmpty(devcodeList)) { + return; + } + List productConfigItemList = JSON.parseArray(configJson, ProductConfigItem.class); + if (CollectionUtils.isEmpty(productConfigItemList)) { + return; + } + Map bizDataMap = new HashMap<>(); + for (ProductConfigItem productConfigItem : productConfigItemList) { + Object value = ConvertStringToOther(productConfigItem.getParamValue(), productConfigItem.getParamType()); + bizDataMap.put(productConfigItem.getParamName(), value); + } + for (String devcode : devcodeList) { + redisCommon.setRedisConfig(devcode, bizDataMap); + } + } + + private Object ConvertStringToOther(String paramValue, Integer paramType) { + //健壮性校验 + if (StringUtils.isBlank(paramValue)) { + return null; + } + switch (paramType) { + case 1: + return Float.valueOf(paramValue); + case 2: + return Integer.valueOf(paramValue); + default: + return paramValue; + } + } } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java index c9c2e30..00d2b4d 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java @@ -3,6 +3,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.excel.EasyExcel; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -17,9 +18,11 @@ import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceGroupMapper; import com.casic.missiles.mapper.common.SysCommonMapper; +import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; import com.casic.missiles.service.IDeviceGroupService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.NumberGeneratorUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -42,6 +45,7 @@ public class DeviceGroupServiceImpl extends ServiceImpl implements IDeviceGroupService { private final SysCommonMapper sysCommonMapper; + private final IDeviceService deviceService; @Override public Page listPage(Page page, DeviceGroupListRequest request, DataScope dataScope) { @@ -62,6 +66,12 @@ } + /** + * 添加到redis + * + * @param deviceGroup + * @return + */ @Override public ReturnDTO addDeviceGroup(DeviceGroup deviceGroup) { AuthUser shiroUser = ShiroKit.getUser(); @@ -87,6 +97,12 @@ @Transactional public ReturnDTO deleteDeviceGroup(List ids) { //如果分组有设备,是清空设备分组的情况,还是强制删除 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("group_id", ids); + List deviceList = deviceService.list(queryWrapper); + if (deviceList.size() > 0) { + throw new BusinessException(BusinessExceptionEnum.GROUP_BIND_DEVICE); + } if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); } @@ -106,4 +122,6 @@ return this.baseMapper.selectById(id); } + + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java new file mode 100644 index 0000000..11b6590 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl; + +import com.casic.missiles.model.ProductConfigItem; +import com.casic.missiles.mapper.ProductConfigItemMapper; +import com.casic.missiles.service.IProductConfigItemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +@Service +public class ProductConfigItemServiceImpl extends ServiceImpl implements IProductConfigItemService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductDataItemServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductDataItemServiceImpl.java new file mode 100644 index 0000000..6468775 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductDataItemServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl; + +import com.casic.missiles.model.ProductDataItem; +import com.casic.missiles.mapper.ProductDataItemMapper; +import com.casic.missiles.service.IProductDataItemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +@Service +public class ProductDataItemServiceImpl extends ServiceImpl implements IProductDataItemService { + +} 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 b225bb0..b6cc8dc 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,22 +1,42 @@ 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.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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; /** *

@@ -27,36 +47,100 @@ * @since 2023-11-20 */ @Service +@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) { - - - return null; + public Page listPage(Page page, ProductListDTO request, DataScope dataScope) throws Exception { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like(StringUtils.isNotBlank(request.getProductName()), + "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); + } + return page; } @Override + @Transactional public ReturnDTO addProduct(ProductInfo productInfo) { AuthUser shiroUser = ShiroKit.getUser(); + Long maxNo = this.baseMapper.selectMaxNo(); + String productNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DEVICE_GROUP, maxNo); + productInfo.setProductNo(productNo); productInfo.setCreateUserName(shiroUser.getName()); if (this.baseMapper.insert(productInfo) > 0) { - return ReturnUtil.success(); + 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) { - return ReturnUtil.success(); + //重新添加 + 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 ProductInfo productDetail(Long id) { + 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); + } + return productInfo; + } + + @Override public ReturnDTO deleteProduct(List ids) { - if (this.baseMapper.deleteBatchIds(ids) > 0) { + 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(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/ProductInfoController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/ProductInfoController.java index 9381cb5..2578f26 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/ProductInfoController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/ProductInfoController.java @@ -6,6 +6,7 @@ import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.IdsDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; @@ -44,7 +45,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated ProductListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated ProductListDTO request, BindingResult bindingResult) throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } @@ -55,7 +56,7 @@ @ApiOperation("新增") @PostMapping("/add") - public ReturnDTO addProduct(@RequestBody @Validated ProductInfo productInfo, BindingResult bindingResult) { + public ReturnDTO addProduct(@RequestBody @Validated ProductInfo productInfo, BindingResult bindingResult) { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } @@ -72,9 +73,18 @@ return productInfoService.updateProduct(productInfo); } + @ApiOperation("编辑") + @PostMapping("/detail") + public ReturnDTO productDetail(@RequestBody @Validated IdDTO idDTO, BindingResult bindingResult) { + if (bindingResult.hasErrors()) { + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(productInfoService.productDetail(idDTO.getId())); + } + @ApiOperation("删除(支持批删、单删)") @PostMapping("/delete") - public ReturnDTO deleteProduct(@RequestBody IdsDTO idsDTO, BindingResult bindingResult) { + public ReturnDTO deleteProduct(@RequestBody IdsDTO idsDTO, BindingResult bindingResult) { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java index 071387d..108f0e4 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java @@ -13,4 +13,5 @@ */ public interface ProductInfoMapper extends BaseMapper { + Long selectMaxNo(); } diff --git a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml index 27b551d..26f3cb3 100644 --- a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml +++ b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml @@ -8,8 +8,6 @@ - - @@ -22,4 +20,11 @@ Id, name, access_type, encipher_type, protocol_type, model, descn, product_type, owners, CreatorName, create_time, create_user_id + + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index f7dd974..92465e5 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -9,7 +9,8 @@ */ public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { - HANDLE_FAILED(500, "操作失败"); + HANDLE_FAILED(500, "操作失败"), + GROUP_BIND_DEVICE(2023, "删除失败,设备组绑定的有设备"); private Integer code; private String message; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index efbc561..da221ae 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -53,7 +53,7 @@ /** * 协议类型 */ - String protocol_type = "protocolType"; + String COMMUNICATION_PROTOCOL = "communicationProtocol"; /** * 产品类型 diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index f62583a..1169ca3 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -14,6 +14,7 @@ import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -41,6 +42,7 @@ * 设备编号 */ @TableField("devcode") + @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") private String devcode; 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 f979eac..fe2d10a 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 @@ -6,8 +6,12 @@ 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; @@ -21,6 +25,7 @@ */ @Getter @Setter +@ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -32,60 +37,94 @@ @TableId("Id") private Long id; + + @TableField("product_no") + @ApiModelProperty(value = "产品编号", dataType = "String") + private String productNo; + + /** * 产品名称 */ @TableField("name") + @ApiModelProperty(value = "产品名称", dataType = "String") private String name; /** * 接入类型 直连,集中器,AEP电信平台等 */ @TableField("access_type") + @DictCodeField(message = "接入类型不合法", cacheName = ACCESS_TYPE) + @ApiModelProperty(value = "接入类型", dataType = "Integer") private Integer accessType; + @TableField(exist = false) + @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") + private String accessTypeName; + + /** * 加密类型 加密类型-tea.sm4,明文 */ @TableField("encipher_type") + @ApiModelProperty(value = "加密类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = ENCIPHER_TYPE) private Integer encipherType; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String encipherTypeName; + /** * 协议类型 mqtt,tcp等协议类型 */ - @TableField("protocol_type") - private Integer protocolType; + @TableField("communication_protocol") + @ApiModelProperty(value = "协议类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = COMMUNICATION_PROTOCOL) + private Integer communicationProtocol; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String communicationProtocolName; /** * 供电方式 直流、电池 */ @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) private Integer powerType; - - /** - * 型号 - */ - @TableField("model") - private Integer model; + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 产品描述 产品介绍描述 */ @TableField("descn") + @ApiModelProperty(value = "产品描述", dataType = "String") private String descn; /** * 产品类别 */ @TableField("product_type") + @ApiModelProperty(value = "产品类别", dataType = "Integer") + @DictCodeField(message = "产品类别不合法", cacheName = PRODUCT_TYPE) private Integer productType; + + @TableField(exist = false) + @ApiModelProperty(value = "产品类别", dataType = "String") + private String productTypeName; + + /** * 产品负责人(技术) */ @TableField("owners") + @ApiModelProperty(value = "产品负责人(技术)", dataType = "String") private String owners; /** @@ -100,5 +139,12 @@ @TableField("create_user_name") private String createUserName; + @TableField(exist = false) + @ApiModelProperty(value = "产品配置项内容", dataType = "String") + List productConfigItems; + + @TableField(exist = false) + @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") + List productDataItems; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java new file mode 100644 index 0000000..44d9833 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductConfigItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductConfigItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java new file mode 100644 index 0000000..0a248fa --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductDataItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductDataItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java index d5cc3e5..62cdcd9 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java @@ -19,12 +19,14 @@ */ public interface IProductInfoService extends IService { - Page listPage(Page page, ProductListDTO request, DataScope dataScope); + Page listPage(Page page, ProductListDTO request, DataScope dataScope)throws Exception; ReturnDTO addProduct(ProductInfo productInfo); ReturnDTO updateProduct(ProductInfo productInfo); + ProductInfo productDetail(Long id); + ReturnDTO deleteProduct(List ids); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 823eb98..b7277cf 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,5 +1,9 @@ package com.casic.missiles.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; @@ -12,11 +16,19 @@ import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.ProductConfigItem; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.RedisCommon; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; +import java.nio.charset.Charset; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** *

@@ -27,8 +39,11 @@ * @since 2023-11-20 */ @Service +@RequiredArgsConstructor public class BusConfigServiceImpl extends ServiceImpl implements IBusConfigService { + private final RedisCommon redisCommon; + @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { List busConfigList = this.baseMapper.listPage(page, request, dataScope); @@ -41,6 +56,7 @@ AuthUser shiroUser = ShiroKit.getUser(); busConfig.setCreateUserId(shiroUser.getId()); if (this.baseMapper.insert(busConfig) > 0) { + convertParamItemToSend(busConfig.getConfigJson(), busConfig.getDevcodeList()); return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); @@ -53,4 +69,42 @@ } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + + /** + * 将参数配置项内容转换为配置项内容 + * + * @return + */ + private void convertParamItemToSend(String configJson, List devcodeList) { + if (StringUtils.isBlank(configJson) || CollectionUtils.isEmpty(devcodeList)) { + return; + } + List productConfigItemList = JSON.parseArray(configJson, ProductConfigItem.class); + if (CollectionUtils.isEmpty(productConfigItemList)) { + return; + } + Map bizDataMap = new HashMap<>(); + for (ProductConfigItem productConfigItem : productConfigItemList) { + Object value = ConvertStringToOther(productConfigItem.getParamValue(), productConfigItem.getParamType()); + bizDataMap.put(productConfigItem.getParamName(), value); + } + for (String devcode : devcodeList) { + redisCommon.setRedisConfig(devcode, bizDataMap); + } + } + + private Object ConvertStringToOther(String paramValue, Integer paramType) { + //健壮性校验 + if (StringUtils.isBlank(paramValue)) { + return null; + } + switch (paramType) { + case 1: + return Float.valueOf(paramValue); + case 2: + return Integer.valueOf(paramValue); + default: + return paramValue; + } + } } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java index c9c2e30..00d2b4d 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java @@ -3,6 +3,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.excel.EasyExcel; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -17,9 +18,11 @@ import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceGroupMapper; import com.casic.missiles.mapper.common.SysCommonMapper; +import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; import com.casic.missiles.service.IDeviceGroupService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.NumberGeneratorUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -42,6 +45,7 @@ public class DeviceGroupServiceImpl extends ServiceImpl implements IDeviceGroupService { private final SysCommonMapper sysCommonMapper; + private final IDeviceService deviceService; @Override public Page listPage(Page page, DeviceGroupListRequest request, DataScope dataScope) { @@ -62,6 +66,12 @@ } + /** + * 添加到redis + * + * @param deviceGroup + * @return + */ @Override public ReturnDTO addDeviceGroup(DeviceGroup deviceGroup) { AuthUser shiroUser = ShiroKit.getUser(); @@ -87,6 +97,12 @@ @Transactional public ReturnDTO deleteDeviceGroup(List ids) { //如果分组有设备,是清空设备分组的情况,还是强制删除 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("group_id", ids); + List deviceList = deviceService.list(queryWrapper); + if (deviceList.size() > 0) { + throw new BusinessException(BusinessExceptionEnum.GROUP_BIND_DEVICE); + } if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); } @@ -106,4 +122,6 @@ return this.baseMapper.selectById(id); } + + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java new file mode 100644 index 0000000..11b6590 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl; + +import com.casic.missiles.model.ProductConfigItem; +import com.casic.missiles.mapper.ProductConfigItemMapper; +import com.casic.missiles.service.IProductConfigItemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +@Service +public class ProductConfigItemServiceImpl extends ServiceImpl implements IProductConfigItemService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductDataItemServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductDataItemServiceImpl.java new file mode 100644 index 0000000..6468775 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductDataItemServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl; + +import com.casic.missiles.model.ProductDataItem; +import com.casic.missiles.mapper.ProductDataItemMapper; +import com.casic.missiles.service.IProductDataItemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +@Service +public class ProductDataItemServiceImpl extends ServiceImpl implements IProductDataItemService { + +} 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 b225bb0..b6cc8dc 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,22 +1,42 @@ 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.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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; /** *

@@ -27,36 +47,100 @@ * @since 2023-11-20 */ @Service +@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) { - - - return null; + public Page listPage(Page page, ProductListDTO request, DataScope dataScope) throws Exception { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like(StringUtils.isNotBlank(request.getProductName()), + "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); + } + return page; } @Override + @Transactional public ReturnDTO addProduct(ProductInfo productInfo) { AuthUser shiroUser = ShiroKit.getUser(); + Long maxNo = this.baseMapper.selectMaxNo(); + String productNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DEVICE_GROUP, maxNo); + productInfo.setProductNo(productNo); productInfo.setCreateUserName(shiroUser.getName()); if (this.baseMapper.insert(productInfo) > 0) { - return ReturnUtil.success(); + 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) { - return ReturnUtil.success(); + //重新添加 + 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 ProductInfo productDetail(Long id) { + 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); + } + return productInfo; + } + + @Override public ReturnDTO deleteProduct(List ids) { - if (this.baseMapper.deleteBatchIds(ids) > 0) { + 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(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/ProductInfoController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/ProductInfoController.java index 9381cb5..2578f26 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/ProductInfoController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/ProductInfoController.java @@ -6,6 +6,7 @@ import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.IdsDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; @@ -44,7 +45,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated ProductListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated ProductListDTO request, BindingResult bindingResult) throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } @@ -55,7 +56,7 @@ @ApiOperation("新增") @PostMapping("/add") - public ReturnDTO addProduct(@RequestBody @Validated ProductInfo productInfo, BindingResult bindingResult) { + public ReturnDTO addProduct(@RequestBody @Validated ProductInfo productInfo, BindingResult bindingResult) { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } @@ -72,9 +73,18 @@ return productInfoService.updateProduct(productInfo); } + @ApiOperation("编辑") + @PostMapping("/detail") + public ReturnDTO productDetail(@RequestBody @Validated IdDTO idDTO, BindingResult bindingResult) { + if (bindingResult.hasErrors()) { + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(productInfoService.productDetail(idDTO.getId())); + } + @ApiOperation("删除(支持批删、单删)") @PostMapping("/delete") - public ReturnDTO deleteProduct(@RequestBody IdsDTO idsDTO, BindingResult bindingResult) { + public ReturnDTO deleteProduct(@RequestBody IdsDTO idsDTO, BindingResult bindingResult) { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index 7e1898b..54e4a9c 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -77,4 +77,4 @@ #作者 author: cz #待生成对象表名 - table-name: alarm_config,alarm_data,bus_config,device,device_data,device_group,device_upgrade_task,device_version,product_info,subscribe_store \ No newline at end of file + table-name: product_data_item,product_config_item \ No newline at end of file diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java new file mode 100644 index 0000000..9887951 --- /dev/null +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -0,0 +1,50 @@ +package com.casic.missiles.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Created by test203 on 2019/5/30. + */ +@Component +public class RedisCommon { + + @Autowired + protected RedisTemplate redisTemplate; + + @Value("${casic.device.redis.invalid-time}") + private String invalidTime; + @Value("${casic.device.redis.config-prefix}") + private String configPrefix; + + + public Map getMsg(String key) { + // 判断上次保存时间,如果到期(key失效),再保存新的 + String timeStampKey = configPrefix + key; + Object dataJson = redisTemplate.opsForValue().get(timeStampKey); + return JSON.parseObject((String) dataJson); + } + + + public void setRedisConcentrator(String concentratorcode, String devcode, String attemptsMax) { + redisTemplate.opsForList().leftPush(configPrefix + concentratorcode, + devcode + ":" + (StringUtils.isNotBlank(attemptsMax) && (!("--".equals(attemptsMax))) ? attemptsMax : "1")); + } + + public void setRedisConfig(String key, Map bizDataMap) { + redisTemplate.opsForValue().set(configPrefix + key, + bizDataMap != null ? JSONObject.toJSONString(bizDataMap) : "", + Integer.valueOf(invalidTime), + TimeUnit.SECONDS); + + } + +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java index 071387d..108f0e4 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/ProductInfoMapper.java @@ -13,4 +13,5 @@ */ public interface ProductInfoMapper extends BaseMapper { + Long selectMaxNo(); } diff --git a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml index 27b551d..26f3cb3 100644 --- a/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml +++ b/casic-iot-dao/src/resource/mapper/ProductInfoMapper.xml @@ -8,8 +8,6 @@ - - @@ -22,4 +20,11 @@ Id, name, access_type, encipher_type, protocol_type, model, descn, product_type, owners, CreatorName, create_time, create_user_id + + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index f7dd974..92465e5 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -9,7 +9,8 @@ */ public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { - HANDLE_FAILED(500, "操作失败"); + HANDLE_FAILED(500, "操作失败"), + GROUP_BIND_DEVICE(2023, "删除失败,设备组绑定的有设备"); private Integer code; private String message; diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index efbc561..da221ae 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -53,7 +53,7 @@ /** * 协议类型 */ - String protocol_type = "protocolType"; + String COMMUNICATION_PROTOCOL = "communicationProtocol"; /** * 产品类型 diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index f62583a..1169ca3 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -14,6 +14,7 @@ import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -41,6 +42,7 @@ * 设备编号 */ @TableField("devcode") + @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") private String devcode; 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 f979eac..fe2d10a 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 @@ -6,8 +6,12 @@ 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; @@ -21,6 +25,7 @@ */ @Getter @Setter +@ApiModel @TableName("product_info") public class ProductInfo implements Serializable, DictCodeEnum { @@ -32,60 +37,94 @@ @TableId("Id") private Long id; + + @TableField("product_no") + @ApiModelProperty(value = "产品编号", dataType = "String") + private String productNo; + + /** * 产品名称 */ @TableField("name") + @ApiModelProperty(value = "产品名称", dataType = "String") private String name; /** * 接入类型 直连,集中器,AEP电信平台等 */ @TableField("access_type") + @DictCodeField(message = "接入类型不合法", cacheName = ACCESS_TYPE) + @ApiModelProperty(value = "接入类型", dataType = "Integer") private Integer accessType; + @TableField(exist = false) + @ApiModelProperty(value = " 接入类型 直连,集中器,AEP电信平台等", dataType = "String") + private String accessTypeName; + + /** * 加密类型 加密类型-tea.sm4,明文 */ @TableField("encipher_type") + @ApiModelProperty(value = "加密类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = ENCIPHER_TYPE) private Integer encipherType; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String encipherTypeName; + /** * 协议类型 mqtt,tcp等协议类型 */ - @TableField("protocol_type") - private Integer protocolType; + @TableField("communication_protocol") + @ApiModelProperty(value = "协议类型", dataType = "Integer") + @DictCodeField(message = "加密类型不合法", cacheName = COMMUNICATION_PROTOCOL) + private Integer communicationProtocol; + @TableField(exist = false) + @ApiModelProperty(value = "加密类型 加密类型-tea.sm4,明文", dataType = "String") + private String communicationProtocolName; /** * 供电方式 直流、电池 */ @TableField("power_type") + @ApiModelProperty(value = "供电方式", dataType = "Integer") + @DictCodeField(message = "供电方式不合法", cacheName = POWER_TYPE) private Integer powerType; - - /** - * 型号 - */ - @TableField("model") - private Integer model; + @TableField(exist = false) + @ApiModelProperty(value = "供电方式 直流、电池", dataType = "String") + private String powerTypeName; /** * 产品描述 产品介绍描述 */ @TableField("descn") + @ApiModelProperty(value = "产品描述", dataType = "String") private String descn; /** * 产品类别 */ @TableField("product_type") + @ApiModelProperty(value = "产品类别", dataType = "Integer") + @DictCodeField(message = "产品类别不合法", cacheName = PRODUCT_TYPE) private Integer productType; + + @TableField(exist = false) + @ApiModelProperty(value = "产品类别", dataType = "String") + private String productTypeName; + + /** * 产品负责人(技术) */ @TableField("owners") + @ApiModelProperty(value = "产品负责人(技术)", dataType = "String") private String owners; /** @@ -100,5 +139,12 @@ @TableField("create_user_name") private String createUserName; + @TableField(exist = false) + @ApiModelProperty(value = "产品配置项内容", dataType = "String") + List productConfigItems; + + @TableField(exist = false) + @ApiModelProperty(value = "配置项数据(数据管理/报警阈值管理)", dataType = "String") + List productDataItems; } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java new file mode 100644 index 0000000..44d9833 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductConfigItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductConfigItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductConfigItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java new file mode 100644 index 0000000..0a248fa --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductDataItemService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ProductDataItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +public interface IProductDataItemService extends IService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java index d5cc3e5..62cdcd9 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IProductInfoService.java @@ -19,12 +19,14 @@ */ public interface IProductInfoService extends IService { - Page listPage(Page page, ProductListDTO request, DataScope dataScope); + Page listPage(Page page, ProductListDTO request, DataScope dataScope)throws Exception; ReturnDTO addProduct(ProductInfo productInfo); ReturnDTO updateProduct(ProductInfo productInfo); + ProductInfo productDetail(Long id); + ReturnDTO deleteProduct(List ids); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index 823eb98..b7277cf 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,5 +1,9 @@ package com.casic.missiles.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.model.auth.AuthUser; @@ -12,11 +16,19 @@ import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.ProductConfigItem; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.util.RedisCommon; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; +import java.nio.charset.Charset; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** *

@@ -27,8 +39,11 @@ * @since 2023-11-20 */ @Service +@RequiredArgsConstructor public class BusConfigServiceImpl extends ServiceImpl implements IBusConfigService { + private final RedisCommon redisCommon; + @Override public Page listPage(Page page, BusConfigDTO request, DataScope dataScope) { List busConfigList = this.baseMapper.listPage(page, request, dataScope); @@ -41,6 +56,7 @@ AuthUser shiroUser = ShiroKit.getUser(); busConfig.setCreateUserId(shiroUser.getId()); if (this.baseMapper.insert(busConfig) > 0) { + convertParamItemToSend(busConfig.getConfigJson(), busConfig.getDevcodeList()); return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); @@ -53,4 +69,42 @@ } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + + /** + * 将参数配置项内容转换为配置项内容 + * + * @return + */ + private void convertParamItemToSend(String configJson, List devcodeList) { + if (StringUtils.isBlank(configJson) || CollectionUtils.isEmpty(devcodeList)) { + return; + } + List productConfigItemList = JSON.parseArray(configJson, ProductConfigItem.class); + if (CollectionUtils.isEmpty(productConfigItemList)) { + return; + } + Map bizDataMap = new HashMap<>(); + for (ProductConfigItem productConfigItem : productConfigItemList) { + Object value = ConvertStringToOther(productConfigItem.getParamValue(), productConfigItem.getParamType()); + bizDataMap.put(productConfigItem.getParamName(), value); + } + for (String devcode : devcodeList) { + redisCommon.setRedisConfig(devcode, bizDataMap); + } + } + + private Object ConvertStringToOther(String paramValue, Integer paramType) { + //健壮性校验 + if (StringUtils.isBlank(paramValue)) { + return null; + } + switch (paramType) { + case 1: + return Float.valueOf(paramValue); + case 2: + return Integer.valueOf(paramValue); + default: + return paramValue; + } + } } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java index c9c2e30..00d2b4d 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceGroupServiceImpl.java @@ -3,6 +3,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.excel.EasyExcel; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -17,9 +18,11 @@ import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceGroupMapper; import com.casic.missiles.mapper.common.SysCommonMapper; +import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; import com.casic.missiles.service.IDeviceGroupService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.NumberGeneratorUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -42,6 +45,7 @@ public class DeviceGroupServiceImpl extends ServiceImpl implements IDeviceGroupService { private final SysCommonMapper sysCommonMapper; + private final IDeviceService deviceService; @Override public Page listPage(Page page, DeviceGroupListRequest request, DataScope dataScope) { @@ -62,6 +66,12 @@ } + /** + * 添加到redis + * + * @param deviceGroup + * @return + */ @Override public ReturnDTO addDeviceGroup(DeviceGroup deviceGroup) { AuthUser shiroUser = ShiroKit.getUser(); @@ -87,6 +97,12 @@ @Transactional public ReturnDTO deleteDeviceGroup(List ids) { //如果分组有设备,是清空设备分组的情况,还是强制删除 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("group_id", ids); + List deviceList = deviceService.list(queryWrapper); + if (deviceList.size() > 0) { + throw new BusinessException(BusinessExceptionEnum.GROUP_BIND_DEVICE); + } if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); } @@ -106,4 +122,6 @@ return this.baseMapper.selectById(id); } + + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java new file mode 100644 index 0000000..11b6590 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductConfigItemServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl; + +import com.casic.missiles.model.ProductConfigItem; +import com.casic.missiles.mapper.ProductConfigItemMapper; +import com.casic.missiles.service.IProductConfigItemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +@Service +public class ProductConfigItemServiceImpl extends ServiceImpl implements IProductConfigItemService { + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductDataItemServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductDataItemServiceImpl.java new file mode 100644 index 0000000..6468775 --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/ProductDataItemServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl; + +import com.casic.missiles.model.ProductDataItem; +import com.casic.missiles.mapper.ProductDataItemMapper; +import com.casic.missiles.service.IProductDataItemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-11-25 + */ +@Service +public class ProductDataItemServiceImpl extends ServiceImpl implements IProductDataItemService { + +} 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 b225bb0..b6cc8dc 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,22 +1,42 @@ 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.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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; /** *

@@ -27,36 +47,100 @@ * @since 2023-11-20 */ @Service +@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) { - - - return null; + public Page listPage(Page page, ProductListDTO request, DataScope dataScope) throws Exception { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like(StringUtils.isNotBlank(request.getProductName()), + "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); + } + return page; } @Override + @Transactional public ReturnDTO addProduct(ProductInfo productInfo) { AuthUser shiroUser = ShiroKit.getUser(); + Long maxNo = this.baseMapper.selectMaxNo(); + String productNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DEVICE_GROUP, maxNo); + productInfo.setProductNo(productNo); productInfo.setCreateUserName(shiroUser.getName()); if (this.baseMapper.insert(productInfo) > 0) { - return ReturnUtil.success(); + 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) { - return ReturnUtil.success(); + //重新添加 + 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 ProductInfo productDetail(Long id) { + 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); + } + return productInfo; + } + + @Override public ReturnDTO deleteProduct(List ids) { - if (this.baseMapper.deleteBatchIds(ids) > 0) { + 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(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/ProductInfoController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/ProductInfoController.java index 9381cb5..2578f26 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/ProductInfoController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/ProductInfoController.java @@ -6,6 +6,7 @@ import com.casic.missiles.core.datascope.DataScope; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.IdsDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; @@ -44,7 +45,7 @@ @ApiOperation("分页列表") @PostMapping("/list-page") - public ReturnDTO> listPage(@RequestBody @Validated ProductListDTO request, BindingResult bindingResult) { + public ReturnDTO> listPage(@RequestBody @Validated ProductListDTO request, BindingResult bindingResult) throws Exception { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } @@ -55,7 +56,7 @@ @ApiOperation("新增") @PostMapping("/add") - public ReturnDTO addProduct(@RequestBody @Validated ProductInfo productInfo, BindingResult bindingResult) { + public ReturnDTO addProduct(@RequestBody @Validated ProductInfo productInfo, BindingResult bindingResult) { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } @@ -72,9 +73,18 @@ return productInfoService.updateProduct(productInfo); } + @ApiOperation("编辑") + @PostMapping("/detail") + public ReturnDTO productDetail(@RequestBody @Validated IdDTO idDTO, BindingResult bindingResult) { + if (bindingResult.hasErrors()) { + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(productInfoService.productDetail(idDTO.getId())); + } + @ApiOperation("删除(支持批删、单删)") @PostMapping("/delete") - public ReturnDTO deleteProduct(@RequestBody IdsDTO idsDTO, BindingResult bindingResult) { + public ReturnDTO deleteProduct(@RequestBody IdsDTO idsDTO, BindingResult bindingResult) { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-iot-web/src/main/resources/application.yml b/casic-iot-web/src/main/resources/application.yml index 7e1898b..54e4a9c 100644 --- a/casic-iot-web/src/main/resources/application.yml +++ b/casic-iot-web/src/main/resources/application.yml @@ -77,4 +77,4 @@ #作者 author: cz #待生成对象表名 - table-name: alarm_config,alarm_data,bus_config,device,device_data,device_group,device_upgrade_task,device_version,product_info,subscribe_store \ No newline at end of file + table-name: product_data_item,product_config_item \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index f7a0b08..a855b68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -27,7 +27,6 @@ * 2、多字节情况表示字段(暂未处理) */ public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { - Object fieldsResolveValue = null; String binaryStr = convertBinaryStr(byteBuf, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) {