From 23302186a81c1b6f3e5f398f21b057350bfd34e8 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期四, 16 一月 2025 12:18:08 +0800
Subject: [PATCH] 工单扣分处理时间调整逻辑
---
ycl-server/src/main/java/com/ycl/task/ContractTask.java | 69 +++++++++++++++++++++++++++++++---
1 files changed, 63 insertions(+), 6 deletions(-)
diff --git a/ycl-server/src/main/java/com/ycl/task/ContractTask.java b/ycl-server/src/main/java/com/ycl/task/ContractTask.java
index d3a5c7c..b54211c 100644
--- a/ycl-server/src/main/java/com/ycl/task/ContractTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/ContractTask.java
@@ -194,7 +194,32 @@
LocalDateTime endTime = LocalDateTime.now();
// 璁$畻30澶╁墠鐨勬棩鏈�
LocalDateTime startTime = endTime.minusDays(30);
- List<WorkOrderVO> workOrders = workOrderMapper.selectPassOrder(startTime, endTime, WorkOrderStatusEnum.AUDITING_SUCCESS.getValue(), "瀹℃牳閫氳繃");
+ //鑷姩鎵e垎鐨勫伐鍗曟晠闅滅被鍨�
+ List<String> deductErrorType = new ArrayList<>();
+ deductErrorType.add(ErrorType.OSD_ERROR.getValue());
+ deductErrorType.add(ErrorType.ABNORMAL_PIC.getValue());
+ deductErrorType.add(ErrorType.POINT_INFO_ERROR.getValue());
+ deductErrorType.add(ErrorType.CLOCK_SKEW.getValue());
+ List<WorkOrderVO> workOrders = workOrderMapper.selectPassOrder(startTime, endTime, WorkOrderStatusEnum.AUDITING_SUCCESS.getValue(),deductErrorType);
+ //瀛樺湪鏈変袱绉嶆墸鍒嗙殑鏁呴殰 鍙墸鍑忕涓�涓晠闅�
+ Map<String, WorkOrderVO> map = workOrders.stream()
+ .collect(Collectors.toMap(
+ WorkOrderVO::getWorkOrderNo,
+ Function.identity(),
+ (older, newer) -> older.getDistributeTime().compareTo(newer.getDistributeTime()) <= 0 ? older : newer
+ ));
+ workOrders = new ArrayList<>(map.values());
+ List<String> workOrderNos = workOrders.stream().map(WorkOrderVO::getWorkOrderNo).collect(Collectors.toList());
+ List<WorkOrderVO> auditTimeList = workOrderMapper.getAuditTimeList(workOrderNos);
+ Map<String, List<Date>> auditTimeMap = auditTimeList.stream()
+ .collect(Collectors.groupingBy(
+ WorkOrderVO::getWorkOrderNo, // 鍒嗙粍鐨勯敭
+ Collectors.mapping(WorkOrderVO::getAuditTime, Collectors.toList())));
+ List<WorkOrderVO> handleTimeList = workOrderMapper.getHandleTimeList(workOrderNos);
+ Map<String, List<Date>> handleTimeMap = handleTimeList.stream()
+ .collect(Collectors.groupingBy(
+ WorkOrderVO::getWorkOrderNo, // 鍒嗙粍鐨勯敭
+ Collectors.mapping(WorkOrderVO::getHandleTime, Collectors.toList())));
for (WorkOrderVO workOrder : workOrders) {
//妫�娴嬫槸鍚︽姤澶囪繃
if (!CollectionUtils.isEmpty(reportNumbers)) {
@@ -227,7 +252,7 @@
// }
// }
//鍓嶇鎰熺煡婧愭不鐞嗗伐浣滐紙鏃堕挓鍚屾瑙勫垯銆丱SD瑙勫垯銆佷竴鏈轰竴妗h鍒欙級
- if (ErrorType.OSD_ERROR.getValue().equals(errorType) || ErrorType.CLOCK_SKEW.getValue().equals(errorType) || ErrorType.CLOCK_RIGHT.getValue().equals(errorType) || ErrorType.POINT_INFO_ERROR.getValue().equals(errorType)) {
+ if (ErrorType.OSD_ERROR.getValue().equals(errorType) || ErrorType.CLOCK_SKEW.getValue().equals(errorType) || ErrorType.POINT_INFO_ERROR.getValue().equals(errorType)) {
if (!CollectionUtils.isEmpty(monitorRuleMap)) {
monitorRuleMap.forEach((contractId, rules) -> {
Integer unitId = rules.get(0).getUnitId();
@@ -235,8 +260,14 @@
if (workOrder.getUnitId().equals(unitId)) {
//宸ュ崟涓嬪彂鏃堕棿
Date createTime = workOrder.getDistributeTime();
- Date auditTime = workOrder.getAuditTime();
- double diffTime = (double) (auditTime.getTime() - createTime.getTime()) / (1000 * 60 * 60);
+ List<Date> auditTimes = auditTimeMap.get(workOrder.getWorkOrderNo());
+ List<Date> handleTimes = handleTimeMap.get(workOrder.getWorkOrderNo());
+ //鎷垮埌瀹℃牳鏃堕棿
+ long auditDuration = getAuditDuration(auditTimes, handleTimes);
+ //瀹℃牳閫氳繃鏃堕棿
+ Date passTime = Collections.max(auditTimes);
+ //澶勭悊鑺辫垂鎬绘椂闀�
+ double diffTime = (double) (passTime.getTime() - createTime.getTime() - auditDuration) / (1000 * 60 * 60);
//鎵惧埌瀵瑰簲瑙勫垯銆侀�夋嫨鏃堕棿鑼冨洿鍐呯殑瑙勫垯
for (CalculateRuleVO rule : rules) {
if(ErrorType.OSD_ERROR.getValue().equals(errorType)){
@@ -267,8 +298,13 @@
if (workOrder.getUnitId().equals(unitId)) {
//宸ュ崟涓嬪彂鏃堕棿
Date createTime = workOrder.getDistributeTime();
- Date auditTime = workOrder.getAuditTime();
- double diffTime = (double) (auditTime.getTime() - createTime.getTime()) / (1000 * 60 * 60);
+ List<Date> auditTimes = auditTimeMap.get(workOrder.getWorkOrderNo());
+ List<Date> handleTimes = handleTimeMap.get(workOrder.getWorkOrderNo());
+ //鎷垮埌瀹℃牳鏃堕棿
+ long auditDuration = getAuditDuration(auditTimes, handleTimes);
+ //瀹℃牳閫氳繃鏃堕棿
+ Date passTime = Collections.max(auditTimes);
+ double diffTime = (double) (passTime.getTime() - createTime.getTime() -auditDuration) / (1000 * 60 * 60);
//閫夋嫨鏃堕棿鑼冨洿鍐呯殑瑙勫垯
for (CalculateRuleVO rule : rules) {
if (checkRange(rule.getMin(), rule.getMax(), new BigDecimal(diffTime))) {
@@ -302,6 +338,27 @@
log.info("缁撴潫鎵ц宸ュ崟鎵e垎");
}
+ private long getAuditDuration(List<Date> auditTimes, List<Date> handleTimes) {
+ //璁$畻鍑哄鏍哥殑鎬绘椂闂�(鐢变簬鏁呴殰绫诲瀷浼氭洿鏂板鑷村彲鑳芥彁浜ょ殑鏃堕棿鐐规暟閲忓拰瀹℃牳鐨勬椂闂寸偣鏁伴噺涓嶄竴鑷�)
+ long auditDuration = 0;
+ for (Date auditTime : auditTimes) {
+ //绂昏繖娆″鏍告渶杩戠殑涓�娆℃彁浜ゅ鐞嗘椂闂寸偣
+ Date nearestHandleTime = null;
+ long minDifference = Long.MAX_VALUE;
+ for (Date handleTime : handleTimes) {
+ if(handleTime.before(auditTime)) {
+ long difference = Math.abs(auditTime.getTime() - handleTime.getTime());
+ if (difference < minDifference) {
+ minDifference = difference;
+ nearestHandleTime = handleTime;
+ }
+ }
+ }
+ auditDuration += auditTime.getTime()-nearestHandleTime.getTime();
+ }
+ return auditDuration;
+ }
+
/**
* 涓嶅畾鏈熸鏌ユ暟鎹� 鎵i櫎绉垎
--
Gitblit v1.8.0