增加抄表记录按天统计报表

This commit is contained in:
2023-11-16 09:51:00 +08:00
parent fd3ff2616a
commit 670b0123a7
9 changed files with 349 additions and 2 deletions

View File

@@ -0,0 +1,62 @@
package cn.lihongjie.coal.meterDayLog.controller;
import cn.lihongjie.coal.annotation.OrgScope;
import cn.lihongjie.coal.annotation.SysLog;
import cn.lihongjie.coal.base.dto.CommonQuery;
import cn.lihongjie.coal.base.dto.IdRequest;
import cn.lihongjie.coal.meterDayLog.dto.CreateMeterDayLogDto;
import cn.lihongjie.coal.meterDayLog.dto.MeterDayLogDto;
import cn.lihongjie.coal.meterDayLog.dto.UpdateMeterDayLogDto;
import cn.lihongjie.coal.meterDayLog.service.MeterDayLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/meterDayLog")
@SysLog(
module = "水电表抄表记录按天统计"
)
@Slf4j
@OrgScope
public class MeterDayLogController {
@Autowired
private MeterDayLogService service;
@PostMapping("/create")
public MeterDayLogDto create(@RequestBody CreateMeterDayLogDto request) {
return this.service.create(request)
;
}
@PostMapping("/update")
public MeterDayLogDto update(@RequestBody UpdateMeterDayLogDto request) {
return this.service.update(request)
;
}
@PostMapping("/delete")
public Object delete(@RequestBody IdRequest request) {
this.service.delete(request);
return true
;
}
@PostMapping("/getById")
public MeterDayLogDto getById(@RequestBody IdRequest request) {
return this.service.getById(request.getId())
;
}
@PostMapping("/list")
public Page<MeterDayLogDto> list(@RequestBody CommonQuery request) {
return this.service.list(request)
;
}
}

View File

@@ -0,0 +1,24 @@
package cn.lihongjie.coal.meterDayLog.dto;
import cn.lihongjie.coal.base.dto.OrgCommonDto;
import lombok.Data;
import org.hibernate.annotations.Comment;
@Data
public class CreateMeterDayLogDto extends OrgCommonDto {
private String meter;
@Comment("抄表月份")
private java.time.LocalDate time;
@Comment("抄表值")
private java.lang.Double value;
@Comment("上次抄表值")
private java.lang.Double previousValue;
@Comment("使用量")
private java.lang.Double usage;
}

View File

@@ -0,0 +1,25 @@
package cn.lihongjie.coal.meterDayLog.dto;
import cn.lihongjie.coal.base.dto.OrgCommonDto;
import cn.lihongjie.coal.meter.dto.MeterDto;
import lombok.Data;
import org.hibernate.annotations.Comment;
@Data
public class MeterDayLogDto extends OrgCommonDto {
private MeterDto meter;
@Comment("抄表月份")
private java.time.LocalDate time;
@Comment("抄表值")
private java.lang.Double value;
@Comment("上次抄表值")
private java.lang.Double previousValue;
@Comment("使用量")
private java.lang.Double usage;
}

View File

@@ -0,0 +1,24 @@
package cn.lihongjie.coal.meterDayLog.dto;
import cn.lihongjie.coal.base.dto.OrgCommonDto;
import lombok.Data;
import org.hibernate.annotations.Comment;
@Data
public class UpdateMeterDayLogDto extends OrgCommonDto {
private String meter;
@Comment("抄表月份")
private java.time.LocalDate time;
@Comment("抄表值")
private java.lang.Double value;
@Comment("上次抄表值")
private java.lang.Double previousValue;
@Comment("使用量")
private java.lang.Double usage;
}

View File

@@ -0,0 +1,30 @@
package cn.lihongjie.coal.meterDayLog.entity;
import cn.lihongjie.coal.base.entity.OrgCommonEntity;
import jakarta.persistence.Entity;
import jakarta.persistence.ManyToOne;
import lombok.Data;
import org.hibernate.annotations.Comment;
@Data
@Entity
public class MeterDayLogEntity extends OrgCommonEntity {
@ManyToOne
private cn.lihongjie.coal.meter.entity.MeterEntity meter;
@Comment("抄表月份")
private java.time.LocalDate time;
@Comment("抄表值")
private java.lang.Double value;
@Comment("上次抄表值")
private java.lang.Double previousValue;
@Comment("使用量")
private java.lang.Double usage;
}

View File

@@ -0,0 +1,19 @@
package cn.lihongjie.coal.meterDayLog.mapper;
import cn.lihongjie.coal.base.mapper.BaseMapper;
import cn.lihongjie.coal.base.mapper.CommonMapper;
import cn.lihongjie.coal.meterDayLog.dto.CreateMeterDayLogDto;
import cn.lihongjie.coal.meterDayLog.dto.MeterDayLogDto;
import cn.lihongjie.coal.meterDayLog.dto.UpdateMeterDayLogDto;
import cn.lihongjie.coal.meterDayLog.entity.MeterDayLogEntity;
import org.mapstruct.Mapper;
import org.mapstruct.control.DeepClone;
@Mapper(
componentModel = org.mapstruct.MappingConstants.ComponentModel.SPRING,
uses = {CommonMapper.class},
mappingControl = DeepClone.class
)
public interface MeterDayLogMapper extends BaseMapper<MeterDayLogEntity, MeterDayLogDto, CreateMeterDayLogDto, UpdateMeterDayLogDto> {
}

View File

@@ -0,0 +1,14 @@
package cn.lihongjie.coal.meterDayLog.repository;
import cn.lihongjie.coal.base.dao.BaseRepository;
import cn.lihongjie.coal.meter.entity.MeterEntity;
import cn.lihongjie.coal.meterDayLog.entity.MeterDayLogEntity;
import org.springframework.stereotype.Repository;
import java.time.LocalDate;
@Repository
public interface MeterDayLogRepository extends BaseRepository<MeterDayLogEntity> {
void deleteByMeterAndTimeGreaterThanEqual(MeterEntity meter, LocalDate localDate);
}

View File

@@ -0,0 +1,146 @@
package cn.lihongjie.coal.meterDayLog.service;
import cn.lihongjie.coal.base.dto.CommonQuery;
import cn.lihongjie.coal.base.dto.IdRequest;
import cn.lihongjie.coal.base.service.BaseService;
import cn.lihongjie.coal.meter.entity.MeterEntity;
import cn.lihongjie.coal.meterDayLog.dto.CreateMeterDayLogDto;
import cn.lihongjie.coal.meterDayLog.dto.MeterDayLogDto;
import cn.lihongjie.coal.meterDayLog.dto.UpdateMeterDayLogDto;
import cn.lihongjie.coal.meterDayLog.entity.MeterDayLogEntity;
import cn.lihongjie.coal.meterDayLog.mapper.MeterDayLogMapper;
import cn.lihongjie.coal.meterDayLog.repository.MeterDayLogRepository;
import cn.lihongjie.coal.meterMonthLog.service.MeterMonthLogService;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.Query;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.ConversionService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Service
@Slf4j
public class MeterDayLogService extends BaseService<MeterDayLogEntity, MeterDayLogRepository> {
@Autowired MeterMonthLogService meterMonthLogService;
@Autowired
private MeterDayLogRepository repository;
@Autowired
private MeterDayLogMapper mapper;
@Autowired
private ConversionService conversionService;
@PersistenceContext
private EntityManager entityManager;
public MeterDayLogDto create(CreateMeterDayLogDto request) {
MeterDayLogEntity entity = mapper.toEntity(request);
this.repository.save(entity);
return getById(entity.getId())
;
}
public MeterDayLogDto update(UpdateMeterDayLogDto request) {
MeterDayLogEntity entity = this.repository.get(request.getId());
this.mapper.updateEntity(entity, request);
this.repository.save(entity);
return getById(entity.getId())
;
}
public void delete(IdRequest request) {
this.repository.deleteAllById(request.getIds())
;
}
public MeterDayLogDto getById(String id) {
MeterDayLogEntity entity = repository.get(id);
return mapper.toDto(entity)
;
}
public Page<MeterDayLogDto> list(CommonQuery query) {
Page<MeterDayLogEntity> page = repository.findAll(query.specification(conversionService), PageRequest.of(query.getPageNo(), query.getPageSize(), Sort.by(query.getOrders())));
return page.map(this.mapper::toDto)
;
}
public void syncMeter(String meterId, LocalDateTime time) {
MeterEntity meter = new MeterEntity();
meter.setId(meterId);
repository.deleteByMeterAndTimeGreaterThanEqual(meter, time.toLocalDate());
Query nativeQuery =
entityManager.createNativeQuery(
"""
select cast(DATE_TRUNC('day', time) as date) as time,
meter_id,
sum(usage) as value
from t_meter_log
where meter_id = :meterId and time >= :time group by cast(DATE_TRUNC('day', time) as date), meter_id
""");
nativeQuery.setParameter("meterId", meterId);
nativeQuery.setParameter("time", time);
nativeQuery
.getResultList()
.forEach(
o -> {
Object[] result = (Object[]) o;
MeterDayLogEntity entity = new MeterDayLogEntity();
entity.setMeter(meter);
entity.setTime(conversionService.convert(result[0], LocalDate.class));
entity.setValue((Double) result[2]);
repository.save(entity);
});
Query nativeQuery2 =
entityManager.createNativeQuery(
"""
update t_meter_day_log ta
set previous_value = tb.previous_value,
usage = ta.value - tb.previous_value
from (
select id, time, value, COALESCE(lag(value) over (order by time), value ) as previous_value from t_meter_day_log where meter_id = :meterId and time >=:time
) tb
where tb.id = ta.id
""");
nativeQuery2.setParameter("meterId", meterId);
nativeQuery2.setParameter("time", time.toLocalDate());
nativeQuery2.executeUpdate();
meterMonthLogService.syncMeter(meterId, time);
}
}

View File

@@ -3,6 +3,7 @@ package cn.lihongjie.coal.meterLog.service;
import cn.lihongjie.coal.base.dto.CommonQuery;
import cn.lihongjie.coal.base.dto.IdRequest;
import cn.lihongjie.coal.base.service.BaseService;
import cn.lihongjie.coal.meterDayLog.service.MeterDayLogService;
import cn.lihongjie.coal.meterLog.dto.CreateMeterLogDto;
import cn.lihongjie.coal.meterLog.dto.MeterLogDto;
import cn.lihongjie.coal.meterLog.dto.UpdateMeterLogDto;
@@ -92,6 +93,8 @@ public class MeterLogService extends BaseService<MeterLogEntity, MeterLogReposit
@Autowired MeterMonthLogService meterMonthLogService;
@Autowired MeterDayLogService meterDayLogService;
public void syncMeterLog(String meterId, LocalDateTime time) {
log.info("syncMeterLog {} {} 开始同步", meterId, time);
@@ -125,9 +128,9 @@ public class MeterLogService extends BaseService<MeterLogEntity, MeterLogReposit
stopWatch.stop();
stopWatch.start("syncMeterMonthLog");
stopWatch.start("syncMeterDayLog");
meterMonthLogService.syncMeter(meterId, time);
meterDayLogService.syncMeter(meterId, time);
stopWatch.stop();
log.info("syncMeterLog {} 更新了 {} 条数据\n {}", meterId, count, stopWatch.prettyPrint());