diff --git a/common/core/src/main/java/com/thing/common/core/utils/HttpContextUtils.java b/common/core/src/main/java/com/thing/common/core/utils/HttpContextUtils.java index 5f48dc3..18fe93d 100644 --- a/common/core/src/main/java/com/thing/common/core/utils/HttpContextUtils.java +++ b/common/core/src/main/java/com/thing/common/core/utils/HttpContextUtils.java @@ -83,14 +83,18 @@ public class HttpContextUtils { public static String getLanguage() { //默认语言 String defaultLanguage = "zh-CN"; -// //request -// HttpServletRequest request = getHttpServletRequest(); -// if(request == null){ -// return defaultLanguage; -// } -// -// //请求语言 -// defaultLanguage = request.getHeader(HttpHeaders.ACCEPT_LANGUAGE); + //request + HttpServletRequest request = getHttpServletRequest(); + if(request == null){ + return defaultLanguage; + } + + //请求语言 + try { + defaultLanguage = request.getHeader(HttpHeaders.ACCEPT_LANGUAGE); + } catch (Exception e) { + throw new RuntimeException(e); + } return defaultLanguage; } diff --git a/modules/carbon-public/src/main/java/com/thing/carbon/pub/service/impl/CarbonPubProductionResultServiceImpl.java b/modules/carbon-public/src/main/java/com/thing/carbon/pub/service/impl/CarbonPubProductionResultServiceImpl.java index db0160d..a8ddea2 100644 --- a/modules/carbon-public/src/main/java/com/thing/carbon/pub/service/impl/CarbonPubProductionResultServiceImpl.java +++ b/modules/carbon-public/src/main/java/com/thing/carbon/pub/service/impl/CarbonPubProductionResultServiceImpl.java @@ -5,7 +5,6 @@ import static com.thing.carbon.pub.entity.table.CarbonPubProductionResultEntityT import static com.thing.common.core.enumeration.CarbonLifecycleEnum.*; import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONObject; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryColumn; @@ -494,8 +493,7 @@ public class CarbonPubProductionResultServiceImpl extends BaseServiceImpl relationDTO.setThingAttrBoundary(thingSourceDTO.getThingAttrBoundary())); }); // 将属性列表转换为 Map,并设置给当前的 IotThingViewDTO - Map dictRelationDTOMap = relationDTOList.stream().collect(Collectors.toMap(IotThingDictRelationParamDTO::getCode, Function.identity(), (k1, k2) -> k2)); + Map dictRelationDTOMap = relationDTOList.stream() + .collect(Collectors.toMap(IotThingDictRelationParamDTO::getCode, s-> ConvertUtils.sourceToTarget(s, IotThingDictRelationDTO.class), (k1, k2) -> k2)); viewSourceDTO.setAttrs(dictRelationDTOMap); relationDTOList.forEach(relationDTO ->{ Optional first = iotThingSourceList.stream().filter(iotThingSourceDTO -> @@ -336,8 +338,8 @@ public class AnalysisDataServiceImpl implements AnalysisDataService { String val = s.getVal(); for (Map.Entry entry : infoMap.entrySet()) { IotThingViewSourceDTO entryValue = entry.getValue(); - Map attrs = entryValue.getAttrs(); - IotThingDictRelationParamDTO iotThingDictRelationDTO = attrs.get(attr_key); + Map attrs = entryValue.getAttrs(); + IotThingDictRelationDTO iotThingDictRelationDTO = attrs.get(attr_key); if (!Objects.isNull(iotThingDictRelationDTO)) { String unit = iotThingDictRelationDTO.getUnit(); dataExcel.setThingAttrUnit(unit); @@ -883,7 +885,8 @@ public class AnalysisDataServiceImpl implements AnalysisDataService { } }); // 将属性列表转换为 Map,并设置给当前的 IotThingViewDTO - Map dictRelationDTOMap = relationDTOList.stream().collect(Collectors.toMap(IotThingDictRelationParamDTO::getCode, Function.identity(), (k1, k2) -> k2)); + Map dictRelationDTOMap = relationDTOList.stream() + .collect(Collectors.toMap(IotThingDictRelationParamDTO::getCode, s-> ConvertUtils.sourceToTarget(s,IotThingDictRelationDTO.class), (k1, k2) -> k2)); viewSourceDTO.setAttrs(dictRelationDTOMap); return viewSourceDTO; }, (existingValue, newValue) -> existingValue diff --git a/modules/thing/src/main/java/com/thing/event/ThingChangedEvent.java b/modules/thing/src/main/java/com/thing/event/ThingChangedEvent.java new file mode 100644 index 0000000..8fb1508 --- /dev/null +++ b/modules/thing/src/main/java/com/thing/event/ThingChangedEvent.java @@ -0,0 +1,29 @@ +package com.thing.event; + +import com.thing.thing.entity.entity.IotThingEntity; + +import lombok.Getter; +import lombok.Setter; + +import org.springframework.context.ApplicationEvent; + +import java.io.Serial; + +/** + * @author siyang + * @date 2024/9/10 10:28 + * @description 物变更事件 + */ +@Getter +@Setter +public class ThingChangedEvent extends ApplicationEvent { + + @Serial private static final long serialVersionUID = 6767577249634996931L; + + private IotThingEntity thing; + + public ThingChangedEvent(Object source, IotThingEntity thing) { + super(source); + this.thing = thing; + } +} diff --git a/modules/thing/src/main/java/com/thing/listener/QueueDeviceEventListener.java b/modules/thing/src/main/java/com/thing/listener/QueueDeviceEventListener.java index 2640cf0..d074b6d 100644 --- a/modules/thing/src/main/java/com/thing/listener/QueueDeviceEventListener.java +++ b/modules/thing/src/main/java/com/thing/listener/QueueDeviceEventListener.java @@ -12,15 +12,16 @@ import com.thing.common.core.event.AuthParam; import com.thing.common.core.event.QueueDeviceEvent; import com.thing.common.core.utils.ConvertUtils; import com.thing.common.core.utils.DateTimeUtils; +import com.thing.common.core.utils.JacksonUtil; import com.thing.common.core.utils.TokenGenerator; import com.thing.common.data.dto.QueueMsgDTO; -import com.thing.thing.cache.service.CacheInit; import com.thing.thing.cache.service.ThingCache; import com.thing.thing.context.service.ThingManageContextService; import com.thing.thing.entity.dto.IotThingViewDTO; import com.thing.thing.entity.entity.IotThingEntity; import com.thing.thing.model.dto.IotThingModelDTO; import com.thing.thing.model.entity.IotThingModelEntity; +import com.thing.thing.model.service.IotThingModelService; import com.thing.transport.api.adaptor.JsonConverter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -39,6 +40,8 @@ public class QueueDeviceEventListener { private final ThingManageContextService thingManageContextService; + private final IotThingModelService thingModelService; + private final ThingCache thingCache; @EventListener(QueueDeviceEvent.class) @@ -58,10 +61,12 @@ public class QueueDeviceEventListener { item -> (QueueOriginType.AUTO_DATA_SYNC.name().equals(item.getOrigin()) || QueueOriginType.MANUAL_DATA_SYNC.name().equals(item.getOrigin())) ? QueueOriginType.TB.name() : item.getOrigin(), (e1, e2) -> e1)); - //物模型 - List insertModelList = new ArrayList<>(); //物模型插入 - checkAndSaveThingModels(codeOriginMap, insertModelList); + List insertModelList = new ArrayList<>(); + //物模型更新 + List updateModelList = new ArrayList<>(); + //筛选物模型的插入和更新 + checkAndSaveThingModels(codeOriginMap, insertModelList,updateModelList); if (CollectionUtils.isNotEmpty(insertModelList)) { // 物实体 @@ -73,80 +78,96 @@ public class QueueDeviceEventListener { .collect(Collectors.groupingBy( item ->new AuthParam(item.getTenantCode(),item.getCompanyId(),item.getDeptId()), Collectors.mapping(QueueMsgDTO::getThingCode,Collectors.toSet()))); - List insertEntityList = new ArrayList<>(); saveTenantThingList(tenantThingCodeMap, insertEntityList); - insertModelList.forEach(item -> { long count = insertEntityList.stream().filter(e -> StringUtils.equals(e.getCode(), item.getCode())).count(); List keyMap = thingCache.findKeyMap(CacheNameEnum.THING_ENTITY, item.getCode()); item.setAuthNum(count+CollectionUtils.size(keyMap)); }); - thingManageContextService.saveAllModel(insertModelList); + thingModelService.saveBatch(insertModelList); - //更新物模板缓存 - List iotThingModelDTOS = ConvertUtils.sourceToTarget(insertModelList, IotThingModelDTO.class); - List modelList = JsonConverter.convertToJsonObjectListObjectNode(iotThingModelDTOS); - - for (ObjectNode item : modelList) { - //更新物模型 - thingCache.updateKeyMap(CacheNameEnum.THING_MODEL - , item.get(CacheNameEnum.ModelField.THING_MODEL_CODE.getField()).asText() - + ":" + item.get(CacheNameEnum.ModelField.THING_MODEL_ID.getField()).asText(),item); - } + //插入物实体 if(CollectionUtils.isNotEmpty(insertEntityList)){ List distinctStudentFile = insertEntityList.stream() .collect(Collectors.collectingAndThen( Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getCode() + ";" + o.getTenantCode()))), ArrayList::new)); thingManageContextService.saveEntity(distinctStudentFile); - - //更新物实体缓存 - List entityList = distinctStudentFile.stream().map(e -> { - ObjectNode keyMap = thingCache.getKeyMap(CacheNameEnum.THING_ENTITY, e.getCode()); - return new IotThingViewDTO() - .setLat(e.getLat()) - .setLon(e.getLon()) - .setTags(e.getTags()) - .setDeptIds(e.getDeptIds()) - .setOrigin(keyMap.get(CacheNameEnum.ModelField.THING_MODEL_ORIGIN.getField()).asText()) - .setTemplateMark(TemplateMark.NO.getValue()) - .setRealType("1") - .setImg(e.getImg()) - .setRemark(e.getRemark()) - .setEnableStatus(e.getEnableStatus()) - .setStatusTs(keyMap.get(CacheNameEnum.ModelField.THING_MODEL_STATUS_TS.getField()).asLong()) - .setStatus(keyMap.get(CacheNameEnum.ModelField.THING_MODEL_STATUS.getField()).asText()) - .setTenantCode(e.getTenantCode()) - .setCompanyId(e.getTenantCode()) - .setDeptId(e.getTenantCode()) - .setEntityType(e.getType()) - .setEntityName(e.getName()) - .setEntityCode(e.getCode()) - .setEntityId(e.getId()) - .setModelId(keyMap.get(CacheNameEnum.ModelField.THING_MODEL_ID.getField()).asLong()) - .setCreateDate(e.getCreateDate()); - }).toList(); - List entityJsonList = JsonConverter.convertToJsonObjectListObjectNode(entityList); - for (ObjectNode entityNode : entityJsonList) { - thingCache.updateKeyMap(CacheNameEnum.THING_ENTITY - ,entityNode.get(CacheNameEnum.EntityField.THING_ENTITY_TENANT_CODE.getField()).asText() - + ":" + entityNode.get(CacheNameEnum.EntityField.THING_ENTITY_CODE.getField()).asText() - + ":" + entityNode.get(CacheNameEnum.EntityField.THING_ENTITY_ID.getField()).asText(),entityNode); - } + updateEntityCache(distinctStudentFile); } } + + if(CollectionUtils.isNotEmpty(updateModelList)){ + updateModelList.forEach(item -> { + long count = updateModelList.stream().filter(e -> StringUtils.equals(e.getCode(), item.getCode())).count(); + List keyMap = thingCache.findKeyMap(CacheNameEnum.THING_ENTITY, item.getCode()); + item.setAuthNum(count+CollectionUtils.size(keyMap)); + }); + thingModelService.updateBatch(updateModelList); + insertModelList.addAll(updateModelList); + } + //更新物模板缓存 + updateModleCache(insertModelList); } catch (Exception e) { log.error("设备保存失败: {}", e.getMessage(), e); } } + private void updateModleCache(List insertModelList) { + List iotThingModelDTOS = ConvertUtils.sourceToTarget(insertModelList, IotThingModelDTO.class); + List modelList = JsonConverter.convertToJsonObjectListObjectNode(iotThingModelDTOS); + + for (ObjectNode item : modelList) { + //更新物模型的缓存 + thingCache.updateKeyMap(CacheNameEnum.THING_MODEL + , item.get(CacheNameEnum.ModelField.THING_MODEL_CODE.getField()).asText() + + ":" + item.get(CacheNameEnum.ModelField.THING_MODEL_ID.getField()).asText(),item); + } + } + + private void updateEntityCache(List distinctStudentFile) { + //更新物实体缓存 + List entityList = distinctStudentFile.stream().map(e -> { + ObjectNode keyMap = thingCache.getKeyMap(CacheNameEnum.THING_ENTITY, e.getCode()); + return new IotThingViewDTO() + .setLat(e.getLat()) + .setLon(e.getLon()) + .setTags(e.getTags()) + .setDeptIds(e.getDeptIds()) + .setOrigin(keyMap.get(CacheNameEnum.ModelField.THING_MODEL_ORIGIN.getField()).asText()) + .setTemplateMark(TemplateMark.NO.getValue()) + .setRealType("1") + .setImg(e.getImg()) + .setRemark(e.getRemark()) + .setEnableStatus(e.getEnableStatus()) + .setStatusTs(keyMap.get(CacheNameEnum.ModelField.THING_MODEL_STATUS_TS.getField()).asLong()) + .setStatus(keyMap.get(CacheNameEnum.ModelField.THING_MODEL_STATUS.getField()).asText()) + .setTenantCode(e.getTenantCode()) + .setCompanyId(e.getTenantCode()) + .setDeptId(e.getTenantCode()) + .setEntityType(e.getType()) + .setEntityName(e.getName()) + .setEntityCode(e.getCode()) + .setEntityId(e.getId()) + .setModelId(keyMap.get(CacheNameEnum.ModelField.THING_MODEL_ID.getField()).asLong()) + .setCreateDate(e.getCreateDate()); + }).toList(); + List entityJsonList = JsonConverter.convertToJsonObjectListObjectNode(entityList); + for (ObjectNode entityNode : entityJsonList) { + thingCache.updateKeyMap(CacheNameEnum.THING_ENTITY + ,entityNode.get(CacheNameEnum.EntityField.THING_ENTITY_TENANT_CODE.getField()).asText() + + ":" + entityNode.get(CacheNameEnum.EntityField.THING_ENTITY_CODE.getField()).asText() + + ":" + entityNode.get(CacheNameEnum.EntityField.THING_ENTITY_ID.getField()).asText(),entityNode); + } + } + /** * 物管理表是否存在,不存在新增设备 * * @param codeOriginMap 物编码 */ - private void checkAndSaveThingModels(Map codeOriginMap, List insertList) throws Exception { + private void checkAndSaveThingModels(Map codeOriginMap, List insertList,List updateList) { // 使用迭代器遍历并删除不符合条件的元素 Iterator> iterator = codeOriginMap.entrySet().iterator(); while (iterator.hasNext()) { @@ -154,6 +175,8 @@ public class QueueDeviceEventListener { String code = entry.getKey(); ObjectNode jsonObject = thingCache.findObjectNode(CacheNameEnum.THING_MODEL, code); if (null != jsonObject && !jsonObject.isEmpty()) { + IotThingModelEntity modelEntity = JacksonUtil.convertValue(jsonObject, IotThingModelEntity.class); + updateList.add(modelEntity); iterator.remove(); } } @@ -163,7 +186,7 @@ public class QueueDeviceEventListener { .setToken(TokenGenerator.generateValue()) .setGateway(GateWayStatus.NO_GATE_WAY.getValue()) .setStatus(ThingStatus.NOT_CONNECTED.getCode()) - .setAuthNum(1L) + .setAuthNum(0L) .setStatusTs(DateTimeUtils.getCurrentTime()) .setOrigin(origin); modelEntity.setId(IdUtil.getSnowflake().nextId()) diff --git a/modules/thing/src/main/java/com/thing/listener/ThingChangedEventListener.java b/modules/thing/src/main/java/com/thing/listener/ThingChangedEventListener.java new file mode 100644 index 0000000..22b275c --- /dev/null +++ b/modules/thing/src/main/java/com/thing/listener/ThingChangedEventListener.java @@ -0,0 +1,33 @@ +package com.thing.listener; + +import com.mybatisflex.core.update.UpdateChain; +import com.thing.device.source.entity.IotThingSourceEntity; +import com.thing.event.ThingChangedEvent; +import com.thing.thing.entity.entity.IotThingEntity; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +/** + * @author siyang + * @date 2024/9/10 10:34 + * @description 物变更事件监听器 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ThingChangedEventListener { + + @EventListener(ThingChangedEvent.class) + public void onThingChangedEvent(ThingChangedEvent event) { + IotThingEntity thing = event.getThing(); + UpdateChain.of(IotThingSourceEntity.class) + .set(IotThingSourceEntity::getThingName, thing.getName()) + .where(IotThingSourceEntity::getThingId).eq(thing.getId()) + .and(IotThingSourceEntity::getTenantCode).eq(thing.getTenantCode()) + .update(); + } +} diff --git a/modules/thing/src/main/java/com/thing/reissue/controller/DataReissueController.java b/modules/thing/src/main/java/com/thing/reissue/controller/DataReissueController.java new file mode 100644 index 0000000..528bf36 --- /dev/null +++ b/modules/thing/src/main/java/com/thing/reissue/controller/DataReissueController.java @@ -0,0 +1,37 @@ +package com.thing.reissue.controller; + +import com.thing.common.core.web.response.Result; +import com.thing.reissue.dto.DataReissueDTO; +import com.thing.reissue.service.DataReissueService; +import com.thing.sys.tenant.dto.SysTenantDTO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("data/reissue") +@Tag(name = "数据补发") +@RequiredArgsConstructor +public class DataReissueController { + + private final DataReissueService dataReissueService; + + @PostMapping("dataReissue") + @Operation(summary = "数据补发") + public Result dataReissue(@RequestBody DataReissueDTO dataReissue) { + dataReissueService.dataReissue(dataReissue); + return new Result<>(); + } + + @GetMapping("tenantList") + @Operation(summary="侧边栏所有有数据的企业列表") + public Result> tenantList(){ + List dtos =dataReissueService.tenantList(); + return new Result>().ok(dtos); + } + + +} \ No newline at end of file diff --git a/modules/thing/src/main/java/com/thing/reissue/dto/DataReissueCalculationDTO.java b/modules/thing/src/main/java/com/thing/reissue/dto/DataReissueCalculationDTO.java new file mode 100644 index 0000000..a0fdce5 --- /dev/null +++ b/modules/thing/src/main/java/com/thing/reissue/dto/DataReissueCalculationDTO.java @@ -0,0 +1,41 @@ +package com.thing.reissue.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; + +/** + * 数据补发计算 + * + * @author zhenghh. 2021-12-10 + **/ +@Data +@Schema(description = "数据补发计算") +public class DataReissueCalculationDTO { + + @Schema(description = "开始时间") + private Long startTime; + @Schema(description = "结束时间") + private Long endTime; + @Schema(description = "需要计算的物") + List list; + + @Data + @AllArgsConstructor + public static class ThingCalc { + + @Schema(description = "物ID") + private Long thingId; + @Schema(description = "设备Code") + private String thingCode; + @Schema(description = "设备ID") + private String entityId; + @Schema(description = "属性列表") + private List attrList; + @Schema(description = "部门ID") + private Long deptId; + } + +} diff --git a/modules/thing/src/main/java/com/thing/reissue/dto/DataReissueDTO.java b/modules/thing/src/main/java/com/thing/reissue/dto/DataReissueDTO.java new file mode 100644 index 0000000..989f79d --- /dev/null +++ b/modules/thing/src/main/java/com/thing/reissue/dto/DataReissueDTO.java @@ -0,0 +1,36 @@ +package com.thing.reissue.dto; + +import com.thing.common.core.validator.group.DefaultGroup; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +@Data +@Schema(name = "看板表") +public class DataReissueDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long tenantCode; + + @Schema(description = "物entityIds") + private List entityIds; + + @Schema(description = "属性") + private List attributeKey; + + @Schema(description = "开始时间(13位时间戳)") + @NotNull(message="开始时间不能为空", groups = DefaultGroup.class) + private Long startTime; + + @Schema(description = "结束时间(13位时间戳)") + @NotNull(message="结束时间不能为空", groups = DefaultGroup.class) + private Long endTime; + + +} \ No newline at end of file diff --git a/modules/thing/src/main/java/com/thing/reissue/dto/DataReissueSettingDTO.java b/modules/thing/src/main/java/com/thing/reissue/dto/DataReissueSettingDTO.java new file mode 100644 index 0000000..be8a36c --- /dev/null +++ b/modules/thing/src/main/java/com/thing/reissue/dto/DataReissueSettingDTO.java @@ -0,0 +1,31 @@ +package com.thing.reissue.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 产品 + * + * @author WangJunLong 56583086@qq.com + * @since 1.0.0 2020-09-09 + */ +@Data +@Schema(description = "url用户名密码配置") +public class DataReissueSettingDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "url") + private String url; + + @Schema(description = "用户名") + private String userName; + + @Schema(description = "密码") + private String password; +} \ No newline at end of file diff --git a/modules/thing/src/main/java/com/thing/reissue/entity/DataReissueEntity.java b/modules/thing/src/main/java/com/thing/reissue/entity/DataReissueEntity.java new file mode 100644 index 0000000..ecfdb39 --- /dev/null +++ b/modules/thing/src/main/java/com/thing/reissue/entity/DataReissueEntity.java @@ -0,0 +1,66 @@ +package com.thing.reissue.entity; + +import com.mybatisflex.annotation.Table; +import com.thing.common.orm.entity.BaseInfoEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serial; + +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper=false) +@Table("iot_dashboard") +public class DataReissueEntity extends BaseInfoEntity { + @Serial + private static final long serialVersionUID = 1L; + /** + * 看板管理id + */ + private Long dashboardGroupId; + /** + * svg图片地址 + */ + private String svgUrl; + /** + * 图片地址 + */ + private String imgUrl; + /** + * 看板类型/0:svg看板,1:组态设计看板 + */ + private String type="0"; + /** + * 组态看板url + */ + private String scadaUrl; + /** + * 标题 + */ + private String title; + /** + * 高度 + */ + private String height; + /** + * 宽度 + */ + private String width; + /** + * 背景颜色 + */ + private String backgroundColor; + /** + * 背景图片 + */ + private String backgroundPicture; + /** + * 描述 + */ + private String remark; + /** + * 排序 + */ + private Integer sort; +} \ No newline at end of file diff --git a/modules/thing/src/main/java/com/thing/reissue/mapper/DataReissueMapper.java b/modules/thing/src/main/java/com/thing/reissue/mapper/DataReissueMapper.java new file mode 100644 index 0000000..9a352b7 --- /dev/null +++ b/modules/thing/src/main/java/com/thing/reissue/mapper/DataReissueMapper.java @@ -0,0 +1,16 @@ +package com.thing.reissue.mapper; + +import com.thing.common.orm.mapper.PowerBaseMapper; +import com.thing.reissue.entity.DataReissueEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 看板表 + * + * @author zzx + * @since 1.0.0 2022-12-05 + */ +@Mapper +public interface DataReissueMapper extends PowerBaseMapper { + +} \ No newline at end of file diff --git a/modules/thing/src/main/java/com/thing/reissue/service/DataReissueService.java b/modules/thing/src/main/java/com/thing/reissue/service/DataReissueService.java new file mode 100644 index 0000000..9a9afa1 --- /dev/null +++ b/modules/thing/src/main/java/com/thing/reissue/service/DataReissueService.java @@ -0,0 +1,25 @@ +package com.thing.reissue.service; + +import com.thing.common.orm.service.IBaseService; +import com.thing.reissue.dto.DataReissueCalculationDTO; +import com.thing.reissue.dto.DataReissueDTO; +import com.thing.reissue.entity.DataReissueEntity; +import com.thing.sys.tenant.dto.SysTenantDTO; + +import java.util.List; + +/** + * 看板表 + * + * @author zzx + * @since 1.0.0 2022-12-05 + */ +public interface DataReissueService extends IBaseService { + + void dataReissue(DataReissueDTO dataReissue); + + + List tenantList(); + + +} \ No newline at end of file diff --git a/modules/thing/src/main/java/com/thing/reissue/service/impl/DataReissueServiceImpl.java b/modules/thing/src/main/java/com/thing/reissue/service/impl/DataReissueServiceImpl.java new file mode 100644 index 0000000..fbb0e48 --- /dev/null +++ b/modules/thing/src/main/java/com/thing/reissue/service/impl/DataReissueServiceImpl.java @@ -0,0 +1,248 @@ +package com.thing.reissue.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.JsonNode; +import com.mybatisflex.core.query.QueryWrapper; +import com.thing.common.core.enumeration.SuperAdminEnum; +import com.thing.common.core.exception.SysException; +import com.thing.common.data.tskv.TsKvDTO; +import com.thing.common.orm.service.impl.BaseServiceImpl; +import com.thing.common.tskv.event.TsKvEvent; +import com.thing.queue.util.Topics; +import com.thing.reissue.dto.DataReissueDTO; +import com.thing.reissue.dto.DataReissueSettingDTO; +import com.thing.reissue.entity.DataReissueEntity; +import com.thing.reissue.mapper.DataReissueMapper; +import com.thing.reissue.service.DataReissueService; +import com.thing.sys.biz.service.SysParamsService; +import com.thing.sys.security.context.TenantContext; +import com.thing.sys.security.domain.SecurityUser; +import com.thing.sys.security.domain.UserDetail; +import com.thing.sys.tenant.dto.SysTenantDTO; +import com.thing.sys.tenant.mapper.SysTenantMapper; +import com.thing.sys.tenant.service.SysTenantGroupService; +import com.thing.thing.context.service.ThingManageContextService; +import com.thing.thing.dictRelation.param.IotThingDictRelationParamDTO; +import com.thing.thing.entity.dto.IotThingEntityDTO; +import jakarta.annotation.Resource; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.Nullable; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; +import org.thingsboard.server.common.data.Device; +import org.thingsboard.server.common.data.id.DeviceId; +import org.thingsboard.server.common.data.kv.TsKvEntry; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 看板表 + * + * @author zzx + * @since 1.0.0 2022-12-05 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class DataReissueServiceImpl extends BaseServiceImpl implements DataReissueService { + + private final ThingManageContextService thingManageContextService; + + private final String DATA_REISSUE = "DATA_REISSUE"; + + @Resource + private SysParamsService sysParamsService; + + @Resource + private SysTenantMapper sysTenantDao; + + @Resource + private SysTenantGroupService sysTenantGroupService; + + @Resource + private ApplicationEventPublisher publisher; + + @Resource + private RestTemplate restTemplate; + + @Override + public QueryWrapper getWrapper(Map params) { + String dashboardGroupId = (String) params.get("dashboardGroupId"); + QueryWrapper wrapper = new QueryWrapper(); + if (StringUtils.isBlank(dashboardGroupId)) throw new SysException("看板组id为必传字段"); + wrapper.eq("dashboard_group_id", Long.valueOf(dashboardGroupId)) + .orderBy(DataReissueEntity::getSort).asc() + .orderBy(DataReissueEntity::getCreateDate).desc(); + return wrapper; + } + + + @Override + public void dataReissue(DataReissueDTO dataReissue) { + //1.获取设备列表 + List entityIdList = dataReissue.getEntityIds(); + + Long tenantCode = dataReissue.getTenantCode(); + //过滤租户 + if(Objects.isNull(tenantCode)){ + tenantCode = TenantContext.getTenantCode(SecurityUser.getUser()); + } + + List thingsDTOS; + if(CollectionUtil.isNotEmpty(entityIdList)){ + thingsDTOS = thingManageContextService.findEntityAllById(entityIdList).orElse(Collections.emptyList()); + }else{ + thingsDTOS = thingManageContextService.findEntityAllByCode(null,tenantCode,true).orElse(Collections.emptyList()); + } + if(CollectionUtil.isEmpty(thingsDTOS)){ + throw new SysException("未获取到任何设备列表,数据补发失败"); + } + List thingsAttributesList = new ArrayList<>(); + List thingIdList = thingsDTOS.stream().map(IotThingEntityDTO::getId).collect(Collectors.toList()); + //2.获取属性列表 + if(CollectionUtil.isNotEmpty(dataReissue.getAttributeKey())){ + thingsAttributesList.addAll(thingManageContextService.findDictRelationAllByEntityIdsAndCodes(thingIdList, dataReissue.getAttributeKey()).orElse(Collections.emptyList())); + }else{ + thingsAttributesList.addAll(thingManageContextService.findDictRelationAllByEntityIdsAndCodes(thingIdList, dataReissue.getAttributeKey()).orElse(Collections.emptyList())); + } + if(CollectionUtil.isEmpty(thingsAttributesList)){ + throw new SysException("未获取到任何属性列表,数据补发失败"); + } + //3.获取数据补发时间 + Long startTime = dataReissue.getStartTime(); + Long endTime = dataReissue.getEndTime(); + if(Objects.isNull(startTime) || Objects.isNull(endTime)){ + throw new SysException("时间不能为空"); + } + + String dataReissueSetJson = sysParamsService.getValue(DATA_REISSUE); + if (StringUtils.isBlank(dataReissueSetJson)) { + throw new SysException("未获取到相关的配置信息!"); + } + DataReissueSettingDTO dataReissueSettingDTO = JSONObject.parseObject(dataReissueSetJson, DataReissueSettingDTO.class); + String token = login(dataReissueSettingDTO.getUrl(), dataReissueSettingDTO.getUserName(), dataReissueSettingDTO.getPassword()); + Map> longListMap = thingsAttributesList.stream().collect(Collectors.groupingBy(IotThingDictRelationParamDTO::getEntityId)); + longListMap.forEach((k,v)->{ + boolean flag = true; + String limit = "100"; + while (flag){ + String entityCode = v.get(0).getEntityCode(); + List keyList = v.stream().map(IotThingDictRelationParamDTO::getCode).collect(Collectors.toList()); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.set("x-authorization","Bearer " + token); + HttpEntity requestEntity = new HttpEntity<>(null , headers); + ResponseEntity responseEntity = restTemplate.exchange( + dataReissueSettingDTO.getUrl() + "/api/tenant/devices?deviceName=" + entityCode, + HttpMethod.GET, + requestEntity, + Device.class + ); + Map> timeseries = getTskvtMap(responseEntity, token, dataReissueSettingDTO, keyList, startTime, endTime,limit); +// List tsKvEntries = RestJsonConverter.toTimeseries(timeseries); +// if(CollectionUtil.isNotEmpty(tsKvEntries)){ +// pushQueue(entityCode,tsKvEntries); +// +// }else{ +// flag = false; +// } + } + }); + } + + @Nullable + private Map> getTskvtMap(ResponseEntity responseEntity, String token, DataReissueSettingDTO dataReissueSettingDTO, + List keyList, Long startTime, Long endTime,String limit) { + DeviceId deviceId = responseEntity.getBody().getId(); + HttpHeaders headers1 = new HttpHeaders(); + headers1.setContentType(MediaType.APPLICATION_JSON); + headers1.set("x-authorization","Bearer " + token); + UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(dataReissueSettingDTO.getUrl()) + .path("/api/plugins/telemetry/{entityType}/{entityId}/values/timeseries") + .queryParam("keys", "{keys}") + .queryParam("interval", "{interval}") + .queryParam("agg", "{agg}") + .queryParam("limit", "{limit}") + .queryParam("orderBy", "{orderBy}") + .queryParam("useStrictDataTypes", "{useStrictDataTypes}"); + + Map params = new HashMap(); + params.put("entityType", deviceId.getEntityType().name()); + params.put("entityId", deviceId.getId().toString()); + params.put("keys", String.join(",", keyList)); + params.put("interval", "0"); + params.put("agg", "NONE"); + params.put("limit", limit); + params.put("orderBy", "DESC"); + params.put("useStrictDataTypes", Boolean.toString(Boolean.FALSE)); + if (startTime != null) { + uriBuilder.queryParam("&startTs={startTs}"); + params.put("startTs", String.valueOf(startTime)); + } + if (endTime != null) { + uriBuilder.queryParam("&endTs={endTs}"); + params.put("endTs", String.valueOf(endTime)); + } + UriComponents uriComponents = uriBuilder.buildAndExpand(params); + HttpEntity requestEntity = new HttpEntity<>(null , headers1); + + + Map> timeseries = restTemplate.exchange( + uriComponents.toUri(), + HttpMethod.GET, + requestEntity, + new ParameterizedTypeReference>>() {} + ).getBody(); + return timeseries; + } + + @Override + public List tenantList() { + Map params = new HashMap<>(); + UserDetail userDetail = SecurityUser.getUser(); + Long tenantCode = TenantContext.getTenantCode(userDetail); + List tenantCodeList = new ArrayList<>(); + if(!Objects.equals(userDetail.getSuperAdmin(), SuperAdminEnum.YES.value()) + || !Objects.equals(tenantCode, userDetail.getTenantCode())) { + tenantCodeList.add(tenantCode); + //根据 编码找下级编码 + List children = sysTenantGroupService.getChildren(tenantCode); + tenantCodeList.addAll(children); + params.put("tenantCodeList",tenantCodeList); + } + return sysTenantDao.queryList(params).parallelStream().sorted(Comparator.comparingLong(SysTenantDTO::getTenantCode)).collect(Collectors.toList()); + } + + + private String login(String url, String username, String password) { + Map loginRequest = new HashMap(); + loginRequest.put("username", username); + loginRequest.put("password", password); + ResponseEntity tokenInfo = restTemplate.postForEntity(url + "/api/auth/login", loginRequest, JsonNode.class, new Object[0]); + return tokenInfo.getBody().get("token").asText(); + } + + private void pushQueue(String thingCode, List timeSeries) { + if (CollectionUtil.isEmpty(timeSeries)) { + return ; + } + List list = timeSeries.parallelStream() + .filter(tsKv -> Objects.nonNull(tsKv.getValue())) + .map(tsKv -> new TsKvDTO(thingCode, tsKv.getKey(), tsKv.getTs(), tsKv.getValueAsString())) + .toList(); + //send 队列 + publisher.publishEvent(new TsKvEvent(Topics.V1_TSKV_HISTORY.getValue(), TsKvDTO.toDataProtoList(list))); + + } + + +} \ No newline at end of file diff --git a/modules/thing/src/main/java/com/thing/thing/api/service/impl/IotThingApiServiceImpl.java b/modules/thing/src/main/java/com/thing/thing/api/service/impl/IotThingApiServiceImpl.java index 854cf23..eb0a47e 100644 --- a/modules/thing/src/main/java/com/thing/thing/api/service/impl/IotThingApiServiceImpl.java +++ b/modules/thing/src/main/java/com/thing/thing/api/service/impl/IotThingApiServiceImpl.java @@ -57,6 +57,7 @@ import org.springframework.web.util.pattern.PathPattern; import java.lang.reflect.Method; import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -513,7 +514,9 @@ public class IotThingApiServiceImpl extends BaseServiceImpl> dictRelationDTOList = thingManageContextService.findDictRelationAllByIds(attrIds); Collection dictCodes = dictRelationDTOList.orElseGet(Collections::emptyList).stream().map(IotThingDictRelationDTO::getCode).toList(); paramMap.put(code, dictCodes); - // Map collect = dictRelationDTOList.orElseGet(Collections::emptyList).stream().collect(Collectors.toMap(IotThingDictRelationDTO::getCode, Function.identity(),(existing, replacement) -> existing)); + Map collect = dictRelationDTOList.orElseGet(Collections::emptyList).stream() + .collect(Collectors.toMap(IotThingDictRelationDTO::getCode, Function.identity(),(existing, replacement) -> existing)); + optional.get().setAttrs(collect); entityInfoMap.put(code, optional.get()); } }); @@ -556,7 +559,12 @@ public class IotThingApiServiceImpl extends BaseServiceImpl dictCodes = dictRelationDTOS.stream().map(IotThingDictRelationParamDTO::getCode).toList(); paramMap.put(entityCode, dictCodes); - // Map collect = dictRelationDTOS.stream().collect(Collectors.toMap(IotThingDictRelationParamDTO::getCode, Function.identity())); + + Map collect = dictRelationDTOS.stream() + .collect(Collectors.toMap(IotThingDictRelationParamDTO::getCode, + s-> ConvertUtils.sourceToTarget(s,IotThingDictRelationDTO.class) + ,(existing, replacement) -> existing)); + optional.get().setAttrs(collect); entityInfoMap.put(entityCode, optional.get()); } }); diff --git a/modules/thing/src/main/java/com/thing/thing/dictRelation/controller/IotThingDictRelationController.java b/modules/thing/src/main/java/com/thing/thing/dictRelation/controller/IotThingDictRelationController.java index cf8ce65..a9e2709 100644 --- a/modules/thing/src/main/java/com/thing/thing/dictRelation/controller/IotThingDictRelationController.java +++ b/modules/thing/src/main/java/com/thing/thing/dictRelation/controller/IotThingDictRelationController.java @@ -108,6 +108,13 @@ public class IotThingDictRelationController { return new Result().ok(data); } + @PostMapping("ids") + @Operation(summary="信息") + public Result get(@RequestBody List ids){ + IotThingDictRelationDTO data = service.findByIds(ids); + return new Result().ok(data); + } + @PostMapping @Operation(summary="保存") @LogOperation("保存") diff --git a/modules/thing/src/main/java/com/thing/thing/dictRelation/service/IotThingDictRelationService.java b/modules/thing/src/main/java/com/thing/thing/dictRelation/service/IotThingDictRelationService.java index 49eeffd..66adda8 100644 --- a/modules/thing/src/main/java/com/thing/thing/dictRelation/service/IotThingDictRelationService.java +++ b/modules/thing/src/main/java/com/thing/thing/dictRelation/service/IotThingDictRelationService.java @@ -41,6 +41,8 @@ public interface IotThingDictRelationService extends IBaseService ids); + List findAllByEntityIdAndCodes(Long entityId, Collection codes); /** 注意 多个物 有相同的属性code **/ List findAllByEntityIdsAndCodes(Collection entityIds, Collection codes); diff --git a/modules/thing/src/main/java/com/thing/thing/dictRelation/service/impl/IotThingDictRelationServiceImpl.java b/modules/thing/src/main/java/com/thing/thing/dictRelation/service/impl/IotThingDictRelationServiceImpl.java index a42f3e8..c273b73 100644 --- a/modules/thing/src/main/java/com/thing/thing/dictRelation/service/impl/IotThingDictRelationServiceImpl.java +++ b/modules/thing/src/main/java/com/thing/thing/dictRelation/service/impl/IotThingDictRelationServiceImpl.java @@ -245,6 +245,15 @@ public class IotThingDictRelationServiceImpl extends BaseServiceImpl ids) { + if(CollectionUtils.isEmpty(ids)){ + throw new SysException("参数不能为空"); + } + List idList = ids.stream().map(Long::valueOf).toList(); + return mapper.selectOneByQueryAs(new QueryWrapper().in(IotThingDictRelationEntity::getId, idList), IotThingDictRelationDTO.class); + } + @Override public List findAllByEntityIdAndCodes(Long entityId, Collection codes) { return mapper.selectListByQueryAs(new QueryWrapper() diff --git a/modules/thing/src/main/java/com/thing/thing/entity/controller/IotThingEntityController.java b/modules/thing/src/main/java/com/thing/thing/entity/controller/IotThingEntityController.java index d219e18..3f3aa30 100644 --- a/modules/thing/src/main/java/com/thing/thing/entity/controller/IotThingEntityController.java +++ b/modules/thing/src/main/java/com/thing/thing/entity/controller/IotThingEntityController.java @@ -35,6 +35,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; import java.util.Map; +import java.util.Objects; /** * 物实体表 @@ -81,10 +82,11 @@ public class IotThingEntityController { @Parameter(name = "realType", description = "真实/虚拟物") @RequestParam(required = false) String realType, @Parameter(name = "tags", description = "真实/虚拟物") @RequestParam(required = false) String tags, @Parameter(name = "enableStatus", description = "停用开启")@RequestParam(required = false) String enableStatus, - @Parameter(name = "enableStatus", description = "是否是物实体/模板")@RequestParam(required = false) String templateMark, + @Parameter(name = "templateMark", description = "是否是物实体/模板")@RequestParam(required = false) String templateMark, + @Parameter(name = "tenantCode", description = "是否是物实体/模板")@RequestParam(required = false) Long tenantCode, @Parameter(name = "status", description = "在线离线状态,0离线 1在线 2错误 3未接入") @RequestParam(required = false) String status) { - List list = service.findList(orderField,order,name,type, UserContext.getRealTenantCode(),deptId,realType,tags,enableStatus,templateMark,status); + List list = service.findList(orderField,order,name,type, Objects.isNull(tenantCode) ? UserContext.getRealTenantCode() : tenantCode,deptId,realType,tags,enableStatus,templateMark,status); return new Result>().ok(list); } diff --git a/modules/thing/src/main/java/com/thing/thing/entity/dto/IotThingViewDTO.java b/modules/thing/src/main/java/com/thing/thing/entity/dto/IotThingViewDTO.java index 79a70a1..47e2ae8 100644 --- a/modules/thing/src/main/java/com/thing/thing/entity/dto/IotThingViewDTO.java +++ b/modules/thing/src/main/java/com/thing/thing/entity/dto/IotThingViewDTO.java @@ -2,6 +2,7 @@ package com.thing.thing.entity.dto; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.thing.thing.dictRelation.dto.IotThingDictRelationDTO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -10,6 +11,8 @@ import lombok.experimental.Accessors; import java.io.Serial; import java.io.Serializable; +import java.util.List; +import java.util.Map; @Data @Accessors(chain = true) @@ -97,4 +100,6 @@ public class IotThingViewDTO implements Serializable { @Schema(description = "纬度") private String lat; + private Map attrs; + } \ No newline at end of file diff --git a/modules/thing/src/main/java/com/thing/thing/entity/dto/IotThingViewSourceDTO.java b/modules/thing/src/main/java/com/thing/thing/entity/dto/IotThingViewSourceDTO.java index e1ff4dc..be468b9 100644 --- a/modules/thing/src/main/java/com/thing/thing/entity/dto/IotThingViewSourceDTO.java +++ b/modules/thing/src/main/java/com/thing/thing/entity/dto/IotThingViewSourceDTO.java @@ -28,8 +28,8 @@ public class IotThingViewSourceDTO extends IotThingViewDTO implements Serializab @Serial private static final long serialVersionUID = 1L; - @Schema(description = "物属性相关信息:主要返回给前端超级API使用") - private Map attrs; +// @Schema(description = "物属性相关信息:主要返回给前端超级API使用") +// private Map attrs; @Schema(description = "物属性集合信息:暂时使用,后期删除") private List dictList; diff --git a/modules/thing/src/main/java/com/thing/thing/entity/service/impl/IotThingEntityServiceImpl.java b/modules/thing/src/main/java/com/thing/thing/entity/service/impl/IotThingEntityServiceImpl.java index 32baf16..d43b621 100644 --- a/modules/thing/src/main/java/com/thing/thing/entity/service/impl/IotThingEntityServiceImpl.java +++ b/modules/thing/src/main/java/com/thing/thing/entity/service/impl/IotThingEntityServiceImpl.java @@ -22,6 +22,7 @@ import com.thing.common.core.web.response.PageData; import com.thing.common.data.tskv.TsKvDTO; import com.thing.common.orm.service.impl.BaseServiceImpl; import com.thing.common.tskv.service.TsKvService; +import com.thing.event.ThingChangedEvent; import com.thing.sys.biz.entity.SysDeptEntity; import com.thing.sys.biz.mapper.SysDeptMapper; import com.thing.sys.oss.cloud.OSSFactory; @@ -60,6 +61,7 @@ import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -103,6 +105,9 @@ public class IotThingEntityServiceImpl extends BaseServiceImpl params) { String name = MapUtil.getStr(params, "name"); @@ -368,7 +373,7 @@ public class IotThingEntityServiceImpl extends BaseServiceImpl> findByCodes(Collection codes,Long tenantCode,boolean isEntity) { return Optional.ofNullable(mapper.selectListByQueryAs(QueryWrapper.create() .in(IotThingEntity::getCode, codes,CollectionUtils.isNotEmpty(codes)) - .in(IotThingEntity::getCode, codes,CollectionUtils.isNotEmpty(codes)) + .in(IotThingEntity::getTenantCode, tenantCode,!Objects.isNull(tenantCode)) .eq(IotThingEntity::getTemplateMark,isEntity? "0":"1") ,IotThingEntityDTO.class)); } @@ -497,6 +502,10 @@ public class IotThingEntityServiceImpl extends BaseServiceImpl Optional findByCode(String code); + Optional getByCode(String code); + Optional> findByGateway(String gateway); Optional findModelByGatewayAndToken(String gateway, String token); @@ -59,4 +61,6 @@ public interface IotThingModelService extends IBaseService void batchSaveOrUpdate(List entities); + void batchInsertOrUpdate(List entities); + } diff --git a/modules/thing/src/main/java/com/thing/thing/model/service/impl/IotThingModelServiceImpl.java b/modules/thing/src/main/java/com/thing/thing/model/service/impl/IotThingModelServiceImpl.java index dd859bf..93da625 100644 --- a/modules/thing/src/main/java/com/thing/thing/model/service/impl/IotThingModelServiceImpl.java +++ b/modules/thing/src/main/java/com/thing/thing/model/service/impl/IotThingModelServiceImpl.java @@ -137,7 +137,6 @@ public class IotThingModelServiceImpl extends BaseServiceImpl modelList = cache.getTopicMap(CacheNameEnum.THING_MODEL); - log.info("modelList缓存数据个数:{},modelList缓存数据:{}", modelList.size(),modelList.toString()); if (CollectionUtils.isEmpty(modelList)) { List list = mapper.selectListByQueryAs(getWrapper(orderField, order, null, null, null, null, null,null,null, null), IotThingModelDTO.class); @@ -175,6 +174,11 @@ public class IotThingModelServiceImpl extends BaseServiceImpl getByCode(String code) { + return Optional.ofNullable(mapper.selectOneByQuery(QueryWrapper.create().eq(IotThingModelEntity::getCode, code))); + } + @Override public Optional> findByGateway(String gateway) { List topicMap = cache.getTopicMap(CacheNameEnum.THING_MODEL); @@ -379,10 +383,15 @@ public class IotThingModelServiceImpl extends BaseServiceImpl modelEntities) { - modelEntities.forEach(model -> mapper.insertOrUpdateSelective(model)); + modelEntities.forEach(model -> mapper.insertOrUpdate(model)); cache.clearTopic(CacheNameEnum.THING_MODEL); } + @Override + public void batchInsertOrUpdate(List entities) { + entities.forEach(model -> mapper.insertOrUpdate(model)); + } + //物模型新增和更新中分配物实体信息 private List shareThingsToTenantCode(Collection codeList, Collection tenantCodes) { if (CollectionUtils.isEmpty(tenantCodes)) { diff --git a/modules/visual-design/src/main/java/com/thing/visual/board/dto/IotVisualManageDTO.java b/modules/visual-design/src/main/java/com/thing/visual/board/dto/IotVisualManageDTO.java index 4fb1e1d..5fb2589 100644 --- a/modules/visual-design/src/main/java/com/thing/visual/board/dto/IotVisualManageDTO.java +++ b/modules/visual-design/src/main/java/com/thing/visual/board/dto/IotVisualManageDTO.java @@ -51,6 +51,6 @@ public class IotVisualManageDTO implements Serializable { @Schema(description = "所属企业(租户code)") private Long tenantCode; - + private Integer isDefault; } \ No newline at end of file diff --git a/modules/visual-design/src/main/java/com/thing/visual/board/entity/IotVisualManageEntity.java b/modules/visual-design/src/main/java/com/thing/visual/board/entity/IotVisualManageEntity.java index 21420c0..b3ae60b 100644 --- a/modules/visual-design/src/main/java/com/thing/visual/board/entity/IotVisualManageEntity.java +++ b/modules/visual-design/src/main/java/com/thing/visual/board/entity/IotVisualManageEntity.java @@ -49,4 +49,6 @@ public class IotVisualManageEntity extends BaseInfoEntity { */ private String previewUrl; + private Integer isDefault; + } \ No newline at end of file diff --git a/modules/visual-design/src/main/java/com/thing/visual/board/service/impl/IotVisualManageServiceImpl.java b/modules/visual-design/src/main/java/com/thing/visual/board/service/impl/IotVisualManageServiceImpl.java index 2c28c6e..6ee02d5 100644 --- a/modules/visual-design/src/main/java/com/thing/visual/board/service/impl/IotVisualManageServiceImpl.java +++ b/modules/visual-design/src/main/java/com/thing/visual/board/service/impl/IotVisualManageServiceImpl.java @@ -29,6 +29,7 @@ import com.thing.sys.biz.service.SysMenuService; import com.thing.sys.biz.service.SysRoleMenuService; import com.thing.sys.biz.service.SysRoleService; import com.thing.sys.security.context.TenantContext; +import com.thing.sys.security.context.UserContext; import com.thing.sys.security.domain.SecurityUser; import com.thing.sys.security.domain.UserDetail; import com.thing.util.TenantSubsetUtil; @@ -56,6 +57,8 @@ import java.util.*; import java.util.stream.Collectors; import static com.mybatisflex.core.query.QueryMethods.column; +import static com.thing.visual.board.entity.table.IotVisualManageEntityTableDef.IOT_VISUAL_MANAGE_ENTITY; +import static com.thing.visual.component.entity.table.IotVisualComponentEntityTableDef.IOT_VISUAL_COMPONENT_ENTITY; /** * 组态大屏管理 @@ -88,7 +91,8 @@ public class IotVisualManageServiceImpl extends BaseServiceImpl params){ QueryColumn nameColumn = column("name"); - QueryColumn idColumn = column("id::varchar"); + QueryColumn idColumn = column("id"); + Long tenantCode = UserContext.getTenantCode(); QueryWrapper wrapper = new QueryWrapper(); String type = (String) params.get("type"); @@ -105,10 +109,13 @@ public class IotVisualManageServiceImpl extends BaseServiceImpl idList = Arrays.asList(ids.split(",")); + List idList = Arrays.stream(ids.split(",")) + .map(String::trim) // 去掉可能的空格 + .map(Long::parseLong) // 将每个字符串转换为 Long + .collect(Collectors.toList()); wrapper.in( "id", idList,CollectionUtils.isNotEmpty(idList)); } - wrapper.in("tenant_code",tenantSubsetUtil.paramsAddTenantCodeList(true)); + wrapper.and(IOT_VISUAL_MANAGE_ENTITY.TENANT_CODE.eq(tenantCode).or(IOT_VISUAL_MANAGE_ENTITY.IS_DEFAULT.eq(0))); return wrapper; } diff --git a/modules/visual-design/src/main/java/com/thing/visual/configuration/service/impl/IotVisualDesignServiceImpl.java b/modules/visual-design/src/main/java/com/thing/visual/configuration/service/impl/IotVisualDesignServiceImpl.java index b3e6e16..e033d07 100644 --- a/modules/visual-design/src/main/java/com/thing/visual/configuration/service/impl/IotVisualDesignServiceImpl.java +++ b/modules/visual-design/src/main/java/com/thing/visual/configuration/service/impl/IotVisualDesignServiceImpl.java @@ -114,13 +114,16 @@ public class IotVisualDesignServiceImpl extends BaseServiceImpl apiIds = Arrays.asList(data.getApiSetIds().split(",")); + List apiIds = Arrays.stream(data.getApiSetIds().split(",")) + .map(String::trim) // 去掉可能的空格 + .map(Long::parseLong) // 将每个字符串转换为 Long + .collect(Collectors.toList()); if(!apiIds.isEmpty()){ data.setIotThingApiDTOList( ConvertUtils.sourceToTarget(iotThingApiDao.selectListByIds(apiIds), IotThingApiDTO.class)); } diff --git a/modules/visual-design/src/main/java/com/thing/visual/group/service/impl/IotVisualGroupServiceImpl.java b/modules/visual-design/src/main/java/com/thing/visual/group/service/impl/IotVisualGroupServiceImpl.java index 529c0b8..8b43f02 100644 --- a/modules/visual-design/src/main/java/com/thing/visual/group/service/impl/IotVisualGroupServiceImpl.java +++ b/modules/visual-design/src/main/java/com/thing/visual/group/service/impl/IotVisualGroupServiceImpl.java @@ -95,12 +95,12 @@ public class IotVisualGroupServiceImpl extends BaseServiceImpl params){ - QueryColumn is_default = column("is_default"); - QueryColumn tenant_code = column("tenant_code"); - QueryWrapper wrapper = new QueryWrapper(); wrapper.leftJoin("iot_visual_group").on("iot_visual_material.group_id = iot_visual_group.id"); @@ -88,14 +85,14 @@ public class IotVisualMaterialServiceImpl extends BaseServiceImpl