Roc преди 1 година
родител
ревизия
f19d8c955d

+ 67 - 47
controllers/statistic_report.go

@@ -5,6 +5,7 @@ import (
 	"errors"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/shopspring/decimal"
 	"github.com/tealeg/xlsx"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
@@ -5394,12 +5395,15 @@ func (this *StatisticReportController) RenewCompanyStatistics() {
 	tmpAllRenewFollowNumMap := make(map[int]int)
 	tmpAllExpireNumMap := make(map[int]int)
 	tmpAllRenewNumMap := make(map[int]int)
+	tmpAllUnusualRenewNumMap := make(map[int]int)  // 续约异常客户数量汇总
+	tmpAllFormalCompanyNumMap := make(map[int]int) // 当期正式客户数量汇总
 
 	//id集合汇总
 	tmpAllNotRenewIdMap := make(map[int]string)
 	tmpAllRenewFollowIdMap := make(map[int]string)
 	tmpAllExpireIdMap := make(map[int]string)
 	tmpAllRenewIdMap := make(map[int]string)
+	tmpAllUnusualRenewIdMap := make(map[int]string) // 续约异常客户id汇总
 
 	for _, v := range group {
 		v.ResearcherList = groupMap[v.GroupId]
@@ -5411,18 +5415,21 @@ func (this *StatisticReportController) RenewCompanyStatistics() {
 		tmpGroupRenewFollowNumMap := make(map[int]int)
 		tmpGroupExpireNumMap := make(map[int]int)
 		tmpGroupRenewNumMap := make(map[int]int)
+		tmpGroupUnusualRenewNumMap := make(map[int]int) //组内续约异常客户数
 
 		//id集合
 		tmpGroupNotRenewIdSliceMap := make(map[int][]string)
 		tmpGroupRenewFollowIdSliceMap := make(map[int][]string)
 		tmpGroupExpireIdSliceMap := make(map[int][]string)
 		tmpGroupRenewIdSliceMap := make(map[int][]string)
+		tmpGroupUnusualRenewIdSliceMap := make(map[int][]string) // 组内续约异常客户id汇总
 
 		//id集合
 		tmpGroupNotRenewIdMap := make(map[int]string)
 		tmpGroupRenewFollowIdMap := make(map[int]string)
 		tmpGroupExpireIdMap := make(map[int]string)
 		tmpGroupRenewIdMap := make(map[int]string)
+		tmpGroupUnusualRenewIdMap := make(map[int]string) // 组内续约异常客户id汇总
 
 		for _, researcher := range groupMap[v.GroupId] {
 			//组内研究员数据
@@ -5433,10 +5440,10 @@ func (this *StatisticReportController) RenewCompanyStatistics() {
 				startDateIndexList[index] = adminData.StartDate
 				endDateIndexList[index] = adminData.EndDate
 
-				var tmpNotRenewNum, tmpRenewFollowNum, tmpExpireStatus, tmpRenewStatus int
+				var tmpNotRenewNum, tmpRenewFollowNum, tmpExpireStatus, tmpRenewStatus, tmpUnusualRenewStatus int
 				//var tmpNotRenewIds, tmpRenewFollowIds, tmpExpireIds string
-				var tmpNotRenewIdSlice, tmpRenewFollowIdSlice, tmpExpireIdSlice, tmpRenewIdSlice []string
-				var tmpNotRenewId, tmpRenewFollowId, tmpExpireId, tmpRenewId string
+				var tmpNotRenewIdSlice, tmpRenewFollowIdSlice, tmpExpireIdSlice, tmpRenewIdSlice, tmpUnusualRenewIdSlice []string
+				var tmpNotRenewId, tmpRenewFollowId, tmpExpireId, tmpRenewId, tmpUnusualRenewId string
 
 				if num, ok := adminData.NotRenewMap[researcher.AdminId]; ok {
 					tmpNotRenewNum = num
@@ -5458,18 +5465,26 @@ func (this *StatisticReportController) RenewCompanyStatistics() {
 					tmpRenewIdSlice = append(tmpRenewIdSlice, adminData.RenewIdMap[researcher.AdminId])
 					tmpRenewId = strings.Join(tmpRenewIdSlice, ",")
 				}
+				// 续约异常客户
+				if num, ok := adminData.UnusualRenewMap[researcher.AdminId]; ok {
+					tmpUnusualRenewStatus = num
+					tmpUnusualRenewIdSlice = append(tmpUnusualRenewIdSlice, adminData.UnusualRenewIdMap[researcher.AdminId])
+					tmpUnusualRenewId = strings.Join(tmpUnusualRenewIdSlice, ",")
+				}
 
 				tmpAdminRsRenewRecordNum := statistic_report.CompanyRenewRecordNum{
-					NotRenewNum:    tmpNotRenewNum,
-					NotRenewIds:    tmpNotRenewId,
-					RenewFollowNum: tmpRenewFollowNum,
-					RenewFollowIds: tmpRenewFollowId,
-					ExpireNum:      tmpExpireStatus,
-					ExpireIds:      tmpExpireId,
-					RenewNum:       tmpRenewStatus,
-					RenewIds:       tmpRenewId,
-					StartDate:      adminData.StartDate,
-					EndDate:        adminData.EndDate,
+					NotRenewNum:     tmpNotRenewNum,
+					NotRenewIds:     tmpNotRenewId,
+					RenewFollowNum:  tmpRenewFollowNum,
+					RenewFollowIds:  tmpRenewFollowId,
+					ExpireNum:       tmpExpireStatus,
+					ExpireIds:       tmpExpireId,
+					RenewNum:        tmpRenewStatus,
+					RenewIds:        tmpRenewId,
+					UnusualRenewNum: tmpUnusualRenewStatus,
+					UnusualRenewIds: tmpUnusualRenewId,
+					StartDate:       adminData.StartDate,
+					EndDate:         adminData.EndDate,
 				}
 				tmpCompanyRenewRecordNumList = append(tmpCompanyRenewRecordNumList, tmpAdminRsRenewRecordNum)
 
@@ -5486,11 +5501,15 @@ func (this *StatisticReportController) RenewCompanyStatistics() {
 				if _, ok := tmpGroupRenewNumMap[index]; !ok {
 					tmpGroupRenewNumMap[index] = 0
 				}
+				if _, ok := tmpGroupUnusualRenewNumMap[index]; !ok {
+					tmpGroupUnusualRenewNumMap[index] = 0
+				}
 
 				tmpGroupNotRenewNumMap[index] += tmpNotRenewNum
 				tmpGroupRenewFollowNumMap[index] += tmpRenewFollowNum
 				tmpGroupExpireNumMap[index] += tmpExpireStatus
 				tmpGroupRenewNumMap[index] += tmpRenewStatus
+				tmpGroupUnusualRenewNumMap[index] += tmpUnusualRenewStatus
 
 				//组内数据汇总
 				if _, ok := tmpGroupNotRenewIdMap[index]; !ok {
@@ -5514,6 +5533,9 @@ func (this *StatisticReportController) RenewCompanyStatistics() {
 				if tmpRenewId != "" {
 					tmpGroupRenewIdSliceMap[index] = append(tmpGroupRenewIdSliceMap[index], tmpRenewId)
 				}
+				if tmpUnusualRenewId != "" {
+					tmpGroupUnusualRenewIdSliceMap[index] = append(tmpGroupUnusualRenewIdSliceMap[index], tmpUnusualRenewId)
+				}
 
 				//总数据汇总
 				if _, ok := tmpAllNotRenewNumMap[index]; !ok {
@@ -5533,20 +5555,8 @@ func (this *StatisticReportController) RenewCompanyStatistics() {
 				tmpAllRenewFollowNumMap[index] += tmpRenewFollowNum
 				tmpAllExpireNumMap[index] += tmpExpireStatus
 				tmpAllRenewNumMap[index] += tmpRenewStatus
-
-				////总数据汇总
-				//if _, ok := tmpAllNotRenewIdMap[index]; !ok {
-				//	tmpAllNotRenewIdMap[index] = ""
-				//}
-				//if _, ok := tmpAllRenewFollowIdMap[index]; !ok {
-				//	tmpAllRenewFollowIdMap[index] = ""
-				//}
-				//if _, ok := tmpAllExpireIdMap[index]; !ok {
-				//	tmpAllExpireIdMap[index] = ""
-				//}
-				//tmpAllNotRenewIdMap[index] += tmpNotRenewId
-				//tmpAllRenewFollowIdMap[index] += tmpRenewFollowId
-				//tmpAllExpireIdMap[index] += tmpExpireId
+				tmpAllUnusualRenewNumMap[index] = adminData.UnusualRenewTotal
+				tmpAllFormalCompanyNumMap[index] = adminData.FormalCompanyTotal
 			}
 			tmpAdminRenewRecord := statistic_report.AdminRenewRecord{
 				Name:                      researcher.RealName,
@@ -5561,18 +5571,21 @@ func (this *StatisticReportController) RenewCompanyStatistics() {
 			tmpGroupRenewFollowIdMap[i] = strings.Join(tmpGroupRenewFollowIdSliceMap[i], ",")
 			tmpGroupExpireIdMap[i] = strings.Join(tmpGroupExpireIdSliceMap[i], ",")
 			tmpGroupRenewIdMap[i] = strings.Join(tmpGroupRenewIdSliceMap[i], ",")
+			tmpGroupUnusualRenewIdMap[i] = strings.Join(tmpGroupUnusualRenewIdSliceMap[i], ",")
 
 			tmpGroupCompanyRenewRecordNum := statistic_report.CompanyRenewRecordNum{
-				NotRenewNum:    tmpGroupNotRenewNumMap[i],
-				NotRenewIds:    tmpGroupNotRenewIdMap[i],
-				RenewFollowNum: tmpGroupRenewFollowNumMap[i],
-				RenewFollowIds: tmpGroupRenewFollowIdMap[i],
-				ExpireNum:      tmpGroupExpireNumMap[i],
-				ExpireIds:      tmpGroupExpireIdMap[i],
-				RenewNum:       tmpGroupRenewNumMap[i],
-				RenewIds:       tmpGroupRenewIdMap[i],
-				StartDate:      startDateIndexList[i],
-				EndDate:        endDateIndexList[i],
+				NotRenewNum:     tmpGroupNotRenewNumMap[i],
+				NotRenewIds:     tmpGroupNotRenewIdMap[i],
+				RenewFollowNum:  tmpGroupRenewFollowNumMap[i],
+				RenewFollowIds:  tmpGroupRenewFollowIdMap[i],
+				ExpireNum:       tmpGroupExpireNumMap[i],
+				ExpireIds:       tmpGroupExpireIdMap[i],
+				RenewNum:        tmpGroupRenewNumMap[i],
+				RenewIds:        tmpGroupRenewIdMap[i],
+				UnusualRenewNum: tmpGroupUnusualRenewNumMap[i],
+				UnusualRenewIds: tmpGroupUnusualRenewIdMap[i],
+				StartDate:       startDateIndexList[i],
+				EndDate:         endDateIndexList[i],
 			}
 			tmpGroupCompanyRenewRecordNumList = append(tmpGroupCompanyRenewRecordNumList, tmpGroupCompanyRenewRecordNum)
 		}
@@ -5587,17 +5600,24 @@ func (this *StatisticReportController) RenewCompanyStatistics() {
 
 	//总体汇总数据
 	for i := 0; i < len(tmpAllRenewFollowNumMap); i++ {
+		unusualRate := ``
+		if tmpAllUnusualRenewNumMap[i] > 0 && tmpAllFormalCompanyNumMap[i] > 0 {
+			unusualRate = decimal.NewFromInt(int64(tmpAllUnusualRenewNumMap[i])).Div(decimal.NewFromInt(int64(tmpAllFormalCompanyNumMap[i]))).Round(2).String()
+		}
 		tmpGroupCompanyRenewRecordNum := statistic_report.CompanyRenewRecordNum{
-			NotRenewNum:    tmpAllNotRenewNumMap[i],
-			NotRenewIds:    tmpAllNotRenewIdMap[i],
-			RenewFollowNum: tmpAllRenewFollowNumMap[i],
-			RenewFollowIds: tmpAllRenewFollowIdMap[i],
-			ExpireNum:      tmpAllExpireNumMap[i],
-			ExpireIds:      tmpAllExpireIdMap[i],
-			RenewNum:       tmpAllRenewNumMap[i],
-			RenewIds:       tmpAllRenewIdMap[i],
-			StartDate:      startDateIndexList[i],
-			EndDate:        endDateIndexList[i],
+			NotRenewNum:     tmpAllNotRenewNumMap[i],
+			NotRenewIds:     tmpAllNotRenewIdMap[i],
+			RenewFollowNum:  tmpAllRenewFollowNumMap[i],
+			RenewFollowIds:  tmpAllRenewFollowIdMap[i],
+			ExpireNum:       tmpAllExpireNumMap[i],
+			ExpireIds:       tmpAllExpireIdMap[i],
+			RenewNum:        tmpAllRenewNumMap[i],
+			RenewIds:        tmpAllRenewIdMap[i],
+			UnusualRenewNum: tmpAllUnusualRenewNumMap[i],
+			UnusualRenewIds: tmpAllUnusualRenewIdMap[i],
+			UnusualRate:     unusualRate, // 异常率
+			StartDate:       startDateIndexList[i],
+			EndDate:         endDateIndexList[i],
 		}
 		allCompanyRenewRecordNum = append(allCompanyRenewRecordNum, tmpGroupCompanyRenewRecordNum)
 	}

+ 44 - 0
models/company/company_renewal_record.go

@@ -0,0 +1,44 @@
+package company
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// CompanyRenewalRecord
+// @Description: 客户续约状态记录表
+type CompanyRenewalRecord struct {
+	Id              int       `orm:"column(id);pk"`
+	CompanyId       int       `description:"客户id"`
+	ProductId       int       `description:"产品id"`
+	Source          int       `description:"类型,枚举值,1:续约异常客户;2:续约正常客户;3:超时续约客户"`
+	SellerId        int       `description:"销售id"`
+	SellerName      string    `description:"销售名称"`
+	ShareSellerId   int       `description:"共享销售id"`
+	ShareSellerName string    `description:"共享销售名称"`
+	CreateTime      time.Time `description:"创建时间"`
+	ModifyTime      time.Time `description:"修改时间"`
+}
+
+// GetUnusualRenewCompanyList 获取销售未续约数据
+func GetUnusualRenewCompanyList(startDate, endDate time.Time, productId int) (list []*CompanyRenewalRecord, err error) {
+	o := orm.NewOrm()
+	sql := `	SELECT
+	a.seller_id,a.share_seller_id,
+	count(
+	DISTINCT ( a.company_id )) num,
+	GROUP_CONCAT( DISTINCT c.company_id SEPARATOR ',' ) AS company_ids 
+	FROM
+	company_renewal_record as a
+WHERE
+	a.modify_time BETWEEN ? 
+	AND ? 
+    AND a.source = 1 
+	AND a.product_id = ?
+GROUP BY
+	p.seller_id;
+`
+	_, err = o.Raw(sql, startDate, endDate, productId).QueryRows(&list)
+
+	return
+}

+ 63 - 0
models/contract/contract.go

@@ -579,3 +579,66 @@ func GetContractListByCompanyName(companyName string) (item *ContractList, err e
 	err = o.Raw(sql, companyName).QueryRow(&item)
 	return
 }
+
+type RenewCompanyGroup struct {
+	SellerId int `description:"所属销售id"`
+	//AdminName string `description:"所属销售名称"`
+	Num        int    `description:"汇总次数"`
+	CompanyIds string `description:"客户id字符串"`
+}
+
+// GetExpiresCompanyGroupList 获取销售到期数据
+func GetExpiresCompanyGroupList(startDate, endDate time.Time, productId int) (list []*RenewCompanyGroup, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+	a.seller_id,
+	count(
+	DISTINCT ( a.company_id )) num,
+	GROUP_CONCAT( DISTINCT a.company_id SEPARATOR ',' ) AS company_ids 
+FROM
+	company_product as a 
+join company_contract as b on a.company_id=b.company_id and a.product_id=b.product_id
+WHERE
+	a.product_id=?
+AND	b.product_id=?
+AND
+	b.end_date >= ?
+	AND b.end_date < ? 
+AND b.status = 1
+GROUP BY
+	a.seller_id
+`
+	_, err = o.Raw(sql, productId, productId, startDate, endDate).QueryRows(&list)
+
+	return
+}
+
+// GetCountFormalCompany
+// @Description: 获取某个时间点前的合同客户数量
+// @author: Roc
+// @datetime 2023-12-05 09:36:28
+// @param endDate time.Time
+// @param productId int
+// @return total int
+// @return err error
+func GetCountFormalCompany(endDate time.Time, productId int) (total int, err error) {
+	o := orm.NewOrm()
+	sql := `select count(1) total from (
+    SELECT
+	a.seller_id
+FROM
+	company_product as a 
+join company_contract as b on a.company_id=b.company_id and a.product_id=b.product_id
+WHERE
+	a.product_id=?
+AND	b.product_id=?
+	AND b.end_date < ? 
+AND b.status = 1
+GROUP BY
+	a.company_id
+)
+`
+	err = o.Raw(sql, productId, productId, endDate).QueryRow(&total)
+
+	return
+}

+ 1 - 0
models/db.go

@@ -261,6 +261,7 @@ func initCompany() {
 		new(company.CompanyNoRenewedAscribe),                 // 确认不续约记录
 		new(company.CompanyNoRenewedAscribeLog),              // 确认不续约记录日志
 		new(company.CrmConfig),                               // 管理后台基本配置表
+		new(company.CompanyRenewalRecord),                    // 客户续约状态记录表
 	)
 }
 

+ 88 - 22
services/statistic_report/renew_company.go

@@ -1,6 +1,7 @@
 package statistic_report
 
 import (
+	"fmt"
 	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/contract"
 	"hongze/hz_crm_api/utils"
@@ -9,16 +10,20 @@ import (
 )
 
 type CompanyRenewDataMap struct {
-	NotRenewMap      map[int]int    `description:"未续约客户数"`
-	NotRenewIdMap    map[int]string `description:"未续约客户ids"`
-	RenewFollowMap   map[int]int    `description:"续约跟进客户数"`
-	RenewFollowIdMap map[int]string `description:"续约跟进客户ids"`
-	ExpireMap        map[int]int    `description:"到期客户数"`
-	ExpireIdMap      map[int]string `description:"到期客户ids"`
-	RenewMap         map[int]int    `description:"续约客户数"`
-	RenewIdMap       map[int]string `description:"续约客户ids"`
-	StartDate        string         `description:"开始日期"`
-	EndDate          string         `description:"开始日期"`
+	NotRenewMap        map[int]int    `description:"未续约客户数"`
+	NotRenewIdMap      map[int]string `description:"未续约客户ids"`
+	RenewFollowMap     map[int]int    `description:"续约跟进客户数"`
+	RenewFollowIdMap   map[int]string `description:"续约跟进客户ids"`
+	ExpireMap          map[int]int    `description:"到期客户数"`
+	ExpireIdMap        map[int]string `description:"到期客户ids"`
+	RenewMap           map[int]int    `description:"续约客户数"`
+	RenewIdMap         map[int]string `description:"续约客户ids"`
+	UnusualRenewMap    map[int]int    `description:"续约异常客户数"`
+	UnusualRenewIdMap  map[int]string `description:"续约异常客户ids"`
+	UnusualRenewTotal  int            `description:"续约异常客户总数(去重)"`
+	FormalCompanyTotal int            `description:"当前正常客户总数(去重)"`
+	StartDate          string         `description:"开始日期"`
+	EndDate            string         `description:"开始日期"`
 }
 
 // GetRenewWeekDataNum 周度数据
@@ -110,6 +115,7 @@ func getRenewSectionData(productId int, startDate, endDate time.Time, ch chan Co
 	renewFollowMap := make(map[int]int)
 	expireMap := make(map[int]int)
 	renewMap := make(map[int]int)
+	unusualRenewMap := make(map[int]int) // 续约异常客户
 
 	//activeMap := make(map[int]int)              //新增的试用客户数量(活跃)
 	//allActiveMap := make(map[int]int)           //全部的试用客户数量(活跃)
@@ -119,6 +125,13 @@ func getRenewSectionData(productId int, startDate, endDate time.Time, ch chan Co
 	renewFollowIdMap := make(map[int]string)
 	expireIdMap := make(map[int]string)
 	renewIdMap := make(map[int]string)
+	unusualRenewCompanyIdMap := make(map[int]string)     // 续约异常客户
+	var unusualRenewCompanyTotal, formalCompanyTotal int //续约异常客户总数  , 当前正式的客户数
+	formalCompanyTotal, err = contract.GetCountFormalCompany(endDate, productId)
+	if err != nil {
+		utils.FileLog.Error(err.Error())
+		return
+	}
 
 	//activeIdMap := make(map[int]string)              //新增的试用客户id集合(活跃)
 	//allActiveIdMap := make(map[int]string)           //全部的试用客户id集合(活跃)
@@ -207,7 +220,7 @@ func getRenewSectionData(productId int, startDate, endDate time.Time, ch chan Co
 	//到期
 	//companyIdList := make([]string, 0)
 	{
-		data, tmpErr := company.GetExpiresCompanyGroupList(startDate, endDate, productId)
+		data, tmpErr := contract.GetExpiresCompanyGroupList(startDate, endDate, productId)
 
 		if tmpErr != nil {
 			err = tmpErr
@@ -224,7 +237,7 @@ func getRenewSectionData(productId int, startDate, endDate time.Time, ch chan Co
 		}
 	}
 
-	//续约
+	// 续约
 	//companyIdList := make([]string, 0)
 	{
 		contractIds, tmpErr := contract.GetLatestContractListByProductId(productId)
@@ -251,17 +264,70 @@ func getRenewSectionData(productId int, startDate, endDate time.Time, ch chan Co
 		}
 	}
 
+	// 续约异常
+	{
+
+		data, tmpErr := company.GetUnusualRenewCompanyList(startDate, endDate, productId)
+
+		if tmpErr != nil {
+			err = tmpErr
+			utils.FileLog.Error(err.Error())
+			return
+		}
+
+		unusualRenewCompanyIdListMap := make(map[int][]string) // 续约异常客户
+		for _, v := range data {
+			tmp, ok := unusualRenewMap[v.SellerId]
+			if !ok {
+				tmp = 0
+			}
+			unusualRenewMap[v.SellerId] = tmp + 1
+
+			// 共享人id不为空,且不是所属销售
+			if v.ShareSellerId > 0 && v.ShareSellerId != v.SellerId {
+				tmp2, ok := unusualRenewMap[v.ShareSellerId]
+				if !ok {
+					tmp = 0
+				}
+				unusualRenewMap[v.ShareSellerId] = tmp2 + 1
+			}
+
+			// 客户id
+			tmpCompanyIdList, ok := unusualRenewCompanyIdListMap[v.SellerId]
+			if !ok {
+				tmpCompanyIdList = make([]string, 0)
+			}
+			unusualRenewCompanyIdListMap[v.SellerId] = append(tmpCompanyIdList, fmt.Sprint(v.CompanyId))
+
+			tmpCompanyIdList2, ok := unusualRenewCompanyIdListMap[v.ShareSellerId]
+			if !ok {
+				tmpCompanyIdList2 = make([]string, 0)
+			}
+			unusualRenewCompanyIdListMap[v.ShareSellerId] = append(tmpCompanyIdList2, fmt.Sprint(v.CompanyId))
+
+			unusualRenewCompanyTotal++
+		}
+
+		for sellerId, tmpCompanyIdList := range unusualRenewCompanyIdListMap {
+			unusualRenewCompanyIdMap[sellerId] = strings.Join(tmpCompanyIdList, ",")
+		}
+	}
+
 	adminDataMap = CompanyRenewDataMap{
-		NotRenewMap:      notRenewMap,
-		NotRenewIdMap:    notRenewIdMap,
-		RenewFollowMap:   renewFollowMap,
-		RenewFollowIdMap: renewFollowIdMap,
-		ExpireMap:        expireMap,
-		ExpireIdMap:      expireIdMap,
-		RenewMap:         renewMap,
-		RenewIdMap:       renewIdMap,
-		StartDate:        startDate.Format(utils.FormatDate),
-		EndDate:          endDate.Format(utils.FormatDate),
+		NotRenewMap:        notRenewMap,
+		NotRenewIdMap:      notRenewIdMap,
+		RenewFollowMap:     renewFollowMap,
+		RenewFollowIdMap:   renewFollowIdMap,
+		ExpireMap:          expireMap,
+		ExpireIdMap:        expireIdMap,
+		RenewMap:           renewMap,
+		RenewIdMap:         renewIdMap,
+		UnusualRenewMap:    unusualRenewMap,
+		UnusualRenewIdMap:  unusualRenewCompanyIdMap,
+		UnusualRenewTotal:  unusualRenewCompanyTotal,
+		FormalCompanyTotal: formalCompanyTotal,
+		StartDate:          startDate.Format(utils.FormatDate),
+		EndDate:            endDate.Format(utils.FormatDate),
 	}
 	return
 }

+ 13 - 10
services/statistic_report/reponse.go

@@ -173,16 +173,19 @@ type AdminRenewRecord struct {
 
 // CompanyRenewRecordNum 系统续约客户统计信息
 type CompanyRenewRecordNum struct {
-	NotRenewNum    int    `description:"未续约客户数"`
-	NotRenewIds    string `description:"未续约客户ids"`
-	RenewFollowNum int    `description:"续约跟进客户数"`
-	RenewFollowIds string `description:"续约跟进客户ids"`
-	ExpireNum      int    `description:"到期客户数"`
-	ExpireIds      string `description:"到期客户ids"`
-	RenewNum       int    `description:"续约客户数"`
-	RenewIds       string `description:"续约客户ids"`
-	StartDate      string `description:"开始日期"`
-	EndDate        string `description:"结束日期"`
+	NotRenewNum     int    `description:"未续约客户数"`
+	NotRenewIds     string `description:"未续约客户ids"`
+	RenewFollowNum  int    `description:"续约跟进客户数"`
+	RenewFollowIds  string `description:"续约跟进客户ids"`
+	ExpireNum       int    `description:"到期客户数"`
+	ExpireIds       string `description:"到期客户ids"`
+	RenewNum        int    `description:"续约客户数"`
+	RenewIds        string `description:"续约客户ids"`
+	StartDate       string `description:"开始日期"`
+	EndDate         string `description:"结束日期"`
+	UnusualRenewNum int    `description:"续约异常客户数"`
+	UnusualRenewIds string `description:"续约异常客户ids"`
+	UnusualRate     string `description:"异常率"`
 }
 
 type YbChartCollectListResp struct {