From 09a3c924c7092f4cad5b3f922a4a362cfcb84f7d Mon Sep 17 00:00:00 2001 From: maxiangong <298222784@qq.com> Date: Fri, 17 Apr 2026 17:35:32 +0800 Subject: [PATCH] =?UTF-8?q?=E8=83=BD=E8=80=97=E7=AE=A1=E7=90=86=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/service/IWorkCenterService.java | 7 + .../service/impl/WorkCenterServiceImpl.java | 8 + .../controller/BsEnergyCoreUseController.java | 76 ++++ .../controller/BsEnergyMonitorController.java | 190 +++++++--- .../controller/BsEnergyQuotaController.java | 325 ++++++++++++++---- .../controller/BsEnergyTargetController.java | 299 +++++++++++----- .../BsPeakFlatValleyController.java | 109 +++--- .../excel/BsEnergyQuotaElectricExcel.java | 60 ++++ .../BsEnergyQuotaElectricImportExcel.java | 48 +++ ...xcel.java => BsEnergyQuotaWaterExcel.java} | 68 ++-- .../excel/BsEnergyQuotaWaterImportExcel.java | 92 +++++ ....java => BsEnergyTargetElectricExcel.java} | 71 ++-- .../excel/BsEnergyTargetWaterExcel.java | 71 ++++ .../energy/mapper/BsEnergyCoreUseMapper.java | 26 ++ .../mapper/BsEnergyHistoryRecMapper.java | 35 ++ .../energy/mapper/BsEnergyQuotaMapper.java | 4 +- .../energy/mapper/BsEnergyTargetMapper.java | 12 +- .../energy/mapper/EnergyCoreUseMapper.xml | 59 ++++ .../energy/mapper/EnergyHistoryRecMapper.xml | 66 ++++ .../energy/mapper/EnergyMonitorMapper.xml | 8 +- .../desk/energy/mapper/EnergyQuotaMapper.xml | 22 +- .../desk/energy/mapper/EnergyTargetMapper.xml | 44 ++- .../energy/mapper/PeakFlatValleyMapper.xml | 8 +- .../pojo/entity/BsEnergyCoreUseEntity.java | 110 ++++++ .../pojo/entity/BsEnergyHistoryRecEntity.java | 54 +++ .../pojo/entity/BsEnergyMonitorEntity.java | 5 +- .../pojo/entity/BsEnergyQuotaEntity.java | 13 +- .../pojo/entity/BsEnergyTargetEntity.java | 14 +- .../pojo/entity/BsPeakFlatValleyEntity.java | 2 +- .../energy/pojo/vo/BsEnergyCoreUseVO.java | 41 +++ .../energy/pojo/vo/BsEnergyHistoryRecVO.java | 38 ++ .../service/IBsEnergyCoreUseService.java | 36 ++ .../service/IBsEnergyHistoryRecService.java | 33 ++ .../energy/service/IBsEnergyQuotaService.java | 4 +- .../service/IBsEnergyTargetService.java | 67 ++-- .../impl/BsEnergyCoreUseServiceImpl.java | 287 ++++++++++++++++ .../impl/BsEnergyHistoryRecServiceImpl.java | 31 ++ .../impl/BsEnergyQuotaServiceImpl.java | 6 +- .../impl/BsEnergyTargetServiceImpl.java | 12 +- .../resources/Excel/energy/用水定额.xls | Bin 0 -> 20480 bytes .../resources/Excel/energy/用水目标.xls | Bin 0 -> 20480 bytes .../resources/Excel/energy/用电定额.xls | Bin 0 -> 20480 bytes .../resources/Excel/energy/用电目标.xls | Bin 0 -> 20480 bytes 43 files changed, 2050 insertions(+), 411 deletions(-) create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyCoreUseController.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaElectricExcel.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaElectricImportExcel.java rename blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/{BsEnergyQuotaExcel.java => BsEnergyQuotaWaterExcel.java} (65%) create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaWaterImportExcel.java rename blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/{BsEnergyTargetExcel.java => BsEnergyTargetElectricExcel.java} (67%) create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyTargetWaterExcel.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/BsEnergyCoreUseMapper.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/BsEnergyHistoryRecMapper.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyCoreUseMapper.xml create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyHistoryRecMapper.xml create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyCoreUseEntity.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyHistoryRecEntity.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/vo/BsEnergyCoreUseVO.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/vo/BsEnergyHistoryRecVO.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEnergyCoreUseService.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEnergyHistoryRecService.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEnergyCoreUseServiceImpl.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEnergyHistoryRecServiceImpl.java create mode 100644 blade-service/blade-desk/src/main/resources/Excel/energy/用水定额.xls create mode 100644 blade-service/blade-desk/src/main/resources/Excel/energy/用水目标.xls create mode 100644 blade-service/blade-desk/src/main/resources/Excel/energy/用电定额.xls create mode 100644 blade-service/blade-desk/src/main/resources/Excel/energy/用电目标.xls diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IWorkCenterService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IWorkCenterService.java index 8c3f0d88..348c02eb 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IWorkCenterService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IWorkCenterService.java @@ -64,4 +64,11 @@ public interface IWorkCenterService extends BaseService { * @return BsWorkCenterEntity 对象 */ WorkCenter getWorkCenter(Long workCenterId); + + /** + * 根据作业中心编码查找作业中心 + * @param wcCode + * @return + */ + WorkCenter getWorkCenterByCode(String wcCode); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/WorkCenterServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/WorkCenterServiceImpl.java index cfd3cbd6..6d9f4d00 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/WorkCenterServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/WorkCenterServiceImpl.java @@ -4,6 +4,7 @@ package org.springblade.desk.basic.service.impl; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -124,4 +125,11 @@ public class WorkCenterServiceImpl extends BaseServiceImpl qw = new LambdaQueryWrapper().eq(WorkCenter::getWcCode, wcCode); + WorkCenter center = this.getOne(qw); + return center; + } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyCoreUseController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyCoreUseController.java new file mode 100644 index 00000000..27748ec7 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyCoreUseController.java @@ -0,0 +1,76 @@ +package org.springblade.desk.energy.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.mp.support.Condition; +import org.springblade.core.mp.support.Query; +import org.springblade.core.tool.api.R; +import org.springblade.desk.energy.pojo.entity.BsEnergyCoreUseEntity; +import org.springblade.desk.energy.pojo.vo.BsEnergyCoreUseVO; +import org.springblade.desk.energy.pojo.vo.BsEnergyHistoryRecVO; +import org.springblade.desk.energy.service.IBsEnergyCoreUseService; +import org.springblade.desk.energy.service.IBsEnergyHistoryRecService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 水电能耗记录 控制器 + * + * @author BladeX + * @since 2026-04-17 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/bsEnergyCoreUse") +@Tag(name = "水电能耗记录", description = "水电能耗记录接口") +public class BsEnergyCoreUseController extends BladeController { + + private final IBsEnergyCoreUseService bsEnergyCoreUseService; + + private final IBsEnergyHistoryRecService bsEnergyHistoryRecService; + + /** + * 水电能耗记录 自定义分页 + */ + @GetMapping("/page") + @Operation(summary = "分页", description = "传入bsEnergyQuota") + public R> page(BsEnergyCoreUseVO bsEnergyCoreUse, Query query) { + IPage pages = bsEnergyCoreUseService.selectBsEnergyCoreUsePage(Condition.getPage(query), bsEnergyCoreUse); + return R.data(pages); + } + + /** + * 能源定额 新增或修改 + */ + @PostMapping("/updateIsJumbotron") + @Operation(summary = "新增或修改", description = "传入bsEnergyQuota") + public R updateIsJumbotron(@Valid @RequestBody BsEnergyCoreUseEntity bsEnergyCoreUse) { + if (bsEnergyCoreUse.getId() == null || bsEnergyCoreUse.getIsJumbotron() == null) { + R.fail("修改失败"); + } + BsEnergyCoreUseEntity upd = new BsEnergyCoreUseEntity(); + upd.setId(bsEnergyCoreUse.getId()); + upd.setIsJumbotron(bsEnergyCoreUse.getIsJumbotron()); + return R.status(bsEnergyCoreUseService.updateById(upd)); + } + + + @GetMapping("/detail") + @Operation(summary = "详情", description = "传入bsEnergyQuota") + public R> detail(BsEnergyCoreUseEntity bsEnergyCoreUse) { + BsEnergyCoreUseEntity bsEnergyCoreUseEntity = bsEnergyCoreUseService.getById(bsEnergyCoreUse.getId()); + if (bsEnergyCoreUseEntity == null) { + R.fail("明细查询失败"); + } + BsEnergyHistoryRecVO params = new BsEnergyHistoryRecVO(); + params.setCreateTime(bsEnergyCoreUseEntity.getCreateTime()); + List list = bsEnergyHistoryRecService.selectBsEnergyHistoryRec(params); + return R.data(list); + } + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyMonitorController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyMonitorController.java index e85733bb..ebbb8456 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyMonitorController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyMonitorController.java @@ -25,6 +25,7 @@ */ package org.springblade.desk.energy.controller; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.v3.oas.annotations.Operation; @@ -44,11 +45,15 @@ import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; import org.springblade.desk.energy.excel.BsEnergyMonitorExcel; import org.springblade.desk.energy.pojo.entity.BsEnergyMonitorEntity; +import org.springblade.desk.energy.pojo.entity.BsEnergyTargetEntity; import org.springblade.desk.energy.pojo.vo.BsEnergyMonitorVO; import org.springblade.desk.energy.service.IBsEnergyMonitorService; +import org.springblade.desk.energy.service.IBsEnergyTargetService; import org.springblade.desk.energy.wrapper.BsEnergyMonitorWrapper; import org.springframework.web.bind.annotation.*; +import java.math.RoundingMode; +import java.time.YearMonth; import java.util.List; import java.util.Map; @@ -64,68 +69,139 @@ import java.util.Map; @Tag(name = "能源监控表", description = "能源监控表接口") public class BsEnergyMonitorController extends BladeController { - private final IBsEnergyMonitorService bsEnergyMonitorService; + private final IBsEnergyMonitorService bsEnergyMonitorService; - /** - * 能源监控表 详情 - */ - @GetMapping("/detail") - @Operation(summary = "详情", description = "传入bsEnergyMonitor") - public R detail(BsEnergyMonitorEntity bsEnergyMonitor) { - BsEnergyMonitorEntity detail = bsEnergyMonitorService.getOne(Condition.getQueryWrapper(bsEnergyMonitor)); - return R.data(BsEnergyMonitorWrapper.build().entityVO(detail)); - } + private final IBsEnergyTargetService bsEnergyTargetService; - /** - * 能源监控表 自定义分页 - */ - @GetMapping("/page") - @Operation(summary = "分页", description = "传入bsEnergyMonitor") - public R> page(BsEnergyMonitorVO bsEnergyMonitor, Query query) { - IPage pages = bsEnergyMonitorService.selectBsEnergyMonitorPage(Condition.getPage(query), bsEnergyMonitor); - return R.data(pages); - } + /** + * 能源监控表 详情 + */ + @GetMapping("/detail") + @Operation(summary = "详情", description = "传入bsEnergyMonitor") + public R detail(BsEnergyMonitorEntity bsEnergyMonitor) { + BsEnergyMonitorEntity detail = bsEnergyMonitorService.getOne(Condition.getQueryWrapper(bsEnergyMonitor)); + return R.data(BsEnergyMonitorWrapper.build().entityVO(detail)); + } - /** - * 能源监控表 新增或修改 - */ - @PostMapping("/submit") - @Operation(summary = "新增或修改", description = "传入bsEnergyMonitor") - public R submit(@Valid @RequestBody BsEnergyMonitorEntity bsEnergyMonitor) { - if (bsEnergyMonitor.getId() == null) { - // 新增需要校验 - BsEnergyMonitorEntity bsEnergyMonitorEntity = bsEnergyMonitorService.getOne(new QueryWrapper().eq("month", bsEnergyMonitor.getMonth())); - if (bsEnergyMonitorEntity != null) { - return R.fail("该月份能源监控表已存在"); - } - } - bsEnergyMonitor.setLastWaterRate(bsEnergyMonitor.getLastWater().divide(bsEnergyMonitor.getLastWaterTarget(), 2)); - bsEnergyMonitor.setLastElectricRate(bsEnergyMonitor.getLastElectric().divide(bsEnergyMonitor.getLastElectricTarget(), 2)); - bsEnergyMonitor.setCurrentWaterRate(bsEnergyMonitor.getCurrentWater().divide(bsEnergyMonitor.getCurrentWaterTarget(), 2)); - bsEnergyMonitor.setCurrentElectricRate(bsEnergyMonitor.getCurrentElectric().divide(bsEnergyMonitor.getCurrentElectricTarget(), 2)); - return R.status(bsEnergyMonitorService.saveOrUpdate(bsEnergyMonitor)); - } + /** + * 能源监控表 自定义分页 + */ + @GetMapping("/page") + @Operation(summary = "分页", description = "传入bsEnergyMonitor") + public R> page(BsEnergyMonitorVO bsEnergyMonitor, Query query) { + IPage pages = bsEnergyMonitorService.selectBsEnergyMonitorPage(Condition.getPage(query), bsEnergyMonitor); + return R.data(pages); + } - /** - * 能源监控表 删除 - */ - @PostMapping("/remove") - @Operation(summary = "逻辑删除", description = "传入ids") - public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { - return R.status(bsEnergyMonitorService.deleteLogic(Func.toLongList(ids))); - } + /** + * 能源监控表 新增或修改 + */ + @PostMapping("/submit") + @Operation(summary = "新增或修改", description = "传入bsEnergyMonitor") + public R submit(@Valid @RequestBody List bsEnergyMonitorList) { + for (BsEnergyMonitorEntity bsEnergyMonitor : bsEnergyMonitorList) { + BsEnergyMonitorEntity exist = bsEnergyMonitorService.getOne(new QueryWrapper().eq("month", bsEnergyMonitor.getMonth())); + if (exist != null && !exist.getId().equals(bsEnergyMonitor.getId())) { + return R.fail(bsEnergyMonitor.getMonth() + "月份能源监控表已存在"); + } + if(bsEnergyMonitor.getLastWater() != null && bsEnergyMonitor.getLastOutput() != null){ + bsEnergyMonitor.setLastWaterRate(bsEnergyMonitor.getLastWater().divide(bsEnergyMonitor.getLastOutput(), 6, RoundingMode.HALF_UP)); + } + if(bsEnergyMonitor.getLastElectric() != null && bsEnergyMonitor.getLastOutput() != null){ + bsEnergyMonitor.setLastElectricRate(bsEnergyMonitor.getLastElectric().divide(bsEnergyMonitor.getLastOutput(), 6, RoundingMode.HALF_UP)); + } + if(bsEnergyMonitor.getCurrentWater() != null && bsEnergyMonitor.getCurrentOutput() != null){ + bsEnergyMonitor.setCurrentWaterRate(bsEnergyMonitor.getCurrentWater().divide(bsEnergyMonitor.getCurrentOutput(), 6, RoundingMode.HALF_UP)); + } + if(bsEnergyMonitor.getCurrentElectric() != null && bsEnergyMonitor.getCurrentOutput() != null){ + bsEnergyMonitor.setCurrentElectricRate(bsEnergyMonitor.getCurrentElectric().divide(bsEnergyMonitor.getCurrentOutput(), 6, RoundingMode.HALF_UP)); + } + } + return R.status(bsEnergyMonitorService.saveOrUpdateBatch(bsEnergyMonitorList)); + } + /** + * 能源监控表 删除 + */ + @PostMapping("/remove") + @Operation(summary = "逻辑删除", description = "传入ids") + public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { + return R.status(bsEnergyMonitorService.deleteLogic(Func.toLongList(ids))); + } - /** - * 导出数据 - */ - @IsAdmin - @GetMapping("/export-bsEnergyMonitor") - @Operation(summary = "导出数据", description = "传入bsEnergyMonitor") - public void exportBsEnergyMonitor(@Parameter(hidden = true) @RequestParam Map bsEnergyMonitor, BladeUser bladeUser, HttpServletResponse response) { - QueryWrapper queryWrapper = Condition.getQueryWrapper(bsEnergyMonitor, BsEnergyMonitorEntity.class); - List list = bsEnergyMonitorService.exportBsEnergyMonitor(queryWrapper); - ExcelUtil.export(response, "能源监控表数据" + DateUtil.time(), "能源监控表数据表", list, BsEnergyMonitorExcel.class); - } + /** + * 导出数据 + */ + @IsAdmin + @GetMapping("/export-bsEnergyMonitor") + @Operation(summary = "导出数据", description = "传入bsEnergyMonitor") + public void exportBsEnergyMonitor(@Parameter(hidden = true) @RequestParam Map bsEnergyMonitor, BladeUser bladeUser, HttpServletResponse response) { + QueryWrapper queryWrapper = Condition.getQueryWrapper(bsEnergyMonitor, BsEnergyMonitorEntity.class); + List list = bsEnergyMonitorService.exportBsEnergyMonitor(queryWrapper); + ExcelUtil.export(response, "能源监控表数据" + DateUtil.time(), "能源监控表数据表", list, BsEnergyMonitorExcel.class); + } + + /** + * 能源监控表 详情 + */ + @GetMapping("/getLastYearDetail") + @Operation(summary = "上年度详情", description = "传入bsEnergyMonitor") + public R getLastYearDetail(BsEnergyMonitorEntity bsEnergyMonitor) { + YearMonth currentMonth = YearMonth.parse(bsEnergyMonitor.getMonth()); + String currentYear = String.valueOf(currentMonth.getYear()); + YearMonth lastYearMonth = currentMonth.minusYears(1); + String lastMonth = lastYearMonth.toString(); + String lastYear = String.valueOf(lastYearMonth.getYear()); + String quarter = this.getQuarter(currentMonth.getMonth().getValue()); + BsEnergyMonitorEntity detail = new BsEnergyMonitorEntity(); + BsEnergyMonitorEntity lastYearDetail = bsEnergyMonitorService.getOne(new LambdaQueryWrapper().eq(BsEnergyMonitorEntity::getMonth, lastMonth)); + BsEnergyTargetEntity lastYearWaterTarget = bsEnergyTargetService.getOne(new LambdaQueryWrapper(). + eq(BsEnergyTargetEntity::getYear, lastYear) + .eq(BsEnergyTargetEntity::getType, "1")); + BsEnergyTargetEntity currentYearWaterTarget = bsEnergyTargetService.getOne(new LambdaQueryWrapper(). + eq(BsEnergyTargetEntity::getYear, currentYear) + .eq(BsEnergyTargetEntity::getType, "1")); + BsEnergyTargetEntity lastYearElectricTarget = bsEnergyTargetService.getOne(new LambdaQueryWrapper(). + eq(BsEnergyTargetEntity::getYear, lastYear) + .eq(BsEnergyTargetEntity::getQuarter, quarter) + .eq(BsEnergyTargetEntity::getType, "2")); + BsEnergyTargetEntity currentYearElectricTarget = bsEnergyTargetService.getOne(new LambdaQueryWrapper(). + eq(BsEnergyTargetEntity::getYear, currentYear) + .eq(BsEnergyTargetEntity::getQuarter, quarter) + .eq(BsEnergyTargetEntity::getType, "2")); + if (lastYearDetail != null) { + detail.setLastWater(lastYearDetail.getCurrentWater()); + detail.setLastElectric(lastYearDetail.getCurrentElectric()); + detail.setLastOutput(lastYearDetail.getCurrentOutput()); + detail.setLastWaterRate(lastYearDetail.getCurrentWaterRate()); + detail.setLastElectricRate(lastYearDetail.getCurrentElectricRate()); + } + if (lastYearWaterTarget != null) { + detail.setLastWaterTarget(lastYearWaterTarget.getTarget()); + } + if (lastYearElectricTarget != null) { + detail.setLastElectricTarget(lastYearElectricTarget.getTarget()); + } + if (currentYearWaterTarget != null) { + detail.setCurrentWaterTarget(currentYearWaterTarget.getTarget()); + } + if (currentYearElectricTarget != null) { + detail.setCurrentElectricTarget(currentYearElectricTarget.getTarget()); + } + return R.data(detail); + } + + + public static String getQuarter(int month) { + if (month <= 3) { + return "1"; + } else if (month <= 6) { + return "2"; + } else if (month <= 9) { + return "3"; + } else { + return "4"; + } + } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyQuotaController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyQuotaController.java index 52a6c2d6..50a91320 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyQuotaController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyQuotaController.java @@ -25,10 +25,9 @@ */ package org.springblade.desk.energy.controller; +import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -44,15 +43,28 @@ import org.springblade.core.secure.annotation.IsAdmin; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; -import org.springblade.desk.energy.excel.BsEnergyQuotaExcel; +import org.springblade.desk.basic.pojo.entity.WorkCenter; +import org.springblade.desk.basic.service.IWorkCenterService; +import org.springblade.desk.basic.util.ExcelExtUtil; +import org.springblade.desk.device.pojo.entity.EquipmentEntity; +import org.springblade.desk.device.service.IEquipmentService; +import org.springblade.desk.energy.excel.BsEnergyQuotaElectricExcel; +import org.springblade.desk.energy.excel.BsEnergyQuotaElectricImportExcel; +import org.springblade.desk.energy.excel.BsEnergyQuotaWaterExcel; +import org.springblade.desk.energy.excel.BsEnergyQuotaWaterImportExcel; import org.springblade.desk.energy.pojo.entity.BsEnergyQuotaEntity; import org.springblade.desk.energy.pojo.vo.BsEnergyQuotaVO; import org.springblade.desk.energy.service.IBsEnergyQuotaService; import org.springblade.desk.energy.wrapper.BsEnergyQuotaWrapper; +import org.springframework.beans.BeanUtils; +import org.springframework.core.io.Resource; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; -import java.util.List; -import java.util.Map; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; /** * 能源定额 控制器 @@ -66,67 +78,246 @@ import java.util.Map; @Tag(name = "能源定额", description = "能源定额接口") public class BsEnergyQuotaController extends BladeController { - private final IBsEnergyQuotaService bsEnergyQuotaService; - - /** - * 能源定额 详情 - */ - @GetMapping("/detail") - @Operation(summary = "详情", description = "传入bsEnergyQuota") - public R detail(BsEnergyQuotaEntity bsEnergyQuota) { - BsEnergyQuotaEntity detail = bsEnergyQuotaService.getOne(Condition.getQueryWrapper(bsEnergyQuota)); - return R.data(BsEnergyQuotaWrapper.build().entityVO(detail)); - } - - /** - * 能源定额 自定义分页 - */ - @GetMapping("/page") - @Operation(summary = "分页", description = "传入bsEnergyQuota") - public R> page(BsEnergyQuotaVO bsEnergyQuota, Query query) { - IPage pages = bsEnergyQuotaService.selectBsEnergyQuotaPage(Condition.getPage(query), bsEnergyQuota); - return R.data(pages); - } - - /** - * 能源定额 新增或修改 - */ - @PostMapping("/submit") - @Operation(summary = "新增或修改", description = "传入bsEnergyQuota") - public R submit(@Valid @RequestBody BsEnergyQuotaEntity bsEnergyQuota) { - if (bsEnergyQuota.getId() == null){ - // 新增需要校验 - BsEnergyQuotaEntity bsEnergyQuotaEntity = bsEnergyQuotaService.getOne(new LambdaQueryWrapper() - .eq(BsEnergyQuotaEntity::getWorkCenterId, bsEnergyQuota.getWorkCenterId()) - .eq(BsEnergyQuotaEntity::getEquipmentId, bsEnergyQuota.getEquipmentId()) - .eq(BsEnergyQuotaEntity::getType, bsEnergyQuota.getType()) - .eq(BsEnergyQuotaEntity::getDate, bsEnergyQuota.getDate())); - if (bsEnergyQuotaEntity != null) { - return R.fail("该日期能源定额已存在"); - } - } - return R.status(bsEnergyQuotaService.saveOrUpdate(bsEnergyQuota)); - } - - /** - * 能源定额 删除 - */ - @PostMapping("/remove") - @Operation(summary = "逻辑删除", description = "传入ids") - public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { - return R.status(bsEnergyQuotaService.deleteLogic(Func.toLongList(ids))); - } - - /** - * 导出数据 - */ - @IsAdmin - @GetMapping("/export-bsEnergyQuota") - @Operation(summary = "导出数据", description = "传入bsEnergyQuota") - public void exportBsEnergyQuota(@Parameter(hidden = true) @RequestParam Map bsEnergyQuota, BladeUser bladeUser, HttpServletResponse response) { - QueryWrapper queryWrapper = Condition.getQueryWrapper(bsEnergyQuota, BsEnergyQuotaEntity.class); - List list = bsEnergyQuotaService.exportBsEnergyQuota(queryWrapper); - ExcelUtil.export(response, "能源定额数据" + DateUtil.time(), "能源定额数据表", list, BsEnergyQuotaExcel.class); - } + private final IBsEnergyQuotaService bsEnergyQuotaService; + + private final IEquipmentService equipmentService; + + private final IWorkCenterService workCenterService; + + /** + * 能源定额 详情 + */ + @GetMapping("/detail") + @Operation(summary = "详情", description = "传入bsEnergyQuota") + public R detail(BsEnergyQuotaEntity bsEnergyQuota) { + BsEnergyQuotaEntity detail = bsEnergyQuotaService.getOne(Condition.getQueryWrapper(bsEnergyQuota)); + return R.data(BsEnergyQuotaWrapper.build().entityVO(detail)); + } + + /** + * 能源定额 自定义分页 + */ + @GetMapping("/page") + @Operation(summary = "分页", description = "传入bsEnergyQuota") + public R> page(BsEnergyQuotaVO bsEnergyQuota, Query query) { + IPage pages = bsEnergyQuotaService.selectBsEnergyQuotaPage(Condition.getPage(query), bsEnergyQuota); + return R.data(pages); + } + + /** + * 能源定额 新增或修改 + */ + @PostMapping("/submit") + @Operation(summary = "新增或修改", description = "传入bsEnergyQuota") + public R submit(@Valid @RequestBody BsEnergyQuotaEntity bsEnergyQuota) { + BsEnergyQuotaEntity bsEnergyQuotaEntity = bsEnergyQuotaService.getOne(new LambdaQueryWrapper() + .eq(BsEnergyQuotaEntity::getEquipmentId, bsEnergyQuota.getEquipmentId()) + .eq(BsEnergyQuotaEntity::getType, bsEnergyQuota.getType())); + if (bsEnergyQuotaEntity != null && !bsEnergyQuotaEntity.getId().equals(bsEnergyQuota.getId())) { + String msg = "该设备能源定额已存在"; + if ("1".equals(bsEnergyQuota.getType())) { + msg = "该设备用水定额已存在"; + } + if ("2".equals(bsEnergyQuota.getType())) { + msg = "该设备用电定额已存在"; + } + return R.fail(msg); + } + return R.status(bsEnergyQuotaService.saveOrUpdate(bsEnergyQuota)); + } + + /** + * 能源定额 删除 + */ + @PostMapping("/remove") + @Operation(summary = "逻辑删除", description = "传入ids") + public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { + return R.status(bsEnergyQuotaService.deleteLogic(Func.toLongList(ids))); + } + + /** + * 导出数据 + */ + @IsAdmin + @GetMapping("/export-bsEnergyQuota") + @Operation(summary = "导出数据", description = "传入bsEnergyQuota") + public void exportBsEnergyQuota(@Parameter(hidden = true) @RequestParam Map bsEnergyQuota, BladeUser bladeUser, HttpServletResponse response) { + LambdaQueryWrapper qw = new LambdaQueryWrapper().eq(BsEnergyQuotaEntity::getType, bsEnergyQuota.get("type")); + List list = bsEnergyQuotaService.list(qw); + if ("1".equals(bsEnergyQuota.get("type"))) { + List bsEnergyTargetWaterExcels = BeanUtil.copyToList(list, BsEnergyQuotaWaterExcel.class); + ExcelUtil.export(response, "用水定额数据" + DateUtil.time(), "用水定额数据表", bsEnergyTargetWaterExcels, BsEnergyQuotaWaterExcel.class); + } else { + List bsEnergyTargetElectricExcels = BeanUtil.copyToList(list, BsEnergyQuotaElectricExcel.class); + ExcelUtil.export(response, "用电定额数据" + DateUtil.time(), "用电定额数据表", bsEnergyTargetElectricExcels, BsEnergyQuotaElectricExcel.class); + } + } + + @GetMapping("/water-download-excel-template") + @Operation(summary = "下载Excel模板", description = "") + public ResponseEntity waterDownloadExcelTemplate() { + return ExcelExtUtil.downloadXlsTemplate( + "Excel/energy/用水定额.xls", + "导入模版-用水定额.xls"); + } + + @GetMapping("/electric-download-excel-template") + @Operation(summary = "下载Excel模板", description = "") + public ResponseEntity electricDownloadExcelTemplate() { + return ExcelExtUtil.downloadXlsTemplate( + "Excel/energy/用电定额.xls", + "导入模版-用电定额.xls"); + } + + @PostMapping("/water-import-excel") + @Operation(summary = "导入Excel", description = "MultipartFile") + public R waterImportExcel(@RequestParam("file") MultipartFile file) { + R checkR = ExcelExtUtil.importExcelCheck(file); + if (checkR != null) { + return checkR; + } + List importList = ExcelUtil.read( + file, 0, 1, BsEnergyQuotaWaterImportExcel.class + ); + boolean result = true; + Set existSet = new HashSet<>(); + StringBuffer msg = new StringBuffer(); + List list = new ArrayList<>(); + for (BsEnergyQuotaWaterImportExcel excel : importList) { + LocalDate parse = LocalDate.parse(excel.getDate(), DateTimeFormatter.ofPattern("yyyy/M/d")); + String newDate = parse.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + excel.setDate(newDate); + EquipmentEntity equipmentEntity = equipmentService.getDeEquipmentCardByCode(excel.getDeviceCode()); + if (equipmentEntity == null) { + msg.append("设备【" + excel.getDeviceCode() + "】不存在\rn"); + result = false; + continue; + } + List wcCodes = Arrays.asList(excel.getWcCode().split(",")); + StringBuffer workCenterId = new StringBuffer(); + StringBuffer workCenterName = new StringBuffer(); + for (String wcCode : wcCodes) { + WorkCenter workCenter = workCenterService.getWorkCenterByCode(wcCode); + if (workCenter == null) { + msg.append("作业中心【" + wcCode + "】不存在\rn"); + result = false; + break; + } + if (workCenterId.length() > 0) { + workCenterId.append(","); + } + workCenterId.append(workCenter.getId()); + if (workCenterName.length() > 0) { + workCenterName.append(","); + } + workCenterName.append(workCenter.getWcName()); + } + if (!result) { + continue; + } + if (existSet.contains(excel.getDeviceCode())) { + msg.append("Excel里设备【" + excel.getDeviceCode() + "】重复了\rn"); + result = false; + continue; + } + existSet.add(excel.getDeviceCode()); + BsEnergyQuotaEntity exist = bsEnergyQuotaService.getOne(new LambdaQueryWrapper(). + eq(BsEnergyQuotaEntity::getEquipmentId, equipmentEntity.getId()) + .eq(BsEnergyQuotaEntity::getType, "1")); + if (exist != null) { + msg.append(excel.getDeviceCode() + "设备用水定额已存在\n"); + result = false; + continue; + } + BsEnergyQuotaEntity bsEnergyQuotaEntity = new BsEnergyQuotaEntity(); + BeanUtils.copyProperties(excel, bsEnergyQuotaEntity); + bsEnergyQuotaEntity.setEquipmentId(equipmentEntity.getId()); + bsEnergyQuotaEntity.setEquipmentName(equipmentEntity.getDeviceName()); + bsEnergyQuotaEntity.setWorkCenterId(workCenterId.toString()); + bsEnergyQuotaEntity.setWorkCenterName(workCenterName.toString()); + bsEnergyQuotaEntity.setType("1"); + list.add(bsEnergyQuotaEntity); + } + bsEnergyQuotaService.saveBatch(list); + if (result) { + return R.success("导入成功"); + } else { + return R.fail(msg.toString()); + } + } + + @PostMapping("/electric-import-excel") + @Operation(summary = "导入Excel", description = "MultipartFile") + public R electricImportExcel(@RequestParam("file") MultipartFile file) { + R checkR = ExcelExtUtil.importExcelCheck(file); + if (checkR != null) { + return checkR; + } + List importList = ExcelUtil.read( + file, 0, 1, BsEnergyQuotaElectricImportExcel.class + ); + boolean result = true; + Set existSet = new HashSet<>(); + StringBuffer msg = new StringBuffer(); + List list = new ArrayList<>(); + for (BsEnergyQuotaElectricImportExcel excel : importList) { + EquipmentEntity equipmentEntity = equipmentService.getDeEquipmentCardByCode(excel.getDeviceCode()); + if (equipmentEntity == null) { + msg.append("设备【" + excel.getDeviceCode() + "】不存在\rn"); + result = false; + continue; + } + List wcCodes = Arrays.asList(excel.getWcCode().split(",")); + StringBuffer workCenterId = new StringBuffer(); + StringBuffer workCenterName = new StringBuffer(); + for (String wcCode : wcCodes) { + WorkCenter workCenter = workCenterService.getWorkCenterByCode(wcCode); + if (workCenter == null) { + msg.append("作业中心【" + wcCode + "】不存在\rn"); + result = false; + break; + } + if (workCenterId.length() > 0) { + workCenterId.append(","); + } + workCenterId.append(workCenter.getId()); + if (workCenterName.length() > 0) { + workCenterName.append(","); + } + workCenterName.append(workCenter.getWcName()); + } + if (!result) { + continue; + } + if (existSet.contains(excel.getDeviceCode())) { + msg.append("Excel里设备【" + excel.getDeviceCode() + "】重复了\rn"); + result = false; + continue; + } + existSet.add(excel.getDeviceCode()); + BsEnergyQuotaEntity exist = bsEnergyQuotaService.getOne(new LambdaQueryWrapper(). + eq(BsEnergyQuotaEntity::getEquipmentId, equipmentEntity.getId()) + .eq(BsEnergyQuotaEntity::getType, "2")); + if (exist != null) { + msg.append(excel.getDeviceCode() + "设备用电定额已存在\n"); + result = false; + continue; + } + BsEnergyQuotaEntity bsEnergyQuotaEntity = new BsEnergyQuotaEntity(); + BeanUtils.copyProperties(excel, bsEnergyQuotaEntity); + bsEnergyQuotaEntity.setEquipmentId(equipmentEntity.getId()); + bsEnergyQuotaEntity.setEquipmentName(equipmentEntity.getDeviceName()); + bsEnergyQuotaEntity.setWorkCenterId(workCenterId.toString()); + bsEnergyQuotaEntity.setWorkCenterName(workCenterName.toString()); + bsEnergyQuotaEntity.setType("2"); + list.add(bsEnergyQuotaEntity); + } + bsEnergyQuotaService.saveBatch(list); + if (result) { + return R.success("导入成功"); + } else { + return R.fail(msg.toString()); + } + } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyTargetController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyTargetController.java index 116f2711..c46dcb00 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyTargetController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyTargetController.java @@ -25,9 +25,10 @@ */ package org.springblade.desk.energy.controller; +import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -43,16 +44,22 @@ import org.springblade.core.secure.annotation.IsAdmin; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; -import org.springblade.desk.energy.excel.BsEnergyTargetExcel; +import org.springblade.desk.basic.util.ExcelExtUtil; +import org.springblade.desk.energy.excel.BsEnergyTargetElectricExcel; +import org.springblade.desk.energy.excel.BsEnergyTargetWaterExcel; import org.springblade.desk.energy.pojo.entity.BsEnergyTargetEntity; import org.springblade.desk.energy.pojo.vo.BsEnergyTargetVO; import org.springblade.desk.energy.service.IBsEnergyTargetService; import org.springblade.desk.energy.wrapper.BsEnergyTargetWrapper; +import org.springframework.beans.BeanUtils; +import org.springframework.core.io.Resource; +import org.springframework.data.redis.hash.HashMapper; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.math.BigDecimal; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 能耗目标表 控制器 @@ -66,85 +73,209 @@ import java.util.Map; @Tag(name = "能耗目标表", description = "能耗目标表接口") public class BsEnergyTargetController extends BladeController { - private final IBsEnergyTargetService bsEnergyTargetService; - - /** - * 能耗目标表 详情 - */ - @GetMapping("/detail") - @Operation(summary = "详情", description = "传入bsEnergyTarget") - public R detail(BsEnergyTargetEntity bsEnergyTarget) { - BsEnergyTargetEntity detail = bsEnergyTargetService.getOne(Condition.getQueryWrapper(bsEnergyTarget)); - return R.data(BsEnergyTargetWrapper.build().entityVO(detail)); - } - - /** - * 能耗目标表 获取用水目标 - */ - @GetMapping("/detailByWater") - @Operation(summary = "根据月份获取用水目标", description = "获取用水目标") - public R getWaterTargetByMonth(String month) { - BigDecimal waterTarget = bsEnergyTargetService.getWaterTargetByMonth(month); - return R.data(waterTarget); - } - - /** - * 能耗目标表 获取用水目标 - */ - @GetMapping("/detailByElectric") - @Operation(summary = "根据月份获取用电目标", description = "获取用电目标") - public R getElectricTargetByMonth(String month) { - BigDecimal electricTarget = bsEnergyTargetService.getElectricTargetByMonth(month); - return R.data(electricTarget); - } - - /** - * 能耗目标表 自定义分页 - */ - @GetMapping("/page") - @Operation(summary = "分页", description = "传入bsEnergyTarget") - public R> page(BsEnergyTargetVO bsEnergyTarget, Query query) { - IPage pages = bsEnergyTargetService.selectBsEnergyTargetPage(Condition.getPage(query), bsEnergyTarget); - return R.data(pages); - } - - /** - * 能耗目标表 新增或修改 - */ - @PostMapping("/submit") - @Operation(summary = "新增或修改", description = "传入bsEnergyTarget") - public R submit(@Valid @RequestBody BsEnergyTargetEntity bsEnergyTarget) { - if (bsEnergyTarget.getId() == null) { - // 新增需要校验 - BsEnergyTargetEntity bsEnergyTargetEntity = bsEnergyTargetService.getOne(new LambdaQueryWrapper(). - eq(BsEnergyTargetEntity::getMonth, bsEnergyTarget.getMonth()) - .eq(BsEnergyTargetEntity::getType, bsEnergyTarget.getType())); - if (bsEnergyTargetEntity != null) { - return R.fail("该月份能耗目标已存在"); - } - } - return R.status(bsEnergyTargetService.saveOrUpdate(bsEnergyTarget)); - } - - /** - * 能耗目标表 删除 - */ - @PostMapping("/remove") - @Operation(summary = "逻辑删除", description = "传入ids") - public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { - return R.status(bsEnergyTargetService.deleteLogic(Func.toLongList(ids))); - } - - /** - * 导出数据 - */ - @IsAdmin - @GetMapping("/export-bsEnergyTarget") - @Operation(summary = "导出数据", description = "传入bsEnergyTarget") - public void exportBsEnergyTarget(@Parameter(hidden = true) @RequestParam Map bsEnergyTarget, BladeUser bladeUser, HttpServletResponse response) { - QueryWrapper queryWrapper = Condition.getQueryWrapper(bsEnergyTarget, BsEnergyTargetEntity.class); - List list = bsEnergyTargetService.exportBsEnergyTarget(queryWrapper); - ExcelUtil.export(response, "能耗目标表数据" + DateUtil.time(), "能耗目标表数据表", list, BsEnergyTargetExcel.class); - } + private final IBsEnergyTargetService bsEnergyTargetService; + + /** + * 能耗目标表 详情 + */ + @GetMapping("/detail") + @Operation(summary = "详情", description = "传入bsEnergyTarget") + public R detail(BsEnergyTargetEntity bsEnergyTarget) { + BsEnergyTargetEntity detail = bsEnergyTargetService.getOne(Condition.getQueryWrapper(bsEnergyTarget)); + return R.data(BsEnergyTargetWrapper.build().entityVO(detail)); + } + + /** + * 能耗目标表 获取用水目标 + */ + @GetMapping("/detailByWater") + @Operation(summary = "根据月份获取用水目标", description = "获取用水目标") + public R getWaterTargetByMonth(String month) { + BigDecimal waterTarget = bsEnergyTargetService.getWaterTargetByMonth(month); + return R.data(waterTarget); + } + + /** + * 能耗目标表 获取用水目标 + */ + @GetMapping("/detailByElectric") + @Operation(summary = "根据月份获取用电目标", description = "获取用电目标") + public R getElectricTargetByMonth(String month) { + BigDecimal electricTarget = bsEnergyTargetService.getElectricTargetByMonth(month); + return R.data(electricTarget); + } + + /** + * 能耗目标表 自定义分页 + */ + @GetMapping("/page") + @Operation(summary = "分页", description = "传入bsEnergyTarget") + public R> page(BsEnergyTargetVO bsEnergyTarget, Query query) { + IPage pages = bsEnergyTargetService.selectBsEnergyTargetPage(Condition.getPage(query), bsEnergyTarget); + return R.data(pages); + } + + /** + * 能耗目标表 新增或修改 + */ + @PostMapping("/submit") + @Operation(summary = "新增或修改", description = "传入bsEnergyTarget") + public R submit(@Valid @RequestBody BsEnergyTargetEntity bsEnergyTarget) { + BsEnergyTargetEntity bsEnergyTargetEntity = bsEnergyTargetService.getOne(new LambdaQueryWrapper(). + eq(BsEnergyTargetEntity::getYear, bsEnergyTarget.getYear()) + .eq(BsEnergyTargetEntity::getType, bsEnergyTarget.getType()) + .eq(bsEnergyTarget.getQuarter() != null, BsEnergyTargetEntity::getQuarter, bsEnergyTarget.getQuarter())); + if (bsEnergyTargetEntity != null && !bsEnergyTargetEntity.getId().equals(bsEnergyTarget.getId())) { + if ("1".equals(bsEnergyTarget.getType())) { + return R.fail("该年份能耗目标已存在"); + } + if ("2".equals(bsEnergyTarget.getType())) { + return R.fail("该季度能耗目标已存在"); + } + } + return R.status(bsEnergyTargetService.saveOrUpdate(bsEnergyTarget)); + } + + /** + * 能耗目标表 删除 + */ + @PostMapping("/remove") + @Operation(summary = "逻辑删除", description = "传入ids") + public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { + return R.status(bsEnergyTargetService.deleteLogic(Func.toLongList(ids))); + } + + /** + * 导出数据 + */ + @IsAdmin + @GetMapping("/export-bsEnergyTarget") + @Operation(summary = "导出数据", description = "传入bsEnergyTarget") + public void exportBsEnergyTarget(@Parameter(hidden = true) @RequestParam Map bsEnergyTarget, BladeUser bladeUser, HttpServletResponse response) { + Map conMap = new HashMap(); + conMap.put("type", bsEnergyTarget.get("type")); + conMap.put("isDeleted", 0); + List list = bsEnergyTargetService.listByMap(conMap); + if ("1".equals(bsEnergyTarget.get("type"))) { + List bsEnergyTargetWaterExcels = BeanUtil.copyToList(list, BsEnergyTargetWaterExcel.class); + ExcelUtil.export(response, "用水目标" + DateUtil.time(), "用水目标", bsEnergyTargetWaterExcels, BsEnergyTargetWaterExcel.class); + } else { + List bsEnergyTargetElectricExcels = BeanUtil.copyToList(list, BsEnergyTargetElectricExcel.class); + ExcelUtil.export(response, "用电目标" + DateUtil.time(), "用电目标", bsEnergyTargetElectricExcels, BsEnergyTargetElectricExcel.class); + } + } + + @GetMapping("/water-download-excel-template") + @Operation(summary = "下载Excel模板", description = "") + public ResponseEntity waterDownloadExcelTemplate() { + return ExcelExtUtil.downloadXlsTemplate( + "Excel/energy/用水目标.xls", + "导入模版-用水目标.xls"); + } + + @GetMapping("/electric-download-excel-template") + @Operation(summary = "下载Excel模板", description = "") + public ResponseEntity electricDownloadExcelTemplate() { + return ExcelExtUtil.downloadXlsTemplate( + "Excel/energy/用电目标.xls", + "导入模版-用电目标.xls"); + } + + @PostMapping("/water-import-excel") + @Operation(summary = "导入Excel", description = "MultipartFile") + public R waterImportExcel(@RequestParam("file") MultipartFile file) { + R checkR = ExcelExtUtil.importExcelCheck(file); + if (checkR != null) { + return checkR; + } + List importList = ExcelUtil.read( + file, 0, 1, BsEnergyTargetWaterExcel.class + ); + boolean result = true; + Set existSet = new HashSet<>(); + StringBuffer msg = new StringBuffer(); + List list = new ArrayList<>(); + for (BsEnergyTargetWaterExcel excel : importList) { + if (existSet.contains(excel.getYear())) { + msg.append("Excel里【" + excel.getYear() + "】重复了\rn"); + result = false; + continue; + } + existSet.add(excel.getYear()); + BsEnergyTargetEntity exist = bsEnergyTargetService.getOne(new LambdaQueryWrapper(). + eq(BsEnergyTargetEntity::getYear, excel.getYear()) + .eq(BsEnergyTargetEntity::getType, "1")); + if (exist != null) { + msg.append(excel.getYear() + "能耗目标已存在\n"); + result = false; + continue; + } + BsEnergyTargetEntity bsEnergyTargetEntity = new BsEnergyTargetEntity(); + BeanUtils.copyProperties(excel, bsEnergyTargetEntity); + bsEnergyTargetEntity.setType("1"); + list.add(bsEnergyTargetEntity); + } + bsEnergyTargetService.saveBatch(list); + if (result) { + return R.success("导入成功"); + } else { + return R.fail(msg.toString()); + } + } + + @PostMapping("/electric-import-excel") + @Operation(summary = "导入Excel", description = "MultipartFile") + public R electricImportExcel(@RequestParam("file") MultipartFile file) { + R checkR = ExcelExtUtil.importExcelCheck(file); + if (checkR != null) { + return checkR; + } + List importList = ExcelUtil.read( + file, 0, 1, BsEnergyTargetElectricExcel.class + ); + boolean result = true; + Set existSet = new HashSet<>(); + StringBuffer msg = new StringBuffer(); + List list = new ArrayList<>(); + for (BsEnergyTargetElectricExcel excel : importList) { + String key = excel.getYear() + "-" + excel.getQuarter(); + if (existSet.contains(key)) { + msg.append("Excel里【" + key + "】重复了\rn"); + result = false; + continue; + } + existSet.add(key); + if("第一季度".equals(excel.getQuarter())){ + excel.setQuarter("1"); + } else if("第二季度".equals(excel.getQuarter())){ + excel.setQuarter("2"); + } else if("第三季度".equals(excel.getQuarter())){ + excel.setQuarter("3"); + } else if("第四季度".equals(excel.getQuarter())){ + excel.setQuarter("4"); + } + BsEnergyTargetEntity exist = bsEnergyTargetService.getOne(new LambdaQueryWrapper(). + eq(BsEnergyTargetEntity::getYear, excel.getYear()) + .eq(BsEnergyTargetEntity::getType, "2") + .eq(BsEnergyTargetEntity::getQuarter, excel.getQuarter())); + if (exist != null) { + msg.append(key + "能耗目标已存在\n"); + result = false; + continue; + } + BsEnergyTargetEntity bsEnergyTargetEntity = new BsEnergyTargetEntity(); + BeanUtils.copyProperties(excel, bsEnergyTargetEntity); + bsEnergyTargetEntity.setType("2"); + list.add(bsEnergyTargetEntity); + } + bsEnergyTargetService.saveBatch(list); + if (result) { + return R.success("导入成功"); + } else { + return R.fail(msg.toString()); + } + } + + } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsPeakFlatValleyController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsPeakFlatValleyController.java index f546c235..468a6101 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsPeakFlatValleyController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsPeakFlatValleyController.java @@ -66,65 +66,64 @@ import java.util.Map; @Tag(name = "峰平谷", description = "峰平谷接口") public class BsPeakFlatValleyController extends BladeController { - private final IBsPeakFlatValleyService bsPeakFlatValleyService; + private final IBsPeakFlatValleyService bsPeakFlatValleyService; - /** - * 峰平谷 详情 - */ - @GetMapping("/detail") - @Operation(summary = "详情", description = "传入bsPeakFlatValley") - public R detail(BsPeakFlatValleyEntity bsPeakFlatValley) { - BsPeakFlatValleyEntity detail = bsPeakFlatValleyService.getOne(Condition.getQueryWrapper(bsPeakFlatValley)); - return R.data(BsPeakFlatValleyWrapper.build().entityVO(detail)); - } + /** + * 峰平谷 详情 + */ + @GetMapping("/detail") + @Operation(summary = "详情", description = "传入bsPeakFlatValley") + public R detail(BsPeakFlatValleyEntity bsPeakFlatValley) { + BsPeakFlatValleyEntity detail = bsPeakFlatValleyService.getOne(Condition.getQueryWrapper(bsPeakFlatValley)); + return R.data(BsPeakFlatValleyWrapper.build().entityVO(detail)); + } - /** - * 峰平谷 自定义分页 - */ - @GetMapping("/page") - @Operation(summary = "分页", description = "传入bsPeakFlatValley") - public R> page(BsPeakFlatValleyVO bsPeakFlatValley, Query query) { - IPage pages = bsPeakFlatValleyService.selectBsPeakFlatValleyPage(Condition.getPage(query), bsPeakFlatValley); - return R.data(pages); - } + /** + * 峰平谷 自定义分页 + */ + @GetMapping("/page") + @Operation(summary = "分页", description = "传入bsPeakFlatValley") + public R> page(BsPeakFlatValleyVO bsPeakFlatValley, Query query) { + IPage pages = bsPeakFlatValleyService.selectBsPeakFlatValleyPage(Condition.getPage(query), bsPeakFlatValley); + return R.data(pages); + } - /** - * 峰平谷 新增或修改 - */ - @PostMapping("/submit") - @Operation(summary = "新增或修改", description = "传入bsPeakFlatValley") - public R submit(@Valid @RequestBody BsPeakFlatValleyEntity bsPeakFlatValley) { - if (bsPeakFlatValley.getId() == null){ - // 新增校验是否存在 - BsPeakFlatValleyEntity bsPeakFlatValleyEntity = bsPeakFlatValleyService.getOne(new LambdaQueryWrapper() - .eq(BsPeakFlatValleyEntity::getMonth, bsPeakFlatValley.getMonth())); - if (bsPeakFlatValleyEntity != null) { - return R.fail("该月份峰平谷已存在"); - } - } - return R.status(bsPeakFlatValleyService.saveOrUpdate(bsPeakFlatValley)); - } + /** + * 峰平谷 新增或修改 + */ + @PostMapping("/submit") + @Operation(summary = "新增或修改", description = "传入bsPeakFlatValley") + public R submit(@Valid @RequestBody List bsPeakFlatValleyList) { + for (BsPeakFlatValleyEntity bsPeakFlatValley : bsPeakFlatValleyList) { + BsPeakFlatValleyEntity exist = bsPeakFlatValleyService.getOne(new LambdaQueryWrapper() + .eq(BsPeakFlatValleyEntity::getMonth, bsPeakFlatValley.getMonth())); + if (exist != null && !exist.getId().equals(bsPeakFlatValley.getId())) { + return R.fail("该月份峰平谷已存在"); + } + } + return R.status(bsPeakFlatValleyService.saveOrUpdateBatch(bsPeakFlatValleyList)); + } - /** - * 峰平谷 删除 - */ - @PostMapping("/remove") - @Operation(summary = "逻辑删除", description = "传入ids") - public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { - return R.status(bsPeakFlatValleyService.deleteLogic(Func.toLongList(ids))); - } + /** + * 峰平谷 删除 + */ + @PostMapping("/remove") + @Operation(summary = "逻辑删除", description = "传入ids") + public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { + return R.status(bsPeakFlatValleyService.deleteLogic(Func.toLongList(ids))); + } - /** - * 导出数据 - */ - @IsAdmin - @GetMapping("/export-bsPeakFlatValley") - @ApiOperationSupport(order = 9) - @Operation(summary = "导出数据", description = "传入bsPeakFlatValley") - public void exportBsPeakFlatValley(@Parameter(hidden = true) @RequestParam Map bsPeakFlatValley, BladeUser bladeUser, HttpServletResponse response) { - QueryWrapper queryWrapper = Condition.getQueryWrapper(bsPeakFlatValley, BsPeakFlatValleyEntity.class); - List list = bsPeakFlatValleyService.exportBsPeakFlatValley(queryWrapper); - ExcelUtil.export(response, "峰平谷数据" + DateUtil.time(), "峰平谷数据表", list, BsPeakFlatValleyExcel.class); - } + /** + * 导出数据 + */ + @IsAdmin + @GetMapping("/export-bsPeakFlatValley") + @ApiOperationSupport(order = 9) + @Operation(summary = "导出数据", description = "传入bsPeakFlatValley") + public void exportBsPeakFlatValley(@Parameter(hidden = true) @RequestParam Map bsPeakFlatValley, BladeUser bladeUser, HttpServletResponse response) { + QueryWrapper queryWrapper = Condition.getQueryWrapper(bsPeakFlatValley, BsPeakFlatValleyEntity.class); + List list = bsPeakFlatValleyService.exportBsPeakFlatValley(queryWrapper); + ExcelUtil.export(response, "峰平谷数据" + DateUtil.time(), "峰平谷数据表", list, BsPeakFlatValleyExcel.class); + } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaElectricExcel.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaElectricExcel.java new file mode 100644 index 00000000..9e068edf --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaElectricExcel.java @@ -0,0 +1,60 @@ +package org.springblade.desk.energy.excel; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class BsEnergyQuotaElectricExcel implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 作业中心 + */ + @ColumnWidth(50) + @ExcelProperty("作业中心") + private String workCenterName; + /** + * 作业中心编码 + */ + @ColumnWidth(50) + @ExcelProperty("作业中心编码") + private String wcCode; + /** + * 设备 + */ + @ColumnWidth(50) + @ExcelProperty("设备") + private String equipmentName; + /** + * 设备编码 + */ + @ColumnWidth(50) + @ExcelProperty("设备") + private String deviceCode; + /** + * 日期 + */ + @ColumnWidth(50) + @ExcelProperty("日期") + private String date; + /** + * 用电量 + */ + @ColumnWidth(50) + @ExcelProperty("定额单位面积用电量(kWh/dm²)") + private BigDecimal electricNum; +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaElectricImportExcel.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaElectricImportExcel.java new file mode 100644 index 00000000..6cd43305 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaElectricImportExcel.java @@ -0,0 +1,48 @@ +package org.springblade.desk.energy.excel; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class BsEnergyQuotaElectricImportExcel implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 作业中心编码 + */ + @ColumnWidth(50) + @ExcelProperty("作业中心编码") + private String wcCode; + /** + * 设备编码 + */ + @ColumnWidth(50) + @ExcelProperty("设备编码") + private String deviceCode; + /** + * 日期 + */ + @ColumnWidth(50) + @ExcelProperty("日期") + private String date; + /** + * 用电量 + */ + @ColumnWidth(50) + @ExcelProperty("定额单位面积用电量(kWh/dm²)") + private BigDecimal electricNum; +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaExcel.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaWaterExcel.java similarity index 65% rename from blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaExcel.java rename to blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaWaterExcel.java index d5e5c546..97666394 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaExcel.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaWaterExcel.java @@ -26,9 +26,12 @@ package org.springblade.desk.energy.excel; +import com.alibaba.excel.annotation.ExcelIgnore; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import java.util.Date; +import java.math.BigDecimal; + import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.write.style.ContentRowHeight; @@ -47,41 +50,34 @@ import java.io.Serial; @ColumnWidth(25) @HeadRowHeight(20) @ContentRowHeight(18) -public class BsEnergyQuotaExcel implements Serializable { +public class BsEnergyQuotaWaterExcel implements Serializable { @Serial private static final long serialVersionUID = 1L; + /** - * ID + * 作业中心 */ - @ColumnWidth(20) - @ExcelProperty("ID") - private Long id; + @ColumnWidth(50) + @ExcelProperty("作业中心") + private String workCenterName; /** - * 类型 1-用水 2-用电 + * 作业中心编码 */ - @ColumnWidth(20) - @ExcelProperty("类型 1-用水 2-用电") - private String type; + @Schema(description = "作业中心编码") + private String wcCode; /** - * 作业中心ID + * 设备 */ - @ColumnWidth(20) - @ExcelProperty("作业中心ID") - private Long workCenterId; + @ColumnWidth(50) + @ExcelProperty("设备") + private String equipmentName; /** - * 设备ID + * 设备编码 */ - @ColumnWidth(20) - @ExcelProperty("设备ID") - private Long equipmentId; - /** - * 月份 - */ - @ColumnWidth(20) - @ExcelProperty("月份") - private String month; + @Schema(description = "设备编码") + private String deviceCode; /** * 日期 */ @@ -91,26 +87,14 @@ public class BsEnergyQuotaExcel implements Serializable { /** * 自来水用水量 */ - @ColumnWidth(20) - @ExcelProperty("自来水用水量") - private Long tapWaterNum; + @ColumnWidth(50) + @ExcelProperty("自来水用水量(L/dm²)") + private BigDecimal tapWaterNum; /** * 纯水用水量 */ - @ColumnWidth(20) - @ExcelProperty("纯水用水量") - private Long pureWaterNum; - /** - * 用电量 - */ - @ColumnWidth(20) - @ExcelProperty("用电量") - private Long electricNum; - /** - * 是否已删除 - */ - @ColumnWidth(20) - @ExcelProperty("是否已删除") - private Long isDeleted; + @ColumnWidth(50) + @ExcelProperty("纯水用水量(L/dm²)") + private BigDecimal pureWaterNum; } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaWaterImportExcel.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaWaterImportExcel.java new file mode 100644 index 00000000..f631dea9 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyQuotaWaterImportExcel.java @@ -0,0 +1,92 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.desk.energy.excel; + + +import com.alibaba.excel.annotation.ExcelIgnore; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.io.Serial; + + +/** + * 能源定额 Excel实体类 + * + * @author BladeX + * @since 2026-03-02 + */ +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class BsEnergyQuotaWaterImportExcel implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 作业中心编码 + */ + @ColumnWidth(50) + @ExcelProperty("作业中心编码") + private String wcCode; + /** + * 设备编码 + */ + @ColumnWidth(50) + @ExcelProperty("设备编码") + private String deviceCode; + /** + * 日期 + */ + @ColumnWidth(20) + @ExcelProperty("日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private String date; + /** + * 自来水用水量 + */ + @ColumnWidth(50) + @ExcelProperty("自来水用水量(L/dm²)") + private BigDecimal tapWaterNum; + /** + * 纯水用水量 + */ + @ColumnWidth(50) + @ExcelProperty("纯水用水量(L/dm²)") + private BigDecimal pureWaterNum; + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyTargetExcel.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyTargetElectricExcel.java similarity index 67% rename from blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyTargetExcel.java rename to blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyTargetElectricExcel.java index fe13b63d..38a727d1 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyTargetExcel.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyTargetElectricExcel.java @@ -26,16 +26,15 @@ package org.springblade.desk.energy.excel; -import lombok.Data; - -import java.math.BigDecimal; -import java.util.Date; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.write.style.ContentRowHeight; import com.alibaba.excel.annotation.write.style.HeadRowHeight; -import java.io.Serializable; +import lombok.Data; + import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; /** @@ -48,46 +47,30 @@ import java.io.Serial; @ColumnWidth(25) @HeadRowHeight(20) @ContentRowHeight(18) -public class BsEnergyTargetExcel implements Serializable { +public class BsEnergyTargetElectricExcel implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 年份 + */ + @ColumnWidth(50) + @ExcelProperty("年份") + private String year; - @Serial - private static final long serialVersionUID = 1L; + /** + * 季度 + */ + @ColumnWidth(50) + @ExcelProperty("季度") + private String quarter; - /** - * ID - */ - @ColumnWidth(20) - @ExcelProperty("ID") - private Long id; - /** - * 类型 1-用水 2-用电 - */ - @ColumnWidth(20) - @ExcelProperty("类型 1-用水 2-用电") - private String type; - /** - * 月份 - */ - @ColumnWidth(20) - @ExcelProperty("月份") - private String month; - /** - * 日期 - */ - @ColumnWidth(20) - @ExcelProperty("日期") - private String date; - /** - * 目标 - */ - @ColumnWidth(20) - @ExcelProperty("目标") - private Long target; - /** - * 是否已删除 - */ - @ColumnWidth(20) - @ExcelProperty("是否已删除") - private Long isDeleted; + /** + * 用电目标(kWh/dm²) + */ + @ColumnWidth(50) + @ExcelProperty("用电目标(kWh/dm²)") + private BigDecimal target; } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyTargetWaterExcel.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyTargetWaterExcel.java new file mode 100644 index 00000000..19c4ebba --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyTargetWaterExcel.java @@ -0,0 +1,71 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.desk.energy.excel; + + +import lombok.Data; + +import java.math.BigDecimal; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; + +import java.io.Serializable; +import java.io.Serial; + + +/** + * 能耗目标表 Excel实体类 + * + * @author BladeX + * @since 2026-03-02 + */ +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class BsEnergyTargetWaterExcel implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 年份 + */ + @ColumnWidth(50) + @ExcelProperty("年份") + private String year; + + /** + * 用水目标(L/d㎡) + */ + @ColumnWidth(50) + @ExcelProperty("用水目标(L/d㎡)") + private BigDecimal target; + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/BsEnergyCoreUseMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/BsEnergyCoreUseMapper.java new file mode 100644 index 00000000..c6aa921b --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/BsEnergyCoreUseMapper.java @@ -0,0 +1,26 @@ +package org.springblade.desk.energy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springblade.desk.energy.pojo.entity.BsEnergyCoreUseEntity; +import org.springblade.desk.energy.pojo.vo.BsEnergyCoreUseVO; + +import java.util.List; + +/** + * 水电能耗记录表 Mapper 接口 + * + * @author BladeX + * @since 2026-04-16 + */ +public interface BsEnergyCoreUseMapper extends BaseMapper { + + /** + * 自定义分页 + * + * @param page 分页参数 + * @param bsEnergyCoreUse 查询参数 + * @return List + */ + List selectBsEnergyCoreUsePage(IPage page, BsEnergyCoreUseVO bsEnergyCoreUse); +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/BsEnergyHistoryRecMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/BsEnergyHistoryRecMapper.java new file mode 100644 index 00000000..67ae93e2 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/BsEnergyHistoryRecMapper.java @@ -0,0 +1,35 @@ +package org.springblade.desk.energy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springblade.desk.energy.pojo.entity.BsEnergyHistoryRecEntity; +import org.springblade.desk.energy.pojo.vo.BsEnergyHistoryRecVO; + +import java.util.List; + +/** + * iot水电能耗历史记录表 Mapper 接口 + * + * @author BladeX + * @since 2026-04-17 + */ +public interface BsEnergyHistoryRecMapper extends BaseMapper { + + /** + * 自定义分页 + * + * @param page 分页参数 + * @param bsEnergyHistoryRec 查询参数 + * @return List + */ + List selectBsEnergyHistoryRecPage(IPage page, BsEnergyHistoryRecVO bsEnergyHistoryRec); + + + /** + * 自定义查询 + * + * @param bsEnergyHistoryRec 查询参数 + * @return List + */ + List selectBsEnergyHistoryRec(BsEnergyHistoryRecVO bsEnergyHistoryRec); +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/BsEnergyQuotaMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/BsEnergyQuotaMapper.java index 7811efde..c51b47a3 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/BsEnergyQuotaMapper.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/BsEnergyQuotaMapper.java @@ -27,7 +27,7 @@ package org.springblade.desk.energy.mapper; import org.springblade.desk.energy.pojo.entity.BsEnergyQuotaEntity; import org.springblade.desk.energy.pojo.vo.BsEnergyQuotaVO; -import org.springblade.desk.energy.excel.BsEnergyQuotaExcel; +import org.springblade.desk.energy.excel.BsEnergyQuotaWaterExcel; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -58,6 +58,6 @@ public interface BsEnergyQuotaMapper extends BaseMapper { * @param queryWrapper 查询条件 * @return List */ - List exportBsEnergyQuota(@Param("ew") Wrapper queryWrapper); + List exportBsEnergyQuota(@Param("ew") Wrapper queryWrapper); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/BsEnergyTargetMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/BsEnergyTargetMapper.java index 16979f0f..d26c8c08 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/BsEnergyTargetMapper.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/BsEnergyTargetMapper.java @@ -27,12 +27,13 @@ package org.springblade.desk.energy.mapper; import org.springblade.desk.energy.pojo.entity.BsEnergyTargetEntity; import org.springblade.desk.energy.pojo.vo.BsEnergyTargetVO; -import org.springblade.desk.energy.excel.BsEnergyTargetExcel; +import org.springblade.desk.energy.excel.BsEnergyTargetWaterExcel; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Map; /** * 能耗目标表 Mapper 接口 @@ -58,6 +59,13 @@ public interface BsEnergyTargetMapper extends BaseMapper { * @param queryWrapper 查询条件 * @return List */ - List exportBsEnergyTarget(@Param("ew") Wrapper queryWrapper); + List exportBsEnergyTarget(@Param("ew") Wrapper queryWrapper); + + /** + * 根据条件查询列表 + * @param conMap + * @return + */ + List listByMap(Map conMap); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyCoreUseMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyCoreUseMapper.xml new file mode 100644 index 00000000..f16fdaf7 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyCoreUseMapper.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyHistoryRecMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyHistoryRecMapper.xml new file mode 100644 index 00000000..48450a00 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyHistoryRecMapper.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyMonitorMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyMonitorMapper.xml index 523b19fe..dddc63f0 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyMonitorMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyMonitorMapper.xml @@ -31,7 +31,13 @@ diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyQuotaMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyQuotaMapper.xml index f7a0db40..f17b68c0 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyQuotaMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyQuotaMapper.xml @@ -24,11 +24,29 @@ - SELECT * FROM BS_ENERGY_QUOTA ${ew.customSqlSegment} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyTargetMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyTargetMapper.xml index 8362d7a0..3ef61635 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyTargetMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyTargetMapper.xml @@ -7,7 +7,7 @@ - + @@ -16,16 +16,54 @@ + - SELECT * FROM BS_ENERGY_TARGET ${ew.customSqlSegment} + + diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/PeakFlatValleyMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/PeakFlatValleyMapper.xml index c4b86bff..94dad978 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/PeakFlatValleyMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/PeakFlatValleyMapper.xml @@ -31,7 +31,13 @@ diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyCoreUseEntity.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyCoreUseEntity.java new file mode 100644 index 00000000..8287efa6 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyCoreUseEntity.java @@ -0,0 +1,110 @@ +package org.springblade.desk.energy.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +import java.io.Serial; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 水电能耗记录表 实体类 + * + * @author BladeX + * @since 2026-04-16 + */ +@Data +@TableName("BS_ENERGY_CORE_USE") +@Schema(description = "BsEnergyCoreUse对象") +@EqualsAndHashCode(callSuper = true) +public class BsEnergyCoreUseEntity extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 类型 1-用水 2-用电 + */ + @Schema(description = "类型 1-用水 2-用电") + private String type; + /** + * 作业中心ID + */ + @Schema(description = "作业中心ID") + private String workCenterId; + /** + * 作业中心名称 + */ + @Schema(description = "作业中心名称") + private String workCenterName; + /** + * 开始时间 + */ + @Schema(description = "开始时间") + private Date startTime; + + /** + * 结束时间 + */ + @Schema(description = "结束时间") + private Date endTime; + /** + * 加工面积 + */ + @Schema(description = "加工面积") + private BigDecimal workArea; + /** + * 定额单位面积自来水用水量 + */ + @Schema(description = "定额单位面积自来水用水量") + private BigDecimal quoTapWaterNum; + /** + * 实际单位面积自来水用水量 + */ + @Schema(description = "实际单位面积自来水用水量") + private BigDecimal realTapWaterNum; + /** + * 实际总自来水用水量 + */ + @Schema(description = "实际总自来水用水量") + private BigDecimal totalTapWaterNum; + /** + * 定额单位面积纯水用水量 + */ + @Schema(description = "定额单位面积纯水用水量") + private BigDecimal quoPureWaterNum; + /** + * 实际单位面积纯水用水量 + */ + @Schema(description = "实际单位面积纯水用水量") + private BigDecimal realPureWaterNum; + /** + * 实际总纯水用水量 + */ + @Schema(description = "实际总纯水用水量") + private BigDecimal totalPureWaterNum; + /** + * 定额单位面积用电量 + */ + @Schema(description = "定额单位面积用电量") + private BigDecimal quoElectricNum; + /** + * 实际单位面积用电量 + */ + @Schema(description = "实际单位面积用电量") + private BigDecimal realElectricNum; + /** + * 实际总用电量 + */ + @Schema(description = "实际总用电量") + private BigDecimal totalElectricNum; + /** + * 是否大屏展示 + */ + @Schema(description = "是否大屏展示") + private Integer isJumbotron; + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyHistoryRecEntity.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyHistoryRecEntity.java new file mode 100644 index 00000000..90421c89 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyHistoryRecEntity.java @@ -0,0 +1,54 @@ +package org.springblade.desk.energy.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * iot水电能耗历史记录表 实体类 + * + * @author BladeX + * @since 2026-04-17 + */ +@Data +@TableName("BS_ENERGY_HISTORY_REC") +@Schema(description = "BsEnergyHistoryRec对象") +@EqualsAndHashCode(callSuper = true) +public class BsEnergyHistoryRecEntity extends BaseEntity { + + /** + * 设备ID + */ + @Schema(description = "设备ID") + private Long deviceId; + /** + * 设备编码 + */ + @Schema(description = "设备编码") + private String deviceCode; + /** + * 自来水量读取值 + */ + @Schema(description = "自来水量读取值") + private BigDecimal readTap; + /** + * 纯水量读取值 + */ + @Schema(description = "纯水量读取值") + private BigDecimal readPure; + /** + * 电量读取值 + */ + @Schema(description = "电量读取值") + private BigDecimal readElectric; + /** + * iot上传时间 + */ + @Schema(description = "iot上传时间") + private Date uploadTime; +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyMonitorEntity.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyMonitorEntity.java index 8309665e..f047d30e 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyMonitorEntity.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyMonitorEntity.java @@ -31,6 +31,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import java.util.Date; import java.math.BigDecimal; import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; import org.springblade.core.tenant.mp.TenantEntity; import java.io.Serial; @@ -44,7 +45,7 @@ import java.io.Serial; @TableName("BS_ENERGY_MONITOR") @Schema(description = "BsEnergyMonitor对象") @EqualsAndHashCode(callSuper = true) -public class BsEnergyMonitorEntity extends TenantEntity { +public class BsEnergyMonitorEntity extends BaseEntity { @Serial private static final long serialVersionUID = 1L; @@ -53,7 +54,7 @@ public class BsEnergyMonitorEntity extends TenantEntity { * 月份 */ @Schema(description = "月份") - private Date month; + private String month; /** * 上月用水 */ diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyQuotaEntity.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyQuotaEntity.java index a130b1f2..1de0709c 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyQuotaEntity.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyQuotaEntity.java @@ -25,6 +25,7 @@ */ package org.springblade.desk.energy.pojo.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -32,6 +33,7 @@ import lombok.EqualsAndHashCode; import org.springblade.core.mp.base.BaseEntity; import java.io.Serial; +import java.math.BigDecimal; import java.util.Date; /** @@ -58,7 +60,7 @@ public class BsEnergyQuotaEntity extends BaseEntity { * 作业中心ID */ @Schema(description = "作业中心ID") - private Long workCenterId; + private String workCenterId; /** * 作业中心名称 */ @@ -78,21 +80,22 @@ public class BsEnergyQuotaEntity extends BaseEntity { * 日期 */ @Schema(description = "日期") - private Date date; + @TableField("\"DATE\"") + private String date; /** * 自来水用水量 */ @Schema(description = "自来水用水量") - private Long tapWaterNum; + private BigDecimal tapWaterNum; /** * 纯水用水量 */ @Schema(description = "纯水用水量") - private Long pureWaterNum; + private BigDecimal pureWaterNum; /** * 用电量 */ @Schema(description = "用电量") - private Long electricNum; + private BigDecimal electricNum; } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyTargetEntity.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyTargetEntity.java index 8f3462c1..917d242f 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyTargetEntity.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsEnergyTargetEntity.java @@ -59,17 +59,17 @@ public class BsEnergyTargetEntity extends BaseEntity { * 月份 */ @Schema(description = "月份") - private Date month; + private String month; /** * 年 */ @Schema(description = "年") - private Date year; - /** - * 日期 - */ - @Schema(description = "日期") - private String date; + private String year; +// /** +// * 日期 +// */ +// @Schema(description = "日期") +// private String date; /** * 目标 */ diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsPeakFlatValleyEntity.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsPeakFlatValleyEntity.java index 05c4adf4..74045189 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsPeakFlatValleyEntity.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsPeakFlatValleyEntity.java @@ -53,7 +53,7 @@ public class BsPeakFlatValleyEntity extends BaseEntity { * 月份 */ @Schema(description = "月份") - private Date month; + private String month; /** * 尖时一开始时间 */ diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/vo/BsEnergyCoreUseVO.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/vo/BsEnergyCoreUseVO.java new file mode 100644 index 00000000..d8fd97c4 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/vo/BsEnergyCoreUseVO.java @@ -0,0 +1,41 @@ +package org.springblade.desk.energy.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.desk.energy.pojo.entity.BsEnergyCoreUseEntity; + +import java.io.Serial; + +/** + * 水电能耗记录表 视图实体类 + * + * @author BladeX + * @since 2026-04-16 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class BsEnergyCoreUseVO extends BsEnergyCoreUseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 开始日期 + */ + @Schema(description = "开始日期") + private String startDate; + + /** + * 结束日期 + */ + @Schema(description = "结束日期") + private String endDate; + + /** + * 日期 + */ + @Schema(description = "日期") + private String date; + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/vo/BsEnergyHistoryRecVO.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/vo/BsEnergyHistoryRecVO.java new file mode 100644 index 00000000..c8ae2218 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/vo/BsEnergyHistoryRecVO.java @@ -0,0 +1,38 @@ +package org.springblade.desk.energy.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.desk.energy.pojo.entity.BsEnergyHistoryRecEntity; + +import java.io.Serial; + +/** + * iot水电能耗历史记录表 视图实体类 + * + * @author BladeX + * @since 2026-04-16 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class BsEnergyHistoryRecVO extends BsEnergyHistoryRecEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 设备名称 + */ + @Schema(description = "设备名称") + private String deviceName; + /** + * 设备型号 + */ + @Schema(description = "设备型号") + private String macSpec; + /** + * 服役状态 + */ + @Schema(description = "服役状态") + private Long used; +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEnergyCoreUseService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEnergyCoreUseService.java new file mode 100644 index 00000000..19b577e3 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEnergyCoreUseService.java @@ -0,0 +1,36 @@ +package org.springblade.desk.energy.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springblade.core.mp.base.BaseService; +import org.springblade.desk.energy.pojo.entity.BsEnergyCoreUseEntity; +import org.springblade.desk.energy.pojo.vo.BsEnergyCoreUseVO; + +/** + * 水电能耗记录表 服务类 + * + * @author BladeX + * @since 2026-04-17 + */ +public interface IBsEnergyCoreUseService extends BaseService { + + /** + * 自定义分页 + * @param page 分页参数 + * @param bsEnergyCoreUse 查询参数 + * @return IPage + */ + IPage selectBsEnergyCoreUsePage(IPage page, BsEnergyCoreUseVO bsEnergyCoreUse); + + /** + * 更新用水用电记录 + * @param type 类型 + */ + void updateUsed(String type); + + /** + * 保存iot用水用电历史记录 + */ + void saveHistoryRec(); + + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEnergyHistoryRecService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEnergyHistoryRecService.java new file mode 100644 index 00000000..55559ae1 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEnergyHistoryRecService.java @@ -0,0 +1,33 @@ +package org.springblade.desk.energy.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springblade.core.mp.base.BaseService; +import org.springblade.desk.energy.pojo.entity.BsEnergyHistoryRecEntity; +import org.springblade.desk.energy.pojo.vo.BsEnergyHistoryRecVO; + +import java.util.List; + +/** + * 水电能耗记录表 服务类 + * + * @author BladeX + * @since 2026-04-17 + */ +public interface IBsEnergyHistoryRecService extends BaseService { + + /** + * 自定义分页 + * + * @param page 分页参数 + * @param bsEnergyHistoryRec 查询参数 + * @return IPage + */ + IPage selectBsEnergyHistoryRecPage(IPage page, BsEnergyHistoryRecVO bsEnergyHistoryRec); + + /** + * 自定义查询 + * @param bsEnergyHistoryRec 查询参数 + * @return List + */ + List selectBsEnergyHistoryRec(BsEnergyHistoryRecVO bsEnergyHistoryRec); +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEnergyQuotaService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEnergyQuotaService.java index 58a33667..931d5db2 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEnergyQuotaService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEnergyQuotaService.java @@ -28,7 +28,7 @@ package org.springblade.desk.energy.service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import org.springblade.desk.energy.pojo.entity.BsEnergyQuotaEntity; import org.springblade.desk.energy.pojo.vo.BsEnergyQuotaVO; -import org.springblade.desk.energy.excel.BsEnergyQuotaExcel; +import org.springblade.desk.energy.excel.BsEnergyQuotaWaterExcel; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseService; import java.util.List; @@ -56,6 +56,6 @@ public interface IBsEnergyQuotaService extends BaseService * @param queryWrapper 查询条件 * @return List */ - List exportBsEnergyQuota(Wrapper queryWrapper); + List exportBsEnergyQuota(Wrapper queryWrapper); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEnergyTargetService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEnergyTargetService.java index 17a70a92..8247f41b 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEnergyTargetService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEnergyTargetService.java @@ -28,12 +28,13 @@ package org.springblade.desk.energy.service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import org.springblade.desk.energy.pojo.entity.BsEnergyTargetEntity; import org.springblade.desk.energy.pojo.vo.BsEnergyTargetVO; -import org.springblade.desk.energy.excel.BsEnergyTargetExcel; +import org.springblade.desk.energy.excel.BsEnergyTargetWaterExcel; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseService; import java.math.BigDecimal; import java.util.List; +import java.util.Map; /** * 能耗目标表 服务类 @@ -42,35 +43,45 @@ import java.util.List; * @since 2026-03-02 */ public interface IBsEnergyTargetService extends BaseService { - /** - * 自定义分页 - * - * @param page 分页参数 - * @param bsEnergyTarget 查询参数 - * @return IPage - */ - IPage selectBsEnergyTargetPage(IPage page, BsEnergyTargetVO bsEnergyTarget); + /** + * 自定义分页 + * + * @param page 分页参数 + * @param bsEnergyTarget 查询参数 + * @return IPage + */ + IPage selectBsEnergyTargetPage(IPage page, BsEnergyTargetVO bsEnergyTarget); - /** - * 导出数据 - * - * @param queryWrapper 查询条件 - * @return List - */ - List exportBsEnergyTarget(Wrapper queryWrapper); + /** + * 导出数据 + * + * @param queryWrapper 查询条件 + * @return List + */ + List exportBsEnergyTarget(Wrapper queryWrapper); - /** - * 根据月份获取用水目标 - * @param month 月份 - * @return 用水目标 - */ - BigDecimal getWaterTargetByMonth(String month); + /** + * 根据月份获取用水目标 + * + * @param month 月份 + * @return 用水目标 + */ + BigDecimal getWaterTargetByMonth(String month); - /** - * 根据月份获取用电目标 - * @param month 月份 - * @return 用电目标 - */ - BigDecimal getElectricTargetByMonth(String month); + /** + * 根据月份获取用电目标 + * + * @param month 月份 + * @return 用电目标 + */ + BigDecimal getElectricTargetByMonth(String month); + + /** + * 根据条件查询列表 + * + * @param conMap + * @return + */ + List listByMap(Map conMap); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEnergyCoreUseServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEnergyCoreUseServiceImpl.java new file mode 100644 index 00000000..8b36a5a4 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEnergyCoreUseServiceImpl.java @@ -0,0 +1,287 @@ +package org.springblade.desk.energy.service.impl; + +import com.alibaba.excel.util.StringUtils; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import jakarta.annotation.Resource; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.desk.device.pojo.entity.EquipmentEntity; +import org.springblade.desk.device.service.IEquipmentService; +import org.springblade.desk.energy.mapper.BsEnergyCoreUseMapper; +import org.springblade.desk.energy.pojo.entity.BsEnergyCoreUseEntity; +import org.springblade.desk.energy.pojo.entity.BsEnergyHistoryRecEntity; +import org.springblade.desk.energy.pojo.entity.BsEnergyQuotaEntity; +import org.springblade.desk.energy.pojo.vo.BsEnergyCoreUseVO; +import org.springblade.desk.energy.pojo.vo.BsEnergyHistoryRecVO; +import org.springblade.desk.energy.service.IBsEnergyCoreUseService; +import org.springblade.desk.energy.service.IBsEnergyHistoryRecService; +import org.springblade.desk.energy.service.IBsEnergyQuotaService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.web.client.RestTemplate; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + + +/** + * 水电能耗记录表 服务实现类 + * + * @author BladeX + * @since 2026-04-17 + */ +@Service +public class BsEnergyCoreUseServiceImpl extends BaseServiceImpl implements IBsEnergyCoreUseService { + + @Resource + private IBsEnergyQuotaService bsEnergyQuotaService; + @Resource + private IBsEnergyHistoryRecService bsEnergyHistoryRecService; + @Resource + private IEquipmentService equipmentService; + @Resource + private RestTemplate httpClientTemplate; + + private String timestamp = "timestamp", waterOne = "Water1", waterTwo = "Water2", waterThree = "Water3", waterFour = "Water4", readElectric = "ElectricPower", readElectric2 = "TotalElectricEnergyOfBX2", readElectric3 = "TotalElectricEnergyOfBX3"; + + @Value("${request.iotNew.url}") + private String iotNewUrl; + + @Value("${request.iot.orgId}") + private String orgId; + + @Value("${request.iot.systemId}") + private String systemId; + + @Override + public IPage selectBsEnergyCoreUsePage(IPage page, BsEnergyCoreUseVO bsEnergyCoreUse) { + return page.setRecords(baseMapper.selectBsEnergyCoreUsePage(page, bsEnergyCoreUse)); + } + + @Override + public void updateUsed(String type) { + List bsEnergyQuotaEntitys = bsEnergyQuotaService.list(new LambdaQueryWrapper() + .eq(BsEnergyQuotaEntity::getType, type)); + if (CollectionUtils.isEmpty(bsEnergyQuotaEntitys)) { + return; + } + // 时间处理 + Date date = new Date(); + LocalDate today = LocalDate.now(); + LocalDate yesterday = today.minusDays(1); + LocalDateTime minTime = LocalDateTime.of(yesterday, LocalTime.MIN); + LocalDateTime maxTime = LocalDateTime.of(yesterday, LocalTime.MAX); + Date startTime = Date.from(minTime.atZone(ZoneId.systemDefault()).toInstant()); + Date endTime = Date.from(maxTime.atZone(ZoneId.systemDefault()).toInstant()); + for (BsEnergyQuotaEntity bsEnergyQuotaEntity : bsEnergyQuotaEntitys) { + Long equipmentId = bsEnergyQuotaEntity.getEquipmentId(); + EquipmentEntity equipment = equipmentService.getById(equipmentId); + if (equipment == null) { + continue; + } + BsEnergyHistoryRecVO params = new BsEnergyHistoryRecVO(); + params.setCreateTime(startTime); + params.setDeviceCode(equipment.getDeviceCode()); + List hrList = bsEnergyHistoryRecService.selectBsEnergyHistoryRec(params); + if (!CollectionUtils.isEmpty(hrList)) { + // 每日用自来水最大最小值 + BigDecimal maxTa = hrList.get(hrList.size() - 1).getReadTap(); + BigDecimal minTa = hrList.get(0).getReadTap(); + // 每日用纯水最大最小值 + BigDecimal maxPu = hrList.get(hrList.size() - 1).getReadPure(); + BigDecimal minPu = hrList.get(0).getReadPure(); + // 每日用电最大最小值 + BigDecimal maxEl = hrList.get(hrList.size() - 1).getReadElectric(); + BigDecimal minEl = hrList.get(0).getReadElectric(); + this.createWorkCenterUse(bsEnergyQuotaEntity, maxTa.subtract(minTa), maxPu.subtract(minPu), maxEl.subtract(minEl), date, startTime, endTime, type); + } + } + } + + @Override + public void saveHistoryRec() { + List equipments = equipmentService.list(new LambdaQueryWrapper().eq(EquipmentEntity::getIsDeleted, 0)); + LocalDateTime now = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault()); + LocalDateTime lastHour = now.minusHours(1); + DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String startTime = lastHour.format(fmt); + String endTime = now.format(fmt); + List params = Arrays.asList("Water4", "Water3", "Water2", "Water1", "ElectricPower", "TotalElectricEnergyOfBX2", "TotalElectricEnergyOfBX2"); + BsEnergyHistoryRecEntity bsEnergyHistoryRec; + JSONObject jsonObject; + for (EquipmentEntity equipment : equipments) { + List eneUsed; + String deviceCode = equipment.getDeviceCode(); + try { + eneUsed = this.getEneUsed(deviceCode, params, startTime, endTime); + } catch (Exception e) { + log.error("设备:" + deviceCode + "查询用水用电量接口调用失败!\n" + e.getMessage()); + continue; + } + if (CollectionUtils.isEmpty(eneUsed)) { + continue; + } + jsonObject = eneUsed.get(eneUsed.size() - 1); + bsEnergyHistoryRec = new BsEnergyHistoryRecEntity(); + bsEnergyHistoryRec.setDeviceId(equipment.getId()); + bsEnergyHistoryRec.setDeviceCode(equipment.getDeviceCode()); + // 读取自来水用量(如果存在自来水2则计算累加值) + if (jsonObject.get(waterThree) != null) { + bsEnergyHistoryRec.setReadTap(new BigDecimal(this.totalRead(jsonObject, waterOne, waterThree))); + } else { + bsEnergyHistoryRec.setReadTap(new BigDecimal(this.totalRead(jsonObject, waterOne))); + } + // 读取纯水用量(如果存在纯水2则计算累加值) + if (jsonObject.get(waterFour) != null) { + bsEnergyHistoryRec.setReadPure(new BigDecimal(this.totalRead(jsonObject, waterTwo, waterFour))); + } else { + bsEnergyHistoryRec.setReadPure(new BigDecimal(this.totalRead(jsonObject, waterTwo))); + } + // 读取电用量 + bsEnergyHistoryRec.setReadElectric(new BigDecimal(this.totalRead(jsonObject, readElectric, readElectric2, readElectric3))); + // 读取上传时间 + bsEnergyHistoryRec.setUploadTime(jsonObject.getDate(timestamp)); + BsEnergyHistoryRecEntity last = bsEnergyHistoryRecService.getOne(new LambdaQueryWrapper().eq(BsEnergyHistoryRecEntity::getDeviceCode, deviceCode).orderByDesc(BsEnergyHistoryRecEntity::getCreateTime).last("AND ROWNUM = 1")); + if (last != null && last.getId() != null) { + BigDecimal readElectric = last.getReadElectric(); // 电 + BigDecimal readPure = last.getReadPure(); // 纯水 + BigDecimal readTap = last.getReadTap();// 自来水 + // 如果最新的自来水数据为空或者小于上一笔数据,直接改为上一笔数据 + if (!(bsEnergyHistoryRec.getReadTap() != null && bsEnergyHistoryRec.getReadTap().compareTo(readTap) > 0)) { + bsEnergyHistoryRec.setReadTap(readTap); + } + // 如果最新的纯水数据为空或者小于上一笔数据,直接改为上一笔数据 + if (!(bsEnergyHistoryRec.getReadPure() != null && bsEnergyHistoryRec.getReadPure().compareTo(readPure) > 0)) { + bsEnergyHistoryRec.setReadPure(readPure); + } + // 如果最新的电数据为空或者小于上一笔数据,直接改为上一笔数据 + if (!(bsEnergyHistoryRec.getReadElectric() != null && bsEnergyHistoryRec.getReadElectric().compareTo(readElectric) > 0)) { + bsEnergyHistoryRec.setReadElectric(readElectric); + } + } + bsEnergyHistoryRecService.save(bsEnergyHistoryRec); + } + } + + /** + * 创建作业中心用水用电记录 + * + * @param bsEnergyQuota + * @param useTa + * @param usePu + * @param useEl + * @param date + * @param startTime + * @param endTime + * @param type + */ + private void createWorkCenterUse(BsEnergyQuotaEntity bsEnergyQuota, BigDecimal useTa, BigDecimal usePu, BigDecimal useEl, Date date, Date startTime, Date endTime, String type) { + String workCenterId = bsEnergyQuota.getWorkCenterId(); + if (StringUtils.isEmpty(workCenterId)) { + return; + } + BigDecimal wcArea = new BigDecimal("0"); + // TODO 作业面积 + BigDecimal quotaEl = bsEnergyQuota.getElectricNum(); // 定额单位面积用电量 + BigDecimal tapWater = bsEnergyQuota.getTapWaterNum(); // 定额自来水单位用量 + BigDecimal pureWater = bsEnergyQuota.getPureWaterNum(); // 定额纯水单位用量 + + BigDecimal realUnitTa = new BigDecimal("0"); // 实际自来水单位用量 + BigDecimal realUnitPu = new BigDecimal("0"); // 实际纯水单位用量 + BigDecimal realUnitEl = new BigDecimal("0"); // 实际单位面积用电量 + + BsEnergyCoreUseEntity bsEnergyCoreUse = new BsEnergyCoreUseEntity(); + if (!(wcArea.compareTo(BigDecimal.ZERO) == 0)) { + realUnitTa = useTa.divide(wcArea, 6, RoundingMode.HALF_UP); + realUnitPu = usePu.divide(wcArea, 6, RoundingMode.HALF_UP); + realUnitEl = useEl.divide(wcArea, 6, RoundingMode.HALF_UP); + } + bsEnergyCoreUse.setType(type); + bsEnergyCoreUse.setWorkCenterId(bsEnergyQuota.getWorkCenterId()); + bsEnergyCoreUse.setWorkCenterName(bsEnergyQuota.getWorkCenterName()); + bsEnergyCoreUse.setStartTime(startTime); + bsEnergyCoreUse.setEndTime(endTime); + bsEnergyCoreUse.setWorkArea(wcArea); + bsEnergyCoreUse.setQuoTapWaterNum(tapWater); + bsEnergyCoreUse.setQuoPureWaterNum(pureWater); + bsEnergyCoreUse.setQuoElectricNum(quotaEl); + bsEnergyCoreUse.setRealTapWaterNum(realUnitTa); + bsEnergyCoreUse.setRealPureWaterNum(realUnitPu); + bsEnergyCoreUse.setRealElectricNum(realUnitEl); + bsEnergyCoreUse.setTotalTapWaterNum(useTa); + bsEnergyCoreUse.setTotalPureWaterNum(usePu); + bsEnergyCoreUse.setTotalElectricNum(useEl); + bsEnergyCoreUse.setIsJumbotron(0); + this.save(bsEnergyCoreUse); + } + + /** + * 获取iot用水用电记录 + * + * @param deviceCode + * @param params + * @param startTime + * @param endTime + * @return + */ + private List getEneUsed(String deviceCode, List params, String startTime, String endTime) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + JSONObject object = new JSONObject(); + object.put("orgId", orgId); + object.put("systemId", systemId); + object.put("params", params); // 设备对应的参数信息 + object.put("deviceId", deviceCode); // 设备编码 + object.put("startTime", startTime); // 开始时间(入炉) + object.put("endTime", endTime); // 结束时间(出炉) + HttpEntity entity = new HttpEntity<>(object, headers); + ResponseEntity responseEntity = null; + try { + responseEntity = httpClientTemplate.postForEntity(iotNewUrl + "/deviceForZhgd/deviceDataHistoryByParams", entity, JSONObject.class); + JSONObject result = responseEntity.getBody(); + if (result != null && result.getInteger("code").equals(0)) { + List jsonList = JSONArray.parseArray(result.getJSONArray("result").toJSONString(), JSONObject.class); + if (jsonList != null && jsonList.size() > 0) { + return jsonList; + } + } else { + log.error("获取用水用电量、烧结解绑获取数据接口调用失败!" + result.getString("message") + "设备编码" + deviceCode + "参数" + object); + } + } catch (Exception e) { + log.error("获取用水用电量、烧结解绑获取数据接口调用失败!" + e.getMessage() + "设备编码" + deviceCode + "参数" + object); + } + return null; + } + + /** + * 合计读取值 + * + * @param jsonObject + * @param args + * @return + */ + public Double totalRead(JSONObject jsonObject, String... args) { + Double total = 0d; + String waStr; + for (String s : args) { + waStr = jsonObject.getString(s); + total += org.apache.commons.lang3.StringUtils.isNotBlank(waStr) ? Double.valueOf(waStr) : 0; + } + return total; + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEnergyHistoryRecServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEnergyHistoryRecServiceImpl.java new file mode 100644 index 00000000..a33f2611 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEnergyHistoryRecServiceImpl.java @@ -0,0 +1,31 @@ +package org.springblade.desk.energy.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.desk.energy.mapper.BsEnergyHistoryRecMapper; +import org.springblade.desk.energy.pojo.entity.BsEnergyHistoryRecEntity; +import org.springblade.desk.energy.pojo.vo.BsEnergyHistoryRecVO; +import org.springblade.desk.energy.service.IBsEnergyHistoryRecService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * iot水电能耗历史记录表 服务实现类 + * + * @author BladeX + * @since 2026-04-17 + */ +@Service +public class BsEnergyHistoryRecServiceImpl extends BaseServiceImpl implements IBsEnergyHistoryRecService { + + @Override + public IPage selectBsEnergyHistoryRecPage(IPage page, BsEnergyHistoryRecVO bsEnergyHistoryRec) { + return page.setRecords(baseMapper.selectBsEnergyHistoryRecPage(page, bsEnergyHistoryRec)); + } + + @Override + public List selectBsEnergyHistoryRec(BsEnergyHistoryRecVO bsEnergyHistoryRec) { + return baseMapper.selectBsEnergyHistoryRec(bsEnergyHistoryRec); + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEnergyQuotaServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEnergyQuotaServiceImpl.java index 91d63c1c..5723c5bc 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEnergyQuotaServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEnergyQuotaServiceImpl.java @@ -27,7 +27,7 @@ package org.springblade.desk.energy.service.impl; import org.springblade.desk.energy.pojo.entity.BsEnergyQuotaEntity; import org.springblade.desk.energy.pojo.vo.BsEnergyQuotaVO; -import org.springblade.desk.energy.excel.BsEnergyQuotaExcel; +import org.springblade.desk.energy.excel.BsEnergyQuotaWaterExcel; import org.springblade.desk.energy.mapper.BsEnergyQuotaMapper; import org.springblade.desk.energy.service.IBsEnergyQuotaService; import org.springframework.stereotype.Service; @@ -52,8 +52,8 @@ public class BsEnergyQuotaServiceImpl extends BaseServiceImpl exportBsEnergyQuota(Wrapper queryWrapper) { - List bsEnergyQuotaList = baseMapper.exportBsEnergyQuota(queryWrapper); + public List exportBsEnergyQuota(Wrapper queryWrapper) { + List bsEnergyQuotaList = baseMapper.exportBsEnergyQuota(queryWrapper); //bsEnergyQuotaList.forEach(bsEnergyQuota -> { // bsEnergyQuota.setTypeName(DictCache.getValue(DictEnum.YES_NO, BsEnergyQuota.getType())); //}); diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEnergyTargetServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEnergyTargetServiceImpl.java index 8f9cb33b..b65eb467 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEnergyTargetServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEnergyTargetServiceImpl.java @@ -29,7 +29,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springblade.desk.dashboard.utils.DateUtils; import org.springblade.desk.energy.pojo.entity.BsEnergyTargetEntity; import org.springblade.desk.energy.pojo.vo.BsEnergyTargetVO; -import org.springblade.desk.energy.excel.BsEnergyTargetExcel; +import org.springblade.desk.energy.excel.BsEnergyTargetWaterExcel; import org.springblade.desk.energy.mapper.BsEnergyTargetMapper; import org.springblade.desk.energy.service.IBsEnergyTargetService; import org.springframework.stereotype.Service; @@ -39,6 +39,7 @@ import org.springblade.core.mp.base.BaseServiceImpl; import java.math.BigDecimal; import java.util.List; +import java.util.Map; /** * 能耗目标表 服务实现类 @@ -56,8 +57,8 @@ public class BsEnergyTargetServiceImpl extends BaseServiceImpl exportBsEnergyTarget(Wrapper queryWrapper) { - List bsEnergyTargetList = baseMapper.exportBsEnergyTarget(queryWrapper); + public List exportBsEnergyTarget(Wrapper queryWrapper) { + List bsEnergyTargetList = baseMapper.exportBsEnergyTarget(queryWrapper); //bsEnergyTargetList.forEach(bsEnergyTarget -> { // bsEnergyTarget.setTypeName(DictCache.getValue(DictEnum.YES_NO, BsEnergyTarget.getType())); //}); @@ -86,4 +87,9 @@ public class BsEnergyTargetServiceImpl extends BaseServiceImpl listByMap(Map conMap){ + return baseMapper.listByMap(conMap); + } } diff --git a/blade-service/blade-desk/src/main/resources/Excel/energy/用水定额.xls b/blade-service/blade-desk/src/main/resources/Excel/energy/用水定额.xls new file mode 100644 index 0000000000000000000000000000000000000000..5c653d995ac07e263de7be5d927b4cd1106503c6 GIT binary patch literal 20480 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 N^Prz~;Pn4G{3nYwqWb^< literal 0 HcmV?d00001 diff --git a/blade-service/blade-desk/src/main/resources/Excel/energy/用电定额.xls b/blade-service/blade-desk/src/main/resources/Excel/energy/用电定额.xls new file mode 100644 index 0000000000000000000000000000000000000000..3218b306d2554b32cb4c0c72c8eee983efe25a51 GIT binary patch literal 20480 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 od*PtxLt0Spp|*#+0FVb#>4@PAQ;q