使用瀏覽器瀏覽本地資料夾內容
阿新 • • 發佈:2022-05-24
/** * excel排序根據LoanNo * 先進行整個list列表的序號填充 * 獲取loanNo借據號不為空的進行排序,相同借據號的排序到一起 * 將相同借據號的資料提示,[與第2,3條借據號重複][與第1,3條借據號重複][與1,2條借據號重複] * 可針對三種情況匯出列表,<T>對匯出的借據號重複的放在一起(並提示與哪一行重複),為null的排除 * TODO 因為現在匯出列表時最後也有寫入序號,所以在執行這個方法時只能取消匯出時的寫入序號操作 * * @param list * @param <T> */ public static <T> List<T> excelSortLoanNo(List<T> list) { // list = listForIncrementSequence(list,1); Predicate<List<T>> singleOrNot = equalsList -> equalsList.size() > 1; //可針對三種情況匯出列表,<T>對匯出的借據號重複的放在一起(並提示與哪一行重複),為null的排除 List listVisiable = list.stream() .filter(exl -> { try { Field field = exl.getClass().getDeclaredField(LOAN_NUMBER); field.setAccessible(true); return field.get(exl) != null; } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return false; }) .sorted((in1, in2) -> { Field field1 = null; Field field2 = null; try { field1 = in1.getClass().getDeclaredField(LOAN_NUMBER); field2 = in2.getClass().getDeclaredField(LOAN_NUMBER); field1.setAccessible(true); field2.setAccessible(true); } catch (NoSuchFieldException e) { log.error("excelSortLoanNo欄位不存在"); } return field1.hashCode() - field2.hashCode(); }) .collect(Collectors.groupingBy(exl -> { try { Field declaredField = exl.getClass().getDeclaredField(LOAN_NUMBER); declaredField.setAccessible(true); return declaredField.get(exl); } catch (IllegalAccessException e) { log.error("checkOutListCondition非法訪問"); throw new RuntimeException("提取資料異常"); } catch (NoSuchFieldException e) { log.error("checkOutListCondition欄位不存在"); throw new RuntimeException("提取資料異常"); } })) .values().stream() .filter(loanNoDuplicateList -> singleOrNot.test(loanNoDuplicateList)) .map(oneGroup -> { //先設定sequenceId的話在進入這裡就會被打亂了 List<Object> sequenceIds = oneGroup.stream().map(one -> { try { Field declaredField = one.getClass().getDeclaredField(SEQUENCE_NAME); declaredField.setAccessible(true); return declaredField.get(one); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; }).collect(Collectors.toList()); return oneGroup.stream() .peek(one -> { try { Field failedReasons = one.getClass().getDeclaredField(FAILED_REASONS); failedReasons.setAccessible(true); Object reasonsOld = failedReasons.get(one); Field sequenceField = one.getClass().getDeclaredField(SEQUENCE_NAME); sequenceField.setAccessible(true); Object thisOneSequenceId = sequenceField.get(one); List<Object> sequenceIdList = sequenceIds.stream() .filter(se -> !se.equals(thisOneSequenceId)).collect(Collectors.toList()); Object[] sequenceIdArr = sequenceIdList.stream().toArray(); String sequenceIdArrStr = StringUtils.join(sequenceIdArr, ","); String failedReasonsFresh = reasonsOld.toString() //按測試需求,這裡的字串被更改處,都是在mapper中設定的failedReasons中的 //com/chinacscs/fgf/gi/mapper/GiExcelImportTempCommonMapper.java:23 .replace("excel內借據號重複", "excel內借據號重複,與序號" + sequenceIdArrStr + "條重複"); // String failedReasonsFresh = reasonsOld + "[該條借據號與序號" + sequenceIdArrStr + "重複]"; failedReasons.set(one, failedReasonsFresh); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } }) .collect(Collectors.toList()); }) .reduce((l1, l2) -> { l1.addAll(l2); return l1; }) .filter(list1 -> !CollectionUtils.isEmpty(list1)) .orElse(Collections.EMPTY_LIST); list.removeAll(listVisiable); listVisiable.addAll(list); return listVisiable; }