AOP는 통합 수출 보고서-원본 보고서가 매우 흥미로울 수 있음을 인식합니다.

머리말

참고 : 이전 블로그의 기능은 여가 시간에 개발 되었기 때문에 블로그에 약간의 코드가 있습니다.이 기능의 아이디어는 아마추어 구축에 있으며 백그라운드 구성 체계의 소스 코드는 작업 중에 작성되므로 코드는 감옥에서 프로그래밍을 피하기 위해 오픈 소스가 아닙니다.

개발의 경우 보고서 흐름은 가장 손을 대지 않고 지루하며 논리적으로 어렵지 않지만 매우 번거 롭습니다. (이는 워크 플로를 전문화하기에는 약간 공격적입니다.) 그러나 어떤 산업을 수행하든 보고서 흐름이 어느 정도 포함되며 숨길 수 없습니다. 여기서는 단일 및 반복 보고서 인터페이스 작성을 피하고 측면 사고를 통해 통합 보고서 내보내기 기능을 실현했습니다. 원본 보고서가 너무 재미있을 수 있습니다.

■ 수요

이 페이지 내보내기 지원 및 모든 데이터 인터페이스 내보내기

■ 분석

이 요구를보고
한 종류의 코드 동물-CV 개발 ; 먼저 비밀리에 불만을 제기 한 다음 내 보내야하는 모든 보고서를 나열한 다음 즉시 키보드를 클릭하여 하나씩 CV를 삭제, 삭제, 변경 및 노력하고 급여 2500에 대해 질문했습니다. . 이렇게하면 번거로운 개발은 말할 것도없고 후기 기간의 새 보고서는 사용자가 작성한 것으로 추정되며 새 변경 사항이 있으면 하나씩 변경해야합니다.

유형 2 코드 동물- 추상적 개발 ; 응? 먼저 공통점을 추출하고 도구 클래스를 작성한 다음 인터페이스를 하나씩 작성하고 도구 클래스를 호출하십시오. 고급 버전의 경우 특정 디자인 모드를 선택하고 하나의 인터페이스 만 사용하여 다양한 보고서 다운로드를 제공합니다. 공통점은 제거되지만 인터페이스는 여전히 작성되어야하며 도구는 참조됩니다. 나중에 새 보고서도 개발자가 작성해야합니다. 이것은 훨씬 더 간단하지만 새로운 보고서 요구 사항에는 여전히 소량의 코딩이 필요합니다. 후속 수출 보고서는 모두 당신의 손에 달려 있습니다. 적은 양의 이력서 만 있으면 좋겠지 만 동료의 손에는 개발 리소스를 낭비해야합니다. 작성하는 도구는 동료가 사용하거나 채택 할 수 없기 때문입니다.

세 가지 유형의 코드 동물- 측면 개발 ; 모든 것이 잘릴 수 있다고 생각하고 측면 개발은 측면 프로그래밍을 남용하지 않고 매우 좋은 문제 해결 아이디어입니다. 보고서 내보내기 요구 사항이있는 페이지를 관찰하고 이러한 보고서 내보내기의 공통점을 추출합니다. 모두 데이터 쿼리 및 페이징입니다.
먼저 자른 국수를 찾으세요. . 데이터 쿼리의 향상된 기능이 아닙니까? 데이터 쿼리 디스플레이 프런트 엔드를 변경하여 데이터 쿼리를 Excel에 저장하고
연락처 찾기 — 가장 초기 아이디어는 메모를 설정하고 메모를 입력 지점으로 사용하며 주석에 대한 인터페이스를 표시하는 것입니다. 입력, 반환 된 json 데이터를 분석합니다. 그렇다면 인터페이스 데이터 쿼리와 보고서 내보내기를 구분하고 매개 변수와 함께 요청을 사용하는 방법에 대해 생각해보십시오. 쿼리 인터페이스에 접미사를 추가 하시겠습니까? 오랫동안 고민 한 끝에이 매개 변수를 낮게 삽입하는 방법에 대해 고민해 왔는데, 다음날까지 갑자기 영감이 번쩍 였죠? 페이징, 예, 페이징 개체, 서비스 계층의 특징점, 페이징 개체의 반환 값, 때로는 혼란스럽고 휴식을 취하고 뛰쳐 나와서 살펴보고 구석에 갇혀 있음을 발견합니다. 이 컷은 정확하고 컷은 기본적으로 수요 지점이며 aspect의 반환 값은 원래 데이터 형식에 더 가깝고 (페이징 개체의 목록 속성은 보고서에 필요한 매개 변수 임) 기본적으로 새 보고서가 필요하지 않은 것이 더 완벽합니다. 코드를 변경하십시오.

분해 단계

①, 페이징 쿼리
②, 페이지 반환 값 목록 가져 오기
③, 필드 필터링, 데이터 처리 수행
④, 데이터 반환

오픈 컷

■ 1. 위빙 포인트

① 코멘트 설정

특별한 상황에서 짜기위한 주석 설정 (반드시 사용되지 않음, 예약 됨)

/**
 * @author bbq
 */
@Target({
    
    ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface XXAnnotation {
    
    
    String value() default "";
}

참고 : 메타 주석
@Target - ElementType.METHOD,이 클래스에 적용 할 수 있습니다 및 방법이 있음을 ElementType.TYPE 수단
@Retention이 - 클래스 파일이 JVM에 의해로드 된 후 RetentionPolicy.RUNTIME는
@Inherited는 아직 거기 클래스에 -acting, 주석의 서브 클래스됩니다
로고에 의해 생성 된 @ Documented-javadoc 상속

② 구간 설정

Aspect 설정, 접점은 서비스 계층, 반환 값은 페이징 객체의 방법 또는 ① 주석으로 표시된 방법

/**
 * @author bbq
 */
@Aspect
public class XXAspect {
    
    
    public static final int MAX_EXPORT_COUNT = 10_000;
    
	// 切点 为service层并且返回值为分页对象的方法 或标有 ①注解的方法
    @Around(value = "@annotation(XXAnnotation) || " +
            "execution (包名.Page 包名.*.service层.*.*(..))")
    public Object XX(ProceedingJoinPoint joinPoint) throws Throwable {
    
    
        try {
    
    
            Object[] args = joinPoint.getArgs();
            
            // 判断切点方法的参数,找到参数分页对象,判断请求参数是查询数据还是下载报表
            for (int i = 0; i < args.length; i++) {
    
    
                if (args[i] != null && Page.class.isAssignableFrom(args[i].getClass()) && "1".equals(((Page<T>)args[i]).getIsExportExcel())) {
    
    
                    return excute(joinPoint, (Page<T>) args[i]);
                }
            }
        } catch (Exception e) {
    
    
            。。。
        }
        return joinPoint.proceed();
    }

    public Object excute(...){
    
    ...}
}

■ 2. 매개 변수 및 데이터 정렬

보고서를 다운로드하려면이 방법을 입력하십시오.

public Object excute(ProceedingJoinPoint joinPoint, Page<T> page) throws Throwable {
    
    
		// 判断是否下载全部,查询全部则设置查询上限(防止报表行数太多)。
        if(page.getPageSize() == -1) {
    
    
            page.setPageSize(MAX_EXPORT_COUNT);
            page.setPageNo(0);
        }
        // 然后才执行分页查询,并可得出list列表。
        Page pageResult = (Page)joinPoint.proceed();

        String fileName = "占位符" + DateUtils.getDate("yyyyMMdd-HHmmss") + ".xlsx";
        try {
    
    
        	// list有数据即可通过反射获取数据的类,没有数据返回空json,前端作无数据弹窗
            Class format = Object.class;
            if(pageResult != null && pageResult.getList() != null && pageResult.getList().size() > 0) {
    
    
                format = pageResult.getList().get(0).getClass();
            }
            new ExportExcel(format).setDataList(pageResult.getList()).write(page.getResponse(), fileName).dispose();

        } catch (IllegalArgumentException e) {
    
    
            。。。
        }
        return null;
    }

■ 3. 보고서 데이터 가져 오기

목록 목록을 가져온 후 보고서 내보내기 도구 클래스를 호출 한 다음 내보낼 필드를 결정하고 선택할 수있는 3 가지 방법을 제공 할 수 있습니다.

① 엔티티 클래스 구성 주석

이 방법은 널리 사용됩니다. 기본 오픈 소스 보고서 기능에는이 기능이 있습니다. 속성 또는 메서드에 주석을 달고 보고서 내보내기 도구 클래스에서 필드 정보를 얻을 수 있다는 점에서 비슷합니다. 일반적으로 주석은 반복 할 수 없습니다. 주석 방법 반복
새 주석 정의 ExcelFields

/**
 * @author bbq
 */
@Target({
    
    ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelFields {
    
    
	ExcelField[] value();
}

그런 다음이 문장을 원래 주석 ExcelField에 추가하여 여러 주석을 만듭니다. 보고서 필드를 매핑하기 위해 클래스에 많은 주석을 넣을 수 있습니다.

@Repeatable(ExcelFields.class)

제목을 얻기위한 다른 주석 정의

/**
 * @author bbq
 */
@Target({
    
    ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelTitle {
    
    
	String value();
}

② 프런트 엔드가 쿼리 필드를 전달합니다 (권장되지 않음).

이 유형의 파생 필드에는 프런트 엔드 매개 변수 전송 결정이 있다고 생각했지만 나중에 그것이 부당하다고 생각하고 포기했습니다.

③ 백 스테이지 구성 계획 (적극 권장)

결국 배경 구성 방식을 선택했는데 개발이 조금 번거롭지 만 한 번 해결하고 나중에 코드 변경에 사용하지 않았습니다. 권한이 가장 높은 백그라운드 관리 페이지에이 보고서 구성 기능을 추가합니다. 두 가지 구성 관리, 이것은 주-하위 테이블 관계가 있고,
주 테이블에는 전체 경로 클래스 이름, 보고서 파일 이름, 버전 번호,
하위 테이블 포함 필드 이름, 매핑 된 보고서 레이블 이름, 정렬 필드가 있습니다.
클래스 이름을 반영하여 필드를 획득 할 수 있으며, 필드와 메소드를 캡처 할 수 있습니다. 필드와 메소드를 모두 캡처했습니다. 캡처 된 속성이 기본 유형이면 노드로 반환되고 캡처 된 속성은 부모 노드로 반환됩니다.지연로드 트리로 설정해야합니다. 재귀 적이면 무한 루프에 빠집니다.

하나씩 구성하는 것이 번거로울 경우 내보내기 보고서 섹션에 방법을 추가하여 인터페이스를 통해 구성 필드 정보를 자동으로 생성 할 수 있습니다 (json 데이터에 통합되어야 함). 구성 담당자는 내보내기가 필요한 필드를 확인하고 레이블 이름을 작성하고 그냥 정렬하세요.

보고서를 자주 내보내는 경우이 정보를 redis 캐시에 추가하는 것을 고려할 수 있습니다.

■ 4. 다음 보고서 데이터 가져 오기

앞의 측면에서는 리플렉션을 통해 페이징 객체를 얻고 목록을 얻었으며, 목록에 데이터가 있으면 리플렉션을 통해 데이터의 클래스를 얻을 수있다. 그런 다음 리플렉션을 통해 얻은 클래스를 통해 구성한 클래스를 찾아 구성에 대한 모든 정보를 얻을 수 있으며, 클래스가 하나 이상의 보고서에 해당하는 경우 버전 번호 메커니즘을 도입하여 구분할 수 있습니다.
제목 이름, 필드, 필드에 해당하는 레이블, 필드 정렬 및 기타 정보로 보고서 구성이 완료됩니다.
구성된 정보를 통해 보고서 내보내기 도구를 사용하여 해당 보고서를 내보낼 수 있습니다.

마침내

이러한 방식으로 aop을 통해 낮은 유지비 통합 수출 간편보고 기능을 실현할 수 있습니다.

추천

출처blog.csdn.net/qq_24054301/article/details/106887155