From afccb2a88cf17558654c19d78518bfc3e3df6949 Mon Sep 17 00:00:00 2001 From: Kane Wang Date: Wed, 10 Jan 2024 18:24:10 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=AD=E4=BF=9D=E7=8E=87=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E6=94=B9=EF=BC=8C=E8=BF=98=E6=9C=AA?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/db/pkg/telsale_archievement_dev_pkg.pck | 4 +- code/db/pkg/telsale_archievement_pkg.pck | 6 +- code/db/pkg/telsale_bi_utils.pck | 10 +- code/db/pkg/telsale_bi_utils_dev.pck | 45 +++++++ code/db/常用语句.sql | 76 +++++------ code/web/task_schedule/package-lock.json | 122 +++++++++--------- code/web/task_schedule/package.json | 6 +- .../pojo/BIDepartmentRenewalRateRecord.java | 39 +----- .../xim/utils/data/ImportBIExcelData.java | 13 +- .../mapper/ImportBIArchievementDataMapper.xml | 15 +-- .../mapper/QueryBIArchievementDataMapper.xml | 6 +- .../test/BatchInsertTest.java | 43 +++++- .../测试用/24年报表/坐席-续保.xlsx | Bin 0 -> 15777 bytes .../测试用/24年报表/机构-续保.xlsx | Bin 0 -> 5357 bytes 14 files changed, 223 insertions(+), 162 deletions(-) create mode 100644 code/db/pkg/telsale_bi_utils_dev.pck create mode 100644 数据/测试用/24年报表/坐席-续保.xlsx create mode 100644 数据/测试用/24年报表/机构-续保.xlsx diff --git a/code/db/pkg/telsale_archievement_dev_pkg.pck b/code/db/pkg/telsale_archievement_dev_pkg.pck index 007a828..5cf6771 100644 --- a/code/db/pkg/telsale_archievement_dev_pkg.pck +++ b/code/db/pkg/telsale_archievement_dev_pkg.pck @@ -112,7 +112,7 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_DEV_PKG IS 2) INTO A_RENEWAL_RATE, A_RENEWAL_RATE_TARGET - FROM BI¸ʸٱ T + FROM "BIʸٱ-24" T WHERE T.β = L_DEPARTMENT_NAME; --roundСȱ0 @@ -229,7 +229,7 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_DEV_PKG IS 2) INTO L_ROWNUM, A_RENEWAL_RATE - FROM BIϯʸٱ T + FROM "BIϯʸٱ-24" T WHERE T. = L_CALLER_NAME AND ROWNUM = 1; EXCEPTION diff --git a/code/db/pkg/telsale_archievement_pkg.pck b/code/db/pkg/telsale_archievement_pkg.pck index 4c7eb57..a585372 100644 --- a/code/db/pkg/telsale_archievement_pkg.pck +++ b/code/db/pkg/telsale_archievement_pkg.pck @@ -86,7 +86,7 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS 2) INTO A_ATTACHING_RATE, A_ATTACHING_RATE_TARGET - FROM DESKTOP_ARCHIEVEMENT_ADMIN.BI͸ʸٱ DEPT + FROM BI͸ʸٱ DEPT WHERE DEPT. = L_DEPARTMENT_NAME; --roundСȱ0 @@ -112,7 +112,7 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS 2) INTO A_RENEWAL_RATE, A_RENEWAL_RATE_TARGET - FROM BI¸ʸٱ T + FROM "BIʸٱ-24" T WHERE T.β = L_DEPARTMENT_NAME; --roundСȱ0 @@ -229,7 +229,7 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS 2) INTO L_ROWNUM, A_RENEWAL_RATE - FROM BIϯʸٱ T + FROM "BIϯʸٱ-24" T WHERE T. = L_CALLER_NAME AND ROWNUM = 1; EXCEPTION diff --git a/code/db/pkg/telsale_bi_utils.pck b/code/db/pkg/telsale_bi_utils.pck index c4381bb..8e2a9fc 100644 --- a/code/db/pkg/telsale_bi_utils.pck +++ b/code/db/pkg/telsale_bi_utils.pck @@ -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 BIʸٱ; -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 BIϯ͸ʸٱ IS BEGIN @@ -24,6 +24,7 @@ CREATE OR REPLACE PACKAGE BODY telsale_bi_utils IS PROCEDURE BIϯʸٱ IS BEGIN EXECUTE IMMEDIATE 'truncate table BIϯʸٱ'; + --EXECUTE IMMEDIATE 'truncate table BIϯʸٱ-24'; END; PROCEDURE BI͸ʸٱ IS @@ -34,10 +35,11 @@ CREATE OR REPLACE PACKAGE BODY telsale_bi_utils IS PROCEDURE BIʸٱ IS BEGIN EXECUTE IMMEDIATE 'truncate table BI¸ʸٱ'; + --EXECUTE IMMEDIATE 'truncate table BIʸٱ-24'; END; BEGIN -- Initialization NULL; -END telsale_bi_utils; +END TELSALE_BI_UTILS; / diff --git a/code/db/pkg/telsale_bi_utils_dev.pck b/code/db/pkg/telsale_bi_utils_dev.pck new file mode 100644 index 0000000..bcb0257 --- /dev/null +++ b/code/db/pkg/telsale_bi_utils_dev.pck @@ -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ݱصĹ + + PROCEDURE BIϯ͸ʸٱ; + + PROCEDURE BIϯʸٱ; + + PROCEDURE BI͸ʸٱ; + + PROCEDURE BIʸٱ; + +END TELSALE_BI_UTILS_DEV; +/ +CREATE OR REPLACE PACKAGE BODY TELSALE_BI_UTILS_DEV IS + + PROCEDURE BIϯ͸ʸٱ IS + BEGIN + EXECUTE IMMEDIATE 'truncate table BIϯ͸ʸٱ'; + END; + + PROCEDURE BIϯʸٱ IS + BEGIN + --EXECUTE IMMEDIATE 'truncate table BIϯʸٱ'; + EXECUTE IMMEDIATE 'truncate table "BIϯʸٱ-24"'; + END; + + PROCEDURE BI͸ʸٱ IS + BEGIN + EXECUTE IMMEDIATE 'truncate table BI͸ʸٱ'; + END; + + PROCEDURE BIʸٱ IS + BEGIN + --EXECUTE IMMEDIATE 'truncate table BI¸ʸٱ'; + EXECUTE IMMEDIATE 'truncate table "BIʸٱ-24"'; + END; + +BEGIN + -- Initialization + NULL; +END TELSALE_BI_UTILS_DEV; +/ diff --git a/code/db/常用语句.sql b/code/db/常用语句.sql index fe5903f..fca5e89 100644 --- a/code/db/常用语句.sql +++ b/code/db/常用语句.sql @@ -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; --ϯ -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 ϯÿձ @@ -35,7 +35,7 @@ SELECT * SELECT , SUM(ۼ) , SUM() ڱ, - round((SUM(ۼ) / SUM()) * 100, + ROUND((SUM(ۼ) / SUM()) * 100, 0) || '%' FROM ϯͳ GROUP BY ; @@ -46,7 +46,7 @@ SELECT ϯ, SUM(ո˿ͻ), SUM(ںϱ), - round(SUM(ںϱ) / SUM(ո˿ͻ) * 100, + ROUND(SUM(ںϱ) / SUM(ո˿ͻ) * 100, 2) ͸ FROM ϯÿձ GROUP BY ·, @@ -57,7 +57,7 @@ HAVING ͸ DESC; SELECT ϯ, - round(SUM(ںϱ) / SUM(ո˿ͻ) * 100, + ROUND(SUM(ںϱ) / SUM(ո˿ͻ) * 100, 2) ͸ FROM ϯÿձ WHERE Ŵ = 'QDI' @@ -68,37 +68,37 @@ SELECT -- SELECT ϯ, - round(nvl(SUM(ۼ) / SUM() * 100, + ROUND(NVL(SUM(ۼ) / SUM() * 100, 0), 2) - FROM ϯͳ xb - WHERE xb. = 'ҵ' + FROM ϯͳ XB + WHERE XB. = 'ҵ' GROUP BY ϯ ORDER BY ϯ DESC; ------------------------------------- -SELECT zx.saler_name, - bm.department_name - FROM tele_saler zx, - tele_saler_team team, - idst0.bm_t bm - WHERE zx.saler_name = 'ų' - 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 = 'ų' + AND ZX.TEAM_CODE = TEAM.TEAM_CODE + AND TEAM.DEPARTMENT_CODE = BM.DEPARTMENT_CODE; ---------------------------------------- /* truncate table BI͸ʸٱ; */ SELECT * - FROM BIϯ͸ʸٱ t - WHERE t. = ''; + FROM BIϯ͸ʸٱ T + WHERE T. = ''; SELECT * - FROM BIϯʸٱ + FROM "BIϯʸٱ-24" WHERE = ''; SELECT * FROM BI͸ʸٱ; SELECT * - FROM BI¸ʸٱ; + FROM "BIʸٱ-24"; diff --git a/code/web/task_schedule/package-lock.json b/code/web/task_schedule/package-lock.json index 6e18e5d..913db80 100644 --- a/code/web/task_schedule/package-lock.json +++ b/code/web/task_schedule/package-lock.json @@ -14,7 +14,7 @@ "mitt": "^3.0.1", "moment": "^2.30.1", "sass-loader": "^13.3.3", - "vue": "^3.4.6", + "vue": "^3.4.7", "vue-router": "^4.2.5", "vuex": "^4.1.0" }, @@ -22,7 +22,7 @@ "@babel/eslint-parser": "^7.23.3", "@rushstack/eslint-patch": "^1.6.1", "@typescript-eslint/eslint-plugin": "^6.18.1", - "@vitejs/plugin-vue": "^5.0.2", + "@vitejs/plugin-vue": "^5.0.3", "@vue/cli-plugin-eslint": "^5.0.8", "@vue/eslint-config-typescript": "^12.0.0", "axios": "^1.6.5", @@ -32,7 +32,7 @@ "eslint-plugin-vue": "^9.19.2", "node-sass": "^9.0.0", "sass": "^1.69.7", - "style-loader": "^3.3.3", + "style-loader": "^3.3.4", "ts-node": "^10.9.2", "vue-eslint-parser": "^9.4.0" } @@ -2284,9 +2284,9 @@ } }, "node_modules/@vitejs/plugin-vue": { - "version": "5.0.2", - "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.0.2.tgz", - "integrity": "sha512-kEjJHrLb5ePBvjD0SPZwJlw1QTRcjjCA9sB5VyfonoXVBxTS7TMnqL6EkLt1Eu61RDeiuZ/WN9Hf6PxXhPI2uA==", + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.0.3.tgz", + "integrity": "sha512-b8S5dVS40rgHdDrw+DQi/xOM9ed+kSRZzfm1T74bMmBDCd8XO87NKlFYInzCtwvtWwXZvo1QxE2OSspTATWrbA==", "dev": true, "engines": { "node": "^18.0.0 || >=20.0.0" @@ -2561,12 +2561,12 @@ "dev": true }, "node_modules/@vue/compiler-core": { - "version": "3.4.6", - "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.6.tgz", - "integrity": "sha512-9SmkpHsXqhHGMIOp4cawUqp0AxLN2fJJfxh3sR2RaouVx/Y/ww5ts3dfpD9SCvD0n8cdO/Xw+kWEpa6EkH/vTQ==", + "version": "3.4.7", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.7.tgz", + "integrity": "sha512-hhCaE3pTMrlIJK7M/o3Xf7HV8+JoNTGOQ/coWS+V+pH6QFFyqtoXqQzpqsNp7UK17xYKua/MBiKj4e1vgZOBYw==", "dependencies": { "@babel/parser": "^7.23.6", - "@vue/shared": "3.4.6", + "@vue/shared": "3.4.7", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" @@ -2581,24 +2581,24 @@ } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.6", - "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.6.tgz", - "integrity": "sha512-i39ZuyHPzPb0v5yXZbvODGwLr+T7lS1rYSjMd1oCTa14aDP80kYpWXrWPF1JVD4QJJNyLgFnJ2hxvFLM7dy9NQ==", + "version": "3.4.7", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.7.tgz", + "integrity": "sha512-qDKBAIurCTub4n/6jDYkXwgsFuriqqmmLrIq1N2QDfYJA/mwiwvxi09OGn28g+uDdERX9NaKDLji0oTjE3sScg==", "dependencies": { - "@vue/compiler-core": "3.4.6", - "@vue/shared": "3.4.6" + "@vue/compiler-core": "3.4.7", + "@vue/shared": "3.4.7" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.6", - "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.6.tgz", - "integrity": "sha512-kTFOiyMtuetFqi5yEPA4hR6FTD36zKKY3qaBonxGb4pgj0yK1eACqH+iycTAsEqr2u4cOhcGkx3Yjecpgh6FTQ==", + "version": "3.4.7", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.7.tgz", + "integrity": "sha512-Gec6CLkReVswDYjQFq79O5rktri4R7TsD/VPCiUoJw40JhNNxaNJJa8mrQrWoJluW4ETy6QN0NUyC/JO77OCOw==", "dependencies": { "@babel/parser": "^7.23.6", - "@vue/compiler-core": "3.4.6", - "@vue/compiler-dom": "3.4.6", - "@vue/compiler-ssr": "3.4.6", - "@vue/shared": "3.4.6", + "@vue/compiler-core": "3.4.7", + "@vue/compiler-dom": "3.4.7", + "@vue/compiler-ssr": "3.4.7", + "@vue/shared": "3.4.7", "estree-walker": "^2.0.2", "magic-string": "^0.30.5", "postcss": "^8.4.32", @@ -2606,12 +2606,12 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.6", - "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.6.tgz", - "integrity": "sha512-XqeojjDitjMLyOogDePNSxw9XL4FAXchO9oOfqdzLVEtYES5j+AEilPJyP0KhQPfGecY2mJ3Y7/e6kkiJQLKvg==", + "version": "3.4.7", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.7.tgz", + "integrity": "sha512-PvYeSOvnCkST5mGS0TLwEn5w+4GavtEn6adcq8AspbHaIr+mId5hp7cG3ASy3iy8b+LuXEG2/QaV/nj5BQ/Aww==", "dependencies": { - "@vue/compiler-dom": "3.4.6", - "@vue/shared": "3.4.6" + "@vue/compiler-dom": "3.4.7", + "@vue/shared": "3.4.7" } }, "node_modules/@vue/component-compiler-utils": { @@ -2710,48 +2710,48 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.4.6", - "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.6.tgz", - "integrity": "sha512-/VuOxdWDyAeKFHjOuSKEtH9jEVPRgsXxu84utBP1SiXFcFRx2prwiC9cSR8hKOfj5nBwhLXYb6XEU69mLpuk0w==", + "version": "3.4.7", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.7.tgz", + "integrity": "sha512-F539DO0ogH0+L8F9Pnw7cjqibcmSOh5UTk16u5f4MKQ8fraqepI9zdh+sozPX6VmEHOcjo8qw3Or9ZcFFw4SZA==", "dependencies": { - "@vue/shared": "3.4.6" + "@vue/shared": "3.4.7" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.6", - "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.6.tgz", - "integrity": "sha512-XDOx8iiNmP66p+goUHT5XL1AnV8406VVFQARbylqmSCBZEtxchfu2ZoQk7U07ze8G/E0/BtX/C5o29zB1W4o5A==", + "version": "3.4.7", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.7.tgz", + "integrity": "sha512-QMMsWRQaD3BpGyjjChthpl4Mji4Fjx1qfdufsXlDkKU3HV+hWNor2z+29F+E1MmVcP0ZfRZUfqYgtsQoL7IGwQ==", "dependencies": { - "@vue/reactivity": "3.4.6", - "@vue/shared": "3.4.6" + "@vue/reactivity": "3.4.7", + "@vue/shared": "3.4.7" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.6", - "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.6.tgz", - "integrity": "sha512-8bdQR5CLfzClGvAOfbbCF8adE9oko0pRfe+dj297i0JCdCJ8AuyUMsXkt6vGPcRPqIKX4Z8f/bDPrwl+c7e4Wg==", + "version": "3.4.7", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.7.tgz", + "integrity": "sha512-XwegyUY1rw8zxsX1Z36vwYcqo+uOgih5ti7y9vx+pPFhNdSQmN4LqK2RmSeAJG1oKV8NqSUmjpv92f/x6h0SeQ==", "dependencies": { - "@vue/runtime-core": "3.4.6", - "@vue/shared": "3.4.6", + "@vue/runtime-core": "3.4.7", + "@vue/shared": "3.4.7", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.6", - "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.6.tgz", - "integrity": "sha512-0LS+GXf3M93KloaK/S0ZPq5PnKERgPAV5iNCCpjyBLhAQGGEeqfJojs3yXOAMQLSvXi9FLYDHzDEOLWoLaYbTQ==", + "version": "3.4.7", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.7.tgz", + "integrity": "sha512-3bWnYLEkLLhkDWqvNk7IvbQD4UcxvFKxELBiOO2iG3m6AniFIsBWfHOO5tLVQnjdWkODu4rq0GipmfEenVAK5Q==", "dependencies": { - "@vue/compiler-ssr": "3.4.6", - "@vue/shared": "3.4.6" + "@vue/compiler-ssr": "3.4.7", + "@vue/shared": "3.4.7" }, "peerDependencies": { - "vue": "3.4.6" + "vue": "3.4.7" } }, "node_modules/@vue/shared": { - "version": "3.4.6", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.6.tgz", - "integrity": "sha512-O16vewA05D0IwfG2N/OFEuVeb17pieaI32mmYXp36V8lp+/pI1YV04rRL9Eyjndj3xQO5SNjAxTh6ul4IlBa3A==" + "version": "3.4.7", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.7.tgz", + "integrity": "sha512-G+i4glX1dMJk88sbJEcQEGWRQnVm9eIY7CcQbO5dpdsD9SF8jka3Mr5OqZYGjczGN1+D6EUwdu6phcmcx9iuPA==" }, "node_modules/@vue/vue-loader-v15": { "name": "vue-loader", @@ -13889,9 +13889,9 @@ } }, "node_modules/style-loader": { - "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/style-loader/-/style-loader-3.3.3.tgz", - "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", "dev": true, "engines": { "node": ">= 12.13.0" @@ -14665,15 +14665,15 @@ } }, "node_modules/vue": { - "version": "3.4.6", - "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.6.tgz", - "integrity": "sha512-gAzw5oP0/h34/yq1LjLNpn4wrCKYMuWp2jbs/JirFiZAFWYhd9jTkXp4wIi5ApgMJrMgD6YFyyXwKsqFYR31IQ==", + "version": "3.4.7", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.7.tgz", + "integrity": "sha512-4urmkWpudekq0CPNMO7p6mBGa9qmTXwJMO2r6CT4EzIJVG7WoSReiysiNb7OSi/WI113oX0Srn9Rz1k/DCXKFQ==", "dependencies": { - "@vue/compiler-dom": "3.4.6", - "@vue/compiler-sfc": "3.4.6", - "@vue/runtime-dom": "3.4.6", - "@vue/server-renderer": "3.4.6", - "@vue/shared": "3.4.6" + "@vue/compiler-dom": "3.4.7", + "@vue/compiler-sfc": "3.4.7", + "@vue/runtime-dom": "3.4.7", + "@vue/server-renderer": "3.4.7", + "@vue/shared": "3.4.7" }, "peerDependencies": { "typescript": "*" diff --git a/code/web/task_schedule/package.json b/code/web/task_schedule/package.json index 7b83d7c..d3d7782 100644 --- a/code/web/task_schedule/package.json +++ b/code/web/task_schedule/package.json @@ -15,7 +15,7 @@ "mitt": "^3.0.1", "moment": "^2.30.1", "sass-loader": "^13.3.3", - "vue": "^3.4.6", + "vue": "^3.4.7", "vue-router": "^4.2.5", "vuex": "^4.1.0" }, @@ -23,7 +23,7 @@ "@babel/eslint-parser": "^7.23.3", "@rushstack/eslint-patch": "^1.6.1", "@typescript-eslint/eslint-plugin": "^6.18.1", - "@vitejs/plugin-vue": "^5.0.2", + "@vitejs/plugin-vue": "^5.0.3", "@vue/cli-plugin-eslint": "^5.0.8", "@vue/eslint-config-typescript": "^12.0.0", "axios": "^1.6.5", @@ -33,7 +33,7 @@ "eslint-plugin-vue": "^9.19.2", "node-sass": "^9.0.0", "sass": "^1.69.7", - "style-loader": "^3.3.3", + "style-loader": "^3.3.4", "ts-node": "^10.9.2", "vue-eslint-parser": "^9.4.0" } diff --git a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BIDepartmentRenewalRateRecord.java b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BIDepartmentRenewalRateRecord.java index f45b44f..9c463aa 100644 --- a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BIDepartmentRenewalRateRecord.java +++ b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BIDepartmentRenewalRateRecord.java @@ -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 [责任部门=" + 责任部门 + ", 机构目标值=" + 机构目标值 + ", 到期数全月=" + 到期数全月 + ", 序时到期数占比=" + 序时到期数占比 + ", 个车续保率序时=" + 个车续保率序时 + ", 个车续保率全月=" + 个车续保率全月 - + ", 环比昨日=" + 环比昨日 + ", 环比上月=" + 环比上月 + ", 平均提前签单天数=" + 平均提前签单天数 + ", 环比=" + 环比 - + "]"; + + ", 环比昨日=" + 环比昨日 + ", 环比上月=" + 环比上月 + "]"; } } diff --git a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/utils/data/ImportBIExcelData.java b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/utils/data/ImportBIExcelData.java index 866965d..329d84e 100644 --- a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/utils/data/ImportBIExcelData.java +++ b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/utils/data/ImportBIExcelData.java @@ -34,18 +34,21 @@ 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(%)", "到期数-全月", "序时到期数占比(%)", "个车续保率(序时)(%)", "个车续保率(全月)(%)", "环比昨日(%)", "环比上月(%)", "序时-部门内", "全月-部门内",}; @@ -499,11 +502,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 ); } diff --git a/code/后端/desktop_archievement_backend/src/main/resources/mybatis/mapper/ImportBIArchievementDataMapper.xml b/code/后端/desktop_archievement_backend/src/main/resources/mybatis/mapper/ImportBIArchievementDataMapper.xml index 530fde0..29caed3 100644 --- a/code/后端/desktop_archievement_backend/src/main/resources/mybatis/mapper/ImportBIArchievementDataMapper.xml +++ b/code/后端/desktop_archievement_backend/src/main/resources/mybatis/mapper/ImportBIArchievementDataMapper.xml @@ -29,24 +29,23 @@ - insert into BI机构当月个车续保率跟踪表( "责任部门","机构目标值1(%)","到期数-全月" ,"序时到期数占比(%)","个车续保率(序时)(%)", - "个车续保率(全月)(%)","环比昨日(%)","环比上月(%)","平均提前签单天数","环比") + insert into "BI机构续保率跟踪表-24年"( "责任部门","机构目标值1(%)","到期数-全月" ,"序时到期数占比(%)","个车续保率(序时)(%)", + "个车续保率(全月)(%)","环比昨日(%)","环比上月(%)") values (#{责任部门},#{机构目标值},#{到期数全月},#{序时到期数占比}, - #{个车续保率序时},#{个车续保率全月},#{环比昨日},#{环比上月}, - #{平均提前签单天数},#{环比}) + #{个车续保率序时},#{个车续保率全月},#{环比昨日},#{环比上月} ) \ No newline at end of file diff --git a/code/后端/desktop_archievement_backend/src/main/resources/mybatis/mapper/QueryBIArchievementDataMapper.xml b/code/后端/desktop_archievement_backend/src/main/resources/mybatis/mapper/QueryBIArchievementDataMapper.xml index edd30a5..5901d58 100644 --- a/code/后端/desktop_archievement_backend/src/main/resources/mybatis/mapper/QueryBIArchievementDataMapper.xml +++ b/code/后端/desktop_archievement_backend/src/main/resources/mybatis/mapper/QueryBIArchievementDataMapper.xml @@ -105,7 +105,7 @@ t."环比上月(%)" as 环比上月, t.平均提前签单天数, t.环比 - from BI机构当月个车续保率跟踪表 t + from "BI机构续保率跟踪表-24年" t @@ -116,7 +116,7 @@ - - + + \ No newline at end of file diff --git a/code/后端/desktop_archievement_backend/src/test/java/com/cpic/xim/DesktopArchievement/test/BatchInsertTest.java b/code/后端/desktop_archievement_backend/src/test/java/com/cpic/xim/DesktopArchievement/test/BatchInsertTest.java index 7bba7cb..45d52e9 100644 --- a/code/后端/desktop_archievement_backend/src/test/java/com/cpic/xim/DesktopArchievement/test/BatchInsertTest.java +++ b/code/后端/desktop_archievement_backend/src/test/java/com/cpic/xim/DesktopArchievement/test/BatchInsertTest.java @@ -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 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 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 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 ); + } + } } diff --git a/数据/测试用/24年报表/坐席-续保.xlsx b/数据/测试用/24年报表/坐席-续保.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8005caee618fba2615d9330c7c35df4a427ab059 GIT binary patch literal 15777 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