renew_company.go 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. package statistic_report
  2. import (
  3. "hongze/hz_crm_api/models/company"
  4. "hongze/hz_crm_api/models/contract"
  5. "hongze/hz_crm_api/utils"
  6. "strings"
  7. "time"
  8. )
  9. type CompanyRenewDataMap struct {
  10. NotRenewMap map[int]int `description:"未续约客户数"`
  11. NotRenewIdMap map[int]string `description:"未续约客户ids"`
  12. RenewFollowMap map[int]int `description:"续约跟进客户数"`
  13. RenewFollowIdMap map[int]string `description:"续约跟进客户ids"`
  14. ExpireMap map[int]int `description:"到期客户数"`
  15. ExpireIdMap map[int]string `description:"到期客户ids"`
  16. RenewMap map[int]int `description:"续约客户数"`
  17. RenewIdMap map[int]string `description:"续约客户ids"`
  18. StartDate string `description:"开始日期"`
  19. EndDate string `description:"开始日期"`
  20. }
  21. // GetRenewWeekDataNum 周度数据
  22. func GetRenewWeekDataNum(nowWeekMonday time.Time, productId, dataNum int) (adminDataList []CompanyRenewDataMap, firstDate time.Time, err error) {
  23. nowWeekSunday := nowWeekMonday.AddDate(0, 0, 7).Add(-1 * time.Second) //本周周日
  24. chanList := make([]chan CompanyRenewDataMap, 0)
  25. for i := 0; i < dataNum; i++ {
  26. tmpCh := make(chan CompanyRenewDataMap, 0)
  27. chanList = append(chanList, tmpCh)
  28. lastWeekMonday := nowWeekMonday.AddDate(0, 0, -7*i)
  29. lastWeekSunday := nowWeekSunday.AddDate(0, 0, -7*i)
  30. // 第一个开始日期
  31. firstDate = lastWeekMonday
  32. go getRenewSectionData(productId, lastWeekMonday, lastWeekSunday, tmpCh)
  33. }
  34. adminDataList = make([]CompanyRenewDataMap, 0)
  35. for _, vChan := range chanList {
  36. var weekCompanyRenewDataMap CompanyRenewDataMap
  37. weekCompanyRenewDataMap = <-vChan
  38. close(vChan)
  39. adminDataList = append(adminDataList, weekCompanyRenewDataMap)
  40. }
  41. return
  42. }
  43. // GetRenewMonthDataNum 月度数据
  44. func GetRenewMonthDataNum(nowMonthFirstDay time.Time, productId, dataNum int) (adminDataList []CompanyRenewDataMap, firstDate time.Time, err error) { //三个协程返回
  45. //nowMonthLastDay := nowMonthFirstDay.AddDate(0, 1, 0).Add(-1 * time.Second) //本月最后一天
  46. chanList := make([]chan CompanyRenewDataMap, 0)
  47. for i := 0; i < dataNum; i++ {
  48. tmpCh := make(chan CompanyRenewDataMap, 0)
  49. chanList = append(chanList, tmpCh)
  50. lastMonthFirstDay := nowMonthFirstDay.AddDate(0, -1*i, 0) //上个月第一天
  51. lastMonthLastDay := nowMonthFirstDay.AddDate(0, -1*(i-1), 0).Add(-1 * time.Second) //上个月最后一天
  52. // 第一个开始日期
  53. firstDate = lastMonthFirstDay
  54. go getRenewSectionData(productId, lastMonthFirstDay, lastMonthLastDay, tmpCh)
  55. }
  56. adminDataList = make([]CompanyRenewDataMap, 0)
  57. for _, vChan := range chanList {
  58. var weekCompanyRenewDataMap CompanyRenewDataMap
  59. weekCompanyRenewDataMap = <-vChan
  60. close(vChan)
  61. adminDataList = append(adminDataList, weekCompanyRenewDataMap)
  62. }
  63. return
  64. }
  65. // GetRenewTimeIntervalData 区间数据
  66. func GetRenewTimeIntervalData(productId int, startDate, endDate string) (adminDataMapList []CompanyRenewDataMap, firstDate time.Time, err error) { //三个协程返回
  67. startDateTimer, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  68. endDateTimer, _ := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  69. endDateTimer = endDateTimer.AddDate(0, 0, 1).Add(-1 * time.Second) //本月最后一天
  70. //最早的一天
  71. firstDate = startDateTimer
  72. ch1 := make(chan CompanyRenewDataMap, 0)
  73. go getRenewSectionData(productId, startDateTimer, endDateTimer, ch1)
  74. var adminDataMap CompanyRenewDataMap
  75. adminDataMap = <-ch1
  76. close(ch1)
  77. adminDataMapList = make([]CompanyRenewDataMap, 0)
  78. adminDataMapList = append(adminDataMapList, adminDataMap)
  79. return
  80. }
  81. // getRenewSectionData 获取周期数据
  82. func getRenewSectionData(productId int, startDate, endDate time.Time, ch chan CompanyRenewDataMap) (adminDataMap CompanyRenewDataMap, err error) {
  83. defer func() {
  84. ch <- adminDataMap
  85. }()
  86. notRenewMap := make(map[int]int)
  87. renewFollowMap := make(map[int]int)
  88. expireMap := make(map[int]int)
  89. renewMap := make(map[int]int)
  90. //activeMap := make(map[int]int) //新增的试用客户数量(活跃)
  91. //allActiveMap := make(map[int]int) //全部的试用客户数量(活跃)
  92. //noIncrementalActiveMap := make(map[int]int) //非新增的试用客户数量(活跃)
  93. notRenewIdMap := make(map[int]string)
  94. renewFollowIdMap := make(map[int]string)
  95. expireIdMap := make(map[int]string)
  96. renewIdMap := make(map[int]string)
  97. //activeIdMap := make(map[int]string) //新增的试用客户id集合(活跃)
  98. //allActiveIdMap := make(map[int]string) //全部的试用客户id集合(活跃)
  99. //noIncrementalActiveIdMap := make(map[int]string) //非新增的试用客户id集合(活跃)
  100. //未续约客户
  101. {
  102. //var condition string
  103. //var pars []interface{}
  104. //condition = ` and op.create_time >= ? and op.create_time <= ? `
  105. //pars = append(pars, startDate, endDate)
  106. data, tmpErr := company.GetNotRenewCompanyGroupList(productId)
  107. if tmpErr != nil {
  108. err = tmpErr
  109. utils.FileLog.Error(err.Error())
  110. return
  111. }
  112. var notRenewIdSlice []string
  113. for _, v := range data {
  114. notRenewIdSlice = append(notRenewIdSlice, v.CompanyIds)
  115. notRenewMap[v.SellerId] = v.Num
  116. notRenewIdMap[v.SellerId] = v.CompanyIds
  117. }
  118. }
  119. //续约跟进
  120. companyIdList := make([]string, 0)
  121. {
  122. //var condition string
  123. //var pars []interface{}
  124. //condition = ` and op.create_time >= ? and op.create_time <= ? `
  125. //pars = append(pars, startDate, endDate)
  126. //获取客户本轮合同周期开始时间
  127. list, tmpErr := company.GetCompanyApproveCreateTimeList(productId)
  128. if tmpErr != nil {
  129. err = tmpErr
  130. utils.FileLog.Error(err.Error())
  131. return
  132. }
  133. //获取历史经历过冻结或流失的客户
  134. freezeList, tmpErr := company.GetNotRenewFollowCompanyGroupList(productId)
  135. if tmpErr != nil {
  136. err = tmpErr
  137. utils.FileLog.Error(err.Error())
  138. return
  139. }
  140. freezeCompanyMap := make(map[string]time.Time)
  141. for _, item := range freezeList {
  142. freezeCompanyMap[item.CompanyId] = item.CreateTime
  143. }
  144. for _, item := range list {
  145. if freezeTime, ok := freezeCompanyMap[item.CompanyId]; ok {
  146. //如果有过冻结或流失历史,若时间早于本轮合同开始时间就不排除,如果晚于合同开始时间就排除
  147. if freezeTime.Before(item.CreateTime) {
  148. delete(freezeCompanyMap, item.CompanyId)
  149. }
  150. }
  151. }
  152. idArray := make([]string, 0)
  153. for k := range freezeCompanyMap {
  154. idArray = append(idArray, k)
  155. }
  156. ids := strings.Join(idArray, ",")
  157. data, tmpErr := company.GetRenewFollowCompanyGroupList(ids, productId)
  158. if tmpErr != nil {
  159. err = tmpErr
  160. utils.FileLog.Error(err.Error())
  161. return
  162. }
  163. var renewFollowIdSlice []string
  164. for _, v := range data {
  165. tmpSlice := strings.Split(v.CompanyIds, ",")
  166. companyIdList = append(companyIdList, tmpSlice...)
  167. renewFollowIdSlice = append(renewFollowIdSlice, v.CompanyIds)
  168. renewFollowMap[v.SellerId] = v.Num
  169. renewFollowIdMap[v.SellerId] = v.CompanyIds
  170. }
  171. }
  172. //到期
  173. //companyIdList := make([]string, 0)
  174. {
  175. data, tmpErr := company.GetExpiresCompanyGroupList(startDate, endDate, productId)
  176. if tmpErr != nil {
  177. err = tmpErr
  178. utils.FileLog.Error(err.Error())
  179. return
  180. }
  181. var expireIdSlice []string
  182. for _, v := range data {
  183. //tmpSlice := strings.Split(v.CompanyIds, ",")
  184. //companyIdList = append(companyIdList, tmpSlice...)
  185. expireIdSlice = append(expireIdSlice, v.CompanyIds)
  186. expireMap[v.SellerId] = v.Num
  187. expireIdMap[v.SellerId] = v.CompanyIds
  188. }
  189. }
  190. //续约
  191. //companyIdList := make([]string, 0)
  192. {
  193. contractIds, tmpErr := contract.GetLatestContractListByProductId(productId)
  194. if tmpErr != nil {
  195. err = tmpErr
  196. utils.FileLog.Error(err.Error())
  197. return
  198. }
  199. contractId := strings.Join(contractIds, ",")
  200. data, tmpErr := company.GetRenewCompanyGroupList(startDate, endDate, contractId)
  201. if tmpErr != nil {
  202. err = tmpErr
  203. utils.FileLog.Error(err.Error())
  204. return
  205. }
  206. var renewIdSlice []string
  207. for _, v := range data {
  208. //tmpSlice := strings.Split(v.CompanyIds, ",")
  209. //companyIdList = append(companyIdList, tmpSlice...)
  210. renewIdSlice = append(renewIdSlice, v.CompanyIds)
  211. renewMap[v.SellerId] = v.Num
  212. renewIdMap[v.SellerId] = v.CompanyIds
  213. }
  214. }
  215. adminDataMap = CompanyRenewDataMap{
  216. NotRenewMap: notRenewMap,
  217. NotRenewIdMap: notRenewIdMap,
  218. RenewFollowMap: renewFollowMap,
  219. RenewFollowIdMap: renewFollowIdMap,
  220. ExpireMap: expireMap,
  221. ExpireIdMap: expireIdMap,
  222. RenewMap: renewMap,
  223. RenewIdMap: renewIdMap,
  224. StartDate: startDate.Format(utils.FormatDate),
  225. EndDate: endDate.Format(utils.FormatDate),
  226. }
  227. return
  228. }
  229. // SortGroupSellers 部门用户排序
  230. func SortGroupSellers(adminList []GroupRenewRecord) (list []GroupRenewRecord) {
  231. groupMap := make(map[int][]GroupRenewRecord)
  232. for _, admin := range adminList {
  233. index := 0 //0:普通私募,1:未分组,2:公募组,3:海外销售组
  234. switch admin.GroupId {
  235. case 17:
  236. index = 1
  237. case 10:
  238. index = 2
  239. case 19:
  240. index = 3
  241. default:
  242. index = 0
  243. }
  244. groupList, ok := groupMap[index]
  245. if !ok {
  246. groupList = make([]GroupRenewRecord, 0)
  247. }
  248. groupList = append(groupList, admin)
  249. groupMap[index] = groupList
  250. }
  251. var indexList = []int{0, 1, 2, 3}
  252. for _, index := range indexList {
  253. groupList, ok := groupMap[index]
  254. if ok {
  255. list = append(list, groupList...)
  256. }
  257. }
  258. return
  259. }