Browse Source

Merge branch 'crm/crm_15.9' of http://8.136.199.33:3000/hongze/hz_crm_api

xingzai 9 tháng trước cách đây
mục cha
commit
21ea45c8de

+ 49 - 0
controllers/company_seller.go

@@ -5296,3 +5296,52 @@ func (this *CompanySellerController) ShareCheckList2() {
 		List: list,
 	}
 }
+
+// RaiServeSellerList
+// @Title 获取权益服务组销售列表
+// @Description 获取权益服务组销售列表 接口
+// @Success 200 {object} company.DepartmentGroupSellersResp
+// @router /seller/rai_serve/list [get]
+func (this *CompanySellerController) RaiServeSellerList() {
+	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 := make([]company.DepartmentGroupSellers, 0)
+
+	groupId := 0
+	if utils.RunMode == "release" {
+		groupId = 68
+	} else {
+		groupId = 132
+	}
+	subAdmins, err := system.GetAdminByGroupId(groupId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取销售失败"
+		br.ErrMsg = "获取销售失败,Err:" + err.Error()
+		return
+	}
+
+	for _, seller := range subAdmins {
+		sellerItem := company.DepartmentGroupSellers{
+			AdminId:      fmt.Sprint(seller.AdminId),
+			RealName:     seller.RealName,
+			Authority:    seller.Authority,
+			RoleTypeCode: seller.RoleTypeCode,
+		}
+		resp = append(resp, sellerItem)
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 966 - 0
controllers/cygx/rai_serve.go

@@ -0,0 +1,966 @@
+package cygx
+
+import (
+	"errors"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/models/roadshow"
+	cygxService "hongze/hz_crm_api/services/cygx"
+	"hongze/hz_crm_api/utils"
+	"os"
+	"path/filepath"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// 权益服务类型
+type RaiServeCoAntroller struct {
+	controllers.BaseAuthController
+}
+
+// @Title 服务类型列表
+// @Description 服务类型列表接口
+// @Success 200 {object} cygx.RaiServeTypeListResp
+// @router /rai_serve/type_list [get]
+func (this *RaiServeCoAntroller) TypeList() {
+	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.RaiServeTypeListResp)
+	var condition string
+	list, err := cygx.GetRaiServeTypeRespList(condition)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 标签搜索
+// @Description 标签搜索接口
+// @Param   KeyWord   query   string  false       "搜索关键词"
+// @Success 200 {object} cygx.RaiServeTagListResp
+// @router /rai_serve/search_tag [get]
+func (this *RaiServeCoAntroller) SearchTag() {
+	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
+	}
+	keyWord := this.GetString("KeyWord")
+	if keyWord == "" {
+		br.Msg = "请输入搜索关键词"
+		return
+	}
+
+	resp := new(cygx.RaiServeTagListResp)
+	list, err := cygx.GetRaiServeSearchTagRespList(keyWord)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	//如果有固收或者策略就去查询行业表
+	if strings.Contains("固收", keyWord) || strings.Contains("策略", keyWord) {
+		var condition string
+		var pars []interface{}
+		keyWord = "%" + keyWord + "%"
+		condition = ` AND  product_id  = 2 AND  permission_name  IN ('策略','固收')   AND permission_name LIKE ?  `
+		pars = append(pars, keyWord)
+
+		listChartPermission, err := models.GetChartPermissionListByCondition(condition, pars)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取数据失败,GetChartPermissionListByCondition Err:" + err.Error()
+			return
+		}
+		for _, v := range listChartPermission {
+			item := new(cygx.RaiServeTagResp)
+			item.TagType = 3
+			item.TagId = v.ChartPermissionId
+			item.TagName = v.PermissionName
+			list = append(list, item)
+		}
+	}
+	if len(list) == 0 {
+		list = make([]*cygx.RaiServeTagResp, 0)
+	} else {
+		for _, v := range list {
+			v.Md5Key = utils.MD5(fmt.Sprintf("K_", v.TagType, "V_", v.TagId))
+		}
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 标签搜索(研究员日历添加到会信息)
+// @Description 标签搜索接口
+// @Param   KeyWord   query   string  false       "搜索关键词"
+// @Param   ResearcherId   query   int  false       "研究员ID"
+// @Success 200 {object} cygx.RaiServeTagListResp
+// @router /rai_serve/search_tag_by_calendar [get]
+func (this *RaiServeCoAntroller) SearchTagCalendar() {
+	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
+	}
+	keyWord := this.GetString("KeyWord")
+
+	researcherId := this.GetString("ResearcherId")
+	askEmailList, err := cygx.GetAskEmailListByAdminIds(researcherId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "GetAskEmailCountByCelue,Err:" + err.Error()
+		return
+	}
+
+	var hasCelue bool
+	var permissionName []string
+	for _, v := range askEmailList {
+		permissionName = append(permissionName, v.ChartPermissionName)
+		if v.ChartPermissionName == "策略" || v.ChartPermissionName == "固收" {
+			hasCelue = true
+		}
+	}
+
+	var permissionNameSql []string
+	for _, v := range permissionName {
+		permissionNameSql = append(permissionNameSql, "'"+v+"'")
+	}
+	chartList, err := models.GetChartPermissionByNamesByRai(permissionNameSql)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,GetChartPermissionByNames Err:" + err.Error()
+		return
+	}
+
+	var list []*cygx.RaiServeTagResp
+	resp := new(cygx.RaiServeTagListResp)
+	if hasCelue {
+		for _, v := range chartList {
+			item := new(cygx.RaiServeTagResp)
+			item.TagType = 3
+			item.TagId = v.ChartPermissionId
+			item.TagName = v.PermissionName
+			list = append(list, item)
+		}
+	} else {
+		if keyWord == "" {
+			br.Msg = "请输入搜索关键词"
+			return
+		}
+		keyWordSlice := strings.Split(keyWord, ",")
+		var conditionindustrial string
+		var conditionsubject string
+		for _, v := range keyWordSlice {
+			conditionindustrial += ` OR i.industry_name LIKE '%` + v + `%' `
+			conditionsubject += ` OR s.subject_name LIKE  '%` + v + `%' `
+		}
+		var permissionId []string
+		for _, v := range chartList {
+			permissionId = append(permissionId, strconv.Itoa(v.ChartPermissionId))
+		}
+		list, err = cygx.GetRaiServeSearchTagRespListBycharId(keyWord, strings.Join(permissionId, ","), conditionindustrial, conditionsubject)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取数据失败,GetRaiServeSearchTagRespListBycharId Err:" + err.Error()
+			return
+		}
+	}
+
+	if len(list) == 0 {
+		list = make([]*cygx.RaiServeTagResp, 0)
+	} else {
+		for _, v := range list {
+			v.Md5Key = utils.MD5(fmt.Sprintf("K_", v.TagType, "V_", v.TagId))
+		}
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 校验是否属于策略固收
+// @Description 校验是否属于策略固收接口
+// @Param   ResearcherId   query   int  false       "研究员ID"
+// @Success 200 {object} cygx.RaiServeTagListResp
+// @router /rai_serve/chcck_PermissionName [get]
+func (this *RaiServeCoAntroller) ChcckPermissionName() {
+	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
+	}
+
+	researcherId := this.GetString("ResearcherId")
+	askEmailList, err := cygx.GetAskEmailListByAdminIds(researcherId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "GetAskEmailCountByCelue,Err:" + err.Error()
+		return
+	}
+
+	var belong bool
+	var permissionNameResp []string
+	var permissionNames []string
+	for _, v := range askEmailList {
+		permissionNames = append(permissionNames, v.ChartPermissionName)
+		if v.ChartPermissionName == "策略" || v.ChartPermissionName == "固收" {
+			belong = true
+			permissionNameResp = append(permissionNameResp, v.ChartPermissionName)
+		}
+	}
+	var list []*cygx.RaiServeTagResp
+	if belong {
+		var permissionNameSql []string
+		for _, v := range permissionNameResp {
+			permissionNameSql = append(permissionNameSql, "'"+v+"'")
+		}
+		chartList, err := models.GetChartPermissionByNamesByRai(permissionNameSql)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取数据失败,GetChartPermissionByNames Err:" + err.Error()
+			return
+		}
+		for _, v := range chartList {
+			item := new(cygx.RaiServeTagResp)
+			item.TagType = 3
+			item.TagId = v.ChartPermissionId
+			item.TagName = v.PermissionName
+			item.Md5Key = utils.MD5(fmt.Sprintf("K_", item.TagType, "V_", item.TagId))
+			list = append(list, item)
+		}
+	}
+	resp := new(cygx.ChekChartPermissionNameResp)
+	if len(list) == 0 {
+		list = make([]*cygx.RaiServeTagResp, 0)
+	}
+	resp.List = list
+	resp.Belong = belong
+	resp.ChartPermissionName = strings.Join(permissionNameResp, ",")
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 权益服务统计列表
+// @Description 权益服务统计列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   SellerId   query   string  false       "销售id"
+// @Param   ShareSellerId   query   string  false       "共享销售ID"
+// @Param   ServeTypeId   int   int	  false       "服务类型ID"
+// @Param   TagType   int   string  false       "标签类型"
+// @Param   TagId   int   string  false       "标签ID"
+// @Param   Status   query   string  false       "客户状态,正式、未续约(除了正式之外的所有)"
+// @Param   SortType   query   string  true       "如何排序,是正序还是倒序,枚举值:`asc 正序`,`desc 倒叙`"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @Success 200 {object} cygx.RaiServeTagListResp
+// @router /rai_serve/list [get]
+func (this *RaiServeCoAntroller) 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
+	}
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	status := this.GetString("Status")
+	sellerId := this.GetString("SellerId")
+	shareSellerId := this.GetString("ShareSellerId")
+	sortType := this.GetString("SortType")
+	tagType, _ := this.GetInt("TagType")
+	tagId, _ := this.GetInt("TagId")
+	serveTypeId, _ := this.GetInt("ServeTypeId")
+	isExport, _ := this.GetBool("IsExport")
+	resp := new(cygx.CygxRaiServeCompanyListResp)
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	var condition string
+	var sortStr string
+	var pars []interface{}
+
+	if status != "" {
+		if status == "正式" {
+			condition += " AND status = '正式' "
+		} else {
+			condition += " AND status != '正式' "
+		}
+	}
+
+	if sellerId != "" {
+		condition += " AND seller_id IN (?) "
+		pars = append(pars, sellerId)
+	}
+
+	if shareSellerId != "" {
+		condition += " AND share_seller_id IN (?) "
+		pars = append(pars, shareSellerId)
+	}
+
+	if sortType != "" {
+		if sortType == "asc" {
+			sortStr = " ORDER BY money  ASC "
+		} else if sortType == "desc" {
+			sortStr = " ORDER BY money DESC "
+		}
+	} else {
+		sortStr = " ORDER BY end_date DESC "
+	}
+
+	//如果不是权益管理员和admin、财务,就做可见权限限制
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_RESEARCHR {
+		if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER {
+			condition += " AND  (seller_id = ? OR  share_seller_id  = ? ) "
+			pars = append(pars, sysUser.AdminId, sysUser.AdminId)
+		}
+		if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+			condition += " AND  ( seller_id = ? OR  share_seller_id  = ?  OR   group_id = ? OR  share_group_id = ? ) "
+			pars = append(pars, sysUser.AdminId, sysUser.AdminId, sysUser.GroupId, sysUser.GroupId)
+		}
+	}
+
+	total, err := cygx.GetCygxRaiServeCompanyCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetCygxRaiServeCompanyCountErr:" + err.Error()
+		return
+	}
+	listRaiServeCompany, err := cygx.GetCygxRaiServeCompanyList(condition+sortStr, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	var companyIds []int
+	for _, v := range listRaiServeCompany {
+		companyIds = append(companyIds, v.CompanyId)
+	}
+
+	mapWeekAmount := make(map[string]float64) //周度服务量
+	weeks := 4
+	if isExport {
+		weeks = 12 // 下载获取近12周的数据
+	}
+	lencompanyIds := len(companyIds)
+	if lencompanyIds > 0 {
+		var conditionBill string
+		var parsBill []interface{}
+
+		conditionBill, parsBill, err = getServeBillTag(tagType, tagId) // 标签ID搜索语句处理
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取用户信息失败-getServeBillTag!Err:" + err.Error()
+			return
+		}
+
+		//服务类型筛选
+		if serveTypeId > 0 {
+			conditionBill += ` AND serve_type_id = ?  `
+			parsBill = append(parsBill, serveTypeId)
+		}
+
+		conditionBill += "  AND   company_id IN  (" + utils.GetOrmInReplace(lencompanyIds) + ")   "
+		parsBill = append(parsBill, companyIds)
+
+		listBill, err := cygx.GetCygxRaiServeBillListAll(conditionBill, parsBill)
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取用户信息失败-GetCygxRaiServeBillListAll!Err:" + err.Error()
+			return
+		}
+
+		now := time.Now()
+
+		for _, v := range listBill {
+			for i := 0; i < weeks; i++ {
+				// 计算当前周的周一
+				monday := now.AddDate(0, 0, -int(now.Weekday()-time.Monday)-i*7)
+				weekmonday := monday.Format(utils.FormatDate)
+				if v.WeekStartDate == weekmonday {
+					mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", i)] += v.ServeCount
+				}
+			}
+		}
+	}
+
+	for _, v := range listRaiServeCompany {
+		item := new(cygx.CygxRaiServeCompanyResp)
+		item.CompanyId = v.CompanyId
+		item.CompanyName = v.CompanyName
+		item.Money = v.Money
+		item.ServeCoverageRate = v.ServeCoverageRate + "%"
+		item.SellerId = v.SellerId
+		item.SellerName = v.SellerName
+		item.StartDate = v.StartDate
+		item.StartDate = v.StartDate
+		item.EndDate = v.EndDate
+		item.ShareSeller = v.ShareSeller
+		item.ShareSellerId = v.ShareSellerId
+		item.Status = v.Status
+		item.PermissionName = v.PermissionName
+		if v.IsUserMaker == 0 {
+			item.IsRed = true
+		}
+		item.ThisWeekAmount = mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", 0)]
+		item.LastWeekAmount = mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", 1)]
+		item.TwoWeekAmount = mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", 2)]
+		item.ThreeWeekAmount = mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", 3)]
+		resp.List = append(resp.List, item)
+	}
+
+	//导出excel
+	if isExport {
+		RaiServeListExport(this, resp, mapWeekAmount, br)
+		return
+	}
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp.Paging = page
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EnterScoreScoreListExport 导出Excel
+func RaiServeListExport(this *RaiServeCoAntroller, resp *cygx.CygxRaiServeCompanyListResp, mapWeekAmount map[string]float64, br *models.BaseResponse) {
+	weeks := 12 // 下载获取近12周的数据
+	mapWeekFormat := make(map[int]string)
+	now := time.Now()
+	for i := 0; i < weeks; i++ {
+		// 计算当前周的周一
+		monday := now.AddDate(0, 0, -int(now.Weekday()-time.Monday)-i*7)
+		sunday := monday.AddDate(0, 0, 6)
+		weekmonday := monday.Format(utils.FormatMonthDayUnSpace2)
+		weeksunday := sunday.Format(utils.FormatMonthDayUnSpace2)
+		mapWeekFormat[i] = weekmonday + "~" + weeksunday
+	}
+
+	dir, err := os.Executable()
+	exPath := filepath.Dir(dir)
+	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	if err != nil {
+		br.Msg = "生成文件失败"
+		br.ErrMsg = "生成文件失败"
+		return
+	}
+	style := xlsx.NewStyle()
+	alignment := xlsx.Alignment{
+		Horizontal: "center",
+		Vertical:   "center",
+		WrapText:   true,
+	}
+
+	style.Alignment = alignment
+	style.ApplyAlignment = true
+
+	sheel, err := xlsxFile.AddSheet("权益服务统计")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	sheel.SetColWidth(0, 0, 30)
+	sheel.SetColWidth(1, 1, 15)
+	sheel.SetColWidth(2, 2, 15)
+	sheel.SetColWidth(3, 3, 18)
+
+	titleRow := sheel.AddRow()
+
+	cellA := titleRow.AddCell()
+	cellA.SetStyle(style)
+	cellA.SetValue("客户名称")
+
+	cellB := titleRow.AddCell()
+	cellB.SetStyle(style)
+	cellB.SetValue("当前状态")
+
+	cellC := titleRow.AddCell()
+	cellC.SetStyle(style)
+	cellC.SetValue("所属销售")
+
+	cellD := titleRow.AddCell()
+	cellD.SetStyle(style)
+	cellD.SetValue("咨询销售")
+
+	cellE := titleRow.AddCell()
+	cellE.SetStyle(style)
+	cellE.SetValue("合同期限")
+
+	cellF := titleRow.AddCell()
+	cellF.SetStyle(style)
+	cellF.SetValue("合同金额")
+
+	cellG := titleRow.AddCell()
+	cellG.SetStyle(style)
+	cellG.SetValue("签约套餐")
+
+	cellWe1 := titleRow.AddCell()
+	cellWe1.SetStyle(style)
+	cellWe1.SetValue("本周服务量(" + mapWeekFormat[0] + ")")
+
+	cellWe2 := titleRow.AddCell()
+	cellWe2.SetStyle(style)
+	cellWe2.SetValue("上周服务量(" + mapWeekFormat[1] + ")")
+
+	cellWe3 := titleRow.AddCell()
+	cellWe3.SetStyle(style)
+	cellWe3.SetValue("上上周服务量(" + mapWeekFormat[2] + ")")
+
+	cellWe4 := titleRow.AddCell()
+	cellWe4.SetStyle(style)
+	cellWe4.SetValue("上三周服务量(" + mapWeekFormat[3] + ")")
+
+	for i := 0; i < weeks; i++ {
+		if i < 4 {
+			continue
+		}
+		// 计算当前周的周一
+		cellWei := titleRow.AddCell()
+		cellWei.SetStyle(style)
+		cellWei.SetValue(mapWeekFormat[i])
+	}
+
+	for _, v := range resp.List {
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+
+		cellA := dataRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.CompanyName)
+
+		cellB := dataRow.AddCell()
+		cellB.SetStyle(style)
+		cellB.SetValue(v.Status)
+
+		cellC := dataRow.AddCell()
+		cellC.SetStyle(style)
+		cellC.SetValue(v.SellerName)
+
+		cellD := dataRow.AddCell()
+		cellD.SetStyle(style)
+		cellD.SetValue(v.ShareSeller)
+
+		cellE := dataRow.AddCell()
+		cellE.SetStyle(style)
+		cellE.SetValue(v.StartDate + "~" + v.EndDate)
+
+		cellF := dataRow.AddCell()
+		cellF.SetStyle(style)
+		cellF.SetValue(v.Money)
+
+		cellG := dataRow.AddCell()
+		cellG.SetStyle(style)
+		cellG.SetValue(v.PermissionName)
+
+		for i := 0; i < weeks; i++ {
+			cellWei := dataRow.AddCell()
+			cellWei.SetStyle(style)
+			cellWei.SetValue(mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", i)])
+		}
+
+	}
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
+	downloadFileName := "权益服务统计导出数据_" + randStr + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "导出成功"
+}
+
+// 标签搜索语句筛选
+func getServeBillTag(tagType, tagId int) (conditionBill string, parsBill []interface{}, err error) {
+	if tagType == 0 {
+		return
+	}
+	var activityIds []int
+	var activitySpecialIds []int
+	var articleIds []int
+	var rsCalendarIds []int
+	switch tagType {
+	case 1:
+		listGroupActivity, e := cygx.GetIndustrialActivityGroupManagementListByIndustriaId(tagId, 1) // 关联的活动
+		if e != nil {
+			err = errors.New("GetIndustrialActivityGroupManagementListByIndustriaId, Err: " + e.Error())
+			return
+		}
+		for _, v := range listGroupActivity {
+			activityIds = append(activityIds, v.ActivityId)
+		}
+
+		listGroupActivitySpecial, e := cygx.GetIndustrialActivityGroupManagementListByIndustriaId(tagId, 2) // 关联的产业
+		if e != nil {
+			err = errors.New("GetIndustrialActivityGroupManagementListByIndustriaId, Err: " + e.Error())
+			return
+		}
+		for _, v := range listGroupActivitySpecial {
+			activitySpecialIds = append(activitySpecialIds, v.ActivityId)
+		}
+
+		listGroupArticle, e := cygx.GetIndustrialArticleGroupManagementListByindustrialId(tagId) // 关联的产业
+		if e != nil {
+			err = errors.New("GetIndustrialArticleGroupManagementListByindustrialId, Err: " + e.Error())
+			return
+		}
+		for _, v := range listGroupArticle {
+			articleIds = append(articleIds, v.ArticleId)
+		}
+
+		listGroupRsCalendar, e := roadshow.GetRsCalendarMeetingLabelGroupDetailByTag(tagType, tagId)
+		if e != nil {
+			err = errors.New("GetRsCalendarMeetingLabelGroupDetailByTag, Err: " + e.Error())
+			return
+		}
+		for _, v := range listGroupRsCalendar {
+			rsCalendarIds = append(rsCalendarIds, v.RsCalendarId)
+		}
+	case 2:
+		listGroupActivity, e := cygx.GetSubjectActivityGroupManagementListBySubjectId(tagId, 1) // 关联的活动
+		if e != nil {
+			err = errors.New("GetSubjectActivityGroupManagementListBySubjectId, Err: " + e.Error())
+			return
+		}
+		for _, v := range listGroupActivity {
+			activityIds = append(activityIds, v.ActivityId)
+		}
+
+		listGroupActivitySpecial, e := cygx.GetSubjectActivityGroupManagementListBySubjectId(tagId, 2) // 关联的产业
+		if e != nil {
+			err = errors.New("GetSubjectActivityGroupManagementListBySubjectId, Err: " + e.Error())
+			return
+		}
+		for _, v := range listGroupActivitySpecial {
+			activitySpecialIds = append(activitySpecialIds, v.ActivityId)
+		}
+
+		listGroupArticle, e := cygx.GetSubjectArticleGroupManagementListBysubjectId(tagId) // 关联的产业
+		if e != nil {
+			err = errors.New("GetSubjectArticleGroupManagementListBysubjectId, Err: " + e.Error())
+			return
+		}
+		for _, v := range listGroupArticle {
+			articleIds = append(articleIds, v.ArticleId)
+		}
+
+		listGroupRsCalendar, e := roadshow.GetRsCalendarMeetingLabelGroupDetailByTag(tagType, tagId)
+		if e != nil {
+			err = errors.New("GetRsCalendarMeetingLabelGroupDetailByTag, Err: " + e.Error())
+			return
+		}
+		for _, v := range listGroupRsCalendar {
+			rsCalendarIds = append(rsCalendarIds, v.RsCalendarId)
+		}
+
+		activityIds = append(activityIds, 0)
+		lenactivityIds := len(activityIds)
+		//if lenactivityIds > 0 {
+		conditionBill += ` AND IF ( source = 'activity', source_id IN  (` + utils.GetOrmInReplace(lenactivityIds) + `) , 1 = 1 ) `
+		parsBill = append(parsBill, activityIds)
+		//}
+
+		activitySpecialIds = append(activitySpecialIds, 0)
+		lenactivitySpecialIds := len(activitySpecialIds)
+		//if lenactivitySpecialIds > 0 {
+		conditionBill += ` AND IF ( source = 'activityspecial', source_id IN  (` + utils.GetOrmInReplace(lenactivitySpecialIds) + `) , 1 = 1 ) `
+		parsBill = append(parsBill, activitySpecialIds)
+		//}
+
+		articleIds = append(articleIds, 0)
+		lenarticleIds := len(articleIds)
+		//if lenarticleIds > 0 {
+		conditionBill += ` AND IF ( source = 'article', source_id IN  (` + utils.GetOrmInReplace(lenarticleIds) + `) , 1 = 1 ) `
+		parsBill = append(parsBill, articleIds)
+		//}
+
+		rsCalendarIds = append(rsCalendarIds, 0)
+		lenrsCalendarIds := len(rsCalendarIds)
+		//if lenrsCalendarIds > 0 {
+		conditionBill += ` AND IF ( source = 'rscalendar', source_id IN  (` + utils.GetOrmInReplace(lenrsCalendarIds) + `) , 1 = 1 ) `
+		parsBill = append(parsBill, rsCalendarIds)
+
+	case 3:
+		conditionBill += "  AND   chart_permission_id  = ?   "
+		parsBill = append(parsBill, tagId)
+	}
+
+	//}
+
+	conditionBill += ` AND source != 'yanxuanspecial'  AND source != 'userfeedback' `
+	return
+}
+
+// @Title 近四周覆盖率
+// @Description 近四周覆盖率接口
+// @Param   CompanyId   query   int	  false       "公司ID"
+// @Success 200 {object} cygx.RaiServeTagListResp
+// @router /rai_serve/coverage_rate [get]
+func (this *RaiServeCoAntroller) CoverageRate() {
+	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
+	}
+	companyId, _ := this.GetInt("CompanyId")
+	listWeekBill, err := cygx.GetCygxRaiServeBillListWeek4(companyId)
+	if err != nil {
+		br.Msg = "获取信息失败!"
+		br.ErrMsg = "获取用户信息失败-GetCygxRaiServeBillListWeek4!Err:" + err.Error()
+		return
+	}
+	mapWeek := make(map[int]string)
+	for k, v := range listWeekBill {
+		mapWeek[k] = utils.SubFloatToString(v.CoverageRate, 2)
+	}
+	resp := new(cygx.RaiServeCoverageRateResp)
+	resp.ThisWeekAmount = mapWeek[0] + "%"
+	resp.LastWeekAmount = mapWeek[1] + "%"
+	resp.TwoWeekAmount = mapWeek[2] + "%"
+	resp.ThreeWeekAmount = mapWeek[3] + "%"
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 明细列表
+// @Description 明细列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   CompanyId   query   int	  false       "公司ID"
+// @Param   TagType   query   int  false       "标签类型"
+// @Param   TagId   query   int  false       "标签ID"
+// @Param   ServeTypeId   int   int	  false       "服务类型ID"
+// @Param   WhatWeek   query   int  false       "哪一周 ,1:本周、2:上周、3:上上周、4上三周"
+// @Success 200 {object} cygx.RaiServeTagListResp
+// @router /rai_serve/bill_list [get]
+func (this *RaiServeCoAntroller) BillList() {
+	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")
+	companyId, _ := this.GetInt("CompanyId")
+	tagType, _ := this.GetInt("TagType")
+	tagId, _ := this.GetInt("TagId")
+	serveTypeId, _ := this.GetInt("ServeTypeId")
+	whatWeek, _ := this.GetInt("WhatWeek")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	if companyId == 0 {
+		br.Msg = "请选择对应公司ID"
+		return
+	}
+	var condition string
+	var pars []interface{}
+	var err error
+
+	condition, pars, err = getServeBillTag(tagType, tagId) // 标签ID搜索语句处理
+	if err != nil {
+		br.Msg = "获取信息失败!"
+		br.ErrMsg = "获取用户信息失败-getServeBillTag!Err:" + err.Error()
+		return
+	}
+
+	if whatWeek > 0 {
+		now := time.Now()
+		// 计算所选周的周一
+		monday := now.AddDate(0, 0, -int(now.Weekday()-time.Monday)-(whatWeek-1)*7)
+		condition += " AND  week_start_date = ? "
+		pars = append(pars, monday.Format(utils.FormatDate))
+	}
+
+	condition += " AND  company_id = ? "
+	pars = append(pars, companyId)
+	if serveTypeId > 0 {
+		condition += " AND  serve_type_id = ? "
+		pars = append(pars, serveTypeId)
+	}
+
+	total, err := cygx.GetCygxRaiServeBillCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetCygxRaiServeBillCount:" + err.Error()
+		return
+	}
+	list, err := cygx.GetCygxRaiServeBillRespList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetCygxRaiServeBillRespList:" + err.Error()
+		return
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := new(cygx.CygxRaiServeBillListResp)
+	resp.Paging = page
+	if len(list) == 0 {
+		resp.List = make([]*cygx.CygxRaiServeBillResp, 0)
+	} else {
+		var activityIds []int
+		var activitySpecialIds []int
+		var articleIds []int
+		var rsCalendarIds []int
+		for _, v := range list {
+			switch v.Source {
+			case utils.CYGX_OBJ_ARTICLE:
+				articleIds = append(articleIds, v.SourceId)
+			case utils.CYGX_OBJ_ACTIVITY:
+				activityIds = append(activityIds, v.SourceId)
+			case utils.CYGX_OBJ_ACTIVITYSPECIAL:
+				activitySpecialIds = append(activitySpecialIds, v.SourceId)
+			case utils.CYGX_OBJ_RS_CALENDAR:
+				rsCalendarIds = append(rsCalendarIds, v.SourceId)
+			}
+		}
+
+		maparticleIndustrialLabel := make(map[int][]string) //文章产业标签
+		maparticleSubjectLabel := make(map[int][]string)    // 文章行业标签
+		if len(articleIds) > 0 {
+			maparticleIndustrialLabel = cygxService.GetArticleIndustrialLabelByArticleId(articleIds) // 关联产业
+			maparticleSubjectLabel = cygxService.GetArticleSubjectLabelByArticleId(articleIds)       // 关联标的
+		}
+
+		mapActivityIndustrialLabel := make(map[int][]string) //活动产业标签
+		mapActivitySubjectLabel := make(map[int][]string)    //活动标的标签
+		mapActivityIndustrialLabel = cygxService.GetActivityIndustrialLabelByActivityIds(activityIds, 1)
+		mapActivitySubjectLabel = cygxService.GetActivitySubjectLabelByActivityIds(activityIds, 1)
+
+		mapActivitySpeicalIndustrialLabel := make(map[int][]string) //活动产业标签
+		mapActivitySpeicalSubjectLabel := make(map[int][]string)    //活动标的标签
+		mapActivitySpeicalIndustrialLabel = cygxService.GetActivityIndustrialLabelByActivityIds(activityIds, 2)
+		mapActivitySpeicalSubjectLabel = cygxService.GetActivitySubjectLabelByActivityIds(activityIds, 2)
+
+		mapRsCalendarLabel := make(map[int][]string) //1v1 路演标签
+		mapRsCalendarLabel = cygxService.GetRsCalendarLabelByRsCalendarIds(rsCalendarIds)
+
+		for _, v := range list {
+			switch v.Source {
+			case utils.CYGX_OBJ_ARTICLE:
+				if v.ChartPermissionName == utils.GU_SHOU_NAME || v.ChartPermissionName == utils.CE_LUE_NAME {
+					v.Tag = v.ChartPermissionName
+				} else {
+					v.Tag = strings.Join(maparticleIndustrialLabel[v.SourceId], ",")
+					if len(maparticleSubjectLabel[v.SourceId]) > 0 {
+						v.Tag += "," + strings.Join(maparticleSubjectLabel[v.SourceId], ",")
+					}
+				}
+			case utils.CYGX_OBJ_ACTIVITY:
+				v.Tag = strings.Join(mapActivityIndustrialLabel[v.SourceId], ",")
+				if len(mapActivitySubjectLabel[v.SourceId]) > 0 {
+					v.Tag += "," + strings.Join(mapActivitySubjectLabel[v.SourceId], ",")
+				}
+			case utils.CYGX_OBJ_ACTIVITYSPECIAL:
+				v.Tag = strings.Join(mapActivitySpeicalIndustrialLabel[v.SourceId], ",")
+				if len(mapActivitySpeicalSubjectLabel[v.SourceId]) > 0 {
+					v.Tag += "," + strings.Join(mapActivitySpeicalSubjectLabel[v.SourceId], ",")
+				}
+			case utils.CYGX_OBJ_RS_CALENDAR:
+				if v.ChartPermissionName == utils.GU_SHOU_NAME || v.ChartPermissionName == utils.CE_LUE_NAME {
+					v.Tag = v.ChartPermissionName
+				} else {
+					v.Tag = strings.Join(mapRsCalendarLabel[v.SourceId], ",")
+				}
+			}
+		}
+		resp.List = list
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 208 - 45
controllers/cygx/user.go

@@ -9,6 +9,7 @@ import (
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/models/roadshow"
 	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services"
 	cygxService "hongze/hz_crm_api/services/cygx"
@@ -659,6 +660,7 @@ func (this *UserController) TableList() {
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
+
 	resp := new(cygx.CygxUserTableListRep)
 	if classType == 1 {
 		countDetail, err := cygx.GetUserInteractionTableCount(userId)
@@ -668,15 +670,23 @@ func (this *UserController) TableList() {
 			return
 		}
 
+		calendarTotal, err := roadshow.GetRsCalendarMeetingUserCountByUserId(userId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "GetCygxUserFeedbackCountByUserId,Err:" + err.Error()
+			return
+		}
 		List := []*cygx.CygxUserTableRep{{PermissionName: "报告阅读列表", Source: 1, TotalNum: countDetail.HistoryNum},
 			{PermissionName: "活动互动记录", Source: 2, TotalNum: countDetail.OnLineNum + countDetail.OfficeNum},
 			{PermissionName: "专项调研", Source: 8, TotalNum: countDetail.TripNum},
+			{PermissionName: "1v1路演", Source: 15, TotalNum: calendarTotal},
 			{PermissionName: "收藏的报告", Source: 3, TotalNum: countDetail.CountNum},
 			{PermissionName: "收藏的图表", Source: 4, TotalNum: countDetail.ChartNum},
 			{PermissionName: "关注的产业", Source: 5, TotalNum: countDetail.IndustryFllowNum},
 			{PermissionName: "搜索", Source: 7, TotalNum: countDetail.KeyWordNum},
 			{PermissionName: "音视频播放", Source: 9, TotalNum: countDetail.RoadshowVideoNum + countDetail.ActivityVideoNum + countDetail.ActivityVoiceNum},
-			{PermissionName: "首页标签点击", Source: 10, TotalNum: countDetail.TagNum}}
+			{PermissionName: "首页标签点击", Source: 10, TotalNum: countDetail.TagNum},
+			{PermissionName: "交流反馈", Source: 14, TotalNum: countDetail.FeedbackNum}}
 		resp.List = List
 	} else {
 		countDetail, err := cygx.GetUserInteractionTableCountByYanXuan(userId)
@@ -776,25 +786,6 @@ func (this *UserController) TableDetail() {
 	var NoMeetingNum int
 	var list []*cygx.UserInteraction
 
-	//listTable := []*cygx.CygxUserTableRep{{PermissionName: "报告阅读列表", Source: 1, TotalNum: 10},
-	//	{PermissionName: "活动互动记录", Source: 2, TotalNum: 10},
-	//	{PermissionName: "收藏的报告", Source: 3, TotalNum: 10},
-	//	{PermissionName: "收藏图表", Source: 4, TotalNum: 10},
-	//	{PermissionName: "关注的产业", Source: 5, TotalNum: 10},
-	//	{PermissionName: "关注的作者", Source: 6, TotalNum: 10},
-	//	{PermissionName: "搜索", Source: 7, TotalNum: 10},
-	//	{PermissionName: "专项调研", Source: 8, TotalNum: 10},
-	//	{PermissionName: "音视频播放", Source: 9, TotalNum: 10},
-	//	{PermissionName: "首页标签点击", Source: 10, TotalNum: 10}}
-	//for _, v := range listTable {
-	//	if v.Source == source {
-	//		checkSource = true
-	//	}
-	//}
-	////默认类型1
-	//if !checkSource {
-	//	source = 1
-	//}
 	var total int
 	var condition string
 	var pars []interface{}
@@ -1232,6 +1223,53 @@ func (this *UserController) TableDetail() {
 				list[k].HttpUrl = utils.CYGX_MFYX_URL + "/column/view/" + strconv.Itoa(v.DepartmentId)
 			}
 		}
+	} else if source == 14 { //交流反馈
+		if startDate != "" {
+			startDate += " 00:00:00"
+			condition += ` AND r.create_time >= '` + startDate + `' `
+		}
+		if endDate != "" {
+			endDate += " 23:59:59"
+			condition += ` AND r.create_time <= '` + endDate + `' `
+		}
+		if wxUser.Mobile == "" {
+			wxUser.Mobile = wxUser.Email
+		}
+		condition += " 	AND (r.mobile = '" + wxUser.Mobile + "'  OR  r.email = '" + wxUser.Mobile + "')  "
+		total, list, err = cygx.GetCygxUserFeedback(condition, startSize, pageSize)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取用户阅读记录,Err:" + err.Error()
+			return
+		}
+	} else if source == 15 { //1V1路演
+		if startDate != "" {
+			//startDate += " 00:00:00"
+			condition += ` AND b.start_date >= '` + startDate + `' `
+		}
+		if endDate != "" {
+			//endDate += " 23:59:59"
+			condition += ` AND b.start_date <= '` + endDate + `' `
+		}
+		if wxUser.Mobile == "" {
+			wxUser.Mobile = wxUser.Email
+		}
+		condition += " 	AND (r.mobile = '" + wxUser.Mobile + "'  OR  r.email = '" + wxUser.Mobile + "')  "
+		totalRsCalendar, listRsCalendar, err := roadshow.GetRsCalendarMeetingUserByRai(condition, startSize, pageSize)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取用户阅读记录,GetRsCalendarMeetingUserByRai Err:" + err.Error()
+			return
+		}
+
+		total = totalRsCalendar
+		list, err = cygxService.HandleListRsCalendar(listRsCalendar)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "HandleListRsCalendar,Err:" + err.Error()
+			return
+		}
+
 	}
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	resp := new(cygx.UserInteractionListResp)
@@ -2270,6 +2308,8 @@ func (this *UserController) CompanyTableList() {
 	var yanxuanSpecialNum int        //专栏文章阅读记录
 	var yanxuanSpecialCollectNum int //收藏的专栏文章
 	var yanxuanSpecialFollowNum int  //关注的专栏作者
+	var feedbackNum int              //交流反馈数量
+	var calendarMeetingNum int       //1v1 路演数量
 
 	if isAdminRole {
 		historyNum, err = cygx.GetCygxArticleAndYanxuanRecordCount(conditionArtcile, pars)
@@ -2361,6 +2401,20 @@ func (this *UserController) CompanyTableList() {
 			return
 		}
 
+		feedbackNum, err = cygx.GetCygxUserFeedbackCountByUserModel(condition, pars)
+		if err != nil {
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			br.Msg = "获取交流反馈数量失败"
+			return
+		}
+
+		calendarMeetingNum, err = roadshow.GetRsCalendarMeetingUserCountByUserModel(condition, pars)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "GetRsCalendarMeetingUserCountByUserModel,Err:" + err.Error()
+			return
+		}
+
 	} else {
 		historyNum, err = cygx.GetCygxArticleAndYanxuanRecordCountWeekly(conditionArtcile, pars)
 		if err != nil {
@@ -2450,18 +2504,35 @@ func (this *UserController) CompanyTableList() {
 			br.Msg = "获取关注的专栏作者数量失败"
 			return
 		}
+
+		feedbackNum, err = cygx.GetCygxUserFeedbackCountByUserModelWeekly(condition, pars)
+		if err != nil {
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			br.Msg = "获取交流反馈数量失败"
+			return
+		}
+
+		calendarMeetingNum, err = roadshow.GetRsCalendarMeetingUserCountByUserModelWeekly(condition, pars)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "GetRsCalendarMeetingUserCountByUserModelWeekly,Err:" + err.Error()
+			return
+		}
+
 	}
 
 	if classType == 1 {
 		List := []*cygx.CygxUserTableRep{{PermissionName: "报告阅读列表", Source: 1, TotalNum: historyNum},
 			{PermissionName: "活动互动记录", Source: 2, TotalNum: activityNum},
 			{PermissionName: "专项调研", Source: 8, TotalNum: triptotal},
+			{PermissionName: "1v1路演", Source: 15, TotalNum: calendarMeetingNum},
 			{PermissionName: "收藏的报告", Source: 3, TotalNum: articleCollect},
 			{PermissionName: "收藏图表", Source: 4, TotalNum: chartNum},
 			{PermissionName: "关注的产业", Source: 5, TotalNum: industryFllowNum},
 			{PermissionName: "搜索", Source: 7, TotalNum: keyWordNum},
 			{PermissionName: "音视频播放", Source: 9, TotalNum: roadshowTotal},
-			{PermissionName: "首页标签点击", Source: 10, TotalNum: tagNum}}
+			{PermissionName: "首页标签点击", Source: 10, TotalNum: tagNum},
+			{PermissionName: "交流反馈", Source: 14, TotalNum: feedbackNum}}
 		resp.List = List
 	} else {
 		List := []*cygx.CygxUserTableRep{{PermissionName: "报告阅读列表", Source: 1, TotalNum: historyNum},
@@ -3062,6 +3133,47 @@ func (this *UserController) CompanyTableDetail() {
 				list[k].HttpUrl = utils.CYGX_MFYX_URL + "/column/view/" + strconv.Itoa(v.DepartmentId)
 			}
 		}
+	} else if source == 14 { //交流反馈
+		if isAdminRole {
+			total, list, err = cygx.GetCygxUserFeedback(condition, startSize, pageSize)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取用户交流反馈,Err:" + err.Error()
+				return
+			}
+		} else {
+			total, list, err = cygx.GetCygxUserFeedbackWeekly(condition, startSize, pageSize)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取用户交流反馈,Err:" + err.Error()
+				return
+			}
+		}
+	} else if source == 15 { //1V1路演
+		var totalRsCalendar int
+		var listRsCalendar []*roadshow.RsCalendarMeetingUserByRai
+		if isAdminRole {
+			totalRsCalendar, listRsCalendar, err = roadshow.GetRsCalendarMeetingUserByRai(condition, startSize, pageSize)
+			if err != nil {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取用户阅读记录,Err:" + err.Error()
+				return
+			}
+		} else {
+			totalRsCalendar, listRsCalendar, err = roadshow.GetRsCalendarMeetingUserByRaiWeekly(condition, startSize, pageSize)
+			if err != nil {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取用户阅读记录,Err:" + err.Error()
+				return
+			}
+		}
+		total = totalRsCalendar
+		list, err = cygxService.HandleListRsCalendar(listRsCalendar)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "HandleListRsCalendar,Err:" + err.Error()
+			return
+		}
 	}
 
 	page := paging.GetPaging(currentIndex, pageSize, total)
@@ -4344,6 +4456,47 @@ func (this *UserController) CompanyList() {
 				list[k].HttpUrl = utils.CYGX_MFYX_URL + "/column/view/" + strconv.Itoa(v.DepartmentId)
 			}
 		}
+	} else if source == 14 { //交流反馈
+		if isAdminRole {
+			total, list, err = cygx.GetCygxUserFeedback(condition, startSize, pageSize)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取用户阅读记录,Err:" + err.Error()
+				return
+			}
+		} else {
+			total, list, err = cygx.GetCygxUserFeedbackWeekly(condition, startSize, pageSize)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取用户阅读记录,Err:" + err.Error()
+				return
+			}
+		}
+	} else if source == 15 {
+		var totalRsCalendar int
+		var listRsCalendar []*roadshow.RsCalendarMeetingUserByRai
+		if isAdminRole {
+			totalRsCalendar, listRsCalendar, err = roadshow.GetRsCalendarMeetingUserByRai(condition, startSize, pageSize)
+			if err != nil {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取用户阅读记录,Err:" + err.Error()
+				return
+			}
+		} else {
+			totalRsCalendar, listRsCalendar, err = roadshow.GetRsCalendarMeetingUserByRaiWeekly(condition, startSize, pageSize)
+			if err != nil {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取用户阅读记录,Err:" + err.Error()
+				return
+			}
+		}
+		total = totalRsCalendar
+		list, err = cygxService.HandleListRsCalendar(listRsCalendar)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "HandleListRsCalendar,Err:" + err.Error()
+			return
+		}
 	}
 	page := paging.GetPaging(currentIndex, pageSize, total)
 
@@ -5295,6 +5448,8 @@ func (this *UserController) TableCompanyList() {
 	var yanxuanSpecialNum int        //专栏文章阅读记录
 	var yanxuanSpecialCollectNum int //收藏的专栏文章
 	var yanxuanSpecialFollowNum int  //关注的专栏作者
+	var feedbackNum int              //交流反馈数量
+	var calendarMeetingNum int       //1v1 路演数量
 
 	if isAdminRole {
 		historyNum, err = cygx.GetCygxArticleAndYanxuanRecordCount(conditionArtcile, pars)
@@ -5387,17 +5542,20 @@ func (this *UserController) TableCompanyList() {
 			br.Msg = "获取关注的专栏作者数量失败"
 			return
 		}
-		//List := []*cygx.CygxUserTableRep{{PermissionName: "报告阅读列表", Source: 1, TotalNum: historyNum},
-		//	{PermissionName: "活动互动记录", Source: 2, TotalNum: activityNum},
-		//	{PermissionName: "专项调研", Source: 8, TotalNum: triptotal},
-		//	{PermissionName: "收藏的报告", Source: 3, TotalNum: articleCollect},
-		//	{PermissionName: "收藏图表", Source: 4, TotalNum: chartNum},
-		//	{PermissionName: "关注的产业", Source: 5, TotalNum: industryFllowNum},
-		//	{PermissionName: "关注的作者", Source: 6, TotalNum: departmentFollowNum},
-		//	{PermissionName: "搜索", Source: 7, TotalNum: keyWordNum},
-		//	{PermissionName: "音视频播放", Source: 9, TotalNum: roadshowTotal},
-		//	{PermissionName: "首页标签点击", Source: 10, TotalNum: tagNum}}
-		//resp.List = List
+		feedbackNum, err = cygx.GetCygxUserFeedbackCountByUserModel(condition, pars)
+		if err != nil {
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			br.Msg = "获取交流反馈数量失败"
+			return
+		}
+
+		calendarMeetingNum, err = roadshow.GetRsCalendarMeetingUserCountByUserModel(condition, pars)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "GetRsCalendarMeetingUserCountByUserModel,Err:" + err.Error()
+			return
+		}
+
 	} else {
 		historyNum, err = cygx.GetCygxArticleAndYanxuanRecordCountWeekly(conditionArtcile, pars)
 		if err != nil {
@@ -5485,33 +5643,38 @@ func (this *UserController) TableCompanyList() {
 
 		yanxuanSpecialFollowNum, err = cygx.GetCygxYanxuanSpecialFollowCountWeekly(condition, pars)
 		if err != nil {
-			br.ErrMsg = "获取信息失败,Err:" + err.Error()
 			br.Msg = "获取关注的专栏作者数量失败"
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			return
+		}
+		feedbackNum, err = cygx.GetCygxUserFeedbackCountByUserModelWeekly(condition, pars)
+		if err != nil {
+			br.Msg = "获取交流反馈数量失败"
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
 			return
 		}
-		//List := []*cygx.CygxUserTableRep{{PermissionName: "报告阅读列表", Source: 1, TotalNum: historyNum},
-		//	{PermissionName: "活动互动记录", Source: 2, TotalNum: activityNum},
-		//	{PermissionName: "专项调研", Source: 8, TotalNum: triptotal},
-		//	{PermissionName: "收藏的报告", Source: 3, TotalNum: articleCollect},
-		//	{PermissionName: "收藏图表", Source: 4, TotalNum: chartNum},
-		//	{PermissionName: "关注的产业", Source: 5, TotalNum: industryFllowNum},
-		//	{PermissionName: "关注的作者", Source: 6, TotalNum: departmentFollowNum},
-		//	{PermissionName: "搜索", Source: 7, TotalNum: keyWordNum},
-		//	{PermissionName: "音视频播放", Source: 9, TotalNum: roadshowTotal},
-		//	{PermissionName: "首页标签点击", Source: 10, TotalNum: tagNum}}
-		//resp.List = List
+
+		calendarMeetingNum, err = roadshow.GetRsCalendarMeetingUserCountByUserModelWeekly(condition, pars)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "GetRsCalendarMeetingUserCountByUserModelWeekly,Err:" + err.Error()
+			return
+		}
+
 	}
 
 	if classType == 1 {
 		List := []*cygx.CygxUserTableRep{{PermissionName: "报告阅读列表", Source: 1, TotalNum: historyNum},
 			{PermissionName: "活动互动记录", Source: 2, TotalNum: activityNum},
 			{PermissionName: "专项调研", Source: 8, TotalNum: triptotal},
+			{PermissionName: "1v1路演", Source: 15, TotalNum: calendarMeetingNum},
 			{PermissionName: "收藏的报告", Source: 3, TotalNum: articleCollect},
 			{PermissionName: "收藏图表", Source: 4, TotalNum: chartNum},
 			{PermissionName: "关注的产业", Source: 5, TotalNum: industryFllowNum},
 			{PermissionName: "搜索", Source: 7, TotalNum: keyWordNum},
 			{PermissionName: "音视频播放", Source: 9, TotalNum: roadshowTotal},
-			{PermissionName: "首页标签点击", Source: 10, TotalNum: tagNum}}
+			{PermissionName: "首页标签点击", Source: 10, TotalNum: tagNum},
+			{PermissionName: "交流反馈", Source: 14, TotalNum: feedbackNum}}
 		resp.List = List
 	} else {
 		List := []*cygx.CygxUserTableRep{{PermissionName: "报告阅读列表", Source: 1, TotalNum: historyNum},

+ 152 - 0
controllers/cygx/user_feedback.go

@@ -0,0 +1,152 @@
+package cygx
+
+import (
+	"encoding/json"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/cygx"
+	"time"
+)
+
+// 联系人列表,交流反馈
+type UserFeedbackController struct {
+	controllers.BaseAuthController
+}
+
+// @Title 添加交流反馈接口
+// @Description 添加交流反馈接口
+// @Param	request	body cygx.AddCygxUserFeedbackReq true "type json string"
+// @Success 200 操作成功
+// @router /user_feedback/add [post]
+func (this *UserFeedbackController) UserFeedbackAdd() {
+	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.AddCygxUserFeedbackReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	userId := req.UserId
+	content := req.Content
+	if content == "" {
+		br.Msg = "内容不能为空!"
+		return
+	}
+	wxUser, err := models.GetWxUserItemByUserId(userId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败, GetWxUserItemByUserId  Err:" + err.Error()
+		return
+	}
+	item := new(cygx.CygxUserFeedback)
+	item.Content = content
+	item.UserId = wxUser.UserId
+	item.Mobile = wxUser.Mobile
+	item.Email = wxUser.Email
+	item.CompanyId = wxUser.CompanyId
+	item.CompanyName = wxUser.CompanyName
+	item.RealName = wxUser.RealName
+	item.AdminId = sysUser.AdminId
+	item.CreateTime = time.Now()
+	_, err = cygx.AddCygxUserFeedback(item)
+	if err != nil {
+		br.Msg = "新增失败."
+		br.ErrMsg = "新增失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// @Title 交流反馈列表接口
+// @Description 交流反馈列表接口
+// @Param   UserId   query   int	  false       "用户ID"
+// @Success 200 {object} cygx.CygxCygxUserFeedbackResp
+// @router /user_feedback/list [get]
+func (this *RaiServeCoAntroller) UserFeedbackList() {
+	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
+	}
+	userId, _ := this.GetInt("UserId")
+	if userId < 1 {
+		br.Msg = "请输入用户ID"
+		return
+	}
+	resp := new(cygx.CygxCygxUserFeedbackResp)
+	list, err := cygx.GetCygxUserFeedbackListByUserId(userId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 删除交流反馈接口
+// @Description 删除交流反馈接口
+// @Param	request	body cygx.CygxUserFeedbackIdReq true "type json string"
+// @Success 200 操作成功
+// @router /user_feedback/del [post]
+func (this *UserFeedbackController) UserFeedbackDel() {
+	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.CygxUserFeedbackIdReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	userFeedbackId := req.UserFeedbackId
+
+	if userFeedbackId < 0 {
+		br.Msg = "参数错误!"
+		return
+	}
+
+	err = cygx.DeleteCygxUserFeedback(userFeedbackId)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "删除失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "删除成功"
+}

+ 132 - 33
controllers/roadshow/calendar_meeting_user.go

@@ -2,9 +2,12 @@ package roadshow
 
 import (
 	"encoding/json"
+	"fmt"
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/models/roadshow"
+	"hongze/hz_crm_api/utils"
 	"strconv"
 	"strings"
 	"time"
@@ -45,49 +48,67 @@ func (this *CalendarMeetingUserController) Add() {
 
 	rsCalendarId := req.RsCalendarId
 	userIds := req.UserId
+	tagList := req.TagList
 
 	if rsCalendarId == 0 {
 		br.Msg = "路演信息错误!"
 		return
 	}
-	if len(userIds) == 0 {
-		br.Msg = "参会人不能为空!"
-		return
-	}
-	var userIdsStr []string
-	for _, v := range userIds {
-		userIdsStr = append(userIdsStr, strconv.Itoa(v))
-	}
 
-	listUser, err := models.GetWxUserListByUserIdsHaveCompany(strings.Join(userIdsStr, ","))
+	var itemsGroup []*roadshow.RsCalendarMeetingLabelGroup
+	for _, v := range tagList {
+		itemGroup := new(roadshow.RsCalendarMeetingLabelGroup)
+		itemGroup.RsCalendarId = rsCalendarId
+		itemGroup.TagType = v.TagType
+		itemGroup.TagId = v.TagId
+		itemGroup.AdminId = sysUser.AdminId
+		itemGroup.AdminName = sysUser.RealName
+		itemGroup.CreateTime = time.Now()
+		itemGroup.ModifyTime = time.Now()
+		itemsGroup = append(itemsGroup, itemGroup)
+	}
+	err = roadshow.AddRsCalendarMeetingLabelGroupMulti(itemsGroup, rsCalendarId)
 	if err != nil {
-		br.Msg = "获取用户信息失败!"
-		br.ErrMsg = "获取用户信息失败-GetWxUserListByUserIdsHaveCompany!Err:" + err.Error()
+		br.Msg = "获取信息失败!"
+		br.ErrMsg = "获取信息失败-AddRsCalendarMeetingLabelGroupMulti!Err:" + err.Error()
 		return
 	}
 
-	var items []*roadshow.RsCalendarMeetingUser
-	for _, v := range listUser {
-		item := new(roadshow.RsCalendarMeetingUser)
-		item.RsCalendarId = rsCalendarId
-		item.UserId = v.UserId
-		item.Mobile = v.Mobile
-		item.Email = v.Email
-		item.CompanyId = v.CompanyId
-		item.CompanyName = v.CompanyName
-		item.RealName = v.RealName
-		item.Position = v.Position
-		item.AdminId = sysUser.AdminId
-		item.AdminName = sysUser.RealName
-		item.CreateTime = time.Now()
-		item.ModifyTime = time.Now()
-		items = append(items, item)
-	}
-	err = roadshow.MultiAddRsCalendarMeetingUser(items)
-	if err != nil {
-		br.Msg = "操作失败!"
-		br.ErrMsg = "操作失败-MultiAddRsCalendarMeetingUser!Err:" + err.Error()
-		return
+	if len(userIds) > 0 {
+		var userIdsStr []string
+		for _, v := range userIds {
+			userIdsStr = append(userIdsStr, strconv.Itoa(v))
+		}
+		listUser, err := models.GetWxUserListByUserIdsHaveCompany(strings.Join(userIdsStr, ","))
+		if err != nil {
+			br.Msg = "获取用户信息失败!"
+			br.ErrMsg = "获取用户信息失败-GetWxUserListByUserIdsHaveCompany!Err:" + err.Error()
+			return
+		}
+
+		var items []*roadshow.RsCalendarMeetingUser
+		for _, v := range listUser {
+			item := new(roadshow.RsCalendarMeetingUser)
+			item.RsCalendarId = rsCalendarId
+			item.UserId = v.UserId
+			item.Mobile = v.Mobile
+			item.Email = v.Email
+			item.CompanyId = v.CompanyId
+			item.CompanyName = v.CompanyName
+			item.RealName = v.RealName
+			item.Position = v.Position
+			item.AdminId = sysUser.AdminId
+			item.AdminName = sysUser.RealName
+			item.CreateTime = time.Now()
+			item.ModifyTime = time.Now()
+			items = append(items, item)
+		}
+		err = roadshow.MultiAddRsCalendarMeetingUser(items)
+		if err != nil {
+			br.Msg = "操作失败!"
+			br.ErrMsg = "操作失败-MultiAddRsCalendarMeetingUser!Err:" + err.Error()
+			return
+		}
 	}
 	br.Ret = 200
 	br.Success = true
@@ -123,10 +144,88 @@ func (this *CalendarMeetingUserController) List() {
 		br.ErrMsg = "操作失败-GetRsCalendarMeetingUserListByRsCalendarId!Err:" + err.Error()
 		return
 	}
+	totalGroup, err := roadshow.GetRsCalendarMeetingLabelGroupByRsCalendarId(rsCalendarId)
+	if err != nil {
+		br.Msg = "获取信息失败!"
+		br.ErrMsg = "获取用户信息失败-GetRsCalendarMeetingLabelGroupByRsCalendarId!Err:" + err.Error()
+		return
+	}
+
+	var lebelDetail []*cygx.RaiServeTagResp
+	if totalGroup > 0 {
+		listGroup, err := roadshow.GetRsCalendarMeetingLabelGroupListByRsCalendarId(rsCalendarId)
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取用户信息失败-GetRsCalendarMeetingLabelGroupListByRsCalendarId!Err:" + err.Error()
+			return
+		}
+
+		var industrialManagementIds []int
+		var industrialSubjectIds []int
+
+		mapindustrialManagementName := make(map[int]string)
+		mapindustrialSubjectName := make(map[int]string)
+		mapCelueName := make(map[int]string)
+		for _, v := range listGroup {
+			switch v.TagType {
+			case 1:
+				industrialManagementIds = append(industrialManagementIds, v.TagId)
+			case 2:
+				industrialSubjectIds = append(industrialSubjectIds, v.TagId)
+			case 3:
+				mapCelueName[v.TagId] = "策略"
+			}
+		}
+
+		if len(industrialManagementIds) > 0 {
+			IndustryList, err := cygx.GetIndustryListByConditionByIds(industrialManagementIds)
+			if err != nil {
+				br.Msg = "获取信息失败!"
+				br.ErrMsg = "获取用户信息失败-GetIndustryListByConditionByIds!Err:" + err.Error()
+				return
+			}
+
+			for _, v := range IndustryList {
+				mapindustrialManagementName[v.IndustrialManagementId] = v.IndustryName
+			}
+		}
+
+		if len(industrialSubjectIds) > 0 {
+			SubjectList, err := cygx.GetIndustrialSubjectDetailByIds(industrialSubjectIds)
+			if err != nil {
+				br.Msg = "获取信息失败!"
+				br.ErrMsg = "获取用户信息失败-GetIndustryListByConditionByIds!Err:" + err.Error()
+				return
+			}
+			for _, v := range SubjectList {
+				mapindustrialSubjectName[v.IndustrialSubjectId] = v.SubjectName
+			}
+		}
+
+		for _, v := range listGroup {
+			item := new(cygx.RaiServeTagResp)
+			item.TagType = v.TagType
+			item.TagId = v.TagId
+			item.Md5Key = utils.MD5(fmt.Sprintf("K_", v.TagType, "V_", v.TagId))
+			switch v.TagType {
+			case 1:
+				item.TagName = mapindustrialManagementName[v.TagId]
+			case 2:
+				item.TagName = mapindustrialSubjectName[v.TagId]
+			case 3:
+				item.TagName = mapCelueName[v.TagId]
+			}
+			lebelDetail = append(lebelDetail, item)
+		}
+	}
 	if len(list) == 0 {
 		list = make([]*roadshow.RsCalendarMeetingUserResp, 0)
 	}
+	if len(lebelDetail) == 0 {
+		lebelDetail = make([]*cygx.RaiServeTagResp, 0)
+	}
 	resp.List = list
+	resp.ListLebel = lebelDetail
 	br.Ret = 200
 	br.Success = true
 	br.Data = resp

+ 25 - 0
models/chart_permission.go

@@ -156,6 +156,20 @@ func GetChartPermissionByNames(permissionNames []string) (list []*ChartPermissio
 	return
 }
 
+func GetChartPermissionByNamesByRai(permissionNames []string) (list []*ChartPermission, err error) {
+	qb, _ := orm.NewQueryBuilder("mysql")
+	// 构建查询对象
+	qb.Select("*").From("chart_permission").
+		Where("parent_id > 0 AND  product_id = 2 and chart_permission_name").In(permissionNames...)
+	// 导出 SQL 语句
+	sql := qb.String()
+
+	// 执行 SQL 语句
+	o := orm.NewOrm()
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
 // GetChartPermissionList 获取品种权限列表
 func GetChartPermissionList() (list []*ChartPermission, err error) {
 	o := orm.NewOrm()
@@ -178,3 +192,14 @@ func GetChartPermissionListRaiSubjectivity() (items []*ChartPermission, err erro
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+func GetChartPermissionListByCondition(condition string, pars []interface{}) (items []*ChartPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM chart_permission WHERE  parent_id > 0 `
+	if condition != `` {
+		sql += condition
+	}
+	sql += `  ORDER BY sort ASC `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 15 - 0
models/cygx/activity_ask_email.go

@@ -20,6 +20,21 @@ func GetAskEmail() (item []*AskEmailRep, err error) {
 	return
 }
 
+// 判断研究员是不是策略行业的
+func GetAskEmailCountByCelue(adminId string) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity_ask_email  WHERE chart_permission_name  = '策略'  AND admin_id IN (` + adminId + `)  `
+	err = o.Raw(sqlCount).QueryRow(&count)
+	return
+}
+
+func GetAskEmailListByAdminIds(adminId string) (item []*AskEmailRep, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_activity_ask_email WHERE    chart_permission_name != ''  AND admin_id IN (` + adminId + `)  `
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}
+
 func GetAskEmailList() (item []*AskEmailRep, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT * FROM cygx_activity_ask_email WHERE    chart_permission_name != ''  ORDER BY sort  DESC`

+ 6 - 2
models/cygx/cygx_user.go

@@ -314,6 +314,7 @@ type UserInteraction struct {
 	NickName              string `description:"作者昵称"`
 	DepartmentId          int    `description:"作者ID "`
 	KeyWord               string `description:"关键词"`
+	LabelKeyWord          string `description:"标签关键词"`
 	Source                int    `description:"关键词来源;1:纪要、2:图表、3:纪要/图表、4:产业资源包、5:报告、6:活动、7:搜索关键词、8:专项产业调研、9音视频播放"`
 	ActivityName          string `description:"活动名称"`
 	ActivityType          int    `description:"1 线上,0、2线下"`
@@ -364,6 +365,7 @@ type UserInteraction struct {
 	SpecialType           int    `description:"专栏类型 1:笔记,2:观点"`
 	ArticleNum            int    // 已发布的文章数量
 	FansNum               int    // 粉丝数量
+	ResearcherName        string `description:"研究员姓名"`
 }
 
 // 查研观向图表
@@ -1150,6 +1152,7 @@ type GetUserInteractionTableCountResp struct {
 	YanxuanSpecialNum        int `description:"研选专栏阅读数量"`
 	YanxuanSpecialCollectNum int `description:"研选专栏收藏数量"`
 	YanxuanSpecialFollowNum  int `description:"研选专栏作者关注数量"`
+	FeedbackNum              int `description:"交流反馈数量"`
 }
 
 // 用户互动总数统计
@@ -1169,9 +1172,10 @@ func GetUserInteractionTableCount(uid int) (item *GetUserInteractionTableCountRe
 			( SELECT COUNT( 1 ) FROM cygx_micro_roadshow_video_history AS h  INNER JOIN cygx_micro_roadshow_video as v ON v.video_id = h.video_id WHERE  h.user_id = ?  ) AS roadshow_video_num,
 			( SELECT COUNT( 1 ) FROM cygx_activity_video_history AS h  INNER JOIN cygx_activity_video as v ON v.video_id = h.video_id WHERE  h.user_id = ?  ) AS activity_video_num,
 			( SELECT COUNT( 1 ) FROM cygx_activity_voice_history AS h  INNER JOIN cygx_activity_voice as v ON v.activity_id = h.activity_id WHERE  h.user_id = ?  ) AS activity_voice_num,
-			( SELECT COUNT(1) FROM cygx_tag_history as h INNER JOIN cygx_tag AS b ON h.tag_id = b.tag_id WHERE h.user_id = ?  ) AS tag_num
+			( SELECT COUNT(1) FROM cygx_tag_history as h INNER JOIN cygx_tag AS b ON h.tag_id = b.tag_id WHERE h.user_id = ?  ) AS tag_num,
+			( SELECT COUNT(1) FROM cygx_user_feedback as h WHERE h.user_id = ?  ) AS feedback_num
 			FROM  dual `
-	err = o.Raw(sql, uid, uid, uid, uid, uid, uid, uid, uid, uid, uid, uid, uid).QueryRow(&item)
+	err = o.Raw(sql, uid, uid, uid, uid, uid, uid, uid, uid, uid, uid, uid, uid, uid).QueryRow(&item)
 	return
 }
 

+ 32 - 0
models/cygx/industrial_activity_group_management.go

@@ -2,6 +2,7 @@ package cygx
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
 	"time"
 )
 
@@ -18,6 +19,7 @@ type IndustrialActivityGroupManagementRep struct {
 	IndustryName           string `description:"产业名称"`
 	ChartPermissionId      int    `description:"权限id"`
 	PermissionName         string `description:"行业名称"`
+	ActivityId             int    `description:"活动ID"`
 }
 
 type IndustryAndSubjectName struct {
@@ -42,6 +44,20 @@ func GetIndustrialActivityGroupManagementList(activityId, source int) (items []*
 	return
 }
 
+// 根据产业ID获取关联的对应活动
+func GetIndustrialActivityGroupManagementListByIndustriaId(industrialId, source int) (items []*IndustrialActivityGroupManagementRep, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			am.activity_id
+			FROM
+			cygx_industrial_activity_group_management AS am
+			INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = am.industrial_management_id
+			WHERE
+			am.industrial_management_id = ? AND am.source = ?`
+	_, err = o.Raw(sql, industrialId, source).QueryRows(&items)
+	return
+}
+
 // 获取产业关联的活动数量
 func GetIndustrialManagementGroupActCount(industrialManagementId int) (count int, err error) {
 	sqlCount := `SELECT
@@ -86,6 +102,22 @@ func GetIndustrialActivityGroupListByactivityIds(activityIds string) (items []*I
 	return
 }
 
+// 列表
+func GetIndustrialActivityGroupListByactivityIdsArr(activityIds []int, source int) (items []*IndustrialActivityGroupResp, err error) {
+	lenArr := len(activityIds)
+	if lenArr == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT  mg.*,m.industry_name  FROM
+	        cygx_industrial_activity_group_management AS mg
+	      	 INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = mg.industrial_management_id 
+			WHERE 1 = 1 
+			AND mg.activity_id IN (` + utils.GetOrmInReplace(lenArr) + `) AND mg.source = ? GROUP BY  mg.activity_id,mg.industrial_management_id`
+	_, err = o.Raw(sql, activityIds, source).QueryRows(&items)
+	return
+}
+
 type IndustryActCountGroupByType struct {
 	ActivityType  string `json:"activity_type" description:"活动类型名称"`
 	ActivityCount int    `json:"activity_count" description:"关联的活动数"`

+ 38 - 0
models/cygx/industrial_activity_group_subject.go

@@ -2,6 +2,7 @@ package cygx
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
 	"time"
 )
 
@@ -16,6 +17,7 @@ type CygxIndustrialActivityGroupSubject struct {
 type SubjectActivityGroupManagementRep struct {
 	IndustrialSubjectId int    `description:"产业id"`
 	SubjectName         string `description:"标的名称"`
+	ActivityId          int    `description:"活动ID"`
 }
 
 // 列表
@@ -33,6 +35,42 @@ func GetSubjectActivityGroupManagementList(activityId, source int) (items []*Sub
 	return
 }
 
+// 列表
+func GetSubjectActivityGroupManagementListByActivityIdsArr(activityIds []int, source int) (items []*SubjectActivityGroupManagementRep, err error) {
+	lenArr := len(activityIds)
+	if lenArr == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+    	    ag.activity_id,
+			s.subject_name,
+			s.industrial_subject_id 
+			FROM
+			cygx_industrial_activity_group_subject AS ag
+			INNER JOIN cygx_industrial_subject AS s ON s.industrial_subject_id = ag.industrial_subject_id 
+			WHERE
+				 ag.activity_id IN (` + utils.GetOrmInReplace(lenArr) + `) AND ag.source = ?`
+	_, err = o.Raw(sql, activityIds, source).QueryRows(&items)
+	return
+}
+
+// 列表
+func GetSubjectActivityGroupManagementListBySubjectId(subjectId, source int) (items []*SubjectActivityGroupManagementRep, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+    	    ag.activity_id,
+			s.subject_name,
+			s.industrial_subject_id 
+			FROM
+			cygx_industrial_activity_group_subject AS ag
+			INNER JOIN cygx_industrial_subject AS s ON s.industrial_subject_id = ag.industrial_subject_id 
+			WHERE
+			ag.industrial_subject_id = ? AND ag.source = ?`
+	_, err = o.Raw(sql, subjectId, source).QueryRows(&items)
+	return
+}
+
 func GetActivityIdsByIndustrialSubjectId(industrialSubjectId string) (activityId string, err error) {
 	sql := ` SELECT
 			GROUP_CONCAT( DISTINCT activity_id ORDER BY id ASC SEPARATOR ',' ) AS activity_id 

+ 22 - 0
models/cygx/industrial_article_group_management.go

@@ -41,6 +41,28 @@ func GetIndustrialArticleGroupManagementList(articleId int) (items []*Industrial
 	return
 }
 
+type IndustrialArticleGroupManagementRep struct {
+	IndustrialManagementId int    `description:"cygx_industrial_management表的主键ID"`
+	IndustryName           string `description:"产业名称"`
+	ChartPermissionId      int    `description:"权限id"`
+	PermissionName         string `description:"行业名称"`
+	ArticleId              int    `description:"cygx_article表的文章ID"`
+}
+
+// 列表
+func GetIndustrialArticleGroupManagementListByindustrialId(articleId int) (items []*IndustrialArticleGroupManagementRep, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			am.article_id
+			FROM
+			cygx_industrial_article_group_management AS am
+			INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = am.industrial_management_id
+			WHERE
+			am.industrial_management_id = ?`
+	_, err = o.Raw(sql, articleId).QueryRows(&items)
+	return
+}
+
 // 通过名称获取详情
 func GetIndustrialManagemenDetailByAaticle(articleId int) (item *CygxIndustrialArticleGroupManagement, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")

+ 20 - 0
models/cygx/industrial_article_group_subject.go

@@ -59,6 +59,26 @@ func GetSubjectArticleGroupManagementList(articleId int) (items []*SubjectActivi
 	return
 }
 
+type SubjectArticleGroupManagementRep struct {
+	IndustrialSubjectId int    `description:"产业id"`
+	SubjectName         string `description:"标的名称"`
+	ArticleId           int    `description:"cygx_article表的文章ID"`
+}
+
+// 列表
+func GetSubjectArticleGroupManagementListBysubjectId(subjectId int) (items []*SubjectArticleGroupManagementRep, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+  			ag.article_id
+			FROM
+			cygx_industrial_article_group_subject AS ag
+			INNER JOIN cygx_industrial_subject AS s ON s.industrial_subject_id = ag.industrial_subject_id 
+			WHERE
+			ag.industrial_subject_id = ?`
+	_, err = o.Raw(sql, subjectId).QueryRows(&items)
+	return
+}
+
 type SubjectlArticleGroupResp struct {
 	ArticleId              int    `description:"文章ID"`
 	IndustrialManagementId int    `description:"cygx_industrial_management表的主键ID"`

+ 9 - 0
models/cygx/industrial_management.go

@@ -649,6 +649,15 @@ func GetIndustryListByCondition(condition string, pars []interface{}) (list []*C
 	return
 }
 
+// GetIndustryListByCondition 获取产业列表
+func GetIndustryListByConditionByIds(industrialManagementIds []int) (list []*CygxIndustrialManagement, err error) {
+	lenArr := len(industrialManagementIds)
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_industrial_management WHERE  industrial_management_id IN (` + utils.GetOrmInReplace(lenArr) + `) `
+	_, err = o.Raw(sql, industrialManagementIds).QueryRows(&list)
+	return
+}
+
 // IndustriesEarliestLayoutTime 产业布局时间
 type IndustriesEarliestLayoutTime struct {
 	IndustrialManagementId int       `json:"industrial_management_id" description:"产业ID"`

+ 11 - 2
models/cygx/industrial_subject.go

@@ -2,6 +2,7 @@ package cygx
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
 	"strconv"
 	"strings"
 	"time"
@@ -179,10 +180,18 @@ func GetIndustrialSubjectAllByIds(condition string) (items []*CygxIndustrialSubj
 	return
 }
 
-func GetIndustrialSubjectDetailById(IndustrialSubjectId int) (item *CygxIndustrialSubject, err error) {
+func GetIndustrialSubjectDetailById(industrialSubjectId int) (item *CygxIndustrialSubject, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT * FROM cygx_industrial_subject WHERE industrial_subject_id = ? `
-	err = o.Raw(sql, IndustrialSubjectId).QueryRow(&item)
+	err = o.Raw(sql, industrialSubjectId).QueryRow(&item)
+	return
+}
+
+func GetIndustrialSubjectDetailByIds(industrialSubjectIds []int) (list []*CygxIndustrialSubject, err error) {
+	lenArr := len(industrialSubjectIds)
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_industrial_subject WHERE  industrial_subject_id IN (` + utils.GetOrmInReplace(lenArr) + `) `
+	_, err = o.Raw(sql, industrialSubjectIds).QueryRows(&list)
 	return
 }
 

+ 197 - 0
models/cygx/rai_serve_bill.go

@@ -0,0 +1,197 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+type RaiServeTypeResp struct {
+	ServeTypeId   int    `description:"服务类型id"`
+	ServeTypeName string `description:"服务类型名称"`
+}
+
+type RaiServeTypeListResp struct {
+	List []*RaiServeTypeResp
+}
+
+// 服务类型列表
+func GetRaiServeTypeRespList(condition string) (items []*RaiServeTypeResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_rai_serve_type WHERE  1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += `  ORDER BY sort DESC  LIMIT  100 `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+type RaiServeTagResp struct {
+	TagType int    `description:"标签类型"`
+	TagId   int    `description:"标签ID"`
+	TagName string `description:"标签名称"`
+	Md5Key  string `description:"加密key,前端找参数当唯一索引值使用"`
+}
+
+type ChekChartPermissionNameResp struct {
+	ChartPermissionName string `description:"权限名称"`
+	Belong              bool   `description:"权限名称"`
+	List                []*RaiServeTagResp
+}
+
+type RaiServeTagListResp struct {
+	List []*RaiServeTagResp
+}
+
+type RaiServeCoverageRateResp struct {
+	//List []string
+	ThisWeekAmount  string `comment:"本周互动量"`
+	LastWeekAmount  string `comment:"上周互动量"`
+	TwoWeekAmount   string `comment:"上上周互动量"`
+	ThreeWeekAmount string `comment:"上三周互动量"`
+}
+
+// 服务类型列表
+func GetRaiServeSearchTagRespList(keywords string) (items []*RaiServeTagResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			1 AS tag_type,
+			i.industrial_management_id AS tag_id,
+			i.industry_name AS tag_name,
+			i.create_time 
+		FROM
+			cygx_industrial_management AS i 
+		WHERE
+			1 = 1 
+			AND i.chart_permission_id IN ( 19, 20, 21, 22 ) 
+			AND  (i.industry_name LIKE '%` + keywords + `%' ) UNION ALL
+		SELECT
+			2 AS tag_type,
+			s.industrial_subject_id AS tag_id,
+			s.subject_name AS tag_name,
+			s.create_time 
+		FROM
+			cygx_industrial_subject AS s
+			INNER JOIN cygx_industrial_management AS i ON i.industrial_management_id = s.industrial_management_id 
+		WHERE
+			1 = 1 
+			AND i.chart_permission_id IN ( 19, 20, 21, 22 ) 
+			AND ( s.subject_name LIKE  '%` + keywords + `%') 
+		ORDER BY
+			create_time ASC `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+func GetRaiServeSearchTagRespListBycharId(keywords, charIds, conditionindustrial, conditionsubject string) (items []*RaiServeTagResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			1 AS tag_type,
+			i.industrial_management_id AS tag_id,
+			i.industry_name AS tag_name,
+			i.create_time 
+		FROM
+			cygx_industrial_management AS i 
+		WHERE
+			1 = 1 
+			AND i.chart_permission_id IN (` + charIds + ` ) 
+		AND  (i.industry_name LIKE '%` + keywords + `%' ` + conditionindustrial + ` )  UNION ALL
+		SELECT
+			2 AS tag_type,
+			s.industrial_subject_id AS tag_id,
+			s.subject_name AS tag_name,
+			s.create_time 
+		FROM
+			cygx_industrial_subject AS s
+			INNER JOIN cygx_industrial_management AS i ON i.industrial_management_id = s.industrial_management_id 
+		WHERE
+			1 = 1 
+			AND i.chart_permission_id IN (` + charIds + ` ) 
+			AND ( s.subject_name LIKE  '%` + keywords + `%' ` + conditionsubject + ` ) 
+		ORDER BY
+			create_time ASC `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 权益服务明细表
+type CygxRaiServeBillResp struct {
+	Content             string  `comment:"服务内容说明"`
+	ServeTypeName       string  `comment:"服务类型"`
+	Mobile              string  `comment:"手机号"`
+	Email               string  `comment:"邮箱"`
+	RealName            string  `comment:"用户实际名称"`
+	ServeCount          float64 `comment:"服务量小计"`
+	Tag                 string  `comment:"标签,多个用 , 隔开"`
+	IsKp                int     `comment:"是否是KP,1:是、0:否"`
+	SourceId            int     `comment:"来源ID"`
+	Source              string  `comment:"来源 "`
+	ViewTime            string  `comment:"浏览时间"`
+	ChartPermissionId   int     `description:"行业id"`
+	ChartPermissionName string  `description:"行业名称"`
+}
+
+type CygxRaiServeBillListResp struct {
+	Paging *paging.PagingItem `description:"分页数据"`
+	List   []*CygxRaiServeBillResp
+}
+
+func GetCygxRaiServeBillCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_rai_serve_bill as art WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 列表
+func GetCygxRaiServeBillRespList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxRaiServeBillResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_rai_serve_bill as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY bill_id DESC   LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// 权益服务明细表
+type CygxRaiServeBill struct {
+	BillId           int       `orm:"column(bill_id);pk" description:"服务明细主键ID"`
+	Content          string    `comment:"服务内容说明"`
+	ServeTypeId      int       `comment:"服务类型ID"`
+	ServeTypeName    string    `comment:"服务类型"`
+	UserId           int       `comment:"用户ID"`
+	Mobile           string    `comment:"手机号"`
+	Email            string    `comment:"邮箱"`
+	CompanyId        int       `comment:"公司ID"`
+	CompanyName      string    `comment:"公司名称"`
+	RealName         string    `comment:"用户实际名称"`
+	RegisterPlatform int       `comment:"来源 1小程序,2:网页"`
+	ServeCount       float64   `comment:"服务量小计"`
+	IsKp             int       `comment:"是否是KP,1:是、0:否"`
+	SourceId         int       `comment:"来源ID"`
+	Source           string    `comment:"来源 "`
+	WeekStartDate    string    `comment:"周一开始日期"`
+	WeekEndDate      string    `comment:"周日结束日期"`
+	CreateTime       time.Time `comment:"创建时间"`
+	ViewTime         string    `comment:"浏览时间"`
+}
+
+// 列表
+func GetCygxRaiServeBillListAll(condition string, pars []interface{}) (items []*CygxRaiServeBill, err error) {
+	if condition == "" {
+		return
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_rai_serve_bill   WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 72 - 0
models/cygx/rai_serve_company.go

@@ -0,0 +1,72 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+type CygxRaiServeCompany struct {
+	ServeCompanyId    int       `comment:"ServeCompanyId 主键ID"`
+	CompanyId         int       `comment:"公司ID"`
+	CompanyName       string    `comment:"公司名称"`
+	CreateTime        time.Time `comment:"创建时间"`
+	Money             float64   `comment:"合同金额"`
+	ServeCoverageRate string    `comment:"近四周服务覆盖率"`
+	SellerId          int       `comment:"所属销售id"`
+	SellerName        string    `comment:"所属销售名称"`
+	StartDate         string    `comment:"开始日期"`
+	EndDate           string    `comment:"结束日期"`
+	ShareSeller       string    `comment:"共享销售"`
+	ShareSellerId     int       `comment:"共享销售员id"`
+	Status            string    `comment:"客户状态"`
+	PermissionName    string    `comment:"权限名"`
+	IsUserMaker       int       `comment:"近四周之内是否包含决策人"`
+}
+
+type CygxRaiServeCompanyResp struct {
+	CompanyId         int     `comment:"公司ID"`
+	CompanyName       string  `comment:"公司名称"`
+	IsRed             bool    `comment:"是否标红"`
+	Money             float64 `comment:"合同金额"`
+	ServeCoverageRate string  `comment:"近四周服务覆盖率"`
+	SellerId          int     `comment:"所属销售id"`
+	SellerName        string  `comment:"所属销售名称"`
+	StartDate         string  `comment:"开始日期"`
+	EndDate           string  `comment:"结束日期"`
+	ShareSeller       string  `comment:"共享销售"`
+	ShareSellerId     int     `comment:"共享销售员id"`
+	Status            string  `comment:"客户状态"`
+	PermissionName    string  `comment:"权限名"`
+	ThisWeekAmount    float64 `comment:"本周互动量"`
+	LastWeekAmount    float64 `comment:"上周互动量"`
+	TwoWeekAmount     float64 `comment:"上上周互动量"`
+	ThreeWeekAmount   float64 `comment:"上三周互动量"`
+}
+
+type CygxRaiServeCompanyListResp struct {
+	Paging *paging.PagingItem `description:"分页数据"`
+	List   []*CygxRaiServeCompanyResp
+}
+
+func GetCygxRaiServeCompanyCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_rai_serve_company as art WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 列表
+func GetCygxRaiServeCompanyList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxRaiServeCompany, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_rai_serve_company as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` LIMIT ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}

+ 27 - 0
models/cygx/rai_serve_week_bill.go

@@ -0,0 +1,27 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxRaiServeWeekBill struct {
+	ServeWeekBillId int       `orm:"column(serve_week_bill_id);pk" description:"服务周账单ID"`
+	CompanyId       int       `comment:"公司ID"`
+	CompanyName     string    `comment:"公司名称"`
+	UserTotal       int       `comment:"用户数量"`
+	WeekServeCount  float64   `comment:"周度服务量总计"`
+	CoverageRate    float64   `comment:"覆盖率"`
+	WeekStartDate   string    `comment:"周一开始日期"`
+	WeekEndDate     string    `comment:"周日结束日期"`
+	CreateTime      time.Time `comment:"创建时间"`
+	ModifyTime      time.Time `comment:"修改时间"`
+}
+
+// 最近四周覆盖率列表
+func GetCygxRaiServeBillListWeek4(companyId int) (items []*CygxRaiServeWeekBill, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT  * FROM cygx_rai_serve_week_bill WHERE company_id = ? ORDER BY week_start_date DESC  LIMIT  4  `
+	_, err = o.Raw(sql, companyId).QueryRows(&items)
+	return
+}

+ 176 - 0
models/cygx/user_feedback.go

@@ -0,0 +1,176 @@
+package cygx
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
+	"strconv"
+	"time"
+)
+
+//用户交流反馈表
+
+// 权益服务明细表
+type CygxUserFeedback struct {
+	UserFeedbackId int       `orm:"column(user_feedback_id);pk";comment:"主键id"`
+	Content        string    `comment:"服务内容说明"`
+	UserId         int       `comment:"用户ID"`
+	Mobile         string    `comment:"手机号"`
+	Email          string    `comment:"邮箱"`
+	CompanyId      int       `comment:"公司ID"`
+	CompanyName    string    `comment:"公司名称"`
+	RealName       string    `comment:"用户实际名称"`
+	AdminId        int       `comment:"操作人ID"`
+	CreateTime     time.Time `comment:"创建时间"`
+}
+
+// 权益服务明细表
+type CygxUserFeedbackResp struct {
+	UserFeedbackId int    `comment:"主键id"`
+	Content        string `comment:"服务内容说明"`
+	CreateTime     string `comment:"创建时间"`
+}
+
+type AddCygxUserFeedbackReq struct {
+	Content string `comment:"服务内容说明"`
+	UserId  int    `comment:"用户ID"`
+}
+
+type CygxUserFeedbackIdReq struct {
+	UserFeedbackId int `comment:"UserFeedbackId 主键ID"`
+}
+
+// 添加
+func AddCygxUserFeedback(item *CygxUserFeedback) (newId int64, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	newId, err = o.Insert(item)
+	return
+}
+
+// 删除数据
+func DeleteCygxUserFeedback(userFeedbackId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` DELETE FROM cygx_user_feedback WHERE user_feedback_id = ?  `
+	_, err = o.Raw(sql, userFeedbackId).Exec()
+	return
+}
+
+// 列表
+func GetCygxUserFeedbackListByUserId(userId int) (items []*CygxUserFeedbackResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_user_feedback WHERE  user_id = ? `
+	sql += `  ORDER BY user_feedback_id DESC  LIMIT  1000 `
+	_, err = o.Raw(sql, userId).QueryRows(&items)
+	return
+}
+
+type CygxCygxUserFeedbackResp struct {
+	List []*CygxUserFeedbackResp
+}
+
+func GetCygxUserFeedbackList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxOrderResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT *
+			FROM
+			cygx_user_feedback
+			WHERE 1 = 1 ` + condition
+	sql += ` LIMIT ?,?  `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// 获取数量
+func GetCygxUserFeedbackCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_user_feedback WHERE   1= 1  ` + condition
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 用户交流反馈
+func GetCygxUserFeedback(condition string, startSize, pageSize int) (total int, items []*UserInteraction, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	var sql string
+	sql += `SELECT
+			r.content as key_word,
+			r.user_id,
+		    r.mobile,
+			r.real_name,
+			r.company_id,
+			r.company_name,
+			r.create_time
+		FROM
+			cygx_user_feedback AS r
+		WHERE 1 = 1 ` + condition
+
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql += ` ORDER BY create_time DESC `
+	if startSize > 0 || pageSize > 0 {
+		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 用户交流反馈
+func GetCygxUserFeedbackWeekly(condition string, startSize, pageSize int) (total int, items []*UserInteraction, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	var sql string
+	sql += `SELECT
+			r.content as key_word,
+			r.user_id,
+		    r.mobile,
+			r.real_name,
+			r.company_id,
+			r.company_name,
+			r.create_time
+		FROM
+			cygx_user_feedback AS r
+		   INNER JOIN %s.user_seller_relation AS us ON us.user_id = r.user_id   AND us.product_id = 2
+		WHERE 1 = 1 ` + condition
+	databaseName := utils.GetWeeklyDatabase()
+	sql = fmt.Sprintf(sql, databaseName)
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql).QueryRow(&total)
+	if err != nil {
+		return
+	}
+	sql += ` ORDER BY create_time DESC `
+	if startSize > 0 || pageSize > 0 {
+		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 获取数量
+func GetCygxUserFeedbackCountByUserModel(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_user_feedback as r
+                  WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 获取数量
+func GetCygxUserFeedbackCountByUserModelWeekly(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM 	cygx_user_feedback AS r
+			INNER JOIN %s.user_seller_relation AS us ON us.user_id = r.user_id   AND us.product_id = 2 
+		WHERE 1 = 1  `
+	databaseName := utils.GetWeeklyDatabase()
+	sqlCount = fmt.Sprintf(sqlCount, databaseName)
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}

+ 8 - 6
models/db.go

@@ -378,12 +378,13 @@ func initYb() {
 func initRoadShow() {
 	//注册对象
 	orm.RegisterModel(
-		new(roadshow.RsCalendar),            //路演主表
-		new(roadshow.RsCalendarResearcher),  //路演研究员信息表
-		new(roadshow.RsMatters),             //公开会议表
-		new(roadshow.RsCalendarRelation),    //路演关系表(与上海的路演日历关系)
-		new(roadshow.RsReportRecord),        //路演统计表
-		new(roadshow.RsCalendarMeetingUser), //路演参会名单表
+		new(roadshow.RsCalendar),                  //路演主表
+		new(roadshow.RsCalendarResearcher),        //路演研究员信息表
+		new(roadshow.RsMatters),                   //公开会议表
+		new(roadshow.RsCalendarRelation),          //路演关系表(与上海的路演日历关系)
+		new(roadshow.RsReportRecord),              //路演统计表
+		new(roadshow.RsCalendarMeetingUser),       //路演参会名单表
+		new(roadshow.RsCalendarMeetingLabelGroup), //路演参会名单关联的标签表
 	)
 }
 
@@ -480,6 +481,7 @@ func initCygx() {
 		new(cygx.CygxOrderRefund),
 		new(cygx.CygxOrder),
 		new(cygx.CygxOrderAction),
+		new(cygx.CygxUserFeedback),
 	)
 }
 

+ 11 - 3
models/roadshow/calendar.go

@@ -118,6 +118,17 @@ func GetRsCalendarResearcherListById(rsCalendarId int) (item []*RsCalendarResear
 	return
 }
 
+// 根据多个路演ID获取研究员信息
+func GetRsCalendarResearcherListByIds(rsCalendarIds []int) (item []*RsCalendarResearcher, err error) {
+	if len(rsCalendarIds) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_calendar_researcher WHERE rs_calendar_id IN (` + utils.GetOrmInReplace(len(rsCalendarIds)) + `) `
+	_, err = o.Raw(sql, rsCalendarIds).QueryRows(&item)
+	return
+}
+
 func GetRsCalendarResearcherListByCalendarResearcherId(rsCalendarResearcherId int) (item []*RsCalendarResearcher, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM rs_calendar_researcher WHERE rs_calendar_researcher_id=? `
@@ -167,7 +178,6 @@ type ResearcherGroup struct {
 	ResearcherList []*ResearcherGroup
 }
 
-
 func GetResearcherGroup() (list []*ResearcherGroup, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT group_id,group_name FROM admin AS a
@@ -962,7 +972,6 @@ func GetOverseaCustomCalendarList2(sellerId, researcherId, startDate, endDate, c
     INNER JOIN %s.english_company AS cc ON aa.company_id=cc.company_id
 		where aa.english_company= 1 AND aa.source = 0 AND cc.is_deleted=0  AND bb.rs_calendar_researcher_status=2 AND bb.researcher_id != 0 `, databaseName)
 
-
 	if startDate != "" {
 		sql2 += ` AND bb.start_date >= ?  `
 		pars = append(pars, startDate)
@@ -985,7 +994,6 @@ func GetOverseaCustomCalendarList2(sellerId, researcherId, startDate, endDate, c
 	sql := `SELECT m.*  FROM (` + sql1 + ` UNION ALL ` + sql2
 	sql += ` ) AS m  WHERE 1=1 `
 
-
 	sql += ` Group by rs_calendar_id  `
 	_, err = o.Raw(sql, pars).QueryRows(&list)
 

+ 119 - 0
models/roadshow/rs_calendar_meeting_label_group.go

@@ -0,0 +1,119 @@
+package roadshow
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+type RsCalendarMeetingLabelGroup struct {
+	LabelId      int       `orm:"column(label_id);pk" description:"主键ID"`
+	RsCalendarId int       `description:"路演ID"`
+	CreateTime   time.Time `description:"创建时间"`
+	ModifyTime   time.Time `description:"修改时间"`
+	AdminId      int       `description:"管理员ID"`
+	AdminName    string    `description:"管理员姓名"`
+	TagType      int       `description:"标签类型,1产业,2标的,3行业权限"`
+	TagId        int       `description:"标签ID"`
+}
+
+// 新增
+func AddRsCalendarMeetingLabelGroup(item *RsCalendarMeetingLabelGroup) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}
+
+// AddRsCalendarMeetingLabelGroupMulti 批量添加
+func AddRsCalendarMeetingLabelGroupMulti(items []*RsCalendarMeetingLabelGroup, rsCalendarId int) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+
+	//删除历史记录
+	sql := " DELETE FROM rs_calendar_meeting_label_group  WHERE rs_calendar_id = ? "
+	_, err = o.Raw(sql, rsCalendarId).Exec()
+	if err != nil {
+		return
+	}
+
+	//批量插入
+	_, err = o.InsertMulti(len(items), items)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// 获取数量
+func GetRsCalendarMeetingLabelGroupByRsCalendarId(rsCalendarId int) (count int, err error) {
+	o := orm.NewOrm()
+	sqlCount := ` SELECT COUNT(1) AS count  FROM rs_calendar_meeting_label_group WHERE   rs_calendar_id   = ?`
+	err = o.Raw(sqlCount, rsCalendarId).QueryRow(&count)
+	return
+}
+
+// 获取详情
+func GetRsCalendarMeetingLabelGroupDetailByRsCalendarId(rsCalendarId int) (item *RsCalendarMeetingLabelGroup, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT *  FROM rs_calendar_meeting_label_group WHERE   rs_calendar_id   = ? `
+	err = o.Raw(sql, rsCalendarId).QueryRow(&item)
+	return
+}
+
+// 根据多个路演ID获取研信息
+func GetRsCalendarMeetingLabelGroupListByRsCalendarId(rsCalendarId int) (item []*RsCalendarMeetingLabelGroup, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_calendar_meeting_label_group WHERE rs_calendar_id  = ? `
+	_, err = o.Raw(sql, rsCalendarId).QueryRows(&item)
+	return
+}
+
+// 根据多个路演ID获取研信息
+func GetRsCalendarMeetingLabelGroupDetailByRsCalendarIds(rsCalendarIds []int) (item []*RsCalendarMeetingLabelGroup, err error) {
+	if len(rsCalendarIds) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_calendar_meeting_label_group WHERE rs_calendar_id IN (` + utils.GetOrmInReplace(len(rsCalendarIds)) + `) `
+	_, err = o.Raw(sql, rsCalendarIds).QueryRows(&item)
+	return
+}
+
+// 修改
+func UpdateProductInterior(item *RsCalendarMeetingLabelGroup) (err error) {
+	o := orm.NewOrm()
+	updateParams := make(map[string]interface{})
+	updateParams["AdminId"] = item.AdminId
+	updateParams["AdminName"] = item.AdminName
+	updateParams["TagType"] = item.TagType
+	updateParams["TagId"] = item.TagId
+	updateParams["ModifyTime"] = item.ModifyTime
+	ptrStructOrTableName := "rs_calendar_meeting_label_group"
+	whereParam := map[string]interface{}{"rs_calendar_id": item.RsCalendarId}
+	qs := o.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	return
+}
+
+// 根据类型、id 获取对应的分组信息
+func GetRsCalendarMeetingLabelGroupDetailByTag(tagType, tagId int) (item []*RsCalendarMeetingLabelGroup, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_calendar_meeting_label_group WHERE tag_type = ? AND tag_id  = ?  `
+	_, err = o.Raw(sql, tagType, tagId).QueryRows(&item)
+	return
+}

+ 140 - 1
models/roadshow/rs_calendar_meeting_user.go

@@ -2,13 +2,21 @@ package roadshow
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/utils"
+	"strconv"
 	"time"
 )
 
 type AddRsCalendarMeetingUserReq struct {
 	RsCalendarId int   `description:"日程ID"`
 	UserId       []int // 用户ID
+	TagList      []*AddRsCalendarMeetingUserTagReq
+}
+
+type AddRsCalendarMeetingUserTagReq struct {
+	TagType int `description:"标签类型"`
+	TagId   int `description:"标签ID"`
 }
 
 type RsCalendarMeetingUser struct {
@@ -38,7 +46,8 @@ type DeleteRsCalendarMeetingUserReq struct {
 }
 
 type RsCalendarMeetingUserListResp struct {
-	List []*RsCalendarMeetingUserResp
+	List      []*RsCalendarMeetingUserResp
+	ListLebel []*cygx.RaiServeTagResp
 }
 
 // MultiAddRsCalendarMeetingUser 批量添加RsCalendarMeetingUser
@@ -59,6 +68,39 @@ func DeleteRsCalendarMeetingUser(rsCalendarMeetingUserID int) (err error) {
 	return err
 }
 
+// 获取数量
+func GetRsCalendarMeetingUserCountByUserId(userId int) (count int, err error) {
+	o := orm.NewOrm()
+	sqlCount := ` SELECT COUNT(1) AS count  FROM rs_calendar_meeting_user WHERE   user_id   = ?`
+	err = o.Raw(sqlCount, userId).QueryRow(&count)
+	return
+}
+
+// 获取数量
+func GetRsCalendarMeetingUserCountByUserModel(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sqlCount := ` SELECT COUNT(1) AS count  FROM rs_calendar_meeting_user as r
+                  WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 获取数量
+func GetRsCalendarMeetingUserCountByUserModelWeekly(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sqlCount := ` SELECT COUNT(1) AS count  FROM 	rs_calendar_meeting_user AS r
+			INNER JOIN user_seller_relation AS us ON us.user_id = r.user_id   AND us.product_id = 2 
+		WHERE 1 = 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
 // 列表
 func GetRsCalendarMeetingUserList(condition string, pars []interface{}) (items *RsCalendarMeetingUserResp, err error) {
 	o := orm.NewOrm()
@@ -94,3 +136,100 @@ func GetRsCalendarMeetingUserListCount(rsCalendarIds []int) (items []*RsCalendar
 	_, err = o.Raw(sql, rsCalendarIds).QueryRows(&items)
 	return
 }
+
+type RsCalendarMeetingUserByRai struct {
+	RsCalendarMeetingUserId int    `orm:"column(rs_calendar_meeting_user_id);pk" description:"主键ID"`
+	RsCalendarId            int    `description:"日程ID"`
+	UserId                  int    `description:"用户ID"`
+	Mobile                  string `description:"手机号"`
+	Email                   string `description:"邮箱"`
+	CompanyId               int    `description:"公司ID"`
+	CompanyName             string `description:"公司名称"`
+	RealName                string `description:"用户实际名称"`
+	StartDate               string `description:"开始时间"`
+	EndDate                 string `description:"结束时间"`
+	EndTime                 string `description:"开始时间"`
+	StartTime               string `description:"结束时间"`
+	StartWeek               string `description:"起始周"`
+	RoadshowType            string `description:"路演形式"`
+	ResearcherName          string `description:"研究员姓名"`
+	TagType                 int    `description:"标签类型,1产业,2标的,3行业权限"`
+}
+
+// 权益联系人列表获取相关信息
+func GetRsCalendarMeetingUserByRai(condition string, startSize, pageSize int) (total int, items []*RsCalendarMeetingUserByRai, err error) {
+	o := orm.NewOrm()
+	var sql string
+	sql += `SELECT
+			r.company_id,
+			r.company_name,
+			r.real_name,
+			r.mobile,
+			b.start_date,
+			b.end_date,
+			b.start_time,
+			b.end_time,
+			b.start_week,
+			b.researcher_name,
+			a.roadshow_type,
+			a.rs_calendar_id,
+			g.tag_type
+		FROM
+			rs_calendar_meeting_user AS r
+			INNER JOIN rs_calendar AS a ON a.rs_calendar_id = r.rs_calendar_id
+			INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id = b.rs_calendar_id 
+			LEFT JOIN rs_calendar_meeting_label_group AS g ON g.rs_calendar_id = b.rs_calendar_id 
+		WHERE
+			1 = 1 ` + condition + ` GROUP  BY a.rs_calendar_id  `
+
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql += ` ORDER BY  start_date  DESC `
+	if startSize > 0 || pageSize > 0 {
+		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+func GetRsCalendarMeetingUserByRaiWeekly(condition string, startSize, pageSize int) (total int, items []*RsCalendarMeetingUserByRai, err error) {
+	o := orm.NewOrm()
+	var sql string
+	sql += `SELECT
+			r.company_id,
+			r.company_name,
+			r.real_name,
+			r.mobile,
+			b.start_date,
+			b.end_date,
+			b.start_time,
+			b.end_time,
+			b.start_week,
+			b.researcher_name,
+			a.roadshow_type,
+			a.rs_calendar_id
+		FROM
+			rs_calendar_meeting_user AS r
+			INNER JOIN rs_calendar AS a ON a.rs_calendar_id = r.rs_calendar_id
+			INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id = b.rs_calendar_id 
+			INNER JOIN user_seller_relation AS us ON us.user_id = r.user_id   AND us.product_id = 2 
+		WHERE
+			1 = 1 ` + condition
+
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql += ` ORDER BY  start_date  DESC `
+	if startSize > 0 || pageSize > 0 {
+		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 99 - 0
routers/commentsRouter.go

@@ -2293,6 +2293,78 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "BillList",
+            Router: `/rai_serve/bill_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "ChcckPermissionName",
+            Router: `/rai_serve/chcck_PermissionName`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "CoverageRate",
+            Router: `/rai_serve/coverage_rate`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/rai_serve/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "SearchTag",
+            Router: `/rai_serve/search_tag`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "SearchTagCalendar",
+            Router: `/rai_serve/search_tag_by_calendar`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "TypeList",
+            Router: `/rai_serve/type_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "UserFeedbackList",
+            Router: `/user_feedback/list`,
+            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",
@@ -3139,6 +3211,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserFeedbackController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserFeedbackController"],
+        beego.ControllerComments{
+            Method: "UserFeedbackAdd",
+            Router: `/user_feedback/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserFeedbackController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserFeedbackController"],
+        beego.ControllerComments{
+            Method: "UserFeedbackDel",
+            Router: `/user_feedback/del`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"],
         beego.ControllerComments{
             Method: "ApprovalLogList",
@@ -9925,6 +10015,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"],
+        beego.ControllerComments{
+            Method: "RaiServeSellerList",
+            Router: `/seller/rai_serve/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"],
         beego.ControllerComments{
             Method: "RoadshowFiccList",

+ 2 - 0
routers/router.go

@@ -162,6 +162,8 @@ func init() {
 				&cygx.UserAdminShareHistoryController{},
 				&cygx.EnterScoreController{},
 				&cygx.OrderController{},
+				&cygx.RaiServeCoAntroller{},
+				&cygx.UserFeedbackController{},
 			),
 		),
 		web.NSNamespace("/advisory",

+ 47 - 0
services/cygx/acitvity.go

@@ -1496,3 +1496,50 @@ func GetMicroRoadShowDefaultImgConfig() (audioMap, videoMap, audioShareMap, vide
 	}
 	return
 }
+
+// 根据活动ID获取活动关联的产业名称
+func GetActivityIndustrialLabelByActivityIds(activityids []int, source int) (respMap map[int][]string) {
+	if len(activityids) == 0 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("根据活动ID获取活动关联的产业名称 失败 GetActivityIndustrialLabelByActivityIds activityids: ", activityids, err.Error()), 2)
+		}
+	}()
+	list, e := cygx.GetIndustrialActivityGroupListByactivityIdsArr(activityids, source)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetIndustrialActivityGroupListByactivityIdsArr, Err: " + e.Error())
+		return
+	}
+	respMap = make(map[int][]string, 0)
+	for _, v := range list {
+		respMap[v.ActivityId] = append(respMap[v.ActivityId], v.IndustryName)
+	}
+	return
+}
+
+// 根据活动ID获取活动关联的标的名称
+func GetActivitySubjectLabelByActivityIds(activityids []int, source int) (respMap map[int][]string) {
+	if len(activityids) == 0 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("根据活动ID获取活动关联的标的名称 失败 GetActivitySubjectLabelByActivityIds activityids: ", activityids, err.Error()), 2)
+		}
+	}()
+	list, e := cygx.GetSubjectActivityGroupManagementListByActivityIdsArr(activityids, source)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetSubjectActivityGroupManagementListByActivityIdsArr, Err: " + e.Error())
+		return
+	}
+	respMap = make(map[int][]string, 0)
+	for _, v := range list {
+		respMap[v.ActivityId] = append(respMap[v.ActivityId], v.SubjectName)
+	}
+	return
+}

+ 213 - 0
services/cygx/user_label.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/models/roadshow"
 	"hongze/hz_crm_api/services/alarm_msg"
 	"hongze/hz_crm_api/utils"
 	"strconv"
@@ -270,3 +271,215 @@ func GetUserInteractionNumMap(userIds []int) (mapResp map[int]int) {
 	}
 	return
 }
+
+// 预处理1v1路演的参会人员信息
+func HandleListRsCalendar(list []*roadshow.RsCalendarMeetingUserByRai) (items []*cygx.UserInteraction, err error) {
+	if len(list) == 0 {
+		return
+	}
+	var rsCalendarIds []int
+	for _, v := range list {
+		rsCalendarIds = append(rsCalendarIds, v.RsCalendarId)
+	}
+
+	mapRsCalendarLabel := make(map[int][]string) //1v1 路演标签
+	mapRsCalendarLabel = GetRsCalendarLabelByRsCalendarIds(rsCalendarIds)
+
+	//获取研究员信息
+	researchers, err := roadshow.GetRsCalendarResearcherListByIds(rsCalendarIds)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	mapResearcherName := make(map[int][]string)
+	for _, v := range researchers {
+		mapResearcherName[v.RsCalendarId] = append(mapResearcherName[v.RsCalendarId], v.ResearcherName)
+	}
+
+	//listGroup, err := roadshow.GetRsCalendarMeetingLabelGroupDetailByRsCalendarIds(rsCalendarIds)
+	//if err != nil && err.Error() != utils.ErrNoRow() {
+	//	return
+	//}
+	//
+	//var industrialManagementIds []int
+	//var industrialSubjectIds []int
+	//
+	//mapindustrialManagementName := make(map[int]string)
+	//mapindustrialSubjectName := make(map[int]string)
+	//mapCelueName := make(map[int]string)
+	//for _, v := range listGroup {
+	//	fmt.Println(v)
+	//	switch v.TagType {
+	//	case 1:
+	//		industrialManagementIds = append(industrialManagementIds, v.TagId)
+	//	case 2:
+	//		industrialSubjectIds = append(industrialSubjectIds, v.TagId)
+	//	case 3:
+	//		mapCelueName[v.RsCalendarId] = "策略"
+	//	}
+	//}
+
+	//if len(industrialManagementIds) > 0 {
+	//	IndustryList, e := cygx.GetIndustryListByConditionByIds(industrialManagementIds)
+	//	if e != nil {
+	//		err = errors.New("GetIndustryListByConditionByIds" + e.Error())
+	//		return
+	//	}
+	//
+	//	for _, v := range IndustryList {
+	//		mapindustrialManagementName[v.IndustrialManagementId] = v.IndustryName
+	//	}
+	//}
+
+	//if len(industrialSubjectIds) > 0 {
+	//	SubjectList, e := cygx.GetIndustrialSubjectDetailByIds(industrialSubjectIds)
+	//	if e != nil {
+	//		err = errors.New("GetIndustryListByConditionByIds" + e.Error())
+	//		return
+	//	}
+	//	for _, v := range SubjectList {
+	//		mapindustrialSubjectName[v.IndustrialSubjectId] = v.SubjectName
+	//	}
+	//}
+
+	//mapGroupindustrialManagementName := make(map[int][]string)
+	//mapGroupindustrialSubjectName := make(map[int][]string)
+	//for _, v := range listGroup {
+	//	switch v.TagType {
+	//	case 1:
+	//		mapGroupindustrialManagementName[v.RsCalendarId] = append(mapGroupindustrialManagementName[v.RsCalendarId], mapindustrialManagementName[v.TagId])
+	//	case 2:
+	//		mapGroupindustrialSubjectName[v.RsCalendarId] = append(mapGroupindustrialSubjectName[v.RsCalendarId], mapindustrialSubjectName[v.TagId])
+	//	}
+	//}
+
+	for _, v := range list {
+		item := new(cygx.UserInteraction)
+		item.UserId = v.UserId
+		item.RealName = v.RealName
+		item.Mobile = v.Mobile
+		item.CompanyId = v.CompanyId
+		item.CompanyName = v.CompanyName
+		//switch v.TagType {
+		//case 1:
+		//	item.LabelKeyWord = strings.Join(mapGroupindustrialManagementName[v.RsCalendarId], ",")
+		//case 2:
+		//	item.LabelKeyWord = strings.Join(mapGroupindustrialSubjectName[v.RsCalendarId], ",")
+		//case 3:
+		//	item.LabelKeyWord = mapCelueName[v.RsCalendarId]
+		//}
+
+		item.LabelKeyWord = strings.Join(mapRsCalendarLabel[v.RsCalendarId], ",")
+		item.ActivityTimeText = v.StartDate + "(" + v.StartWeek + ")" + v.StartTime + "-" + v.EndTime
+		item.ResearcherName = strings.Join(mapResearcherName[v.RsCalendarId], ",")
+		items = append(items, item)
+	}
+
+	return
+}
+
+// 获取1V1路演标签信息
+func GetRsCalendarLabelByRsCalendarIds(rsCalendarIds []int) (respMap map[int][]string) {
+	if len(rsCalendarIds) == 0 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("获取1V1路演标签信息 失败 GetRsCalendarLabelByRsCalendarIds rsCalendarIds: ", rsCalendarIds, err.Error()), 2)
+		}
+	}()
+
+	listEmail, err := cygx.GetAskEmail()
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	var ceLueResearcherName []string
+	var guShouResearcherName []string
+	for _, v := range listEmail {
+		if v.ChartPermissionName == utils.CE_LUE_NAME {
+			ceLueResearcherName = append(ceLueResearcherName, v.Name)
+		}
+		if v.ChartPermissionName == utils.GU_SHOU_NAME {
+			guShouResearcherName = append(guShouResearcherName, v.Name)
+		}
+	}
+
+	//获取研究员信息
+	researchers, err := roadshow.GetRsCalendarResearcherListByIds(rsCalendarIds)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	mapResearcherName := make(map[int][]string)
+	for _, v := range researchers {
+		if utils.InArrayByStr(ceLueResearcherName, v.ResearcherName) {
+			mapResearcherName[v.RsCalendarId] = append(mapResearcherName[v.RsCalendarId], "策略")
+		}
+		if utils.InArrayByStr(guShouResearcherName, v.ResearcherName) {
+			mapResearcherName[v.RsCalendarId] = append(mapResearcherName[v.RsCalendarId], "固收")
+		}
+	}
+
+	listGroup, err := roadshow.GetRsCalendarMeetingLabelGroupDetailByRsCalendarIds(rsCalendarIds)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+
+	var industrialManagementIds []int
+	var industrialSubjectIds []int
+
+	mapindustrialManagementName := make(map[int]string)
+	mapindustrialSubjectName := make(map[int]string)
+	mapCelueName := make(map[int]string)
+	for _, v := range listGroup {
+		switch v.TagType {
+		case 1:
+			industrialManagementIds = append(industrialManagementIds, v.TagId)
+		case 2:
+			industrialSubjectIds = append(industrialSubjectIds, v.TagId)
+		case 3:
+			mapCelueName[v.RsCalendarId] = strings.Join(mapResearcherName[v.RsCalendarId], ",")
+		}
+	}
+
+	if len(industrialManagementIds) > 0 {
+		IndustryList, e := cygx.GetIndustryListByConditionByIds(industrialManagementIds)
+		if e != nil {
+			err = errors.New("GetIndustryListByConditionByIds" + e.Error())
+			return
+		}
+
+		for _, v := range IndustryList {
+			mapindustrialManagementName[v.IndustrialManagementId] = v.IndustryName
+		}
+	}
+
+	if len(industrialSubjectIds) > 0 {
+		SubjectList, e := cygx.GetIndustrialSubjectDetailByIds(industrialSubjectIds)
+		if e != nil {
+			err = errors.New("GetIndustryListByConditionByIds" + e.Error())
+			return
+		}
+		for _, v := range SubjectList {
+			mapindustrialSubjectName[v.IndustrialSubjectId] = v.SubjectName
+		}
+	}
+	respMap = make(map[int][]string, 0)
+	for _, v := range listGroup {
+		switch v.TagType {
+		case 1:
+			respMap[v.RsCalendarId] = append(respMap[v.RsCalendarId], mapindustrialManagementName[v.TagId])
+		case 2:
+			respMap[v.RsCalendarId] = append(respMap[v.RsCalendarId], mapindustrialSubjectName[v.TagId])
+		case 3:
+			respMap[v.RsCalendarId] = append(respMap[v.RsCalendarId], mapCelueName[v.RsCalendarId])
+		}
+	}
+
+	for _, v := range rsCalendarIds {
+		if len(respMap[v]) == 0 && len(mapResearcherName[v]) > 0 {
+			respMap[v] = mapResearcherName[v]
+		}
+	}
+	return
+}

+ 2 - 0
utils/constants.go

@@ -21,6 +21,7 @@ const (
 	EmptyDateTimeStr           = "0000-00-00 00:00:00"     //DateTime零值字符串
 	EmptyDateStr               = "0000-00-00"              //Date零值字符串
 	FormatMonthDayUnSpace      = "0102"                    //日期格式
+	FormatMonthDayUnSpace2     = "01.02"                   //日期格式
 	FormatYearMonthDate        = "2006-01"                 //日期格式
 	FormatYearDate             = "2006"                    //日期格式
 	PageSize15                 = 15                        //列表页每页数据量
@@ -451,6 +452,7 @@ const (
 	CYGX_OBJ_MINUTESSUMMARY     string = "minutessummary"     // 对象类型:本周研究汇总
 	CYGX_OBJ_YANXUANSPECIAL     string = "yanxuanspecial"     // 对象类型:研选专栏
 	CYGX_OBJ_ASKSERIEVIDEO      string = "askserievideo"      // 对象类型:问答系列视频
+	CYGX_OBJ_RS_CALENDAR        string = "rscalendar"         // 对象类型:研究员日历安排
 )
 
 const (