From a33981ac55aac94ddcd0fbe8266e9f5881469b9c Mon Sep 17 00:00:00 2001 From: Kane Wang Date: Thu, 26 Oct 2023 18:46:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=98=E6=9B=B4=E6=8A=A5=E8=A1=A8=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/db/pkg/telsale_archievement_pkg.pck | 30 ++- code/db/pkg/telsale_bi_utils.pck | 14 +- .../BI电销坐席续保率统计表.sql | 27 ++- .../BI电销坐席续保率跟踪表.sql | 14 ++ ...BI电销坐席车非渗透率跟踪表.sql | 14 ++ .../BI电销坐席车非渗透统计表.sql | 23 -- .../task_schedule/src/utils/archievement.ts | 5 + .../src/views/DesktopArchievement.vue | 6 +- .../pojo/BIDepartmentAttachingRateRecord.java | 27 ++- .../pojo/BITelsalerAttachingRateRecord.java | 83 ++++--- .../pojo/BITelsalerRenewalRateRecord.java | 69 +++++- .../archievement/CallerArchievement.java | 198 ++++++++++++---- .../xim/utils/data/ImportBIExcelData.java | 93 ++++++-- .../ArchievementQueryController.java | 12 +- .../CallerArchievementQueryResponse.java | 222 ++++++++++++++++++ .../caller/CallerArchievementQueryResult.java | 123 ---------- .../dataimport/bi/ImportBIDataController.java | 2 +- .../mybatis/mapper/ArchievementMapper.xml | 1 + .../mapper/ImportBIArchievementDataMapper.xml | 28 ++- .../test/BatchInsertTest.java | 43 ++-- 数据/测试用/坐席-渗透.xlsx | Bin 0 -> 27863 bytes 数据/测试用/坐席-续保.xlsx | Bin 0 -> 19399 bytes ...车续保率跟踪报表【机构】.xlsx | Bin 6057 -> 6067 bytes ...r业务员人力查询 - 坐席清单.xlsx | Bin 数据/测试用/{ => 旧}/坐席清单.xlsx | Bin .../测试用/{ => 旧}/坐席续保率.xlsx | Bin .../坐席车非渗透 - 副本.xlsx | Bin .../{ => 旧}/坐席车非渗透.xlsx | Bin ...车续保率跟踪报表【机构】.xlsx | Bin 0 -> 6057 bytes 数据/测试用/{ => 旧}/测试11.xlsx | Bin .../{ => 旧}/部门 - 副本 (2).xlsx | Bin .../测试用/{ => 旧}/部门 - 副本.xlsx | Bin 数据/测试用/{ => 旧}/部门.xlsx | Bin 数据/测试用/机构渗透.xlsx | Bin 0 -> 12075 bytes 34 files changed, 709 insertions(+), 325 deletions(-) create mode 100644 code/db/建表/BI电销坐席续保率跟踪表.sql create mode 100644 code/db/建表/BI电销坐席车非渗透率跟踪表.sql delete mode 100644 code/db/建表/BI电销坐席车非渗透统计表.sql create mode 100644 code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/caller/CallerArchievementQueryResponse.java delete mode 100644 code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/caller/CallerArchievementQueryResult.java create mode 100644 数据/测试用/坐席-渗透.xlsx create mode 100644 数据/测试用/坐席-续保.xlsx rename 数据/测试用/{ => 旧}/TWr业务员人力查询 - 坐席清单.xlsx (100%) rename 数据/测试用/{ => 旧}/坐席清单.xlsx (100%) rename 数据/测试用/{ => 旧}/坐席续保率.xlsx (100%) rename 数据/测试用/{ => 旧}/坐席车非渗透 - 副本.xlsx (100%) rename 数据/测试用/{ => 旧}/坐席车非渗透.xlsx (100%) create mode 100644 数据/测试用/旧/当月个车续保率跟踪报表【机构】.xlsx rename 数据/测试用/{ => 旧}/测试11.xlsx (100%) rename 数据/测试用/{ => 旧}/部门 - 副本 (2).xlsx (100%) rename 数据/测试用/{ => 旧}/部门 - 副本.xlsx (100%) rename 数据/测试用/{ => 旧}/部门.xlsx (100%) create mode 100644 数据/测试用/机构渗透.xlsx diff --git a/code/db/pkg/telsale_archievement_pkg.pck b/code/db/pkg/telsale_archievement_pkg.pck index ea5cd9a..01dc3dd 100644 --- a/code/db/pkg/telsale_archievement_pkg.pck +++ b/code/db/pkg/telsale_archievement_pkg.pck @@ -28,6 +28,7 @@ CREATE OR REPLACE PACKAGE telsale_archievement_pkg IS 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 ); @@ -90,7 +91,7 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS SELECT round(dept.±͸, 2) INTO A_ATTACHING_RATE - FROM desktop_archievement_admin.bi͸ͳƱ dept + FROM desktop_archievement_admin.BI͸ʸٱ dept WHERE dept. = L_DEPARTMENT_NAME; -- /*SELECT DECODE(SUM(), @@ -141,6 +142,7 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS 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); @@ -182,11 +184,15 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS SELECT rownum, round(nvl(t.±͸, 0), + 2), + round(nvl(t."ձ()" * 10000, + 0), 2) INTO l_rownum, - a_attaching_rate - FROM BIϯ͸ͳƱ t - WHERE t.ϯ = l_caller_name + a_attaching_rate, + a_present_month + FROM BIϯ͸ʸٱ t + WHERE t. = l_caller_name AND rownum = 1; /*SELECT decode(nvl(SUM(cf.ո˿ͻ), 0), @@ -211,12 +217,12 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS FROM ϯͳ xb WHERE xb.ϯ = a_caller_code;*/ SELECT rownum, - round(nvl(t.ȫ, + round(nvl(t."ʣȫ£(%)", 0), 2) INTO l_rownum, a_renewal_rate - FROM BIϯͳƱ t + FROM BIϯʸٱ t WHERE t. = l_caller_name AND rownum = 1; @@ -263,14 +269,14 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS -- ںа OPEN A_ATTACHING_RANKING_LIST FOR SELECT rownum, - paihang.ϯ AS caller_name, + paihang. AS caller_name, paihang.attaching_rate FROM (SELECT DISTINCT * - FROM (SELECT t.ϯ, + FROM (SELECT t., round(t.±͸, 2) attaching_rate, zuoxi.department_name - FROM BIϯ͸ͳƱ t, + FROM BIϯ͸ʸٱ t, (SELECT DISTINCT t.saler_code, t.saler_name, t.team_code, @@ -282,7 +288,7 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS WHERE t.team_code = team.team_code AND team.department_code = bm.department_code AND bm.department_name = L_DEPARTMENT_NAME) zuoxi - WHERE t.ϯ = zuoxi.saler_name) st + WHERE t. = zuoxi.saler_name) st ORDER BY st.department_name, st.attaching_rate DESC) paihang; -- а @@ -292,10 +298,10 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS paihang.xbl AS RENEWAL_RATE FROM (SELECT DISTINCT * FROM (SELECT t., - round(t.ȫ, + round(t."ʣȫ£(%)", 2) xbl, zuoxi.department_name - FROM BIϯͳƱ t, + FROM BIϯʸٱ t, (SELECT DISTINCT t.saler_code, t.saler_name, t.team_code, diff --git a/code/db/pkg/telsale_bi_utils.pck b/code/db/pkg/telsale_bi_utils.pck index e5471c8..c4381bb 100644 --- a/code/db/pkg/telsale_bi_utils.pck +++ b/code/db/pkg/telsale_bi_utils.pck @@ -4,9 +4,9 @@ CREATE OR REPLACE PACKAGE telsale_bi_utils IS -- Created : 2023/10/12 15:31:13 -- Purpose : biݱصĹ - PROCEDURE BIϯ͸ͳƱ; + PROCEDURE BIϯ͸ʸٱ; - PROCEDURE BIϯͳƱ; + PROCEDURE BIϯʸٱ; PROCEDURE BI͸ʸٱ; @@ -16,19 +16,19 @@ END telsale_bi_utils; / CREATE OR REPLACE PACKAGE BODY telsale_bi_utils IS - PROCEDURE BIϯ͸ͳƱ IS + PROCEDURE BIϯ͸ʸٱ IS BEGIN - EXECUTE IMMEDIATE 'truncate table BIϯ͸ͳƱ'; + EXECUTE IMMEDIATE 'truncate table BIϯ͸ʸٱ'; END; - PROCEDURE BIϯͳƱ IS + PROCEDURE BIϯʸٱ IS BEGIN - EXECUTE IMMEDIATE 'truncate table BIϯͳƱ'; + EXECUTE IMMEDIATE 'truncate table BIϯʸٱ'; END; PROCEDURE BI͸ʸٱ IS BEGIN - EXECUTE IMMEDIATE 'truncate table BI͸ͳƱ'; + EXECUTE IMMEDIATE 'truncate table BI͸ʸٱ'; END; PROCEDURE BIʸٱ IS diff --git a/code/db/建表/BI电销坐席续保率统计表.sql b/code/db/建表/BI电销坐席续保率统计表.sql index ac01831..1f4dfd9 100644 --- a/code/db/建表/BI电销坐席续保率统计表.sql +++ b/code/db/建表/BI电销坐席续保率统计表.sql @@ -1,14 +1,15 @@ ---drop table BIϯͳƱ; -create table BIϯͳƱ +drop table BIϯʸٱ; +create table BIϯʸٱ ( - summary_date date default sysdate not null, - varchar2(20) not null, - Ŀֵ NUMBER default 0 not null, - ȫ NUMBER default 0 not null, - ʱռ NUMBER default 0 not null, - ʱ NUMBER default 0 not null, - ȫ NUMBER default 0 not null, - NUMBER default 0 not null, - NUMBER default 0 not null -); -comment on table BIϯͳƱ is 'ڴBIϯȫݡ'; +"β" varchar2(100), +"" varchar2(30), +"Ŀֵ1(%)" number default 0, +"-ȫ" integer default 0, +"ʱռ(%)" number default 0, +"ʣʱ(%)" number default 0, +"ʣȫ£(%)" number default 0, +"(%)" number default 0, +"(%)" number default 0, +"ƽǰǩ" integer default 0, +"" number +) diff --git a/code/db/建表/BI电销坐席续保率跟踪表.sql b/code/db/建表/BI电销坐席续保率跟踪表.sql new file mode 100644 index 0000000..ac01831 --- /dev/null +++ b/code/db/建表/BI电销坐席续保率跟踪表.sql @@ -0,0 +1,14 @@ +--drop table BIϯͳƱ; +create table BIϯͳƱ +( + summary_date date default sysdate not null, + varchar2(20) not null, + Ŀֵ NUMBER default 0 not null, + ȫ NUMBER default 0 not null, + ʱռ NUMBER default 0 not null, + ʱ NUMBER default 0 not null, + ȫ NUMBER default 0 not null, + NUMBER default 0 not null, + NUMBER default 0 not null +); +comment on table BIϯͳƱ is 'ڴBIϯȫݡ'; diff --git a/code/db/建表/BI电销坐席车非渗透率跟踪表.sql b/code/db/建表/BI电销坐席车非渗透率跟踪表.sql new file mode 100644 index 0000000..feced2e --- /dev/null +++ b/code/db/建表/BI电销坐席车非渗透率跟踪表.sql @@ -0,0 +1,14 @@ +create table BIϯ͸ʸٱ +( +"" varchar2(100), +"" varchar2(100) not null, +"ձ()" number default 0, +"ձռ" number default 0, +"dz()" number default 0, +"±͸" number default 0, +"͸ʻ" number default 0, +"¿ͻ͸" number default 0, +"ͻ͸ʻ" number default 0, +"³ǿ;" number default 0, +";ѻ" number default 0 +); diff --git a/code/db/建表/BI电销坐席车非渗透统计表.sql b/code/db/建表/BI电销坐席车非渗透统计表.sql deleted file mode 100644 index c426302..0000000 --- a/code/db/建表/BI电销坐席车非渗透统计表.sql +++ /dev/null @@ -1,23 +0,0 @@ --- Create table -create table BIϯ͸ͳƱ -( - summary_date DATE default sysdate not null, - ϯ varchar2(20) not null, - ձ NUMBER default 0 not null, - ձռ NUMBER default 0 not null, - dz NUMBER default 0 not null, - ±͸ NUMBER default 0 not null, - ͸ʻ NUMBER default 0 not null, - ¿ͻ͸ NUMBER default 0 not null, - ͻ͸ʻ NUMBER default 0 not null, - ³ǿ; NUMBER default 0 not null, - ;ѻ NUMBER default 0 not null -) -tablespace DESKTOP_ARCHIEVEMENT - pctfree 10 - initrans 1 - maxtrans 255; --- Add comments to the table -comment on table BIϯ͸ͳƱ - is 'ڴBIÿյϯշdzձѺͳ͸ݡ'; - diff --git a/code/web/task_schedule/src/utils/archievement.ts b/code/web/task_schedule/src/utils/archievement.ts index 1d9f49e..130b097 100644 --- a/code/web/task_schedule/src/utils/archievement.ts +++ b/code/web/task_schedule/src/utils/archievement.ts @@ -31,6 +31,7 @@ interface CallerArchievement // 坐席业绩对象 success: boolean; message: string; total_archievement: number; + moto_premium_present_month: number; mensual_archievement_list: number[]; insurance_renewal_rate: string; attaching_rate: string; @@ -134,6 +135,7 @@ function queryCallerArchievement( callerInfo: TelSaler, render: any ): void success: false, message: "", total_archievement: 0, + moto_premium_present_month: 0, mensual_archievement_list: [], insurance_renewal_rate: "0.0", attaching_rate: "0.0", @@ -150,9 +152,12 @@ function queryCallerArchievement( callerInfo: TelSaler, render: any ): void { const data = response.data ?? {}; + console.log( "个人业绩数据", data ); + callArchievement.success = data.success ?? false; callArchievement.message = data.message ?? "服务器没有返回调用结果消息,请检查日志!"; callArchievement.total_archievement = data.total_archievement ?? 0; + callArchievement.moto_premium_present_month = data.motoPremiumPresentMonth ?? 0; callArchievement.mensual_archievement_list = []; callArchievement.insurance_renewal_rate = data.insurance_renewal_rate ?? "0.0"; callArchievement.attaching_rate = data.attaching_rate ?? "0.0"; diff --git a/code/web/task_schedule/src/views/DesktopArchievement.vue b/code/web/task_schedule/src/views/DesktopArchievement.vue index 8b7638e..40527d0 100644 --- a/code/web/task_schedule/src/views/DesktopArchievement.vue +++ b/code/web/task_schedule/src/views/DesktopArchievement.vue @@ -238,10 +238,10 @@ export default { ui.totalArchievement = data.total_archievement; ui.callerAttachingRate = data.attaching_rate; ui.callerRenewalRate = data.insurance_renewal_rate; - ui.callerPersentMonthPremium = data.mensual_archievement_list[thisMonth]; + ui.callerPersentMonthPremium = data.moto_premium_present_month; + // ui.callerPersentMonthPremium = data.mensual_archievement_list[thisMonth]; - // console.log( "业绩清单", ui.chartData ); - // console.log( "当月", data.mensual_archievement_list ); + console.log( "业绩清单", data ); ui.showUI = false; setTimeout(() => diff --git a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BIDepartmentAttachingRateRecord.java b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BIDepartmentAttachingRateRecord.java index be5146c..530fd89 100644 --- a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BIDepartmentAttachingRateRecord.java +++ b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BIDepartmentAttachingRateRecord.java @@ -2,7 +2,7 @@ * @Author: Kane * @Date: 2023-10-10 14:50:55 * @LastEditors: Kane - * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/DepartmentArchievementRecord.java + * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BIDepartmentAttachingRateRecord.java * @Description: * * Copyright (c) ${2023} by Kane, All Rights Reserved. @@ -27,19 +27,25 @@ public class BIDepartmentAttachingRateRecord private double attachingRate; // 保费渗透率环比上月 private double attachingRateChange; + // 车险客户数 + private int motoInsuranceCustomerCount; // 当月客户渗透率 private double customerHandleRate; + // 客户渗透率环比上月 private double customerHandleRateChange; + // 当月车非客均保费 private double premiumPerCustomer; + // 客均保费环比上月 private double premiumPerCustomerChange; public BIDepartmentAttachingRateRecord( String departmentName, double departmentObject, double objectGap, double motoPremium, double motoPremiumProPortion, double nomotoPremium, double attachingRate, double attachingRateChange, - double customerHandleRate, double customerHandleRateChange, double premiumPerCustomer, + int motoInsuranceCustomerCount, double customerHandleRate, + double customerHandleRateChange, double premiumPerCustomer, double premiumPerCustomerChange ) { this.departmentName = departmentName; @@ -50,20 +56,32 @@ public class BIDepartmentAttachingRateRecord this.nomotoPremium = nomotoPremium; this.attachingRate = attachingRate; this.attachingRateChange = attachingRateChange; + this.motoInsuranceCustomerCount = motoInsuranceCustomerCount; this.customerHandleRate = customerHandleRate; this.customerHandleRateChange = customerHandleRateChange; this.premiumPerCustomer = premiumPerCustomer; this.premiumPerCustomerChange = premiumPerCustomerChange; } + public int getMotoInsuranceCustomerCount() + { + return motoInsuranceCustomerCount; + } + + public void setMotoInsuranceCustomerCount( int motoInsuranceCustomerCount ) + { + this.motoInsuranceCustomerCount = motoInsuranceCustomerCount; + } + @Override public String toString() { - return "DepartmentArchievementRecord [departmentName=" + departmentName + return "BIDepartmentAttachingRateRecord [departmentName=" + departmentName + ", departmentObject=" + departmentObject + ", objectGap=" + objectGap + ", motoPremium=" + motoPremium + ", motoPremiumProPortion=" + motoPremiumProPortion + ", nomotoPremium=" + nomotoPremium + ", attachingRate=" + attachingRate + ", attachingRateChange=" + attachingRateChange + + ", motoInsuranceCustomerCount=" + motoInsuranceCustomerCount + ", customerHandleRate=" + customerHandleRate + ", customerHandleRateChange=" + customerHandleRateChange + ", premiumPerCustomer=" + premiumPerCustomer + ", premiumPerCustomerChange=" + premiumPerCustomerChange + "]"; @@ -90,6 +108,7 @@ public class BIDepartmentAttachingRateRecord result = prime * result + (int) (temp ^ (temp >>> 32)); temp = Double.doubleToLongBits( attachingRateChange ); result = prime * result + (int) (temp ^ (temp >>> 32)); + result = prime * result + motoInsuranceCustomerCount; temp = Double.doubleToLongBits( customerHandleRate ); result = prime * result + (int) (temp ^ (temp >>> 32)); temp = Double.doubleToLongBits( customerHandleRateChange ); @@ -138,6 +157,8 @@ public class BIDepartmentAttachingRateRecord if ( Double.doubleToLongBits( attachingRateChange ) != Double .doubleToLongBits( other.attachingRateChange ) ) return false; + if ( motoInsuranceCustomerCount != other.motoInsuranceCustomerCount ) + return false; if ( Double.doubleToLongBits( customerHandleRate ) != Double .doubleToLongBits( other.customerHandleRate ) ) return false; diff --git a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BITelsalerAttachingRateRecord.java b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BITelsalerAttachingRateRecord.java index df3edd0..2002dd9 100644 --- a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BITelsalerAttachingRateRecord.java +++ b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BITelsalerAttachingRateRecord.java @@ -14,44 +14,61 @@ import com.fasterxml.jackson.annotation.JsonProperty; public class BITelsalerAttachingRateRecord { + // 部门 + @JsonProperty( "departmentName" ) + private String departmentName; + // 统计日期 @JsonProperty( "summaryDate" ) private LocalDate summaryDate; // 坐席名称 @JsonProperty( "telsalerName" ) - private String telsalerName; + private String telsalerName; // 车险保费 @JsonProperty( "motoPremium" ) - private double motoPremium; + private double motoPremium; // 非车险保费 @JsonProperty( "nomotoPremium" ) - private double nomotoPremium; + private double nomotoPremium; // 车险保费占比 @JsonProperty( "motoPremiumProportion" ) - private double motoPremiumProportion; + private double motoPremiumProportion; // 渗透率 @JsonProperty( "attachingRate" ) - private double attachingRate; + private double attachingRate; // 渗透率环比上月 @JsonProperty( "attachingRateChange" ) - private double attachingRateChange; + private double attachingRateChange; // 当月客户渗透率 @JsonProperty( "customerHandleRateCell" ) - private double customerHandleRate; + private double customerHandleRate; // 客户渗透率环比上月 @JsonProperty( "customerHandleRateChangeCell" ) - private double customerHandleRateChange; + private double customerHandleRateChange; - public BITelsalerAttachingRateRecord( LocalDate summaryDate, String telsalerName, double motoPremium, double nomotoPremium, double motoPremiumProportion, double attachingRate, double attachingRateChange, double customerHandleRate, double customerHandleRateChange, double noMotoPremiumPerCustomer, double noMotoPremiumPerCustomerChange ) + // 当月车非客均保费 + @JsonProperty( "noMotoPremiumPerCustomerCell" ) + private double noMotoPremiumPerCustomer; + + // 客均保费环比上月 + @JsonProperty( "noMotoPremiumPerCustomerChangeCell" ) + private double noMotoPremiumPerCustomerChange; + + public BITelsalerAttachingRateRecord( String departmentName, LocalDate summaryDate, + String telsalerName, double motoPremium, double nomotoPremium, + double motoPremiumProportion, double attachingRate, double attachingRateChange, + double customerHandleRate, double customerHandleRateChange, + double noMotoPremiumPerCustomer, double noMotoPremiumPerCustomerChange ) { + this.departmentName = departmentName; this.summaryDate = summaryDate; this.telsalerName = telsalerName; this.motoPremium = motoPremium; @@ -65,6 +82,9 @@ public class BITelsalerAttachingRateRecord this.noMotoPremiumPerCustomerChange = noMotoPremiumPerCustomerChange; } + public BITelsalerAttachingRateRecord() + {} + public double getCustomerHandleRate() { return customerHandleRate; @@ -105,28 +125,17 @@ public class BITelsalerAttachingRateRecord this.noMotoPremiumPerCustomerChange = noMotoPremiumPerCustomerChange; } - // 当月车非客均保费 - @JsonProperty( "noMotoPremiumPerCustomerCell" ) - private double noMotoPremiumPerCustomer; - - // 客均保费环比上月 - @JsonProperty( "noMotoPremiumPerCustomerChangeCell" ) - private double noMotoPremiumPerCustomerChange; - - public BITelsalerAttachingRateRecord() - {} - @Override public String toString() { - return "BITelsalerAttachingRateRecord [summaryDate=" + summaryDate + ", telsalerName=" - + telsalerName + ", motoPremium=" + motoPremium + ", nomotoPremium=" + nomotoPremium - + ", motoPremiumProportion=" + motoPremiumProportion + ", attachingRate=" - + attachingRate + ", attachingRateChange=" + attachingRateChange - + ", customerHandleRate=" + customerHandleRate + ", customerHandleRateChange=" - + customerHandleRateChange + ", noMotoPremiumPerCustomer=" - + noMotoPremiumPerCustomer + ", noMotoPremiumPerCustomerChange=" - + noMotoPremiumPerCustomerChange + "]"; + return "BITelsalerAttachingRateRecord [departmentName=" + departmentName + ", summaryDate=" + + summaryDate + ", telsalerName=" + telsalerName + ", motoPremium=" + motoPremium + + ", nomotoPremium=" + nomotoPremium + ", motoPremiumProportion=" + + motoPremiumProportion + ", attachingRate=" + attachingRate + + ", attachingRateChange=" + attachingRateChange + ", customerHandleRate=" + + customerHandleRate + ", customerHandleRateChange=" + customerHandleRateChange + + ", noMotoPremiumPerCustomer=" + noMotoPremiumPerCustomer + + ", noMotoPremiumPerCustomerChange=" + noMotoPremiumPerCustomerChange + "]"; } @Override @@ -134,6 +143,7 @@ public class BITelsalerAttachingRateRecord { final int prime = 31; int result = 1; + result = prime * result + ((departmentName == null) ? 0 : departmentName.hashCode()); result = prime * result + ((summaryDate == null) ? 0 : summaryDate.hashCode()); result = prime * result + ((telsalerName == null) ? 0 : telsalerName.hashCode()); long temp; @@ -168,6 +178,13 @@ public class BITelsalerAttachingRateRecord if ( getClass() != obj.getClass() ) return false; BITelsalerAttachingRateRecord other = (BITelsalerAttachingRateRecord) obj; + if ( departmentName == null ) + { + if ( other.departmentName != null ) + return false; + } + else if ( !departmentName.equals( other.departmentName ) ) + return false; if ( summaryDate == null ) { if ( other.summaryDate != null ) @@ -281,4 +298,14 @@ public class BITelsalerAttachingRateRecord { this.attachingRateChange = attachingRateChange; } + + public String getDepartmentName() + { + return departmentName; + } + + public void setDepartmentName( String departmentName ) + { + this.departmentName = departmentName; + } } diff --git a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BITelsalerRenewalRateRecord.java b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BITelsalerRenewalRateRecord.java index 7b0b03a..de53e5c 100644 --- a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BITelsalerRenewalRateRecord.java +++ b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BITelsalerRenewalRateRecord.java @@ -2,7 +2,7 @@ * @Author: Kane * @Date: 2023-10-09 21:45:39 * @LastEditors: Kane - * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/TelsalerRenewalRateRecord.java + * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BITelsalerRenewalRateRecord.java * @Description: BI导出的续保率Excel文件行记录。 * * Copyright (c) ${2023} by Kane, All Rights Reserved. @@ -11,6 +11,7 @@ package com.cpic.xim.mybatis.pojo; public class BITelsalerRenewalRateRecord { + private String 责任部门; private String 责任人; private double 机构目标值; private double 到期数全月; @@ -19,9 +20,14 @@ public class BITelsalerRenewalRateRecord private double 个车续保率全月; private double 环比昨日; private double 环比上月; - - public BITelsalerRenewalRateRecord( String 责任人, double 机构目标值, double 到期数全月, double 序时到期数占比, double 个车续保率序时, double 个车续保率全月, double 环比昨日, double 环比上月 ) + private double 平均提前签单天数; + private double 环比; + + public BITelsalerRenewalRateRecord( String 责任部门, String 责任人, double 机构目标值, double 到期数全月, + double 序时到期数占比, double 个车续保率序时, double 个车续保率全月, double 环比昨日, double 环比上月, + double 平均提前签单天数, double 环比 ) { + this.责任部门 = 责任部门; this.责任人 = 责任人; this.机构目标值 = 机构目标值; this.到期数全月 = 到期数全月; @@ -30,6 +36,40 @@ 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 责任部门; + } + + public void set责任部门( String 责任部门 ) + { + this.责任部门 = 责任部门; } @Override @@ -37,6 +77,7 @@ public class BITelsalerRenewalRateRecord { final int prime = 31; int result = 1; + result = prime * result + ((责任部门 == null) ? 0 : 责任部门.hashCode()); result = prime * result + ((责任人 == null) ? 0 : 责任人.hashCode()); long temp; temp = Double.doubleToLongBits( 机构目标值 ); @@ -53,6 +94,10 @@ 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; } @@ -66,6 +111,13 @@ public class BITelsalerRenewalRateRecord if ( getClass() != obj.getClass() ) return false; BITelsalerRenewalRateRecord other = (BITelsalerRenewalRateRecord) obj; + if ( 责任部门 == null ) + { + if ( other.责任部门 != null ) + return false; + } + else if ( !责任部门.equals( other.责任部门 ) ) + return false; if ( 责任人 == null ) { if ( other.责任人 != null ) @@ -87,15 +139,20 @@ 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; } @Override public String toString() { - return "TelsalerRenewalRateRecord [责任人=" + 责任人 + ", 机构目标值=" + 机构目标值 + ", 到期数全月=" + 到期数全月 - + ", 序时到期数占比=" + 序时到期数占比 + ", 个车续保率序时=" + 个车续保率序时 + ", 个车续保率全月=" + 个车续保率全月 - + ", 环比昨日=" + 环比昨日 + ", 环比上月=" + 环比上月 + "]"; + return "BITelsalerRenewalRateRecord [责任部门=" + 责任部门 + ", 责任人=" + 责任人 + ", 机构目标值=" + 机构目标值 + + ", 到期数全月=" + 到期数全月 + ", 序时到期数占比=" + 序时到期数占比 + ", 个车续保率序时=" + 个车续保率序时 + + ", 个车续保率全月=" + 个车续保率全月 + ", 环比昨日=" + 环比昨日 + ", 环比上月=" + 环比上月 + ", 平均提前签单天数=" + + 平均提前签单天数 + ", 环比=" + 环比 + "]"; } public String get责任人() diff --git a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/utils/archievement/CallerArchievement.java b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/utils/archievement/CallerArchievement.java index f8d9c5a..52038bc 100644 --- a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/utils/archievement/CallerArchievement.java +++ b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/utils/archievement/CallerArchievement.java @@ -26,25 +26,6 @@ public class CallerArchievement private static Logger logger = LoggerFactory.getLogger( CallerArchievement.class ); private static ArrayList monthArray = null; - /** - * 构造函数 - * @param callerCode - * @param totalArchievement - * @param mensualArchievementList - * @param insuranceRenewalRate - * @param attachingRate - */ - public CallerArchievement( String callerCode, long totalArchievement, - ArrayList mensualArchievementList, String insuranceRenewalRate, - String attachingRate ) - { - this.callerCode = callerCode; - this.totalArchievement = totalArchievement; - this.mensualArchievementList = mensualArchievementList; - this.insuranceRenewalRate = insuranceRenewalRate; - this.attachingRate = attachingRate; - } - // 静态代码块 static { @@ -65,15 +46,6 @@ public class CallerArchievement monthArray.add( new MensualArchievementItem( 12, "0" ) ); } - public CallerArchievement() - { - this.totalArchievement = 0; - this.mensualArchievementList = null; - this.insuranceRenewalRate = ""; - this.attachingRate = ""; - this.callerCode = ""; - } - public static CallerArchievement getCallerArchievement( String callerCode ) throws IOException { CallerArchievement archievement = null; @@ -82,6 +54,7 @@ public class CallerArchievement ArchievementMapper mapper = session.getMapper( ArchievementMapper.class ); HashMap params = new HashMap(); Integer totalArchievement = null; + double motoPremiumPresentMonth = 0; String attachingRate = null; String renewalRate = null; ArrayList mensual = null; @@ -100,6 +73,10 @@ public class CallerArchievement totalArchievement = Integer.valueOf( 0 ); } + // 当月车险保费 + motoPremiumPresentMonth = ((Double) params.get( "a_present_month" )).doubleValue(); + + // 车非融合 if ( params.get( "a_attaching_rate" ) instanceof String ) { @@ -129,8 +106,8 @@ public class CallerArchievement mensual = (ArrayList) params.get( "a_mensual_cur" ); } - archievement = new CallerArchievement( callerCode, totalArchievement, mensual, renewalRate, - attachingRate ); + archievement = new CallerArchievement( callerCode, totalArchievement, + motoPremiumPresentMonth, mensual, renewalRate, attachingRate ); return archievement; } @@ -145,6 +122,150 @@ public class CallerArchievement CallerArchievement.logger = logger; } + public static ArrayList getMonthArray() + { + return monthArray; + } + + public static void setMonthArray( ArrayList monthArray ) + { + CallerArchievement.monthArray = monthArray; + } + + @JsonProperty( "caller_code" ) + private String callerCode; + + @JsonProperty( "total_archievement" ) + private long totalArchievement; // 总业绩 + + @JsonProperty( "motoPremiumPresentMonth" ) + private double motoPremiumPresentMonth; // 当月车险保费 + + // 每月业绩列表 + // 要保证数据是按照月份排序。 + @JsonProperty( "mensual_archievement_list" ) + private ArrayList mensualArchievementList; + + @JsonProperty( "insurance_renewal_rate" ) + private String insuranceRenewalRate; // 续保率 + + @JsonProperty( "attaching_rate" ) + private String attachingRate; // 车非渗透率 + + /** + * 构造函数 + * @param callerCode + * @param totalArchievement + * @param mensualArchievementList + * @param insuranceRenewalRate + * @param attachingRate + */ + public CallerArchievement( String callerCode, long totalArchievement, + double motoPremiumPresentMonth, + ArrayList mensualArchievementList, String insuranceRenewalRate, + String attachingRate ) + { + this.callerCode = callerCode; + this.totalArchievement = totalArchievement; + this.motoPremiumPresentMonth = motoPremiumPresentMonth; + this.mensualArchievementList = mensualArchievementList; + this.insuranceRenewalRate = insuranceRenewalRate; + this.attachingRate = attachingRate; + } + + public CallerArchievement() + { + this.totalArchievement = 0; + this.motoPremiumPresentMonth = 0; + this.mensualArchievementList = null; + this.insuranceRenewalRate = ""; + this.attachingRate = ""; + this.callerCode = ""; + } + + @Override + public String toString() + { + return "CallerArchievement [callerCode=" + callerCode + ", totalArchievement=" + + totalArchievement + ", motoPremiumPresentMonth=" + motoPremiumPresentMonth + + ", mensualArchievementList=" + mensualArchievementList + ", insuranceRenewalRate=" + + insuranceRenewalRate + ", attachingRate=" + attachingRate + "]"; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + ((callerCode == null) ? 0 : callerCode.hashCode()); + result = prime * result + (int) (totalArchievement ^ (totalArchievement >>> 32)); + long temp; + temp = Double.doubleToLongBits( motoPremiumPresentMonth ); + result = prime * result + (int) (temp ^ (temp >>> 32)); + result = prime * result + + ((mensualArchievementList == null) ? 0 : mensualArchievementList.hashCode()); + result = prime * result + + ((insuranceRenewalRate == null) ? 0 : insuranceRenewalRate.hashCode()); + result = prime * result + ((attachingRate == null) ? 0 : attachingRate.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; + CallerArchievement other = (CallerArchievement) obj; + if ( callerCode == null ) + { + if ( other.callerCode != null ) + return false; + } + else if ( !callerCode.equals( other.callerCode ) ) + return false; + if ( totalArchievement != other.totalArchievement ) + return false; + if ( Double.doubleToLongBits( motoPremiumPresentMonth ) != Double + .doubleToLongBits( other.motoPremiumPresentMonth ) ) + 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 ( attachingRate == null ) + { + if ( other.attachingRate != null ) + return false; + } + else if ( !attachingRate.equals( other.attachingRate ) ) + return false; + return true; + } + + public double getMotoPremiumPresentMonth() + { + return motoPremiumPresentMonth; + } + + public void setMotoPremiumPresentMonth( double motoPremiumPresentMonth ) + { + this.motoPremiumPresentMonth = motoPremiumPresentMonth; + } + public String getCallerCode() { return callerCode; @@ -195,21 +316,4 @@ public class CallerArchievement { this.attachingRate = attachingRate; } - - @JsonProperty( "caller_code" ) - private String callerCode; - - @JsonProperty( "total_archievement" ) - private long totalArchievement; // 总业绩 - - // 每月业绩列表 - // 要保证数据是按照月份排序。 - @JsonProperty( "mensual_archievement_list" ) - private ArrayList mensualArchievementList; - - @JsonProperty( "insurance_renewal_rate" ) - private String insuranceRenewalRate; // 续保率 - - @JsonProperty( "attaching_rate" ) - private String attachingRate; // 车非渗透率 } 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 2bd3894..fcb18c6 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 @@ -39,11 +39,11 @@ public final class ImportBIExcelData "当月车非客均保费", "客均保费环比上月"}; private static String[] TelSalerRenewalRateExcelTitle = new String[] - { "责任人", "机构目标值1(%)", "到期数-全月", "序时到期数占比(%)", "个车续保率(序时)(%)", "个车续保率(全月)(%)", "环比昨日(%)", - "环比上月(%)"}; + { "责任部门", "责任人", "机构目标值1(%)", "到期数-全月", "序时到期数占比(%)", "个车续保率(序时)(%)", "个车续保率(全月)(%)", "环比昨日(%)", + "环比上月(%)", "平均提前签单天数", "环比"}; private static String[] DepartmentAttachingRateExcelTitle = new String[] - { "部门", "目标值-机构", "目标差距", "车险保费(万)", "车险保费占比", "非车保费(万)", "当月保费渗透率", "保费渗透率环比上月", "当月客户渗透率", + { "部门", "目标值-机构", "目标差距", "车险保费(万)", "车险保费占比", "非车保费(万)", "当月保费渗透率", "保费渗透率环比上月", "车险客户数", "当月客户渗透率", "客户渗透率环比上月", "当月车非客均保费", "客均保费环比上月"}; private static String[] DepartmentRenewalRateExcelTitle = new String[] @@ -130,6 +130,9 @@ public final class ImportBIExcelData Workbook wb = null; Sheet sheet = null; + String name = null; + String departmentName = null; + String departmentCurrentRow = null; try { @@ -144,7 +147,7 @@ public final class ImportBIExcelData for ( Row row : sheet ) { - String name = ""; + int rowIndex = row.getRowNum(); // 从数据行开始 @@ -155,6 +158,24 @@ public final class ImportBIExcelData try { + // 部门 + try + { + departmentCurrentRow = MyPOIUtils.getStringCellValue( row, 0 ); + + // 因为是合并列,所以要判断一下是不是空的 + if ( !departmentCurrentRow.equals( "" ) + && !departmentCurrentRow.equals( "合计" ) ) + { + // 不是空的,也不是合计,说明是新部门的数据,更新部门名称 + departmentName = departmentCurrentRow; + } + } + catch ( NullPointerException error ) + { + // cell是空的,说明还是上一行的部门 + } + // 坐席名称 name = MyPOIUtils.getStringCellValue( row, 1 ); @@ -165,9 +186,9 @@ public final class ImportBIExcelData } // 车险保费 - double motoPremium = MyPOIUtils.getNumbericCellValue( row, 2 ) * 10000; + double motoPremium = MyPOIUtils.getNumbericCellValue( row, 2 ); // 非车险保费 - double nomotoPremium = MyPOIUtils.getNumbericCellValue( row, 4 ) * 10000; + double nomotoPremium = MyPOIUtils.getNumbericCellValue( row, 4 ); // 车险保费占比 double motoPremiumProPortion = MyPOIUtils.getNumbericCellValue( row, 3 ) * 100; // 当月保费渗透率 @@ -187,7 +208,7 @@ public final class ImportBIExcelData MyPOIUtils.getNumbericCellValue( row, 10 ) * 100; BITelsalerAttachingRateRecord record = new BITelsalerAttachingRateRecord( - LocalDate.now(), name, motoPremium, nomotoPremium, + departmentName, LocalDate.now(), name, motoPremium, nomotoPremium, motoPremiumProPortion, attachingRate, attachingRateChange, customerHandleRateCell, customerHandleRateChangeCell, noMotoPremiumPerCustomerCell, noMotoPremiumPerCustomerChangeCell ); @@ -235,7 +256,7 @@ public final class ImportBIExcelData * @return */ public static ArrayList importBITelsalerRenewalRateFromXlsx( - String filePath, int sheetIndex, int firstRow, LocalDate summaryDate ) + String filePath, int sheetIndex, int firstRow ) throws IOException, InvalidFormatException { ArrayList records = new ArrayList<>( 200 ); @@ -248,6 +269,9 @@ public final class ImportBIExcelData wb = WorkbookFactory.create( new File( filePath ) ); sheet = wb.getSheetAt( sheetIndex ); int rowIndex = 0; + String 责任部门 = null; + String 当前行责任部门 = null; + String 责任人 = null; if ( !checkExcelFormat( sheet, null, 0, TelSalerRenewalRateExcelTitle, 0 ) ) { @@ -266,23 +290,41 @@ public final class ImportBIExcelData try { - String 责任人 = MyPOIUtils.getStringCellValue( row, 0 ); + // 处理责任部门列 + // 如果读取到的当前行责任部门不为空且与前一行责任部门不同,说明是另一个部门的数据 + try + { + 当前行责任部门 = MyPOIUtils.getStringCellValue( row, 0 ); + + if ( !当前行责任部门.isEmpty() && !当前行责任部门.equals( 责任部门 ) ) + { + 责任部门 = 当前行责任部门; + } + } + catch ( NullPointerException error ) + { + } + + // 判断责任人,如果是空值,就跳过此行 + 责任人 = MyPOIUtils.getStringCellValue( row, 1 ); if ( 责任人.isEmpty() == true ) { continue; } - double 机构目标值 = MyPOIUtils.getNumbericCellValue( row, 1 ) * 100; - double 到期数全月 = MyPOIUtils.getNumbericCellValue( row, 2 ) * 100; - double 序时到期数占比 = MyPOIUtils.getNumbericCellValue( row, 3 ) * 100; - double 个车续保率序时 = MyPOIUtils.getNumbericCellValue( row, 4 ) * 100; - double 个车续保率全月 = MyPOIUtils.getNumbericCellValue( row, 5 ) * 100; - double 环比昨日 = MyPOIUtils.getNumbericCellValue( row, 6 ) * 100; - double 环比上月 = MyPOIUtils.getNumbericCellValue( row, 7 ) * 100; + double 机构目标值 = MyPOIUtils.getNumbericCellValue( row, 2 ) * 100; + double 到期数全月 = MyPOIUtils.getNumbericCellValue( row, 3 ); + double 序时到期数占比 = MyPOIUtils.getNumbericCellValue( row, 4 ) * 100; + double 个车续保率序时 = MyPOIUtils.getNumbericCellValue( row, 5 ) * 100; + 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 ); - BITelsalerRenewalRateRecord record = new BITelsalerRenewalRateRecord( 责任人, - 机构目标值, 到期数全月, 序时到期数占比, 个车续保率序时, 个车续保率全月, 环比昨日, 环比上月 ); + BITelsalerRenewalRateRecord record = new BITelsalerRenewalRateRecord( 责任部门, 责任人, + 机构目标值, 到期数全月, 序时到期数占比, 个车续保率序时, 个车续保率全月, 环比昨日, 环比上月, 平均提前签单天数, 环比 ); records.add( record ); } @@ -362,22 +404,23 @@ public final class ImportBIExcelData double departmentObject = MyPOIUtils.getNumbericCellValue( row, 1 ) * 100; double objectGap = MyPOIUtils.getNumbericCellValue( row, 2 ) * 100; - double motoPremium = MyPOIUtils.getNumbericCellValue( row, 3 ) * 10000; + double motoPremium = MyPOIUtils.getNumbericCellValue( row, 3 ); double motoPremiumProPortion = MyPOIUtils.getNumbericCellValue( row, 4 ) * 100; - double nomotoPremium = MyPOIUtils.getNumbericCellValue( row, 5 ) * 10000; + double nomotoPremium = MyPOIUtils.getNumbericCellValue( row, 5 ); double attachingRate = MyPOIUtils.getNumbericCellValue( row, 6 ) * 100; double attachingRateChange = MyPOIUtils.getNumbericCellValue( row, 7 ) * 100; - double customerHandleRate = MyPOIUtils.getNumbericCellValue( row, 8 ) * 100; + int motoInsuranceCustomerCount = (int)MyPOIUtils.getNumbericCellValue( row, 8 ); + double customerHandleRate = MyPOIUtils.getNumbericCellValue( row, 9 ) * 100; double customerHandleRateChange = - MyPOIUtils.getNumbericCellValue( row, 9 ) * 100; - double premiumPerCustomer = MyPOIUtils.getNumbericCellValue( row, 10 ) * 100; + MyPOIUtils.getNumbericCellValue( row, 10 ) * 100; + double premiumPerCustomer = MyPOIUtils.getNumbericCellValue( row, 11 ) * 100; double premiumPerCustomerChange = - MyPOIUtils.getNumbericCellValue( row, 11 ) * 100; + MyPOIUtils.getNumbericCellValue( row, 12 ) * 100; BIDepartmentAttachingRateRecord record = new BIDepartmentAttachingRateRecord( departmentName, departmentObject, objectGap, motoPremium, motoPremiumProPortion, nomotoPremium, attachingRate, - attachingRateChange, customerHandleRate, customerHandleRateChange, + attachingRateChange, motoInsuranceCustomerCount, customerHandleRate, customerHandleRateChange, premiumPerCustomer, premiumPerCustomerChange ); records.add( record ); diff --git a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/ArchievementQueryController.java b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/ArchievementQueryController.java index 8bce9b3..f6959e0 100644 --- a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/ArchievementQueryController.java +++ b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/ArchievementQueryController.java @@ -29,7 +29,7 @@ import com.cpic.xim.utils.ranking.CallerRankingList; import com.cpic.xim.web.controllers.archievement.RankingList.RankingListRequest; import com.cpic.xim.web.controllers.archievement.RankingList.RankingListResponse; import com.cpic.xim.web.controllers.archievement.caller.CallerArchievementQueryRequest; -import com.cpic.xim.web.controllers.archievement.caller.CallerArchievementQueryResult; +import com.cpic.xim.web.controllers.archievement.caller.CallerArchievementQueryResponse; import com.cpic.xim.web.controllers.archievement.department.DepartmentArchievementQueryRequest; import com.cpic.xim.web.controllers.archievement.department.DepartmentArchievementQueryResult; @@ -90,24 +90,24 @@ public class ArchievementQueryController @ResponseBody @PostMapping( "/query_caller_archievement.do" ) - public CallerArchievementQueryResult queryCallerArchievement( + public CallerArchievementQueryResponse queryCallerArchievement( @RequestBody CallerArchievementQueryRequest request ) { - CallerArchievementQueryResult result = null; + CallerArchievementQueryResponse result = null; try { CallerArchievement archievement = CallerArchievement.getCallerArchievement( request.getCallerCode() ); - result = new CallerArchievementQueryResult( true, "查询成功", archievement.getCallerCode(), - request.getCallName(), archievement.getTotalArchievement(), + result = new CallerArchievementQueryResponse( true, "查询成功", archievement.getCallerCode(), + request.getCallName(), archievement.getTotalArchievement(), archievement.getMotoPremiumPresentMonth(), archievement.getMensualArchievementList(), archievement.getInsuranceRenewalRate(), archievement.getAttachingRate() ); } catch ( IOException error ) { - result = new CallerArchievementQueryResult(false, error.getMessage(), null, null, 0, null, null, null); + result = new CallerArchievementQueryResponse(false, error.getMessage(), null, null, 0, 0, null, null, null); } return result; diff --git a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/caller/CallerArchievementQueryResponse.java b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/caller/CallerArchievementQueryResponse.java new file mode 100644 index 0000000..0b6df82 --- /dev/null +++ b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/caller/CallerArchievementQueryResponse.java @@ -0,0 +1,222 @@ +/* + * @Author: Kane + * @Date: 2023-06-06 17:35:54 + * @LastEditors: Kane + * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/caller/CallerArchievementQueryResponse.java + * @Description: + * + * Copyright (c) ${2022} by Kane, All Rights Reserved. + */ +package com.cpic.xim.web.controllers.archievement.caller; + +import com.cpic.xim.mybatis.pojo.MensualArchievementItem; +import com.cpic.xim.web.controllers.QueryResponse; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.ArrayList; + +public class CallerArchievementQueryResponse extends QueryResponse +{ + @JsonProperty("callerCode") + String callerCode; + + @JsonProperty("callerName") + String callerName; + + @JsonProperty( "total_archievement" ) + private long totalArchievement; // 总业绩 + + @JsonProperty( "motoPremiumPresentMonth" ) + private double motoPremiumPresentMonth; // 当月车险保费 + + // 每月业绩列表 + // 要保证数据是按照月份排序。 + @JsonProperty( "mensual_archievement_list" ) + private ArrayList mensualArchievementList; + + @JsonProperty( "insurance_renewal_rate" ) + private String insuranceRenewalRate; // 续保率 + + @JsonProperty( "attaching_rate" ) + private String attachingRate; // 车非渗透率 + + public CallerArchievementQueryResponse( boolean success, String message, String callerCode, + String callerName, long totalArchievement, double motoPremiumPresentMonth, + ArrayList mensualArchievementList, String insuranceRenewalRate, + String attachingRate ) + { + super( success, message ); + this.callerCode = callerCode; + this.callerName = callerName; + this.totalArchievement = totalArchievement; + this.motoPremiumPresentMonth = motoPremiumPresentMonth; + this.mensualArchievementList = mensualArchievementList; + this.insuranceRenewalRate = insuranceRenewalRate; + this.attachingRate = attachingRate; + } + + public CallerArchievementQueryResponse( String callerCode, String callerName, + long totalArchievement, double motoPremiumPresentMonth, + ArrayList mensualArchievementList, String insuranceRenewalRate, + String attachingRate ) + { + this.callerCode = callerCode; + this.callerName = callerName; + this.totalArchievement = totalArchievement; + this.motoPremiumPresentMonth = motoPremiumPresentMonth; + this.mensualArchievementList = mensualArchievementList; + this.insuranceRenewalRate = insuranceRenewalRate; + this.attachingRate = attachingRate; + } + + @Override + public String toString() + { + return "CallerArchievementQueryResponse [callerCode=" + callerCode + ", callerName=" + + callerName + ", totalArchievement=" + totalArchievement + + ", motoPremiumPresentMonth=" + motoPremiumPresentMonth + + ", mensualArchievementList=" + mensualArchievementList + ", insuranceRenewalRate=" + + insuranceRenewalRate + ", attachingRate=" + attachingRate + "]"; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((callerCode == null) ? 0 : callerCode.hashCode()); + result = prime * result + ((callerName == null) ? 0 : callerName.hashCode()); + result = prime * result + (int) (totalArchievement ^ (totalArchievement >>> 32)); + long temp; + temp = Double.doubleToLongBits( motoPremiumPresentMonth ); + result = prime * result + (int) (temp ^ (temp >>> 32)); + result = prime * result + + ((mensualArchievementList == null) ? 0 : mensualArchievementList.hashCode()); + result = prime * result + + ((insuranceRenewalRate == null) ? 0 : insuranceRenewalRate.hashCode()); + result = prime * result + ((attachingRate == null) ? 0 : attachingRate.hashCode()); + return result; + } + + public void setMotoPremiumPresentMonth( double motoPremiumPresentMonth ) + { + this.motoPremiumPresentMonth = motoPremiumPresentMonth; + } + + @Override + public boolean equals( Object obj ) + { + if ( this == obj ) + return true; + if ( !super.equals( obj ) ) + return false; + if ( getClass() != obj.getClass() ) + return false; + CallerArchievementQueryResponse other = (CallerArchievementQueryResponse) obj; + if ( callerCode == null ) + { + if ( other.callerCode != null ) + return false; + } + else if ( !callerCode.equals( other.callerCode ) ) + return false; + if ( callerName == null ) + { + if ( other.callerName != null ) + return false; + } + else if ( !callerName.equals( other.callerName ) ) + return false; + if ( totalArchievement != other.totalArchievement ) + return false; + if ( Double.doubleToLongBits( motoPremiumPresentMonth ) != Double + .doubleToLongBits( other.motoPremiumPresentMonth ) ) + 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 ( attachingRate == null ) + { + if ( other.attachingRate != null ) + return false; + } + else if ( !attachingRate.equals( other.attachingRate ) ) + return false; + return true; + } + + public String getCallerCode() + { + return callerCode; + } + + public void setCallerCode( String callerCode ) + { + this.callerCode = callerCode; + } + + public String getCallerName() + { + return callerName; + } + + public void setCallerName( String callerName ) + { + this.callerName = callerName; + } + + public long getTotalArchievement() + { + return totalArchievement; + } + + public void setTotalArchievement( long totalArchievement ) + { + this.totalArchievement = totalArchievement; + } + + public ArrayList getMensualArchievementList() + { + return mensualArchievementList; + } + + public void setMensualArchievementList( ArrayList mensualArchievementList ) + { + this.mensualArchievementList = mensualArchievementList; + } + + public String getInsuranceRenewalRate() + { + return insuranceRenewalRate; + } + + public void setInsuranceRenewalRate( String insuranceRenewalRate ) + { + this.insuranceRenewalRate = insuranceRenewalRate; + } + + public String getAttachingRate() + { + return attachingRate; + } + + public void setAttachingRate( String attachingRate ) + { + this.attachingRate = attachingRate; + } + + public double getMotoPremiumPresentMonth() + { + return motoPremiumPresentMonth; + } +} diff --git a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/caller/CallerArchievementQueryResult.java b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/caller/CallerArchievementQueryResult.java deleted file mode 100644 index a5a36a7..0000000 --- a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/caller/CallerArchievementQueryResult.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * @Author: Kane - * @Date: 2023-06-06 17:35:54 - * @LastEditors: Kane - * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/caller/CallerArchievementQueryResult.java - * @Description: - * - * Copyright (c) ${2022} by Kane, All Rights Reserved. - */ -package com.cpic.xim.web.controllers.archievement.caller; - -import com.cpic.xim.mybatis.pojo.MensualArchievementItem; -import com.cpic.xim.web.controllers.QueryResponse; -import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.ArrayList; - -public class CallerArchievementQueryResult extends QueryResponse -{ - /** - * - * @param success - * @param message - * @param callerCode - * @param callerName - * @param totalArchievement - * @param mensualArchievementList - * @param insuranceRenewalRate - * @param attachingRate - */ - public CallerArchievementQueryResult( boolean success, String message, String callerCode, - String callerName, long totalArchievement, - ArrayList mensualArchievementList, String insuranceRenewalRate, - String attachingRate) - { - super( success, message ); - this.callerCode = callerCode; - this.callerName = callerName; - this.totalArchievement = totalArchievement; - this.mensualArchievementList = mensualArchievementList; - this.insuranceRenewalRate = insuranceRenewalRate; - this.attachingRate = attachingRate; - } - - @JsonProperty("callerCode") - String callerCode; - - public String getCallerCode() - { - return callerCode; - } - - public void setCallerCode( String callerCode ) - { - this.callerCode = callerCode; - } - - public String getCallerName() - { - return callerName; - } - - public void setCallerName( String callerName ) - { - this.callerName = callerName; - } - - public long getTotalArchievement() - { - return totalArchievement; - } - - public void setTotalArchievement( long totalArchievement ) - { - this.totalArchievement = totalArchievement; - } - - public ArrayList getMensualArchievementList() - { - return mensualArchievementList; - } - - public void setMensualArchievementList( ArrayList mensualArchievementList ) - { - this.mensualArchievementList = mensualArchievementList; - } - - public String getInsuranceRenewalRate() - { - return insuranceRenewalRate; - } - - public void setInsuranceRenewalRate( String insuranceRenewalRate ) - { - this.insuranceRenewalRate = insuranceRenewalRate; - } - - public String getAttachingRate() - { - return attachingRate; - } - - public void setAttachingRate( String attachingRate ) - { - this.attachingRate = attachingRate; - } - - @JsonProperty("callerName") - String callerName; - - @JsonProperty( "total_archievement" ) - private long totalArchievement; // 总业绩 - - // 每月业绩列表 - // 要保证数据是按照月份排序。 - @JsonProperty( "mensual_archievement_list" ) - private ArrayList mensualArchievementList; - - @JsonProperty( "insurance_renewal_rate" ) - private String insuranceRenewalRate; // 续保率 - - @JsonProperty( "attaching_rate" ) - private String attachingRate; // 车非渗透率 -} diff --git a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/dataimport/bi/ImportBIDataController.java b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/dataimport/bi/ImportBIDataController.java index dd3e180..5a0c095 100644 --- a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/dataimport/bi/ImportBIDataController.java +++ b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/dataimport/bi/ImportBIDataController.java @@ -149,7 +149,7 @@ public class ImportBIDataController try { records = ImportBIExcelData.importBITelsalerRenewalRateFromXlsx( filePath, sheetIndex, - firstRow, LocalDate.now() ); + firstRow ); session = MybatisUtils.getSqlSessionBatch(); mapper = session.getMapper( ImportBIArchievementDataMapper.class ); diff --git a/code/后端/desktop_archievement_backend/src/main/resources/mybatis/mapper/ArchievementMapper.xml b/code/后端/desktop_archievement_backend/src/main/resources/mybatis/mapper/ArchievementMapper.xml index e08362f..b417c2e 100644 --- a/code/后端/desktop_archievement_backend/src/main/resources/mybatis/mapper/ArchievementMapper.xml +++ b/code/后端/desktop_archievement_backend/src/main/resources/mybatis/mapper/ArchievementMapper.xml @@ -15,6 +15,7 @@ #{a_attaching_rate, mode=OUT, jdbcType=VARCHAR}, #{a_renewal_rate, mode=OUT, jdbcType=VARCHAR}, #{a_total, mode=OUT, jdbcType=INTEGER, javaType=Integer}, + #{a_present_month, mode=OUT, jdbcType=DOUBLE, javaType=Double}, #{a_mensual_cur, mode=OUT, jdbcType=CURSOR, resultMap=MensualArchievementMapper}) 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 c3287cc..8a919f4 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 @@ -2,27 +2,31 @@ - insert into BI电销坐席车非渗透统计表 ( 坐席名称, 车险保费, 非车保费, 车险保费占比, - 当月保费渗透率, 保费渗透率环比上月, 当月客户渗透率, 客户渗透率环比上月, - 当月车非客均保费, 客均保费环比上月 ) - values ( #{telsalerName}, #{motoPremium}, #{nomotoPremium}, #{motoPremiumProportion}, + insert into BI电销坐席车非渗透率跟踪表 ( "部门","经办","车险保费(万)","车险保费占比","非车保费(万)", + "当月保费渗透率","保费渗透率环比上月","当月客户渗透率","客户渗透率环比上月", + "当月车非客均保费","客均保费环比上月" ) + values ( #{departmentName}, #{telsalerName}, #{motoPremium}, #{motoPremiumProportion}, #{nomotoPremium}, #{attachingRate}, #{attachingRateChange}, #{customerHandleRate}, #{customerHandleRateChange}, #{noMotoPremiumPerCustomer}, #{noMotoPremiumPerCustomerChange} ) - insert into BI坐席续保率统计表 (责任人,机构目标值,到期数全月,序时到期数占比,个车续保率序时,个车续保率全月,环比昨日,环比上月) - values (#{责任人},#{机构目标值},#{到期数全月},#{序时到期数占比}, - #{个车续保率序时},#{个车续保率全月},#{环比昨日},#{环比上月}) + insert into BI电销坐席续保率跟踪表 ("责任部门","责任人","机构目标值1(%)","到期数-全月", + "序时到期数占比(%)","个车续保率(序时)(%)","个车续保率(全月)(%)", + "环比昨日(%)","环比上月(%)","平均提前签单天数","环比") + values (#{责任部门},#{责任人},#{机构目标值},#{到期数全月},#{序时到期数占比}, + #{个车续保率序时},#{个车续保率全月},#{环比昨日},#{环比上月}, + #{平均提前签单天数},#{环比}) - insert into BI部门渗透率续保率统计表 ( 部门,"目标值-机构",目标差距,"车险保费", + insert into BI机构渗透率跟踪表 ( 部门,"目标值-机构",目标差距,"车险保费", 车险保费占比,"非车保费",当月保费渗透率,保费渗透率环比上月,当月客户渗透率, - 客户渗透率环比上月,当月车非客均保费,客均保费环比上月) + 客户渗透率环比上月,当月车非客均保费,客均保费环比上月,车险客户数) values (#{departmentName},#{departmentObject},#{objectGap},#{motoPremium}, #{motoPremiumProPortion},#{nomotoPremium},#{attachingRate},#{attachingRateChange}, - #{customerHandleRate},#{customerHandleRateChange},#{premiumPerCustomer},#{premiumPerCustomerChange} ) + #{customerHandleRate},#{customerHandleRateChange},#{premiumPerCustomer},#{premiumPerCustomerChange}, + #{motoInsuranceCustomerCount} ) @@ -34,10 +38,10 @@