Compare commits
	
		
			38 Commits
		
	
	
		
			fd59698264
			...
			feature-re
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 64824e6f74 | |||
| 099a1e65f6 | |||
| a9b30dd293 | |||
| f61f623f73 | |||
| b03056d783 | |||
| bcef8b4994 | |||
| b91c7d281e | |||
| 1d554056ac | |||
| 0d0b61db3c | |||
| 8fd5ee4904 | |||
| fa4f211ac2 | |||
| 992606d77a | |||
| 712aabfb99 | |||
| 9878abb946 | |||
| 7d0112b483 | |||
| 58f60b9eaf | |||
| 4cd800e62b | |||
| 4deed356f5 | |||
| 31d5e1622c | |||
| be5e426cee | |||
| 7ea11e34a9 | |||
| 2edd5f67db | |||
| efebd548c6 | |||
| 22157b11eb | |||
| bc7e56c336 | |||
| f54f6bbfea | |||
| 21a50f4c61 | |||
| 075da72a73 | |||
| ae68f047f4 | |||
| 7c5da24f5a | |||
| 4d03abde27 | |||
| 08ea359cd1 | |||
| 8e0505bd49 | |||
| a74e612546 | |||
| 42c2e8bdf7 | |||
| 83be988941 | |||
| 2a92179adf | |||
| 9976c852ba | 
@@ -159,7 +159,8 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS
 | 
			
		||||
                                'yyyy-mm-dd hh24:mi:ss');
 | 
			
		||||
    
 | 
			
		||||
        --<2D>ܳ<EFBFBD><DCB3>ձ<EFBFBD><D5B1><EFBFBD>
 | 
			
		||||
        SELECT round(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
 | 
			
		||||
@@ -167,7 +168,8 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS
 | 
			
		||||
           AND cf.<2E><><EFBFBD><EFBFBD> = l_this_year;
 | 
			
		||||
    
 | 
			
		||||
        --<2D><><EFBFBD><CDB8>
 | 
			
		||||
        SELECT decode(SUM(cf.<2E><><EFBFBD>ո<EFBFBD><D5B8>˿ͻ<CBBF><CDBB><EFBFBD><EFBFBD><EFBFBD>),
 | 
			
		||||
        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,
 | 
			
		||||
@@ -179,7 +181,8 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS
 | 
			
		||||
           AND cf.<2E>·<EFBFBD> = l_this_month;
 | 
			
		||||
    
 | 
			
		||||
        --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
        SELECT decode(SUM(xb.<2E><><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,
 | 
			
		||||
@@ -191,7 +194,7 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS
 | 
			
		||||
        --ÿ<><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,
 | 
			
		||||
                   ROUND(NVL(SUM(CF.<2E><><EFBFBD>ո<EFBFBD><D5B8>˿ͻ<CBBF><CDBB><EFBFBD><EFBFBD><EFBFBD> + CF.<2E><><EFBFBD><EFBFBD><EFBFBD>ںϱ<DABA><CFB1><EFBFBD>),
 | 
			
		||||
                             0),
 | 
			
		||||
                         0) BF
 | 
			
		||||
              FROM <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD>ÿ<EFBFBD>ձ<EFBFBD><D5B1><EFBFBD> CF
 | 
			
		||||
@@ -199,9 +202,7 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS
 | 
			
		||||
               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,7 +237,8 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS
 | 
			
		||||
                   <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD>   AS CALLER_NAME,
 | 
			
		||||
                   <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8> AS ATTACHING_RATE
 | 
			
		||||
              FROM (SELECT <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD>,
 | 
			
		||||
                           ROUND(DECODE(SUM(<28><><EFBFBD>ո<EFBFBD><D5B8>˿ͻ<CBBF><CDBB><EFBFBD><EFBFBD><EFBFBD>),
 | 
			
		||||
                           ROUND(DECODE(nvl(SUM(<28><><EFBFBD>ո<EFBFBD><D5B8>˿ͻ<CBBF><CDBB><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),
 | 
			
		||||
@@ -253,9 +255,12 @@ CREATE OR REPLACE PACKAGE BODY TELSALE_ARCHIEVEMENT_PKG IS
 | 
			
		||||
                   <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD> AS CALLER_NAME,
 | 
			
		||||
                   <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>   AS RENEWAL_RATE
 | 
			
		||||
              FROM (SELECT <20><>ϯ<EFBFBD><CFAF><EFBFBD><EFBFBD>,
 | 
			
		||||
                           ROUND(NVL((SUM(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>) / SUM(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)) * 100,
 | 
			
		||||
                           decode(nvl(SUM(xb.<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>),
 | 
			
		||||
                                      0),
 | 
			
		||||
                                 2) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
                                  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>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										99
									
								
								code/db/pkg/telsaler_reward_pkg.pck
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								code/db/pkg/telsaler_reward_pkg.pck
									
									
									
									
									
										Normal 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/建表/坐席奖励表.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								code/db/建表/坐席奖励表.sql
									
									
									
									
									
										Normal 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;
 | 
			
		||||
							
								
								
									
										259
									
								
								code/db/车非补充部分.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										259
									
								
								code/db/车非补充部分.txt
									
									
									
									
									
										Normal 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.坐席工号= nvl(zx.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 nvl(zx.workerno,et.telpartnercode) = 'DX001' and x.staff_name like '%建发凯迪%' then '林伟华'
 | 
			
		||||
when nvl(zx.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) 坐席名称
 | 
			
		||||
,nvl(zx.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.坐席工号= nvl(zx.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 nvl(zx.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.坐席工号= nvl(zx.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 nvl(zx.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.坐席工号= nvl(zx.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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -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,7 @@ module.exports = {
 | 
			
		||||
                "vue/html-indent": ["error", 4,],
 | 
			
		||||
                // typescript
 | 
			
		||||
                "@typescript-eslint/indent": ["warn", 4,],
 | 
			
		||||
                "@typescript-eslint/no-explicit-any": "warn",
 | 
			
		||||
                "@typescript-eslint/no-extra-semi": "off",
 | 
			
		||||
                "@typescript-eslint/no-inferrable-types": "off",
 | 
			
		||||
                "@typescript-eslint/no-unused-vars": "warn",
 | 
			
		||||
@@ -157,7 +158,7 @@ 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/indent": ["error", 4,],
 | 
			
		||||
                "@typescript-eslint/no-extra-semi": "off",
 | 
			
		||||
                "@typescript-eslint/no-inferrable-types": "off",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3887
									
								
								code/web/task_schedule/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										3887
									
								
								code/web/task_schedule/package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -9,31 +9,32 @@
 | 
			
		||||
        "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",
 | 
			
		||||
        "axios": "^1.4.0",
 | 
			
		||||
        "babel": "^6.23.0",
 | 
			
		||||
        "echarts": "^5.4.3",
 | 
			
		||||
        "element-plus": "^2.3.10",
 | 
			
		||||
        "element-plus": "^2.3.14",
 | 
			
		||||
        "mitt": "^3.0.1",
 | 
			
		||||
        "moment": "^2.29.4",
 | 
			
		||||
        "sass-loader": "^13.3.2",
 | 
			
		||||
        "vue": "^3.3.4",
 | 
			
		||||
        "vue-router": "^4.2.4",
 | 
			
		||||
        "vue-router": "^4.2.5",
 | 
			
		||||
        "vuex": "^4.1.0"
 | 
			
		||||
    },
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@babel/eslint-parser": "^7.22.11",
 | 
			
		||||
        "@typescript-eslint/eslint-plugin": "^6.4.1",
 | 
			
		||||
        "@vitejs/plugin-vue": "^4.3.3",
 | 
			
		||||
        "@babel/eslint-parser": "^7.22.15",
 | 
			
		||||
        "@rushstack/eslint-patch": "^1.4.0",
 | 
			
		||||
        "@typescript-eslint/eslint-plugin": "^6.7.2",
 | 
			
		||||
        "@vitejs/plugin-vue": "^4.3.4",
 | 
			
		||||
        "@vue/cli-plugin-eslint": "^5.0.8",
 | 
			
		||||
        "@vue/eslint-config-typescript": "^12.0.0",
 | 
			
		||||
        "axios": "^1.5.0",
 | 
			
		||||
        "babel": "^6.23.0",
 | 
			
		||||
        "eslint-config-recommended": "^4.1.0",
 | 
			
		||||
        "eslint-config-standard-with-typescript": "^38.0.0",
 | 
			
		||||
        "eslint-config-standard-with-typescript": "^39.1.0",
 | 
			
		||||
        "eslint-plugin-vue": "^9.17.0",
 | 
			
		||||
        "node-sass": "^9.0.0",
 | 
			
		||||
        "sass": "^1.66.1",
 | 
			
		||||
        "sass": "^1.68.0",
 | 
			
		||||
        "style-loader": "^3.3.3",
 | 
			
		||||
        "ts-node": "^10.9.1",
 | 
			
		||||
        "vue-eslint-parser": "^9.3.1"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -32,9 +32,8 @@ export default {
 | 
			
		||||
            mensualList: [],
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
        // 设置图表
 | 
			
		||||
        const initCharts = () =>
 | 
			
		||||
        const initCharts = (): void =>
 | 
			
		||||
        {
 | 
			
		||||
            console.log( "每月业绩", props.chartData );
 | 
			
		||||
            const chartDom = document.getElementById( "chartWrapper" );
 | 
			
		||||
@@ -56,7 +55,7 @@ export default {
 | 
			
		||||
                ],
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            option && myChart.setOption( option );
 | 
			
		||||
            myChart.setOption( option );
 | 
			
		||||
 | 
			
		||||
            window.onresize = function ()
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
@@ -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 }} 万元</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>
 | 
			
		||||
@@ -15,7 +15,7 @@
 | 
			
		||||
                alt=""
 | 
			
		||||
            >
 | 
			
		||||
            <div class="title-wrapper">
 | 
			
		||||
                <span>"消7灭6"突围战</span>
 | 
			
		||||
                <span>"消8灭70"突围战</span>
 | 
			
		||||
                <span>{{ props.month }}月入营坐席</span>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -103,7 +103,7 @@ export default {
 | 
			
		||||
    // border: 1px solid red;
 | 
			
		||||
    border-radius: 5px;
 | 
			
		||||
    width: 300px;
 | 
			
		||||
    height: 250px;
 | 
			
		||||
    height: 260px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.rankinglist-index {
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
        <span class="company-name">CPIC</span>
 | 
			
		||||
        <div class="version-wrapper">
 | 
			
		||||
            <span>桌面霸屏后台管理</span>
 | 
			
		||||
            <span>Build-202303251257</span>
 | 
			
		||||
            <span>Build-20230915</span>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="buttons-wrapper">
 | 
			
		||||
            <component
 | 
			
		||||
@@ -46,11 +46,12 @@ export default {
 | 
			
		||||
                    type: "warning",
 | 
			
		||||
                }
 | 
			
		||||
            )
 | 
			
		||||
                .then(() =>
 | 
			
		||||
                .then((): void =>
 | 
			
		||||
                {
 | 
			
		||||
                    // debugger;
 | 
			
		||||
                    logout();
 | 
			
		||||
                });
 | 
			
		||||
                })
 | 
			
		||||
                .catch((): void => {});
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        return { Logout, };
 | 
			
		||||
 
 | 
			
		||||
@@ -71,14 +71,23 @@ const routes = [
 | 
			
		||||
                component: ()=> import( "../views/StaffManagement.vue" ),
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                path:"/archievement_data",
 | 
			
		||||
                name:"ArchievementDataManagement",
 | 
			
		||||
                path: "/data_management",
 | 
			
		||||
                name: "DataManagement",
 | 
			
		||||
                meta: {
 | 
			
		||||
                    title: "数据管理",
 | 
			
		||||
                    icon: "document",
 | 
			
		||||
                },
 | 
			
		||||
                component: ()=> import( "../views/DataManagement.vue" ), 
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                path:"/reward_management",
 | 
			
		||||
                name:"RewardManagement",
 | 
			
		||||
                meta: {
 | 
			
		||||
                    title:"奖励管理",
 | 
			
		||||
                    icon: "document",
 | 
			
		||||
                },
 | 
			
		||||
                component: ()=> import( "../views/RewardManagement.vue" ),
 | 
			
		||||
            },
 | 
			
		||||
        ],
 | 
			
		||||
    },
 | 
			
		||||
];
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,11 @@
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { testRankingListRequest } from "./testRankingListRequest.js";
 | 
			
		||||
// import { testRankingListRequest } from "./testRankingListRequest.js";
 | 
			
		||||
 | 
			
		||||
testRankingListRequest();
 | 
			
		||||
// testRankingListRequest();
 | 
			
		||||
 | 
			
		||||
const arr: string[] = [];
 | 
			
		||||
 | 
			
		||||
console.log( "test" );
 | 
			
		||||
console.log( "检查instanceof:", arr instanceof String );
 | 
			
		||||
 
 | 
			
		||||
@@ -14,13 +14,12 @@
 | 
			
		||||
        "target": "ESNext",
 | 
			
		||||
        "module": "ESNext",
 | 
			
		||||
        // "module": "CommonJS",
 | 
			
		||||
        // "moduleResolution": "node",
 | 
			
		||||
        "moduleResolution": "node",
 | 
			
		||||
        "strict": true,
 | 
			
		||||
        "jsx": "preserve",
 | 
			
		||||
        "sourceMap": true,
 | 
			
		||||
        "resolveJsonModule": true,
 | 
			
		||||
        "esModuleInterop": false,
 | 
			
		||||
        "esModuleInterop": true,
 | 
			
		||||
        "baseUrl": "./", // paths 路径解析起点
 | 
			
		||||
        "paths": { // 别名路径设置
 | 
			
		||||
            "@/*": [
 | 
			
		||||
@@ -46,5 +45,8 @@
 | 
			
		||||
    ],
 | 
			
		||||
    "exclude": [
 | 
			
		||||
        "./node_modules",
 | 
			
		||||
    ]
 | 
			
		||||
    ],
 | 
			
		||||
    "ts-node": {
 | 
			
		||||
        "esm": true
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										12
									
								
								code/web/task_schedule/src/utils/api/EventBus.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								code/web/task_schedule/src/utils/api/EventBus.ts
									
									
									
									
									
										Normal 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();
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved.
 | 
			
		||||
 */
 | 
			
		||||
export const API_URL = {
 | 
			
		||||
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",
 | 
			
		||||
@@ -24,4 +24,27 @@ export const API_URL = {
 | 
			
		||||
    // 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_CALLER_ARCHIEVEMENT: "http://222.76.244.118:11101/desktop_archievement_backend/archievement/query_caller_archievement.do",
 | 
			
		||||
    URL_CALLER_ARCHIEVEMENT: "http://10.39.0.41:8081/desktop_archievement_backend/archievement/query_caller_archievement.do",
 | 
			
		||||
 | 
			
		||||
    /** 奖项相关 **/
 | 
			
		||||
    // 查询奖励项目
 | 
			
		||||
    // URL_RWARD_PROJECTS: "http://222.76.244.118:11101/desktop_archievement_backend/rewards/query_reward_projects.do",
 | 
			
		||||
    URL_RWARD_PROJECTS: "http://10.39.0.41:8081/desktop_archievement_backend/rewards/query_reward_projects.do",
 | 
			
		||||
    // 查询获奖人员
 | 
			
		||||
    URL_REWARD_GAINERS: "http://10.39.0.41:8081/desktop_archievement_backend/rewards/query_reward_gainers.do",
 | 
			
		||||
    // URL_REWARD_GAINERS: "http://222.76.244.118:11101/desktop_archievement_backend/rewards/query_reward_gainers.do",
 | 
			
		||||
    // 添加获奖人员
 | 
			
		||||
    URL_ADD_REWARD_TELSALER: "http://10.39.0.41:8081/desktop_archievement_backend/rewards/add_telsaler_reward.do",
 | 
			
		||||
    // URL_ADD_REWARD_TELSALER: "http://222.76.244.118:11101/desktop_archievement_backend/rewards/add_telsaler_reward.do",
 | 
			
		||||
    // 更新获奖人员
 | 
			
		||||
    URL_UPDATE_REWARD_TELSALER: "http://10.39.0.41:8081/desktop_archievement_backend/rewards/update_telsaler_reward.do",
 | 
			
		||||
    // URL_ADD_REWARD_TELSALER: "http://222.76.244.118:11101/desktop_archievement_backend/rewards/update_telsaler_reward.do",
 | 
			
		||||
    // 删除获奖人员
 | 
			
		||||
    URL_DEL_REWARD_TELSALER: "http://10.39.0.41:8081/desktop_archievement_backend/rewards/delete_telsaler_reward.do",
 | 
			
		||||
    // URL_ADD_REWARD_TELSALER: "http://222.76.244.118:11101/desktop_archievement_backend/rewards/delete_telsaler_reward.do",
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export { API_URL };
 | 
			
		||||
 
 | 
			
		||||
@@ -3,16 +3,17 @@
 | 
			
		||||
 * @Date: 2023-03-17 15:17:44
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /task_schedule/src/utils/archievement.ts
 | 
			
		||||
 * @Description: 请求业绩数据
 | 
			
		||||
 * @Description: 请求业绩数据相关的方法。
 | 
			
		||||
 *
 | 
			
		||||
 * 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 AxiosResponse } from "axios";
 | 
			
		||||
import { type Department } from "../types/cpicxim/Department.js";
 | 
			
		||||
import { type TelSaler } from "../types/cpicxim/TelSaler.js";
 | 
			
		||||
import { type AxiosResponse } from "axios";
 | 
			
		||||
 | 
			
		||||
interface Archievement
 | 
			
		||||
interface DepartmentArchievement // 定义业绩对象的结构
 | 
			
		||||
{
 | 
			
		||||
    success: boolean;
 | 
			
		||||
    message: string;
 | 
			
		||||
@@ -25,20 +26,31 @@ interface Archievement
 | 
			
		||||
    backward_list: string[];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface CallerArchievement // 坐席业绩对象
 | 
			
		||||
{
 | 
			
		||||
    success: boolean;
 | 
			
		||||
    message: string;
 | 
			
		||||
    total_archievement: number;
 | 
			
		||||
    mensual_archievement_list: number[];
 | 
			
		||||
    insurance_renewal_rate: string;
 | 
			
		||||
    attaching_rate: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface MenusalArchievementItem // 每月业绩清单的项目
 | 
			
		||||
{
 | 
			
		||||
    month: number;
 | 
			
		||||
    premium: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 获取部门业绩数据,并调用回调函数进行渲染。
 | 
			
		||||
 * @param render 用于给组件更新数据的回调函数
 | 
			
		||||
 * @param departmentInfo 作为请求参数的部门参数对象
 | 
			
		||||
 * @param render 用于给组件更新数据的回调函数,用DepartmentArchievement对象调用;
 | 
			
		||||
 */
 | 
			
		||||
function queryDepartmentArchievement( departmentInfo: Department, render: any ): void
 | 
			
		||||
{
 | 
			
		||||
    instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: API_URL.URL_DEPARTMENT_ARCHIEVEMENT,
 | 
			
		||||
        data: departmentInfo,
 | 
			
		||||
    })
 | 
			
		||||
        .then(( response ) =>
 | 
			
		||||
        {
 | 
			
		||||
            const archievement: Archievement = {
 | 
			
		||||
    // 默认的部门业绩对象
 | 
			
		||||
    const archievement: DepartmentArchievement = {
 | 
			
		||||
        success: false,
 | 
			
		||||
        message: "",
 | 
			
		||||
        total_archievement: 0,
 | 
			
		||||
@@ -50,12 +62,19 @@ function queryDepartmentArchievement( departmentInfo: Department, render: any ):
 | 
			
		||||
        backward_list: [],
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: API_URL.URL_DEPARTMENT_ARCHIEVEMENT,
 | 
			
		||||
        data: departmentInfo,
 | 
			
		||||
    })
 | 
			
		||||
        // 请求结束,将请求的结果写入业绩对象,然后调用功能渲染函数。
 | 
			
		||||
        .then(( response ) =>
 | 
			
		||||
        {
 | 
			
		||||
            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.attaching_rate = data.attaching_rate ?? "0.0";
 | 
			
		||||
@@ -72,13 +91,158 @@ function queryDepartmentArchievement( departmentInfo: Department, render: any ):
 | 
			
		||||
 | 
			
		||||
            console.log( "每月业绩", 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}` );
 | 
			
		||||
        });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export { queryDepartmentArchievement, type Archievement };
 | 
			
		||||
/**
 | 
			
		||||
 * 查询坐席的业绩,并调用渲染函数.
 | 
			
		||||
 * 1、请求坐席业绩的数据
 | 
			
		||||
 * 2、对每月业绩清单进行检查,如果有缺少则用0代替,检查的结果是12个月的清单,让调用者自己截断;
 | 
			
		||||
 * 3、将检查后的清单,写入到业绩对象中,只写金额;
 | 
			
		||||
 * 4、即使请求失败,也将失败的message写入业绩对象,调用渲染函数;
 | 
			
		||||
 * @param callerInfo 坐席的信息参数,用于请求业绩;
 | 
			
		||||
 * @param render 渲染函数,用业绩对象CallerArchievement作为参数;
 | 
			
		||||
 */
 | 
			
		||||
function queryCallerArchievement( callerInfo: TelSaler, render: any ): void
 | 
			
		||||
{
 | 
			
		||||
    const caller = {
 | 
			
		||||
        callerCode: callerInfo.telSalerCode,
 | 
			
		||||
        callName: callerInfo.telSalerName,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // 默认的业绩对象
 | 
			
		||||
    const callArchievement: CallerArchievement = {
 | 
			
		||||
        success: false,
 | 
			
		||||
        message: "",
 | 
			
		||||
        total_archievement: 0,
 | 
			
		||||
        mensual_archievement_list: [],
 | 
			
		||||
        insurance_renewal_rate: "0.0",
 | 
			
		||||
        attaching_rate: "0.0",
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // 发送请求
 | 
			
		||||
    instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: API_URL.URL_CALLER_ARCHIEVEMENT,
 | 
			
		||||
        data: caller,
 | 
			
		||||
    })
 | 
			
		||||
        // 请求完成时
 | 
			
		||||
        .then(( response: AxiosResponse<any, any> ) =>
 | 
			
		||||
        {
 | 
			
		||||
            const data = response.data ?? {};
 | 
			
		||||
 | 
			
		||||
            callArchievement.success = data.success ?? false;
 | 
			
		||||
            callArchievement.message = data.message ?? "服务器没有返回调用结果消息,请检查日志!";
 | 
			
		||||
            callArchievement.total_archievement = data.total_archievement ?? 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 );
 | 
			
		||||
 | 
			
		||||
            // 排序一下
 | 
			
		||||
            checkedList.sort(( a: MenusalArchievementItem, b: MenusalArchievementItem ): number =>
 | 
			
		||||
            {
 | 
			
		||||
                return a.month - b.month;
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            // 将排序后的每月业绩写到业绩对象中
 | 
			
		||||
            checkedList.forEach(( item: MenusalArchievementItem ): void =>
 | 
			
		||||
            {
 | 
			
		||||
                const premium = Number( item.premium );
 | 
			
		||||
 | 
			
		||||
                callArchievement.mensual_archievement_list.push( premium );
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            // 调用渲染函数
 | 
			
		||||
            if ( render !== undefined )
 | 
			
		||||
            {
 | 
			
		||||
                render( callArchievement );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            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}` );
 | 
			
		||||
        });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 检查服务器返回的每月业绩数组,检查是否有缺漏,缺少的月份业绩用0代替。
 | 
			
		||||
 * 检查的结果是12个月的清单,由调用者自己进行截断。
 | 
			
		||||
 * @param mensualArchievementList MenusalArchievementItem类型的数组,为业绩清单
 | 
			
		||||
 * @returns 返回MenusalArchievementItem数组,为检查过的清单
 | 
			
		||||
 */
 | 
			
		||||
function checkMensualArchievement( mensualArchievementList: MenusalArchievementItem[]): MenusalArchievementItem[]
 | 
			
		||||
{
 | 
			
		||||
    const checkedList: MenusalArchievementItem[] = [];
 | 
			
		||||
    const itemMap = new Map();
 | 
			
		||||
 | 
			
		||||
    itemMap.set( 1, "0" );
 | 
			
		||||
    itemMap.set( 2, "0" );
 | 
			
		||||
    itemMap.set( 3, "0" );
 | 
			
		||||
    itemMap.set( 4, "0" );
 | 
			
		||||
    itemMap.set( 5, "0" );
 | 
			
		||||
    itemMap.set( 6, "0" );
 | 
			
		||||
    itemMap.set( 7, "0" );
 | 
			
		||||
    itemMap.set( 8, "0" );
 | 
			
		||||
    itemMap.set( 9, "0" );
 | 
			
		||||
    itemMap.set( 10, "0" );
 | 
			
		||||
    itemMap.set( 11, "0" );
 | 
			
		||||
    itemMap.set( 12, "0" );
 | 
			
		||||
 | 
			
		||||
    mensualArchievementList.forEach(( item: MenusalArchievementItem ): void =>
 | 
			
		||||
    {
 | 
			
		||||
        itemMap.set( item.month, item.premium );
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    itemMap.forEach(( value, key, map ) =>
 | 
			
		||||
    {
 | 
			
		||||
        const item: MenusalArchievementItem = {
 | 
			
		||||
            month: key,
 | 
			
		||||
            premium: value,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        checkedList.push( item );
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    return checkedList;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
    queryDepartmentArchievement,
 | 
			
		||||
    queryCallerArchievement,
 | 
			
		||||
    type DepartmentArchievement,
 | 
			
		||||
    type CallerArchievement
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -32,6 +32,9 @@ interface RankingListResponse
 | 
			
		||||
    renewalRateRankingList: RankingListItem[];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 判断用的正则表达式
 | 
			
		||||
const regexMonth = "(0[1-9])|(1[0-2])";
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 请求坐席排行榜。
 | 
			
		||||
 * @param reqParam 请求参数
 | 
			
		||||
@@ -53,6 +56,9 @@ function requestRankingList( reqParam: RankingListRequest, rander: any ): void /
 | 
			
		||||
        renewalRateRankingList: [],
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // 检查请求参数
 | 
			
		||||
    // TODO: 这里要加一个对month的正则表达式验证。
 | 
			
		||||
 | 
			
		||||
    instance.request(
 | 
			
		||||
        {
 | 
			
		||||
            method: "post",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										346
									
								
								code/web/task_schedule/src/utils/reward.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										346
									
								
								code/web/task_schedule/src/utils/reward.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,346 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @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.js";
 | 
			
		||||
import { API_URL } from "./api/config.js";
 | 
			
		||||
 | 
			
		||||
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 ?? []);
 | 
			
		||||
 | 
			
		||||
            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 );
 | 
			
		||||
 | 
			
		||||
            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: "",
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    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
 | 
			
		||||
};
 | 
			
		||||
@@ -1,26 +1,40 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-03-23 16:05:08
 | 
			
		||||
 * @Date: 2023-09-25 09:48:25
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /task_schedule/src/views/DataManagemant.vue
 | 
			
		||||
 * @Description:
 | 
			
		||||
 * @FilePath: /task_schedule/src/views/DataManagement.vue
 | 
			
		||||
 * @Description: 数据管理view
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved.
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
    <div>
 | 
			
		||||
    <div class="data_management_wrapper">
 | 
			
		||||
        数据管理
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import { ref, reactive } from "vue";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
    name: "DataManagement",
 | 
			
		||||
    setup()
 | 
			
		||||
    {
 | 
			
		||||
        return {};
 | 
			
		||||
        const ui = reactive({
 | 
			
		||||
            showUI: false,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return { ui, };
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
<style lang="scss">
 | 
			
		||||
.data_management_wrapper {
 | 
			
		||||
    margin: 10px;
 | 
			
		||||
 | 
			
		||||
    min-width: 800px;
 | 
			
		||||
 | 
			
		||||
    >*+* {
 | 
			
		||||
        margin-top: 10px;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ export default {
 | 
			
		||||
{
 | 
			
		||||
    height: 2000px;
 | 
			
		||||
    width: 2000px;
 | 
			
		||||
    background-color: aquamarine;
 | 
			
		||||
    // background-color: aquamarine;
 | 
			
		||||
    padding: 0px;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -48,7 +48,12 @@
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="right-wrapper">
 | 
			
		||||
            <h1>本大爷</h1>
 | 
			
		||||
            <CallerArchievementComponent
 | 
			
		||||
                :caller-name="callerInfo.telSalerName"
 | 
			
		||||
                :this-month-premium="ui.callerPersentMonthPremium"
 | 
			
		||||
                :attaching-rate="ui.callerAttachingRate"
 | 
			
		||||
                :renewal-rate="ui.callerRenewalRate"
 | 
			
		||||
            />
 | 
			
		||||
            <div class="carousel-item">
 | 
			
		||||
                <el-carousel
 | 
			
		||||
                    arrow="never"
 | 
			
		||||
@@ -88,10 +93,12 @@ import { getCallerInfo } from "@/utils/api/localStorage.js";
 | 
			
		||||
import { ElMessage } from "element-plus";
 | 
			
		||||
import
 | 
			
		||||
{
 | 
			
		||||
    type Archievement,
 | 
			
		||||
    queryDepartmentArchievement
 | 
			
		||||
    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,
 | 
			
		||||
@@ -104,6 +111,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";
 | 
			
		||||
 | 
			
		||||
@@ -120,6 +128,9 @@ interface ui
 | 
			
		||||
    showUI: boolean; // 用来刷新页面的开关
 | 
			
		||||
    attachingRankingList: RankingListItem[]; // 坐席车非渗透率榜单
 | 
			
		||||
    renewalRankingList: RankingListItem[];
 | 
			
		||||
    callerAttachingRate: string;
 | 
			
		||||
    callerRenewalRate: string;
 | 
			
		||||
    callerPersentMonthPremium: number;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
@@ -130,10 +141,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 = [
 | 
			
		||||
            "一",
 | 
			
		||||
            "二",
 | 
			
		||||
@@ -162,10 +178,13 @@ export default {
 | 
			
		||||
            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",
 | 
			
		||||
@@ -177,13 +196,28 @@ export default {
 | 
			
		||||
            return archievement;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // 保存业绩数据
 | 
			
		||||
        const applyArchievementData = ( data: Archievement ) =>
 | 
			
		||||
        /**
 | 
			
		||||
         * 将请求函数获取的部门业绩数据,渲染到页面上。
 | 
			
		||||
         * @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.insurance_renewal_rate = data.insurance_renewal_rate;
 | 
			
		||||
            ui.leading_reward_gainers = data.leading_reward_gainers;
 | 
			
		||||
@@ -200,6 +234,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.mensual_archievement_list[thisMonth];
 | 
			
		||||
 | 
			
		||||
            // console.log( "业绩清单", ui.chartData );
 | 
			
		||||
            // console.log( "当月", data.mensual_archievement_list );
 | 
			
		||||
 | 
			
		||||
            ui.showUI = false;
 | 
			
		||||
            setTimeout(() =>
 | 
			
		||||
            {
 | 
			
		||||
                ui.showUI = true;
 | 
			
		||||
            }, 0 );
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        const applyRankingListData = ( data: RankingListResponse ): void =>
 | 
			
		||||
        {
 | 
			
		||||
            ui.attachingRankingList = data.attachingRateRankingList;
 | 
			
		||||
@@ -218,7 +286,7 @@ export default {
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        // 退出桌面霸屏
 | 
			
		||||
        const logoutDesktopArchievement = () =>
 | 
			
		||||
        const logoutDesktopArchievement = (): void =>
 | 
			
		||||
        {
 | 
			
		||||
            console.log( "111" );
 | 
			
		||||
            logout();
 | 
			
		||||
@@ -235,13 +303,13 @@ export default {
 | 
			
		||||
                center: true,
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            router.push( "/login" );
 | 
			
		||||
            router.push( "/login" ).then(() => {}).catch(() => {});
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * 刷新页面
 | 
			
		||||
         * 用于定时对页面进行刷新,其中会请求最新的业绩数据。
 | 
			
		||||
         */
 | 
			
		||||
        const refresh = () =>
 | 
			
		||||
        const refresh = (): void =>
 | 
			
		||||
        {
 | 
			
		||||
            const deparmentInfo: Department = {
 | 
			
		||||
                departmentCode: callerInfo.departmentCode,
 | 
			
		||||
@@ -250,11 +318,14 @@ export default {
 | 
			
		||||
 | 
			
		||||
            const rankinglistRequest: RankingListRequest = {
 | 
			
		||||
                departmentCode: callerInfo.departmentCode,
 | 
			
		||||
                year: "2023",
 | 
			
		||||
                month: "06",
 | 
			
		||||
                year: thisYearString,
 | 
			
		||||
                month: thisMonthString,
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            queryDepartmentArchievement( deparmentInfo, applyArchievementData );
 | 
			
		||||
            console.log( "refresh", rankinglistRequest );
 | 
			
		||||
 | 
			
		||||
            queryDepartmentArchievement( deparmentInfo, applyDepartmentArchievementData );
 | 
			
		||||
            queryCallerArchievement( callerInfo, applyCallerArchievementData );
 | 
			
		||||
            requestRankingList( rankinglistRequest, applyRankingListData );
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
@@ -283,7 +354,7 @@ export default {
 | 
			
		||||
            callerInfo,
 | 
			
		||||
            timerHandler,
 | 
			
		||||
            getTotalArchievement,
 | 
			
		||||
            renderData: applyArchievementData,
 | 
			
		||||
            renderData: applyDepartmentArchievementData,
 | 
			
		||||
            refresh,
 | 
			
		||||
            logoutDesktopArchievement,
 | 
			
		||||
        };
 | 
			
		||||
@@ -433,11 +504,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">
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
                        {
 | 
			
		||||
@@ -182,7 +182,7 @@ export default {
 | 
			
		||||
                        // debugger;
 | 
			
		||||
 | 
			
		||||
                        // 查看標志位
 | 
			
		||||
                        if ( data.success === true )
 | 
			
		||||
                        if ( data.success )
 | 
			
		||||
                        {
 | 
			
		||||
                            // 查询成功,显示一个提示,保存工号,并跳转路由
 | 
			
		||||
                            ElMessage({
 | 
			
		||||
@@ -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;
 | 
			
		||||
        };
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										391
									
								
								code/web/task_schedule/src/views/RewardManagement.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										391
									
								
								code/web/task_schedule/src/views/RewardManagement.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,391 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @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
 | 
			
		||||
            {
 | 
			
		||||
                ElMessage({
 | 
			
		||||
                    message: response.message,
 | 
			
		||||
                    type: "error",
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            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>
 | 
			
		||||
@@ -120,7 +120,7 @@ export default {
 | 
			
		||||
            callers: [],
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const onCurrentPageIndexChange = ( pageIndex: number ) =>
 | 
			
		||||
        const onCurrentPageIndexChange = ( pageIndex: number ): void =>
 | 
			
		||||
        {
 | 
			
		||||
            ui.table_current_page_index = pageIndex;
 | 
			
		||||
        };
 | 
			
		||||
@@ -129,7 +129,7 @@ export default {
 | 
			
		||||
         * 设置表格每页显示记录的数量
 | 
			
		||||
         * @param pageSize 表格页记录数量
 | 
			
		||||
         */
 | 
			
		||||
        const onTablePageSizeChange = ( pageSize: number ) =>
 | 
			
		||||
        const onTablePageSizeChange = ( pageSize: number ): void =>
 | 
			
		||||
        {
 | 
			
		||||
            ui.table_page_size = pageSize;
 | 
			
		||||
        };
 | 
			
		||||
@@ -188,4 +188,5 @@ export default {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: flex-end;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										249
									
								
								code/web/task_schedule/src/views/reward/RewardTelsaler.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										249
									
								
								code/web/task_schedule/src/views/reward/RewardTelsaler.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,249 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @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 RewardGainerResponse,
 | 
			
		||||
    type DeleteRewardTelsalerRequest,
 | 
			
		||||
    type DeleteRewardTelsalerResponse,
 | 
			
		||||
    type AddRewardTelsalerRequest,
 | 
			
		||||
    type AddRewardTelsalerResponse,
 | 
			
		||||
    type UpdateRewardTelsalerRequest,
 | 
			
		||||
    type UpdateRewardTelsalerResponse,
 | 
			
		||||
    requestRewardPorjectsList,
 | 
			
		||||
    addRewardTelsaler,
 | 
			
		||||
    updateTelsalerReward,
 | 
			
		||||
    deleteRewardTelsaler
 | 
			
		||||
} 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 => {});
 | 
			
		||||
 | 
			
		||||
                console.log( "请求奖励项目失败:", error );
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            console.log( "请求奖励项目结果", response.rewardList );
 | 
			
		||||
 | 
			
		||||
            ui.rewardProjectList = response.rewardList;
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        const refresh = (): void =>
 | 
			
		||||
        {
 | 
			
		||||
            requestRewardPorjectsList( applyRewardProjectsData );
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        onBeforeMount((): void =>
 | 
			
		||||
        {
 | 
			
		||||
            ui.selectedRewardProjectCode = props.selectedRewardProjectCode;
 | 
			
		||||
            ui.selectedRewardTelsalerName = props.selectedTelsalerName;
 | 
			
		||||
            ui.selectedRecID = props.selectedRecId;
 | 
			
		||||
 | 
			
		||||
            refresh();
 | 
			
		||||
 | 
			
		||||
            console.log( props.selectedRewardProjectCode );
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        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>
 | 
			
		||||
@@ -35,6 +35,7 @@
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    "include": [
 | 
			
		||||
        "src/**/*",
 | 
			
		||||
        "src/**/*.ts",
 | 
			
		||||
        "src/**/*.tsx",
 | 
			
		||||
        "src/**/*.vue",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "java.configuration.updateBuildConfiguration": "automatic",
 | 
			
		||||
    "java.compile.nullAnalysis.mode": "automatic",
 | 
			
		||||
    "vue.codeActions.enabled": false
 | 
			
		||||
    "vue.codeActions.enabled": false,
 | 
			
		||||
    "java.debug.settings.onBuildFailureProceed": true
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										6
									
								
								code/后端/desktop_archievement_backend/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								code/后端/desktop_archievement_backend/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "desktop_archievement_backend",
 | 
			
		||||
  "lockfileVersion": 3,
 | 
			
		||||
  "requires": true,
 | 
			
		||||
  "packages": {}
 | 
			
		||||
}
 | 
			
		||||
@@ -122,10 +122,19 @@
 | 
			
		||||
      <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>
 | 
			
		||||
 
 | 
			
		||||
@@ -14,4 +14,6 @@ import java.util.HashMap;
 | 
			
		||||
public interface ArchievementMapper
 | 
			
		||||
{
 | 
			
		||||
    public void getDepartmentArchievement( HashMap<String, Object> params );
 | 
			
		||||
 | 
			
		||||
    public void getCallerArchievement( HashMap<String, Object> params );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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 );
 | 
			
		||||
}
 | 
			
		||||
@@ -22,8 +22,6 @@ public class MensualArchievementItem
 | 
			
		||||
        this.premium = premium;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public int getMonth()
 | 
			
		||||
    {
 | 
			
		||||
        return month;
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
}
 | 
			
		||||
@@ -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;
 | 
			
		||||
}
 | 
			
		||||
@@ -28,8 +28,7 @@ public class MybatisUtils
 | 
			
		||||
     * @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 );
 | 
			
		||||
@@ -51,8 +50,7 @@ public class MybatisUtils
 | 
			
		||||
        return session;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static SqlSession getSqlSession()
 | 
			
		||||
    throws IOException
 | 
			
		||||
    public static SqlSession getSqlSession() throws IOException
 | 
			
		||||
    {
 | 
			
		||||
        // 根据配置文件的路径,查找是否已经创建了对应的session
 | 
			
		||||
        SqlSession session = SessionMap.get( DEFAULT_CONFIGFILE );
 | 
			
		||||
 
 | 
			
		||||
@@ -9,3 +9,199 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package com.cpic.xim.utils.archievement;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import org.apache.ibatis.session.SqlSession;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
import com.cpic.xim.mybatis.mapper.ArchievementMapper;
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.MensualArchievementItem;
 | 
			
		||||
import com.cpic.xim.mybatis.utils.MybatisUtils;
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonProperty;
 | 
			
		||||
 | 
			
		||||
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.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 = "";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static CallerArchievement getCallerArchievement( String callerCode ) throws IOException
 | 
			
		||||
    {
 | 
			
		||||
        CallerArchievement archievement = null;
 | 
			
		||||
 | 
			
		||||
        SqlSession session = MybatisUtils.getSqlSession();
 | 
			
		||||
        ArchievementMapper mapper = session.getMapper( ArchievementMapper.class );
 | 
			
		||||
        HashMap<String, Object> params = new HashMap<String, Object>();
 | 
			
		||||
        Integer totalArchievement = null;
 | 
			
		||||
        String attachingRate = null;
 | 
			
		||||
        String renewalRate = null;
 | 
			
		||||
        ArrayList<MensualArchievementItem> mensual = null;
 | 
			
		||||
 | 
			
		||||
        params.put( "a_caller_code", callerCode );
 | 
			
		||||
 | 
			
		||||
        mapper.getCallerArchievement( params );
 | 
			
		||||
 | 
			
		||||
        // 总业绩
 | 
			
		||||
        if ( params.get( "a_total" ) instanceof Integer )
 | 
			
		||||
        {
 | 
			
		||||
            totalArchievement = (Integer) params.get( "a_total" );
 | 
			
		||||
        } else
 | 
			
		||||
        {
 | 
			
		||||
            totalArchievement = Integer.valueOf( 0 );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 车非融合
 | 
			
		||||
        if ( params.get( "a_attaching_rate" ) instanceof String )
 | 
			
		||||
        {
 | 
			
		||||
            attachingRate = (String) params.get( "a_attaching_rate" );
 | 
			
		||||
        } else
 | 
			
		||||
        {
 | 
			
		||||
            attachingRate = "0.0";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 续保率
 | 
			
		||||
        if ( params.get( "a_renewal_rate" ) instanceof String )
 | 
			
		||||
        {
 | 
			
		||||
            renewalRate = (String) params.get( "a_renewal_rate" );
 | 
			
		||||
        } else
 | 
			
		||||
        {
 | 
			
		||||
            renewalRate = "0.0";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 处理每月业绩
 | 
			
		||||
        ArrayList<MensualArchievementItem> mensualList = new ArrayList<>(CallerArchievement.monthArray);
 | 
			
		||||
        // 数据库接收的每月业绩,要检查是否有缺漏
 | 
			
		||||
        mensual = (ArrayList<MensualArchievementItem>) params.get( "a_mensual_cur" );
 | 
			
		||||
 | 
			
		||||
        archievement = new CallerArchievement( callerCode, totalArchievement, mensual, renewalRate,
 | 
			
		||||
                attachingRate );
 | 
			
		||||
 | 
			
		||||
        return archievement;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Logger getLogger()
 | 
			
		||||
    {
 | 
			
		||||
        return logger;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void setLogger( Logger logger )
 | 
			
		||||
    {
 | 
			
		||||
        CallerArchievement.logger = logger;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getCallerCode()
 | 
			
		||||
    {
 | 
			
		||||
        return callerCode;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setCallerCode( String callerCode )
 | 
			
		||||
    {
 | 
			
		||||
        this.callerCode = callerCode;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public long getTotalArchievement()
 | 
			
		||||
    {
 | 
			
		||||
        return totalArchievement;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setTotalArchievement( long totalArchievement )
 | 
			
		||||
    {
 | 
			
		||||
        this.totalArchievement = totalArchievement;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ArrayList<MensualArchievementItem> getMensualArchievementList()
 | 
			
		||||
    {
 | 
			
		||||
        return mensualArchievementList;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setMensualArchievementList(
 | 
			
		||||
            ArrayList<MensualArchievementItem> mensualArchievementList )
 | 
			
		||||
    {
 | 
			
		||||
        this.mensualArchievementList = mensualArchievementList;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getInsuranceRenewalRate()
 | 
			
		||||
    {
 | 
			
		||||
        return insuranceRenewalRate;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setInsuranceRenewalRate( String insuranceRenewalRate )
 | 
			
		||||
    {
 | 
			
		||||
        this.insuranceRenewalRate = insuranceRenewalRate;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getAttachingRate()
 | 
			
		||||
    {
 | 
			
		||||
        return attachingRate;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAttachingRate( String attachingRate )
 | 
			
		||||
    {
 | 
			
		||||
        this.attachingRate = attachingRate;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "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; // 车非渗透率
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -11,14 +11,14 @@ package com.cpic.xim.web.controllers;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonProperty;
 | 
			
		||||
 | 
			
		||||
public class QueryResult {
 | 
			
		||||
public class QueryResponse {
 | 
			
		||||
 | 
			
		||||
    public QueryResult(boolean success, String message) {
 | 
			
		||||
    public QueryResponse(boolean success, String message) {
 | 
			
		||||
        this.success = success;
 | 
			
		||||
        this.message = message;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public QueryResult() {
 | 
			
		||||
    public QueryResponse() {
 | 
			
		||||
        this.success = false;
 | 
			
		||||
        this.message = "";
 | 
			
		||||
    }
 | 
			
		||||
@@ -53,7 +53,7 @@ public class QueryResult {
 | 
			
		||||
        if (this == obj) return true;
 | 
			
		||||
        if (obj == null) return false;
 | 
			
		||||
        if (getClass() != obj.getClass()) return false;
 | 
			
		||||
        QueryResult other = (QueryResult) obj;
 | 
			
		||||
        QueryResponse other = (QueryResponse) obj;
 | 
			
		||||
        if (success != other.success) return false;
 | 
			
		||||
        if (message == null) {
 | 
			
		||||
            if (other.message != null) return false;
 | 
			
		||||
@@ -9,10 +9,10 @@
 | 
			
		||||
 */
 | 
			
		||||
package com.cpic.xim.web.controllers.account;
 | 
			
		||||
 | 
			
		||||
import com.cpic.xim.web.controllers.QueryResult;
 | 
			
		||||
import com.cpic.xim.web.controllers.QueryResponse;
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonProperty;
 | 
			
		||||
 | 
			
		||||
public class TeleSalerQueryResult extends QueryResult
 | 
			
		||||
public class TeleSalerQueryResult extends QueryResponse
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    public TeleSalerQueryResult()
 | 
			
		||||
 
 | 
			
		||||
@@ -22,11 +22,16 @@ import org.springframework.web.bind.annotation.PostMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestBody;
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.ResponseBody;
 | 
			
		||||
import com.cpic.xim.utils.archievement.CallerArchievement;
 | 
			
		||||
import com.cpic.xim.utils.archievement.DepartmentArchievement;
 | 
			
		||||
import com.cpic.xim.utils.ranking.CallerRankingItem;
 | 
			
		||||
import com.cpic.xim.utils.ranking.CallerRankingList;
 | 
			
		||||
import com.cpic.xim.web.controllers.archievement.RankingList.RankingListRequest;
 | 
			
		||||
import com.cpic.xim.web.controllers.archievement.RankingList.RankingListResponse;
 | 
			
		||||
import com.cpic.xim.web.controllers.archievement.caller.CallerArchievementQueryRequest;
 | 
			
		||||
import com.cpic.xim.web.controllers.archievement.caller.CallerArchievementQueryResult;
 | 
			
		||||
import com.cpic.xim.web.controllers.archievement.department.DepartmentArchievementQueryRequest;
 | 
			
		||||
import com.cpic.xim.web.controllers.archievement.department.DepartmentArchievementQueryResult;
 | 
			
		||||
 | 
			
		||||
@Controller
 | 
			
		||||
@RequestMapping( "/archievement" )
 | 
			
		||||
@@ -38,11 +43,11 @@ public class ArchievementQueryController
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询坐席业绩
 | 
			
		||||
     */
 | 
			
		||||
    @PostMapping( "/query_caller_archievement.do" )
 | 
			
		||||
    public void queryCallerArchievement()
 | 
			
		||||
    {
 | 
			
		||||
    // @PostMapping( "/query_caller_archievement.do" )
 | 
			
		||||
    // public void queryCallerArchievement()
 | 
			
		||||
    // {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    // }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询部门业绩
 | 
			
		||||
@@ -60,8 +65,8 @@ public class ArchievementQueryController
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            // 查询业绩
 | 
			
		||||
            departmentArch = DepartmentArchievement
 | 
			
		||||
                    .getDepartmentArchievement( request.getDepartmentCode() );
 | 
			
		||||
            departmentArch =
 | 
			
		||||
                    DepartmentArchievement.getDepartmentArchievement( request.getDepartmentCode() );
 | 
			
		||||
 | 
			
		||||
            result.setTotalArchievement( departmentArch.getTotalArchievement() );
 | 
			
		||||
            result.setInsuranceRenewalRate( departmentArch.getInsuranceRenewalRate() );
 | 
			
		||||
@@ -83,6 +88,31 @@ public class ArchievementQueryController
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
    @PostMapping( "/query_caller_archievement.do" )
 | 
			
		||||
    public CallerArchievementQueryResult queryCallerArchievement(
 | 
			
		||||
            @RequestBody CallerArchievementQueryRequest request )
 | 
			
		||||
    {
 | 
			
		||||
        CallerArchievementQueryResult result = null;
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            CallerArchievement archievement =
 | 
			
		||||
                    CallerArchievement.getCallerArchievement( request.getCallerCode() );
 | 
			
		||||
 | 
			
		||||
            result = new CallerArchievementQueryResult( true, "查询成功", archievement.getCallerCode(),
 | 
			
		||||
                    request.getCallName(), archievement.getTotalArchievement(),
 | 
			
		||||
                    archievement.getMensualArchievementList(),
 | 
			
		||||
                    archievement.getInsuranceRenewalRate(), archievement.getAttachingRate() );
 | 
			
		||||
        }
 | 
			
		||||
        catch ( IOException error )
 | 
			
		||||
        {
 | 
			
		||||
            result = new CallerArchievementQueryResult(false, error.getMessage(), null, null, 0, null, null, null);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @RequestMapping( "/query_ranking_list.do" )
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
    public RankingListResponse queryCallerArchievementRankingList(
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +0,0 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
package com.cpic.xim.web.controllers.archievement;
 | 
			
		||||
 | 
			
		||||
public class CallerArchievementQueryResult
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -11,10 +11,10 @@ package com.cpic.xim.web.controllers.archievement.RankingList;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import com.cpic.xim.utils.ranking.CallerRankingItem;
 | 
			
		||||
import com.cpic.xim.web.controllers.QueryResult;
 | 
			
		||||
import com.cpic.xim.web.controllers.QueryResponse;
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonProperty;
 | 
			
		||||
 | 
			
		||||
public class RankingListResponse extends QueryResult
 | 
			
		||||
public class RankingListResponse extends QueryResponse
 | 
			
		||||
{
 | 
			
		||||
    public RankingListResponse()
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,43 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-08-26 13:20:32
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/caller/CallerArchievementQueryRequest.java
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
package com.cpic.xim.web.controllers.archievement.caller;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonProperty;
 | 
			
		||||
 | 
			
		||||
public class CallerArchievementQueryRequest 
 | 
			
		||||
{
 | 
			
		||||
    public CallerArchievementQueryRequest() {}
 | 
			
		||||
 | 
			
		||||
    public String getCallerCode()
 | 
			
		||||
    {
 | 
			
		||||
        return callerCode;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setCallerCode( String callerCode )
 | 
			
		||||
    {
 | 
			
		||||
        this.callerCode = callerCode;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getCallName()
 | 
			
		||||
    {
 | 
			
		||||
        return callName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setCallName( String callName )
 | 
			
		||||
    {
 | 
			
		||||
        this.callName = callName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JsonProperty("callerCode")
 | 
			
		||||
    private String callerCode;
 | 
			
		||||
 | 
			
		||||
    @JsonProperty("callerName")
 | 
			
		||||
    private String callName;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,123 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-06-06 17:35:54
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/caller/CallerArchievementQueryResult.java
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
package com.cpic.xim.web.controllers.archievement.caller;
 | 
			
		||||
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.MensualArchievementItem;
 | 
			
		||||
import com.cpic.xim.web.controllers.QueryResponse;
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonProperty;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
public class CallerArchievementQueryResult extends QueryResponse
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * 
 | 
			
		||||
     * @param success
 | 
			
		||||
     * @param message
 | 
			
		||||
     * @param callerCode
 | 
			
		||||
     * @param callerName
 | 
			
		||||
     * @param totalArchievement
 | 
			
		||||
     * @param mensualArchievementList
 | 
			
		||||
     * @param insuranceRenewalRate
 | 
			
		||||
     * @param attachingRate
 | 
			
		||||
     */
 | 
			
		||||
    public CallerArchievementQueryResult( boolean success, String message, String callerCode,
 | 
			
		||||
            String callerName, long totalArchievement,
 | 
			
		||||
            ArrayList<MensualArchievementItem> mensualArchievementList, String insuranceRenewalRate,
 | 
			
		||||
            String attachingRate)
 | 
			
		||||
    {
 | 
			
		||||
        super( success, message );
 | 
			
		||||
        this.callerCode = callerCode;
 | 
			
		||||
        this.callerName = callerName;
 | 
			
		||||
        this.totalArchievement = totalArchievement;
 | 
			
		||||
        this.mensualArchievementList = mensualArchievementList;
 | 
			
		||||
        this.insuranceRenewalRate = insuranceRenewalRate;
 | 
			
		||||
        this.attachingRate = attachingRate;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JsonProperty("callerCode")
 | 
			
		||||
    String callerCode;
 | 
			
		||||
 | 
			
		||||
    public String getCallerCode()
 | 
			
		||||
    {
 | 
			
		||||
        return callerCode;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setCallerCode( String callerCode )
 | 
			
		||||
    {
 | 
			
		||||
        this.callerCode = callerCode;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getCallerName()
 | 
			
		||||
    {
 | 
			
		||||
        return callerName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setCallerName( String callerName )
 | 
			
		||||
    {
 | 
			
		||||
        this.callerName = callerName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public long getTotalArchievement()
 | 
			
		||||
    {
 | 
			
		||||
        return totalArchievement;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setTotalArchievement( long totalArchievement )
 | 
			
		||||
    {
 | 
			
		||||
        this.totalArchievement = totalArchievement;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ArrayList<MensualArchievementItem> getMensualArchievementList()
 | 
			
		||||
    {
 | 
			
		||||
        return mensualArchievementList;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setMensualArchievementList( ArrayList<MensualArchievementItem> mensualArchievementList )
 | 
			
		||||
    {
 | 
			
		||||
        this.mensualArchievementList = mensualArchievementList;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getInsuranceRenewalRate()
 | 
			
		||||
    {
 | 
			
		||||
        return insuranceRenewalRate;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setInsuranceRenewalRate( String insuranceRenewalRate )
 | 
			
		||||
    {
 | 
			
		||||
        this.insuranceRenewalRate = insuranceRenewalRate;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getAttachingRate()
 | 
			
		||||
    {
 | 
			
		||||
        return attachingRate;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAttachingRate( String attachingRate )
 | 
			
		||||
    {
 | 
			
		||||
        this.attachingRate = attachingRate;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JsonProperty("callerName")
 | 
			
		||||
    String callerName;
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "total_archievement" )
 | 
			
		||||
    private long totalArchievement; // 总业绩
 | 
			
		||||
 | 
			
		||||
    // 每月业绩列表
 | 
			
		||||
    // 要保证数据是按照月份排序。
 | 
			
		||||
    @JsonProperty( "mensual_archievement_list" )
 | 
			
		||||
    private ArrayList<MensualArchievementItem> mensualArchievementList;
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "insurance_renewal_rate" )
 | 
			
		||||
    private String insuranceRenewalRate; // 续保率
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "attaching_rate" )
 | 
			
		||||
    private String attachingRate; // 车非渗透率
 | 
			
		||||
}
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package com.cpic.xim.web.controllers.archievement;
 | 
			
		||||
package com.cpic.xim.web.controllers.archievement.department;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonProperty;
 | 
			
		||||
 | 
			
		||||
@@ -2,28 +2,28 @@
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-03-16 09:32:53
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/DepartmentArchievementQueryResult.java
 | 
			
		||||
 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/archievement/department/DepartmentArchievementQueryResult.java
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package com.cpic.xim.web.controllers.archievement;
 | 
			
		||||
package com.cpic.xim.web.controllers.archievement.department;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Vector;
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.MensualArchievementItem;
 | 
			
		||||
import com.cpic.xim.web.controllers.QueryResult;
 | 
			
		||||
import com.cpic.xim.web.controllers.QueryResponse;
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonProperty;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 查询部门业绩返回结果。
 | 
			
		||||
 * MensualArchievementList 每月业绩,要保证数据是按照月份排序。
 | 
			
		||||
 */
 | 
			
		||||
public class DepartmentArchievementQueryResult extends QueryResult
 | 
			
		||||
public class DepartmentArchievementQueryResult extends QueryResponse
 | 
			
		||||
{
 | 
			
		||||
    DepartmentArchievementQueryResult()
 | 
			
		||||
    public DepartmentArchievementQueryResult()
 | 
			
		||||
    {
 | 
			
		||||
        mensualArchievementList = new ArrayList<MensualArchievementItem>();
 | 
			
		||||
        advanceRewardGainers = new Vector<String>();
 | 
			
		||||
@@ -46,7 +46,8 @@ public class DepartmentArchievementQueryResult extends QueryResult
 | 
			
		||||
        return mensualArchievementList;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setMensualArchievementList( ArrayList<MensualArchievementItem> mensualArchievementList )
 | 
			
		||||
    public void setMensualArchievementList(
 | 
			
		||||
            ArrayList<MensualArchievementItem> mensualArchievementList )
 | 
			
		||||
    {
 | 
			
		||||
        this.mensualArchievementList = mensualArchievementList;
 | 
			
		||||
    }
 | 
			
		||||
@@ -0,0 +1,91 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-09-21 11:35:57
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/rewards/AddTelsalerRequest.java
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
package com.cpic.xim.web.controllers.rewards;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonProperty;
 | 
			
		||||
 | 
			
		||||
public class AddTelsalerRequest
 | 
			
		||||
{
 | 
			
		||||
    public AddTelsalerRequest() {}
 | 
			
		||||
 | 
			
		||||
    public AddTelsalerRequest( String rewardIndex, String telsalerName )
 | 
			
		||||
    {
 | 
			
		||||
        this.rewardIndex = rewardIndex;
 | 
			
		||||
        this.telsalerName = telsalerName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getRewardIndex()
 | 
			
		||||
    {
 | 
			
		||||
        return rewardIndex;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRewardIndex( String rewardIndex )
 | 
			
		||||
    {
 | 
			
		||||
        this.rewardIndex = rewardIndex;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getTelsalerName()
 | 
			
		||||
    {
 | 
			
		||||
        return telsalerName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setTelsalerName( String telsalerName )
 | 
			
		||||
    {
 | 
			
		||||
        this.telsalerName = telsalerName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString()
 | 
			
		||||
    {
 | 
			
		||||
        return "AddTelsalerRequest [rewardIndex=" + rewardIndex + ", telsalerName=" + telsalerName
 | 
			
		||||
                + "]";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode()
 | 
			
		||||
    {
 | 
			
		||||
        final int prime = 31;
 | 
			
		||||
        int result = 1;
 | 
			
		||||
        result = prime * result + ((rewardIndex == null) ? 0 : rewardIndex.hashCode());
 | 
			
		||||
        result = prime * result + ((telsalerName == null) ? 0 : telsalerName.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;
 | 
			
		||||
        AddTelsalerRequest other = (AddTelsalerRequest) obj;
 | 
			
		||||
        if ( rewardIndex == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.rewardIndex != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        } else if ( !rewardIndex.equals( other.rewardIndex ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( telsalerName == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.telsalerName != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        } else if ( !telsalerName.equals( other.telsalerName ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JsonProperty("rewardIndex")
 | 
			
		||||
    private String rewardIndex;
 | 
			
		||||
 | 
			
		||||
    @JsonProperty("telsalerName")
 | 
			
		||||
    private String telsalerName;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,25 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-09-21 11:35:57
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/rewards/AddTelsalerResponse.java
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
package com.cpic.xim.web.controllers.rewards;
 | 
			
		||||
 | 
			
		||||
import com.cpic.xim.web.controllers.QueryResponse;
 | 
			
		||||
 | 
			
		||||
public class AddTelsalerResponse extends QueryResponse
 | 
			
		||||
{
 | 
			
		||||
    public AddTelsalerResponse()
 | 
			
		||||
    {
 | 
			
		||||
        super();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public AddTelsalerResponse( boolean success, String message )
 | 
			
		||||
    {
 | 
			
		||||
        super( success, message );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,66 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-09-21 11:35:57
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/rewards/DeleteTelsalerRequest.java
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
package com.cpic.xim.web.controllers.rewards;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonProperty;
 | 
			
		||||
 | 
			
		||||
public class DeleteTelsalerRequest
 | 
			
		||||
{
 | 
			
		||||
    public DeleteTelsalerRequest() {}
 | 
			
		||||
 | 
			
		||||
    public DeleteTelsalerRequest( int[] recordID)
 | 
			
		||||
    {
 | 
			
		||||
        this.recordID = recordID;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString()
 | 
			
		||||
    {
 | 
			
		||||
        return "DeleteTelsalerRequest [recordID=" + Arrays.toString( recordID ) + "]";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode()
 | 
			
		||||
    {
 | 
			
		||||
        final int prime = 31;
 | 
			
		||||
        int result = 1;
 | 
			
		||||
        result = prime * result + Arrays.hashCode( recordID );
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals( Object obj )
 | 
			
		||||
    {
 | 
			
		||||
        if ( this == obj )
 | 
			
		||||
            return true;
 | 
			
		||||
        if ( obj == null )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( getClass() != obj.getClass() )
 | 
			
		||||
            return false;
 | 
			
		||||
        DeleteTelsalerRequest other = (DeleteTelsalerRequest) obj;
 | 
			
		||||
        if ( !Arrays.equals( recordID, other.recordID ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int[] getRecordID()
 | 
			
		||||
    {
 | 
			
		||||
        return recordID;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRecordID( int[] recordID )
 | 
			
		||||
    {
 | 
			
		||||
        this.recordID = recordID;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JsonProperty("recordID")
 | 
			
		||||
    private int[] recordID;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,25 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-09-21 11:35:57
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/rewards/AddTelsalerResponse.java
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
package com.cpic.xim.web.controllers.rewards;
 | 
			
		||||
 | 
			
		||||
import com.cpic.xim.web.controllers.QueryResponse;
 | 
			
		||||
 | 
			
		||||
public class DeleteTelsalerResponse extends QueryResponse
 | 
			
		||||
{
 | 
			
		||||
    public DeleteTelsalerResponse()
 | 
			
		||||
    {
 | 
			
		||||
        super();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public DeleteTelsalerResponse( boolean success, String message )
 | 
			
		||||
    {
 | 
			
		||||
        super( success, message );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,242 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-09-06 10:41:34
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/rewards/RewardController.java
 | 
			
		||||
 * @Description: 坐席奖励相关的请求
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
package com.cpic.xim.web.controllers.rewards;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import org.apache.ibatis.exceptions.PersistenceException;
 | 
			
		||||
import org.apache.ibatis.session.SqlSession;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
import org.springframework.stereotype.Controller;
 | 
			
		||||
import org.springframework.web.bind.annotation.PostMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestBody;
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.ResponseBody;
 | 
			
		||||
import com.cpic.xim.mybatis.mapper.RewardsMapper;
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.RewardGainer;
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.RewardProject;
 | 
			
		||||
import com.cpic.xim.mybatis.utils.MybatisUtils;
 | 
			
		||||
 | 
			
		||||
@Controller
 | 
			
		||||
@RequestMapping( "/rewards" )
 | 
			
		||||
public class RewardController
 | 
			
		||||
{
 | 
			
		||||
    // 日志
 | 
			
		||||
    private static Logger logger = LoggerFactory.getLogger( RewardController.class );
 | 
			
		||||
 | 
			
		||||
    private RewardController()
 | 
			
		||||
    {}
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 相应查询获奖项目清单的请求
 | 
			
		||||
     * @return 获奖项目清单的response对象
 | 
			
		||||
     */
 | 
			
		||||
    @PostMapping( "/query_reward_projects.do" )
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
    public RewardProjectsResponse queryRewardProjecrts()
 | 
			
		||||
    {
 | 
			
		||||
        RewardProjectsResponse response = new RewardProjectsResponse();
 | 
			
		||||
        SqlSession session = null;
 | 
			
		||||
 | 
			
		||||
        logger.debug( "查询奖项清单。" );
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            session = MybatisUtils.getSqlSession();
 | 
			
		||||
            session.clearCache();
 | 
			
		||||
 | 
			
		||||
            RewardsMapper mapper = session.getMapper( RewardsMapper.class );
 | 
			
		||||
            ArrayList<RewardProject> rewards = mapper.queryRewardProjects();
 | 
			
		||||
 | 
			
		||||
            response.setSuccess( true );
 | 
			
		||||
            response.setMessage( "查询成功!" );
 | 
			
		||||
            response.setRewardList( rewards );
 | 
			
		||||
 | 
			
		||||
            logger.debug( "查询奖项清单," + response.getMessage() + "," + rewards.toString() );
 | 
			
		||||
        }
 | 
			
		||||
        catch ( IOException error )
 | 
			
		||||
        {
 | 
			
		||||
            response.setSuccess( false );
 | 
			
		||||
            response.setMessage( "查询失败!" + error.getMessage() );
 | 
			
		||||
            response.setRewardList( null );
 | 
			
		||||
 | 
			
		||||
            logger.debug( "查询奖项清单," + response.getMessage() + "," + error.getMessage() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return response;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping( "/query_reward_gainers.do" )
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
    RewardGainersResponse queryRewardGainers()
 | 
			
		||||
    {
 | 
			
		||||
        RewardGainersResponse response = new RewardGainersResponse();
 | 
			
		||||
        SqlSession session = null;
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            session = MybatisUtils.getSqlSession();
 | 
			
		||||
 | 
			
		||||
            RewardsMapper mapper = session.getMapper( RewardsMapper.class );
 | 
			
		||||
 | 
			
		||||
            ArrayList<RewardGainer> gainers = mapper.queryRewardTelsaler();
 | 
			
		||||
 | 
			
		||||
            response.setSuccess( true );
 | 
			
		||||
            response.setMessage( "查询成功!" );
 | 
			
		||||
            response.setGainerList( gainers );
 | 
			
		||||
        }
 | 
			
		||||
        catch ( PersistenceException error )
 | 
			
		||||
        {
 | 
			
		||||
            response.setSuccess( false );
 | 
			
		||||
            response.setMessage( "查询失败!" + error.getMessage() );
 | 
			
		||||
            response.setGainerList( null );
 | 
			
		||||
        }
 | 
			
		||||
        catch ( IOException error )
 | 
			
		||||
        {
 | 
			
		||||
            response.setSuccess( false );
 | 
			
		||||
            response.setMessage( "查询失败!" + error.getMessage() );
 | 
			
		||||
            response.setGainerList( null );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return response;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping( "/add_telsaler_reward.do" )
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
    public AddTelsalerResponse addTelsalerReward( @RequestBody AddTelsalerRequest request )
 | 
			
		||||
    {
 | 
			
		||||
        AddTelsalerResponse response = new AddTelsalerResponse();
 | 
			
		||||
        SqlSession session = null;
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            session = MybatisUtils.getSqlSession();
 | 
			
		||||
 | 
			
		||||
            RewardsMapper mapper = session.getMapper( RewardsMapper.class );
 | 
			
		||||
            HashMap<String, Object> params = new HashMap<>( 3 );
 | 
			
		||||
 | 
			
		||||
            params.put( "a_reward_index", request.getRewardIndex() );
 | 
			
		||||
            params.put( "a_telsaler_name", request.getTelsalerName() );
 | 
			
		||||
 | 
			
		||||
            mapper.addRewardTelSaler( params );
 | 
			
		||||
            session.commit();
 | 
			
		||||
 | 
			
		||||
            response.setSuccess( true );
 | 
			
		||||
            response.setMessage( "添加成功!" );
 | 
			
		||||
        }
 | 
			
		||||
        catch ( PersistenceException error )
 | 
			
		||||
        {
 | 
			
		||||
            if ( session != null )
 | 
			
		||||
            {
 | 
			
		||||
                session.rollback();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            logger.error( "添加获奖坐席失败,原因:" + error.getMessage() );
 | 
			
		||||
 | 
			
		||||
            response.setSuccess( false );
 | 
			
		||||
            response.setMessage( error.getMessage() );
 | 
			
		||||
        }
 | 
			
		||||
        catch ( IOException error )
 | 
			
		||||
        {
 | 
			
		||||
            logger.error( "添加获奖坐席失败,原因:" + error.getMessage() );
 | 
			
		||||
 | 
			
		||||
            response.setSuccess( false );
 | 
			
		||||
            response.setMessage( error.getMessage() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return response;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping( "/delete_telsaler_reward.do" )
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
    public DeleteTelsalerResponse deleteTelsalerReward( @RequestBody DeleteTelsalerRequest request )
 | 
			
		||||
    {
 | 
			
		||||
        DeleteTelsalerResponse response = new DeleteTelsalerResponse();
 | 
			
		||||
        SqlSession session = null;
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            session = MybatisUtils.getSqlSession();
 | 
			
		||||
            RewardsMapper mapper = session.getMapper( RewardsMapper.class );
 | 
			
		||||
 | 
			
		||||
            HashMap<String, Object> param = new HashMap<String, Object>( 3 );
 | 
			
		||||
 | 
			
		||||
            int[] records = request.getRecordID();
 | 
			
		||||
 | 
			
		||||
            for ( int index = 0; index < records.length; index++ )
 | 
			
		||||
            {
 | 
			
		||||
                param.put( "a_rec_id", records[index] );
 | 
			
		||||
 | 
			
		||||
                mapper.deleteRewardTelSaler( param );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            response.setSuccess( true );
 | 
			
		||||
            response.setMessage( "删除成功!" );
 | 
			
		||||
        }
 | 
			
		||||
        catch ( IOException error )
 | 
			
		||||
        {
 | 
			
		||||
            logger.error( "删除获奖坐席失败,原因:" + error.getMessage() );
 | 
			
		||||
 | 
			
		||||
            response.setSuccess( false );
 | 
			
		||||
            response.setMessage( error.getMessage() );
 | 
			
		||||
        }
 | 
			
		||||
        catch ( PersistenceException error )
 | 
			
		||||
        {
 | 
			
		||||
            logger.error( "删除获奖坐席失败,原因:" + error.getMessage() );
 | 
			
		||||
 | 
			
		||||
            response.setSuccess( false );
 | 
			
		||||
            response.setMessage( error.getMessage() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return response;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping( "update_telsaler_reward.do" )
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
    UpdateTelsalerResponse updateTelsalerReward( @RequestBody UpdateTelsalerRequest request )
 | 
			
		||||
    {
 | 
			
		||||
        UpdateTelsalerResponse response = new UpdateTelsalerResponse();
 | 
			
		||||
        SqlSession session = null;
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            session = MybatisUtils.getSqlSession();
 | 
			
		||||
            RewardsMapper mapper = session.getMapper( RewardsMapper.class );
 | 
			
		||||
            HashMap<String, Object> params = new HashMap<>( 3 );
 | 
			
		||||
 | 
			
		||||
            params.put( "a_rec_id", request.getRecordID() );
 | 
			
		||||
            params.put( "a_telsaler_name", request.getTelsalerName() );
 | 
			
		||||
            params.put( "a_reward_index", request.getRewardIndex() );
 | 
			
		||||
 | 
			
		||||
            mapper.updateRewardTelSaler( params );
 | 
			
		||||
 | 
			
		||||
            response.setSuccess( true );
 | 
			
		||||
            response.setMessage( "更新成功!" );
 | 
			
		||||
        }
 | 
			
		||||
        catch ( IOException error )
 | 
			
		||||
        {
 | 
			
		||||
            logger.error( "更新获奖坐席失败,原因:" + error.getMessage() );
 | 
			
		||||
 | 
			
		||||
            response.setSuccess( false );
 | 
			
		||||
            response.setMessage( error.getMessage() );
 | 
			
		||||
        }
 | 
			
		||||
        catch ( PersistenceException error )
 | 
			
		||||
        {
 | 
			
		||||
            logger.error( "更新获奖坐席失败,原因:" + error.getMessage() );
 | 
			
		||||
 | 
			
		||||
            response.setSuccess( false );
 | 
			
		||||
            response.setMessage( error.getMessage() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return response;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,47 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-09-07 17:16:12
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/rewards/RewardGainersResponse.java
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package com.cpic.xim.web.controllers.rewards;
 | 
			
		||||
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.RewardGainer;
 | 
			
		||||
import com.cpic.xim.web.controllers.QueryResponse;
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonProperty;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
public class RewardGainersResponse extends QueryResponse
 | 
			
		||||
{
 | 
			
		||||
    public RewardGainersResponse( boolean success, String message,
 | 
			
		||||
            ArrayList<RewardGainer> gainerList)
 | 
			
		||||
    {
 | 
			
		||||
        super( success, message );
 | 
			
		||||
 | 
			
		||||
        this.gainerList = gainerList;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public RewardGainersResponse()
 | 
			
		||||
    {
 | 
			
		||||
        super();
 | 
			
		||||
 | 
			
		||||
        this.gainerList = null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ArrayList<RewardGainer> getGainerList()
 | 
			
		||||
    {
 | 
			
		||||
        return gainerList;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setGainerList( ArrayList<RewardGainer> gainerList )
 | 
			
		||||
    {
 | 
			
		||||
        this.gainerList = gainerList;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JsonProperty( "gainerList" )
 | 
			
		||||
    private ArrayList<RewardGainer> gainerList;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,46 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-09-06 10:59:45
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/rewards/RewardProjectsResponse.java
 | 
			
		||||
 * @Description: 奖励项目请求结果
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
package com.cpic.xim.web.controllers.rewards;
 | 
			
		||||
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.RewardProject;
 | 
			
		||||
import com.cpic.xim.web.controllers.QueryResponse;
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonProperty;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
public class RewardProjectsResponse extends QueryResponse
 | 
			
		||||
{
 | 
			
		||||
    public RewardProjectsResponse( boolean success, String message,
 | 
			
		||||
            ArrayList<RewardProject> rewardList)
 | 
			
		||||
    {
 | 
			
		||||
        super( success, message );
 | 
			
		||||
 | 
			
		||||
        this.rewardList = rewardList;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public RewardProjectsResponse()
 | 
			
		||||
    {
 | 
			
		||||
        super();
 | 
			
		||||
 | 
			
		||||
        this.rewardList = null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ArrayList<RewardProject> getRewardList()
 | 
			
		||||
    {
 | 
			
		||||
        return rewardList;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRewardList( ArrayList<RewardProject> rewardList )
 | 
			
		||||
    {
 | 
			
		||||
        this.rewardList = rewardList;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JsonProperty("rewardList")
 | 
			
		||||
    private ArrayList<RewardProject> rewardList;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,109 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-09-21 16:01:51
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/rewards/UpdateTelsalerRequest.java
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package com.cpic.xim.web.controllers.rewards;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonProperty;
 | 
			
		||||
 | 
			
		||||
public class UpdateTelsalerRequest
 | 
			
		||||
{
 | 
			
		||||
    public UpdateTelsalerRequest() {}
 | 
			
		||||
 | 
			
		||||
    public UpdateTelsalerRequest( int recordID, String rewardIndex, String telsalerName )
 | 
			
		||||
    {
 | 
			
		||||
        this.recordID = recordID;
 | 
			
		||||
        this.rewardIndex = rewardIndex;
 | 
			
		||||
        this.telsalerName = telsalerName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getRewardIndex()
 | 
			
		||||
    {
 | 
			
		||||
        return rewardIndex;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRewardIndex( String rewardIndex )
 | 
			
		||||
    {
 | 
			
		||||
        this.rewardIndex = rewardIndex;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getTelsalerName()
 | 
			
		||||
    {
 | 
			
		||||
        return telsalerName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setTelsalerName( String telsalerName )
 | 
			
		||||
    {
 | 
			
		||||
        this.telsalerName = telsalerName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getRecordID()
 | 
			
		||||
    {
 | 
			
		||||
        return recordID;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRecordID( int recordID )
 | 
			
		||||
    {
 | 
			
		||||
        this.recordID = recordID;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString()
 | 
			
		||||
    {
 | 
			
		||||
        return "UpdateTelsalerRequest [recordID=" + recordID + ", rewardIndex=" + rewardIndex
 | 
			
		||||
                + ", telsalerName=" + telsalerName + "]";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode()
 | 
			
		||||
    {
 | 
			
		||||
        final int prime = 31;
 | 
			
		||||
        int result = 1;
 | 
			
		||||
        result = prime * result + recordID;
 | 
			
		||||
        result = prime * result + ((rewardIndex == null) ? 0 : rewardIndex.hashCode());
 | 
			
		||||
        result = prime * result + ((telsalerName == null) ? 0 : telsalerName.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;
 | 
			
		||||
        UpdateTelsalerRequest other = (UpdateTelsalerRequest) obj;
 | 
			
		||||
        if ( recordID != other.recordID )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( rewardIndex == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.rewardIndex != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        } else if ( !rewardIndex.equals( other.rewardIndex ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        if ( telsalerName == null )
 | 
			
		||||
        {
 | 
			
		||||
            if ( other.telsalerName != null )
 | 
			
		||||
                return false;
 | 
			
		||||
        } else if ( !telsalerName.equals( other.telsalerName ) )
 | 
			
		||||
            return false;
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JsonProperty("recordID")
 | 
			
		||||
    private int recordID;
 | 
			
		||||
 | 
			
		||||
    @JsonProperty("rewardIndex")
 | 
			
		||||
    private String rewardIndex;
 | 
			
		||||
 | 
			
		||||
    @JsonProperty("telsalerName")
 | 
			
		||||
    private String telsalerName;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,25 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-09-21 11:35:57
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/rewards/UpdateTelsalerResponsense.java
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
package com.cpic.xim.web.controllers.rewards;
 | 
			
		||||
 | 
			
		||||
import com.cpic.xim.web.controllers.QueryResponse;
 | 
			
		||||
 | 
			
		||||
public class UpdateTelsalerResponse extends QueryResponse
 | 
			
		||||
{
 | 
			
		||||
    public UpdateTelsalerResponse()
 | 
			
		||||
    {
 | 
			
		||||
        super();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public UpdateTelsalerResponse( boolean success, String message )
 | 
			
		||||
    {
 | 
			
		||||
        super( success, message );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
 | 
			
		||||
<mapper namespace="com.cpic.xim.mybatis.mapper.ArchievementMapper">
 | 
			
		||||
    <select id="getDepartmentArchievement" statementType="CALLABLE" parameterType="java.util.HashMap"> 
 | 
			
		||||
    <select id="getDepartmentArchievement" flushCache="true" statementType="CALLABLE" parameterType="java.util.HashMap"> 
 | 
			
		||||
        call telsale_archievement_pkg.department_archievement(
 | 
			
		||||
            #{a_department_code, mode=IN, jdbcType=VARCHAR},
 | 
			
		||||
            #{a_attaching_rate, mode=OUT, jdbcType=VARCHAR},
 | 
			
		||||
@@ -9,6 +9,15 @@
 | 
			
		||||
            #{a_total, mode=OUT, jdbcType=INTEGER, javaType=Integer},
 | 
			
		||||
            #{a_mensual_cur, mode=OUT, jdbcType=CURSOR, resultMap=MensualArchievementMapper})
 | 
			
		||||
    </select>
 | 
			
		||||
    <select id="getCallerArchievement" flushCache="true" statementType="CALLABLE" parameterType="java.util.HashMap">
 | 
			
		||||
        call telsale_archievement_pkg.caller_archievement(
 | 
			
		||||
            #{a_caller_code, mode=IN, jdbcType=VARCHAR},
 | 
			
		||||
            #{a_attaching_rate, mode=OUT, jdbcType=VARCHAR},
 | 
			
		||||
            #{a_renewal_rate, mode=OUT, jdbcType=VARCHAR},
 | 
			
		||||
            #{a_total, mode=OUT, jdbcType=INTEGER, javaType=Integer},
 | 
			
		||||
            #{a_mensual_cur, mode=OUT, jdbcType=CURSOR, resultMap=MensualArchievementMapper})
 | 
			
		||||
    </select>
 | 
			
		||||
 | 
			
		||||
    <resultMap id="MensualArchievementMapper" type="MensualArchievementItem">
 | 
			
		||||
        <id property="month" column="mm" javaType="INT"/>
 | 
			
		||||
        <result property="premium" column="bf" />
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
 | 
			
		||||
<mapper namespace="com.cpic.xim.mybatis.mapper.RankingListMapper">
 | 
			
		||||
    <select id="getRankingList" statementType="CALLABLE" parameterType="java.util.HashMap">
 | 
			
		||||
    <select id="getRankingList" flushCache="true" statementType="CALLABLE" parameterType="java.util.HashMap">
 | 
			
		||||
        call telsale_archievement_pkg.caller_arch_ranking_list(
 | 
			
		||||
            #{a_department_code,mode=IN,jdbcType=VARCHAR},
 | 
			
		||||
            #{a_year,mode=IN,jdbcType=VARCHAR},
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,50 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
 | 
			
		||||
<mapper namespace="com.cpic.xim.mybatis.mapper.RewardsMapper">
 | 
			
		||||
    <select id="queryRewardProjects" resultMap="RewardProjectMap">
 | 
			
		||||
        select reward_index, reward_name from reward_projects order by reward_index desc
 | 
			
		||||
    </select>
 | 
			
		||||
    <resultMap id="RewardProjectMap" type="com.cpic.xim.mybatis.pojo.RewardProject">
 | 
			
		||||
        <id property="rewardCode" column="reward_index" />
 | 
			
		||||
        <result property="rewardName" column="reward_name" javaType="String"/>
 | 
			
		||||
    </resultMap>
 | 
			
		||||
 | 
			
		||||
    <select id="queryRewardTelsaler" flushCache="true" resultMap="RewardGainerMapper">
 | 
			
		||||
        SELECT hjr.rec_id rec_id,
 | 
			
		||||
               hjr.telsaler_name telsaler_name,
 | 
			
		||||
               hjr.telsaler_code telsaler_code,
 | 
			
		||||
               xm.reward_name reward_name,
 | 
			
		||||
               xm.reward_index reward_index
 | 
			
		||||
               FROM telsaler_reward hjr,
 | 
			
		||||
                    reward_projects xm
 | 
			
		||||
         WHERE hjr.reward_index = xm.reward_index
 | 
			
		||||
         order by xm.reward_index desc
 | 
			
		||||
    </select>
 | 
			
		||||
    <resultMap id="RewardGainerMapper" type="com.cpic.xim.mybatis.pojo.RewardGainer">
 | 
			
		||||
        <id column="rec_id" property="recID" />
 | 
			
		||||
        <result column="telsaler_name" property="callerName" />
 | 
			
		||||
        <result column="telsaler_code" property="callerCode" />
 | 
			
		||||
        <result column="reward_name" property="rewardProjectName" />
 | 
			
		||||
        <result column="reward_index" property="rewardProjectCode" />
 | 
			
		||||
    </resultMap>
 | 
			
		||||
 | 
			
		||||
    <select id="addRewardTelSaler" flushCache="true" statementType="CALLABLE" parameterType="java.util.HashMap">
 | 
			
		||||
        call telsaler_reward_pkg.add_telsaler_reward(
 | 
			
		||||
            #{a_reward_index,mode=IN,jdbcType=VARCHAR},
 | 
			
		||||
            #{a_telsaler_name,mode=IN,jdbcType=VARCHAR})
 | 
			
		||||
    </select>
 | 
			
		||||
 | 
			
		||||
    <!-- 删除获奖坐席记录 -->
 | 
			
		||||
    <select id="deleteRewardTelSaler" flushCache="true" statementType="CALLABLE" parameterType="java.util.HashMap">
 | 
			
		||||
        call telsaler_reward_pkg.delete_telsaler_reward(
 | 
			
		||||
             #{a_rec_id,mode=IN,jdbcType=INTEGER})
 | 
			
		||||
    </select>
 | 
			
		||||
 | 
			
		||||
    <!-- 更新获奖坐席 -->
 | 
			
		||||
    <select id="updateRewardTelSaler" statementType="CALLABLE" flushCache="true" parameterType="java.util.HashMap" >
 | 
			
		||||
        call telsaler_reward_pkg.update_telsaler_reward(
 | 
			
		||||
            #{a_rec_id,mode=IN,jdbcType=INTEGER},
 | 
			
		||||
            #{a_telsaler_name,mode=IN,jdbcType=VARCHAR},
 | 
			
		||||
            #{a_reward_index,mode=IN,jdbcType=VARCHAR})
 | 
			
		||||
    </select>
 | 
			
		||||
</mapper>
 | 
			
		||||
@@ -25,5 +25,6 @@
 | 
			
		||||
        <!-- <mapper resource="mybatis/mapper/StaffMapper.xml" /> -->
 | 
			
		||||
        <mapper resource="mybatis/mapper/ArchievementMapper.xml" />
 | 
			
		||||
        <mapper resource="mybatis/mapper/RankingListMapper.xml" />
 | 
			
		||||
        <mapper resource="mybatis/mapper/RewardsMapper.xml" />
 | 
			
		||||
    </mappers>
 | 
			
		||||
</configuration>
 | 
			
		||||
@@ -23,8 +23,11 @@ import org.junit.Test;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
import com.cpic.xim.mybatis.mapper.ArchievementMapper;
 | 
			
		||||
import com.cpic.xim.mybatis.mapper.RewardsMapper;
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.MensualArchievementItem;
 | 
			
		||||
import com.cpic.xim.utils.archievement.DepartmentArchievement;
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.RewardGainer;
 | 
			
		||||
import com.cpic.xim.mybatis.pojo.RewardProject;
 | 
			
		||||
import com.cpic.xim.mybatis.utils.MybatisUtils;
 | 
			
		||||
import com.cpic.xim.utils.ranking.CallerRankingList;
 | 
			
		||||
 | 
			
		||||
@SuppressWarnings( "all" )
 | 
			
		||||
@@ -85,17 +88,75 @@ public class DesktopArchievementTest
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testDepartmentArchievement2()
 | 
			
		||||
    public void testCallerArchievement()
 | 
			
		||||
    {
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            DepartmentArchievement arch = DepartmentArchievement.getDepartmentArchievement( "QDI" );
 | 
			
		||||
            SqlSession session = MybatisUtils.getSqlSession();
 | 
			
		||||
            ArchievementMapper mapper = session.getMapper( ArchievementMapper.class );
 | 
			
		||||
 | 
			
		||||
            System.out.println( arch.toString() );
 | 
			
		||||
            ArrayList<MensualArchievementItem> mensual = null;
 | 
			
		||||
            HashMap<String, Object> params = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
            params.put( "a_caller_code", "61136" );
 | 
			
		||||
 | 
			
		||||
            mapper.getCallerArchievement( params );
 | 
			
		||||
 | 
			
		||||
            Object obj = params.get( "a_mensual_cur" );
 | 
			
		||||
            mensual = (ArrayList<MensualArchievementItem>) params.get( "a_mensual_cur" );
 | 
			
		||||
 | 
			
		||||
            System.out.println( params.toString() );
 | 
			
		||||
            System.out.println( mensual.toString() );
 | 
			
		||||
            System.out.println( obj.getClass() );
 | 
			
		||||
 | 
			
		||||
            assertTrue( params.size() > 1 );
 | 
			
		||||
        }
 | 
			
		||||
        catch ( IOException error )
 | 
			
		||||
        {
 | 
			
		||||
            assert (false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testRewardProjects()
 | 
			
		||||
    {
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            SqlSession session = MybatisUtils.getSqlSession();
 | 
			
		||||
            RewardsMapper mapper = session.getMapper( RewardsMapper.class );
 | 
			
		||||
 | 
			
		||||
            ArrayList<RewardProject> rewards = mapper.queryRewardProjects();
 | 
			
		||||
 | 
			
		||||
            System.out.println( rewards );
 | 
			
		||||
            assert (rewards.isEmpty() == false);
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        catch ( IOException error )
 | 
			
		||||
        {
 | 
			
		||||
            assert (false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testQueryGainers()
 | 
			
		||||
    {
 | 
			
		||||
        SqlSession session = null;
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            session = MybatisUtils.getSqlSession();
 | 
			
		||||
            RewardsMapper mapper = session.getMapper( RewardsMapper.class );
 | 
			
		||||
 | 
			
		||||
            ArrayList<RewardGainer> gainers = mapper.queryRewardTelsaler();
 | 
			
		||||
 | 
			
		||||
            System.out.println( gainers );
 | 
			
		||||
            
 | 
			
		||||
            assert( gainers != null );
 | 
			
		||||
        }
 | 
			
		||||
        catch ( IOException error )
 | 
			
		||||
        {
 | 
			
		||||
            System.out.println( error.getMessage() );
 | 
			
		||||
            assert (false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user