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 +++++++++++++++++++++++++++++++--- ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml | 24 ++++++++++- ycl-server/src/main/resources/mapper/zgyw/WorkOrderErrorTypeMapper.xml | 6 ++ ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java | 7 +++ ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java | 6 ++ 5 files changed, 100 insertions(+), 12 deletions(-) diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java index e85eded..597277b 100644 --- a/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java +++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java @@ -119,7 +119,6 @@ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date distributeTime; - private Date auditTime; /** 涓嬪彂浜� */ private String realName; @@ -127,6 +126,12 @@ * 鏄惁鎵h繃绉垎 */ private Boolean deduct; + //澶勭悊鏃堕棿鐐归泦鍚� + private List<Date> handleTimeList; + private Date handleTime; + //瀹℃牳鏃堕棿鐐归泦鍚� + private List<Date> auditTimeList; + private Date auditTime; public static WorkOrderVO getVoByEntity(@NonNull WorkOrder entity, WorkOrderVO vo) { diff --git a/ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java b/ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java index c5c646f..3c1d2c4 100644 --- a/ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java +++ b/ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java @@ -77,7 +77,7 @@ */ List<DeviceInfoVO> hasErrorWorkOrderList(@Param("start") Date start, @Param("end") Date end); - List<WorkOrderVO> selectPassOrder(@Param("startTime") LocalDateTime now, @Param("endTime")LocalDateTime thirtyDaysAgo, @Param("status") String status, @Param("auditStatus") String auditStatus); + List<WorkOrderVO> selectPassOrder(@Param("startTime") LocalDateTime now, @Param("endTime")LocalDateTime thirtyDaysAgo, @Param("status") String status, @Param("errorList") List<String> errorList); int addMany(@Param("workOrderList") List<WorkOrder> workOrderList); @@ -117,4 +117,8 @@ List<String> getOfflineWorkOrder(); + List<WorkOrderVO> getAuditTimeList(@Param("workOrderNos")List<String> workOrderNos); + + List<WorkOrderVO> getHandleTimeList(@Param("workOrderNos")List<String> workOrderNos); + } 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櫎绉垎 diff --git a/ycl-server/src/main/resources/mapper/zgyw/WorkOrderErrorTypeMapper.xml b/ycl-server/src/main/resources/mapper/zgyw/WorkOrderErrorTypeMapper.xml index ee9d42b..d2bf388 100644 --- a/ycl-server/src/main/resources/mapper/zgyw/WorkOrderErrorTypeMapper.xml +++ b/ycl-server/src/main/resources/mapper/zgyw/WorkOrderErrorTypeMapper.xml @@ -98,7 +98,11 @@ </insert> <select id="getErrorList" resultType="com.ycl.system.entity.SysDictData"> - SELECT da.dict_value, da.dict_label FROM t_work_order_error_type oer INNER JOIN sys_dict_data da ON oer.error_name = da.dict_value WHERE oer.work_order_no = #{workOrderNo} + SELECT da.dict_value, da.dict_label + FROM t_work_order_error_type oer + INNER JOIN sys_dict_data da ON oer.error_name = da.dict_value + WHERE oer.work_order_no = #{workOrderNo} + ORDER BY oer.create_time </select> </mapper> diff --git a/ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml b/ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml index d0ecfcf..b10788e 100644 --- a/ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml +++ b/ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml @@ -359,12 +359,16 @@ </insert> <select id="selectPassOrder" resultType="com.ycl.platform.domain.vo.WorkOrderVO"> - SELECT wo.id,wo.work_order_no,wo.unit_id,woet.error_name as errorType,woet.create_time as distributeTime,woar.create_time as auditTime + SELECT wo.id,wo.work_order_no,wo.unit_id,woet.error_name as errorType,woet.create_time as distributeTime FROM t_work_order wo LEFT JOIN t_work_order_error_type woet ON woet.work_order_no = wo.work_order_no LEFT JOIN t_work_order_auditing_record woar ON woar.work_order_no = wo.work_order_no - WHERE wo.deleted = 0 AND wo.status = #{status} AND woar.result = #{auditStatus} - AND wo.deduct = 0 AND woar.create_time between #{startTime} and #{endTime} + WHERE wo.deleted = 0 AND wo.deduct = 0 AND wo.status = #{status} + AND woet.error_name in + <foreach collection="errorList" item="error" separator="," open="(" close=")"> + #{error} + </foreach> + AND woar.create_time between #{startTime} and #{endTime} and woar.result = #{auditStatus} </select> <update id="updateMany"> @@ -467,4 +471,18 @@ </foreach> </where> </select> + + <select id="getAuditTimeList" resultType="com.ycl.platform.domain.vo.WorkOrderVO"> + select work_order_no ,create_time as auditTime from t_work_order_auditing_record where work_order_no in + <foreach collection="workOrderNos" item="no" open="(" close=")" separator=","> + #{no} + </foreach> + </select> + <select id="getHandleTimeList" resultType="com.ycl.platform.domain.vo.WorkOrderVO"> + select work_order_no ,create_time as handleTime from t_work_order_yw_condition_record + where sys_msg = 0 and work_order_no in + <foreach collection="workOrderNos" item="no" open="(" close=")" separator=","> + #{no} + </foreach> + </select> </mapper> -- Gitblit v1.8.0