From 43aab58c9ecb1203770ba382efbdbae299ca87ec Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期一, 26 十月 2026 15:12:31 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_business' into dev_business
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/energy/EnergyRecordService.java | 127 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 127 insertions(+), 0 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/energy/EnergyRecordService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/energy/EnergyRecordService.java
new file mode 100644
index 0000000..f9c6e16
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/energy/EnergyRecordService.java
@@ -0,0 +1,127 @@
+package cn.iocoder.yudao.module.mes.service.energy;
+
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.mes.controller.admin.energy.vo.*;
+import cn.iocoder.yudao.module.mes.dal.dataobject.energy.EnergyRecordDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.energy.EnergyRecordMapper;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.transaction.annotation.Transactional;
+import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
+import java.util.Set;
+import java.math.RoundingMode;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+
+@Service
+public class EnergyRecordService {
+ private static final ErrorCode NOT_EXISTS = new ErrorCode(1_040_950_000, "鑳借�楄褰曚笉瀛樺湪鎴栧凡鍒犻櫎");
+ private static final ErrorCode ID_REQUIRED = new ErrorCode(1_040_950_001, "淇敼鑳借�楄褰曞繀椤绘彁渚涚紪鍙�");
+ @Resource
+ private EnergyRecordMapper recordMapper;
+ @Resource private ApplicationEventPublisher applicationEventPublisher;
+
+ @Transactional(rollbackFor = Exception.class)
+ public Long create(EnergyRecordSaveReqVO req) {
+ EnergyRecordDO record = toRecord(req);
+ record.setId(null);
+ recordMapper.insert(record);
+ applicationEventPublisher.publishEvent(new EnergyRecordChangedEvent(TenantContextHolder.getTenantId(), Set.of(record.getRecordDate())));
+ return record.getId();
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ public void update(EnergyRecordSaveReqVO req) {
+ if (req.getId() == null) {
+ throw exception(ID_REQUIRED);
+ }
+ EnergyRecordDO old = get(req.getId());
+ if (recordMapper.updateById(toRecord(req)) == 0) {
+ throw exception(NOT_EXISTS);
+ }
+ var dates = new java.util.HashSet<>(Set.of(old.getRecordDate()));
+ dates.add(req.getRecordDate());
+ applicationEventPublisher.publishEvent(new EnergyRecordChangedEvent(TenantContextHolder.getTenantId(), Set.copyOf(dates)));
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ public void delete(Long id) {
+ EnergyRecordDO old = get(id);
+ if (recordMapper.deleteById(id) == 0) {
+ throw exception(NOT_EXISTS);
+ }
+ applicationEventPublisher.publishEvent(new EnergyRecordChangedEvent(TenantContextHolder.getTenantId(), Set.of(old.getRecordDate())));
+ }
+
+ public EnergyRecordDO get(Long id) {
+ EnergyRecordDO record = recordMapper.selectById(id);
+ if (record == null) {
+ throw exception(NOT_EXISTS);
+ }
+ return record;
+ }
+
+ public PageResult<EnergyRecordDO> page(EnergyRecordPageReqVO req) {
+ return recordMapper.selectPage(req);
+ }
+
+ static EnergyRecordDO toRecord(EnergyRecordSaveReqVO req) {
+ EnergyRecordDO record = BeanUtils.toBean(req, EnergyRecordDO.class);
+ record.setUsageArea(req.getUsageArea().trim());
+ record.setProductCategory(req.getProductCategory().trim());
+ record.setUsagePurpose(req.getUsagePurpose().trim());
+ record.setRecorder(req.getRecorder().trim());
+ // 绌哄娉ㄤ篃鍙湪淇敼鏃舵竻闄ゃ��
+ record.setRemark(req.getRemark() == null ? "" : req.getRemark().trim());
+ record.setAmount(req.getQuantity().multiply(req.getUnitPrice()).setScale(2, RoundingMode.HALF_UP));
+ return record;
+ }
+
+ public EnergyAnalysisRespVO analysis(EnergyAnalysisReqVO req) {
+ return aggregate(recordMapper.selectAnalysis(req));
+ }
+
+ static EnergyAnalysisRespVO aggregate(List<EnergyRecordMapper.Aggregate> rows) {
+ EnergyAnalysisRespVO result = new EnergyAnalysisRespVO();
+ Map<String, EnergyAnalysisRespVO.Summary> summary = new LinkedHashMap<>();
+ for (String type : List.of("WATER", "ELECTRICITY", "STEAM")) {
+ EnergyAnalysisRespVO.Summary item = new EnergyAnalysisRespVO.Summary();
+ item.setEnergyType(type);
+ summary.put(type, item);
+ }
+ Map<List<String>, EnergyAnalysisRespVO.Bucket> trend = new LinkedHashMap<>();
+ Map<List<String>, EnergyAnalysisRespVO.Bucket> areas = new LinkedHashMap<>();
+ for (EnergyRecordMapper.Aggregate row : rows) {
+ add(summary.get(row.getEnergyType()), row);
+ add(bucket(trend, row.getPeriod(), row.getEnergyType()), row);
+ add(bucket(areas, row.getUsageArea(), row.getEnergyType()), row);
+ result.setTotalAmount(result.getTotalAmount().add(row.getAmount()));
+ result.setRecordCount(result.getRecordCount() + row.getRecordCount());
+ }
+ result.setSummary(List.copyOf(summary.values()));
+ result.setTrend(List.copyOf(trend.values()));
+ result.setAreas(List.copyOf(areas.values()));
+ return result;
+ }
+
+ private static EnergyAnalysisRespVO.Bucket bucket(Map<List<String>, EnergyAnalysisRespVO.Bucket> map,
+ String label, String type) {
+ return map.computeIfAbsent(List.of(label, type), key -> {
+ EnergyAnalysisRespVO.Bucket item = new EnergyAnalysisRespVO.Bucket();
+ item.setLabel(label);
+ item.setEnergyType(type);
+ return item;
+ });
+ }
+
+ private static void add(EnergyAnalysisRespVO.Summary item, EnergyRecordMapper.Aggregate row) {
+ item.setQuantity(item.getQuantity().add(row.getQuantity()));
+ item.setAmount(item.getAmount().add(row.getAmount()));
+ item.setRecordCount(item.getRecordCount() + row.getRecordCount());
+ }
+}
--
Gitblit v1.9.3