calendar_researcher_question.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. package roadshow
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/rdlucklib/rdluck_tools/paging"
  6. "github.com/tealeg/xlsx"
  7. "hongze/hz_crm_api/models"
  8. "hongze/hz_crm_api/models/roadshow"
  9. "hongze/hz_crm_api/utils"
  10. "os"
  11. "path/filepath"
  12. "strconv"
  13. "strings"
  14. "time"
  15. )
  16. // @Title 路演客户问答保存接口
  17. // @Description 路演客户问答保存接口
  18. // @Param request body roadshow.RoadShowQuestionSaveReq true "type json string"
  19. // @Success Ret=200 保存成功
  20. // @router /question/save [post]
  21. func (this *CalendarController) QuestionAdd() {
  22. br := new(models.BaseResponse).Init()
  23. defer func() {
  24. this.Data["json"] = br
  25. this.ServeJSON()
  26. }()
  27. sysUser := this.SysUser
  28. if sysUser == nil {
  29. br.Msg = "请登录"
  30. br.ErrMsg = "请登录,SysUser Is Empty"
  31. br.Ret = 408
  32. return
  33. }
  34. deleteCache := true
  35. cacheKey := "CACHE_RS_ACTIVITY_QUESTION_SAVE_" + strconv.Itoa(sysUser.AdminId)
  36. defer func() {
  37. if deleteCache {
  38. utils.Rc.Delete(cacheKey)
  39. }
  40. }()
  41. if !utils.Rc.SetNX(cacheKey, 1, 5*time.Second) {
  42. deleteCache = false
  43. br.Msg = "系统处理中,请稍后重试!"
  44. br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody)
  45. return
  46. }
  47. var req roadshow.RoadShowQuestionSaveReq
  48. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  49. if err != nil {
  50. br.Msg = "参数解析异常!"
  51. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  52. return
  53. }
  54. if req.RsCalendarId <= 0 || req.RsCalendarResearcherId <= 0 {
  55. br.Msg = "参数错误!"
  56. return
  57. }
  58. calendarResearcherItem, err := roadshow.GetRsCalendarResearcherById(req.RsCalendarResearcherId)
  59. if err != nil {
  60. br.Msg = "获取路演记录失败!"
  61. br.ErrMsg = "获取路演记录失败,Err:" + err.Error()
  62. return
  63. }
  64. if calendarResearcherItem.QuestionStatus == 1 {
  65. br.Msg = "问答已填写,不可重复提交!"
  66. return
  67. }
  68. err = roadshow.RoadShowQuestionSave(&req)
  69. if err != nil {
  70. br.Msg = "保存失败!"
  71. br.ErrMsg = "保存失败,Err:" + err.Error()
  72. return
  73. }
  74. br.Ret = 200
  75. br.Success = true
  76. br.Msg = "保存成功"
  77. br.IsAddLog = true
  78. }
  79. // ResearcherList
  80. // @Title 获取路演客户问答信息接口
  81. // @Description 获取路演客户问答信息接口
  82. // @Param RsCalendarId query int true "路演日历ID"
  83. // @Param RsCalendarResearcherId query int true "路演研究员记录ID"
  84. // @Success 200 {object} roadshow.ResearcherGroup
  85. // @router /question/list [get]
  86. func (this *CalendarController) QuestionList() {
  87. br := new(models.BaseResponse).Init()
  88. defer func() {
  89. this.Data["json"] = br
  90. this.ServeJSON()
  91. }()
  92. rsCalendarId, _ := this.GetInt("RsCalendarId")
  93. rsCalendarResearcherId, _ := this.GetInt("RsCalendarResearcherId")
  94. if rsCalendarResearcherId <= 0 && rsCalendarId <= 0 {
  95. br.Msg = "参数错误!"
  96. return
  97. }
  98. var condition string
  99. var pars []interface{}
  100. if rsCalendarId > 0 {
  101. condition += ` AND a.rs_calendar_id = ? `
  102. pars = append(pars, rsCalendarId)
  103. }
  104. if rsCalendarResearcherId > 0 {
  105. condition += ` AND a.rs_calendar_researcher_id = ? `
  106. pars = append(pars, rsCalendarResearcherId)
  107. }
  108. list, err := roadshow.GetRoadShowQuestionList(condition, pars)
  109. if err != nil && err.Error() != utils.ErrNoRow() {
  110. br.Msg = "获取失败!"
  111. br.ErrMsg = "获取失败,Err:" + err.Error()
  112. return
  113. }
  114. br.Ret = 200
  115. br.Success = true
  116. br.Msg = "获取成功"
  117. br.Data = list
  118. }
  119. // @Title 获取客户路演问题汇总
  120. // @Description 获取客户路演问题汇总
  121. // @Param PageSize query int true "每页数据条数"
  122. // @Param CurrentIndex query int true "当前页页码,从1开始"
  123. // @Param StartDate query string true "开始日期"
  124. // @Param EndDate query string true "结束日期"
  125. // @Param ResearcherId query string true "研究员id"
  126. // @Param CompanyId query int true "客户ID"
  127. // @Param CompanyIndustry query string false "客户行业"
  128. // @Param CompanyClassify query string false "客户分类"
  129. // @Param Keyword query string false "关键词: 客户名称/社会信用码"
  130. // @Success 200 {object} roadshow.QuestionSummaryListResp
  131. // @router /question/summary/list [get]
  132. func (this *CalendarController) CalendarSummaryList() {
  133. br := new(models.BaseResponse).Init()
  134. defer func() {
  135. this.Data["json"] = br
  136. this.ServeJSON()
  137. }()
  138. sysUser := this.SysUser
  139. if sysUser == nil {
  140. br.Msg = "请登录"
  141. br.ErrMsg = "请登录,SysUser Is Empty"
  142. br.Ret = 408
  143. return
  144. }
  145. pageSize, _ := this.GetInt("PageSize")
  146. currentIndex, _ := this.GetInt("CurrentIndex")
  147. startDate := this.GetString("StartDate")
  148. endDate := this.GetString("EndDate")
  149. researcherId := this.GetString("ResearcherId")
  150. companyIndustry := this.GetString("CompanyIndustry")
  151. companyClassify := this.GetString("CompanyClassify")
  152. keyword := this.GetString("Keyword")
  153. var total int
  154. page := paging.GetPaging(currentIndex, pageSize, total)
  155. var startSize int
  156. if pageSize <= 0 {
  157. pageSize = utils.PageSize10
  158. }
  159. if currentIndex <= 0 {
  160. currentIndex = 1
  161. }
  162. startSize = paging.StartIndex(currentIndex, pageSize)
  163. var condition string
  164. var pars []interface{}
  165. condition += ` AND b.question_status = 1 `
  166. if startDate != "" {
  167. condition += ` AND b.start_date >= ?`
  168. pars = append(pars, startDate)
  169. }
  170. if endDate != "" {
  171. condition += ` AND b.start_date <= ?`
  172. pars = append(pars, endDate)
  173. }
  174. if researcherId != "" {
  175. condition += ` AND b.researcher_id IN(` + researcherId + `)`
  176. }
  177. if companyIndustry != "" {
  178. condition += ` AND b.company_industry = ?`
  179. pars = append(pars, companyIndustry)
  180. }
  181. if companyClassify != "" {
  182. condition += ` AND b.company_classify = ?`
  183. pars = append(pars, companyClassify)
  184. }
  185. keyword = strings.TrimSpace(keyword)
  186. if keyword != "" {
  187. kw := fmt.Sprint("%", keyword, "%")
  188. condition += ` AND a.company_name LIKE ? `
  189. pars = append(pars, kw)
  190. }
  191. total, err := roadshow.GetQuestionSummaryListCount(condition, pars)
  192. if err != nil && err.Error() != utils.ErrNoRow() {
  193. br.Msg = "获取信息失败"
  194. br.ErrMsg = "获取数据总数失败,GetQuestionSummaryListCount,Err:" + err.Error()
  195. return
  196. }
  197. dataList, err := roadshow.GetQuestionSummaryList(condition, pars, startSize, pageSize)
  198. if err != nil {
  199. br.Msg = "获取指标信息失败"
  200. br.ErrMsg = "获取数据失败,GetQuestionSummaryList,Err:" + err.Error()
  201. return
  202. }
  203. page = paging.GetPaging(currentIndex, pageSize, total)
  204. resp := new(roadshow.QuestionSummaryListResp)
  205. resp.Paging = page
  206. resp.List = dataList
  207. br.Ret = 200
  208. br.Success = true
  209. br.Msg = "获取成功"
  210. br.Data = resp
  211. }
  212. // @Title 导出客户路演问题汇总
  213. // @Description 导出客户路演问题汇总
  214. // @Param StartDate query string true "开始日期"
  215. // @Param EndDate query string true "结束日期"
  216. // @Param ResearcherId query string true "研究员id"
  217. // @Param CompanyId query int true "客户ID"
  218. // @Param CompanyIndustry query string false "客户行业"
  219. // @Param CompanyClassify query string false "客户分类"
  220. // @Param Keyword query string false "关键词: 客户名称/社会信用码"
  221. // @Success 200 {object} roadshow.QuestionSummaryListResp
  222. // @router /question/summary/export [get]
  223. func (this *CalendarController) CalendarSummaryExport() {
  224. br := new(models.BaseResponse).Init()
  225. defer func() {
  226. this.Data["json"] = br
  227. this.ServeJSON()
  228. }()
  229. sysUser := this.SysUser
  230. if sysUser == nil {
  231. br.Msg = "请登录"
  232. br.ErrMsg = "请登录,SysUser Is Empty"
  233. br.Ret = 408
  234. return
  235. }
  236. startDate := this.GetString("StartDate")
  237. endDate := this.GetString("EndDate")
  238. researcherId := this.GetString("ResearcherId")
  239. companyIndustry := this.GetString("CompanyIndustry")
  240. companyClassify := this.GetString("CompanyClassify")
  241. keyword := this.GetString("Keyword")
  242. var condition string
  243. var pars []interface{}
  244. condition += ` AND b.question_status = 1 `
  245. if startDate != "" {
  246. condition += ` AND b.start_date >= ?`
  247. pars = append(pars, startDate)
  248. }
  249. if endDate != "" {
  250. condition += ` AND b.start_date <= ?`
  251. pars = append(pars, endDate)
  252. }
  253. if researcherId != "" {
  254. condition += ` AND b.researcher_id IN(` + researcherId + `)`
  255. }
  256. if companyIndustry != "" {
  257. condition += ` AND b.company_industry = ?`
  258. pars = append(pars, companyIndustry)
  259. }
  260. if companyClassify != "" {
  261. condition += ` AND b.company_classify = ?`
  262. pars = append(pars, companyClassify)
  263. }
  264. keyword = strings.TrimSpace(keyword)
  265. if keyword != "" {
  266. kw := fmt.Sprint("%", keyword, "%")
  267. condition += ` AND a.company_name LIKE ? `
  268. pars = append(pars, kw)
  269. }
  270. dataList, err := roadshow.GetQuestionSummaryExport(condition, pars)
  271. if err != nil {
  272. br.Msg = "获取指标信息失败"
  273. br.ErrMsg = "获取数据失败,GetQuestionSummaryList,Err:" + err.Error()
  274. return
  275. }
  276. var rsCalendarIdArr []string
  277. for _, v := range dataList {
  278. rsCalendarIdArr = append(rsCalendarIdArr, strconv.Itoa(v.RsCalendarId))
  279. }
  280. questionMap := make(map[int][]*roadshow.RsCalendarResearcherQuestionView)
  281. var questionMax int
  282. if len(rsCalendarIdArr) > 0 {
  283. var questionCondition string
  284. var questionPars []interface{}
  285. condition += ` AND a.rs_calendar_id IN (` + strings.Join(rsCalendarIdArr, ",") + `) `
  286. questionList, err := roadshow.GetRoadShowQuestionList(questionCondition, questionPars)
  287. if err != nil {
  288. br.Msg = "获取指标信息失败"
  289. br.ErrMsg = "获取数据失败,GetRoadShowQuestionList,Err:" + err.Error()
  290. return
  291. }
  292. for _, qv := range questionList {
  293. if items, ok := questionMap[qv.RsCalendarId]; ok {
  294. items = append(items, qv)
  295. questionMap[qv.RsCalendarId] = items
  296. if len(items) > questionMax {
  297. questionMax = len(items)
  298. }
  299. } else {
  300. items = make([]*roadshow.RsCalendarResearcherQuestionView, 0)
  301. items = append(items, qv)
  302. questionMap[qv.RsCalendarId] = items
  303. if len(items) > questionMax {
  304. questionMax = len(items)
  305. }
  306. }
  307. }
  308. }
  309. dir, _ := os.Executable()
  310. exPath := filepath.Dir(dir)
  311. downloadPath := exPath + "/" + time.Now().Format(utils.FormatDateUnSpace) + "客户路演汇总" + ".xlsx"
  312. xlsxFile := xlsx.NewFile()
  313. sheet, e := xlsxFile.AddSheet("客户路演汇总")
  314. if e != nil {
  315. br.Msg = "新增Sheet失败"
  316. br.ErrMsg = "新增Sheet失败, Err: " + e.Error()
  317. return
  318. }
  319. titleRow := sheet.AddRow()
  320. titleRow.AddCell().SetString("路演时间")
  321. titleRow.AddCell().SetString("客户名称")
  322. titleRow.AddCell().SetString("发起人")
  323. titleRow.AddCell().SetString("研究员")
  324. titleRow.AddCell().SetString("客户行业")
  325. titleRow.AddCell().SetString("客户分类")
  326. for i := 1; i <= questionMax; i++ {
  327. titleRow.AddCell().SetString("Q" + strconv.Itoa(i))
  328. titleRow.AddCell().SetString("A" + strconv.Itoa(i))
  329. }
  330. for _, v := range dataList {
  331. dataRow := sheet.AddRow()
  332. dataRow.AddCell().SetString(v.StartDate + " " + v.StartTime)
  333. dataRow.AddCell().SetString(v.CompanyName)
  334. dataRow.AddCell().SetString(v.SysUserRealName)
  335. dataRow.AddCell().SetString(v.ResearcherName)
  336. dataRow.AddCell().SetString(v.CompanyIndustry)
  337. dataRow.AddCell().SetString(v.CompanyClassify)
  338. questionList := questionMap[v.RsCalendarId]
  339. for _, qv := range questionList {
  340. dataRow.AddCell().SetString(qv.QuestionContent)
  341. dataRow.AddCell().SetString(qv.ReplyContent)
  342. }
  343. }
  344. if e = xlsxFile.Save(downloadPath); e != nil {
  345. br.Msg = "导出失败"
  346. br.ErrMsg = "保存文件失败"
  347. return
  348. }
  349. fileName := time.Now().Format(utils.FormatDateUnSpace) + "客户路演汇总" + ".xlsx"
  350. this.Ctx.Output.Download(downloadPath, fileName)
  351. defer func() {
  352. _ = os.Remove(downloadPath)
  353. }()
  354. br.Ret = 200
  355. br.Success = true
  356. br.Msg = "获取成功"
  357. }