feat(business): 新增停机统计计算接口

新增 `/calc` 接口用于计算指定时间范围内的停机次数、停机时长及设备作业率。该接口通过查询 ProStoppage 表中符合条件的停机记录,统计相关指标并返回结果。主要变更:
- 在 ProStoppageController 中添加 `calc` 方法,提供 POST 接口 /calc
- 在 ProStoppageService 中声明 `calc` 方法签名
- 在 ProStoppageServiceImpl 中实现 `calc` 逻辑,包括:
  - 查询时间范围内的停机记录
  - 统计停机次数和总时长(转换为小时) - 计算时间范围总时长与作业率(百分比形式)
  - 返回包含三项数据的结果列表
This commit is contained in:
2025-09-23 17:04:20 +08:00
parent b5d2061833
commit 8f53de5918
3 changed files with 46 additions and 1 deletions

View File

@@ -45,4 +45,10 @@ public class ProStoppageController {
public R<List<ProStoppage>> list(@RequestBody ProStoppageForm form) { public R<List<ProStoppage>> list(@RequestBody ProStoppageForm form) {
return R.ok(proStoppageService.listAll(form)); return R.ok(proStoppageService.listAll(form));
} }
//计算停机次数停机时长 作业率
@PostMapping("/calc")
@Operation(summary ="计算停机次数停机时长 作业率")
public R<List<Object>> calc(@RequestBody ProStoppageForm form) {
return R.ok(proStoppageService.calc(form));
}
} }

View File

@@ -16,4 +16,5 @@ public interface ProStoppageService extends IService<ProStoppage> {
boolean deleteProStoppage(Long stopid); boolean deleteProStoppage(Long stopid);
List<Object> calc(ProStoppageForm form);
} }

View File

@@ -1,5 +1,6 @@
package com.fizz.business.service.impl; package com.fizz.business.service.impl;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fizz.business.domain.ProStoppage; import com.fizz.business.domain.ProStoppage;
@@ -10,6 +11,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -23,7 +25,7 @@ public class ProStoppageServiceImpl extends ServiceImpl<ProStoppageMapper, ProSt
queryWrapper.ge("end_date", form.getStartDate() + " 00:00:00") queryWrapper.ge("end_date", form.getStartDate() + " 00:00:00")
.le("end_date", form.getEndDate() + " 23:59:59") .le("end_date", form.getEndDate() + " 23:59:59")
.ge("duration", 300) // .ge("duration", 300)
.orderByDesc("end_date"); .orderByDesc("end_date");
List<ProStoppage> list = baseMapper.selectList(queryWrapper); List<ProStoppage> list = baseMapper.selectList(queryWrapper);
@@ -45,4 +47,40 @@ public class ProStoppageServiceImpl extends ServiceImpl<ProStoppageMapper, ProSt
public boolean deleteProStoppage(Long stopid) { public boolean deleteProStoppage(Long stopid) {
return this.deleteProStoppage(stopid); return this.deleteProStoppage(stopid);
} }
@Override
public List<Object> calc(ProStoppageForm form) {
// 构建查询条件,筛选指定时间范围内的停机记录
QueryWrapper<ProStoppage> queryWrapper = new QueryWrapper<>();
queryWrapper.ge("start_date", form.getStartDate() + " 00:00:00")
.le("end_date", form.getEndDate() + " 23:59:59");
// 查询符合条件的停机记录列表
List<ProStoppage> 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<Object> resultList = new ArrayList<>();
resultList.add(stopCount);
resultList.add(totalStopDuration);
resultList.add(operationRate);
return resultList;
}
} }