|
@@ -109,6 +109,7 @@ public class IotMainWorkOrderBomServiceImpl implements IotMainWorkOrderBomServic
|
|
|
public Map<Long, String> mainWorkOrderNearestDistance(IotMainWorkOrderBomPageReqVO pageReqVO) {
|
|
|
List<IotMainWorkOrderBomDO> workOrderBomS = getIotMainWorkOrderBomList(pageReqVO);
|
|
|
Map<Long, String> resultMap = new HashMap<>();
|
|
|
+
|
|
|
// 遍历工单明细 找出每个工单中 触发保养时间最近的 时间/里程/自然日
|
|
|
if (CollUtil.isNotEmpty(workOrderBomS)) {
|
|
|
Set<Long> deviceIds = new HashSet<>();
|
|
@@ -123,7 +124,7 @@ public class IotMainWorkOrderBomServiceImpl implements IotMainWorkOrderBomServic
|
|
|
BigDecimal runningKiloDistance = null;
|
|
|
BigDecimal naturalDateDistance = null;
|
|
|
// 计算每个保养项 每个保养规则下的 距离保养时间
|
|
|
- if (0 == bom.getRunningTimeRule()) {
|
|
|
+ if (ObjUtil.isNotEmpty(bom.getRunningTimeRule()) && 0 == bom.getRunningTimeRule()) {
|
|
|
// 运行时间保养规则
|
|
|
if (deviceRunLogMap.containsKey(bom.getDeviceId())) {
|
|
|
BigDecimal totalRunTime = deviceRunLogMap.get(bom.getDeviceId()).getTotalRunTime();
|
|
@@ -135,7 +136,7 @@ public class IotMainWorkOrderBomServiceImpl implements IotMainWorkOrderBomServic
|
|
|
runningTimeDistance = (runningTimePeriod.subtract(totalRunTime.subtract(lastRunningTime))).add(delayDuration);
|
|
|
}
|
|
|
}
|
|
|
- if (0 == bom.getMileageRule()) {
|
|
|
+ if (ObjUtil.isNotEmpty(bom.getMileageRule()) && 0 == bom.getMileageRule()) {
|
|
|
// 运行里程保养规则
|
|
|
// 累计运行里程规则 累计运行里程 >= (上次保养运行里程+运行里程周期-提前量)
|
|
|
if (deviceRunLogMap.containsKey(bom.getDeviceId())) {
|
|
@@ -148,7 +149,7 @@ public class IotMainWorkOrderBomServiceImpl implements IotMainWorkOrderBomServic
|
|
|
runningKiloDistance = (runningKiloPeriod.subtract(totalMileage.subtract(lastRunningKilo))).add(delayKilometers);
|
|
|
}
|
|
|
}
|
|
|
- if (0 == bom.getNaturalDateRule()) {
|
|
|
+ if (ObjUtil.isNotEmpty(bom.getNaturalDateRule()) && 0 == bom.getNaturalDateRule()) {
|
|
|
// 自然日期保养规则
|
|
|
LocalDateTime lastNaturalDate = bom.getLastNaturalDate(); // 上次保养自然日期
|
|
|
BigDecimal naturalDatePeriod = bom.getNextNaturalDate(); // 自然日周期
|
|
@@ -197,58 +198,6 @@ public class IotMainWorkOrderBomServiceImpl implements IotMainWorkOrderBomServic
|
|
|
*/
|
|
|
private Map<Long, String> findClosestToZero(Map<Long, List<Map<String, Object>>> orderDistancePair){
|
|
|
Map<Long, String> result = new HashMap<>();
|
|
|
- /* for (Map.Entry<Long, List<Map<String, Object>>> entry : orderDistancePair.entrySet()) {
|
|
|
- Long key = entry.getKey();
|
|
|
- List<Map<String, Object>> mapList = entry.getValue();
|
|
|
- // 初始化最小距离和对应的Map
|
|
|
- BigDecimal minAbsDistance = null;
|
|
|
- Map<String, Object> closestMap = null;
|
|
|
- for (Map<String, Object> currentMap : mapList) {
|
|
|
- // 计算当前Map所有值的最小绝对值
|
|
|
- BigDecimal currentMinAbs = calculateMinAbsolute(currentMap);
|
|
|
- // 跳过无效Map(无有效值)
|
|
|
- if (currentMinAbs == null) continue;
|
|
|
- // 比较并更新最小值
|
|
|
- if (minAbsDistance == null || currentMinAbs.compareTo(minAbsDistance) < 0) {
|
|
|
- minAbsDistance = currentMinAbs;
|
|
|
- closestMap = currentMap;
|
|
|
- }
|
|
|
- }
|
|
|
- // 将有效结果放入最终Map
|
|
|
- if (closestMap != null) {
|
|
|
- result.put(key, convertMapToString(closestMap));
|
|
|
- }
|
|
|
- }
|
|
|
- return result; */
|
|
|
- /* for (Map.Entry<Long, List<Map<String, Object>>> entry : orderDistancePair.entrySet()) {
|
|
|
- Long workOrderId = entry.getKey();
|
|
|
- List<Map<String, Object>> mapList = entry.getValue();
|
|
|
- // 存储所有有效值及其单位
|
|
|
- List<Pair<BigDecimal, String>> allValues = new ArrayList<>();
|
|
|
- // 收集所有值
|
|
|
- for (Map<String, Object> map : mapList) {
|
|
|
- for (Map.Entry<String, Object> valueEntry : map.entrySet()) {
|
|
|
- if (valueEntry.getValue() instanceof BigDecimal) {
|
|
|
- BigDecimal value = (BigDecimal) valueEntry.getValue();
|
|
|
- allValues.add(new Pair<>(value, valueEntry.getKey()));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- // 如果没有有效值,跳过
|
|
|
- if (allValues.isEmpty()) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- // 找到实际数值最小的值
|
|
|
- Pair<BigDecimal, String> minPair = allValues.get(0);
|
|
|
- for (Pair<BigDecimal, String> pair : allValues) {
|
|
|
- if (pair.getKey().compareTo(minPair.getKey()) < 0) {
|
|
|
- minPair = pair;
|
|
|
- }
|
|
|
- }
|
|
|
- // 格式化为字符串: "数值 单位"
|
|
|
- result.put(workOrderId, minPair.getKey() + " " + minPair.getValue());
|
|
|
- }
|
|
|
- return result; */
|
|
|
for (Map.Entry<Long, List<Map<String, Object>>> entry : orderDistancePair.entrySet()) {
|
|
|
Long workOrderId = entry.getKey();
|
|
|
List<Map<String, Object>> mapList = entry.getValue();
|
|
@@ -332,66 +281,6 @@ public class IotMainWorkOrderBomServiceImpl implements IotMainWorkOrderBomServic
|
|
|
|
|
|
private BigDecimal chooseNearestDistance(BigDecimal runningTimeDistance, BigDecimal runningKiloDistance, BigDecimal naturalDateDistance){
|
|
|
// 存储当前找到的最小绝对值的变量
|
|
|
- /* BigDecimal closest = null;
|
|
|
- // 存储当前最小绝对值(BigDecimal 类型)
|
|
|
- BigDecimal minAbs = null;
|
|
|
- // 比较第一个变量
|
|
|
- if (runningTimeDistance != null) {
|
|
|
- closest = runningTimeDistance;
|
|
|
- minAbs = runningTimeDistance.abs();
|
|
|
- }
|
|
|
- // 比较第二个变量
|
|
|
- if (runningKiloDistance != null) {
|
|
|
- if (minAbs == null) {
|
|
|
- // 如果之前没有有效值,直接使用 b
|
|
|
- closest = runningKiloDistance;
|
|
|
- minAbs = runningKiloDistance.abs();
|
|
|
- } else {
|
|
|
- // 比较绝对值大小
|
|
|
- BigDecimal absB = runningKiloDistance.abs();
|
|
|
- int cmp = absB.compareTo(minAbs);
|
|
|
- if (cmp < 0 || (cmp == 0 && runningKiloDistance.compareTo(closest) > 0)) {
|
|
|
- // 如果 b 的绝对值更小,或绝对值相等但 b 是正数(更大值表示正数)
|
|
|
- closest = runningKiloDistance;
|
|
|
- minAbs = absB;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- // 比较第三个变量
|
|
|
- if (naturalDateDistance != null) {
|
|
|
- if (minAbs == null) {
|
|
|
- // 如果之前没有有效值,直接使用 c
|
|
|
- closest = naturalDateDistance;
|
|
|
- minAbs = naturalDateDistance.abs();
|
|
|
- } else {
|
|
|
- // 比较绝对值大小
|
|
|
- BigDecimal absC = naturalDateDistance.abs();
|
|
|
- int cmp = absC.compareTo(minAbs);
|
|
|
- if (cmp < 0 || (cmp == 0 && naturalDateDistance.compareTo(closest) > 0)) {
|
|
|
- // 如果 c 的绝对值更小,或绝对值相等但 c 是正数
|
|
|
- closest = naturalDateDistance;
|
|
|
- minAbs = absC;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return closest; // 可能返回 null(当所有输入均为 null 时) */
|
|
|
- // 存储所有非空值
|
|
|
- /* List<BigDecimal> values = new ArrayList<>();
|
|
|
- if (runningTimeDistance != null) values.add(runningTimeDistance);
|
|
|
- if (runningKiloDistance != null) values.add(runningKiloDistance);
|
|
|
- if (naturalDateDistance != null) values.add(naturalDateDistance);
|
|
|
- // 如果没有有效值,返回null
|
|
|
- if (values.isEmpty()) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- // 找到实际数值最小的值
|
|
|
- BigDecimal minValue = values.get(0);
|
|
|
- for (BigDecimal value : values) {
|
|
|
- if (value.compareTo(minValue) < 0) {
|
|
|
- minValue = value;
|
|
|
- }
|
|
|
- }
|
|
|
- return minValue; */
|
|
|
// 存储所有非空值及其转换值(小时->天)
|
|
|
List<Triple<BigDecimal, String, BigDecimal>> values = new ArrayList<>();
|
|
|
if (runningTimeDistance != null) {
|