diff --git a/src/main/java/cn/lihongjie/coal/meterDayLog/controller/MeterDayLogController.java b/src/main/java/cn/lihongjie/coal/meterDayLog/controller/MeterDayLogController.java new file mode 100644 index 00000000..e1fb8442 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/meterDayLog/controller/MeterDayLogController.java @@ -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 list(@RequestBody CommonQuery request) { + return this.service.list(request) + ; + } +} diff --git a/src/main/java/cn/lihongjie/coal/meterDayLog/dto/CreateMeterDayLogDto.java b/src/main/java/cn/lihongjie/coal/meterDayLog/dto/CreateMeterDayLogDto.java new file mode 100644 index 00000000..455b17e2 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/meterDayLog/dto/CreateMeterDayLogDto.java @@ -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; +} diff --git a/src/main/java/cn/lihongjie/coal/meterDayLog/dto/MeterDayLogDto.java b/src/main/java/cn/lihongjie/coal/meterDayLog/dto/MeterDayLogDto.java new file mode 100644 index 00000000..34853a5a --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/meterDayLog/dto/MeterDayLogDto.java @@ -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; +} diff --git a/src/main/java/cn/lihongjie/coal/meterDayLog/dto/UpdateMeterDayLogDto.java b/src/main/java/cn/lihongjie/coal/meterDayLog/dto/UpdateMeterDayLogDto.java new file mode 100644 index 00000000..b9edc7c3 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/meterDayLog/dto/UpdateMeterDayLogDto.java @@ -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; +} diff --git a/src/main/java/cn/lihongjie/coal/meterDayLog/entity/MeterDayLogEntity.java b/src/main/java/cn/lihongjie/coal/meterDayLog/entity/MeterDayLogEntity.java new file mode 100644 index 00000000..8583b296 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/meterDayLog/entity/MeterDayLogEntity.java @@ -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; +} diff --git a/src/main/java/cn/lihongjie/coal/meterDayLog/mapper/MeterDayLogMapper.java b/src/main/java/cn/lihongjie/coal/meterDayLog/mapper/MeterDayLogMapper.java new file mode 100644 index 00000000..efcd87b6 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/meterDayLog/mapper/MeterDayLogMapper.java @@ -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 { +} diff --git a/src/main/java/cn/lihongjie/coal/meterDayLog/repository/MeterDayLogRepository.java b/src/main/java/cn/lihongjie/coal/meterDayLog/repository/MeterDayLogRepository.java new file mode 100644 index 00000000..12b9485d --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/meterDayLog/repository/MeterDayLogRepository.java @@ -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 { + void deleteByMeterAndTimeGreaterThanEqual(MeterEntity meter, LocalDate localDate); +} diff --git a/src/main/java/cn/lihongjie/coal/meterDayLog/service/MeterDayLogService.java b/src/main/java/cn/lihongjie/coal/meterDayLog/service/MeterDayLogService.java new file mode 100644 index 00000000..8504417b --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/meterDayLog/service/MeterDayLogService.java @@ -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 { + @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 list(CommonQuery query) { + Page 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); + + } +} diff --git a/src/main/java/cn/lihongjie/coal/meterLog/service/MeterLogService.java b/src/main/java/cn/lihongjie/coal/meterLog/service/MeterLogService.java index 90f7b000..5c2b3a70 100644 --- a/src/main/java/cn/lihongjie/coal/meterLog/service/MeterLogService.java +++ b/src/main/java/cn/lihongjie/coal/meterLog/service/MeterLogService.java @@ -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