From 7bd3972d82aee7d7bbda52a02efeb467a6601e2a Mon Sep 17 00:00:00 2001 From: z1415143022 <z1415143022@163.com> Date: 星期二, 25 三月 2025 19:13:35 +0800 Subject: [PATCH] 分项用能分析 --- zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/domain/VO/ItemizedEnergyAnalysisVO.java | 38 ++++ zhitan-admin/src/main/java/com/zhitan/web/controller/itemizedenergyanalysis/ItemizedEnergyAnalysisController.java | 37 ++++ zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfor.java | 47 ---- zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/domain/VO/ItemizedEnergyAnalysisItemVO.java | 85 +++++++++ sql/zhitan-ems_20250325182628.nb3 | 0 zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/dto/ItemizedEnergyAnalysisDTO.java | 23 ++ zhitan-common/src/main/java/com/zhitan/common/utils/PropUtils.java | 124 +++++++++++++ zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml | 3 zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/service/IItemizedEnergyAnalysisService.java | 13 + zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/service/impl/ItemizedEnergyAnalysisServiceImpl.java | 113 ++++++++++++ 10 files changed, 442 insertions(+), 41 deletions(-) diff --git a/sql/zhitan-ems_20250325182628.nb3 b/sql/zhitan-ems_20250325182628.nb3 new file mode 100644 index 0000000..6102f1e --- /dev/null +++ b/sql/zhitan-ems_20250325182628.nb3 Binary files differ diff --git a/zhitan-admin/src/main/java/com/zhitan/web/controller/itemizedenergyanalysis/ItemizedEnergyAnalysisController.java b/zhitan-admin/src/main/java/com/zhitan/web/controller/itemizedenergyanalysis/ItemizedEnergyAnalysisController.java new file mode 100644 index 0000000..c4e0ddc --- /dev/null +++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/itemizedenergyanalysis/ItemizedEnergyAnalysisController.java @@ -0,0 +1,37 @@ +package com.zhitan.web.controller.itemizedenergyanalysis; + +import com.zhitan.Itemizedenergyanalysis.domain.VO.ItemizedEnergyAnalysisVO; +import com.zhitan.Itemizedenergyanalysis.dto.ItemizedEnergyAnalysisDTO; +import com.zhitan.Itemizedenergyanalysis.service.IItemizedEnergyAnalysisService; +import com.zhitan.common.core.domain.AjaxResult; +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +import static com.zhitan.common.core.domain.AjaxResult.success; + +/** + * 鍒嗛」鐢ㄨ兘鍒嗘瀽 鎺ュ彛 + */ +@RestController +@RequestMapping("/itemizedEnergyAnalysis") +@Api(value = "鍒嗛」鐢ㄨ兘鍒嗘瀽", tags = {"鍒嗛」鐢ㄨ兘鍒嗘瀽"}) +public class ItemizedEnergyAnalysisController { + + @Autowired + private IItemizedEnergyAnalysisService itemizedEnergyAnalysisService; + + /** + * + * @param dataItem + * @return + */ + @GetMapping("list") + private AjaxResult list(ItemizedEnergyAnalysisDTO dataItem) { + ItemizedEnergyAnalysisVO list = itemizedEnergyAnalysisService.getItemizedEnergyAnalysisService(dataItem); + return success(list); + } +} \ No newline at end of file diff --git a/zhitan-common/src/main/java/com/zhitan/common/utils/PropUtils.java b/zhitan-common/src/main/java/com/zhitan/common/utils/PropUtils.java new file mode 100644 index 0000000..411b6e5 --- /dev/null +++ b/zhitan-common/src/main/java/com/zhitan/common/utils/PropUtils.java @@ -0,0 +1,124 @@ +package com.zhitan.common.utils; + +import com.alibaba.fastjson.JSONObject; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * @Description: 灞炴�у�兼搷浣滃伐鍏风被 + * @author: yxw + * @date: 2022骞�03鏈�07鏃� 9:57 + */ +public class PropUtils { + /** + * 涓哄疄浣撹祴鍊� + * + * @param obj + * @param propName + * @param value + * @return + */ + public static Object setValue(Object obj, String propName, Object value) { + try { + Field field = obj.getClass().getDeclaredField(propName); + field.setAccessible(true); + String nameTypeName = field.getType().getTypeName(); + nameTypeName = StringUtil.ifEmptyOrNullReturnValue(nameTypeName).toLowerCase(); + if (nameTypeName.contains("float")) { + float num = (float) DoubleUtil.toDouble(value); + field.set(obj, num); + } else if (nameTypeName.contains("double")) { + field.set(obj, DoubleUtil.toDouble(value)); + } else if (nameTypeName.contains("bigdecimal")) { + BigDecimal valueOf = BigDecimal.valueOf(Double.parseDouble(String.valueOf(value))) + .setScale(2, BigDecimal.ROUND_HALF_UP); + field.set(obj, valueOf); + } else { + field.set(obj, value); + } + } catch (Exception e) { + return null; + } + return obj; + } + + /** + * 鑾峰彇瀵硅薄鐨勬寚瀹氬瓧娈电殑鍊� + * + * @param obj + * @param propName + * @return + */ + public static String getPropValue(Object obj, String propName) { + String propValue = ""; + try { + if (null != obj) { + JSONObject jsonObject = StringUtil.toJsonObject(obj); + if (!StringUtil.isEmptyOrNull(propName)) { + propValue = jsonObject.getString(propName); + } + } + } catch (Exception e) { + } + return propValue; + } + + /** + * 鑾峰彇瀵硅薄鐨勬寚瀹氬瓧娈电殑绫诲瀷 + * 杩斿洖灞炴�х殑绫诲瀷瀛楃涓诧紙灏忓啓锛屼緥濡�:string/integer/double/date锛� + * + * @param obj 瀹炰綋 + * @param propName 灞炴�у悕 + * @return 锛堝皬鍐欙紝渚嬪:string/integer/double/date锛� + */ + public static String getPropType(Object obj, String propName) { + String propType = ""; + try { + if (null != obj && !StringUtil.isEmptyOrNull(propName)) { + Field[] fields = obj.getClass().getDeclaredFields(); + for (Field field : fields) { + String name = field.getName().toLowerCase(); + if (name.equals(propName.toLowerCase())) { + propType = field.getType().getSimpleName().toLowerCase(); + } + } + } + + } catch (Exception e) { + + } + return propType; + } + + /** + * 琛岃浆鍒� + * @param clazz 缁撴灉绫伙紝濡� UserInfo.class + * @param list 鏁版嵁闆� + * @return + * @param <T> + */ + public static <T> List rowToColumn(Class<T> clazz, List<T> list){ + List<List> result; + Field[] fields = clazz.getDeclaredFields(); + result = new ArrayList<>(fields.length); + for (int i = 0; i < fields.length; i++) { + result.add(new ArrayList()); + } + for (T t : list) { + for (int i = 0; i < fields.length; i++) { + List l = result.get(i); + Field field = fields[i]; + field.setAccessible(true); + try { + l.add(field.get(t)); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + return result; + } +} diff --git a/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/domain/VO/ItemizedEnergyAnalysisItemVO.java b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/domain/VO/ItemizedEnergyAnalysisItemVO.java new file mode 100644 index 0000000..3984bb6 --- /dev/null +++ b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/domain/VO/ItemizedEnergyAnalysisItemVO.java @@ -0,0 +1,85 @@ +package com.zhitan.Itemizedenergyanalysis.domain.VO; + +import com.zhitan.common.annotation.Excel; +import lombok.Data; + +/** + * + */ +@Data +public class ItemizedEnergyAnalysisItemVO { + /** + * 鑺傜偣id + */ + private String nodeId; + /** + * 鑺傜偣鍚嶇О + */ + private String nodeName; + /** + * 鍚堣 + */ + private Double total; + @Excel(name = "1鏃�/1鏃�/1鏈�") + private Double value0; + @Excel(name = "2鏃�/2鏃�/2鏈�") + private Double value1; + @Excel(name = "3鏃�/3鏃�/3鏈�") + private Double value2; + @Excel(name = "4鏃�/4鏃�/4鏈�") + private Double value3; + @Excel(name = "5鏃�/5鏃�/5鏈堟棩") + private Double value4; + @Excel(name = "6鏃�/6鏃�/6鏈堟棩") + private Double value5; + @Excel(name = "7鏃�/7鏃�/7鏈堟棩") + private Double value6; + @Excel(name = "8鏃�/8鏃�/8鏈堟棩") + private Double value7; + @Excel(name = "9鏃�/9鏃�/9鏈堟棩") + private Double value8; + @Excel(name = "10鏃�/10鏃�/10鏈堟棩") + private Double value9; + @Excel(name = "11鏃�/11鏃�/11鏈堟棩") + private Double value10; + @Excel(name = "12鏃�/12鏃�/12鏈�") + private Double value11; + @Excel(name = "13鏃�/13鏃�") + private Double value12; + @Excel(name = "14鏃�/14鏃�") + private Double value13; + @Excel(name = "15鏃�/15鏃�") + private Double value14; + @Excel(name = "16鏃�/16鏃�") + private Double value15; + @Excel(name = "17鏃�/17鏃�") + private Double value16; + @Excel(name = "18鏃�/18鏃�") + private Double value17; + @Excel(name = "19鏃�/19鏃�") + private Double value18; + @Excel(name = "20鏃�/20鏃�") + private Double value19; + @Excel(name = "21鏃�/21鏃�") + private Double value20; + @Excel(name = "22鏃�/22鏃�") + private Double value21; + @Excel(name = "23鏃�/23鏃�") + private Double value22; + @Excel(name = "24鏃�/24鏃�") + private Double value23; + @Excel(name = "25鏃�") + private Double value24; + @Excel(name = "26鏃�") + private Double value25; + @Excel(name = "27鏃�") + private Double value26; + @Excel(name = "28鏃�") + private Double value27; + @Excel(name = "29鏃�") + private Double value28; + @Excel(name = "30鏃�") + private Double value29; + @Excel(name = "31鏃�") + private Double value30; +} diff --git a/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/domain/VO/ItemizedEnergyAnalysisVO.java b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/domain/VO/ItemizedEnergyAnalysisVO.java new file mode 100644 index 0000000..1e6db62 --- /dev/null +++ b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/domain/VO/ItemizedEnergyAnalysisVO.java @@ -0,0 +1,38 @@ +package com.zhitan.Itemizedenergyanalysis.domain.VO; + +import com.zhitan.common.annotation.Excel; +import lombok.Data; + +import java.util.List; + +/** + * 鍒嗛」鐢ㄨ兘鍒嗘瀽杩斿洖绫� + * + * @author 寮� + */ +@Data +public class ItemizedEnergyAnalysisVO { + + /** + * 鍚堣 + */ + private String total; + /** + * 鏈�澶у�� + */ + private String max; + /** + * 鏈�灏忓�� + */ + private String min; + /** + * 骞冲潎鍊� + */ + private String avg; + /** + * 鍗曚綅 + */ + private String unit; + + private List<ItemizedEnergyAnalysisItemVO> dataList; +} diff --git a/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/dto/ItemizedEnergyAnalysisDTO.java b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/dto/ItemizedEnergyAnalysisDTO.java new file mode 100644 index 0000000..b161b87 --- /dev/null +++ b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/dto/ItemizedEnergyAnalysisDTO.java @@ -0,0 +1,23 @@ +package com.zhitan.Itemizedenergyanalysis.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 鍛ㄦ湡鏁版嵁椤�. + */ +@Data +public class ItemizedEnergyAnalysisDTO { + + @ApiModelProperty(value = "鏃堕棿瀛楃涓�") + private String dataTime; + + @ApiModelProperty(value = "鏃堕棿绫诲瀷") + private String timeType; + + @ApiModelProperty(value = "鑳芥簮绫诲瀷") + private String energyType; + + @ApiModelProperty(value = "鑺傜偣Id") + private String nodeId; +} diff --git a/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/service/IItemizedEnergyAnalysisService.java b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/service/IItemizedEnergyAnalysisService.java new file mode 100644 index 0000000..1c72f44 --- /dev/null +++ b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/service/IItemizedEnergyAnalysisService.java @@ -0,0 +1,13 @@ +package com.zhitan.Itemizedenergyanalysis.service; + +import com.zhitan.Itemizedenergyanalysis.domain.VO.ItemizedEnergyAnalysisVO; +import com.zhitan.Itemizedenergyanalysis.dto.ItemizedEnergyAnalysisDTO; + +public interface IItemizedEnergyAnalysisService { + /** + * 鍒嗛」鐢ㄨ兘鍒嗘瀽 + * @param dto 璇锋眰鍙傛暟 + * @return 缁撴灉 + */ + ItemizedEnergyAnalysisVO getItemizedEnergyAnalysisService(ItemizedEnergyAnalysisDTO dto); +} diff --git a/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/service/impl/ItemizedEnergyAnalysisServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/service/impl/ItemizedEnergyAnalysisServiceImpl.java new file mode 100644 index 0000000..e9d2514 --- /dev/null +++ b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/service/impl/ItemizedEnergyAnalysisServiceImpl.java @@ -0,0 +1,113 @@ +package com.zhitan.Itemizedenergyanalysis.service.impl; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.zhitan.Itemizedenergyanalysis.domain.VO.ItemizedEnergyAnalysisItemVO; +import com.zhitan.Itemizedenergyanalysis.domain.VO.ItemizedEnergyAnalysisVO; +import com.zhitan.Itemizedenergyanalysis.dto.ItemizedEnergyAnalysisDTO; +import com.zhitan.Itemizedenergyanalysis.service.IItemizedEnergyAnalysisService; +import com.zhitan.common.constant.TimeTypeConst; +import com.zhitan.common.exception.ServiceException; +import com.zhitan.common.utils.DateTimeUtil; +import com.zhitan.common.utils.PropUtils; +import com.zhitan.dataitem.service.IDataItemService; +import com.zhitan.model.domain.vo.ModelNodeIndexInfor; +import com.zhitan.model.mapper.ModelNodeMapper; +import com.zhitan.realtimedata.domain.DataItem; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.stream.Collectors; + + +/** + * 鍒嗛」鐢ㄨ兘鍒嗘瀽 + * + * @author sys + * @date 2021-01-11 + */ +@Service +@AllArgsConstructor +public class ItemizedEnergyAnalysisServiceImpl implements IItemizedEnergyAnalysisService { + + @Resource + private final ModelNodeMapper modelNodeMapper; + @Resource + private final IDataItemService dataItemService; + + /** + * @param dto 璇锋眰鍙傛暟 + * @return 缁撴灉 + */ + @Override + public ItemizedEnergyAnalysisVO getItemizedEnergyAnalysisService(ItemizedEnergyAnalysisDTO dto) { + + String timeType = dto.getTimeType(); + String dataTime = dto.getDataTime(); + Date beginTime = DateTimeUtil.getTypeTime(timeType, dataTime); + DateTime endTime = null; + + // 鑾峰彇鑺傜偣淇℃伅 + List<ModelNodeIndexInfor> nodeIndexInfo = modelNodeMapper.getModelNodeIndexIdByNodeId(dto.getNodeId(), dto.getEnergyType()); + List<String> indexList = nodeIndexInfo.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList()); + + if(ObjectUtil.isEmpty(indexList)){ + return new ItemizedEnergyAnalysisVO(); + } + + ModelNodeIndexInfor info = nodeIndexInfo.stream().findFirst().get(); + + // 鏍规嵁鏃堕棿绫诲瀷璋冩暣鏃堕棿鑼冨洿 + switch (dto.getTimeType()) { + case TimeTypeConst.TIME_TYPE_DAY: + timeType = TimeTypeConst.TIME_TYPE_HOUR; + endTime = DateUtil.endOfDay(beginTime); + break; + case TimeTypeConst.TIME_TYPE_MONTH: + timeType = TimeTypeConst.TIME_TYPE_DAY; + endTime = DateUtil.endOfMonth(beginTime); + break; + case TimeTypeConst.TIME_TYPE_YEAR: + timeType = TimeTypeConst.TIME_TYPE_MONTH; + endTime = DateUtil.endOfYear(beginTime); + break; + default: + throw new ServiceException("鏃堕棿鏍煎紡閿欒"); + } + // 鑾峰彇鏁版嵁椤瑰垪琛� + List<DataItem> dataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, timeType, indexList); + + // 鑾峰彇鏈�澶у�笺�佹渶灏忓�笺�佸悎璁°�佸钩鍧囧�� + ItemizedEnergyAnalysisVO vo = new ItemizedEnergyAnalysisVO(); + double sum = dataItemList.stream().mapToDouble(DataItem::getValue).sum(); + double max = dataItemList.stream().mapToDouble(DataItem::getValue).max().getAsDouble(); + double min = dataItemList.stream().mapToDouble(DataItem::getValue).min().getAsDouble(); + double avg = dataItemList.stream().mapToDouble(DataItem::getValue).average().getAsDouble(); + + vo.setTotal(BigDecimal.valueOf(sum).setScale(2, RoundingMode.HALF_UP).toString()); + vo.setMax(BigDecimal.valueOf(max).setScale(2, RoundingMode.HALF_UP).toString()); + vo.setMin(BigDecimal.valueOf(min).setScale(2, RoundingMode.HALF_UP).toString()); + vo.setAvg(BigDecimal.valueOf(avg).setScale(2, RoundingMode.HALF_UP).toString()); + if(ObjectUtil.isNotEmpty(info.getUnitId())){ + vo.setUnit(info.getUnitId()); + } + + List<ItemizedEnergyAnalysisItemVO> voList = new ArrayList<>(); + ItemizedEnergyAnalysisItemVO itemVO = new ItemizedEnergyAnalysisItemVO(); + itemVO.setNodeId(info.getNodeId()); + itemVO.setNodeName(info.getName()); + itemVO.setTotal(sum); + for (int i = 0; i < dataItemList.size(); i++) { + PropUtils.setValue(itemVO,"value"+ i, dataItemList.get(i).getValue()); + } + voList.add(itemVO); + vo.setDataList(voList); + + return vo; + } +} diff --git a/zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfor.java b/zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfor.java index e52a163..559f6c3 100644 --- a/zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfor.java +++ b/zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfor.java @@ -2,6 +2,7 @@ import com.zhitan.common.core.domain.BaseEntity; +import lombok.Data; /** * 妯″瀷鑺傜偣涓庣偣浣嶅叧绯诲璞� @@ -9,6 +10,7 @@ * @Author: Zhujw * @Date: 2023/3/2 */ +@Data public class ModelNodeIndexInfor extends BaseEntity { private static final long serialVersionUID = 1L; @@ -32,45 +34,10 @@ */ private String energyId; + /** + * 鍗曚綅 + */ + private String unitId; + private String indexType; - - public String getNodeId() { - return nodeId; - } - - public void setNodeId(String nodeId) { - this.nodeId = nodeId; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getIndexId() { - return indexId; - } - - public void setIndexId(String indexId) { - this.indexId = indexId; - } - - public String getEnergyId() { - return energyId; - } - - public void setEnergyId(String energyId) { - this.energyId = energyId; - } - - public String getIndexType() { - return indexType; - } - - public void setIndexType(String indexType) { - this.indexType = indexType; - } } diff --git a/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml b/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml index f0fe5ef..5d222b3 100644 --- a/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml +++ b/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml @@ -385,7 +385,8 @@ mn."name" "name", ni.index_id indexId, ei.energy_id energyId, - ei.index_type indexType + ei.index_type indexType, + ei.unit_id unitId FROM "model_node" mn LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id LEFT JOIN energy_index ei on ni.index_id = ei.index_id -- Gitblit v1.9.3