Browse Source

feat:新增续约异常统计列表

Roc 1 year ago
parent
commit
982f6cef75

+ 145 - 1
controllers/statistic_report.go

@@ -6143,7 +6143,7 @@ func (this *StatisticReportController) InvoicePaymentList() {
 	br.Data = results
 }
 
-// ServiceList
+// SimpleList
 // @Title 合同套餐列表
 // @Description 合同套餐列表
 // @Param   ProductId  query  int  false  "套餐类型: 1-FICC(默认); 2-权益"
@@ -6215,3 +6215,147 @@ func (this *StatisticReportController) SimpleList() {
 	br.Msg = "获取成功"
 	br.Data = respList
 }
+
+// UnusualRenewCompanyStatistics
+// @Title 获取续约异常的客户统计数据
+// @Description 获取续约客户统计数据接口
+// @Param   DataType   query   string  true       "枚举值:week、month、time_interval"
+// @Param   StartDate   query   string  true       "开始日期,格式:2022-04-06"
+// @Param   EndDate   query   string  true       "结束日期,格式:2022-04-06"
+// @Success 200 {object} statistic_report.CompanyUnusualRenewRecordResp
+// @router /report/unusual_renew_company [get]
+func (this *StatisticReportController) UnusualRenewCompanyStatistics() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	dataType := this.GetString("DataType")
+	productId, _ := this.GetInt("ProductId", 1)
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+
+	var companyUnusualRenewDataMapList []statistic_report.UnusualCompanyRenewDataMap
+	var err error
+	//var firstDate time.Time
+	switch dataType {
+	//获取列表
+	case "week":
+		nowWeekMonday := utils.GetNowWeekMonday() //本周周一
+		//companyRenewDataMapList, firstDate, err = statistic_report.GetWeekData()
+		companyUnusualRenewDataMapList, _, err = statistic_report.GetUnusualRenewWeekDataNum(nowWeekMonday, productId, 6)
+		if err != nil {
+			br.Msg = "数据异常"
+			br.ErrMsg = "数据异常,Err:" + err.Error()
+			return
+		}
+	case "month":
+		nowMonthFirstDay := utils.GetNowMonthFirstDay() //本月第一天
+		companyUnusualRenewDataMapList, _, err = statistic_report.GetUnusualRenewMonthDataNum(nowMonthFirstDay, productId, 6)
+		if err != nil {
+			br.Msg = "数据异常"
+			br.ErrMsg = "数据异常,Err:" + err.Error()
+			return
+		}
+	case "time_interval":
+		if startDate == `` || endDate == `` {
+			br.Msg = "开始日期或结束日期不能为空"
+			br.ErrMsg = "开始日期或结束日期不能为空,Err:" + err.Error()
+			return
+		}
+		companyUnusualRenewDataMapList, _, err = statistic_report.GetUnusualRenewTimeIntervalData(productId, startDate, endDate)
+		if err != nil {
+			br.Msg = "数据异常"
+			br.ErrMsg = "数据异常,Err:" + err.Error()
+			return
+		}
+
+	}
+
+	var groupMap map[int][]*roadshow.Researcher
+
+	groupId := 0
+	if utils.RunMode == "release" {
+		groupId = 37
+	} else {
+		groupId = 61
+	}
+	subAdmins, err := system.GetAdminByGroupId(groupId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取销售失败"
+		br.ErrMsg = "获取销售失败,Err:" + err.Error()
+		return
+	}
+
+	//数据处理
+	list := make([]statistic_report.GroupUnusualRenewRecord, 0)
+	summaryList := make([]statistic_report.SummaryUnusualRenewRecordNum, 0)
+	companyRenewRecordResp := statistic_report.CompanyUnusualRenewRecordResp{
+		List:        list,
+		SummaryList: summaryList,
+	}
+
+	// 每日期组数据的汇总客户id
+	companyIdIndexMap := make(map[int][]string)
+	for _, v := range subAdmins {
+		tmpGroupCompanyRenewRecordNumList := make([]statistic_report.CompanyUnusualRenewRecordNum, 0)
+
+		for index, adminData := range companyUnusualRenewDataMapList {
+			tmpGroupCompanyRenewRecordNumList = append(tmpGroupCompanyRenewRecordNumList, statistic_report.CompanyUnusualRenewRecordNum{
+				UnusualRenewNum: adminData.UnusualRenewMap[v.AdminId],
+				UnusualRenewIds: adminData.UnusualRenewIdMap[v.AdminId],
+				StartDate:       adminData.StartDate,
+				EndDate:         adminData.EndDate,
+			})
+
+			if adminData.UnusualRenewIdMap[v.AdminId] != `` {
+				tmpCompanyIdList, ok := companyIdIndexMap[index]
+				if !ok {
+					tmpCompanyIdList = make([]string, 0)
+				}
+				companyIdIndexMap[index] = append(tmpCompanyIdList, adminData.UnusualRenewIdMap[v.AdminId])
+			}
+
+			if index == 0 {
+				unusualRate := ``
+				if adminData.UnusualRenewTotal > 0 && adminData.FormalCompanyTotal > 0 {
+					unusualRate = decimal.NewFromInt(int64(adminData.UnusualRenewTotal)).Div(decimal.NewFromInt(int64(adminData.FormalCompanyTotal))).Round(2).String()
+				}
+				summaryList = append(summaryList, statistic_report.SummaryUnusualRenewRecordNum{
+					UnusualRenewNum: adminData.UnusualRenewTotal,
+					UnusualRate:     unusualRate,
+				})
+			}
+		}
+		list = append(list, statistic_report.GroupUnusualRenewRecord{
+			SellerId:                  v.AdminId,
+			SellerName:                v.RealName,
+			CompanyRenewRecordNumList: tmpGroupCompanyRenewRecordNumList,
+		})
+	}
+
+	// 汇总数据
+	for index, v := range summaryList {
+		tmpCompanyIdList, ok := companyIdIndexMap[index]
+		if ok {
+			summaryList[index].UnusualRenewIds = strings.Join(tmpCompanyIdList, ",")
+		}
+	}
+
+	companyRenewRecordResp.List = list
+	companyRenewRecordResp.SummaryList = SummaryList
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = companyRenewRecordResp
+}

+ 9 - 0
routers/commentsRouter.go

@@ -10501,6 +10501,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"],
+        beego.ControllerComments{
+            Method: "UnusualRenewCompanyStatistics",
+            Router: `/report/unusual_renew_company`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"],
         beego.ControllerComments{
             Method: "StackCompanyList",

+ 33 - 0
services/statistic_report/reponse.go

@@ -198,3 +198,36 @@ type YbChartCollectListItem struct {
 	ChartInfo  *data_manage.ChartInfoView
 	CreateTime string
 }
+
+// CompanyUnusualRenewRecordResp
+// @Description: 续约异常客户统计返回
+type CompanyUnusualRenewRecordResp struct {
+	List        []GroupUnusualRenewRecord      `description:"系统用户分组信息"`
+	SummaryList []SummaryUnusualRenewRecordNum `description:"汇总信息"`
+}
+
+// GroupUnusualRenewRecord
+// @Description: 续约异常的分组信息
+type GroupUnusualRenewRecord struct {
+	SellerId                  int                            `description:"销售ID"`
+	SellerName                string                         `description:"销售名称"`
+	CompanyRenewRecordNumList []CompanyUnusualRenewRecordNum `description:"统计次数"`
+}
+
+// CompanyUnusualRenewRecordNum
+// @Description: 续约异常客户统计信息
+type CompanyUnusualRenewRecordNum struct {
+	StartDate       string `description:"开始日期"`
+	EndDate         string `description:"结束日期"`
+	UnusualRenewNum int    `description:"续约异常客户数"`
+	UnusualRenewIds string `description:"续约异常客户ids"`
+	UnusualRate     string `description:"异常率"`
+}
+
+// SummaryUnusualRenewRecordNum
+// @Description: 续约异常客户汇总数据
+type SummaryUnusualRenewRecordNum struct {
+	UnusualRenewNum int    `description:"续约异常客户数"`
+	UnusualRenewIds string `description:"续约异常客户ids"`
+	UnusualRate     string `description:"异常率"`
+}

+ 176 - 0
services/statistic_report/unusual_renew_company.go

@@ -0,0 +1,176 @@
+package statistic_report
+
+import (
+	"fmt"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/contract"
+	"hongze/hz_crm_api/utils"
+	"strings"
+	"time"
+)
+
+type UnusualCompanyRenewDataMap struct {
+	UnusualRenewMap    map[int]int    `description:"续约异常客户数"`
+	UnusualRenewIdMap  map[int]string `description:"续约异常客户ids"`
+	UnusualRenewTotal  int            `description:"续约异常客户总数(去重)"`
+	FormalCompanyTotal int            `description:"当前正常客户总数(去重)"`
+	StartDate          string         `description:"开始日期"`
+	EndDate            string         `description:"开始日期"`
+}
+
+// GetUnusualRenewWeekDataNum 周度数据
+func GetUnusualRenewWeekDataNum(nowWeekMonday time.Time, productId, dataNum int) (adminDataList []UnusualCompanyRenewDataMap, firstDate time.Time, err error) {
+	nowWeekSunday := nowWeekMonday.AddDate(0, 0, 7).Add(-1 * time.Second) //本周周日
+
+	chanList := make([]chan UnusualCompanyRenewDataMap, 0)
+	for i := 0; i < dataNum; i++ {
+		tmpCh := make(chan UnusualCompanyRenewDataMap, 0)
+		chanList = append(chanList, tmpCh)
+
+		lastWeekMonday := nowWeekMonday.AddDate(0, 0, -7*i)
+		lastWeekSunday := nowWeekSunday.AddDate(0, 0, -7*i)
+
+		// 第一个开始日期
+		firstDate = lastWeekMonday
+		go getUnusualRenewSectionData(productId, lastWeekMonday, lastWeekSunday, tmpCh)
+	}
+
+	adminDataList = make([]UnusualCompanyRenewDataMap, 0)
+	for _, vChan := range chanList {
+		var weekUnusualCompanyRenewDataMap UnusualCompanyRenewDataMap
+		weekUnusualCompanyRenewDataMap = <-vChan
+		close(vChan)
+		adminDataList = append(adminDataList, weekUnusualCompanyRenewDataMap)
+	}
+
+	return
+}
+
+// GetRenewMonthDataNum 月度数据
+func GetUnusualRenewMonthDataNum(nowMonthFirstDay time.Time, productId, dataNum int) (adminDataList []UnusualCompanyRenewDataMap, firstDate time.Time, err error) { //三个协程返回
+	//nowMonthLastDay := nowMonthFirstDay.AddDate(0, 1, 0).Add(-1 * time.Second) //本月最后一天
+
+	chanList := make([]chan UnusualCompanyRenewDataMap, 0)
+
+	for i := 0; i < dataNum; i++ {
+		tmpCh := make(chan UnusualCompanyRenewDataMap, 0)
+		chanList = append(chanList, tmpCh)
+
+		lastMonthFirstDay := nowMonthFirstDay.AddDate(0, -1*i, 0)                          //上个月第一天
+		lastMonthLastDay := nowMonthFirstDay.AddDate(0, -1*(i-1), 0).Add(-1 * time.Second) //上个月最后一天
+
+		// 第一个开始日期
+		firstDate = lastMonthFirstDay
+		go getUnusualRenewSectionData(productId, lastMonthFirstDay, lastMonthLastDay, tmpCh)
+	}
+
+	adminDataList = make([]UnusualCompanyRenewDataMap, 0)
+	for _, vChan := range chanList {
+		var weekUnusualCompanyRenewDataMap UnusualCompanyRenewDataMap
+		weekUnusualCompanyRenewDataMap = <-vChan
+		close(vChan)
+		adminDataList = append(adminDataList, weekUnusualCompanyRenewDataMap)
+	}
+
+	return
+}
+
+// GetRenewTimeIntervalData 区间数据
+func GetUnusualRenewTimeIntervalData(productId int, startDate, endDate string) (adminDataMapList []UnusualCompanyRenewDataMap, firstDate time.Time, err error) { //三个协程返回
+	startDateTimer, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+	endDateTimer, _ := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
+	endDateTimer = endDateTimer.AddDate(0, 0, 1).Add(-1 * time.Second) //本月最后一天
+
+	//最早的一天
+	firstDate = startDateTimer
+
+	ch1 := make(chan UnusualCompanyRenewDataMap, 0)
+
+	go getUnusualRenewSectionData(productId, startDateTimer, endDateTimer, ch1)
+
+	var adminDataMap UnusualCompanyRenewDataMap
+
+	adminDataMap = <-ch1
+	close(ch1)
+
+	adminDataMapList = make([]UnusualCompanyRenewDataMap, 0)
+	adminDataMapList = append(adminDataMapList, adminDataMap)
+	return
+}
+
+// getUnusualRenewSectionData 获取周期数据
+func getUnusualRenewSectionData(productId int, startDate, endDate time.Time, ch chan UnusualCompanyRenewDataMap) (adminDataMap UnusualCompanyRenewDataMap, err error) {
+	defer func() {
+		ch <- adminDataMap
+	}()
+	unusualRenewMap := make(map[int]int)                 // 续约异常客户
+	unusualRenewCompanyIdMap := make(map[int]string)     // 续约异常客户id
+	var unusualRenewCompanyTotal, formalCompanyTotal int //续约异常客户总数  , 当前正式的客户数
+
+	// 当前正式的客户数
+	formalCompanyTotal, err = contract.GetCountFormalCompany(endDate, productId)
+	if err != nil {
+		utils.FileLog.Error(err.Error())
+		return
+	}
+
+	// 续约异常
+	{
+
+		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 = UnusualCompanyRenewDataMap{
+		UnusualRenewMap:    unusualRenewMap,
+		UnusualRenewIdMap:  unusualRenewCompanyIdMap,
+		UnusualRenewTotal:  unusualRenewCompanyTotal,
+		FormalCompanyTotal: formalCompanyTotal,
+		StartDate:          startDate.Format(utils.FormatDate),
+		EndDate:            endDate.Format(utils.FormatDate),
+	}
+	return
+}
+