report.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. package roadshow
  2. import (
  3. "hongze/hz_crm_api/models/company"
  4. "hongze/hz_crm_api/models/roadshow"
  5. "hongze/hz_crm_api/utils"
  6. "time"
  7. )
  8. // GetWeekData 周度数据
  9. func GetWeekData(adminType, dimensionType string) (adminDataList []AdminDataMap, firstDate time.Time, err error) {
  10. nowWeekMonday := utils.GetNowWeekMonday() //本周周一
  11. //fmt.Println(nowWeekMonday)
  12. nowWeekSunday := nowWeekMonday.AddDate(0, 0, 7).Add(-1 * time.Second) //本周周日
  13. //fmt.Println(nowWeekSunday)
  14. //nowWeekMonday = nowWeekMonday.AddDate(0, 0, -30) //上周周一
  15. //nowWeekSunday = nowWeekSunday.AddDate(0, 0, -30) //上周周日
  16. //adminDataMap, err := getSectionData(nowWeekMonday, nowWeekSunday)
  17. //if err != nil {
  18. // fmt.Println(err)
  19. // return
  20. //}
  21. //fmt.Println(adminDataMap)
  22. lastWeekMonday := nowWeekMonday.AddDate(0, 0, -7) //上周周一
  23. //fmt.Println(lastWeekMonday)
  24. //最早的一天
  25. firstDate = lastWeekMonday
  26. lastWeekSunday := nowWeekSunday.AddDate(0, 0, -7) //上周周日
  27. //fmt.Println(lastWeekSunday)
  28. nextWeekMonday := nowWeekMonday.AddDate(0, 0, 7) //下周周一
  29. //fmt.Println(nextWeekMonday)
  30. nextWeekSunday := nowWeekSunday.AddDate(0, 0, 7) //下周周日
  31. //fmt.Println(nextWeekSunday)
  32. ch1 := make(chan AdminDataMap, 0)
  33. ch2 := make(chan AdminDataMap, 0)
  34. ch3 := make(chan AdminDataMap, 0)
  35. go getSectionData(lastWeekMonday, lastWeekSunday, adminType, dimensionType, ch1)
  36. go getSectionData(nowWeekMonday, nowWeekSunday, adminType, dimensionType, ch2)
  37. go getSectionData(nextWeekMonday, nextWeekSunday, adminType, dimensionType, ch3)
  38. var nowWeekAdminDataMap, lastWeekAdminDataMap, nextWeekAdminDataMap AdminDataMap
  39. lastWeekAdminDataMap = <-ch1
  40. close(ch1)
  41. nowWeekAdminDataMap = <-ch2
  42. close(ch2)
  43. nextWeekAdminDataMap = <-ch3
  44. close(ch3)
  45. adminDataList = make([]AdminDataMap, 0)
  46. adminDataList = append(adminDataList, lastWeekAdminDataMap, nowWeekAdminDataMap, nextWeekAdminDataMap)
  47. return
  48. }
  49. // GetWeekDataV2 周度数据
  50. func GetWeekDataV2(adminType, dimensionType string, weekNum int) (adminDataList []AdminDataMap, firstDate time.Time, err error) {
  51. nowWeekMonday := utils.GetNowWeekMonday() //本周周一
  52. //fmt.Println(nowWeekMonday)
  53. nowWeekSunday := nowWeekMonday.AddDate(0, 0, 7).Add(-1 * time.Second) //本周周日
  54. chanList := make([]chan AdminDataMap, 0)
  55. for i := 0; i < weekNum; i++ {
  56. tmpCh := make(chan AdminDataMap, 0)
  57. chanList = append(chanList, tmpCh)
  58. lastWeekMonday := nowWeekMonday.AddDate(0, 0, -7*i)
  59. lastWeekSunday := nowWeekSunday.AddDate(0, 0, -7*i)
  60. // 第一个开始日期
  61. firstDate = lastWeekMonday
  62. go getSectionData(lastWeekMonday, lastWeekSunday, adminType, dimensionType, tmpCh)
  63. }
  64. adminDataList = make([]AdminDataMap, 0)
  65. for _, vChan := range chanList {
  66. var weekAdminDataMap AdminDataMap
  67. weekAdminDataMap = <-vChan
  68. close(vChan)
  69. adminDataList = append(adminDataList, weekAdminDataMap)
  70. }
  71. return
  72. }
  73. // GetMonthData 月度数据
  74. func GetMonthData(adminType, dimensionType string) (adminDataMapList []AdminDataMap, firstDate time.Time, err error) { //三个协程返回
  75. nowMonthFirstDay := utils.GetNowMonthFirstDay() //本月第一天
  76. nowMonthLastDay := nowMonthFirstDay.AddDate(0, 1, 0).Add(-1 * time.Second) //本月最后一天
  77. lastMonthFirstDay1 := nowMonthFirstDay.AddDate(0, -1, 0) //上个月第一天
  78. lastMonthLastDay1 := lastMonthFirstDay1.AddDate(0, 1, 0).Add(-1 * time.Second) //上个月最后一天
  79. lastMonthFirstDay2 := nowMonthFirstDay.AddDate(0, -2, 0) //上上个月第一天
  80. lastMonthLastDay2 := lastMonthFirstDay2.AddDate(0, 1, 0).Add(-1 * time.Second) //上上个月最后一天
  81. lastMonthFirstDay3 := nowMonthFirstDay.AddDate(0, -3, 0) //上上上个月第一天
  82. lastMonthLastDay3 := lastMonthFirstDay3.AddDate(0, 1, 0).Add(-1 * time.Second) //上上上个月最后一天
  83. //最早的一天
  84. firstDate = lastMonthFirstDay3
  85. ch1 := make(chan AdminDataMap, 0)
  86. ch2 := make(chan AdminDataMap, 0)
  87. ch3 := make(chan AdminDataMap, 0)
  88. ch4 := make(chan AdminDataMap, 0)
  89. go getSectionData(nowMonthFirstDay, nowMonthLastDay, adminType, dimensionType, ch1)
  90. go getSectionData(lastMonthFirstDay1, lastMonthLastDay1, adminType, dimensionType, ch2)
  91. go getSectionData(lastMonthFirstDay2, lastMonthLastDay2, adminType, dimensionType, ch3)
  92. go getSectionData(lastMonthFirstDay3, lastMonthLastDay3, adminType, dimensionType, ch4)
  93. var nowMonthAdminDataMap, lastMonthAdminDataMap1, lastMonthAdminDataMap2, lastMonthAdminDataMap3 AdminDataMap
  94. nowMonthAdminDataMap = <-ch1
  95. close(ch1)
  96. lastMonthAdminDataMap1 = <-ch2
  97. close(ch2)
  98. lastMonthAdminDataMap2 = <-ch3
  99. close(ch3)
  100. lastMonthAdminDataMap3 = <-ch4
  101. close(ch4)
  102. adminDataMapList = make([]AdminDataMap, 0)
  103. adminDataMapList = append(adminDataMapList, nowMonthAdminDataMap, lastMonthAdminDataMap1, lastMonthAdminDataMap2, lastMonthAdminDataMap3)
  104. return
  105. }
  106. // GetMonthDataV2 月度数据
  107. func GetMonthDataV2(adminType, dimensionType string, dataNum int) (adminDataMapList []AdminDataMap, firstDate time.Time, err error) { //三个协程返回
  108. nowMonthFirstDay := utils.GetNowMonthFirstDay() //本月第一天
  109. //nowMonthLastDay := nowMonthFirstDay.AddDate(0, 1, 0).Add(-1 * time.Second) //本月最后一天
  110. chanList := make([]chan AdminDataMap, 0)
  111. for i := 0; i < dataNum; i++ {
  112. tmpCh := make(chan AdminDataMap, 0)
  113. chanList = append(chanList, tmpCh)
  114. lastMonthFirstDay := nowMonthFirstDay.AddDate(0, -1*i, 0) //上个月第一天
  115. lastMonthLastDay := nowMonthFirstDay.AddDate(0, -1*(i-1), 0).Add(-1 * time.Second) //上个月最后一天
  116. // 第一个开始日期
  117. firstDate = lastMonthFirstDay
  118. go getSectionData(lastMonthFirstDay, lastMonthLastDay, adminType, dimensionType, tmpCh)
  119. }
  120. adminDataMapList = make([]AdminDataMap, 0)
  121. for _, vChan := range chanList {
  122. var monthAdminDataMap AdminDataMap
  123. monthAdminDataMap = <-vChan
  124. close(vChan)
  125. adminDataMapList = append(adminDataMapList, monthAdminDataMap)
  126. }
  127. return
  128. }
  129. // GetTimeIntervalData 区间数据
  130. func GetTimeIntervalData(startDate, endDate, adminType, dimensionType string) (adminDataMapList []AdminDataMap, firstDate time.Time, err error) { //三个协程返回
  131. startDateTimer, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  132. endDateTimer, _ := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  133. endDateTimer = endDateTimer.AddDate(0, 0, 1).Add(-1 * time.Second) //本月最后一天
  134. //最早的一天
  135. firstDate = startDateTimer
  136. ch1 := make(chan AdminDataMap, 0)
  137. go getSectionData(startDateTimer, endDateTimer, adminType, dimensionType, ch1)
  138. var adminDataMap AdminDataMap
  139. adminDataMap = <-ch1
  140. close(ch1)
  141. adminDataMapList = make([]AdminDataMap, 0)
  142. adminDataMapList = append(adminDataMapList, adminDataMap)
  143. return
  144. }
  145. type AdminDataMap struct {
  146. TryOutMap map[int]int `description:"试用路演次数"`
  147. FormalMap map[int]int `description:"正式路演次数"`
  148. MeetingMap map[int]int `description:"会议次数"`
  149. OnlineMap map[int]int `description:"线上路演次数"`
  150. OfflineMap map[int]int `description:"线上路演次数"`
  151. StartDate string `description:"开始日期"`
  152. EndDate string `description:"开始日期"`
  153. }
  154. // getSectionData 获取周期数据
  155. func getSectionData(startDate, endDate time.Time, adminType, dimensionType string, ch chan AdminDataMap) (adminDataMap AdminDataMap, err error) {
  156. defer func() {
  157. ch <- adminDataMap
  158. }()
  159. //adminType := `seller`
  160. switch adminType {
  161. case "researcher":
  162. adminDataMap, err = getResearcherSectionData(startDate, endDate)
  163. case "seller":
  164. adminDataMap, err = getSellerSectionData(startDate, endDate, dimensionType)
  165. }
  166. return
  167. }
  168. // getResearcherSectionData 获取研究员周期数据
  169. func getResearcherSectionData(startDate, endDate time.Time) (adminDataMap AdminDataMap, err error) {
  170. tryOutMap := make(map[int]int)
  171. formalMap := make(map[int]int)
  172. meetingMap := make(map[int]int)
  173. //正式客户
  174. {
  175. var condition string
  176. var pars []interface{}
  177. condition = ` and start_date >= ? and end_date <= ? and company_status = ? `
  178. pars = append(pars, startDate, endDate, "正式")
  179. data, tmpErr := roadshow.GetGroupResearcherRecordList(condition, pars)
  180. if tmpErr != nil {
  181. err = tmpErr
  182. return
  183. }
  184. for _, v := range data {
  185. formalMap[v.AdminId] = v.Num
  186. }
  187. }
  188. //试用客户
  189. {
  190. var condition string
  191. var pars []interface{}
  192. condition = ` and start_date >= ? and end_date <= ? and company_status = ? `
  193. pars = append(pars, startDate, endDate, "试用")
  194. data, tmpErr := roadshow.GetGroupResearcherRecordList(condition, pars)
  195. if tmpErr != nil {
  196. err = tmpErr
  197. return
  198. }
  199. for _, v := range data {
  200. //fmt.Println(v)
  201. tryOutMap[v.AdminId] = v.Num
  202. }
  203. }
  204. //试用客户
  205. {
  206. var condition string
  207. var pars []interface{}
  208. condition = ` and start_date >= ? and end_date <= ? and activity_type = ? `
  209. pars = append(pars, startDate, endDate, "公开会议")
  210. data, tmpErr := roadshow.GetGroupResearcherRecordList(condition, pars)
  211. if tmpErr != nil {
  212. err = tmpErr
  213. return
  214. }
  215. for _, v := range data {
  216. //fmt.Println(v)
  217. meetingMap[v.AdminId] = v.Num
  218. }
  219. }
  220. adminDataMap = AdminDataMap{
  221. TryOutMap: tryOutMap,
  222. FormalMap: formalMap,
  223. MeetingMap: meetingMap,
  224. StartDate: startDate.Format(utils.FormatDate),
  225. EndDate: endDate.Format(utils.FormatDate),
  226. }
  227. return
  228. }
  229. // getSellerSectionData 获取销售周期数据
  230. func getSellerSectionData(startDate, endDate time.Time, dimensionType string) (adminDataMap AdminDataMap, err error) {
  231. tryOutMap := make(map[int]int)
  232. formalMap := make(map[int]int)
  233. meetingMap := make(map[int]int)
  234. onlineMap := make(map[int]int)
  235. offlineMap := make(map[int]int)
  236. //fmt.Println()
  237. //客户状态维度
  238. if dimensionType == "company_status" {
  239. //正式客户
  240. {
  241. var condition string
  242. var pars []interface{}
  243. condition = ` and start_date >= ? and end_date <= ? and company_status = ? `
  244. pars = append(pars, startDate, endDate, "正式")
  245. data, tmpErr := roadshow.GetGroupSellerRecordList(condition, pars)
  246. if tmpErr != nil {
  247. err = tmpErr
  248. return
  249. }
  250. for _, v := range data {
  251. formalMap[v.AdminId] = v.Num
  252. }
  253. }
  254. //试用客户
  255. {
  256. var condition string
  257. var pars []interface{}
  258. condition = ` and start_date >= ? and end_date <= ? and company_status = ? `
  259. pars = append(pars, startDate, endDate, "试用")
  260. data, tmpErr := roadshow.GetGroupSellerRecordList(condition, pars)
  261. if tmpErr != nil {
  262. err = tmpErr
  263. return
  264. }
  265. for _, v := range data {
  266. //fmt.Println(v)
  267. tryOutMap[v.AdminId] = v.Num
  268. }
  269. }
  270. }
  271. //路演形式维度
  272. if dimensionType == "roadshow_type" {
  273. //线上路演
  274. {
  275. var condition string
  276. var pars []interface{}
  277. condition = ` and start_date >= ? and end_date <= ? and roadshow_type = ? `
  278. pars = append(pars, startDate, endDate, "线上")
  279. data, tmpErr := roadshow.GetGroupSellerRecordList(condition, pars)
  280. if tmpErr != nil {
  281. err = tmpErr
  282. return
  283. }
  284. for _, v := range data {
  285. //fmt.Println(v)
  286. onlineMap[v.AdminId] = v.Num
  287. }
  288. }
  289. //线下路演
  290. {
  291. var condition string
  292. var pars []interface{}
  293. condition = ` and start_date >= ? and end_date <= ? and roadshow_type = ? `
  294. pars = append(pars, startDate, endDate, "线下")
  295. data, tmpErr := roadshow.GetGroupSellerRecordList(condition, pars)
  296. if tmpErr != nil {
  297. err = tmpErr
  298. return
  299. }
  300. for _, v := range data {
  301. //fmt.Println(v)
  302. offlineMap[v.AdminId] = v.Num
  303. }
  304. }
  305. }
  306. //销售专项路演统计
  307. if dimensionType == "seller_special" {
  308. detail, errdetail := company.GetConfigDetailByCode("choice_researcher_adminid")
  309. if errdetail != nil {
  310. err = errdetail
  311. return
  312. }
  313. //正式客户
  314. {
  315. var condition string
  316. var pars []interface{}
  317. condition = ` and start_date >= ? and end_date <= ? and company_status = ? ` + ` and researcher_id IN (` + detail.ConfigValue + `) `
  318. pars = append(pars, startDate, endDate, "正式")
  319. data, tmpErr := roadshow.GetGroupSellerRecordList(condition, pars)
  320. if tmpErr != nil {
  321. err = tmpErr
  322. return
  323. }
  324. for _, v := range data {
  325. formalMap[v.AdminId] = v.Num
  326. }
  327. }
  328. //试用客户
  329. {
  330. var condition string
  331. var pars []interface{}
  332. condition = ` and start_date >= ? and end_date <= ? and company_status = ? ` + ` and researcher_id IN (` + detail.ConfigValue + `) `
  333. pars = append(pars, startDate, endDate, "试用")
  334. data, tmpErr := roadshow.GetGroupSellerRecordList(condition, pars)
  335. if tmpErr != nil {
  336. err = tmpErr
  337. return
  338. }
  339. for _, v := range data {
  340. //fmt.Println(v)
  341. tryOutMap[v.AdminId] = v.Num
  342. }
  343. }
  344. //公开会议
  345. {
  346. var condition string
  347. var pars []interface{}
  348. condition = ` and start_date >= ? and end_date <= ? and activity_type = ? ` + ` and researcher_id IN (` + detail.ConfigValue + `) `
  349. pars = append(pars, startDate, endDate, "公开会议")
  350. data, tmpErr := roadshow.GetGroupSellerRecordList(condition, pars)
  351. if tmpErr != nil {
  352. err = tmpErr
  353. return
  354. }
  355. for _, v := range data {
  356. //fmt.Println(v)
  357. meetingMap[v.AdminId] = v.Num
  358. }
  359. }
  360. } else {
  361. //公开会议
  362. {
  363. var condition string
  364. var pars []interface{}
  365. condition = ` and start_date >= ? and end_date <= ? and activity_type = ? `
  366. pars = append(pars, startDate, endDate, "公开会议")
  367. data, tmpErr := roadshow.GetGroupSellerRecordList(condition, pars)
  368. if tmpErr != nil {
  369. err = tmpErr
  370. return
  371. }
  372. for _, v := range data {
  373. //fmt.Println(v)
  374. meetingMap[v.AdminId] = v.Num
  375. }
  376. }
  377. }
  378. adminDataMap = AdminDataMap{
  379. TryOutMap: tryOutMap,
  380. FormalMap: formalMap,
  381. MeetingMap: meetingMap,
  382. OfflineMap: offlineMap,
  383. OnlineMap: onlineMap,
  384. StartDate: startDate.Format(utils.FormatDate),
  385. EndDate: endDate.Format(utils.FormatDate),
  386. }
  387. return
  388. }