129 Commits

Author SHA1 Message Date
c6ea898505 保存进度! 2025-09-03 15:32:36 +08:00
711697e6a1 升级ts代码。 2025-09-03 15:29:46 +08:00
89866c8513 更新一些设置。 2025-03-16 23:04:40 +08:00
f90114e204 保存进度! 2024-02-29 01:18:04 +08:00
0458da2fae 保存进度! 2024-02-29 01:16:27 +08:00
46d0ff64ef 升级依赖。 2024-02-28 18:24:06 +08:00
57b5edd9c0 整理依赖 2024-01-29 19:31:29 +08:00
73cfe24460 修复依赖问题! 2024-01-25 11:01:27 +08:00
9e0d07a9f7 升级依赖。 2024-01-21 19:03:17 +08:00
ab957962fc 升级依赖。 2024-01-21 19:01:40 +08:00
da9da6e906 升级依赖 2024-01-21 19:01:14 +08:00
7ba9d249ee 修改bug。 2024-01-11 18:46:08 +08:00
afccb2a88c 续保率报表格式修改,还未完成。 2024-01-10 18:24:10 +08:00
962c22400e 升级依赖。 2024-01-09 17:52:41 +08:00
c7bf9f6c0d 升级依赖。 2024-01-03 18:46:55 +08:00
daa1d2aaaf 升级依赖。 2023-12-29 19:28:29 +08:00
6a93fc2738 保存进度! 2023-12-29 19:24:25 +08:00
e3858d23d9 Merge branch 'feature-telsaler' of http://222.76.244.118:3000/CPICXIM/desktop_task_schedule into feature-telsaler 2023-12-26 18:00:22 +08:00
0cf8e16129 修改请求超时时间为30秒。 2023-12-26 18:00:14 +08:00
fe6707ca3f 保存进度! 2023-12-20 23:36:28 +08:00
c6705d326d 保存进度! 2023-12-20 22:40:27 +08:00
3e071cedd7 升级依赖。 2023-12-19 18:33:27 +08:00
c7ae33222d 保存进度! 2023-12-19 18:30:32 +08:00
a9c6e0476b 保存进度! 2023-12-18 18:43:58 +08:00
2e02b9182d 保存进度! 2023-12-18 18:12:16 +08:00
f391880c9c 添加改变部门指标颜色的代码 2023-12-18 16:03:19 +08:00
372824ec50 升级依赖 2023-12-16 01:56:48 +08:00
e4b68276dd 升级依赖。 2023-12-15 18:26:29 +08:00
8489f43b55 修复坐席没数据时的显示bug。 2023-12-15 18:22:09 +08:00
42dd59e141 保存进度! 2023-12-14 18:49:53 +08:00
d20a3222c0 保存进度! 2023-12-12 18:27:47 +08:00
68a314703f typescript更新后unsafe赋值问题未解决。 2023-12-11 13:14:57 +08:00
f33486197e 升级依赖。 2023-12-11 13:03:25 +08:00
6e8a42086b 查询坐席业绩时清理缓存! 2023-12-04 17:37:14 +08:00
591a5865f3 升级依赖。 2023-12-04 16:52:38 +08:00
d33572abb8 Merge branch 'feature-ui' of http://222.76.244.118:3000/CPICXIM/desktop_task_schedule into feature-ui 2023-11-28 15:46:46 +08:00
041ea37122 升级依赖。 2023-11-28 15:46:34 +08:00
0f25aa4a72 保存进度! 2023-11-26 23:19:12 +08:00
33cb13fe29 保存进度! 2023-11-26 13:26:31 +08:00
eb0bd517d5 保存进度! 2023-11-25 23:43:02 +08:00
d1aebdc7f5 增加人员管理模块 2023-11-24 18:48:05 +08:00
c3479d7d8e Merge branch 'feature-ui' of http://222.76.244.118:3000/CPICXIM/desktop_task_schedule into feature-ui 2023-11-21 19:21:12 +08:00
0c89df8c34 保存进度! 2023-11-21 19:21:01 +08:00
a5d392c2f6 保存进度! 2023-11-15 00:15:55 +08:00
84b2e906f3 保存进度! 2023-11-14 18:23:53 +08:00
3b4c340b70 修改请求地址! 2023-11-13 18:51:40 +08:00
3001165bd5 修改项目输出目录和springMVC的版本。 2023-11-13 13:18:49 +08:00
39a75c7bf2 保存进度! 2023-11-13 00:25:10 +08:00
237cc350be 保存进度! 2023-11-10 18:09:10 +08:00
d202d976a3 保存进度! 2023-11-10 15:53:23 +08:00
492239f269 启用vite的开发和生产模式 2023-11-09 19:15:41 +08:00
c0406e7000 保存进度! 2023-11-08 10:43:55 +08:00
44357ad3ce 保存进度! 2023-11-08 10:32:19 +08:00
e07039b517 保存进度! 2023-11-08 09:56:40 +08:00
484b8a78e9 保存进度! 2023-11-06 19:16:38 +08:00
4e74bff380 增加可以用坐席名称登录 2023-11-01 20:49:54 +08:00
7311ab5e2a 保存进度! 2023-11-01 18:22:01 +08:00
0650227861 Merge branch 'develop' into feature-ui 2023-11-01 15:42:07 +08:00
75a9c46c2e 保存进度! 2023-11-01 15:41:49 +08:00
02ac5274e0 保存进度! 2023-10-30 23:44:54 +08:00
6f303eec03 保存进度! 2023-10-30 23:44:37 +08:00
d517c2e82a 保存进度! 2023-10-28 12:09:02 +08:00
80ba8da7e0 保存进度! 2023-10-27 18:59:50 +08:00
1422c0b781 保存进度! 2023-10-27 16:51:57 +08:00
a33981ac55 变更报表内容。 2023-10-26 18:46:32 +08:00
506f18abfe 修改oracle获取部门和坐席业绩的代码。 2023-10-25 18:11:56 +08:00
e4d641021e 加入BI机构当月个车续保率跟踪表上传导入功能。 2023-10-24 15:53:24 +08:00
6ddfe56e6d 保存进度! 2023-10-23 23:48:07 +08:00
a3c56df910 保存进度! 2023-10-23 17:46:30 +08:00
8b31ffb6d6 保存进度! 2023-10-22 01:15:34 +08:00
b794e99694 升级依赖。 2023-10-21 18:21:07 +08:00
321ff39e1c 保存进度! 2023-10-20 00:36:39 +08:00
05aabea1a2 完成基本上传导入前端代码 2023-10-18 18:36:11 +08:00
0caf428d67 制作非车渗透的上传报表。 2023-10-17 17:44:14 +08:00
0ad42d00a9 修复文件上传的问题。 2023-10-16 17:57:09 +08:00
16df86e3a7 保存进度! 2023-10-15 19:33:47 +08:00
636ae55b43 保存进度! 2023-10-15 10:45:58 +08:00
cb1c08fff4 完成bi报表导入的controller。 2023-10-13 18:33:33 +08:00
3c807a6efa 保存进度! 2023-10-12 18:31:54 +08:00
7964f8fbe0 完成mybatis导入函数。 2023-10-12 18:24:28 +08:00
a1de9387c8 保存进度! 2023-10-12 00:38:42 +08:00
0021873ef7 开始编写插入代码 2023-10-11 18:31:27 +08:00
be1a5ffb00 加入两个报表读取函数。 2023-10-10 19:05:17 +08:00
6d06ad934d 保存进度! 2023-10-09 23:46:46 +08:00
e805bf914b 完成读取车非渗透表。 2023-10-09 18:37:44 +08:00
e40b81672a 写了两个工具函数。 2023-10-09 00:18:07 +08:00
041ec287b9 开始开发车非渗透率BI表导入功能。
加入一些测试用数据文件。
2023-10-08 18:20:48 +08:00
e5dfb45c79 创建坐席记录文件。 2023-10-08 01:17:43 +08:00
19d658858e 111 2023-10-07 19:11:46 +08:00
5fa7639314 升级依赖 2023-10-06 08:38:28 +08:00
8a64561471 保存进度! 2023-10-06 08:28:02 +08:00
fdb345176e 升级依赖 2023-10-05 23:57:44 +08:00
c6e08981f7 保存进度! 2023-09-29 01:44:20 +08:00
a9c05eef2c 保存进度! 2023-09-28 19:19:06 +08:00
0c2c762721 保存进度! 2023-09-27 19:57:33 +08:00
b8df96ac42 保存进度! 2023-09-26 18:55:37 +08:00
580e917347 保存进度! 2023-09-26 00:43:51 +08:00
64824e6f74 保存进度! 2023-09-25 16:23:26 +08:00
099a1e65f6 保存进度! 2023-09-24 16:34:31 +08:00
a9b30dd293 保存进度! 2023-09-24 09:01:06 +08:00
f61f623f73 保存进度! 2023-09-24 01:17:54 +08:00
b03056d783 保存进度! 2023-09-22 19:22:04 +08:00
bcef8b4994 保存进度! 2023-09-21 22:58:01 +08:00
b91c7d281e 保存进度! 2023-09-21 18:36:31 +08:00
1d554056ac 保存进度! 2023-09-21 16:56:34 +08:00
0d0b61db3c 保存进度! 2023-09-19 19:00:20 +08:00
8fd5ee4904 保存进度! 2023-09-19 18:59:39 +08:00
fa4f211ac2 保存进度! 2023-09-18 18:32:21 +08:00
992606d77a 保存进度! 2023-09-15 18:05:03 +08:00
712aabfb99 保存进度! 2023-09-14 18:42:23 +08:00
9878abb946 保存进度! 2023-09-14 00:42:03 +08:00
7d0112b483 保存进度! 2023-09-13 22:54:43 +08:00
58f60b9eaf 保存进度! 2023-09-13 22:48:35 +08:00
4cd800e62b 保存进度! 2023-09-13 19:35:44 +08:00
4deed356f5 保存进度! 2023-09-13 18:01:07 +08:00
31d5e1622c 保存进度! 2023-09-12 18:12:27 +08:00
be5e426cee 保存进度! 2023-09-12 11:51:09 +08:00
7ea11e34a9 保存进度! 2023-09-11 18:27:06 +08:00
2edd5f67db 保存进度! 2023-09-11 11:49:58 +08:00
efebd548c6 保存进度! 2023-09-08 17:57:34 +08:00
22157b11eb 开始编写获奖相关的界面 2023-09-06 18:37:50 +08:00
bc7e56c336 加入奖项相关的代码 2023-09-06 16:26:47 +08:00
f54f6bbfea 保存进度! 2023-09-05 18:37:41 +08:00
21a50f4c61 保存进度! 2023-09-05 00:41:39 +08:00
075da72a73 保存进度! 2023-09-04 19:01:52 +08:00
ae68f047f4 开发个人业绩组件 2023-09-01 19:05:30 +08:00
7c5da24f5a 保存进度! 2023-08-31 20:34:36 +08:00
4d03abde27 保存进度! 2023-08-30 20:15:31 +08:00
08ea359cd1 保存进度! 2023-08-29 18:57:27 +08:00
161 changed files with 19000 additions and 16119 deletions

3
.gitignore vendored
View File

@@ -729,3 +729,6 @@ target/*
# oracle
*.~pck
*.~sql
# 输出目录
输出/*

View File

@@ -0,0 +1,18 @@
SELECT *
FROM BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<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>;
SELECT *
FROM BI<EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>Ʊ<EFBFBD>;
/*
truncate table BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸ͳ<CDB8>Ʊ<EFBFBD>;
BEGIN
telsale_bi_utils.<2E><><EFBFBD><EFBFBD>BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸ͳ<CDB8>Ʊ<EFBFBD>;
telsale_bi_utils.<2E><><EFBFBD><EFBFBD>BI<42><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>Ʊ<EFBFBD>;
telsale_bi_utils.<2E><><EFBFBD><EFBFBD>BI<42><49><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>ͳ<EFBFBD>Ʊ<EFBFBD>;
END;
*/

View 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;
/

View File

@@ -0,0 +1,23 @@
create or replace package Telsaler_twr_pkg is
-- Author : KANE
-- Created : 2023/11/26 18:19:22
-- Purpose : TWRϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>pkg
procedure <20><><EFBFBD><EFBFBD>TWR<57><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯԱ<CFAF><D4B1><EFBFBD><EFBFBD>;
end Telsaler_twr_pkg;
/
create or replace package body Telsaler_twr_pkg is
procedure <20><><EFBFBD><EFBFBD>TWR<57><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯԱ<CFAF><D4B1><EFBFBD><EFBFBD>
is
begin
execute immediate 'truncate table twr_telsaler';
end;
begin
-- Initialization
null;
end Telsaler_twr_pkg;
/

View 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;
/

View File

@@ -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,57 +13,58 @@ 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_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');
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
@@ -76,35 +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><EFBFBD> = L_THIS_YEAR
AND <20><><EFBFBD>Ŵ<EFBFBD><EFBFBD><EFBFBD> = A_DEPARTMENT_CODE;
--<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;
--<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><EFBFBD>ٱ<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."<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>
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,
@@ -125,86 +153,104 @@ 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_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_this_month VARCHAR2(4);
l_this_year VARCHAR2(4);
l_firstday DATE;
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>֤<EFBFBD><D6A4><EFBFBD><EFBFBD>
--<2D><>ѯ<EFBFBD><D1AF>ϯ<EFBFBD><CFAF><EFBFBD>ƣ<EFBFBD><C6A3>Ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BEGIN
SELECT saler_name
INTO l_caller_name
FROM tele_saler
WHERE saler_code = 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,
'yyyy');
l_firstday := to_date(l_this_year || '-01-01 00:00:00',
'yyyy-mm-dd hh24:mi:ss');
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>),
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> = a_caller_code
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 decode(nvl(SUM(cf.<2E><><EFBFBD>ո<EFBFBD><D5B8>˿ͻ<CBBF><CDBB><EFBFBD><EFBFBD><EFBFBD>),
0),
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><CFAF><EFBFBD><EFBFBD> = a_caller_code
AND cf.<2E><><EFBFBD><EFBFBD> = l_this_year
AND cf.<2E>·<EFBFBD> = l_this_month;
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 decode(nvl(SUM(xb.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>),
0),
0,
0,
round(SUM(xb.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>) / SUM(xb.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) * 100,
2)) xbl
INTO a_renewal_rate
FROM <EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><EFBFBD> xb
WHERE xb.<2E><>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> = a_caller_code;
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> + CF.<2E><><EFBFBD><EFBFBD><EFBFBD>ںϱ<DABA><CFB1><EFBFBD>),
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> = a_caller_code
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> < TO_DATE(TO_CHAR(SYSDATE,
'yyyy-mm') || '-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;
@@ -236,37 +282,26 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS
-- <20><><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><DABA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD>
OPEN A_ATTACHING_RANKING_LIST FOR
SELECT ROWNUM,
<EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> AS CALLER_NAME,
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><EFBFBD> AS ATTACHING_RATE
FROM (SELECT <EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
ROUND(DECODE(nvl(SUM(<EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD><EFBFBD>˿ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>),
0),
0,
0,
(SUM(<28><><EFBFBD><EFBFBD><EFBFBD>ںϱ<DABA><CFB1><EFBFBD>) / SUM(<28><><EFBFBD>ո<EFBFBD><D5B8>˿ͻ<CBBF><CDBB><EFBFBD><EFBFBD><EFBFBD>)) * 100),
2) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>
FROM <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD>ÿ<EFBFBD>ձ<EFBFBD><D5B1><EFBFBD>
WHERE <20>·<EFBFBD> = A_MONTH
AND <20><><EFBFBD><EFBFBD> = A_YEAR
AND <20><><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD> = A_DEPARTMENT_CODE
GROUP BY <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD>
ORDER BY <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8> DESC);
PAIHANG.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> AS CALLER_NAME,
PAIHANG.XBL AS ATTACHING_RATE
FROM (SELECT T.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
ROUND(T.<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>͸<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,
<20><>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> AS CALLER_NAME,
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AS RENEWAL_RATE
FROM (SELECT <20><>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
decode(nvl(SUM(xb.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>),
0),
0,
0,
round(SUM(xb.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>) / SUM(xb.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) * 100,
2)) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
FROM <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3> XB
WHERE XB.<2E><><EFBFBD><EFBFBD> = L_DEPARTMENT_NAME
GROUP BY <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD>
ORDER BY <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DESC);
PAIHANG.<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AS CALLER_NAME,
PAIHANG.XBL AS RENEWAL_RATE
FROM (SELECT T.<EFBFBD><EFBFBD><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;

View File

@@ -0,0 +1,45 @@
CREATE OR REPLACE PACKAGE TELSALE_BI_UTILS 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;
/
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
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;
/

View 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;
/

View File

@@ -0,0 +1,99 @@
CREATE OR REPLACE PACKAGE telsaler_reward_pkg IS
-- Author : WANGWEI-202
-- Created : 2023/9/13 10:05:43
-- Purpose : <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صİ<D8B5>
PROCEDURE add_telsaler_reward
(
a_reward_index VARCHAR2,
a_telsaler_name VARCHAR2
);
PROCEDURE update_telsaler_reward
(
a_rec_id INTEGER,
a_telsaler_name VARCHAR2,
a_reward_index VARCHAR2
);
PROCEDURE delete_telsaler_reward(a_rec_id INTEGER);
END telsaler_reward_pkg;
/
CREATE OR REPLACE PACKAGE BODY telsaler_reward_pkg IS
PROCEDURE add_telsaler_reward
(
a_reward_index VARCHAR2,
a_telsaler_name VARCHAR2
) IS
BEGIN
BEGIN
INSERT INTO telsaler_reward
(reward_index,
telsaler_name)
VALUES
(a_reward_index,
a_telsaler_name);
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = -00001
THEN
raise_application_error(-20001,
<>ظ<EFBFBD>');
END IF;
END;
COMMIT;
END;
PROCEDURE update_telsaler_reward
(
a_rec_id INTEGER,
a_telsaler_name VARCHAR2,
a_reward_index VARCHAR2
) IS
BEGIN
/*MERGE INTO telsaler_reward r
USING (SELECT COUNT(*) COUNT
FROM telsaler_reward
WHERE rec_id = a_rec_id) a
ON (a.count > 0)
WHEN MATCHED THEN
UPDATE
SET r.reward_index = a_reward_index,
r.telsaler_name = a_telsaler_name
WHERE r.rec_id = a_rec_id
WHEN NOT MATCHED THEN
INSERT
(reward_index,
telsaler_name)
VALUES
(a_reward_index,
a_telsaler_name);*/
BEGIN
UPDATE telsaler_reward r
SET r.reward_index = a_reward_index,
r.telsaler_name = a_telsaler_name
WHERE r.rec_id = a_rec_id;
EXCEPTION
WHEN no_data_found THEN
raise_application_error(-20002,
'<27>޴˼<DEB4>¼<EFBFBD><C2BC>');
END;
COMMIT;
END;
PROCEDURE delete_telsaler_reward(a_rec_id INTEGER) IS
BEGIN
DELETE telsaler_reward
WHERE rec_id = a_rec_id;
COMMIT;
END;
BEGIN
NULL;
END telsaler_reward_pkg;
/

17
code/db/twr_常用.sql Normal file
View File

@@ -0,0 +1,17 @@
select *
from twr_telsaler_team;
SELECT ry.<EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
ry.<EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
team.team_code,
team.team_name,
bm.department_code,
bm.department_name
FROM twr_telsaler ry,
twr_telsaler_team team,
idst0.bm_t bm
WHERE ry.<EFBFBD>Ŷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = team.team_name
AND team.department_code = bm.department_code
AND (ry.<EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD> = '<EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>' OR ry.<EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD> = '<EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>');

3
code/db/宽表.sql Normal file
View 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;

View File

@@ -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,32 +46,59 @@ 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>,
<EFBFBD><EFBFBD><EFBFBD>Ŵ<EFBFBD><EFBFBD><EFBFBD>,
<EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HAVING <EFBFBD>·<EFBFBD> = '06<EFBFBD><EFBFBD>'
HAVING <EFBFBD>·<EFBFBD> = '10<EFBFBD><EFBFBD>'
ORDER BY <EFBFBD><EFBFBD><EFBFBD>Ŵ<EFBFBD><EFBFBD><EFBFBD>,
<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'
AND <EFBFBD>·<EFBFBD> = '05'
AND <EFBFBD>·<EFBFBD> = '10'
AND <EFBFBD><EFBFBD><EFBFBD><EFBFBD> = '2023'
GROUP BY <EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ORDER BY <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><EFBFBD> DESC;
--<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;
----------------------------------------
/*
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>';
SELECT *
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>-24<32><34>";

View File

@@ -0,0 +1,14 @@
drop table BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><EFBFBD>ٱ<EFBFBD>;
create table BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><EFBFBD>ٱ<EFBFBD>
(
"<EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><EFBFBD><EFBFBD>" varchar2(100),
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>ֵ1(%)" number,
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><C8AB>" integer,
"<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><EFBFBD>(%)" number,
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>(%)" number,
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>ȫ<EFBFBD>£<EFBFBD>(%)" number,
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(%)" number,
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(%)" number,
"ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰǩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" integer,
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" number
);

View File

@@ -0,0 +1,15 @@
drop table BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><EFBFBD>ٱ<EFBFBD>;
create table BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><EFBFBD>ٱ<EFBFBD>
(
"<EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><EFBFBD><EFBFBD>" varchar2(100),
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" varchar2(30),
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>ֵ1(%)" number default 0,
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><C8AB>" integer default 0,
"<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><EFBFBD>(%)" number default 0,
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>(%)" number default 0,
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>ȫ<EFBFBD>£<EFBFBD>(%)" number default 0,
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(%)" number default 0,
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(%)" number default 0,
"ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰǩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" integer default 0,
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" number
)

View File

@@ -0,0 +1,14 @@
--drop table BI<EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>Ʊ<EFBFBD>;
create table BI<EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>Ʊ<EFBFBD>
(
summary_date date default sysdate not null,
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(20) not null,
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>ֵ NUMBER default 0 not null,
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD> NUMBER default 0 not null,
<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><EFBFBD> NUMBER default 0 not null,
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ NUMBER default 0 not null,
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD> NUMBER default 0 not null,
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NUMBER default 0 not null,
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NUMBER default 0 not null
);
comment on table BI<EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>Ʊ<EFBFBD> is '<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>';

View File

@@ -0,0 +1,14 @@
create table BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD>ʸ<EFBFBD><EFBFBD>ٱ<EFBFBD>
(
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" varchar2(100),
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" varchar2(100) not null,
"<EFBFBD><EFBFBD><EFBFBD>ձ<EFBFBD><EFBFBD><EFBFBD>(<28><>)" number default 0,
"<EFBFBD><EFBFBD><EFBFBD>ձ<EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><EFBFBD>" number default 0,
"<EFBFBD>dz<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><>)" number default 0,
"<EFBFBD><EFBFBD><EFBFBD>±<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><EFBFBD>" number default 0,
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD>ʻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" number default 0,
"<EFBFBD><EFBFBD><EFBFBD>¿ͻ<EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><EFBFBD>" number default 0,
"<EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD>ʻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" number default 0,
"<EFBFBD><EFBFBD><EFBFBD>³<EFBFBD><EFBFBD>ǿ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" number default 0,
"<EFBFBD>;<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" number default 0
);

View File

@@ -0,0 +1,17 @@
drop table BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>Ʊ<EFBFBD>;
create table BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>Ʊ<EFBFBD>
(
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(100) not null,
"Ŀ<EFBFBD><EFBFBD>ֵ-<2D><><EFBFBD><EFBFBD>" number default 0 not null,
Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> number default 0 not null,
"<EFBFBD><EFBFBD><EFBFBD>ձ<EFBFBD><EFBFBD><EFBFBD>" number default 0 not null,
<EFBFBD><EFBFBD><EFBFBD>ձ<EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><EFBFBD> number default 0 not null,
"<EFBFBD>dz<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" number default 0 not null,
<EFBFBD><EFBFBD><EFBFBD>±<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><EFBFBD> number default 0 not null,
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD>ʻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> number default 0 not null,
<EFBFBD><EFBFBD><EFBFBD>¿ͻ<EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><EFBFBD> number default 0 not null,
<EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD>ʻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> number default 0 not null,
<EFBFBD><EFBFBD><EFBFBD>³<EFBFBD><EFBFBD>ǿ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> number default 0 not null,
<EFBFBD>;<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> number default 0 not null
);
comment on table BI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>Ʊ<EFBFBD> is '<EFBFBD><EFBFBD><EFBFBD><EFBFBD>BIϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>';

View File

@@ -0,0 +1,39 @@
drop table twr_telsaler;
create table twr_telsaler
(
<EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD>μӹ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> varchar2(20),
<EFBFBD><EFBFBD>ְ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(20),
<EFBFBD><EFBFBD>˾<EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(20),
ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD><EFBFBD><EFBFBD>ʡ varchar2(40),
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD><EFBFBD><EFBFBD>θ<EFBFBD>λ varchar2(40),
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD><EFBFBD> varchar2(40),
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
ְ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD>Ŷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD>Կڷֹ<EFBFBD>˾ varchar2(40),
չҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD><EFBFBD>Ƹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ varchar2(40),
ȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѧ<EFBFBD><EFBFBD> varchar2(40),
ѧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD><EFBFBD>ͬǩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> integer,
<EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(20),
<EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(20),
<EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
ְ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD> varchar2(40),
<EFBFBD><EFBFBD>Ա״̬ varchar2(40)
);

View File

@@ -0,0 +1,7 @@
drop table twr_telsaler_team;
create table twr_telsaler_team
(
team_name varchar2(40) not null,
team_code varchar2(20),
department_code varchar2(6) not null
);

View File

@@ -0,0 +1,17 @@
drop table telsaler_reward;
create table telsaler_reward
(
rec_id integer not null,
reward_index integer not null,
telsaler_name varchar2(100) not null,
telsaler_code varchar2(20)
);
CREATE OR REPLACE TRIGGER telsaler_reward_id
BEFORE INSERT ON telsaler_reward
FOR EACH ROW
BEGIN
SELECT desktop_archievement_seq.nextval
INTO :new.rec_id
FROM dual;
END;

View File

@@ -0,0 +1,259 @@
with aa1 as (select
to_char(t.signature_date,'yyyy-mm-dd') 签发日期
,t.policy_no 保单号_车险
,qt.t_cre TID
,qt.b_cre BTID
,V.PLATE_NUMBER 车牌号
from
idst0.auto_agreement_request_t t
left join idst0.auto_agreement_t e on e.policy_no = t.policy_no
left join idst0.motorised_vehicle_t v on v.policy_no = e.policy_no
left join idst0.auto_premium_t pt on pt.policy_no = t.policy_no and pt.endorsement_no = t.endorsement_no
left join ywglxt.w_dxbd_i i on e.policy_no = i.bdh
left join idst0.rydm_t xx on xx.staff_code = nvl(i.zhjywy,e.operator_code)
left join idst0.ks_t y on y.section_office_code = nvl(xx.section_office_code,e.section_office_code)
left join idst0.bm_t z on z.department_code = nvl(xx.department_code,e.department_code)
--left join ywglxt.q_auto_agreement _extend_t qe on qe.policy_no = e.policy_no
left join ywglxt.q_auto_agreement_t qt on qt.policy_no = e.policy_no
left join dc_tb_jc_c_tag cl on cl.保单号 = e.policy_no
--left join dc_yangg_basecode_teams fg on fg.bm = z.department_name and fg.ks = y.section_office_name
left join idst0.auto_agreement_extend_t et on et.policy_no = e.policy_no
left join idst0.t_sell_policy_autobase_t zx on zx.policy_no = e.policy_no
left join dc_YZH_ZXYS YS ON YS.坐席工号= nvlzx.workerno,et.telpartnercode)
where
t.signature_date >= sysdate-365
AND t.signature_date < sysdate+90
and e.policy_status = '1' --条件:保单有效
--AND V.PLATE_NUMBER='LVHRM1810F5024561'
and qt.tflag = '0' --条件:类型为个人
--AND qt.t_cre='440881198901110216'
and t.endorsement_no='无'
and qt.usage_xm = '家庭自用车'
and e.planned_end_date - e.inception_date >= 360 --条件:保单周期
and et.LICENSEOWNERCERTIFICATETYPE not in ('17','15','13')
)
,DD2 AS
(SELECT AA1.签发日期,AA1.TID 证件号,AA1.保单号_车险 FROM AA1
union
SELECT AA1.签发日期,AA1.BTID 证件号,AA1.保单号_车险 FROM AA1 )
--select * from dd2
,dd3 AS (SELECT DISTINCT DD2.证件号,dd2.保单号_车险,
case when DD2.证件号 is not null then row_number() over (partition by DD2.证件号 order by DD2.签发日期 desc) else 1 end Crow_no1 FROM DD2 )
,dd4 AS (SELECT DISTINCT AA1.车牌号,AA1.保单号_车险,
case when AA1.车牌号 is not null then row_number() over (partition by AA1.车牌号 order by AA1.签发日期 desc) else 1 end Crow_no2 FROM aa1 )
--,dd as (
--select dd2.*
--,case when DD2.TID is not null then row_number() over (partition by DD2.TID order by DD2.签单日期 desc) else 1 end Crow_no
--from dd2)
,dd5 AS (SELECT DD3.证件号,dd3.保单号_车险 from dd3 where dd3.Crow_no1='1')
,dd6 AS (SELECT DD4.车牌号,dd4.保单号_车险 from dd4 where dd4.Crow_no2='1')
,bb as (
select
'非车' 条线名称
,to_char(q.signature_date,'yyyy-mm-dd') 签发日期
,nvl(dd5.保单号_车险,dd6.保单号_车险) 保单号_车险
,q.policy_no 保单号_非车
--,q.endorsement_no pdh
,qna.t_cre tid
,qna.B_cre Btid
,(case when nvl(dd5.保单号_车险,dd6.保单号_车险)IS NOT NULL THEN '是' else '' end )是否分公司融合
--,'' 客户数_分公司
--,qna.tbrmc 投保人名称
,JYX.LICENSE_PLATE_NO 车牌号
,round((pt.premium_amount-nvl(pt.taxamount,0))*c.rate/100,2) 车险签发保费
,x.staff_name 经办姓名
,X.STAFF_CODE 经办代码
,y.section_office_name 科室名称
,z.department_name 部门
,(case when nvlzx.workerno,et.telpartnercode) = 'DX001' and x.staff_name like '%建发凯迪%' then '林伟华'
when nvlzx.workerno,et.telpartnercode) = 'DX001' and x.staff_name not like '%建发凯迪%' then '其他'
when x.staff_name like '%建发汽车续保%' then '林伟华'
when x.staff_name like '%建发凯通泰成续保%' and e.planned_end_date < to_date('2023-09-30 00:00:00', 'yyyy-mm-dd hh24:mi:ss') then '李定定'
when x.staff_name like '%建发凯通泰成续保%' then '周阳'
else to_char(ys.坐席姓名) END) 坐席名称
,nvlzx.workerno,et.telpartnercode) 坐席代码
,YS.团队 坐席团队
,cl.管理渠道21版 管理渠道
,cl.新转续 ntr
,(select AUTO_NAME from idst0.auto_store_t where auto_code = qna.AGENT_CODE) dldmc
,(case when gk.product_name like '%驾乘%' or gk.product_code in'23XZ9800','23YZ9800') THEN '1' ELSE '' END) 是否驾乘
,'' 车商代码
,'' 品牌
,qna.life_salesperson 寿险代码
,nvl(ca.plan_name,ra.plan_name) 产品方案名称
,E.INCEPTION_DATE 起保日期
--,QNA.PRODUCT_CODE 险种代码
FROM
idst0.nonauto_agreement_request_t q
left join idst0.nonauto_agreement_t e on e.policy_no = q.policy_no
left join idst0.nonauto_premium_t pt on pt.endorsement_no = q.endorsement_no and pt.policy_no = q.policy_no
--left join idst0.reinsurance_t r on r.reinsurance_policy_no = e.policy_no
left join idst0.exrate_month_t c on pt.currency_code = c.bzh
and to_char(q.signature_date,'YYYY') = c.theyear and to_char(q.signature_date,'fmmm') = c.themonth
left join idst0.rydm_t x on x.staff_code = e.operator_code
left join idst0.ks_t y on y.section_office_code = x.section_office_code
left join idst0.bm_t z on z.department_code = x.department_code
left join ywglxt.q_nonauto_agreement_t qna on qna.policy_no = q.policy_no
left join dc_yangg_gkxzh gk on gk.product_code = e.product_code --分散型险种
left join dd5 on dd5.证件号 = qna.t_cre
left join IDst0.nonauto_vehicle_info_t JYX ON JYX.POLICY_NO=q.policy_no
left join dd6 on dd6.车牌号 = JYX.LICENSE_PLATE_NO
left join idst0.auto_agreement_extend_t et on et.policy_no = e.policy_no
left join idst0.T_SELL_POLICY_PROPERTY_INFO_T zx on zx.policy_no = e.policy_no
left join dc_YZH_ZXYS YS ON YS.坐席工号= nvlzx.workerno,et.telpartnercode)
left join dc_tb_jc_c_tag cl on cl.保单号 = nvl(dd5.保单号_车险,dd6.保单号_车险)
left join idst0.ryx_agreement_t ra on ra.policy_no = e.policy_no
left join idst0.cibs_agreement_t ca on ca.policy_no = e.policy_no
--left join (SELECT CX.POLICY_NO,CX.LIFE_SALESPERSON,CX.VEHICLE_BRAND FROM ywglxt.q_Auto_Agreement_t CX) cx on cx.policy_no=rmi.保单号_车险
--left join ywglxt.v_xzh xzh on xzh.product_code = e.product_code
--left join ywglxt.q_auto_agreement_t qtt on qtt.plate_number = JYX.LICENSE_PLATE_NO 剔除车非不是家用车
where
qna.tflag = '0'
and (case when q.endorsement_no !='无' and round((pt.premium_amount-nvl(pt.taxamount,0))*c.rate/100,2) !=0 then '是' end) is null
--and q.endorsement_no = '无'
and nvl(dd5.证件号,dd6.车牌号) is not null
and q.signature_date >= sysdate-5
AND q.signature_date < sysdate
--AND qna.t_cre='350623198706075199'
--and (case when JYX.LICENSE_PLATE_NO is not null and qtt.usage_xm='家庭自用车' then '是' when JYX.LICENSE_PLATE_NO is null then '是' end )IS NOT NULL 剔除车非不是家用车
and e.policy_status = '1'
and gk.product_code is not null
and (e.product_code like '2%' or e.product_code like '1106%' --意健 --责任
or e.product_code like '1107%' or e.product_code like '1108%' or e.product_code like '1307%' or e.product_code like '1304A400%' --家财
)
--AND qna.policy_no='AXIMQDI30V23FP0062SH'
)
,BB3 AS (SELECT bb.tid ,COUNT(*) 次数 from bb group by bb.tid )
,bb2 as (
select bb.*
,case when bb.是否驾乘 ='1' then row_number() over (partition by bb.tid,bb.是否驾乘 order by bb.签发日期 desc) else 1 end JCrow_no
,case when bb.tid IS not NULL then row_number() over (partition by bb.tid order by bb.签发日期 desc) else 1 end CFrow_no
,BB3.次数
from BB
LEFT JOIN BB3 ON BB3.tid =bb.tid
)
,BB4 AS(select bb2.*
,(CASE when bb2.次数='1' THEN '1'
WHEN bb2.次数 = '2' and BB2.是否驾乘 ='1' and jcROW_NO ='1' then '1'
-- WHEN bb2.次数 = '2' and BB2.是否驾乘 is null and CFROW_NO ='2' then '0'
WHEN bb2.次数 = '2' and BB2.是否驾乘 is null and CFROW_NO ='1' then '1'
WHEN bb2.次数 > '2' AND cfROW_NO ='1' then '1' --BB2.是否驾乘 ='1' and
-- WHEN bb2.次数 > '2' AND BB2.是否驾乘 IS NULL THEN '1'--AND CFROW_NO ='1'
ELSE '0' END ) 客户数
from bb2
/*,ff AS(
SELECT
to_char(rmi.签发日期,'yyyy-mm-dd') 签发日期
,RMI.保单号_车险
,rmi.保单号_非车
,rmi.车险签发保费
,RMI.条线名称
,RMI.是否分公司融合
,RMI.客户数_分公司
,cl.经办姓名
,CL.科室名称
,CL.部门
,(case when nvlzx.workerno,et.telpartnercode) = 'DX001' and cl.经办姓名 like '%建发凯迪%' then '林伟华'
when nvl(zx.workerno,et.telpartnercode) = 'DX001' and cl.经办姓名 not like '%建发凯迪%' then '其他'
else to_char(ys.坐席姓名) END) 坐席名称
,YS.团队 坐席团队
,cl.管理渠道21版 管理渠道
,cl.新转续 ntr
,(select AUTO_NAME from idst0.auto_store_t where auto_code = nvl(e.selling_shop_code,e.tel_sale_4s_code)) dldmc
FROM DC_CF_RMI rmi
left join idst0.auto_agreement_t e on e.policy_no = rmi.保单号_车险
left join dc_tb_jc_c_tag cl on cl.保单号 = e.policy_no
--left join dc_yangg_basecode_teams fg on fg.bm = z.department_name and fg.ks = y.section_office_name
left join idst0.auto_agreement_extend_t et on et.policy_no = e.policy_no
left join idst0.t_sell_policy_autobase_t zx on zx.policy_no = e.policy_no
left join dc_YZH_ZXYS YS ON YS.坐席工号= nvlzx.workerno,et.telpartnercode))*/
,aa as (select
'车险' 条线名称
,to_char(t.signature_date,'yyyy-mm-dd') 签发日期
,t.policy_no 保单号_车险
--,t.endorsement_no pdh
,'' 保单号_非车
,'' 是否分公司融合
,(case when qt.bd_type in ('1','2') THEN '1'
when qt.bd_type = '3' and qt.xzh_xm='商业险' then '1' ELSE '0'END )客户数_分公司
--,decode(qT.bd_type,'1','单交强','2','单商业','3','交商共保','其它') 保单类型
,qt.t_cre TID
,qt.b_cre BTID
--,QT.TBRMC 投保人名称
,V.PLATE_NUMBER 车牌号
,pt.premium_amount - nvl(pt.tax_amount,0) 车险签发保费
,xx.staff_name 经办姓名
,XX.STAFF_CODE 经办代码
,y.section_office_name 科室名称
,z.department_name 部门
,(case when nvlzx.workerno,et.telpartnercode) = 'DX001' and xx.staff_name like '%建发凯迪%' then '林伟华'
when nvl(zx.workerno,et.telpartnercode) = 'DX001' and xx.staff_name not like '%建发凯迪%' then '其他'
when xx.staff_name like '%建发汽车续保%' then '林伟华'
when xx.staff_name like '%建发凯通泰成续保%' and e.planned_end_date < to_date('2023-09-30 00:00:00', 'yyyy-mm-dd hh24:mi:ss') then '李定定'
when xx.staff_name like '%建发凯通泰成续保%' then '周阳'
else to_char(ys.坐席姓名) END) 坐席名称
,nvl(zx.workerno,et.telpartnercode) 坐席代码
,YS.团队 坐席团队
,cl.管理渠道21版 管理渠道
,cl.新转续 ntr
,(select AUTO_NAME from idst0.auto_store_t where auto_code = nvl(e.selling_shop_code,e.tel_sale_4s_code)) dldmc
,e.selling_shop_code 车商代码
,qt.life_salesperson 寿险代码
,QT.VEHICLE_BRAND 品牌
,'' 产品方案名称
,E.INCEPTION_DATE 起保日期
--,QT.PRODUCT_CODE 险种代码
from
idst0.auto_agreement_request_t t
left join idst0.auto_agreement_t e on e.policy_no = t.policy_no
left join idst0.motorised_vehicle_t v on v.policy_no = e.policy_no
left join idst0.auto_premium_t pt on pt.policy_no = t.policy_no and pt.endorsement_no = t.endorsement_no
left join ywglxt.w_dxbd_i i on e.policy_no = i.bdh
left join idst0.rydm_t xx on xx.staff_code = nvl(i.zhjywy,e.operator_code)
left join idst0.ks_t y on y.section_office_code = nvl(xx.section_office_code,e.section_office_code)
left join idst0.bm_t z on z.department_code = nvl(xx.department_code,e.department_code)
--left join ywglxt.q_auto_agreement _extend_t qe on qe.policy_no = e.policy_no
left join ywglxt.q_auto_agreement_t qt on qt.policy_no = e.policy_no
left join dc_tb_jc_c_tag cl on cl.保单号 = e.policy_no
--left join dc_yangg_basecode_teams fg on fg.bm = z.department_name and fg.ks = y.section_office_name
left join idst0.auto_agreement_extend_t et on et.policy_no = e.policy_no
left join idst0.t_sell_policy_autobase_t zx on zx.policy_no = e.policy_no
left join dc_YZH_ZXYS YS ON YS.坐席工号= nvlzx.workerno,et.telpartnercode)
where
t.signature_date >= sysdate-5
AND t.signature_date < sysdate
AND e.policy_status = '1' --条件:保单有效
--AND qt.t_cre='350623198706075199'
and qt.tflag = '0' --条件:类型为个人
and t.endorsement_no='无'
and qt.usage_xm = '家庭自用车'
and e.planned_end_date - e.inception_date >= 360 --条件:保单周期
and et.LICENSEOWNERCERTIFICATETYPE not in ('17','15','13')
--AND e.policy_no='AXIMC01Y2023B015820W'
)
select "签发日期","保单号_车险","保单号_非车","条线名称","是否分公司融合","客户数","车险签发保费","经办姓名","经办代码","科室名称","部门","坐席名称","坐席代码","坐席团队","管理渠道","NTR","DLDMC","车商代码","寿险代码","品牌","产品方案名称","起保日期","车牌号"
from bb4
UNION
select "签发日期","保单号_车险","保单号_非车","条线名称","是否分公司融合","客户数_分公司","车险签发保费","经办姓名","经办代码","科室名称","部门","坐席名称","坐席代码","坐席团队","管理渠道","NTR","DLDMC","车商代码","寿险代码","品牌","产品方案名称","起保日期","车牌号"
from AA
--UNION
--Select "签发日期","保单号_车险","保单号_非车","条线名称","是否分公司融合","客户数_分公司","车险签发保费","经办姓名","科室名称","部门","坐席名称","坐席团队","管理渠道","NTR","DLDMC"
--from ff

View File

@@ -7,7 +7,44 @@
#
# Copyright (c) ${2022} by Kane, All Rights Reserved.
###
NODE_ENV = 'development'
NODE_ENV='development'
VITE_URL_VALIDATE_ACCOUNT="http://222.76.244.118:11101/desktop_archievement_backend/account/query_staff_info.do"
VITE_URL_LOGIN = "http://222.76.244.118:11101/admin-system/account/p13_account_check"
VITE_URL_DEPARTMENT_ARCHIEVEMENT="http://222.76.244.118:11101/desktop_archievement_backend/archievement/query_department_archievement.do"
VITE_URL_LOGIN="http://222.76.244.118:11101/admin-system/account/p13_account_check"
VITE_URL_DEPARTMENT_ARCHIEVEMENT="http://222.76.244.118:11101/desktop_archievement_backend/archievement/query_department_archievement.do"
### URL相关 ##########
#登录
VITE_URL_LOGIN="http://222.76.244.118:11101/admin-system/account/p13_account_check"
VITE_URL_LOGIN_CALLER="http://222.76.244.118:11101/desktop_archievement_backend/account/query_telsaler_info.do"
#部门业绩查询
VITE_URL_DEPARTMENT_ARCHIEVEMENT="http://222.76.244.118:11101/desktop_archievement_backend/archievement/query_department_archievement.do"
#坐席业绩查询
VITE_URL_CALLER_ARCHIEVEMENT="http://222.76.244.118:11101/desktop_archievement_backend/archievement/query_caller_archievement.do"
#排行榜
VITE_URL_RANKINGLIST="http://222.76.244.118:11101/desktop_archievement_backend/archievement/query_ranking_list.do"
## 奖项相关 ##
## 查询奖励项目
VITE_URL_RWARD_PROJECTS="http://222.76.244.118:11101/desktop_archievement_backend/rewards/query_reward_projects.do"
## 查询获奖人员
VITE_URL_REWARD_GAINERS="http://222.76.244.118:11101/desktop_archievement_backend/rewards/query_reward_gainers.do"
## 添加获奖人员
VITE_URL_ADD_REWARD_TELSALER="http://222.76.244.118:11101/desktop_archievement_backend/rewards/add_telsaler_reward.do"
## 更新获奖人员
VITE_URL_UPDATE_REWARD_TELSALER="http://222.76.244.118:11101/desktop_archievement_backend/rewards/update_telsaler_reward.do"
## 删除获奖人员
VITE_URL_DEL_REWARD_TELSALER="http://222.76.244.118:11101/desktop_archievement_backend/rewards/delete_telsaler_reward.do"
## 上传文件
VITE_URL_UPLOAD_FILE="http://222.76.244.118:11101/desktop_archievement_backend/file/file-upload.do"
## 导入报表
VITE_URL_IMPORT_REPORT="http://222.76.244.118:11101/desktop_archievement_backend/import_bi_data/excel.do"
## 请求BI报表数据
VITE_URL_BI_TELSALER_ATTACHINGRATE="http://222.76.244.118:11101/desktop_archievement_backend/archievement/bi_telsaler_attachingrate.do"
VITE_URL_BI_TELSALER_RENEWALRATE="http://222.76.244.118:11101/desktop_archievement_backend/archievement/bi_telsaler_renewalrate.do"
VITE_URL_BI_DEPARTMENT_ATTACHINGRATE="http://222.76.244.118:11101/desktop_archievement_backend/archievement/bi_department_attachingrate.do"
VITE_URL_BI_DEPARTMENT_RENEWALRATE="http://222.76.244.118:11101/desktop_archievement_backend/archievement/bi_department_renewalrate.do"

View File

@@ -0,0 +1,49 @@
###
# @Author: Kane
# @Date: 2023-03-14 23:46:12
# @LastEditors: Kane
# @FilePath: /task_schedule/.env.production
# @Description:
#
# Copyright (c) ${2022} by Kane, All Rights Reserved.
###
VITE_URL_VALIDATE_ACCOUNT="http://10.39.0.61:8081/desktop_archievement_backend/account/query_staff_info.do"
VITE_URL_LOGIN="http://10.39.0.61:8081/admin-system/account/p13_account_check"
VITE_URL_DEPARTMENT_ARCHIEVEMENT="http://10.39.0.61:8081/desktop_archievement_backend/archievement/query_department_archievement.do"
### URL相关 ##########
#登录
VITE_URL_LOGIN="http://10.39.0.61:8081/admin-system/account/p13_account_check"
VITE_URL_LOGIN_CALLER="http://10.39.0.61:8081/desktop_archievement_backend/account/query_telsaler_info.do"
#部门业绩查询
VITE_URL_DEPARTMENT_ARCHIEVEMENT="http://10.39.0.61:8081/desktop_archievement_backend/archievement/query_department_archievement.do"
#坐席业绩查询
VITE_URL_CALLER_ARCHIEVEMENT="http://10.39.0.61:8081/desktop_archievement_backend/archievement/query_caller_archievement.do"
#排行榜
VITE_URL_RANKINGLIST="http://10.39.0.61:8081/desktop_archievement_backend/archievement/query_ranking_list.do"
## 奖项相关 ##
## 查询奖励项目
VITE_URL_RWARD_PROJECTS="http://10.39.0.61:8081/desktop_archievement_backend/rewards/query_reward_projects.do"
## 查询获奖人员
VITE_URL_REWARD_GAINERS="http://10.39.0.61:8081/desktop_archievement_backend/rewards/query_reward_gainers.do"
## 添加获奖人员
VITE_URL_ADD_REWARD_TELSALER="http://10.39.0.61:8081/desktop_archievement_backend/rewards/add_telsaler_reward.do"
## 更新获奖人员
VITE_URL_UPDATE_REWARD_TELSALER="http://10.39.0.61:8081/desktop_archievement_backend/rewards/update_telsaler_reward.do"
## 删除获奖人员
VITE_URL_DEL_REWARD_TELSALER="http://10.39.0.61:8081/desktop_archievement_backend/rewards/delete_telsaler_reward.do"
## 上传文件
VITE_URL_UPLOAD_FILE="http://10.39.0.61:8081/desktop_archievement_backend/file/file-upload.do"
## 导入报表
VITE_URL_IMPORT_REPORT="http://10.39.0.61:8081/desktop_archievement_backend/import_bi_data/excel.do"
## 请求BI报表数据
VITE_URL_BI_TELSALER_ATTACHINGRATE="http://10.39.0.61:8081/desktop_archievement_backend/archievement/bi_telsaler_attachingrate.do"
VITE_URL_BI_TELSALER_RENEWALRATE="http://10.39.0.61:8081/desktop_archievement_backend/archievement/bi_telsaler_renewalrate.do"
VITE_URL_BI_DEPARTMENT_ATTACHINGRATE="http://10.39.0.61:8081/desktop_archievement_backend/archievement/bi_department_attachingrate.do"
VITE_URL_BI_DEPARTMENT_RENEWALRATE="http://10.39.0.61:8081/desktop_archievement_backend/archievement/bi_department_renewalrate.do"

View File

@@ -67,7 +67,7 @@ module.exports = {
js: "espree",
"<template>": "espree",
},
// project: "./tsconfig.json",
project: "./tsconfig.json",
extraFileExtensions: [".vue",],
},
plugins: ["eslint-plugin-vue",],
@@ -75,7 +75,7 @@ module.exports = {
"plugin:vue/vue3-essential",
"plugin:vue/recommended",
"eslint:recommended",
// "standard-with-typescript",
"standard-with-typescript",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended",
],
@@ -112,6 +112,8 @@ module.exports = {
"vue/html-indent": ["error", 4,],
// typescript
"@typescript-eslint/indent": ["warn", 4,],
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/no-unsafe-argument": "warn",
"@typescript-eslint/no-extra-semi": "off",
"@typescript-eslint/no-inferrable-types": "off",
"@typescript-eslint/no-unused-vars": "warn",
@@ -157,7 +159,8 @@ module.exports = {
"space-in-parens": ["error", "always", { exceptions: ["{}", "[]", "()", "empty",], },],
"no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
"no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-unsafe-argument": "warn",
"@typescript-eslint/indent": ["error", 4,],
"@typescript-eslint/no-extra-semi": "off",
"@typescript-eslint/no-inferrable-types": "off",

View 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

View 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"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,40 +1,30 @@
{
"name": "task_schedule",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"@babel/eslint-parser": "^7.22.11",
"@element-plus/icons-vue": "^2.1.0",
"@rushstack/eslint-patch": "^1.3.3",
"@vue/eslint-config-typescript": "^11.0.3",
"babel": "^6.23.0",
"echarts": "^5.4.3",
"element-plus": "^2.3.12",
"moment": "^2.29.4",
"sass-loader": "^13.3.2",
"ts-node": "^10.9.1",
"vue": "^3.3.4",
"vue-router": "^4.2.4",
"vuex": "^4.1.0"
},
"devDependencies": {
"@babel/eslint-parser": "^7.22.11",
"@typescript-eslint/eslint-plugin": "^6.5.0",
"@vitejs/plugin-vue": "^4.3.3",
"@vue/cli-plugin-eslint": "^5.0.8",
"axios": "~1.5.0",
"eslint-config-recommended": "^4.1.0",
"eslint-config-standard-with-typescript": "^39.0.0",
"eslint-plugin-vue": "^9.17.0",
"node-sass": "^9.0.0",
"sass": "^1.66.1",
"style-loader": "^3.3.3",
"vue-eslint-parser": "^9.3.1"
}
"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.2",
"axios": "^1.11.0",
"echarts": "^6.0.0",
"element-plus": "^2.11.1",
"mitt": "^3.0.1",
"moment": "^2.30.1",
"task_schedule": "file:",
"vue": "^3.5.21",
"vue-router": "^4.5.1",
"vuex": "^4.1.0"
},
"devDependencies": {
"@vitejs/plugin-vue": "^6.0.1",
"eslint-config-recommended": "^4.1.0",
"eslint-config-standard-with-typescript": "^43.0.1",
"eslint-plugin-vue": "^10.4.0",
"ts-node": "^10.9.2"
}
}

View File

@@ -2,18 +2,28 @@
* @Author: Kane
* @Date: 2023-02-28 19:25:30
* @LastEditors: Kane
* @FilePath: /task_schedule/src/assets/css/public/global.scss
* @FilePath: /task_schedule/src/assets/css/public/variables.scss
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
// color
/*
$color-bg-01: #fecb96;
$color-bg-02: #f7954e;
$color-bg-03: #f27620;
$color-bg-04: #da3703;
$color-bg-05: #ba1800;
*/
$color-bg-01: #00b2f8;
$color-bg-02: #00b0fb;
$color-bg-03: #0279ea;
$color-bg-04: #046ed6;
$color-bg-05: #033eb6;
$color-title-font: #046ed6;
$color-charts-bg: #ffffff9f;
$color-honorlist-bg: rgba(255, 255, 255, 0.3);

View File

@@ -29,11 +29,11 @@ export default {
setup( props )
{
const ui = reactive({
mensualList:[],
mensualList: [],
});
// 设置图表
const initCharts = () =>
const initCharts = (): void =>
{
console.log( "每月业绩", props.chartData );
const chartDom = document.getElementById( "chartWrapper" );
@@ -55,7 +55,7 @@ export default {
],
};
option && myChart.setOption( option );
myChart.setOption( option );
window.onresize = function ()
{

View File

@@ -12,17 +12,18 @@
<el-progress
type="circle"
:percentage="ui.percentage"
: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: {
@@ -35,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>
@@ -73,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;

View File

@@ -0,0 +1,166 @@
<!--
* @Author: Kane
* @Date: 2023-08-30 14:08:57
* @LastEditors: Kane
* @FilePath: /task_schedule/src/components/CallerArchievementComponent.vue
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
-->
<template>
<div class="caller-archievment-wrapper">
<h1>{{ CallerName }}</h1>
<table>
<tr>
<th>当月保费</th><td>{{ PresentMonthPremium }}&nbsp;万元</td>
</tr>
<tr>
<th>车非渗透率</th><td>{{ props.attachingRate }}%</td>
</tr>
<tr>
<th>续保率</th><td>{{ props.renewalRate }}%</td>
</tr>
</table>
</div>
</template>
<script lang="ts">
import { computed } from "vue";
interface CallerArchievementComponentUI
{
callerName: string,
thisMonthPremium: number,
attachingRate: string,
renewalRate: string,
}
export default {
name: "CallerArchievementComponent",
props: {
callerName: {
type: String,
require: true,
default: (): string => "",
},
thisMonthPremium: {
type: Number,
require: true,
default: (): number => 0,
},
attachingRate: {
type: String,
require: true,
default: (): string => "0.0",
},
renewalRate: {
type: String,
require: true,
default: (): string => "0.0",
},
},
setup( props )
{
const ui: CallerArchievementComponentUI = {
callerName: "",
thisMonthPremium: 0,
attachingRate: "0.0",
renewalRate: "0.0",
};
const PresentMonthPremium = computed((): string =>
{
return ( props.thisMonthPremium / 10000 ).toFixed( 2 );
});
const CallerName = computed((): string =>
{
return props.callerName;
});
return {
CallerName,
PresentMonthPremium,
ui,
props,
};
},
};
</script>
<style scoped lang="scss">
.caller-archievment-wrapper
{
width: 300px;
height: 120px;
border-radius: 5px;
margin-bottom: 30px;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
background-color: #fff;
color: #4f4f4f;
font-size: 15px;
h1 {
background-color: #fecb96;
width: 100%;
text-align: center;
border-radius: 5px 5px 0px 0px;
margin: 0px;
padding: 5px 0px;
color: #da3703;
font: {
size: 1.2rem;
weight: 100;
family: "FZ-ZHUOHEI";
}
}
table {
border-collapse: collapse;
border-radius: 0px 0px 5px 5px;
width: 100%;
margin-top: 5px;
background-color: #ffffff;
font: {
size: 14px;
}
th,td {
padding: 9px;
border-bottom: 1.5px solid #ebeef5;
}
th {
width: 5.2rem;
text-align: right;
}
th.caller-name {
text-align: center;
background-color: yellow;
}
td {
text-align: left;
}
tr:nth-child(even) {
background-color: #f5f6f7;
}
tr:last-child td,th {
border-bottom: none;
}
}
}
</style>

View File

@@ -15,10 +15,13 @@
alt=""
>
<div class="title-wrapper">
<span>"消7灭6"突围战</span>
<span>{{ props.month }}入营坐席</span>
<span> 8 6 突围战</span>
<span>指标落后入营坐席</span>
</div>
</div>
<div class="telsaler-list-wrapper">
<span>开发中</span>
</div>
</div>
</template>
@@ -46,6 +49,8 @@ export default {
<style scoped lang="scss">
.dishonorlist-wrapper {
display: flex;
flex-direction: column;
height: 240px;
width: 360px;
border-radius: 5px;
@@ -55,10 +60,16 @@ export default {
padding: 10px;
>*+* {
margin-top: 10px;
}
.banner-wrapper {
display: flex;
justify-content: center;
align-items: stretch;
height: 65px;
flex-grow: 0;
img {
// width: 70px;
@@ -80,4 +91,24 @@ export default {
}
}
}
.telsaler-list-wrapper {
flex-grow: 1;
display: flex;
justify-content: center;
align-items: center;
span {
display: block;
text-align: center;
color: rgb(101, 140, 194);
margin-top: 0px;
font: {
size: 2rem;
family: "FZ-ZHUOHEI";
weight: 100;
}
}
}
</style>

View File

@@ -9,39 +9,18 @@
-->
<template>
<div class="honorlist-wrapper">
<span class="title">90俱乐部{{ $props.month }}月入围坐席</span>
<div class="reward-wrapper">
<div class="leading-reward-wrapper">
<div class="banner-wrapper">
<img
src="@/assets/img/ranking/medal.png"
alt="领跑奖"
>
<span>领跑奖</span>
</div>
<div class="gainer-wrapper">
<span
v-for="gainer in ui.leadingReward"
:key="gainer"
>{{ gainer }}</span>
</div>
</div>
<div class="advance-reward-wrapper">
<div class="banner-wrapper">
<img
src="@/assets/img/ranking/copper_medal.png"
alt="飞跃奖"
>
<span>飞跃奖</span>
</div>
<div class="gainer-wrapper">
<span
v-for="gainer in ui.advanceReward"
:key="gainer"
>{{ gainer }}</span>
</div>
<div class="banner-wrapper">
<img
src="@/assets/img/ranking/medal.png"
alt=""
>
<div class="title-wrapper">
<span>90俱乐部标杆坐席</span>
</div>
</div>
<div class="telsaler-list-wrapper">
<span>开发中</span>
</div>
</div>
</template>
@@ -81,6 +60,8 @@ export default {
<style scoped lang="scss">
.honorlist-wrapper {
display: flex;
flex-direction: column;
height: 240px;
width: 360px;
border-radius: 5px;
@@ -93,78 +74,54 @@ export default {
>*+* {
margin-top: 10px;
}
}
.title {
display: block;
text-align: center;
.banner-wrapper {
display: flex;
justify-content: center;
align-items: center;
height: 65px;
flex-grow: 0;
font: {
family: "FZ-ZHUOHEI";
size: 1.4rem;
}
color: goldenrod;
img {
width: 65px;
height: 65px;
}
.reward-wrapper {
width: 100%;
display: flex;
justify-content: center;
align-items: stretch;
>*+* {
margin-left: 10px;
}
.leading-reward-wrapper {
width: 165px;
height: 100%;
}
.advance-reward-wrapper {
width: 165px;
height: 100%;
}
.title-wrapper {
span {
display: block;
margin-top: 5px;
text-align: center;
color: #fff;
color: rgb(245, 178, 11);
margin-top: 0px;
font: {
size: 2rem;
family: "FZ-ZHUOHEI";
weight: 100;
}
}
.banner-wrapper {
display: flex;
justify-content: center;
align-items: center;
img {
width: 30px;
height: 30px;
}
span {
display: inline-block;
text-align: center;
color: #fff;
font: {
size: 1.5rem;
family: "FZ-ZHUOHEI";
weight: 100;
}
font: {
size: 1.65rem;
family: "FZ-ZHUOHEI";
weight: 100;
}
}
}
}
.telsaler-list-wrapper {
flex-grow: 1;
display: flex;
justify-content: center;
align-items: center;
span {
display: block;
text-align: center;
color: rgb(101, 140, 194);
margin-top: 0px;
font: {
size: 2rem;
family: "FZ-ZHUOHEI";
weight: 100;
}
}
}
</style>

View File

@@ -9,6 +9,9 @@
-->
<template>
<div class="rankinglist-wrapper">
<div class="rankinglist-title">
<span>{{ props.title }}</span>
</div>
<el-table
:data="topFive"
stripe
@@ -25,7 +28,7 @@
</template>
</el-table-column>
<el-table-column
label="名"
label="名"
width="160"
align="center"
>
@@ -39,7 +42,7 @@
align="center"
>
<template #default="ranking">
<span class="rankinglist-index">{{ ranking.row.appraiseValue }}</span>
<span class="rankinglist-index">{{ ranking.row.appraiseValue }}%</span>
</template>
</el-table-column>
</el-table>
@@ -103,7 +106,14 @@ export default {
// border: 1px solid red;
border-radius: 5px;
width: 300px;
height: 250px;
height: 270px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin-bottom: 15px;
}
.rankinglist-index {
@@ -113,7 +123,7 @@ export default {
:deep(.el-table)
{
border-radius: 5px;
border-radius: 0px 0px 5px 5px;
}
:deep(.el-table__header-wrapper) {
@@ -129,4 +139,28 @@ export default {
}
}
.rankinglist-title {
color: #da3703;
background-color: #fecc96;
width: 100%;
border-radius: 5px 5px 0px 0px;
height: 1.5rem;
display: flex;
justify-content: center;
align-items: center;
padding-top: 10px;
padding-bottom: 0px;
span {
font: {
size: 1rem;
weight: 700;
}
}
}
</style>

View File

@@ -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>

View File

@@ -12,7 +12,7 @@
<span class="company-name">CPIC</span>
<div class="version-wrapper">
<span>桌面霸屏后台管理</span>
<span>Build-202303251257</span>
<span>Build-20240111</span>
</div>
<div class="buttons-wrapper">
<component
@@ -35,7 +35,7 @@ export default {
/**
* 退出登录
*/
const Logout = ():void =>
const Logout = (): void =>
{
ElMessageBox.confirm(
"是否要退出系统?",
@@ -46,11 +46,12 @@ export default {
type: "warning",
}
)
.then(() =>
.then((): void =>
{
// debugger;
logout();
});
})
.catch((): void => {});
};
return { Logout, };
@@ -91,10 +92,10 @@ export default {
align-items: start;
font: {
size: 0.5rem;
size: 0.75rem;
}
> *+* {
>*+* {
margin-top: 1px;
}
}

View File

@@ -11,7 +11,7 @@
* @Author: Kane
* @Date: 2023-01-04 11:40:03
* @LastEditors: Kane
* @LastEditTime: 2023-03-27 18:19:35
* @LastEditTime: 2023-09-27 11:19:05
* @FilePath: /it-console/src/layout/components/Main.vue
* @Description:
*
@@ -37,6 +37,6 @@ export default {
.el-scrollbar {
height: 100%;
width: 100%;
background-color: #ecf2f9;
/* background-color: #ecf2f9; */
}
</style>

View File

@@ -62,22 +62,31 @@ const routes = [
component: ()=> import( "../layout/Index.vue" ),
children:[
{
path:"/staff_data",
name:"StaffDataManagement",
path:"/telsaler_data",
name:"TelsalerManagement",
meta: {
title:"坐席管理",
icon: "user",
},
component: ()=> import( "../views/StaffManagement.vue" ),
component: ()=> import( "../views/telsaler/TelsalerManagementView.vue" ),
},
{
path:"/archievement_data",
name:"ArchievementDataManagement",
path: "/data_management",
name: "DataManagement",
meta: {
title:"数据管理",
title: "数据管理",
icon: "document",
},
component: ()=> import( "../views/DataManagement.vue" ),
component: ()=> import( "../views/data/DataManagement.vue" ),
},
{
path:"/reward_management",
name:"RewardManagement",
meta: {
title:"奖励管理",
icon: "document",
},
component: ()=> import( "../views/RewardManagement.vue" ),
},
],
},

View 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
};

View 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
};

View File

@@ -12,4 +12,7 @@
// testRankingListRequest();
const arr: string[] = [];
console.log( "test" );
console.log( "检查instanceof", arr instanceof String );

View 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 );

View 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 );

View 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 };

View 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 );

View File

@@ -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"],
},
}

View File

@@ -0,0 +1,356 @@
/*
* @Author: Kane
* @Date: 2023-10-17 11:18:19
* @LastEditors: Kane
* @FilePath: /task_schedule/src/utils/BIReport.ts
* @Description: BI报表相关的代码
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
*/
import { service as instance } from "./api/request.ts";
import { API_URL } from "./api/config.ts";
import { type AxiosResponse } from "axios";
interface BIReportType
{
reportTypeCode: number;
reportTypeName: string;
}
/**
* 导入报表的请求对象
*/
interface ImportBIReportRequest
{
filePath: string,
reportType: number,
firstRow: number,
sheetIndex: number,
}
/**
* 导入报表的相应对象
*/
interface ImportBIReportResponse
{
success: boolean, // 请求成功标志
message: string, // 请求结果说明
importedCount: number, // 导入记录的数量
}
// BI坐席渗透率报表记录
interface BITelsalerAttachingRateRecord
{
departmentName: string; // 部门
telsalerName: string; // 经办人
motoPremium: number; // 车险保费
nomotoPremium: number; // 非车险保费
motoPremiumProportion: number; // 车险保费占比
attachingRate: number; // 保费渗透率
attachingRateChange: number; // 渗透率环比上月
customerHandleRate: number; // 当月客户渗透率
customerHandleRateChange: number; // 客户渗透率环比上月
noMotoPremiumPerCustomer: number; // 当月车非客均保费
noMotoPremiumPerCustomerChange: number; // 客均保费环比上月
}
interface QueryBITelsalerAttachingRateReportResponse
{
success: boolean,
message: string,
records: BITelsalerAttachingRateRecord[];
}
/**
* BI坐席续保率报表记录
*/
interface BITelsalerRenewalRateRecord
{
责任部门: string;
责任人: string;
机构目标值: number;
到期数全月: number;
序时到期数占比: number;
个车续保率序时: number;
个车续保率全月: number;
环比昨日: number;
环比上月: number;
平均提前签单天数: number;
环比: number;
}
interface QueryBITelsalerRenewalRateReportResponse
{
success: boolean;
message: string;
records: BITelsalerRenewalRateRecord[];
}
/** 机构 ***/
// 机构渗透率
/**
* 机构渗漏率报表记录
*/
interface BIDepartmentAttachingRateRecord
{
departmentName: string;
departmentObject: number;
objectGap: number;
motoPremium: number;
motoPremiumProPortion: number;
nomotoPremium: number;
attachingRate: number;
attachingRateChange: number;
motoInsuranceCustomerCount: number;
customerHandleRate: number;
customerHandleRateChange: number;
premiumPerCustomer: number;
premiumPerCustomerChange: number;
}
interface QueryBIDepartmentAttachingRateResponse
{
success: boolean;
message: string;
records: BIDepartmentAttachingRateRecord[];
}
// 机构续保率
interface BIDepartmentRenewalRateRecord
{
责任部门: string;
机构目标值: number;
到期数全月: number;
序时到期数占比: number;
个车续保率序时: number;
个车续保率全月: number;
环比昨日: number;
环比上月: number;
平均提前签单天数: number;
环比: number;
}
interface QueryBIDepartmentRenewalRateResponse
{
success: boolean;
message: string;
records: BIDepartmentRenewalRateRecord[];
}
type ImportBIReportResponseHandler = ( response: ImportBIReportResponse, error: any ) => void;
type QueryBITelsalerAttachingRateDataHandler = ( response: QueryBITelsalerAttachingRateReportResponse, error: any ) => void;
type QueryBITelsalerRenewalRateDataHandler = ( response: QueryBITelsalerRenewalRateReportResponse, error: any ) => void;
type QueryBIDepartmentAttachingRateDataHandler = ( response: QueryBIDepartmentAttachingRateResponse, error: any ) => void;
type QueryBIDepartmentRenewalRateDataHandler = ( response: QueryBIDepartmentRenewalRateResponse, error: any ) => void;
/**
* 请求导入BI报表
* @param request 请求参数
* @param handler 调用者提供的请求结果处理函数
*/
function importBIReport( request: ImportBIReportRequest, handler: ImportBIReportResponseHandler ): void
{
const importResponse: ImportBIReportResponse = {
success: false,
message: "",
importedCount: 0,
};
instance.request({
url: API_URL.URL_IMPORT_REPORT,
method: "post",
data: request,
})
.then(( response: AxiosResponse<any, any> ): any =>
{
const data: ImportBIReportResponse = response.data;
importResponse.success = data.success ?? false;
importResponse.message = data.message ?? "请求完成,但服务器未返回请求结果消息!";
importResponse.importedCount = data.importedCount ?? 0;
handler( importResponse, null );
})
.catch(( error: any ): any =>
{
importResponse.message = "请求导入报表错误,请查看控制台!";
console.log( error );
handler( importResponse, error );
});
}
/**
* 请求BI坐席渗透率数据
* @param handler 处理请求结果的handler函数。
*/
function queryBITelsalerAttachingRateData( handler: QueryBITelsalerAttachingRateDataHandler ): void
{
const queryResponse: QueryBITelsalerAttachingRateReportResponse = {
success: false,
message: "",
records: [],
};
instance.request({
url: API_URL.URL_BI_TELSALER_ATTACHINGRATE,
method: "post",
})
.then(( response: AxiosResponse<any, any> ): void =>
{
const data = response.data ?? {};
queryResponse.success = data.success ?? false;
queryResponse.message = data.message ?? "";
queryResponse.records = data.records ?? [];
console.log( "请求BI坐席渗透率数据", queryResponse );
handler( queryResponse, null );
})
.catch(( error ): void =>
{
queryResponse.message = "请求BI坐席渗漏率报表数据时出现错误请查看控制台消息";
queryResponse.success = false;
console.log( error );
handler( queryResponse, error );
});
}
/**
* 请求BI坐席续保率数据
* @param handler 调用者提供的处理请求结果的函数。
*/
function queryBITelsalerRenewalData( handler: QueryBITelsalerRenewalRateDataHandler ): void
{
const queryResponse: QueryBITelsalerRenewalRateReportResponse = {
success: false,
message: "",
records: [],
};
instance.request({
url: API_URL.URL_BI_TELSALER_RENEWALRATE,
method: "post",
})
.then(( response: AxiosResponse<any, any> ): void =>
{
const data = response.data ?? {};
queryResponse.success = data.success ?? false;
queryResponse.message = data.message ?? "";
queryResponse.records = data.records ?? [];
console.log( "请求BI坐席续保率数据", queryResponse );
handler( queryResponse, null );
})
.catch(( error: any ): void =>
{
queryResponse.success = false;
queryResponse.message = "查询BI坐席续保率数据失败请查看控制台";
console.log( error );
handler( queryResponse, error );
});
}
/**
* 请求机构渗透率数据
* @param handler 调用者提供的处理请求结果的函数。
*/
function queryDepartmentAttachingRateData( handler: QueryBIDepartmentAttachingRateDataHandler ): void
{
const queryResponse: QueryBIDepartmentAttachingRateResponse = {
success: false,
message: "",
records: [],
};
instance.request({
url: API_URL.URL_BI_DEPARTMENT_ATTACHINGRATE,
method: "post",
})
.then(( response: AxiosResponse<any, any> ): void =>
{
const data = response.data ?? {};
queryResponse.success = data.success ?? false;
queryResponse.message = data.message ?? "请求完成,但结果未知!";
queryResponse.records = data.records ?? [];
handler( queryResponse, null );
})
.catch(( error: any ): void =>
{
queryResponse.success = false;
queryResponse.message = "查询BI机构续渗透失败请查看控制台";
queryResponse.records = [];
console.log( "查询BI机构渗透率失败:", error );
handler( queryResponse, error );
});
}
/**
* 请求BI机构续保率数据
* @param handler 调用者提供的处理请求结果的函数。
*/
function queryDepartmentRenewalRateData( handler: QueryBIDepartmentRenewalRateDataHandler ): void
{
const queryResponse: QueryBIDepartmentRenewalRateResponse = {
success: false,
message: "",
records: [],
};
instance.request({
url: API_URL.URL_BI_DEPARTMENT_RENEWALRATE,
method: "post",
})
.then(( response: AxiosResponse<any, any> ): void =>
{
const data = response.data ?? {};
queryResponse.success = data.success ?? false;
queryResponse.message = data.message ?? "请求完成,但结果未知!";
queryResponse.records = data.records ?? [];
handler( queryResponse, null );
})
.catch(( error: any ): void =>
{
queryResponse.success = false;
queryResponse.message = "查询BI机构续保率失败请查看控制台";
queryResponse.records = [];
console.log( "查询BI机构续保率失败:", error );
handler( queryResponse, error );
});
}
export {
type BIReportType,
type ImportBIReportRequest,
type ImportBIReportResponse,
type ImportBIReportResponseHandler,
type BITelsalerAttachingRateRecord,
type QueryBITelsalerAttachingRateReportResponse,
type QueryBITelsalerAttachingRateDataHandler,
type QueryBITelsalerRenewalRateDataHandler,
type BITelsalerRenewalRateRecord,
type QueryBITelsalerRenewalRateReportResponse,
type BIDepartmentAttachingRateRecord,
type QueryBIDepartmentAttachingRateResponse,
type QueryBIDepartmentAttachingRateDataHandler,
type BIDepartmentRenewalRateRecord,
type QueryBIDepartmentRenewalRateResponse,
type QueryBIDepartmentRenewalRateDataHandler,
importBIReport,
queryBITelsalerAttachingRateData,
queryBITelsalerRenewalData,
queryDepartmentAttachingRateData,
queryDepartmentRenewalRateData
};

View File

@@ -25,7 +25,7 @@ interface LoginInfo
interface LoginCallerInfo
{
telsaler_code: string;
telsaler: string;
}
interface RequestResult

View File

@@ -0,0 +1,12 @@
/*
* @Author: Kane
* @Date: 2023-09-14 00:22:04
* @LastEditors: Kane
* @FilePath: /task_schedule/src/utils/api/eventBus.ts
* @Description: 消息总线。
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
import mitt from "mitt";
export default mitt();

View File

@@ -7,23 +7,41 @@
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
export const API_URL = {
// URL_LOGIN: import.meta.env.VITE_URL_LOGIN,
// URL_LOGIN: "http://222.76.244.118:11101/admin-system/account/p13_account_check",
URL_LOGIN: "http://10.39.0.41:8081/admin-system/account/p13_account_check",
// URL_LOGIN_CALLER: "http://localhost:8080/desktop_archievement_backend/account/query_telsaler_info.do",
// URL_LOGIN_CALLER: "http://222.76.244.118:11101/desktop_archievement_backend/account/query_telsaler_info.do",
URL_LOGIN_CALLER: "http://10.39.0.41:8081/desktop_archievement_backend/account/query_telsaler_info.do",
// URL_DEPARTMENT_ARCHIEVEMENT: import.meta.env.VITE_URL_DEPARTMENT_ARCHIEVEMENT,
// URL_DEPARTMENT_ARCHIEVEMENT: "http://222.76.244.118:11101/desktop_archievement_backend/archievement/query_department_archievement.do",
URL_DEPARTMENT_ARCHIEVEMENT: "http://10.39.0.41:8081/desktop_archievement_backend/archievement/query_department_archievement.do",
// URL_RANKINGLIST: "http://localhost:8080/desktop_archievement_backend/archievement/query_ranking_list.do",
// URL_RANKINGLIST: "http://222.76.244.118:11101/desktop_archievement_backend/archievement/query_ranking_list.do",
URL_RANKINGLIST: "http://10.39.0.41:8081/desktop_archievement_backend/archievement/query_ranking_list.do",
// 请求的url
const API_URL = {
// 登录
URL_LOGIN: import.meta.env.VITE_URL_LOGIN,
URL_LOGIN_CALLER: import.meta.env.VITE_URL_LOGIN_CALLER,
// 机构业绩
URL_DEPARTMENT_ARCHIEVEMENT: import.meta.env.VITE_URL_DEPARTMENT_ARCHIEVEMENT,
// 坐席业绩查询
URL_CALLER_ARCHIEVEMENT: "http://10.39.0.41:8081/desktop_archievement_backend/archievement/query_caller_archievement.do",
URL_CALLER_ARCHIEVEMENT: import.meta.env.VITE_URL_CALLER_ARCHIEVEMENT,
// 排行榜
URL_RANKINGLIST: import.meta.env.VITE_URL_RANKINGLIST,
/** 奖项相关 **/
// 查询奖励项目
URL_RWARD_PROJECTS: import.meta.env.VITE_URL_RWARD_PROJECTS,
// 查询获奖人员
URL_REWARD_GAINERS: import.meta.env.VITE_URL_REWARD_GAINERS,
// 添加获奖人员
URL_ADD_REWARD_TELSALER: import.meta.env.VITE_URL_ADD_REWARD_TELSALER,
// 更新获奖人员
URL_UPDATE_REWARD_TELSALER: import.meta.env.VITE_URL_UPDATE_REWARD_TELSALER,
// 删除获奖人员
URL_DEL_REWARD_TELSALER: import.meta.env.VITE_URL_DEL_REWARD_TELSALER,
// 上传文件
URL_UPLOAD_FILE: import.meta.env.VITE_URL_UPLOAD_FILE,
// 导入报表
URL_IMPORT_REPORT: import.meta.env.VITE_URL_IMPORT_REPORT,
// 请求BI报表数据
URL_BI_TELSALER_ATTACHINGRATE: import.meta.env.VITE_URL_BI_TELSALER_ATTACHINGRATE,
URL_BI_TELSALER_RENEWALRATE: import.meta.env.VITE_URL_BI_TELSALER_RENEWALRATE,
URL_BI_DEPARTMENT_ATTACHINGRATE: import.meta.env.VITE_URL_BI_DEPARTMENT_ATTACHINGRATE,
URL_BI_DEPARTMENT_RENEWALRATE: import.meta.env.VITE_URL_BI_DEPARTMENT_RENEWALRATE,
};
export { API_URL };

View File

@@ -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;
}

View File

@@ -13,7 +13,7 @@ import axios, { type AxiosInstance } from "axios";
const service: AxiosInstance = axios.create(
{
baseURL: "",
timeout: 10000,
timeout: 30000,
}
);

View 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 };

View File

@@ -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[];
@@ -31,6 +33,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;
@@ -49,34 +52,39 @@ interface MenusalArchievementItem // 每月业绩清单的项目
*/
function queryDepartmentArchievement( departmentInfo: Department, render: any ): void
{
// 默认的部门业绩对象
const archievement: DepartmentArchievement = {
success: false,
message: "",
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: [],
};
instance.request({
method: "post",
url: API_URL.URL_DEPARTMENT_ARCHIEVEMENT,
data: departmentInfo,
})
// 请求结束,将请求的结果写入业绩对象,然后调用功能渲染函数。
.then(( response ) =>
{
const archievement: DepartmentArchievement = {
success: false,
message: "",
total_archievement: 0,
mensual_archievement_list: [],
insurance_renewal_rate: "",
attaching_rate: "",
leading_reward_gainers: [],
advance_reward_gainers: [],
backward_list: [],
};
const data = response.data ?? {};
archievement.success = data.success ?? false;
archievement.message = data.message ?? "";
archievement.message = data.message ?? "服务器没有返回调用结果消息,请检查日志!";
archievement.total_archievement = data.total_archievement;
// archievement.mensual_archievement_list = data.mensual_archievement_list ?? [];
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 ?? [];
@@ -85,17 +93,30 @@ 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 );
// 渲染数据
render( archievement );
// 调用渲染函数
if ( render !== undefined )
{
render( archievement );
}
})
// 请求失败,将失败原因写入业绩对象,调用渲染函数
.catch(( error ) =>
{
console.log( error );
archievement.success = false;
archievement.message = String( error );
// 调用渲染函数
if ( render !== undefined )
{
render( archievement );
}
console.log( `queryDepartmentArchievement:查询部门${departmentInfo.departmentCode}业绩失败,原因${error}` );
});
}
@@ -103,7 +124,8 @@ function queryDepartmentArchievement( departmentInfo: Department, render: any ):
* 查询坐席的业绩,并调用渲染函数.
* 1、请求坐席业绩的数据
* 2、对每月业绩清单进行检查如果有缺少则用0代替检查的结果是12个月的清单让调用者自己截断
* 3、将检查后的清单写入到业绩对象中只写金额
* 3、将检查后的清单写入到业绩对象中只写金额
* 4、即使请求失败也将失败的message写入业绩对象调用渲染函数
* @param callerInfo 坐席的信息参数,用于请求业绩;
* @param render 渲染函数用业绩对象CallerArchievement作为参数
*/
@@ -114,6 +136,17 @@ function queryCallerArchievement( callerInfo: TelSaler, render: any ): void
callName: callerInfo.telSalerName,
};
// 默认的业绩对象
const callArchievement: CallerArchievement = {
success: false,
message: "",
total_archievement: 0,
moto_premium_present_month: 0,
mensual_archievement_list: [],
insurance_renewal_rate: "0.0",
attaching_rate: "0.0",
};
// 发送请求
instance.request({
method: "post",
@@ -125,17 +158,18 @@ function queryCallerArchievement( callerInfo: TelSaler, render: any ): void
{
const data = response.data ?? {};
const callArchievement: CallerArchievement = {
success: data.success ?? false,
message: data.message ?? "",
total_archievement: data.total_archievement ?? 0,
mensual_archievement_list: [],
insurance_renewal_rate: data.insurance_renewal_rate ?? "0.0",
attaching_rate: data.attaching_rate ?? "0.0",
};
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";
// 检查业绩清单有没有缺漏缺漏的用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 =>
@@ -159,9 +193,18 @@ function queryCallerArchievement( callerInfo: TelSaler, render: any ): void
console.log( `queryCallerArchievement查询结果${data}` );
})
// 请求失败
// 请求失败将失败的原因保存到message属性调用渲染函数
.catch(( error: any ) =>
{
callArchievement.success = false;
callArchievement.message = String( error );
// 调用渲染函数
if ( render !== undefined )
{
render( callArchievement );
}
console.log( `queryCallerArchievement:查询坐席${callerInfo.telSalerCode}业绩失败,原因${error}` );
});
}

View File

@@ -0,0 +1,20 @@
/*
* @Author: Kane
* @Date: 2023-09-27 14:13:47
* @LastEditors: Kane
* @FilePath: /task_schedule/src/utils/fileUpload.ts
* @Description: 文件上传相关
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
interface FileUploadResponse
{
success: boolean;
message: string;
fileList: string[];
}
export {
type FileUploadResponse
};

View File

@@ -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";
/**
* 用于请求排行榜数据请求参数
@@ -32,6 +32,9 @@ interface RankingListResponse
renewalRateRankingList: RankingListItem[];
}
// 判断用的正则表达式
const regexMonth = "(0[1-9])|(1[0-2])"; // eslint-disable-line
/**
* 请求坐席排行榜。
* @param reqParam 请求参数
@@ -53,6 +56,9 @@ function requestRankingList( reqParam: RankingListRequest, rander: any ): void /
renewalRateRankingList: [],
};
// 检查请求参数
// TODO: 这里要加一个对month的正则表达式验证。
instance.request(
{
method: "post",

View File

@@ -0,0 +1,348 @@
/*
* @Author: Kane
* @Date: 2023-09-11 09:59:00
* @LastEditors: Kane
* @FilePath: /task_schedule/src/utils/reward.ts
* @Description: 奖励相关的API
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
import { type AxiosResponse } from "axios";
import { service as instance } from "./api/request.ts";
import { API_URL } from "./api/config.ts";
interface RewardProject
{
rewardCode: number;
rewardName: string;
}
interface RewardProjectResponse
{
success: boolean;
message: string;
rewardList: RewardProject[] | null;
}
interface RewardGainer
{
recID: number;
callerName: string;
callerCode: string;
rewardProjectCode: string;
rewardProjectName: string;
}
interface RewardGainerResponse
{
success: boolean;
message: string;
gainerList: RewardGainer[] | null;
}
interface AddRewardTelsalerRequest
{
telsalerName: string;
rewardIndex: number;
}
interface AddRewardTelsalerResponse
{
success: boolean;
message: string;
}
interface UpdateRewardTelsalerRequest
{
recordID: number,
telsalerName: string;
rewardIndex: number;
}
interface UpdateRewardTelsalerResponse
{
success: boolean;
message: string;
}
interface DeleteRewardTelsalerRequest
{
recordID: number[];
}
interface DeleteRewardTelsalerResponse
{
success: boolean;
message: string;
}
/**
* 请求奖项清单
* @param handler 用于处理请求数据的回调函数;
*/
function requestRewardPorjectsList( handler: any ): void
{
if ( handler === undefined || handler === null )
{
return;
}
const rewardResponse: RewardProjectResponse = {
success: false,
message: "",
rewardList: [],
};
instance.request({
url: API_URL.URL_RWARD_PROJECTS,
method: "post",
})
// 请求成功,检查服务器返回结果
.then(( response: AxiosResponse<any, any> ): void =>
{
const data = response.data ?? {};
rewardResponse.success = data.success ?? false;
rewardResponse.message = data.message ?? "";
rewardResponse.rewardList = checkRewardProjects( data.rewardList ?? []); // eslint-disable-line
handler( rewardResponse, null );
})
.catch(( error: any ): void =>
{
console.log( error );
rewardResponse.success = false;
handler( rewardResponse, error );
});
}
/**
* 请求获奖人员清单
* @param handler 处理请求结果的回调函数
*/
function requestRewardGainers( handler: any ): void
{
if ( handler === undefined || handler === null )
{
return;
}
const rewardResponse: RewardGainerResponse = {
success: false,
message: "",
gainerList: [],
};
instance.request({
url: API_URL.URL_REWARD_GAINERS,
method: "post",
})
.then(( response: AxiosResponse<any, any> ): void =>
{
const data = response.data ?? {};
rewardResponse.success = data.success;
rewardResponse.message = data.message;
rewardResponse.gainerList = checkRewardGainers( data.gainerList ); // eslint-disable-line
handler( rewardResponse, null );
})
.catch(( error: any ): void =>
{
console.log( error );
rewardResponse.success = false;
handler( rewardResponse, error );
});
}
function addRewardTelsaler( data: AddRewardTelsalerRequest, handler: any ): void
{
if ( handler === undefined || handler === null )
{
return;
}
const addResponse: AddRewardTelsalerResponse = {
success: false,
message: "",
};
console.log( "URL", API_URL.URL_ADD_REWARD_TELSALER );
instance.request({
method: "post",
url: API_URL.URL_ADD_REWARD_TELSALER,
data,
})
.then(( response: AxiosResponse<any, any> ): void =>
{
const data: AddRewardTelsalerResponse = response.data ?? {};
addResponse.success = data.success ?? false;
addResponse.message = data.message ?? "";
handler( addResponse );
})
.catch(( error ): void =>
{
console.log( error );
addResponse.success = false;
addResponse.message = "请求添加获奖坐席失败,请查看控制台!";
handler( addResponse, error );
});
}
/**
* 请求更新获奖坐席根据请求结果调用handler函数。
* @param data 请求数据
* @param handler 处理请求结果数据的回调函数。
*/
function updateTelsalerReward( data: UpdateRewardTelsalerRequest, handler: any ): void
{
if ( handler === undefined || handler === null )
{
return;
}
const updateResponse: UpdateRewardTelsalerResponse = {
success: false,
message: "",
};
instance.request({
method: "post",
url: API_URL.URL_UPDATE_REWARD_TELSALER,
data,
})
.then(( response: AxiosResponse<any, any> ): any =>
{
const data: UpdateRewardTelsalerResponse = response.data ?? {};
updateResponse.success = data.success ?? false;
updateResponse.message = data.message ?? "";
handler( updateResponse );
})
.catch(( error: any ): void =>
{
updateResponse.success = false;
updateResponse.message = "请求更新获奖坐席失败,请查看控制台!";
console.log( error );
handler( updateResponse, error );
});
}
/**
* 请求删除获奖坐席。
* @param data 请求数据
* @param handler 处理请求结果的回调函数
*/
function deleteRewardTelsaler( data: DeleteRewardTelsalerRequest, handler: any ): void
{
if ( handler === undefined || handler === null )
{
return;
}
const deleteResponse: DeleteRewardTelsalerResponse = {
success: false,
message: "",
};
instance.request({
method: "post",
url: API_URL.URL_DEL_REWARD_TELSALER,
data,
})
.then(( response: AxiosResponse<any, any> ): void =>
{
const data: DeleteRewardTelsalerResponse = response.data ?? {};
deleteResponse.success = data.success ?? false;
deleteResponse.message = data.message ?? "";
handler( deleteResponse );
})
.catch(( error: any ): void =>
{
deleteResponse.message = "请求删除获奖坐席失败,请检查日志!";
deleteResponse.success = false;
console.log( error );
handler( deleteResponse, error );
});
}
// **功能函数 **********************************/
function checkRewardProjects( data: any[]): RewardProject[] | null
{
const rewardList: RewardProject[] = [];
// 检查一下参数的类型,如果不是数组返回 null
if ( !( data instanceof Array ))
{
return null;
}
data.forEach(( item: any ) =>
{
const reward = {
rewardCode: item.rewardCode ?? "",
rewardName: item.rewardName ?? "",
};
rewardList.push( reward );
});
return rewardList;
}
function checkRewardGainers( gainers: any[]): RewardGainer[] | null
{
const gainerList: RewardGainer[] = [];
if ( !( gainers instanceof Array ))
{
return null;
}
gainers.forEach(( item: RewardGainer ): void =>
{
const gainer: RewardGainer = {
recID: item.recID ?? "",
callerName: item.callerName ?? "",
callerCode: item.callerCode ?? "",
rewardProjectCode: item.rewardProjectCode ?? "",
rewardProjectName: item.rewardProjectName ?? "",
};
gainerList.push( gainer );
});
return gainerList;
}
export {
type RewardProject,
type RewardGainer,
type RewardProjectResponse,
type RewardGainerResponse,
type DeleteRewardTelsalerRequest,
type DeleteRewardTelsalerResponse,
type AddRewardTelsalerRequest,
type AddRewardTelsalerResponse,
type UpdateRewardTelsalerRequest,
type UpdateRewardTelsalerResponse,
requestRewardPorjectsList,
requestRewardGainers,
addRewardTelsaler,
updateTelsalerReward,
deleteRewardTelsaler
};

View File

@@ -1,26 +0,0 @@
<!--
* @Author: Kane
* @Date: 2023-03-23 16:05:08
* @LastEditors: Kane
* @FilePath: /task_schedule/src/views/DataManagemant.vue
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
-->
<template>
<div>
数据管理
</div>
</template>
<script lang="ts">
export default {
name: "DataManagement",
setup()
{
return {};
},
};
</script>
<style lang="scss" scoped>
</style>

View File

@@ -26,7 +26,7 @@ export default {
{
height: 2000px;
width: 2000px;
background-color: aquamarine;
// background-color: aquamarine;
padding: 0px;
}
</style>

View File

@@ -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">
@@ -48,35 +50,22 @@
</div>
</div>
<div class="right-wrapper">
<h1>本大爷</h1>
<div class="carousel-item">
<el-carousel
arrow="never"
indicator-position="none"
:interval="4000"
>
<el-carousel-item :key="1">
<RankingListComponent :ranking-list="ui.attachingRankingList" />
</el-carousel-item>
<el-carousel-item :key="2">
<RankingListComponent :ranking-list="ui.renewalRankingList" />
</el-carousel-item>
</el-carousel>
</div>
<div class="carousel-item">
<el-carousel
arrow="never"
indicator-position="none"
:interval="4000"
>
<el-carousel-item :key="1">
<RankingListComponent :ranking-list="ui.attachingRankingList" />
</el-carousel-item>
<el-carousel-item :key="2">
<RankingListComponent :ranking-list="ui.renewalRankingList" />
</el-carousel-item>
</el-carousel>
</div>
<CallerArchievementComponent
:caller-name="callerInfo.telSalerName"
:this-month-premium="ui.callerPersentMonthPremium"
:attaching-rate="ui.callerAttachingRate"
:renewal-rate="ui.callerRenewalRate"
/>
<RankingListComponent
title="渗透率"
:ranking-list="ui.attachingRankingList"
/>
<RankingListComponent
title="续保率"
:ranking-list="ui.renewalRankingList"
/>
</div>
</div>
</template>
@@ -89,10 +78,11 @@ import { ElMessage } from "element-plus";
import
{
type DepartmentArchievement,
type CallerArchievement,
queryDepartmentArchievement,
queryCallerArchievement
} from "@/utils/archievement.js";
import { RankingListItem } from "@/types/cpicxim/RankingListItem.js";
import { type RankingListItem } from "@/types/cpicxim/RankingListItem.js";
import
{
type RankingListRequest,
@@ -105,6 +95,7 @@ import ArchievementCompleteRateComponent from "@/components/ArchievementComplete
import HonorListComponent from "@/components/HonorListComponent.vue";
import DishonorListComponent from "@/components/DishonorListComponent.vue";
import RankingListComponent from "@/components/RankingListComponent.vue";
import CallerArchievementComponent from "@/components/CallerArchievementComponent.vue";
import { logout } from "@/utils/account.js";
import { type TelSaler } from "@/types/cpicxim/TelSaler";
@@ -114,13 +105,18 @@ 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[];
showUI: boolean; // 用来刷新页面的开关
attachingRankingList: RankingListItem[]; // 坐席车非渗透率榜单
renewalRankingList: RankingListItem[];
callerAttachingRate: string;
callerRenewalRate: string;
callerPersentMonthPremium: number;
}
export default {
@@ -131,10 +127,15 @@ export default {
HonorListComponent,
DishonorListComponent,
RankingListComponent,
CallerArchievementComponent,
},
setup()
{
const monthIndex = new Date();
const thisMonth: number = monthIndex.getMonth(); // getMonth返回值从0开始。
const thisMonthString = thisMonth > 10 ? String( thisMonth ) : "0" + String( thisMonth );
const thisYear: number = monthIndex.getFullYear();
const thisYearString: string = String( thisYear );
const numInChinese = [
"一",
"二",
@@ -156,17 +157,22 @@ 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: ["",],
showUI: true, // 用来刷新页面的开关
attachingRankingList: [], // 坐席车非渗透率榜单
renewalRankingList: [], // 坐席续保率榜单
callerAttachingRate: "0.0",
callerRenewalRate: "0.0",
callerPersentMonthPremium: 0,
});
let timerHandler = 0;
const getTotalArchievement = computed(() =>
const getTotalArchievement = computed((): string =>
{
const cnyFormat = new Intl.NumberFormat( "zh-cn", {
style: "currency",
@@ -178,15 +184,32 @@ export default {
return archievement;
});
// 保存业绩数据
const applyDepartmentArchievementData = ( data: DepartmentArchievement ) =>
/**
* 将请求函数获取的部门业绩数据,渲染到页面上。
* @param data DepartmentArchievementl类型的部门业绩数据对象
*/
const applyDepartmentArchievementData = ( data: DepartmentArchievement ): void =>
{
console.log( "部门业绩数据", data );
// console.log( "部门业绩数据", data );
ui.chartData = data.mensual_archievement_list;
ui.totalArchievement = data.total_archievement;
// 检查请求是否成功
if ( !data.success )
{
// 失败就提示消息,然后退出
ElMessage({
message: data.message,
type: "error",
});
return;
}
// 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;
@@ -201,6 +224,40 @@ export default {
}, 0 );
};
/**
* 将请求的坐席业绩数据渲染到页面
* @param data
*/
const applyCallerArchievementData = ( data: CallerArchievement ): void =>
{
// 检查请求是否成功
if ( !data.success )
{
// 失败就提示消息,然后退出
ElMessage({
message: data.message,
type: "error",
});
return;
}
ui.chartData = data.mensual_archievement_list.slice( 0, thisMonth );
ui.totalArchievement = data.total_archievement;
ui.callerAttachingRate = data.attaching_rate;
ui.callerRenewalRate = data.insurance_renewal_rate;
ui.callerPersentMonthPremium = data.moto_premium_present_month;
// ui.callerPersentMonthPremium = data.mensual_archievement_list[thisMonth];
console.log( "业绩清单", data );
ui.showUI = false;
setTimeout(() =>
{
ui.showUI = true;
}, 0 );
};
const applyRankingListData = ( data: RankingListResponse ): void =>
{
ui.attachingRankingList = data.attachingRateRankingList;
@@ -219,7 +276,7 @@ export default {
};
// 退出桌面霸屏
const logoutDesktopArchievement = () =>
const logoutDesktopArchievement = (): void =>
{
console.log( "111" );
logout();
@@ -236,13 +293,13 @@ export default {
center: true,
});
router.push( "/login" );
router.push( "/login" ).then(() => {}).catch(() => {});
}
/**
* 刷新页面
* 用于定时对页面进行刷新,其中会请求最新的业绩数据。
*/
const refresh = () =>
const refresh = (): void =>
{
const deparmentInfo: Department = {
departmentCode: callerInfo.departmentCode,
@@ -251,11 +308,14 @@ export default {
const rankinglistRequest: RankingListRequest = {
departmentCode: callerInfo.departmentCode,
year: "2023",
month: "06",
year: thisYearString,
month: thisMonthString,
};
console.log( "refresh", rankinglistRequest );
queryDepartmentArchievement( deparmentInfo, applyDepartmentArchievementData );
queryCallerArchievement( callerInfo, applyCallerArchievementData );
requestRankingList( rankinglistRequest, applyRankingListData );
};
@@ -279,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,
@@ -287,6 +393,8 @@ export default {
renderData: applyDepartmentArchievementData,
refresh,
logoutDesktopArchievement,
attachingRateWarningLevel,
renewalRateWarningLevel,
};
},
};
@@ -332,7 +440,7 @@ export default {
size: 90px;
}
color: $color-bg-04;
color: $color-title-font;
text-shadow: #feebb1 0px 0px,
#feebb1 5px 0px,
#feebb1 -5px -0px,
@@ -434,11 +542,19 @@ export default {
width: 300px;
}
>div {
.carousel-item {
// 为了限制走马灯组件的高度
display: block;
height: 260px;
width: 300px;
}
// >div {
// // 为了限制走马灯组件的高度
// display: block;
// height: 260px;
// width: 300px;
// }
}
</style>
<style lang="scss">

View File

@@ -71,7 +71,7 @@ import { saveStaffInfo, getUserType, saveUserType, getCallerInfo, saveCallerInfo
import { login, loginCaller, type LoginCallerInfo, type LoginCallerResult } from "@/utils/account";
import { ElMessage } from "element-plus";
import { StaffInfo } from "@/types/cpicxim/StaffInfo";
import { TelSaler } from "@/types/cpicxim/TelSaler";
import { type TelSaler } from "@/types/cpicxim/TelSaler";
export default {
name: "LoginPage",
@@ -95,7 +95,7 @@ export default {
/**
* 保存p13账号
*/
const savedP13uid = () =>
const savedP13uid = (): void =>
{
window.localStorage.setItem( "stuff_account", ui.account );
};
@@ -103,7 +103,7 @@ export default {
/**
* 登录函数根据ui.currentMenu判断登录的是坐席还是员工。
*/
const onLogin = () =>
const onLogin = (): void =>
{
// 保存用户类型
saveUserType( ui.currentMenu );
@@ -145,7 +145,7 @@ export default {
saveStaffInfo( staffInfo );
// 跳转路由
router.push( "/desktop" );
router.push( "/desktop" ).then(() => {}).catch(() => {});
}
else
{
@@ -169,7 +169,7 @@ export default {
{
// 是坐席
const loginInfo: LoginCallerInfo = {
telsaler_code: ui.account,
telsaler: ui.account,
};
// 登录
@@ -177,12 +177,12 @@ export default {
// 调用接口成功
.then(( response ) =>
{
const data:LoginCallerResult = response.data ?? { success: false, };
const data: LoginCallerResult = response.data ?? { success: false, };
// debugger;
// 查看標志位
if ( data.success === true )
if ( data.success )
{
// 查询成功,显示一个提示,保存工号,并跳转路由
ElMessage({
@@ -190,7 +190,7 @@ export default {
type: "success",
});
const telsaler:TelSaler = {
const telsaler: TelSaler = {
telSalerCode: data.tel_saler_code,
telSalerName: data.tel_saler_name,
teamCode: data.team_code,
@@ -201,7 +201,7 @@ export default {
saveCallerInfo( telsaler );
router.push( "/desktop_archievement" );
router.push( "/desktop_archievement" ).then(() => {}).catch(() => {});
}
else
{
@@ -249,7 +249,7 @@ export default {
});
// 跳转路由
router.push( "/desktop_archievement" );
router.push( "/desktop_archievement" ).then(() => {}).catch(() => {});
}
}
else if ( staffType === "cpicxim_staff" )
@@ -258,7 +258,7 @@ export default {
}
});
const onToggleMenu = ( type: string ) =>
const onToggleMenu = ( type: string ): void =>
{
ui.currentMenu = type;
};

View File

@@ -0,0 +1,393 @@
<!--
* @Author: Kane
* @Date: 2023-03-23 16:05:08
* @LastEditors: Kane
* @FilePath: /task_schedule/src/views/RewardManagement.vue
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
-->
<template>
<div
v-if="ui.showUI"
class="wrapper"
>
<div class="reward-wrapper">
<div class="reward-gainer-wrapper">
<el-divider content-position="left">
90俱乐部 & 消7灭6包围战
</el-divider>
<div class="toolbutton-wrapper">
<el-button
type="primary"
icon="documentAdd"
@click="onAddRewardGainer"
>
新增
</el-button>
<el-button
type="danger"
icon="delete"
@click="onDeleteRewardGainer"
>
删除
</el-button>
<el-button
type="warning"
icon="Refresh"
@click="refresh"
>
刷新
</el-button>
</div>
<el-table
ref="rewardTelsalerTable"
border
stripe
style="width:100%;"
:data="rewardGainerData"
>
<el-table-column type="selection" />
<el-table-column
label="坐席名称"
align="center"
>
<template #default="rewardGainer">
<span
class="reward-gainer-td"
@dblclick="onEditRewardGainer(rewardGainer.row.recID, rewardGainer.row.callerName, rewardGainer.row.rewardProjectCode)"
>{{ rewardGainer.row.callerName }}</span>
</template>
</el-table-column>
<el-table-column
label="奖项名称"
align="center"
>
<template #default="rewardGainer">
<span
class="reward-gainer-td"
@dblclick="onEditRewardGainer( rewardGainer.row.recID, rewardGainer.row.callerName, rewardGainer.row.rewardProjectCode)"
>{{ rewardGainer.row.rewardProjectName }}</span>
</template>
</el-table-column>
</el-table>
<div class="pagination-wrapper">
<el-pagination
v-model="ui.tablePageIndex"
class="pull_left"
size="small"
background
:page-size="ui.tablePageSize"
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
:total="(ui.rewardGainerList ?? []).length"
@current-change="onCurrentPageIndexChange"
@size-change="onTablePageSizeChange"
/>
</div>
</div>
</div>
<div
v-if="ui.showEditRewardGainerDialog"
class="dialog-wrapper"
>
<el-dialog
v-model="ui.showEditRewardGainerDialog"
title="编辑获奖人员"
width="400px"
>
<RewardGainerDialog
:selected-rec-id="(ui.selectedRecID ?? -9999)"
:selected-reward-project-code="ui.selectedRewardProjectCode"
:selected-telsaler-name="ui.selectedTelsalerName"
/>
</el-dialog>
</div>
</div>
</template>
<script lang="ts">
import { reactive, computed, onBeforeMount, ref } from "vue";
import { type RewardGainer, type RewardGainerResponse, requestRewardGainers, type DeleteRewardTelsalerResponse, deleteRewardTelsaler, type DeleteRewardTelsalerRequest } from "@/utils/reward.js";
import eventBus from "@/utils/api/EventBus.js";
import { ElMessage, ElMessageBox, type ElTable } from "element-plus";
import RewardGainerDialog from "@/views/reward/RewardTelsaler.vue";
interface UI
{
showUI: boolean;
showEditRewardGainerDialog: boolean;
rewardGainerList: RewardGainer[] | null;
tablePageIndex: number;
tablePageSize: number;
selectedRecID: number | null;
selectedTelsalerName: string;
selectedRewardProjectCode: number;
}
export default {
name: "RewardManagement",
components: { RewardGainerDialog, },
setup()
{
const ui: UI = reactive({
showUI: true,
showEditRewardGainerDialog: false,
rewardGainerList: null,
tablePageIndex: 1,
tablePageSize: 10,
selectedRecID: null,
selectedTelsalerName: "",
selectedRewardProjectCode: -999,
});
const rewardTelsalerTable = ref<InstanceType<typeof ElTable>>();
/** 请求数据相关 ***************************/
const requestRewardTelsalerListHandler = ( response: RewardGainerResponse, error: any ): void =>
{
if ( !response.success )
{
console.log( error );
ElMessageBox({
message: "请求获奖人列表失败,请查看日志!",
type: "error",
center: true,
})
.then((): void => {})
.catch((): void => {});
return;
}
ui.rewardGainerList = response.gainerList;
console.log( "请求获奖人员列表", ui.rewardGainerList );
refreshUI();
};
/** 表格相关 ***************************/
const tableHeight = computed((): number =>
{
return ( ui.tablePageSize + 1 ) * 40;
});
/**
* 用于根据分页组件的参数,生成表格用的数据。
*/
const rewardGainerData = computed((): RewardGainer[] =>
{
// 防御性验证
if ( ui.rewardGainerList === null )
{
return [];
}
const startIndex = ui.tablePageSize * ( ui.tablePageIndex - 1 );
const endIndex = startIndex + ui.tablePageSize;
const data = ui.rewardGainerList.slice( startIndex, endIndex );
console.log( ui.tablePageSize, ui.tablePageIndex );
console.log( "表格数据:", data );
return data;
});
const onCurrentPageIndexChange = ( pageIndex: number ): void =>
{
ui.tablePageIndex = pageIndex;
};
const onTablePageSizeChange = ( pageSize: number ): void =>
{
ui.tablePageSize = pageSize;
};
/** 功能按钮相关 *******************************/
/**
* 添加获奖坐席
*/
const onAddRewardGainer = (): void =>
{
ui.selectedRecID = -1;
ui.selectedRewardProjectCode = 3;
ui.selectedTelsalerName = "";
ui.showEditRewardGainerDialog = true;
};
/**
* 响应用户在表格中的双击
* @param telsalerName
* @param rewardProjectName
*/
const onEditRewardGainer = ( recID: number, telsalerName: string, rewardProjectCode: number ): void =>
{
console.log( "编辑获奖清单", recID, telsalerName, rewardProjectCode );
ui.selectedRecID = recID;
ui.selectedTelsalerName = telsalerName;
ui.selectedRewardProjectCode = rewardProjectCode;
ui.showEditRewardGainerDialog = true;
};
/**
* 响应点击删除按钮
*/
const onDeleteRewardGainer = (): void =>
{
const selectedRecord: RewardGainer[] = rewardTelsalerTable.value?.getSelectionRows();
const deleteRequest: DeleteRewardTelsalerRequest = {
recordID: [],
};
if ( selectedRecord !== undefined )
{
selectedRecord.forEach(( item: RewardGainer ): void =>
{
deleteRequest.recordID.push( item.recID );
});
}
deleteRewardTelsaler( deleteRequest, deleteTelsalerRewardHandler );
};
/** 回调函数 ************************/
const deleteTelsalerRewardHandler = ( response: DeleteRewardTelsalerResponse, error: any ): void =>
{
if ( response.success )
{
ElMessage({
message: response.message,
type: "success",
});
}
else
{
ElMessageBox({
message: response.message,
type: "error",
})
.then(() => {})
.catch(() => {});
}
refresh();
};
/** 事件相关 ***************/
/** 订阅新增和保存修改获奖者事件 */
eventBus.on( "onSavedRewardTelsaler", (): void =>
{
// 关闭对话框后,重新请求获奖清单,刷新页面。
ui.showEditRewardGainerDialog = false;
refresh();
});
/**
* 用于刷新页面
*/
const refresh = (): void =>
{
requestRewardGainers( requestRewardTelsalerListHandler );
};
const refreshUI = (): void =>
{
ui.showUI = false;
setTimeout(() =>
{
ui.showUI = true;
}, 0 );
};
onBeforeMount((): void =>
{
refresh();
});
return {
ui,
tableHeight,
rewardGainerData,
rewardTelsalerTable,
onCurrentPageIndexChange,
onTablePageSizeChange,
onEditRewardGainer,
refresh,
onAddRewardGainer,
onDeleteRewardGainer,
};
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/css/public/_public.scss";
.wrapper {
margin: 10px;
// padding: 10px;
// background-color: #fff;
// border-radius: 5px;
// box-shadow: $box-shadow;
// &:hover {
// box-shadow: $box-shadow-hover;
// }
min-width: 800px;
>*+* {
margin-top: 10px;
}
}
.reward-wrapper {
display: flex;
justify-content: center;
align-items: center;
>div {
background-color: #fff;
border-radius: 5px;
box-shadow: $box-shadow;
padding: 10px;
&:hover {
box-shadow: $box-shadow-hover;
}
}
>*+* {
margin-left: 10px;
}
}
.reward-gainer-wrapper {
flex-grow: 1;
}
.dishonor-wrapper {
flex-grow: 1;
}
.toolbutton-wrapper {
text-align: left;
margin-bottom: 10px;
>*+* {
margin-left: 15px;
}
}
.pagination-wrapper {
margin-top: 10px;
display: flex;
justify-content: flex-end;
}
.reward-gainer-td {
cursor: pointer;
display: block;
}
</style>

View File

@@ -0,0 +1,98 @@
<!--
* @Author: Kane
* @Date: 2023-09-25 09:48:25
* @LastEditors: Kane
* @FilePath: /task_schedule/src/views/data/DataManagement.vue
* @Description: 数据管理view
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
-->
<template>
<div class="data_management_wrapper">
<el-tabs>
<el-tab-pane label="坐席车非渗透率">
<TelsalerAttachingRateView />
</el-tab-pane>
<el-tab-pane label="坐席续保率">
<TelsalerRenewalRateView />
</el-tab-pane>
<el-tab-pane label="机构渗透率">
<DepartmentAttachingRateView />
</el-tab-pane>
<el-tab-pane label="机构续保率">
<DepartmentRenewalRateView />
</el-tab-pane>
</el-tabs>
</div>
</template>
<script lang="ts">
import { ref, reactive } from "vue";
import { ElMessage, ElMessageBox, type UploadFile, type UploadFiles, type UploadProps, type UploadUserFile } from "element-plus";
import TelsalerAttachingRateView from "@/views/data/bi/TelsalerAttachingRateView.vue";
import TelsalerRenewalRateView from "@/views/data/bi/TelsalerRenewalRateView.vue";
import DepartmentRenewalRateView from "@/views/data/bi/DepartmentRenewalRateView.vue";
import DepartmentAttachingRateView from "@/views/data/bi/DepartmentAttachingRateView.vue";
export default {
name: "DataManagement",
components: { TelsalerAttachingRateView, TelsalerRenewalRateView, DepartmentRenewalRateView, DepartmentAttachingRateView, },
setup()
{
const ui = reactive({
showUI: false,
fileList: ref<UploadUserFile[]>([]),
uploadData: {
"task-name": "1234",
},
});
const handleRemove: UploadProps["onRemove"] = ( file, uploadFile ) =>
{
console.log( file, uploadFile );
};
const handlePreview: UploadProps["onPreview"] = ( uploadFile ) =>
{
console.log( uploadFile );
};
const handleExceed: UploadProps["onExceed"] = ( files, uploadFiles ) =>
{
ElMessage.warning( "一次只能上传三个文件!" );
};
const beforeRemove: UploadProps["beforeRemove"] = async ( uploadFile, uploadFiles ) =>
{
return await ElMessageBox.confirm(
`放弃上传${uploadFile.name}`
)
.then(() => true, () => false );
};
const handleUploadSuccess = ( response: any, uploadFile: UploadFile, uploadFiles: UploadFiles ): void =>
{
console.log( response );
};
return {
ui,
handleRemove,
handlePreview,
handleExceed,
beforeRemove,
handleUploadSuccess,
};
},
};
</script>
<style lang="scss">
.data_management_wrapper {
margin: 10px;
min-width: 800px;
>*+* {
margin-top: 10px;
}
}
</style>

View File

@@ -0,0 +1,250 @@
<!--
* @Author: Kane
* @Date: 2023-10-17 10:56:43
* @LastEditors: Kane
* @FilePath: /task_schedule/src/views/data/DataUploadView.vue
* @Description: 上传文件用的组件
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
-->
<template>
<div class="bi-dataupload-wrapper">
<div class="query-box-wrapper">
<el-row :gutter="10">
<el-col :span="4">
<span>报表类型</span>
</el-col>
<el-col :span="9">
<el-select v-model="ui.selectedReportType">
<el-option
v-for="item in ui.reportType"
:key="item.reportTypeCode"
:label="item.reportTypeName"
:value="item.reportTypeCode"
width="100%"
/>
</el-select>
</el-col>
<el-col :span="4">
<span>sheet编号</span>
</el-col>
<el-col :span="6">
<el-input v-model.lazy.number="ui.sheetIndex" />
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="4">
<span>起始行</span>
</el-col>
<el-col :span="9">
<el-input v-model.lazy.number="ui.firstRow" />
</el-col>
<el-col :span="11">
<span style="text-align:left;color:red;">*从0开始计数</span>
</el-col>
</el-row>
</div>
<el-upload
drag
:action="ui.urlFileUpload"
name="files"
:show-file-list="false"
:data="ui.uploadParameters"
:on-success="onUploadSuccess"
>
<el-icon class="el-icon--upload">
<upload-filled />
</el-icon>
<div class="el-upload__text">
将文件拖到此处<em>点击上传</em>
</div>
</el-upload>
</div>
</template>
<script lang="ts">
import { reactive, onBeforeMount } from "vue";
import {
type BIReportType,
type ImportBIReportRequest,
type ImportBIReportResponse,
type ImportBIReportResponseHandler,
importBIReport
} from "@/utils/BIReport.js";
import { API_URL } from "@/utils/api/config.js";
import { type FileUploadResponse } from "@/utils/fileUpload.js";
// import { UploadFilled } from "@element-plus/icons-vue";
import { type UploadProps, type UploadFile, type UploadFiles, ElMessage, ElMessageBox } from "element-plus";
interface UI
{
showUI: boolean,
selectedReportType: number,
reportType: BIReportType[],
sheetIndex: number,
firstRow: number,
hasCaption: boolean,
uploadParameters: any,
showFileList: boolean,
urlFileUpload: string,
}
export default {
name: "BiDataUploadView",
props: {
reportType: {
type: Number,
require: true,
default: (): number => 0,
},
},
setup( props )
{
const ui: UI = reactive({
showUI: false,
selectedReportType: 0,
reportType: [
{
reportTypeCode: 1,
reportTypeName: "坐席车非渗透率",
},
{
reportTypeCode: 2,
reportTypeName: "坐席续保率",
},
{
reportTypeCode: 3,
reportTypeName: "部门车非渗透率",
},
{
reportTypeCode: 4,
reportTypeName: "当月个车续保率跟踪报表【机构】",
},
{
reportTypeCode: 10,
reportTypeName: "TWr坐席清单",
},],
sheetIndex: 0,
firstRow: 1,
hasCaption: true,
uploadParameters: {
"task-name": "1234",
},
showFileList: false,
urlFileUpload: API_URL.URL_UPLOAD_FILE,
});
/**
* 文件上传成功响应函数
* @param response 响应结果参数
* @param uploadFile
* @param uploadFiles
*/
const onUploadSuccess: UploadProps["onSuccess"] = ( response: FileUploadResponse, uploadFile: UploadFile, uploadFiles: UploadFiles ): void =>
{
// 先判断成功标志位
if ( response.success )
{
// 成功,发出导入报表请求
if ( response.fileList.length === 0 )
{
// 上传文件路径有问题,提示一下
ElMessageBox.confirm(
"上传文件的保存路径有误,请联系开发人员。",
"上传文件错误",
{
confirmButtonText: "确定",
type: "warning",
center: true,
}
)
.then((): void => {})
.catch((): void => {});
}
const request: ImportBIReportRequest = {
filePath: response.fileList[0],
reportType: ui.selectedReportType,
firstRow: ui.firstRow,
sheetIndex: ui.sheetIndex,
};
console.log( "请求参数", request );
// 发出请求
importBIReport( request, importResponseHandler );
}
else
{
// 失败了,提示一下
ElMessageBox.confirm(
response.message,
"上传文件错误",
{
confirmButtonText: "确定",
type: "warning",
center: true,
}
)
.then((): void => {})
.catch((): void => {});
}
};
/**
* handler函数
* @param response
* @param error
*/
const importResponseHandler: ImportBIReportResponseHandler = ( response: ImportBIReportResponse, error?: any ): void =>
{
if ( response.success )
{
ElMessage({
type: "success",
message: response.message,
});
}
else
{
ElMessageBox.confirm(
response.message,
"导入错误",
{
confirmButtonText: "确定",
type: "warning",
center: true,
}
)
.then((): void => {})
.catch((): void => {});
console.log( error );
}
};
onBeforeMount((): void =>
{
ui.selectedReportType = props.reportType;
});
return {
ui,
onUploadSuccess,
};
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/css/public/_public.scss";
.bi-dataupload-wrapper {
// max-width: 600px;
width: 100%;
>*+* {
margin-top: 10px;
}
}
.query-box-wrapper {
@include query-box-wrap;
}
</style>

View File

@@ -0,0 +1,226 @@
<!--
* @Author: Kane
* @Date: 2023-10-17 14:53:17
* @LastEditors: Kane
* @FilePath: /task_schedule/src/views/data/bi/DepartmentAttachingRateView.vue
* @Description:
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
-->
<template>
<div class="wrapper">
<el-row :gutter="10">
<el-col span="24">
<el-button
type="warning"
icon="upload"
@click="showUploadFileDialog"
>
上传
</el-button>
<el-button
type="primary"
icon="refresh"
@click="refresh"
>
刷新
</el-button>
</el-col>
</el-row>
<el-table
width="100%"
stripe
border
:data="tableData"
>
<el-table-column
label="部门"
align="center"
>
<template #default="department">
<span>{{ department.row.departmentName }}</span>
</template>
</el-table-column>
<el-table-column
label="车险保费(万)"
align="center"
>
<template #default="department">
<span>{{ department.row.motoPremium.toFixed(2) }}</span>
</template>
</el-table-column>
<el-table-column
label="非车险保费(万)"
align="center"
>
<template #default="department">
<span>{{ department.row.nomotoPremium.toFixed(2) }}</span>
</template>
</el-table-column>
<el-table-column
label="渗透率"
align="center"
>
<template #default="department">
<span>{{ department.row.attachingRate.toFixed(2) + "%" }}</span>
</template>
</el-table-column>
</el-table>
<div class="pagination_wrapper">
<el-pagination
v-model="ui.tableCurrentPageIndex"
class="pull_left"
size="small"
background
:page-size="ui.tablePageSize"
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
:total="0"
@current-change="onCurrentPageIndexChange"
@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="3" />
</el-dialog>
</div>
</div>
</template>
<script lang="ts">
import { reactive, computed, onBeforeMount } from "vue";
import {
type BIDepartmentAttachingRateRecord,
type QueryBIDepartmentAttachingRateResponse,
type QueryBIDepartmentAttachingRateDataHandler,
queryDepartmentAttachingRateData
} from "@/utils/BIReport.js";
import { ElMessage, ElMessageBox } from "element-plus";
import DataUploadView from "@/views/data/DataUploadView.vue";
interface UI
{
showUI: boolean,
showUploadDialog: boolean,
tablePageSize: number,
tableCurrentPageIndex: number,
BIDepartmentAttachingRateData: BIDepartmentAttachingRateRecord[],
}
export default {
name: "DepartmentAttachingRateView",
components: { DataUploadView, },
setup()
{
const ui: UI = reactive({
showUI: true,
showUploadDialog: false,
tablePageSize: 10,
tableCurrentPageIndex: 1,
BIDepartmentAttachingRateData: [],
});
const tableData = computed((): BIDepartmentAttachingRateRecord[] =>
{
const tableCount = ui.BIDepartmentAttachingRateData.length;
const startIndex = ui.tablePageSize * ( ui.tableCurrentPageIndex - 1 ) > tableCount ? tableCount - ui.tablePageSize : ui.tablePageSize * ( ui.tableCurrentPageIndex - 1 );
const endIndex = ui.tablePageSize * ui.tableCurrentPageIndex;
return ui.BIDepartmentAttachingRateData.slice( startIndex, endIndex );
});
const onCurrentPageIndexChange = ( pageIndex: number ): void =>
{
ui.tableCurrentPageIndex = pageIndex;
};
const onTablePageSizeChange = ( pageSize: number ): void =>
{
ui.tablePageSize = pageSize;
};
const handler: QueryBIDepartmentAttachingRateDataHandler = ( response: QueryBIDepartmentAttachingRateResponse, error: any ): void =>
{
// 判断一下标志位
if ( response.success )
{
// 请求成功
ElMessage({
message: "更新成功",
type: "success",
});
ui.BIDepartmentAttachingRateData = response.records;
}
else
{
// 请求失败
ElMessageBox.confirm(
response.message,
"请求机构渗透率数据失败",
{
confirmButtonText: "确定",
type: "warning",
center: true,
}
)
.then((): void => {})
.catch((): void => {});
if ( error !== null )
{
console.log( "请求机构渗透率数据失败", error );
}
}
};
const refresh = (): void =>
{
queryDepartmentAttachingRateData( handler );
};
const showUploadFileDialog = (): void =>
{
ui.showUploadDialog = true;
};
onBeforeMount((): void =>
{
refresh();
});
return {
ui,
tableData,
onCurrentPageIndexChange,
onTablePageSizeChange,
showUploadFileDialog,
handler,
refresh,
};
},
};
</script>
<style lang="scss" scoped>
.wrapper {
margin: 0px 10px 10px 10px;
>*+* {
margin-top: 10px;
}
}
.pagination_wrapper {
display: flex;
justify-content: flex-end;
}
</style>

View File

@@ -0,0 +1,243 @@
<!--
* @Author: Kane
* @Date: 2023-11-10 17:48:01
* @LastEditors: Kane
* @FilePath: /task_schedule/src/views/data/bi/DepartmentRenewalRateView.vue
* @Description:
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
-->
<template>
<div class="wrapper">
<el-row :gutter="10">
<el-col :span="24">
<el-button
type="warning"
icon="upload"
@click="showUploadFileDialog"
>
上传
</el-button>
<el-button
type="primary"
icon="refresh"
@click="refresh"
>
刷新
</el-button>
</el-col>
</el-row>
<el-table
:data="tableData"
style="width:100%;"
border
stripe
>
<el-table-column
label="部门"
align="center"
width="250px"
>
<template #default="dept">
<span>{{ dept.row.责任部门 }}</span>
</template>
</el-table-column>
<el-table-column
label="机构目标值"
align="center"
>
<template #default="dept">
<span>{{ dept.row.机构目标值.toFixed(2) + "%" }}</span>
</template>
</el-table-column>
<el-table-column
label="到期数全月"
align="center"
>
<template #default="dept">
<span>{{ dept.row.到期数全月 }}</span>
</template>
</el-table-column>
<el-table-column
label="序时到期数占比"
align="center"
>
<template #default="dept">
<span>{{ dept.row.序时到期数占比.toFixed(2) + "%" }}</span>
</template>
</el-table-column>
<el-table-column
label="个车续保率序时"
align="center"
>
<template #default="dept">
<span>{{ dept.row.个车续保率序时.toFixed(2) + "%" }}</span>
</template>
</el-table-column>
<el-table-column
label="个车续保率全月"
align="center"
>
<template #default="dept">
<span>{{ dept.row.个车续保率全月.toFixed(2) + "%" }}</span>
</template>
</el-table-column>
</el-table>
<div class="pagination-wrapper">
<el-pagination
v-model="ui.tableCurrentPageIndex"
class="pull_left"
size="small"
background
:page-size="ui.tablePageSize"
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
:total="0"
@current-change="onCurrentPageIndexChange"
@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="4" />
</el-dialog>
</div>
</div>
</template>
<script lang="ts">
import { reactive, computed, onBeforeMount } from "vue";
import {
type BIDepartmentRenewalRateRecord,
type QueryBIDepartmentRenewalRateResponse,
type QueryBIDepartmentRenewalRateDataHandler,
queryDepartmentRenewalRateData
} from "@/utils/BIReport.js";
import { ElMessageBox, ElMessage } from "element-plus";
import DataUploadView from "@/views/data/DataUploadView.vue";
interface UI
{
showUI: boolean;
showUploadDialog: boolean;
tablePageSize: number;
tableCurrentPageIndex: number;
BIDepartmentRenewalRateData: BIDepartmentRenewalRateRecord[];
}
export default {
name: "DepartmentRenewalRateView",
components: { DataUploadView, },
setup()
{
const ui: UI = reactive({
showUI: true,
showUploadDialog: false,
tablePageSize: 10,
tableCurrentPageIndex: 1,
BIDepartmentRenewalRateData: [],
});
// on
const onCurrentPageIndexChange = ( pageIndex: number ): void =>
{
ui.tableCurrentPageIndex = pageIndex;
};
const onTablePageSizeChange = ( pageSize: number ): void =>
{
ui.tablePageSize = pageSize;
};
// 计算变量
const tableData = computed((): BIDepartmentRenewalRateRecord[] =>
{
const tableCount = ui.BIDepartmentRenewalRateData.length;
const startIndex = ui.tablePageSize * ( ui.tableCurrentPageIndex - 1 ) < tableCount ? ui.tablePageSize * ( ui.tableCurrentPageIndex - 1 ) : ( tableCount - ui.tablePageSize );
const endIndex = ui.tablePageSize * ui.tableCurrentPageIndex < tableCount ? ui.tablePageSize * ui.tableCurrentPageIndex : tableCount;
return ui.BIDepartmentRenewalRateData.slice( startIndex, endIndex );
});
// handler
const handler: QueryBIDepartmentRenewalRateDataHandler = ( response: QueryBIDepartmentRenewalRateResponse, error: any ): void =>
{
if ( response.success )
{
ui.BIDepartmentRenewalRateData = response.records;
ElMessage({
message: "更新完成",
type: "success",
});
}
else
{
ElMessageBox.confirm(
response.message,
"请求BI机构续保率数据失败",
{
confirmButtonText: "确定",
type: "warning",
center: true,
}
)
.then((): void => {})
.catch((): void => {});
if ( error !== null )
{
console.log( error );
}
}
};
const showUploadFileDialog = (): void =>
{
ui.showUploadDialog = true;
};
onBeforeMount((): void =>
{
refresh();
});
const refresh = (): void =>
{
queryDepartmentRenewalRateData( handler );
};
return {
ui,
onCurrentPageIndexChange,
onTablePageSizeChange,
showUploadFileDialog,
// 计算变量
tableData,
refresh,
};
},
};
</script>
<style lang="scss" scoped>
.wrapper {
margin: 0px 10px 10px 10px;
>*+* {
margin-top: 10px;
}
}
.pagination-wrapper {
display: flex;
justify-content: flex-end;
}
</style>

View File

@@ -0,0 +1,253 @@
<!--
* @Author: Kane
* @Date: 2023-10-17 14:41:39
* @LastEditors: Kane
* @FilePath: /task_schedule/src/views/data/bi/TelsalerAttachingRateView.vue
* @Description: BI坐席车非渗透率数据管理界面
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
-->
<template>
<div class="wrapper">
<el-row :gutter="10">
<el-col :span="8">
<el-button
type="warning"
icon="upload"
@click="showUploadFileDialog"
>
上传
</el-button>
<el-button
type="primary"
icon="refresh"
@click="refresh"
>
刷新
</el-button>
</el-col>
</el-row>
<el-table
border
stripe
style="width:100%;"
:data="tableData"
>
<el-table-column
label="部门"
align="center"
width="300"
>
<template #default="telsaler">
<span>{{ telsaler.row.departmentName }}</span>
</template>
</el-table-column>
<el-table-column
label="名称"
align="center"
width="200"
>
<template #default="telsaler">
<span>{{ telsaler.row.telsalerName }}</span>
</template>
</el-table-column>
<el-table-column
label="车险保费"
align="center"
>
<template #default="telsaler">
<span>{{ Math.trunc( telsaler.row.motoPremium * 10000) }}</span>
</template>
</el-table-column>
<el-table-column
label="非车险保费"
align="center"
>
<template #default="telsaler">
<span>{{ Math.trunc( telsaler.row.nomotoPremium * 10000) }}</span>
</template>
</el-table-column>
<el-table-column
label="当月保费渗透率"
align="center"
>
<template #default="telsaler">
<span>{{ telsaler.row.attachingRate.toFixed(2) + "%" }}</span>
</template>
</el-table-column>
<el-table-column
label="渗透率环比上月"
align="center"
>
<template #default="telsaler">
<span>{{ telsaler.row.attachingRateChange.toFixed(2) + "%" }}</span>
</template>
</el-table-column>
</el-table>
<div class="pagination_wrapper">
<el-pagination
v-model="ui.tableCurrentPageIndex"
class="pull_left"
size="small"
background
:page-size="ui.tablePageSize"
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
:total="tableCount"
@current-change="onCurrentPageIndexChange"
@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="1" />
</el-dialog>
</div>
</div>
</template>
<script lang="ts">
import { reactive, onBeforeMount, computed } from "vue";
import {
type BITelsalerAttachingRateRecord,
type QueryBITelsalerAttachingRateReportResponse,
type QueryBITelsalerAttachingRateDataHandler,
queryBITelsalerAttachingRateData
} from "@/utils/BIReport.js";
import DataUploadView from "@/views/data/DataUploadView.vue";
import { ElMessageBox, ElMessage } from "element-plus";
interface UI
{
showUI: boolean,
showUploadDialog: boolean,
tableCurrentPageIndex: number,
tablePageSize: number,
BITelsalerAttachingRateData: BITelsalerAttachingRateRecord[],
}
export default {
name: "TelsalerAttachingRateView",
components: { DataUploadView, },
setup()
{
const ui: UI = reactive({
showUI: true,
showUploadDialog: false,
tableCurrentPageIndex: 1,
tablePageSize: 10,
BITelsalerAttachingRateData: [],
});
const showUploadFileDialog = (): void =>
{
ui.showUploadDialog = true;
};
const onCurrentPageIndexChange = ( index: number ): void =>
{
ui.tableCurrentPageIndex = index;
};
const onTablePageSizeChange = ( pageSize: number ): void =>
{
ui.tablePageSize = pageSize;
};
/** 请求处理handler ********/
const queryBITelsalerAttachingRateDataHandler: QueryBITelsalerAttachingRateDataHandler = ( response: QueryBITelsalerAttachingRateReportResponse, error: any ): void =>
{
// 判断调用成功标志位
if ( response.success )
{
ui.BITelsalerAttachingRateData = response.records;
ElMessage({
message: "更新成功",
type: "success",
});
}
else
{
// 错误处理
ElMessageBox.confirm(
response.message,
"请求BI坐席渗透率数据错误",
{
confirmButtonText: "确定",
type: "warning",
center: true,
}
)
.then((): void => {})
.catch((): void => {});
if ( error !== null )
{
console.log( error );
}
}
};
const tableCount = computed((): number =>
{
return ui.BITelsalerAttachingRateData.length;
});
const tableData = computed((): BITelsalerAttachingRateRecord[] =>
{
const tableCount = ui.BITelsalerAttachingRateData.length;
const startIndex = ui.tablePageSize * ( ui.tableCurrentPageIndex - 1 ) > tableCount ? tableCount - ui.tablePageSize : ui.tablePageSize * ( ui.tableCurrentPageIndex - 1 );
const endIndex = ui.tablePageSize * ui.tableCurrentPageIndex;
return ui.BITelsalerAttachingRateData.slice( startIndex, endIndex );
});
onBeforeMount((): void =>
{
queryBITelsalerAttachingRateData( queryBITelsalerAttachingRateDataHandler );
});
const refresh = (): void =>
{
console.log( import.meta.env.VITE_TEST );
queryBITelsalerAttachingRateData( queryBITelsalerAttachingRateDataHandler );
};
return {
ui,
showUploadFileDialog,
onCurrentPageIndexChange,
onTablePageSizeChange,
// 计算变量
tableData,
tableCount,
// 函数
queryBITelsalerAttachingRateDataHandler,
refresh,
};
},
};
</script>
<style lang="scss" scoped>
.wrapper {
margin: 0px 10px 10px 10px;
>*+* {
margin-top: 10px;
}
}
.pagination_wrapper {
display: flex;
justify-content: flex-end;
}
</style>

View File

@@ -0,0 +1,241 @@
<!--
* @Author: Kane
* @Date: 2023-10-17 23:31:19
* @LastEditors: Kane
* @FilePath: /task_schedule/src/views/data/bi/TelsalerRenewalRateView.vue
* @Description:
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
-->
<template>
<div class="wrapper">
<el-row :gutter="10">
<el-col :span="24">
<el-button
type="warning"
icon="Upload"
@click="showUploadFileDialog"
>
上传
</el-button>
<el-button
type="primary"
icon="refresh"
@click="refresh"
>
刷新
</el-button>
</el-col>
</el-row>
<el-table
border
stripe
style="width:100%;"
:data="tableData"
>
<el-table-column
label="部门"
align="center"
>
<template #default="telsaler">
<span>{{ telsaler.row.责任部门 }}</span>
</template>
</el-table-column>
<el-table-column
label="责任人"
align="center"
>
<template #default="telsaler">
<span>{{ telsaler.row.责任人 }}</span>
</template>
</el-table-column>
<el-table-column
label="到期数-全月"
align="center"
>
<template #default="telsaler">
<span>{{ telsaler.row.到期数全月 }}</span>
</template>
</el-table-column>
<el-table-column
label="个车续保率(序时)(%)"
align="center"
>
<template #default="telsaler">
<span>{{ telsaler.row.个车续保率序时.toFixed(2) + "%" }}</span>
</template>
</el-table-column>
<el-table-column
label="个车续保率(全月)(%)"
align="center"
>
<template #default="telsaler">
<span>{{ telsaler.row.个车续保率全月.toFixed(2) + "%" }}</span>
</template>
</el-table-column>
</el-table>
<div class="pagination_wrapper">
<el-pagination
v-model="ui.tableCurrentPageIndex"
class="pull_left"
size="small"
background
:page-size="ui.tablePageSize"
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
:total="0"
@current-change="onCurrentPageIndexChange"
@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="2" />
</el-dialog>
</div>
</div>
</template>
<script lang="ts">
import { reactive, computed, onBeforeMount } from "vue";
import DataUploadView from "@/views/data/DataUploadView.vue";
import {
type QueryBITelsalerRenewalRateDataHandler,
type BITelsalerRenewalRateRecord,
type QueryBITelsalerRenewalRateReportResponse,
queryBITelsalerRenewalData
} from "@/utils/BIReport.js";
import { ElMessageBox, ElMessage } from "element-plus";
interface UI
{
showUI: boolean,
showUploadDialog: boolean,
tableCurrentPageIndex: number,
tablePageSize: number,
BITelsalerRenewalRateData: BITelsalerRenewalRateRecord[],
}
export default {
name: "TelsalerAttachingRateView",
components: { DataUploadView, },
setup()
{
const ui: UI = reactive({
showUI: true,
showUploadDialog: false,
tableCurrentPageIndex: 1,
tablePageSize: 10,
BITelsalerRenewalRateData: [],
});
const showUploadFileDialog = (): void =>
{
ui.showUploadDialog = true;
};
const onCurrentPageIndexChange = ( index: number ): void =>
{
ui.tableCurrentPageIndex = index;
};
const onTablePageSizeChange = ( pageSize: number ): void =>
{
ui.tablePageSize = pageSize;
};
const tableData = computed((): BITelsalerRenewalRateRecord[] =>
{
const tableCount = ui.BITelsalerRenewalRateData.length;
const startIndex = ui.tablePageSize * ( ui.tableCurrentPageIndex - 1 ) > tableCount ? tableCount - ui.tablePageSize : ui.tablePageSize * ( ui.tableCurrentPageIndex - 1 );
const endIndex = ui.tablePageSize * ui.tableCurrentPageIndex;
return ui.BITelsalerRenewalRateData.slice( startIndex, endIndex );
});
const tableCount = computed((): number =>
{
return ui.BITelsalerRenewalRateData.length;
});
// handler
const queryBITelsalerRenewalRateDataHander: QueryBITelsalerRenewalRateDataHandler = ( response: QueryBITelsalerRenewalRateReportResponse, error: any ): void =>
{
// 判断调用成功标志位
if ( response.success )
{
ui.BITelsalerRenewalRateData = response.records;
ElMessage({
message: "更新成功",
type: "success",
});
}
else
{
// 错误处理
ElMessageBox.confirm(
response.message,
"请求BI坐席续保率数据错误",
{
confirmButtonText: "确定",
type: "warning",
center: true,
}
)
.then((): void => {})
.catch((): void => {});
if ( error !== null )
{
console.log( error );
}
}
};
onBeforeMount((): void =>
{
queryBITelsalerRenewalData( queryBITelsalerRenewalRateDataHander );
});
const refresh = (): void =>
{
queryBITelsalerRenewalData( queryBITelsalerRenewalRateDataHander );
};
return {
ui,
showUploadFileDialog,
onCurrentPageIndexChange,
onTablePageSizeChange,
// 计算变量
tableData,
tableCount,
// 函数
refresh,
};
},
};
</script>
<style lang="scss" scoped>
.wrapper {
margin: 0px 10px 10px 10px;
>*+* {
margin-top: 10px;
}
}
.pagination_wrapper {
display: flex;
justify-content: flex-end;
}
</style>

View File

@@ -0,0 +1,239 @@
<!--
* @Author: Kane
* @Date: 2023-09-12 10:43:39
* @LastEditors: Kane
* @FilePath: /task_schedule/src/views/reward/RewardTelsaler.vue
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
-->
<template>
<div
v-if="ui.showUI"
class="reward-gainer-wrapper"
>
<el-row :gutter="10">
<el-col :span="8">
<span>奖励类型</span>
</el-col>
<el-col :span="16">
<el-select
v-model="ui.selectedRewardProjectCode"
value-key="rewardCode"
>
<el-option
v-for="item in ui.rewardProjectList"
:key="item.rewardCode"
:label="item.rewardName"
:value="item.rewardCode"
/>
</el-select>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="8">
<span>坐席名称</span>
</el-col>
<el-col :span="16">
<el-input v-model.trim.lazy="ui.selectedRewardTelsalerName" />
</el-col>
</el-row>
<div class="tool-button-wrapper">
<el-button
type="primary"
icon="select"
@click="onSaveRewardTelsaler"
>
保存
</el-button>
<el-button
type="danger"
icon="Close"
>
放弃
</el-button>
</div>
</div>
</template>
<script lang="ts">
import { reactive, onBeforeMount } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import {
type RewardProject,
type RewardProjectResponse,
type AddRewardTelsalerRequest,
type AddRewardTelsalerResponse,
type UpdateRewardTelsalerRequest,
type UpdateRewardTelsalerResponse,
requestRewardPorjectsList,
addRewardTelsaler,
updateTelsalerReward
} from "@/utils/reward.js";
import eventBus from "@/utils/api/EventBus.js";
interface RewardGainerUI
{
showUI: boolean;
showEditRewardGainerDialog: boolean;
rewardProjectList: RewardProject[] | null;
selectedRewardProjectCode: number | undefined;
selectedRewardTelsalerName: string;
selectedRecID: number;
}
export default {
name: "RewardTelsaler",
props: {
selectedRecId: {
type: Number,
require: true,
default: (): number => -9999,
},
selectedRewardProjectCode: {
type: Number,
require: true,
default: (): number => -999,
},
selectedTelsalerName: {
type: String,
require: true,
default: (): string => "",
},
},
setup( props )
{
const ui: RewardGainerUI = reactive({
showUI: true,
showEditRewardGainerDialog: false,
rewardProjectList: [],
selectedRewardProjectCode: 1,
selectedRewardTelsalerName: "",
selectedRecID: 0,
});
/**
* 请求奖项清单的回调函数,用于处理请求结果。
* @param response 请求奖项清单的响应对象
* @param error 请求失败时的错误对象
*/
const applyRewardProjectsData = ( response: RewardProjectResponse, error: any ): void =>
{
if ( !response.success )
{
ElMessageBox({
message: "请求奖励项目失败,请查看日志!",
type: "error",
})
.then((): void => {})
.catch((): void => {});
return;
}
ui.rewardProjectList = response.rewardList;
};
const refresh = (): void =>
{
requestRewardPorjectsList( applyRewardProjectsData );
};
onBeforeMount((): void =>
{
ui.selectedRewardProjectCode = props.selectedRewardProjectCode;
ui.selectedRewardTelsalerName = props.selectedTelsalerName;
ui.selectedRecID = props.selectedRecId;
refresh();
});
const onSaveRewardTelsaler = (): void =>
{
if ( props.selectedRecId === -1 )
{
// 新增
const addRequest: AddRewardTelsalerRequest = {
rewardIndex: ui.selectedRewardProjectCode as number,
telsalerName: ui.selectedRewardTelsalerName,
};
addRewardTelsaler( addRequest, addRewardTelsalerHandler );
}
else
{
// 更新
const updateRequest: UpdateRewardTelsalerRequest = {
recordID: ui.selectedRecID,
telsalerName: ui.selectedRewardTelsalerName,
rewardIndex: ui.selectedRewardProjectCode as number,
};
updateTelsalerReward( updateRequest, updateTelsalerRewardHandler );
}
};
const addRewardTelsalerHandler = ( data: AddRewardTelsalerResponse, error: any ): void =>
{
if ( data.success )
{
ElMessage({
message: data.message,
type: "success",
});
}
else
{
ElMessage({
message: data.message,
type: "error",
});
}
eventBus.emit( "onSavedRewardTelsaler" );
};
const updateTelsalerRewardHandler = ( data: UpdateRewardTelsalerResponse, error: any ): void =>
{
if ( data.success )
{
ElMessage({
message: data.message,
type: "success",
});
}
else
{
ElMessage({
message: data.message,
type: "error",
});
}
eventBus.emit( "onSavedRewardTelsaler" );
};
// onBeforeUpdate((): void =>
// {
// refresh();
// });
return { ui, onSaveRewardTelsaler, };
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/css/public/_public.scss";
.reward-gainer-wrapper {
width: 300px;
@include query-box-wrap;
}
.tool-button-wrapper {
display: flex;
justify-content: flex-end;
margin-top: 15px;
}
</style>

View File

@@ -2,8 +2,8 @@
* @Author: Kane
* @Date: 2023-03-23 16:05:08
* @LastEditors: Kane
* @FilePath: /task_schedule/src/views/StaffManagement.vue
* @Description:
* @FilePath: /task_schedule/src/views/telsaler/TelsalerManagement.vue
* @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,25 +112,44 @@
@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: "StaffManagement",
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: [],
});
const onCurrentPageIndexChange = ( pageIndex: number ) =>
const onCurrentPageIndexChange = ( pageIndex: number ): void =>
{
ui.table_current_page_index = pageIndex;
};
@@ -129,7 +158,7 @@ export default {
* 设置表格每页显示记录的数量
* @param pageSize 表格页记录数量
*/
const onTablePageSizeChange = ( pageSize: number ) =>
const onTablePageSizeChange = ( pageSize: number ): void =>
{
ui.table_page_size = pageSize;
};
@@ -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>
@@ -150,16 +190,9 @@ export default {
@import "@/assets/css/public/_public.scss";
.wrapper {
margin: 10px;
padding: 10px;
background-color: #fff;
border-radius: 5px;
box-shadow: $box-shadow;
&:hover {
box-shadow: $box-shadow-hover;
}
min-width: 800px;
@@ -188,4 +221,5 @@ export default {
display: flex;
justify-content: flex-end;
}
</style>

View File

@@ -0,0 +1,69 @@
<!--
* @Author: Kane
* @Date: 2023-09-27 10:13:31
* @LastEditors: Kane
* @FilePath: /task_schedule/src/views/telsaler/TelsalerManagementView.vue
* @Description: 坐席和团队管理父组件
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
-->
<template>
<div
v-if="ui.showUI"
class="telsaler-management-view-wrapper"
>
<el-tabs type="border-card">
<el-tab-pane>
<template #label>
<el-icon><User /></el-icon>
<span>坐席管理</span>
</template>
<TelsalerManagement />
</el-tab-pane>
<el-tab-pane>
<template #label>
<el-icon><Document /></el-icon>
<span>团队管理</span>
</template>
导入导出
</el-tab-pane>
</el-tabs>
</div>
</template>
<script lang="ts">
import { ref, reactive } from "vue";
// import { User } from "@element-plus/icons-vue";
import TelsalerManagement from "@/views/telsaler/TelsalerManagement.vue";
export default {
name: "TelsalerManagementView",
components: { TelsalerManagement, },
setup()
{
const ui = reactive({
showUI: true,
});
return {
ui,
};
},
};
</script>
<style scoped lang="scss">
.telsaler-management-view-wrapper {
margin: 10px 10px;
min-width: 800px;
>*+* {
margin-top: 10px;
}
span {
margin-left: 4px;
vertical-align: middle;
}
}
</style>

View File

@@ -11,10 +11,13 @@
"compilerOptions": {
"forceConsistentCasingInFileNames": true,
"useDefineForClassFields": true,
"target": "ES2015",
"module": "ES2015",
"allowImportingTsExtensions": true,
"noEmit": true,
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "node",
"strict": true,
"strictNullChecks": true,
"jsx": "preserve",
"sourceMap": true,
"resolveJsonModule": true,
@@ -35,6 +38,7 @@
]
},
"include": [
"src/**/*",
"src/**/*.ts",
"src/**/*.tsx",
"src/**/*.vue",

View File

@@ -2,7 +2,7 @@
* @Author: Kane
* @Date: 2023-02-15 09:25:52
* @LastEditors: Kane
* @LastEditTime: 2023-06-25 09:51:13
* @LastEditTime: 2023-11-13 10:42:29
* @FilePath: /task_schedule/vite.config.js
* @Description:
*
@@ -19,6 +19,9 @@ export default defineConfig(( command, mode ) =>
return {
server:{ host: "localhost", port: 5173, },
build: {
outDir: "../../../输出/web",
},
plugins: [vue(),],
base: "./",
resolve: {

View File

@@ -2,5 +2,7 @@
"java.configuration.updateBuildConfiguration": "automatic",
"java.compile.nullAnalysis.mode": "automatic",
"vue.codeActions.enabled": false,
"java.debug.settings.onBuildFailureProceed": true
"java.debug.settings.onBuildFailureProceed": true,
"java.checkstyle.version": "10.12.4",
"java.checkstyle.configuration": "/D:/DevTools/vscode/代码格式化/eclipse-java-google-style.xml"
}

View File

@@ -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,8 +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.24</spring.version>
<!-- <spring.version>6.0.11</spring.version> -->
<!-- <spring.version>5.3.30</spring.version> -->
<log4j2.version>2.20.0</log4j2.version>
<spring.version>6.2.4</spring.version>
</properties>
<dependencies>
@@ -65,7 +67,7 @@
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
<version>2.18.0</version>
</dependency>
<!--jackson-->
@@ -116,22 +118,55 @@
<artifactId>log4j-slf4j2-impl</artifactId>
<version>2.20.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>
<!-- POI -->
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
</dependencies>
<build>
<finalName>desktop_archievement_backend</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
<configuration></configuration>
<configuration>
<outputDirectory>${project.build.directory}/../../../../输出/back/</outputDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>

View File

@@ -0,0 +1,34 @@
/*
* @Author: Kane
* @Date: 2023-10-11 16:47:59
* @LastEditors: Kane
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/mapper/ImportBIArchievementDataMapper.java
* @Description:
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
*/
package com.cpic.xim.mybatis.mapper;
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;
public interface ImportBIArchievementDataMapper
{
public void insertTelsalerAttachingRateDataToDB( BITelsalerAttachingRateRecord record);
public void insertTelsalerRenewalRateDataToDB( BITelsalerRenewalRateRecord record );
public void insertDepartmentAttachingRateDataToDB(BIDepartmentAttachingRateRecord record);
public void insertDepartmentRenewalRateDataToDB(BIDepartmentRenewalRateRecord record);
public void cleanTelsalerAttachingRateData();
public void cleanTelsalerRenewalRateData();
public void cleanDepartmentAttachingRateData();
public void cleanDepartmentRenewalRateData();
}

View File

@@ -0,0 +1,27 @@
/*
* @Author: Kane
* @Date: 2023-11-01 15:50:40
* @LastEditors: Kane
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/mapper/QueryBIArchievementDataMapper.java
* @Description:
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
*/
package com.cpic.xim.mybatis.mapper;
import java.util.ArrayList;
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;
public interface QueryBIArchievementDataMapper
{
public ArrayList<BITelsalerAttachingRateRecord> queryBITelsalerAttachingRate();
public ArrayList<BITelsalerRenewalRateRecord> queryBITesalerRenewalRate();
public ArrayList<BIDepartmentAttachingRateRecord> queryBIDepartmentAttachingRate();
public ArrayList<BIDepartmentRenewalRateRecord> queryBIDepartmentRenewalRate();
}

View File

@@ -0,0 +1,29 @@
/*
* @Author: Kane
* @Date: 2023-09-06 11:17:44
* @LastEditors: Kane
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/mapper/RewardsMapper.java
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
package com.cpic.xim.mybatis.mapper;
import java.util.ArrayList;
import java.util.HashMap;
import com.cpic.xim.mybatis.pojo.RewardGainer;
import com.cpic.xim.mybatis.pojo.RewardProject;
public interface RewardsMapper
{
public ArrayList<RewardProject> queryRewardProjects();
public ArrayList<RewardGainer> queryRewardTelsaler();
public void addRewardTelSaler( HashMap<String, Object> params );
public void updateRewardTelSaler( HashMap<String, Object> params );
public void deleteRewardTelSaler( HashMap<String, Object> params );
}

View File

@@ -0,0 +1,24 @@
/*
* @Author: Kane
* @Date: 2023-11-25 18:48:11
* @LastEditors: Kane
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/mapper/TWrTelsalerMapper.java
* @Description:
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
*/
package com.cpic.xim.mybatis.mapper;
import org.apache.ibatis.annotations.Param;
import com.cpic.xim.mybatis.pojo.TWrTelsalerRecord;
public interface TWrTelsalerMapper
{
public TWrTelsalerRecord queryTWrTelsalerInfo( @Param("telsaler") String telsaler );
public void insertTWrTelsalerRecordToDB( TWrTelsalerRecord record );
public void cleanTWrTelsalerRecord();
public void cleanTWrTelsalerTeamRecord();
}

View File

@@ -0,0 +1,296 @@
/*
* @Author: Kane
* @Date: 2023-10-10 14:50:55
* @LastEditors: Kane
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BIDepartmentAttachingRateRecord.java
* @Description:
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
*/
package com.cpic.xim.mybatis.pojo;
public class BIDepartmentAttachingRateRecord
{
// 部门
private String departmentName;
// 目标值-机构
private double departmentObject;
// 目标差距
private double objectGap;
// 车险保费(万)
private double motoPremium;
// 车险保费占比
private double motoPremiumProPortion;
// 非车保费(万)
private double nomotoPremium;
// 当月保费渗透率
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,
int motoInsuranceCustomerCount, double customerHandleRate,
double customerHandleRateChange, double premiumPerCustomer,
double premiumPerCustomerChange )
{
this.departmentName = departmentName;
this.departmentObject = departmentObject;
this.objectGap = objectGap;
this.motoPremium = motoPremium;
this.motoPremiumProPortion = motoPremiumProPortion;
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 "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 + "]";
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((departmentName == null) ? 0 : departmentName.hashCode());
long temp;
temp = Double.doubleToLongBits( departmentObject );
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits( objectGap );
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits( motoPremium );
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits( motoPremiumProPortion );
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits( nomotoPremium );
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits( attachingRate );
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 );
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits( premiumPerCustomer );
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits( premiumPerCustomerChange );
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public boolean equals( Object obj )
{
if ( this == obj )
return true;
if ( obj == null )
return false;
if ( getClass() != obj.getClass() )
return false;
BIDepartmentAttachingRateRecord other = (BIDepartmentAttachingRateRecord) obj;
if ( departmentName == null )
{
if ( other.departmentName != null )
return false;
}
else if ( !departmentName.equals( other.departmentName ) )
return false;
if ( Double.doubleToLongBits( departmentObject ) != Double
.doubleToLongBits( other.departmentObject ) )
return false;
if ( Double.doubleToLongBits( objectGap ) != Double.doubleToLongBits( other.objectGap ) )
return false;
if ( Double.doubleToLongBits( motoPremium ) != Double
.doubleToLongBits( other.motoPremium ) )
return false;
if ( Double.doubleToLongBits( motoPremiumProPortion ) != Double
.doubleToLongBits( other.motoPremiumProPortion ) )
return false;
if ( Double.doubleToLongBits( nomotoPremium ) != Double
.doubleToLongBits( other.nomotoPremium ) )
return false;
if ( Double.doubleToLongBits( attachingRate ) != Double
.doubleToLongBits( other.attachingRate ) )
return false;
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;
if ( Double.doubleToLongBits( customerHandleRateChange ) != Double
.doubleToLongBits( other.customerHandleRateChange ) )
return false;
if ( Double.doubleToLongBits( premiumPerCustomer ) != Double
.doubleToLongBits( other.premiumPerCustomer ) )
return false;
if ( Double.doubleToLongBits( premiumPerCustomerChange ) != Double
.doubleToLongBits( other.premiumPerCustomerChange ) )
return false;
return true;
}
public String getDepartmentName()
{
return departmentName;
}
public void setDepartmentName( String departmentName )
{
this.departmentName = departmentName;
}
public double getDepartmentObject()
{
return departmentObject;
}
public void setDepartmentObject( double departmentObject )
{
this.departmentObject = departmentObject;
}
public double getObjectGap()
{
return objectGap;
}
public void setObjectGap( double objectGap )
{
this.objectGap = objectGap;
}
public double getMotoPremium()
{
return motoPremium;
}
public void setMotoPremium( double motoPremium )
{
this.motoPremium = motoPremium;
}
public double getMotoPremiumProPortion()
{
return motoPremiumProPortion;
}
public void setMotoPremiumProPortion( double motoPremiumProPortion )
{
this.motoPremiumProPortion = motoPremiumProPortion;
}
public double getNomotoPremium()
{
return nomotoPremium;
}
public void setNomotoPremium( double nomotoPremium )
{
this.nomotoPremium = nomotoPremium;
}
public double getAttachingRate()
{
return attachingRate;
}
public void setAttachingRate( double attachingRate )
{
this.attachingRate = attachingRate;
}
public double getAttachingRateChange()
{
return attachingRateChange;
}
public void setAttachingRateChange( double attachingRateChange )
{
this.attachingRateChange = attachingRateChange;
}
public double getCustomerHandleRate()
{
return customerHandleRate;
}
public void setCustomerHandleRate( double customerHandleRate )
{
this.customerHandleRate = customerHandleRate;
}
public double getCustomerHandleRateChange()
{
return customerHandleRateChange;
}
public void setCustomerHandleRateChange( double customerHandleRateChange )
{
this.customerHandleRateChange = customerHandleRateChange;
}
public double getPremiumPerCustomer()
{
return premiumPerCustomer;
}
public void setPremiumPerCustomer( double premiumPerCustomer )
{
this.premiumPerCustomer = premiumPerCustomer;
}
public double getPremiumPerCustomerChange()
{
return premiumPerCustomerChange;
}
public void setPremiumPerCustomerChange( double premiumPerCustomerChange )
{
this.premiumPerCustomerChange = premiumPerCustomerChange;
}
}

View File

@@ -0,0 +1,188 @@
/*
* @Author: Kane
* @Date: 2023-10-24 11:06:29
* @LastEditors: Kane
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BIDepartmentRenewalRateRecord.java
* @Description: BI机构当月个车续保率跟踪表记录对象
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
*/
package com.cpic.xim.mybatis.pojo;
public class BIDepartmentRenewalRateRecord
{
private String 责任部门;
private double 机构目标值;
private int 到期数全月;
private double 序时到期数占比;
private double 个车续保率序时;
private double 个车续保率全月;
private double 环比昨日;
private double 环比上月;
// private int 平均提前签单天数;
// private double 环比;
public BIDepartmentRenewalRateRecord()
{}
public BIDepartmentRenewalRateRecord( String 责任部门, double 机构目标值, int 到期数全月, double 序时到期数占比,
double 个车续保率序时, double 个车续保率全月, double 环比昨日, double 环比上月 )
{
this.责任部门 = 责任部门;
this.机构目标值 = 机构目标值;
this.到期数全月 = 到期数全月;
this.序时到期数占比 = 序时到期数占比;
this.个车续保率序时 = 个车续保率序时;
this.个车续保率全月 = 个车续保率全月;
this.环比昨日 = 环比昨日;
this.环比上月 = 环比上月;
// this.平均提前签单天数 = 平均提前签单天数;
// this.环比 = 环比;
}
public String get责任部门()
{
return 责任部门;
}
public void set责任部门( String 责任部门 )
{
this.责任部门 = 责任部门;
}
public double get机构目标值()
{
return 机构目标值;
}
public void set机构目标值( double 机构目标值 )
{
this.机构目标值 = 机构目标值;
}
public int get到期数全月()
{
return 到期数全月;
}
public void set到期数全月( int 到期数全月 )
{
this.到期数全月 = 到期数全月;
}
public double get序时到期数占比()
{
return 序时到期数占比;
}
public void set序时到期数占比( double 序时到期数占比 )
{
this.序时到期数占比 = 序时到期数占比;
}
public double get个车续保率序时()
{
return 个车续保率序时;
}
public void set个车续保率序时( double 个车续保率序时 )
{
this.个车续保率序时 = 个车续保率序时;
}
public double get个车续保率全月()
{
return 个车续保率全月;
}
public void set个车续保率全月( double 个车续保率全月 )
{
this.个车续保率全月 = 个车续保率全月;
}
public double get环比昨日()
{
return 环比昨日;
}
public void set环比昨日( double 环比昨日 )
{
this.环比昨日 = 环比昨日;
}
public double get环比上月()
{
return 环比上月;
}
public void set环比上月( double 环比上月 )
{
this.环比上月 = 环比上月;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((责任部门 == null) ? 0 : 责任部门.hashCode());
long temp;
temp = Double.doubleToLongBits( 机构目标值 );
result = prime * result + (int) (temp ^ (temp >>> 32));
result = prime * result + 到期数全月;
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));
temp = Double.doubleToLongBits( 环比昨日 );
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits( 环比上月 );
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public boolean equals( Object obj )
{
if ( this == obj )
return true;
if ( obj == null )
return false;
if ( getClass() != obj.getClass() )
return false;
BIDepartmentRenewalRateRecord other = (BIDepartmentRenewalRateRecord) obj;
if ( 责任部门 == null )
{
if ( other.责任部门 != null )
return false;
}
else if ( !责任部门.equals( other.责任部门 ) )
return false;
if ( Double.doubleToLongBits( 机构目标值 ) != Double.doubleToLongBits( other.机构目标值 ) )
return false;
if ( 到期数全月 != other.到期数全月 )
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;
if ( Double.doubleToLongBits( 环比昨日 ) != Double.doubleToLongBits( other.环比昨日 ) )
return false;
if ( Double.doubleToLongBits( 环比上月 ) != Double.doubleToLongBits( other.环比上月 ) )
return false;
return true;
}
@Override
public String toString()
{
return "BIDepartmentRenewalRateRecord [责任部门=" + 责任部门 + ", 机构目标值=" + 机构目标值 + ", 到期数全月="
+ 到期数全月 + ", 序时到期数占比=" + 序时到期数占比 + ", 个车续保率序时=" + 个车续保率序时 + ", 个车续保率全月=" + 个车续保率全月
+ ", 环比昨日=" + 环比昨日 + ", 环比上月=" + 环比上月 + "]";
}
}

View File

@@ -0,0 +1,287 @@
/*
* @Author: Kane
* @Date: 2023-10-08 14:45:13
* @LastEditors: Kane
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/BITelsalerAttachingRateRecord.java
* @Description: 用于存放BI导出每日电销坐席车险非车险保费和车非渗透率数据.
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
*/
package com.cpic.xim.mybatis.pojo;
import com.fasterxml.jackson.annotation.JsonProperty;
public class BITelsalerAttachingRateRecord
{
// 部门
@JsonProperty( "departmentName" )
private String departmentName;
// 坐席名称
@JsonProperty( "telsalerName" )
private String telsalerName;
// 车险保费
@JsonProperty( "motoPremium" )
private double motoPremium;
// 非车险保费
@JsonProperty( "nomotoPremium" )
private double nomotoPremium;
// 车险保费占比
@JsonProperty( "motoPremiumProportion" )
private double motoPremiumProportion;
// 渗透率
@JsonProperty( "attachingRate" )
private double attachingRate;
// 渗透率环比上月
@JsonProperty( "attachingRateChange" )
private double attachingRateChange;
// 当月客户渗透率
@JsonProperty( "customerHandleRate" )
private double customerHandleRate;
// 客户渗透率环比上月
@JsonProperty( "customerHandleRateChange" )
private double customerHandleRateChange;
// 当月车非客均保费
@JsonProperty( "noMotoPremiumPerCustomer" )
private double noMotoPremiumPerCustomer;
// 客均保费环比上月
@JsonProperty( "noMotoPremiumPerCustomerChange" )
private double noMotoPremiumPerCustomerChange;
public BITelsalerAttachingRateRecord( String departmentName,
String telsalerName, double motoPremium, double nomotoPremium,
double motoPremiumProportion, double attachingRate, double attachingRateChange,
double customerHandleRate, double customerHandleRateChange,
double noMotoPremiumPerCustomer, double noMotoPremiumPerCustomerChange )
{
this.departmentName = departmentName;
this.telsalerName = telsalerName;
this.motoPremium = motoPremium;
this.nomotoPremium = nomotoPremium;
this.motoPremiumProportion = motoPremiumProportion;
this.attachingRate = attachingRate;
this.attachingRateChange = attachingRateChange;
this.customerHandleRate = customerHandleRate;
this.customerHandleRateChange = customerHandleRateChange;
this.noMotoPremiumPerCustomer = noMotoPremiumPerCustomer;
this.noMotoPremiumPerCustomerChange = noMotoPremiumPerCustomerChange;
}
public BITelsalerAttachingRateRecord()
{}
public double getCustomerHandleRate()
{
return customerHandleRate;
}
public void setCustomerHandleRate( double customerHandleRate )
{
this.customerHandleRate = customerHandleRate;
}
public double getCustomerHandleRateChange()
{
return customerHandleRateChange;
}
public void setCustomerHandleRateChange( double customerHandleRateChange )
{
this.customerHandleRateChange = customerHandleRateChange;
}
public double getNoMotoPremiumPerCustomer()
{
return noMotoPremiumPerCustomer;
}
public void setNoMotoPremiumPerCustomer( double noMotoPremiumPerCustomer )
{
this.noMotoPremiumPerCustomer = noMotoPremiumPerCustomer;
}
public double getNoMotoPremiumPerCustomerChange()
{
return noMotoPremiumPerCustomerChange;
}
public void setNoMotoPremiumPerCustomerChange( double noMotoPremiumPerCustomerChange )
{
this.noMotoPremiumPerCustomerChange = noMotoPremiumPerCustomerChange;
}
@Override
public String toString()
{
return "BITelsalerAttachingRateRecord [departmentName=" + departmentName + ", summaryDate="
+ ", telsalerName=" + telsalerName + ", motoPremium=" + motoPremium
+ ", nomotoPremium=" + nomotoPremium + ", motoPremiumProportion="
+ motoPremiumProportion + ", attachingRate=" + attachingRate
+ ", attachingRateChange=" + attachingRateChange + ", customerHandleRate="
+ customerHandleRate + ", customerHandleRateChange=" + customerHandleRateChange
+ ", noMotoPremiumPerCustomer=" + noMotoPremiumPerCustomer
+ ", noMotoPremiumPerCustomerChange=" + noMotoPremiumPerCustomerChange + "]";
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((departmentName == null) ? 0 : departmentName.hashCode());
result = prime * result + ((telsalerName == null) ? 0 : telsalerName.hashCode());
long temp;
temp = Double.doubleToLongBits( motoPremium );
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits( nomotoPremium );
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits( motoPremiumProportion );
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits( attachingRate );
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits( attachingRateChange );
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits( customerHandleRate );
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits( customerHandleRateChange );
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits( noMotoPremiumPerCustomer );
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits( noMotoPremiumPerCustomerChange );
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public boolean equals( Object obj )
{
if ( this == obj )
return true;
if ( obj == null )
return false;
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 ( telsalerName == null )
{
if ( other.telsalerName != null )
return false;
}
else if ( !telsalerName.equals( other.telsalerName ) )
return false;
if ( Double.doubleToLongBits( motoPremium ) != Double
.doubleToLongBits( other.motoPremium ) )
return false;
if ( Double.doubleToLongBits( nomotoPremium ) != Double
.doubleToLongBits( other.nomotoPremium ) )
return false;
if ( Double.doubleToLongBits( motoPremiumProportion ) != Double
.doubleToLongBits( other.motoPremiumProportion ) )
return false;
if ( Double.doubleToLongBits( attachingRate ) != Double
.doubleToLongBits( other.attachingRate ) )
return false;
if ( Double.doubleToLongBits( attachingRateChange ) != Double
.doubleToLongBits( other.attachingRateChange ) )
return false;
if ( Double.doubleToLongBits( customerHandleRate ) != Double
.doubleToLongBits( other.customerHandleRate ) )
return false;
if ( Double.doubleToLongBits( customerHandleRateChange ) != Double
.doubleToLongBits( other.customerHandleRateChange ) )
return false;
if ( Double.doubleToLongBits( noMotoPremiumPerCustomer ) != Double
.doubleToLongBits( other.noMotoPremiumPerCustomer ) )
return false;
if ( Double.doubleToLongBits( noMotoPremiumPerCustomerChange ) != Double
.doubleToLongBits( other.noMotoPremiumPerCustomerChange ) )
return false;
return true;
}
public String getTelsalerName()
{
return telsalerName;
}
public void setTelsalerName( String telsalerName )
{
this.telsalerName = telsalerName;
}
public double getMotoPremium()
{
return motoPremium;
}
public void setMotoPremium( double motoPremium )
{
this.motoPremium = motoPremium;
}
public double getNomotoPremium()
{
return nomotoPremium;
}
public void setNomotoPremium( double nomotoPremium )
{
this.nomotoPremium = nomotoPremium;
}
public double getMotoPremiumProportion()
{
return motoPremiumProportion;
}
public void setMotoPremiumProportion( double motoPremiumProportion )
{
this.motoPremiumProportion = motoPremiumProportion;
}
public double getAttachingRate()
{
return attachingRate;
}
public void setAttachingRate( double attachingRate )
{
this.attachingRate = attachingRate;
}
public double getAttachingRateChange()
{
return attachingRateChange;
}
public void setAttachingRateChange( double attachingRateChange )
{
this.attachingRateChange = attachingRateChange;
}
public String getDepartmentName()
{
return departmentName;
}
public void setDepartmentName( String departmentName )
{
this.departmentName = departmentName;
}
}

View File

@@ -0,0 +1,202 @@
/*
* @Author: Kane
* @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文件行记录。
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
*/
package com.cpic.xim.mybatis.pojo;
public class BITelsalerRenewalRateRecord
{
private String 责任部门;
private String 责任人;
private double 机构目标值;
private double 到期数全月;
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 环比上月 )
{
this.责任部门 = 责任部门;
this.责任人 = 责任人;
this.机构目标值 = 机构目标值;
this.到期数全月 = 到期数全月;
this.序时到期数占比 = 序时到期数占比;
this.个车续保率序时 = 个车续保率序时;
this.个车续保率全月 = 个车续保率全月;
this.环比昨日 = 环比昨日;
this.环比上月 = 环比上月;
}
public String get责任部门()
{
return 责任部门;
}
public void set责任部门( String 责任部门 )
{
this.责任部门 = 责任部门;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((责任部门 == null) ? 0 : 责任部门.hashCode());
result = prime * result + ((责任人 == null) ? 0 : 责任人.hashCode());
long temp;
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));
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));
temp = Double.doubleToLongBits( 环比上月 );
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public boolean equals( Object obj )
{
if ( this == obj )
return true;
if ( obj == null )
return false;
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 )
return false;
}
else if ( !责任人.equals( other.责任人 ) )
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;
if ( Double.doubleToLongBits( 个车续保率序时 ) != Double.doubleToLongBits( other.个车续保率序时 ) )
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 "BITelsalerRenewalRateRecord [责任部门=" + 责任部门 + ", 责任人=" + 责任人 + ", 机构目标值=" + 机构目标值
+ ", 到期数全月=" + 到期数全月 + ", 序时到期数占比=" + 序时到期数占比 + ", 个车续保率序时=" + 个车续保率序时
+ ", 个车续保率全月=" + 个车续保率全月 + ", 环比昨日=" + 环比昨日 + ", 环比上月=" + 环比上月 + "]";
}
public String get责任人()
{
return 责任人;
}
public void set责任人( String 责任人 )
{
this.责任人 = 责任人;
}
public double get机构目标值()
{
return 机构目标值;
}
public void set机构目标值( double 机构目标值 )
{
this.机构目标值 = 机构目标值;
}
public double get到期数全月()
{
return 到期数全月;
}
public void set到期数全月( double 到期数全月 )
{
this.到期数全月 = 到期数全月;
}
public double get序时到期数占比()
{
return 序时到期数占比;
}
public void set序时到期数占比( double 序时到期数占比 )
{
this.序时到期数占比 = 序时到期数占比;
}
public double get个车续保率序时()
{
return 个车续保率序时;
}
public void set个车续保率序时( double 个车续保率序时 )
{
this.个车续保率序时 = 个车续保率序时;
}
public double get个车续保率全月()
{
return 个车续保率全月;
}
public void set个车续保率全月( double 个车续保率全月 )
{
this.个车续保率全月 = 个车续保率全月;
}
public double get环比昨日()
{
return 环比昨日;
}
public void set环比昨日( double 环比昨日 )
{
this.环比昨日 = 环比昨日;
}
public double get环比上月()
{
return 环比上月;
}
public void set环比上月( double 环比上月 )
{
this.环比上月 = 环比上月;
}
}

View File

@@ -22,8 +22,6 @@ public class MensualArchievementItem
this.premium = premium;
}
public int getMonth()
{
return month;

View File

@@ -0,0 +1,149 @@
/*
* @Author: Kane
* @Date: 2023-09-07 15:18:46
* @LastEditors: Kane
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/RewardGainer.java
* @Description: 获奖人对象
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
package com.cpic.xim.mybatis.pojo;
import com.fasterxml.jackson.annotation.JsonProperty;
public class RewardGainer
{
public RewardGainer()
{}
public RewardGainer( int recID, String callerName, String callerCode, int rewardProjectCode,
String rewardProjectName)
{
this.recID = recID;
this.callerName = callerName;
this.callerCode = callerCode;
this.rewardProjectCode = rewardProjectCode;
this.rewardProjectName = rewardProjectName;
}
@Override
public String toString()
{
return "RewardGainer [recID=" + recID + ", callerName=" + callerName + ", callerCode="
+ callerCode + ", rewardProjectCode=" + rewardProjectCode + ", rewardProjectName="
+ rewardProjectName + "]";
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + recID;
result = prime * result + ((callerName == null) ? 0 : callerName.hashCode());
result = prime * result + ((callerCode == null) ? 0 : callerCode.hashCode());
result = prime * result + rewardProjectCode;
result = prime * result + ((rewardProjectName == null) ? 0 : rewardProjectName.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;
RewardGainer other = (RewardGainer) obj;
if ( recID != other.recID )
return false;
if ( callerName == null )
{
if ( other.callerName != null )
return false;
} else if ( !callerName.equals( other.callerName ) )
return false;
if ( callerCode == null )
{
if ( other.callerCode != null )
return false;
} else if ( !callerCode.equals( other.callerCode ) )
return false;
if ( rewardProjectCode != other.rewardProjectCode )
return false;
if ( rewardProjectName == null )
{
if ( other.rewardProjectName != null )
return false;
} else if ( !rewardProjectName.equals( other.rewardProjectName ) )
return false;
return true;
}
public int getRecID()
{
return recID;
}
public void setRecID( int recID )
{
this.recID = recID;
}
public String getCallerName()
{
return callerName;
}
public void setCallerName( String callerName )
{
this.callerName = callerName;
}
public String getCallerCode()
{
return callerCode;
}
public void setCallerCode( String callerCode )
{
this.callerCode = callerCode;
}
public int getRewardProjectCode()
{
return rewardProjectCode;
}
public void setRewardProjectCode( int rewardProjectCode )
{
this.rewardProjectCode = rewardProjectCode;
}
public String getRewardProjectName()
{
return rewardProjectName;
}
public void setRewardProjectName( String rewardProjectName )
{
this.rewardProjectName = rewardProjectName;
}
@JsonProperty( "recID" )
private int recID;
@JsonProperty( "callerName" )
private String callerName;
@JsonProperty( "callerCode" )
private String callerCode;
@JsonProperty( "rewardProjectCode" )
private int rewardProjectCode;
@JsonProperty( "rewardProjectName" )
private String rewardProjectName;
}

View File

@@ -0,0 +1,90 @@
/*
* @Author: Kane
* @Date: 2023-09-06 11:00:35
* @LastEditors: Kane
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/RewardProject.java
* @Description: 奖励项目对象
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
package com.cpic.xim.mybatis.pojo;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
* 奖励项目对象
*/
public class RewardProject
{
public RewardProject( int rewardCode, String rewardName)
{
this.rewardCode = rewardCode;
this.rewardName = rewardName;
}
public int getRewardCode()
{
return rewardCode;
}
public void setRewardCode( int rewardCode )
{
this.rewardCode = rewardCode;
}
public String getRewardName()
{
return rewardName;
}
public void setRewardName( String rewardName )
{
this.rewardName = rewardName;
}
@Override
public String toString()
{
return "RewardProject [rewardCode=" + rewardCode + ", rewardName=" + rewardName + "]";
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + rewardCode;
result = prime * result + ((rewardName == null) ? 0 : rewardName.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;
RewardProject other = (RewardProject) obj;
if ( rewardCode != other.rewardCode )
return false;
if ( rewardName == null )
{
if ( other.rewardName != null )
return false;
} else if ( !rewardName.equals( other.rewardName ) )
return false;
return true;
}
// 奖励项目代码
@JsonProperty("rewardCode")
private int rewardCode;
// 奖励项目名称
@JsonProperty("rewardName")
private String rewardName;
}

View File

@@ -0,0 +1,755 @@
/*
* @Author: Kane
* @Date: 2023-11-24 14:34:16
* @LastEditors: Kane
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/TwrTelsalerRecord.java
* @Description:
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
*/
package com.cpic.xim.mybatis.pojo;
public class TWrTelsalerRecord
{
private String 人员姓名;
private String 人员工号;
private String 籍贯;
private String 参加工作时间;
private String 入职日期;
private String 入司日期;
private String 业务类型;
private String 办公地省;
private String 办公地市;
private String 人员类别;
private String 现任岗位;
private String 现任职级;
private String 机构名称;
private String 职场分类;
private String 片区名称;
private String 团队名称;
private String 对口分公司;
private String 展业地区;
private String 招聘渠道;
private String 渠道明细;
private String 全日制最高学历;
private String 学历类型;
private String 用工性质名称;
private String 合同种类;
private String 合同类型;
private String 合同性质;
private int 合同签订次数;
private String 合同生效日期;
private String 合同到期日期;
private String 人员属性;
private String 保代员工号;
private String 职场属性;
private String 办公性质;
private String 保代人员属性;
private String 人员状态;
public TWrTelsalerRecord( String 人员姓名, String 人员工号, String 籍贯, String 参加工作时间, String 入职日期,
String 入司日期, String 业务类型, String 办公地省, String 办公地市, String 人员类别, String 现任岗位,
String 现任职级, String 机构名称, String 职场分类, String 片区名称, String 团队名称, String 对口分公司,
String 展业地区, String 招聘渠道, String 渠道明细, String 全日制最高学历, String 学历类型, String 用工性质名称,
String 合同种类, String 合同类型, String 合同性质, int 合同签订次数, String 合同生效日期, String 合同到期日期,
String 人员属性, String 保代员工号, String 职场属性, String 办公性质, String 保代人员属性, String 人员状态 )
{
this.人员姓名 = 人员姓名;
this.人员工号 = 人员工号;
this.籍贯 = 籍贯;
this.参加工作时间 = 参加工作时间;
this.入职日期 = 入职日期;
this.入司日期 = 入司日期;
this.业务类型 = 业务类型;
this.办公地省 = 办公地省;
this.办公地市 = 办公地市;
this.人员类别 = 人员类别;
this.现任岗位 = 现任岗位;
this.现任职级 = 现任职级;
this.机构名称 = 机构名称;
this.职场分类 = 职场分类;
this.片区名称 = 片区名称;
this.团队名称 = 团队名称;
this.对口分公司 = 对口分公司;
this.展业地区 = 展业地区;
this.招聘渠道 = 招聘渠道;
this.渠道明细 = 渠道明细;
this.全日制最高学历 = 全日制最高学历;
this.学历类型 = 学历类型;
this.用工性质名称 = 用工性质名称;
this.合同种类 = 合同种类;
this.合同类型 = 合同类型;
this.合同性质 = 合同性质;
this.合同签订次数 = 合同签订次数;
this.合同生效日期 = 合同生效日期;
this.合同到期日期 = 合同到期日期;
this.人员属性 = 人员属性;
this.保代员工号 = 保代员工号;
this.职场属性 = 职场属性;
this.办公性质 = 办公性质;
this.保代人员属性 = 保代人员属性;
this.人员状态 = 人员状态;
}
@Override
public String toString()
{
return "TWrTelsalerRecord [人员姓名=" + 人员姓名 + ", 人员工号=" + 人员工号 + ", 籍贯=" + 籍贯 + ", 参加工作时间="
+ 参加工作时间 + ", 入职日期=" + 入职日期 + ", 入司日期=" + 入司日期 + ", 业务类型=" + 业务类型 + ", 办公地省=" + 办公地省
+ ", 办公地市=" + 办公地市 + ", 人员类别=" + 人员类别 + ", 现任岗位=" + 现任岗位 + ", 现任职级=" + 现任职级
+ ", 机构名称=" + 机构名称 + ", 职场分类=" + 职场分类 + ", 片区名称=" + 片区名称 + ", 团队名称=" + 团队名称
+ ", 对口分公司=" + 对口分公司 + ", 展业地区=" + 展业地区 + ", 招聘渠道=" + 招聘渠道 + ", 渠道明细=" + 渠道明细
+ ", 全日制最高学历=" + 全日制最高学历 + ", 学历类型=" + 学历类型 + ", 用工性质名称=" + 用工性质名称 + ", 合同种类="
+ 合同种类 + ", 合同类型=" + 合同类型 + ", 合同性质=" + 合同性质 + ", 合同签订次数=" + 合同签订次数 + ", 合同生效日期="
+ 合同生效日期 + ", 合同到期日期=" + 合同到期日期 + ", 人员属性=" + 人员属性 + ", 保代员工号=" + 保代员工号 + ", 职场属性="
+ 职场属性 + ", 办公性质=" + 办公性质 + ", 保代人员属性=" + 保代人员属性 + ", 人员状态=" + 人员状态 + "]";
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((人员姓名 == null) ? 0 : 人员姓名.hashCode());
result = prime * result + ((人员工号 == null) ? 0 : 人员工号.hashCode());
result = prime * result + ((籍贯 == null) ? 0 : 籍贯.hashCode());
result = prime * result + ((参加工作时间 == null) ? 0 : 参加工作时间.hashCode());
result = prime * result + ((入职日期 == null) ? 0 : 入职日期.hashCode());
result = prime * result + ((入司日期 == null) ? 0 : 入司日期.hashCode());
result = prime * result + ((业务类型 == null) ? 0 : 业务类型.hashCode());
result = prime * result + ((办公地省 == null) ? 0 : 办公地省.hashCode());
result = prime * result + ((办公地市 == null) ? 0 : 办公地市.hashCode());
result = prime * result + ((人员类别 == null) ? 0 : 人员类别.hashCode());
result = prime * result + ((现任岗位 == null) ? 0 : 现任岗位.hashCode());
result = prime * result + ((现任职级 == null) ? 0 : 现任职级.hashCode());
result = prime * result + ((机构名称 == null) ? 0 : 机构名称.hashCode());
result = prime * result + ((职场分类 == null) ? 0 : 职场分类.hashCode());
result = prime * result + ((片区名称 == null) ? 0 : 片区名称.hashCode());
result = prime * result + ((团队名称 == null) ? 0 : 团队名称.hashCode());
result = prime * result + ((对口分公司 == null) ? 0 : 对口分公司.hashCode());
result = prime * result + ((展业地区 == null) ? 0 : 展业地区.hashCode());
result = prime * result + ((招聘渠道 == null) ? 0 : 招聘渠道.hashCode());
result = prime * result + ((渠道明细 == null) ? 0 : 渠道明细.hashCode());
result = prime * result + ((全日制最高学历 == null) ? 0 : 全日制最高学历.hashCode());
result = prime * result + ((学历类型 == null) ? 0 : 学历类型.hashCode());
result = prime * result + ((用工性质名称 == null) ? 0 : 用工性质名称.hashCode());
result = prime * result + ((合同种类 == null) ? 0 : 合同种类.hashCode());
result = prime * result + ((合同类型 == null) ? 0 : 合同类型.hashCode());
result = prime * result + ((合同性质 == null) ? 0 : 合同性质.hashCode());
result = prime * result + 合同签订次数;
result = prime * result + ((合同生效日期 == null) ? 0 : 合同生效日期.hashCode());
result = prime * result + ((合同到期日期 == null) ? 0 : 合同到期日期.hashCode());
result = prime * result + ((人员属性 == null) ? 0 : 人员属性.hashCode());
result = prime * result + ((保代员工号 == null) ? 0 : 保代员工号.hashCode());
result = prime * result + ((职场属性 == null) ? 0 : 职场属性.hashCode());
result = prime * result + ((办公性质 == null) ? 0 : 办公性质.hashCode());
result = prime * result + ((保代人员属性 == null) ? 0 : 保代人员属性.hashCode());
result = prime * result + ((人员状态 == null) ? 0 : 人员状态.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;
TWrTelsalerRecord other = (TWrTelsalerRecord) obj;
if ( 人员姓名 == null )
{
if ( other.人员姓名 != null )
return false;
}
else if ( !人员姓名.equals( other.人员姓名 ) )
return false;
if ( 人员工号 == null )
{
if ( other.人员工号 != null )
return false;
}
else if ( !人员工号.equals( other.人员工号 ) )
return false;
if ( 籍贯 == null )
{
if ( other.籍贯 != null )
return false;
}
else if ( !籍贯.equals( other.籍贯 ) )
return false;
if ( 参加工作时间 == null )
{
if ( other.参加工作时间 != null )
return false;
}
else if ( !参加工作时间.equals( other.参加工作时间 ) )
return false;
if ( 入职日期 == null )
{
if ( other.入职日期 != null )
return false;
}
else if ( !入职日期.equals( other.入职日期 ) )
return false;
if ( 入司日期 == null )
{
if ( other.入司日期 != null )
return false;
}
else if ( !入司日期.equals( other.入司日期 ) )
return false;
if ( 业务类型 == null )
{
if ( other.业务类型 != null )
return false;
}
else if ( !业务类型.equals( other.业务类型 ) )
return false;
if ( 办公地省 == null )
{
if ( other.办公地省 != null )
return false;
}
else if ( !办公地省.equals( other.办公地省 ) )
return false;
if ( 办公地市 == null )
{
if ( other.办公地市 != null )
return false;
}
else if ( !办公地市.equals( other.办公地市 ) )
return false;
if ( 人员类别 == null )
{
if ( other.人员类别 != null )
return false;
}
else if ( !人员类别.equals( other.人员类别 ) )
return false;
if ( 现任岗位 == null )
{
if ( other.现任岗位 != null )
return false;
}
else if ( !现任岗位.equals( other.现任岗位 ) )
return false;
if ( 现任职级 == null )
{
if ( other.现任职级 != null )
return false;
}
else if ( !现任职级.equals( other.现任职级 ) )
return false;
if ( 机构名称 == null )
{
if ( other.机构名称 != null )
return false;
}
else if ( !机构名称.equals( other.机构名称 ) )
return false;
if ( 职场分类 == null )
{
if ( other.职场分类 != null )
return false;
}
else if ( !职场分类.equals( other.职场分类 ) )
return false;
if ( 片区名称 == null )
{
if ( other.片区名称 != null )
return false;
}
else if ( !片区名称.equals( other.片区名称 ) )
return false;
if ( 团队名称 == null )
{
if ( other.团队名称 != null )
return false;
}
else if ( !团队名称.equals( other.团队名称 ) )
return false;
if ( 对口分公司 == null )
{
if ( other.对口分公司 != null )
return false;
}
else if ( !对口分公司.equals( other.对口分公司 ) )
return false;
if ( 展业地区 == null )
{
if ( other.展业地区 != null )
return false;
}
else if ( !展业地区.equals( other.展业地区 ) )
return false;
if ( 招聘渠道 == null )
{
if ( other.招聘渠道 != null )
return false;
}
else if ( !招聘渠道.equals( other.招聘渠道 ) )
return false;
if ( 渠道明细 == null )
{
if ( other.渠道明细 != null )
return false;
}
else if ( !渠道明细.equals( other.渠道明细 ) )
return false;
if ( 全日制最高学历 == null )
{
if ( other.全日制最高学历 != null )
return false;
}
else if ( !全日制最高学历.equals( other.全日制最高学历 ) )
return false;
if ( 学历类型 == null )
{
if ( other.学历类型 != null )
return false;
}
else if ( !学历类型.equals( other.学历类型 ) )
return false;
if ( 用工性质名称 == null )
{
if ( other.用工性质名称 != null )
return false;
}
else if ( !用工性质名称.equals( other.用工性质名称 ) )
return false;
if ( 合同种类 == null )
{
if ( other.合同种类 != null )
return false;
}
else if ( !合同种类.equals( other.合同种类 ) )
return false;
if ( 合同类型 == null )
{
if ( other.合同类型 != null )
return false;
}
else if ( !合同类型.equals( other.合同类型 ) )
return false;
if ( 合同性质 == null )
{
if ( other.合同性质 != null )
return false;
}
else if ( !合同性质.equals( other.合同性质 ) )
return false;
if ( 合同签订次数 != other.合同签订次数 )
return false;
if ( 合同生效日期 == null )
{
if ( other.合同生效日期 != null )
return false;
}
else if ( !合同生效日期.equals( other.合同生效日期 ) )
return false;
if ( 合同到期日期 == null )
{
if ( other.合同到期日期 != null )
return false;
}
else if ( !合同到期日期.equals( other.合同到期日期 ) )
return false;
if ( 人员属性 == null )
{
if ( other.人员属性 != null )
return false;
}
else if ( !人员属性.equals( other.人员属性 ) )
return false;
if ( 保代员工号 == null )
{
if ( other.保代员工号 != null )
return false;
}
else if ( !保代员工号.equals( other.保代员工号 ) )
return false;
if ( 职场属性 == null )
{
if ( other.职场属性 != null )
return false;
}
else if ( !职场属性.equals( other.职场属性 ) )
return false;
if ( 办公性质 == null )
{
if ( other.办公性质 != null )
return false;
}
else if ( !办公性质.equals( other.办公性质 ) )
return false;
if ( 保代人员属性 == null )
{
if ( other.保代人员属性 != null )
return false;
}
else if ( !保代人员属性.equals( other.保代人员属性 ) )
return false;
if ( 人员状态 == null )
{
if ( other.人员状态 != null )
return false;
}
else if ( !人员状态.equals( other.人员状态 ) )
return false;
return true;
}
public String get人员姓名()
{
return 人员姓名;
}
public void set人员姓名( String 人员姓名 )
{
this.人员姓名 = 人员姓名;
}
public String get人员工号()
{
return 人员工号;
}
public void set人员工号( String 人员工号 )
{
this.人员工号 = 人员工号;
}
public String get籍贯()
{
return 籍贯;
}
public void set籍贯( String 籍贯 )
{
this.籍贯 = 籍贯;
}
public String get参加工作时间()
{
return 参加工作时间;
}
public void set参加工作时间( String 参加工作时间 )
{
this.参加工作时间 = 参加工作时间;
}
public String get入职日期()
{
return 入职日期;
}
public void set入职日期( String 入职日期 )
{
this.入职日期 = 入职日期;
}
public String get入司日期()
{
return 入司日期;
}
public void set入司日期( String 入司日期 )
{
this.入司日期 = 入司日期;
}
public String get业务类型()
{
return 业务类型;
}
public void set业务类型( String 业务类型 )
{
this.业务类型 = 业务类型;
}
public String get办公地省()
{
return 办公地省;
}
public void set办公地省( String 办公地省 )
{
this.办公地省 = 办公地省;
}
public String get办公地市()
{
return 办公地市;
}
public void set办公地市( String 办公地市 )
{
this.办公地市 = 办公地市;
}
public String get人员类别()
{
return 人员类别;
}
public void set人员类别( String 人员类别 )
{
this.人员类别 = 人员类别;
}
public String get现任岗位()
{
return 现任岗位;
}
public void set现任岗位( String 现任岗位 )
{
this.现任岗位 = 现任岗位;
}
public String get现任职级()
{
return 现任职级;
}
public void set现任职级( String 现任职级 )
{
this.现任职级 = 现任职级;
}
public String get机构名称()
{
return 机构名称;
}
public void set机构名称( String 机构名称 )
{
this.机构名称 = 机构名称;
}
public String get职场分类()
{
return 职场分类;
}
public void set职场分类( String 职场分类 )
{
this.职场分类 = 职场分类;
}
public String get片区名称()
{
return 片区名称;
}
public void set片区名称( String 片区名称 )
{
this.片区名称 = 片区名称;
}
public String get团队名称()
{
return 团队名称;
}
public void set团队名称( String 团队名称 )
{
this.团队名称 = 团队名称;
}
public String get对口分公司()
{
return 对口分公司;
}
public void set对口分公司( String 对口分公司 )
{
this.对口分公司 = 对口分公司;
}
public String get展业地区()
{
return 展业地区;
}
public void set展业地区( String 展业地区 )
{
this.展业地区 = 展业地区;
}
public String get招聘渠道()
{
return 招聘渠道;
}
public void set招聘渠道( String 招聘渠道 )
{
this.招聘渠道 = 招聘渠道;
}
public String get渠道明细()
{
return 渠道明细;
}
public void set渠道明细( String 渠道明细 )
{
this.渠道明细 = 渠道明细;
}
public String get全日制最高学历()
{
return 全日制最高学历;
}
public void set全日制最高学历( String 全日制最高学历 )
{
this.全日制最高学历 = 全日制最高学历;
}
public String get学历类型()
{
return 学历类型;
}
public void set学历类型( String 学历类型 )
{
this.学历类型 = 学历类型;
}
public String get用工性质名称()
{
return 用工性质名称;
}
public void set用工性质名称( String 用工性质名称 )
{
this.用工性质名称 = 用工性质名称;
}
public String get合同种类()
{
return 合同种类;
}
public void set合同种类( String 合同种类 )
{
this.合同种类 = 合同种类;
}
public String get合同类型()
{
return 合同类型;
}
public void set合同类型( String 合同类型 )
{
this.合同类型 = 合同类型;
}
public String get合同性质()
{
return 合同性质;
}
public void set合同性质( String 合同性质 )
{
this.合同性质 = 合同性质;
}
public int get合同签订次数()
{
return 合同签订次数;
}
public void set合同签订次数( int 合同签订次数 )
{
this.合同签订次数 = 合同签订次数;
}
public String get合同生效日期()
{
return 合同生效日期;
}
public void set合同生效日期( String 合同生效日期 )
{
this.合同生效日期 = 合同生效日期;
}
public String get合同到期日期()
{
return 合同到期日期;
}
public void set合同到期日期( String 合同到期日期 )
{
this.合同到期日期 = 合同到期日期;
}
public String get人员属性()
{
return 人员属性;
}
public void set人员属性( String 人员属性 )
{
this.人员属性 = 人员属性;
}
public String get保代员工号()
{
return 保代员工号;
}
public void set保代员工号( String 保代员工号 )
{
this.保代员工号 = 保代员工号;
}
public String get职场属性()
{
return 职场属性;
}
public void set职场属性( String 职场属性 )
{
this.职场属性 = 职场属性;
}
public String get办公性质()
{
return 办公性质;
}
public void set办公性质( String 办公性质 )
{
this.办公性质 = 办公性质;
}
public String get保代人员属性()
{
return 保代人员属性;
}
public void set保代人员属性( String 保代人员属性 )
{
this.保代人员属性 = 保代人员属性;
}
public String get人员状态()
{
return 人员状态;
}
public void set人员状态( String 人员状态 )
{
this.人员状态 = 人员状态;
}
}

View File

@@ -0,0 +1,341 @@
/*
* @Author: Kane
* @Date: 2023-10-07 23:29:22
* @LastEditors: Kane
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/mybatis/pojo/TelsalerFromJYGL.java
* @Description: 经营管理系统中导出的电销坐席数据记录。
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
*/
package com.cpic.xim.mybatis.pojo;
import java.time.LocalDate;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
* 经营管理系统中导出的电销坐席数据记录。
* @author Kane
*/
public class TelsalerFromJYGL
{
// 名称
@JsonProperty("telsalerName")
private String telsalerName;
// 坐席工号
@JsonProperty("telsalerCode")
private String telsalerCode;
// 籍贯
@JsonProperty("nativePlace")
private String nativePlace;
// 参加工作时间
@JsonProperty("startWorkingDate")
private LocalDate startWorkingDate;
// 入司时间
@JsonProperty("employmentDate")
private LocalDate employmentDate;
// 业务类型
@JsonProperty("business")
private String business;
// 办公地省
@JsonProperty("province")
private String province;
// 办公地市
@JsonProperty("city")
private String city;
// 人员类别
@JsonProperty("employmentType")
private String employmentType;
// 现任岗位
@JsonProperty("quarters")
private String quarters;
// 现任职级
@JsonProperty("rank")
private String rank;
// 机构名称
@JsonProperty("branchName")
private String branchName;
// 职场分类
@JsonProperty("workPlaceType")
private String workPlaceType;
public TelsalerFromJYGL() {}
@Override
public String toString()
{
return "TelsalerFromJYGL [telsalerName=" + telsalerName + ", telsalerCode=" + telsalerCode
+ ", nativePlace=" + nativePlace + ", startWorkingDate=" + startWorkingDate
+ ", employmentDate=" + employmentDate + ", business=" + business + ", province="
+ province + ", city=" + city + ", employmentType=" + employmentType + ", quarters="
+ quarters + ", rank=" + rank + ", branchName=" + branchName + ", workPlaceType="
+ workPlaceType + "]";
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((telsalerName == null) ? 0 : telsalerName.hashCode());
result = prime * result + ((telsalerCode == null) ? 0 : telsalerCode.hashCode());
result = prime * result + ((nativePlace == null) ? 0 : nativePlace.hashCode());
result = prime * result + ((startWorkingDate == null) ? 0 : startWorkingDate.hashCode());
result = prime * result + ((employmentDate == null) ? 0 : employmentDate.hashCode());
result = prime * result + ((business == null) ? 0 : business.hashCode());
result = prime * result + ((province == null) ? 0 : province.hashCode());
result = prime * result + ((city == null) ? 0 : city.hashCode());
result = prime * result + ((employmentType == null) ? 0 : employmentType.hashCode());
result = prime * result + ((quarters == null) ? 0 : quarters.hashCode());
result = prime * result + ((rank == null) ? 0 : rank.hashCode());
result = prime * result + ((branchName == null) ? 0 : branchName.hashCode());
result = prime * result + ((workPlaceType == null) ? 0 : workPlaceType.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;
TelsalerFromJYGL other = (TelsalerFromJYGL) obj;
if ( telsalerName == null )
{
if ( other.telsalerName != null )
return false;
}
else if ( !telsalerName.equals( other.telsalerName ) )
return false;
if ( telsalerCode == null )
{
if ( other.telsalerCode != null )
return false;
}
else if ( !telsalerCode.equals( other.telsalerCode ) )
return false;
if ( nativePlace == null )
{
if ( other.nativePlace != null )
return false;
}
else if ( !nativePlace.equals( other.nativePlace ) )
return false;
if ( startWorkingDate == null )
{
if ( other.startWorkingDate != null )
return false;
}
else if ( !startWorkingDate.equals( other.startWorkingDate ) )
return false;
if ( employmentDate == null )
{
if ( other.employmentDate != null )
return false;
}
else if ( !employmentDate.equals( other.employmentDate ) )
return false;
if ( business == null )
{
if ( other.business != null )
return false;
}
else if ( !business.equals( other.business ) )
return false;
if ( province == null )
{
if ( other.province != null )
return false;
}
else if ( !province.equals( other.province ) )
return false;
if ( city == null )
{
if ( other.city != null )
return false;
}
else if ( !city.equals( other.city ) )
return false;
if ( employmentType == null )
{
if ( other.employmentType != null )
return false;
}
else if ( !employmentType.equals( other.employmentType ) )
return false;
if ( quarters == null )
{
if ( other.quarters != null )
return false;
}
else if ( !quarters.equals( other.quarters ) )
return false;
if ( rank == null )
{
if ( other.rank != null )
return false;
}
else if ( !rank.equals( other.rank ) )
return false;
if ( branchName == null )
{
if ( other.branchName != null )
return false;
}
else if ( !branchName.equals( other.branchName ) )
return false;
if ( workPlaceType == null )
{
if ( other.workPlaceType != null )
return false;
}
else if ( !workPlaceType.equals( other.workPlaceType ) )
return false;
return true;
}
public String getTelsalerName()
{
return telsalerName;
}
public void setTelsalerName( String telsalerName )
{
this.telsalerName = telsalerName;
}
public String getTelsalerCode()
{
return telsalerCode;
}
public void setTelsalerCode( String telsalerCode )
{
this.telsalerCode = telsalerCode;
}
public String getNativePlace()
{
return nativePlace;
}
public void setNativePlace( String nativePlace )
{
this.nativePlace = nativePlace;
}
public LocalDate getStartWorkingDate()
{
return startWorkingDate;
}
public void setStartWorkingDate( LocalDate startWorkingDate )
{
this.startWorkingDate = startWorkingDate;
}
public LocalDate getEmploymentDate()
{
return employmentDate;
}
public void setEmploymentDate( LocalDate employmentDate )
{
this.employmentDate = employmentDate;
}
public String getBusiness()
{
return business;
}
public void setBusiness( String business )
{
this.business = business;
}
public String getProvince()
{
return province;
}
public void setProvince( String province )
{
this.province = province;
}
public String getCity()
{
return city;
}
public void setCity( String city )
{
this.city = city;
}
public String getEmploymentType()
{
return employmentType;
}
public void setEmploymentType( String employmentType )
{
this.employmentType = employmentType;
}
public String getQuarters()
{
return quarters;
}
public void setQuarters( String quarters )
{
this.quarters = quarters;
}
public String getRank()
{
return rank;
}
public void setRank( String rank )
{
this.rank = rank;
}
public String getBranchName()
{
return branchName;
}
public void setBranchName( String branchName )
{
this.branchName = branchName;
}
public String getWorkPlaceType()
{
return workPlaceType;
}
public void setWorkPlaceType( String workPlaceType )
{
this.workPlaceType = workPlaceType;
}
}

View File

@@ -13,64 +13,122 @@ import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisUtils
{
private static HashMap<String, SqlSession> SessionMap = new HashMap<>();
private static HashMap<String, SqlSession> SessionMap = new HashMap<>( 5 );
private static HashMap<String, SqlSession> SessionMapBatch = new HashMap<>( 5 );
private static HashMap<String, SqlSessionFactory> SessionFactoryMap = new HashMap<>( 5 );
private static HashMap<String, SqlSessionFactory> SessionFactoryMapBatch = new HashMap<>( 5 );
private static String DEFAULT_CONFIGFILE = "mybatis/mybatis-config.xml";
/**
*
* @param configFile
* @return
* @throws IOException
*/
public static SqlSession getSqlSession(String configFile )
throws IOException
public static SqlSession getSqlSession( String configFile ) throws IOException
{
// 根据配置文件的路径查找是否已经创建了对应的session
SqlSession session = SessionMap.get(configFile);
SqlSessionFactory factory = SessionFactoryMap.get( configFile );
// 找到就直接返回
if ( session != null )
if ( factory != null )
{
return session;
return factory.openSession();
}
// 没找到就创建一个
InputStream configIS = Resources.getResourceAsStream(configFile);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(configIS);
session = factory.openSession();
InputStream configIS = Resources.getResourceAsStream( configFile );
factory = new SqlSessionFactoryBuilder().build( configIS );
SqlSession session = factory.openSession();
// 保存
SessionMap.put(configFile, session);
SessionFactoryMap.put( configFile, factory );
return session;
}
public static SqlSession getSqlSession()
throws IOException
public static SqlSession getSqlSessionBatch( String configFile ) throws IOException
{
// 根据配置文件的路径查找是否已经创建了对应的session
SqlSession session = SessionMap.get(DEFAULT_CONFIGFILE);
SqlSessionFactory factory = SessionFactoryMap.get( configFile );
// 找到就直接返回
if ( session != null )
if ( factory != null )
{
return session;
return factory.openSession();
}
// 没找到就创建一个
InputStream configIS = Resources.getResourceAsStream(DEFAULT_CONFIGFILE);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(configIS);
session = factory.openSession();
InputStream configIS = Resources.getResourceAsStream( configFile );
factory = new SqlSessionFactoryBuilder().build( configIS );
SqlSession session = factory.openSession( ExecutorType.BATCH, false );
// 保存
SessionMap.put(DEFAULT_CONFIGFILE, session);
SessionFactoryMap.put( configFile, factory );
return session;
}
}
}
/**
*
* @return
* @throws IOException
*/
public static SqlSession getSqlSession() throws IOException
{
// 根据配置文件的路径查找是否已经创建了对应的session
SqlSessionFactory factory = SessionFactoryMap.get( DEFAULT_CONFIGFILE );
// 找到就直接返回
if ( factory != null )
{
return factory.openSession();
}
// 没找到就创建一个
InputStream configIS = Resources.getResourceAsStream( DEFAULT_CONFIGFILE );
factory = new SqlSessionFactoryBuilder().build( configIS );
SqlSession session = factory.openSession();
// 保存
SessionFactoryMap.put( DEFAULT_CONFIGFILE, factory );
return session;
}
/**
* 获取一个Batch模式的sqlsession使用默认路径的mybatis-config.xml文件。
* 先判断SessionMapBatch中是否有和配置文件对应的缓存的sqlsession对象有就直接使用。
* 没有就创建一个新的然后放入SessionMapBatch中。
* @return ExecutorType.BATCH模式的sqlsession实例对象
* @throws IOException 读取配置文件错误时抛出IOException异常
*/
public static SqlSession getSqlSessionBatch() throws IOException
{
// 根据配置文件的路径查找是否已经创建了对应的session
SqlSessionFactory factory = SessionFactoryMap.get( DEFAULT_CONFIGFILE );
// 找到就直接返回
if ( factory != null )
{
return factory.openSession();
}
// 没找到就创建一个
InputStream configIS = Resources.getResourceAsStream( DEFAULT_CONFIGFILE );
factory = new SqlSessionFactoryBuilder().build( configIS );
SqlSession session = factory.openSession( ExecutorType.BATCH, false );
// 保存
SessionFactoryMap.put( DEFAULT_CONFIGFILE, factory );
return session;
}
}

View File

@@ -41,12 +41,12 @@ public final class TeleSalerInfo
/**
* 查询坐席工号的static方法。
* @param telsalerCode 坐席工号
* @param telsaler 坐席工号
* @return TeleSalerInfo对象。
* @throws ClassNotFoundException
* @throws SQLException
*/
public static TeleSalerInfo queryTeleSalerInfo( String telsalerCode )
public static TeleSalerInfo queryTeleSalerInfo( String telsaler )
throws ClassNotFoundException, SQLException
{
TeleSalerInfo info = null;
@@ -60,19 +60,32 @@ public final class TeleSalerInfo
PreparedStatement statement = null;
ResultSet result = null;
String sql = """
SELECT 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 = ? """;
// String sql = """
// SELECT 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 = ? or s.saler_name = ?) """;
String sql2 = """
select ry.人员工号 ,
ry.人员姓名,
team.team_code,
team.team_name,
bm.department_code,
bm.department_name
from twr_telsaler ry,
twr_telsaler_team team,
idst0.bm_t bm
where trim(ry.团队名称) = trim(team.team_name)
and team.department_code = bm.department_code
AND (ry.人员工号 = ? or ry.人员姓名 = ?)""";
// String sql = "SELECT DISTINCT s.saler_code, s.saler_name, \n"
// + " t.team_code, t.team, \n"
// + " bm.department_code, bm.department_name \n"
@@ -84,9 +97,10 @@ public final class TeleSalerInfo
{
Class.forName( "oracle.jdbc.driver.OracleDriver" );
connection = DriverManager.getConnection( jdbcURL, userName, password );
statement = connection.prepareStatement( sql );
statement = connection.prepareStatement( sql2 );
statement.setString( 1, telsalerCode );
statement.setString( 1, telsaler );
statement.setString( 2, telsaler );
result = statement.executeQuery();

View File

@@ -25,52 +25,25 @@ public class CallerArchievement
{
private static Logger logger = LoggerFactory.getLogger( CallerArchievement.class );
private static ArrayList<MensualArchievementItem> monthArray = null;
/**
* 构造函数
* @param callerCode
* @param totalArchievement
* @param mensualArchievementList
* @param insuranceRenewalRate
* @param attachingRate
*/
public CallerArchievement( String callerCode, long totalArchievement,
ArrayList<MensualArchievementItem> mensualArchievementList, String insuranceRenewalRate,
String attachingRate)
{
this.callerCode = callerCode;
this.totalArchievement = totalArchievement;
this.mensualArchievementList = mensualArchievementList;
this.insuranceRenewalRate = insuranceRenewalRate;
this.attachingRate = attachingRate;
}
// 静态代码块
static
{
// 初始化月份
monthArray = new ArrayList<MensualArchievementItem>(12);
monthArray = new ArrayList<MensualArchievementItem>( 12 );
monthArray.add(new MensualArchievementItem(1, "0"));
monthArray.add(new MensualArchievementItem(2, "0"));
monthArray.add(new MensualArchievementItem(3, "0"));
monthArray.add(new MensualArchievementItem(4, "0"));
monthArray.add(new MensualArchievementItem(5, "0"));
monthArray.add(new MensualArchievementItem(6, "0"));
monthArray.add(new MensualArchievementItem(7, "0"));
monthArray.add(new MensualArchievementItem(8, "0"));
monthArray.add(new MensualArchievementItem(9, "0"));
monthArray.add(new MensualArchievementItem(10, "0"));
monthArray.add(new MensualArchievementItem(11, "0"));
monthArray.add(new MensualArchievementItem(12, "0"));
}
public CallerArchievement()
{
this.totalArchievement = 0;
this.mensualArchievementList = null;
this.insuranceRenewalRate = "";
this.attachingRate = "";
this.callerCode = "";
monthArray.add( new MensualArchievementItem( 1, "0" ) );
monthArray.add( new MensualArchievementItem( 2, "0" ) );
monthArray.add( new MensualArchievementItem( 3, "0" ) );
monthArray.add( new MensualArchievementItem( 4, "0" ) );
monthArray.add( new MensualArchievementItem( 5, "0" ) );
monthArray.add( new MensualArchievementItem( 6, "0" ) );
monthArray.add( new MensualArchievementItem( 7, "0" ) );
monthArray.add( new MensualArchievementItem( 8, "0" ) );
monthArray.add( new MensualArchievementItem( 9, "0" ) );
monthArray.add( new MensualArchievementItem( 10, "0" ) );
monthArray.add( new MensualArchievementItem( 11, "0" ) );
monthArray.add( new MensualArchievementItem( 12, "0" ) );
}
public static CallerArchievement getCallerArchievement( String callerCode ) throws IOException
@@ -81,28 +54,36 @@ public class CallerArchievement
ArchievementMapper mapper = session.getMapper( ArchievementMapper.class );
HashMap<String, Object> params = new HashMap<String, Object>();
Integer totalArchievement = null;
double motoPremiumPresentMonth = 0;
String attachingRate = null;
String renewalRate = null;
ArrayList<MensualArchievementItem> mensual = null;
params.put( "a_caller_code", callerCode );
session.clearCache();
mapper.getCallerArchievement( params );
// 总业绩
if ( params.get( "a_total" ) instanceof Integer )
{
totalArchievement = (Integer) params.get( "a_total" );
} else
}
else
{
totalArchievement = Integer.valueOf( 0 );
}
// 当月车险保费
motoPremiumPresentMonth = ((Double) params.get( "a_present_month" )).doubleValue();
// 车非融合
if ( params.get( "a_attaching_rate" ) instanceof String )
{
attachingRate = (String) params.get( "a_attaching_rate" );
} else
}
else
{
attachingRate = "0.0";
}
@@ -111,18 +92,23 @@ public class CallerArchievement
if ( params.get( "a_renewal_rate" ) instanceof String )
{
renewalRate = (String) params.get( "a_renewal_rate" );
} else
}
else
{
renewalRate = "0.0";
}
// 处理每月业绩
ArrayList<MensualArchievementItem> mensualList = new ArrayList<>(CallerArchievement.monthArray);
// ArrayList<MensualArchievementItem> mensualList = new
// ArrayList<>(CallerArchievement.monthArray);
// 数据库接收的每月业绩,要检查是否有缺漏
mensual = (ArrayList<MensualArchievementItem>) params.get( "a_mensual_cur" );
if ( params.get( "a_mensual_cur" ) instanceof ArrayList )
{
mensual = (ArrayList<MensualArchievementItem>) params.get( "a_mensual_cur" );
}
archievement = new CallerArchievement( callerCode, totalArchievement, mensual, renewalRate,
attachingRate );
archievement = new CallerArchievement( callerCode, totalArchievement,
motoPremiumPresentMonth, mensual, renewalRate, attachingRate );
return archievement;
}
@@ -137,6 +123,150 @@ public class CallerArchievement
CallerArchievement.logger = logger;
}
public static ArrayList<MensualArchievementItem> getMonthArray()
{
return monthArray;
}
public static void setMonthArray( ArrayList<MensualArchievementItem> 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<MensualArchievementItem> 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<MensualArchievementItem> 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;
@@ -187,21 +317,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<MensualArchievementItem> mensualArchievementList;
@JsonProperty( "insurance_renewal_rate" )
private String insuranceRenewalRate; // 续保率
@JsonProperty( "attaching_rate" )
private String attachingRate; // 车非渗透率
}

View File

@@ -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 部门代码
@@ -77,19 +47,22 @@ public class DepartmentArchievement
params.put("a_department_code", departmentCode);
session.clearCache();
mapper.getDepartmentArchievement(params);
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 )
{
@@ -103,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;
@@ -138,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;
@@ -152,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; // 车非渗透率
}

View File

@@ -0,0 +1,540 @@
/*
* @Author: Kane
* @Date: 2023-10-08 15:02:15
* @LastEditors: Kane
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/utils/data/ImportBIExcelData.java
* @Description: 坐席业绩相关的数据操作方法。
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
*/
package com.cpic.xim.utils.data;
import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.util.ArrayList;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.utils.poi.MyPOIUtils;
/**
* 坐席业绩相关的数据操作方法。
*/
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文件格式的函数。
* @param sheet
* @param caption 标题行文字
* @param captionRowIndex 标题行索引
* @param title 字段行文字数组
* @param titleRowIndex 字段行索引
* @return 返回判断结果
*/
private static boolean checkExcelFormat( Sheet sheet, String caption, int captionRowIndex,
String[] title, int titleRowIndex )
{
boolean result = true;
Row captionRow = sheet.getRow( captionRowIndex );
Row titleRow = sheet.getRow( titleRowIndex );
if ( caption != null && !caption.isEmpty() )
{
try
{
int captionCellNum = captionRow.getFirstCellNum();
String captionString = MyPOIUtils.getStringCellValue( captionRow, captionCellNum );
if ( !caption.equals( captionString ) )
{
result = false;
}
}
catch ( NullPointerException error )
{
result = false;
}
}
if ( title.length != 0 )
{
int cellIndex = 0;
try
{
for ( Cell cell : titleRow )
{
String cellString = MyPOIUtils.getStringCellValue( cell );
logger.info( "比较报表标题行,待导入报表标题:" + cellString + ";验证标题:" + title[cellIndex] );
if ( !cellString.equals( title[cellIndex] ) )
{
result = false;
break;
}
cellIndex++;
}
}
catch ( NullPointerException error )
{
result = false;
}
}
return result;
}
/**
* 从excel文件读取坐席的车非渗透率数据
* @param filePath 文件路径
* @param SheetIndex sheet索引
* @param firstRow 数据起始行
* @return 返回一个ArrayList保存的TelsalerAttachingRateRecord记录数组。
* @throws IOException 打开excel文件错误时抛出。
* @throws InvalidFormatException excel单元格格式错误时抛出
*/
public static ArrayList<BITelsalerAttachingRateRecord> importBITelsalerAttachingRateRecordFromXlsx(
String filePath, int SheetIndex, int firstRow )
throws IOException, InvalidFormatException
{
ArrayList<BITelsalerAttachingRateRecord> records = new ArrayList<>( 200 );
Workbook wb = null;
Sheet sheet = null;
String name = null;
String departmentName = null;
String departmentCurrentRow = null;
try
{
wb = WorkbookFactory.create( new File( filePath ) );
sheet = wb.getSheetAt( SheetIndex );
// 先验证格式,不对就抛出错误
if ( !checkExcelFormat( sheet, null, 0, TelsalerAttachingRateExcelTitle, 0 ) )
{
throw new InvalidFormatException( "Excel文件格式错误请检查报表内容" );
}
for ( Row row : sheet )
{
int rowIndex = row.getRowNum();
// 从数据行开始
if ( row.getRowNum() < firstRow )
{
continue;
}
try
{
// 部门
try
{
departmentCurrentRow = MyPOIUtils.getStringCellValue( row, 0 );
// 因为是合并列,所以要判断一下是不是空的
if ( !departmentCurrentRow.equals( "" )
&& !departmentCurrentRow.equals( "合计" ) )
{
// 不是空的,也不是合计,说明是新部门的数据,更新部门名称
departmentName = departmentCurrentRow;
}
}
catch ( NullPointerException error )
{
// cell是空的说明还是上一行的部门
}
// 坐席名称
name = MyPOIUtils.getStringCellValue( row, 1 );
// 忽略坐席名称为空的行
if ( name.equals( "全流程" ) || name.equals( "其他" ) || name.isEmpty() )
{
continue;
}
// 车险保费
double motoPremium = MyPOIUtils.getNumbericCellValue( row, 2 );
// 非车险保费
double nomotoPremium = MyPOIUtils.getNumbericCellValue( row, 4 );
// 车险保费占比
double motoPremiumProPortion = MyPOIUtils.getNumbericCellValue( row, 3 ) * 100;
// 当月保费渗透率
double attachingRate = MyPOIUtils.getNumbericCellValue( row, 5 ) * 100;
// 保费渗透率环比上月
double attachingRateChange = MyPOIUtils.getNumbericCellValue( row, 6 ) * 100;
// 当月客户渗透率
double customerHandleRateCell = MyPOIUtils.getNumbericCellValue( row, 7 ) * 100;
// 客户渗透率环比上月
double customerHandleRateChangeCell =
MyPOIUtils.getNumbericCellValue( row, 8 ) * 100;
// 当月车非客均保费
double noMotoPremiumPerCustomerCell =
MyPOIUtils.getNumbericCellValue( row, 9 ) * 100;
// 客均保费环比上月
double noMotoPremiumPerCustomerChangeCell =
MyPOIUtils.getNumbericCellValue( row, 10 ) * 100;
BITelsalerAttachingRateRecord record = new BITelsalerAttachingRateRecord(
departmentName, name, motoPremium, nomotoPremium,
motoPremiumProPortion, attachingRate, attachingRateChange,
customerHandleRateCell, customerHandleRateChangeCell,
noMotoPremiumPerCustomerCell, noMotoPremiumPerCustomerChangeCell );
records.add( record );
}
catch ( IllegalStateException error )
{
error.printStackTrace();
}
catch ( NumberFormatException error )
{
error.printStackTrace();
}
catch ( NullPointerException error )
{
String message = "" + String.valueOf( rowIndex ) + "行出现NullPointerException异常";
logger.error( message, error );
}
}
}
finally
{
try
{
if ( wb != null )
{
wb.close();
}
}
catch ( IOException error )
{
error.printStackTrace();
}
}
return records;
}
/**
* 从excel文件读取坐席的车非渗透率数据。
* @param filePath
* @param hasCaptionRow
* @param summaryDate
* @return
*/
public static ArrayList<BITelsalerRenewalRateRecord> importBITelsalerRenewalRateFromXlsx(
String filePath, int sheetIndex, int firstRow )
throws IOException, InvalidFormatException
{
ArrayList<BITelsalerRenewalRateRecord> records = new ArrayList<>( 200 );
Workbook wb = null;
Sheet sheet = null;
try
{
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 ) )
{
throw new InvalidFormatException( "格式错误,请检查报表内容!" );
}
for ( Row row : sheet )
{
rowIndex = row.getRowNum();
// 从数据行开始
if ( row.getRowNum() < firstRow )
{
continue;
}
try
{
// 处理责任部门列
// 如果读取到的当前行责任部门不为空且与前一行责任部门不同,说明是另一个部门的数据
try
{
当前行责任部门 = MyPOIUtils.getStringCellValue( row, 0 );
if ( !当前行责任部门.isEmpty() && !当前行责任部门.equals( 责任部门 ) )
{
责任部门 = 当前行责任部门;
}
}
catch ( NullPointerException error )
{
}
// 判断责任人,如果是空值,就跳过此行
责任人 = MyPOIUtils.getStringCellValue( row, 1 );
if ( 责任人.isEmpty() == true )
{
continue;
}
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( 责任部门, 责任人,
机构目标值, 到期数全月, 序时到期数占比, 个车续保率序时, 个车续保率全月, 环比昨日, 环比上月 );
records.add( record );
}
catch ( NullPointerException error )
{
String message = "" + String.valueOf( rowIndex ) + "行出现NullPointerException异常";
logger.error( message, error );
}
}
}
finally
{
try
{
if ( wb != null )
{
wb.close();
}
}
catch ( Exception error )
{
error.printStackTrace();
}
}
return records;
}
/**
* 读取BI机构当月个车续保率跟踪表
* @param filePath
* @param sheetIndex
* @param firstRow
* @return
* @throws IOException
* @throws InvalidFormatException
*/
public static ArrayList<BIDepartmentAttachingRateRecord> importBIDepartmentAttachingRateRecordsFromXlsx(
String filePath, int sheetIndex, int firstRow )
throws IOException, InvalidFormatException
{
ArrayList<BIDepartmentAttachingRateRecord> records = new ArrayList<>( 5 );
Workbook wb = null;
try
{
wb = WorkbookFactory.create( new File( filePath ) );
Sheet sheet = wb.getSheetAt( sheetIndex );
int rowIndex = 0;
if ( !checkExcelFormat( sheet, null, 0, DepartmentAttachingRateExcelTitle, 0 ) )
{
throw new InvalidFormatException( "Excel文件格式错误请检查报表内容" );
}
for ( Row row : sheet )
{
rowIndex = row.getRowNum();
// 从数据行开始
if ( row.getRowNum() < firstRow )
{
continue;
}
try
{
String departmentName = MyPOIUtils.getStringCellValue( row, 0 );
if ( departmentName.isEmpty() || departmentName.equals( "合计" ) )
{
continue;
}
double departmentObject = MyPOIUtils.getNumbericCellValue( row, 1 ) * 100;
double objectGap = MyPOIUtils.getNumbericCellValue( row, 2 ) * 100;
double motoPremium = MyPOIUtils.getNumbericCellValue( row, 3 );
double motoPremiumProPortion = MyPOIUtils.getNumbericCellValue( row, 4 ) * 100;
double nomotoPremium = MyPOIUtils.getNumbericCellValue( row, 5 );
double attachingRate = MyPOIUtils.getNumbericCellValue( row, 6 ) * 100;
double attachingRateChange = MyPOIUtils.getNumbericCellValue( row, 7 ) * 100;
int motoInsuranceCustomerCount = (int)MyPOIUtils.getNumbericCellValue( row, 8 );
double customerHandleRate = MyPOIUtils.getNumbericCellValue( row, 9 ) * 100;
double customerHandleRateChange =
MyPOIUtils.getNumbericCellValue( row, 10 ) * 100;
double premiumPerCustomer = MyPOIUtils.getNumbericCellValue( row, 11 ) * 100;
double premiumPerCustomerChange =
MyPOIUtils.getNumbericCellValue( row, 12 ) * 100;
BIDepartmentAttachingRateRecord record = new BIDepartmentAttachingRateRecord(
departmentName, departmentObject, objectGap, motoPremium,
motoPremiumProPortion, nomotoPremium, attachingRate,
attachingRateChange, motoInsuranceCustomerCount, customerHandleRate, customerHandleRateChange,
premiumPerCustomer, premiumPerCustomerChange );
records.add( record );
}
catch ( NullPointerException error )
{
String message = "" + String.valueOf( rowIndex ) + "行出现NullPointerException异常";
logger.error( message, error );
}
}
}
finally
{
try
{
if ( wb != null )
{
wb.close();
}
}
catch ( Exception error )
{
String message = "关闭" + filePath + "时出现异常!";
logger.error( message, error );
}
}
return records;
}
public static ArrayList<BIDepartmentRenewalRateRecord> importBIDepartmentRenewalRateRecordsFromXlsx(
String filePath, int sheetIndex, int firstRow )
throws IOException, InvalidFormatException
{
ArrayList<BIDepartmentRenewalRateRecord> records = new ArrayList<>( 20 );
Workbook wb = null;
try
{
wb = WorkbookFactory.create( new File( filePath ) );
Sheet sheet = wb.getSheetAt( sheetIndex );
int rowIndex = 0;
if ( !checkExcelFormat( sheet, null, 0, DepartmentRenewalRateExcelTitle, 0 ) )
{
throw new InvalidFormatException( "Excel文件格式错误请检查报表内容" );
}
for ( Row row : sheet )
{
rowIndex = row.getRowNum();
if ( rowIndex < firstRow )
{
continue;
}
try
{
String 责任部门 = MyPOIUtils.getStringCellValue( row, 0 );
// 部门为空或者是合计行,就跳过
if ( 责任部门.isEmpty() || 责任部门.equals( "合计" ) )
{
continue;
}
double 机构目标值 = MyPOIUtils.getNumbericCellValue( row, 1 ) * 100;
int 到期数全月 = (int) MyPOIUtils.getNumbericCellValue( row, 2 );
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;
// int 平均提前签单天数 = (int) MyPOIUtils.getNumbericCellValue( row, 8 );
// double 环比 = MyPOIUtils.getNumbericCellValue( row, 9 ) * 100;
BIDepartmentRenewalRateRecord record = new BIDepartmentRenewalRateRecord( 责任部门,
机构目标值, 到期数全月, 序时到期数占比, 个车续保率序时, 个车续保率全月, 环比昨日, 环比上月 );
records.add( record );
}
catch ( NullPointerException error )
{
String message = "" + String.valueOf( rowIndex ) + "行出现NullPointerException异常";
logger.error( message, error );
}
}
}
finally
{
if ( wb != null )
{
try
{
wb.close();
}
catch ( Exception error )
{
error.printStackTrace();
}
}
}
return records;
}
}

View File

@@ -0,0 +1,192 @@
/*
* @Author: Kane
* @Date: 2023-11-24 11:09:46
* @LastEditors: Kane
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/utils/data/ImportTWRTelsalerData.java
* @Description:
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
*/
package com.cpic.xim.utils.data;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.cpic.xim.mybatis.pojo.TWrTelsalerRecord;
import com.cpic.xim.utils.poi.MyPOIUtils;
public class ImportTWRTelsalerData
{
private static Logger logger = LoggerFactory.getLogger( ImportTWRTelsalerData.class );
private static String[] TwrTelsalerListExcelTitle = new String[]
{ "人员姓名", "人员工号", "籍 贯", "参加工作时间", "入职日期", "入司日期", "业务类型", "办公地省", "办公地市", "人员类别", "现任岗位",
"现任职级", "机构名称", "职场分类", "片区名称", "团队名称", "对口分公司", "展业地区", "招聘渠道", "渠道明细", "全日制最高学历",
"学历类型", "用工性质名称", "合同种类", "合同类型", "合同性质", "合同签订次数", "合同生效日期", "合同到期日期", "人员属性", "保代员工号",
"职场属性", "办公性质", "保代人员属性", "人员状态",};
public static ArrayList<TWrTelsalerRecord> importTWrTelsalerDataFromExcel( String filePath, int sheetIndex,
int firstRow ) throws IOException, InvalidFormatException
{
ArrayList<TWrTelsalerRecord> records = new ArrayList<>( 200 );
Workbook wb = null;
Sheet sheet = null;
try
{
wb = WorkbookFactory.create( new File( filePath ) );
sheet = wb.getSheetAt( sheetIndex );
// 先验证格式,不对就抛出错误
if ( !checkExcelFormat( sheet, null, 0, TwrTelsalerListExcelTitle, 0 ) )
{
throw new InvalidFormatException( "Excel文件格式错误请检查报表内容" );
}
for ( Row row : sheet )
{
int rowIndex = row.getRowNum();
// 从数据行开始
if ( row.getRowNum() < firstRow )
{
continue;
}
try
{
String 人员姓名 = MyPOIUtils.getStringCellValue( row, 0 );
String 人员工号 = MyPOIUtils.getStringCellValue( row, 1 );
String 籍贯 = MyPOIUtils.getStringCellValue( row, 2 );
String 参加工作时间 = MyPOIUtils.getStringCellValue( row, 3 );
String 入职日期 = MyPOIUtils.getStringCellValue( row, 4 );
String 入司日期 = MyPOIUtils.getStringCellValue( row, 5 );
String 业务类型 = MyPOIUtils.getStringCellValue( row, 6 );
String 办公地省 = MyPOIUtils.getStringCellValue( row, 7 );
String 办公地市 = MyPOIUtils.getStringCellValue( row, 8 );
String 人员类别 = MyPOIUtils.getStringCellValue( row, 9 );
String 现任岗位 = MyPOIUtils.getStringCellValue( row, 10 );
String 现任职级 = MyPOIUtils.getStringCellValue( row, 11 );
String 机构名称 = MyPOIUtils.getStringCellValue( row, 12 );
String 职场分类 = MyPOIUtils.getStringCellValue( row, 13 );
String 片区名称 = MyPOIUtils.getStringCellValue( row, 14 );
String 团队名称 = MyPOIUtils.getStringCellValue( row, 15 );
String 对口分公司 = MyPOIUtils.getStringCellValue( row, 16 );
String 展业地区 = MyPOIUtils.getStringCellValue( row, 17 );
String 招聘渠道 = MyPOIUtils.getStringCellValue( row, 18 );
String 渠道明细 = MyPOIUtils.getStringCellValue( row, 19 );
String 全日制最高学历 = MyPOIUtils.getStringCellValue( row, 20 );
String 学历类型 = MyPOIUtils.getStringCellValue( row, 21 );
String 用工性质名称 = MyPOIUtils.getStringCellValue( row, 22 );
String 合同种类 = MyPOIUtils.getStringCellValue( row, 23 );
String 合同类型 = MyPOIUtils.getStringCellValue( row, 24 );
String 合同性质 = MyPOIUtils.getStringCellValue( row, 25 );
int 合同签订次数 = (int)MyPOIUtils.getNumbericCellValue( row, 26 );
String 合同生效日期 = MyPOIUtils.getStringCellValue( row, 27 );
String 合同到期日期 = MyPOIUtils.getStringCellValue( row, 28 );
String 人员属性 = MyPOIUtils.getStringCellValue( row, 29 );
String 保代员工号 = MyPOIUtils.getStringCellValue( row, 30 );
String 职场属性 = MyPOIUtils.getStringCellValue( row, 31 );
String 办公性质 = MyPOIUtils.getStringCellValue( row, 32 );
String 保代人员属性 = MyPOIUtils.getStringCellValue( row, 33 );
String 人员状态 = MyPOIUtils.getStringCellValue( row, 34 );
TWrTelsalerRecord record = new TWrTelsalerRecord(人员姓名, 人员工号, 籍贯, 参加工作时间, 入职日期, 入司日期, 业务类型, 办公地省, 办公地市, 人员类别, 现任岗位, 现任职级, 机构名称, 职场分类, 片区名称, 团队名称, 对口分公司, 展业地区, 招聘渠道, 渠道明细, 全日制最高学历, 学历类型, 用工性质名称, 合同种类, 合同类型, 合同性质, 合同签订次数, 合同生效日期, 合同到期日期, 人员属性, 保代员工号, 职场属性, 办公性质, 保代人员属性, 人员状态);
records.add(record);
}
catch ( IllegalStateException error )
{
error.printStackTrace();
}
catch ( NumberFormatException error )
{
error.printStackTrace();
}
catch ( NullPointerException error )
{
String message = "" + String.valueOf( rowIndex ) + "行出现NullPointerException异常";
logger.error( message, error );
}
}
}
finally
{
try
{
if ( wb != null )
{
wb.close();
}
}
catch ( IOException error )
{
error.printStackTrace();
}
}
return records;
}
private static boolean checkExcelFormat( Sheet sheet, String caption, int captionRowIndex,
String[] title, int titleRowIndex )
{
boolean result = true;
Row captionRow = sheet.getRow( captionRowIndex );
Row titleRow = sheet.getRow( titleRowIndex );
if ( caption != null && !caption.isEmpty() )
{
try
{
int captionCellNum = captionRow.getFirstCellNum();
String captionString = MyPOIUtils.getStringCellValue( captionRow, captionCellNum );
if ( !caption.equals( captionString ) )
{
result = false;
}
}
catch ( NullPointerException error )
{
result = false;
}
}
if ( title.length != 0 )
{
int cellIndex = 0;
try
{
for ( Cell cell : titleRow )
{
String cellString = MyPOIUtils.getStringCellValue( cell );
if ( !cellString.equals( title[cellIndex] ) )
{
result = false;
break;
}
cellIndex++;
}
}
catch ( NullPointerException error )
{
result = false;
}
}
return result;
}
}

View File

@@ -0,0 +1,64 @@
/*
* @Author: Kane
* @Date: 2023-10-07 23:17:13
* @LastEditors: Kane
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/utils/data/TelsalerData.java
* @Description: 电销坐席数据导入导出
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
*/
package com.cpic.xim.utils.data;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import com.cpic.xim.mybatis.pojo.TelsalerFromJYGL;
public class TelsalerData
{
/**
*
* @param filePath Xlsx文件路径。
* @return
*/
public static ArrayList<TelsalerFromJYGL> importTelsalersFromXlsx( String filePath )
{
ArrayList<TelsalerFromJYGL> telsalers = new ArrayList<>();
Workbook wb = null;
try
{
wb = WorkbookFactory.create( new File( filePath ) );
}
catch ( IOException error )
{
}
finally
{
try
{
if ( wb != null )
{
wb.close();
}
}
catch ( IOException error )
{
error.printStackTrace();
}
}
return telsalers;
}
public static int importTelsalers( ArrayList<TelsalerFromJYGL> telsalers )
{
int importedCount = 0;
return importedCount;
}
}

View File

@@ -0,0 +1,94 @@
/*
* @Author: Kane
* @Date: 2023-10-08 22:12:05
* @LastEditors: Kane
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/utils/poi/MyPOIUtils.java
* @Description: POI相关的工具
*
* Copyright (c) ${2023} by Kane, All Rights Reserved.
*/
package com.cpic.xim.utils.poi;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
public class MyPOIUtils
{
public static String getStringCellValue( Cell cell )
{
switch ( cell.getCellType())
{
case STRING:
return cell.getStringCellValue();
default:
return "";
}
}
public static String getStringCellValue( Row row, int columnIndex )
{
Cell cell = row.getCell( columnIndex, MissingCellPolicy.RETURN_NULL_AND_BLANK );
switch ( cell.getCellType())
{
case STRING:
return cell.getStringCellValue();
default:
return "";
}
}
public static double getNumbericCellValue( Cell cell )
{
double value = 0.0;
switch ( cell.getCellType())
{
case NUMERIC:
value = cell.getNumericCellValue();
break;
default:
value = 0.0;
break;
}
return value;
}
public static double getNumbericCellValue( Row row, int columnIndex )
{
double value = 0.0;
String strValue;
Cell cell = row.getCell( columnIndex, MissingCellPolicy.RETURN_NULL_AND_BLANK );
CellType type = cell.getCellType();
switch ( type )
{
case NUMERIC:
value = cell.getNumericCellValue();
break;
case STRING:
// 字符串类型,尝试转换成数字
strValue = cell.getStringCellValue();
try
{
value = Double.parseDouble( strValue );
}
// 任何异常都视为转换失败
catch ( Exception error )
{
value = 0.0;
}
break;
default:
value = 0.0;
break;
}
return value;
}
}

View File

@@ -0,0 +1,91 @@
/*
* @Author: Kane
* @Date: 2023-04-05 22:34:36
* @LastEditors: Kane
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/QueryResponse.java
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
package com.cpic.xim.web.controllers;
import com.fasterxml.jackson.annotation.JsonProperty;
public class QueryResponse
{
@JsonProperty( "success" )
private boolean success;
@JsonProperty( "message" )
private String message;
public QueryResponse( boolean success, String message )
{
this.success = success;
this.message = message;
}
public QueryResponse()
{
this.success = false;
this.message = "";
}
public boolean isSuccess()
{
return success;
}
public void setSuccess( boolean success )
{
this.success = success;
}
public String getMessage()
{
return message;
}
public void setMessage( String message )
{
this.message = message;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + (success ? 1231 : 1237);
result = prime * result + ((message == null) ? 0 : message.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;
QueryResponse other = (QueryResponse) obj;
if ( success != other.success )
return false;
if ( message == null )
{
if ( other.message != null )
return false;
}
else if ( !message.equals( other.message ) )
return false;
return true;
}
@Override
public String toString()
{
return "QueryResult [success=" + success + ", message=" + message + "]";
}
}

View File

@@ -1,74 +0,0 @@
/*
* @Author: Kane
* @Date: 2023-04-05 22:34:36
* @LastEditors: Kane
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/QueryResult.java
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
package com.cpic.xim.web.controllers;
import com.fasterxml.jackson.annotation.JsonProperty;
public class QueryResult {
public QueryResult(boolean success, String message) {
this.success = success;
this.message = message;
}
public QueryResult() {
this.success = false;
this.message = "";
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (success ? 1231 : 1237);
result = prime * result + ((message == null) ? 0 : message.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;
QueryResult other = (QueryResult) obj;
if (success != other.success) return false;
if (message == null) {
if (other.message != null) return false;
} else if (!message.equals(other.message)) return false;
return true;
}
@Override
public String toString() {
return "QueryResult [success=" + success + ", message=" + message + "]";
}
@JsonProperty("success")
private boolean success;
@JsonProperty("message")
private String message;
}

View File

@@ -73,7 +73,7 @@ public class StaffInfoQueryController
try
{
saler = TeleSalerInfo.queryTeleSalerInfo( telSaler.getTelSalerCode() );
saler = TeleSalerInfo.queryTeleSalerInfo( telSaler.getTelSaler() );
// 根据返回结果是否为 null判断是否查询到坐席信息
if ( saler != null )

Some files were not shown because too many files have changed in this diff Show More