From ea5366e3995e2a1679ca9867795fbeb9d3b4c1f4 Mon Sep 17 00:00:00 2001 From: z1415143022 <z1415143022@163.com> Date: 星期二, 25 三月 2025 20:22:34 +0800 Subject: [PATCH] Merge pull request #32 from Andy-Yin/zhangjw --- 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 | 36 ++++ zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfo.java | 6 zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfor.java | 43 ++++ 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 ++++++++++++ 11 files changed, 481 insertions(+), 3 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..80badb9 --- /dev/null +++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/itemizedenergyanalysis/ItemizedEnergyAnalysisController.java @@ -0,0 +1,36 @@ +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..6b8fb0d --- /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.ModelNodeIndexInfo; +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 2025-03-25 + */ +@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<ModelNodeIndexInfo> nodeIndexInfo = modelNodeMapper.getModelNodeIndexIdByNodeId(dto.getNodeId(), dto.getEnergyType()); + List<String> indexList = nodeIndexInfo.stream().map(ModelNodeIndexInfo::getIndexId).collect(Collectors.toList()); + + if(ObjectUtil.isEmpty(indexList)){ + return new ItemizedEnergyAnalysisVO(); + } + + ModelNodeIndexInfo 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/ModelNodeIndexInfo.java b/zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfo.java index a99de97..cd2b19c 100644 --- a/zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfo.java +++ b/zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfo.java @@ -38,7 +38,6 @@ * 鍚嶇О */ private String nodeName; - /** * 鐐逛綅id */ @@ -60,5 +59,8 @@ * 鐐逛綅绫诲瀷 */ private String indexType; - + /** + * 鍗曚綅 + */ + private String unitId; } 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 new file mode 100644 index 0000000..559f6c3 --- /dev/null +++ b/zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfor.java @@ -0,0 +1,43 @@ +package com.zhitan.model.domain.vo; + + +import com.zhitan.common.core.domain.BaseEntity; +import lombok.Data; + +/** + * 妯″瀷鑺傜偣涓庣偣浣嶅叧绯诲璞� + * + * @Author: Zhujw + * @Date: 2023/3/2 + */ +@Data +public class ModelNodeIndexInfor extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 涓婚敭 + */ + private String nodeId; + + /** + * 鍚嶇О + */ + private String name; + + /** + * 鐐逛綅id + */ + private String indexId; + + /** + * 鑳芥簮绫诲瀷 + */ + private String energyId; + + /** + * 鍗曚綅 + */ + private String unitId; + + private String indexType; +} diff --git a/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml b/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml index ab63dde..eb7fbde 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