Compare commits
	
		
			31 Commits
		
	
	
		
			feature-ui
			...
			feature-te
		
	
	| 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.14.0", | ||||
|     "@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