From 59951b77c3f77ebda5e163a7795d57c7d3e9f22e Mon Sep 17 00:00:00 2001 From: 86156 <823267011@qq.com> Date: Sun, 7 Dec 2025 17:23:47 +0800 Subject: [PATCH] =?UTF-8?q?l3=E8=83=BD=E6=BA=90=E6=88=90=E6=9C=AC=E5=88=86?= =?UTF-8?q?=E6=91=8A=EF=BC=88=E9=83=A8=E5=88=86=E5=AE=8C=E6=88=90=E7=95=99?= =?UTF-8?q?=E5=AD=98=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- klp-ems/pom.xml | 8 + .../EmsEnergyConsumptionController.java | 34 + .../controller/EmsEnergyRateController.java | 71 +- .../ems/controller/EmsMeterController.java | 19 + .../ems/controller/EmsRateTierController.java | 105 + .../EmsRateTierPeriodLinkController.java | 86 + .../EmsRateTimePeriodLinkController.java | 105 + .../EnergyCostReportController.java | 50 + .../WmsEnergyCoilDailyController.java | 99 + .../klp/ems/domain/CostCoilDailyEnergy.java | 22 + .../com/klp/ems/domain/EmsEnergyRate.java | 12 + .../java/com/klp/ems/domain/EmsRateTier.java | 65 + .../klp/ems/domain/EmsRateTierPeriodLink.java | 58 + .../klp/ems/domain/EmsRateTimePeriodLink.java | 55 + .../com/klp/ems/domain/EmsTimePeriod.java | 62 + .../klp/ems/domain/WmsEnergyCoilDaily.java | 51 + .../ems/domain/bo/EmsEnergyConsumptionBo.java | 5 + .../klp/ems/domain/bo/EmsEnergyRateBo.java | 10 + .../com/klp/ems/domain/bo/EmsRateTierBo.java | 53 + .../domain/bo/EmsRateTierPeriodLinkBo.java | 40 + .../domain/bo/EmsRateTimePeriodLinkBo.java | 68 + .../klp/ems/domain/bo/EmsTimePeriodBo.java | 51 + .../klp/ems/domain/bo/EnergyCostReportBo.java | 54 + .../ems/domain/bo/WmsEnergyCoilDailyBo.java | 51 + .../klp/ems/domain/dto/AllocationCoilDto.java | 37 + .../klp/ems/domain/dto/MeterTemplateDto.java | 48 + .../ems/domain/vo/EmsEnergyConsumptionVo.java | 15 + .../klp/ems/domain/vo/EmsEnergyRateVo.java | 17 + .../com/klp/ems/domain/vo/EmsMeterVo.java | 19 +- .../domain/vo/EmsRateTierPeriodLinkVo.java | 96 + .../com/klp/ems/domain/vo/EmsRateTierVo.java | 69 + .../domain/vo/EmsRateTimePeriodLinkVo.java | 75 + .../klp/ems/domain/vo/EmsTimePeriodVo.java | 60 + .../ems/domain/vo/EnergyCostSummaryVo.java | 42 + .../vo/WmsEnergyCoilDailyStatisticsVo.java | 39 + .../ems/domain/vo/WmsEnergyCoilDailyVo.java | 84 + .../klp/ems/mapper/CostCoilDailyMapper.java | 21 + .../mapper/EmsEnergyConsumptionMapper.java | 22 + .../klp/ems/mapper/EmsEnergyRateMapper.java | 8 + .../com/klp/ems/mapper/EmsRateTierMapper.java | 26 + .../mapper/EmsRateTierPeriodLinkMapper.java | 65 + .../mapper/EmsRateTimePeriodLinkMapper.java | 21 + .../klp/ems/mapper/EmsTimePeriodMapper.java | 14 + .../ems/mapper/WmsEnergyCoilDailyMapper.java | 53 + .../service/IEmsEnergyConsumptionService.java | 22 + .../ems/service/IEmsEnergyRateService.java | 50 +- .../com/klp/ems/service/IEmsMeterService.java | 12 + .../IEmsRateTierPeriodLinkService.java | 58 + .../klp/ems/service/IEmsRateTierService.java | 58 + .../IEmsRateTimePeriodLinkService.java | 58 + .../ems/service/IEmsTimePeriodService.java | 48 + .../ems/service/IEnergyAllocationService.java | 19 + .../ems/service/IEnergyCostReportService.java | 25 + .../service/IWmsEnergyCoilDailyService.java | 42 + .../impl/EmsEnergyConsumptionServiceImpl.java | 107 +- .../impl/EmsEnergyRateServiceImpl.java | 247 +- .../ems/service/impl/EmsMeterServiceImpl.java | 117 + .../EmsRateTierPeriodLinkServiceImpl.java | 79 + .../service/impl/EmsRateTierServiceImpl.java | 98 + .../EmsRateTimePeriodLinkServiceImpl.java | 98 + .../impl/EmsTimePeriodServiceImpl.java | 88 + .../impl/EnergyCostReportServiceImpl.java | 55 + .../impl/WmsEnergyCoilDailyServiceImpl.java | 126 + .../resources/mapper/CostCoilDailyMapper.xml | 13 + .../mapper/EmsEnergyConsumptionMapper.xml | 62 + .../resources/mapper/EmsEnergyRateMapper.xml | 66 + .../main/resources/mapper/EmsMeterMapper.xml | 50 + .../resources/mapper/EmsRateTierMapper.xml | 41 + .../mapper/EmsRateTierPeriodLinkMapper.xml | 105 + .../mapper/EmsRateTimePeriodLinkMapper.xml | 46 + .../resources/mapper/EmsTimePeriodMapper.xml | 18 + .../mapper/WmsEnergyCoilDailyMapper.xml | 244 ++ klp-ui/src/api/ems/energyAllocation.js | 152 ++ klp-ui/src/api/ems/energyCoilDaily.js | 18 + klp-ui/src/api/ems/energyConsumption.js | 30 + klp-ui/src/api/ems/energyCostReport.js | 25 + klp-ui/src/api/ems/energyLink.js | 71 + klp-ui/src/api/ems/energyRate.js | 51 + klp-ui/src/api/ems/energyTask.js | 33 + klp-ui/src/api/ems/location.js | 16 + klp-ui/src/api/ems/meter.js | 23 + klp-ui/src/api/ems/warehouse.js | 44 + klp-ui/src/assets/icons/svg/dianbiao.svg | 1 + klp-ui/src/assets/icons/svg/qibiao.svg | 1 + klp-ui/src/assets/icons/svg/shuibiao.svg | 1 + klp-ui/src/views/ems/config/energyLink.vue | 344 +++ klp-ui/src/views/ems/cost/coilCost.vue | 630 +++++ .../src/views/ems/cost/energyCostSummary.vue | 572 +++++ klp-ui/src/views/ems/cost/index.vue | 367 +++ .../views/ems/cost/warehouseProduction.vue | 540 ++++ klp-ui/src/views/ems/data/index.vue | 363 +-- klp-ui/src/views/ems/data/manage.vue | 420 ++++ klp-ui/src/views/ems/data/record.vue | 954 +++++++ .../ems/meter/components/LocationTreeNode.vue | 257 ++ klp-ui/src/views/ems/meter/index.vue | 1504 +++++++---- klp-ui/src/views/ems/meter/manage.vue | 827 +++++++ klp-ui/src/views/ems/meter/topology.vue | 1327 ++++++++++ klp-ui/src/views/ems/rate/index.vue | 2188 ++++++++++++++++- klp-ui/src/views/ems/task/allocationTask.vue | 311 +++ .../java/com/klp/domain/WmsCostCoilDaily.java | 10 + 100 files changed, 14350 insertions(+), 847 deletions(-) create mode 100644 klp-ems/src/main/java/com/klp/ems/controller/EmsRateTierController.java create mode 100644 klp-ems/src/main/java/com/klp/ems/controller/EmsRateTierPeriodLinkController.java create mode 100644 klp-ems/src/main/java/com/klp/ems/controller/EmsRateTimePeriodLinkController.java create mode 100644 klp-ems/src/main/java/com/klp/ems/controller/EnergyCostReportController.java create mode 100644 klp-ems/src/main/java/com/klp/ems/controller/WmsEnergyCoilDailyController.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/CostCoilDailyEnergy.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/EmsRateTier.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/EmsRateTierPeriodLink.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/EmsRateTimePeriodLink.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/EmsTimePeriod.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/WmsEnergyCoilDaily.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/bo/EmsRateTierBo.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/bo/EmsRateTierPeriodLinkBo.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/bo/EmsRateTimePeriodLinkBo.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/bo/EmsTimePeriodBo.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/bo/EnergyCostReportBo.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/bo/WmsEnergyCoilDailyBo.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/dto/AllocationCoilDto.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/dto/MeterTemplateDto.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/vo/EmsRateTierPeriodLinkVo.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/vo/EmsRateTierVo.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/vo/EmsRateTimePeriodLinkVo.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/vo/EmsTimePeriodVo.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/vo/EnergyCostSummaryVo.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/vo/WmsEnergyCoilDailyStatisticsVo.java create mode 100644 klp-ems/src/main/java/com/klp/ems/domain/vo/WmsEnergyCoilDailyVo.java create mode 100644 klp-ems/src/main/java/com/klp/ems/mapper/CostCoilDailyMapper.java create mode 100644 klp-ems/src/main/java/com/klp/ems/mapper/EmsRateTierMapper.java create mode 100644 klp-ems/src/main/java/com/klp/ems/mapper/EmsRateTierPeriodLinkMapper.java create mode 100644 klp-ems/src/main/java/com/klp/ems/mapper/EmsRateTimePeriodLinkMapper.java create mode 100644 klp-ems/src/main/java/com/klp/ems/mapper/EmsTimePeriodMapper.java create mode 100644 klp-ems/src/main/java/com/klp/ems/mapper/WmsEnergyCoilDailyMapper.java create mode 100644 klp-ems/src/main/java/com/klp/ems/service/IEmsRateTierPeriodLinkService.java create mode 100644 klp-ems/src/main/java/com/klp/ems/service/IEmsRateTierService.java create mode 100644 klp-ems/src/main/java/com/klp/ems/service/IEmsRateTimePeriodLinkService.java create mode 100644 klp-ems/src/main/java/com/klp/ems/service/IEmsTimePeriodService.java create mode 100644 klp-ems/src/main/java/com/klp/ems/service/IEnergyAllocationService.java create mode 100644 klp-ems/src/main/java/com/klp/ems/service/IEnergyCostReportService.java create mode 100644 klp-ems/src/main/java/com/klp/ems/service/IWmsEnergyCoilDailyService.java create mode 100644 klp-ems/src/main/java/com/klp/ems/service/impl/EmsRateTierPeriodLinkServiceImpl.java create mode 100644 klp-ems/src/main/java/com/klp/ems/service/impl/EmsRateTierServiceImpl.java create mode 100644 klp-ems/src/main/java/com/klp/ems/service/impl/EmsRateTimePeriodLinkServiceImpl.java create mode 100644 klp-ems/src/main/java/com/klp/ems/service/impl/EmsTimePeriodServiceImpl.java create mode 100644 klp-ems/src/main/java/com/klp/ems/service/impl/EnergyCostReportServiceImpl.java create mode 100644 klp-ems/src/main/java/com/klp/ems/service/impl/WmsEnergyCoilDailyServiceImpl.java create mode 100644 klp-ems/src/main/resources/mapper/CostCoilDailyMapper.xml create mode 100644 klp-ems/src/main/resources/mapper/EmsRateTierMapper.xml create mode 100644 klp-ems/src/main/resources/mapper/EmsRateTierPeriodLinkMapper.xml create mode 100644 klp-ems/src/main/resources/mapper/EmsRateTimePeriodLinkMapper.xml create mode 100644 klp-ems/src/main/resources/mapper/EmsTimePeriodMapper.xml create mode 100644 klp-ems/src/main/resources/mapper/WmsEnergyCoilDailyMapper.xml create mode 100644 klp-ui/src/api/ems/energyAllocation.js create mode 100644 klp-ui/src/api/ems/energyCoilDaily.js create mode 100644 klp-ui/src/api/ems/energyCostReport.js create mode 100644 klp-ui/src/api/ems/energyLink.js create mode 100644 klp-ui/src/api/ems/energyTask.js create mode 100644 klp-ui/src/api/ems/warehouse.js create mode 100644 klp-ui/src/assets/icons/svg/dianbiao.svg create mode 100644 klp-ui/src/assets/icons/svg/qibiao.svg create mode 100644 klp-ui/src/assets/icons/svg/shuibiao.svg create mode 100644 klp-ui/src/views/ems/config/energyLink.vue create mode 100644 klp-ui/src/views/ems/cost/coilCost.vue create mode 100644 klp-ui/src/views/ems/cost/energyCostSummary.vue create mode 100644 klp-ui/src/views/ems/cost/index.vue create mode 100644 klp-ui/src/views/ems/cost/warehouseProduction.vue create mode 100644 klp-ui/src/views/ems/data/manage.vue create mode 100644 klp-ui/src/views/ems/data/record.vue create mode 100644 klp-ui/src/views/ems/meter/components/LocationTreeNode.vue create mode 100644 klp-ui/src/views/ems/meter/manage.vue create mode 100644 klp-ui/src/views/ems/meter/topology.vue create mode 100644 klp-ui/src/views/ems/task/allocationTask.vue diff --git a/klp-ems/pom.xml b/klp-ems/pom.xml index ea693f77..41bcef9d 100644 --- a/klp-ems/pom.xml +++ b/klp-ems/pom.xml @@ -43,6 +43,14 @@ fastjson2 2.0.35 + + com.klp + klp-system + + + com.klp + klp-wms + diff --git a/klp-ems/src/main/java/com/klp/ems/controller/EmsEnergyConsumptionController.java b/klp-ems/src/main/java/com/klp/ems/controller/EmsEnergyConsumptionController.java index 4d75a934..9c1068c6 100644 --- a/klp-ems/src/main/java/com/klp/ems/controller/EmsEnergyConsumptionController.java +++ b/klp-ems/src/main/java/com/klp/ems/controller/EmsEnergyConsumptionController.java @@ -2,6 +2,7 @@ package com.klp.ems.controller; import java.util.List; import java.util.Arrays; +import java.util.Map; import com.klp.ems.domain.bo.EmsEnergyConsumptionQueryBo; import com.klp.ems.domain.vo.*; @@ -80,6 +81,14 @@ public class EmsEnergyConsumptionController extends BaseController { return R.ok(iEmsEnergyConsumptionService.getChainAnalysis(queryBo)); } + /** + * 获取能耗统计信息 + */ + @GetMapping("/statistics") + public R> getStatistics(EmsEnergyConsumptionBo bo) { + return R.ok(iEmsEnergyConsumptionService.getStatistics(bo)); + } + /** * 查询能耗记录列表 */ @@ -109,6 +118,31 @@ public class EmsEnergyConsumptionController extends BaseController { return R.ok(iEmsEnergyConsumptionService.queryById(energyConsumptionId)); } + /** + * 获取设备的上次抄表记录(用于自动填充起始数据) + * 如果是首次抄表,返回null;否则返回上次抄表的结束读数作为本次的起始读数 + * + * @param meterId 设备ID + */ + @GetMapping("/lastReading/{meterId}") + public R getLastReading(@NotNull(message = "设备ID不能为空") + @PathVariable Long meterId) { + EmsEnergyConsumptionVo lastReading = iEmsEnergyConsumptionService.getLastReadingForMeter(meterId); + return R.ok(lastReading); + } + + /** + * 获取设备本月的累计消耗量 + * + * @param meterId 设备ID + */ + @GetMapping("/monthlyConsumption/{meterId}") + public R getMonthlyConsumption(@NotNull(message = "设备ID不能为空") + @PathVariable Long meterId) { + Double monthlyConsumption = iEmsEnergyConsumptionService.getMonthlyConsumption(meterId); + return R.ok(monthlyConsumption); + } + /** * 新增能耗记录 */ diff --git a/klp-ems/src/main/java/com/klp/ems/controller/EmsEnergyRateController.java b/klp-ems/src/main/java/com/klp/ems/controller/EmsEnergyRateController.java index 8c42cd04..134b5465 100644 --- a/klp-ems/src/main/java/com/klp/ems/controller/EmsEnergyRateController.java +++ b/klp-ems/src/main/java/com/klp/ems/controller/EmsEnergyRateController.java @@ -18,12 +18,18 @@ import com.klp.common.core.validate.EditGroup; import com.klp.common.enums.BusinessType; import com.klp.common.utils.poi.ExcelUtil; import com.klp.ems.domain.vo.EmsEnergyRateVo; +import com.klp.ems.domain.vo.EmsRateTierVo; +import com.klp.ems.domain.vo.EmsRateTimePeriodLinkVo; import com.klp.ems.domain.bo.EmsEnergyRateBo; +import com.klp.ems.domain.bo.EmsRateTierBo; +import com.klp.ems.domain.bo.EmsRateTimePeriodLinkBo; +import com.klp.ems.domain.bo.EmsRateTierPeriodLinkBo; import com.klp.ems.service.IEmsEnergyRateService; import com.klp.common.core.page.TableDataInfo; /** - * 能源费率(currency 为 INT:0=CNY,1=USD,2=EUR) + * 能源费率 + * 支持:固定费率、峰谷分时、阶梯电价、峰谷+阶梯组合 * * @author Joshi * @date 2025-09-28 @@ -86,14 +92,73 @@ public class EmsEnergyRateController extends BaseController { } /** - * 删除能源费率(currency 为 INT:0=CNY,1=USD,2=EUR) + * 删除能源费率(级联删除梯度和时段费率) * * @param energyRateIds 主键串 */ - @Log(title = "能源费率(currency 为 INT:0=CNY,1=USD,2=EUR)", businessType = BusinessType.DELETE) + @Log(title = "能源费率", businessType = BusinessType.DELETE) @DeleteMapping("/{energyRateIds}") public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] energyRateIds) { return toAjax(iEmsEnergyRateService.deleteWithValidByIds(Arrays.asList(energyRateIds), true)); } + + /** + * 获取费率的梯度费率列表 + */ + @GetMapping("/{energyRateId}/tiers") + public R> getRateTiers(@NotNull(message = "费率ID不能为空") + @PathVariable Long energyRateId) { + return R.ok(iEmsEnergyRateService.getRateTiers(energyRateId)); + } + + /** + * 获取费率的时段费率列表 + */ + @GetMapping("/{energyRateId}/timePeriods") + public R> getRateTimePeriods(@NotNull(message = "费率ID不能为空") + @PathVariable Long energyRateId) { + return R.ok(iEmsEnergyRateService.getRateTimePeriods(energyRateId)); + } + + /** + * 保存梯度费率,返回保存后的梯度列表(包含tierId) + */ + @Log(title = "能源费率梯度", businessType = BusinessType.UPDATE) + @PostMapping("/{energyRateId}/tiers") + public R> saveTiers(@NotNull(message = "费率ID不能为空") @PathVariable Long energyRateId, + @RequestBody List tiers) { + return R.ok(iEmsEnergyRateService.saveTiers(energyRateId, tiers)); + } + + /** + * 保存时段费率 + */ + @Log(title = "能源费率时段", businessType = BusinessType.UPDATE) + @PostMapping("/{energyRateId}/timePeriods") + public R saveTimePeriods(@NotNull(message = "费率ID不能为空") @PathVariable Long energyRateId, + @RequestBody List timePeriods) { + return toAjax(iEmsEnergyRateService.saveTimePeriods(energyRateId, timePeriods)); + } + + /** + * 获取梯度的峰谷时段费率(用于梯度+峰谷组合模式) + */ + @GetMapping("/{energyRateId}/tier/{tierId}/periods") + public R> getTierPeriodLinks(@NotNull(message = "费率ID不能为空") @PathVariable Long energyRateId, + @NotNull(message = "梯度ID不能为空") @PathVariable Long tierId) { + // 返回该梯度对应的所有时段费率 + return R.ok(iEmsEnergyRateService.getTierPeriodLinks(tierId)); + } + + /** + * 保存梯度-时段关联费率(用于梯度+峰谷组合模式) + */ + @Log(title = "梯度-时段关联费率", businessType = BusinessType.UPDATE) + @PostMapping("/{energyRateId}/tier/{tierId}/periods") + public R saveTierPeriodLinks(@NotNull(message = "费率ID不能为空") @PathVariable Long energyRateId, + @NotNull(message = "梯度ID不能为空") @PathVariable Long tierId, + @RequestBody List tierPeriodLinks) { + return toAjax(iEmsEnergyRateService.saveTierPeriodLinks(tierId, tierPeriodLinks)); + } } diff --git a/klp-ems/src/main/java/com/klp/ems/controller/EmsMeterController.java b/klp-ems/src/main/java/com/klp/ems/controller/EmsMeterController.java index ecac8a83..b983d3a0 100644 --- a/klp-ems/src/main/java/com/klp/ems/controller/EmsMeterController.java +++ b/klp-ems/src/main/java/com/klp/ems/controller/EmsMeterController.java @@ -2,11 +2,13 @@ package com.klp.ems.controller; import java.util.List; import java.util.Arrays; +import java.io.IOException; import lombok.RequiredArgsConstructor; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.*; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import org.springframework.validation.annotation.Validated; import com.klp.common.annotation.RepeatSubmit; import com.klp.common.annotation.Log; @@ -96,4 +98,21 @@ public class EmsMeterController extends BaseController { @PathVariable Long[] meterIds) { return toAjax(iEmsMeterService.deleteWithValidByIds(Arrays.asList(meterIds), true)); } + + /** + * 下载设备导入模板 + */ + @GetMapping("/template") + public void downloadTemplate(HttpServletResponse response) { + iEmsMeterService.downloadTemplate(response); + } + + /** + * 导入设备 + */ + @Log(title = "计量设备(阈值移至此处)", businessType = BusinessType.IMPORT) + @PostMapping("/import") + public R importMeters(@RequestParam("file") MultipartFile file) { + return toAjax(iEmsMeterService.importMeters(file)); + } } diff --git a/klp-ems/src/main/java/com/klp/ems/controller/EmsRateTierController.java b/klp-ems/src/main/java/com/klp/ems/controller/EmsRateTierController.java new file mode 100644 index 00000000..23c5b849 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/controller/EmsRateTierController.java @@ -0,0 +1,105 @@ +package com.klp.ems.controller; + +import java.util.List; +import java.util.Arrays; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; + +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.annotation.Log; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import com.klp.common.enums.BusinessType; +import com.klp.common.utils.poi.ExcelUtil; +import com.klp.ems.domain.bo.EmsRateTierBo; +import com.klp.ems.domain.vo.EmsRateTierVo; +import com.klp.ems.service.IEmsRateTierService; +import com.klp.common.core.page.TableDataInfo; + +/** + * 梯度费率 + * + * @author Joshi + * @date 2025-12-05 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/ems/rateTier") +public class EmsRateTierController extends BaseController { + + private final IEmsRateTierService iEmsRateTierService; + + /** + * 查询梯度费率列表 + */ + @GetMapping("/list") + public TableDataInfo list(EmsRateTierBo bo, PageQuery pageQuery) { + return iEmsRateTierService.queryPageList(bo, pageQuery); + } + + /** + * 根据费率ID查询梯度费率列表 + */ + @GetMapping("/listByRate/{energyRateId}") + public R> listByRate(@NotNull(message = "费率ID不能为空") + @PathVariable Long energyRateId) { + return R.ok(iEmsRateTierService.queryByRateId(energyRateId)); + } + + /** + * 导出梯度费率列表 + */ + @Log(title = "梯度费率", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(EmsRateTierBo bo, HttpServletResponse response) { + List list = iEmsRateTierService.queryList(bo); + ExcelUtil.exportExcel(list, "梯度费率", EmsRateTierVo.class, response); + } + + /** + * 获取梯度费率详细信息 + */ + @GetMapping("/{tierId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long tierId) { + return R.ok(iEmsRateTierService.queryById(tierId)); + } + + /** + * 新增梯度费率 + */ + @Log(title = "梯度费率", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody EmsRateTierBo bo) { + return toAjax(iEmsRateTierService.insertByBo(bo)); + } + + /** + * 修改梯度费率 + */ + @Log(title = "梯度费率", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody EmsRateTierBo bo) { + return toAjax(iEmsRateTierService.updateByBo(bo)); + } + + /** + * 删除梯度费率 + */ + @Log(title = "梯度费率", businessType = BusinessType.DELETE) + @DeleteMapping("/{tierIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] tierIds) { + return toAjax(iEmsRateTierService.deleteWithValidByIds(Arrays.asList(tierIds), true)); + } +} diff --git a/klp-ems/src/main/java/com/klp/ems/controller/EmsRateTierPeriodLinkController.java b/klp-ems/src/main/java/com/klp/ems/controller/EmsRateTierPeriodLinkController.java new file mode 100644 index 00000000..8b160b56 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/controller/EmsRateTierPeriodLinkController.java @@ -0,0 +1,86 @@ +package com.klp.ems.controller; + +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.R; +import com.klp.ems.domain.bo.EmsRateTierPeriodLinkBo; +import com.klp.ems.domain.vo.EmsRateTierPeriodLinkVo; +import com.klp.ems.service.IEmsRateTierPeriodLinkService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 梯度与时段关联 Controller + * + * @author Joshi + * @date 2025-12-05 + */ +@RestController +@RequestMapping("/ems/rateTierPeriodLink") +@RequiredArgsConstructor +@Validated +public class EmsRateTierPeriodLinkController extends BaseController { + + private final IEmsRateTierPeriodLinkService iEmsRateTierPeriodLinkService; + + /** + * 根据梯度ID查询所有关联的时段费率 + * + * @param tierId 梯度ID + * @return 梯度-时段关联列表 + */ + @GetMapping("/tier/{tierId}") + public R> getByTierId(@NotNull @PathVariable Long tierId) { + // 这里返回的是该梯度对应的所有时段费率 + // 前端需要调用此接口获取梯度的峰谷费率配置 + return R.ok(iEmsRateTierPeriodLinkService.getByTierId(tierId).stream() + .map(link -> { + EmsRateTierPeriodLinkVo vo = new EmsRateTierPeriodLinkVo(); + vo.setLinkId(link.getLinkId()); + vo.setTierId(link.getTierId()); + vo.setPeriodId(link.getPeriodId()); + vo.setRate(link.getRate()); + return vo; + }) + .collect(Collectors.toList())); + } + + /** + * 根据费率ID查询梯度-时段关联的完整信息 + * + * @param energyRateId 费率ID + * @return 梯度-时段关联VO列表 + */ + @GetMapping("/rate/{energyRateId}") + public R> getByEnergyRateId(@NotNull @PathVariable Long energyRateId) { + return R.ok(iEmsRateTierPeriodLinkService.getVoByEnergyRateId(energyRateId)); + } + + /** + * 保存梯度的时段费率关联 + * + * @param tierId 梯度ID + * @param tierPeriodLinks 梯度-时段关联列表 + * @return 保存结果 + */ + @PostMapping("/tier/{tierId}") + public R saveTierPeriodLinks(@NotNull @PathVariable Long tierId, + @RequestBody List tierPeriodLinks) { + return toAjax(iEmsRateTierPeriodLinkService.saveTierPeriodLinks(tierId, tierPeriodLinks)); + } + + /** + * 删除梯度的时段费率关联 + * + * @param tierId 梯度ID + * @return 删除结果 + */ + @DeleteMapping("/tier/{tierId}") + public R deleteByTierId(@NotNull @PathVariable Long tierId) { + return toAjax(iEmsRateTierPeriodLinkService.deleteByTierId(tierId)); + } +} diff --git a/klp-ems/src/main/java/com/klp/ems/controller/EmsRateTimePeriodLinkController.java b/klp-ems/src/main/java/com/klp/ems/controller/EmsRateTimePeriodLinkController.java new file mode 100644 index 00000000..3c123c58 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/controller/EmsRateTimePeriodLinkController.java @@ -0,0 +1,105 @@ +package com.klp.ems.controller; + +import java.util.List; +import java.util.Arrays; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; + +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.annotation.Log; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import com.klp.common.enums.BusinessType; +import com.klp.common.utils.poi.ExcelUtil; +import com.klp.ems.domain.bo.EmsRateTimePeriodLinkBo; +import com.klp.ems.domain.vo.EmsRateTimePeriodLinkVo; +import com.klp.ems.service.IEmsRateTimePeriodLinkService; +import com.klp.common.core.page.TableDataInfo; + +/** + * 费率与时间段关联 + * + * @author Joshi + * @date 2025-12-05 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/ems/rateTimePeriodLink") +public class EmsRateTimePeriodLinkController extends BaseController { + + private final IEmsRateTimePeriodLinkService iEmsRateTimePeriodLinkService; + + /** + * 查询费率与时间段关联列表 + */ + @GetMapping("/list") + public TableDataInfo list(EmsRateTimePeriodLinkBo bo, PageQuery pageQuery) { + return iEmsRateTimePeriodLinkService.queryPageList(bo, pageQuery); + } + + /** + * 根据费率ID查询峰谷时段费率列表 + */ + @GetMapping("/listByRate/{energyRateId}") + public R> listByRate(@NotNull(message = "费率ID不能为空") + @PathVariable Long energyRateId) { + return R.ok(iEmsRateTimePeriodLinkService.queryByRateId(energyRateId)); + } + + /** + * 导出费率与时间段关联列表 + */ + @Log(title = "费率与时间段关联", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(EmsRateTimePeriodLinkBo bo, HttpServletResponse response) { + List list = iEmsRateTimePeriodLinkService.queryList(bo); + ExcelUtil.exportExcel(list, "费率与时间段关联", EmsRateTimePeriodLinkVo.class, response); + } + + /** + * 获取费率与时间段关联详细信息 + */ + @GetMapping("/{linkId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long linkId) { + return R.ok(iEmsRateTimePeriodLinkService.queryById(linkId)); + } + + /** + * 新增费率与时间段关联 + */ + @Log(title = "费率与时间段关联", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody EmsRateTimePeriodLinkBo bo) { + return toAjax(iEmsRateTimePeriodLinkService.insertByBo(bo)); + } + + /** + * 修改费率与时间段关联 + */ + @Log(title = "费率与时间段关联", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody EmsRateTimePeriodLinkBo bo) { + return toAjax(iEmsRateTimePeriodLinkService.updateByBo(bo)); + } + + /** + * 删除费率与时间段关联 + */ + @Log(title = "费率与时间段关联", businessType = BusinessType.DELETE) + @DeleteMapping("/{linkIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] linkIds) { + return toAjax(iEmsRateTimePeriodLinkService.deleteWithValidByIds(Arrays.asList(linkIds), true)); + } +} diff --git a/klp-ems/src/main/java/com/klp/ems/controller/EnergyCostReportController.java b/klp-ems/src/main/java/com/klp/ems/controller/EnergyCostReportController.java new file mode 100644 index 00000000..7595abb7 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/controller/EnergyCostReportController.java @@ -0,0 +1,50 @@ +package com.klp.ems.controller; + +import com.klp.common.annotation.Log; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.enums.BusinessType; +import com.klp.ems.domain.bo.EnergyCostReportBo; +import com.klp.ems.domain.vo.EnergyCostSummaryVo; +import com.klp.ems.domain.vo.WmsEnergyCoilDailyVo; +import com.klp.ems.service.IEnergyCostReportService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; + +/** + * 能源成本报表 Controller + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/ems/energy/report") +public class EnergyCostReportController extends BaseController { + + private final IEnergyCostReportService reportService; + + @Log(title = "能源成本报表", businessType = BusinessType.OTHER) + @GetMapping("/overview") + public R> overview(EnergyCostReportBo bo) { + return R.ok(reportService.overview(bo)); + } + + @Log(title = "能源成本报表", businessType = BusinessType.OTHER) + @GetMapping("/summary") + public R> summary(EnergyCostReportBo bo) { + return R.ok(reportService.summary(bo)); + } + + @Log(title = "能源成本报表", businessType = BusinessType.OTHER) + @GetMapping("/detail") + public TableDataInfo detail(EnergyCostReportBo bo, PageQuery pageQuery) { + return reportService.detail(bo, pageQuery); + } +} diff --git a/klp-ems/src/main/java/com/klp/ems/controller/WmsEnergyCoilDailyController.java b/klp-ems/src/main/java/com/klp/ems/controller/WmsEnergyCoilDailyController.java new file mode 100644 index 00000000..2c5b93ba --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/controller/WmsEnergyCoilDailyController.java @@ -0,0 +1,99 @@ +package com.klp.ems.controller; + +import com.klp.common.annotation.Log; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import com.klp.common.enums.BusinessType; +import com.klp.common.utils.poi.ExcelUtil; +import com.klp.ems.domain.bo.WmsEnergyCoilDailyBo; +import com.klp.ems.domain.vo.WmsEnergyCoilDailyVo; +import com.klp.ems.domain.vo.WmsEnergyCoilDailyStatisticsVo; +import com.klp.ems.service.IWmsEnergyCoilDailyService; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.List; + +/** + * 钢卷日能源成本分摊结果 Controller + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/ems/energy/coilDaily") +public class WmsEnergyCoilDailyController extends BaseController { + + private final IWmsEnergyCoilDailyService coilDailyService; + + @GetMapping("/list") + public TableDataInfo list(WmsEnergyCoilDailyBo bo, PageQuery pageQuery) { + return coilDailyService.queryPageList(bo, pageQuery); + } + + /** + * 查询待操作钢卷的能源成本(基于待操作时间范围计算) + */ + @GetMapping("/pendingAction") + public TableDataInfo pendingAction(WmsEnergyCoilDailyBo bo, PageQuery pageQuery) { + // 调用Service方法计算待操作钢卷的成本 + return coilDailyService.queryPendingActionCoilCost(bo, pageQuery); + } + + /** + * 查询待操作钢卷的能源成本统计 + */ + @GetMapping("/pendingAction/statistics") + public R pendingActionStatistics( + @RequestParam(required = false) String enterCoilNo, + @RequestParam(required = false) String currentCoilNo, + @RequestParam(required = false) Long warehouseId + ) { + WmsEnergyCoilDailyStatisticsVo statistics = coilDailyService.queryPendingActionCoilCostStatistics(enterCoilNo, currentCoilNo, warehouseId); + return R.ok(statistics); + } + + @Log(title = "钢卷能源分摊", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(WmsEnergyCoilDailyBo bo, HttpServletResponse response) { + List list = coilDailyService.queryList(bo); + ExcelUtil.exportExcel(list, "钢卷能源分摊", WmsEnergyCoilDailyVo.class, response); + } + + @GetMapping("/{energyCostId}") + public R getInfo(@NotNull @PathVariable Long energyCostId) { + return R.ok(coilDailyService.queryById(energyCostId)); + } + + @Log(title = "钢卷能源分摊", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping + public R add(@Validated(AddGroup.class) @RequestBody WmsEnergyCoilDailyBo bo) { + return toAjax(coilDailyService.insertByBo(bo)); + } + + @Log(title = "钢卷能源分摊", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping + public R edit(@Validated(EditGroup.class) @RequestBody WmsEnergyCoilDailyBo bo) { + return toAjax(coilDailyService.updateByBo(bo)); + } + + @Log(title = "钢卷能源分摊", businessType = BusinessType.DELETE) + @DeleteMapping("/{energyCostIds}") + public R remove(@NotEmpty @PathVariable Long[] energyCostIds) { + return toAjax(coilDailyService.deleteWithValidByIds(Arrays.asList(energyCostIds), true)); + } +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/CostCoilDailyEnergy.java b/klp-ems/src/main/java/com/klp/ems/domain/CostCoilDailyEnergy.java new file mode 100644 index 00000000..109f293e --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/CostCoilDailyEnergy.java @@ -0,0 +1,22 @@ +package com.klp.ems.domain; + +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + * 成本日表仅更新能源成本字段所需的参数。 + */ +@Data +public class CostCoilDailyEnergy { + + private Long coilId; + + private LocalDate calcDate; + + private BigDecimal energyCostAmount; + + /** JSON 字符串(数组) */ + private String energyCostBreakdown; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/EmsEnergyRate.java b/klp-ems/src/main/java/com/klp/ems/domain/EmsEnergyRate.java index 8f1975f2..558734f9 100644 --- a/klp-ems/src/main/java/com/klp/ems/domain/EmsEnergyRate.java +++ b/klp-ems/src/main/java/com/klp/ems/domain/EmsEnergyRate.java @@ -47,11 +47,23 @@ public class EmsEnergyRate extends BaseEntity { * 失效日期,NULL表示长期有效 */ private Date expiryDate; + + /** + * 是否使用峰谷时段:0=否,1=是 + */ + private Integer usePeakValley; + + /** + * 是否使用梯度收费:0=否,1=是 + */ + private Integer useTieredPricing; + /** * 删除标志(0=存在 2=删除) */ @TableLogic private String delFlag; + /** * 备注 */ diff --git a/klp-ems/src/main/java/com/klp/ems/domain/EmsRateTier.java b/klp-ems/src/main/java/com/klp/ems/domain/EmsRateTier.java new file mode 100644 index 00000000..cf54dc27 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/EmsRateTier.java @@ -0,0 +1,65 @@ +package com.klp.ems.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * 梯度费率对象 ems_rate_tier + * 用于支持用量梯度收费,如:0-100度1元/度,100-200度1.5元/度 + * + * @author Joshi + * @date 2025-12-05 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("ems_rate_tier") +public class EmsRateTier extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 梯度费率ID + */ + @TableId(value = "tier_id") + private Long tierId; + + /** + * 关联费率ID + */ + private Long energyRateId; + + /** + * 梯度等级(1、2、3...) + */ + private Integer tierLevel; + + /** + * 最小用量(包含) + */ + private BigDecimal minUsage; + + /** + * 最大用量(不包含),NULL表示无上限 + */ + private BigDecimal maxUsage; + + /** + * 该梯度的费率 + */ + private BigDecimal rate; + + /** + * 删除标志(0=存在 2=删除) + */ + @TableLogic + private String delFlag; + + /** + * 备注 + */ + private String remark; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/EmsRateTierPeriodLink.java b/klp-ems/src/main/java/com/klp/ems/domain/EmsRateTierPeriodLink.java new file mode 100644 index 00000000..63ebbfb9 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/EmsRateTierPeriodLink.java @@ -0,0 +1,58 @@ +package com.klp.ems.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * 梯度与时段关联对象 ems_tier_period_link + * 用于支持梯度+峰谷组合计费,如: + * 第1梯度(0-100度) 的峰时段 1.5元/度 + * 第1梯度(0-100度) 的谷时段 0.5元/度 + * 第2梯度(100-200度) 的峰时段 1.8元/度 + * + * @author Joshi + * @date 2025-12-05 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("ems_tier_period_link") +public class EmsRateTierPeriodLink extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 关联ID + */ + @TableId(value = "link_id") + private Long linkId; + + /** + * 梯度ID + */ + private Long tierId; + + /** + * 时间段ID + */ + private Long periodId; + + /** + * 该梯度+时段的费率 + */ + private BigDecimal rate; + + /** + * 删除标志(0=存在 2=删除) + */ + @TableLogic + private String delFlag; + + /** + * 备注 + */ + private String remark; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/EmsRateTimePeriodLink.java b/klp-ems/src/main/java/com/klp/ems/domain/EmsRateTimePeriodLink.java new file mode 100644 index 00000000..24a296bc --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/EmsRateTimePeriodLink.java @@ -0,0 +1,55 @@ +package com.klp.ems.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * 费率与时间段关联对象 ems_rate_time_period_link + * 用于支持峰谷时段的不同费率,如:峰时段费率1.5元/度,谷时段费率0.8元/度 + * + * @author Joshi + * @date 2025-12-05 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("ems_rate_time_period_link") +public class EmsRateTimePeriodLink extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 关联ID + */ + @TableId(value = "link_id") + private Long linkId; + + /** + * 费率ID + */ + private Long energyRateId; + + /** + * 时间段ID + */ + private Long periodId; + + /** + * 该时间段的费率 + */ + private BigDecimal rate; + + /** + * 删除标志(0=存在 2=删除) + */ + @TableLogic + private String delFlag; + + /** + * 备注 + */ + private String remark; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/EmsTimePeriod.java b/klp-ems/src/main/java/com/klp/ems/domain/EmsTimePeriod.java new file mode 100644 index 00000000..eb52bfec --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/EmsTimePeriod.java @@ -0,0 +1,62 @@ +package com.klp.ems.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 时间段(峰谷平)对象 ems_time_period + * + * @author Joshi + * @date 2025-12-05 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("ems_time_period") +public class EmsTimePeriod extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 时间段ID + */ + @TableId(value = "period_id") + private Long periodId; + + /** + * 时间段名称(峰、谷、平) + */ + private String periodName; + + /** + * 时间段类型:0=峰,1=谷,2=平 + */ + private Integer periodType; + + /** + * 开始时间(HH:mm格式) + */ + private String startTime; + + /** + * 结束时间(HH:mm格式) + */ + private String endTime; + + /** + * 是否跨天:0=否,1=是 + */ + private Integer crossDay; + + /** + * 删除标志(0=存在 2=删除) + */ + @TableLogic + private String delFlag; + + /** + * 备注 + */ + private String remark; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/WmsEnergyCoilDaily.java b/klp-ems/src/main/java/com/klp/ems/domain/WmsEnergyCoilDaily.java new file mode 100644 index 00000000..161be814 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/WmsEnergyCoilDaily.java @@ -0,0 +1,51 @@ +package com.klp.ems.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + * 钢卷日能源成本分摊结果 + */ +@Data +@TableName("wms_energy_coil_daily") +public class WmsEnergyCoilDaily { + + private static final long serialVersionUID = 1L; + + @TableId(value = "energy_cost_id") + private Long energyCostId; + + private Long taskId; + + private LocalDate calcDate; + + private Long coilId; + + private String enterCoilNo; + + private String currentCoilNo; + + private Long warehouseId; + + private Long actualWarehouseId; + + private Long energyTypeId; + + private Long meterId; + + private BigDecimal consumptionQty; + + private BigDecimal costAmount; + + private BigDecimal allocationBasisWeight; + + private BigDecimal allocationBasisDays; + + private BigDecimal allocationFactor; + + private String remark; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsEnergyConsumptionBo.java b/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsEnergyConsumptionBo.java index 9d34f271..2d950971 100644 --- a/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsEnergyConsumptionBo.java +++ b/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsEnergyConsumptionBo.java @@ -30,6 +30,11 @@ public class EmsEnergyConsumptionBo extends BaseEntity { */ private Long meterId; + /** + * 能源类型ID(用于查询统计) + */ + private Long energyTypeId; + /** * 起始读数 */ diff --git a/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsEnergyRateBo.java b/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsEnergyRateBo.java index 867a775e..ce5273a9 100644 --- a/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsEnergyRateBo.java +++ b/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsEnergyRateBo.java @@ -50,6 +50,16 @@ public class EmsEnergyRateBo extends BaseEntity { */ private Date expiryDate; + /** + * 是否使用峰谷时段:0=否,1=是 + */ + private Integer usePeakValley; + + /** + * 是否使用梯度收费:0=否,1=是 + */ + private Integer useTieredPricing; + /** * 备注 */ diff --git a/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsRateTierBo.java b/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsRateTierBo.java new file mode 100644 index 00000000..751b3330 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsRateTierBo.java @@ -0,0 +1,53 @@ +package com.klp.ems.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * 梯度费率业务对象 ems_rate_tier + * + * @author Joshi + * @date 2025-12-05 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class EmsRateTierBo extends BaseEntity { + + /** + * 梯度费率ID + */ + private Long tierId; + + /** + * 关联费率ID + */ + private Long energyRateId; + + /** + * 梯度等级(1、2、3...) + */ + private Integer tierLevel; + + /** + * 最小用量(包含) + */ + private BigDecimal minUsage; + + /** + * 最大用量(不包含),NULL表示无上限 + */ + private BigDecimal maxUsage; + + /** + * 该梯度的费率 + */ + private BigDecimal rate; + + /** + * 备注 + */ + private String remark; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsRateTierPeriodLinkBo.java b/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsRateTierPeriodLinkBo.java new file mode 100644 index 00000000..f867b1fb --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsRateTierPeriodLinkBo.java @@ -0,0 +1,40 @@ +package com.klp.ems.domain.bo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 梯度与时段关联业务对象 + * + * @author Joshi + * @date 2025-12-05 + */ +@Data +public class EmsRateTierPeriodLinkBo { + + /** + * 关联ID + */ + private Long linkId; + + /** + * 梯度ID + */ + private Long tierId; + + /** + * 时间段ID + */ + private Long periodId; + + /** + * 该梯度+时段的费率 + */ + private BigDecimal rate; + + /** + * 备注 + */ + private String remark; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsRateTimePeriodLinkBo.java b/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsRateTimePeriodLinkBo.java new file mode 100644 index 00000000..f55b6627 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsRateTimePeriodLinkBo.java @@ -0,0 +1,68 @@ +package com.klp.ems.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * 费率与时间段关联业务对象 ems_rate_time_period_link + * + * @author Joshi + * @date 2025-12-05 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class EmsRateTimePeriodLinkBo extends BaseEntity { + + /** + * 关联ID + */ + private Long linkId; + + /** + * 费率ID + */ + private Long energyRateId; + + /** + * 时间段ID + */ + private Long periodId; + + /** + * 时间段类型:0=峰,1=谷,2=平 + */ + private Integer periodType; + + /** + * 时间段名称(峰、谷、平) + */ + private String periodName; + + /** + * 开始时间(HH:mm格式) + */ + private String startTime; + + /** + * 结束时间(HH:mm格式) + */ + private String endTime; + + /** + * 是否跨天:0=否,1=是 + */ + private Integer crossDay; + + /** + * 该时间段的费率 + */ + private BigDecimal rate; + + /** + * 备注 + */ + private String remark; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsTimePeriodBo.java b/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsTimePeriodBo.java new file mode 100644 index 00000000..4b1d72dc --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/bo/EmsTimePeriodBo.java @@ -0,0 +1,51 @@ +package com.klp.ems.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 时间段业务对象 ems_time_period + * + * @author Joshi + * @date 2025-12-05 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class EmsTimePeriodBo extends BaseEntity { + + /** + * 时间段ID + */ + private Long periodId; + + /** + * 时间段名称(峰、谷、平) + */ + private String periodName; + + /** + * 时间段类型:0=峰,1=谷,2=平 + */ + private Integer periodType; + + /** + * 开始时间(HH:mm格式) + */ + private String startTime; + + /** + * 结束时间(HH:mm格式) + */ + private String endTime; + + /** + * 是否跨天:0=否,1=是 + */ + private Integer crossDay; + + /** + * 备注 + */ + private String remark; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/bo/EnergyCostReportBo.java b/klp-ems/src/main/java/com/klp/ems/domain/bo/EnergyCostReportBo.java new file mode 100644 index 00000000..bf936ba5 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/bo/EnergyCostReportBo.java @@ -0,0 +1,54 @@ +package com.klp.ems.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; + +/** + * 能源成本报表查询参数 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class EnergyCostReportBo extends BaseEntity { + + /** 开始日期 */ + private LocalDate startDate; + + /** 结束日期 */ + private LocalDate endDate; + + /** 分摊任务 */ + private Long taskId; + + /** 能源类型 */ + private Long energyTypeId; + + /** 计量仪表 */ + private Long meterId; + + /** 逻辑库区 */ + private Long warehouseId; + + /** 实际库区 */ + private Long actualWarehouseId; + + /** 入场钢卷号 */ + private String enterCoilNo; + + /** 当前钢卷号 */ + private String currentCoilNo; + + /** 汇总维度:energyType/warehouse/meter/task */ + private String groupBy; + + /** 是否返回明细 */ + private Boolean includeDetail; + + /** 页码 */ + private Integer pageNum; + + /** 每页大小 */ + private Integer pageSize; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/bo/WmsEnergyCoilDailyBo.java b/klp-ems/src/main/java/com/klp/ems/domain/bo/WmsEnergyCoilDailyBo.java new file mode 100644 index 00000000..b18e202d --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/bo/WmsEnergyCoilDailyBo.java @@ -0,0 +1,51 @@ +package com.klp.ems.domain.bo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + * 钢卷日能源成本分摊结果 BO + */ +@Data +public class WmsEnergyCoilDailyBo { + + private Long energyCostId; + + private Long taskId; + + private LocalDate calcDate; + + private Long coilId; + + private String enterCoilNo; + + private String currentCoilNo; + + private Long warehouseId; + + private Long actualWarehouseId; + + private Long energyTypeId; + + private Long meterId; + + private BigDecimal consumptionQty; + + private BigDecimal costAmount; + + private BigDecimal allocationBasisWeight; + + private BigDecimal allocationBasisDays; + + private BigDecimal allocationFactor; + + private String remark; + + /** 起始日期(查询用) */ + private LocalDate startDate; + + /** 结束日期(查询用) */ + private LocalDate endDate; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/dto/AllocationCoilDto.java b/klp-ems/src/main/java/com/klp/ems/domain/dto/AllocationCoilDto.java new file mode 100644 index 00000000..fe209a6e --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/dto/AllocationCoilDto.java @@ -0,0 +1,37 @@ +package com.klp.ems.domain.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 轻量化钢卷信息(仅供能源分摊引擎使用) + */ +@Data +public class AllocationCoilDto { + + private Long coilId; + + private String enterCoilNo; + + private String currentCoilNo; + + private Long warehouseId; + + private Long actualWarehouseId; + + /** 净重(kg) */ + private BigDecimal netWeight; + + /** 毛重(kg) */ + private BigDecimal grossWeight; + + /** 待操作累计分钟数(基于 pending action 计算) */ + private BigDecimal pendingMinutes; + + /** 物品类型 */ + private String itemType; + + /** 材料类型 */ + private String materialType; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/dto/MeterTemplateDto.java b/klp-ems/src/main/java/com/klp/ems/domain/dto/MeterTemplateDto.java new file mode 100644 index 00000000..8e84c10e --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/dto/MeterTemplateDto.java @@ -0,0 +1,48 @@ +package com.klp.ems.domain.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 设备导入模板 DTO + * + * @author Joshi + * @date 2025-12-05 + */ +@Data +@ExcelIgnoreUnannotated +public class MeterTemplateDto { + + /** + * 设备编号 + */ + @ExcelProperty(value = "设备编号") + private String meterCode; + + /** + * 能源类型(水、电、天然气) + */ + @ExcelProperty(value = "能源类型") + private String energyType; + + /** + * 设备型号 + */ + @ExcelProperty(value = "设备型号") + private String model; + + /** + * 制造商 + */ + @ExcelProperty(value = "制造商") + private String manufacturer; + + /** + * 安装日期 + */ + @ExcelProperty(value = "安装日期") + private Date installDate; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsEnergyConsumptionVo.java b/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsEnergyConsumptionVo.java index e5fd5654..6f12c47c 100644 --- a/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsEnergyConsumptionVo.java +++ b/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsEnergyConsumptionVo.java @@ -71,6 +71,21 @@ public class EmsEnergyConsumptionVo { @ExcelDictFormat(readConverterExp = "不=设外键") private Long recordedBy; + /** + * 记录人名称 + */ + private String recordedByName; + + /** + * 设备编号 + */ + private String meterCode; + + /** + * 能源类型名称 + */ + private String energyTypeName; + /** * 备注 */ diff --git a/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsEnergyRateVo.java b/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsEnergyRateVo.java index e74b22b5..4a230a0b 100644 --- a/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsEnergyRateVo.java +++ b/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsEnergyRateVo.java @@ -2,6 +2,7 @@ package com.klp.ems.domain.vo; import java.math.BigDecimal; import java.util.Date; +import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; @@ -58,11 +59,27 @@ public class EmsEnergyRateVo { @ExcelProperty(value = "失效日期,NULL表示长期有效") private Date expiryDate; + /** + * 是否使用峰谷时段:0=否,1=是 + */ + @ExcelProperty(value = "是否使用峰谷时段") + private Integer usePeakValley; + + /** + * 是否使用梯度收费:0=否,1=是 + */ + @ExcelProperty(value = "是否使用梯度收费") + private Integer useTieredPricing; + /** * 备注 */ @ExcelProperty(value = "备注") private String remark; + /** + * 梯度费率列表(非数据库字段,用于前端展示) + */ + private List tiers; } diff --git a/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsMeterVo.java b/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsMeterVo.java index 90962715..bf68a87b 100644 --- a/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsMeterVo.java +++ b/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsMeterVo.java @@ -5,6 +5,7 @@ import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.ExcelIgnore; import com.klp.common.annotation.ExcelDictFormat; import com.klp.common.convert.ExcelDictConvert; import lombok.Data; @@ -43,7 +44,7 @@ public class EmsMeterVo { /** * 安装位置 */ - @ExcelProperty(value = "安装位置") + @ExcelIgnore private Long locationId; /** @@ -73,14 +74,13 @@ public class EmsMeterVo { /** * 上次校准日期 */ - @ExcelProperty(value = "上次校准日期") + @ExcelIgnore private Date lastCalibrationDate; /** * 阈值(按设备设置) */ - @ExcelProperty(value = "阈值", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "按=设备设置") + @ExcelIgnore private BigDecimal thresholdValue; /** @@ -89,5 +89,16 @@ public class EmsMeterVo { @ExcelProperty(value = "备注") private String remark; + /** + * 库区ID + */ + @ExcelIgnore + private Long warehouseId; + + /** + * 库区名称 + */ + @ExcelIgnore + private String warehouseName; } diff --git a/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsRateTierPeriodLinkVo.java b/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsRateTierPeriodLinkVo.java new file mode 100644 index 00000000..5f112693 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsRateTierPeriodLinkVo.java @@ -0,0 +1,96 @@ +package com.klp.ems.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 梯度与时段关联视图对象 + * + * @author Joshi + * @date 2025-12-05 + */ +@Data +public class EmsRateTierPeriodLinkVo { + + /** + * 关联ID + */ + @ExcelProperty(value = "关联ID", index = 0) + private Long linkId; + + /** + * 梯度ID + */ + @ExcelIgnore + private Long tierId; + + /** + * 梯度等级 + */ + @ExcelProperty(value = "梯度等级", index = 1) + private Integer tierLevel; + + /** + * 最小用量 + */ + @ExcelProperty(value = "最小用量", index = 2) + private BigDecimal minUsage; + + /** + * 最大用量 + */ + @ExcelProperty(value = "最大用量", index = 3) + private BigDecimal maxUsage; + + /** + * 时间段ID + */ + @ExcelIgnore + private Long periodId; + + /** + * 时间段名称 + */ + @ExcelProperty(value = "时段名称", index = 4) + private String periodName; + + /** + * 时间段类型:0=峰,1=谷,2=平 + */ + @ExcelIgnore + private Integer periodType; + + /** + * 开始时间(HH:mm格式) + */ + @ExcelProperty(value = "开始时间", index = 5) + private String startTime; + + /** + * 结束时间(HH:mm格式) + */ + @ExcelProperty(value = "结束时间", index = 6) + private String endTime; + + /** + * 该梯度+时段的费率 + */ + @ExcelProperty(value = "费率", index = 7) + private BigDecimal rate; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间", index = 8) + private Date createTime; + + /** + * 备注 + */ + @ExcelProperty(value = "备注", index = 9) + private String remark; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsRateTierVo.java b/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsRateTierVo.java new file mode 100644 index 00000000..4e8008eb --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsRateTierVo.java @@ -0,0 +1,69 @@ +package com.klp.ems.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Map; + +/** + * 梯度费率视图对象 ems_rate_tier + * + * @author Joshi + * @date 2025-12-05 + */ +@Data +@ExcelIgnoreUnannotated +public class EmsRateTierVo { + + private static final long serialVersionUID = 1L; + + /** + * 梯度费率ID + */ + @ExcelProperty(value = "梯度费率ID") + private Long tierId; + + /** + * 关联费率ID + */ + @ExcelProperty(value = "费率ID") + private Long energyRateId; + + /** + * 梯度等级(1、2、3...) + */ + @ExcelProperty(value = "梯度等级") + private Integer tierLevel; + + /** + * 最小用量(包含) + */ + @ExcelProperty(value = "最小用量") + private BigDecimal minUsage; + + /** + * 最大用量(不包含),NULL表示无上限 + */ + @ExcelProperty(value = "最大用量") + private BigDecimal maxUsage; + + /** + * 该梯度的费率 + */ + @ExcelProperty(value = "梯度费率") + private BigDecimal rate; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 梯度-时段费率关联(非数据库字段,用于梯度+峰谷组合模式) + * key: periodId, value: rate + */ + private Map tierPeriodRates; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsRateTimePeriodLinkVo.java b/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsRateTimePeriodLinkVo.java new file mode 100644 index 00000000..c7e1eda1 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsRateTimePeriodLinkVo.java @@ -0,0 +1,75 @@ +package com.klp.ems.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 费率与时间段关联视图对象 ems_rate_time_period_link + * + * @author Joshi + * @date 2025-12-05 + */ +@Data +@ExcelIgnoreUnannotated +public class EmsRateTimePeriodLinkVo { + + private static final long serialVersionUID = 1L; + + /** + * 关联ID + */ + @ExcelProperty(value = "关联ID") + private Long linkId; + + /** + * 费率ID + */ + @ExcelProperty(value = "费率ID") + private Long energyRateId; + + /** + * 时间段ID + */ + @ExcelProperty(value = "时间段ID") + private Long periodId; + + /** + * 时间段名称(峰、谷、平) + */ + @ExcelIgnore + private String periodName; + + /** + * 时间段类型:0=峰,1=谷,2=平 + */ + @ExcelIgnore + private Integer periodType; + + /** + * 开始时间(HH:mm格式) + */ + @ExcelIgnore + private String startTime; + + /** + * 结束时间(HH:mm格式) + */ + @ExcelIgnore + private String endTime; + + /** + * 该时间段的费率 + */ + @ExcelProperty(value = "时段费率") + private BigDecimal rate; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsTimePeriodVo.java b/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsTimePeriodVo.java new file mode 100644 index 00000000..0b25df50 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/vo/EmsTimePeriodVo.java @@ -0,0 +1,60 @@ +package com.klp.ems.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 时间段视图对象 ems_time_period + * + * @author Joshi + * @date 2025-12-05 + */ +@Data +@ExcelIgnoreUnannotated +public class EmsTimePeriodVo { + + private static final long serialVersionUID = 1L; + + /** + * 时间段ID + */ + @ExcelProperty(value = "时间段ID") + private Long periodId; + + /** + * 时间段名称(峰、谷、平) + */ + @ExcelProperty(value = "时间段名称") + private String periodName; + + /** + * 时间段类型:0=峰,1=谷,2=平 + */ + @ExcelProperty(value = "时间段类型") + private Integer periodType; + + /** + * 开始时间(HH:mm格式) + */ + @ExcelProperty(value = "开始时间") + private String startTime; + + /** + * 结束时间(HH:mm格式) + */ + @ExcelProperty(value = "结束时间") + private String endTime; + + /** + * 是否跨天:0=否,1=是 + */ + @ExcelProperty(value = "是否跨天") + private Integer crossDay; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/vo/EnergyCostSummaryVo.java b/klp-ems/src/main/java/com/klp/ems/domain/vo/EnergyCostSummaryVo.java new file mode 100644 index 00000000..cd807094 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/vo/EnergyCostSummaryVo.java @@ -0,0 +1,42 @@ +package com.klp.ems.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 能源成本汇总视图 + */ +@Data +public class EnergyCostSummaryVo { + + /** 分组键(ID 或名称) */ + private String groupKey; + + /** 展示名称 */ + private String groupName; + + /** 能源类型 ID(可选) */ + private Long energyTypeId; + + /** 仓库 ID(可选) */ + private Long warehouseId; + + /** 实际仓库 ID(可选) */ + private Long actualWarehouseId; + + /** 计量表 ID(可选) */ + private Long meterId; + + /** 任务 ID(可选) */ + private Long taskId; + + /** 分摊能耗合计 */ + private BigDecimal totalConsumption; + + /** 分摊费用合计 */ + private BigDecimal totalCost; + + /** 钢卷数量 */ + private Long coilCount; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/vo/WmsEnergyCoilDailyStatisticsVo.java b/klp-ems/src/main/java/com/klp/ems/domain/vo/WmsEnergyCoilDailyStatisticsVo.java new file mode 100644 index 00000000..f9a44a7f --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/vo/WmsEnergyCoilDailyStatisticsVo.java @@ -0,0 +1,39 @@ +package com.klp.ems.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 钢卷能源成本统计 VO + */ +@Data +@ExcelIgnoreUnannotated +public class WmsEnergyCoilDailyStatisticsVo { + + /** + * 钢卷总数 + */ + private Long totalCoils; + + /** + * 总消耗量 + */ + private BigDecimal totalConsumption; + + /** + * 总成本 + */ + private BigDecimal totalCost; + + /** + * 平均单位成本(¥/小时) + */ + private BigDecimal avgUnitCost; + + /** + * 总生产时长(分钟) + */ + private Long totalProductionDuration; +} diff --git a/klp-ems/src/main/java/com/klp/ems/domain/vo/WmsEnergyCoilDailyVo.java b/klp-ems/src/main/java/com/klp/ems/domain/vo/WmsEnergyCoilDailyVo.java new file mode 100644 index 00000000..7ad9dc6f --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/domain/vo/WmsEnergyCoilDailyVo.java @@ -0,0 +1,84 @@ +package com.klp.ems.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * 钢卷日能源成本分摊结果 VO + */ +@Data +@ExcelIgnoreUnannotated +public class WmsEnergyCoilDailyVo { + + @ExcelProperty("记录ID") + private Long energyCostId; + + @ExcelProperty("任务ID") + private Long taskId; + + @ExcelProperty("日期") + private LocalDate calcDate; + + @ExcelProperty("钢卷ID") + private Long coilId; + + @ExcelProperty("入场卷号") + private String enterCoilNo; + + @ExcelProperty("当前卷号") + private String currentCoilNo; + + @ExcelProperty("逻辑库区") + private Long warehouseId; + + @ExcelProperty("实际库区") + private Long actualWarehouseId; + + @ExcelProperty("能源类型") + private Long energyTypeId; + + @ExcelProperty("仪表") + private Long meterId; + + @ExcelProperty("分摊能耗") + private BigDecimal consumptionQty; + + @ExcelProperty("分摊费用") + private BigDecimal costAmount; + + @ExcelProperty("基数-重量") + private BigDecimal allocationBasisWeight; + + @ExcelProperty("基数-生产时长") + private BigDecimal allocationBasisDays; + + @ExcelProperty("分摊系数") + private BigDecimal allocationFactor; + + @ExcelProperty("备注") + private String remark; + + // 待操作相关字段 + @ExcelProperty("开始时间") + private LocalDateTime scanTime; + + @ExcelProperty("结束时间") + private LocalDateTime completeTime; + + @ExcelProperty("生产时长(分钟)") + private Long productionDuration; + + @ExcelProperty("能源费率") + private BigDecimal energyRate; + + @ExcelProperty("区域名称") + private String warehouseName; + + @ExcelProperty("能源类型名称") + private String energyTypeName; +} diff --git a/klp-ems/src/main/java/com/klp/ems/mapper/CostCoilDailyMapper.java b/klp-ems/src/main/java/com/klp/ems/mapper/CostCoilDailyMapper.java new file mode 100644 index 00000000..6fd10b9d --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/mapper/CostCoilDailyMapper.java @@ -0,0 +1,21 @@ +package com.klp.ems.mapper; + +import com.klp.ems.domain.CostCoilDailyEnergy; +import org.apache.ibatis.annotations.Mapper; + +/** + * 访问 wms_cost_coil_daily(仅更新能源成本字段)。 + */ +@Mapper +public interface CostCoilDailyMapper { + + /** + * 更新成本日表中的能源成本与拆分信息,按 coil_id + calc_date 命中。 + */ + int updateEnergyCost(CostCoilDailyEnergy energyCost); + + /** + * 查询成本日表现有的能源成本信息(energy_cost_amount、energy_cost_breakdown)。 + */ + CostCoilDailyEnergy selectEnergyCost(CostCoilDailyEnergy energyCost); +} diff --git a/klp-ems/src/main/java/com/klp/ems/mapper/EmsEnergyConsumptionMapper.java b/klp-ems/src/main/java/com/klp/ems/mapper/EmsEnergyConsumptionMapper.java index 949be339..378cd7fb 100644 --- a/klp-ems/src/main/java/com/klp/ems/mapper/EmsEnergyConsumptionMapper.java +++ b/klp-ems/src/main/java/com/klp/ems/mapper/EmsEnergyConsumptionMapper.java @@ -2,6 +2,7 @@ package com.klp.ems.mapper; import com.klp.ems.domain.EmsEnergyConsumption; import com.klp.ems.domain.bo.TimeRangeWithMetersBo; +import com.klp.ems.domain.bo.EmsEnergyConsumptionBo; import com.klp.ems.domain.vo.EmsEnergyConsumptionVo; import com.klp.common.core.mapper.BaseMapperPlus; import com.klp.ems.domain.vo.SummaryDailyVo; @@ -9,6 +10,7 @@ import com.klp.ems.domain.vo.SummaryMonthlyVo; import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Map; /** * 能耗记录Mapper接口 @@ -35,4 +37,24 @@ public interface EmsEnergyConsumptionMapper extends BaseMapperPlus selectDailySummaryWithMeters(TimeRangeWithMetersBo range); List selectMonthlySummaryWithMeters(TimeRangeWithMetersBo range); + + EmsEnergyConsumption selectLatestBefore(@Param("meterId") Long meterId, @Param("endTime") String endTime); + + List selectOverlapRange(@Param("meterId") Long meterId, + @Param("startTime") String startTime, + @Param("endTime") String endTime); + + EmsEnergyConsumption selectCoveringRange(@Param("meterId") Long meterId, + @Param("startTime") String startTime, + @Param("endTime") String endTime); + + /** + * 查询指定计量表最近的两条抄表记录(按endTime倒序) + */ + List selectLatestTwoReadings(@Param("meterId") Long meterId); + + /** + * 获取能耗统计信息(用SQL聚合函数计算) + */ + Map getStatistics(EmsEnergyConsumptionBo bo); } diff --git a/klp-ems/src/main/java/com/klp/ems/mapper/EmsEnergyRateMapper.java b/klp-ems/src/main/java/com/klp/ems/mapper/EmsEnergyRateMapper.java index aacfcaa1..19060bb6 100644 --- a/klp-ems/src/main/java/com/klp/ems/mapper/EmsEnergyRateMapper.java +++ b/klp-ems/src/main/java/com/klp/ems/mapper/EmsEnergyRateMapper.java @@ -3,6 +3,9 @@ package com.klp.ems.mapper; import com.klp.ems.domain.EmsEnergyRate; import com.klp.ems.domain.vo.EmsEnergyRateVo; import com.klp.common.core.mapper.BaseMapperPlus; +import org.apache.ibatis.annotations.Param; + +import java.time.LocalDate; /** * 能源费率(currency 为 INT:0=CNY,1=USD,2=EUR)Mapper接口 @@ -12,4 +15,9 @@ import com.klp.common.core.mapper.BaseMapperPlus; */ public interface EmsEnergyRateMapper extends BaseMapperPlus { + /** + * 按能源类型与日期获取生效费率。 + */ + EmsEnergyRate selectEffectiveRate(@Param("energyTypeId") Long energyTypeId, + @Param("calcDate") LocalDate calcDate); } diff --git a/klp-ems/src/main/java/com/klp/ems/mapper/EmsRateTierMapper.java b/klp-ems/src/main/java/com/klp/ems/mapper/EmsRateTierMapper.java new file mode 100644 index 00000000..9ca2f4d5 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/mapper/EmsRateTierMapper.java @@ -0,0 +1,26 @@ +package com.klp.ems.mapper; + +import com.klp.ems.domain.EmsRateTier; +import com.klp.ems.domain.vo.EmsRateTierVo; +import com.klp.common.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 梯度费率Mapper接口 + * + * @author Joshi + * @date 2025-12-05 + */ +public interface EmsRateTierMapper extends BaseMapperPlus { + + /** + * 根据费率ID查询梯度费率列表 + */ + List selectByRateId(Long energyRateId); + + /** + * 物理删除指定费率的所有梯度 + */ + int deleteByRateIdPhysical(Long energyRateId); +} diff --git a/klp-ems/src/main/java/com/klp/ems/mapper/EmsRateTierPeriodLinkMapper.java b/klp-ems/src/main/java/com/klp/ems/mapper/EmsRateTierPeriodLinkMapper.java new file mode 100644 index 00000000..a3ada7b7 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/mapper/EmsRateTierPeriodLinkMapper.java @@ -0,0 +1,65 @@ +package com.klp.ems.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.klp.ems.domain.EmsRateTierPeriodLink; +import com.klp.ems.domain.vo.EmsRateTierPeriodLinkVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 梯度与时段关联 Mapper 接口 + * + * @author Joshi + * @date 2025-12-05 + */ +public interface EmsRateTierPeriodLinkMapper extends BaseMapper { + + /** + * 根据梯度ID查询所有关联的时段费率 + * + * @param tierId 梯度ID + * @return 梯度-时段关联列表 + */ + List selectByTierId(@Param("tierId") Long tierId); + + /** + * 根据梯度ID删除所有关联的时段费率(逻辑删除) + * + * @param tierId 梯度ID + * @return 删除数量 + */ + int deleteByTierId(@Param("tierId") Long tierId); + + /** + * 根据梯度ID物理删除所有关联的时段费率 + * + * @param tierId 梯度ID + * @return 删除数量 + */ + int deleteByTierIdPhysical(@Param("tierId") Long tierId); + + /** + * 根据费率ID删除所有关联的梯度-时段费率(逻辑删除) + * + * @param energyRateId 费率ID + * @return 删除数量 + */ + int deleteByEnergyRateId(@Param("energyRateId") Long energyRateId); + + /** + * 根据费率ID物理删除所有关联的梯度-时段费率 + * + * @param energyRateId 费率ID + * @return 删除数量 + */ + int deleteByEnergyRateIdPhysical(@Param("energyRateId") Long energyRateId); + + /** + * 查询梯度-时段关联的完整信息(包含梯度和时段详情) + * + * @param energyRateId 费率ID + * @return 梯度-时段关联VO列表 + */ + List selectVoByEnergyRateId(@Param("energyRateId") Long energyRateId); +} diff --git a/klp-ems/src/main/java/com/klp/ems/mapper/EmsRateTimePeriodLinkMapper.java b/klp-ems/src/main/java/com/klp/ems/mapper/EmsRateTimePeriodLinkMapper.java new file mode 100644 index 00000000..a163a0ce --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/mapper/EmsRateTimePeriodLinkMapper.java @@ -0,0 +1,21 @@ +package com.klp.ems.mapper; + +import com.klp.ems.domain.EmsRateTimePeriodLink; +import com.klp.ems.domain.vo.EmsRateTimePeriodLinkVo; +import com.klp.common.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 费率与时间段关联Mapper接口 + * + * @author Joshi + * @date 2025-12-05 + */ +public interface EmsRateTimePeriodLinkMapper extends BaseMapperPlus { + + /** + * 根据费率ID查询峰谷时段费率列表 + */ + List selectByRateId(Long energyRateId); +} diff --git a/klp-ems/src/main/java/com/klp/ems/mapper/EmsTimePeriodMapper.java b/klp-ems/src/main/java/com/klp/ems/mapper/EmsTimePeriodMapper.java new file mode 100644 index 00000000..c4a23847 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/mapper/EmsTimePeriodMapper.java @@ -0,0 +1,14 @@ +package com.klp.ems.mapper; + +import com.klp.ems.domain.EmsTimePeriod; +import com.klp.ems.domain.vo.EmsTimePeriodVo; +import com.klp.common.core.mapper.BaseMapperPlus; + +/** + * 时间段Mapper接口 + * + * @author Joshi + * @date 2025-12-05 + */ +public interface EmsTimePeriodMapper extends BaseMapperPlus { +} diff --git a/klp-ems/src/main/java/com/klp/ems/mapper/WmsEnergyCoilDailyMapper.java b/klp-ems/src/main/java/com/klp/ems/mapper/WmsEnergyCoilDailyMapper.java new file mode 100644 index 00000000..ad0a2f9e --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/mapper/WmsEnergyCoilDailyMapper.java @@ -0,0 +1,53 @@ +package com.klp.ems.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.klp.common.core.mapper.BaseMapperPlus; +import com.klp.ems.domain.WmsEnergyCoilDaily; +import com.klp.ems.domain.bo.EnergyCostReportBo; +import com.klp.ems.domain.vo.EnergyCostSummaryVo; +import com.klp.ems.domain.vo.WmsEnergyCoilDailyStatisticsVo; +import com.klp.ems.domain.vo.WmsEnergyCoilDailyVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 钢卷日能源成本分摊结果 Mapper + */ +public interface WmsEnergyCoilDailyMapper extends BaseMapperPlus { + + /** 物理清理指定任务的明细 */ + int deleteByTaskId(Long taskId); + + /** 查询指定任务的所有分摊记录 */ + List selectListByTask(Long taskId); + + /** 按能源类型汇总 */ + List summaryByEnergyType(@Param("bo") EnergyCostReportBo bo); + + /** 按逻辑库区汇总 */ + List summaryByWarehouse(@Param("bo") EnergyCostReportBo bo); + + /** 按计量设备汇总 */ + List summaryByMeter(@Param("bo") EnergyCostReportBo bo); + + /** 按任务汇总 */ + List summaryByTask(@Param("bo") EnergyCostReportBo bo); + + /** 概览统计 */ + Map selectEnergyOverview(@Param("bo") EnergyCostReportBo bo); + + /** 明细分页 */ + Page selectReportDetail(Page page, @Param("bo") EnergyCostReportBo bo); + + /** 查询待操作钢卷的能源成本(一次性SQL查询) */ + List selectPendingActionCoilCost(); + + /** 查询待操作钢卷的能源成本统计 */ + WmsEnergyCoilDailyStatisticsVo selectPendingActionCoilCostStatistics( + @Param("enterCoilNo") String enterCoilNo, + @Param("currentCoilNo") String currentCoilNo, + @Param("warehouseId") Long warehouseId + ); +} diff --git a/klp-ems/src/main/java/com/klp/ems/service/IEmsEnergyConsumptionService.java b/klp-ems/src/main/java/com/klp/ems/service/IEmsEnergyConsumptionService.java index 19376263..8bf67a42 100644 --- a/klp-ems/src/main/java/com/klp/ems/service/IEmsEnergyConsumptionService.java +++ b/klp-ems/src/main/java/com/klp/ems/service/IEmsEnergyConsumptionService.java @@ -13,6 +13,7 @@ import com.klp.ems.domain.vo.ChainAnalysisVo; import java.util.Collection; import java.util.List; +import java.util.Map; /** * 能耗记录Service接口 @@ -73,4 +74,25 @@ public interface IEmsEnergyConsumptionService { /** 环比分析:periodType=day/week/month/year + dateKey;可过滤 */ ChainAnalysisVo getChainAnalysis(EmsEnergyConsumptionQueryBo queryBo); + + /** + * 获取设备的上次抄表记录(用于自动填充起始数据) + * @param meterId 设备ID + * @return 上次抄表记录,如果没有则返回null + */ + EmsEnergyConsumptionVo getLastReadingForMeter(Long meterId); + + /** + * 获取设备本月的累计消耗量 + * @param meterId 设备ID + * @return 本月累计消耗量,如果没有则返回0 + */ + Double getMonthlyConsumption(Long meterId); + + /** + * 获取能耗统计信息 + * @param bo 查询条件 + * @return 统计信息(总记录数、总消耗量、平均消耗量、最大消耗量等) + */ + Map getStatistics(EmsEnergyConsumptionBo bo); } diff --git a/klp-ems/src/main/java/com/klp/ems/service/IEmsEnergyRateService.java b/klp-ems/src/main/java/com/klp/ems/service/IEmsEnergyRateService.java index e81c3630..953911a7 100644 --- a/klp-ems/src/main/java/com/klp/ems/service/IEmsEnergyRateService.java +++ b/klp-ems/src/main/java/com/klp/ems/service/IEmsEnergyRateService.java @@ -2,7 +2,12 @@ package com.klp.ems.service; import com.klp.ems.domain.EmsEnergyRate; import com.klp.ems.domain.vo.EmsEnergyRateVo; +import com.klp.ems.domain.vo.EmsRateTierVo; +import com.klp.ems.domain.vo.EmsRateTimePeriodLinkVo; import com.klp.ems.domain.bo.EmsEnergyRateBo; +import com.klp.ems.domain.bo.EmsRateTierBo; +import com.klp.ems.domain.bo.EmsRateTimePeriodLinkBo; +import com.klp.ems.domain.bo.EmsRateTierPeriodLinkBo; import com.klp.common.core.page.TableDataInfo; import com.klp.common.core.domain.PageQuery; @@ -10,7 +15,8 @@ import java.util.Collection; import java.util.List; /** - * 能源费率(currency 为 INT:0=CNY,1=USD,2=EUR)Service接口 + * 能源费率Service接口 + * 支持:固定费率、峰谷分时、阶梯电价、峰谷+阶梯组合 * * @author Joshi * @date 2025-09-28 @@ -18,32 +24,62 @@ import java.util.List; public interface IEmsEnergyRateService { /** - * 查询能源费率(currency 为 INT:0=CNY,1=USD,2=EUR) + * 查询能源费率 */ EmsEnergyRateVo queryById(Long energyRateId); /** - * 查询能源费率(currency 为 INT:0=CNY,1=USD,2=EUR)列表 + * 查询能源费率列表 */ TableDataInfo queryPageList(EmsEnergyRateBo bo, PageQuery pageQuery); /** - * 查询能源费率(currency 为 INT:0=CNY,1=USD,2=EUR)列表 + * 查询能源费率列表 */ List queryList(EmsEnergyRateBo bo); /** - * 新增能源费率(currency 为 INT:0=CNY,1=USD,2=EUR) + * 新增能源费率(包括梯度和时段费率) */ Boolean insertByBo(EmsEnergyRateBo bo); /** - * 修改能源费率(currency 为 INT:0=CNY,1=USD,2=EUR) + * 修改能源费率(包括梯度和时段费率) */ Boolean updateByBo(EmsEnergyRateBo bo); /** - * 校验并批量删除能源费率(currency 为 INT:0=CNY,1=USD,2=EUR)信息 + * 删除能源费率(级联删除梯度和时段费率) */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 获取费率的梯度费率列表 + */ + List getRateTiers(Long energyRateId); + + /** + * 获取费率的时段费率列表 + */ + List getRateTimePeriods(Long energyRateId); + + /** + * 保存梯度费率,返回保存后的梯度列表(包含tierId) + */ + List saveTiers(Long energyRateId, List tiers); + + /** + * 保存时段费率 + */ + Boolean saveTimePeriods(Long energyRateId, List timePeriods); + + /** + * 获取梯度的峰谷时段费率(用于梯度+峰谷组合模式) + */ + List getTierPeriodLinks(Long tierId); + + /** + * 保存梯度-时段关联费率(用于梯度+峰谷组合模式) + */ + Boolean saveTierPeriodLinks(Long tierId, List tierPeriodLinks); } diff --git a/klp-ems/src/main/java/com/klp/ems/service/IEmsMeterService.java b/klp-ems/src/main/java/com/klp/ems/service/IEmsMeterService.java index f96c99db..134e3e08 100644 --- a/klp-ems/src/main/java/com/klp/ems/service/IEmsMeterService.java +++ b/klp-ems/src/main/java/com/klp/ems/service/IEmsMeterService.java @@ -5,6 +5,8 @@ import com.klp.ems.domain.vo.EmsMeterVo; import com.klp.ems.domain.bo.EmsMeterBo; import com.klp.common.core.page.TableDataInfo; import com.klp.common.core.domain.PageQuery; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; import java.util.Collection; import java.util.List; @@ -46,4 +48,14 @@ public interface IEmsMeterService { * 校验并批量删除计量设备(阈值移至此处)信息 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 下载设备导入模板 + */ + void downloadTemplate(HttpServletResponse response); + + /** + * 导入设备 + */ + Boolean importMeters(MultipartFile file); } diff --git a/klp-ems/src/main/java/com/klp/ems/service/IEmsRateTierPeriodLinkService.java b/klp-ems/src/main/java/com/klp/ems/service/IEmsRateTierPeriodLinkService.java new file mode 100644 index 00000000..9526f88d --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/service/IEmsRateTierPeriodLinkService.java @@ -0,0 +1,58 @@ +package com.klp.ems.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.klp.ems.domain.EmsRateTierPeriodLink; +import com.klp.ems.domain.bo.EmsRateTierPeriodLinkBo; +import com.klp.ems.domain.vo.EmsRateTierPeriodLinkVo; + +import java.util.List; + +/** + * 梯度与时段关联 Service 接口 + * + * @author Joshi + * @date 2025-12-05 + */ +public interface IEmsRateTierPeriodLinkService extends IService { + + /** + * 根据梯度ID查询所有关联的时段费率 + * + * @param tierId 梯度ID + * @return 梯度-时段关联列表 + */ + List getByTierId(Long tierId); + + /** + * 根据梯度ID删除所有关联的时段费率 + * + * @param tierId 梯度ID + * @return 是否删除成功 + */ + Boolean deleteByTierId(Long tierId); + + /** + * 根据费率ID删除所有关联的梯度-时段费率 + * + * @param energyRateId 费率ID + * @return 是否删除成功 + */ + Boolean deleteByEnergyRateId(Long energyRateId); + + /** + * 查询梯度-时段关联的完整信息(包含梯度和时段详情) + * + * @param energyRateId 费率ID + * @return 梯度-时段关联VO列表 + */ + List getVoByEnergyRateId(Long energyRateId); + + /** + * 批量保存梯度-时段关联费率 + * + * @param tierId 梯度ID + * @param tierPeriodLinks 梯度-时段关联列表 + * @return 是否保存成功 + */ + Boolean saveTierPeriodLinks(Long tierId, List tierPeriodLinks); +} diff --git a/klp-ems/src/main/java/com/klp/ems/service/IEmsRateTierService.java b/klp-ems/src/main/java/com/klp/ems/service/IEmsRateTierService.java new file mode 100644 index 00000000..91abc9c3 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/service/IEmsRateTierService.java @@ -0,0 +1,58 @@ +package com.klp.ems.service; + +import com.klp.ems.domain.vo.EmsRateTierVo; +import com.klp.ems.domain.bo.EmsRateTierBo; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 梯度费率Service接口 + * + * @author Joshi + * @date 2025-12-05 + */ +public interface IEmsRateTierService { + + /** + * 查询梯度费率 + */ + EmsRateTierVo queryById(Long tierId); + + /** + * 查询梯度费率列表 + */ + TableDataInfo queryPageList(EmsRateTierBo bo, PageQuery pageQuery); + + /** + * 查询梯度费率列表 + */ + List queryList(EmsRateTierBo bo); + + /** + * 根据费率ID查询梯度费率列表 + */ + List queryByRateId(Long energyRateId); + + /** + * 新增梯度费率 + */ + Boolean insertByBo(EmsRateTierBo bo); + + /** + * 修改梯度费率 + */ + Boolean updateByBo(EmsRateTierBo bo); + + /** + * 删除梯度费率 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 根据费率ID删除所有梯度费率 + */ + Boolean deleteByRateId(Long energyRateId); +} diff --git a/klp-ems/src/main/java/com/klp/ems/service/IEmsRateTimePeriodLinkService.java b/klp-ems/src/main/java/com/klp/ems/service/IEmsRateTimePeriodLinkService.java new file mode 100644 index 00000000..43275163 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/service/IEmsRateTimePeriodLinkService.java @@ -0,0 +1,58 @@ +package com.klp.ems.service; + +import com.klp.ems.domain.vo.EmsRateTimePeriodLinkVo; +import com.klp.ems.domain.bo.EmsRateTimePeriodLinkBo; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 费率与时间段关联Service接口 + * + * @author Joshi + * @date 2025-12-05 + */ +public interface IEmsRateTimePeriodLinkService { + + /** + * 查询费率与时间段关联 + */ + EmsRateTimePeriodLinkVo queryById(Long linkId); + + /** + * 查询费率与时间段关联列表 + */ + TableDataInfo queryPageList(EmsRateTimePeriodLinkBo bo, PageQuery pageQuery); + + /** + * 查询费率与时间段关联列表 + */ + List queryList(EmsRateTimePeriodLinkBo bo); + + /** + * 根据费率ID查询峰谷时段费率列表 + */ + List queryByRateId(Long energyRateId); + + /** + * 新增费率与时间段关联 + */ + Boolean insertByBo(EmsRateTimePeriodLinkBo bo); + + /** + * 修改费率与时间段关联 + */ + Boolean updateByBo(EmsRateTimePeriodLinkBo bo); + + /** + * 删除费率与时间段关联 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 根据费率ID删除所有关联 + */ + Boolean deleteByRateId(Long energyRateId); +} diff --git a/klp-ems/src/main/java/com/klp/ems/service/IEmsTimePeriodService.java b/klp-ems/src/main/java/com/klp/ems/service/IEmsTimePeriodService.java new file mode 100644 index 00000000..52728af4 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/service/IEmsTimePeriodService.java @@ -0,0 +1,48 @@ +package com.klp.ems.service; + +import com.klp.ems.domain.vo.EmsTimePeriodVo; +import com.klp.ems.domain.bo.EmsTimePeriodBo; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 时间段Service接口 + * + * @author Joshi + * @date 2025-12-05 + */ +public interface IEmsTimePeriodService { + + /** + * 查询时间段 + */ + EmsTimePeriodVo queryById(Long periodId); + + /** + * 查询时间段列表 + */ + TableDataInfo queryPageList(EmsTimePeriodBo bo, PageQuery pageQuery); + + /** + * 查询时间段列表 + */ + List queryList(EmsTimePeriodBo bo); + + /** + * 新增时间段 + */ + Boolean insertByBo(EmsTimePeriodBo bo); + + /** + * 修改时间段 + */ + Boolean updateByBo(EmsTimePeriodBo bo); + + /** + * 删除时间段 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/klp-ems/src/main/java/com/klp/ems/service/IEnergyAllocationService.java b/klp-ems/src/main/java/com/klp/ems/service/IEnergyAllocationService.java new file mode 100644 index 00000000..1532f133 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/service/IEnergyAllocationService.java @@ -0,0 +1,19 @@ +package com.klp.ems.service; + +import java.time.LocalDate; + +/** + * 综合能源分摊调度/执行服务 + */ +public interface IEnergyAllocationService { + + /** + * 根据日期+能源类型触发一次分摊,若 energyTypeId 为空则针对所有已配置能源类型。 + */ + void dispatch(LocalDate calcDate, Long energyTypeId, String allocationScope); + + /** + * 将指定任务标记为需要重新计算并立即执行。 + */ + void rerunTask(Long taskId); +} diff --git a/klp-ems/src/main/java/com/klp/ems/service/IEnergyCostReportService.java b/klp-ems/src/main/java/com/klp/ems/service/IEnergyCostReportService.java new file mode 100644 index 00000000..1f108ca7 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/service/IEnergyCostReportService.java @@ -0,0 +1,25 @@ +package com.klp.ems.service; + +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.ems.domain.bo.EnergyCostReportBo; +import com.klp.ems.domain.vo.EnergyCostSummaryVo; +import com.klp.ems.domain.vo.WmsEnergyCoilDailyVo; + +import java.util.List; +import java.util.Map; + +/** + * 能源成本报表 Service + */ +public interface IEnergyCostReportService { + + /** 概览统计 */ + Map overview(EnergyCostReportBo bo); + + /** 汇总数据 */ + List summary(EnergyCostReportBo bo); + + /** 明细分页 */ + TableDataInfo detail(EnergyCostReportBo bo, PageQuery pageQuery); +} diff --git a/klp-ems/src/main/java/com/klp/ems/service/IWmsEnergyCoilDailyService.java b/klp-ems/src/main/java/com/klp/ems/service/IWmsEnergyCoilDailyService.java new file mode 100644 index 00000000..e60101f3 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/service/IWmsEnergyCoilDailyService.java @@ -0,0 +1,42 @@ +package com.klp.ems.service; + +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.ems.domain.bo.WmsEnergyCoilDailyBo; +import com.klp.ems.domain.vo.WmsEnergyCoilDailyVo; +import com.klp.ems.domain.vo.WmsEnergyCoilDailyStatisticsVo; + +import java.util.Collection; +import java.util.List; + +/** + * 钢卷日能源成本分摊结果 Service + */ +public interface IWmsEnergyCoilDailyService { + + WmsEnergyCoilDailyVo queryById(Long energyCostId); + + TableDataInfo queryPageList(WmsEnergyCoilDailyBo bo, PageQuery pageQuery); + + List queryList(WmsEnergyCoilDailyBo bo); + + /** + * 查询待操作钢卷的能源成本(基于待操作时间范围计算) + * 1. 查询所有待操作记录(已操作或等待操作的钢卷) + * 2. 按待操作的时间范围查询抄表记录 + * 3. 计算该时间段内的能源消耗和成本 + * 4. 按分摊方式分摊到每个钢卷 + */ + TableDataInfo queryPendingActionCoilCost(WmsEnergyCoilDailyBo bo, PageQuery pageQuery); + + /** + * 查询待操作钢卷的能源成本统计 + */ + WmsEnergyCoilDailyStatisticsVo queryPendingActionCoilCostStatistics(String enterCoilNo, String currentCoilNo, Long warehouseId); + + Boolean insertByBo(WmsEnergyCoilDailyBo bo); + + Boolean updateByBo(WmsEnergyCoilDailyBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/klp-ems/src/main/java/com/klp/ems/service/impl/EmsEnergyConsumptionServiceImpl.java b/klp-ems/src/main/java/com/klp/ems/service/impl/EmsEnergyConsumptionServiceImpl.java index 30bdf176..b77341de 100644 --- a/klp-ems/src/main/java/com/klp/ems/service/impl/EmsEnergyConsumptionServiceImpl.java +++ b/klp-ems/src/main/java/com/klp/ems/service/impl/EmsEnergyConsumptionServiceImpl.java @@ -1,12 +1,16 @@ package com.klp.ems.service.impl; import cn.hutool.core.bean.BeanUtil; +import com.klp.common.core.domain.entity.SysUser; import com.klp.common.core.page.TableDataInfo; import com.klp.common.core.domain.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.klp.common.helper.LoginHelper; +import com.klp.ems.domain.EmsEnergyType; import com.klp.ems.domain.EmsLocation; +import com.klp.ems.domain.EmsMeter; import com.klp.ems.domain.bo.EmsEnergyConsumptionQueryBo; import com.klp.ems.domain.bo.MeterFilterBo; import com.klp.ems.domain.bo.TimeRangeWithMetersBo; @@ -15,6 +19,7 @@ import com.klp.ems.domain.vo.SummaryDailyVo; import com.klp.ems.domain.vo.SummaryMonthlyVo; import com.klp.ems.domain.vo.YearOnYearVo; import com.klp.ems.domain.vo.ChainAnalysisVo; +import com.klp.system.mapper.SysUserMapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import com.klp.ems.domain.bo.EmsEnergyConsumptionBo; @@ -23,6 +28,7 @@ import com.klp.ems.domain.EmsEnergyConsumption; import com.klp.ems.mapper.EmsEnergyConsumptionMapper; import com.klp.ems.mapper.EmsMeterMapper; import com.klp.ems.mapper.EmsLocationMapper; +import com.klp.ems.mapper.EmsEnergyTypeMapper; import com.klp.ems.service.IEmsEnergyConsumptionService; import java.time.LocalDate; @@ -30,6 +36,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.WeekFields; import java.util.*; +import java.math.BigDecimal; /** * 能耗记录Service业务层处理 @@ -44,13 +51,22 @@ public class EmsEnergyConsumptionServiceImpl implements IEmsEnergyConsumptionSer private final EmsEnergyConsumptionMapper baseMapper; private final EmsMeterMapper meterMapper; private final EmsLocationMapper locationMapper; + private final SysUserMapper sysUserMapper; + private final EmsEnergyTypeMapper energyTypeMapper; /** * 查询能耗记录 */ @Override public EmsEnergyConsumptionVo queryById(Long energyConsumptionId){ - return baseMapper.selectVoById(energyConsumptionId); + EmsEnergyConsumptionVo vo = baseMapper.selectVoById(energyConsumptionId); + if (vo != null && vo.getRecordedBy() != null) { + SysUser user = sysUserMapper.selectById(vo.getRecordedBy()); + if (user != null) { + vo.setRecordedByName(user.getNickName()); + } + } + return vo; } /** @@ -60,6 +76,7 @@ public class EmsEnergyConsumptionServiceImpl implements IEmsEnergyConsumptionSer public TableDataInfo queryPageList(EmsEnergyConsumptionBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + fillRecordedByName(result.getRecords()); return TableDataInfo.build(result); } @@ -69,7 +86,41 @@ public class EmsEnergyConsumptionServiceImpl implements IEmsEnergyConsumptionSer @Override public List queryList(EmsEnergyConsumptionBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); + List list = baseMapper.selectVoList(lqw); + fillRecordedByName(list); + return list; + } + + /** + * 填充记录人名称、设备编号、能源类型名称 + */ + private void fillRecordedByName(List list) { + if (list == null || list.isEmpty()) { + return; + } + for (EmsEnergyConsumptionVo vo : list) { + // 填充记录人名称 + if (vo.getRecordedBy() != null) { + SysUser user = sysUserMapper.selectById(vo.getRecordedBy()); + if (user != null) { + vo.setRecordedByName(user.getNickName()); + } + } + // 填充设备编号和能源类型名称 + if (vo.getMeterId() != null) { + EmsMeter meter = meterMapper.selectById(vo.getMeterId()); + if (meter != null) { + vo.setMeterCode(meter.getMeterCode()); + // 通过energyTypeId查询能源类型名称 + if (meter.getEnergyTypeId() != null) { + EmsEnergyType energyType = energyTypeMapper.selectById(meter.getEnergyTypeId()); + if (energyType != null) { + vo.setEnergyTypeName(energyType.getName()); + } + } + } + } + } } private LambdaQueryWrapper buildQueryWrapper(EmsEnergyConsumptionBo bo) { @@ -92,6 +143,7 @@ public class EmsEnergyConsumptionServiceImpl implements IEmsEnergyConsumptionSer public Boolean insertByBo(EmsEnergyConsumptionBo bo) { EmsEnergyConsumption add = BeanUtil.toBean(bo, EmsEnergyConsumption.class); validEntityBeforeSave(add); + add.setRecordedBy(LoginHelper.getUserId()); boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setEnergyConsumptionId(add.getEnergyConsumptionId()); @@ -455,4 +507,55 @@ public class EmsEnergyConsumptionServiceImpl implements IEmsEnergyConsumptionSer filter.setMeterId(null); return meterMapper.selectMeterIds(filter); } + + /** + * 获取设备的上次抄表记录(用于自动填充起始数据) + */ + @Override + public EmsEnergyConsumptionVo getLastReadingForMeter(Long meterId) { + List readings = baseMapper.selectLatestTwoReadings(meterId); + if (readings != null && !readings.isEmpty()) { + // 返回最新的一条记录 + EmsEnergyConsumption latest = readings.get(0); + return BeanUtil.toBean(latest, EmsEnergyConsumptionVo.class); + } + return null; + } + + /** + * 获取设备本月的累计消耗量 + */ + @Override + public Double getMonthlyConsumption(Long meterId) { + LocalDateTime now = LocalDateTime.now(); + LocalDateTime startOfThisMonth = now.withDayOfMonth(1).toLocalDate().atStartOfDay(); + LocalDateTime endOfThisMonth = now.withDayOfMonth(now.toLocalDate().lengthOfMonth()) + .withHour(23).withMinute(59).withSecond(59); + + DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + TimeRangeWithMetersBo range = new TimeRangeWithMetersBo(); + range.setMeterIds(Collections.singletonList(meterId)); + range.setStart(fmt.format(startOfThisMonth)); + range.setEnd(fmt.format(endOfThisMonth)); + + Double consumption = baseMapper.sumConsumptionBetweenWithMeters(range); + return consumption != null ? consumption : 0D; + } + + /** + * 获取能耗统计信息(使用SQL聚合函数) + */ + @Override + public Map getStatistics(EmsEnergyConsumptionBo bo) { + Map stats = baseMapper.getStatistics(bo); + if (stats == null) { + stats = new HashMap<>(); + stats.put("totalCount", 0); + stats.put("totalConsumption", 0.0); + stats.put("avgConsumption", 0.0); + stats.put("maxConsumption", 0.0); + stats.put("minConsumption", 0.0); + } + return stats; + } } diff --git a/klp-ems/src/main/java/com/klp/ems/service/impl/EmsEnergyRateServiceImpl.java b/klp-ems/src/main/java/com/klp/ems/service/impl/EmsEnergyRateServiceImpl.java index 4fa9b715..5655364c 100644 --- a/klp-ems/src/main/java/com/klp/ems/service/impl/EmsEnergyRateServiceImpl.java +++ b/klp-ems/src/main/java/com/klp/ems/service/impl/EmsEnergyRateServiceImpl.java @@ -6,20 +6,33 @@ import com.klp.common.core.domain.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.klp.ems.domain.bo.*; +import com.klp.ems.domain.vo.EmsRateTierPeriodLinkVo; +import com.klp.ems.mapper.EmsRateTierPeriodLinkMapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import com.klp.ems.domain.bo.EmsEnergyRateBo; import com.klp.ems.domain.vo.EmsEnergyRateVo; +import com.klp.ems.domain.vo.EmsRateTierVo; +import com.klp.ems.domain.vo.EmsRateTimePeriodLinkVo; import com.klp.ems.domain.EmsEnergyRate; +import com.klp.ems.domain.EmsRateTier; +import com.klp.ems.domain.EmsRateTimePeriodLink; import com.klp.ems.mapper.EmsEnergyRateMapper; +import com.klp.ems.mapper.EmsRateTierMapper; +import com.klp.ems.mapper.EmsRateTimePeriodLinkMapper; import com.klp.ems.service.IEmsEnergyRateService; +import com.klp.ems.service.IEmsRateTierService; +import com.klp.ems.service.IEmsRateTimePeriodLinkService; +import com.klp.ems.service.IEmsRateTierPeriodLinkService; +import com.klp.ems.service.IEmsTimePeriodService; import java.util.List; import java.util.Map; import java.util.Collection; /** - * 能源费率(currency 为 INT:0=CNY,1=USD,2=EUR)Service业务层处理 + * 能源费率Service业务层处理 + * 支持:固定费率、峰谷分时、阶梯电价、峰谷+阶梯组合 * * @author Joshi * @date 2025-09-28 @@ -29,6 +42,11 @@ import java.util.Collection; public class EmsEnergyRateServiceImpl implements IEmsEnergyRateService { private final EmsEnergyRateMapper baseMapper; + private final IEmsRateTierService rateTierService; + private final IEmsRateTimePeriodLinkService rateTimePeriodLinkService; + private final EmsRateTierMapper rateTierMapper; + private final IEmsRateTierPeriodLinkService rateTierPeriodLinkService; + private final IEmsTimePeriodService iEmsTimePeriodService; /** * 查询能源费率(currency 为 INT:0=CNY,1=USD,2=EUR) @@ -45,6 +63,10 @@ public class EmsEnergyRateServiceImpl implements IEmsEnergyRateService { public TableDataInfo queryPageList(EmsEnergyRateBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + // 为每个费率添加梯度信息 + result.getRecords().forEach(rate -> { + rate.setTiers(getRateTiers(rate.getEnergyRateId())); + }); return TableDataInfo.build(result); } @@ -54,7 +76,12 @@ public class EmsEnergyRateServiceImpl implements IEmsEnergyRateService { @Override public List queryList(EmsEnergyRateBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); + List list = baseMapper.selectVoList(lqw); + // 为每个费率添加梯度信息 + list.forEach(rate -> { + rate.setTiers(getRateTiers(rate.getEnergyRateId())); + }); + return list; } private LambdaQueryWrapper buildQueryWrapper(EmsEnergyRateBo bo) { @@ -100,13 +127,225 @@ public class EmsEnergyRateServiceImpl implements IEmsEnergyRateService { } /** - * 批量删除能源费率(currency 为 INT:0=CNY,1=USD,2=EUR) + * 批量删除能源费率(级联删除梯度和时段费率) */ @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { if(isValid){ //TODO 做一些业务上的校验,判断是否需要校验 } + // 级联删除梯度费率和时段费率 + for (Long rateId : ids) { + rateTierService.deleteByRateId(rateId); + rateTimePeriodLinkService.deleteByRateId(rateId); + } return baseMapper.deleteBatchIds(ids) > 0; } + + /** + * 获取费率的梯度费率列表 + * 逻辑: + * - 单梯度模式:返回梯度的 rate 字段 + * - 单峰谷模式:不返回梯度(梯度为空) + * - 双模式(梯度+峰谷):返回梯度在第一个时段(峰)的费率 + */ + @Override + public List getRateTiers(Long energyRateId) { + // 先查询费率配置 + EmsEnergyRateVo energyRate = queryById(energyRateId); + if (energyRate == null) { + return new java.util.ArrayList<>(); + } + + List tiers = rateTierService.queryByRateId(energyRateId); + + // 双模式(梯度+峰谷):需要从关联表中获取费率 + if (energyRate.getUseTieredPricing() == 1 && energyRate.getUsePeakValley() == 1) { + // 获取所有梯度-时段关联 + List tierPeriodLinks = rateTierPeriodLinkService.getVoByEnergyRateId(energyRateId); + + // 为每个梯度设置第一个时段(峰)的费率,并添加所有时段的费率映射 + tiers.forEach(tier -> { + // 为该梯度创建时段费率映射 + java.util.Map tierPeriodRates = new java.util.HashMap<>(); + + // 找到该梯度的所有时段费率 + tierPeriodLinks.stream() + .filter(link -> link.getTierId().equals(tier.getTierId())) + .forEach(link -> { + tierPeriodRates.put(link.getPeriodId(), link.getRate()); + }); + + // 设置梯度的时段费率映射 + tier.setTierPeriodRates(tierPeriodRates); + + // 设置梯度的主费率为峰时段的费率 + EmsRateTierPeriodLinkVo peakRate = tierPeriodLinks.stream() + .filter(link -> link.getTierId().equals(tier.getTierId()) && link.getPeriodType() == 0) + .findFirst() + .orElse(null); + + if (peakRate != null) { + tier.setRate(peakRate.getRate()); + } + }); + } + + System.out.println("getRateTiers返回梯度数量: " + tiers.size() + ", 模式: tiered=" + energyRate.getUseTieredPricing() + ", peakValley=" + energyRate.getUsePeakValley()); + tiers.forEach(tier -> System.out.println(" - tierLevel=" + tier.getTierLevel() + ", rate=" + tier.getRate())); + return tiers; + } + + /** + * 获取费率的时段费率列表 + */ + @Override + public List getRateTimePeriods(Long energyRateId) { + return rateTimePeriodLinkService.queryByRateId(energyRateId); + } + + /** + * 保存梯度费率,返回保存后的梯度列表(包含tierId) + */ + @Override + public List saveTiers(Long energyRateId, List tiers) { + if (tiers == null || tiers.isEmpty()) { + return new java.util.ArrayList<>(); + } + + try { + // 先物理删除梯度-时段关联(避免外键约束失败) + com.klp.ems.mapper.EmsRateTierPeriodLinkMapper tierPeriodLinkMapper = + (com.klp.ems.mapper.EmsRateTierPeriodLinkMapper) rateTierPeriodLinkService.getBaseMapper(); + int deleteLinkCount = tierPeriodLinkMapper.deleteByEnergyRateIdPhysical(energyRateId); + System.out.println("物理删除梯度-时段关联数量: " + deleteLinkCount + ", energyRateId: " + energyRateId); + + // 再物理删除旧的梯度费率(使用原生 SQL) + int deleteCount = rateTierMapper.deleteByRateIdPhysical(energyRateId); + System.out.println("物理删除梯度数量: " + deleteCount + ", energyRateId: " + energyRateId); + + // 再保存新的梯度费率 + for (EmsRateTierBo tier : tiers) { + tier.setEnergyRateId(energyRateId); + // 清除 tierId,让数据库自动生成 + tier.setTierId(null); + System.out.println("插入梯度: tierLevel=" + tier.getTierLevel() + + ", minUsage=" + tier.getMinUsage() + + ", maxUsage=" + tier.getMaxUsage() + + ", rate=" + tier.getRate() + + ", energyRateId=" + energyRateId); + rateTierService.insertByBo(tier); + } + + // 返回保存后的梯度列表 + List result = rateTierService.queryByRateId(energyRateId); + System.out.println("保存梯度成功,返回数量: " + result.size()); + return result; + } catch (Exception e) { + // 如果插入失败,记录错误并重新抛出 + System.err.println("保存梯度失败: " + e.getMessage()); + e.printStackTrace(); + throw e; + } + } + + /** + * 保存时段费率 + */ + @Override + public Boolean saveTimePeriods(Long energyRateId, List timePeriods) { + if (timePeriods == null || timePeriods.isEmpty()) { + return true; + } + + // 获取现有的时段费率 + List existingLinks = rateTimePeriodLinkService.queryByRateId(energyRateId); + + // 处理时段费率:新增、更新或删除 + for (EmsRateTimePeriodLinkBo period : timePeriods) { + // 如果 periodId 为 null,说明是新增时段,需要先保存时段定义 + if (period.getPeriodId() == null) { + // 创建新的时段定义 + EmsTimePeriodBo timePeriodBo = new EmsTimePeriodBo(); + timePeriodBo.setPeriodType(period.getPeriodType()); + timePeriodBo.setPeriodName(period.getPeriodName()); + timePeriodBo.setStartTime(period.getStartTime()); + timePeriodBo.setEndTime(period.getEndTime()); + timePeriodBo.setCrossDay(period.getCrossDay()); + // 保存时段定义并获得 periodId + iEmsTimePeriodService.insertByBo(timePeriodBo); + period.setPeriodId(timePeriodBo.getPeriodId()); + } + + // 如果 rate 为 null,说明是组合模式,只保存时段定义,不保存时段费率关联 + if (period.getRate() == null) { + System.out.println("跳过时段费率关联保存(组合模式): periodId=" + period.getPeriodId()); + continue; + } + + period.setEnergyRateId(energyRateId); + + // 检查是否已存在(通过 linkId) + if (period.getLinkId() != null) { + // 已存在,执行更新 + rateTimePeriodLinkService.updateByBo(period); + } else { + // linkId 为 null,检查是否存在相同的 periodId + EmsRateTimePeriodLinkVo existingLink = existingLinks.stream() + .filter(link -> link.getPeriodId().equals(period.getPeriodId()) && + link.getEnergyRateId().equals(energyRateId)) + .findFirst() + .orElse(null); + + if (existingLink != null) { + // 找到已有关联,执行更新 + period.setLinkId(existingLink.getLinkId()); + rateTimePeriodLinkService.updateByBo(period); + } else { + // 不存在,执行插入 + rateTimePeriodLinkService.insertByBo(period); + } + } + } + + // 删除不在新列表中的旧时段费率 + for (EmsRateTimePeriodLinkVo existingLink : existingLinks) { + boolean stillExists = timePeriods.stream() + .anyMatch(period -> period.getPeriodId().equals(existingLink.getPeriodId())); + if (!stillExists) { + rateTimePeriodLinkService.deleteWithValidByIds( + java.util.Collections.singletonList(existingLink.getLinkId()), false); + } + } + + return true; + } + + /** + * 获取梯度的峰谷时段费率(用于梯度+峰谷组合模式) + */ + @Override + public List getTierPeriodLinks(Long tierId) { + return rateTierPeriodLinkService.getByTierId(tierId).stream() + .map(link -> { + EmsRateTierPeriodLinkBo bo = new EmsRateTierPeriodLinkBo(); + bo.setLinkId(link.getLinkId()); + bo.setTierId(link.getTierId()); + bo.setPeriodId(link.getPeriodId()); + bo.setRate(link.getRate()); + return bo; + }) + .collect(java.util.stream.Collectors.toList()); + } + + /** + * 保存梯度-时段关联费率(用于梯度+峰谷组合模式) + */ + @Override + public Boolean saveTierPeriodLinks(Long tierId, List tierPeriodLinks) { + if (tierPeriodLinks == null || tierPeriodLinks.isEmpty()) { + return true; + } + return rateTierPeriodLinkService.saveTierPeriodLinks(tierId, tierPeriodLinks); + } } diff --git a/klp-ems/src/main/java/com/klp/ems/service/impl/EmsMeterServiceImpl.java b/klp-ems/src/main/java/com/klp/ems/service/impl/EmsMeterServiceImpl.java index 6c110455..c5195388 100644 --- a/klp-ems/src/main/java/com/klp/ems/service/impl/EmsMeterServiceImpl.java +++ b/klp-ems/src/main/java/com/klp/ems/service/impl/EmsMeterServiceImpl.java @@ -7,14 +7,21 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.klp.common.utils.StringUtils; +import com.klp.common.utils.poi.ExcelUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import com.klp.ems.domain.bo.EmsMeterBo; import com.klp.ems.domain.vo.EmsMeterVo; import com.klp.ems.domain.EmsMeter; +import com.klp.ems.domain.EmsEnergyType; +import com.klp.ems.domain.dto.MeterTemplateDto; import com.klp.ems.mapper.EmsMeterMapper; +import com.klp.ems.mapper.EmsEnergyTypeMapper; import com.klp.ems.service.IEmsMeterService; +import javax.servlet.http.HttpServletResponse; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Collection; @@ -30,6 +37,7 @@ import java.util.Collection; public class EmsMeterServiceImpl implements IEmsMeterService { private final EmsMeterMapper baseMapper; + private final EmsEnergyTypeMapper energyTypeMapper; /** * 查询计量设备(阈值移至此处) @@ -114,4 +122,113 @@ public class EmsMeterServiceImpl implements IEmsMeterService { } return baseMapper.deleteBatchIds(ids) > 0; } + + /** + * 下载设备导入模板 + */ + @Override + public void downloadTemplate(HttpServletResponse response) { + // 创建示例数据 + List templateData = new java.util.ArrayList<>(); + + // 示例1:水表 + MeterTemplateDto meter1 = new MeterTemplateDto(); + meter1.setMeterCode("W-001"); + meter1.setEnergyType("水"); + meter1.setModel("DL-100"); + meter1.setManufacturer("厂商A"); + meter1.setInstallDate(new Date()); + templateData.add(meter1); + + // 示例2:电表 + MeterTemplateDto meter2 = new MeterTemplateDto(); + meter2.setMeterCode("E-001"); + meter2.setEnergyType("电"); + meter2.setModel("DL-200"); + meter2.setManufacturer("厂商B"); + meter2.setInstallDate(new Date()); + templateData.add(meter2); + + // 示例3:气表 + MeterTemplateDto meter3 = new MeterTemplateDto(); + meter3.setMeterCode("G-001"); + meter3.setEnergyType("天然气"); + meter3.setModel("DL-300"); + meter3.setManufacturer("厂商C"); + meter3.setInstallDate(new Date()); + templateData.add(meter3); + + // 导出为 Excel + ExcelUtil.exportExcel(templateData, "设备导入模板", MeterTemplateDto.class, response); + } + + /** + * 导入设备 + */ + @Override + public Boolean importMeters(MultipartFile file) { + try { + // 读取 Excel 文件为模板 DTO + List templateList = ExcelUtil.importExcel(file.getInputStream(), MeterTemplateDto.class); + + if (templateList == null || templateList.isEmpty()) { + return false; + } + + // 转换为 EmsMeter 并设置默认值 + List meterList = new java.util.ArrayList<>(); + for (MeterTemplateDto template : templateList) { + EmsMeter meter = new EmsMeter(); + meter.setMeterCode(template.getMeterCode()); + meter.setModel(template.getModel()); + meter.setManufacturer(template.getManufacturer()); + + // 安装日期为空时默认为当日 + if (template.getInstallDate() != null) { + meter.setInstallDate(template.getInstallDate()); + } else { + meter.setInstallDate(new Date()); + } + + // 设备状态默认为启用(0) + meter.setStatus(0L); + + // 根据能源类型名称获取能源类型 ID + Long energyTypeId = getEnergyTypeIdByName(template.getEnergyType()); + meter.setEnergyTypeId(energyTypeId); + + meterList.add(meter); + } + + // 批量插入 + for (EmsMeter meter : meterList) { + validEntityBeforeSave(meter); + baseMapper.insert(meter); + } + + return true; + } catch (Exception e) { + throw new RuntimeException("导入设备失败: " + e.getMessage(), e); + } + } + + /** + * 根据能源类型名称获取能源类型 ID + */ + private Long getEnergyTypeIdByName(String energyTypeName) { + if (energyTypeName == null) { + return null; + } + + // 从数据库查询能源类型 + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(EmsEnergyType::getName, energyTypeName.trim()); + EmsEnergyType energyType = energyTypeMapper.selectOne(queryWrapper); + + if (energyType != null) { + return energyType.getEnergyTypeId(); + } + + return null; + } } diff --git a/klp-ems/src/main/java/com/klp/ems/service/impl/EmsRateTierPeriodLinkServiceImpl.java b/klp-ems/src/main/java/com/klp/ems/service/impl/EmsRateTierPeriodLinkServiceImpl.java new file mode 100644 index 00000000..a2c96f78 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/service/impl/EmsRateTierPeriodLinkServiceImpl.java @@ -0,0 +1,79 @@ +package com.klp.ems.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.klp.ems.domain.EmsRateTierPeriodLink; +import com.klp.ems.domain.bo.EmsRateTierPeriodLinkBo; +import com.klp.ems.domain.vo.EmsRateTierPeriodLinkVo; +import com.klp.ems.mapper.EmsRateTierPeriodLinkMapper; +import com.klp.ems.service.IEmsRateTierPeriodLinkService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 梯度与时段关联 Service 实现 + * + * @author Joshi + * @date 2025-12-05 + */ +@Service +@RequiredArgsConstructor +public class EmsRateTierPeriodLinkServiceImpl extends ServiceImpl + implements IEmsRateTierPeriodLinkService { + + private final EmsRateTierPeriodLinkMapper emsRateTierPeriodLinkMapper; + + @Override + public List getByTierId(Long tierId) { + return emsRateTierPeriodLinkMapper.selectByTierId(tierId); + } + + @Override + @Transactional + public Boolean deleteByTierId(Long tierId) { + return emsRateTierPeriodLinkMapper.deleteByTierId(tierId) > 0; + } + + @Override + @Transactional + public Boolean deleteByEnergyRateId(Long energyRateId) { + return emsRateTierPeriodLinkMapper.deleteByEnergyRateId(energyRateId) > 0; + } + + @Override + public List getVoByEnergyRateId(Long energyRateId) { + return emsRateTierPeriodLinkMapper.selectVoByEnergyRateId(energyRateId); + } + + @Override + @Transactional + public Boolean saveTierPeriodLinks(Long tierId, List tierPeriodLinks) { + System.out.println("保存梯度-时段关联: tierId=" + tierId + ", 关联数量=" + tierPeriodLinks.size()); + tierPeriodLinks.forEach(bo -> { + System.out.println(" - periodId=" + bo.getPeriodId() + ", rate=" + bo.getRate()); + }); + + // 先物理删除该梯度的所有关联(避免死锁) + int deleteCount = emsRateTierPeriodLinkMapper.deleteByTierIdPhysical(tierId); + System.out.println("物理删除梯度-时段关联数量: " + deleteCount + ", tierId: " + tierId); + + // 再批量插入新的关联 + List links = tierPeriodLinks.stream() + .map(bo -> { + EmsRateTierPeriodLink link = new EmsRateTierPeriodLink(); + link.setTierId(tierId); + link.setPeriodId(bo.getPeriodId()); + link.setRate(bo.getRate()); + link.setRemark(bo.getRemark()); + return link; + }) + .collect(Collectors.toList()); + + boolean result = this.saveBatch(links); + System.out.println("梯度-时段关联保存结果: " + result); + return result; + } +} diff --git a/klp-ems/src/main/java/com/klp/ems/service/impl/EmsRateTierServiceImpl.java b/klp-ems/src/main/java/com/klp/ems/service/impl/EmsRateTierServiceImpl.java new file mode 100644 index 00000000..34e91e0d --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/service/impl/EmsRateTierServiceImpl.java @@ -0,0 +1,98 @@ +package com.klp.ems.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.domain.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.klp.ems.domain.bo.EmsRateTierBo; +import com.klp.ems.domain.vo.EmsRateTierVo; +import com.klp.ems.domain.EmsRateTier; +import com.klp.ems.mapper.EmsRateTierMapper; +import com.klp.ems.service.IEmsRateTierService; + +import java.util.Collection; +import java.util.List; + +/** + * 梯度费率Service业务层处理 + * + * @author Joshi + * @date 2025-12-05 + */ +@RequiredArgsConstructor +@Service +public class EmsRateTierServiceImpl implements IEmsRateTierService { + + private final EmsRateTierMapper baseMapper; + + @Override + public EmsRateTierVo queryById(Long tierId) { + return baseMapper.selectVoById(tierId); + } + + @Override + public TableDataInfo queryPageList(EmsRateTierBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(EmsRateTierBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + @Override + public List queryByRateId(Long energyRateId) { + return baseMapper.selectByRateId(energyRateId); + } + + private LambdaQueryWrapper buildQueryWrapper(EmsRateTierBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getEnergyRateId() != null, EmsRateTier::getEnergyRateId, bo.getEnergyRateId()); + lqw.eq(bo.getTierLevel() != null, EmsRateTier::getTierLevel, bo.getTierLevel()); + return lqw; + } + + @Override + public Boolean insertByBo(EmsRateTierBo bo) { + EmsRateTier add = BeanUtil.toBean(bo, EmsRateTier.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setTierId(add.getTierId()); + } + return flag; + } + + @Override + public Boolean updateByBo(EmsRateTierBo bo) { + EmsRateTier update = BeanUtil.toBean(bo, EmsRateTier.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + private void validEntityBeforeSave(EmsRateTier entity) { + // TODO 做一些数据校验 + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // TODO 做一些业务上的校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public Boolean deleteByRateId(Long energyRateId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(EmsRateTier::getEnergyRateId, energyRateId); + return baseMapper.delete(lqw) > 0; + } +} diff --git a/klp-ems/src/main/java/com/klp/ems/service/impl/EmsRateTimePeriodLinkServiceImpl.java b/klp-ems/src/main/java/com/klp/ems/service/impl/EmsRateTimePeriodLinkServiceImpl.java new file mode 100644 index 00000000..308ffb19 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/service/impl/EmsRateTimePeriodLinkServiceImpl.java @@ -0,0 +1,98 @@ +package com.klp.ems.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.domain.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.klp.ems.domain.bo.EmsRateTimePeriodLinkBo; +import com.klp.ems.domain.vo.EmsRateTimePeriodLinkVo; +import com.klp.ems.domain.EmsRateTimePeriodLink; +import com.klp.ems.mapper.EmsRateTimePeriodLinkMapper; +import com.klp.ems.service.IEmsRateTimePeriodLinkService; + +import java.util.Collection; +import java.util.List; + +/** + * 费率与时间段关联Service业务层处理 + * + * @author Joshi + * @date 2025-12-05 + */ +@RequiredArgsConstructor +@Service +public class EmsRateTimePeriodLinkServiceImpl implements IEmsRateTimePeriodLinkService { + + private final EmsRateTimePeriodLinkMapper baseMapper; + + @Override + public EmsRateTimePeriodLinkVo queryById(Long linkId) { + return baseMapper.selectVoById(linkId); + } + + @Override + public TableDataInfo queryPageList(EmsRateTimePeriodLinkBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(EmsRateTimePeriodLinkBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + @Override + public List queryByRateId(Long energyRateId) { + return baseMapper.selectByRateId(energyRateId); + } + + private LambdaQueryWrapper buildQueryWrapper(EmsRateTimePeriodLinkBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getEnergyRateId() != null, EmsRateTimePeriodLink::getEnergyRateId, bo.getEnergyRateId()); + lqw.eq(bo.getPeriodId() != null, EmsRateTimePeriodLink::getPeriodId, bo.getPeriodId()); + return lqw; + } + + @Override + public Boolean insertByBo(EmsRateTimePeriodLinkBo bo) { + EmsRateTimePeriodLink add = BeanUtil.toBean(bo, EmsRateTimePeriodLink.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setLinkId(add.getLinkId()); + } + return flag; + } + + @Override + public Boolean updateByBo(EmsRateTimePeriodLinkBo bo) { + EmsRateTimePeriodLink update = BeanUtil.toBean(bo, EmsRateTimePeriodLink.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + private void validEntityBeforeSave(EmsRateTimePeriodLink entity) { + // TODO 做一些数据校验 + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // TODO 做一些业务上的校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public Boolean deleteByRateId(Long energyRateId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(EmsRateTimePeriodLink::getEnergyRateId, energyRateId); + return baseMapper.delete(lqw) > 0; + } +} diff --git a/klp-ems/src/main/java/com/klp/ems/service/impl/EmsTimePeriodServiceImpl.java b/klp-ems/src/main/java/com/klp/ems/service/impl/EmsTimePeriodServiceImpl.java new file mode 100644 index 00000000..ffe89d93 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/service/impl/EmsTimePeriodServiceImpl.java @@ -0,0 +1,88 @@ +package com.klp.ems.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.domain.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.klp.ems.domain.bo.EmsTimePeriodBo; +import com.klp.ems.domain.vo.EmsTimePeriodVo; +import com.klp.ems.domain.EmsTimePeriod; +import com.klp.ems.mapper.EmsTimePeriodMapper; +import com.klp.ems.service.IEmsTimePeriodService; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 时间段Service业务层处理 + * + * @author Joshi + * @date 2025-12-05 + */ +@RequiredArgsConstructor +@Service +public class EmsTimePeriodServiceImpl implements IEmsTimePeriodService { + + private final EmsTimePeriodMapper baseMapper; + + @Override + public EmsTimePeriodVo queryById(Long periodId) { + return baseMapper.selectVoById(periodId); + } + + @Override + public TableDataInfo queryPageList(EmsTimePeriodBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(EmsTimePeriodBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(EmsTimePeriodBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getPeriodId() != null, EmsTimePeriod::getPeriodId, bo.getPeriodId()); + lqw.like(bo.getPeriodName() != null, EmsTimePeriod::getPeriodName, bo.getPeriodName()); + lqw.eq(bo.getPeriodType() != null, EmsTimePeriod::getPeriodType, bo.getPeriodType()); + return lqw; + } + + @Override + public Boolean insertByBo(EmsTimePeriodBo bo) { + EmsTimePeriod add = BeanUtil.toBean(bo, EmsTimePeriod.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setPeriodId(add.getPeriodId()); + } + return flag; + } + + @Override + public Boolean updateByBo(EmsTimePeriodBo bo) { + EmsTimePeriod update = BeanUtil.toBean(bo, EmsTimePeriod.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + private void validEntityBeforeSave(EmsTimePeriod entity) { + // TODO 做一些数据校验 + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // TODO 做一些业务上的校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/klp-ems/src/main/java/com/klp/ems/service/impl/EnergyCostReportServiceImpl.java b/klp-ems/src/main/java/com/klp/ems/service/impl/EnergyCostReportServiceImpl.java new file mode 100644 index 00000000..45ada7f1 --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/service/impl/EnergyCostReportServiceImpl.java @@ -0,0 +1,55 @@ +package com.klp.ems.service.impl; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.ems.domain.bo.EnergyCostReportBo; +import com.klp.ems.domain.vo.EnergyCostSummaryVo; +import com.klp.ems.domain.vo.WmsEnergyCoilDailyVo; +import com.klp.ems.mapper.WmsEnergyCoilDailyMapper; +import com.klp.ems.service.IEnergyCostReportService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +/** + * 能源成本报表 Service 实现 + */ +@Service +@RequiredArgsConstructor +public class EnergyCostReportServiceImpl implements IEnergyCostReportService { + + private final WmsEnergyCoilDailyMapper coilDailyMapper; + + @Override + public Map overview(EnergyCostReportBo bo) { + return coilDailyMapper.selectEnergyOverview(bo); + } + + @Override + public List summary(EnergyCostReportBo bo) { + String group = bo.getGroupBy(); + Function> function; + if ("warehouse".equalsIgnoreCase(group)) { + function = coilDailyMapper::summaryByWarehouse; + } else if ("meter".equalsIgnoreCase(group)) { + function = coilDailyMapper::summaryByMeter; + } else if ("task".equalsIgnoreCase(group)) { + function = coilDailyMapper::summaryByTask; + } else { + function = coilDailyMapper::summaryByEnergyType; + } + List list = function.apply(bo); + return list == null ? Collections.emptyList() : list; + } + + @Override + public TableDataInfo detail(EnergyCostReportBo bo, PageQuery pageQuery) { + Page page = coilDailyMapper.selectReportDetail(pageQuery.build(), bo); + return TableDataInfo.build(page); + } +} diff --git a/klp-ems/src/main/java/com/klp/ems/service/impl/WmsEnergyCoilDailyServiceImpl.java b/klp-ems/src/main/java/com/klp/ems/service/impl/WmsEnergyCoilDailyServiceImpl.java new file mode 100644 index 00000000..5f6ed44b --- /dev/null +++ b/klp-ems/src/main/java/com/klp/ems/service/impl/WmsEnergyCoilDailyServiceImpl.java @@ -0,0 +1,126 @@ +package com.klp.ems.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.utils.StringUtils; +import com.klp.ems.domain.*; +import com.klp.ems.domain.bo.WmsEnergyCoilDailyBo; +import com.klp.ems.domain.vo.WmsEnergyCoilDailyStatisticsVo; +import com.klp.ems.domain.vo.WmsEnergyCoilDailyVo; +import com.klp.ems.mapper.*; +import com.klp.ems.service.IWmsEnergyCoilDailyService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import java.util.*; + +/** + * 钢卷日能源成本分摊结果 Service 实现 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class WmsEnergyCoilDailyServiceImpl implements IWmsEnergyCoilDailyService { + + private final WmsEnergyCoilDailyMapper baseMapper; + + @Override + public WmsEnergyCoilDailyVo queryById(Long energyCostId) { + return baseMapper.selectVoById(energyCostId); + } + + @Override + public TableDataInfo queryPageList(WmsEnergyCoilDailyBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(WmsEnergyCoilDailyBo bo) { + return baseMapper.selectVoList(buildQueryWrapper(bo)); + } + + @Override + public TableDataInfo queryPendingActionCoilCost(WmsEnergyCoilDailyBo bo, PageQuery pageQuery) { + // 使用SQL一次性查询待操作钢卷的能源成本 + // 所有的关联、聚合、计算都在SQL中完成,性能更高 + List resultList = baseMapper.selectPendingActionCoilCost(); + + if (CollUtil.isEmpty(resultList)) { + log.warn("[PendingActionCoilCost] No pending action coils found"); + return TableDataInfo.build(new Page<>()); + } + // 分页处理 + int pageNum = pageQuery.getPageNum(); + int pageSize = pageQuery.getPageSize(); + int start = (pageNum - 1) * pageSize; + int end = Math.min(start + pageSize, resultList.size()); + + List pageData = resultList.subList(start, end); + Page resultPage = new Page<>(pageNum, pageSize); + resultPage.setRecords(pageData); + resultPage.setTotal(resultList.size()); + + return TableDataInfo.build(resultPage); + } + + @Override + public WmsEnergyCoilDailyStatisticsVo queryPendingActionCoilCostStatistics(String enterCoilNo, String currentCoilNo, Long warehouseId) { + return baseMapper.selectPendingActionCoilCostStatistics(enterCoilNo, currentCoilNo, warehouseId); + } + + @Override + public Boolean insertByBo(WmsEnergyCoilDailyBo bo) { + WmsEnergyCoilDaily add = BeanUtil.toBean(bo, WmsEnergyCoilDaily.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setEnergyCostId(add.getEnergyCostId()); + } + return flag; + } + + @Override + public Boolean updateByBo(WmsEnergyCoilDailyBo bo) { + WmsEnergyCoilDaily update = BeanUtil.toBean(bo, WmsEnergyCoilDaily.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // TODO 判断是否允许删除(例如已用于成本对账) + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + private LambdaQueryWrapper buildQueryWrapper(WmsEnergyCoilDailyBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getTaskId() != null, WmsEnergyCoilDaily::getTaskId, bo.getTaskId()); + lqw.eq(bo.getCalcDate() != null, WmsEnergyCoilDaily::getCalcDate, bo.getCalcDate()); + lqw.eq(bo.getCoilId() != null, WmsEnergyCoilDaily::getCoilId, bo.getCoilId()); + lqw.eq(bo.getWarehouseId() != null, WmsEnergyCoilDaily::getWarehouseId, bo.getWarehouseId()); + lqw.eq(bo.getActualWarehouseId() != null, WmsEnergyCoilDaily::getActualWarehouseId, bo.getActualWarehouseId()); + lqw.eq(bo.getEnergyTypeId() != null, WmsEnergyCoilDaily::getEnergyTypeId, bo.getEnergyTypeId()); + lqw.eq(bo.getMeterId() != null, WmsEnergyCoilDaily::getMeterId, bo.getMeterId()); + lqw.ge(bo.getStartDate() != null, WmsEnergyCoilDaily::getCalcDate, bo.getStartDate()); + lqw.le(bo.getEndDate() != null, WmsEnergyCoilDaily::getCalcDate, bo.getEndDate()); + lqw.like(StringUtils.isNotBlank(bo.getEnterCoilNo()), WmsEnergyCoilDaily::getEnterCoilNo, bo.getEnterCoilNo()); + lqw.like(StringUtils.isNotBlank(bo.getCurrentCoilNo()), WmsEnergyCoilDaily::getCurrentCoilNo, bo.getCurrentCoilNo()); + return lqw; + } + + private void validEntityBeforeSave(WmsEnergyCoilDaily entity) { + // TODO 数据校验(如同一 taskId + coilId 不重复) + } + + + +} diff --git a/klp-ems/src/main/resources/mapper/CostCoilDailyMapper.xml b/klp-ems/src/main/resources/mapper/CostCoilDailyMapper.xml new file mode 100644 index 00000000..29bab4ab --- /dev/null +++ b/klp-ems/src/main/resources/mapper/CostCoilDailyMapper.xml @@ -0,0 +1,13 @@ + + + + + + UPDATE wms_cost_coil_daily + SET energy_cost_amount = #{energyCostAmount}, + energy_cost_breakdown = #{energyCostBreakdown} + WHERE coil_id = #{coilId} + AND calc_date = #{calcDate} + + + diff --git a/klp-ems/src/main/resources/mapper/EmsEnergyConsumptionMapper.xml b/klp-ems/src/main/resources/mapper/EmsEnergyConsumptionMapper.xml index 7c58c1b5..ce7edb1b 100644 --- a/klp-ems/src/main/resources/mapper/EmsEnergyConsumptionMapper.xml +++ b/klp-ems/src/main/resources/mapper/EmsEnergyConsumptionMapper.xml @@ -101,4 +101,66 @@ + + + + + + + + + + + diff --git a/klp-ems/src/main/resources/mapper/EmsEnergyRateMapper.xml b/klp-ems/src/main/resources/mapper/EmsEnergyRateMapper.xml index 68e88f5e..3b3f189c 100644 --- a/klp-ems/src/main/resources/mapper/EmsEnergyRateMapper.xml +++ b/klp-ems/src/main/resources/mapper/EmsEnergyRateMapper.xml @@ -11,6 +11,8 @@ + + @@ -19,5 +21,69 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/klp-ems/src/main/resources/mapper/EmsMeterMapper.xml b/klp-ems/src/main/resources/mapper/EmsMeterMapper.xml index 73a2c389..162c09d5 100644 --- a/klp-ems/src/main/resources/mapper/EmsMeterMapper.xml +++ b/klp-ems/src/main/resources/mapper/EmsMeterMapper.xml @@ -23,6 +23,56 @@ + + + + + + + + + + + + + + + + + + + + SELECT * FROM ems_rate_tier + WHERE energy_rate_id = #{energyRateId} + AND del_flag = '0' + ORDER BY tier_level ASC + + + + + DELETE FROM ems_rate_tier + WHERE energy_rate_id = #{energyRateId} + + + diff --git a/klp-ems/src/main/resources/mapper/EmsRateTierPeriodLinkMapper.xml b/klp-ems/src/main/resources/mapper/EmsRateTierPeriodLinkMapper.xml new file mode 100644 index 00000000..e84ff211 --- /dev/null +++ b/klp-ems/src/main/resources/mapper/EmsRateTierPeriodLinkMapper.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE ems_tier_period_link + SET del_flag = '2' + WHERE tier_id = #{tierId} + + + + + DELETE FROM ems_tier_period_link + WHERE tier_id = #{tierId} + + + + + UPDATE ems_tier_period_link tpl + SET tpl.del_flag = '2' + WHERE tpl.tier_id IN ( + SELECT tier_id + FROM ems_rate_tier + WHERE energy_rate_id = #{energyRateId} + ) + + + + + DELETE FROM ems_tier_period_link + WHERE tier_id IN ( + SELECT tier_id + FROM ems_rate_tier + WHERE energy_rate_id = #{energyRateId} + ) + + + + + + diff --git a/klp-ems/src/main/resources/mapper/EmsRateTimePeriodLinkMapper.xml b/klp-ems/src/main/resources/mapper/EmsRateTimePeriodLinkMapper.xml new file mode 100644 index 00000000..2c944980 --- /dev/null +++ b/klp-ems/src/main/resources/mapper/EmsRateTimePeriodLinkMapper.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/klp-ems/src/main/resources/mapper/EmsTimePeriodMapper.xml b/klp-ems/src/main/resources/mapper/EmsTimePeriodMapper.xml new file mode 100644 index 00000000..67521c88 --- /dev/null +++ b/klp-ems/src/main/resources/mapper/EmsTimePeriodMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + diff --git a/klp-ems/src/main/resources/mapper/WmsEnergyCoilDailyMapper.xml b/klp-ems/src/main/resources/mapper/WmsEnergyCoilDailyMapper.xml new file mode 100644 index 00000000..e82baae7 --- /dev/null +++ b/klp-ems/src/main/resources/mapper/WmsEnergyCoilDailyMapper.xml @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM wms_energy_coil_daily WHERE task_id = #{taskId} + + + + + + + + AND c.task_id = #{bo.taskId} + + + AND c.energy_type_id = #{bo.energyTypeId} + + + AND c.meter_id = #{bo.meterId} + + + AND c.warehouse_id = #{bo.warehouseId} + + + AND c.actual_warehouse_id = #{bo.actualWarehouseId} + + + AND c.calc_date =]]> #{bo.startDate} + + + AND c.calc_date #{bo.endDate} + + + AND c.enter_coil_no LIKE CONCAT('%', #{bo.enterCoilNo}, '%') + + + AND c.current_coil_no LIKE CONCAT('%', #{bo.currentCoilNo}, '%') + + + + + + + + + + + + + + + + + + + + + + + diff --git a/klp-ui/src/api/ems/energyAllocation.js b/klp-ui/src/api/ems/energyAllocation.js new file mode 100644 index 00000000..807f7bb9 --- /dev/null +++ b/klp-ui/src/api/ems/energyAllocation.js @@ -0,0 +1,152 @@ +import request from '@/utils/request' + +// ==================== 能源-库区映射 ==================== + +// 查询能源-库区映射列表 +export function listEnergyLink(query) { + return request({ + url: '/ems/energy/link/list', + method: 'get', + params: query + }) +} + +// 查询能源-库区映射矩阵 +export function getEnergyLinkMatrix(query) { + return request({ + url: '/ems/energy/link/matrix', + method: 'get', + params: query + }) +} + +// 查询能源-库区映射统计 +export function getEnergyLinkStatistics() { + return request({ + url: '/ems/energy/link/statistics', + method: 'get' + }) +} + +// 新增能源-库区映射 +export function addEnergyLink(data) { + return request({ + url: '/ems/energy/link', + method: 'post', + data: data + }) +} + +// 修改能源-库区映射 +export function updateEnergyLink(data) { + return request({ + url: '/ems/energy/link', + method: 'put', + data: data + }) +} + +// 删除能源-库区映射 +export function deleteEnergyLink(linkIds) { + return request({ + url: '/ems/energy/link/' + linkIds, + method: 'delete' + }) +} + +// 导出能源-库区映射 +export function exportEnergyLink(query) { + return request({ + url: '/ems/energy/link/export', + method: 'post', + params: query, + responseType: 'blob' + }) +} + +// ==================== 能源分摊任务 ==================== + +// 查询能源分摊任务列表 +export function listEnergyTask(query) { + return request({ + url: '/ems/energy/task/list', + method: 'get', + params: query + }) +} + +// 触发能源分摊任务 +export function runEnergyTask(data) { + return request({ + url: '/ems/energy/task/run', + method: 'post', + data: data + }) +} + +// 重新运行能源分摊任务 +export function rerunEnergyTask(taskId) { + return request({ + url: '/ems/energy/task/rerun/' + taskId, + method: 'post' + }) +} + +// 导出能源分摊任务 +export function exportEnergyTask(query) { + return request({ + url: '/ems/energy/task/export', + method: 'post', + params: query, + responseType: 'blob' + }) +} + +// ==================== 钢卷能源成本分摊 ==================== + +// 查询钢卷能源成本分摊列表 +export function listEnergyCoilDaily(query) { + return request({ + url: '/ems/energy/coilDaily/list', + method: 'get', + params: query + }) +} + +// 查询待操作钢卷的能源成本(基于待操作时间范围计算) +export function listPendingActionCoilCost(query) { + return request({ + url: '/ems/energy/coilDaily/pendingAction', + method: 'get', + params: query + }) +} + +// 导出钢卷能源成本分摊 +export function exportEnergyCoilDaily(query) { + return request({ + url: '/ems/energy/coilDaily/export', + method: 'post', + params: query, + responseType: 'blob' + }) +} + +// 检查是否有能源成本数据,如果没有则触发分摊任务 +export function checkAndTriggerAllocation(query) { + return request({ + url: '/ems/energy/coilDaily/checkAndTrigger', + method: 'post', + data: query + }) +} + +// ==================== 辅助数据查询 ==================== + +// 查询所有逻辑库区列表(来自WMS模块) +export function listWarehouse() { + return request({ + url: '/wms/warehouse/list', + method: 'get' + }) +} diff --git a/klp-ui/src/api/ems/energyCoilDaily.js b/klp-ui/src/api/ems/energyCoilDaily.js new file mode 100644 index 00000000..f24dadc6 --- /dev/null +++ b/klp-ui/src/api/ems/energyCoilDaily.js @@ -0,0 +1,18 @@ +import request from '@/utils/request' + +export function listEnergyCoilDaily(query) { + return request({ + url: '/ems/energy/coilDaily/list', + method: 'get', + params: query + }) +} + +export function exportEnergyCoilDaily(query) { + return request({ + url: '/ems/energy/coilDaily/export', + method: 'post', + data: query, + responseType: 'blob' + }) +} diff --git a/klp-ui/src/api/ems/energyConsumption.js b/klp-ui/src/api/ems/energyConsumption.js index 95971538..a89712a6 100644 --- a/klp-ui/src/api/ems/energyConsumption.js +++ b/klp-ui/src/api/ems/energyConsumption.js @@ -42,3 +42,33 @@ export function delEnergyConsumption(energyConsumptionId) { method: 'delete' }) } + +// 删除能耗记录(别名) +export function deleteEnergyConsumption(energyConsumptionId) { + return delEnergyConsumption(energyConsumptionId) +} + +// 获取设备的上次抄表记录 +export function getLastReading(meterId) { + return request({ + url: '/ems/energyConsumption/lastReading/' + meterId, + method: 'get' + }) +} + +// 获取设备本月的累计消耗量 +export function getMonthlyConsumption(meterId) { + return request({ + url: '/ems/energyConsumption/monthlyConsumption/' + meterId, + method: 'get' + }) +} + +// 获取能耗统计信息 +export function getStatistics(query) { + return request({ + url: '/ems/energyConsumption/statistics', + method: 'get', + params: query + }) +} diff --git a/klp-ui/src/api/ems/energyCostReport.js b/klp-ui/src/api/ems/energyCostReport.js new file mode 100644 index 00000000..aabfb107 --- /dev/null +++ b/klp-ui/src/api/ems/energyCostReport.js @@ -0,0 +1,25 @@ +import request from '@/utils/request' + +export function fetchEnergyOverview(query) { + return request({ + url: '/ems/energy/report/overview', + method: 'get', + params: query + }) +} + +export function fetchEnergySummary(query) { + return request({ + url: '/ems/energy/report/summary', + method: 'get', + params: query + }) +} + +export function fetchEnergyDetail(query) { + return request({ + url: '/ems/energy/report/detail', + method: 'get', + params: query + }) +} diff --git a/klp-ui/src/api/ems/energyLink.js b/klp-ui/src/api/ems/energyLink.js new file mode 100644 index 00000000..18f64669 --- /dev/null +++ b/klp-ui/src/api/ems/energyLink.js @@ -0,0 +1,71 @@ +import request from '@/utils/request' + +export function listEnergyLink(query) { + return request({ + url: '/ems/energy/link/list', + method: 'get', + params: query + }) +} + +export function getEnergyLink(linkId) { + return request({ + url: `/ems/energy/link/${linkId}`, + method: 'get' + }) +} + +export function addEnergyLink(data) { + return request({ + url: '/ems/energy/link', + method: 'post', + data + }) +} + +export function updateEnergyLink(data) { + return request({ + url: '/ems/energy/link', + method: 'put', + data + }) +} + +export function delEnergyLink(linkId) { + return request({ + url: `/ems/energy/link/${linkId}`, + method: 'delete' + }) +} + +export function fetchEnergyLinkMatrix(query) { + return request({ + url: '/ems/energy/link/matrix', + method: 'get', + params: query + }) +} + +export function batchDeleteEnergyLinks(linkIds) { + return request({ + url: '/ems/energy/link/batch', + method: 'delete', + data: linkIds + }) +} + +export function exportEnergyLinks(query) { + return request({ + url: '/ems/energy/link/export', + method: 'post', + data: query, + responseType: 'blob' + }) +} + +export function getStatistics() { + return request({ + url: '/ems/energy/link/statistics', + method: 'get' + }) +} diff --git a/klp-ui/src/api/ems/energyRate.js b/klp-ui/src/api/ems/energyRate.js index 60fb143e..c96f5d21 100644 --- a/klp-ui/src/api/ems/energyRate.js +++ b/klp-ui/src/api/ems/energyRate.js @@ -42,3 +42,54 @@ export function delEnergyRate(energyRateId) { method: 'delete' }) } + +// 获取费率的梯度费率列表 +export function getRateTiers(energyRateId) { + return request({ + url: '/ems/energyRate/' + energyRateId + '/tiers', + method: 'get' + }) +} + +// 获取费率的时段费率列表 +export function getRateTimePeriods(energyRateId) { + return request({ + url: '/ems/energyRate/' + energyRateId + '/timePeriods', + method: 'get' + }) +} + +// 保存梯度费率 +export function saveTiers(energyRateId, tiers) { + return request({ + url: '/ems/energyRate/' + energyRateId + '/tiers', + method: 'post', + data: tiers + }) +} + +// 保存时段费率 +export function saveTimePeriods(energyRateId, timePeriods) { + return request({ + url: '/ems/energyRate/' + energyRateId + '/timePeriods', + method: 'post', + data: timePeriods + }) +} + +// 获取梯度的峰谷时段费率(用于梯度+峰谷组合模式) +export function getTierPeriodLinks(tierId) { + return request({ + url: '/ems/rateTierPeriodLink/tier/' + tierId, + method: 'get' + }) +} + +// 保存梯度-时段关联费率(用于梯度+峰谷组合模式) +export function saveTierPeriodLinks(tierId, tierPeriodLinks) { + return request({ + url: '/ems/rateTierPeriodLink/tier/' + tierId, + method: 'post', + data: tierPeriodLinks + }) +} diff --git a/klp-ui/src/api/ems/energyTask.js b/klp-ui/src/api/ems/energyTask.js new file mode 100644 index 00000000..1eac6637 --- /dev/null +++ b/klp-ui/src/api/ems/energyTask.js @@ -0,0 +1,33 @@ +import request from '@/utils/request' + +export function listEnergyTask(query) { + return request({ + url: '/ems/energy/task/list', + method: 'get', + params: query + }) +} + +export function runEnergyTask(data) { + return request({ + url: '/ems/energy/task/run', + method: 'post', + data + }) +} + +export function rerunEnergyTask(taskId) { + return request({ + url: `/ems/energy/task/rerun/${taskId}`, + method: 'post' + }) +} + +export function exportEnergyTask(query) { + return request({ + url: '/ems/energy/task/export', + method: 'post', + data: query, + responseType: 'blob' + }) +} diff --git a/klp-ui/src/api/ems/location.js b/klp-ui/src/api/ems/location.js index 15b39584..8c61cb7c 100644 --- a/klp-ui/src/api/ems/location.js +++ b/klp-ui/src/api/ems/location.js @@ -42,3 +42,19 @@ export function delLocation(locationId) { method: 'delete' }) } + +// 获取位置及其子位置下的所有设备 +export function getLocationMeters(locationId) { + return request({ + url: '/ems/location/' + locationId + '/meters', + method: 'get' + }) +} + +// 获取位置树及其设备信息(用于拓扑图展示) +export function getLocationTree() { + return request({ + url: '/ems/location/tree/topology', + method: 'get' + }) +} diff --git a/klp-ui/src/api/ems/meter.js b/klp-ui/src/api/ems/meter.js index eba060fd..d7ae129f 100644 --- a/klp-ui/src/api/ems/meter.js +++ b/klp-ui/src/api/ems/meter.js @@ -42,3 +42,26 @@ export function delMeter(meterId) { method: 'delete' }) } + +// 下载设备导入模板 +export function downloadMeterTemplate() { + return request({ + url: '/mes/meter/template', + method: 'get', + responseType: 'blob' + }) +} + +// 导入设备 +export function importMeters(file) { + const formData = new FormData() + formData.append('file', file) + return request({ + url: '/mes/meter/import', + method: 'post', + data: formData, + headers: { + 'Content-Type': 'multipart/form-data' + } + }) +} diff --git a/klp-ui/src/api/ems/warehouse.js b/klp-ui/src/api/ems/warehouse.js new file mode 100644 index 00000000..260fa179 --- /dev/null +++ b/klp-ui/src/api/ems/warehouse.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询库区列表 +export function listWarehouse(query) { + return request({ + url: '/wms/warehouse/list', + method: 'get', + params: query + }) +} + +// 查询库区详细 +export function getWarehouse(warehouseId) { + return request({ + url: '/wms/warehouse/' + warehouseId, + method: 'get' + }) +} + +// 新增库区 +export function addWarehouse(data) { + return request({ + url: '/wms/warehouse', + method: 'post', + data: data + }) +} + +// 修改库区 +export function updateWarehouse(data) { + return request({ + url: '/wms/warehouse', + method: 'put', + data: data + }) +} + +// 删除库区 +export function deleteWarehouse(warehouseId) { + return request({ + url: '/wms/warehouse/' + warehouseId, + method: 'delete' + }) +} diff --git a/klp-ui/src/assets/icons/svg/dianbiao.svg b/klp-ui/src/assets/icons/svg/dianbiao.svg new file mode 100644 index 00000000..e1f62828 --- /dev/null +++ b/klp-ui/src/assets/icons/svg/dianbiao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/klp-ui/src/assets/icons/svg/qibiao.svg b/klp-ui/src/assets/icons/svg/qibiao.svg new file mode 100644 index 00000000..3447cc70 --- /dev/null +++ b/klp-ui/src/assets/icons/svg/qibiao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/klp-ui/src/assets/icons/svg/shuibiao.svg b/klp-ui/src/assets/icons/svg/shuibiao.svg new file mode 100644 index 00000000..9c0f2217 --- /dev/null +++ b/klp-ui/src/assets/icons/svg/shuibiao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/klp-ui/src/views/ems/config/energyLink.vue b/klp-ui/src/views/ems/config/energyLink.vue new file mode 100644 index 00000000..c929c88c --- /dev/null +++ b/klp-ui/src/views/ems/config/energyLink.vue @@ -0,0 +1,344 @@ + + + + + diff --git a/klp-ui/src/views/ems/cost/coilCost.vue b/klp-ui/src/views/ems/cost/coilCost.vue new file mode 100644 index 00000000..dbaa2561 --- /dev/null +++ b/klp-ui/src/views/ems/cost/coilCost.vue @@ -0,0 +1,630 @@ + + + + + diff --git a/klp-ui/src/views/ems/cost/energyCostSummary.vue b/klp-ui/src/views/ems/cost/energyCostSummary.vue new file mode 100644 index 00000000..32b01414 --- /dev/null +++ b/klp-ui/src/views/ems/cost/energyCostSummary.vue @@ -0,0 +1,572 @@ + + + + + diff --git a/klp-ui/src/views/ems/cost/index.vue b/klp-ui/src/views/ems/cost/index.vue new file mode 100644 index 00000000..b996ff68 --- /dev/null +++ b/klp-ui/src/views/ems/cost/index.vue @@ -0,0 +1,367 @@ + + + + + diff --git a/klp-ui/src/views/ems/cost/warehouseProduction.vue b/klp-ui/src/views/ems/cost/warehouseProduction.vue new file mode 100644 index 00000000..2505c839 --- /dev/null +++ b/klp-ui/src/views/ems/cost/warehouseProduction.vue @@ -0,0 +1,540 @@ + + + + + diff --git a/klp-ui/src/views/ems/data/index.vue b/klp-ui/src/views/ems/data/index.vue index 62f60b2d..4c9ea16d 100644 --- a/klp-ui/src/views/ems/data/index.vue +++ b/klp-ui/src/views/ems/data/index.vue @@ -1,365 +1,14 @@ diff --git a/klp-ui/src/views/ems/data/manage.vue b/klp-ui/src/views/ems/data/manage.vue new file mode 100644 index 00000000..6d3d6f08 --- /dev/null +++ b/klp-ui/src/views/ems/data/manage.vue @@ -0,0 +1,420 @@ + + + + + diff --git a/klp-ui/src/views/ems/data/record.vue b/klp-ui/src/views/ems/data/record.vue new file mode 100644 index 00000000..bab78292 --- /dev/null +++ b/klp-ui/src/views/ems/data/record.vue @@ -0,0 +1,954 @@ + + + + + diff --git a/klp-ui/src/views/ems/meter/components/LocationTreeNode.vue b/klp-ui/src/views/ems/meter/components/LocationTreeNode.vue new file mode 100644 index 00000000..93a04956 --- /dev/null +++ b/klp-ui/src/views/ems/meter/components/LocationTreeNode.vue @@ -0,0 +1,257 @@ + + + + + diff --git a/klp-ui/src/views/ems/meter/index.vue b/klp-ui/src/views/ems/meter/index.vue index 9c4f9504..f94cabaa 100644 --- a/klp-ui/src/views/ems/meter/index.vue +++ b/klp-ui/src/views/ems/meter/index.vue @@ -1,204 +1,347 @@ - + + + + + diff --git a/klp-ui/src/views/ems/task/allocationTask.vue b/klp-ui/src/views/ems/task/allocationTask.vue new file mode 100644 index 00000000..98a2e56e --- /dev/null +++ b/klp-ui/src/views/ems/task/allocationTask.vue @@ -0,0 +1,311 @@ + + + + + diff --git a/klp-wms/src/main/java/com/klp/domain/WmsCostCoilDaily.java b/klp-wms/src/main/java/com/klp/domain/WmsCostCoilDaily.java index 6d6bccc2..579f01b4 100644 --- a/klp-wms/src/main/java/com/klp/domain/WmsCostCoilDaily.java +++ b/klp-wms/src/main/java/com/klp/domain/WmsCostCoilDaily.java @@ -81,5 +81,15 @@ public class WmsCostCoilDaily extends BaseEntity { * 材料类型 */ private String materialType; + + /** + * 能源成本(元) + */ + private BigDecimal energyCostAmount; + + /** + * 能源成本拆解(JSON) + */ + private String energyCostBreakdown; }