Ver código fonte

Merge branch 'master' of http://8.136.199.33:3000/hongze/hz_crm_api into cygx/cygx_12.2

xingzai 1 ano atrás
pai
commit
137745633d

+ 7 - 0
controllers/cygx/activity_meet.go

@@ -942,6 +942,13 @@ func (this *ActivityMeetCoAntroller) AppointmentList() {
 				respList.List = append(respList.List, v)
 			}
 		}
+		if adminInfo.RoleTypeCode == "rai_group" {
+			//组长查看本组所有组员
+			memberType = "GroupLeader"
+		} else {
+			//组员查看自己
+			memberType = "Sale"
+		}
 	} else {
 		respList.List = list
 	}

+ 49 - 0
controllers/cygx/activity_signup.go

@@ -295,6 +295,18 @@ func (this *ActivitySignupCoAntroller) AppointmentList() {
 		br.ErrMsg = "客户总数获取失败,Err:" + errtotal.Error()
 		return
 	}
+
+	companyIdsPower, err := cygxService.GetAdminLookUserCompanyIds(sysUser)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+		return
+	}
+	var companyIdstr []string
+	for _, v := range companyIdsPower {
+		companyIdstr = append(companyIdstr, strconv.Itoa(v))
+	}
+	sqlStr += ` AND s.company_id  IN (` + strings.Join(companyIdstr, ",") + `) `
 	myTotal, errmyTotal := cygx.GetCygxAppointmentCount(activityId, sqlStr)
 	if errmyTotal != nil {
 		br.Msg = "获取失败"
@@ -318,6 +330,13 @@ func (this *ActivitySignupCoAntroller) AppointmentList() {
 				respList.List = append(respList.List, v)
 			}
 		}
+		if adminInfo.RoleTypeCode == "rai_group" {
+			//组长查看本组所有组员
+			memberType = "GroupLeader"
+		} else {
+			//组员查看自己
+			memberType = "Sale"
+		}
 	} else {
 		respList.List = list
 	}
@@ -739,6 +758,13 @@ func (this *ActivitySignupCoAntroller) SalonFailSignupList() {
 				respList.List = append(respList.List, v)
 			}
 		}
+		if adminInfo.RoleTypeCode == "rai_group" {
+			//组长查看本组所有组员
+			memberType = "GroupLeader"
+		} else {
+			//组员查看自己
+			memberType = "Sale"
+		}
 	} else {
 		respList.List = list
 	}
@@ -1034,6 +1060,13 @@ func (this *ActivitySignupCoAntroller) FailSignupList() {
 				respList.List = append(respList.List, v)
 			}
 		}
+		if adminInfo.RoleTypeCode == "rai_group" {
+			//组长查看本组所有组员
+			memberType = "GroupLeader"
+		} else {
+			//组员查看自己
+			memberType = "Sale"
+		}
 	} else {
 		respList.List = listNew
 	}
@@ -2468,6 +2501,14 @@ func (this *ActivitySignupCoAntroller) SummaryList() {
 				companyIdstr = append(companyIdstr, strconv.Itoa(v))
 			}
 			sqlStr += ` AND s.company_id IN (` + strings.Join(companyIdstr, ",") + `) `
+
+			if adminInfo.RoleTypeCode == "rai_group" {
+				//组长查看本组所有组员
+				memberType = "GroupLeader"
+			} else {
+				//组员查看自己
+				memberType = "Sale"
+			}
 		}
 	}
 	list, err := cygx.GetCygxAppointmentSummaryList(activityId, sqlStr)
@@ -2758,6 +2799,14 @@ func (this *ActivitySignupCoAntroller) ReminderList() {
 			companyIdstr = append(companyIdstr, strconv.Itoa(v))
 		}
 		sqlStr += ` AND s.company_id IN (` + strings.Join(companyIdstr, ",") + `) `
+
+		if adminInfo.RoleTypeCode == "rai_group" {
+			//组长查看本组所有组员
+			memberType = "GroupLeader"
+		} else {
+			//组员查看自己
+			memberType = "Sale"
+		}
 	}
 
 	list, err := cygx.GetCygxActivityMeetingReminderList(activityId, sqlStr)

+ 1 - 1
controllers/cygx/contract_allocation.go

@@ -991,7 +991,7 @@ func (this *ContractAllocationController) CompanyContractStatistics() {
 		item := new(cygx.AllocationRealNameStatisticsListResp)
 		item.RealName = "合计"
 		item.TotalRelatedContract = mapPermissionAllocation[k]
-		item.TotalDispatchPoint = fmt.Sprint(utils.SubFloatToString(mapPermissionMoney[k], 2), "/", mapPermissionMoneyAvg[k])
+		item.TotalDispatchPoint = fmt.Sprint(utils.SubFloatToString(mapPermissionMoney[k], 2), "/", utils.SubFloatToString(mapPermissionMoneyAvg[k], 2))
 		item.GroupProportion = "100%"
 
 		//部门占比

+ 327 - 0
controllers/cygx/questionnaire.go

@@ -0,0 +1,327 @@
+package cygx
+
+import (
+	"encoding/json"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/cygx"
+	cygxService "hongze/hz_crm_api/services/cygx"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+// 问卷调查
+type QuestionnaireController struct {
+	controllers.BaseAuthController
+}
+
+// @Title 新增、修改问卷内容
+// @Description  新增、修改问卷内容接口
+// @Param	request	body cygx.AddCygxQuestionnaireReq true "type json string"
+// @Success 200 {object} "保存成功"
+// @router /questionnaire/preserveAndEdit [post]
+func (this *QuestionnaireController) PreserveAndPublish() {
+	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
+	}
+
+	var req cygx.AddCygxQuestionnaireReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	endTime := utils.StrDateToDate(req.EndTime) //时间字符串格式转时间格式
+	questionnaireId := req.QuestionnaireId
+	activityTypeId := req.ActivityTypeId
+	content := req.Content
+	maxChooseTotal := req.MaxChooseTotal
+	listTheme := req.ListTheme
+
+	activityTypeInfo, errType := cygx.GetActivityTypeDetailById(activityTypeId)
+	if errType != nil {
+		br.Msg = "请选择活动类型"
+		br.ErrMsg = "获取活动类型信息失败,Err:" + errType.Error()
+		return
+	}
+	item := new(cygx.CygxQuestionnaire)
+	item.QuestionnaireId = req.QuestionnaireId
+	item.ActivityTypeId = activityTypeId
+	item.ActivityTypeName = activityTypeInfo.ActivityTypeName
+	item.Content = content
+	item.EndTime = endTime
+	item.PublishTime = time.Now()
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.AdminId = sysUser.AdminId
+	item.MaxChooseTotal = maxChooseTotal
+
+	if questionnaireId == 0 {
+		newId, err := cygx.AddCygxQuestionnaire(item, listTheme)
+		if err != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "保存失败,Err:" + err.Error()
+			return
+		}
+		//投票发布时,给所有开通买方研选正式试用的客户,推送模板消息
+		go cygxService.SendWxMsgCygxQuestionnaire(int(newId))
+
+	} else {
+		err = cygx.EditCygxQuestionnaire(item, listTheme)
+		if err != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "保存失败,Err:" + err.Error()
+			return
+		}
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "操作成功"
+}
+
+// @Title 列表
+// @Description 列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Success Ret=200 {object} cygx.GetCygxQuestionnaireResp
+// @router /questionnaire/list [get]
+func (this *QuestionnaireController) List() {
+	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
+	}
+	resp := new(cygx.GetCygxQuestionnaireResp)
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	var condition string
+	var pars []interface{}
+
+	total, err := cygx.GetCygxQuestionnaireCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	condition += "	ORDER BY art.publish_time DESC  "
+	list, err := cygx.GetCygxQuestionnaireList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	for _, v := range list {
+		endTime := utils.StrTimeToTime(v.EndTime + " 23:59:59") //时间字符串格式转时间格式
+		if endTime.Before(time.Now()) {
+			v.State = "已截止"
+		} else {
+			v.State = "发布中"
+		}
+	}
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp.List = list
+	resp.Paging = page
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 详情
+// @Description 详情接口
+// @Param   QuestionnaireId   query   int  true       "问卷ID"
+// @Success Ret=200 {object} cygx.GetCygxTacticsTimeLineResp
+// @router /questionnaire/detail [get]
+func (this *QuestionnaireController) Detail() {
+	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
+	}
+	resp := new(cygx.GetCygxQuestionnaireDetailResp)
+	questionnaireId, _ := this.GetInt("QuestionnaireId")
+	detail, err := cygx.GetCygxQuestionnaireDetail(questionnaireId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,GetCygxQuestionnaireDetail Err:" + err.Error()
+		return
+	}
+
+	ListTheme, err := cygx.GetCygxQuestionnaireThemeListByQuestionnaireId(questionnaireId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,GetCygxQuestionnaireThemeListByQuestionnaireId Err:" + err.Error()
+		return
+	}
+	detail.ListTheme = ListTheme
+	resp.Detail = detail
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 投票结果
+// @Description 投票结果接口
+// @Param   QuestionnaireId   query   int  true       "问卷ID"
+// @Success Ret=200 {object} cygx.CygxQuestionnaireVoteListResp
+// @router /questionnaire/vote_detail [get]
+func (this *QuestionnaireController) VoteDetail() {
+	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
+	}
+	resp := new(cygx.CygxQuestionnaireVoteListResp)
+	questionnaireId, _ := this.GetInt("QuestionnaireId")
+
+	listTheme, err := cygx.GetCygxQuestionnaireThemeListByQuestionnaireId(questionnaireId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,GetCygxQuestionnaireThemeListByQuestionnaireId Err:" + err.Error()
+		return
+	}
+
+	listVote, err := cygx.GetCygxCygxQuestionnaireVoteListByQuestionnaireId(questionnaireId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,GetCygxCygxQuestionnaireVoteListByQuestionnaireId Err:" + err.Error()
+		return
+	}
+	//计算每个主题的投票数量
+	mapVoteTotal := make(map[int]int)
+	for _, v := range listVote {
+		mapVoteTotal[v.QuestionnaireThemeId] += 1
+	}
+
+	for _, v := range listTheme {
+		item := new(cygx.AddCygxQuestionnaireThemeReq)
+		item.QuestionnaireThemeId = v.QuestionnaireThemeId
+		item.ActivityTheme = v.ActivityTheme
+		item.VoteTotal = mapVoteTotal[v.QuestionnaireThemeId]
+		resp.List = append(resp.List, item)
+	}
+	if len(resp.List) == 0 {
+		resp.List = make([]*cygx.AddCygxQuestionnaireThemeReq, 0)
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 票数明细
+// @Description 票数明细接口
+// @Param   QuestionnaireThemeId   query   int  true       "主题问卷ID"
+// @Success Ret=200 {object} cygx.GetCygxTacticsTimeLineResp
+// @router /questionnaire/vote_list [get]
+func (this *QuestionnaireController) VoteList() {
+	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
+	}
+	resp := new(cygx.CygxCygxQuestionnaireVoteListResp)
+	questionnaireThemeId, _ := this.GetInt("QuestionnaireThemeId")
+	listVote, err := cygx.GetCygxQuestionnaireVoteListByQuestionnaireThemeId(questionnaireThemeId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,GetCygxQuestionnaireVoteListByQuestionnaireThemeId Err:" + err.Error()
+		return
+	}
+	resp.List = listVote
+	if len(resp.List) == 0 {
+		resp.List = make([]*cygx.CygxQuestionnaireVoteResp, 0)
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 其余主题投票结果
+// @Description 其余主题投票结果接口
+// @Param   QuestionnaireId   query   int  true       "问卷ID"
+// @Success Ret=200 {object} cygx.CygxQuestionnaireVoteListResp
+// @router /questionnaire/vote_other [get]
+func (this *QuestionnaireController) VoteOther() {
+	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
+	}
+	resp := new(cygx.CygxQuestionnaireVoteOtherThemeListResp)
+	questionnaireId, _ := this.GetInt("QuestionnaireId")
+
+	listOther, err := cygx.GetCygxQuestionnaireVoteOtherThemeListByQuestionnaireId(questionnaireId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,GetCygxCygxQuestionnaireVoteListByQuestionnaireId Err:" + err.Error()
+		return
+	}
+	resp.List = listOther
+	if len(resp.List) == 0 {
+		resp.List = make([]*cygx.CygxQuestionnaireVoteOtherThemeResp, 0)
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 17 - 2
models/company/company_permission.go

@@ -624,7 +624,6 @@ func GetReportPermissionIdsByCompanyIds(companyIds []int) (items []*CompanyListP
 	return
 }
 
-
 // GetCompanyReportPermissionByCompanyIdAndProductId 获取权限类型
 func GetCompanyReportPermissionByCompanyIdAndProductId(companyId, productId int) (items []*CompanyReportPermission, err error) {
 	o := orm.NewOrm()
@@ -639,4 +638,20 @@ WHERE
 	AND STATUS = '正式' `
 	_, err = o.Raw(sql, companyId, productId).QueryRows(&items)
 	return
-}
+}
+
+// 列表
+func GetCompanyReportPermissionList(condition string, pars []interface{}, startSize, pageSize int) (items []*CompanyReportPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_report_permission  WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	if startSize+pageSize > 0 {
+		sql += ` LIMIT ?,?  `
+		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	} else {
+		_, err = o.Raw(sql, pars).QueryRows(&items)
+	}
+	return
+}

+ 1 - 1
models/cygx/activity_appointment.go

@@ -193,7 +193,7 @@ func GetActivityAppointmentOpenIdList(activityId int) (items []*OpenIdList, err
 				INNER JOIN cygx_user_record AS u ON u.cygx_bind_account = m.mobile 
 				AND u.cygx_user_id = m.user_id 
 			WHERE
-				m.activity_id < ? `
+				m.activity_id = ? `
 	_, err = o.Raw(sql, activityId).QueryRows(&items)
 	return
 }

+ 1 - 1
models/cygx/activity_help_ask.go

@@ -42,7 +42,7 @@ func GetActivityHelpAskOpenIdList(activityId int) (items []*OpenIdList, err erro
 				INNER JOIN cygx_user_record AS u ON u.cygx_bind_account = m.mobile 
 				AND u.cygx_user_id = m.user_id 
 			WHERE
-				m.activity_id < ? `
+				m.activity_id = ? `
 	_, err = o.Raw(sql, activityId).QueryRows(&items)
 	return
 }

+ 218 - 0
models/cygx/questionnaire.go

@@ -0,0 +1,218 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type CygxQuestionnaire struct {
+	QuestionnaireId  int       `orm:"column(questionnaire_id);pk"`
+	ActivityTypeId   int       `description:"活动类型id"`
+	ActivityTypeName string    `description:"活动名称"`
+	Content          string    `description:"内容"`
+	EndTime          time.Time `description:"截止日期"`
+	CreateTime       time.Time `description:"创建时间"`
+	ModifyTime       time.Time `description:"更新时间"`
+	PublishTime      time.Time `description:"发布时间"`
+	AdminId          int       `description:"管理员ID"`
+	MaxChooseTotal   int       `description:"最多可选几项"`
+	OtherThemeTotal  int       `description:"其余主题投票数量"`
+}
+
+type CygxQuestionnaireTheme struct {
+	QuestionnaireThemeId int       `orm:"column(questionnaire_theme_id);pk"`
+	QuestionnaireId      int       `description:"问卷ID"`
+	ActivityTheme        string    `description:"活动主题"`
+	CreateTime           time.Time `description:"创建时间"`
+	ModifyTime           time.Time `description:"更新时间"`
+}
+
+type AddCygxQuestionnaireReq struct {
+	QuestionnaireId int    `description:"ID"`
+	ActivityTypeId  int    `description:"活动类型id"`
+	Content         string `description:"内容"`
+	EndTime         string `description:"截止日期"`
+	MaxChooseTotal  int    `description:"最多可选几项"`
+	ListTheme       []*AddCygxQuestionnaireThemeReq
+}
+
+type AddCygxQuestionnaireThemeReq struct {
+	QuestionnaireThemeId int    `description:"问卷主题ID"`
+	ActivityTheme        string `description:"活动主题"`
+	VoteTotal            int    `description:"票数"`
+}
+
+type CygxQuestionnaireResp struct {
+	QuestionnaireId  int    `orm:"column(questionnaire_id);pk"`
+	ActivityTypeId   int    `description:"活动类型id"`
+	ActivityTypeName string `description:"活动类型名称"`
+	Content          string `description:"内容"`
+	EndTime          string `description:"截止日期"`
+	CreateTime       string `description:"创建时间"`
+	ModifyTime       string `description:"更新时间"`
+	PublishTime      string `description:"发布时间"`
+	AdminId          int    `description:"管理员ID"`
+	MaxChooseTotal   int    `description:"最多可选几项"`
+	State            string `description:"状态"`
+	OtherThemeTotal  int    `description:"其余主题投票数量"`
+	ListTheme        []*AddCygxQuestionnaireThemeReq
+}
+
+type GetCygxQuestionnaireResp struct {
+	Paging *paging.PagingItem `description:"分页数据"`
+	List   []*CygxQuestionnaireResp
+}
+
+// 添加
+func AddCygxQuestionnaire(item *CygxQuestionnaire, listTheme []*AddCygxQuestionnaireThemeReq) (newId int64, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	newId, err = to.Insert(item)
+	if err != nil {
+		return
+	}
+	//添加主题与问卷ID的关联
+	for _, v := range listTheme {
+		itemTheme := new(CygxQuestionnaireTheme)
+		itemTheme.QuestionnaireId = int(newId)
+		itemTheme.ActivityTheme = v.ActivityTheme
+		itemTheme.CreateTime = time.Now()
+		itemTheme.ModifyTime = time.Now()
+		_, err = to.Insert(itemTheme)
+		if err != nil {
+			return
+		}
+	}
+	return
+}
+
+// 编辑
+func EditCygxQuestionnaire(item *CygxQuestionnaire, listTheme []*AddCygxQuestionnaireThemeReq) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	updateParams := make(map[string]interface{})
+	updateParams["ActivityTypeId"] = item.ActivityTypeId
+	updateParams["ActivityTypeName"] = item.ActivityTypeName
+	updateParams["EndTime"] = item.EndTime
+	updateParams["ModifyTime"] = time.Now()
+	updateParams["MaxChooseTotal"] = item.MaxChooseTotal
+	updateParams["Content"] = item.Content
+	ptrStructOrTableName := "cygx_questionnaire"
+	whereParam := map[string]interface{}{"questionnaire_id": item.QuestionnaireId}
+	qs := to.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	if err != nil {
+		return
+	}
+
+	//如果有减少的就进行删除
+	var questionnaireThemeIds []string
+	for _, v := range listTheme {
+		questionnaireThemeIds = append(questionnaireThemeIds, strconv.Itoa(v.QuestionnaireThemeId))
+	}
+	sql := `	DELETE FROM cygx_questionnaire_theme WHERE questionnaire_id = ? AND  questionnaire_theme_id NOT IN  (` + strings.Join(questionnaireThemeIds, ",") + `)`
+	_, err = to.Raw(sql, item.QuestionnaireId).Exec()
+	if err != nil {
+		return
+	}
+
+	//添加主题与问卷ID的关联
+	for _, v := range listTheme {
+		if v.QuestionnaireThemeId == 0 {
+			itemTheme := new(CygxQuestionnaireTheme)
+			itemTheme.QuestionnaireId = item.QuestionnaireId
+			itemTheme.ActivityTheme = v.ActivityTheme
+			itemTheme.CreateTime = time.Now()
+			itemTheme.ModifyTime = time.Now()
+			_, err = to.Insert(itemTheme)
+			if err != nil {
+				return
+			}
+		} else {
+			updateParams := make(map[string]interface{})
+			updateParams["ActivityTheme"] = v.ActivityTheme
+			updateParams["ModifyTime"] = time.Now()
+			ptrStructOrTableName := "cygx_questionnaire_theme"
+			whereParam := map[string]interface{}{"questionnaire_theme_id": v.QuestionnaireThemeId}
+			qs := to.QueryTable(ptrStructOrTableName)
+			for expr, exprV := range whereParam {
+				qs = qs.Filter(expr, exprV)
+			}
+			_, err = qs.Update(updateParams)
+			if err != nil {
+				return
+			}
+		}
+
+	}
+	return
+}
+
+// 获取数量
+func GetCygxQuestionnaireCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_questionnaire as art WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 列表
+func GetCygxQuestionnaireList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxQuestionnaireResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_questionnaire as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` LIMIT ?,?  `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+type GetCygxQuestionnaireDetailResp struct {
+	Detail *CygxQuestionnaireResp
+}
+
+// 通过ID获取详情
+func GetCygxQuestionnaireDetail(questionnaireId int) (item *CygxQuestionnaireResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_questionnaire  WHERE questionnaire_id=? `
+	err = o.Raw(sql, questionnaireId).QueryRow(&item)
+	return
+}
+
+// 列表
+func GetCygxQuestionnaireThemeListByQuestionnaireId(questionnaireId int) (items []*AddCygxQuestionnaireThemeReq, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_questionnaire_theme as art WHERE questionnaire_id = ? `
+	_, err = o.Raw(sql, questionnaireId).QueryRows(&items)
+	return
+}

+ 79 - 0
models/cygx/questionnaire_vote.go

@@ -0,0 +1,79 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type CygxQuestionnaireVoteResp struct {
+	QuestionnaireVoteId  int    `orm:"column(questionnaire_vote_id);pk"`
+	QuestionnaireId      int    `description:"问卷ID"`
+	QuestionnaireThemeId int    `description:"问卷主题ID"`
+	UserId               int    `description:"用户ID"`
+	CreateTime           string `description:"创建时间"`
+	Mobile               string `description:"手机号"`
+	Email                string `description:"邮箱"`
+	CompanyId            int    `description:"公司id"`
+	CompanyName          string `description:"公司名称"`
+	ModifyTime           string `description:"修改时间"`
+	RealName             string `description:"用户实际名称"`
+	SellerName           string `description:"所属销售"`
+	RegisterPlatform     int    `description:"来源 1小程序,2:网页"`
+}
+
+type CygxQuestionnaireVoteOtherThemeResp struct {
+	QuestionnaireVoteOtherThemeId int `orm:"column(questionnaire_vote_other_theme_id);pk"`
+	QuestionnaireId               int `description:"问卷ID"`
+	UserId                        int `description:"用户ID"`
+	CreateTime                    string
+	Mobile                        string `description:"手机号"`
+	Email                         string `description:"邮箱"`
+	CompanyId                     int    `description:"公司id"`
+	CompanyName                   string `description:"公司名称"`
+	ModifyTime                    string `description:"修改时间"`
+	RealName                      string `description:"用户实际名称"`
+	SellerName                    string `description:"所属销售"`
+	Content                       string `description:"内容"`
+	RegisterPlatform              int    `description:"来源 1小程序,2:网页"`
+}
+
+type CygxQuestionnaireVoteReq struct {
+	QuestionnaireId       int    `description:"问卷ID"`
+	QuestionnaireThemeIds []int  `description:"问卷主题ID"`
+	Content               string `description:"内容"`
+}
+
+type CygxQuestionnaireVoteListResp struct {
+	List []*AddCygxQuestionnaireThemeReq
+}
+
+// 列表
+func GetCygxCygxQuestionnaireVoteListByQuestionnaireId(questionnaireId int) (items []*CygxQuestionnaireVoteResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_questionnaire_vote as art WHERE questionnaire_id = ? `
+	_, err = o.Raw(sql, questionnaireId).QueryRows(&items)
+	return
+}
+
+type CygxCygxQuestionnaireVoteListResp struct {
+	List []*CygxQuestionnaireVoteResp
+}
+
+// 列表
+func GetCygxQuestionnaireVoteListByQuestionnaireThemeId(questionnaireThemeId int) (items []*CygxQuestionnaireVoteResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_questionnaire_vote as art WHERE questionnaire_theme_id = ?  ORDER BY create_time DESC  `
+	_, err = o.Raw(sql, questionnaireThemeId).QueryRows(&items)
+	return
+}
+
+type CygxQuestionnaireVoteOtherThemeListResp struct {
+	List []*CygxQuestionnaireVoteOtherThemeResp
+}
+
+// 列表
+func GetCygxQuestionnaireVoteOtherThemeListByQuestionnaireId(questionnaireId int) (items []*CygxQuestionnaireVoteOtherThemeResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_questionnaire_vote_other_theme as art WHERE questionnaire_id = ?   ORDER BY create_time DESC  `
+	_, err = o.Raw(sql, questionnaireId).QueryRows(&items)
+	return
+}

+ 2 - 0
models/db.go

@@ -456,6 +456,8 @@ func initCygx() {
 		new(cygx.CygxAllocationCompanyContractLog),
 		new(cygx.CygxAllocationCompanyContractPermission),
 		new(cygx.CygxAllocationCompanyContractPermissionLog),
+		new(cygx.CygxQuestionnaire),
+		new(cygx.CygxQuestionnaireTheme),
 	)
 }
 

+ 54 - 0
routers/commentsRouter.go

@@ -2068,6 +2068,60 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/questionnaire/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/questionnaire/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"],
+        beego.ControllerComments{
+            Method: "PreserveAndPublish",
+            Router: `/questionnaire/preserveAndEdit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"],
+        beego.ControllerComments{
+            Method: "VoteDetail",
+            Router: `/questionnaire/vote_detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"],
+        beego.ControllerComments{
+            Method: "VoteList",
+            Router: `/questionnaire/vote_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"],
+        beego.ControllerComments{
+            Method: "VoteOther",
+            Router: `/questionnaire/vote_other`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ReportArticleController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ReportArticleController"],
         beego.ControllerComments{
             Method: "ExportList",

+ 1 - 0
routers/router.go

@@ -154,6 +154,7 @@ func init() {
 				&cygx.TagManagementController{},
 				&cygx.YanxuanSpecialController{},
 				&cygx.ContractAllocationController{},
+				&cygx.QuestionnaireController{},
 			),
 		),
 		web.NSNamespace("/advisory",

+ 103 - 0
services/cygx/cygx_questionnaire.go

@@ -0,0 +1,103 @@
+package cygx
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+	"strconv"
+)
+
+//func init() {
+//	SendWxMsgCygxQuestionnaire(2)
+//}
+
+// 投票发布时,给所有开通买方研选正式试用的客户
+func SendWxMsgCygxQuestionnaire(questionnaireId int) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("投票发布时,给所有开通买方研选正式试用的客户,questionnaireId:", questionnaireId, err.Error()), 2)
+		}
+	}()
+
+	//获取问卷详情
+	detail, e := cygx.GetCygxQuestionnaireDetail(questionnaireId)
+	if e != nil {
+		err = errors.New("GetCygxQuestionnaireDetail, Err: " + e.Error())
+		return
+	}
+
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var companyIds []int
+
+	var condition string
+	var pars []interface{}
+	condition = "  AND  chart_permission_id = 31 AND `status` IN ('正式','试用')  "
+	//获取所有开通买方研选正式试用的客户列表
+	listCompany, e := company.GetCompanyReportPermissionList(condition, pars, 0, 0)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxQuestionnaireDetail, Err: " + e.Error())
+		return
+	}
+	for _, v := range listCompany {
+		companyIds = append(companyIds, v.CompanyId)
+	}
+
+	//获取相关的用户
+	userList, e := models.GetWxUserByCompanyIds(companyIds)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetWxUserByCompanyIds, Err: " + e.Error())
+		return
+	}
+	mobile := make([]string, 0)
+	for _, v := range userList {
+		mobile = append(mobile, v.Mobile)
+	}
+
+	//获取用户对应的Openid
+	openIdList, e := cygx.GetUserRecordListByMobileArr(mobile)
+	if e != nil {
+		err = errors.New("GetSellerByAdminId, Err: " + e.Error())
+		return
+	}
+
+	if len(openIdList) == 0 {
+		return
+	}
+	keyword1 = "买方研选【" + detail.ActivityTypeName + "】主题投票"
+	keyword2 = "请选择您感兴趣的主题"
+
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	redirectUrl := ""
+	if utils.RunMode == "release" {
+		redirectUrl = utils.WX_MSG_PATH_QUESTIONNAIRE_DETAIL + strconv.Itoa(questionnaireId)
+	}
+	sendInfo := new(services.SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(questionnaireId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	e = services.SendTemplateMsg(sendInfo)
+	if e != nil {
+		err = errors.New("SendTemplateMsg, Err: " + e.Error())
+		return
+	}
+	return
+}

+ 1 - 0
utils/constants.go

@@ -466,6 +466,7 @@ const (
 	WX_MSG_PATH_YX_SPECIAL_DETAIL               = "pages-purchaser/noteAndViewpoint/noteAndViewpoint?id="         //研选专栏详情
 	WX_MSG_PATH_YX_SPECIAL_ENABLE_DETAIL        = "pages-purchaser/toExamine/toExamine?id="                       //研选专栏审核详情页面
 	WX_MSG_PATH_YX_SPECIAL_CENTER               = "pages-purchaser/contentAllPage/contentAllPage?Status=4"        //研选专栏内容中心
+	WX_MSG_PATH_QUESTIONNAIRE_DETAIL            = "pages-purchaser/themeVote/themeVote?id="                       //问卷调查详情页
 )
 
 // 图表类型