ziwen hace 1 año
padre
commit
c50afe9d09

+ 14 - 0
controllers/cygx/roadshow_essence.go

@@ -197,6 +197,20 @@ func (this *RoadshowEssenceController) PreserveAndPublish() {
 		}
 	}
 
+	//同步数据到最新表
+	if req.ArticleId == 0 {
+		if item.PublishStatus == 1 {
+			go cygxService.UpdateResourceData(item.ArticleId, "article", "add", time.Now().Format(utils.FormatDateTime))
+		}
+	} else {
+		if item.PublishStatus == 1 {
+			go cygxService.UpdateResourceData(item.ArticleId, "article", "update", time.Now().Format(utils.FormatDateTime))
+		}
+		if req.DoType == 1 {
+			go cygxService.UpdateResourceData(item.ArticleId, "article", "add", time.Now().Format(utils.FormatDateTime))
+		}
+	}
+
 	if req.DoType == 1 {
 		go cygxService.SendWxMsgWithroadshowEssence(articleId)
 	}

+ 511 - 0
controllers/cygx/tag_management.go

@@ -0,0 +1,511 @@
+package cygx
+
+import (
+	"encoding/json"
+	"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/data_manage/request"
+	cygxService "hongze/hz_crm_api/services/cygx"
+	"hongze/hz_crm_api/utils"
+	"os"
+	"path/filepath"
+	"time"
+)
+
+// 标签管理
+type TagManagementController struct {
+	controllers.BaseAuthController
+}
+
+// @Title 获取标签列表
+// @Description 获取标签列表接口
+// @Param   CurrentIndex   query   int  true       "当前页码"
+// @Param   PageSize   query   int  true       "每页数据数"
+// @Param   Status   query   string  false       "发布状态,1,上线,0下线"
+// @Success 200 {object} cygx.ChartPermissionResp
+// @router /tag/list [get]
+func (this *TagManagementController) TagList() {
+	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.GetInt("Status", 1)
+
+	var condition string
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	if status == 1 {
+		condition += ` AND status=1 ORDER BY online_time DESC  `
+	} else {
+		condition += ` AND status=0 ORDER BY online_time DESC  `
+	}
+
+	total, err := cygx.GetCygxTagListCount(condition)
+	if err != nil {
+		br.Msg = "获取标签总数失败"
+		br.ErrMsg = "获取标签总数失败,Err:" + err.Error()
+		return
+	}
+	page := paging.GetPaging(currentIndex, pageSize, total)
+
+	list, err := cygx.GetCygxTagListPage(condition, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取标签失败"
+		br.ErrMsg = "获取标签信息失败,Err:" + err.Error()
+		return
+	}
+
+	var resp request.TagListResp
+	resp.Paging = page
+	resp.List = list
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 获取标签列表-自定义顺序
+// @Description 获取标签列表-自定义顺序接口
+// @Success 200 {object} cygx.ChartPermissionResp
+// @router /tag/list/custom [get]
+func (this *TagManagementController) TagCustomizeList() {
+	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 condition string
+	list, err := cygx.GetCygxTagList(condition)
+	if err != nil {
+		br.Msg = "获取标签失败"
+		br.ErrMsg = "获取标签信息失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}
+
+// @Title 撤下或上线标签
+// @Description 撤下或上线标签接口
+// @Param   Status   query   string  false       "状态,1,上线,0下线"
+// @Param   TagId   query   int  false       "标签id"
+// @Success 200 {object} cygx.ChartPermissionResp
+// @router /tag/enable [get]
+func (this *TagManagementController) TagEnable() {
+	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
+	}
+
+	status, _ := this.GetInt("Status", 1)
+	tagId, _ := this.GetInt("TagId")
+
+	if tagId < 1 {
+		br.Msg = "标签不存在"
+		return
+	}
+	err := cygx.UpdateCygxTagStatus(tagId, status)
+	if err != nil {
+		br.Msg = "上下线标签失败"
+		br.ErrMsg = "上下线标签失败,Err:" + err.Error()
+		return
+	}
+
+	if status == 1 {
+		br.Msg = "上线成功"
+	} else {
+		br.Msg = "撤下成功"
+	}
+	br.Ret = 200
+	br.Success = true
+}
+
+// MoveTag
+// @Title 移动标签
+// @Description 移动标签接口
+// @Success 200 {object} data_manage.MoveBaseFromBaiinfoReq
+// @router /tag/move [post]
+func (this *TagManagementController) MoveTag() {
+	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 request.MoveTagReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.TagId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "标签id小于等于0"
+		br.IsSendEmail = false
+		return
+	}
+
+	err, errMsg := cygxService.MoveCygxTag(req.TagId, req.PrevTagId, req.NextTagId)
+	if errMsg != `` {
+		br.Msg = errMsg
+		br.ErrMsg = errMsg
+		if err != nil {
+			br.ErrMsg = err.Error()
+		} else {
+			br.IsSendEmail = false
+		}
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "移动成功"
+}
+
+// SubCategoryNameList
+// @Title 搜索所有的报告系列
+// @Description 搜索所有的报告系列接口
+// @Success 200 {object} data_manage.MoveBaseFromBaiinfoReq
+// @router /tag/subCategoryName/list [get]
+func (this *TagManagementController) SubCategoryNameList() {
+	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")
+
+	list, err := cygx.GetMatchTypeNameByKeyword(keyword)
+	if err != nil {
+		br.Msg = "获取标签失败"
+		br.ErrMsg = "获取标签信息失败,Err:" + err.Error()
+		return
+	}
+	//todo 严选沙龙+精华
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}
+
+// @Title 获取关联产业列表
+// @Description 获取关联产业列表接口
+// @Param   KeyWord   query   string  false       "搜索关键词"
+// @Success Ret=200  {object} cygx.GetCygxIndustrialManagementList
+// @router /tag/industrialManagement/listByName [get]
+func (this *TagManagementController) IndustrialManagementlistByName() {
+	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 condition string
+	keyWord := this.GetString("KeyWord")
+	if keyWord != "" {
+		condition = ` AND industry_name LIKE '%` + keyWord + `%'  `
+	} else {
+		condition = ` AND industrial_management_id = 0 `
+	}
+	listIndustrial, err := cygx.GetIndustrialManagement(condition)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	resp := new(cygx.GetCygxIndustrialManagementList)
+	resp.List = listIndustrial
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 新增标签
+// @Description 新增标签接口
+// @Success Ret=200  {object} cygx.GetCygxIndustrialManagementList
+// @router /tag/save [post]
+func (this *TagManagementController) TagSave() {
+	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 request.SaveTagReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.TagName == "" {
+		br.Msg = "参数错误"
+		br.ErrMsg = "标签名为空"
+		return
+	}
+	if req.TagId > 0 {
+		item := cygx.CygxTag{
+			TagId:         int64(req.TagId),
+			TagName:       req.TagName,
+			ArticleTypes:  req.ArticleTypes,
+			ActivityTypes: req.ActivityTypes,
+			Industries:    req.Industries,
+			SubjectNames:  req.SubjectNames,
+			ModifyTime:    time.Now(),
+		}
+
+		err = item.Update([]string{"TagName","ArticleTypes","ActivityTypes","Industries","SubjectNames","ModifyTime"})
+		if err != nil {
+			br.Msg = "编辑标签失败!"
+			br.ErrMsg = "编辑标签失败,Err:" + err.Error()
+			return
+		}
+	} else {
+		item := cygx.CygxTag{
+			TagName:       req.TagName,
+			ArticleTypes:  req.ArticleTypes,
+			ActivityTypes: req.ActivityTypes,
+			Industries:    req.Industries,
+			SubjectNames:  req.SubjectNames,
+			ModifyTime:    time.Now(),
+			CreateTime:    time.Now(),
+			OnlineTime:    time.Now(),
+			Status:        1,
+		}
+
+		maxSort, err := cygx.GetCygxTagMaxSort()
+		if err != nil {
+			br.Msg = "查询最大排序失败"
+			br.ErrMsg = "查询最大排序失败" + err.Error()
+			return
+		}
+		item.Sort = maxSort + 1
+
+		_, err = cygx.AddCygxTag(&item)
+		if err != nil {
+			br.Msg = "新增标签失败!"
+			br.ErrMsg = "新增标签失败,Err:" + err.Error()
+			return
+		}
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "操作成功"
+}
+
+// @Title  下载PV
+// @Description 下载PV接口
+// @Param   TagId   query   int  true       "TagId"
+// @router /tag/PvExport [get]
+func (this *TagManagementController) PvExport() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	tagId, _ := this.GetInt("TagId")
+	if tagId < 1 {
+		br.Msg = "请输入标签ID"
+		return
+	}
+	var condition string
+	var pars []interface{}
+	condition = ` AND tag_id = ? `
+	pars = append(pars, tagId)
+	var respList []*cygx.CygxTagHistory
+	//respList := new(cygx.CygxTacticsTimeLineHistory)
+	list, err := cygx.GetCygxTagHistoryList(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	//超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
+	//resp := new(cygx.CanDownload)
+	//adminInfo, errAdmin := system.GetSysUserById(AdminUser.AdminId)
+	//if errAdmin != nil {
+	//	br.Msg = "获取失败"
+	//	br.ErrMsg = "获取失败,Err:" + errAdmin.Error()
+	//	return
+	//}
+	//if adminInfo.Role == "admin" || adminInfo.Role == "researcher" {
+	//	resp.IsCanDownload = true
+	//}
+	////销售查看自己客户,销售组长查看组员
+	//if resp.IsCanDownload == false {
+	//	mapMobile, err := cygxService.GetAdminLookUserMobile(adminInfo)
+	//	if err != nil {
+	//		br.Msg = "获取失败"
+	//		br.ErrMsg = "获取失败,销售对应权限,Err:" + err.Error()
+	//		return
+	//	}
+	//	for _, v := range list {
+	//		if _, ok := mapMobile[v.Mobile]; ok {
+	//			respList = append(respList, v)
+	//		}
+	//	}
+	//} else {
+	//	respList = list
+	//}
+	respList = list
+	//创建excel
+	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
+	sheet, err := xlsxFile.AddSheet("阅读明细")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	rowTitle := sheet.AddRow()
+	cellA := rowTitle.AddCell()
+	cellA.Value = "姓名"
+	cellB := rowTitle.AddCell()
+	cellB.Value = "手机号"
+	cellC := rowTitle.AddCell()
+	cellC.Value = "公司名称"
+	cellD := rowTitle.AddCell()
+	cellD.Value = "所属权益销售"
+	cellE := rowTitle.AddCell()
+	cellE.Value = "点击时间"
+	cellF := rowTitle.AddCell()
+	cellF.Value = "来源"
+
+	for _, item := range respList {
+		row := sheet.AddRow()
+		cellA := row.AddCell()
+		cellA.Value = item.RealName
+		cellB := row.AddCell()
+		cellB.Value = item.Mobile
+		cellC := row.AddCell()
+		cellC.Value = item.CompanyName
+		cellD := row.AddCell()
+		cellD.Value = item.SellerName
+		cellE := row.AddCell()
+		cellE.Value = item.CreateTime.Format(utils.FormatDateTime)
+
+		cellF := row.AddCell()
+		if item.RegisterPlatform == 1 {
+			cellF.Value = "小程序"
+		} else {
+			cellF.Value = "网页版"
+		}
+	}
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	downloadFileName := time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+

+ 15 - 0
models/cygx/cygx_report_mapping.go

@@ -88,3 +88,18 @@ func GetMatchTypeNameByPermissionId(permissionId int) (item *ReportMappingRep, e
 	err = o.Raw(sql, permissionId).QueryRow(&item)
 	return
 }
+
+func GetMatchTypeNameByKeyword(keyWord string) (items []*CygxReportMapping, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT
+	* 
+FROM
+( SELECT sub_category_name FROM cygx_report_mapping UNION 
+SELECT "晨会精华" AS sub_category_name UNION 
+SELECT "路演精华" AS sub_category_name UNION 
+SELECT article_type_name AS sub_category_name FROM cygx_article_type ) AS a
+WHERE
+	a.sub_category_name LIKE '%` + keyWord + `%' `
+	_,err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 156 - 0
models/cygx/cygx_tag.go

@@ -0,0 +1,156 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxTag struct {
+	TagId         int64     `orm:"column(tag_id);pk"`
+	TagName       string    `orm:"column(tag_name);NOT NULL"`       // 标签名
+	ArticleTypes  string    `orm:"column(article_types);NOT NULL"`  // 报告系列
+	ActivityTypes string    `orm:"column(activity_types);NOT NULL"` // 活动类型
+	Industries    string    `orm:"column(industries);NOT NULL"`     // 产业
+	SubjectNames  string    `orm:"column(subject_names);NOT NULL"`  // 标的
+	Sort          int       `orm:"column(sort);"`                   // 优先级
+	ModifyTime    time.Time `orm:"column(modify_time)"`             // 修改时间
+	CreateTime    time.Time `orm:"column(create_time)"`             // 创建时间
+	OnlineTime    time.Time `orm:"column(online_time)"`             // 上线时间
+	OfflineTime   time.Time `orm:"column(offline_time)"`            // 下线时间
+	Status        int       `orm:"column(status);NOT NULL"`         // 状态:0-禁用 1-启用
+}
+
+// 添加标签
+func AddCygxTag(item *CygxTag) (id int64, err error) {
+	o := orm.NewOrm()
+	id, err = o.Insert(item)
+	return
+}
+
+func (m *CygxTag) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(m, cols...)
+	return
+}
+
+type CygxTagList struct {
+	TagId         int64  `orm:"column(tag_id);pk"`
+	TagName       string `orm:"column(tag_name);NOT NULL"`       // 标签名
+	ArticleTypes  string `orm:"column(article_types);NOT NULL"`  // 报告系列
+	ActivityTypes string `orm:"column(activity_types);NOT NULL"` // 活动类型
+	Industries    string `orm:"column(industries);NOT NULL"`     // 产业
+	SubjectNames  string `orm:"column(subject_names);NOT NULL"`  // 标的
+	Sort          int    `orm:"column(sort);"`                   // 优先级
+	ModifyTime    string `orm:"column(modify_time)"`             // 修改时间
+	CreateTime    string `orm:"column(create_time)"`             // 创建时间
+	OnlineTime    string `orm:"column(online_time)"`             // 上线时间
+	OfflineTime   string `orm:"column(offline_time)"`            // 下线时间
+	Status        int    `orm:"column(status);NOT NULL"`         // 状态:0-禁用 1-启用
+	Pv            int    `description:"PV"`
+	Uv            int    `description:"UV"`
+}
+
+// 获取tag列表
+func GetCygxTagList(cond string) (items []*CygxTagList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_tag  WHERE 1=1 AND status = 1 `
+	if cond != "" {
+		sql += cond
+	} else {
+		sql += `  ORDER BY sort ASC `
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 获取tag列表-总数
+func GetCygxTagListCount(cond string) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM cygx_tag  WHERE 1=1  `
+	if cond != "" {
+		sql += cond
+	} else {
+		sql += `  ORDER BY sort ASC `
+	}
+	err = o.Raw(sql).QueryRow(&count)
+	return
+}
+
+// 获取tag列表-分页
+func GetCygxTagListPage(cond string, startSize, pageSize int) (items []*CygxTagList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *,
+		(SELECT COUNT(1) FROM cygx_tag_history AS avr WHERE avr.tag_id=cygx_tag.tag_id) AS pv,
+        (SELECT COUNT(DISTINCT user_id) FROM cygx_tag_history AS avr WHERE avr.tag_id=cygx_tag.tag_id) AS uv
+		FROM cygx_tag  WHERE 1=1 `
+	if cond != "" {
+		sql += cond
+	} else {
+		sql += `  ORDER BY sort ASC `
+	}
+	sql += ` LIMIT ?,? `
+	_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+func UpdateCygxTagStatus(id, status int) (err error) {
+	o := orm.NewOrm()
+	sql := ``
+	if status == 1 {
+		sql = ` UPDATE  cygx_tag
+			SET
+			  status =1,
+			  modify_time = NOW() 
+			WHERE tag_id = ?`
+	} else {
+		sql = ` UPDATE  cygx_tag
+			SET
+			  status =0,
+			  offline_time = NOW(),
+			  modify_time = NOW() 
+			WHERE tag_id = ?`
+	}
+
+	_, err = o.Raw(sql, id).Exec()
+	return
+}
+
+// GetCygxTagByTagId 根据指标id获取指标信息
+func GetCygxTagByTagId(tagId int) (item *CygxTag, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_tag WHERE tag_id=? `
+	err = o.Raw(sql, tagId).QueryRow(&item)
+	return
+}
+
+// GetCygxTagMinSort 获取最小不等于0的排序
+func GetCygxTagMinSort() (sort int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT min(sort) FROM cygx_tag WHERE  sort <> 0 `
+	err = o.Raw(sql).QueryRow(&sort)
+	return
+}
+
+// MoveDownCygxTagBySort 往下移动
+func MoveDownCygxTagBySort(prevSort, currentSort int) (err error) {
+	o := orm.NewOrm()
+	sql := `update cygx_tag set sort = sort - 1 where sort <= ? and sort> ? `
+	_, err = o.Raw(sql, prevSort, currentSort).Exec()
+	return
+}
+
+// MoveUpCygxTagBySort 往下移动
+func MoveUpCygxTagBySort(prevSort, currentSort int) (err error) {
+	o := orm.NewOrm()
+	sql := `update cygx_tag set sort = sort + 1 where sort >= ? and sort< ? `
+	_, err = o.Raw(sql, prevSort, currentSort).Exec()
+	return
+}
+
+// GetCygxTagMaxSort 获取最大不等于0的排序
+func GetCygxTagMaxSort() (sort int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT max(sort) FROM cygx_tag WHERE  sort <> 0 `
+	err = o.Raw(sql).QueryRow(&sort)
+	return
+}

+ 63 - 0
models/cygx/tag_history.go

@@ -0,0 +1,63 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxTagHistory struct {
+	Id               int `orm:"column(id);pk"`
+	TimeLineId       int
+	UserId           int
+	CreateTime       time.Time
+	Mobile           string    `description:"手机号"`
+	Email            string    `description:"邮箱"`
+	CompanyId        int       `description:"公司id"`
+	CompanyName      string    `description:"公司名称"`
+	ModifyTime       time.Time `description:"修改时间"`
+	RealName         string    `description:"用户实际名称"`
+	SellerName       string    `description:"所属销售"`
+	RegisterPlatform int       `description:"来源 1小程序,2:网页"`
+}
+
+// 列表
+func GetCygxTagHistoryList(condition string, pars []interface{}) (items []*CygxTagHistory, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_tag_history as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// 获取数量
+func GetCygxTagHistoryCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_tag_history as art WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 获取数量
+func GetCygxTagHistoryCountUv(tagId int) (count int, err error) {
+	sqlCount := ` SELECT
+			count(*) AS uv 
+		FROM
+			( SELECT count(*) FROM cygx_tag_history WHERE 1 = 1 AND tag_id = ? GROUP BY user_id ) b `
+
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, tagId).QueryRow(&count)
+	return
+}
+
+// 获取数量
+func GetCygxTagHistoryCountPv(tagId int) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_tag_history as art WHERE 1= 1  AND tag_id = ? `
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, tagId).QueryRow(&count)
+	return
+}

+ 28 - 0
models/data_manage/request/cygx_tag.go

@@ -0,0 +1,28 @@
+package request
+
+import (
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hz_crm_api/models/cygx"
+)
+
+// MoveTagReq 移动标签请求参数
+type MoveTagReq struct {
+	TagId     int `description:"指标id"`
+	PrevTagId int `description:"上一个节点标签id"`
+	NextTagId  int `description:"下一个节点标签id"`
+}
+
+// SaveTagReq 保存标签请求参数
+type SaveTagReq struct {
+	TagId         int    `description:"指标id"`
+	TagName       string `description:"标签名"`
+	ArticleTypes  string `description:"报告系列"`
+	ActivityTypes string `description:"活动类型"`
+	Industries    string `description:"产业"`
+	SubjectNames  string `description:"标的"`
+}
+
+type TagListResp struct {
+	Paging *paging.PagingItem `description:"分页数据"`
+	List   []*cygx.CygxTagList
+}

+ 1 - 0
models/db.go

@@ -418,6 +418,7 @@ func initCygx() {
 		new(cygx.CygxActivityPointsSet),
 		new(cygx.CygxActivityPointsBill),
 		new(cygx.CygxActivityPointsCompany),
+		new(cygx.CygxTag),
 	)
 }
 

+ 72 - 0
routers/commentsRouter.go

@@ -2536,6 +2536,78 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"],
+        beego.ControllerComments{
+            Method: "PvExport",
+            Router: `/tag/PvExport`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"],
+        beego.ControllerComments{
+            Method: "TagEnable",
+            Router: `/tag/enable`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"],
+        beego.ControllerComments{
+            Method: "IndustrialManagementlistByName",
+            Router: `/tag/industrialManagement/listByName`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"],
+        beego.ControllerComments{
+            Method: "TagList",
+            Router: `/tag/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"],
+        beego.ControllerComments{
+            Method: "TagCustomizeList",
+            Router: `/tag/list/custom`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"],
+        beego.ControllerComments{
+            Method: "MoveTag",
+            Router: `/tag/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"],
+        beego.ControllerComments{
+            Method: "TagSave",
+            Router: `/tag/save`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"],
+        beego.ControllerComments{
+            Method: "SubCategoryNameList",
+            Router: `/tag/subCategoryName/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserController"],
         beego.ControllerComments{
             Method: "Add",

+ 1 - 0
routers/router.go

@@ -146,6 +146,7 @@ func init() {
 				&cygx.TacticsTimeLineController{},
 				&cygx.ProductInteriorController{},
 				&cygx.BannerCoAntroller{},
+				&cygx.TagManagementController{},
 			),
 		),
 		web.NSNamespace("/advisory",

+ 112 - 0
services/cygx/cygx_tag.go

@@ -0,0 +1,112 @@
+package cygx
+
+import (
+	"errors"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+// MoveCygxTag 移动标签
+func MoveCygxTag(tagId, prevTagId, nextTagId int) (err error, errMsg string) {
+	tagInfo, err := cygx.GetCygxTagByTagId(tagId)
+	if err != nil {
+		errMsg = `获取数据失败`
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = `该标签未入库`
+			err = nil
+		}
+		return
+	}
+
+	//移动排序
+	updateCol := make([]string, 0)
+	var currentSort, prevSort, nextSort int
+	currentSort = tagInfo.Sort
+	//如果有传入 上一个节点分类id
+	var prevIndex *cygx.CygxTag
+	var nextIndex *cygx.CygxTag
+	if prevTagId > 0 {
+		prevIndex, err = cygx.GetCygxTagByTagId(prevTagId)
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				errMsg = "移动失败"
+				err = errors.New("上一个节点标签信息不存在" + err.Error())
+				return
+			}
+			errMsg = "移动失败"
+			err = errors.New("获取上一个节点标签信息失败,Err:" + err.Error())
+			return
+		}
+		prevSort = prevIndex.Sort
+	}
+
+	if nextTagId > 0 {
+		//下一个节点
+		nextIndex, err = cygx.GetCygxTagByTagId(nextTagId)
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				errMsg = "移动失败"
+				err = errors.New("下一个节点标签信息不存在" + err.Error())
+				return
+			}
+			errMsg = "移动失败"
+			err = errors.New("获取下一个节点标签信息失败,Err:" + err.Error())
+			return
+		}
+		nextSort = nextIndex.Sort
+	}
+
+	// 修改历史数据中的排序为0的情况
+	if prevSort == 0 && nextSort == 0 { //目标是让当前分类处于目录的最顶部, 但是历史数据里下个节点的sort为0的情况
+		//更新为0排序的数据为当前最小排序
+		if nextIndex != nil {
+			minSort, e := cygx.GetCygxTagMinSort()
+			if e != nil {
+				errMsg = "移动失败"
+				err = errors.New("获取下一个节点分类信息失败,Err:" + e.Error())
+				return
+			}
+			if minSort > 1 {
+				minSort -= 1
+			}
+			nextIndex.Sort = minSort
+			err = nextIndex.Update([]string{"Sort"})
+			if err != nil {
+				errMsg = "移动失败"
+				err = errors.New("更新下一个节点分类信息失败,Err:" + err.Error())
+				return
+			}
+			nextSort = minSort
+		}
+	}
+	//移到两个排序值中间操作
+	if prevSort >= currentSort {
+		//往下移动
+		err = cygx.MoveDownCygxTagBySort(prevSort, currentSort)
+		if err != nil {
+			err = errors.New("向下移动出错:" + err.Error())
+			return
+		}
+		tagInfo.Sort = prevSort
+	} else if nextSort <= currentSort && nextSort != 0 {
+		//往上移动
+		err = cygx.MoveUpCygxTagBySort(nextSort, currentSort)
+		if err != nil {
+			err = errors.New("向上移动出错:" + err.Error())
+			return
+		}
+		tagInfo.Sort = nextSort
+	}
+
+	//更新
+	tagInfo.ModifyTime = time.Now()
+	updateCol = append(updateCol, "Sort", "ModifyTime")
+	err = tagInfo.Update(updateCol)
+	if err != nil {
+		errMsg = "移动失败"
+		err = errors.New("修改失败,Err:" + err.Error())
+		return
+	}
+	return
+}