package roadshow import ( "encoding/json" "fmt" "github.com/rdlucklib/rdluck_tools/paging" "github.com/tealeg/xlsx" "hongze/hz_crm_api/models" "hongze/hz_crm_api/models/roadshow" "hongze/hz_crm_api/utils" "os" "path/filepath" "strconv" "strings" "time" ) // @Title 路演客户问答保存接口 // @Description 路演客户问答保存接口 // @Param request body roadshow.RoadShowQuestionSaveReq true "type json string" // @Success Ret=200 保存成功 // @router /question/save [post] func (this *CalendarController) QuestionAdd() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() sysUser := this.SysUser if sysUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,SysUser Is Empty" br.Ret = 408 return } deleteCache := true cacheKey := "CACHE_RS_ACTIVITY_QUESTION_SAVE_" + strconv.Itoa(sysUser.AdminId) defer func() { if deleteCache { utils.Rc.Delete(cacheKey) } }() if !utils.Rc.SetNX(cacheKey, 1, 5*time.Second) { deleteCache = false br.Msg = "系统处理中,请稍后重试!" br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody) return } var req roadshow.RoadShowQuestionSaveReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.RsCalendarId <= 0 || req.RsCalendarResearcherId <= 0 { br.Msg = "参数错误!" return } calendarResearcherItem, err := roadshow.GetRsCalendarResearcherById(req.RsCalendarResearcherId) if err != nil { br.Msg = "获取路演记录失败!" br.ErrMsg = "获取路演记录失败,Err:" + err.Error() return } if calendarResearcherItem.QuestionStatus == 1 { br.Msg = "问答已填写,不可重复提交!" return } err = roadshow.RoadShowQuestionSave(&req) if err != nil { br.Msg = "保存失败!" br.ErrMsg = "保存失败,Err:" + err.Error() return } br.Ret = 200 br.Success = true br.Msg = "保存成功" br.IsAddLog = true } // ResearcherList // @Title 获取路演客户问答信息接口 // @Description 获取路演客户问答信息接口 // @Param RsCalendarId query int true "路演日历ID" // @Param RsCalendarResearcherId query int true "路演研究员记录ID" // @Success 200 {object} roadshow.ResearcherGroup // @router /question/list [get] func (this *CalendarController) QuestionList() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() rsCalendarId, _ := this.GetInt("RsCalendarId") rsCalendarResearcherId, _ := this.GetInt("RsCalendarResearcherId") if rsCalendarResearcherId <= 0 && rsCalendarId <= 0 { br.Msg = "参数错误!" return } var condition string var pars []interface{} if rsCalendarId > 0 { condition += ` AND a.rs_calendar_id = ? ` pars = append(pars, rsCalendarId) } if rsCalendarResearcherId > 0 { condition += ` AND a.rs_calendar_researcher_id = ? ` pars = append(pars, rsCalendarResearcherId) } list, err := roadshow.GetRoadShowQuestionList(condition, pars) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "获取失败!" br.ErrMsg = "获取失败,Err:" + err.Error() return } br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = list } // @Title 获取客户路演问题汇总 // @Description 获取客户路演问题汇总 // @Param PageSize query int true "每页数据条数" // @Param CurrentIndex query int true "当前页页码,从1开始" // @Param StartDate query string true "开始日期" // @Param EndDate query string true "结束日期" // @Param ResearcherId query string true "研究员id" // @Param CompanyId query int true "客户ID" // @Param CompanyIndustry query string false "客户行业" // @Param CompanyClassify query string false "客户分类" // @Param Keyword query string false "关键词: 客户名称/社会信用码" // @Success 200 {object} roadshow.QuestionSummaryListResp // @router /question/summary/list [get] func (this *CalendarController) CalendarSummaryList() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() sysUser := this.SysUser if sysUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,SysUser Is Empty" br.Ret = 408 return } pageSize, _ := this.GetInt("PageSize") currentIndex, _ := this.GetInt("CurrentIndex") startDate := this.GetString("StartDate") endDate := this.GetString("EndDate") researcherId := this.GetString("ResearcherId") companyIndustry := this.GetString("CompanyIndustry") companyClassify := this.GetString("CompanyClassify") keyword := this.GetString("Keyword") var total int page := paging.GetPaging(currentIndex, pageSize, total) var startSize int if pageSize <= 0 { pageSize = utils.PageSize10 } if currentIndex <= 0 { currentIndex = 1 } startSize = paging.StartIndex(currentIndex, pageSize) var condition string var pars []interface{} condition += ` AND b.question_status = 1 ` if startDate != "" { condition += ` AND b.start_date >= ?` pars = append(pars, startDate) } if endDate != "" { condition += ` AND b.start_date <= ?` pars = append(pars, endDate) } if researcherId != "" { condition += ` AND b.researcher_id IN(` + researcherId + `)` } if companyIndustry != "" { condition += ` AND b.company_industry = ?` pars = append(pars, companyIndustry) } if companyClassify != "" { condition += ` AND b.company_classify = ?` pars = append(pars, companyClassify) } keyword = strings.TrimSpace(keyword) if keyword != "" { kw := fmt.Sprint("%", keyword, "%") condition += ` AND a.company_name LIKE ? ` pars = append(pars, kw) } total, err := roadshow.GetQuestionSummaryListCount(condition, pars) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "获取信息失败" br.ErrMsg = "获取数据总数失败,GetQuestionSummaryListCount,Err:" + err.Error() return } dataList, err := roadshow.GetQuestionSummaryList(condition, pars, startSize, pageSize) if err != nil { br.Msg = "获取指标信息失败" br.ErrMsg = "获取数据失败,GetQuestionSummaryList,Err:" + err.Error() return } page = paging.GetPaging(currentIndex, pageSize, total) resp := new(roadshow.QuestionSummaryListResp) resp.Paging = page resp.List = dataList br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp } // @Title 导出客户路演问题汇总 // @Description 导出客户路演问题汇总 // @Param StartDate query string true "开始日期" // @Param EndDate query string true "结束日期" // @Param ResearcherId query string true "研究员id" // @Param CompanyId query int true "客户ID" // @Param CompanyIndustry query string false "客户行业" // @Param CompanyClassify query string false "客户分类" // @Param Keyword query string false "关键词: 客户名称/社会信用码" // @Success 200 {object} roadshow.QuestionSummaryListResp // @router /question/summary/export [get] func (this *CalendarController) CalendarSummaryExport() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() sysUser := this.SysUser if sysUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,SysUser Is Empty" br.Ret = 408 return } startDate := this.GetString("StartDate") endDate := this.GetString("EndDate") researcherId := this.GetString("ResearcherId") companyIndustry := this.GetString("CompanyIndustry") companyClassify := this.GetString("CompanyClassify") keyword := this.GetString("Keyword") var condition string var pars []interface{} condition += ` AND b.question_status = 1 ` if startDate != "" { condition += ` AND b.start_date >= ?` pars = append(pars, startDate) } if endDate != "" { condition += ` AND b.start_date <= ?` pars = append(pars, endDate) } if researcherId != "" { condition += ` AND b.researcher_id IN(` + researcherId + `)` } if companyIndustry != "" { condition += ` AND b.company_industry = ?` pars = append(pars, companyIndustry) } if companyClassify != "" { condition += ` AND b.company_classify = ?` pars = append(pars, companyClassify) } keyword = strings.TrimSpace(keyword) if keyword != "" { kw := fmt.Sprint("%", keyword, "%") condition += ` AND a.company_name LIKE ? ` pars = append(pars, kw) } dataList, err := roadshow.GetQuestionSummaryExport(condition, pars) if err != nil { br.Msg = "获取指标信息失败" br.ErrMsg = "获取数据失败,GetQuestionSummaryList,Err:" + err.Error() return } var rsCalendarIdArr []string for _, v := range dataList { rsCalendarIdArr = append(rsCalendarIdArr, strconv.Itoa(v.RsCalendarId)) } questionMap := make(map[int][]*roadshow.RsCalendarResearcherQuestionView) var questionMax int if len(rsCalendarIdArr) > 0 { var questionCondition string var questionPars []interface{} condition += ` AND a.rs_calendar_id IN (` + strings.Join(rsCalendarIdArr, ",") + `) ` questionList, err := roadshow.GetRoadShowQuestionList(questionCondition, questionPars) if err != nil { br.Msg = "获取指标信息失败" br.ErrMsg = "获取数据失败,GetRoadShowQuestionList,Err:" + err.Error() return } for _, qv := range questionList { if items, ok := questionMap[qv.RsCalendarId]; ok { items = append(items, qv) questionMap[qv.RsCalendarId] = items if len(items) > questionMax { questionMax = len(items) } } else { items = make([]*roadshow.RsCalendarResearcherQuestionView, 0) items = append(items, qv) questionMap[qv.RsCalendarId] = items if len(items) > questionMax { questionMax = len(items) } } } } dir, _ := os.Executable() exPath := filepath.Dir(dir) downloadPath := exPath + "/" + time.Now().Format(utils.FormatDateUnSpace) + "客户路演汇总" + ".xlsx" xlsxFile := xlsx.NewFile() sheet, e := xlsxFile.AddSheet("客户路演汇总") if e != nil { br.Msg = "新增Sheet失败" br.ErrMsg = "新增Sheet失败, Err: " + e.Error() return } titleRow := sheet.AddRow() titleRow.AddCell().SetString("路演时间") titleRow.AddCell().SetString("客户名称") titleRow.AddCell().SetString("发起人") titleRow.AddCell().SetString("研究员") titleRow.AddCell().SetString("客户行业") titleRow.AddCell().SetString("客户分类") for i := 1; i <= questionMax; i++ { titleRow.AddCell().SetString("Q" + strconv.Itoa(i)) titleRow.AddCell().SetString("A" + strconv.Itoa(i)) } for _, v := range dataList { dataRow := sheet.AddRow() dataRow.AddCell().SetString(v.StartDate + " " + v.StartTime) dataRow.AddCell().SetString(v.CompanyName) dataRow.AddCell().SetString(v.SysUserRealName) dataRow.AddCell().SetString(v.ResearcherName) dataRow.AddCell().SetString(v.CompanyIndustry) dataRow.AddCell().SetString(v.CompanyClassify) questionList := questionMap[v.RsCalendarId] for _, qv := range questionList { dataRow.AddCell().SetString(qv.QuestionContent) dataRow.AddCell().SetString(qv.ReplyContent) } } if e = xlsxFile.Save(downloadPath); e != nil { br.Msg = "导出失败" br.ErrMsg = "保存文件失败" return } fileName := time.Now().Format(utils.FormatDateUnSpace) + "客户路演汇总" + ".xlsx" this.Ctx.Output.Download(downloadPath, fileName) defer func() { _ = os.Remove(downloadPath) }() br.Ret = 200 br.Success = true br.Msg = "获取成功" }