xingzai 1 yıl önce
ebeveyn
işleme
6765b936ae

+ 1 - 1
controllers/cygx/activity.go

@@ -966,7 +966,7 @@ func (this *ActivityCoAntroller) ActivityList() {
 		return
 	}
 	if activeState == "NotStarted" {
-		condition += ` ORDER BY art.activity_time ASC `
+		condition += ` ORDER BY art.top_time DESC , art.activity_time ASC `
 	} else {
 		condition += ` ORDER BY art.activity_time DESC `
 	}

+ 158 - 1
controllers/cygx/morning_meeting_review.go

@@ -5,13 +5,17 @@ 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/system"
 	"hongze/hz_crm_api/services"
 	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/services/elastic"
 	"hongze/hz_crm_api/utils"
+	"os"
+	"path/filepath"
 	"strconv"
 	"strings"
 	"time"
@@ -95,6 +99,7 @@ func (this *MorningMeetingController) List() {
 		return
 	}
 
+	var meetingIds []int
 	for _, item := range list {
 		respItem := cygx.CygxMorningMeetingReviewItem{
 			Id:            item.Id,
@@ -108,9 +113,15 @@ func (this *MorningMeetingController) List() {
 		if item.Status == 1 {
 			respItem.PublishTime = item.PublishTime.Local().Format(utils.FormatDateTime)
 		}
-
+		meetingIds = append(meetingIds, item.Id)
 		resp.List = append(resp.List, &respItem)
 	}
+	//PvUv 数量
+	mapPv, mapUv := cygxService.GetCygxMorningMeetingReviewChapterHistoryPvUvMap(meetingIds)
+	for _, v := range resp.List {
+		v.Pv = mapPv[v.Id]
+		v.Uv = mapUv[v.Id]
+	}
 
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	resp.Paging = page
@@ -690,3 +701,149 @@ func (this *MorningMeetingController) Delete() {
 	br.Success = true
 	br.Msg = "删除成功"
 }
+
+// @Title  下载PV
+// @Description 下载PV接口
+// @Param   MeetingId   query   int  true       "晨会点评id"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @router /morningMeeting/list_pv [get]
+func (this *MorningMeetingController) ListPv() {
+	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
+	}
+	meetingId, _ := this.GetInt("MeetingId")
+	if meetingId < 1 {
+		br.Msg = "请输入晨会ID"
+		return
+	}
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+	var condition string
+	var pars []interface{}
+	condition = ` AND meeting_id = ?  ORDER BY id DESC  `
+	pars = append(pars, meetingId)
+	var respList []*cygx.CygxMorningMeetingReviewChapterHistoryResp
+
+	list, err := cygx.GetCygxMorningMeetingReviewChapterHistoryList(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	//超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
+	var isCanDownload bool
+	adminInfo, errAdmin := system.GetSysUserById(AdminUser.AdminId)
+	if errAdmin != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + errAdmin.Error()
+		return
+	}
+	if adminInfo.Role == "admin" || adminInfo.Role == "researcher" {
+		isCanDownload = true
+	}
+	//销售查看自己客户,销售组长查看组员
+	if 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
+	}
+	resp := cygx.CygxMorningMeetingReviewChapterHistoryResptListResp{
+		List: list,
+	}
+	//导出excel
+	if isExport {
+		MorningMeetingHistoryListExport(this, resp, br)
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+
+}
+
+// MorningMeetingHistoryListExport 导出Excel
+func MorningMeetingHistoryListExport(this *MorningMeetingController, resp cygx.CygxMorningMeetingReviewChapterHistoryResptListResp, br *models.BaseResponse) {
+	//创建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 = "阅读时间"
+
+	for _, item := range resp.List {
+		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
+	}
+	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 = "导出成功"
+}

+ 62 - 0
models/cygx/cygx_morning_meeting_review_chapter_history.go

@@ -0,0 +1,62 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type CygxMorningMeetingReviewChapterHistoryResp struct {
+	Id               int    `orm:"column(id);pk"`
+	ArticleId        int    `description:"文章ID"`
+	UserId           int    `description:"用户ID"`
+	CreateTime       string `description:"创建时间"`
+	Mobile           string `description:"手机号"`
+	Email            string `description:"邮箱"`
+	CompanyId        int    `description:"公司id"`
+	CompanyName      string `description:"公司名称"`
+	RealName         string `description:"用户实际名称"`
+	SellerName       string `description:"所属销售"`
+	SourcePage       string `description:"页面来源 微信、首页、展开"`
+	RegisterPlatform int    `description:"来源 1小程序,2:网页"`
+	ModifyTime       string `description:"更新时间"`
+	MeetingId        int    `description:"晨会ID"`
+}
+
+// Pv数据列表
+type CygxMorningMeetingReviewChapterHistoryResptListResp struct {
+	//Paging *paging.PagingItem `description:"分页数据"`
+	List []*CygxMorningMeetingReviewChapterHistoryResp
+}
+
+type ListPvUvResp struct {
+	ArticleId int `description:"文章ID"`
+	Pv        int `description:"pv"`
+	Uv        int `description:"pv"`
+}
+
+// 列表
+func GetCygxMorningMeetingReviewChapterHistoryPvUv(condition string, pars []interface{}) (items []*ListPvUvResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			COUNT( 1 ) AS pv,
+			COUNT( DISTINCT user_id ) AS uv,
+			meeting_id  as article_id
+		FROM
+			cygx_morning_meeting_review_chapter_history  WHERE 1 = 1  `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` GROUP BY meeting_id `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// 列表
+func GetCygxMorningMeetingReviewChapterHistoryList(condition string, pars []interface{}) (items []*CygxMorningMeetingReviewChapterHistoryResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_morning_meeting_review_chapter_history as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 2 - 0
models/cygx/cygx_morning_meeting_reviews.go

@@ -57,6 +57,8 @@ type CygxMorningMeetingReviewItem struct {
 	Status        int    `json:"status"`       // 0:未发布,1:已发布
 	PartNums      int    `json:"partNums"`     // 段落数
 	IndustryNames string `json:"industryName"` // 产业名称
+	Pv            int    `description:"PV"`
+	Uv            int    `description:"UV"`
 }
 
 type CygxMorningMeetingReviewsList struct {

+ 9 - 0
routers/commentsRouter.go

@@ -1978,6 +1978,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:MorningMeetingController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:MorningMeetingController"],
+        beego.ControllerComments{
+            Method: "ListPv",
+            Router: `/morningMeeting/list_pv`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:MorningMeetingController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:MorningMeetingController"],
         beego.ControllerComments{
             Method: "PreserveAndPublish",

+ 45 - 0
services/cygx/morning_meeting.go

@@ -0,0 +1,45 @@
+package cygx
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+)
+
+//func init() {
+//	fmt.Println(GetCygxMorningMeetingReviewChapterHistoryPvUvMap([]int{111}))
+//}
+
+// 根据ID获取pvUv
+func GetCygxMorningMeetingReviewChapterHistoryPvUvMap(articleIdArr []int) (mapPvResp, mapUvResp map[int]int) {
+	lenArr := len(articleIdArr)
+	if lenArr == 0 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("根据文章ID获取文章行业分类,信息失败,GetCygxArticlePerssionNameListMap Err:"+err.Error(), 3)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+
+	condition = ` AND  meeting_id IN (` + utils.GetOrmInReplace(lenArr) + `)`
+	pars = append(pars, articleIdArr)
+	list, e := cygx.GetCygxMorningMeetingReviewChapterHistoryPvUv(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetArticlList, Err: " + e.Error())
+		return
+	}
+	mapPvResp = make(map[int]int, 0)
+	mapUvResp = make(map[int]int, 0)
+	for _, v := range list {
+		mapPvResp[v.ArticleId] = v.Pv
+		mapUvResp[v.ArticleId] = v.Uv
+	}
+	return
+}