/* * @Author: Kane * @Date: 2023-03-17 15:17:44 * @LastEditors: Kane * @FilePath: /task_schedule/src/utils/archievement.ts * @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 TelSaler } from "../types/cpicxim/TelSaler.js"; import { type AxiosResponse } from "axios"; interface DepartmentArchievement // 定义业绩对象的结构 { success: boolean; message: string; total_archievement: number; mensual_archievement_list: number[]; insurance_renewal_rate: string; attaching_rate: string; leading_reward_gainers: string[]; advance_reward_gainers: string[]; 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: string; premium: number; } /** * 获取部门业绩数据,并调用回调函数进行渲染。 * @param render 用于给组件更新数据的回调函数 */ function queryDepartmentArchievement( departmentInfo: Department, render: any ): void { instance.request({ method: "post", url: API_URL.URL_DEPARTMENT_ARCHIEVEMENT, data: departmentInfo, }) .then(( response ) => { const archievement: DepartmentArchievement = { success: false, message: "", total_archievement: 0, mensual_archievement_list: [], insurance_renewal_rate: "", attaching_rate: "", leading_reward_gainers: [], advance_reward_gainers: [], backward_list: [], }; const data = response.data ?? {}; archievement.success = data.success ?? false; archievement.message = data.message ?? ""; archievement.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"; archievement.leading_reward_gainers = data.leading_reward_gainers ?? []; archievement.advance_reward_gainers = data.advance_reward_gainers ?? []; archievement.backward_list = data.backward_list ?? []; // 转换每月业绩数据,用month排序以后,保留premium。 data.mensual_archievement_list.sort(( a: any, b: any ) => a.month - b.month ); data.mensual_archievement_list.forEach(( item: any ) => { archievement.mensual_archievement_list.push( item.premium ); }); console.log( "每月业绩", archievement ); // 渲染数据 render( archievement ); }) .catch(( error ) => { console.log( error ); }); } function queryCallerArchievement( callerInfo: TelSaler, render: any ): void { const caller = { callerCode: callerInfo.telSalerCode, callName: callerInfo.telSalerName, }; instance.request({ method: "post", url: API_URL.URL_CALLER_ARCHIEVEMENT, data: caller, }) // 请求完成时 .then(( response: AxiosResponse ) => { const data = response.data ?? {}; const callArchievement: CallerArchievement = { success: data.success ?? false, message: data.message ?? "", total_archievement: data.total_archievement ?? 0, mensual_archievement_list: [], insurance_renewal_rate: data.insurance_renewal_rate ?? "0.0", attaching_rate: data.attaching_rate ?? "0.0", }; const checkedList = checkMensualArchievement( data.mensual_archievement_list ); console.log( `queryCallerArchievement查询结果${data}` ); }) // 请求失败 .catch(( error: any ) => { console.log( `queryCallerArchievement:查询坐席${callerInfo.telSalerCode}业绩失败,原因${error}` ); }); } /** * 检查服务器返回的每月业绩数组,检查是否有缺漏,缺少的月份业绩用0代替。 * @param mensualArchievementList * @returns */ 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 };