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 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"` UnusualRenewMap map[int]int `description:"续约异常客户数"` UnusualRenewIdMap map[int]string `description:"续约异常客户ids"` UnusualRenewTotal int `description:"续约异常客户总数(去重)"` FormalCompanyTotal int `description:"当前正常客户总数(去重)"` StartDate string `description:"开始日期"` EndDate string `description:"开始日期"` } // GetRenewWeekDataNum 周度数据 func GetRenewWeekDataNum(nowWeekMonday time.Time, productId, dataNum int) (adminDataList []CompanyRenewDataMap, firstDate time.Time, err error) { nowWeekSunday := nowWeekMonday.AddDate(0, 0, 7).Add(-1 * time.Second) //本周周日 chanList := make([]chan CompanyRenewDataMap, 0) for i := 0; i < dataNum; i++ { tmpCh := make(chan CompanyRenewDataMap, 0) chanList = append(chanList, tmpCh) lastWeekMonday := nowWeekMonday.AddDate(0, 0, -7*i) lastWeekSunday := nowWeekSunday.AddDate(0, 0, -7*i) // 第一个开始日期 firstDate = lastWeekMonday go getRenewSectionData(productId, lastWeekMonday, lastWeekSunday, tmpCh) } adminDataList = make([]CompanyRenewDataMap, 0) for _, vChan := range chanList { var weekCompanyRenewDataMap CompanyRenewDataMap weekCompanyRenewDataMap = <-vChan close(vChan) adminDataList = append(adminDataList, weekCompanyRenewDataMap) } return } // GetRenewMonthDataNum 月度数据 func GetRenewMonthDataNum(nowMonthFirstDay time.Time, productId, dataNum int) (adminDataList []CompanyRenewDataMap, firstDate time.Time, err error) { //三个协程返回 //nowMonthLastDay := nowMonthFirstDay.AddDate(0, 1, 0).Add(-1 * time.Second) //本月最后一天 chanList := make([]chan CompanyRenewDataMap, 0) for i := 0; i < dataNum; i++ { tmpCh := make(chan CompanyRenewDataMap, 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 getRenewSectionData(productId, lastMonthFirstDay, lastMonthLastDay, tmpCh) } adminDataList = make([]CompanyRenewDataMap, 0) for _, vChan := range chanList { var weekCompanyRenewDataMap CompanyRenewDataMap weekCompanyRenewDataMap = <-vChan close(vChan) adminDataList = append(adminDataList, weekCompanyRenewDataMap) } return } // GetRenewTimeIntervalData 区间数据 func GetRenewTimeIntervalData(productId int, startDate, endDate string) (adminDataMapList []CompanyRenewDataMap, 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 CompanyRenewDataMap, 0) go getRenewSectionData(productId, startDateTimer, endDateTimer, ch1) var adminDataMap CompanyRenewDataMap adminDataMap = <-ch1 close(ch1) adminDataMapList = make([]CompanyRenewDataMap, 0) adminDataMapList = append(adminDataMapList, adminDataMap) return } // getRenewSectionData 获取周期数据 func getRenewSectionData(productId int, startDate, endDate time.Time, ch chan CompanyRenewDataMap) (adminDataMap CompanyRenewDataMap, err error) { defer func() { if err != nil { utils.FileLog.Error("getRenewSectionData,err:" + err.Error()) fmt.Println(err) } ch <- adminDataMap }() notRenewMap := make(map[int]int) 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) //全部的试用客户数量(活跃) //noIncrementalActiveMap := make(map[int]int) //非新增的试用客户数量(活跃) notRenewIdMap := make(map[int]string) renewFollowIdMap := make(map[int]string) expireIdMap := make(map[int]string) renewIdMap := make(map[int]string) unusualRenewCompanyIdMap := make(map[int]string) // 续约异常客户 var formalCompanyTotal int //续约异常客户总数 , 当前正式的客户数 formalCompanyTotal, err = contract.GetCountFormalCompany(endDate, productId) if err != nil { return } //activeIdMap := make(map[int]string) //新增的试用客户id集合(活跃) //allActiveIdMap := make(map[int]string) //全部的试用客户id集合(活跃) //noIncrementalActiveIdMap := make(map[int]string) //非新增的试用客户id集合(活跃) //未续约客户 { //var condition string //var pars []interface{} //condition = ` and op.create_time >= ? and op.create_time <= ? ` //pars = append(pars, startDate, endDate) data, tmpErr := company.GetNotRenewCompanyGroupList(productId) if tmpErr != nil { err = tmpErr utils.FileLog.Error(err.Error()) return } var notRenewIdSlice []string for _, v := range data { notRenewIdSlice = append(notRenewIdSlice, v.CompanyIds) notRenewMap[v.SellerId] = v.Num notRenewIdMap[v.SellerId] = v.CompanyIds } } //续约跟进 companyIdList := make([]string, 0) { //var condition string //var pars []interface{} //condition = ` and op.create_time >= ? and op.create_time <= ? ` //pars = append(pars, startDate, endDate) //获取客户本轮合同周期开始时间 list, tmpErr := company.GetCompanyApproveCreateTimeList(productId) if tmpErr != nil { err = tmpErr utils.FileLog.Error(err.Error()) return } //获取历史经历过冻结或流失的客户 freezeList, tmpErr := company.GetNotRenewFollowCompanyGroupList(productId) if tmpErr != nil { err = tmpErr utils.FileLog.Error(err.Error()) return } freezeCompanyMap := make(map[string]time.Time) for _, item := range freezeList { freezeCompanyMap[item.CompanyId] = item.CreateTime } for _, item := range list { if freezeTime, ok := freezeCompanyMap[item.CompanyId]; ok { //如果有过冻结或流失历史,若时间早于本轮合同开始时间就不排除,如果晚于合同开始时间就排除 if freezeTime.Before(item.CreateTime) { delete(freezeCompanyMap, item.CompanyId) } } } idArray := make([]string, 0) for k := range freezeCompanyMap { idArray = append(idArray, k) } ids := strings.Join(idArray, ",") data, tmpErr := company.GetRenewFollowCompanyGroupList(ids, productId) if tmpErr != nil { err = tmpErr utils.FileLog.Error(err.Error()) return } var renewFollowIdSlice []string for _, v := range data { tmpSlice := strings.Split(v.CompanyIds, ",") companyIdList = append(companyIdList, tmpSlice...) renewFollowIdSlice = append(renewFollowIdSlice, v.CompanyIds) renewFollowMap[v.SellerId] = v.Num renewFollowIdMap[v.SellerId] = v.CompanyIds } } //到期 //companyIdList := make([]string, 0) { data, tmpErr := contract.GetExpiresCompanyGroupList(startDate, endDate, productId) if tmpErr != nil { err = tmpErr utils.FileLog.Error(err.Error()) return } var expireIdSlice []string for _, v := range data { //tmpSlice := strings.Split(v.CompanyIds, ",") //companyIdList = append(companyIdList, tmpSlice...) expireIdSlice = append(expireIdSlice, v.CompanyIds) expireMap[v.SellerId] = v.Num expireIdMap[v.SellerId] = v.CompanyIds } } // 续约 //companyIdList := make([]string, 0) { contractIds, tmpErr := contract.GetLatestContractListByProductId(productId) if tmpErr != nil { err = tmpErr utils.FileLog.Error(err.Error()) return } contractId := strings.Join(contractIds, ",") data, tmpErr := company.GetRenewCompanyGroupList(startDate, endDate, contractId) if tmpErr != nil { err = tmpErr return } var renewIdSlice []string for _, v := range data { //tmpSlice := strings.Split(v.CompanyIds, ",") //companyIdList = append(companyIdList, tmpSlice...) renewIdSlice = append(renewIdSlice, v.CompanyIds) renewMap[v.SellerId] = v.Num renewIdMap[v.SellerId] = v.CompanyIds } } // 续约异常 { 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, UnusualRenewMap: unusualRenewMap, UnusualRenewIdMap: unusualRenewCompanyIdMap, //UnusualRenewTotal: unusualRenewCompanyTotal, FormalCompanyTotal: formalCompanyTotal, StartDate: startDate.Format(utils.FormatDate), EndDate: endDate.Format(utils.FormatDate), } return } // SortGroupSellers 部门用户排序 func SortGroupSellers(adminList []GroupRenewRecord) (list []GroupRenewRecord) { groupMap := make(map[int][]GroupRenewRecord) for _, admin := range adminList { index := 0 //0:普通私募,1:未分组,2:公募组,3:海外销售组 switch admin.GroupId { case 17: index = 1 case 10: index = 2 case 19: index = 3 default: index = 0 } groupList, ok := groupMap[index] if !ok { groupList = make([]GroupRenewRecord, 0) } groupList = append(groupList, admin) groupMap[index] = groupList } var indexList = []int{0, 1, 2, 3} for _, index := range indexList { groupList, ok := groupMap[index] if ok { list = append(list, groupList...) } } return }