Compare commits
	
		
			31 Commits
		
	
	
		
			feature-ui
			...
			c6ea898505
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c6ea898505 | |||
| 711697e6a1 | |||
| 89866c8513 | |||
| f90114e204 | |||
| 0458da2fae | |||
| 46d0ff64ef | |||
| 57b5edd9c0 | |||
| 73cfe24460 | |||
| 9e0d07a9f7 | |||
| ab957962fc | |||
| da9da6e906 | |||
| 7ba9d249ee | |||
| afccb2a88c | |||
| 962c22400e | |||
| c7bf9f6c0d | |||
| daa1d2aaaf | |||
| 6a93fc2738 | |||
| e3858d23d9 | |||
| 0cf8e16129 | |||
| fe6707ca3f | |||
| c6705d326d | |||
| 3e071cedd7 | |||
| c7ae33222d | |||
| a9c6e0476b | |||
| 2e02b9182d | |||
| f391880c9c | |||
| 372824ec50 | |||
| e4b68276dd | |||
| 8489f43b55 | |||
| 42dd59e141 | |||
| d20a3222c0 | 
							
								
								
									
										28
									
								
								code/db/pkg/TELSALER_TWR_UTILS.pck
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								code/db/pkg/TELSALER_TWR_UTILS.pck
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
CREATE OR REPLACE PACKAGE TELSALER_TWR_UTILS IS
 | 
			
		||||
 | 
			
		||||
    -- Author  : KANE
 | 
			
		||||
    -- Created : 2023/12/19 16:27:20
 | 
			
		||||
    -- Purpose : twr<77><72><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صĹ<D8B5><C4B9>ߺ<EFBFBD><DFBA><EFBFBD>
 | 
			
		||||
 | 
			
		||||
    PROCEDURE <20><><EFBFBD><EFBFBD>TWR<57><52>ϯ<EFBFBD>嵥;
 | 
			
		||||
 | 
			
		||||
    PROCEDURE <20><><EFBFBD><EFBFBD>TWR<57>Ŷ<EFBFBD><C5B6>嵥;
 | 
			
		||||
 | 
			
		||||
END TELSALER_TWR_UTILS;
 | 
			
		||||
/
 | 
			
		||||
CREATE OR REPLACE PACKAGE BODY TELSALER_TWR_UTILS IS
 | 
			
		||||
 | 
			
		||||
    PROCEDURE <20><><EFBFBD><EFBFBD>TWR<57><52>ϯ<EFBFBD>嵥 IS
 | 
			
		||||
    BEGIN
 | 
			
		||||
        EXECUTE IMMEDIATE 'truncate table twr_telsaler_dev';
 | 
			
		||||
    END;
 | 
			
		||||
 | 
			
		||||
    PROCEDURE <20><><EFBFBD><EFBFBD>TWR<57>Ŷ<EFBFBD><C5B6>嵥 IS
 | 
			
		||||
    BEGIN
 | 
			
		||||
        EXECUTE IMMEDIATE 'truncate table twr_telsaler_team_dev';
 | 
			
		||||
    END;
 | 
			
		||||
 | 
			
		||||
BEGIN
 | 
			
		||||
    NULL;
 | 
			
		||||
END TELSALER_TWR_UTILS;
 | 
			
		||||
/
 | 
			
		||||
							
								
								
									
										309
									
								
								code/db/pkg/telsale_archievement_dev_pkg.pck
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										309
									
								
								code/db/pkg/telsale_archievement_dev_pkg.pck
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,309 @@
 | 
			
		||||
CREATE OR REPLACE PACKAGE TELSALE_ARCHIEVEMENT_DEV_PKG IS
 | 
			
		||||
 | 
			
		||||
    -- Author  : WANGWEI-202
 | 
			
		||||
    -- Created : 2023/3/10 15:13:34
 | 
			
		||||
    -- Purpose : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɰ<EFBFBD>
 | 
			
		||||
 | 
			
		||||
    TYPE CUR_TYPE IS REF CURSOR;
 | 
			
		||||
 | 
			
		||||
    -- <20>쳣
 | 
			
		||||
    DEPARTMENTCODE_EXCEPTION_CODE CONSTANT INTEGER := -20000;
 | 
			
		||||
    DEPARTMENTCODE_EXCEPTION_MSG  CONSTANT VARCHAR2(100) := '<27><><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>';
 | 
			
		||||
 | 
			
		||||
    CALLERCODE_EXCEPTION_CODE CONSTANT INTEGER := -20001;
 | 
			
		||||
    CALLERCODE_EXCEPTION_MSG  CONSTANT VARCHAR2(100) := '<27><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>';
 | 
			
		||||
 | 
			
		||||
    PROCEDURE DEPARTMENT_ARCHIEVEMENT
 | 
			
		||||
    (
 | 
			
		||||
        A_DEPARTMENT_CODE       IN VARCHAR2,
 | 
			
		||||
        A_ATTACHING_RATE        OUT VARCHAR2,
 | 
			
		||||
        A_ATTACHING_RATE_TARGET OUT VARCHAR2,
 | 
			
		||||
        A_RENEWAL_RATE          OUT VARCHAR2,
 | 
			
		||||
        A_RENEWAL_RATE_TARGET   OUT VARCHAR2,
 | 
			
		||||
        A_TOTAL                 OUT INTEGER,
 | 
			
		||||
        A_MENSUAL_CUR           OUT CUR_TYPE
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    PROCEDURE CALLER_ARCHIEVEMENT
 | 
			
		||||
    (
 | 
			
		||||
        A_CALLER_CODE    IN VARCHAR2,
 | 
			
		||||
        A_ATTACHING_RATE OUT VARCHAR2,
 | 
			
		||||
        A_RENEWAL_RATE   OUT VARCHAR2,
 | 
			
		||||
        A_TOTAL          OUT INTEGER,
 | 
			
		||||
        A_PRESENT_MONTH  OUT NUMBER,
 | 
			
		||||
        A_MENSUAL_CUR    OUT CUR_TYPE
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    PROCEDURE CALLER_ARCH_RANKING_LIST
 | 
			
		||||
    (
 | 
			
		||||
        A_DEPARTMENT_CODE        IN VARCHAR2,
 | 
			
		||||
        A_YEAR                   IN VARCHAR2,
 | 
			
		||||
        A_MONTH                  IN VARCHAR2,
 | 
			
		||||
        A_ATTACHING_RANKING_LIST OUT CUR_TYPE,
 | 
			
		||||
        A_RENEWAL_RANKING_LIST   OUT CUR_TYPE
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
END TELSALE_ARCHIEVEMENT_DEV_PKG;
 | 
			
		||||
/
 | 
			
		||||
CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_DEV_PKG IS
 | 
			
		||||
 | 
			
		||||
    -- <20><><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>
 | 
			
		||||
    PROCEDURE DEPARTMENT_ARCHIEVEMENT
 | 
			
		||||
    (
 | 
			
		||||
        A_DEPARTMENT_CODE       IN VARCHAR2,
 | 
			
		||||
        A_ATTACHING_RATE        OUT VARCHAR2,
 | 
			
		||||
        A_ATTACHING_RATE_TARGET OUT VARCHAR2,
 | 
			
		||||
        A_RENEWAL_RATE          OUT VARCHAR2,
 | 
			
		||||
        A_RENEWAL_RATE_TARGET   OUT VARCHAR2,
 | 
			
		||||
        A_TOTAL                 OUT INTEGER,
 | 
			
		||||
        A_MENSUAL_CUR           OUT CUR_TYPE
 | 
			
		||||
    ) IS
 | 
			
		||||
        L_FIRSTDAY            DATE;
 | 
			
		||||
        L_DEPARTMENT_NAME     VARCHAR2(100);
 | 
			
		||||
        L_RENEWAL_RATE_TARGET NUMBER;
 | 
			
		||||
    BEGIN
 | 
			
		||||
        L_FIRSTDAY := TO_DATE(TO_CHAR(SYSDATE,
 | 
			
		||||
                                      'yyyy') || '-01-01 00:00:00',
 | 
			
		||||
                              'yyyy-mm-dd hh24:mi:ss');
 | 
			
		||||
        -- <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
        BEGIN
 | 
			
		||||
            SELECT DEPARTMENT_NAME
 | 
			
		||||
              INTO L_DEPARTMENT_NAME
 | 
			
		||||
              FROM IDST0.BM_T BM
 | 
			
		||||
             WHERE BM.DEPARTMENT_CODE = A_DEPARTMENT_CODE;
 | 
			
		||||
        EXCEPTION
 | 
			
		||||
            -- <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׳<EFBFBD><D7B3>쳣
 | 
			
		||||
            WHEN NO_DATA_FOUND THEN
 | 
			
		||||
                RAISE_APPLICATION_ERROR(DEPARTMENTCODE_EXCEPTION_CODE,
 | 
			
		||||
                                        DEPARTMENTCODE_EXCEPTION_MSG);
 | 
			
		||||
        END;
 | 
			
		||||
    
 | 
			
		||||
        --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8>&Ŀ<><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
        BEGIN
 | 
			
		||||
            SELECT ROUND(DEPT.<2E><><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8>,
 | 
			
		||||
                         2),
 | 
			
		||||
                   ROUND(DEPT.Ŀ<><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
 | 
			
		||||
                         2)
 | 
			
		||||
              INTO A_ATTACHING_RATE,
 | 
			
		||||
                   A_ATTACHING_RATE_TARGET
 | 
			
		||||
              FROM DESKTOP_ARCHIEVEMENT_ADMIN.BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> DEPT
 | 
			
		||||
             WHERE DEPT.<2E><><EFBFBD><EFBFBD> = L_DEPARTMENT_NAME;
 | 
			
		||||
        
 | 
			
		||||
            --<2D><><EFBFBD><EFBFBD>round<6E><64><EFBFBD><EFBFBD>С<EFBFBD><D0A1>ȱ0<C8B1><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
            SELECT DECODE(SUBSTR(A_ATTACHING_RATE_TARGET,
 | 
			
		||||
                                 1,
 | 
			
		||||
                                 1),
 | 
			
		||||
                          '.',
 | 
			
		||||
                          '0' || A_ATTACHING_RATE_TARGET,
 | 
			
		||||
                          A_ATTACHING_RATE_TARGET)
 | 
			
		||||
              INTO A_ATTACHING_RATE_TARGET
 | 
			
		||||
              FROM DUAL;
 | 
			
		||||
        EXCEPTION
 | 
			
		||||
            WHEN NO_DATA_FOUND THEN
 | 
			
		||||
                A_ATTACHING_RATE        := '0.0';
 | 
			
		||||
                A_ATTACHING_RATE_TARGET := '0.0';
 | 
			
		||||
        END;
 | 
			
		||||
    
 | 
			
		||||
        --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>&Ŀ<><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
        BEGIN
 | 
			
		||||
            SELECT ROUND(t."<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>ʱ<EFBFBD><CAB1>(%)",
 | 
			
		||||
                         2),
 | 
			
		||||
                   ROUND(t."<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>ʱ<EFBFBD><CAB1>(%)" - t."<22><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>ֵ1(%)",
 | 
			
		||||
                         2)
 | 
			
		||||
              INTO A_RENEWAL_RATE,
 | 
			
		||||
                   A_RENEWAL_RATE_TARGET
 | 
			
		||||
              FROM "BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>-24<32><34>" T
 | 
			
		||||
             WHERE T.<2E><><EFBFBD>β<EFBFBD><CEB2><EFBFBD> = L_DEPARTMENT_NAME;
 | 
			
		||||
        
 | 
			
		||||
            --<2D><><EFBFBD><EFBFBD>round<6E><64><EFBFBD><EFBFBD>С<EFBFBD><D0A1>ȱ0<C8B1><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
            SELECT DECODE(SUBSTR(A_RENEWAL_RATE_TARGET,
 | 
			
		||||
                                 1,
 | 
			
		||||
                                 1),
 | 
			
		||||
                          '.',
 | 
			
		||||
                          '0' || A_RENEWAL_RATE_TARGET,
 | 
			
		||||
                          A_RENEWAL_RATE_TARGET)
 | 
			
		||||
              INTO A_RENEWAL_RATE_TARGET
 | 
			
		||||
              FROM DUAL;
 | 
			
		||||
        EXCEPTION
 | 
			
		||||
            WHEN NO_DATA_FOUND THEN
 | 
			
		||||
                A_RENEWAL_RATE        := '0.0';
 | 
			
		||||
                A_RENEWAL_RATE_TARGET := '0.0';
 | 
			
		||||
        END;
 | 
			
		||||
    
 | 
			
		||||
        --<2D><>ҵ<EFBFBD><D2B5>
 | 
			
		||||
        A_TOTAL := 0;
 | 
			
		||||
    
 | 
			
		||||
        --ÿ<><C3BF>ҵ<EFBFBD><D2B5>
 | 
			
		||||
        OPEN A_MENSUAL_CUR FOR
 | 
			
		||||
            SELECT CF.<2E>·<EFBFBD> MM,
 | 
			
		||||
                   ROUND(NVL(SUM(CF.<2E><><EFBFBD>ո<EFBFBD><D5B8>˿ͻ<CBBF><CDBB><EFBFBD><EFBFBD><EFBFBD> + CF.<2E><><EFBFBD><EFBFBD><EFBFBD>ںϱ<DABA><CFB1><EFBFBD>) / 10000,
 | 
			
		||||
                             0),
 | 
			
		||||
                         0) BF
 | 
			
		||||
              FROM <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD>ÿ<EFBFBD>ձ<EFBFBD><D5B1><EFBFBD> CF
 | 
			
		||||
             WHERE <20><><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD> = A_DEPARTMENT_CODE
 | 
			
		||||
               AND ǩ<><C7A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> >= TO_DATE(TO_CHAR(SYSDATE,
 | 
			
		||||
                                           'yyyy') || '-01-01 00:00:00',
 | 
			
		||||
                                   'yyyy-mm-dd hh24:mi:ss')
 | 
			
		||||
               AND ǩ<><C7A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> < TO_DATE(TO_CHAR(SYSDATE,
 | 
			
		||||
                                          'yyyy-mm') || '-01 00:00:00',
 | 
			
		||||
                                  'yyyy-mm-dd hh24:mi:ss')
 | 
			
		||||
             GROUP BY CF.<2E>·<EFBFBD>
 | 
			
		||||
             ORDER BY CF.<2E>·<EFBFBD>;
 | 
			
		||||
    END;
 | 
			
		||||
 | 
			
		||||
    /*******************************************************/
 | 
			
		||||
    -- <20><>ϯҵ<CFAF><D2B5>
 | 
			
		||||
    PROCEDURE CALLER_ARCHIEVEMENT
 | 
			
		||||
    (
 | 
			
		||||
        A_CALLER_CODE    IN VARCHAR2,
 | 
			
		||||
        A_ATTACHING_RATE OUT VARCHAR2,
 | 
			
		||||
        A_RENEWAL_RATE   OUT VARCHAR2,
 | 
			
		||||
        A_TOTAL          OUT INTEGER,
 | 
			
		||||
        A_PRESENT_MONTH  OUT NUMBER,
 | 
			
		||||
        A_MENSUAL_CUR    OUT CUR_TYPE
 | 
			
		||||
    ) IS
 | 
			
		||||
        L_CALLER_NAME     VARCHAR2(100);
 | 
			
		||||
        L_DEPARTMENT_NAME VARCHAR2(100);
 | 
			
		||||
        L_THIS_YEAR       VARCHAR2(4);
 | 
			
		||||
        L_ROWNUM          INTEGER;
 | 
			
		||||
    BEGIN
 | 
			
		||||
        --<2D><>ѯ<EFBFBD><D1AF>ϯ<EFBFBD><CFAF><EFBFBD>ƣ<EFBFBD><C6A3>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD>
 | 
			
		||||
        BEGIN
 | 
			
		||||
            SELECT ZX.<2E><>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>,
 | 
			
		||||
                   BM.DEPARTMENT_NAME
 | 
			
		||||
              INTO L_CALLER_NAME,
 | 
			
		||||
                   L_DEPARTMENT_NAME
 | 
			
		||||
              FROM TWR_TELSALER      ZX,
 | 
			
		||||
                   TWR_TELSALER_TEAM T,
 | 
			
		||||
                   IDST0.BM_T        BM
 | 
			
		||||
             WHERE ZX.<2E><>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD> = A_CALLER_CODE
 | 
			
		||||
               AND ZX.<2E>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD><EFBFBD> = T.TEAM_NAME
 | 
			
		||||
               AND T.DEPARTMENT_CODE = BM.DEPARTMENT_CODE;
 | 
			
		||||
        EXCEPTION
 | 
			
		||||
            -- <20><><EFBFBD><EFBFBD>û<EFBFBD>в<EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD>ƣ<EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׳<EFBFBD><D7B3>쳣
 | 
			
		||||
            WHEN NO_DATA_FOUND THEN
 | 
			
		||||
                RAISE_APPLICATION_ERROR(CALLERCODE_EXCEPTION_CODE,
 | 
			
		||||
                                        CALLERCODE_EXCEPTION_MSG);
 | 
			
		||||
        END;
 | 
			
		||||
    
 | 
			
		||||
        L_THIS_YEAR := TO_CHAR(SYSDATE,
 | 
			
		||||
                               'yyyy');
 | 
			
		||||
    
 | 
			
		||||
        --<2D>ܳ<EFBFBD><DCB3>ձ<EFBFBD><D5B1><EFBFBD>
 | 
			
		||||
        SELECT ROUND(NVL(SUM(CF.<2E><><EFBFBD>ո<EFBFBD><D5B8>˿ͻ<CBBF><CDBB><EFBFBD><EFBFBD><EFBFBD>),
 | 
			
		||||
                         0),
 | 
			
		||||
                     2) BF
 | 
			
		||||
          INTO A_TOTAL
 | 
			
		||||
          FROM <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD>ÿ<EFBFBD>ձ<EFBFBD><D5B1><EFBFBD> CF
 | 
			
		||||
         WHERE CF.<2E><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD> = L_CALLER_NAME
 | 
			
		||||
           AND CF.<2E><><EFBFBD><EFBFBD> = L_DEPARTMENT_NAME
 | 
			
		||||
           AND CF.<2E><><EFBFBD><EFBFBD> = L_THIS_YEAR;
 | 
			
		||||
    
 | 
			
		||||
        --<2D><><EFBFBD><CDB8>
 | 
			
		||||
        BEGIN
 | 
			
		||||
            SELECT ROWNUM,
 | 
			
		||||
                   ROUND(NVL(T.<2E><><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8>,
 | 
			
		||||
                             0),
 | 
			
		||||
                         2),
 | 
			
		||||
                   ROUND(NVL(t."<22><><EFBFBD>ձ<EFBFBD><D5B1><EFBFBD>(<28><>)" * 10000,
 | 
			
		||||
                             0),
 | 
			
		||||
                         2)
 | 
			
		||||
              INTO L_ROWNUM,
 | 
			
		||||
                   A_ATTACHING_RATE,
 | 
			
		||||
                   A_PRESENT_MONTH
 | 
			
		||||
              FROM BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> T
 | 
			
		||||
             WHERE T.<2E><><EFBFBD><EFBFBD> = L_CALLER_NAME
 | 
			
		||||
               AND ROWNUM = 1;
 | 
			
		||||
        EXCEPTION
 | 
			
		||||
            WHEN NO_DATA_FOUND THEN
 | 
			
		||||
                L_ROWNUM         := 1;
 | 
			
		||||
                A_ATTACHING_RATE := 0.0;
 | 
			
		||||
                A_PRESENT_MONTH  := 0.0;
 | 
			
		||||
        END;
 | 
			
		||||
    
 | 
			
		||||
        --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
        BEGIN
 | 
			
		||||
            SELECT ROWNUM,
 | 
			
		||||
                   ROUND(NVL(t."<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>ȫ<EFBFBD>£<EFBFBD>(%)",
 | 
			
		||||
                             0),
 | 
			
		||||
                         2)
 | 
			
		||||
              INTO L_ROWNUM,
 | 
			
		||||
                   A_RENEWAL_RATE
 | 
			
		||||
              FROM "BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>-24<32><34>" T
 | 
			
		||||
             WHERE T.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = L_CALLER_NAME
 | 
			
		||||
               AND ROWNUM = 1;
 | 
			
		||||
        EXCEPTION
 | 
			
		||||
            WHEN NO_DATA_FOUND THEN
 | 
			
		||||
                L_ROWNUM       := 1;
 | 
			
		||||
                A_RENEWAL_RATE := 0.0;
 | 
			
		||||
        END;
 | 
			
		||||
    
 | 
			
		||||
        --ÿ<><C3BF>ҵ<EFBFBD><D2B5>
 | 
			
		||||
        OPEN A_MENSUAL_CUR FOR
 | 
			
		||||
            SELECT CF.<2E>·<EFBFBD> MM,
 | 
			
		||||
                   ROUND(NVL(SUM(CF.<2E><><EFBFBD>ո<EFBFBD><D5B8>˿ͻ<CBBF><CDBB><EFBFBD><EFBFBD><EFBFBD>),
 | 
			
		||||
                             0),
 | 
			
		||||
                         0) BF
 | 
			
		||||
              FROM <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD>ÿ<EFBFBD>ձ<EFBFBD><D5B1><EFBFBD> CF
 | 
			
		||||
             WHERE CF.<2E><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD> = L_CALLER_NAME
 | 
			
		||||
               AND CF.<2E><><EFBFBD><EFBFBD> = L_DEPARTMENT_NAME
 | 
			
		||||
               AND ǩ<><C7A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> >= TO_DATE(TO_CHAR(SYSDATE,
 | 
			
		||||
                                           'yyyy') || '-01-01 00:00:00',
 | 
			
		||||
                                   'yyyy-mm-dd hh24:mi:ss')
 | 
			
		||||
               AND ǩ<><C7A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <= SYSDATE
 | 
			
		||||
             GROUP BY CF.<2E>·<EFBFBD>
 | 
			
		||||
             ORDER BY CF.<2E>·<EFBFBD>;
 | 
			
		||||
    END;
 | 
			
		||||
 | 
			
		||||
    /*******************************************************/
 | 
			
		||||
    -- <20><>ϯ<EFBFBD><CFAF><EFBFBD>а<EFBFBD>
 | 
			
		||||
    PROCEDURE CALLER_ARCH_RANKING_LIST
 | 
			
		||||
    (
 | 
			
		||||
        A_DEPARTMENT_CODE        IN VARCHAR2,
 | 
			
		||||
        A_YEAR                   IN VARCHAR2,
 | 
			
		||||
        A_MONTH                  IN VARCHAR2,
 | 
			
		||||
        A_ATTACHING_RANKING_LIST OUT CUR_TYPE,
 | 
			
		||||
        A_RENEWAL_RANKING_LIST   OUT CUR_TYPE
 | 
			
		||||
    ) IS
 | 
			
		||||
        L_DEPARTMENT_NAME VARCHAR2(100);
 | 
			
		||||
    BEGIN
 | 
			
		||||
        -- <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
        BEGIN
 | 
			
		||||
            SELECT DEPARTMENT_NAME
 | 
			
		||||
              INTO L_DEPARTMENT_NAME
 | 
			
		||||
              FROM IDST0.BM_T BM
 | 
			
		||||
             WHERE BM.DEPARTMENT_CODE = A_DEPARTMENT_CODE;
 | 
			
		||||
        EXCEPTION
 | 
			
		||||
            -- <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׳<EFBFBD><D7B3>쳣
 | 
			
		||||
            WHEN NO_DATA_FOUND THEN
 | 
			
		||||
                RAISE_APPLICATION_ERROR(DEPARTMENTCODE_EXCEPTION_CODE,
 | 
			
		||||
                                        DEPARTMENTCODE_EXCEPTION_MSG);
 | 
			
		||||
        END;
 | 
			
		||||
        -- <20><><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><DABA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD>
 | 
			
		||||
        OPEN A_ATTACHING_RANKING_LIST FOR
 | 
			
		||||
            SELECT ROWNUM,
 | 
			
		||||
                   PAIHANG.<2E><><EFBFBD><EFBFBD> AS CALLER_NAME,
 | 
			
		||||
                   PAIHANG.XBL  AS ATTACHING_RATE
 | 
			
		||||
              FROM (SELECT T.<2E><><EFBFBD><EFBFBD>,
 | 
			
		||||
                           ROUND(T.<2E><><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8>,
 | 
			
		||||
                                 2) XBL
 | 
			
		||||
                      FROM BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> T
 | 
			
		||||
                     WHERE T.<2E><><EFBFBD><EFBFBD> = L_DEPARTMENT_NAME
 | 
			
		||||
                     ORDER BY T.<2E><><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8> DESC) PAIHANG;
 | 
			
		||||
    
 | 
			
		||||
        -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD>
 | 
			
		||||
        OPEN A_RENEWAL_RANKING_LIST FOR
 | 
			
		||||
            SELECT ROWNUM,
 | 
			
		||||
                   PAIHANG.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AS CALLER_NAME,
 | 
			
		||||
                   PAIHANG.XBL    AS RENEWAL_RATE
 | 
			
		||||
              FROM (SELECT T.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
 | 
			
		||||
                           ROUND(t."<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>ȫ<EFBFBD>£<EFBFBD>(%)",
 | 
			
		||||
                                 2) XBL
 | 
			
		||||
                      FROM BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> T
 | 
			
		||||
                     WHERE T.<2E><><EFBFBD>β<EFBFBD><CEB2><EFBFBD> = L_DEPARTMENT_NAME
 | 
			
		||||
                     ORDER BY XBL DESC) PAIHANG;
 | 
			
		||||
    END;
 | 
			
		||||
BEGIN
 | 
			
		||||
    NULL;
 | 
			
		||||
END TELSALE_ARCHIEVEMENT_DEV_PKG;
 | 
			
		||||
/
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
CREATE OR REPLACE PACKAGE telsale_archievement_pkg IS
 | 
			
		||||
CREATE OR REPLACE PACKAGE TELSALE_ARCHIEVEMENT_PKG IS
 | 
			
		||||
 | 
			
		||||
    -- Author  : WANGWEI-202
 | 
			
		||||
    -- Created : 2023/3/10 15:13:34
 | 
			
		||||
    -- Purpose : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɰ<EFBFBD>
 | 
			
		||||
 | 
			
		||||
    TYPE cur_type IS REF CURSOR;
 | 
			
		||||
    TYPE CUR_TYPE IS REF CURSOR;
 | 
			
		||||
 | 
			
		||||
    -- <20>쳣
 | 
			
		||||
    DEPARTMENTCODE_EXCEPTION_CODE CONSTANT INTEGER := -20000;
 | 
			
		||||
@@ -13,55 +13,55 @@ CREATE OR REPLACE PACKAGE telsale_archievement_pkg IS
 | 
			
		||||
    CALLERCODE_EXCEPTION_CODE CONSTANT INTEGER := -20001;
 | 
			
		||||
    CALLERCODE_EXCEPTION_MSG  CONSTANT VARCHAR2(100) := '<27><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>';
 | 
			
		||||
 | 
			
		||||
    PROCEDURE department_archievement
 | 
			
		||||
    PROCEDURE DEPARTMENT_ARCHIEVEMENT
 | 
			
		||||
    (
 | 
			
		||||
        a_department_code IN VARCHAR2,
 | 
			
		||||
        a_attaching_rate  OUT VARCHAR2,
 | 
			
		||||
        a_renewal_rate    OUT VARCHAR2,
 | 
			
		||||
        a_total           OUT INTEGER,
 | 
			
		||||
        a_mensual_cur     OUT cur_type
 | 
			
		||||
        A_DEPARTMENT_CODE       IN VARCHAR2,
 | 
			
		||||
        A_ATTACHING_RATE        OUT VARCHAR2,
 | 
			
		||||
        A_ATTACHING_RATE_TARGET OUT VARCHAR2,
 | 
			
		||||
        A_RENEWAL_RATE          OUT VARCHAR2,
 | 
			
		||||
        A_RENEWAL_RATE_TARGET   OUT VARCHAR2,
 | 
			
		||||
        A_TOTAL                 OUT INTEGER,
 | 
			
		||||
        A_MENSUAL_CUR           OUT CUR_TYPE
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    PROCEDURE caller_archievement
 | 
			
		||||
    PROCEDURE CALLER_ARCHIEVEMENT
 | 
			
		||||
    (
 | 
			
		||||
        a_caller_code    IN VARCHAR2,
 | 
			
		||||
        a_attaching_rate OUT VARCHAR2,
 | 
			
		||||
        a_renewal_rate   OUT VARCHAR2,
 | 
			
		||||
        a_total          OUT INTEGER,
 | 
			
		||||
        a_present_month  OUT NUMBER,
 | 
			
		||||
        a_mensual_cur    OUT cur_type
 | 
			
		||||
        A_CALLER_CODE    IN VARCHAR2,
 | 
			
		||||
        A_ATTACHING_RATE OUT VARCHAR2,
 | 
			
		||||
        A_RENEWAL_RATE   OUT VARCHAR2,
 | 
			
		||||
        A_TOTAL          OUT INTEGER,
 | 
			
		||||
        A_PRESENT_MONTH  OUT NUMBER,
 | 
			
		||||
        A_MENSUAL_CUR    OUT CUR_TYPE
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    PROCEDURE caller_arch_ranking_list
 | 
			
		||||
    PROCEDURE CALLER_ARCH_RANKING_LIST
 | 
			
		||||
    (
 | 
			
		||||
        a_department_code        IN VARCHAR2,
 | 
			
		||||
        a_year                   IN VARCHAR2,
 | 
			
		||||
        a_month                  IN VARCHAR2,
 | 
			
		||||
        a_attaching_ranking_list OUT cur_type,
 | 
			
		||||
        a_renewal_ranking_list   OUT cur_type
 | 
			
		||||
        A_DEPARTMENT_CODE        IN VARCHAR2,
 | 
			
		||||
        A_YEAR                   IN VARCHAR2,
 | 
			
		||||
        A_MONTH                  IN VARCHAR2,
 | 
			
		||||
        A_ATTACHING_RANKING_LIST OUT CUR_TYPE,
 | 
			
		||||
        A_RENEWAL_RANKING_LIST   OUT CUR_TYPE
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
END telsale_archievement_pkg;
 | 
			
		||||
END TELSALE_ARCHIEVEMENT_PKG;
 | 
			
		||||
/
 | 
			
		||||
CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS
 | 
			
		||||
 | 
			
		||||
    -- <20><><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>
 | 
			
		||||
    PROCEDURE DEPARTMENT_ARCHIEVEMENT
 | 
			
		||||
    (
 | 
			
		||||
        A_DEPARTMENT_CODE IN VARCHAR2,
 | 
			
		||||
        A_ATTACHING_RATE  OUT VARCHAR2,
 | 
			
		||||
        A_RENEWAL_RATE    OUT VARCHAR2,
 | 
			
		||||
        A_TOTAL           OUT INTEGER,
 | 
			
		||||
        A_MENSUAL_CUR     OUT CUR_TYPE
 | 
			
		||||
        A_DEPARTMENT_CODE       IN VARCHAR2,
 | 
			
		||||
        A_ATTACHING_RATE        OUT VARCHAR2,
 | 
			
		||||
        A_ATTACHING_RATE_TARGET OUT VARCHAR2,
 | 
			
		||||
        A_RENEWAL_RATE          OUT VARCHAR2,
 | 
			
		||||
        A_RENEWAL_RATE_TARGET   OUT VARCHAR2,
 | 
			
		||||
        A_TOTAL                 OUT INTEGER,
 | 
			
		||||
        A_MENSUAL_CUR           OUT CUR_TYPE
 | 
			
		||||
    ) IS
 | 
			
		||||
        --L_THIS_MONTH      VARCHAR2(4);
 | 
			
		||||
        --L_THIS_YEAR       VARCHAR2(4);
 | 
			
		||||
        L_FIRSTDAY        DATE;
 | 
			
		||||
        L_DEPARTMENT_NAME VARCHAR2(100);
 | 
			
		||||
        L_FIRSTDAY            DATE;
 | 
			
		||||
        L_DEPARTMENT_NAME     VARCHAR2(100);
 | 
			
		||||
        L_RENEWAL_RATE_TARGET NUMBER;
 | 
			
		||||
    BEGIN
 | 
			
		||||
        /*L_THIS_MONTH := TO_CHAR(SYSDATE,
 | 
			
		||||
                                'mm');
 | 
			
		||||
        L_THIS_YEAR  := TO_CHAR(SYSDATE,
 | 
			
		||||
                                'yyyy');*/
 | 
			
		||||
        L_FIRSTDAY := TO_DATE(TO_CHAR(SYSDATE,
 | 
			
		||||
                                      'yyyy') || '-01-01 00:00:00',
 | 
			
		||||
                              'yyyy-mm-dd hh24:mi:ss');
 | 
			
		||||
@@ -77,45 +77,62 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS
 | 
			
		||||
                RAISE_APPLICATION_ERROR(DEPARTMENTCODE_EXCEPTION_CODE,
 | 
			
		||||
                                        DEPARTMENTCODE_EXCEPTION_MSG);
 | 
			
		||||
        END;
 | 
			
		||||
        --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8>
 | 
			
		||||
        /*SELECT DECODE(SUM(CF.<2E><><EFBFBD>ո<EFBFBD><D5B8>˿ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>),
 | 
			
		||||
                     0,
 | 
			
		||||
                     0,
 | 
			
		||||
                     ROUND((SUM(CF.<2E><><EFBFBD><EFBFBD><EFBFBD>ںϱ<DABA><CFB1><EFBFBD>) / SUM(CF.<2E><><EFBFBD>ո<EFBFBD><D5B8>˿ͻ<CBBF><CDBB><EFBFBD><EFBFBD><EFBFBD>) * 100),
 | 
			
		||||
                           2))
 | 
			
		||||
         INTO A_ATTACHING_RATE
 | 
			
		||||
         FROM <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD>ÿ<EFBFBD>ձ<EFBFBD><D5B1><EFBFBD> CF
 | 
			
		||||
        WHERE CF.<2E>·<EFBFBD> = L_THIS_MONTH
 | 
			
		||||
          AND CF.<2E><><EFBFBD><EFBFBD> = L_THIS_YEAR
 | 
			
		||||
          AND <20><><EFBFBD>Ŵ<EFBFBD><EFBFBD><EFBFBD> = A_DEPARTMENT_CODE;*/
 | 
			
		||||
        SELECT round(dept.<2E><><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8>,
 | 
			
		||||
                     2)
 | 
			
		||||
          INTO A_ATTACHING_RATE
 | 
			
		||||
          FROM desktop_archievement_admin.BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> dept
 | 
			
		||||
         WHERE dept.<2E><><EFBFBD><EFBFBD> = L_DEPARTMENT_NAME;
 | 
			
		||||
        --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
        /*SELECT DECODE(SUM(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>),
 | 
			
		||||
                     0,
 | 
			
		||||
                     0,
 | 
			
		||||
                     ROUND(SUM(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>) / SUM(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) * 100,
 | 
			
		||||
                           2))
 | 
			
		||||
         INTO A_RENEWAL_RATE
 | 
			
		||||
         FROM <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>
 | 
			
		||||
        WHERE <20><><EFBFBD><EFBFBD> = L_DEPARTMENT_NAME;*/
 | 
			
		||||
        SELECT round(t."<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>ȫ<EFBFBD>£<EFBFBD>(%)",
 | 
			
		||||
                     2)
 | 
			
		||||
          INTO A_RENEWAL_RATE
 | 
			
		||||
          FROM BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><C2B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> t
 | 
			
		||||
         WHERE t.<2E><><EFBFBD>β<EFBFBD><EFBFBD><EFBFBD> = L_DEPARTMENT_NAME;
 | 
			
		||||
    
 | 
			
		||||
        --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8>&Ŀ<><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
        BEGIN
 | 
			
		||||
            SELECT ROUND(DEPT.<2E><><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8>,
 | 
			
		||||
                         2),
 | 
			
		||||
                   ROUND(DEPT.Ŀ<><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
 | 
			
		||||
                         2)
 | 
			
		||||
              INTO A_ATTACHING_RATE,
 | 
			
		||||
                   A_ATTACHING_RATE_TARGET
 | 
			
		||||
              FROM BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> DEPT
 | 
			
		||||
             WHERE DEPT.<2E><EFBFBD><EFBFBD><EFBFBD> = L_DEPARTMENT_NAME;
 | 
			
		||||
        
 | 
			
		||||
            --<2D><><EFBFBD><EFBFBD>round<6E><64><EFBFBD><EFBFBD>С<EFBFBD><D0A1>ȱ0<C8B1><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
            SELECT DECODE(SUBSTR(A_ATTACHING_RATE_TARGET,
 | 
			
		||||
                                 1,
 | 
			
		||||
                                 1),
 | 
			
		||||
                          '.',
 | 
			
		||||
                          '0' || A_ATTACHING_RATE_TARGET,
 | 
			
		||||
                          A_ATTACHING_RATE_TARGET)
 | 
			
		||||
              INTO A_ATTACHING_RATE_TARGET
 | 
			
		||||
              FROM DUAL;
 | 
			
		||||
        EXCEPTION
 | 
			
		||||
            WHEN NO_DATA_FOUND THEN
 | 
			
		||||
                A_ATTACHING_RATE        := '0.0';
 | 
			
		||||
                A_ATTACHING_RATE_TARGET := '0.0';
 | 
			
		||||
        END;
 | 
			
		||||
    
 | 
			
		||||
        --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>&Ŀ<><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
        BEGIN
 | 
			
		||||
            SELECT ROUND(t."<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>(%)",
 | 
			
		||||
                         2),
 | 
			
		||||
                   ROUND(t."<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>ʱ<EFBFBD><CAB1>(%)" - t."<22><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>ֵ1(%)",
 | 
			
		||||
                         2)
 | 
			
		||||
              INTO A_RENEWAL_RATE,
 | 
			
		||||
                   A_RENEWAL_RATE_TARGET
 | 
			
		||||
              FROM "BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>-24<32><34>" T
 | 
			
		||||
             WHERE T.<2E><><EFBFBD>β<EFBFBD><CEB2><EFBFBD> = L_DEPARTMENT_NAME;
 | 
			
		||||
        
 | 
			
		||||
            --<2D><><EFBFBD><EFBFBD>round<6E><64><EFBFBD><EFBFBD>С<EFBFBD><D0A1>ȱ0<C8B1><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
            SELECT DECODE(SUBSTR(A_RENEWAL_RATE_TARGET,
 | 
			
		||||
                                 1,
 | 
			
		||||
                                 1),
 | 
			
		||||
                          '.',
 | 
			
		||||
                          '0' || A_RENEWAL_RATE_TARGET,
 | 
			
		||||
                          A_RENEWAL_RATE_TARGET)
 | 
			
		||||
              INTO A_RENEWAL_RATE_TARGET
 | 
			
		||||
              FROM DUAL;
 | 
			
		||||
        EXCEPTION
 | 
			
		||||
            WHEN NO_DATA_FOUND THEN
 | 
			
		||||
                A_RENEWAL_RATE        := '0.0';
 | 
			
		||||
                A_RENEWAL_RATE_TARGET := '0.0';
 | 
			
		||||
        END;
 | 
			
		||||
    
 | 
			
		||||
        --<2D><>ҵ<EFBFBD><D2B5>
 | 
			
		||||
        SELECT ROUND(NVL(SUM(CF.<2E><><EFBFBD>ո<EFBFBD><D5B8>˿ͻ<CBBF><CDBB><EFBFBD><EFBFBD><EFBFBD> + CF.<2E><><EFBFBD><EFBFBD><EFBFBD>ںϱ<DABA><CFB1><EFBFBD>),
 | 
			
		||||
                         0),
 | 
			
		||||
                     0)
 | 
			
		||||
          INTO A_TOTAL
 | 
			
		||||
          FROM <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD>ÿ<EFBFBD>ձ<EFBFBD><D5B1><EFBFBD> CF
 | 
			
		||||
         WHERE <20><><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD> = A_DEPARTMENT_CODE
 | 
			
		||||
           AND ǩ<><C7A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> >= L_FIRSTDAY
 | 
			
		||||
           AND ǩ<><C7A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <= SYSDATE;
 | 
			
		||||
        A_TOTAL := 0;
 | 
			
		||||
    
 | 
			
		||||
        --ÿ<><C3BF>ҵ<EFBFBD><D2B5>
 | 
			
		||||
        OPEN A_MENSUAL_CUR FOR
 | 
			
		||||
            SELECT CF.<2E>·<EFBFBD> MM,
 | 
			
		||||
@@ -136,92 +153,90 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS
 | 
			
		||||
 | 
			
		||||
    /*******************************************************/
 | 
			
		||||
    -- <20><>ϯҵ<CFAF><D2B5>
 | 
			
		||||
    PROCEDURE caller_archievement
 | 
			
		||||
    PROCEDURE CALLER_ARCHIEVEMENT
 | 
			
		||||
    (
 | 
			
		||||
        a_caller_code    IN VARCHAR2,
 | 
			
		||||
        a_attaching_rate OUT VARCHAR2,
 | 
			
		||||
        a_renewal_rate   OUT VARCHAR2,
 | 
			
		||||
        a_total          OUT INTEGER,
 | 
			
		||||
        a_present_month  OUT NUMBER,
 | 
			
		||||
        a_mensual_cur    OUT cur_type
 | 
			
		||||
        A_CALLER_CODE    IN VARCHAR2,
 | 
			
		||||
        A_ATTACHING_RATE OUT VARCHAR2,
 | 
			
		||||
        A_RENEWAL_RATE   OUT VARCHAR2,
 | 
			
		||||
        A_TOTAL          OUT INTEGER,
 | 
			
		||||
        A_PRESENT_MONTH  OUT NUMBER,
 | 
			
		||||
        A_MENSUAL_CUR    OUT CUR_TYPE
 | 
			
		||||
    ) IS
 | 
			
		||||
        l_caller_name     VARCHAR2(100);
 | 
			
		||||
        l_department_name VARCHAR2(100);
 | 
			
		||||
        --l_this_month      VARCHAR2(4);
 | 
			
		||||
        l_this_year VARCHAR2(4);
 | 
			
		||||
        --l_firstday        DATE;
 | 
			
		||||
        l_rownum INTEGER;
 | 
			
		||||
        L_CALLER_NAME     VARCHAR2(100);
 | 
			
		||||
        L_DEPARTMENT_NAME VARCHAR2(100);
 | 
			
		||||
        L_THIS_YEAR       VARCHAR2(4);
 | 
			
		||||
        L_ROWNUM          INTEGER;
 | 
			
		||||
    BEGIN
 | 
			
		||||
        --<2D><>ѯ<EFBFBD><D1AF>ϯ<EFBFBD><CFAF><EFBFBD>ƣ<EFBFBD><C6A3>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD>
 | 
			
		||||
        BEGIN
 | 
			
		||||
            /*SELECT zx.saler_name,
 | 
			
		||||
                  bm.department_name
 | 
			
		||||
             INTO l_caller_name,
 | 
			
		||||
                  l_department_name
 | 
			
		||||
             FROM tele_saler      zx,
 | 
			
		||||
                  tele_saler_team team,
 | 
			
		||||
                  idst0.bm_t      bm
 | 
			
		||||
            WHERE zx.saler_code = a_caller_code
 | 
			
		||||
              AND zx.team_code = team.team_code
 | 
			
		||||
              AND team.department_code = bm.department_code;*/
 | 
			
		||||
            SELECT ry.<2E><>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>,
 | 
			
		||||
                   bm.department_name
 | 
			
		||||
              INTO l_caller_name,
 | 
			
		||||
                   l_department_name
 | 
			
		||||
              FROM twr_telsaler      ry,
 | 
			
		||||
                   twr_telsaler_team team,
 | 
			
		||||
                   idst0.bm_t        bm
 | 
			
		||||
             WHERE ry.<2E>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD><EFBFBD> = team.team_name
 | 
			
		||||
               AND team.department_code = bm.department_code
 | 
			
		||||
               AND ry.<2E><>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD> = a_caller_code;
 | 
			
		||||
            SELECT ZX.<2E><>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>,
 | 
			
		||||
                   BM.DEPARTMENT_NAME
 | 
			
		||||
              INTO L_CALLER_NAME,
 | 
			
		||||
                   L_DEPARTMENT_NAME
 | 
			
		||||
              FROM TWR_TELSALER      ZX,
 | 
			
		||||
                   TWR_TELSALER_TEAM T,
 | 
			
		||||
                   IDST0.BM_T        BM
 | 
			
		||||
             WHERE ZX.<2E><>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD> = A_CALLER_CODE
 | 
			
		||||
               AND ZX.<2E>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD><EFBFBD> = T.TEAM_NAME
 | 
			
		||||
               AND T.DEPARTMENT_CODE = BM.DEPARTMENT_CODE;
 | 
			
		||||
        EXCEPTION
 | 
			
		||||
            -- <20><><EFBFBD><EFBFBD>û<EFBFBD>в<EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD>ƣ<EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׳<EFBFBD><D7B3>쳣
 | 
			
		||||
            WHEN no_data_found THEN
 | 
			
		||||
                raise_application_error(CALLERCODE_EXCEPTION_CODE,
 | 
			
		||||
            WHEN NO_DATA_FOUND THEN
 | 
			
		||||
                RAISE_APPLICATION_ERROR(CALLERCODE_EXCEPTION_CODE,
 | 
			
		||||
                                        CALLERCODE_EXCEPTION_MSG);
 | 
			
		||||
        END;
 | 
			
		||||
    
 | 
			
		||||
        --l_this_month := to_char(SYSDATE,
 | 
			
		||||
        --                        'mm');
 | 
			
		||||
        l_this_year := to_char(SYSDATE,
 | 
			
		||||
        L_THIS_YEAR := TO_CHAR(SYSDATE,
 | 
			
		||||
                               'yyyy');
 | 
			
		||||
        --l_firstday   := to_date(l_this_year || '-01-01 00:00:00',
 | 
			
		||||
        --                        'yyyy-mm-dd hh24:mi:ss');
 | 
			
		||||
    
 | 
			
		||||
        --<2D>ܳ<EFBFBD><DCB3>ձ<EFBFBD><D5B1><EFBFBD>
 | 
			
		||||
        SELECT round(nvl(SUM(cf.<2E><><EFBFBD>ո<EFBFBD><D5B8>˿ͻ<CBBF><CDBB><EFBFBD><EFBFBD><EFBFBD>),
 | 
			
		||||
        SELECT ROUND(NVL(SUM(CF.<2E><><EFBFBD>ո<EFBFBD><D5B8>˿ͻ<CBBF><CDBB><EFBFBD><EFBFBD><EFBFBD>),
 | 
			
		||||
                         0),
 | 
			
		||||
                     2) bf
 | 
			
		||||
          INTO a_total
 | 
			
		||||
          FROM <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD>ÿ<EFBFBD>ձ<EFBFBD><D5B1><EFBFBD> cf
 | 
			
		||||
         WHERE cf.<2E><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD> = l_caller_name
 | 
			
		||||
           AND cf.<2E><><EFBFBD><EFBFBD> = l_department_name
 | 
			
		||||
           AND cf.<2E><><EFBFBD><EFBFBD> = l_this_year;
 | 
			
		||||
                     2) BF
 | 
			
		||||
          INTO A_TOTAL
 | 
			
		||||
          FROM <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD>ÿ<EFBFBD>ձ<EFBFBD><D5B1><EFBFBD> CF
 | 
			
		||||
         WHERE CF.<2E><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD> = L_CALLER_NAME
 | 
			
		||||
           AND CF.<2E><><EFBFBD><EFBFBD> = L_DEPARTMENT_NAME
 | 
			
		||||
           AND CF.<2E><><EFBFBD><EFBFBD> = L_THIS_YEAR;
 | 
			
		||||
    
 | 
			
		||||
        --<2D><><EFBFBD><CDB8>
 | 
			
		||||
        SELECT rownum,
 | 
			
		||||
               round(nvl(t.<2E><><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8>,
 | 
			
		||||
                         0),
 | 
			
		||||
                     2),
 | 
			
		||||
               round(nvl(t."<22><><EFBFBD>ձ<EFBFBD><D5B1><EFBFBD>(<28><>)" * 10000,
 | 
			
		||||
                         0),
 | 
			
		||||
                     2)
 | 
			
		||||
          INTO l_rownum,
 | 
			
		||||
               a_attaching_rate,
 | 
			
		||||
               a_present_month
 | 
			
		||||
          FROM BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> t
 | 
			
		||||
         WHERE t.<2E><><EFBFBD><EFBFBD> = l_caller_name
 | 
			
		||||
           AND rownum = 1;
 | 
			
		||||
        BEGIN
 | 
			
		||||
            SELECT ROWNUM,
 | 
			
		||||
                   ROUND(NVL(T.<2E><><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8>,
 | 
			
		||||
                             0),
 | 
			
		||||
                         2),
 | 
			
		||||
                   ROUND(NVL(t."<22><><EFBFBD>ձ<EFBFBD><D5B1><EFBFBD>(<28><>)" * 10000,
 | 
			
		||||
                             0),
 | 
			
		||||
                         2)
 | 
			
		||||
              INTO L_ROWNUM,
 | 
			
		||||
                   A_ATTACHING_RATE,
 | 
			
		||||
                   A_PRESENT_MONTH
 | 
			
		||||
              FROM BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> T
 | 
			
		||||
             WHERE T.<2E><><EFBFBD><EFBFBD> = L_CALLER_NAME
 | 
			
		||||
               AND ROWNUM = 1;
 | 
			
		||||
        EXCEPTION
 | 
			
		||||
            WHEN NO_DATA_FOUND THEN
 | 
			
		||||
                L_ROWNUM         := 1;
 | 
			
		||||
                A_ATTACHING_RATE := 0.0;
 | 
			
		||||
                A_PRESENT_MONTH  := 0.0;
 | 
			
		||||
        END;
 | 
			
		||||
    
 | 
			
		||||
        --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
        SELECT rownum,
 | 
			
		||||
               round(nvl(t."<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>ȫ<EFBFBD>£<EFBFBD>(%)",
 | 
			
		||||
                         0),
 | 
			
		||||
                     2)
 | 
			
		||||
          INTO l_rownum,
 | 
			
		||||
               a_renewal_rate
 | 
			
		||||
          FROM BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> t
 | 
			
		||||
         WHERE t.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = l_caller_name
 | 
			
		||||
           AND rownum = 1;
 | 
			
		||||
        BEGIN
 | 
			
		||||
            SELECT ROWNUM,
 | 
			
		||||
                   ROUND(NVL(t."<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>ȫ<EFBFBD>£<EFBFBD>(%)",
 | 
			
		||||
                             0),
 | 
			
		||||
                         2)
 | 
			
		||||
              INTO L_ROWNUM,
 | 
			
		||||
                   A_RENEWAL_RATE
 | 
			
		||||
              FROM "BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>-24<32><34>" T
 | 
			
		||||
             WHERE T.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = L_CALLER_NAME
 | 
			
		||||
               AND ROWNUM = 1;
 | 
			
		||||
        EXCEPTION
 | 
			
		||||
            WHEN NO_DATA_FOUND THEN
 | 
			
		||||
                L_ROWNUM       := 1;
 | 
			
		||||
                A_RENEWAL_RATE := 0.0;
 | 
			
		||||
        END;
 | 
			
		||||
    
 | 
			
		||||
        --ÿ<><C3BF>ҵ<EFBFBD><D2B5>
 | 
			
		||||
        OPEN A_MENSUAL_CUR FOR
 | 
			
		||||
@@ -230,8 +245,8 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS
 | 
			
		||||
                             0),
 | 
			
		||||
                         0) BF
 | 
			
		||||
              FROM <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD>ÿ<EFBFBD>ձ<EFBFBD><D5B1><EFBFBD> CF
 | 
			
		||||
             WHERE cf.<2E><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD> = l_caller_name
 | 
			
		||||
               AND cf.<2E><><EFBFBD><EFBFBD> = l_department_name
 | 
			
		||||
             WHERE CF.<2E><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD> = L_CALLER_NAME
 | 
			
		||||
               AND CF.<2E><><EFBFBD><EFBFBD> = L_DEPARTMENT_NAME
 | 
			
		||||
               AND ǩ<><C7A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> >= TO_DATE(TO_CHAR(SYSDATE,
 | 
			
		||||
                                           'yyyy') || '-01-01 00:00:00',
 | 
			
		||||
                                   'yyyy-mm-dd hh24:mi:ss')
 | 
			
		||||
@@ -266,54 +281,27 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS
 | 
			
		||||
        END;
 | 
			
		||||
        -- <20><><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><DABA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD>
 | 
			
		||||
        OPEN A_ATTACHING_RANKING_LIST FOR
 | 
			
		||||
            SELECT rownum,
 | 
			
		||||
                   paihang.<2E><><EFBFBD><EFBFBD> AS caller_name,
 | 
			
		||||
                   paihang.attaching_rate
 | 
			
		||||
              FROM (SELECT DISTINCT *
 | 
			
		||||
                      FROM (SELECT t.<2E><><EFBFBD><EFBFBD>,
 | 
			
		||||
                                   round(t.<2E><><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8>,
 | 
			
		||||
                                         2) attaching_rate,
 | 
			
		||||
                                   zuoxi.department_name
 | 
			
		||||
                              FROM BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> t,
 | 
			
		||||
                                   (SELECT DISTINCT t.saler_code,
 | 
			
		||||
                                                    t.saler_name,
 | 
			
		||||
                                                    t.team_code,
 | 
			
		||||
                                                    team.team,
 | 
			
		||||
                                                    bm.department_name
 | 
			
		||||
                                      FROM tele_saler      t,
 | 
			
		||||
                                           tele_saler_team team,
 | 
			
		||||
                                           idst0.bm_t      bm
 | 
			
		||||
                                     WHERE t.team_code = team.team_code
 | 
			
		||||
                                       AND team.department_code = bm.department_code
 | 
			
		||||
                                       AND bm.department_name = L_DEPARTMENT_NAME) zuoxi
 | 
			
		||||
                             WHERE t.<2E><><EFBFBD><EFBFBD> = zuoxi.saler_name) st
 | 
			
		||||
                     ORDER BY st.department_name,
 | 
			
		||||
                              st.attaching_rate DESC) paihang;
 | 
			
		||||
            SELECT ROWNUM,
 | 
			
		||||
                   PAIHANG.<2E><><EFBFBD><EFBFBD> AS CALLER_NAME,
 | 
			
		||||
                   PAIHANG.XBL  AS ATTACHING_RATE
 | 
			
		||||
              FROM (SELECT T.<2E><><EFBFBD><EFBFBD>,
 | 
			
		||||
                           ROUND(T.<2E><><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
 | 
			
		||||
                                 2) XBL
 | 
			
		||||
                      FROM BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> T
 | 
			
		||||
                     WHERE T.<2E><><EFBFBD><EFBFBD> = L_DEPARTMENT_NAME
 | 
			
		||||
                     ORDER BY T.<2E><><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8> DESC) PAIHANG;
 | 
			
		||||
    
 | 
			
		||||
        -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD>
 | 
			
		||||
        OPEN A_RENEWAL_RANKING_LIST FOR
 | 
			
		||||
            SELECT rownum,
 | 
			
		||||
                   paihang.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AS CALLER_NAME,
 | 
			
		||||
                   paihang.xbl    AS RENEWAL_RATE
 | 
			
		||||
              FROM (SELECT DISTINCT *
 | 
			
		||||
                      FROM (SELECT t.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
 | 
			
		||||
                                   round(t."<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>ȫ<EFBFBD>£<EFBFBD>(%)",
 | 
			
		||||
                                         2) xbl,
 | 
			
		||||
                                   zuoxi.department_name
 | 
			
		||||
                              FROM BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> t,
 | 
			
		||||
                                   (SELECT DISTINCT t.saler_code,
 | 
			
		||||
                                                    t.saler_name,
 | 
			
		||||
                                                    t.team_code,
 | 
			
		||||
                                                    team.team,
 | 
			
		||||
                                                    bm.department_name
 | 
			
		||||
                                      FROM tele_saler      t,
 | 
			
		||||
                                           tele_saler_team team,
 | 
			
		||||
                                           idst0.bm_t      bm
 | 
			
		||||
                                     WHERE t.team_code = team.team_code
 | 
			
		||||
                                       AND team.department_code = bm.department_code
 | 
			
		||||
                                       AND bm.department_name = L_DEPARTMENT_NAME) zuoxi
 | 
			
		||||
                             WHERE t.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = zuoxi.saler_name) xb
 | 
			
		||||
                     ORDER BY xb.department_name,
 | 
			
		||||
                              xb.xbl DESC) paihang;
 | 
			
		||||
            SELECT ROWNUM,
 | 
			
		||||
                   PAIHANG.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AS CALLER_NAME,
 | 
			
		||||
                   PAIHANG.XBL    AS RENEWAL_RATE
 | 
			
		||||
              FROM (SELECT T.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
 | 
			
		||||
                           ROUND(t."<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>ȫ<EFBFBD>£<EFBFBD>(%)",
 | 
			
		||||
                                 2) XBL
 | 
			
		||||
                      FROM "BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>-24<32><34>" T
 | 
			
		||||
                     WHERE T.<2E><><EFBFBD>β<EFBFBD><CEB2><EFBFBD> = L_DEPARTMENT_NAME
 | 
			
		||||
                     ORDER BY XBL DESC) PAIHANG;
 | 
			
		||||
    END;
 | 
			
		||||
BEGIN
 | 
			
		||||
    NULL;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
CREATE OR REPLACE PACKAGE telsale_bi_utils IS
 | 
			
		||||
CREATE OR REPLACE PACKAGE TELSALE_BI_UTILS IS
 | 
			
		||||
 | 
			
		||||
    -- Author  : WANGWEI-202
 | 
			
		||||
    -- Created : 2023/10/12 15:31:13
 | 
			
		||||
@@ -12,9 +12,9 @@ CREATE OR REPLACE PACKAGE telsale_bi_utils IS
 | 
			
		||||
 | 
			
		||||
    PROCEDURE <20><><EFBFBD><EFBFBD>BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>;
 | 
			
		||||
 | 
			
		||||
END telsale_bi_utils;
 | 
			
		||||
END TELSALE_BI_UTILS;
 | 
			
		||||
/
 | 
			
		||||
CREATE OR REPLACE PACKAGE BODY telsale_bi_utils IS
 | 
			
		||||
CREATE OR REPLACE PACKAGE BODY TELSALE_BI_UTILS IS
 | 
			
		||||
 | 
			
		||||
    PROCEDURE <20><><EFBFBD><EFBFBD>BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> IS
 | 
			
		||||
    BEGIN
 | 
			
		||||
@@ -23,7 +23,8 @@ CREATE OR REPLACE PACKAGE BODY telsale_bi_utils IS
 | 
			
		||||
 | 
			
		||||
    PROCEDURE <20><><EFBFBD><EFBFBD>BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> IS
 | 
			
		||||
    BEGIN
 | 
			
		||||
        EXECUTE IMMEDIATE 'truncate table BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>';
 | 
			
		||||
        --EXECUTE IMMEDIATE 'truncate table BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>';
 | 
			
		||||
        EXECUTE IMMEDIATE 'truncate table "BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>-24<32><34>"';
 | 
			
		||||
    END;
 | 
			
		||||
 | 
			
		||||
    PROCEDURE <20><><EFBFBD><EFBFBD>BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> IS
 | 
			
		||||
@@ -33,11 +34,12 @@ CREATE OR REPLACE PACKAGE BODY telsale_bi_utils IS
 | 
			
		||||
 | 
			
		||||
    PROCEDURE <20><><EFBFBD><EFBFBD>BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> IS
 | 
			
		||||
    BEGIN
 | 
			
		||||
        EXECUTE IMMEDIATE 'truncate table BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><C2B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>';
 | 
			
		||||
        --EXECUTE IMMEDIATE 'truncate table BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><C2B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>';
 | 
			
		||||
        EXECUTE IMMEDIATE 'truncate table "BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>-24<32><34>"';
 | 
			
		||||
    END;
 | 
			
		||||
 | 
			
		||||
BEGIN
 | 
			
		||||
    -- Initialization
 | 
			
		||||
    NULL;
 | 
			
		||||
END telsale_bi_utils;
 | 
			
		||||
END TELSALE_BI_UTILS;
 | 
			
		||||
/
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										45
									
								
								code/db/pkg/telsale_bi_utils_dev.pck
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								code/db/pkg/telsale_bi_utils_dev.pck
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
CREATE OR REPLACE PACKAGE TELSALE_BI_UTILS_DEV IS
 | 
			
		||||
 | 
			
		||||
    -- Author  : WANGWEI-202
 | 
			
		||||
    -- Created : 2023/10/12 15:31:13
 | 
			
		||||
    -- Purpose : bi<62><69><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صĹ<D8B5><C4B9><EFBFBD>
 | 
			
		||||
 | 
			
		||||
    PROCEDURE <20><><EFBFBD><EFBFBD>BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>;
 | 
			
		||||
 | 
			
		||||
    PROCEDURE <20><><EFBFBD><EFBFBD>BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>;
 | 
			
		||||
 | 
			
		||||
    PROCEDURE <20><><EFBFBD><EFBFBD>BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>;
 | 
			
		||||
 | 
			
		||||
    PROCEDURE <20><><EFBFBD><EFBFBD>BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>;
 | 
			
		||||
 | 
			
		||||
END TELSALE_BI_UTILS_DEV;
 | 
			
		||||
/
 | 
			
		||||
CREATE OR REPLACE PACKAGE BODY TELSALE_BI_UTILS_DEV IS
 | 
			
		||||
 | 
			
		||||
    PROCEDURE <20><><EFBFBD><EFBFBD>BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> IS
 | 
			
		||||
    BEGIN
 | 
			
		||||
        EXECUTE IMMEDIATE 'truncate table BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>';
 | 
			
		||||
    END;
 | 
			
		||||
 | 
			
		||||
    PROCEDURE <20><><EFBFBD><EFBFBD>BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> IS
 | 
			
		||||
    BEGIN
 | 
			
		||||
        --EXECUTE IMMEDIATE 'truncate table BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>';
 | 
			
		||||
        EXECUTE IMMEDIATE 'truncate table "BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>-24<32><34>"';
 | 
			
		||||
    END;
 | 
			
		||||
 | 
			
		||||
    PROCEDURE <20><><EFBFBD><EFBFBD>BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> IS
 | 
			
		||||
    BEGIN
 | 
			
		||||
        EXECUTE IMMEDIATE 'truncate table BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>';
 | 
			
		||||
    END;
 | 
			
		||||
 | 
			
		||||
    PROCEDURE <20><><EFBFBD><EFBFBD>BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD> IS
 | 
			
		||||
    BEGIN
 | 
			
		||||
        --EXECUTE IMMEDIATE 'truncate table BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><C2B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>';
 | 
			
		||||
        EXECUTE IMMEDIATE 'truncate table "BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ٱ<EFBFBD>-24<32><34>"';
 | 
			
		||||
    END;
 | 
			
		||||
 | 
			
		||||
BEGIN
 | 
			
		||||
    -- Initialization
 | 
			
		||||
    NULL;
 | 
			
		||||
END TELSALE_BI_UTILS_DEV;
 | 
			
		||||
/
 | 
			
		||||
							
								
								
									
										3
									
								
								code/db/宽表.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								code/db/宽表.sql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
SELECT * FROM datacenter.kx_bi_c_kb_qd WHERE <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> >= DATE '2023-01-01';
 | 
			
		||||
 | 
			
		||||
SELECT * FROM <EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD>ձ<EFBFBD><EFBFBD><EFBFBD> CF WHERE <EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> = '<EFBFBD><EFBFBD><EFBFBD><EFBFBD>' ORDER BY ǩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DESC;
 | 
			
		||||
@@ -1,30 +1,30 @@
 | 
			
		||||
SELECT *
 | 
			
		||||
  FROM reward_gainers
 | 
			
		||||
  FROM REWARD_GAINERS
 | 
			
		||||
   FOR UPDATE;
 | 
			
		||||
 | 
			
		||||
SELECT b.reward_name,
 | 
			
		||||
       a.*
 | 
			
		||||
  FROM reward_gainers  a,
 | 
			
		||||
       reward_projects b
 | 
			
		||||
 WHERE a.reward_index = b.reward_index;
 | 
			
		||||
SELECT B.REWARD_NAME,
 | 
			
		||||
       A.*
 | 
			
		||||
  FROM REWARD_GAINERS  A,
 | 
			
		||||
       REWARD_PROJECTS B
 | 
			
		||||
 WHERE A.REWARD_INDEX = B.REWARD_INDEX;
 | 
			
		||||
 | 
			
		||||
--<EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
SELECT DISTINCT s.saler_code,
 | 
			
		||||
                s.saler_name,
 | 
			
		||||
                t.team_code,
 | 
			
		||||
                t.team,
 | 
			
		||||
                bm.department_code,
 | 
			
		||||
                bm.department_name
 | 
			
		||||
  FROM tele_saler      s,
 | 
			
		||||
       tele_saler_team t,
 | 
			
		||||
       idst0.bm_t      bm
 | 
			
		||||
 WHERE s.team_code = t.team_code
 | 
			
		||||
   AND t.department_code = bm.department_code
 | 
			
		||||
   AND s.saler_code = '61136';
 | 
			
		||||
SELECT DISTINCT S.SALER_CODE,
 | 
			
		||||
                S.SALER_NAME,
 | 
			
		||||
                T.TEAM_CODE,
 | 
			
		||||
                T.TEAM,
 | 
			
		||||
                BM.DEPARTMENT_CODE,
 | 
			
		||||
                BM.DEPARTMENT_NAME
 | 
			
		||||
  FROM TELE_SALER      S,
 | 
			
		||||
       TELE_SALER_TEAM T,
 | 
			
		||||
       IDST0.BM_T      BM
 | 
			
		||||
 WHERE S.TEAM_CODE = T.TEAM_CODE
 | 
			
		||||
   AND T.DEPARTMENT_CODE = BM.DEPARTMENT_CODE
 | 
			
		||||
   AND S.SALER_CODE = '61136';
 | 
			
		||||
 | 
			
		||||
SELECT *
 | 
			
		||||
  FROM tele_saler_team t
 | 
			
		||||
 WHERE t.team_code = '107077'
 | 
			
		||||
  FROM TELE_SALER_TEAM T
 | 
			
		||||
 WHERE T.TEAM_CODE = '107077'
 | 
			
		||||
 | 
			
		||||
    SELECT *
 | 
			
		||||
            FROM <EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD>ձ<EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
@@ -35,7 +35,7 @@ SELECT *
 | 
			
		||||
SELECT <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
 | 
			
		||||
       SUM(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
 | 
			
		||||
       SUM(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD>,
 | 
			
		||||
       round((SUM(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>) / SUM(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)) * 100,
 | 
			
		||||
       ROUND((SUM(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>) / SUM(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)) * 100,
 | 
			
		||||
             0) || '%' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
  FROM <EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><EFBFBD>
 | 
			
		||||
 GROUP BY <EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
 | 
			
		||||
@@ -46,7 +46,7 @@ SELECT 
 | 
			
		||||
       <EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
 | 
			
		||||
       SUM(<EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD><EFBFBD>˿ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>),
 | 
			
		||||
       SUM(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ںϱ<EFBFBD><EFBFBD><EFBFBD>),
 | 
			
		||||
       round(SUM(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ںϱ<EFBFBD><EFBFBD><EFBFBD>) / SUM(<EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD><EFBFBD>˿ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) * 100,
 | 
			
		||||
       ROUND(SUM(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ںϱ<EFBFBD><EFBFBD><EFBFBD>) / SUM(<EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD><EFBFBD>˿ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) * 100,
 | 
			
		||||
             2) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
  FROM <EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD>ձ<EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
 GROUP BY <EFBFBD>·<EFBFBD>,
 | 
			
		||||
@@ -57,7 +57,7 @@ HAVING 
 | 
			
		||||
          <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DESC;
 | 
			
		||||
 | 
			
		||||
SELECT <EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
 | 
			
		||||
       round(SUM(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ںϱ<EFBFBD><EFBFBD><EFBFBD>) / SUM(<EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD><EFBFBD>˿ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) * 100,
 | 
			
		||||
       ROUND(SUM(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ںϱ<EFBFBD><EFBFBD><EFBFBD>) / SUM(<EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD><EFBFBD>˿ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) * 100,
 | 
			
		||||
             2) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
  FROM <EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD>ձ<EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
 WHERE <EFBFBD><EFBFBD><EFBFBD>Ŵ<EFBFBD><EFBFBD><EFBFBD> = 'QDI'
 | 
			
		||||
@@ -68,37 +68,37 @@ SELECT 
 | 
			
		||||
 | 
			
		||||
--<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
SELECT <EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
 | 
			
		||||
       round(nvl(SUM(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>) / SUM(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) * 100,
 | 
			
		||||
       ROUND(NVL(SUM(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>) / SUM(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) * 100,
 | 
			
		||||
                 0),
 | 
			
		||||
             2) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
  FROM <EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><EFBFBD> xb
 | 
			
		||||
 WHERE xb.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> = '<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>'
 | 
			
		||||
  FROM <EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><EFBFBD> XB
 | 
			
		||||
 WHERE XB.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> = '<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>'
 | 
			
		||||
 GROUP BY <EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
 ORDER BY <EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> DESC;
 | 
			
		||||
-------------------------------------
 | 
			
		||||
SELECT zx.saler_name,
 | 
			
		||||
       bm.department_name
 | 
			
		||||
  FROM tele_saler      zx,
 | 
			
		||||
       tele_saler_team team,
 | 
			
		||||
       idst0.bm_t      bm
 | 
			
		||||
 WHERE zx.saler_name = '<EFBFBD>ų<EFBFBD><EFBFBD><EFBFBD>'
 | 
			
		||||
   AND zx.team_code = team.team_code
 | 
			
		||||
   AND team.department_code = bm.department_code;
 | 
			
		||||
SELECT ZX.SALER_NAME,
 | 
			
		||||
       BM.DEPARTMENT_NAME
 | 
			
		||||
  FROM TELE_SALER      ZX,
 | 
			
		||||
       TELE_SALER_TEAM TEAM,
 | 
			
		||||
       IDST0.BM_T      BM
 | 
			
		||||
 WHERE ZX.SALER_NAME = '<EFBFBD>ų<EFBFBD><EFBFBD><EFBFBD>'
 | 
			
		||||
   AND ZX.TEAM_CODE = TEAM.TEAM_CODE
 | 
			
		||||
   AND TEAM.DEPARTMENT_CODE = BM.DEPARTMENT_CODE;
 | 
			
		||||
----------------------------------------
 | 
			
		||||
/*
 | 
			
		||||
truncate table BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><EFBFBD>ٱ<EFBFBD>;
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
SELECT *
 | 
			
		||||
  FROM BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><EFBFBD>ٱ<EFBFBD> t
 | 
			
		||||
 WHERE t.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> = '<EFBFBD>ų<EFBFBD><EFBFBD><EFBFBD>';
 | 
			
		||||
  FROM BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><EFBFBD>ٱ<EFBFBD> T
 | 
			
		||||
 WHERE T.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> = '<EFBFBD><EFBFBD><EFBFBD><EFBFBD>';
 | 
			
		||||
 | 
			
		||||
SELECT *
 | 
			
		||||
  FROM BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><EFBFBD>ٱ<EFBFBD>
 | 
			
		||||
 WHERE <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = '<EFBFBD>ų<EFBFBD><EFBFBD><EFBFBD>';
 | 
			
		||||
  FROM "BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><EFBFBD>ٱ<EFBFBD>-24<32><34>"
 | 
			
		||||
 WHERE <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = '<EFBFBD><EFBFBD><EFBFBD><EFBFBD>';
 | 
			
		||||
 | 
			
		||||
SELECT *
 | 
			
		||||
  FROM BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><EFBFBD>ٱ<EFBFBD>;
 | 
			
		||||
 | 
			
		||||
SELECT *
 | 
			
		||||
  FROM BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><EFBFBD>ٱ<EFBFBD>;
 | 
			
		||||
  FROM "BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><EFBFBD>ٱ<EFBFBD>-24<32><34>";
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								code/web/task_schedule/pack.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								code/web/task_schedule/pack.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
npm uninstall `
 | 
			
		||||
@babel/eslint-parser `
 | 
			
		||||
@rushstack/eslint-patch `
 | 
			
		||||
@typescript-eslint/eslint-plugin `
 | 
			
		||||
@vitejs/plugin-vue `
 | 
			
		||||
@vue/cli-plugin-eslint `
 | 
			
		||||
@vue/eslint-config-typescript `
 | 
			
		||||
babel `
 | 
			
		||||
eslint-config-recommended `
 | 
			
		||||
eslint-config-standard-with-typescript `
 | 
			
		||||
eslint-plugin-vue `
 | 
			
		||||
node-sass `
 | 
			
		||||
sass `
 | 
			
		||||
sass-loader `
 | 
			
		||||
style-loader `
 | 
			
		||||
ts-node `
 | 
			
		||||
vue-eslint-parser
 | 
			
		||||
							
								
								
									
										40
									
								
								code/web/task_schedule/package copy.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								code/web/task_schedule/package copy.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "task_schedule",
 | 
			
		||||
  "private": true,
 | 
			
		||||
  "version": "0.0.0",
 | 
			
		||||
  "type": "module",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "dev": "vite",
 | 
			
		||||
    "build": "vite build",
 | 
			
		||||
    "preview": "vite preview"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@element-plus/icons-vue": "^2.3.1",
 | 
			
		||||
    "echarts": "^5.4.3",
 | 
			
		||||
    "element-plus": "^2.5.3",
 | 
			
		||||
    "mitt": "^3.0.1",
 | 
			
		||||
    "moment": "^2.30.1",
 | 
			
		||||
    "vue": "^3.4.15",
 | 
			
		||||
    "vue-router": "^4.2.5",
 | 
			
		||||
    "vuex": "^4.1.0"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@babel/eslint-parser": "^7.23.3",
 | 
			
		||||
    "@rushstack/eslint-patch": "^1.7.1",
 | 
			
		||||
    "@typescript-eslint/eslint-plugin": "^6.19.1",
 | 
			
		||||
    "@vitejs/plugin-vue": "^5.0.3",
 | 
			
		||||
    "@vue/cli-plugin-eslint": "^5.0.8",
 | 
			
		||||
    "@vue/eslint-config-typescript": "^12.0.0",
 | 
			
		||||
    "axios": "^1.6.6",
 | 
			
		||||
    "babel": "^6.23.0",
 | 
			
		||||
    "eslint-config-recommended": "^4.1.0",
 | 
			
		||||
    "eslint-config-standard-with-typescript": "^43.0.1",
 | 
			
		||||
    "eslint-plugin-vue": "^9.20.1",
 | 
			
		||||
    "node-sass": "^9.0.0",
 | 
			
		||||
    "sass": "^1.70.0",
 | 
			
		||||
    "sass-loader": "^14.0.0",
 | 
			
		||||
    "style-loader": "^3.3.4",
 | 
			
		||||
    "ts-node": "^10.9.2",
 | 
			
		||||
    "vue-eslint-parser": "^9.4.2"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11486
									
								
								code/web/task_schedule/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										11486
									
								
								code/web/task_schedule/package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -9,32 +9,22 @@
 | 
			
		||||
    "preview": "vite preview"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@element-plus/icons-vue": "^2.3.1",
 | 
			
		||||
    "echarts": "^5.4.3",
 | 
			
		||||
    "element-plus": "^2.4.3",
 | 
			
		||||
    "@element-plus/icons-vue": "^2.3.2",
 | 
			
		||||
    "axios": "^1.11.0",
 | 
			
		||||
    "echarts": "^6.0.0",
 | 
			
		||||
    "element-plus": "^2.11.1",
 | 
			
		||||
    "mitt": "^3.0.1",
 | 
			
		||||
    "moment": "^2.29.4",
 | 
			
		||||
    "sass-loader": "^13.3.2",
 | 
			
		||||
    "vue": "^3.3.11",
 | 
			
		||||
    "vue-router": "^4.2.5",
 | 
			
		||||
    "moment": "^2.30.1",
 | 
			
		||||
    "task_schedule": "file:",
 | 
			
		||||
    "vue": "^3.5.21",
 | 
			
		||||
    "vue-router": "^4.5.1",
 | 
			
		||||
    "vuex": "^4.1.0"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@babel/eslint-parser": "^7.23.3",
 | 
			
		||||
    "@rushstack/eslint-patch": "^1.6.0",
 | 
			
		||||
    "@typescript-eslint/eslint-plugin": "^6.13.2",
 | 
			
		||||
    "@vitejs/plugin-vue": "^4.5.2",
 | 
			
		||||
    "@vue/cli-plugin-eslint": "^5.0.8",
 | 
			
		||||
    "@vue/eslint-config-typescript": "^12.0.0",
 | 
			
		||||
    "axios": "^1.6.2",
 | 
			
		||||
    "babel": "^6.23.0",
 | 
			
		||||
    "@vitejs/plugin-vue": "^6.0.1",
 | 
			
		||||
    "eslint-config-recommended": "^4.1.0",
 | 
			
		||||
    "eslint-config-standard-with-typescript": "^42.0.0",
 | 
			
		||||
    "eslint-plugin-vue": "^9.19.2",
 | 
			
		||||
    "node-sass": "^9.0.0",
 | 
			
		||||
    "sass": "^1.69.5",
 | 
			
		||||
    "style-loader": "^3.3.3",
 | 
			
		||||
    "ts-node": "^10.9.2",
 | 
			
		||||
    "vue-eslint-parser": "^9.3.2"
 | 
			
		||||
    "eslint-config-standard-with-typescript": "^43.0.1",
 | 
			
		||||
    "eslint-plugin-vue": "^10.4.0",
 | 
			
		||||
    "ts-node": "^10.9.2"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -12,18 +12,18 @@
 | 
			
		||||
        <el-progress
 | 
			
		||||
            type="circle"
 | 
			
		||||
            :percentage="ui.percentage"
 | 
			
		||||
            status="success"
 | 
			
		||||
            :status="ui.warningLevel"
 | 
			
		||||
        >
 | 
			
		||||
            <template #default>
 | 
			
		||||
                <span class="percentage-label">{{ ui.indicator }}</span>
 | 
			
		||||
                <span class="percentage-value">{{ percentage }}%</span>
 | 
			
		||||
                <span :class="warningLevelClass">{{ percentage }}%</span>
 | 
			
		||||
            </template>
 | 
			
		||||
        </el-progress>
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import { reactive } from "vue";
 | 
			
		||||
import { reactive, computed } from "vue";
 | 
			
		||||
export default {
 | 
			
		||||
    name: "ArchievementCompleteRateComponent",
 | 
			
		||||
    props: {
 | 
			
		||||
@@ -36,17 +36,42 @@ export default {
 | 
			
		||||
            type: String,
 | 
			
		||||
            default: "",
 | 
			
		||||
        },
 | 
			
		||||
        warningLevel: { // 警告等级
 | 
			
		||||
            type: String,
 | 
			
		||||
            default: "success",
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    setup( props )
 | 
			
		||||
    {
 | 
			
		||||
        const percentage = Number( props.percentage ).valueOf();
 | 
			
		||||
 | 
			
		||||
        const warningLevelClass = computed((): string =>
 | 
			
		||||
        {
 | 
			
		||||
            let textClass = "";
 | 
			
		||||
 | 
			
		||||
            if ( props.warningLevel === "success" )
 | 
			
		||||
            {
 | 
			
		||||
                textClass = "percentage-value";
 | 
			
		||||
            }
 | 
			
		||||
            else if ( props.warningLevel === "warning" )
 | 
			
		||||
            {
 | 
			
		||||
                textClass = "percentage-value-warning";
 | 
			
		||||
            }
 | 
			
		||||
            else if ( props.warningLevel === "exception" )
 | 
			
		||||
            {
 | 
			
		||||
                textClass = "percentage-value-exception";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return textClass;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const ui = reactive({
 | 
			
		||||
            percentage,
 | 
			
		||||
            indicator: props.indicator,
 | 
			
		||||
            warningLevel: props.warningLevel,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return { ui, };
 | 
			
		||||
        return { ui, warningLevelClass, };
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
@@ -74,6 +99,21 @@ export default {
 | 
			
		||||
        font-size: 28px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .percentage-value-warning {
 | 
			
		||||
        display: block;
 | 
			
		||||
        margin-top: 10px;
 | 
			
		||||
        font-size: 28px;
 | 
			
		||||
        color: #e59f46;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .percentage-value-exception {
 | 
			
		||||
        display: block;
 | 
			
		||||
        margin-top: 10px;
 | 
			
		||||
        font-size: 28px;
 | 
			
		||||
        color: red;
 | 
			
		||||
        // color: #f3666b;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .percentage-label {
 | 
			
		||||
        display: block;
 | 
			
		||||
        margin-top: 10px;
 | 
			
		||||
 
 | 
			
		||||
@@ -78,32 +78,22 @@
 | 
			
		||||
// @ts-expect-error 之后再补充类型文件
 | 
			
		||||
import { hasOnlyChild } from "@/router/index.js";
 | 
			
		||||
import { useRoute, useRouter } from "vue-router";
 | 
			
		||||
// import { useRoute, useRouter, type RouteRecordNormalized, type _RouteRecordBase } from "vue-router";
 | 
			
		||||
import { computed } from "vue";
 | 
			
		||||
 | 
			
		||||
// declare interface SideBarRouteRecordNormalized extends RouteRecordNormalized
 | 
			
		||||
// {
 | 
			
		||||
//     hidden?: boolean;
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// declare interface SideBarRouteRecordSingleView extends _RouteRecordBase
 | 
			
		||||
// {
 | 
			
		||||
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
    name: "LayoutAside",
 | 
			
		||||
    setup()
 | 
			
		||||
    {
 | 
			
		||||
        const userRout = useRoute();
 | 
			
		||||
        const router = useRouter();
 | 
			
		||||
        const routes = router.getRoutes();// as SideBarRouteRecordNormalized[];
 | 
			
		||||
 | 
			
		||||
        const currentPath = computed(() =>
 | 
			
		||||
        {
 | 
			
		||||
            return useRoute().path;
 | 
			
		||||
            return userRout.path;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return { routes, currentPath, hasOnlyChild, };
 | 
			
		||||
        return { userRout, routes, currentPath, hasOnlyChild, };
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
        <span class="company-name">CPIC</span>
 | 
			
		||||
        <div class="version-wrapper">
 | 
			
		||||
            <span>桌面霸屏后台管理</span>
 | 
			
		||||
            <span>Build-20230915</span>
 | 
			
		||||
            <span>Build-20240111</span>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="buttons-wrapper">
 | 
			
		||||
            <component
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										89
									
								
								code/web/task_schedule/src/test/identify.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								code/web/task_schedule/src/test/identify.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,89 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-05-25 21:55:14
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /task_schedule/src/test/identify.ts
 | 
			
		||||
 * @Description:
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { type AxiosResponse } from "axios";
 | 
			
		||||
import { service as instance } from "../utils/api/request.js";
 | 
			
		||||
import { API_URL } from "../utils/api/config.js";
 | 
			
		||||
// import { login, loginCaller, type LoginCallerInfo } from "../utils/account.js";
 | 
			
		||||
 | 
			
		||||
interface LoginInfo
 | 
			
		||||
{
 | 
			
		||||
    p13account: string;
 | 
			
		||||
    password: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface LoginCallerInfo
 | 
			
		||||
{
 | 
			
		||||
    telsaler_code: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function loginCaller( data: LoginCallerInfo ): Promise<AxiosResponse<any, any>>
 | 
			
		||||
{
 | 
			
		||||
    return await instance.request(
 | 
			
		||||
        {
 | 
			
		||||
            method: "post",
 | 
			
		||||
            url: API_URL.URL_LOGIN_CALLER,
 | 
			
		||||
            data,
 | 
			
		||||
        });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function loginTestCaller(): void
 | 
			
		||||
{
 | 
			
		||||
    const info: LoginCallerInfo =
 | 
			
		||||
   {
 | 
			
		||||
       telsaler_code: "61136",
 | 
			
		||||
   };
 | 
			
		||||
 | 
			
		||||
    loginCaller( info )
 | 
			
		||||
        .then(( response ) =>
 | 
			
		||||
        {
 | 
			
		||||
            console.log( response.data );
 | 
			
		||||
        })
 | 
			
		||||
        .catch(( error ) =>
 | 
			
		||||
        {
 | 
			
		||||
            console.log( error );
 | 
			
		||||
        });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function newCitizen( data: any ): Promise<AxiosResponse<any, any>>
 | 
			
		||||
{
 | 
			
		||||
    return await instance.request(
 | 
			
		||||
        {
 | 
			
		||||
            method: "post",
 | 
			
		||||
            url: "http://10.39.0.41:8081/NewCitizen/identify.do",
 | 
			
		||||
            data,
 | 
			
		||||
        }
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function testNewCitizen(): void
 | 
			
		||||
{
 | 
			
		||||
    const data = {
 | 
			
		||||
        idcard_no: "350402198106130016",
 | 
			
		||||
        name: "王炜",
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    newCitizen( data )
 | 
			
		||||
        .then(( response ) =>
 | 
			
		||||
        {
 | 
			
		||||
            console.log( response.data );
 | 
			
		||||
        })
 | 
			
		||||
        .catch(( error ) =>
 | 
			
		||||
        {
 | 
			
		||||
            console.log( error );
 | 
			
		||||
        });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
    loginTestCaller,
 | 
			
		||||
    testNewCitizen,
 | 
			
		||||
    type LoginInfo,
 | 
			
		||||
    type LoginCallerInfo
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										50
									
								
								code/web/task_schedule/src/test/requestTest.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								code/web/task_schedule/src/test/requestTest.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
			
		||||
 | 
			
		||||
import { type AxiosResponse } from "axios";
 | 
			
		||||
import { service as instance } from "../utils/api/request.js";
 | 
			
		||||
import { API_URL } from "../utils/api/config.js";
 | 
			
		||||
// import { login, loginCaller, type LoginCallerInfo } from "../utils/account.js";
 | 
			
		||||
 | 
			
		||||
interface LoginInfo
 | 
			
		||||
{
 | 
			
		||||
    p13account: string;
 | 
			
		||||
    password: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface LoginCallerInfo
 | 
			
		||||
{
 | 
			
		||||
    telsaler_code: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function loginCaller( data: LoginCallerInfo ): Promise<AxiosResponse<any, any>>
 | 
			
		||||
{
 | 
			
		||||
    return await instance.request(
 | 
			
		||||
        {
 | 
			
		||||
            method: "post",
 | 
			
		||||
            url: API_URL.URL_LOGIN_CALLER,
 | 
			
		||||
            data,
 | 
			
		||||
        });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function loginTestCaller(): void
 | 
			
		||||
{
 | 
			
		||||
    const info: LoginCallerInfo =
 | 
			
		||||
   {
 | 
			
		||||
       telsaler_code: "61136",
 | 
			
		||||
   };
 | 
			
		||||
 | 
			
		||||
    loginCaller( info )
 | 
			
		||||
        .then(( response ) =>
 | 
			
		||||
        {
 | 
			
		||||
            console.log( response.data );
 | 
			
		||||
        })
 | 
			
		||||
        .catch(( error ) =>
 | 
			
		||||
        {
 | 
			
		||||
            console.log( error );
 | 
			
		||||
        });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
    loginTestCaller,
 | 
			
		||||
    type LoginInfo,
 | 
			
		||||
    type LoginCallerInfo
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										35
									
								
								code/web/task_schedule/src/test/testBI.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								code/web/task_schedule/src/test/testBI.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-11-06 14:50:08
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /task_schedule/src/test/testBI.ts
 | 
			
		||||
 * @Description: 测试bi相关的代码
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2023} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
import {
 | 
			
		||||
    type BIReportType,
 | 
			
		||||
    type ImportBIReportRequest,
 | 
			
		||||
    type ImportBIReportResponse,
 | 
			
		||||
    type ImportBIReportResponseHandler,
 | 
			
		||||
    type BITelsalerAttachingRateRecord,
 | 
			
		||||
    type QueryBITelsalerAttachingRateReportResponse,
 | 
			
		||||
    type QueryBITelsalerAttachingRateDataHandler,
 | 
			
		||||
    type BITelsalerRenewalRateRecord,
 | 
			
		||||
    importBIReport,
 | 
			
		||||
    queryBITelsalerAttachingRateData
 | 
			
		||||
} from "../utils/BIReport.ts";
 | 
			
		||||
 | 
			
		||||
function handler( response: QueryBITelsalerAttachingRateReportResponse, error: any ): void
 | 
			
		||||
{
 | 
			
		||||
    if ( response.success )
 | 
			
		||||
    {
 | 
			
		||||
        console.log( response );
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        console.log( error );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
queryBITelsalerAttachingRateData( handler );
 | 
			
		||||
							
								
								
									
										28
									
								
								code/web/task_schedule/src/test/testCallerArchievement.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								code/web/task_schedule/src/test/testCallerArchievement.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-08-28 16:02:11
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /task_schedule/src/test/testCallerArchievement.ts
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
import { queryCallerArchievement, type CallerArchievement } from "../utils/archievement.js";
 | 
			
		||||
import { type TelSaler } from "../types/cpicxim/TelSaler.js";
 | 
			
		||||
 | 
			
		||||
const callInfo: TelSaler =
 | 
			
		||||
{
 | 
			
		||||
    telSalerCode: "61136",
 | 
			
		||||
    telSalerName: "陈榕榕",
 | 
			
		||||
    teamCode: "",
 | 
			
		||||
    teamName: "",
 | 
			
		||||
    departmentCode: "",
 | 
			
		||||
    departmentName: "",
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function render(): void
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
queryCallerArchievement( callInfo, render );
 | 
			
		||||
							
								
								
									
										31
									
								
								code/web/task_schedule/src/test/testRankingListRequest.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								code/web/task_schedule/src/test/testRankingListRequest.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-06-07 10:16:00
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /task_schedule/src/test/testRankingListRequest.ts
 | 
			
		||||
 * @Description:
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved.
 | 
			
		||||
 */
 | 
			
		||||
import { type AxiosResponse } from "axios";
 | 
			
		||||
// import { service as instance } from "../utils/api/request.js";
 | 
			
		||||
// import { API_URL } from "../utils/api/config.js";
 | 
			
		||||
// import { type RankingListItem } from "../types/cpicxim/RankingListItem.js";
 | 
			
		||||
import {
 | 
			
		||||
    type RankingListRequest,
 | 
			
		||||
    type RankingListResponse,
 | 
			
		||||
    requestRankingList
 | 
			
		||||
} from "../utils/ranking.js";
 | 
			
		||||
 | 
			
		||||
function testRankingListRequest(): void
 | 
			
		||||
{
 | 
			
		||||
    const req: RankingListRequest = {
 | 
			
		||||
        departmentCode: "QDI",
 | 
			
		||||
        year: "2023",
 | 
			
		||||
        month: "06",
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    requestRankingList( req );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export { testRankingListRequest };
 | 
			
		||||
							
								
								
									
										30
									
								
								code/web/task_schedule/src/test/testRewardRequest.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								code/web/task_schedule/src/test/testRewardRequest.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-09-11 14:16:30
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /task_schedule/src/test/testRewardRequest.ts
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
    type RewardProject,
 | 
			
		||||
    type RewardGainer,
 | 
			
		||||
    type RewardProjectResponse,
 | 
			
		||||
    requestRewardPorjectsList,
 | 
			
		||||
    requestRewardGainers
 | 
			
		||||
} from "../utils/reward.js";
 | 
			
		||||
 | 
			
		||||
function render( data: any, error?: any ): void
 | 
			
		||||
{
 | 
			
		||||
    console.log( data );
 | 
			
		||||
 | 
			
		||||
    if ( error !== null )
 | 
			
		||||
    {
 | 
			
		||||
        console.log( "请求失败,", error );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
requestRewardPorjectsList( render );
 | 
			
		||||
requestRewardGainers( render );
 | 
			
		||||
@@ -11,10 +11,12 @@
 | 
			
		||||
    "compilerOptions": {
 | 
			
		||||
        "forceConsistentCasingInFileNames": true,
 | 
			
		||||
        "useDefineForClassFields": true,
 | 
			
		||||
        "allowImportingTsExtensions": true,
 | 
			
		||||
        "noEmit": true,
 | 
			
		||||
        "target": "ESNext",
 | 
			
		||||
        "module": "ESNext",
 | 
			
		||||
        "module": "NodeNext",
 | 
			
		||||
        // "module": "CommonJS",
 | 
			
		||||
        "moduleResolution": "node",
 | 
			
		||||
        "moduleResolution": "NodeNext",
 | 
			
		||||
        "strict": true,
 | 
			
		||||
        "jsx": "preserve",
 | 
			
		||||
        "sourceMap": true,
 | 
			
		||||
@@ -47,6 +49,7 @@
 | 
			
		||||
        "./node_modules",
 | 
			
		||||
    ],
 | 
			
		||||
    "ts-node": {
 | 
			
		||||
        "esm": true
 | 
			
		||||
        "esm": true,
 | 
			
		||||
        "require": ["tsconfig-paths/register"],
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
@@ -7,8 +7,8 @@
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2023} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
import { service as instance } from "./api/request.js";
 | 
			
		||||
import { API_URL } from "./api/config.js";
 | 
			
		||||
import { service as instance } from "./api/request.ts";
 | 
			
		||||
import { API_URL } from "./api/config.ts";
 | 
			
		||||
import { type AxiosResponse } from "axios";
 | 
			
		||||
interface BIReportType
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved.
 | 
			
		||||
 */
 | 
			
		||||
// 请求的url
 | 
			
		||||
const API_URL = {
 | 
			
		||||
    // 登录
 | 
			
		||||
    URL_LOGIN: import.meta.env.VITE_URL_LOGIN,
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ function loadStaffInfo(): StaffInfo
 | 
			
		||||
        obj = {};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* eslint-disable */
 | 
			
		||||
    const stuff = new StaffInfo(
 | 
			
		||||
        obj._p13uid ?? "",
 | 
			
		||||
        obj._stuffCode ?? "",
 | 
			
		||||
@@ -35,7 +36,7 @@ function loadStaffInfo(): StaffInfo
 | 
			
		||||
        obj._department_name ?? "",
 | 
			
		||||
        obj._section_office_code ?? "",
 | 
			
		||||
        obj._section_office_name ?? "" );
 | 
			
		||||
 | 
			
		||||
    /* eslint-enable */
 | 
			
		||||
    return stuff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ import axios, { type AxiosInstance } from "axios";
 | 
			
		||||
const service: AxiosInstance = axios.create(
 | 
			
		||||
    {
 | 
			
		||||
        baseURL: "",
 | 
			
		||||
        timeout: 10000,
 | 
			
		||||
        timeout: 30000,
 | 
			
		||||
    }
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								code/web/task_schedule/src/utils/api/systemParameters.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								code/web/task_schedule/src/utils/api/systemParameters.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-12-20 23:02:53
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /task_schedule/src/utils/api/systemParameters.ts
 | 
			
		||||
 * @Description: 应用参数相关的代码
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2023} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
// import { service as instance } from "@/utils/api/request.ts";
 | 
			
		||||
 | 
			
		||||
interface SystemParameter
 | 
			
		||||
{
 | 
			
		||||
    paramterName: string;
 | 
			
		||||
    parameterValue: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export { type SystemParameter };
 | 
			
		||||
@@ -7,10 +7,10 @@
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved.
 | 
			
		||||
 */
 | 
			
		||||
import { service as instance } from "./api/request.js";
 | 
			
		||||
import { API_URL } from "./api/config.js";
 | 
			
		||||
import { type Department } from "../types/cpicxim/Department.js";
 | 
			
		||||
import { type TelSaler } from "../types/cpicxim/TelSaler.js";
 | 
			
		||||
import { service as instance } from "./api/request.ts";
 | 
			
		||||
import { API_URL } from "./api/config.ts";
 | 
			
		||||
import { type Department } from "../types/cpicxim/Department.ts";
 | 
			
		||||
import { type TelSaler } from "../types/cpicxim/TelSaler.ts";
 | 
			
		||||
import { type AxiosResponse } from "axios";
 | 
			
		||||
 | 
			
		||||
interface DepartmentArchievement // 定义业绩对象的结构
 | 
			
		||||
@@ -20,7 +20,9 @@ interface DepartmentArchievement // 定义业绩对象的结构
 | 
			
		||||
    total_archievement: number;
 | 
			
		||||
    mensual_archievement_list: number[];
 | 
			
		||||
    insurance_renewal_rate: string;
 | 
			
		||||
    insurance_renewal_rate_target: string;
 | 
			
		||||
    attaching_rate: string;
 | 
			
		||||
    attaching_rate_target: string;
 | 
			
		||||
    leading_reward_gainers: string[];
 | 
			
		||||
    advance_reward_gainers: string[];
 | 
			
		||||
    backward_list: string[];
 | 
			
		||||
@@ -57,7 +59,9 @@ function queryDepartmentArchievement( departmentInfo: Department, render: any ):
 | 
			
		||||
        total_archievement: 0,
 | 
			
		||||
        mensual_archievement_list: [],
 | 
			
		||||
        insurance_renewal_rate: "",
 | 
			
		||||
        insurance_renewal_rate_target: "",
 | 
			
		||||
        attaching_rate: "",
 | 
			
		||||
        attaching_rate_target: "",
 | 
			
		||||
        leading_reward_gainers: [],
 | 
			
		||||
        advance_reward_gainers: [],
 | 
			
		||||
        backward_list: [],
 | 
			
		||||
@@ -78,7 +82,9 @@ function queryDepartmentArchievement( departmentInfo: Department, render: any ):
 | 
			
		||||
            archievement.total_archievement = data.total_archievement;
 | 
			
		||||
            archievement.mensual_archievement_list = [];
 | 
			
		||||
            archievement.insurance_renewal_rate = data.insurance_renewal_rate ?? "0.0";
 | 
			
		||||
            archievement.insurance_renewal_rate_target = data.insurance_renewal_rate_target ?? "0.0";
 | 
			
		||||
            archievement.attaching_rate = data.attaching_rate ?? "0.0";
 | 
			
		||||
            archievement.attaching_rate_target = data.attaching_rate_target ?? "0.0";
 | 
			
		||||
            archievement.leading_reward_gainers = data.leading_reward_gainers ?? [];
 | 
			
		||||
            archievement.advance_reward_gainers = data.advance_reward_gainers ?? [];
 | 
			
		||||
            archievement.backward_list = data.backward_list ?? [];
 | 
			
		||||
@@ -87,7 +93,7 @@ function queryDepartmentArchievement( departmentInfo: Department, render: any ):
 | 
			
		||||
            data.mensual_archievement_list.sort(( a: any, b: any ) => a.month - b.month );
 | 
			
		||||
            data.mensual_archievement_list.forEach(( item: any ) =>
 | 
			
		||||
            {
 | 
			
		||||
                archievement.mensual_archievement_list.push( item.premium );
 | 
			
		||||
                archievement.mensual_archievement_list.push( item.premium ); // eslint-disable-line
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            console.log( "每月业绩", archievement );
 | 
			
		||||
@@ -163,7 +169,7 @@ function queryCallerArchievement( callerInfo: TelSaler, render: any ): void
 | 
			
		||||
            callArchievement.attaching_rate = data.attaching_rate ?? "0.0";
 | 
			
		||||
 | 
			
		||||
            // 检查业绩清单有没有缺漏,缺漏的用0补上
 | 
			
		||||
            const checkedList = checkMensualArchievement( data.mensual_archievement_list );
 | 
			
		||||
            const checkedList = checkMensualArchievement( data.mensual_archievement_list ); // eslint-disable-line
 | 
			
		||||
 | 
			
		||||
            // 排序一下
 | 
			
		||||
            checkedList.sort(( a: MenusalArchievementItem, b: MenusalArchievementItem ): number =>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,9 +7,9 @@
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved.
 | 
			
		||||
 */
 | 
			
		||||
import { service as instance } from "./api/request.js";
 | 
			
		||||
import { API_URL } from "./api/config.js";
 | 
			
		||||
import { type RankingListItem } from "../types/cpicxim/RankingListItem.js";
 | 
			
		||||
import { service as instance } from "./api/request.ts";
 | 
			
		||||
import { API_URL } from "./api/config.ts";
 | 
			
		||||
import { type RankingListItem } from "../types/cpicxim/RankingListItem.ts";
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 用于请求排行榜数据请求参数
 | 
			
		||||
@@ -33,7 +33,7 @@ interface RankingListResponse
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 判断用的正则表达式
 | 
			
		||||
const regexMonth = "(0[1-9])|(1[0-2])";
 | 
			
		||||
const regexMonth = "(0[1-9])|(1[0-2])"; // eslint-disable-line
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 请求坐席排行榜。
 | 
			
		||||
 
 | 
			
		||||
@@ -8,8 +8,8 @@
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
import { type AxiosResponse } from "axios";
 | 
			
		||||
import { service as instance } from "./api/request.js";
 | 
			
		||||
import { API_URL } from "./api/config.js";
 | 
			
		||||
import { service as instance } from "./api/request.ts";
 | 
			
		||||
import { API_URL } from "./api/config.ts";
 | 
			
		||||
 | 
			
		||||
interface RewardProject
 | 
			
		||||
{
 | 
			
		||||
@@ -103,7 +103,7 @@ function requestRewardPorjectsList( handler: any ): void
 | 
			
		||||
            const data = response.data ?? {};
 | 
			
		||||
            rewardResponse.success = data.success ?? false;
 | 
			
		||||
            rewardResponse.message = data.message ?? "";
 | 
			
		||||
            rewardResponse.rewardList = checkRewardProjects( data.rewardList ?? []);
 | 
			
		||||
            rewardResponse.rewardList = checkRewardProjects( data.rewardList ?? []); // eslint-disable-line
 | 
			
		||||
 | 
			
		||||
            handler( rewardResponse, null );
 | 
			
		||||
        })
 | 
			
		||||
@@ -144,7 +144,7 @@ function requestRewardGainers( handler: any ): void
 | 
			
		||||
 | 
			
		||||
            rewardResponse.success = data.success;
 | 
			
		||||
            rewardResponse.message = data.message;
 | 
			
		||||
            rewardResponse.gainerList = checkRewardGainers( data.gainerList );
 | 
			
		||||
            rewardResponse.gainerList = checkRewardGainers( data.gainerList ); // eslint-disable-line
 | 
			
		||||
 | 
			
		||||
            handler( rewardResponse, null );
 | 
			
		||||
        })
 | 
			
		||||
 
 | 
			
		||||
@@ -25,10 +25,12 @@
 | 
			
		||||
                    <ArchievementCompleteRateComponent
 | 
			
		||||
                        indicator="续保完成率"
 | 
			
		||||
                        :percentage="ui.insurance_renewal_rate"
 | 
			
		||||
                        :warning-level="renewalRateWarningLevel(ui.insurance_renewal_rate_target)"
 | 
			
		||||
                    />
 | 
			
		||||
                    <ArchievementCompleteRateComponent
 | 
			
		||||
                        indicator="车非渗透率"
 | 
			
		||||
                        :percentage="ui.attaching_rate"
 | 
			
		||||
                        :warning-level="attachingRateWarningLevel(ui.attaching_rate_target)"
 | 
			
		||||
                    />
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="total-archievement-charts-wrapper">
 | 
			
		||||
@@ -103,7 +105,9 @@ interface ui
 | 
			
		||||
    chartData: number[];
 | 
			
		||||
    totalArchievement: number;
 | 
			
		||||
    attaching_rate: string;
 | 
			
		||||
    attaching_rate_target: string;
 | 
			
		||||
    insurance_renewal_rate: string; // 续保率
 | 
			
		||||
    insurance_renewal_rate_target: string; // 续保率
 | 
			
		||||
    leading_reward_gainers: string[]; // 领跑奖
 | 
			
		||||
    advance_reward_gainers: string[]; // 飞跃奖
 | 
			
		||||
    dishonorPersons: string[];
 | 
			
		||||
@@ -153,7 +157,9 @@ export default {
 | 
			
		||||
            chartData: [0,], // 业绩表
 | 
			
		||||
            totalArchievement: 0, // 总业绩
 | 
			
		||||
            attaching_rate: "", // 车非渗透率
 | 
			
		||||
            attaching_rate_target: "", // 车非渗透率目标值
 | 
			
		||||
            insurance_renewal_rate: "", // 续保率
 | 
			
		||||
            insurance_renewal_rate_target: "", // 续保率目标值
 | 
			
		||||
            leading_reward_gainers: ["",], // 领跑奖
 | 
			
		||||
            advance_reward_gainers: ["",], // 飞跃奖
 | 
			
		||||
            dishonorPersons: ["",],
 | 
			
		||||
@@ -201,7 +207,9 @@ export default {
 | 
			
		||||
            // ui.chartData = data.mensual_archievement_list;
 | 
			
		||||
            // ui.totalArchievement = data.total_archievement;
 | 
			
		||||
            ui.attaching_rate = data.attaching_rate;
 | 
			
		||||
            ui.attaching_rate_target = data.attaching_rate_target;
 | 
			
		||||
            ui.insurance_renewal_rate = data.insurance_renewal_rate;
 | 
			
		||||
            ui.insurance_renewal_rate_target = data.insurance_renewal_rate_target;
 | 
			
		||||
            ui.leading_reward_gainers = data.leading_reward_gainers;
 | 
			
		||||
            ui.advance_reward_gainers = data.advance_reward_gainers;
 | 
			
		||||
            ui.dishonorPersons = data.backward_list;
 | 
			
		||||
@@ -331,6 +339,52 @@ export default {
 | 
			
		||||
            clearInterval( timerHandler );
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const attachingRateWarningLevel = ( attachingRateTarget: string ): string =>
 | 
			
		||||
        {
 | 
			
		||||
            const value: number = Number( attachingRateTarget );
 | 
			
		||||
            let warningLevel = "";
 | 
			
		||||
 | 
			
		||||
            console.log( "渗透率目标差值", attachingRateTarget, value );
 | 
			
		||||
 | 
			
		||||
            if ( value >= 0.0 )
 | 
			
		||||
            {
 | 
			
		||||
                warningLevel = "success";
 | 
			
		||||
            }
 | 
			
		||||
            else if ( value > -0.5 && value < 0.0 )
 | 
			
		||||
            {
 | 
			
		||||
                warningLevel = "warning";
 | 
			
		||||
            }
 | 
			
		||||
            else if ( value <= -0.5 )
 | 
			
		||||
            {
 | 
			
		||||
                warningLevel = "exception";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return warningLevel;
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        const renewalRateWarningLevel = ( attachingRateTarget: string ): string =>
 | 
			
		||||
        {
 | 
			
		||||
            const value: number = Number( attachingRateTarget );
 | 
			
		||||
            let warningLevel = "";
 | 
			
		||||
 | 
			
		||||
            console.log( "续保率目标差值", attachingRateTarget, value );
 | 
			
		||||
 | 
			
		||||
            if ( value >= 0.0 )
 | 
			
		||||
            {
 | 
			
		||||
                warningLevel = "success";
 | 
			
		||||
            }
 | 
			
		||||
            else if ( value >= -3 && value < 0.0 )
 | 
			
		||||
            {
 | 
			
		||||
                warningLevel = "warning";
 | 
			
		||||
            }
 | 
			
		||||
            else if ( value <= -3 )
 | 
			
		||||
            {
 | 
			
		||||
                warningLevel = "exception";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return warningLevel;
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        return {
 | 
			
		||||
            ui,
 | 
			
		||||
            callerInfo,
 | 
			
		||||
@@ -339,6 +393,8 @@ export default {
 | 
			
		||||
            renderData: applyDepartmentArchievementData,
 | 
			
		||||
            refresh,
 | 
			
		||||
            logoutDesktopArchievement,
 | 
			
		||||
            attachingRateWarningLevel,
 | 
			
		||||
            renewalRateWarningLevel,
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -2,8 +2,8 @@
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-10-17 10:56:43
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /task_schedule/src/views/data/bi/BiDataUploadView.vue
 | 
			
		||||
 * @Description:
 | 
			
		||||
 * @FilePath: /task_schedule/src/views/data/DataUploadView.vue
 | 
			
		||||
 * @Description: 上传文件用的组件
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) ${2023} by Kane, All Rights Reserved.
 | 
			
		||||
-->
 | 
			
		||||
@@ -104,20 +104,24 @@ export default {
 | 
			
		||||
            selectedReportType: 0,
 | 
			
		||||
            reportType: [
 | 
			
		||||
                {
 | 
			
		||||
                    reportTypeCode: 0,
 | 
			
		||||
                    reportTypeCode: 1,
 | 
			
		||||
                    reportTypeName: "坐席车非渗透率",
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    reportTypeCode: 1,
 | 
			
		||||
                    reportTypeCode: 2,
 | 
			
		||||
                    reportTypeName: "坐席续保率",
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    reportTypeCode: 2,
 | 
			
		||||
                    reportTypeCode: 3,
 | 
			
		||||
                    reportTypeName: "部门车非渗透率",
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    reportTypeCode: 3,
 | 
			
		||||
                    reportTypeCode: 4,
 | 
			
		||||
                    reportTypeName: "当月个车续保率跟踪报表【机构】",
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    reportTypeCode: 10,
 | 
			
		||||
                    reportTypeName: "TWr坐席清单",
 | 
			
		||||
                },],
 | 
			
		||||
            sheetIndex: 0,
 | 
			
		||||
            firstRow: 1,
 | 
			
		||||
@@ -7,7 +7,6 @@
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) ${2023} by Kane, All Rights Reserved.
 | 
			
		||||
-->
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
    <div class="wrapper">
 | 
			
		||||
        <el-row :gutter="10">
 | 
			
		||||
@@ -92,7 +91,7 @@
 | 
			
		||||
                :close-on-press-escape="false"
 | 
			
		||||
                :show-close="true"
 | 
			
		||||
            >
 | 
			
		||||
                <BiDataUploadView :report-type="2" />
 | 
			
		||||
                <DataUploadView :report-type="3" />
 | 
			
		||||
            </el-dialog>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
@@ -106,7 +105,7 @@ import {
 | 
			
		||||
    queryDepartmentAttachingRateData
 | 
			
		||||
} from "@/utils/BIReport.js";
 | 
			
		||||
import { ElMessage, ElMessageBox } from "element-plus";
 | 
			
		||||
import BiDataUploadView from "@/views/data/bi/BiDataUploadView.vue";
 | 
			
		||||
import DataUploadView from "@/views/data/DataUploadView.vue";
 | 
			
		||||
 | 
			
		||||
interface UI
 | 
			
		||||
{
 | 
			
		||||
@@ -119,7 +118,7 @@ interface UI
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
    name: "DepartmentAttachingRateView",
 | 
			
		||||
    components: { BiDataUploadView, },
 | 
			
		||||
    components: { DataUploadView, },
 | 
			
		||||
    setup()
 | 
			
		||||
    {
 | 
			
		||||
        const ui: UI = reactive({
 | 
			
		||||
 
 | 
			
		||||
@@ -108,7 +108,7 @@
 | 
			
		||||
                :close-on-press-escape="false"
 | 
			
		||||
                :show-close="true"
 | 
			
		||||
            >
 | 
			
		||||
                <BiDataUploadView :report-type="3" />
 | 
			
		||||
                <DataUploadView :report-type="4" />
 | 
			
		||||
            </el-dialog>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
@@ -122,7 +122,7 @@ import {
 | 
			
		||||
    queryDepartmentRenewalRateData
 | 
			
		||||
} from "@/utils/BIReport.js";
 | 
			
		||||
import { ElMessageBox, ElMessage } from "element-plus";
 | 
			
		||||
import BiDataUploadView from "@/views/data/bi/BiDataUploadView.vue";
 | 
			
		||||
import DataUploadView from "@/views/data/DataUploadView.vue";
 | 
			
		||||
 | 
			
		||||
interface UI
 | 
			
		||||
{
 | 
			
		||||
@@ -135,7 +135,7 @@ interface UI
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
    name: "DepartmentRenewalRateView",
 | 
			
		||||
    components: { BiDataUploadView, },
 | 
			
		||||
    components: { DataUploadView, },
 | 
			
		||||
    setup()
 | 
			
		||||
    {
 | 
			
		||||
        const ui: UI = reactive({
 | 
			
		||||
 
 | 
			
		||||
@@ -109,7 +109,7 @@
 | 
			
		||||
                :close-on-press-escape="false"
 | 
			
		||||
                :show-close="true"
 | 
			
		||||
            >
 | 
			
		||||
                <BiDataUploadView :report-type="0" />
 | 
			
		||||
                <DataUploadView :report-type="1" />
 | 
			
		||||
            </el-dialog>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
@@ -122,7 +122,7 @@ import {
 | 
			
		||||
    type QueryBITelsalerAttachingRateDataHandler,
 | 
			
		||||
    queryBITelsalerAttachingRateData
 | 
			
		||||
} from "@/utils/BIReport.js";
 | 
			
		||||
import BiDataUploadView from "@/views/data/bi/BiDataUploadView.vue";
 | 
			
		||||
import DataUploadView from "@/views/data/DataUploadView.vue";
 | 
			
		||||
import { ElMessageBox, ElMessage } from "element-plus";
 | 
			
		||||
 | 
			
		||||
interface UI
 | 
			
		||||
@@ -136,7 +136,7 @@ interface UI
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
    name: "TelsalerAttachingRateView",
 | 
			
		||||
    components: { BiDataUploadView, },
 | 
			
		||||
    components: { DataUploadView, },
 | 
			
		||||
    setup()
 | 
			
		||||
    {
 | 
			
		||||
        const ui: UI = reactive({
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,7 @@
 | 
			
		||||
                align="center"
 | 
			
		||||
            >
 | 
			
		||||
                <template #default="telsaler">
 | 
			
		||||
                    <span>{{ telsaler.row.个车续保率序时 }}</span>
 | 
			
		||||
                    <span>{{ telsaler.row.个车续保率序时.toFixed(2) + "%" }}</span>
 | 
			
		||||
                </template>
 | 
			
		||||
            </el-table-column>
 | 
			
		||||
            <el-table-column
 | 
			
		||||
@@ -70,7 +70,7 @@
 | 
			
		||||
                align="center"
 | 
			
		||||
            >
 | 
			
		||||
                <template #default="telsaler">
 | 
			
		||||
                    <span>{{ telsaler.row.个车续保率全月 }}</span>
 | 
			
		||||
                    <span>{{ telsaler.row.个车续保率全月.toFixed(2) + "%" }}</span>
 | 
			
		||||
                </template>
 | 
			
		||||
            </el-table-column>
 | 
			
		||||
        </el-table>
 | 
			
		||||
@@ -99,14 +99,14 @@
 | 
			
		||||
                :close-on-press-escape="false"
 | 
			
		||||
                :show-close="true"
 | 
			
		||||
            >
 | 
			
		||||
                <BiDataUploadView :report-type="1" />
 | 
			
		||||
                <DataUploadView :report-type="2" />
 | 
			
		||||
            </el-dialog>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import { reactive, computed, onBeforeMount } from "vue";
 | 
			
		||||
import BiDataUploadView from "@/views/data/bi/BiDataUploadView.vue";
 | 
			
		||||
import DataUploadView from "@/views/data/DataUploadView.vue";
 | 
			
		||||
import {
 | 
			
		||||
    type QueryBITelsalerRenewalRateDataHandler,
 | 
			
		||||
    type BITelsalerRenewalRateRecord,
 | 
			
		||||
@@ -126,7 +126,7 @@ interface UI
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
    name: "TelsalerAttachingRateView",
 | 
			
		||||
    components: { BiDataUploadView, },
 | 
			
		||||
    components: { DataUploadView, },
 | 
			
		||||
    setup()
 | 
			
		||||
    {
 | 
			
		||||
        const ui: UI = reactive({
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
 * @Date: 2023-03-23 16:05:08
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /task_schedule/src/views/telsaler/TelsalerManagement.vue
 | 
			
		||||
 * @Description:
 | 
			
		||||
 * @Description: 坐席管理组件
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved.
 | 
			
		||||
-->
 | 
			
		||||
@@ -51,9 +51,19 @@
 | 
			
		||||
                        >
 | 
			
		||||
                            查询
 | 
			
		||||
                        </el-button>
 | 
			
		||||
                        <el-button icon="refresh">
 | 
			
		||||
                        <el-button
 | 
			
		||||
                            icon="refresh"
 | 
			
		||||
                            @click="onResetQuery"
 | 
			
		||||
                        >
 | 
			
		||||
                            重置
 | 
			
		||||
                        </el-button>
 | 
			
		||||
                        <el-button
 | 
			
		||||
                            icon="upload"
 | 
			
		||||
                            type="warning"
 | 
			
		||||
                            @click="ui.showUploadDialog = true;"
 | 
			
		||||
                        >
 | 
			
		||||
                            上传
 | 
			
		||||
                        </el-button>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </el-col>
 | 
			
		||||
            </el-row>
 | 
			
		||||
@@ -102,19 +112,38 @@
 | 
			
		||||
                @size-change="onTablePageSizeChange"
 | 
			
		||||
            />
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="upload-dialog-wrapper">
 | 
			
		||||
            <el-dialog
 | 
			
		||||
                v-model="ui.showUploadDialog"
 | 
			
		||||
                title="上传报表"
 | 
			
		||||
                width="600px"
 | 
			
		||||
                :close-on-click-modal="false"
 | 
			
		||||
                :close-on-press-escape="false"
 | 
			
		||||
                :show-close="true"
 | 
			
		||||
            >
 | 
			
		||||
                <DataUploadView :report-type="10" />
 | 
			
		||||
            </el-dialog>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import DataUploadView from "@/views/data/DataUploadView.vue";
 | 
			
		||||
import { reactive, computed } from "vue";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
    name: "TelsalerManagement",
 | 
			
		||||
    components: { DataUploadView, },
 | 
			
		||||
    setup()
 | 
			
		||||
    {
 | 
			
		||||
        const ui = reactive({
 | 
			
		||||
            showUploadDialog: false,
 | 
			
		||||
            caller_code: "",
 | 
			
		||||
            caller_name: "",
 | 
			
		||||
            section_office_code: "",
 | 
			
		||||
            section_office_name: "",
 | 
			
		||||
            department_code: "",
 | 
			
		||||
            department_name: "",
 | 
			
		||||
            team_name: "",
 | 
			
		||||
            table_current_page_index: 1,
 | 
			
		||||
            table_page_size: 50,
 | 
			
		||||
            callers: [],
 | 
			
		||||
@@ -142,7 +171,18 @@ export default {
 | 
			
		||||
            return 10 * 50 + 40;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return { ui, onCurrentPageIndexChange, onTablePageSizeChange, tableHeight, };
 | 
			
		||||
        const onResetQuery = (): void =>
 | 
			
		||||
        {
 | 
			
		||||
            ui.caller_code = "";
 | 
			
		||||
            ui.caller_name = "";
 | 
			
		||||
            ui.section_office_code = "";
 | 
			
		||||
            ui.section_office_name = "";
 | 
			
		||||
            ui.department_code = "";
 | 
			
		||||
            ui.department_name = "";
 | 
			
		||||
            ui.team_name = "";
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        return { ui, onResetQuery, onCurrentPageIndexChange, onTablePageSizeChange, tableHeight, };
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
 * @Date: 2023-09-27 10:13:31
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /task_schedule/src/views/telsaler/TelsalerManagementView.vue
 | 
			
		||||
 * @Description:
 | 
			
		||||
 * @Description: 坐席和团队管理父组件
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved.
 | 
			
		||||
-->
 | 
			
		||||
@@ -23,7 +23,7 @@
 | 
			
		||||
            <el-tab-pane>
 | 
			
		||||
                <template #label>
 | 
			
		||||
                    <el-icon><Document /></el-icon>
 | 
			
		||||
                    <span>导入导出</span>
 | 
			
		||||
                    <span>团队管理</span>
 | 
			
		||||
                </template>
 | 
			
		||||
                导入导出
 | 
			
		||||
            </el-tab-pane>
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,8 @@
 | 
			
		||||
    "compilerOptions": {
 | 
			
		||||
        "forceConsistentCasingInFileNames": true,
 | 
			
		||||
        "useDefineForClassFields": true,
 | 
			
		||||
        "allowImportingTsExtensions": true,
 | 
			
		||||
        "noEmit": true,
 | 
			
		||||
        "target": "ESNext",
 | 
			
		||||
        "module": "ESNext",
 | 
			
		||||
        "moduleResolution": "node",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "desktop_archievement_backend",
 | 
			
		||||
  "lockfileVersion": 3,
 | 
			
		||||
  "requires": true,
 | 
			
		||||
  "packages": {}
 | 
			
		||||
}
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" ?>
 | 
			
		||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
 | 
			
		||||
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
			
		||||
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 | 
			
		||||
@@ -13,9 +14,9 @@
 | 
			
		||||
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 | 
			
		||||
    <maven.compiler.source>17</maven.compiler.source>
 | 
			
		||||
    <maven.compiler.target>17</maven.compiler.target>
 | 
			
		||||
    <spring.version>5.3.30</spring.version>
 | 
			
		||||
    <!-- <spring.version>5.3.30</spring.version> -->
 | 
			
		||||
    <log4j2.version>2.20.0</log4j2.version>
 | 
			
		||||
    <!-- <spring.version>6.0.11</spring.version> -->
 | 
			
		||||
    <spring.version>6.2.4</spring.version>
 | 
			
		||||
  </properties>
 | 
			
		||||
 | 
			
		||||
  <dependencies>
 | 
			
		||||
@@ -66,7 +67,7 @@
 | 
			
		||||
    <dependency>
 | 
			
		||||
      <groupId>commons-io</groupId>
 | 
			
		||||
      <artifactId>commons-io</artifactId>
 | 
			
		||||
      <version>2.11.0</version>
 | 
			
		||||
      <version>2.18.0</version>
 | 
			
		||||
    </dependency>
 | 
			
		||||
 | 
			
		||||
    <!--jackson-->
 | 
			
		||||
@@ -145,6 +146,7 @@
 | 
			
		||||
      <version>3.5.13</version>
 | 
			
		||||
    </dependency>
 | 
			
		||||
  </dependencies>
 | 
			
		||||
  
 | 
			
		||||
  <build>
 | 
			
		||||
    <finalName>desktop_archievement_backend</finalName>
 | 
			
		||||
    <resources>
 | 
			
		||||
 
 | 
			
		||||
@@ -17,4 +17,8 @@ public interface TWrTelsalerMapper
 | 
			
		||||
    public TWrTelsalerRecord queryTWrTelsalerInfo( @Param("telsaler") String telsaler );
 | 
			
		||||
 | 
			
		||||
    public void insertTWrTelsalerRecordToDB( TWrTelsalerRecord record );
 | 
			
		||||
 | 
			
		||||
    public void cleanTWrTelsalerRecord();
 | 
			
		||||
 | 
			
		||||
    public void cleanTWrTelsalerTeamRecord();
 | 
			
		||||
}
 | 
			
		||||
@@ -19,14 +19,14 @@ public class BIDepartmentRenewalRateRecord
 | 
			
		||||
    private double 个车续保率全月;
 | 
			
		||||
    private double 环比昨日;
 | 
			
		||||
    private double 环比上月;
 | 
			
		||||
    private int 平均提前签单天数;
 | 
			
		||||
    private double 环比;
 | 
			
		||||
    // private int 平均提前签单天数;
 | 
			
		||||
    // private double 环比;
 | 
			
		||||
 | 
			
		||||
    public BIDepartmentRenewalRateRecord()
 | 
			
		||||
    {}
 | 
			
		||||
 | 
			
		||||
    public BIDepartmentRenewalRateRecord( String 责任部门, double 机构目标值, int 到期数全月, double 序时到期数占比,
 | 
			
		||||
            double 个车续保率序时, double 个车续保率全月, double 环比昨日, double 环比上月, int 平均提前签单天数, double 环比 )
 | 
			
		||||
            double 个车续保率序时, double 个车续保率全月, double 环比昨日, double 环比上月 )
 | 
			
		||||
    {
 | 
			
		||||
        this.责任部门 = 责任部门;
 | 
			
		||||
        this.机构目标值 = 机构目标值;
 | 
			
		||||
@@ -36,8 +36,8 @@ public class BIDepartmentRenewalRateRecord
 | 
			
		||||
        this.个车续保率全月 = 个车续保率全月;
 | 
			
		||||
        this.环比昨日 = 环比昨日;
 | 
			
		||||
        this.环比上月 = 环比上月;
 | 
			
		||||
        this.平均提前签单天数 = 平均提前签单天数;
 | 
			
		||||
        this.环比 = 环比;
 | 
			
		||||
        // this.平均提前签单天数 = 平均提前签单天数;
 | 
			
		||||
        // this.环比 = 环比;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String get责任部门()
 | 
			
		||||
@@ -120,25 +120,6 @@ public class BIDepartmentRenewalRateRecord
 | 
			
		||||
        this.环比上月 = 环比上月;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int get平均提前签单天数()
 | 
			
		||||
    {
 | 
			
		||||
        return 平均提前签单天数;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void set平均提前签单天数( int 平均提前签单天数 )
 | 
			
		||||
    {
 | 
			
		||||
        this.平均提前签单天数 = 平均提前签单天数;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public double get环比()
 | 
			
		||||
    {
 | 
			
		||||
        return 环比;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void set环比( double 环比 )
 | 
			
		||||
    {
 | 
			
		||||
        this.环比 = 环比;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode()
 | 
			
		||||
@@ -160,9 +141,6 @@ public class BIDepartmentRenewalRateRecord
 | 
			
		||||
        result = prime * result + (int) (temp ^ (temp >>> 32));
 | 
			
		||||
        temp = Double.doubleToLongBits( 环比上月 );
 | 
			
		||||
        result = prime * result + (int) (temp ^ (temp >>> 32));
 | 
			
		||||
        result = prime * result + 平均提前签单天数;
 | 
			
		||||
        temp = Double.doubleToLongBits( 环比 );
 | 
			
		||||
        result = prime * result + (int) (temp ^ (temp >>> 32));
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -197,10 +175,6 @@ public class BIDepartmentRenewalRateRecord
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( Double.doubleToLongBits( 环比上月 ) != Double.doubleToLongBits( other.环比上月 ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( 平均提前签单天数 != other.平均提前签单天数 )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( Double.doubleToLongBits( 环比 ) != Double.doubleToLongBits( other.环比 ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -209,7 +183,6 @@ public class BIDepartmentRenewalRateRecord
 | 
			
		||||
    {
 | 
			
		||||
        return "BIDepartmentRenewalRateRecord [责任部门=" + 责任部门 + ", 机构目标值=" + 机构目标值 + ", 到期数全月="
 | 
			
		||||
                + 到期数全月 + ", 序时到期数占比=" + 序时到期数占比 + ", 个车续保率序时=" + 个车续保率序时 + ", 个车续保率全月=" + 个车续保率全月
 | 
			
		||||
                + ", 环比昨日=" + 环比昨日 + ", 环比上月=" + 环比上月 + ", 平均提前签单天数=" + 平均提前签单天数 + ", 环比=" + 环比
 | 
			
		||||
                + "]";
 | 
			
		||||
                + ", 环比昨日=" + 环比昨日 + ", 环比上月=" + 环比上月 + "]";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
 * @Date: 2023-10-09 21:45:39
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BITelsalerRenewalRateRecord.java
 | 
			
		||||
 * @Description: BI导出的续保率Excel文件行记录。
 | 
			
		||||
 * @Description: BI导出的坐席续保率 Excel文件行记录。
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2023} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
@@ -20,12 +20,11 @@ public class BITelsalerRenewalRateRecord
 | 
			
		||||
    private double 个车续保率全月;
 | 
			
		||||
    private double 环比昨日;
 | 
			
		||||
    private double 环比上月;
 | 
			
		||||
    private double 平均提前签单天数;
 | 
			
		||||
    private double 环比;
 | 
			
		||||
    // private double 平均提前签单天数;
 | 
			
		||||
    // private double 环比;
 | 
			
		||||
    
 | 
			
		||||
    public BITelsalerRenewalRateRecord( String 责任部门, String 责任人, double 机构目标值, double 到期数全月,
 | 
			
		||||
            double 序时到期数占比, double 个车续保率序时, double 个车续保率全月, double 环比昨日, double 环比上月,
 | 
			
		||||
            double 平均提前签单天数, double 环比 )
 | 
			
		||||
            double 序时到期数占比, double 个车续保率序时, double 个车续保率全月, double 环比昨日, double 环比上月 )
 | 
			
		||||
    {
 | 
			
		||||
        this.责任部门 = 责任部门;
 | 
			
		||||
        this.责任人 = 责任人;
 | 
			
		||||
@@ -36,32 +35,8 @@ public class BITelsalerRenewalRateRecord
 | 
			
		||||
        this.个车续保率全月 = 个车续保率全月;
 | 
			
		||||
        this.环比昨日 = 环比昨日;
 | 
			
		||||
        this.环比上月 = 环比上月;
 | 
			
		||||
        this.平均提前签单天数 = 平均提前签单天数;
 | 
			
		||||
        this.环比 = 环比;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public double get平均提前签单天数()
 | 
			
		||||
    {
 | 
			
		||||
        return 平均提前签单天数;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void set平均提前签单天数( double 平均提前签单天数 )
 | 
			
		||||
    {
 | 
			
		||||
        this.平均提前签单天数 = 平均提前签单天数;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public double get环比()
 | 
			
		||||
    {
 | 
			
		||||
        return 环比;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void set环比( double 环比 )
 | 
			
		||||
    {
 | 
			
		||||
        this.环比 = 环比;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public String get责任部门()
 | 
			
		||||
    {
 | 
			
		||||
        return 责任部门;
 | 
			
		||||
@@ -94,10 +69,6 @@ public class BITelsalerRenewalRateRecord
 | 
			
		||||
        result = prime * result + (int) (temp ^ (temp >>> 32));
 | 
			
		||||
        temp = Double.doubleToLongBits( 环比上月 );
 | 
			
		||||
        result = prime * result + (int) (temp ^ (temp >>> 32));
 | 
			
		||||
        temp = Double.doubleToLongBits( 平均提前签单天数 );
 | 
			
		||||
        result = prime * result + (int) (temp ^ (temp >>> 32));
 | 
			
		||||
        temp = Double.doubleToLongBits( 环比 );
 | 
			
		||||
        result = prime * result + (int) (temp ^ (temp >>> 32));
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -139,10 +110,6 @@ public class BITelsalerRenewalRateRecord
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( Double.doubleToLongBits( 环比上月 ) != Double.doubleToLongBits( other.环比上月 ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( Double.doubleToLongBits( 平均提前签单天数 ) != Double.doubleToLongBits( other.平均提前签单天数 ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( Double.doubleToLongBits( 环比 ) != Double.doubleToLongBits( other.环比 ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -151,8 +118,7 @@ public class BITelsalerRenewalRateRecord
 | 
			
		||||
    {
 | 
			
		||||
        return "BITelsalerRenewalRateRecord [责任部门=" + 责任部门 + ", 责任人=" + 责任人 + ", 机构目标值=" + 机构目标值
 | 
			
		||||
                + ", 到期数全月=" + 到期数全月 + ", 序时到期数占比=" + 序时到期数占比 + ", 个车续保率序时=" + 个车续保率序时
 | 
			
		||||
                + ", 个车续保率全月=" + 个车续保率全月 + ", 环比昨日=" + 环比昨日 + ", 环比上月=" + 环比上月 + ", 平均提前签单天数="
 | 
			
		||||
                + 平均提前签单天数 + ", 环比=" + 环比 + "]";
 | 
			
		||||
                + ", 个车续保率全月=" + 个车续保率全月 + ", 环比昨日=" + 环比昨日 + ", 环比上月=" + 环比上月 + "]";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String get责任人()
 | 
			
		||||
 
 | 
			
		||||
@@ -25,36 +25,6 @@ public class DepartmentArchievement
 | 
			
		||||
    // log4j2
 | 
			
		||||
    private static Logger logger = LoggerFactory.getLogger(DepartmentArchievement.class);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 默认的构造函数,提供给json使用。
 | 
			
		||||
     */
 | 
			
		||||
    public DepartmentArchievement()
 | 
			
		||||
    {
 | 
			
		||||
        this.totalArchievement = 0;
 | 
			
		||||
        this.mensualArchievementList = null;
 | 
			
		||||
        this.insuranceRenewalRate = "";
 | 
			
		||||
        this.attachingRate = "";
 | 
			
		||||
        this.departmentCode = "";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @brief 构造函数,提供所有成员对象的值。
 | 
			
		||||
     * @param departmentCode 部门代码
 | 
			
		||||
     * @param totalArchievement 总业绩
 | 
			
		||||
     * @param mensualArchievementList 每月业绩表
 | 
			
		||||
     * @param insuranceRenewalRate 续保率
 | 
			
		||||
     * @param attachingRate 车非渗透率
 | 
			
		||||
     */
 | 
			
		||||
    public DepartmentArchievement( String departmentCode, long totalArchievement,
 | 
			
		||||
            ArrayList<MensualArchievementItem> mensualArchievementList, String insuranceRenewalRate, String attachingRate)
 | 
			
		||||
    {
 | 
			
		||||
        this.departmentCode = departmentCode;
 | 
			
		||||
        this.totalArchievement = totalArchievement;
 | 
			
		||||
        this.mensualArchievementList = mensualArchievementList;
 | 
			
		||||
        this.insuranceRenewalRate = insuranceRenewalRate;
 | 
			
		||||
        this.attachingRate = attachingRate;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 静态方法,用于根据部门代码,查询部门业绩,生成一个 DepartmentArchievement 对象。
 | 
			
		||||
     * @param departmentCode 部门代码
 | 
			
		||||
@@ -82,15 +52,17 @@ public class DepartmentArchievement
 | 
			
		||||
 | 
			
		||||
            Integer totalArchievement = (Integer)params.get("a_total");
 | 
			
		||||
            String attachingRate = (String)params.get("a_attaching_rate");
 | 
			
		||||
            String attachingRateTarget = (String)params.get("a_attaching_rate_target");
 | 
			
		||||
            String renewalRate = (String)params.get("a_renewal_rate");
 | 
			
		||||
            String renewalRateTarget = (String)params.get("a_renewal_rate_target");
 | 
			
		||||
            ArrayList<MensualArchievementItem> mensual = (ArrayList<MensualArchievementItem>)params.get("a_mensual_cur");
 | 
			
		||||
 | 
			
		||||
            archievement = new DepartmentArchievement(
 | 
			
		||||
                departmentCode, 
 | 
			
		||||
                totalArchievement.intValue(), 
 | 
			
		||||
                mensual, 
 | 
			
		||||
                renewalRate, 
 | 
			
		||||
                attachingRate);
 | 
			
		||||
                renewalRate, renewalRateTarget,
 | 
			
		||||
                attachingRate, attachingRateTarget);
 | 
			
		||||
        }
 | 
			
		||||
        catch ( IOException error )
 | 
			
		||||
        {
 | 
			
		||||
@@ -104,6 +76,67 @@ public class DepartmentArchievement
 | 
			
		||||
        return archievement;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "department_code" )
 | 
			
		||||
    private String departmentCode;
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "total_archievement" )
 | 
			
		||||
    private long totalArchievement; // 总业绩
 | 
			
		||||
 | 
			
		||||
    // 每月业绩列表
 | 
			
		||||
    // 要保证数据是按照月份排序。
 | 
			
		||||
    @JsonProperty( "mensual_archievement_list" )
 | 
			
		||||
    private ArrayList<MensualArchievementItem> mensualArchievementList;
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "insurance_renewal_rate" )
 | 
			
		||||
    private String insuranceRenewalRate; // 续保率
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "insurance_renewal_rate_target" )
 | 
			
		||||
    private String insuranceRenewalRateTarget; // 续保率目标值
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "attaching_rate" )
 | 
			
		||||
    private String attachingRate; // 车非渗透率
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "attaching_rate_target" )
 | 
			
		||||
    private String attachingRateTarget; // 车非渗透率目标值
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 默认的构造函数,提供给json使用。
 | 
			
		||||
     */
 | 
			
		||||
    public DepartmentArchievement()
 | 
			
		||||
    {
 | 
			
		||||
        this.totalArchievement = 0;
 | 
			
		||||
        this.mensualArchievementList = null;
 | 
			
		||||
        this.insuranceRenewalRate = "";
 | 
			
		||||
        this.attachingRate = "";
 | 
			
		||||
        this.insuranceRenewalRateTarget = "";
 | 
			
		||||
        this.attachingRateTarget = "";
 | 
			
		||||
        this.departmentCode = "";
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @brief 构造函数,提供所有成员对象的值。
 | 
			
		||||
     * @param departmentCode 部门代码
 | 
			
		||||
     * @param totalArchievement 总业绩
 | 
			
		||||
     * @param mensualArchievementList 每月业绩表
 | 
			
		||||
     * @param insuranceRenewalRate 续保率
 | 
			
		||||
     * @param insuranceRenewalRateTarget 续保率目标值
 | 
			
		||||
     * @param attachingRate 车非渗透率
 | 
			
		||||
     * @param attachingRateTarget 车非渗透率目标值
 | 
			
		||||
     */
 | 
			
		||||
    public DepartmentArchievement( String departmentCode, long totalArchievement,
 | 
			
		||||
            ArrayList<MensualArchievementItem> mensualArchievementList, String insuranceRenewalRate,
 | 
			
		||||
            String insuranceRenewalRateTarget, String attachingRate, String attachingRateTarget )
 | 
			
		||||
    {
 | 
			
		||||
        this.departmentCode = departmentCode;
 | 
			
		||||
        this.totalArchievement = totalArchievement;
 | 
			
		||||
        this.mensualArchievementList = mensualArchievementList;
 | 
			
		||||
        this.insuranceRenewalRate = insuranceRenewalRate;
 | 
			
		||||
        this.insuranceRenewalRateTarget = insuranceRenewalRateTarget;
 | 
			
		||||
        this.attachingRate = attachingRate;
 | 
			
		||||
        this.attachingRateTarget = attachingRateTarget;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public long getTotalArchievement()
 | 
			
		||||
    {
 | 
			
		||||
        return totalArchievement;
 | 
			
		||||
@@ -139,11 +172,117 @@ public class DepartmentArchievement
 | 
			
		||||
        return attachingRate;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString()
 | 
			
		||||
    {
 | 
			
		||||
        return "DepartmentArchievement [departmentCode=" + departmentCode + ", totalArchievement="
 | 
			
		||||
                + totalArchievement + ", mensualArchievementList=" + mensualArchievementList
 | 
			
		||||
                + ", insuranceRenewalRate=" + insuranceRenewalRate + ", insuranceRenewalRateTarget="
 | 
			
		||||
                + insuranceRenewalRateTarget + ", attachingRate=" + attachingRate
 | 
			
		||||
                + ", attachingRateTarget=" + attachingRateTarget + "]";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode()
 | 
			
		||||
    {
 | 
			
		||||
        final int prime = 31;
 | 
			
		||||
        int result = 1;
 | 
			
		||||
        result = prime * result + ((departmentCode == null) ? 0 : departmentCode.hashCode());
 | 
			
		||||
        result = prime * result + (int) (totalArchievement ^ (totalArchievement >>> 32));
 | 
			
		||||
        result = prime * result
 | 
			
		||||
                + ((mensualArchievementList == null) ? 0 : mensualArchievementList.hashCode());
 | 
			
		||||
        result = prime * result
 | 
			
		||||
                + ((insuranceRenewalRate == null) ? 0 : insuranceRenewalRate.hashCode());
 | 
			
		||||
        result = prime * result + ((insuranceRenewalRateTarget == null) ? 0
 | 
			
		||||
                : insuranceRenewalRateTarget.hashCode());
 | 
			
		||||
        result = prime * result + ((attachingRate == null) ? 0 : attachingRate.hashCode());
 | 
			
		||||
        result = prime * result
 | 
			
		||||
                + ((attachingRateTarget == null) ? 0 : attachingRateTarget.hashCode());
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals( Object obj )
 | 
			
		||||
    {
 | 
			
		||||
        if ( this == obj )
 | 
			
		||||
            return true;
 | 
			
		||||
        if ( obj == null )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( getClass() != obj.getClass() )
 | 
			
		||||
            return false;
 | 
			
		||||
        DepartmentArchievement other = (DepartmentArchievement) obj;
 | 
			
		||||
        if ( departmentCode == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.departmentCode != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
        else if ( !departmentCode.equals( other.departmentCode ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( totalArchievement != other.totalArchievement )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( mensualArchievementList == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.mensualArchievementList != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
        else if ( !mensualArchievementList.equals( other.mensualArchievementList ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( insuranceRenewalRate == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.insuranceRenewalRate != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
        else if ( !insuranceRenewalRate.equals( other.insuranceRenewalRate ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( insuranceRenewalRateTarget == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.insuranceRenewalRateTarget != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
        else if ( !insuranceRenewalRateTarget.equals( other.insuranceRenewalRateTarget ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( attachingRate == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.attachingRate != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
        else if ( !attachingRate.equals( other.attachingRate ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( attachingRateTarget == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.attachingRateTarget != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
        else if ( !attachingRateTarget.equals( other.attachingRateTarget ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAttachingRate( String attachingRate )
 | 
			
		||||
    {
 | 
			
		||||
        this.attachingRate = attachingRate;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getInsuranceRenewalRateTarget()
 | 
			
		||||
    {
 | 
			
		||||
        return insuranceRenewalRateTarget;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setInsuranceRenewalRateTarget( String insuranceRenewalRateTarget )
 | 
			
		||||
    {
 | 
			
		||||
        this.insuranceRenewalRateTarget = insuranceRenewalRateTarget;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getAttachingRateTarget()
 | 
			
		||||
    {
 | 
			
		||||
        return attachingRateTarget;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAttachingRateTarget( String attachingRateTarget )
 | 
			
		||||
    {
 | 
			
		||||
        this.attachingRateTarget = attachingRateTarget;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getDepartmentCode()
 | 
			
		||||
    {
 | 
			
		||||
        return departmentCode;
 | 
			
		||||
@@ -153,21 +292,4 @@ public class DepartmentArchievement
 | 
			
		||||
    {
 | 
			
		||||
        this.departmentCode = departmentCode;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "department_code" )
 | 
			
		||||
    private String departmentCode;
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "total_archievement" )
 | 
			
		||||
    private long totalArchievement; // 总业绩
 | 
			
		||||
 | 
			
		||||
    // 每月业绩列表
 | 
			
		||||
    // 要保证数据是按照月份排序。
 | 
			
		||||
    @JsonProperty( "mensual_archievement_list" )
 | 
			
		||||
    private ArrayList<MensualArchievementItem> mensualArchievementList;
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "insurance_renewal_rate" )
 | 
			
		||||
    private String insuranceRenewalRate; // 续保率
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "attaching_rate" )
 | 
			
		||||
    private String attachingRate; // 车非渗透率
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -34,21 +34,24 @@ public final class ImportBIExcelData
 | 
			
		||||
{
 | 
			
		||||
    private static Logger logger = LoggerFactory.getLogger( ImportBIExcelData.class );
 | 
			
		||||
 | 
			
		||||
    // 坐席 渗透率
 | 
			
		||||
    private static String[] TelsalerAttachingRateExcelTitle = new String[]
 | 
			
		||||
    { "部门", "经办", "车险保费(万)", "车险保费占比", "非车保费(万)", "当月保费渗透率", "保费渗透率环比上月", "当月客户渗透率", "客户渗透率环比上月",
 | 
			
		||||
            "当月车非客均保费", "客均保费环比上月"};
 | 
			
		||||
 | 
			
		||||
    // 坐席 续保率
 | 
			
		||||
    private static String[] TelSalerRenewalRateExcelTitle = new String[]
 | 
			
		||||
    { "责任部门", "责任人", "机构目标值1(%)", "到期数-全月", "序时到期数占比(%)", "个车续保率(序时)(%)", "个车续保率(全月)(%)", "环比昨日(%)",
 | 
			
		||||
            "环比上月(%)", "平均提前签单天数", "环比"};
 | 
			
		||||
            "环比上月(%)", "序时-部门内", "全月-部门内"};
 | 
			
		||||
 | 
			
		||||
    // 机构 渗透率
 | 
			
		||||
    private static String[] DepartmentAttachingRateExcelTitle = new String[]
 | 
			
		||||
    { "部门", "目标值-机构", "目标差距", "车险保费(万)", "车险保费占比", "非车保费(万)", "当月保费渗透率", "保费渗透率环比上月", "车险客户数", "当月客户渗透率",
 | 
			
		||||
            "客户渗透率环比上月", "当月车非客均保费", "客均保费环比上月"};
 | 
			
		||||
 | 
			
		||||
    // 机构 续保率
 | 
			
		||||
    private static String[] DepartmentRenewalRateExcelTitle = new String[]
 | 
			
		||||
    { "责任部门", "机构目标值1(%)", "到期数-全月", "序时到期数占比(%)", "个车续保率(序时)(%)", "个车续保率(全月)(%)", "环比昨日(%)",
 | 
			
		||||
            "环比上月(%)", "平均提前签单天数", "环比",};
 | 
			
		||||
            "环比上月(%)", "序时-部门内", "全月-部门内",};
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 用于通过对比标题行判断excel文件格式的函数。
 | 
			
		||||
@@ -94,6 +97,8 @@ public final class ImportBIExcelData
 | 
			
		||||
                for ( Cell cell : titleRow )
 | 
			
		||||
                {
 | 
			
		||||
                    String cellString = MyPOIUtils.getStringCellValue( cell );
 | 
			
		||||
                    
 | 
			
		||||
                    logger.info( "比较报表标题行,待导入报表标题:" + cellString + ";验证标题:" + title[cellIndex] );
 | 
			
		||||
 | 
			
		||||
                    if ( !cellString.equals( title[cellIndex] ) )
 | 
			
		||||
                    {
 | 
			
		||||
@@ -320,11 +325,11 @@ public final class ImportBIExcelData
 | 
			
		||||
                    double 个车续保率全月 = MyPOIUtils.getNumbericCellValue( row, 6 ) * 100;
 | 
			
		||||
                    double 环比昨日 = MyPOIUtils.getNumbericCellValue( row, 7 ) * 100;
 | 
			
		||||
                    double 环比上月 = MyPOIUtils.getNumbericCellValue( row, 8 ) * 100;
 | 
			
		||||
                    double 平均提前签单天数 = MyPOIUtils.getNumbericCellValue( row, 9 );
 | 
			
		||||
                    double 环比 = MyPOIUtils.getNumbericCellValue( row, 10 );
 | 
			
		||||
                    // double 平均提前签单天数 = MyPOIUtils.getNumbericCellValue( row, 9 );
 | 
			
		||||
                    // double 环比 = MyPOIUtils.getNumbericCellValue( row, 10 );
 | 
			
		||||
 | 
			
		||||
                    BITelsalerRenewalRateRecord record = new BITelsalerRenewalRateRecord( 责任部门, 责任人,
 | 
			
		||||
                            机构目标值, 到期数全月, 序时到期数占比, 个车续保率序时, 个车续保率全月, 环比昨日, 环比上月, 平均提前签单天数, 环比 );
 | 
			
		||||
                            机构目标值, 到期数全月, 序时到期数占比, 个车续保率序时, 个车续保率全月, 环比昨日, 环比上月 );
 | 
			
		||||
 | 
			
		||||
                    records.add( record );
 | 
			
		||||
                }
 | 
			
		||||
@@ -499,11 +504,11 @@ public final class ImportBIExcelData
 | 
			
		||||
                    double 个车续保率全月 = MyPOIUtils.getNumbericCellValue( row, 5 ) * 100;
 | 
			
		||||
                    double 环比昨日 = MyPOIUtils.getNumbericCellValue( row, 6 ) * 100;
 | 
			
		||||
                    double 环比上月 = MyPOIUtils.getNumbericCellValue( row, 7 ) * 100;
 | 
			
		||||
                    int 平均提前签单天数 = (int) MyPOIUtils.getNumbericCellValue( row, 8 );
 | 
			
		||||
                    double 环比 = MyPOIUtils.getNumbericCellValue( row, 9 ) * 100;
 | 
			
		||||
                    // int 平均提前签单天数 = (int) MyPOIUtils.getNumbericCellValue( row, 8 );
 | 
			
		||||
                    // double 环比 = MyPOIUtils.getNumbericCellValue( row, 9 ) * 100;
 | 
			
		||||
 | 
			
		||||
                    BIDepartmentRenewalRateRecord record = new BIDepartmentRenewalRateRecord( 责任部门,
 | 
			
		||||
                            机构目标值, 到期数全月, 序时到期数占比, 个车续保率序时, 个车续保率全月, 环比昨日, 环比上月, 平均提前签单天数, 环比 );
 | 
			
		||||
                            机构目标值, 到期数全月, 序时到期数占比, 个车续保率序时, 个车续保率全月, 环比昨日, 环比上月 );
 | 
			
		||||
 | 
			
		||||
                    records.add( record );
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ public class ImportTWRTelsalerData
 | 
			
		||||
            "学历类型", "用工性质名称", "合同种类", "合同类型", "合同性质", "合同签订次数", "合同生效日期", "合同到期日期", "人员属性", "保代员工号",
 | 
			
		||||
            "职场属性", "办公性质", "保代人员属性", "人员状态",};
 | 
			
		||||
 | 
			
		||||
    public static void importTWrTelsalerDataFromExcel( String filePath, int sheetIndex,
 | 
			
		||||
    public static ArrayList<TWrTelsalerRecord> importTWrTelsalerDataFromExcel( String filePath, int sheetIndex,
 | 
			
		||||
            int firstRow ) throws IOException, InvalidFormatException
 | 
			
		||||
    {
 | 
			
		||||
        ArrayList<TWrTelsalerRecord> records = new ArrayList<>( 200 );
 | 
			
		||||
@@ -132,6 +132,8 @@ public class ImportTWRTelsalerData
 | 
			
		||||
                error.printStackTrace();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return records;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static boolean checkExcelFormat( Sheet sheet, String caption, int captionRowIndex,
 | 
			
		||||
 
 | 
			
		||||
@@ -70,11 +70,10 @@ public class ArchievementQueryController
 | 
			
		||||
 | 
			
		||||
            result.setTotalArchievement( departmentArch.getTotalArchievement() );
 | 
			
		||||
            result.setInsuranceRenewalRate( departmentArch.getInsuranceRenewalRate() );
 | 
			
		||||
            result.setInsuranceRenewalRateTarget( departmentArch.getInsuranceRenewalRateTarget() );
 | 
			
		||||
            result.setAttachingRate( departmentArch.getAttachingRate() );
 | 
			
		||||
            // result.addAdvanceRewardGainer( "沈群" );
 | 
			
		||||
            // result.addLeadingRewardGainer( "王鸿津" );
 | 
			
		||||
            // result.addLeadingRewardGainer( "林宗泽" );
 | 
			
		||||
            // result.addBackwardStaff( "王炜" );
 | 
			
		||||
            result.setAttachingRateTarget( departmentArch.getAttachingRateTarget() );
 | 
			
		||||
 | 
			
		||||
            result.setMensualArchievementList( departmentArch.getMensualArchievementList() );
 | 
			
		||||
        }
 | 
			
		||||
        catch ( IOException error )
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,6 @@
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package com.cpic.xim.web.controllers.archievement.department;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
@@ -23,6 +22,35 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 | 
			
		||||
 */
 | 
			
		||||
public class DepartmentArchievementQueryResult extends QueryResponse
 | 
			
		||||
{
 | 
			
		||||
    @JsonProperty( "total_archievement" )
 | 
			
		||||
    private long totalArchievement; // 总业绩
 | 
			
		||||
 | 
			
		||||
    // 每月业绩列表
 | 
			
		||||
    // 要保证数据是按照月份排序。
 | 
			
		||||
    @JsonProperty( "mensual_archievement_list" )
 | 
			
		||||
    private ArrayList<MensualArchievementItem> mensualArchievementList;
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "insurance_renewal_rate" )
 | 
			
		||||
    private String insuranceRenewalRate; // 续保率
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "insurance_renewal_rate_target" )
 | 
			
		||||
    private String insuranceRenewalRateTarget; // 续保率目标值
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "attaching_rate" )
 | 
			
		||||
    private String attachingRate; // 车非渗透率
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "attaching_rate_target" )
 | 
			
		||||
    private String attachingRateTarget; // 车非渗透率目标值
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "leading_reward_gainers" )
 | 
			
		||||
    private Vector<String> leadingRewardGainers; // 领跑奖
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "advance_reward_gainers" )
 | 
			
		||||
    private Vector<String> advanceRewardGainers; // 飞跃奖
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "backward_list" )
 | 
			
		||||
    private Vector<String> backwardList; // 消七灭六坐席
 | 
			
		||||
 | 
			
		||||
    public DepartmentArchievementQueryResult()
 | 
			
		||||
    {
 | 
			
		||||
        mensualArchievementList = new ArrayList<MensualArchievementItem>();
 | 
			
		||||
@@ -117,26 +145,129 @@ public class DepartmentArchievementQueryResult extends QueryResponse
 | 
			
		||||
        this.backwardList = backwardList;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "total_archievement" )
 | 
			
		||||
    private long totalArchievement; // 总业绩
 | 
			
		||||
    public String getInsuranceRenewalRateTarget()
 | 
			
		||||
    {
 | 
			
		||||
        return insuranceRenewalRateTarget;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 每月业绩列表
 | 
			
		||||
    // 要保证数据是按照月份排序。
 | 
			
		||||
    @JsonProperty( "mensual_archievement_list" )
 | 
			
		||||
    private ArrayList<MensualArchievementItem> mensualArchievementList;
 | 
			
		||||
    public void setInsuranceRenewalRateTarget( String insuranceRenewalRateTarget )
 | 
			
		||||
    {
 | 
			
		||||
        this.insuranceRenewalRateTarget = insuranceRenewalRateTarget;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "insurance_renewal_rate" )
 | 
			
		||||
    private String insuranceRenewalRate; // 续保率
 | 
			
		||||
    public String getAttachingRateTarget()
 | 
			
		||||
    {
 | 
			
		||||
        return attachingRateTarget;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "attaching_rate" )
 | 
			
		||||
    private String attachingRate; // 车非渗透率
 | 
			
		||||
    public void setAttachingRateTarget( String attachingRateTarget )
 | 
			
		||||
    {
 | 
			
		||||
        this.attachingRateTarget = attachingRateTarget;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "leading_reward_gainers" )
 | 
			
		||||
    private Vector<String> leadingRewardGainers; // 领跑奖
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString()
 | 
			
		||||
    {
 | 
			
		||||
        return "DepartmentArchievementQueryResult [totalArchievement=" + totalArchievement
 | 
			
		||||
                + ", mensualArchievementList=" + mensualArchievementList + ", insuranceRenewalRate="
 | 
			
		||||
                + insuranceRenewalRate + ", insuranceRenewalRateTarget="
 | 
			
		||||
                + insuranceRenewalRateTarget + ", attachingRate=" + attachingRate
 | 
			
		||||
                + ", attachingRateTarget=" + attachingRateTarget + ", leadingRewardGainers="
 | 
			
		||||
                + leadingRewardGainers + ", advanceRewardGainers=" + advanceRewardGainers
 | 
			
		||||
                + ", backwardList=" + backwardList + "]";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "advance_reward_gainers" )
 | 
			
		||||
    private Vector<String> advanceRewardGainers; // 飞跃奖
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode()
 | 
			
		||||
    {
 | 
			
		||||
        final int prime = 31;
 | 
			
		||||
        int result = super.hashCode();
 | 
			
		||||
        result = prime * result + (int) (totalArchievement ^ (totalArchievement >>> 32));
 | 
			
		||||
        result = prime * result
 | 
			
		||||
                + ((mensualArchievementList == null) ? 0 : mensualArchievementList.hashCode());
 | 
			
		||||
        result = prime * result
 | 
			
		||||
                + ((insuranceRenewalRate == null) ? 0 : insuranceRenewalRate.hashCode());
 | 
			
		||||
        result = prime * result + ((insuranceRenewalRateTarget == null) ? 0
 | 
			
		||||
                : insuranceRenewalRateTarget.hashCode());
 | 
			
		||||
        result = prime * result + ((attachingRate == null) ? 0 : attachingRate.hashCode());
 | 
			
		||||
        result = prime * result
 | 
			
		||||
                + ((attachingRateTarget == null) ? 0 : attachingRateTarget.hashCode());
 | 
			
		||||
        result = prime * result
 | 
			
		||||
                + ((leadingRewardGainers == null) ? 0 : leadingRewardGainers.hashCode());
 | 
			
		||||
        result = prime * result
 | 
			
		||||
                + ((advanceRewardGainers == null) ? 0 : advanceRewardGainers.hashCode());
 | 
			
		||||
        result = prime * result + ((backwardList == null) ? 0 : backwardList.hashCode());
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "backward_list" )
 | 
			
		||||
    private Vector<String> backwardList; // 消七灭六坐席
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals( Object obj )
 | 
			
		||||
    {
 | 
			
		||||
        if ( this == obj )
 | 
			
		||||
            return true;
 | 
			
		||||
        if ( !super.equals( obj ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( getClass() != obj.getClass() )
 | 
			
		||||
            return false;
 | 
			
		||||
        DepartmentArchievementQueryResult other = (DepartmentArchievementQueryResult) obj;
 | 
			
		||||
        if ( totalArchievement != other.totalArchievement )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( mensualArchievementList == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.mensualArchievementList != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
        else if ( !mensualArchievementList.equals( other.mensualArchievementList ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( insuranceRenewalRate == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.insuranceRenewalRate != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
        else if ( !insuranceRenewalRate.equals( other.insuranceRenewalRate ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( insuranceRenewalRateTarget == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.insuranceRenewalRateTarget != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
        else if ( !insuranceRenewalRateTarget.equals( other.insuranceRenewalRateTarget ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( attachingRate == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.attachingRate != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
        else if ( !attachingRate.equals( other.attachingRate ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( attachingRateTarget == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.attachingRateTarget != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
        else if ( !attachingRateTarget.equals( other.attachingRateTarget ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( leadingRewardGainers == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.leadingRewardGainers != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
        else if ( !leadingRewardGainers.equals( other.leadingRewardGainers ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( advanceRewardGainers == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.advanceRewardGainers != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
        else if ( !advanceRewardGainers.equals( other.advanceRewardGainers ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( backwardList == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.backwardList != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
        else if ( !backwardList.equals( other.backwardList ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,35 @@
 | 
			
		||||
package com.cpic.xim.web.controllers.dataimport;
 | 
			
		||||
 | 
			
		||||
public enum ReportType {
 | 
			
		||||
        BiTelsalerAttachingRateReport(1,"坐席车非渗透率"),
 | 
			
		||||
        BiTelsalerRenewalRateReport(2,"坐席续保率"),
 | 
			
		||||
        BiDepartmentAttachingRateReport(3,"部门车非渗透率"),
 | 
			
		||||
        BiDepartmentRenewalRateReport(4,"当月个车续保率跟踪报表【机构】"),
 | 
			
		||||
        TWrTelsalerList(10,"TWr坐席清单"); // Twr坐席清单
 | 
			
		||||
 | 
			
		||||
        private int reportTypeCode;
 | 
			
		||||
 | 
			
		||||
        private String reportTypeName;
 | 
			
		||||
        private ReportType( final int code, final String name )
 | 
			
		||||
        {
 | 
			
		||||
            this.reportTypeCode = code;
 | 
			
		||||
            this.reportTypeName = name;
 | 
			
		||||
        }
 | 
			
		||||
        public int getReportTypeCode()
 | 
			
		||||
        {
 | 
			
		||||
            return reportTypeCode;
 | 
			
		||||
        }
 | 
			
		||||
        public void setReportTypeCode( int reportTypeCode )
 | 
			
		||||
        {
 | 
			
		||||
            this.reportTypeCode = reportTypeCode;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public String getReportTypeName()
 | 
			
		||||
        {
 | 
			
		||||
            return reportTypeName;
 | 
			
		||||
        }
 | 
			
		||||
        public void setReportTypeName( String reportTypeName )
 | 
			
		||||
        {
 | 
			
		||||
            this.reportTypeName = reportTypeName;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -10,7 +10,6 @@
 | 
			
		||||
package com.cpic.xim.web.controllers.dataimport.bi;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.time.LocalDate;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import org.apache.ibatis.exceptions.PersistenceException;
 | 
			
		||||
import org.apache.ibatis.session.SqlSession;
 | 
			
		||||
@@ -23,13 +22,16 @@ import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMethod;
 | 
			
		||||
import org.springframework.web.bind.annotation.ResponseBody;
 | 
			
		||||
import com.cpic.xim.mybatis.mapper.ImportBIArchievementDataMapper;
 | 
			
		||||
import com.cpic.xim.mybatis.mapper.TWrTelsalerMapper;
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.BIDepartmentAttachingRateRecord;
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.BIDepartmentRenewalRateRecord;
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.BITelsalerAttachingRateRecord;
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.BITelsalerRenewalRateRecord;
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.TWrTelsalerRecord;
 | 
			
		||||
import com.cpic.xim.mybatis.utils.MybatisUtils;
 | 
			
		||||
import com.cpic.xim.utils.data.ImportBIExcelData;
 | 
			
		||||
import com.cpic.xim.web.controllers.dataimport.bi.ImportBIDataRequest.ReportType;
 | 
			
		||||
import com.cpic.xim.utils.data.ImportTWRTelsalerData;
 | 
			
		||||
import com.cpic.xim.web.controllers.dataimport.ReportType;;
 | 
			
		||||
 | 
			
		||||
@Controller
 | 
			
		||||
@RequestMapping( method = RequestMethod.POST, path = "/import_bi_data" )
 | 
			
		||||
@@ -43,29 +45,35 @@ public class ImportBIDataController
 | 
			
		||||
    {
 | 
			
		||||
        ImportBIDataResponse response = new ImportBIDataResponse();
 | 
			
		||||
        String filePath = request.getFilePath();
 | 
			
		||||
        ReportType type = request.getReportType();
 | 
			
		||||
        int type = request.getReportType();
 | 
			
		||||
        int firstRow = request.getFirstRow();
 | 
			
		||||
        int sheetIndex = request.getSheetIndex();
 | 
			
		||||
        int importedCount = 0;
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            if ( type == ReportType.TelsalerAttachingRateReport )
 | 
			
		||||
            if ( type == ReportType.BiTelsalerAttachingRateReport.getReportTypeCode() )
 | 
			
		||||
            {
 | 
			
		||||
                importedCount = importBITelsalerAttachingRate( filePath, sheetIndex, firstRow );
 | 
			
		||||
            }
 | 
			
		||||
            else if ( type == ReportType.TelsalerRenewalRateReport )
 | 
			
		||||
            else if ( type == ReportType.BiTelsalerRenewalRateReport.getReportTypeCode() )
 | 
			
		||||
            {
 | 
			
		||||
                importedCount = importBITeslsalerRenewalRate( filePath, sheetIndex, firstRow );
 | 
			
		||||
            }
 | 
			
		||||
            else if ( type == ReportType.DepartmentAttachingRateReport )
 | 
			
		||||
            else if ( type == ReportType.BiDepartmentAttachingRateReport.getReportTypeCode() )
 | 
			
		||||
            {
 | 
			
		||||
                importedCount = importBIDepartmentAttachingRate( filePath, sheetIndex, firstRow );
 | 
			
		||||
            }
 | 
			
		||||
            else if ( type == ReportType.DepartmentRenewalRateReport )
 | 
			
		||||
            else if ( type == ReportType.BiDepartmentRenewalRateReport.getReportTypeCode() )
 | 
			
		||||
            {
 | 
			
		||||
                importedCount = importBIDepartmentRenewalRate( filePath, sheetIndex, firstRow );
 | 
			
		||||
            }
 | 
			
		||||
            else if ( type == ReportType.TWrTelsalerList.getReportTypeCode() )
 | 
			
		||||
            {
 | 
			
		||||
                logger.info( "导入机构续保率报表。");
 | 
			
		||||
                
 | 
			
		||||
                importedCount = importTWrTelsalerList( filePath, sheetIndex, firstRow );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            response.setImportedCount( importedCount );
 | 
			
		||||
            response.setSuccess( true );
 | 
			
		||||
@@ -254,4 +262,43 @@ public class ImportBIDataController
 | 
			
		||||
 | 
			
		||||
        return importedCount;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static int importTWrTelsalerList( String filePath, int sheetIndex, int firstRow )
 | 
			
		||||
            throws PersistenceException, IOException, InvalidFormatException
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        ArrayList<TWrTelsalerRecord> records = null;
 | 
			
		||||
        SqlSession session = null;
 | 
			
		||||
        TWrTelsalerMapper mapper = null;
 | 
			
		||||
        int importedCount = 0;
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            records = ImportTWRTelsalerData.importTWrTelsalerDataFromExcel(filePath, sheetIndex, firstRow);
 | 
			
		||||
            session = MybatisUtils.getSqlSessionBatch();
 | 
			
		||||
            mapper = session.getMapper(TWrTelsalerMapper.class);
 | 
			
		||||
            
 | 
			
		||||
            mapper.cleanTWrTelsalerTeamRecord();
 | 
			
		||||
 | 
			
		||||
            for ( TWrTelsalerRecord record : records )
 | 
			
		||||
            {
 | 
			
		||||
                mapper.insertTWrTelsalerRecordToDB(record);
 | 
			
		||||
 | 
			
		||||
                importedCount++;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            session.commit();
 | 
			
		||||
        }
 | 
			
		||||
        catch ( Exception error)
 | 
			
		||||
        {
 | 
			
		||||
            if ( session != null )
 | 
			
		||||
            {
 | 
			
		||||
                session.rollback();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            throw error;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return importedCount;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,78 +3,65 @@
 | 
			
		||||
 * @Date: 2023-10-13 14:39:06
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/dataimport/bi/ImportBIDataRequest.java
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2023} by Kane, All Rights Reserved. 
 | 
			
		||||
 * @Description:
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) ${2023} by Kane, All Rights Reserved.
 | 
			
		||||
 */
 | 
			
		||||
package com.cpic.xim.web.controllers.dataimport.bi;
 | 
			
		||||
 | 
			
		||||
import org.springframework.stereotype.Controller;
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonProperty;
 | 
			
		||||
import org.springframework.stereotype.Controller;
 | 
			
		||||
 | 
			
		||||
@Controller
 | 
			
		||||
public class ImportBIDataRequest
 | 
			
		||||
{
 | 
			
		||||
    public enum ReportType {
 | 
			
		||||
        TelsalerAttachingRateReport, TelsalerRenewalRateReport, DepartmentAttachingRateReport, DepartmentRenewalRateReport
 | 
			
		||||
    };
 | 
			
		||||
public class ImportBIDataRequest {
 | 
			
		||||
 | 
			
		||||
    // 导入文件的路径
 | 
			
		||||
    @JsonProperty( "filePath" )
 | 
			
		||||
    private String     filePath;
 | 
			
		||||
    @JsonProperty("filePath")
 | 
			
		||||
    private String filePath;
 | 
			
		||||
 | 
			
		||||
    // 报表名称
 | 
			
		||||
    @JsonProperty( "reportType" )
 | 
			
		||||
    private ReportType reportType;
 | 
			
		||||
    @JsonProperty("reportType")
 | 
			
		||||
    private int reportType;
 | 
			
		||||
 | 
			
		||||
    // 是否有标题行
 | 
			
		||||
    @JsonProperty( "firstRow" )
 | 
			
		||||
    private int    firstRow;
 | 
			
		||||
    @JsonProperty("firstRow")
 | 
			
		||||
    private int firstRow;
 | 
			
		||||
 | 
			
		||||
    // sheet索引
 | 
			
		||||
    @JsonProperty( "sheetIndex" )
 | 
			
		||||
    private int        sheetIndex;
 | 
			
		||||
    @JsonProperty("sheetIndex")
 | 
			
		||||
    private int sheetIndex;
 | 
			
		||||
 | 
			
		||||
    public ImportBIDataRequest()
 | 
			
		||||
    {}
 | 
			
		||||
    public ImportBIDataRequest() {}
 | 
			
		||||
 | 
			
		||||
    public int getFirstRow()
 | 
			
		||||
    {
 | 
			
		||||
    public int getFirstRow() {
 | 
			
		||||
        return firstRow;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setFirstRow( int firstRow )
 | 
			
		||||
    {
 | 
			
		||||
    public void setFirstRow(int firstRow) {
 | 
			
		||||
        this.firstRow = firstRow;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getSheetIndex()
 | 
			
		||||
    {
 | 
			
		||||
    public int getSheetIndex() {
 | 
			
		||||
        return sheetIndex;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setSheetIndex( int sheetIndex )
 | 
			
		||||
    {
 | 
			
		||||
    public void setSheetIndex(int sheetIndex) {
 | 
			
		||||
        this.sheetIndex = sheetIndex;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getFilePath()
 | 
			
		||||
    {
 | 
			
		||||
    public String getFilePath() {
 | 
			
		||||
        return filePath;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setFilePath( String filePath )
 | 
			
		||||
    {
 | 
			
		||||
    public void setFilePath(String filePath) {
 | 
			
		||||
        this.filePath = filePath;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ReportType getReportType()
 | 
			
		||||
    {
 | 
			
		||||
    public int getReportType() {
 | 
			
		||||
        return reportType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setReportType( ReportType reportType )
 | 
			
		||||
    {
 | 
			
		||||
    public void setReportType(int reportType) {
 | 
			
		||||
        this.reportType = reportType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -84,7 +71,7 @@ public class ImportBIDataRequest
 | 
			
		||||
        final int prime = 31;
 | 
			
		||||
        int result = 1;
 | 
			
		||||
        result = prime * result + ((filePath == null) ? 0 : filePath.hashCode());
 | 
			
		||||
        result = prime * result + ((reportType == null) ? 0 : reportType.hashCode());
 | 
			
		||||
        result = prime * result + reportType;
 | 
			
		||||
        result = prime * result + firstRow;
 | 
			
		||||
        result = prime * result + sheetIndex;
 | 
			
		||||
        return result;
 | 
			
		||||
@@ -117,11 +104,17 @@ public class ImportBIDataRequest
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString()
 | 
			
		||||
    {
 | 
			
		||||
        return "ImportBIDataRequest [filePath=" + filePath + ", reportType=" + reportType
 | 
			
		||||
                + ", firstRow=" + firstRow + ", sheetIndex=" + sheetIndex + "]";
 | 
			
		||||
    public String toString() {
 | 
			
		||||
        return (
 | 
			
		||||
            "ImportBIDataRequest [filePath=" +
 | 
			
		||||
            filePath +
 | 
			
		||||
            ", reportType=" +
 | 
			
		||||
            reportType +
 | 
			
		||||
            ", firstRow=" +
 | 
			
		||||
            firstRow +
 | 
			
		||||
            ", sheetIndex=" +
 | 
			
		||||
            sheetIndex +
 | 
			
		||||
            "]"
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,15 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-02-28 22:52:32
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/filters/cros/CrosFilter.java
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 * @Date: 2023-02-28 22:52:32
 | 
			
		||||
 * 
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * 
 | 
			
		||||
 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/filters/cros/CrosFilter.java
 | 
			
		||||
 * 
 | 
			
		||||
 * @Description:
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved.
 | 
			
		||||
 */
 | 
			
		||||
package com.cpic.xim.web.filters.cros;
 | 
			
		||||
 | 
			
		||||
@@ -23,30 +27,31 @@ import org.springframework.http.HttpMethod;
 | 
			
		||||
 | 
			
		||||
public class CrosFilter implements Filter
 | 
			
		||||
{
 | 
			
		||||
    private static Logger logger = LoggerFactory.getLogger(CrosFilter.class);
 | 
			
		||||
    private static Logger logger = LoggerFactory.getLogger( CrosFilter.class );
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void doFilter( ServletRequest req, ServletResponse resp, FilterChain chain )
 | 
			
		||||
            throws ServletException, IOException
 | 
			
		||||
                                                                                        throws ServletException,
 | 
			
		||||
                                                                                        IOException
 | 
			
		||||
    {
 | 
			
		||||
        HttpServletRequest request = (HttpServletRequest) req;
 | 
			
		||||
        HttpServletResponse response = (HttpServletResponse) resp;
 | 
			
		||||
        String method = request.getMethod();
 | 
			
		||||
        String originHeader = request.getHeader( "Origin" );
 | 
			
		||||
        
 | 
			
		||||
        logger.info( "收到" + method + "请求,来自" + originHeader);
 | 
			
		||||
        
 | 
			
		||||
        HttpServletRequest  request      = ( HttpServletRequest ) req;
 | 
			
		||||
        HttpServletResponse response     = ( HttpServletResponse ) resp;
 | 
			
		||||
        String              method       = request.getMethod();
 | 
			
		||||
        String              originHeader = request.getHeader( "Origin" );
 | 
			
		||||
 | 
			
		||||
        logger.info( "收到" + method + "请求,来自" + originHeader );
 | 
			
		||||
 | 
			
		||||
        // 如果是Options请求
 | 
			
		||||
        if ( method.equals(HttpMethod.OPTIONS.toString()) )
 | 
			
		||||
        if ( method.equals( HttpMethod.OPTIONS.toString() ) )
 | 
			
		||||
        {
 | 
			
		||||
            originHeader = "*";
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        response.setHeader( "Access-Control-Allow-Origin", originHeader );
 | 
			
		||||
        response.setHeader( "Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT" );
 | 
			
		||||
        response.setHeader( "Access-Control-Max-Age", "0" );
 | 
			
		||||
        response.setHeader( "Access-Control-Allow-Headers",
 | 
			
		||||
                "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token" );
 | 
			
		||||
                            "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token" );
 | 
			
		||||
        response.setHeader( "Access-Control-Allow-Credentials", "true" );
 | 
			
		||||
        response.setHeader( "XDomainRequestAllowed", "1" );
 | 
			
		||||
        response.setHeader( "XDomainRequestAllowed", "1" );
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,9 @@
 | 
			
		||||
        call telsale_archievement_pkg.department_archievement(
 | 
			
		||||
            #{a_department_code, mode=IN, jdbcType=VARCHAR},
 | 
			
		||||
            #{a_attaching_rate, mode=OUT, jdbcType=VARCHAR},
 | 
			
		||||
            #{a_attaching_rate_target, mode=OUT, jdbcType=VARCHAR},
 | 
			
		||||
            #{a_renewal_rate, mode=OUT, jdbcType=VARCHAR},
 | 
			
		||||
            #{a_renewal_rate_target, mode=OUT, jdbcType=VARCHAR},
 | 
			
		||||
            #{a_total, mode=OUT, jdbcType=INTEGER, javaType=Integer},
 | 
			
		||||
            #{a_mensual_cur, mode=OUT, jdbcType=CURSOR, resultMap=MensualArchievementMapper})
 | 
			
		||||
    </select>
 | 
			
		||||
 
 | 
			
		||||
@@ -11,12 +11,11 @@
 | 
			
		||||
    </insert>
 | 
			
		||||
 | 
			
		||||
    <insert id="insertTelsalerRenewalRateDataToDB" parameterType="com.cpic.xim.mybatis.pojo.BITelsalerRenewalRateRecord">
 | 
			
		||||
        insert into BI电销坐席续保率跟踪表 ("责任部门","责任人","机构目标值1(%)","到期数-全月",
 | 
			
		||||
        insert into "BI电销坐席续保率跟踪表-24年" ("责任部门","责任人","机构目标值1(%)","到期数-全月",
 | 
			
		||||
                                         "序时到期数占比(%)","个车续保率(序时)(%)","个车续保率(全月)(%)",
 | 
			
		||||
                                         "环比昨日(%)","环比上月(%)","平均提前签单天数","环比")
 | 
			
		||||
                                         "环比昨日(%)","环比上月(%)")
 | 
			
		||||
        values (#{责任部门},#{责任人},#{机构目标值},#{到期数全月},#{序时到期数占比},
 | 
			
		||||
        #{个车续保率序时},#{个车续保率全月},#{环比昨日},#{环比上月},
 | 
			
		||||
        #{平均提前签单天数},#{环比})
 | 
			
		||||
        #{个车续保率序时},#{个车续保率全月},#{环比昨日},#{环比上月} )
 | 
			
		||||
    </insert>
 | 
			
		||||
 | 
			
		||||
    <insert id="insertDepartmentAttachingRateDataToDB" parameterType="com.cpic.xim.mybatis.pojo.BIDepartmentAttachingRateRecord">
 | 
			
		||||
@@ -30,24 +29,23 @@
 | 
			
		||||
    </insert>
 | 
			
		||||
 | 
			
		||||
    <insert id="insertDepartmentRenewalRateDataToDB" parameterType="com.cpic.xim.mybatis.pojo.BIDepartmentRenewalRateRecord" >
 | 
			
		||||
        insert into BI机构当月个车续保率跟踪表( "责任部门","机构目标值1(%)","到期数-全月" ,"序时到期数占比(%)","个车续保率(序时)(%)",
 | 
			
		||||
        "个车续保率(全月)(%)","环比昨日(%)","环比上月(%)","平均提前签单天数","环比")
 | 
			
		||||
        insert into "BI机构续保率跟踪表-24年"( "责任部门","机构目标值1(%)","到期数-全月" ,"序时到期数占比(%)","个车续保率(序时)(%)",
 | 
			
		||||
        "个车续保率(全月)(%)","环比昨日(%)","环比上月(%)")
 | 
			
		||||
        values (#{责任部门},#{机构目标值},#{到期数全月},#{序时到期数占比},
 | 
			
		||||
        #{个车续保率序时},#{个车续保率全月},#{环比昨日},#{环比上月},
 | 
			
		||||
        #{平均提前签单天数},#{环比})
 | 
			
		||||
        #{个车续保率序时},#{个车续保率全月},#{环比昨日},#{环比上月} )
 | 
			
		||||
    </insert>
 | 
			
		||||
 | 
			
		||||
    <select id="cleanTelsalerAttachingRateData" statementType="CALLABLE">
 | 
			
		||||
        call telsale_bi_utils.清理BI电销坐席车非渗透率跟踪表()
 | 
			
		||||
        call TELSALE_BI_UTILS.清理BI电销坐席车非渗透率跟踪表()
 | 
			
		||||
    </select>
 | 
			
		||||
    <select id="cleanTelsalerRenewalRateData" statementType="CALLABLE">
 | 
			
		||||
        call telsale_bi_utils.清理BI电销坐席续保率跟踪表()
 | 
			
		||||
        call TELSALE_BI_UTILS.清理BI电销坐席续保率跟踪表()
 | 
			
		||||
    </select>
 | 
			
		||||
    <select id="cleanDepartmentAttachingRateData" statementType="CALLABLE">
 | 
			
		||||
        call telsale_bi_utils.清理BI部门渗透率跟踪表()
 | 
			
		||||
        call TELSALE_BI_UTILS.清理BI部门渗透率跟踪表()
 | 
			
		||||
    </select>
 | 
			
		||||
 | 
			
		||||
    <select id="cleanDepartmentRenewalRateData" statementType="CALLABLE">
 | 
			
		||||
        call telsale_bi_utils.清理BI部门续保率跟踪表()
 | 
			
		||||
        call TELSALE_BI_UTILS.清理BI部门续保率跟踪表()
 | 
			
		||||
    </select>
 | 
			
		||||
</mapper>
 | 
			
		||||
@@ -43,10 +43,8 @@
 | 
			
		||||
            t."个车续保率(序时)(%)" as 个车续保率序时,
 | 
			
		||||
            t."个车续保率(全月)(%)" as 个车续保率全月,
 | 
			
		||||
            t."环比昨日(%)" as 环比昨日,
 | 
			
		||||
            t."环比上月(%)" as 环比上月,
 | 
			
		||||
            t.平均提前签单天数,
 | 
			
		||||
            t.环比
 | 
			
		||||
        from BI电销坐席续保率跟踪表 t
 | 
			
		||||
            t."环比上月(%)" as 环比上月
 | 
			
		||||
        from "BI电销坐席续保率跟踪表-24年" t
 | 
			
		||||
    </select>
 | 
			
		||||
    <resultMap id="BITelsalerRenewalRate" type="com.cpic.xim.mybatis.pojo.BITelsalerRenewalRateRecord">
 | 
			
		||||
        <result property="责任部门" column="责任部门" javaType="String" jdbcType="VARCHAR" />
 | 
			
		||||
@@ -58,8 +56,8 @@
 | 
			
		||||
        <result property="个车续保率全月" column="个车续保率全月" javaType="double" jdbcType="DOUBLE" />
 | 
			
		||||
        <result property="环比昨日" column="环比昨日" javaType="double" jdbcType="DOUBLE" />
 | 
			
		||||
        <result property="环比上月" column="环比上月" javaType="double" jdbcType="DOUBLE" />
 | 
			
		||||
        <result property="平均提前签单天数" column="平均提前签单天数" javaType="int" jdbcType="DOUBLE" />
 | 
			
		||||
        <result property="环比" column="环比" javaType="int" jdbcType="DOUBLE" />
 | 
			
		||||
        <!-- <result property="平均提前签单天数" column="平均提前签单天数" javaType="int" jdbcType="DOUBLE" /> -->
 | 
			
		||||
        <!-- <result property="环比" column="环比" javaType="int" jdbcType="DOUBLE" /> -->
 | 
			
		||||
    </resultMap>
 | 
			
		||||
 | 
			
		||||
    <!-- 机构渗透率 -->
 | 
			
		||||
@@ -104,10 +102,8 @@
 | 
			
		||||
                t."个车续保率(序时)(%)" as 个车续保率序时,
 | 
			
		||||
                t."个车续保率(全月)(%)" as 个车续保率全月,
 | 
			
		||||
                t."环比昨日(%)" as 环比昨日,
 | 
			
		||||
                t."环比上月(%)" as 环比上月,
 | 
			
		||||
                t.平均提前签单天数,
 | 
			
		||||
                t.环比
 | 
			
		||||
           from BI机构当月个车续保率跟踪表 t
 | 
			
		||||
                t."环比上月(%)" as 环比上月
 | 
			
		||||
           from "BI机构续保率跟踪表-24年" t
 | 
			
		||||
    </select>
 | 
			
		||||
    <resultMap id="BIDepartmentRenewalRate" type="com.cpic.xim.mybatis.pojo.BIDepartmentRenewalRateRecord">
 | 
			
		||||
        <result column="责任部门" property="责任部门" jdbcType="VARCHAR" javaType="String" />
 | 
			
		||||
@@ -118,7 +114,7 @@
 | 
			
		||||
        <result column="个车续保率全月" property="个车续保率全月" jdbcType="DOUBLE" javaType="double" />
 | 
			
		||||
        <result column="环比昨日" property="环比昨日" jdbcType="DOUBLE" javaType="double" />
 | 
			
		||||
        <result column="环比上月" property="环比上月" jdbcType="DOUBLE" javaType="double" />
 | 
			
		||||
        <result column="平均提前签单天数" property="平均提前签单天数" jdbcType="INTEGER" javaType="int" />
 | 
			
		||||
        <result column="环比" property="环比" jdbcType="DOUBLE" javaType="double" />
 | 
			
		||||
        <!-- <result column="平均提前签单天数" property="平均提前签单天数" jdbcType="INTEGER" javaType="int" /> -->
 | 
			
		||||
        <!-- <result column="环比" property="环比" jdbcType="DOUBLE" javaType="double" /> -->
 | 
			
		||||
    </resultMap>
 | 
			
		||||
</mapper>
 | 
			
		||||
@@ -79,6 +79,86 @@
 | 
			
		||||
    </resultMap>
 | 
			
		||||
 | 
			
		||||
    <!-- insertTWrTelsalerRecordToDB --> 
 | 
			
		||||
    <insert id="insertTWrTelsalerRecordToDB">
 | 
			
		||||
    <insert id="insertTWrTelsalerRecordToDB" parameterType="TWrTelsalerRecord">
 | 
			
		||||
        insert into TWR_TELSALER_DEV(
 | 
			
		||||
            人员姓名,
 | 
			
		||||
            人员工号,
 | 
			
		||||
            籍贯,
 | 
			
		||||
            参加工作时间,
 | 
			
		||||
            入职日期,
 | 
			
		||||
            入司日期,
 | 
			
		||||
            业务类型,
 | 
			
		||||
            办公地省,
 | 
			
		||||
            办公地市,
 | 
			
		||||
            人员类别,
 | 
			
		||||
            现任岗位,
 | 
			
		||||
            现任职级,
 | 
			
		||||
            机构名称,
 | 
			
		||||
            职场分类,
 | 
			
		||||
            片区名称,
 | 
			
		||||
            团队名称,
 | 
			
		||||
            对口分公司,
 | 
			
		||||
            展业地区,
 | 
			
		||||
            招聘渠道,
 | 
			
		||||
            渠道明细,
 | 
			
		||||
            全日制最高学历,
 | 
			
		||||
            学历类型,
 | 
			
		||||
            用工性质名称,
 | 
			
		||||
            合同种类,
 | 
			
		||||
            合同类型,
 | 
			
		||||
            合同性质,
 | 
			
		||||
            合同签订次数,
 | 
			
		||||
            合同生效日期,
 | 
			
		||||
            合同到期日期,
 | 
			
		||||
            人员属性,
 | 
			
		||||
            保代员工号,
 | 
			
		||||
            职场属性,
 | 
			
		||||
            办公性质,
 | 
			
		||||
            保代人员属性,
 | 
			
		||||
            人员状态)
 | 
			
		||||
        values (
 | 
			
		||||
            #{人员姓名},
 | 
			
		||||
            #{人员工号},
 | 
			
		||||
            #{籍贯},
 | 
			
		||||
            #{参加工作时间},
 | 
			
		||||
            #{入职日期},
 | 
			
		||||
            #{入司日期},
 | 
			
		||||
            #{业务类型},
 | 
			
		||||
            #{办公地省},
 | 
			
		||||
            #{办公地市},
 | 
			
		||||
            #{人员类别},
 | 
			
		||||
            #{现任岗位},
 | 
			
		||||
            #{现任职级},
 | 
			
		||||
            #{机构名称},
 | 
			
		||||
            #{职场分类},
 | 
			
		||||
            #{片区名称},
 | 
			
		||||
            #{团队名称},
 | 
			
		||||
            #{对口分公司},
 | 
			
		||||
            #{展业地区},
 | 
			
		||||
            #{招聘渠道},
 | 
			
		||||
            #{渠道明细},
 | 
			
		||||
            #{全日制最高学历},
 | 
			
		||||
            #{学历类型},
 | 
			
		||||
            #{用工性质名称},
 | 
			
		||||
            #{合同种类},
 | 
			
		||||
            #{合同类型},
 | 
			
		||||
            #{合同性质},
 | 
			
		||||
            #{合同签订次数},
 | 
			
		||||
            #{合同生效日期},
 | 
			
		||||
            #{合同到期日期},
 | 
			
		||||
            #{人员属性},
 | 
			
		||||
            #{保代员工号},
 | 
			
		||||
            #{职场属性},
 | 
			
		||||
            #{办公性质},
 | 
			
		||||
            #{保代人员属性},
 | 
			
		||||
            #{人员状态} )
 | 
			
		||||
    </insert>
 | 
			
		||||
 | 
			
		||||
    <select id="cleanTWrTelsalerRecord" statementType="CALLABLE">
 | 
			
		||||
        call TELSALER_TWR_UTILS.清理TWR坐席清单()
 | 
			
		||||
    </select>
 | 
			
		||||
 | 
			
		||||
    <select id="cleanTWrTelsalerTeamRecord" statementType="CALLABLE">
 | 
			
		||||
        call TELSALER_TWR_UTILS.清理TWR团队清单()
 | 
			
		||||
    </select>
 | 
			
		||||
</mapper>
 | 
			
		||||
@@ -32,7 +32,8 @@
 | 
			
		||||
        <mapper resource="mybatis/mapper/RankingListMapper.xml" />
 | 
			
		||||
        <mapper resource="mybatis/mapper/RewardsMapper.xml" />
 | 
			
		||||
        <mapper resource="mybatis/mapper/ImportBIArchievementDataMapper.xml" />
 | 
			
		||||
        <mapper resource="mybatis/mapper/QueryBIArchievementDataMapper.xml" />    
 | 
			
		||||
        <mapper resource="mybatis/mapper/QueryBIArchievementDataMapper.xml" />
 | 
			
		||||
        <mapper resource="mybatis/mapper/TWrTelsalerMapper.xml" /> 
 | 
			
		||||
    </mappers>
 | 
			
		||||
 | 
			
		||||
</configuration>
 | 
			
		||||
@@ -1,8 +1,12 @@
 | 
			
		||||
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<web-app
 | 
			
		||||
  version="4.0"
 | 
			
		||||
  xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 | 
			
		||||
  xmlns:javaee="http://xmlns.jcp.org/xml/ns/javaee"
 | 
			
		||||
  xmlns:xml="http://www.w3.org/XML/1998/namespace"
 | 
			
		||||
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
			
		||||
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
 | 
			
		||||
  version="3.1">
 | 
			
		||||
 | 
			
		||||
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd">
 | 
			
		||||
  
 | 
			
		||||
  <display-name>Archetype Created Web Application</display-name>
 | 
			
		||||
 | 
			
		||||
  <servlet>
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,7 @@ import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
import com.cpic.xim.mybatis.mapper.ImportBIArchievementDataMapper;
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.BIDepartmentAttachingRateRecord;
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.BIDepartmentRenewalRateRecord;
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.BITelsalerRenewalRateRecord;
 | 
			
		||||
import com.cpic.xim.mybatis.utils.MybatisUtils;
 | 
			
		||||
import com.cpic.xim.utils.data.ImportBIExcelData;
 | 
			
		||||
@@ -74,7 +75,7 @@ public class BatchInsertTest
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testBatchInsertBITeslsalerRenewalRate()
 | 
			
		||||
    {
 | 
			
		||||
        String filePath = "D:/develop/cpicxim/deskop_task_schedule/数据/测试用/坐席-续保.xlsx";
 | 
			
		||||
        String filePath = "D:\\develop\\cpicxim\\deskop_task_schedule\\数据\\测试用\\24年报表\\坐席-续保.xlsx";
 | 
			
		||||
        ArrayList<BITelsalerRenewalRateRecord> records = null;
 | 
			
		||||
        SqlSession session = null;
 | 
			
		||||
        ImportBIArchievementDataMapper mapper = null;
 | 
			
		||||
@@ -114,7 +115,7 @@ public class BatchInsertTest
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testBatchInsertBIDepartmentAttachingRateToDB()
 | 
			
		||||
    {
 | 
			
		||||
        String filePath = "D:/develop/cpicxim/deskop_task_schedule/数据/测试用/机构渗透.xlsx";
 | 
			
		||||
        String filePath = "D:\\develop\\cpicxim\\deskop_task_schedule\\数据\\测试用\\24年报表\\机构-续保.xlsx";
 | 
			
		||||
 | 
			
		||||
        ArrayList<BIDepartmentAttachingRateRecord> records = null;
 | 
			
		||||
        SqlSession session = null;
 | 
			
		||||
@@ -148,4 +149,42 @@ public class BatchInsertTest
 | 
			
		||||
            assert( false );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testBatchInsertBIDepartmentRenewalRateToDB()
 | 
			
		||||
    {
 | 
			
		||||
        String filePath = "D:\\develop\\cpicxim\\deskop_task_schedule\\数据\\测试用\\24年报表\\机构-续保.xlsx";
 | 
			
		||||
 | 
			
		||||
        ArrayList<BIDepartmentRenewalRateRecord> records = null;
 | 
			
		||||
        SqlSession session = null;
 | 
			
		||||
        ImportBIArchievementDataMapper mapper = null;
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            records =
 | 
			
		||||
                    ImportBIExcelData.importBIDepartmentRenewalRateRecordsFromXlsx( filePath, 0, 1 );
 | 
			
		||||
            session = MybatisUtils.getSqlSessionBatch();
 | 
			
		||||
            mapper = session.getMapper( ImportBIArchievementDataMapper.class );
 | 
			
		||||
            
 | 
			
		||||
            mapper.cleanDepartmentRenewalRateData();
 | 
			
		||||
 | 
			
		||||
            for ( BIDepartmentRenewalRateRecord record : records )
 | 
			
		||||
            {
 | 
			
		||||
                mapper.insertDepartmentRenewalRateDataToDB( record );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            session.commit();
 | 
			
		||||
        }
 | 
			
		||||
        catch ( Exception error )
 | 
			
		||||
        {
 | 
			
		||||
            if ( session != null )
 | 
			
		||||
            {
 | 
			
		||||
                session.rollback();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            logger.error("错误", error);
 | 
			
		||||
            
 | 
			
		||||
            assert( false );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								数据/测试用/24年报表/坐席-续保.xlsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								数据/测试用/24年报表/坐席-续保.xlsx
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								数据/测试用/24年报表/机构-续保.xlsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								数据/测试用/24年报表/机构-续保.xlsx
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user