From 8f53de5918419e6cd696d669c94e4d0080f3beee Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Tue, 23 Sep 2025 17:04:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(business):=20=E6=96=B0=E5=A2=9E=E5=81=9C?= =?UTF-8?q?=E6=9C=BA=E7=BB=9F=E8=AE=A1=E8=AE=A1=E7=AE=97=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 `/calc` 接口用于计算指定时间范围内的停机次数、停机时长及设备作业率。该接口通过查询 ProStoppage 表中符合条件的停机记录,统计相关指标并返回结果。主要变更: - 在 ProStoppageController 中添加 `calc` 方法,提供 POST 接口 /calc - 在 ProStoppageService 中声明 `calc` 方法签名 - 在 ProStoppageServiceImpl 中实现 `calc` 逻辑,包括: - 查询时间范围内的停机记录 - 统计停机次数和总时长(转换为小时) - 计算时间范围总时长与作业率(百分比形式) - 返回包含三项数据的结果列表 --- .../controller/ProStoppageController.java | 6 +++ .../business/service/ProStoppageService.java | 1 + .../service/impl/ProStoppageServiceImpl.java | 40 ++++++++++++++++++- 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/business/src/main/java/com/fizz/business/controller/ProStoppageController.java b/business/src/main/java/com/fizz/business/controller/ProStoppageController.java index e4f0e6c..a7b031b 100644 --- a/business/src/main/java/com/fizz/business/controller/ProStoppageController.java +++ b/business/src/main/java/com/fizz/business/controller/ProStoppageController.java @@ -45,4 +45,10 @@ public class ProStoppageController { public R> list(@RequestBody ProStoppageForm form) { return R.ok(proStoppageService.listAll(form)); } + //计算停机次数停机时长 作业率 + @PostMapping("/calc") + @Operation(summary ="计算停机次数停机时长 作业率") + public R> calc(@RequestBody ProStoppageForm form) { + return R.ok(proStoppageService.calc(form)); + } } diff --git a/business/src/main/java/com/fizz/business/service/ProStoppageService.java b/business/src/main/java/com/fizz/business/service/ProStoppageService.java index 06267a3..5b5f19f 100644 --- a/business/src/main/java/com/fizz/business/service/ProStoppageService.java +++ b/business/src/main/java/com/fizz/business/service/ProStoppageService.java @@ -16,4 +16,5 @@ public interface ProStoppageService extends IService { boolean deleteProStoppage(Long stopid); + List calc(ProStoppageForm form); } diff --git a/business/src/main/java/com/fizz/business/service/impl/ProStoppageServiceImpl.java b/business/src/main/java/com/fizz/business/service/impl/ProStoppageServiceImpl.java index 814ca69..a0fe601 100644 --- a/business/src/main/java/com/fizz/business/service/impl/ProStoppageServiceImpl.java +++ b/business/src/main/java/com/fizz/business/service/impl/ProStoppageServiceImpl.java @@ -1,5 +1,6 @@ package com.fizz.business.service.impl; +import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fizz.business.domain.ProStoppage; @@ -10,6 +11,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -23,7 +25,7 @@ public class ProStoppageServiceImpl extends ServiceImpl list = baseMapper.selectList(queryWrapper); @@ -45,4 +47,40 @@ public class ProStoppageServiceImpl extends ServiceImpl calc(ProStoppageForm form) { + // 构建查询条件,筛选指定时间范围内的停机记录 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.ge("start_date", form.getStartDate() + " 00:00:00") + .le("end_date", form.getEndDate() + " 23:59:59"); + + // 查询符合条件的停机记录列表 + List stoppageList = baseMapper.selectList(queryWrapper); + + // 计算停机次数 + int stopCount = stoppageList.size(); + + // 计算停机总时长(单位:小时,保留两位小数) + BigDecimal totalStopDuration = BigDecimal.ZERO; + for (ProStoppage stoppage : stoppageList) { + totalStopDuration = totalStopDuration.add(stoppage.getDuration().divide(BigDecimal.valueOf(3600), 2, BigDecimal.ROUND_HALF_UP)); + } + + // 计算总时长(查询时间范围的时长,单位:小时) + long totalTimeMillis = DateUtil.parse(form.getEndDate() + " 23:59:59").getTime() - DateUtil.parse(form.getStartDate() + " 00:00:00").getTime(); + BigDecimal totalDuration = BigDecimal.valueOf(totalTimeMillis).divide(BigDecimal.valueOf(3600 * 1000), 2, BigDecimal.ROUND_HALF_UP); + + // 计算作业率(保留两位小数,百分比形式) + BigDecimal operationRate = BigDecimal.ONE.subtract(totalStopDuration.divide(totalDuration, 4, BigDecimal.ROUND_HALF_UP)) + .multiply(BigDecimal.valueOf(100)).setScale(2, BigDecimal.ROUND_HALF_UP); + + // 创建List来承载结果 + List resultList = new ArrayList<>(); + resultList.add(stopCount); + resultList.add(totalStopDuration); + resultList.add(operationRate); + + return resultList; + } }