Browse Source

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

xingzai 1 năm trước cách đây
mục cha
commit
1c33a5be63

+ 44 - 12
controllers/company_apply.go

@@ -74,7 +74,7 @@ func (this *CompanyApplyController) ApplyContractHistoryList() {
 	//	raiPermissions = ps
 	//}
 
-	expMap := map[int]string{0: "(3w)", 1: "(5w)"} // 买方研选价格
+	//expMap := map[int]string{0: "(3w)", 1: "(5w)"} // 买方研选价格
 	for i := 0; i < listLen; i++ {
 		companyContract := list[i]
 		list[i].ModifyTimeStr = companyContract.ModifyTime.Format(utils.FormatDateTime)
@@ -120,6 +120,7 @@ func (this *CompanyApplyController) ApplyContractHistoryList() {
 			//	br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
 			//	return
 			//}
+			var expensiveYx int
 			hasPermissions, e := company.GetCompanyContractPermissionByCompanyContractId(companyContract.CompanyContractId)
 			if e != nil {
 				br.Msg = "获取失败"
@@ -129,6 +130,9 @@ func (this *CompanyApplyController) ApplyContractHistoryList() {
 			hasMap := make(map[int]*company.CompanyContractPermission)
 			for _, p := range hasPermissions {
 				hasMap[p.ChartPermissionId] = p
+				if p.ExpensiveYx > 0 {
+					expensiveYx = p.ExpensiveYx
+				}
 			}
 
 			checkItems := make([]*company.PermissionLookItem, 0)
@@ -155,7 +159,14 @@ func (this *CompanyApplyController) ApplyContractHistoryList() {
 				}
 				// 买方研选(3w/5w)
 				if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
-					n.PermissionName += expMap[match.ExpensiveYx]
+					if expensiveYx == 1 {
+						n.PermissionName += "(5w)"
+					} else if expensiveYx == 2 {
+						n.PermissionName += "(10w)"
+					} else if expensiveYx == 0 {
+						n.PermissionName += "(3w)"
+					}
+					//n.PermissionName += expMap[match.ExpensiveYx]
 					checkList = append(checkList, n.ChartPermissionId)
 					checkItems = append(checkItems, n)
 					continue
@@ -390,8 +401,8 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 		}
 		permissions := make([]int, 0) // 合同权限IDs
 		checkItems := make([]*company.PermissionLookItem, 0)
-		expMap := map[bool]string{false: "(3w)", true: "(5w)"} // 买方研选价格
-
+		//expMap := map[bool]string{false: "(3w)", true: "(5w)"} // 买方研选价格
+		var expensiveYx int
 		// 未选大套餐, 走老逻辑
 		if detail.RaiPackageType == 0 {
 			mapUpgrade := make(map[int]bool) // 通过合同获取所勾选的升级行业权限
@@ -400,8 +411,9 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 				if v.IsUpgrade == 1 {
 					mapUpgrade[v.ChartPermissionId] = true
 				}
-				if v.ExpensiveYx == 1 {
+				if v.ExpensiveYx > 0 {
 					mapExpensive[v.ChartPermissionId] = true
+					expensiveYx = v.ExpensiveYx
 				}
 				permissions = append(permissions, v.ChartPermissionId)
 			}
@@ -438,7 +450,12 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 					}
 					// 买方研选
 					if p.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
-						p.PermissionName += expMap[mapExpensive[p.ChartPermissionId]]
+						if expensiveYx == 1 {
+							p.PermissionName += "(5w)"
+						} else if expensiveYx == 2 {
+							p.PermissionName += "(10w)"
+						}
+						//p.PermissionName += expMap[mapExpensive[p.ChartPermissionId]]
 					}
 				}
 			}
@@ -474,7 +491,12 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 					continue
 				}
 				if n.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
-					n.PermissionName += expMap[mapExpensive[n.ChartPermissionId]]
+					//n.PermissionName += expMap[mapExpensive[n.ChartPermissionId]]
+					if expensiveYx == 1 {
+						n.PermissionName += "(5w)"
+					} else if expensiveYx == 2 {
+						n.PermissionName += "(10w)"
+					}
 				}
 				if utils.InArrayByInt(permissions, n.ChartPermissionId) {
 					checkList = append(checkList, n.ChartPermissionId)
@@ -1918,6 +1940,7 @@ func (this *CompanyApplyController) ApplyContract() {
 		//升级
 		mapUpgrade := make(map[int]int)
 		mapExpensive := make(map[int]bool)
+		var expensiveYx int
 		permissionList, err := company.GetCompanyContractPermissionByCompanyContractId(contractItem.CompanyContractId)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取失败"
@@ -1929,8 +1952,9 @@ func (this *CompanyApplyController) ApplyContract() {
 			if v.IsUpgrade == 1 {
 				mapUpgrade[v.ChartPermissionId] = v.ChartPermissionId
 			}
-			if v.ExpensiveYx == 1 {
+			if v.ExpensiveYx > 0 {
 				mapExpensive[v.ChartPermissionId] = true
+				expensiveYx = v.ExpensiveYx
 			}
 			permissionIds = append(permissionIds, v.ChartPermissionId)
 		}
@@ -1951,8 +1975,12 @@ func (this *CompanyApplyController) ApplyContract() {
 					checkList = append(checkList, n.ChartPermissionId+utils.PERMISSION_ID_UPGRADE)
 				} else {
 					if mapExpensive[n.ChartPermissionId] {
-						// 研选5w
-						checkList = append(checkList, n.ChartPermissionId+utils.PERMISSION_ID_YANXUAN_DIFF)
+						// 研选5w与10W
+						if expensiveYx == 1 {
+							checkList = append(checkList, n.ChartPermissionId+utils.PERMISSION_ID_YANXUAN_DIFF) // 5W
+						} else {
+							checkList = append(checkList, utils.PERMISSION_ID_YANXUAN_10W_DIFF) // 10W
+						}
 					} else {
 						// 非内部人员, 忽略掉已有的客观权限, 否则前端升级的反选会出现问题, 重新提交的时候只提交主观权限也有对应的处理
 						if !strings.Contains(n.Remark, "客观") {
@@ -1967,9 +1995,9 @@ func (this *CompanyApplyController) ApplyContract() {
 				//mapChartPermissionId[n.ChartPermissionId] = n.ChartPermissionId
 			}
 
-			// 买方研选3w/5w
+			// 买方研选3w/5w/10w
 			if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
-				m3, m5 := new(company.PermissionLookItem), new(company.PermissionLookItem)
+				m3, m5, m10 := new(company.PermissionLookItem), new(company.PermissionLookItem), new(company.PermissionLookItem)
 				m3.ChartPermissionId = n.ChartPermissionId
 				m3.PermissionName = fmt.Sprint(n.PermissionName, "(3w)")
 				plist.Items = append(plist.Items, m3)
@@ -1977,6 +2005,10 @@ func (this *CompanyApplyController) ApplyContract() {
 				m5.ChartPermissionId = n.ChartPermissionId + utils.PERMISSION_ID_YANXUAN_DIFF
 				m5.PermissionName = fmt.Sprint(n.PermissionName, "(5w)")
 				plist.Items = append(plist.Items, m5)
+
+				m10.ChartPermissionId = utils.PERMISSION_ID_YANXUAN_10W_DIFF
+				m10.PermissionName = fmt.Sprint(n.PermissionName, "(10w)")
+				plist.Items = append(plist.Items, m10)
 				continue
 			}
 

+ 8 - 0
controllers/company_apply_v2.go

@@ -451,6 +451,14 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 				continue
 			}
 
+			// 研选10w的处理
+			if permissionId == utils.PERMISSION_ID_YANXUAN_10W_DIFF {
+				//permissionIdsNew += strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + ","
+				strPermissionIdArr = append(strPermissionIdArr, strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN))
+				expensiveYx = 2
+				continue
+			}
+
 			if permissionId > utils.PERMISSION_ID_UPGRADE {
 				//permissionIdsNew += strconv.Itoa(permissionId-utils.PERMISSION_ID_UPGRADE) + ","
 				permissionIdOnly = permissionId - utils.PERMISSION_ID_UPGRADE

+ 6 - 2
controllers/company_permission.go

@@ -153,9 +153,9 @@ func (this *CompanyPermissionController) List() {
 					continue
 				}
 
-				// 买方研选划分为3w和5w
+				// 买方研选划分为3w和5w,10W三
 				if v.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
-					m3, m5 := new(company.PermissionSetItem), new(company.PermissionSetItem)
+					m3, m5, m10 := new(company.PermissionSetItem), new(company.PermissionSetItem), new(company.PermissionSetItem)
 					m3.ChartPermissionId = v.ChartPermissionId
 					m3.PermissionName = fmt.Sprint(v.PermissionName, "(3w)")
 					p.Items = append(p.Items, m3)
@@ -163,6 +163,10 @@ func (this *CompanyPermissionController) List() {
 					m5.ChartPermissionId = v.ChartPermissionId + utils.PERMISSION_ID_YANXUAN_DIFF
 					m5.PermissionName = fmt.Sprint(v.PermissionName, "(5w)")
 					p.Items = append(p.Items, m5)
+
+					m10.ChartPermissionId = utils.PERMISSION_ID_YANXUAN_10W_DIFF
+					m10.PermissionName = fmt.Sprint(v.PermissionName, "(10w)")
+					p.Items = append(p.Items, m10)
 					continue
 				}
 

+ 66 - 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 `
 	}
@@ -1637,3 +1637,68 @@ func (this *ActivityCoAntroller) ImgToText() {
 	br.Data = resp
 	br.IsAddLog = true
 }
+
+// @Title 活动的置顶与取消置顶
+// @Description 活动的发布与取消发布接口
+// @Param	request	body cygx.ActivityIdRep true "type json string"
+// @Success 200 操作成功
+// @router /activity/tope_change [post]
+func (this *ActivityCoAntroller) TopeChange() {
+	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
+	}
+	var req cygx.ActivityIdRep
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	activityId := req.ActivityId
+	activityInfo, errInfo := cygx.GetAddActivityInfoById(activityId)
+	if activityInfo == nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "活动ID错误,不存在activityId:" + strconv.Itoa(activityId)
+		return
+	}
+	if errInfo != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败,Err:" + errInfo.Error()
+		return
+	}
+	//校验活动后台管理员、销售是否有修改权限
+	havePower, popupMsg, err := cygxService.CheckActivityUpdatePower(AdminUser.AdminId, activityInfo)
+	if err != nil {
+		br.Msg = "获取管理员身份信息失败"
+		br.ErrMsg = "获取管理员身份信息失败,Err:" + err.Error()
+		return
+	}
+	if !havePower {
+		br.Msg = popupMsg
+		return
+	}
+	var topTime int
+	//如果有置顶时间就设为取消置顶,如果没有就写入当前置顶时间
+	if activityInfo.TopTime == 0 {
+		topTime = int(time.Now().Unix())
+	}
+	err = cygx.UpdateActivityTopTime(activityId, topTime)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+	br.IsAddLog = true //添加操作日志记录
+}

+ 8 - 5
controllers/cygx/contract_allocation.go

@@ -507,7 +507,7 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 	}
 
 	//var contractPermissionList []*company.ContractPermissionList
-	expMap := map[int]string{0: "(3w)", 1: "(5w)"} // 买方研选价格
+	expMap := map[int]string{0: "(3w)", 1: "(5w)", 2: "(10w)"} // 买方研选价格
 	hasPermissions, e := company.GetCompanyContractPermissionByCompanyContractId(companyContractId)
 	if e != nil {
 		br.Msg = "获取失败"
@@ -534,7 +534,7 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 		}
 
 		mapPermissionNameHave[n.PermissionName] = true
-		// 买方研选(3w/5w)
+		// 买方研选(3w/5w/10w)
 		if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
 			expensiveYx = match.ExpensiveYx
 			n.PermissionName += expMap[match.ExpensiveYx]
@@ -549,9 +549,10 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 		var moneyYx float64
 		if expensiveYx == 0 {
 			moneyYx = 3
-		}
-		if expensiveYx == 1 {
+		} else if expensiveYx == 1 {
 			moneyYx = 5
+		} else if expensiveYx == 2 {
+			moneyYx = 10
 		}
 		resp.TotalPointsContent = fmt.Sprint(resp.Money, "W,", "其中", moneyYx, "w默认归属买方研选,请对剩余", resp.Money-moneyYx, "w按照100%进行比值分配")
 		if showDetail {
@@ -733,10 +734,12 @@ func (this *ContractAllocationController) CompanyContracUpdate() {
 			continue
 		}
 
-		// 买方研选(3w/5w)
+		// 买方研选(3w/5w/10W)
 		if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
 			if match.ExpensiveYx == 1 {
 				money = money - 5
+			} else if match.ExpensiveYx == 2 {
+				money = money - 10
 			} else {
 				money = money - 3
 			}

+ 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 = "导出成功"
+}

+ 2 - 1
models/company/company_permission.go

@@ -104,7 +104,7 @@ type CompanyReportPermission struct {
 	Status                    string    `description:"'正式','试用','关闭'"`
 	ModifyTime                time.Time `description:"修改时间"`
 	IsUpgrade                 int       `description:"是否升级,1是,0否"`
-	ExpensiveYx               int       `description:"权益研选: 0-3w; 1-5w"`
+	ExpensiveYx               int       `description:"权益研选: 0-3w; 1-5w ,2: 10W"`
 }
 
 // 新增客户权限
@@ -162,6 +162,7 @@ type PermissionLookItem struct {
 	IsMerge            bool                  `description:"是否合并行业, 给前端的标识, 暂时仅权益使用"`
 	RaiBothHas         bool                  `description:"权益-是否主客观都有"`
 	IsUpgrade          int                   `description:"是否升级,1是,0否"`
+	ExpensiveYx        int                   `description:"权益研选: 0-3w; 1-5w ,2: 10W"`
 	Child              []*PermissionLookItem `description:"子权限"`
 }
 

+ 10 - 0
models/cygx/activity.go

@@ -170,6 +170,7 @@ type ActivityDetail struct {
 	ChartPermissionNameDeputy string                    `description:"副行业名称"`
 	BackgroundImg             string                    `description:"封面图片"`
 	ShareImg                  string                    `description:"分享图片"`
+	TopTime                   int                       `description:"置顶时间"`
 }
 
 type ActivityDetailRep struct {
@@ -567,6 +568,7 @@ type CygxActivityList struct {
 	IsShowSigninButton        bool   `description:"是否展示签到码按钮"`
 	SigninImg                 string `description:"签到码图片"`
 	ChartPermissionNameDeputy string `description:"副行业名称"`
+	TopTime                   int    `description:"置顶时间"`
 }
 
 type GetCygxActivityListRep struct {
@@ -704,3 +706,11 @@ type AliyunOcrTextActivityResp struct {
 type AliyunOcrTextActivityListResp struct {
 	List []*AliyunOcrTextActivityResp
 }
+
+// 更新活动置顶时间
+func UpdateActivityTopTime(activityId, topTime int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` UPDATE cygx_activity SET  top_time=? WHERE activity_id=?`
+	_, err = o.Raw(sql, topTime, activityId).Exec()
+	return
+}

+ 1 - 1
models/cygx/activity_special_trip.go

@@ -143,7 +143,7 @@ type GetAppointmentSpecialListRsep struct {
 
 func GetCygxActivitySpecialTripList(activityId int, condition string) (item []*CygxActivitySpecialTripResp, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
-	sql := `SELECT s.*
+	sql := `SELECT s.*,
 					a.activity_time,
 					a.special_type
 			FROM

+ 8 - 0
models/cygx/activity_video.go

@@ -44,6 +44,7 @@ type CygxActivityVideoListResp struct {
 	VideoCounts          int    `description:"播放量"`
 	VideoDuration        string `description:"视频时长"`
 	CommentNum           int    `description:"留言总数"`
+	VideoUrl             string `description:"视频地址"`
 }
 
 type CygxActivityVideoListRep struct {
@@ -196,3 +197,10 @@ func DeleteCygxActivityVideo(activityId int) (err error) {
 	_, err = o.Raw(sql, activityId).Exec()
 	return
 }
+
+func Updatevideo_url(video_url string, video_id int) (err error) {
+	sql := `UPDATE cygx_activity_video SET video_url =? WHERE video_id=? `
+	o := orm.NewOrmUsingDB("hz_cygx")
+	_, err = o.Raw(sql, video_url, video_id).Exec()
+	return
+}

+ 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 {

+ 18 - 0
routers/commentsRouter.go

@@ -565,6 +565,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityCoAntroller"],
+        beego.ControllerComments{
+            Method: "TopeChange",
+            Router: `/activity/tope_change`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityLossCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityLossCoAntroller"],
         beego.ControllerComments{
             Method: "CompanyList",
@@ -1969,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",

+ 11 - 1
services/company_permission.go

@@ -70,6 +70,8 @@ func RaiCompanyPermissionAndCheckList(companyId int, unify bool) (resp *company.
 			if v.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN && strings.Contains("正式,永续", v.Status) {
 				if p.ExpensiveYx == 1 {
 					v.PermissionName = fmt.Sprint(v.PermissionName, "(5w)")
+				} else if p.ExpensiveYx == 2 {
+					v.PermissionName = fmt.Sprint(v.PermissionName, "(10w)")
 				} else {
 					v.PermissionName = fmt.Sprint(v.PermissionName, "(3w)")
 				}
@@ -295,13 +297,21 @@ func CheckCompanyUpgradeV2(strPermissionIds string, isRai bool) (newPermissions
 			continue
 		}
 		// 买方研选5w
-		if p > utils.PERMISSION_ID_YANXUAN_DIFF {
+		if p > utils.PERMISSION_ID_YANXUAN_DIFF && p < utils.PERMISSION_ID_YANXUAN_10W_DIFF {
 			o := p - utils.PERMISSION_ID_YANXUAN_DIFF
 			expensiveMap[o] = 1
 			existsId[o] = true
 			newPermissionArr = append(newPermissionArr, strconv.Itoa(o))
 			continue
 		}
+		// 买方研选10w
+		if p == utils.PERMISSION_ID_YANXUAN_10W_DIFF {
+			o := utils.PERMISSION_ID_YANXUAN_10W_DIFF
+			expensiveMap[o] = 1
+			existsId[o] = true
+			newPermissionArr = append(newPermissionArr, strconv.Itoa(o))
+			continue
+		}
 		// 非升级权限
 		existsId[p] = true
 		newPermissionArr = append(newPermissionArr, strconv.Itoa(p))

+ 25 - 0
services/cygx/activity_ocr.go

@@ -183,6 +183,8 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 				return
 			}
 			go UpdateResourceData(int(newId), utils.CYGX_OBJ_ACTIVITYVOICE, "add", activityInfo.ActivityTime) // 把活动音频的数据添加到 cygx_resource_data 表
+
+			go SendWxMsgWithUpdateActivityVideoAndVoice(activityId, itemVoice.VoiceName) //  已结束的活动上传音频或视频后给已关注这个活动关联的产业的正式、试用 客户发送模板信息
 		} else {
 			e = cygx.UpdateCygxActivityVoice(itemVoice)
 			if e != nil {
@@ -201,6 +203,10 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 			err = errors.New("GetActivityVideoCount" + e.Error())
 			return
 		}
+		//视频文件更换阿里云oss地址 避免卡顿
+		var newOssUrl string
+		newOssUrl = strings.Replace(itemVideo.VideoUrl, "https://hzstatic.hzinsights.com", "https://hzchart.oss-accelerate.aliyuncs.com", -1)
+		itemVideo.VideoUrl = newOssUrl
 		//如果等于0就新增,反之就修改
 		if total == 0 {
 			newId, e := cygx.AddCygxActivityVideo(itemVideo)
@@ -209,6 +215,8 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 				return
 			}
 			go UpdateResourceData(int(newId), utils.CYGX_OBJ_ACTIVITYVIDEO, "add", activityInfo.ActivityTime) // 把活动视频的数据添加到 cygx_resource_data 表
+
+			go SendWxMsgWithUpdateActivityVideoAndVoice(activityId, itemVideo.VideoName) //  已结束的活动上传音频或视频后给已关注这个活动关联的产业的正式、试用 客户发送模板信息
 		} else {
 			e = cygx.UpdateCygxActivityVideo(itemVideo)
 			if e != nil {
@@ -251,3 +259,20 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 	}
 	return
 }
+
+//func init() {
+//	var conditionupload string
+//	var pars []interface{}
+//	listVideo, err := cygx.GetActivityVideoList(conditionupload, pars)
+//	if err != nil {
+//		fmt.Println(err)
+//	}
+//	for _, v := range listVideo {
+//		var newOssUrl string
+//		newOssUrl = strings.Replace(v.VideoUrl, "https://hzstatic.hzinsights.com", "https://hzchart.oss-accelerate.aliyuncs.com", -1)
+//		fmt.Println(newOssUrl)
+//		err = cygx.Updatevideo_url(newOssUrl, v.VideoId)
+//
+//		//return
+//	}
+//}

+ 115 - 0
services/cygx/activity_wx_msg.go

@@ -4,6 +4,7 @@ import (
 	"errors"
 	"fmt"
 	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/services"
 	"hongze/hz_crm_api/services/alarm_msg"
@@ -192,3 +193,117 @@ func SendWxMsgWithCygxActivitySignUpBySell(items []*cygx.CygxSignupUser) (err er
 	}
 	return
 }
+
+// 已结束的活动上传音频或视频后给已关注这个活动关联的产业的正式、试用 客户发送模板信息
+func SendWxMsgWithUpdateActivityVideoAndVoice(activityId int, fileName string) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("已结束的活动上传音频或视频后给已关注这个活动关联的产业的正式、试用 客户发送模板信息失败,Err:"+err.Error()+";activityId:", activityId), 3)
+			//utils.FileLogCygx.Info(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg))
+		}
+	}()
+	activityInfo, e := cygx.GetAddActivityInfoById(activityId)
+	if e != nil {
+		err = errors.New("活动不存在, Err: " + e.Error())
+		return
+	}
+	if activityInfo == nil {
+		return
+	}
+	industrialList, e := cygx.GetIndustrialActivityGroupListByactivityIds(strconv.Itoa(activityId))
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetIndustrialActivityGroupListByactivityIds: " + e.Error())
+		return
+	}
+
+	//if len(industrialList) == 0 {
+	//	return
+	//}
+
+	var industrialManagementIds []int
+
+	for _, v := range industrialList {
+		industrialManagementIds = append(industrialManagementIds, v.IndustrialManagementId)
+	}
+	lenindustrialManagementIds := len(industrialManagementIds)
+	if lenindustrialManagementIds == 0 {
+		return
+	}
+
+	var condition string
+	var pars []interface{}
+
+	//获取试用正式权益客户
+	condition = "  AND product_id = 2 AND `status` IN('正式','试用')  "
+	listCompany, e := company.GetCompanyProductList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyProductList, Err: " + e.Error())
+		return
+	}
+	var companyIds []int
+	for _, v := range listCompany {
+		companyIds = append(companyIds, v.CompanyId)
+	}
+	lencompanyIds := len(companyIds)
+	if lencompanyIds == 0 {
+		return
+	}
+
+	//根据产业关注ID,与有权限的公司ID获取对应的用户列表
+	condition = " AND  industrial_management_id IN (" + utils.GetOrmInReplace(lenindustrialManagementIds) + ")  AND company_id IN (" + utils.GetOrmInReplace(lencompanyIds) + ") "
+	pars = append(pars, industrialManagementIds, companyIds)
+	userFllowList, e := cygx.GetCygxIndustryFllowList(condition, pars, 0, 0)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxIndustryFllowList, Err: " + e.Error())
+		return
+	}
+
+	//获取这些用户的手机号
+	var mobileArr []string
+	for _, v := range userFllowList {
+		mobileArr = append(mobileArr, v.Mobile)
+	}
+	mobileLen := len(mobileArr)
+	if mobileLen == 0 {
+		return
+	}
+
+	openIdList, e := cygx.GetUserRecordListByMobileArr(mobileArr)
+	if e != nil {
+		err = errors.New("GetWxOpenIdBList, Err: " + e.Error())
+		return
+	}
+	if len(openIdList) == 0 {
+		return
+	}
+	openIdArr := make([]string, len(openIdList))
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+
+	keyword1 := fileName
+	keyword2 := "路演回放已发布,欢迎查看"
+	keyword3 := ""
+	keyword4 := ""
+
+	redirectUrl := utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId)
+	sendInfo := new(services.SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+
+	sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(activityId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE
+	sendInfo.OpenIdArr = openIdArr
+	e = services.SendTemplateMsg(sendInfo)
+	if e != nil {
+		err = errors.New("SendTemplateMsg, Err: " + e.Error())
+		return
+	}
+	return
+}

+ 4 - 0
services/cygx/contract_allocation.go

@@ -64,6 +64,8 @@ func GetCompanyContractPermissionNameMapById(companyContractIds []int) (mapContr
 			if v.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
 				if v.ExpensiveYx == 1 {
 					mapContractIdPerssion[(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(5w),"
+				} else if v.ExpensiveYx == 2 {
+					mapContractIdPerssion[(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(10w),"
 				} else {
 					mapContractIdPerssion[(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(3w),"
 				}
@@ -213,6 +215,8 @@ func HandleAllocationCompanyContractByYanXuan(companyContractId int) (err error)
 		}
 		if v.ExpensiveYx == 1 {
 			expensiveYxmoney = 5
+		} else if v.ExpensiveYx == 2 {
+			expensiveYxmoney = 10
 		} else {
 			expensiveYxmoney = 3
 		}

+ 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
+}

+ 1 - 0
utils/constants.go

@@ -400,6 +400,7 @@ const (
 	TPL_MSG_WANG_YANG                              = "tpl_msg_wang_yang"                //汪洋手机号地址参数
 	MicroRoadshowDefaultImgKey                     = "micro_roadshow_default_img"       // 音视频封面图
 	PERMISSION_ID_YANXUAN_DIFF                     = 20000                              // 买方研选区分3w和5w的差值
+	PERMISSION_ID_YANXUAN_10W_DIFF                 = 20032                              // 买方研选区分10W
 	ZHUAN_JIA_NAME                          string = "专家"
 	ZHUAN_JIA_ID                            int    = 29
 	CHART_PERMISSION_NAME_70W                      = "70w大套餐" // 权益70w大套餐名称