l3能源成本分摊

This commit is contained in:
2025-12-09 16:43:45 +08:00
parent d919c5ce7a
commit a2d0cce233
36 changed files with 3297 additions and 1298 deletions

View File

@@ -143,6 +143,15 @@ public class EmsEnergyConsumptionController extends BaseController {
return R.ok(monthlyConsumption);
}
/**
* 获取最近一次抄表的时间范围
*/
@GetMapping("/latestMeterReadTime")
public R<com.klp.ems.domain.vo.LatestMeterReadTimeVo> getLatestMeterReadTime() {
com.klp.ems.domain.vo.LatestMeterReadTimeVo meterReadTime = iEmsEnergyConsumptionService.getLatestMeterReadTime();
return R.ok(meterReadTime);
}
/**
* 新增能耗记录
*/

View File

@@ -2,6 +2,7 @@ package com.klp.ems.controller;
import java.util.List;
import java.util.Arrays;
import java.util.Map;
import java.io.IOException;
import lombok.RequiredArgsConstructor;
@@ -20,6 +21,8 @@ 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.EmsMeterVo;
import com.klp.ems.domain.vo.EnergyLinkMatrixVo;
import com.klp.ems.domain.vo.EnergyLinkStatisticsVo;
import com.klp.ems.domain.bo.EmsMeterBo;
import com.klp.ems.service.IEmsMeterService;
import com.klp.common.core.page.TableDataInfo;
@@ -115,4 +118,24 @@ public class EmsMeterController extends BaseController {
public R<Void> importMeters(@RequestParam("file") MultipartFile file) {
return toAjax(iEmsMeterService.importMeters(file));
}
/**
* 查询库区-设备绑定矩阵
* 按库区维度查询绑定的设备及其能源类型
*/
@GetMapping("/matrix")
public R<List<EnergyLinkMatrixVo>> queryEnergyLinkMatrix() {
List<EnergyLinkMatrixVo> matrix = iEmsMeterService.queryEnergyLinkMatrix();
return R.ok(matrix);
}
/**
* 查询能源绑定统计信息
* 统计库区总数、设备总数、绑定总数、能源类型总数
*/
@GetMapping("/statistics")
public R<EnergyLinkStatisticsVo> queryEnergyLinkStatistics() {
EnergyLinkStatisticsVo statistics = iEmsMeterService.queryEnergyLinkStatistics();
return R.ok(statistics);
}
}

View File

@@ -6,8 +6,16 @@ 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.common.utils.poi.ExcelUtil;
import com.klp.ems.domain.bo.EnergyCostReportBo;
import com.klp.ems.domain.bo.CoilTotalCostBo;
import com.klp.ems.domain.bo.WarehouseProductionBo;
import com.klp.ems.domain.vo.CoilTotalMergedExportVo;
import com.klp.ems.domain.vo.CoilTotalCostDetailVo;
import com.klp.ems.domain.vo.CoilTotalCostVo;
import com.klp.ems.domain.vo.EnergyCostSummaryVo;
import com.klp.ems.domain.vo.WarehouseProductionCoilVo;
import com.klp.ems.domain.vo.WarehouseProductionStatVo;
import com.klp.ems.domain.vo.WmsEnergyCoilDailyVo;
import com.klp.ems.service.IEnergyCostReportService;
import lombok.RequiredArgsConstructor;
@@ -16,8 +24,10 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 能源成本报表 Controller
@@ -47,4 +57,56 @@ public class EnergyCostReportController extends BaseController {
public TableDataInfo<WmsEnergyCoilDailyVo> detail(EnergyCostReportBo bo, PageQuery pageQuery) {
return reportService.detail(bo, pageQuery);
}
@Log(title = "仓库生产成本", businessType = BusinessType.OTHER)
@GetMapping("/warehouseProduction/stats")
public R<WarehouseProductionStatVo> warehouseProductionStats(WarehouseProductionBo bo) {
return R.ok(reportService.warehouseProductionStats(bo));
}
@Log(title = "仓库生产成本", businessType = BusinessType.OTHER)
@GetMapping("/warehouseProduction/detail")
public TableDataInfo<WarehouseProductionCoilVo> warehouseProductionDetail(WarehouseProductionBo bo, PageQuery pageQuery) {
return reportService.warehouseProductionDetail(bo, pageQuery);
}
@Log(title = "仓库生产成本", businessType = BusinessType.OTHER)
@GetMapping("/warehouseProduction/coilDetail")
public R<WarehouseProductionCoilVo> warehouseProductionCoilDetail(Long coilId) {
return R.ok(reportService.warehouseProductionCoilDetail(coilId));
}
@Log(title = "入场卷能源汇总", businessType = BusinessType.OTHER)
@GetMapping("/coilTotal/summary")
public R<CoilTotalCostVo> coilTotalEnergySummary(CoilTotalCostBo bo) {
return R.ok(reportService.coilTotalEnergySummary(bo));
}
@Log(title = "入场卷能源明细", businessType = BusinessType.OTHER)
@GetMapping("/coilTotal/detail")
public TableDataInfo<CoilTotalCostDetailVo> coilTotalEnergyDetail(CoilTotalCostBo bo, PageQuery pageQuery) {
return reportService.coilTotalEnergyDetail(bo, pageQuery);
}
@Log(title = "入场卷成本汇总", businessType = BusinessType.OTHER)
@GetMapping("/coilTotal/merged")
public TableDataInfo<CoilTotalCostVo> coilTotalMerged(CoilTotalCostBo bo, PageQuery pageQuery) {
return reportService.coilTotalMerged(bo, pageQuery);
}
@Log(title = "入场卷成本汇总", businessType = BusinessType.EXPORT)
@GetMapping("/coilTotal/merged/export")
public void coilTotalMergedExport(CoilTotalCostBo bo, HttpServletResponse response) {
List<CoilTotalCostVo> list = reportService.coilTotalMergedExport(bo);
List<CoilTotalMergedExportVo> exportList = list.stream().map(item -> {
CoilTotalMergedExportVo vo = new CoilTotalMergedExportVo();
vo.setEnterCoilNo(item.getEnterCoilNo());
vo.setCurrentCoilNo(item.getCurrentCoilNo());
vo.setEnergyCost(item.getTotalEnergyCost());
vo.setStockCost(item.getStockCost());
vo.setTotalCost(item.getTotalCost());
return vo;
}).collect(Collectors.toList());
ExcelUtil.exportExcel(exportList, "入场卷成本汇总", CoilTotalMergedExportVo.class, response);
}
}

View File

@@ -0,0 +1,18 @@
package com.klp.ems.domain.bo;
import lombok.Data;
/**
* 入场钢卷总费用查询参数
*/
@Data
public class CoilTotalCostBo {
/** 入场卷号(模糊) */
private String enterCoilNo;
/** 当前卷号(模糊) */
private String currentCoilNo;
/** 最早创建时间过滤(日期) */
private String startDate;
/** 最早创建时间过滤(日期) */
private String endDate;
}

View File

@@ -0,0 +1,22 @@
package com.klp.ems.domain.bo;
import lombok.Data;
import java.io.Serializable;
/**
* 仓库生产统计查询参数
*/
@Data
public class WarehouseProductionBo implements Serializable {
private static final long serialVersionUID = 1L;
/** 逻辑库区ID */
private Long logicWarehouseId;
/** 开始日期yyyy-MM-dd */
private String startDate;
/** 结束日期yyyy-MM-dd */
private String endDate;
}

View File

@@ -0,0 +1,30 @@
package com.klp.ems.domain.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 入场钢卷能源费用明细(按流转记录)
*/
@Data
public class CoilTotalCostDetailVo implements Serializable {
private static final long serialVersionUID = 1L;
private String enterCoilNo;
private Long coilId;
private String currentCoilNo;
/** 逻辑库区名称 */
private String warehouseName;
private Long warehouseId;
private Integer actionStatus;
private Date startTime;
private Date endTime;
/** 生产时长(小时) */
private Double duration;
/** 分摊能耗 */
private Double consumption;
/** 分摊能源成本 */
private Double totalCost;
}

View File

@@ -0,0 +1,34 @@
package com.klp.ems.domain.vo;
import lombok.Data;
import java.io.Serializable;
/**
* 入场钢卷总费用能源分摊部分VO
*/
@Data
public class CoilTotalCostVo implements Serializable {
private static final long serialVersionUID = 1L;
/** 入场卷号 */
private String enterCoilNo;
/** 当前卷号(展示用,取同一入场卷号下任一当前卷号) */
private String currentCoilNo;
/** 关联的钢卷数量 */
private Long coilCount;
/** 总生产时长(小时) */
private Double totalDuration;
/** 总分摊能耗 */
private Double totalConsumption;
/** 总分摊能源成本 */
private Double totalEnergyCost;
/** 囤积成本(当日/按 stock 计算) */
private Double stockCost;
/** 净重 */
private Double totalNetWeight;
/** 毛重 */
private Double totalGrossWeight;
/** 总成本(能源+囤积) */
private Double totalCost;
}

View File

@@ -0,0 +1,28 @@
package com.klp.ems.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ExcelIgnoreUnannotated
public class CoilTotalMergedExportVo implements Serializable {
private static final long serialVersionUID = 1L;
@ExcelProperty("入场卷号")
private String enterCoilNo;
@ExcelProperty("当前卷号")
private String currentCoilNo;
@ExcelProperty("能源成本")
private Double energyCost;
@ExcelProperty("囤积成本")
private Double stockCost;
@ExcelProperty("总成本")
private Double totalCost;
}

View File

@@ -0,0 +1,18 @@
package com.klp.ems.domain.vo;
import lombok.Data;
import java.io.Serializable;
@Data
public class EnergyBreakdownItemVo implements Serializable {
private static final long serialVersionUID = 1L;
private Long energyTypeId;
private String energyTypeName;
private String consumptionUnit;
private Double consumption;
private Double cost;
private Double percentage;
private Double averageUnitCost;
}

View File

@@ -0,0 +1,27 @@
package com.klp.ems.domain.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class WarehouseProductionCoilVo implements Serializable {
private static final long serialVersionUID = 1L;
private Long coilId;
private String coilCode;
private String enterCoilNo;
private String currentCoilNo;
private Long warehouseId;
/** 待操作状态 0待上料 1在产 2完成 */
private Integer actionStatus;
private Date startTime;
private Date endTime;
/** 生产时长(小时) */
private Double duration;
/** 分摊能耗 */
private Double consumption;
/** 分摊成本 */
private Double totalCost;
}

View File

@@ -0,0 +1,24 @@
package com.klp.ems.domain.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class WarehouseProductionStatVo implements Serializable {
private static final long serialVersionUID = 1L;
/** 卷数 */
private Integer coilCount;
/** 总生产时长(小时) */
private Double totalDuration;
/** 总能耗 */
private Double totalConsumption;
/** 总成本 */
private Double totalCost;
/** 单位成本(元/卷) */
private Double unitCost;
/** 能源分解列表 */
private List<EnergyBreakdownItemVo> energyBreakdownList;
}

View File

@@ -4,6 +4,7 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 钢卷能源成本统计 VO
@@ -13,22 +14,27 @@ import java.math.BigDecimal;
public class WmsEnergyCoilDailyStatisticsVo {
/**
* 钢卷总数
* 生产中总数status=0,1的钢卷
*/
private Long totalCoils;
/**
* 总消耗量
* 操作总数status=0,1,2的钢卷
*/
private BigDecimal totalConsumption;
private Long totalOperationCoils;
/**
* 总成本
* 平均分摊比率0-1之间表示该钢卷占库区总消耗的比例
*/
private BigDecimal avgAllocationFactor;
/**
* 总分摊成本
*/
private BigDecimal totalCost;
/**
* 平均单位成本(¥/小时
* 平均单位成本(¥/单位消耗
*/
private BigDecimal avgUnitCost;
@@ -36,4 +42,14 @@ public class WmsEnergyCoilDailyStatisticsVo {
* 总生产时长(分钟)
*/
private Long totalProductionDuration;
/**
* 最近一次抄表的开始时间(上一次抄表的结束时间)
*/
private LocalDateTime latestMeterReadStartTime;
/**
* 最近一次抄表的结束时间
*/
private LocalDateTime latestMeterReadEndTime;
}

View File

@@ -81,4 +81,14 @@ public class WmsEnergyCoilDailyVo {
@ExcelProperty("能源类型名称")
private String energyTypeName;
/**
* 该库区最近一次抄表的开始时间
*/
private LocalDateTime latestMeterReadStartTime;
/**
* 该库区最近一次抄表的结束时间
*/
private LocalDateTime latestMeterReadEndTime;
}

View File

@@ -57,4 +57,9 @@ public interface EmsEnergyConsumptionMapper extends BaseMapperPlus<EmsEnergyCons
* 获取能耗统计信息用SQL聚合函数计算
*/
Map<String, Object> getStatistics(EmsEnergyConsumptionBo bo);
/**
* 查询最近一次抄表的时间范围
*/
com.klp.ems.domain.vo.LatestMeterReadTimeVo selectLatestMeterReadTime();
}

View File

@@ -2,6 +2,8 @@ package com.klp.ems.mapper;
import com.klp.ems.domain.EmsMeter;
import com.klp.ems.domain.vo.EmsMeterVo;
import com.klp.ems.domain.vo.EnergyLinkMatrixVo;
import com.klp.ems.domain.vo.EnergyLinkStatisticsVo;
import com.klp.common.core.mapper.BaseMapperPlus;
import com.klp.ems.domain.bo.MeterFilterBo;
@@ -19,4 +21,17 @@ public interface EmsMeterMapper extends BaseMapperPlus<EmsMeterMapper, EmsMeter,
* 根据可选条件筛选计量设备ID列表
*/
java.util.List<Long> selectMeterIds(MeterFilterBo filter);
/**
* 查询库区-设备绑定矩阵
* 按库区维度查询绑定的设备及其能源类型
*/
List<EnergyLinkMatrixVo> selectEnergyLinkMatrix();
/**
* 查询能源绑定统计信息
* 统计库区总数、设备总数、绑定总数、能源类型总数
*/
EnergyLinkStatisticsVo selectEnergyLinkStatistics();
}

View File

@@ -1,12 +1,16 @@
package com.klp.ems.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.klp.common.core.mapper.BaseMapperPlus;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.klp.ems.domain.WmsEnergyCoilDaily;
import com.klp.ems.domain.bo.CoilTotalCostBo;
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 com.klp.ems.domain.bo.WarehouseProductionBo;
import com.klp.ems.domain.bo.WmsEnergyCoilDailyBo;
import com.klp.ems.domain.vo.*;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -15,11 +19,20 @@ import java.util.Map;
/**
* 钢卷日能源成本分摊结果 Mapper
*/
public interface WmsEnergyCoilDailyMapper extends BaseMapperPlus<WmsEnergyCoilDailyMapper, WmsEnergyCoilDaily, WmsEnergyCoilDailyVo> {
public interface WmsEnergyCoilDailyMapper extends BaseMapper<WmsEnergyCoilDaily> {
/** 物理清理指定任务的明细 */
int deleteByTaskId(Long taskId);
/** 查询单条 */
WmsEnergyCoilDailyVo selectVoById(Long energyCostId);
/** 查询列表 */
List<WmsEnergyCoilDailyVo> selectVoList(@Param("ew") Wrapper<WmsEnergyCoilDaily> queryWrapper);
/** 分页查询 */
IPage<WmsEnergyCoilDailyVo> selectVoPage(Page<WmsEnergyCoilDailyVo> page, @Param("ew") Wrapper<WmsEnergyCoilDaily> queryWrapper);
/** 查询指定任务的所有分摊记录 */
List<WmsEnergyCoilDaily> selectListByTask(Long taskId);
@@ -39,7 +52,37 @@ public interface WmsEnergyCoilDailyMapper extends BaseMapperPlus<WmsEnergyCoilDa
Map<String, Object> selectEnergyOverview(@Param("bo") EnergyCostReportBo bo);
/** 明细分页 */
Page<WmsEnergyCoilDailyVo> selectReportDetail(Page<WmsEnergyCoilDailyVo> page, @Param("bo") EnergyCostReportBo bo);
IPage<WmsEnergyCoilDailyVo> selectReportDetail(Page<WmsEnergyCoilDailyVo> page, @Param("bo") EnergyCostReportBo bo);
/** 仓库生产统计 */
WarehouseProductionStatVo selectWarehouseProductionStats(@Param("bo") WarehouseProductionBo bo);
/** 仓库生产明细 */
IPage<WarehouseProductionCoilVo> selectWarehouseProductionDetail(Page<WarehouseProductionCoilVo> page, @Param("bo") WarehouseProductionBo bo);
/** 仓库生产能源分解 */
List<EnergyBreakdownItemVo> selectWarehouseProductionEnergyBreakdown(@Param("bo") WarehouseProductionBo bo);
/** 单卷详情(含分摊成本) */
WarehouseProductionCoilVo selectWarehouseProductionCoilDetail(@Param("coilId") Long coilId);
/** 入场卷号维度能源费用汇总 */
CoilTotalCostVo selectCoilTotalEnergySummary(@Param("bo") CoilTotalCostBo bo);
/** 入场卷号维度能源费用明细 */
IPage<CoilTotalCostDetailVo> selectCoilTotalEnergyDetail(Page<CoilTotalCostDetailVo> page, @Param("bo") CoilTotalCostBo bo);
/** 入场卷号维度能源+囤积成本汇总 */
@com.baomidou.mybatisplus.annotation.InterceptorIgnore(tenantLine = "true", blockAttack = "true", dynamicTableName = "true", illegalSql = "true")
List<CoilTotalCostVo> selectCoilTotalMerged(@Param("bo") CoilTotalCostBo bo,
@Param("offset") long offset,
@Param("pageSize") long pageSize);
/** 入场卷号维度能源+囤积成本汇总总数 */
Long selectCoilTotalMergedCount(@Param("bo") CoilTotalCostBo bo);
/** 入场卷号维度能源+囤积成本汇总(导出) */
List<CoilTotalCostVo> selectCoilTotalMergedExport(@Param("bo") CoilTotalCostBo bo);
/** 查询待操作钢卷的能源成本一次性SQL查询 */
List<WmsEnergyCoilDailyVo> selectPendingActionCoilCost();

View File

@@ -95,4 +95,10 @@ public interface IEmsEnergyConsumptionService {
* @return 统计信息(总记录数、总消耗量、平均消耗量、最大消耗量等)
*/
Map<String, Object> getStatistics(EmsEnergyConsumptionBo bo);
/**
* 获取最近一次抄表的时间范围
* @return 最近一次抄表的开始时间和结束时间
*/
com.klp.ems.domain.vo.LatestMeterReadTimeVo getLatestMeterReadTime();
}

View File

@@ -2,6 +2,8 @@ package com.klp.ems.service;
import com.klp.ems.domain.EmsMeter;
import com.klp.ems.domain.vo.EmsMeterVo;
import com.klp.ems.domain.vo.EnergyLinkMatrixVo;
import com.klp.ems.domain.vo.EnergyLinkStatisticsVo;
import com.klp.ems.domain.bo.EmsMeterBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
@@ -58,4 +60,16 @@ public interface IEmsMeterService {
* 导入设备
*/
Boolean importMeters(MultipartFile file);
/**
* 查询库区-设备绑定矩阵
* 按库区维度查询绑定的设备及其能源类型
*/
List<EnergyLinkMatrixVo> queryEnergyLinkMatrix();
/**
* 查询能源绑定统计信息
* 统计库区总数、设备总数、绑定总数、能源类型总数
*/
EnergyLinkStatisticsVo queryEnergyLinkStatistics();
}

View File

@@ -3,7 +3,13 @@ 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.bo.CoilTotalCostBo;
import com.klp.ems.domain.bo.WarehouseProductionBo;
import com.klp.ems.domain.vo.CoilTotalCostDetailVo;
import com.klp.ems.domain.vo.CoilTotalCostVo;
import com.klp.ems.domain.vo.EnergyCostSummaryVo;
import com.klp.ems.domain.vo.WarehouseProductionCoilVo;
import com.klp.ems.domain.vo.WarehouseProductionStatVo;
import com.klp.ems.domain.vo.WmsEnergyCoilDailyVo;
import java.util.List;
@@ -22,4 +28,25 @@ public interface IEnergyCostReportService {
/** 明细分页 */
TableDataInfo<WmsEnergyCoilDailyVo> detail(EnergyCostReportBo bo, PageQuery pageQuery);
/** 仓库生产统计 */
WarehouseProductionStatVo warehouseProductionStats(WarehouseProductionBo bo);
/** 仓库生产明细 */
TableDataInfo<WarehouseProductionCoilVo> warehouseProductionDetail(WarehouseProductionBo bo, PageQuery pageQuery);
/** 单卷详情 */
WarehouseProductionCoilVo warehouseProductionCoilDetail(Long coilId);
/** 入场卷号维度能源费用汇总 */
CoilTotalCostVo coilTotalEnergySummary(CoilTotalCostBo bo);
/** 入场卷号维度能源费用明细 */
TableDataInfo<CoilTotalCostDetailVo> coilTotalEnergyDetail(CoilTotalCostBo bo, PageQuery pageQuery);
/** 入场卷号维度能源+囤积综合汇总 */
TableDataInfo<CoilTotalCostVo> coilTotalMerged(CoilTotalCostBo bo, PageQuery pageQuery);
/** 入场卷号维度能源+囤积综合汇总导出 */
java.util.List<CoilTotalCostVo> coilTotalMergedExport(CoilTotalCostBo bo);
}

View File

@@ -558,4 +558,12 @@ public class EmsEnergyConsumptionServiceImpl implements IEmsEnergyConsumptionSer
}
return stats;
}
/**
* 获取最近一次抄表的时间范围
*/
@Override
public com.klp.ems.domain.vo.LatestMeterReadTimeVo getLatestMeterReadTime() {
return baseMapper.selectLatestMeterReadTime();
}
}

View File

@@ -13,6 +13,8 @@ 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.vo.EnergyLinkMatrixVo;
import com.klp.ems.domain.vo.EnergyLinkStatisticsVo;
import com.klp.ems.domain.EmsMeter;
import com.klp.ems.domain.EmsEnergyType;
import com.klp.ems.domain.dto.MeterTemplateDto;
@@ -23,8 +25,8 @@ 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;
import java.util.Map;
/**
* 计量设备阈值移至此处Service业务层处理
@@ -231,4 +233,22 @@ public class EmsMeterServiceImpl implements IEmsMeterService {
return null;
}
/**
* 查询库区-设备绑定矩阵
* 按库区维度查询绑定的设备及其能源类型
*/
@Override
public List<EnergyLinkMatrixVo> queryEnergyLinkMatrix() {
return baseMapper.selectEnergyLinkMatrix();
}
/**
* 查询能源绑定统计信息
* 统计库区总数、设备总数、绑定总数、能源类型总数
*/
@Override
public EnergyLinkStatisticsVo queryEnergyLinkStatistics() {
return baseMapper.selectEnergyLinkStatistics();
}
}

View File

@@ -1,10 +1,17 @@
package com.klp.ems.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.CoilTotalCostBo;
import com.klp.ems.domain.bo.EnergyCostReportBo;
import com.klp.ems.domain.bo.WarehouseProductionBo;
import com.klp.ems.domain.vo.CoilTotalCostDetailVo;
import com.klp.ems.domain.vo.CoilTotalCostVo;
import com.klp.ems.domain.vo.EnergyCostSummaryVo;
import com.klp.ems.domain.vo.WarehouseProductionCoilVo;
import com.klp.ems.domain.vo.WarehouseProductionStatVo;
import com.klp.ems.domain.vo.WmsEnergyCoilDailyVo;
import com.klp.ems.mapper.WmsEnergyCoilDailyMapper;
import com.klp.ems.service.IEnergyCostReportService;
@@ -49,7 +56,90 @@ public class EnergyCostReportServiceImpl implements IEnergyCostReportService {
@Override
public TableDataInfo<WmsEnergyCoilDailyVo> detail(EnergyCostReportBo bo, PageQuery pageQuery) {
Page<WmsEnergyCoilDailyVo> page = coilDailyMapper.selectReportDetail(pageQuery.build(), bo);
IPage<WmsEnergyCoilDailyVo> page = coilDailyMapper.selectReportDetail(pageQuery.build(), bo);
return TableDataInfo.build(page);
}
@Override
public WarehouseProductionStatVo warehouseProductionStats(WarehouseProductionBo bo) {
WarehouseProductionStatVo statVo = coilDailyMapper.selectWarehouseProductionStats(bo);
if (statVo == null) {
statVo = new WarehouseProductionStatVo();
}
// 能源分解
List<com.klp.ems.domain.vo.EnergyBreakdownItemVo> items = coilDailyMapper.selectWarehouseProductionEnergyBreakdown(bo);
if (items == null) {
items = Collections.emptyList();
}
double totalCost = items.stream().mapToDouble(i -> i.getCost() == null ? 0D : i.getCost()).sum();
for (com.klp.ems.domain.vo.EnergyBreakdownItemVo item : items) {
double cost = item.getCost() == null ? 0D : item.getCost();
double consumption = item.getConsumption() == null ? 0D : item.getConsumption();
item.setPercentage(totalCost > 0 ? (cost * 100 / totalCost) : 0D);
item.setAverageUnitCost(consumption > 0 ? (cost / consumption) : 0D);
}
statVo.setEnergyBreakdownList(items);
// unitCost 补充
if (statVo.getUnitCost() == null || statVo.getUnitCost() == 0) {
double coils = statVo.getCoilCount() == null ? 0D : statVo.getCoilCount();
double cost = statVo.getTotalCost() == null ? 0D : statVo.getTotalCost();
statVo.setUnitCost(coils > 0 ? cost / coils : 0D);
}
return statVo;
}
@Override
public TableDataInfo<WarehouseProductionCoilVo> warehouseProductionDetail(WarehouseProductionBo bo, PageQuery pageQuery) {
if (pageQuery.getPageSize() == null) {
pageQuery.setPageSize(15);
}
IPage<WarehouseProductionCoilVo> page = coilDailyMapper.selectWarehouseProductionDetail(pageQuery.build(), bo);
return TableDataInfo.build(page);
}
@Override
public WarehouseProductionCoilVo warehouseProductionCoilDetail(Long coilId) {
return coilDailyMapper.selectWarehouseProductionCoilDetail(coilId);
}
@Override
public CoilTotalCostVo coilTotalEnergySummary(CoilTotalCostBo bo) {
CoilTotalCostVo vo = coilDailyMapper.selectCoilTotalEnergySummary(bo);
if (vo == null) {
vo = new CoilTotalCostVo();
vo.setTotalEnergyCost(0D);
vo.setTotalConsumption(0D);
vo.setTotalDuration(0D);
vo.setCoilCount(0L);
}
return vo;
}
@Override
public TableDataInfo<CoilTotalCostDetailVo> coilTotalEnergyDetail(CoilTotalCostBo bo, PageQuery pageQuery) {
if (pageQuery.getPageSize() == null) {
pageQuery.setPageSize(15);
}
IPage<CoilTotalCostDetailVo> page = coilDailyMapper.selectCoilTotalEnergyDetail(pageQuery.build(), bo);
return TableDataInfo.build(page);
}
@Override
public TableDataInfo<CoilTotalCostVo> coilTotalMerged(CoilTotalCostBo bo, PageQuery pageQuery) {
long pageNum = pageQuery.getPageNum() == null ? 1L : pageQuery.getPageNum();
long pageSize = pageQuery.getPageSize() == null ? 15L : pageQuery.getPageSize();
long offset = (pageNum - 1) * pageSize;
// 手工 count 与数据分页,避免复杂 SQL 自动 count 解析
Long total = coilDailyMapper.selectCoilTotalMergedCount(bo);
java.util.List<CoilTotalCostVo> rows = coilDailyMapper.selectCoilTotalMerged(bo, offset, pageSize);
Page<CoilTotalCostVo> page = new Page<>(pageNum, pageSize);
page.setTotal(total == null ? 0L : total);
page.setRecords(rows);
return TableDataInfo.build(page);
}
@Override
public java.util.List<CoilTotalCostVo> coilTotalMergedExport(CoilTotalCostBo bo) {
return coilDailyMapper.selectCoilTotalMergedExport(bo);
}
}

View File

@@ -3,6 +3,7 @@ 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.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.klp.common.core.domain.PageQuery;
@@ -37,7 +38,7 @@ public class WmsEnergyCoilDailyServiceImpl implements IWmsEnergyCoilDailyService
@Override
public TableDataInfo<WmsEnergyCoilDailyVo> queryPageList(WmsEnergyCoilDailyBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<WmsEnergyCoilDaily> lqw = buildQueryWrapper(bo);
Page<WmsEnergyCoilDailyVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
IPage<WmsEnergyCoilDailyVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}