user.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  1. package controllers
  2. import (
  3. "eta/eta_mini_crm_ht/models"
  4. "eta/eta_mini_crm_ht/models/response"
  5. "eta/eta_mini_crm_ht/services"
  6. "eta/eta_mini_crm_ht/utils"
  7. "fmt"
  8. "github.com/rdlucklib/rdluck_tools/paging"
  9. "github.com/xuri/excelize/v2"
  10. "net/http"
  11. "net/url"
  12. "strconv"
  13. "strings"
  14. "time"
  15. )
  16. type UserController struct {
  17. BaseAuthController
  18. }
  19. var (
  20. templateCols = map[string]utils.ExcelColMapping{
  21. "A": {"手机号", "Mobile"},
  22. "B": {"最近一次阅读时间", "LastReadTime"},
  23. "C": {"累计阅读次数", "ReadCount"},
  24. "D": {"注册时间", "CreatedTime"},
  25. }
  26. userCols = map[string]utils.ExcelColMapping{
  27. "A": {"姓名", "RealName"},
  28. "B": {"手机号", "Mobile"},
  29. "C": {"公司名称", "CompanyName"},
  30. "D": {"注册时间", "CreatedTime"},
  31. "E": {"是否关注公众号", "FollowingGzhStr"},
  32. "F": {"最近一次阅读时间", "LastReadTime"},
  33. "G": {"累计阅读次数", "ReadCount"},
  34. }
  35. )
  36. // TemplateList
  37. // @Title 临时用户列表
  38. // @Description 临时用户列表
  39. // @Param PageSize query int true "每页数据条数"
  40. // @Param CurrentIndex query int true "当前页页码,从1开始"
  41. // @Param Keyword query string false "手机号"
  42. // @Param SortParam query string false "排序字段参数,用来排序的字段, 枚举值:0:注册时间,1:阅读数,2:最近一次阅读时间"
  43. // @Param SortType query string true "如何排序,是正序还是倒序,0:倒序,1:正序"
  44. // @Success 200 {object} response.TemplateUserListResp
  45. // @router /temporary/list [get]
  46. func (this *UserController) TemplateList() {
  47. br := new(models.BaseResponse).Init()
  48. defer func() {
  49. this.Data["json"] = br
  50. this.ServeJSON()
  51. }()
  52. pageSize, _ := this.GetInt("PageSize")
  53. currentIndex, _ := this.GetInt("CurrentIndex")
  54. keyword := this.GetString("Keyword")
  55. if pageSize <= 0 {
  56. pageSize = utils.PageSize20
  57. } else if pageSize > utils.PageSize100 {
  58. pageSize = utils.PageSize100
  59. }
  60. if currentIndex <= 0 {
  61. currentIndex = 1
  62. }
  63. if pageSize <= 0 {
  64. pageSize = utils.PageSize20
  65. } else if pageSize > utils.PageSize100 {
  66. pageSize = utils.PageSize100
  67. }
  68. if currentIndex <= 0 {
  69. currentIndex = 1
  70. }
  71. startSize := utils.StartIndex(currentIndex, pageSize)
  72. sortParamInt, _ := this.GetInt("SortParam", 0)
  73. sortTypeInt, _ := this.GetInt("SortType", 0)
  74. var sortStr = ``
  75. var condition string
  76. var pars []interface{}
  77. sortParamMap := map[int]string{0: "created_time", 1: "read_count", 2: "last_read_time"}
  78. sortTypeMap := map[int]string{0: "desc", 1: "asc"}
  79. sortParam, ok := sortParamMap[sortParamInt]
  80. if !ok {
  81. br.Msg = "错误的排序字段参数"
  82. br.ErrMsg = fmt.Sprint("错误的排序字段:", sortParamInt)
  83. return
  84. }
  85. sortType, ok := sortTypeMap[sortTypeInt]
  86. if !ok {
  87. br.Msg = "错误的排序字段"
  88. br.ErrMsg = fmt.Sprint("错误的排序字段:", sortTypeInt)
  89. return
  90. }
  91. sortStr = fmt.Sprintf("%s %s,updated_time desc ", sortParam, sortType)
  92. if keyword != "" {
  93. condition += ` AND mobile LIKE ? `
  94. pars = utils.GetLikeKeywordPars(pars, keyword, 1)
  95. }
  96. resp := new(response.TemplateUserListResp)
  97. total, userList, err := models.GetPageTemplateUserList(condition, pars, sortStr, startSize, pageSize)
  98. if err != nil {
  99. br.Msg = "查询用户失败"
  100. br.Msg = "查询用户失败,系统错误,Err:" + err.Error()
  101. return
  102. }
  103. list := make([]models.TemplateUsersItem, 0)
  104. for _, v := range userList {
  105. list = append(list, v.ToItem())
  106. }
  107. page := paging.GetPaging(currentIndex, pageSize, total)
  108. resp.Paging = page
  109. resp.List = list
  110. br.Data = resp
  111. br.Ret = 200
  112. br.Success = true
  113. br.Msg = "获取成功"
  114. }
  115. // OfficialList
  116. // @Title 正式用户列表
  117. // @Description 正式用户列表
  118. // @Param PageSize query int true "每页数据条数"
  119. // @Param CurrentIndex query int true "当前页页码,从1开始"
  120. // @Param Keyword query string false "手机号"
  121. // @Param SortParam query string false "排序字段参数,用来排序的字段, 枚举值:0:注册时间,1:阅读数,2:最近一次阅读时间"
  122. // @Param SortType query string true "如何排序,是正序还是倒序,0:倒序,1:正序"
  123. // @Success 200 {object} response.TemplateUserListResp
  124. // @router /official/list [get]
  125. func (this *UserController) OfficialList() {
  126. br := new(models.BaseResponse).Init()
  127. defer func() {
  128. this.Data["json"] = br
  129. this.ServeJSON()
  130. }()
  131. pageSize, _ := this.GetInt("PageSize")
  132. currentIndex, _ := this.GetInt("CurrentIndex")
  133. keyword := this.GetString("Keyword")
  134. FollowingGzh := this.GetString("FollowingGzh")
  135. RegisterBeginDate := this.GetString("RegisterBeginDate")
  136. RegisterEndDate := this.GetString("RegisterEndDate")
  137. if pageSize <= 0 {
  138. pageSize = utils.PageSize20
  139. } else if pageSize > utils.PageSize100 {
  140. pageSize = utils.PageSize100
  141. }
  142. if currentIndex <= 0 {
  143. currentIndex = 1
  144. }
  145. if pageSize <= 0 {
  146. pageSize = utils.PageSize20
  147. } else if pageSize > utils.PageSize100 {
  148. pageSize = utils.PageSize100
  149. }
  150. if currentIndex <= 0 {
  151. currentIndex = 1
  152. }
  153. startSize := utils.StartIndex(currentIndex, pageSize)
  154. sortParamInt, _ := this.GetInt("SortParam", 0)
  155. sortTypeInt, _ := this.GetInt("SortType", 0)
  156. var sortStr = ``
  157. var condition string
  158. var pars []interface{}
  159. sortParamMap := map[int]string{0: "created_time", 1: "read_count", 2: "last_read_time"}
  160. sortTypeMap := map[int]string{0: "desc", 1: "asc"}
  161. sortParam, ok := sortParamMap[sortParamInt]
  162. if !ok {
  163. br.Msg = "错误的排序字段参数"
  164. br.ErrMsg = fmt.Sprint("错误的排序字段:", sortParamInt)
  165. return
  166. }
  167. sortType, ok := sortTypeMap[sortTypeInt]
  168. if !ok {
  169. br.Msg = "错误的排序字段"
  170. br.ErrMsg = fmt.Sprintf("错误的排序字段:%v", sortTypeInt)
  171. return
  172. }
  173. sortStr = fmt.Sprintf("%s %s,updated_time desc ", sortParam, sortType)
  174. if FollowingGzh != "" {
  175. switch FollowingGzh {
  176. case "true":
  177. condition += ` AND following_gzh=1 `
  178. case "false":
  179. condition += ` AND following_gzh=0 `
  180. default:
  181. br.Msg = "关注公众号字段非法字段"
  182. br.ErrMsg = fmt.Sprintf("错误的关注公众号字段:%s", FollowingGzh)
  183. return
  184. }
  185. }
  186. if RegisterBeginDate != "" || RegisterEndDate != "" {
  187. var beginDate, endDate time.Time
  188. var parseErr error
  189. if RegisterBeginDate != "" {
  190. beginDate, parseErr = time.Parse(time.DateOnly, RegisterBeginDate)
  191. if parseErr != nil {
  192. br.Msg = "注册时间开始字段非法字段"
  193. br.ErrMsg = fmt.Sprintf("错误的注册时间开始字段:%s", RegisterBeginDate)
  194. return
  195. }
  196. }
  197. if RegisterEndDate != "" {
  198. endDate, parseErr = time.Parse(time.DateOnly, RegisterEndDate)
  199. if parseErr != nil {
  200. br.Msg = "注册时间结束字段非法字段"
  201. br.ErrMsg = fmt.Sprintf("错误的注册时间结束字段:%s", RegisterEndDate)
  202. return
  203. }
  204. }
  205. if RegisterBeginDate != "" {
  206. if RegisterEndDate != "" {
  207. if beginDate.After(endDate) {
  208. br.Msg = "结束时间不能早于开始时间"
  209. br.ErrMsg = fmt.Sprintf("错误的注册时间结束字段:开始时间:%s,结束时间:%s", RegisterBeginDate, RegisterEndDate)
  210. return
  211. }
  212. condition += ` AND DATE_FORMAT(created_time,'%Y-%m-%d') BETWEEN ? AND ?`
  213. pars = append(pars, RegisterBeginDate, RegisterEndDate)
  214. } else {
  215. condition += ` AND DATE_FORMAT(created_time,'%Y-%m-%d') >= ?`
  216. pars = append(pars, RegisterBeginDate)
  217. }
  218. } else {
  219. condition += ` AND DATE_FORMAT(created_time,'%Y-%m-%d') <= ?`
  220. pars = append(pars, RegisterEndDate)
  221. }
  222. }
  223. if keyword != "" {
  224. condition += ` AND ( mobile LIKE ? or real_name like ?)`
  225. pars = utils.GetLikeKeywordPars(pars, keyword, 2)
  226. }
  227. resp := new(response.UserListResp)
  228. total, userList, err := models.GetPageOfficialUserList(condition, pars, sortStr, startSize, pageSize)
  229. if err != nil {
  230. br.Msg = "查询用户失败"
  231. br.Msg = "查询用户失败,系统错误,Err:" + err.Error()
  232. return
  233. }
  234. //list := make([]*models.UserView, 0)
  235. //var wg sync.WaitGroup
  236. //wg.Add(len(userList))
  237. //for _, v := range userList {
  238. // go func(v *models.User) {
  239. // defer wg.Done()
  240. // tempUser, _ := models.GetTemplateUser(v.TemplateUserId)
  241. // userView := v.FillUserInfo(tempUser)
  242. // list = append(list, &userView)
  243. // }(&v)
  244. //}
  245. //wg.Wait()
  246. page := paging.GetPaging(currentIndex, pageSize, total)
  247. resp.Paging = page
  248. resp.List = userList
  249. br.Data = resp
  250. br.Ret = 200
  251. br.Success = true
  252. br.Msg = "获取成功"
  253. }
  254. // readRecordList
  255. // @Title 用户阅读记录
  256. // @Description 用户阅读记录
  257. // @Param PageSize query int true "每页数据条数"
  258. // @Param CurrentIndex query int true "当前页页码,从1开始"
  259. // @Param ChartPermissionIds query string true "品种列表"
  260. // @Param ClassifyIds query string true "品种列表"
  261. // @Success 200 {object} models.LoginResp
  262. // @router /readRecordList [get]
  263. func (this *UserController) ReadRecordList() {
  264. br := new(models.BaseResponse).Init()
  265. defer func() {
  266. this.Data["json"] = br
  267. this.ServeJSON()
  268. }()
  269. UserId, _ := this.GetInt("UserId")
  270. pageSize, _ := this.GetInt("PageSize")
  271. currentIndex, _ := this.GetInt("CurrentIndex")
  272. permissionIds := this.GetString("PermissionIds")
  273. productType := this.GetString("ProductType")
  274. if UserId <= 0 {
  275. br.Msg = "查询用户失败,用户id不合法"
  276. return
  277. }
  278. if pageSize <= 0 {
  279. pageSize = utils.PageSize20
  280. } else if pageSize > utils.PageSize100 {
  281. pageSize = utils.PageSize100
  282. }
  283. if currentIndex <= 0 {
  284. currentIndex = 1
  285. }
  286. startSize := utils.StartIndex(currentIndex, pageSize)
  287. user, err := models.GetTemplateUser(UserId)
  288. if err != nil {
  289. if err.Error() == utils.ErrNoRow() {
  290. br.Msg = "用户不存在或已删除,请刷新页面"
  291. return
  292. }
  293. br.Msg = "查询用户失败"
  294. br.ErrMsg = "查询用户失败,系统错误,Err:" + err.Error()
  295. return
  296. }
  297. if user == nil {
  298. br.Msg = "用户不存在或已删除,请刷新页面"
  299. return
  300. }
  301. var condition string
  302. var pars []interface{}
  303. var sourceType models.SourceType
  304. if productType != "" {
  305. sourceType = transSourceType(productType)
  306. if sourceType == "" {
  307. br.Msg = "错误的产品类型"
  308. br.ErrMsg = "错误的产品类型:" + productType
  309. return
  310. }
  311. condition += `and source_type= ?`
  312. pars = append(pars, sourceType)
  313. }
  314. var permissionIdList []int
  315. if permissionIds != "" {
  316. permissionIdStrList := strings.Split(permissionIds, ",")
  317. for _, permissionIdStr := range permissionIdStrList {
  318. permissionId, parseErr := strconv.Atoi(permissionIdStr)
  319. if parseErr != nil {
  320. continue
  321. }
  322. permissionIdList = append(permissionIdList, permissionId)
  323. }
  324. }
  325. total, condition, pars, err := services.GetUserSourceClickFlowListCountByUserId(UserId, condition, pars, permissionIdList, sourceType)
  326. if err != nil {
  327. br.Msg = "查询阅读记录失败"
  328. br.ErrMsg = "查询阅读记录失败,Err:" + err.Error()
  329. return
  330. }
  331. if total <= 0 {
  332. br.Msg = "暂无数据"
  333. br.Data = new(response.UserSourceClickFlowResp)
  334. br.Success = true
  335. br.Ret = 200
  336. return
  337. }
  338. readList, err := services.GetUserSourceClickFlowListByUserId(UserId, condition, pars, startSize, pageSize)
  339. if err != nil {
  340. br.Msg = "查询阅读记录失败"
  341. br.ErrMsg = "查询阅读记录失败,系统错误,Err:" + err.Error()
  342. return
  343. }
  344. page := paging.GetPaging(currentIndex, pageSize, total)
  345. resp := new(response.UserSourceClickFlowResp)
  346. resp.Paging = page
  347. resp.List = readList
  348. br.Msg = "获取成功"
  349. br.Data = resp
  350. br.Success = true
  351. br.Ret = 200
  352. }
  353. func transSourceType(productType string) (sourceType models.SourceType) {
  354. if productType == "" {
  355. return ""
  356. }
  357. switch productType {
  358. case Report:
  359. sourceType = models.ReportSourceType
  360. return
  361. case Video:
  362. sourceType = models.VideoSourceType
  363. return
  364. case Audio:
  365. sourceType = models.AudioSourceType
  366. return
  367. default:
  368. return ""
  369. }
  370. }
  371. // ExportTemplateUsers
  372. // @Title 临时用户列表
  373. // @Description 临时用户列表
  374. // @Param PageSize query int true "每页数据条数"
  375. // @Param CurrentIndex query int true "当前页页码,从1开始"
  376. // @Param Keyword query string false "手机号"
  377. // @Param SortParam query string false "排序字段参数,用来排序的字段, 枚举值:0:注册时间,1:阅读数,2:最近一次阅读时间"
  378. // @Param SortType query string true "如何排序,是正序还是倒序,0:倒序,1:正序"
  379. // @Success 200 {object} response.TemplateUserListResp
  380. // @router /temporary/export [get]
  381. func (this *UserController) ExportTemplateUsers() {
  382. br := new(models.BaseResponse).Init()
  383. defer func() {
  384. this.Data["json"] = br
  385. this.ServeJSON()
  386. }()
  387. keyword := this.GetString("Keyword")
  388. sortParamInt, _ := this.GetInt("SortParam", 0)
  389. sortTypeInt, _ := this.GetInt("SortType", 0)
  390. var sortStr = ``
  391. var condition string
  392. var pars []interface{}
  393. sortParamMap := map[int]string{0: "created_time", 1: "read_count", 2: "last_read_time"}
  394. sortTypeMap := map[int]string{0: "desc", 1: "asc"}
  395. sortParam, ok := sortParamMap[sortParamInt]
  396. if !ok {
  397. br.Msg = "错误的排序字段参数"
  398. br.ErrMsg = fmt.Sprint("错误的排序字段:", sortParamInt)
  399. return
  400. }
  401. sortType, ok := sortTypeMap[sortTypeInt]
  402. if !ok {
  403. br.Msg = "错误的排序字段"
  404. br.ErrMsg = fmt.Sprint("错误的排序字段:", sortTypeInt)
  405. return
  406. }
  407. sortStr = fmt.Sprintf("%s %s,updated_time desc ", sortParam, sortType)
  408. if keyword != "" {
  409. condition += ` AND mobile LIKE ? `
  410. pars = utils.GetLikeKeywordPars(pars, keyword, 1)
  411. }
  412. userList, err := models.GetTemplateUserListByCondition(condition, pars, sortStr)
  413. if err != nil {
  414. br.Msg = "查询用户失败"
  415. br.Msg = "查询用户失败,系统错误,Err:" + err.Error()
  416. return
  417. }
  418. list := make([]models.TemplateUsersItem, 0)
  419. for _, v := range userList {
  420. list = append(list, v.ToItem())
  421. }
  422. year, month, day := time.Now().Date()
  423. yearStr := strconv.Itoa(year)[2:]
  424. fileName := fmt.Sprintf("临时用户表%s.%d.%d.xlsx", yearStr, month, day)
  425. file, err := utils.ExportExcel("临时用户表", templateCols, list)
  426. _ = this.downloadExcelFile(file, fileName)
  427. br.Ret = 200
  428. br.Success = true
  429. br.Msg = "下载成功"
  430. }
  431. // encodeChineseFilename 将中文文件名编码为 ISO-8859-1
  432. func (this *UserController) downloadExcelFile(file *excelize.File, filename string) (err error) {
  433. // 对文件名进行 ISO-8859-1 编码
  434. fn := url.QueryEscape(filename)
  435. if filename == fn {
  436. fn = "filename=" + fn
  437. } else {
  438. fn = "filename=" + filename + "; filename*=utf-8''" + fn
  439. }
  440. this.Ctx.ResponseWriter.Header().Set("Access-Control-Expose-Headers", "Content-Disposition")
  441. this.Ctx.ResponseWriter.Header().Set("Content-Disposition", "attachment; "+fn)
  442. this.Ctx.ResponseWriter.Header().Set("Content-Description", "File Transfer")
  443. this.Ctx.ResponseWriter.Header().Set("Content-Type", "application/octet-stream")
  444. this.Ctx.ResponseWriter.Header().Set("Content-Transfer-Encoding", "binary")
  445. this.Ctx.ResponseWriter.Header().Set("Expires", "0")
  446. this.Ctx.ResponseWriter.Header().Set("Cache-Control", "must-revalidate")
  447. this.Ctx.ResponseWriter.Header().Set("Pragma", "public")
  448. this.Ctx.ResponseWriter.Header().Set("File-Name", filename)
  449. // 写入文件
  450. if err = file.Write(this.Ctx.ResponseWriter); err != nil {
  451. utils.FileLog.Error("导出excel文件失败:", err)
  452. http.Error(this.Ctx.ResponseWriter, "导出excel文件失败", http.StatusInternalServerError)
  453. }
  454. return
  455. }
  456. // ExportOfficialUsers
  457. // @Title 正式用户列表
  458. // @Description 正式用户列表
  459. // @Param PageSize query int true "每页数据条数"
  460. // @Param CurrentIndex query int true "当前页页码,从1开始"
  461. // @Param Keyword query string false "手机号"
  462. // @Param SortParam query string false "排序字段参数,用来排序的字段, 枚举值:0:注册时间,1:阅读数,2:最近一次阅读时间"
  463. // @Param SortType query string true "如何排序,是正序还是倒序,0:倒序,1:正序"
  464. // @Success 200 {object} response.TemplateUserListResp
  465. // @router /official/export [get]
  466. func (this *UserController) ExportOfficialUsers() {
  467. br := new(models.BaseResponse).Init()
  468. defer func() {
  469. this.Data["json"] = br
  470. this.ServeJSON()
  471. }()
  472. keyword := this.GetString("Keyword")
  473. FollowingGzh := this.GetString("FollowingGzh")
  474. RegisterBeginDate := this.GetString("RegisterBeginDate")
  475. RegisterEndDate := this.GetString("RegisterEndDate")
  476. sortParamInt, _ := this.GetInt("SortParam", 0)
  477. sortTypeInt, _ := this.GetInt("SortType", 0)
  478. var sortStr = ``
  479. var condition string
  480. var pars []interface{}
  481. sortParamMap := map[int]string{0: "created_time", 1: "read_count", 2: "last_read_time"}
  482. sortTypeMap := map[int]string{0: "desc", 1: "asc"}
  483. sortParam, ok := sortParamMap[sortParamInt]
  484. if !ok {
  485. br.Msg = "错误的排序字段参数"
  486. br.ErrMsg = fmt.Sprint("错误的排序字段:", sortParamInt)
  487. return
  488. }
  489. sortType, ok := sortTypeMap[sortTypeInt]
  490. if !ok {
  491. br.Msg = "错误的排序字段"
  492. br.ErrMsg = fmt.Sprintf("错误的排序字段:%v", sortTypeInt)
  493. return
  494. }
  495. sortStr = fmt.Sprintf("%s %s,updated_time desc ", sortParam, sortType)
  496. if FollowingGzh != "" {
  497. switch FollowingGzh {
  498. case "true":
  499. condition += ` AND following_gzh=1 `
  500. case "false":
  501. condition += ` AND following_gzh=0 `
  502. default:
  503. br.Msg = "关注公众号字段非法字段"
  504. br.ErrMsg = fmt.Sprintf("错误的关注公众号字段:%s", FollowingGzh)
  505. return
  506. }
  507. }
  508. if RegisterBeginDate != "" || RegisterEndDate != "" {
  509. var beginDate, endDate time.Time
  510. var parseErr error
  511. if RegisterBeginDate != "" {
  512. beginDate, parseErr = time.Parse(time.DateOnly, RegisterBeginDate)
  513. if parseErr != nil {
  514. br.Msg = "注册时间开始字段非法字段"
  515. br.ErrMsg = fmt.Sprintf("错误的注册时间开始字段:%s", RegisterBeginDate)
  516. return
  517. }
  518. }
  519. if RegisterEndDate != "" {
  520. endDate, parseErr = time.Parse(time.DateOnly, RegisterEndDate)
  521. if parseErr != nil {
  522. br.Msg = "注册时间结束字段非法字段"
  523. br.ErrMsg = fmt.Sprintf("错误的注册时间结束字段:%s", RegisterEndDate)
  524. return
  525. }
  526. }
  527. if RegisterBeginDate != "" {
  528. if RegisterEndDate != "" {
  529. if beginDate.After(endDate) {
  530. br.Msg = "结束时间不能早于开始时间"
  531. br.ErrMsg = fmt.Sprintf("错误的注册时间结束字段:开始时间:%s,结束时间:%s", RegisterBeginDate, RegisterEndDate)
  532. return
  533. }
  534. condition += ` AND DATE_FORMAT(created_time,'%Y-%m-%d') BETWEEN ? AND ?`
  535. pars = append(pars, RegisterBeginDate, RegisterEndDate)
  536. } else {
  537. condition += ` AND DATE_FORMAT(created_time,'%Y-%m-%d') >= ?`
  538. pars = append(pars, RegisterBeginDate)
  539. }
  540. } else {
  541. condition += ` AND DATE_FORMAT(created_time,'%Y-%m-%d') <= ?`
  542. pars = append(pars, RegisterEndDate)
  543. }
  544. }
  545. if keyword != "" {
  546. condition += ` AND ( mobile LIKE ? or real_name like ?)`
  547. pars = utils.GetLikeKeywordPars(pars, keyword, 2)
  548. }
  549. userList, err := models.GetPageOfficialUserByCondition(condition, pars, sortStr)
  550. if err != nil {
  551. br.Msg = "查询用户失败"
  552. br.Msg = "查询用户失败,系统错误,Err:" + err.Error()
  553. return
  554. }
  555. year, month, day := time.Now().Date()
  556. yearStr := strconv.Itoa(year)[2:]
  557. fileName := fmt.Sprintf("用户表%s.%d.%d.xlsx", yearStr, month, day)
  558. file, err := utils.ExportExcel("用户列表", userCols, userList)
  559. _ = this.downloadExcelFile(file, fileName)
  560. br.Ret = 200
  561. br.Success = true
  562. br.Msg = "获取成功"
  563. }