Browse Source

Merge pull request 'master' (#34) from master into V3

Reviewed-on: http://git.lrdaiot.cn:9000/thing/thing_api/pulls/34
qingyuan_dev_new
李帅 1 year ago
parent
commit
65f5fd26c2
  1. 20
      common/core/src/main/java/com/thing/common/core/utils/HttpContextUtils.java
  2. 4
      modules/carbon-public/src/main/java/com/thing/carbon/pub/service/impl/CarbonPubProductionResultServiceImpl.java
  3. 1
      modules/carbon-track/src/main/java/com/thing/carbontrack/event/standardcal/listener/ProductionResultListener.java
  4. 4
      modules/carbon-track/src/main/java/com/thing/carbontrack/productionResult/service/impl/IotCarbonProductionResultServiceImpl.java
  5. 11
      modules/thing/src/main/java/com/thing/device/analysisdata/service/impl/AnalysisDataServiceImpl.java
  6. 29
      modules/thing/src/main/java/com/thing/event/ThingChangedEvent.java
  7. 129
      modules/thing/src/main/java/com/thing/listener/QueueDeviceEventListener.java
  8. 33
      modules/thing/src/main/java/com/thing/listener/ThingChangedEventListener.java
  9. 37
      modules/thing/src/main/java/com/thing/reissue/controller/DataReissueController.java
  10. 41
      modules/thing/src/main/java/com/thing/reissue/dto/DataReissueCalculationDTO.java
  11. 36
      modules/thing/src/main/java/com/thing/reissue/dto/DataReissueDTO.java
  12. 31
      modules/thing/src/main/java/com/thing/reissue/dto/DataReissueSettingDTO.java
  13. 66
      modules/thing/src/main/java/com/thing/reissue/entity/DataReissueEntity.java
  14. 16
      modules/thing/src/main/java/com/thing/reissue/mapper/DataReissueMapper.java
  15. 25
      modules/thing/src/main/java/com/thing/reissue/service/DataReissueService.java
  16. 248
      modules/thing/src/main/java/com/thing/reissue/service/impl/DataReissueServiceImpl.java
  17. 12
      modules/thing/src/main/java/com/thing/thing/api/service/impl/IotThingApiServiceImpl.java
  18. 7
      modules/thing/src/main/java/com/thing/thing/dictRelation/controller/IotThingDictRelationController.java
  19. 2
      modules/thing/src/main/java/com/thing/thing/dictRelation/service/IotThingDictRelationService.java
  20. 9
      modules/thing/src/main/java/com/thing/thing/dictRelation/service/impl/IotThingDictRelationServiceImpl.java
  21. 6
      modules/thing/src/main/java/com/thing/thing/entity/controller/IotThingEntityController.java
  22. 5
      modules/thing/src/main/java/com/thing/thing/entity/dto/IotThingViewDTO.java
  23. 4
      modules/thing/src/main/java/com/thing/thing/entity/dto/IotThingViewSourceDTO.java
  24. 15
      modules/thing/src/main/java/com/thing/thing/entity/service/impl/IotThingEntityServiceImpl.java
  25. 4
      modules/thing/src/main/java/com/thing/thing/model/service/IotThingModelService.java
  26. 13
      modules/thing/src/main/java/com/thing/thing/model/service/impl/IotThingModelServiceImpl.java
  27. 2
      modules/visual-design/src/main/java/com/thing/visual/board/dto/IotVisualManageDTO.java
  28. 2
      modules/visual-design/src/main/java/com/thing/visual/board/entity/IotVisualManageEntity.java
  29. 13
      modules/visual-design/src/main/java/com/thing/visual/board/service/impl/IotVisualManageServiceImpl.java
  30. 7
      modules/visual-design/src/main/java/com/thing/visual/configuration/service/impl/IotVisualDesignServiceImpl.java
  31. 4
      modules/visual-design/src/main/java/com/thing/visual/group/service/impl/IotVisualGroupServiceImpl.java
  32. 4
      modules/visual-design/src/main/java/com/thing/visual/material/dto/IotVisualMaterialDTO.java
  33. 17
      modules/visual-design/src/main/java/com/thing/visual/material/service/impl/IotVisualMaterialServiceImpl.java

20
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;
}

4
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<Carbon
if(Objects.nonNull(start) && Objects.nonNull(end)){
Date startDate = sdf.parse(start);
Date endDate = sdf.parse(end);
wrapper.and(CARBON_PUB_PRODUCTION_RESULT_ENTITY.START_TIME.between(startDate, endDate)
.or(CARBON_PUB_PRODUCTION_RESULT_ENTITY.FINISH_TIME.between(startDate, endDate)));
wrapper.between(CarbonPubProductionResultEntity::getFinishTime, startDate, endDate);
}
return list(wrapper);
}

1
modules/carbon-track/src/main/java/com/thing/carbontrack/event/standardcal/listener/ProductionResultListener.java

@ -68,7 +68,6 @@ public class ProductionResultListener {
* 计算产品批次碳足迹
* @param production
*/
@Transactional
public synchronized void calculate(ProductionPage production){
try {
QuantityDto quantityDto = iotCarbonProductionRecordService.getQuantityByMidAndPrCode(production.getMId(),production.getPrCode());

4
modules/carbon-track/src/main/java/com/thing/carbontrack/productionResult/service/impl/IotCarbonProductionResultServiceImpl.java

@ -10,7 +10,6 @@ import com.mybatisflex.core.query.QueryColumn;
import com.mybatisflex.core.query.QueryWrapper;
import com.thing.carbontrack.production.entity.IotCarbonProductionVarietyEntity;
import com.thing.carbontrack.production.mapper.IotCarbonProductionVarietyMapper;
import com.thing.carbontrack.production.service.IotCarbonProductionVarietyService;
import com.thing.carbontrack.productionResult.dto.*;
import com.thing.carbontrack.productionResult.entity.IotCarbonProductionResultEntity;
import com.thing.carbontrack.productionResult.mapper.IotCarbonProductionResultMapper;
@ -717,8 +716,7 @@ public class IotCarbonProductionResultServiceImpl
if(Objects.nonNull(start) && Objects.nonNull(end)){
Date startDate = sdf.parse(start);
Date endDate = sdf.parse(end);
wrapper.and(IOT_CARBON_PRODUCTION_RESULT_ENTITY.START_TIME.between(startDate, endDate)
.or(IOT_CARBON_PRODUCTION_RESULT_ENTITY.FINISH_TIME.between(startDate, endDate)));
wrapper.between(IotCarbonProductionResultEntity::getFinishTime, startDate, endDate);
}
return list(wrapper);
}

11
modules/thing/src/main/java/com/thing/device/analysisdata/service/impl/AnalysisDataServiceImpl.java

@ -45,6 +45,7 @@ import com.thing.sys.security.context.TenantContext;
import com.thing.sys.security.domain.SecurityUser;
import com.thing.sys.security.domain.UserDetail;
import com.thing.thing.context.service.ThingManageContextService;
import com.thing.thing.dictRelation.dto.IotThingDictRelationDTO;
import com.thing.thing.dictRelation.param.IotThingDictRelationParamDTO;
import com.thing.thing.entity.dto.IotThingViewDTO;
import com.thing.thing.entity.dto.IotThingViewSourceDTO;
@ -239,7 +240,8 @@ public class AnalysisDataServiceImpl implements AnalysisDataService {
).findFirst().ifPresent(thingSourceDTO -> relationDTO.setThingAttrBoundary(thingSourceDTO.getThingAttrBoundary()));
});
// 将属性列表转换为 Map并设置给当前的 IotThingViewDTO
Map<String, IotThingDictRelationParamDTO> dictRelationDTOMap = relationDTOList.stream().collect(Collectors.toMap(IotThingDictRelationParamDTO::getCode, Function.identity(), (k1, k2) -> k2));
Map<String, IotThingDictRelationDTO> dictRelationDTOMap = relationDTOList.stream()
.collect(Collectors.toMap(IotThingDictRelationParamDTO::getCode, s-> ConvertUtils.sourceToTarget(s, IotThingDictRelationDTO.class), (k1, k2) -> k2));
viewSourceDTO.setAttrs(dictRelationDTOMap);
relationDTOList.forEach(relationDTO ->{
Optional<IotThingSourceDTO> first = iotThingSourceList.stream().filter(iotThingSourceDTO ->
@ -336,8 +338,8 @@ public class AnalysisDataServiceImpl implements AnalysisDataService {
String val = s.getVal();
for (Map.Entry<String, IotThingViewSourceDTO> entry : infoMap.entrySet()) {
IotThingViewSourceDTO entryValue = entry.getValue();
Map<String, IotThingDictRelationParamDTO> attrs = entryValue.getAttrs();
IotThingDictRelationParamDTO iotThingDictRelationDTO = attrs.get(attr_key);
Map<String, IotThingDictRelationDTO> 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<String, IotThingDictRelationParamDTO> dictRelationDTOMap = relationDTOList.stream().collect(Collectors.toMap(IotThingDictRelationParamDTO::getCode, Function.identity(), (k1, k2) -> k2));
Map<String, IotThingDictRelationDTO> 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

29
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;
}
}

129
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<IotThingModelEntity> insertModelList = new ArrayList<>();
//物模型插入
checkAndSaveThingModels(codeOriginMap, insertModelList);
List<IotThingModelEntity> insertModelList = new ArrayList<>();
//物模型更新
List<IotThingModelEntity> 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<IotThingEntity> insertEntityList = new ArrayList<>();
saveTenantThingList(tenantThingCodeMap, insertEntityList);
insertModelList.forEach(item -> {
long count = insertEntityList.stream().filter(e -> StringUtils.equals(e.getCode(), item.getCode())).count();
List<ObjectNode> keyMap = thingCache.findKeyMap(CacheNameEnum.THING_ENTITY, item.getCode());
item.setAuthNum(count+CollectionUtils.size(keyMap));
});
thingManageContextService.saveAllModel(insertModelList);
thingModelService.saveBatch(insertModelList);
//更新物模板缓存
List<IotThingModelDTO> iotThingModelDTOS = ConvertUtils.sourceToTarget(insertModelList, IotThingModelDTO.class);
List<ObjectNode> 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<IotThingEntity> distinctStudentFile = insertEntityList.stream()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getCode() + ";" + o.getTenantCode()))), ArrayList::new));
thingManageContextService.saveEntity(distinctStudentFile);
//更新物实体缓存
List<IotThingViewDTO> 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<ObjectNode> 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<ObjectNode> 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<IotThingModelEntity> insertModelList) {
List<IotThingModelDTO> iotThingModelDTOS = ConvertUtils.sourceToTarget(insertModelList, IotThingModelDTO.class);
List<ObjectNode> 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<IotThingEntity> distinctStudentFile) {
//更新物实体缓存
List<IotThingViewDTO> 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<ObjectNode> 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<String, String> codeOriginMap, List<IotThingModelEntity> insertList) throws Exception {
private void checkAndSaveThingModels(Map<String, String> codeOriginMap, List<IotThingModelEntity> insertList,List<IotThingModelEntity> updateList) {
// 使用迭代器遍历并删除不符合条件的元素
Iterator<Map.Entry<String, String>> 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())

33
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();
}
}

37
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<Void> dataReissue(@RequestBody DataReissueDTO dataReissue) {
dataReissueService.dataReissue(dataReissue);
return new Result<>();
}
@GetMapping("tenantList")
@Operation(summary="侧边栏所有有数据的企业列表")
public Result<List<SysTenantDTO>> tenantList(){
List<SysTenantDTO> dtos =dataReissueService.tenantList();
return new Result<List<SysTenantDTO>>().ok(dtos);
}
}

41
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<ThingCalc> 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<String> attrList;
@Schema(description = "部门ID")
private Long deptId;
}
}

36
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<Long> entityIds;
@Schema(description = "属性")
private List<String> attributeKey;
@Schema(description = "开始时间(13位时间戳)")
@NotNull(message="开始时间不能为空", groups = DefaultGroup.class)
private Long startTime;
@Schema(description = "结束时间(13位时间戳)")
@NotNull(message="结束时间不能为空", groups = DefaultGroup.class)
private Long endTime;
}

31
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;
}

66
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;
/**
* 看板类型/0svg看板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;
}

16
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<DataReissueEntity> {
}

25
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<DataReissueEntity> {
void dataReissue(DataReissueDTO dataReissue);
List<SysTenantDTO> tenantList();
}

248
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<DataReissueMapper, DataReissueEntity> 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<String, Object> 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<Long> entityIdList = dataReissue.getEntityIds();
Long tenantCode = dataReissue.getTenantCode();
//过滤租户
if(Objects.isNull(tenantCode)){
tenantCode = TenantContext.getTenantCode(SecurityUser.getUser());
}
List<IotThingEntityDTO> 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<IotThingDictRelationParamDTO> thingsAttributesList = new ArrayList<>();
List<Long> 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<Long, List<IotThingDictRelationParamDTO>> 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<String> 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<String> requestEntity = new HttpEntity<>(null , headers);
ResponseEntity<Device> responseEntity = restTemplate.exchange(
dataReissueSettingDTO.getUrl() + "/api/tenant/devices?deviceName=" + entityCode,
HttpMethod.GET,
requestEntity,
Device.class
);
Map<String, List<JsonNode>> timeseries = getTskvtMap(responseEntity, token, dataReissueSettingDTO, keyList, startTime, endTime,limit);
// List<TsKvEntry> tsKvEntries = RestJsonConverter.toTimeseries(timeseries);
// if(CollectionUtil.isNotEmpty(tsKvEntries)){
// pushQueue(entityCode,tsKvEntries);
//
// }else{
// flag = false;
// }
}
});
}
@Nullable
private Map<String, List<JsonNode>> getTskvtMap(ResponseEntity<Device> responseEntity, String token, DataReissueSettingDTO dataReissueSettingDTO,
List<String> 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<String, String> 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<String> requestEntity = new HttpEntity<>(null , headers1);
Map<String, List<JsonNode>> timeseries = restTemplate.exchange(
uriComponents.toUri(),
HttpMethod.GET,
requestEntity,
new ParameterizedTypeReference<Map<String, List<JsonNode>>>() {}
).getBody();
return timeseries;
}
@Override
public List<SysTenantDTO> tenantList() {
Map<String,Object> params = new HashMap<>();
UserDetail userDetail = SecurityUser.getUser();
Long tenantCode = TenantContext.getTenantCode(userDetail);
List<Long> tenantCodeList = new ArrayList<>();
if(!Objects.equals(userDetail.getSuperAdmin(), SuperAdminEnum.YES.value())
|| !Objects.equals(tenantCode, userDetail.getTenantCode())) {
tenantCodeList.add(tenantCode);
//根据 编码找下级编码
List<Long> 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<String, String> loginRequest = new HashMap();
loginRequest.put("username", username);
loginRequest.put("password", password);
ResponseEntity<JsonNode> 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<TsKvEntry> timeSeries) {
if (CollectionUtil.isEmpty(timeSeries)) {
return ;
}
List<TsKvDTO> 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)));
}
}

12
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<IotThingApiMapper, I
Optional<List<IotThingDictRelationDTO>> dictRelationDTOList = thingManageContextService.findDictRelationAllByIds(attrIds);
Collection<String> dictCodes = dictRelationDTOList.orElseGet(Collections::emptyList).stream().map(IotThingDictRelationDTO::getCode).toList();
paramMap.put(code, dictCodes);
// Map<String, IotThingDictRelationDTO> collect = dictRelationDTOList.orElseGet(Collections::emptyList).stream().collect(Collectors.toMap(IotThingDictRelationDTO::getCode, Function.identity(),(existing, replacement) -> existing));
Map<String, IotThingDictRelationDTO> 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<IotThingApiMapper, I
String entityCode = optional.get().getEntityCode();
List<String> dictCodes = dictRelationDTOS.stream().map(IotThingDictRelationParamDTO::getCode).toList();
paramMap.put(entityCode, dictCodes);
// Map<String, IotThingDictRelationParamDTO> collect = dictRelationDTOS.stream().collect(Collectors.toMap(IotThingDictRelationParamDTO::getCode, Function.identity()));
Map<String, IotThingDictRelationDTO> 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());
}
});

7
modules/thing/src/main/java/com/thing/thing/dictRelation/controller/IotThingDictRelationController.java

@ -108,6 +108,13 @@ public class IotThingDictRelationController {
return new Result<IotThingDictRelationDTO>().ok(data);
}
@PostMapping("ids")
@Operation(summary="信息")
public Result<IotThingDictRelationDTO> get(@RequestBody List<String> ids){
IotThingDictRelationDTO data = service.findByIds(ids);
return new Result<IotThingDictRelationDTO>().ok(data);
}
@PostMapping
@Operation(summary="保存")
@LogOperation("保存")

2
modules/thing/src/main/java/com/thing/thing/dictRelation/service/IotThingDictRelationService.java

@ -41,6 +41,8 @@ public interface IotThingDictRelationService extends IBaseService<IotThingDictRe
IotThingDictRelationDTO findById(Long id);
IotThingDictRelationDTO findByIds(List<String> ids);
List<IotThingDictRelationDTO> findAllByEntityIdAndCodes(Long entityId, Collection<String> codes);
/** 注意 多个物 有相同的属性code **/
List<IotThingDictRelationParamDTO> findAllByEntityIdsAndCodes(Collection<Long> entityIds, Collection<String> codes);

9
modules/thing/src/main/java/com/thing/thing/dictRelation/service/impl/IotThingDictRelationServiceImpl.java

@ -245,6 +245,15 @@ public class IotThingDictRelationServiceImpl extends BaseServiceImpl<IotThingDic
return mapper.selectOneByQueryAs(new QueryWrapper().eq(IotThingDictRelationEntity::getId, id), IotThingDictRelationDTO.class);
}
@Override
public IotThingDictRelationDTO findByIds(List<String> ids) {
if(CollectionUtils.isEmpty(ids)){
throw new SysException("参数不能为空");
}
List<Long> idList = ids.stream().map(Long::valueOf).toList();
return mapper.selectOneByQueryAs(new QueryWrapper().in(IotThingDictRelationEntity::getId, idList), IotThingDictRelationDTO.class);
}
@Override
public List<IotThingDictRelationDTO> findAllByEntityIdAndCodes(Long entityId, Collection<String> codes) {
return mapper.selectListByQueryAs(new QueryWrapper()

6
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<ObjectNode> list = service.findList(orderField,order,name,type, UserContext.getRealTenantCode(),deptId,realType,tags,enableStatus,templateMark,status);
List<ObjectNode> list = service.findList(orderField,order,name,type, Objects.isNull(tenantCode) ? UserContext.getRealTenantCode() : tenantCode,deptId,realType,tags,enableStatus,templateMark,status);
return new Result<List<ObjectNode>>().ok(list);
}

5
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<String, IotThingDictRelationDTO> attrs;
}

4
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<String, IotThingDictRelationParamDTO> attrs;
// @Schema(description = "物属性相关信息:主要返回给前端超级API使用")
// private Map<String, IotThingDictRelationParamDTO> attrs;
@Schema(description = "物属性集合信息:暂时使用,后期删除")
private List<IotThingDictRelationParamDTO> dictList;

15
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<IotThingEntityMap
@Resource
private IotGroupRelationService groupRelationService;
@Resource
private ApplicationEventPublisher appEventPublisher;
@Override
public QueryWrapper getWrapper(Map<String, Object> params) {
String name = MapUtil.getStr(params, "name");
@ -368,7 +373,7 @@ public class IotThingEntityServiceImpl extends BaseServiceImpl<IotThingEntityMap
public Optional<List<IotThingEntityDTO>> findByCodes(Collection<String> 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<IotThingEntityMap
tags = StringUtils.join(dto.getTags(),",");
}
}
// 校验名称是否修改如果修改了则发送事件去修改thingSource中的名称
boolean nameChanged = !ObjectUtil.equals(dto.getName(), thingEntity.getName());
thingEntity.setCode(code)
.setName(BizUtils.trimAll(dto.getName()))
.setRemark(dto.getRemark())
@ -519,6 +528,10 @@ public class IotThingEntityServiceImpl extends BaseServiceImpl<IotThingEntityMap
mapper.update(thingEntity);
//更新物实体缓存
cache.clearTopic(CacheNameEnum.THING_ENTITY);
if (nameChanged) {
appEventPublisher.publishEvent(new ThingChangedEvent(this, thingEntity));
}
}
@Override

4
modules/thing/src/main/java/com/thing/thing/model/service/IotThingModelService.java

@ -27,6 +27,8 @@ public interface IotThingModelService extends IBaseService<IotThingModelEntity>
Optional<ModelDetailDTO> findByCode(String code);
Optional<IotThingModelEntity> getByCode(String code);
Optional<List<ObjectNode>> findByGateway(String gateway);
Optional<ObjectNode> findModelByGatewayAndToken(String gateway, String token);
@ -59,4 +61,6 @@ public interface IotThingModelService extends IBaseService<IotThingModelEntity>
void batchSaveOrUpdate(List<IotThingModelEntity> entities);
void batchInsertOrUpdate(List<IotThingModelEntity> entities);
}

13
modules/thing/src/main/java/com/thing/thing/model/service/impl/IotThingModelServiceImpl.java

@ -137,7 +137,6 @@ public class IotThingModelServiceImpl extends BaseServiceImpl<IotThingModelMappe
Long startTime,
Long endTime) {
List<ObjectNode> modelList = cache.getTopicMap(CacheNameEnum.THING_MODEL);
log.info("modelList缓存数据个数:{},modelList缓存数据:{}", modelList.size(),modelList.toString());
if (CollectionUtils.isEmpty(modelList)) {
List<IotThingModelDTO> 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<IotThingModelMappe
return Optional.ofNullable(mapper.selectOneByQueryAs(QueryWrapper.create().eq(IotThingModelEntity::getCode, code), ModelDetailDTO.class));
}
@Override
public Optional<IotThingModelEntity> getByCode(String code) {
return Optional.ofNullable(mapper.selectOneByQuery(QueryWrapper.create().eq(IotThingModelEntity::getCode, code)));
}
@Override
public Optional<List<ObjectNode>> findByGateway(String gateway) {
List<ObjectNode> topicMap = cache.getTopicMap(CacheNameEnum.THING_MODEL);
@ -379,10 +383,15 @@ public class IotThingModelServiceImpl extends BaseServiceImpl<IotThingModelMappe
@Transactional(rollbackFor = Exception.class)
@Override
public void batchSaveOrUpdate(List<IotThingModelEntity> modelEntities) {
modelEntities.forEach(model -> mapper.insertOrUpdateSelective(model));
modelEntities.forEach(model -> mapper.insertOrUpdate(model));
cache.clearTopic(CacheNameEnum.THING_MODEL);
}
@Override
public void batchInsertOrUpdate(List<IotThingModelEntity> entities) {
entities.forEach(model -> mapper.insertOrUpdate(model));
}
//物模型新增和更新中分配物实体信息
private List<IotThingEntity> shareThingsToTenantCode(Collection<String> codeList, Collection<Long> tenantCodes) {
if (CollectionUtils.isEmpty(tenantCodes)) {

2
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;
}

2
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;
}

13
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<IotVisualManageM
@Override
public QueryWrapper getWrapper(Map<String, Object> 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<IotVisualManageM
String ids = (String) params.get("ids");
if(StringUtils.isNotBlank(ids)&&!"null".equals(params.get("ids"))){
List<String> idList = Arrays.asList(ids.split(","));
List<Long> 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;
}

7
modules/visual-design/src/main/java/com/thing/visual/configuration/service/impl/IotVisualDesignServiceImpl.java

@ -114,13 +114,16 @@ public class IotVisualDesignServiceImpl extends BaseServiceImpl<IotVisualDesignM
wrapper.eq("board_manage_id",id);
IotVisualDesignDTO data = this.getOneAs(wrapper, IotVisualDesignDTO.class);
IotVisualManageEntity manageEntity = iotVisualManageService.getById(id);
IotVisualManageEntity manageEntity = iotVisualManageService.getById(id);
data.setThumbnailUrl(manageEntity.getThumbnailUrl());
data.setPageName(manageEntity.getName());
data.setPreviewUrl(manageEntity.getPreviewUrl());
if(ObjectUtil.isNotEmpty(data)){
if(StringUtils.isNotBlank(data.getApiSetIds())){
List<String> apiIds = Arrays.asList(data.getApiSetIds().split(","));
List<Long> 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));
}

4
modules/visual-design/src/main/java/com/thing/visual/group/service/impl/IotVisualGroupServiceImpl.java

@ -95,12 +95,12 @@ public class IotVisualGroupServiceImpl extends BaseServiceImpl<IotVisualGroupMap
.set(IotVisualGroupEntity::getThumbnailUrl,dto.getThumbnailUrl())
.set(IotVisualGroupEntity::getBusinessName,dto.getBusinessName())
.set(IotVisualGroupEntity::getRemark,dto.getRemark())
.where(IotVisualGroupEntity::getName).eq(dto.getName()).eq(IotVisualGroupEntity::getBusinessName,temp.getName())
.where(IotVisualGroupEntity::getName).eq(dto.getName()).eq(IotVisualGroupEntity::getBusinessName,dto.getOldName())
.update();
}else {
UpdateChain.of(IotVisualGroupEntity.class)
.set(IotVisualGroupEntity::getBsSort, temp.getSort())
.where(IotVisualGroupEntity::getName).eq(dto.getName()).eq(IotVisualGroupEntity::getBusinessName,temp.getName())
.where(IotVisualGroupEntity::getName).eq(dto.getName()).eq(IotVisualGroupEntity::getBusinessName,dto.getOldName())
.update();
}
});

4
modules/visual-design/src/main/java/com/thing/visual/material/dto/IotVisualMaterialDTO.java

@ -50,11 +50,11 @@ public class IotVisualMaterialDTO implements Serializable {
@Schema(description = "创建者")
private Long creator;
@Schema(description = "创建时间")
private Date createDate;
private Long createDate;
@Schema(description = "更新者")
private Long updater;
@Schema(description = "更新时间")
private Date updateDate;
private Long updateDate;
@Schema(description = "是否可以编辑 0可编辑 1不可编辑")
private String isOperate ="0";

17
modules/visual-design/src/main/java/com/thing/visual/material/service/impl/IotVisualMaterialServiceImpl.java

@ -72,9 +72,6 @@ public class IotVisualMaterialServiceImpl extends BaseServiceImpl<IotVisualMater
@Override
public QueryWrapper getWrapper(Map<String, Object> 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<IotVisualMater
}
String type = (String) params.get("type");
wrapper.like("type", type,StringUtils.isNotBlank(type));
wrapper.like("iot_visual_material.type", type,StringUtils.isNotBlank(type));
String name = (String) params.get("name");
wrapper.like( "name", name,StringUtils.isNotBlank(name));
wrapper.like( "iot_visual_material.name", name,StringUtils.isNotBlank(name));
ArrayList ids = MapUtil.get(params, "ids",ArrayList.class);
if (ObjectUtil.isNotNull(ids)&& !ids.isEmpty()) {
wrapper.in("id", ids);
wrapper.in("iot_visual_material.id", ids);
}
wrapper.and(is_default.eq(0).or(tenant_code.eq(UserContext.getTenantCode())));
wrapper.and("( iot_visual_material.is_default = 0 or iot_visual_material.tenant_code = "+UserContext.getTenantCode()+")");
wrapper.orderBy("iot_visual_group.sort,iot_visual_group.bs_sort,iot_visual_material.sort",true);
return wrapper;
}
@ -200,7 +197,7 @@ public class IotVisualMaterialServiceImpl extends BaseServiceImpl<IotVisualMater
public Result saveBatch(IotVisualMaterialDTO[] dtos) {
try {
for (IotVisualMaterialDTO dto : dtos) {
this.saveIotSourceMaterialDTO(dto);
this.saveIotSourceMaterialDTO(dto);
}
} catch (SysException e) {
return new Result().error("批量新增失败");
@ -214,7 +211,7 @@ public class IotVisualMaterialServiceImpl extends BaseServiceImpl<IotVisualMater
QueryWrapper wrapper = new QueryWrapper();
wrapper.select(max(IOT_VISUAL_MATERIAL_ENTITY.SORT).as("sort"))
.from(IOT_VISUAL_MATERIAL_ENTITY).eq(IotVisualMaterialEntity::getGroupId,groupId);
wrapper.and(IOT_VISUAL_MATERIAL_ENTITY.TENANT_CODE.eq(tenantCode).or(IOT_VISUAL_MATERIAL_ENTITY.IS_DEFAULT.eq("1")));
wrapper.and(IOT_VISUAL_MATERIAL_ENTITY.TENANT_CODE.eq(tenantCode).or(IOT_VISUAL_MATERIAL_ENTITY.IS_DEFAULT.eq(1)));
Integer number = this.mapper.selectOneByQueryAs(wrapper,Integer.class);
if(ObjectUtils.isEmpty(number)){
return 1;
@ -305,7 +302,7 @@ public class IotVisualMaterialServiceImpl extends BaseServiceImpl<IotVisualMater
QueryWrapper wrapper = new QueryWrapper();
wrapper.eq("group_id",groupId);
wrapper.orderBy("sort",true);
wrapper.and(IOT_VISUAL_MATERIAL_ENTITY.TENANT_CODE.eq(tenantCode).or(IOT_VISUAL_MATERIAL_ENTITY.IS_DEFAULT.eq("1")));
wrapper.and(IOT_VISUAL_MATERIAL_ENTITY.TENANT_CODE.eq(tenantCode).or(IOT_VISUAL_MATERIAL_ENTITY.IS_DEFAULT.eq(1)));
return this.listAs(wrapper,ComponentSortInfo.class);
}
Loading…
Cancel
Save