|
|
@@ -36,6 +36,7 @@ import java.math.BigDecimal;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
+import java.util.stream.IntStream;
|
|
|
|
|
|
/**
|
|
|
* <p>
|
|
|
@@ -66,10 +67,15 @@ public class ProductLinePerformanceServiceImpl extends SuperCacheServiceImpl<Pro
|
|
|
IPage<TaskNode> taskNodeIPage = baseMapper.pageList(page, wrapper, new DataScope());
|
|
|
List<TaskNode> records = taskNodeIPage.getRecords();
|
|
|
records.forEach(item->{
|
|
|
+ /*
|
|
|
if (item.getEndTime() != null && item.getStartTime() != null){
|
|
|
String datePoor = DateUtil.getDatePoor(item.getEndTime(), item.getStartTime());
|
|
|
item.setStatisticalHours(datePoor);
|
|
|
- }
|
|
|
+ } */
|
|
|
+ float values = Float.valueOf(item.getStatisticalHours());
|
|
|
+ int hours = (int)Math.floor(values);
|
|
|
+ int minutes = Math.round((values - hours)*60);
|
|
|
+ item.setStatisticalHours(String.format("%d小时%d分钟", hours, minutes));
|
|
|
});
|
|
|
taskNodeIPage.setRecords(records);
|
|
|
return taskNodeIPage;
|
|
|
@@ -79,10 +85,14 @@ public class ProductLinePerformanceServiceImpl extends SuperCacheServiceImpl<Pro
|
|
|
public List<TaskNode> queryOperatorDetailPerformance(TaskNode taskNode){
|
|
|
List<TaskNode> taskNodes = baseMapper.queryOperatorDetailPerformance(taskNode);
|
|
|
taskNodes.forEach(item->{
|
|
|
- if (item.getEndTime() != null && item.getStartTime() != null){
|
|
|
- String datePoor = DateUtil.getDatePoor(item.getEndTime(), item.getStartTime());
|
|
|
- item.setStatisticalHours(datePoor);
|
|
|
- }
|
|
|
+ float values = Float.valueOf(item.getStatisticalHours());
|
|
|
+ int hours = (int)Math.floor(values);
|
|
|
+ int minutes = Math.round((values - hours)*60);
|
|
|
+ item.setStatisticalHours(String.format("%d小时%d分钟", hours, minutes));
|
|
|
+ float dValues = Float.valueOf(item.getDelayHours());
|
|
|
+ int dHours = (int)Math.floor(dValues);
|
|
|
+ int dMinutes = Math.round((dValues - dHours)*60);
|
|
|
+ item.setDelayHours(String.format("%d小时%d分钟", dHours, dMinutes));
|
|
|
});
|
|
|
return taskNodes;
|
|
|
}
|
|
|
@@ -339,24 +349,23 @@ public class ProductLinePerformanceServiceImpl extends SuperCacheServiceImpl<Pro
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public Map<String,List<String>> resourceRate(Map<String, Object> params) {
|
|
|
+ public Map<String, List<String>> resourceRate(Map<String, Object> params) {
|
|
|
String date = null;
|
|
|
- if(Objects.isNull(params.get("date")) || StringUtils.isEmpty(params.get("date").toString())){
|
|
|
+ if (Objects.isNull(params.get("date")) || StringUtils.isEmpty(params.get("date").toString())) {
|
|
|
//默认当天
|
|
|
date = DateUtil.dateToString0(new Date(), "yyyy-MM-dd");
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
date = params.get("date").toString();
|
|
|
}
|
|
|
- Date queryDate = cn.hutool.core.date.DateUtil.parse(date,"yyyy-MM-dd");
|
|
|
- Date queryStartTime = cn.hutool.core.date.DateUtil.offsetHour(queryDate,-1);
|
|
|
- Date queryEndTime = cn.hutool.core.date.DateUtil.offsetHour(queryDate,26);
|
|
|
- params.put("startTime",DateUtil.dateToString0(queryStartTime, "yyyy-MM-dd HH:mm:ss"));
|
|
|
- params.put("endTime",DateUtil.dateToString0(queryEndTime, "yyyy-MM-dd HH:mm:ss"));
|
|
|
-
|
|
|
+ Date queryDate = cn.hutool.core.date.DateUtil.parse(date, "yyyy-MM-dd");
|
|
|
+ Date queryStartTime = cn.hutool.core.date.DateUtil.offsetHour(queryDate, -1);
|
|
|
+ Date queryEndTime = cn.hutool.core.date.DateUtil.offsetHour(queryDate, 26);
|
|
|
+ params.put("startTime", DateUtil.dateToString0(queryStartTime, "yyyy-MM-dd HH:mm:ss"));
|
|
|
+ params.put("endTime", DateUtil.dateToString0(queryEndTime, "yyyy-MM-dd HH:mm:ss"));
|
|
|
|
|
|
List<DeviceResourceDetailVo> deviceResourceDetailVos = baseMapper.resourceRate(params);
|
|
|
|
|
|
- Map<String,List<String>> map = new HashMap<>();
|
|
|
+ Map<String, List<String>> map = new HashMap<>();
|
|
|
List<String> hours = new ArrayList<>();
|
|
|
List<String> rateList = new ArrayList<>();
|
|
|
|
|
|
@@ -364,80 +373,85 @@ public class ProductLinePerformanceServiceImpl extends SuperCacheServiceImpl<Pro
|
|
|
//判断所选日期是否是当前日期
|
|
|
int n = 0;
|
|
|
Date nowDate = new Date();
|
|
|
- if(Objects.isNull(params.get("date")) || StringUtils.isEmpty(params.get("date").toString()) || DateUtil.dateToString0(nowDate, "yyyy-MM-dd").equals( params.get("date").toString())){
|
|
|
+ if (Objects.isNull(params.get("date")) || StringUtils.isEmpty(params.get("date").toString()) || DateUtil.dateToString0(nowDate, "yyyy-MM-dd").equals(params.get("date").toString())) {
|
|
|
String x = DateUtil.dateToString0(nowDate, "HH");
|
|
|
- if(x.indexOf("0") == 0){
|
|
|
- x = x.substring(x.indexOf("0"));
|
|
|
- }
|
|
|
n = Integer.parseInt(x);
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
n = 24;
|
|
|
}
|
|
|
|
|
|
- if(CollectionUtil.isEmpty(deviceResourceDetailVos)){
|
|
|
- for(int i=1;i<=n;i++){
|
|
|
-
|
|
|
- String hour = "";
|
|
|
- if(i<10){
|
|
|
- hour = "0" + i;
|
|
|
- }else{
|
|
|
- hour = i + "";
|
|
|
- }
|
|
|
- hours.add(hour + "时");
|
|
|
- rateList.add("0");
|
|
|
- }
|
|
|
- }else{
|
|
|
- for(int i=1;i<=n;i++){
|
|
|
+ hours = IntStream.rangeClosed(0, n).boxed().map(item -> {
|
|
|
+ return item < 10 ? "0" + item.toString() : item.toString();
|
|
|
+ }).collect(Collectors.toList());
|
|
|
|
|
|
- String hour = "";
|
|
|
- if(i<10){
|
|
|
- hour = "0" + i;
|
|
|
- }else{
|
|
|
- hour = i + "";
|
|
|
- }
|
|
|
- hours.add(hour + "时");
|
|
|
+ if (CollectionUtil.isEmpty(deviceResourceDetailVos)) {
|
|
|
+ String[] arrs = new String[n];
|
|
|
+ Arrays.fill(arrs, "0");
|
|
|
+ rateList = Arrays.asList(arrs);
|
|
|
+ } else {
|
|
|
+ Date startDate = DateUtil.stringToDate0(date + " 00:00:00", "yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
|
- String nowTime = date + " " + hour + ":00:00";
|
|
|
+ for (int i = 1; i <= n; i++) {
|
|
|
+ String nowTime = date + " " + hours.get(i) + ":00:00";
|
|
|
+ Date endDate = DateUtil.stringToDate0(nowTime, "yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
|
- Date endDate = cn.hutool.core.date.DateUtil.parse(nowTime,"yyyy-MM-dd HH:mm:ss");
|
|
|
- Date startDate = cn.hutool.core.date.DateUtil.parse(date+" 00:00:00","yyyy-MM-dd HH:mm:ss");
|
|
|
long jgTime = 0;
|
|
|
- for(DeviceResourceDetailVo deviceResourceDetailVo:deviceResourceDetailVos){
|
|
|
+ int expectTime = 0;
|
|
|
+ int realTime = 0;
|
|
|
+ int delayTime = 0;
|
|
|
+ for (DeviceResourceDetailVo deviceResourceDetailVo : deviceResourceDetailVos) {
|
|
|
Date startTime = deviceResourceDetailVo.getStartTime();
|
|
|
-
|
|
|
- Date endTime = null;
|
|
|
- if(Objects.isNull(deviceResourceDetailVo.getEndTime())){
|
|
|
- endTime = new Date();
|
|
|
- }else{
|
|
|
- endTime = deviceResourceDetailVo.getEndTime();
|
|
|
- }
|
|
|
-
|
|
|
- if((startDate.after(startTime) && startDate.after(endTime)) || (endDate.before(startTime) && endDate.before(endTime))){
|
|
|
- continue;
|
|
|
- }else{
|
|
|
- if(startDate.after(startTime) && startDate.before(endTime) && endDate.after(endTime)){
|
|
|
- jgTime += endTime.getTime() - startDate.getTime();
|
|
|
- }else if(startDate.after(startTime) && endDate.before(endTime)){
|
|
|
- jgTime += endDate.getTime() - startDate.getTime();
|
|
|
- }else if(endDate.after(startTime) && endDate.before(endTime)){
|
|
|
- jgTime += endDate.getTime() - startTime.getTime();
|
|
|
- }else if(endDate.after(startTime) && endDate.after(endTime) && startDate.before(startTime)){
|
|
|
- jgTime += endTime.getTime() - startTime.getTime();
|
|
|
- }else if(endDate.after(startTime) && endDate.before(endTime)){
|
|
|
- jgTime += endDate.getTime() - startTime.getTime();
|
|
|
- }
|
|
|
+ Date endTime = Objects.isNull(deviceResourceDetailVo.getEndTime()) ? new Date() : deviceResourceDetailVo.getEndTime();
|
|
|
+ // 定义两个时间区间:[事件区间] startDate~endDate;[参考区间] startTime~endTime
|
|
|
+ // 先判断是否无重叠:事件区间完全在参考区间之前,或完全在参考区间之后
|
|
|
+ if (endDate.before(startTime) || startDate.after(endTime)) {
|
|
|
+ continue; // 无重叠,跳过
|
|
|
+ } else {
|
|
|
+ // 有重叠,计算重叠时长
|
|
|
+ // 重叠区间的开始 = 两个区间的"较晚开始时间"
|
|
|
+ long overlapStart = Math.max(startDate.getTime(), startTime.getTime());
|
|
|
+ // 重叠区间的结束 = 两个区间的"较早结束时间"
|
|
|
+ long overlapEnd = Math.min(endDate.getTime(), endTime.getTime());
|
|
|
+ // 累加重叠时长(确保结束时间 >= 开始时间,避免负数)
|
|
|
+ jgTime += Math.max(0, overlapEnd - overlapStart);
|
|
|
}
|
|
|
+ expectTime += (int) Float.parseFloat(deviceResourceDetailVo.getExpectTime());
|
|
|
+ realTime += (int) Float.parseFloat(deviceResourceDetailVo.getRealTime());
|
|
|
+ delayTime += (realTime > 1.5 * expectTime) ? realTime - 1.5 * expectTime : 0;
|
|
|
}
|
|
|
|
|
|
BigDecimal jgBig = new BigDecimal(jgTime);
|
|
|
BigDecimal sumBig = new BigDecimal((endDate.getTime() - startDate.getTime()));
|
|
|
+ BigDecimal minutes = jgBig.divide(new BigDecimal(60000), 2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ if (delayTime > 0) {
|
|
|
+// minutes 表示实际使用的分钟数
|
|
|
+ minutes = minutes.subtract(new BigDecimal(delayTime));
|
|
|
+ }
|
|
|
+
|
|
|
+// sumMinutes 表示总时间分钟数
|
|
|
+ BigDecimal sumMinutes = sumBig.divide(new BigDecimal(60000), 2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ BigDecimal actualTimeRate;
|
|
|
+
|
|
|
+ // 检查sumMinutes是否为0,避免除以0的异常
|
|
|
+ if (sumMinutes.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
+ // 当总和为0时,可根据业务需求设置默认值,这里设为0
|
|
|
+ actualTimeRate = BigDecimal.ZERO;
|
|
|
+ } else {
|
|
|
+ // 正常计算百分比
|
|
|
+ actualTimeRate = minutes.divide(sumMinutes, 2, BigDecimal.ROUND_HALF_UP)
|
|
|
+ .multiply(new BigDecimal("100"));
|
|
|
+ }
|
|
|
+ // 若结果为负数,则设为0
|
|
|
+ if (actualTimeRate.compareTo(BigDecimal.ZERO) < 0) {
|
|
|
+ actualTimeRate = BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+ rateList.add(actualTimeRate.toString());
|
|
|
|
|
|
- rateList.add(jgBig.divide(sumBig,2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- map.put("hour",hours);
|
|
|
- map.put("rate",rateList);
|
|
|
+ map.put("hour", hours);
|
|
|
+ map.put("rate", rateList);
|
|
|
|
|
|
return map;
|
|
|
}
|