소스 검색

Merge branch 'master' of http://8.136.199.33:3000/hongze/hz_crm_api into crm/13.9

xingzai 1 년 전
부모
커밋
19efa194cc

+ 5 - 3
controllers/company.go

@@ -136,7 +136,7 @@ func (this *CompanyController) SearchList() {
 		item := list[i]
 		itemStatus := item.Status
 		//白嫖客户标记
-		if _, ok := scroungeMap[item.CompanyId]; ok{
+		if _, ok := scroungeMap[item.CompanyId]; ok {
 			item.IsScrounge = 1
 		}
 		if !strings.Contains(item.Status, "/") {
@@ -969,6 +969,8 @@ func (this *CompanyController) List() {
 				} else {
 					sortStr = " ORDER BY b.try_out_day_total "
 				}
+			} else if sortParam == "closeTime" {
+				sortStr = " ORDER BY b.close_time "
 			} else {
 				br.Msg = "获取失败"
 				br.ErrMsg = "排序字段传入数据异常:" + sortParam
@@ -1739,7 +1741,7 @@ func (this *CompanyController) List() {
 		scroungeMap[v.CompanyId] = 1
 	}
 	for i, v := range companyLists {
-		if _, ok := scroungeMap[v.CompanyId]; ok{
+		if _, ok := scroungeMap[v.CompanyId]; ok {
 			companyLists[i].IsScrounge = 1
 		}
 	}
@@ -3393,7 +3395,7 @@ func (this *CompanyController) Detail() {
 	for _, v := range scroungeList {
 		scroungeMap[v.CompanyId] = 1
 	}
-	if _, ok := scroungeMap[item.CompanyId]; ok{
+	if _, ok := scroungeMap[item.CompanyId]; ok {
 		item.IsScrounge = 1
 	}
 

+ 25 - 3
controllers/company_apply_v2.go

@@ -519,8 +519,15 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 		br.ErrMsg = "客户状态为:" + companyProduct.Status + ";不可进行转正申请"
 		return
 	}
+
+	companyItem, e := company.GetCompanyById(req.CompanyId)
+	if e != nil {
+		br.Msg = "客户信息有误"
+		br.ErrMsg = "获取客户信息失败, Err: " + e.Error()
+		return
+	}
 	//客户归属判断
-	if companyProduct.SellerId != sysUser.AdminId {
+	if companyProduct.SellerId != sysUser.AdminId && companyItem.ShareSellerId != sysUser.AdminId {
 		br.Msg = "客户信息异常"
 		br.ErrMsg = "客户信息异常,不是当前所属销售,客户所属销售:" + companyProduct.SellerName + ";当前销售:" + sysUser.AdminName
 		return
@@ -1397,12 +1404,19 @@ func (this *CompanyApplyController) ApplyThaw() {
 		return
 	}
 
+	companyItem, e := company.GetCompanyById(req.CompanyId)
+	if e != nil {
+		br.Msg = "客户信息有误"
+		br.ErrMsg = "获取客户信息失败, Err: " + e.Error()
+		return
+	}
 	//客户归属判断
-	if companyProduct.SellerId != sysUser.AdminId {
+	if companyProduct.SellerId != sysUser.AdminId && companyItem.ShareSellerId != sysUser.AdminId {
 		br.Msg = "客户信息异常"
 		br.ErrMsg = "客户信息异常,不是当前所属销售,客户所属销售:" + companyProduct.SellerName + ";当前销售:" + sysUser.AdminName
 		return
 	}
+
 	// CRM8.8(仅针对权益客户)-此处同申请试用的逻辑
 	if companyProduct.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
 		reportPermissions, e := company.GetCompanyReportPermission(req.CompanyId, utils.COMPANY_PRODUCT_RAI_ID)
@@ -1643,12 +1657,20 @@ func (this *CompanyApplyController) ApplyDelay() {
 		br.Msg = "存在待审批订单,不可重复提交"
 		return
 	}
+
+	companyItem, e := company.GetCompanyById(req.CompanyId)
+	if e != nil {
+		br.Msg = "客户信息有误"
+		br.ErrMsg = "获取客户信息失败, Err: " + e.Error()
+		return
+	}
 	//客户归属判断
-	if companyProduct.SellerId != sysUser.AdminId {
+	if companyProduct.SellerId != sysUser.AdminId && companyItem.ShareSellerId != sysUser.AdminId {
 		br.Msg = "客户信息异常"
 		br.ErrMsg = "客户信息异常,不是当前所属销售,客户所属销售:" + companyProduct.SellerName + ";当前销售:" + sysUser.AdminName
 		return
 	}
+
 	// CRM8.8(仅针对权益客户)-申请延期的权限不再进行选择, 而是自动将所有的试用权限延期
 	if companyProduct.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
 		reportPermissions, e := company.GetCompanyReportPermission(req.CompanyId, utils.COMPANY_PRODUCT_RAI_ID)

+ 185 - 30
controllers/cygx/activity.go

@@ -85,10 +85,30 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
+
+	//处理识图建会的会议信息列表 因为活动发布处理的业务逻辑过多,方便后期统一维护这里 根据 list 数据类型自己拼接 活动的 body  查研观向 11.12
+	listImgToText := req.ListImgToText
+
+	if len(listImgToText) > 0 {
+		var errmsg string
+		req, err, errmsg = cygxService.MakeActivityReqText(listImgToText)
+		if err != nil {
+			br.Msg = "识图建会失败!"
+			br.ErrMsg = "参数解析失败,Err:" + err.Error()
+			return
+		}
+		if errmsg != "" {
+			br.Msg = "识图建会失败," + errmsg
+			br.ErrMsg = "识图建会失败," + errmsg
+			return
+		}
+	}
 	if req.Body == "" {
 		br.Msg = "内容不可为空"
 		return
 	}
+
+	//return
 	//不限制人数的,强制改为全部客户可见
 	if req.LimitPeopleNum == 0 {
 		req.VisibleRange = 2
@@ -364,7 +384,6 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 		}
 		itemPointsSet = itemResp
 	}
-
 	for k, v := range slice {
 		//如果内容不存在 时间:字段则不予处理
 		if strings.Contains(v, "时间:") || strings.Contains(v, "时间:") {
@@ -423,7 +442,14 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 			item.IsYidongConduct = req.IsYidongConduct
 			item.IsCanOutboundCall = req.IsCanOutboundCall
 			item.IsNeedEmail = isNeedEmail
-			item.SiginupDeadline = siginupDeadline
+
+			if len(listImgToText) > 0 {
+				resultTime := utils.StrTimeToTime(item.ActivityTime)                                       //时间字符串格式转时间格式
+				item.SiginupDeadline = resultTime.AddDate(0, 0, -1).Format(utils.FormatDate) + " 15:30:00" //批量建会报名截止之前默认:活动前一天15:30:00
+			} else {
+				item.SiginupDeadline = siginupDeadline
+			}
+
 			if isResearchPoints == 1 {
 				item.IsResearchPoints = 1
 			}
@@ -624,7 +650,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 					item.AdminName = activityInfo.AdminName
 					item.PublishDate = utils.StrTimeToTime(activityInfo.PublishDate)
 				}
-				//音频
+				//音频 目前只有一个
 				itemVoice := new(cygx.CygxActivityVoice)
 				//var itemVoiceList []*cygx.CygxActivityVoice
 				if len(voiceList) > 0 {
@@ -633,6 +659,8 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 						itemVoice.VoiceName = vo.Name
 						itemVoice.VoiceUrl = vo.Url
 						itemVoice.VoicePlaySeconds = vo.PlaySeconds
+						itemVoice.BackgroundImg = req.BackgroundImg
+						itemVoice.ShareImg = req.ShareImg
 						itemVoice.CreateTime = time.Now()
 					}
 				}
@@ -643,50 +671,58 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 					itemVideo.ActivityId = activityId
 					itemVideo.VideoDuration = videoDetail.VideoDuration
 					itemVideo.VideoUrl = videoDetail.VideoUrl
+					itemVideo.BackgroundImg = req.BackgroundImg
+					itemVideo.ShareImg = req.ShareImg
 					itemVideo.ModifyDate = time.Now().Format(utils.FormatDateTime)
 					itemVideo.CreateTime = time.Now().Format(utils.FormatDateTime)
 				}
 				//删除原有的视频数据
 				//if itemVideo.VideoUrl != "" {
-				videoDetail, err := cygx.GetCygxActivityVideoReqDetail(activityId)
-				if err != nil && err.Error() != utils.ErrNoRow() {
-					br.Msg = "获取信息失败"
-					br.ErrMsg = "GetCygxActivityVideoReqDetail,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
-					return
-				}
-				if videoDetail != nil {
-					go cygxService.UpdateResourceData(videoDetail.VideoId, "activityvideo", "delete", time.Now().Format(utils.FormatDateTime))
-				}
+				//videoDetail, err := cygx.GetCygxActivityVideoReqDetail(activityId)
+				//if err != nil && err.Error() != utils.ErrNoRow() {
+				//	br.Msg = "获取信息失败"
+				//	br.ErrMsg = "GetCygxActivityVideoReqDetail,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
+				//	return
 				//}
-
-				//if itemVoice.VoiceUrl != "" {
-				voiceReqList, err := cygx.GetCygxActivityVoiceReqList(activityId)
+				//if videoDetail != nil {
+				//	go cygxService.UpdateResourceData(videoDetail.VideoId, "activityvideo", "delete", time.Now().Format(utils.FormatDateTime))
+				//}
+				//}
+				//处理音视频上传
+				err := cygxService.UpdateActivityVideoAndVoice(activityInfo, itemVoice, itemVideo)
 				if err != nil && err.Error() != utils.ErrNoRow() {
 					br.Msg = "获取信息失败"
-					br.ErrMsg = "GetCygxActivityVoiceReqList,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
+					br.ErrMsg = "UpdateActivityVideoAndVoice,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
 					return
 				}
-				if len(voiceReqList) > 0 {
-					for _, voice := range voiceReqList {
-						go cygxService.UpdateResourceData(voice.ActivityVoiceId, "activityvoice", "delete", time.Now().Format(utils.FormatDateTime))
-					}
-				}
+				//if itemVoice.VoiceUrl != "" {
+				//voiceReqList, err := cygx.GetCygxActivityVoiceReqList(activityId)
+				//if err != nil && err.Error() != utils.ErrNoRow() {
+				//	br.Msg = "获取信息失败"
+				//	br.ErrMsg = "GetCygxActivityVoiceReqList,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
+				//	return
+				//}
+				//if len(voiceReqList) > 0 {
+				//	for _, voice := range voiceReqList {
+				//		go cygxService.UpdateResourceData(voice.ActivityVoiceId, "activityvoice", "delete", time.Now().Format(utils.FormatDateTime))
+				//	}
+				//}
 				//}
 				//如果活动信息有如下变更则做消息推送
-				voiceIdNew, videoIdNew, err := cygx.EditActivity(item, activityInfo.PublishStatus, industrialActivityItemsList, subjectActivityItemsList, itemVoice, itemVideo, itemPointsSet)
+				err = cygx.EditActivity(item, activityInfo.PublishStatus, industrialActivityItemsList, subjectActivityItemsList, itemPointsSet)
 				if err != nil {
 					br.Msg = "操作失败"
 					br.ErrMsg = "操作失败,Err:" + err.Error()
 					return
 				}
-				//更新活动音频
-				if int(voiceIdNew) > 0 {
-					go cygxService.UpdateResourceData(int(voiceIdNew), "activityvoice", "add", activityInfo.ActivityTime)
-				}
-				//更新活动视频
-				if int(videoIdNew) > 0 {
-					go cygxService.UpdateResourceData(int(videoIdNew), "activityvideo", "add", activityInfo.ActivityTime)
-				}
+				////更新活动音频
+				//if int(voiceIdNew) > 0 {
+				//	go cygxService.UpdateResourceData(int(voiceIdNew), "activityvoice", "add", activityInfo.ActivityTime)
+				//}
+				////更新活动视频
+				//if int(videoIdNew) > 0 {
+				//	go cygxService.UpdateResourceData(int(videoIdNew), "activityvideo", "add", activityInfo.ActivityTime)
+				//}
 
 				errAct = err
 				if activityInfo.PublishStatus == 1 && activityInfo.ActivityTimeText != item.ActivityTimeText {
@@ -1099,6 +1135,11 @@ func (this *ActivityCoAntroller) Detail() {
 	}
 	if len(VoiceReqList) == 0 {
 		VoiceReqList = make([]*cygx.CygxActivityVoiceReq, 0)
+	} else {
+		for _, v := range VoiceReqList {
+			activityInfo.BackgroundImg = v.BackgroundImg
+			activityInfo.ShareImg = v.ShareImg
+		}
 	}
 	VideoDetail, err := cygx.GetCygxActivityVideoReqDetail(activityId)
 	if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1106,6 +1147,10 @@ func (this *ActivityCoAntroller) Detail() {
 		br.ErrMsg = "GetCygxActivityVideoReqDetail,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
 		return
 	}
+	if VideoDetail != nil {
+		activityInfo.BackgroundImg = VideoDetail.BackgroundImg
+		activityInfo.ShareImg = VideoDetail.ShareImg
+	}
 	if activityInfo.CustomerTypeIds != "" {
 		customerTypeIdslist := strings.Split(activityInfo.CustomerTypeIds, ",")
 		var permissionValueStr string
@@ -1148,6 +1193,20 @@ func (this *ActivityCoAntroller) Detail() {
 	if activityInfo.VisibleRange == 0 {
 		activityInfo.VisibleRange = 2
 	}
+
+	////如果是已结束的活动,而且封面图片为空,那么就给一个默认的图片
+	//if activityInfo.ActiveState == 3 && activityInfo.BackgroundImg == "" {
+	//	// 获取默认图配置 目前音频视频用的是同一个封面图,暂时不做区分处理
+	//	audioMap, _, audioShareMap, _, err := cygxService.GetMicroRoadShowDefaultImgConfig()
+	//	if err != nil && err.Error() != utils.ErrNoRow() {
+	//		br.Msg = "获取信息失败"
+	//		br.ErrMsg = "GetMicroRoadShowDefaultImgConfig,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
+	//		return
+	//	}
+	//	activityInfo.BackgroundImg = audioMap[activityInfo.ChartPermissionId]
+	//	activityInfo.ShareImg = audioShareMap[activityInfo.ChartPermissionId]
+	//}
+
 	//activityInfo.CancelDeadlineType = cygxService.ActivityCancelDeadlineType(activityInfo) //处理活动取消报名截止时间类型展示
 	activityInfo.VoiceList = VoiceReqList
 	activityInfo.VideoDetail = VideoDetail
@@ -1474,3 +1533,99 @@ func (this *ActivityCoAntroller) DeadlineSet() {
 	br.Success = true
 	br.Data = list
 }
+
+// @Title 根据图片获取建会信息接口
+// @Description 根据图片获取建会信息接口
+// @Param   request	body cygx.ActivityIdRep true "type json string"
+// @Success Ret=200
+// @router /activity/imgToText [post]
+func (this *ActivityCoAntroller) ImgToText() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req cygx.AliyunOcrImgUrlReq
+	resp := new(cygx.AliyunOcrTextActivityListResp)
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	imgUrl := req.ImgUrl
+	if imgUrl == "" {
+		br.Msg = "请上传图片"
+		return
+	}
+
+	ocrResp, err := services.AliOcrByImageToText(imgUrl)
+	if err != nil {
+		br.Msg = "图片解析失败!"
+		br.ErrMsg = "图片解析失败,Err:" + err.Error()
+		return
+	}
+	if len(ocrResp.Ret) == 0 {
+		br.Msg = "图片解析失败!"
+		return
+	}
+
+	var titmeYMD string
+	var titmeHM string
+	var company string
+	var list []*cygx.AliyunOcrTextActivityResp
+	var mapTitmeYMD = make(map[int]string)
+	var mapTitmeHM = make(map[int]string)
+	var mapCompany = make(map[int]string)
+	var lineNum int
+	for k, v := range ocrResp.Ret {
+		if k == 0 && !strings.Contains(v.Word, "/") {
+			continue
+		}
+		if strings.Contains(v.Word, "/") {
+			mapTitmeYMD[lineNum] = v.Word
+			titmeYMD = v.Word
+		}
+		if strings.Contains(v.Word, "AM") || strings.Contains(v.Word, "PM") {
+			mapTitmeHM[lineNum] = v.Word
+			titmeHM = v.Word
+		}
+		if strings.Contains(v.Word, "(") && strings.Contains(v.Word, ")") {
+			if mapTitmeYMD[lineNum] == "" {
+				mapTitmeYMD[lineNum] = mapTitmeYMD[lineNum-1]
+			}
+			titmeYMD = mapTitmeYMD[lineNum]
+			mapCompany[lineNum] = v.Word
+			company = v.Word
+			lineNum++
+
+		}
+		if titmeYMD != "" && titmeHM != "" && company != "" {
+			item := new(cygx.AliyunOcrTextActivityResp)
+			item.TitmeYMD = titmeYMD
+			item.TitmeHM = titmeHM
+			item.Company = company
+			list = append(list, item)
+			titmeYMD = ""
+			titmeHM = ""
+			company = ""
+		}
+	}
+
+	for _, v := range list {
+		v.TitmeYMD = cygxService.ConvertActivityTitmeYMD(v.TitmeYMD)
+		v.TitmeHM = cygxService.ConvertActivityTitmeHM(v.TitmeHM)
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Data = resp
+	br.IsAddLog = true
+}

+ 63 - 0
controllers/cygx/activity_video.go

@@ -1,6 +1,7 @@
 package cygx
 
 import (
+	"encoding/json"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"github.com/tealeg/xlsx"
@@ -343,3 +344,65 @@ func (this *ActivityVideoCoAntroller) CommentList() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// @Title 获取音视频上传之后的封面图
+// @Description 获取音视频上传之后的封面图
+// @Param   ActivityId   query   int  true       "活动ID"
+// @Param   FileType   query   int  true       "音视频文件类型 。1:音频。2:视频"
+// @Success 200 {object} cygx.ChartPermissionRepMoreList
+// @router /activityVideo/video_and_voice/img [get]
+func (this *ActivityVideoCoAntroller) VideoAndVoice() {
+	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
+	}
+	activityId, _ := this.GetInt("ActivityId")
+	fileType, _ := this.GetInt("FileType")
+	if activityId < 1 {
+		br.Msg = "请输入活动ID"
+		return
+	}
+	activityInfo, err := cygx.GetAddActivityInfoById(activityId)
+	if err != nil {
+		br.Msg = "活动不存在"
+		br.ErrMsg = "活动ID错误,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
+		return
+	}
+	//key := utils.MicroRoadshowDefaultImgKey
+	conf, err := cygx.GetCygxConfigDetailByCode("activity_video_default_img")
+	if err != nil {
+		br.Msg = "获取微路演默认图配置失败" + err.Error()
+		return
+	}
+	list := new(cygx.ActivityVideoDefaultImgList)
+	if err = json.Unmarshal([]byte(conf.ConfigValue), &list); err != nil {
+		br.Msg = "微路演默认图配置配置值解析失败" + err.Error()
+		return
+	}
+	resp := new(cygx.ActivityVideoDefaultImgListResp)
+	if fileType == 1 {
+		for _, v := range list.Audio {
+			if v.ChartPermissionId == activityInfo.ChartPermissionId {
+				resp.List = v.List
+			}
+		}
+	} else {
+		for _, v := range list.Video {
+			if v.ChartPermissionId == activityInfo.ChartPermissionId {
+				resp.List = v.List
+			}
+		}
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 64 - 0
controllers/cygx/apply_record.go

@@ -6,7 +6,9 @@ import (
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
+	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/utils"
+	"strconv"
 )
 
 // 权益小程序
@@ -65,6 +67,19 @@ func (this *ApplyRecordController) ListSysRole() {
 		}
 	}
 
+	//权益申请销售只能看到自己名下的客户的申请 查研观向11.1
+	companyIds, err := cygxService.GetAdminLookUserCompanyIds(sysUser)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+		return
+	}
+	lencompanyIds := len(companyIds)
+	if lencompanyIds > 0 {
+		condition = ` AND a.company_id_pay  IN (` + utils.GetOrmInReplace(lencompanyIds) + `)`
+		pars = append(pars, companyIds)
+	}
+
 	total, err := cygx.GetCygxApplyRecordCount(condition, pars)
 	if err != nil {
 		br.Msg = "获取失败"
@@ -78,6 +93,33 @@ func (this *ApplyRecordController) ListSysRole() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+
+	var microvideoIds []int
+	for _, v := range list {
+		if v.Source == "roadshow" {
+			microvideoIds = append(microvideoIds, v.SourceId)
+		}
+	}
+	lenmicrovideoIds := len(microvideoIds)
+	mapmicrovideoChartPermissionId := make(map[int]int) //产业视频ID所对应的行业ID
+	mapmicrovideoIndustryId := make(map[int]int)        //产业视频ID所对应的行业ID
+	if lenmicrovideoIds > 0 {
+		var conditionmicrovideo string
+		var parsmicrovideo []interface{}
+		conditionmicrovideo = ` AND video_id IN (` + utils.GetOrmInReplace(lenmicrovideoIds) + `)`
+		parsmicrovideo = append(parsmicrovideo, microvideoIds)
+		listmicrovideo, err := cygx.GetMicroRoadshowVideoList(conditionmicrovideo, "", parsmicrovideo, 0, lenmicrovideoIds)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取数据失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range listmicrovideo {
+			mapmicrovideoChartPermissionId[v.VideoId] = v.ChartPermissionId
+			mapmicrovideoIndustryId[v.VideoId] = v.IndustryId
+		}
+	}
+
 	for i, v := range list {
 		if list[i].SellerName == "/" {
 			list[i].SellerName = ""
@@ -122,7 +164,29 @@ func (this *ApplyRecordController) ListSysRole() {
 		case 2:
 			list[i].ApplicationSource += "(络町)"
 		}
+
+		switch v.Source {
+		case "article": //文章详情
+			list[i].HttpUrl = utils.CYGX_WEB_URL + "/material/info/" + strconv.Itoa(v.SourceId)
+		case "activity": //活动详情
+			list[i].HttpUrl = utils.CYGX_WEB_URL + "/activity/detail/" + strconv.Itoa(v.SourceId)
+		case "activityvoice": //活动音频详情
+			list[i].HttpUrl = utils.CYGX_WEB_URL + "/activity/detail/" + strconv.Itoa(v.SourceId)
+		case "activityvideo": //活动视频详情
+			list[i].HttpUrl = utils.CYGX_WEB_URL + "/activity/detail/" + strconv.Itoa(v.SourceId)
+		case "productinterior": //产品内测
+			list[i].HttpUrl = utils.CYGX_WEB_URL + "/internal/article/" + strconv.Itoa(v.SourceId)
+		case "roadshow": //产业视频
+			list[i].HttpUrl = utils.CYGX_WEB_URL + "/indepth/info/" + strconv.Itoa(mapmicrovideoChartPermissionId[v.SourceId]) + "/" + strconv.Itoa(mapmicrovideoIndustryId[v.SourceId])
+		case "researchsummary": //本周研究汇总
+			list[i].HttpUrl = utils.CYGX_WEB_URL + "/summary/2/" + strconv.Itoa(v.SourceId)
+		case "minutessummary": //上周纪要汇总
+			list[i].HttpUrl = utils.CYGX_WEB_URL + "/summary/1/" + strconv.Itoa(v.SourceId)
+		case "reportselection": //报告精选(重点公司)
+			list[i].HttpUrl = utils.CYGX_WEB_URL + "/recent/" + strconv.Itoa(v.SourceId)
+		}
 	}
+
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	resp := new(cygx.CygxApplyRecordListResp)
 	resp.List = list

+ 45 - 8
controllers/cygx/report_selection.go

@@ -124,6 +124,7 @@ func (this *ReportSelectionController) PreserveAndPublish() {
 		item.IndustrialManagementId = v.IndustrialManagementId
 		item.OverviewArticleId = v.OverviewArticleId
 		item.IsNew = v.IsNew
+		item.IsShowOverviewArticle = v.IsShowOverviewArticle
 		if len(v.CompanyLabel) > 0 {
 			item.CompanyLabel = cygxService.ArticleComPanyLabelToStr(v.CompanyLabel)
 		}
@@ -168,9 +169,9 @@ func (this *ReportSelectionController) PreserveAndPublish() {
 			return
 		}
 	}
-	if req.DoType == 1 {
-		//cygxService.DoThisWeekLastWeekWxTemplateMsg(itemCrs.Title, itemCrs.PublishDate.Format(utils.FormatDateTime), itemCrs.ProductDescription, req.ArticleId, 1)
-	}
+	//if req.DoType == 1 {
+	//cygxService.DoThisWeekLastWeekWxTemplateMsg(itemCrs.Title, itemCrs.PublishDate.Format(utils.FormatDateTime), itemCrs.ProductDescription, req.ArticleId, 1)
+	//}
 	//生成音频文件
 	//articleId := req.ArticleId
 	//existMap := make(map[int]int)
@@ -341,11 +342,6 @@ func (this *ReportSelectionController) Detail() {
 			}
 		}
 	}
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
 
 	//获取关联的文章信息
 	mapArticle := make(map[int]string)
@@ -1000,6 +996,7 @@ func (this *ReportSelectionController) History() {
 				item := new(cygx.HistoryReportSelectionLogResp)
 				item.SubjectName = v2.SubjectName
 				item.IndustrialSubjectId = v2.IndustrialSubjectId
+				item.IsNew = v2.IsNew
 				item.Count = mapSubjectHistory[v2.IndustrialSubjectId]
 				resp.Count += item.Count
 				v.List = append(v.List, item)
@@ -1012,3 +1009,43 @@ func (this *ReportSelectionController) History() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// @Title  报告精选申请记录
+// @Description  报告精选申请记录接口
+// @Param   ArticleId   query   int  true       "报告Id"
+// @Success Ret=200 {object} cygx.DetailCygxReportSelectionRep
+// @router /reportSelection/tarryList [get]
+func (this *ReportSelectionController) RarryList() {
+	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
+	}
+	articleId, _ := this.GetInt("ArticleId")
+	resp := new(cygx.CygxReportSelectionLogApplyListResp)
+	var condition string
+	var pars []interface{}
+	condition = " AND article_id = ? ORDER  BY create_time DESC  "
+	pars = append(pars, articleId)
+	list, err := cygx.GetCygxReportSelectionLogApplyRespList(condition, pars, 0, 0)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		return
+	}
+	if len(list) == 0 {
+		list = make([]*cygx.CygxReportSelectionLogApplyResp, 0)
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 197 - 0
controllers/eta_business/eta_business_menu.go

@@ -0,0 +1,197 @@
+package eta_business
+
+import (
+	"encoding/json"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/eta_business"
+	etaBusinessService "hongze/hz_crm_api/services/eta_business"
+)
+
+// EtaBusinessMenuController ETA商家菜单
+type EtaBusinessMenuController struct {
+	controllers.BaseAuthController
+}
+
+// List
+// @Title 商家菜单列表
+// @Description 商家菜单列表
+// @Param   BusinessId	query	int	false	"商家ID"
+// @Success 200 Ret=200 获取成功
+// @router /menu/list [get]
+func (this *EtaBusinessMenuController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		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(eta_business.EtaBusinessMenuListResp)
+	resp.ChoiceList = make([]int, 0)
+	resp.HalfChoiceList = make([]int, 0)
+	resp.List = make([]*eta_business.EtaBusinessMenuItem, 0)
+	// 权限校验
+	ok, e := etaBusinessService.CheckEtaBusinessOperateAuth(sysUser.RoleTypeCode)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作权限校验失败, ErrMsg: " + e.Error()
+		return
+	}
+	if !ok {
+		br.Data = resp
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+
+	// 商家勾选的权限
+	businessId, _ := this.GetInt("EtaBusinessId", 0)
+	if businessId > 0 {
+		relateOb := new(eta_business.EtaBusinessMenuRelate)
+		cond := ` AND eta_business_id = ?`
+		pars := make([]interface{}, 0)
+		pars = append(pars, businessId)
+		relates, e := relateOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取商家菜单关联列表失败, Err: " + e.Error()
+			return
+		}
+		for _, r := range relates {
+			if r.Type == 1 {
+				resp.HalfChoiceList = append(resp.HalfChoiceList, r.MenuId)
+				continue
+			}
+			resp.ChoiceList = append(resp.ChoiceList, r.MenuId)
+		}
+	}
+
+	menuOb := new(eta_business.EtaBusinessMenu)
+	order := `sort ASC, create_time DESC, menu_id DESC`
+	list, e := menuOb.GetItemsByCondition("", make([]interface{}, 0), []string{}, order)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取商家菜单列表失败, Err: " + e.Error()
+		return
+	}
+
+	items := make([]*eta_business.EtaBusinessMenuItem, 0)
+	for _, v := range list {
+		t := &eta_business.EtaBusinessMenuItem{
+			MenuId:       v.MenuId,
+			ParentId:     v.ParentId,
+			Name:         v.Name,
+			Sort:         v.Sort,
+			Path:         v.Path,
+			PathName:     v.PathName,
+			IconPath:     v.IconPath,
+			Component:    v.Component,
+			Hidden:       v.Hidden,
+			HiddenLayout: v.HiddenLayout,
+			Level:        v.Level,
+			MenuType:     v.MenuType,
+			ButtonCode:   v.ButtonCode,
+			Children:     make([]*eta_business.EtaBusinessMenuItem, 0),
+		}
+		items = append(items, t)
+	}
+
+	// 递归返回树形结构
+	items = etaBusinessService.GetMenuTreeRecursive(items, 0)
+
+	resp.List = items
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// SaveRelate
+// @Title 保存商家菜单关联
+// @Description 保存商家菜单关联
+// @Param	request	body eta_business.EtaBusinessAddReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /menu/relate/save [post]
+func (this *EtaBusinessMenuController) SaveRelate() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	// 操作权限校验
+	ok, e := etaBusinessService.CheckEtaBusinessOperateAuth(sysUser.RoleTypeCode)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作权限校验失败, ErrMsg: " + e.Error()
+		return
+	}
+	if !ok {
+		br.Msg = "无权操作"
+		return
+	}
+
+	// 参数校验
+	var req eta_business.EtaBusinessMenuRelateSaveReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if req.EtaBusinessId <= 0 {
+		br.Msg = "参数有误"
+		return
+	}
+	if len(req.MenuIds) == 0 {
+		br.Msg = "请选择菜单"
+		return
+	}
+
+	ob := new(eta_business.EtaBusinessMenuRelate)
+	items := make([]*eta_business.EtaBusinessMenuRelate, 0)
+	for _, v := range req.MenuIds {
+		t := new(eta_business.EtaBusinessMenuRelate)
+		t.MenuId = v
+		t.EtaBusinessId = req.EtaBusinessId
+		items = append(items, t)
+	}
+	for _, v := range req.HalfMenuIds {
+		t := new(eta_business.EtaBusinessMenuRelate)
+		t.MenuId = v
+		t.Type = 1
+		t.EtaBusinessId = req.EtaBusinessId
+		items = append(items, t)
+	}
+	if e := ob.CreateMulti(req.EtaBusinessId, items); e != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存商家菜单关联失败, Err: " + e.Error()
+		return
+	}
+
+	// TODO:后续需要生成SQL脚本文件
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 6 - 3
controllers/yb/apply_record.go

@@ -318,7 +318,7 @@ func (this *ApplyRecordController) UserApplyList() {
 		pars = append(pars, reqKeyword, reqKeyword, reqKeyword, reqKeyword, reqKeyword)
 	}
 	if markGroup != "" {
-		condition += `AND y.mark_group = `+"'"+markGroup+"'"
+		condition += `AND (y.mark_group = `+"'"+markGroup+"'"+ ` OR a.mark_group = `+"'"+markGroup+"')"
 	}
 	if startDate != "" {
 		startDate += " 00:00:00"
@@ -533,7 +533,7 @@ func (this *ApplyRecordController) ApplyExport() {
 	}()
 	reqKeyword := this.GetString("KeyWord")
 	reqState := this.GetString("States")
-
+	markGroup := this.GetString("MarkGroup")
 	sysUser := this.SysUser
 	if sysUser == nil {
 		br.Msg = "请登录"
@@ -580,6 +580,9 @@ func (this *ApplyRecordController) ApplyExport() {
 			condition += " AND y.apply_record_id is null"
 		}
 	}
+	if markGroup != "" {
+		condition += `AND (y.mark_group = `+"'"+markGroup+"'"+ ` OR a.mark_group = `+"'"+markGroup+"')"
+	}
 	startTime := "2022-01-01"
 	list, err := yb.GetApplyRecordListV2Export(condition, pars, startTime)
 	if err != nil {
@@ -954,7 +957,7 @@ func (this *ApplyRecordController) MarkGroup() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	if req.ApplyRecordId <= 0 && req.GroupName != "" && req.UserId != 0 {
+	if req.GroupName == "" || req.UserId == 0 {
 		br.Msg = "申请记录ID或者分组名异常"
 		br.ErrMsg = "申请记录ID或者分组名异常"
 		return

+ 7 - 5
go.mod

@@ -51,8 +51,9 @@ require (
 	github.com/alibabacloud-go/tea-utils v1.3.6 // indirect
 	github.com/alibabacloud-go/tea-xml v1.1.2 // indirect
 	github.com/aliyun/credentials-go v1.1.2 // indirect
-	github.com/andybalholm/cascadia v1.3.1 // indirect
+	github.com/andybalholm/cascadia v1.3.2 // indirect
 	github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211218165449-dd623ecc2f02 // indirect
+	github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 // indirect
 	github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d // indirect
@@ -92,6 +93,7 @@ require (
 	github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
 	github.com/sirupsen/logrus v1.9.0 // indirect
 	github.com/spf13/cast v1.5.0 // indirect
+	github.com/stevenyao/go-opencc v0.0.0-20161014062826-cc376a51b65e // indirect
 	github.com/stretchr/testify v1.8.1 // indirect
 	github.com/tidwall/gjson v1.14.1 // indirect
 	github.com/tidwall/match v1.1.1 // indirect
@@ -100,9 +102,9 @@ require (
 	github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect
 	github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect
 	golang.org/x/crypto v0.5.0 // indirect
-	golang.org/x/net v0.5.0 // indirect
-	golang.org/x/sys v0.4.0 // indirect
-	golang.org/x/text v0.6.0 // indirect
+	golang.org/x/net v0.9.0 // indirect
+	golang.org/x/sys v0.7.0 // indirect
+	golang.org/x/text v0.9.0 // indirect
 	golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect
 	google.golang.org/protobuf v1.28.1 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
@@ -111,4 +113,4 @@ require (
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 	xorm.io/builder v0.3.6 // indirect
 	xorm.io/core v0.7.2-0.20190928055935-90aeac8d08eb // indirect
-)
+)

+ 33 - 0
go.sum

@@ -84,6 +84,8 @@ github.com/aliyun/credentials-go v1.1.2 h1:qU1vwGIBb3UJ8BwunHDRFtAhS6jnQLnde/yk0
 github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw=
 github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
 github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
+github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
+github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
 github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211218165449-dd623ecc2f02 h1:o2oaBQGTzO+xNh12e7xWkphNe7H2DTiWv1ml9a2P9PQ=
 github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211218165449-dd623ecc2f02/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
 github.com/apache/thrift v0.12.0 h1:pODnxUFNcjP9UTLZGTdeh+j16A8lJbRvD3rOtrk/7bs=
@@ -92,6 +94,8 @@ github.com/astaxie/beego v1.12.3 h1:SAQkdD2ePye+v8Gn1r4X6IKZM1wd28EyUOVQ3PDSOOQ=
 github.com/astaxie/beego v1.12.3/go.mod h1:p3qIm0Ryx7zeBHLljmd7omloyca1s4yu1a8kM1FkpIA=
 github.com/aws/aws-sdk-go v1.42.23 h1:V0V5hqMEyVelgpu1e4gMPVCJ+KhmscdNxP/NWP1iCOA=
 github.com/aws/aws-sdk-go v1.42.23/go.mod h1:gyRszuZ/icHmHAVE4gc/r+cfCmhA1AD+vqfWbgI+eHs=
+github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ=
+github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394/go.mod h1:Q8n74mJTIgjX4RBBcHnJ05h//6/k6foqmgE45jTQtxg=
 github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA=
 github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
 github.com/beego/bee/v2 v2.0.4 h1:nEjPwxJ8D+cr54eWChJGoGRH7bJ7OQwbhx8rU0OQf7E=
@@ -494,6 +498,8 @@ github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
 github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM=
 github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec h1:q6XVwXmKvCRHRqesF3cSv6lNqqHi0QWOvgDlSohg8UA=
 github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
+github.com/stevenyao/go-opencc v0.0.0-20161014062826-cc376a51b65e h1:EScGwVsN5G1/xRUdOKtUGugKseKjvHrvA71486Q39zg=
+github.com/stevenyao/go-opencc v0.0.0-20161014062826-cc376a51b65e/go.mod h1:lHc78mZexRHu9CQrKCEO0CLFl7GN0Xpj3PH3jBJ5EpY=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
@@ -548,6 +554,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
 github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973 h1:iCnkJ/qjKZGdZnlcj1N55AxPDan814kpc3s1cDpQKd8=
 github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU=
 github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs=
@@ -574,6 +582,7 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
@@ -590,6 +599,9 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -606,14 +618,19 @@ golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/
 golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
 golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
 golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw=
 golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
+golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8=
@@ -625,7 +642,9 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -649,14 +668,22 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
 golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.4.0 h1:O7UWfv5+A2qiuulQk30kVinPoMtoIPeVaKLEgLpVkvg=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ=
+golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
@@ -665,6 +692,9 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=
 golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U=
@@ -681,6 +711,9 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
 golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

+ 54 - 38
models/cygx/activity.go

@@ -84,6 +84,9 @@ type ActivityRep struct {
 	List                    []*ActivityGroupIndustrialRep
 	VoiceList               []*CygxActivityVoiceReq
 	VideoDetail             *CygxActivityVideoReq
+	ListImgToText           []*AliyunOcrTextActivityResp `description:"识图建会的会议信息列表"`
+	BackgroundImg           string                       `description:"封面图片"`
+	ShareImg                string                       `description:"分享图片"`
 }
 
 // 活动添加、修改入参
@@ -165,6 +168,8 @@ type ActivityDetail struct {
 	PointsSet                 *CygxActivityPointsSetRsq `description:"研选扣点明细"`
 	IsShowHz                  int                       `description:"是否同时在弘则展示  1是,0否"`
 	ChartPermissionNameDeputy string                    `description:"副行业名称"`
+	BackgroundImg             string                    `description:"封面图片"`
+	ShareImg                  string                    `description:"分享图片"`
 }
 
 type ActivityDetailRep struct {
@@ -297,15 +302,16 @@ func AddActivity(items []*CygxActivity, industrialActivityItems [][]*CygxIndustr
 				}
 			}
 		}
-	}
 
-	{
-		//添加研选扣点内容
-		if itemPointsSet.PointsObject != "" {
-			itemPointsSet.ActivityId = int(newId)
-			_, err = to.Insert(itemPointsSet)
-			if err != nil {
-				return
+		{
+			//添加研选扣点内容
+			if itemPointsSet.PointsObject != "" {
+				itemPointsSet.ActivityId = int(newId)
+				itemPointsSet.Id = 0 // 二次插入的时候主键被赋值了
+				_, err = to.Insert(itemPointsSet)
+				if err != nil {
+					return
+				}
 			}
 		}
 	}
@@ -329,7 +335,7 @@ func GetAddActivityInfoById(ActivityId int) (item *ActivityDetail, err error) {
 }
 
 // 修改
-func EditActivity(item *CygxActivity, oldPublishStatus int, industrialActivityItems [][]*CygxIndustrialActivityGroupManagement, subjectActivityItems [][]*CygxIndustrialActivityGroupSubject, itemVoice *CygxActivityVoice, itemVideo *CygxActivityVideo, itemPointsSet *CygxActivityPointsSet) (voiceId, videoId int64, err error) {
+func EditActivity(item *CygxActivity, oldPublishStatus int, industrialActivityItems [][]*CygxIndustrialActivityGroupManagement, subjectActivityItems [][]*CygxIndustrialActivityGroupSubject, itemPointsSet *CygxActivityPointsSet) (err error) {
 	o := orm.NewOrm()
 	to, err := o.Begin()
 	if err != nil {
@@ -458,37 +464,37 @@ func EditActivity(item *CygxActivity, oldPublishStatus int, industrialActivityIt
 
 	//音频处理
 	//删除旧的音频
-	sql = "DELETE FROM cygx_activity_voice WHERE activity_id=?"
-	_, err = to.Raw(sql, activityId).Exec()
-	//插入新的音频
-	//if len(itemVoiceList) > 0 {
-	//	voiceId, err := to.InsertMulti(len(itemVoiceList), itemVoiceList)
-	//	if err != nil {
-	//		return
+	//sql = "DELETE FROM cygx_activity_voice WHERE activity_id=?"
+	//_, err = to.Raw(sql, activityId).Exec()
+	////插入新的音频
+	////if len(itemVoiceList) > 0 {
+	////	voiceId, err := to.InsertMulti(len(itemVoiceList), itemVoiceList)
+	////	if err != nil {
+	////		return
+	////	}
+	////}
+	//if itemVoice != nil {
+	//	if itemVoice.VoiceUrl != "" {
+	//		voiceId, err = to.Insert(itemVoice)
+	//		if err != nil {
+	//			return
+	//		}
+	//	}
+	//}
+	//
+	////视频处理
+	////删除旧的视频
+	//sql = "DELETE FROM cygx_activity_video WHERE activity_id=?"
+	//_, err = to.Raw(sql, activityId).Exec()
+	////插入新的音频
+	//if itemVideo != nil {
+	//	if itemVideo.VideoUrl != "" {
+	//		videoId, err = to.Insert(itemVideo)
+	//		if err != nil {
+	//			return
+	//		}
 	//	}
 	//}
-	if itemVoice != nil {
-		if itemVoice.VoiceUrl != "" {
-			voiceId, err = to.Insert(itemVoice)
-			if err != nil {
-				return
-			}
-		}
-	}
-
-	//视频处理
-	//删除旧的视频
-	sql = "DELETE FROM cygx_activity_video WHERE activity_id=?"
-	_, err = to.Raw(sql, activityId).Exec()
-	//插入新的音频
-	if itemVideo != nil {
-		if itemVideo.VideoUrl != "" {
-			videoId, err = to.Insert(itemVideo)
-			if err != nil {
-				return
-			}
-		}
-	}
 
 	{
 		//处理研选扣点子表
@@ -742,3 +748,13 @@ func UpdateCygxActivitySigninImg(signinImg string, activityId int) (err error) {
 	_, err = o.Raw(sql, signinImg, activityId).Exec()
 	return
 }
+
+type AliyunOcrTextActivityResp struct {
+	TitmeYMD string `description:"时间年月日"`
+	TitmeHM  string `description:"时间时分"`
+	Company  string `description:"公司名称"`
+}
+
+type AliyunOcrTextActivityListResp struct {
+	List []*AliyunOcrTextActivityResp
+}

+ 74 - 0
models/cygx/activity_video.go

@@ -3,6 +3,7 @@ package cygx
 import (
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
 )
 
 type CygxActivityVideo struct {
@@ -13,6 +14,8 @@ type CygxActivityVideo struct {
 	VideoDuration string `description:"视频时长"`
 	VideoCounts   int    `description:"播放量"`
 	VideoUrl      string `description:"视频地址"`
+	BackgroundImg string `description:"封面图片"`
+	ShareImg      string `description:"分享图片"`
 	CreateTime    string `description:"创建时间"`
 }
 
@@ -20,6 +23,8 @@ type CygxActivityVideoReq struct {
 	VideoName     string `description:"视频名称"`
 	VideoDuration string `description:"视频时长"`
 	VideoUrl      string `description:"视频地址"`
+	BackgroundImg string `description:"封面图片"`
+	ShareImg      string `description:"分享图片"`
 }
 
 // 活动详情
@@ -46,6 +51,33 @@ type CygxActivityVideoListRep struct {
 	List   []*CygxActivityVideoListResp
 }
 
+// 添加
+func AddCygxActivityVideo(item *CygxActivityVideo) (newId int64, err error) {
+	o := orm.NewOrm()
+	newId, err = o.Insert(item)
+	return
+}
+
+// 修改
+func UpdateCygxActivityVideo(item *CygxActivityVideo) (err error) {
+	to := orm.NewOrm()
+	updateParams := make(map[string]interface{})
+	updateParams["VideoName"] = item.VideoName
+	updateParams["VideoDuration"] = item.VideoDuration
+	updateParams["VideoUrl"] = item.VideoUrl
+	updateParams["BackgroundImg"] = item.BackgroundImg
+	updateParams["ShareImg"] = item.ShareImg
+	updateParams["ModifyDate"] = time.Now()
+	ptrStructOrTableName := "cygx_activity_video"
+	whereParam := map[string]interface{}{"activity_id": item.ActivityId}
+	qs := to.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	return
+}
+
 // 获取数量
 func GetActivityVideoCount(condition string, pars []interface{}) (count int, err error) {
 	sqlCount := ` SELECT
@@ -122,3 +154,45 @@ func GetActivityVideoList(condition string, pars []interface{}) (items []*CygxAc
 	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
+
+// MicroRoadShowDefaultImgList 微路演行业默认背景图列表
+type MicroRoadShowDefaultImgList struct {
+	Audio []*MicroRoadShowDefaultImg `description:"音频"`
+	Video []*MicroRoadShowDefaultImg `description:"视频"`
+}
+
+// MicroRoadShowDefaultImg 微路演行业默认背景图
+type MicroRoadShowDefaultImg struct {
+	ChartPermissionId   int    `description:"行业ID"`
+	ChartPermissionName string `description:"行业名称"`
+	ImgUrl              string `description:"背景图"`
+	ShareImg            string `description:"分享图"`
+}
+
+// MicroRoadShowDefaultImgList 微路演行业默认背景图列表
+type ActivityVideoDefaultImgList struct {
+	Audio []*ActivityVideoDefaultImg `description:"音频"`
+	Video []*ActivityVideoDefaultImg `description:"视频"`
+}
+
+type ActivityVideoDefaultImg struct {
+	ChartPermissionId int `description:"行业ID"`
+	List              []*MicroRoadShowDefaultImg
+}
+
+type ActivityVideoDefaultImgListResp struct {
+	List []*MicroRoadShowDefaultImg
+}
+
+type ActivityVideoDefaultImgResp struct {
+	BackgroundImg string `description:"封面图片"`
+	ShareImg      string `description:"分享图"`
+}
+
+// 删除数据
+func DeleteCygxActivityVideo(activityId int) (err error) {
+	o := orm.NewOrm()
+	sql := ` DELETE FROM cygx_activity_video WHERE  activity_id= ? `
+	_, err = o.Raw(sql, activityId).Exec()
+	return
+}

+ 51 - 0
models/cygx/activity_voice.go

@@ -12,6 +12,8 @@ type CygxActivityVoice struct {
 	VoiceUrl         string    `description:"音频地址"`
 	VoiceName        string    `description:"音频名称"`
 	VoicePlaySeconds string    `description:"音频时长"`
+	BackgroundImg    string    `description:"封面图片"`
+	ShareImg         string    `description:"分享图片"`
 	CreateTime       time.Time `description:"创建时间"`
 }
 
@@ -21,12 +23,53 @@ type CygxActivityVoiceReq struct {
 	Name            string `description:"音频名称"`
 	PlaySeconds     string `description:"音频时长"`
 	ActivityVoiceId int    `description:"活动音频ID"`
+	BackgroundImg   string `description:"封面图片"`
+	ShareImg        string `description:"分享图片"`
+}
+
+// 添加
+func AddCygxActivityVoice(item *CygxActivityVoice) (newId int64, err error) {
+	o := orm.NewOrm()
+	newId, err = o.Insert(item)
+	return
+}
+
+// 修改
+func UpdateCygxActivityVoice(item *CygxActivityVoice) (err error) {
+	to := orm.NewOrm()
+	updateParams := make(map[string]interface{})
+	updateParams["VoiceName"] = item.VoiceName
+	updateParams["VoicePlaySeconds"] = item.VoicePlaySeconds
+	updateParams["VoiceUrl"] = item.VoiceUrl
+	updateParams["BackgroundImg"] = item.BackgroundImg
+	updateParams["ShareImg"] = item.ShareImg
+	ptrStructOrTableName := "cygx_activity_voice"
+	whereParam := map[string]interface{}{"activity_id": item.ActivityId}
+	qs := to.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	return
+}
+
+// 获取数量
+func GetCygxActivityVoiceCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity_voice  WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
 }
 
 // 列表
 func GetCygxActivityVoiceReqList(activityId int) (items []*CygxActivityVoiceReq, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT 
+			background_img,
+			share_img,
 			activity_voice_id,
 			voice_url AS url,
 			voice_name AS name,
@@ -52,3 +95,11 @@ func GetCygxActivityVoiceReqDetail(activityId int) (item *CygxActivityVoice, err
 	err = o.Raw(sql, activityId).QueryRow(&item)
 	return
 }
+
+// 删除数据
+func DeleteCygxActivityVoice(activityId int) (err error) {
+	o := orm.NewOrm()
+	sql := ` DELETE FROM cygx_activity_voice WHERE  activity_id= ? `
+	_, err = o.Raw(sql, activityId).Exec()
+	return
+}

+ 23 - 0
models/cygx/aliyun_ocr_log.go

@@ -0,0 +1,23 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type AliyunOcrImgUrlReq struct {
+	ImgUrl string `description:"图片地址"`
+}
+
+type AliyunOcrLog struct {
+	Id         int       `orm:"column(id);pk"`
+	ImgUrl     string    `description:"图片地址"`
+	Result     string    `description:"手机号"`
+	CreateTime time.Time `description:"创建时间"`
+}
+
+func AddAliyunOcrLog(item *AliyunOcrLog) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	_, err = o.Insert(item)
+	return
+}

+ 36 - 2
models/cygx/apply_record.go

@@ -30,9 +30,43 @@ type CygxApplyRecord struct {
 	RegisterPlatform         int    `description:"来源 1小程序,2:网页"`
 	InviteCompanySource      int    `description:"三方来源 ,1:弘则本身,2:络町"`
 	ApplicationSource        string `description:"申请来源"`
+	SourceId                 int    `description:"资源ID"`
+	Source                   string `description:"资源类型 报告 :article 、图表 :newchart、微路演 :roadshow、活动 :activity、活动视频:activityvideo、活动音频:activityvoice、专项调研活动:activityspecial"`
+	Title                    string `description:"标题"`
 }
 
-func GetCygxApplyRecord(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxApplyRecord, err error) {
+type CygxApplyRecordResp struct {
+	ApplyRecordId            int    `orm:"column(apply_record_id);pk" description:"申请试用id"`
+	BusinessCardUrl          string `description:"名片地址"`
+	RealName                 string `description:"姓名"`
+	CompanyName              string `description:"公司名称"`
+	Mobile                   string `description:"手机号"`
+	CreateTime               string `description:"创建时间"`
+	ApplyMethod              int    `description:"1:已付费客户申请试用,2:非客户申请试用"`
+	Status                   int    `description:"0:未处理,1:已处理"`
+	DealTime                 string `description:"处理时间"`
+	Email                    string `description:"邮箱"`
+	SellerName               string `description:"销售"`
+	CompanyIdPay             int    `description:"1:为潜在客户,大于1现有客户"`
+	InviteeMobile            string `description:"邀请人手机号"`
+	InviteeCompany           string `description:"邀请人公司名称"`
+	InviteeCompanyId         string `description:"邀请人公司ID"`
+	ApplySource              string `description:"申请来源"`
+	InviteeEmail             string `description:"邀请人邮箱"`
+	IsInviteeComanyExistence bool   `description:"邀请公司是否还存在"`
+	InviteeCompanyNum        int    `description:"邀请公司是否还存在(辅助字段)"`
+	CompanyIdType            int    `description:"用户状态,1:潜在客户 、2:现有客户 、3:FICC客户 、4:现有客户(正式,无对应权限) 、5:现有客户(试用,无对应权限)  、6:现有客户(试用暂停) 、7:现有客户(冻结) 、8:现有客户(流失) "`
+	CompanyIdTypeName        string `description:"用户状态,1:潜在客户 、2:现有客户 、3:FICC客户 、4:现有客户(正式,无对应权限) 、5:现有客户(试用,无对应权限)  、6:现有客户(试用暂停) 、7:现有客户(冻结) 、8:现有客户(流失) "`
+	RegisterPlatform         int    `description:"来源 1小程序,2:网页"`
+	InviteCompanySource      int    `description:"三方来源 ,1:弘则本身,2:络町"`
+	ApplicationSource        string `description:"申请来源"`
+	SourceId                 int    `description:"资源ID"`
+	Source                   string `description:"资源类型 报告 :article 、图表 :newchart、微路演 :roadshow、活动 :activity、活动视频:activityvideo、活动音频:activityvoice、专项调研活动:activityspecial"`
+	Title                    string `description:"标题"`
+	HttpUrl                  string `description:"跳转地址"`
+}
+
+func GetCygxApplyRecord(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxApplyRecordResp, err error) {
 	o := orm.NewOrm()
 
 	sql := ` SELECT DISTINCT a.*,i.invitee_mobile,i.invitee_company,i.invitee_email,invitee_company_id, GROUP_CONCAT(b.seller_name ORDER BY b.product_id ASC SEPARATOR '/') AS seller_name,c.email,(SELECT COUNT(1) FROM company WHERE company_id =invitee_company_id ) as invitee_company_num
@@ -71,7 +105,7 @@ GROUP_CONCAT(b.seller_name ORDER BY b.product_id ASC SEPARATOR '/') AS seller_na
 }
 
 type CygxApplyRecordListResp struct {
-	List   []*CygxApplyRecord
+	List   []*CygxApplyRecordResp
 	Paging *paging.PagingItem `description:"分页数据"`
 }
 

+ 1 - 1
models/cygx/report_article.go

@@ -1272,7 +1272,7 @@ type CygxCelueArticleHistoryRecord struct {
 
 func GetCygxCelueArticleHistoryRecordPvAll(articleIds string) (item []*ArticleHistoryRep, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM cygx_article_history_record_all as  h WHERE article_id IN ( ` + articleIds + ` )  AND   h.is_del = 0   AND h.platfor = 2 `
+	sql := `SELECT * FROM cygx_article_history_record_all as  h WHERE article_id IN ( ` + articleIds + ` )  AND   h.is_del = 0  AND h.company_id != 16   AND h.platfor = 2  `
 	sql += ` ORDER BY create_time DESC  `
 	_, err = o.Raw(sql).QueryRows(&item)
 	return

+ 2 - 0
models/cygx/report_selection.go

@@ -51,6 +51,7 @@ type CygxReportSelectionRep struct {
 	ReportLink         string `description:"报告链接"`
 	VisibleRange       int    `description:"设置可见范围1全部,0内部"`
 	IsSendWxMsg        int    `description:"是否推送过微信模版消息,1是,0否"`
+	ApplyTotal         int    `description:"申请路演的数量"`
 }
 
 type CygxReportSelectionListRep struct {
@@ -116,6 +117,7 @@ type HistoryReportSelectionLogResp struct {
 	IndustrialSubjectId string `description:"标的ID"`
 	SubjectName         string `description:"标的名称"`
 	Count               int    `description:"数量"`
+	IsNew               int    `description:"是否为New标签"`
 }
 
 type ReportSelectionId struct {

+ 4 - 0
models/cygx/report_selection_log.go

@@ -17,6 +17,7 @@ type CygxReportSelectionLog struct {
 	CompanyLabel           string    `description:"公司标签多个用{|}隔开"`
 	OverviewArticleId      int       `description:"关联的综述报告ID"`
 	IsNew                  int       `description:"是否为New标签"`
+	IsShowOverviewArticle  int       `description:"是否展示综述报告 1展示,0隐藏"`
 }
 
 type CygxReportSelectionLogRep struct {
@@ -41,6 +42,7 @@ type AddCygxReportSelectionLog struct {
 	Label                    string   `description:"公司标签"`
 	OverviewArticleId        int      `description:"综述报告Id"`
 	IsNew                    int      `description:"是否为New标签"`
+	IsShowOverviewArticle    int      `description:"是否展示综述报告 1展示,0隐藏"`
 }
 
 type CygxReportSelectionLogResp struct {
@@ -56,6 +58,7 @@ type CygxReportSelectionLogResp struct {
 	OverviewArticleId        int      `description:"综述报告Id"`
 	OverviewArticleTitle     string   `description:"综述报告标题"`
 	IsNew                    int      `description:"是否为New标签"`
+	IsShowOverviewArticle    int      `description:"是否展示综述报告 1展示,0隐藏"`
 	ChartPermissionSort      int      `description:"品种排序"`
 }
 
@@ -110,6 +113,7 @@ type CygxReportSelectionLoglist struct {
 	SubjectName            string    `description:"标的名称"`
 	IcoLink                string    `orm:"column(image_url)"description:"图标链接"`
 	OverviewArticleId      int       `description:"关联的综述报告ID"`
+	IsNew                  int       `description:"是否为New标签"`
 }
 
 // 列表

+ 54 - 0
models/cygx/report_selection_log_apply.go

@@ -0,0 +1,54 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type CygxReportSelectionLogApplyResp struct {
+	ReportSelectionLogApplyId int `orm:"column(report_selection_log_apply_id);pk"`
+	UserId                    int
+	CreateTime                string
+	Mobile                    string `description:"手机号"`
+	Email                     string `description:"邮箱"`
+	CompanyId                 int    `description:"公司id"`
+	CompanyName               string `description:"公司名称"`
+	RealName                  string `description:"用户实际名称"`
+	SellerName                string `description:"所属销售"`
+	RegisterPlatform          int    `description:"来源 1小程序,2:网页"`
+	ArticleId                 int    `description:"报告Id"`
+	IndustrialSubjectId       int    `description:"标的ID"`
+	SubjectName               string `description:"标的名称"`
+}
+
+type CygxReportSelectionLogApplyListResp struct {
+	List []*CygxReportSelectionLogApplyResp
+}
+
+// 获取数量
+func GetCygxReportSelectionLogApplyCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_report_selection_log_apply as art WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 列表
+func GetCygxReportSelectionLogApplyRespList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxReportSelectionLogApplyResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_report_selection_log_apply as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+
+	if startSize+pageSize > 0 {
+		sql += ` LIMIT ?,?  `
+		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	} else {
+		_, err = o.Raw(sql, pars).QueryRows(&items)
+	}
+
+	return
+}

+ 10 - 0
models/db.go

@@ -87,6 +87,13 @@ func init() {
 	fms_datadb, _ := orm.GetDB("fms")
 	fms_datadb.SetConnMaxLifetime(10 * time.Minute)
 
+	_ = orm.RegisterDataBase("hz_cygx", "mysql", utils.MYSQL_URL_CYGX)
+	orm.SetMaxIdleConns("hz_cygx", 50)
+	orm.SetMaxOpenConns("hz_cygx", 100)
+
+	cygx_db, _ := orm.GetDB("hz_cygx")
+	cygx_db.SetConnMaxLifetime(10 * time.Minute)
+
 	orm.Debug = true
 	orm.DebugLog = orm.NewLog(utils.Binlog)
 
@@ -434,6 +441,7 @@ func initCygx() {
 		new(cygx.CygxActivityPointsBill),
 		new(cygx.CygxActivityPointsCompany),
 		new(cygx.CygxTag),
+		new(cygx.AliyunOcrLog),
 	)
 }
 
@@ -653,6 +661,8 @@ func initEtaBusiness() {
 		new(eta_business.EtaBusiness),                // ETA商家表
 		new(eta_business.EtaBusinessContract),        // ETA合同表
 		new(eta_business.EtaBusinessOperationRecord), // ETA操作记录表
+		new(eta_business.EtaBusinessMenu),            // ETA商家菜单表
+		new(eta_business.EtaBusinessMenuRelate),      // ETA商家菜单关联表
 	)
 }
 

+ 147 - 0
models/eta_business/eta_business_menu.go

@@ -0,0 +1,147 @@
+package eta_business
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+	"time"
+)
+
+// EtaBusinessMenu ETA商家基础菜单表
+type EtaBusinessMenu struct {
+	MenuId       int       `orm:"column(menu_id);pk"`
+	ParentId     int       `description:"父级菜单ID"`
+	Name         string    `description:"菜单名称或者按钮名称"`
+	RootId       int       `description:"顶层菜单ID"`
+	Sort         string    `description:"排序"`
+	Path         string    `description:"路由地址"`
+	PathName     string    `description:"路由名称"`
+	IconPath     string    `description:"菜单图标地址"`
+	Component    int       `description:"组件路径"`
+	Hidden       int       `description:"是否隐藏:1-隐藏 0-显示"`
+	HiddenLayout int       `description:"是否隐藏layout:1-隐藏 0-显示"`
+	Level        int       `description:"菜单等级:1-2-3"`
+	IsLevel      int       `description:"是否为多级菜单:1,只有一级;2,有多级"`
+	LevelPath    string    `description:"兼容以前menu表的字段"`
+	MenuType     int       `description:"菜单类型: 0-菜单; 1-按钮; 2-字段(需要特殊处理)"`
+	ButtonCode   string    `description:"按钮/菜单唯一标识"`
+	CreateTime   time.Time `description:"创建时间"`
+	ModifyTime   time.Time `description:"更新时间"`
+}
+
+func (m *EtaBusinessMenu) TableName() string {
+	return "eta_business_menu"
+}
+
+func (m *EtaBusinessMenu) PrimaryId() string {
+	return "menu_id"
+}
+
+func (m *EtaBusinessMenu) Create() (err error) {
+	o := orm.NewOrm()
+	id, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.MenuId = int(id)
+	return
+}
+
+func (m *EtaBusinessMenu) CreateMulti(items []*EtaBusinessMenu) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+func (m *EtaBusinessMenu) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func (m *EtaBusinessMenu) Del() (err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	_, err = o.Raw(sql, m.MenuId).Exec()
+	return
+}
+
+func (m *EtaBusinessMenu) GetItemById(id int) (item *EtaBusinessMenu, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func (m *EtaBusinessMenu) GetItemByCondition(condition string, pars []interface{}) (item *EtaBusinessMenu, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s LIMIT 1`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+func (m *EtaBusinessMenu) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func (m *EtaBusinessMenu) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*EtaBusinessMenu, err error) {
+	o := orm.NewOrm()
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func (m *EtaBusinessMenu) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*EtaBusinessMenu, err error) {
+	o := orm.NewOrm()
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// EtaBusinessMenuListResp ETA商家菜单列表响应体
+type EtaBusinessMenuListResp struct {
+	ChoiceList     []int                  `description:"已选菜单"`
+	HalfChoiceList []int                  `description:"半选菜单-方便前端回显用的"`
+	List           []*EtaBusinessMenuItem `description:"菜单列表"`
+}
+
+// EtaBusinessMenuItem ETA商家菜单
+type EtaBusinessMenuItem struct {
+	MenuId       int
+	ParentId     int                    `description:"父级菜单ID"`
+	Name         string                 `description:"菜单名称或者按钮名称"`
+	RootId       int                    `description:"顶层菜单ID"`
+	Sort         string                 `description:"排序"`
+	Path         string                 `description:"路由地址"`
+	PathName     string                 `description:"路由名称"`
+	IconPath     string                 `description:"菜单图标地址"`
+	Component    int                    `description:"组件路径"`
+	Hidden       int                    `description:"是否隐藏:1-隐藏 0-显示"`
+	HiddenLayout int                    `description:"是否隐藏layout:1-隐藏 0-显示"`
+	Level        int                    `description:"菜单等级:1-2-3"`
+	MenuType     int                    `description:"菜单类型: 0-菜单; 1-按钮; 2-字段(需要特殊处理)"`
+	ButtonCode   string                 `description:"按钮/菜单唯一标识"`
+	Children     []*EtaBusinessMenuItem `description:"子菜单"`
+}

+ 133 - 0
models/eta_business/eta_business_menu_relate.go

@@ -0,0 +1,133 @@
+package eta_business
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+)
+
+// EtaBusinessMenuRelate ETA商家菜单关联表
+type EtaBusinessMenuRelate struct {
+	Id            int `orm:"column(id);pk"`
+	EtaBusinessId int `description:"商家ID"`
+	MenuId        int `description:"菜单ID"`
+	Type          int `description:"类型: 0-全选; 1-半选(此字段仅供前端回显做区分)"`
+}
+
+func (m *EtaBusinessMenuRelate) TableName() string {
+	return "eta_business_menu_relate"
+}
+
+func (m *EtaBusinessMenuRelate) PrimaryId() string {
+	return "id"
+}
+
+func (m *EtaBusinessMenuRelate) Create() (err error) {
+	o := orm.NewOrm()
+	id, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.MenuId = int(id)
+	return
+}
+
+func (m *EtaBusinessMenuRelate) CreateMulti(businessId int, items []*EtaBusinessMenuRelate) (err error) {
+	if businessId == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	tx, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE eta_business_id = ?`, m.TableName())
+	_, err = tx.Raw(sql, businessId).Exec()
+	if err != nil {
+		return
+	}
+
+	if len(items) > 0 {
+		_, err = tx.InsertMulti(len(items), items)
+	}
+	return
+}
+
+func (m *EtaBusinessMenuRelate) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func (m *EtaBusinessMenuRelate) Del() (err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	_, err = o.Raw(sql, m.MenuId).Exec()
+	return
+}
+
+func (m *EtaBusinessMenuRelate) GetItemById(id int) (item *EtaBusinessMenuRelate, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func (m *EtaBusinessMenuRelate) GetItemByCondition(condition string, pars []interface{}) (item *EtaBusinessMenuRelate, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s LIMIT 1`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+func (m *EtaBusinessMenuRelate) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func (m *EtaBusinessMenuRelate) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*EtaBusinessMenuRelate, err error) {
+	o := orm.NewOrm()
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func (m *EtaBusinessMenuRelate) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*EtaBusinessMenuRelate, err error) {
+	o := orm.NewOrm()
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// EtaBusinessMenuRelateSaveReq 保存商家菜单关联
+type EtaBusinessMenuRelateSaveReq struct {
+	EtaBusinessId int   `description:"商家ID"`
+	MenuIds       []int `description:"菜单IDs"`
+	HalfMenuIds   []int `description:"半选菜单IDs-仅供前端回显用的"`
+}

+ 2 - 1
models/wx_user.go

@@ -32,6 +32,7 @@ type WxUser struct {
 	OpenId              string    `orm:"column(open_id)" description:"微信openid"`
 	Headimgurl          string    `description:"用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空"`
 	UserLabel           string    `description:"查研观向用户标签"`
+	MarkGroup           string    `description:"标记分组"`
 }
 
 func AddWxUser(item *WxUser) (lastId int64, err error) {
@@ -521,4 +522,4 @@ func GetWxUserListCompanyId(companyId int) (list []*WxUserItem, err error) {
 	sql := ` SELECT* FROM wx_user  WHERE company_id = ?   `
 	_, err = o.Raw(sql, companyId).QueryRows(&list)
 	return
-}
+}

+ 4 - 4
models/yb/apply_record.go

@@ -158,7 +158,7 @@ SELECT
 	y.is_move,
 	y.source,
 	y.from_page,
-	y.mark_group,
+	IF(y.mark_group = '' OR y.mark_group IS NULL, a.mark_group, y.mark_group) AS mark_group,
     y.company_name as user_company_name
     #bp.seller_id,
 	#bp.seller_name
@@ -175,7 +175,7 @@ WHERE
 	AND ( a.mobile <> '' OR a.email <> '' ) 
 	AND ( c.create_platform <> 4 OR c.create_platform IS NULL )
     AND ((y.apply_record_id > 0 and y.create_time > ?) OR (y.apply_record_id is null AND a.created_time > ?) )
-	AND ( y.source > 0 )
+	AND ( y.source > 0 OR y.source IS NULL)
 `
 	sql += condition
 	sql += ` GROUP BY a.user_id ORDER BY last_time desc`
@@ -206,7 +206,7 @@ WHERE
 	AND ( a.mobile <> '' OR a.email <> '' ) 
 	AND ( c.create_platform <> 4 OR c.create_platform IS NULL )
     AND ((y.apply_record_id > 0 and y.create_time > ?) OR (y.apply_record_id is null AND a.created_time > ?) )
-	AND ( y.source > 0 )
+	AND ( y.source > 0 OR y.source IS NULL)
 `
 	pars = append(pars, startTime)
 	pars = append(pars, startTime)
@@ -261,7 +261,7 @@ WHERE
 	AND ( a.mobile <> '' OR a.email <> '' ) 
 	AND ( c.create_platform <> 4 OR c.create_platform IS NULL )
     AND ((y.apply_record_id > 0 and y.create_time > ?) OR (y.apply_record_id is null AND a.created_time > ?) )
-	AND ( y.source > 0 )
+	AND ( y.source > 0 OR y.source IS NULL)
 `
 	sql += condition
 	sql += ` GROUP BY a.user_id ORDER BY last_time desc`

+ 45 - 0
routers/commentsRouter.go

@@ -538,6 +538,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: "ImgToText",
+            Router: `/activity/imgToText`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            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: "ActivityList",
@@ -1231,6 +1240,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityVideoCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityVideoCoAntroller"],
+        beego.ControllerComments{
+            Method: "VideoAndVoice",
+            Router: `/activityVideo/video_and_voice/img`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:AdviceController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:AdviceController"],
         beego.ControllerComments{
             Method: "List",
@@ -2176,6 +2194,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ReportSelectionController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ReportSelectionController"],
+        beego.ControllerComments{
+            Method: "RarryList",
+            Router: `/reportSelection/tarryList`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ReportSelectionController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ReportSelectionController"],
         beego.ControllerComments{
             Method: "VisibleRange",
@@ -6550,6 +6577,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessMenuController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessMenuController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/menu/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessMenuController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessMenuController"],
+        beego.ControllerComments{
+            Method: "SaveRelate",
+            Router: `/menu/relate/save`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/help_doc:HelpDocClassifyController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/help_doc:HelpDocClassifyController"],
         beego.ControllerComments{
             Method: "AddClassify",

+ 1 - 0
routers/router.go

@@ -305,6 +305,7 @@ func init() {
 		web.NSNamespace("/eta_business",
 			web.NSInclude(
 				&eta_business.EtaBusinessController{},
+				&eta_business.EtaBusinessMenuController{},
 			),
 		),
 		web.NSNamespace("/eta_version_update_log",

+ 80 - 0
services/aliyun_ocr.go

@@ -0,0 +1,80 @@
+package services
+
+import (
+	"encoding/json"
+	"fmt"
+	"hongze/hz_crm_api/models/cygx"
+	"io/ioutil"
+	"net/http"
+	"strings"
+	"time"
+)
+
+var (
+	AliyunAppCode = "22553c4ba74545568aba70ac6cfd441d" // AppCode
+)
+
+type AliOcrByImageToTextResp struct {
+	RequestID string `json:"request_id"`
+	Ret       []struct {
+		Rect struct {
+			Angle  int64 `json:"angle"`
+			Height int64 `json:"height"`
+			Left   int64 `json:"left"`
+			Top    int64 `json:"top"`
+			Width  int64 `json:"width"`
+		} `json:"rect"`
+		Word string `json:"word"`
+	} `json:"ret"`
+	Success bool `json:"success"`
+}
+
+//func init() {
+//	AliOcrByImageToText("https://hzstatic.hzinsights.com/cygx/config/a2.jpg")
+//}
+
+// 阿里云OCR将图片转文字
+func AliOcrByImageToText(imageurl string) (item *AliOcrByImageToTextResp, err error) {
+	url := "https://tysbgpu.market.alicloudapi.com/api/predict/ocr_general"
+	method := "POST"
+
+	payload := strings.NewReader(`{
+    "image":"` + imageurl + `"
+}`)
+
+	client := &http.Client{}
+	req, err := http.NewRequest(method, url, payload)
+
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	req.Header.Add("Authorization", "APPCODE "+AliyunAppCode)
+	req.Header.Add("Content-Type", "application/json")
+
+	res, err := client.Do(req)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	defer res.Body.Close()
+
+	body, err := ioutil.ReadAll(res.Body)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	err = json.Unmarshal(body, &item)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	logItem := new(cygx.AliyunOcrLog)
+	logItem.ImgUrl = imageurl
+	logItem.Result = string(body)
+	logItem.CreateTime = time.Now()
+	err = cygx.AddAliyunOcrLog(logItem)
+	return
+}

+ 41 - 0
services/cygx/acitvity.go

@@ -1,6 +1,7 @@
 package cygx
 
 import (
+	"encoding/json"
 	"errors"
 	"fmt"
 	"github.com/PuerkitoBio/goquery"
@@ -1474,3 +1475,43 @@ func CheckActivityUpdatePower(adminId int, activityInfo *cygx.ActivityDetail) (h
 	havePower = true
 	return
 }
+
+// GetMicroRoadShowDefaultImgConfig 获取微路演默认图/分享图配置
+func GetMicroRoadShowDefaultImgConfig() (audioMap, videoMap, audioShareMap, videoShareMap map[int]string, err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("GetMicroRoadShowDefaultImgConfig 获取微路演默认图/分享图配置失败,Err:"+err.Error(), 3)
+		}
+	}()
+	audioMap = make(map[int]string, 0)
+	videoMap = make(map[int]string, 0)
+	audioShareMap = make(map[int]string, 0)
+	videoShareMap = make(map[int]string, 0)
+	key := utils.MicroRoadshowDefaultImgKey
+	conf, e := cygx.GetCygxConfigDetailByCode(key)
+	if e != nil {
+		err = errors.New("获取微路演默认图配置失败, Err: " + e.Error())
+		return
+	}
+	if conf.ConfigValue == "" {
+		err = errors.New("获取微路演默认图配置有误")
+		return
+	}
+	list := new(cygx.MicroRoadShowDefaultImgList)
+	if e = json.Unmarshal([]byte(conf.ConfigValue), &list); e != nil {
+		err = errors.New("微路演默认图配置配置值解析失败, Err: " + e.Error())
+		return
+	}
+	audioList := list.Audio
+	for i := range audioList {
+		audioMap[audioList[i].ChartPermissionId] = audioList[i].ImgUrl
+		audioShareMap[audioList[i].ChartPermissionId] = audioList[i].ShareImg
+	}
+	videoList := list.Video
+	for i := range videoList {
+		videoMap[videoList[i].ChartPermissionId] = videoList[i].ImgUrl
+		videoShareMap[videoList[i].ChartPermissionId] = videoList[i].ShareImg
+	}
+	return
+}

+ 251 - 0
services/cygx/activity_ocr.go

@@ -0,0 +1,251 @@
+package cygx
+
+import (
+	"errors"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+//处理OCR识别图片建会的逻辑
+
+//星期日 Sunday=Sun. 读音:英[ˈsʌndeɪ]美[ˈsʌnˌdeɪ]
+//
+//星期一 Monday=Mon. 读音:英[ˈmʌndeɪ]美[ˈmʌndeɪ]
+//
+//星期二 Tuesday=Tues. 读音:英[ˈtju:zdeɪ]美[ˈtu:zdeɪ]
+//
+//星期三 Wednesday=Wed. 读音:英[ˈwenzdeɪ]美[ˈwɛnzdi, -ˌde]
+//
+//星期四 Thursday=Thur./Thurs. 读音:英[ˈθɜ:zdeɪ]美[ˈθɜ:rzdeɪ]
+//
+//星期五 Friday=Fri. 读音:英[ˈfraɪdeɪ]美[ˈfraɪˌdeɪ]
+//
+//星期六 Saturday=Sat. 读音: 英[ˈsætədeɪ]美[ˈsætərdeɪ]
+
+// 处理年月日格式
+func ConvertActivityTitmeYMD(TitmeYMD string) (titmeYMDNew string) {
+	titmeYMDNew = TitmeYMD
+	titmeYMDNew = strings.Replace(titmeYMDNew, "/", "月", -1)
+	//titmeYMDNew = strings.Replace(titmeYMDNew, "SUN", "日(周日)", -1)
+	//titmeYMDNew = strings.Replace(titmeYMDNew, "MON", "日(周一)", -1)
+	//titmeYMDNew = strings.Replace(titmeYMDNew, "TUE", "日(周二)", -1)
+	//titmeYMDNew = strings.Replace(titmeYMDNew, "WED", "日(周三)", -1)
+	//titmeYMDNew = strings.Replace(titmeYMDNew, "THU", "日(周四)", -1)
+	//titmeYMDNew = strings.Replace(titmeYMDNew, "FRI", "日(周五)", -1)
+	//titmeYMDNew = strings.Replace(titmeYMDNew, "SAT", "日(周六)", -1)
+
+	titmeYMDNew = strings.Replace(titmeYMDNew, "SUN", "日", -1)
+	titmeYMDNew = strings.Replace(titmeYMDNew, "MON", "日", -1)
+	titmeYMDNew = strings.Replace(titmeYMDNew, "TUE", "日", -1)
+	titmeYMDNew = strings.Replace(titmeYMDNew, "WED", "日", -1)
+	titmeYMDNew = strings.Replace(titmeYMDNew, "THU", "日", -1)
+	titmeYMDNew = strings.Replace(titmeYMDNew, "FRI", "日", -1)
+	titmeYMDNew = strings.Replace(titmeYMDNew, "SAT", "日", -1)
+	titmeYMDNew = strconv.Itoa(time.Now().Year()) + "年" + titmeYMDNew
+	return
+}
+
+// 处理时分PM格式
+func ConvertActivityTitmeHM(titmeHM string) (titmeHMNew string) {
+	titmeHMNew = titmeHM
+	//var hNum int
+	var amOrPm string
+	if strings.Contains(titmeHM, "PM") {
+		//hNum = 12
+		amOrPm = "PM"
+	} else {
+		amOrPm = "AM"
+	}
+	titmeHM = strings.Replace(titmeHM, "AM", "", -1)
+	titmeHM = strings.Replace(titmeHM, "PM", "", -1)
+	sliceHm := strings.Split(titmeHM, ":")
+	if len(sliceHm) != 2 {
+		return
+	}
+	hourNum, _ := strconv.Atoi(sliceHm[0])
+	minute := sliceHm[1]
+	titmeHMNew = strconv.Itoa(hourNum) + ":" + minute + " " + amOrPm
+	return
+}
+
+// 活动内容模版
+var ActivityOcrTemplate = "<p>【买方研选-小范围公司线上交流】{{COMPANY}}</p><p>时间:{{TIME}}</p><p>嘉宾:IR</p><p>主持人:IR</p><p>链接参会:(会前一天下午更新)</p><p>备注:</p><p>1、请先报名,我们将于会议前一天提供【Webex】入会链接(可电话拨入or网络端参会);</p><p>2、会议语言:{{LANGUAGE}};</p><p>3、本场会议报名截止时间为会议开始前一天下午3点半;</p><p>4、本次会议扣0.5次研选服务点。</p>"
+
+func MakeActivityReqText(list []*cygx.AliyunOcrTextActivityResp) (req cygx.ActivityRep, err error, errMsg string) {
+	for _, v := range list {
+		ActivityOcrTmp := ActivityOcrTemplate
+		sliceCompany := strings.Split(v.Company, "(")
+		company := sliceCompany[0]
+		ActivityOcrTmp = strings.Replace(ActivityOcrTmp, "{{COMPANY}}", company, -1)
+		v.TitmeYMD = strings.Replace(v.TitmeYMD, "年", "-", -1)
+		v.TitmeYMD = strings.Replace(v.TitmeYMD, "月", "-", -1)
+		v.TitmeYMD = strings.Replace(v.TitmeYMD, "日", "", -1)
+		weeknum := utils.StrDateTimeToWeek(v.TitmeYMD + " 00:00:00")
+
+		havePm := strings.Contains(v.TitmeHM, "PM")
+		var activityTime string
+		activityTime = strings.Replace(v.TitmeHM, " ", "", -1)
+		activityTime = strings.Replace(activityTime, "AM", "", -1)
+		activityTime = strings.Replace(activityTime, "PM", "", -1)
+
+		activityTime = v.TitmeYMD + " " + activityTime + ":00"
+		resultTime := utils.StrTimeToTime(activityTime)
+		var amOrPm string
+		if havePm {
+			//前端传过来的是 2:00PM 这里转成 14:00 PM
+			slicePm := strings.Split(v.TitmeHM, ":")
+			for sk, sv := range slicePm {
+				// 如果是中午 12:30 PM 就不做任何处理
+				if sk == 0 && sv != "12" {
+					resultTime = resultTime.Add(12 * time.Hour)
+					activityTime = resultTime.Format(utils.FormatDateTime)
+				}
+			}
+			amOrPm = "PM"
+		} else {
+			amOrPm = "AM"
+		}
+		var condition string
+		var pars []interface{}
+		condition = " AND activity_type_id = 3 AND  activity_time = ? AND temporary_label = ? "
+		pars = append(pars, activityTime, company)
+		total, e := cygx.GetActivityCount(condition, pars)
+		if e != nil {
+			err = errors.New("GetActivityCount,Err" + e.Error())
+			return
+		}
+
+		if total > 0 {
+			errMsg = "相同时段已存在对应活动"
+			return
+		}
+		ActivityOcrTmp = strings.Replace(ActivityOcrTmp, "{{TIME}}", v.TitmeYMD+"("+weeknum+")"+resultTime.Format(utils.FormatTimeHm)+amOrPm, -1)
+		if !utils.CheckStrHaveLetter(company) {
+			ActivityOcrTmp = strings.Replace(ActivityOcrTmp, "{{LANGUAGE}}", "中文", -1)
+		} else {
+			ActivityOcrTmp = strings.Replace(ActivityOcrTmp, "{{LANGUAGE}}", "英文", -1)
+		}
+		req.Body += ActivityOcrTmp + "<hr>" //分隔符标签
+		label := new(cygx.ActivityGroupIndustrialRep)
+		label.TemporaryLabel = company
+		req.List = append(req.List, label)
+	}
+	//初始化相关活动参数信息
+	req.Body = strings.TrimRight(req.Body, "<hr>")
+	req.DoType = 1
+	req.ActivityTypeId = 3
+	req.PermissionName = utils.CHART_PERMISSION_NAME_MF_YANXUAN
+	req.CustomerTypeIds = "1,2,8,10,3,9,5,6,7"
+	req.IsAllCustomerType = 1
+	req.LimitPeopleNum = 10
+	req.LabelType = 1
+	req.VisibleRange = 2
+	req.IsResearchPoints = 1
+	req.IsNeedEmail = 1
+	// 研选点数
+	pointsSet := new(cygx.CygxActivityPointsSetRsq)
+	pointsSet.PointsObject = "1"
+	pointsSet.UserPointsNum = "0.5"
+	pointsSet.PointsType = "1"
+	pointsSet.CompanyPointsNum = "0"
+	pointsSet.CancelDeadlineType = "1"
+	req.PointsSet = pointsSet
+	return
+}
+
+// 代码冲突了先放这里
+func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *cygx.CygxActivityVoice, itemVideo *cygx.CygxActivityVideo) (err error) {
+	if activityInfo.ActiveState != 3 {
+		return // 没有结束的活动不会上传音视频
+	}
+	activityId := activityInfo.ActivityId
+	var condition string
+	var pars []interface{}
+	//处理音频
+	if itemVoice.ActivityId > 0 {
+		condition = " AND activity_id = ? "
+		pars = append(pars, activityId)
+		total, e := cygx.GetCygxActivityVoiceCount(condition, pars)
+		if e != nil {
+			err = errors.New("GetCygxActivityVoiceCount" + e.Error())
+			return
+		}
+		//如果等于0就新增,反之就修改
+		if total == 0 {
+			newId, e := cygx.AddCygxActivityVoice(itemVoice)
+			if e != nil {
+				err = errors.New("GetCygxActivityVoiceCount" + e.Error())
+				return
+			}
+			go UpdateResourceData(int(newId), utils.CYGX_OBJ_ACTIVITYVOICE, "add", activityInfo.ActivityTime) // 把活动音频的数据添加到 cygx_resource_data 表
+		} else {
+			e = cygx.UpdateCygxActivityVoice(itemVoice)
+			if e != nil {
+				err = errors.New("UpdateCygxActivityVoice" + e.Error())
+				return
+			}
+		}
+	}
+
+	//处理视频
+	if itemVideo.ActivityId > 0 {
+		condition = " AND art.activity_id = ? "
+		pars = append(pars, activityId)
+		total, e := cygx.GetActivityVideoCount(condition, pars)
+		if e != nil {
+			err = errors.New("GetActivityVideoCount" + e.Error())
+			return
+		}
+		//如果等于0就新增,反之就修改
+		if total == 0 {
+			newId, e := cygx.AddCygxActivityVideo(itemVideo)
+			if e != nil {
+				err = errors.New("AddCygxActivityVideo" + e.Error())
+				return
+			}
+			go UpdateResourceData(int(newId), utils.CYGX_OBJ_ACTIVITYVIDEO, "add", activityInfo.ActivityTime) // 把活动视频的数据添加到 cygx_resource_data 表
+		} else {
+			e = cygx.UpdateCygxActivityVideo(itemVideo)
+			if e != nil {
+				err = errors.New("UpdateCygxActivityVideo" + e.Error())
+				return
+			}
+		}
+	}
+
+	//如果两个都为空,就判断之前是否上传过
+	if itemVoice.ActivityId == 0 && itemVideo.ActivityId == 0 {
+		voiceDetail, e := cygx.GetCygxActivityVoiceReqDetail(activityId)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetCygxActivityVoiceReqDetail" + e.Error())
+			return
+		}
+		if voiceDetail != nil {
+			e = cygx.DeleteCygxActivityVoice(activityId)
+			if e != nil {
+				err = errors.New("DeleteCygxActivityVoice" + e.Error())
+				return
+			}
+			go UpdateResourceData(voiceDetail.ActivityVoiceId, utils.CYGX_OBJ_ACTIVITYVOICE, "delete", time.Now().Format(utils.FormatDateTime)) // 把活动音频在 cygx_resource_data 表中删除
+		}
+
+		//删除原有的视频数据
+		videoDetail, e := cygx.GetCygxActivityVideoReqDetail(activityId)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetCygxActivityVideoReqDetail" + e.Error())
+			return
+		}
+		if videoDetail != nil {
+			e = cygx.DeleteCygxActivityVideo(activityId)
+			if e != nil {
+				err = errors.New("DeleteCygxActivityVideo" + e.Error())
+				return
+			}
+			go UpdateResourceData(videoDetail.VideoId, utils.CYGX_OBJ_ACTIVITYVIDEO, "delete", time.Now().Format(utils.FormatDateTime)) // 把活动视频在 cygx_resource_data 表中删除
+		}
+	}
+	return
+}

+ 41 - 0
services/cygx/admin_power.go

@@ -2,9 +2,12 @@ package cygx
 
 import (
 	"errors"
+	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/models/system"
+	"hongze/hz_crm_api/utils"
 	"strconv"
+	"strings"
 )
 
 // 获取这个销售所能查看的手机号权限
@@ -29,3 +32,41 @@ func GetAdminLookUserMobile(adminInfo *system.Admin) (mapMobile map[string]strin
 	mapMobile = mapUserMobile
 	return
 }
+
+// 获取这个销售所能查看的手机号权限
+func GetAdminLookUserCompanyIds(sysUser *system.Admin) (companyIds []int, err error) {
+	//如果不是管理员,权益管理员那么就对可见权限范围做处理
+	adminIds := make([]int, 0)
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN {
+		if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+			//如果是权益的组长就获取下面的组员
+			adminList, e := system.GetAdminListByGroupId(sysUser.GroupId)
+			if e != nil {
+				err = errors.New("GetAdminListByGroupId , Err: " + e.Error())
+				return
+			}
+			for _, v := range adminList {
+				adminIds = append(adminIds, v.AdminId)
+			}
+		} else {
+			adminIds = append(adminIds, sysUser.AdminId)
+		}
+		var adminIdGroup string
+		for _, v := range adminIds {
+			adminIdGroup += strconv.Itoa(v) + ","
+		}
+		adminIdGroup = strings.TrimRight(adminIdGroup, ",")
+		companyProductList, e := company.GetCompanyProductsBySellerId(adminIdGroup)
+		if e != nil {
+			err = errors.New("GetCompanyProductsBySellerId , Err: " + e.Error())
+			return
+		}
+
+		for _, v := range companyProductList {
+			companyIds = append(companyIds, v.CompanyId)
+		}
+		companyIds = append(companyIds, 1) //添加潜在客户
+	}
+
+	return
+}

+ 15 - 0
services/eta_business/eta_business_menu.go

@@ -0,0 +1,15 @@
+package eta_business
+
+import "hongze/hz_crm_api/models/eta_business"
+
+// GetMenuTreeRecursive 递归菜单树
+func GetMenuTreeRecursive(list []*eta_business.EtaBusinessMenuItem, parentId int) []*eta_business.EtaBusinessMenuItem {
+	res := make([]*eta_business.EtaBusinessMenuItem, 0)
+	for _, v := range list {
+		if v.ParentId == parentId {
+			v.Children = GetMenuTreeRecursive(list, v.MenuId)
+			res = append(res, v)
+		}
+	}
+	return res
+}

+ 2 - 1
services/yb/apply_record.go

@@ -319,9 +319,10 @@ func MarkGroupApplyRecord(applyRecordId, adminId, userId int, groupName string)
 	// 未处理过则进行标记
 	if wxUser.IsDeal == 0 {
 		wxUser.IsDeal = 1
+		wxUser.MarkGroup = groupName
 		wxUser.LastUpdatedTime = time.Now()
 		userUpdateCols := make([]string, 0)
-		userUpdateCols = append(userUpdateCols, "IsDeal", "LastUpdatedTime")
+		userUpdateCols = append(userUpdateCols, "IsDeal", "MarkGroup", "LastUpdatedTime")
 		err = wxUser.Update(userUpdateCols)
 		if err != nil {
 			err = errors.New(fmt.Sprint("对应用户信息标记失败", err))

+ 12 - 0
utils/common.go

@@ -2087,3 +2087,15 @@ func FormatTableDataShowValue(x float64) (res string) {
 	}
 	return
 }
+
+// 校验字符是否包含字母
+func CheckStrHaveLetter(checkString string) (checked bool) {
+	allLetterDigit := []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}
+	for _, v := range allLetterDigit {
+		if strings.Contains(checkString, v) {
+			checked = true
+			return true
+		}
+	}
+	return
+}

+ 5 - 0
utils/config.go

@@ -18,6 +18,7 @@ var (
 	MYSQL_URL_COMEIN_DATA  string // 路演记录数据库
 	MYSQL_URL_WEEKLY_TRIAL string // ETA试用
 	MYSQL_URL_FMS          string // 财务系统
+	MYSQL_URL_CYGX         string // 查研观向
 
 	REDIS_CACHE string       //缓存地址
 	Rc          *cache.Cache //redis缓存
@@ -60,6 +61,7 @@ var (
 	WxMsgTemplateIdWithRoadshowPending       string //路演->研究员收到待处理的申请
 	WxMsgTemplateIdWithRoadshowDetailResult  string //路演->销售收到处理结果
 	WxMsgTemplateIdWithRoadshowDeleteNotice  string //路演->研究员收到活动删除通知
+	CYGX_WEB_URL                             string //查研观向web端网址
 
 	WxMsgTemplateIdWithYbCommunityQuestion string // 研报小程序->问答社区回复通知
 	WxMsgTemplateIdWithSealApplyFinished   string // 用印申请-已签回通知
@@ -194,6 +196,7 @@ func init() {
 	MYSQL_URL_COMEIN_DATA = config["mysql_url_comein_data"]
 	MYSQL_URL_WEEKLY_TRIAL = config["mysql_url_weekly_trial"]
 	MYSQL_URL_FMS = config["mysql_url_fms"]
+	MYSQL_URL_CYGX = config["mysql_url_cygx"]
 
 	REDIS_CACHE = config["beego_cache"]
 	if len(REDIS_CACHE) <= 0 {
@@ -242,6 +245,7 @@ ZwIDAQAB
 		IndexName = "cygx_article_v03_23"
 		IndexNameArticleHistory = "cygx_article_history_v07_08"
 		IndexNameComprehensive = "cygx_comprehensive"
+		CYGX_WEB_URL = "https://web.hzinsights.com"
 		TemplateCompanyApplyRedirectUrl = "https://ficc.hzinsights.com/approval/approval/list"
 
 		//同花顺正式地址
@@ -281,6 +285,7 @@ ZwIDAQAB
 		IndexName = "cygx_article_v1"
 		IndexNameArticleHistory = "cygx_article_history_v1"
 		IndexNameComprehensive = "cygx_comprehensive_test"
+		CYGX_WEB_URL = "https://clpttest.hzinsights.com"
 
 		//同花顺测试地址
 		THS_SendUrl = `https://mtest.10jqka.com.cn/gateway/ps/syncNews`

+ 1 - 0
utils/constants.go

@@ -394,6 +394,7 @@ const (
 	YI_DONG_ZHENG_TONG_YUN_TOKEN_KEY        string = "YI_DONG_ZHENG_TONG_YUN_TOKEN_KEY" //易董证通云的token,存Redis使用
 	CYGX_USER_KEY_LABEL                            = "CYGX_USER_KEY_LABEL"              //查研观向用户标签
 	TPL_MSG_WANG_YANG                              = "tpl_msg_wang_yang"                //汪洋手机号地址参数
+	MicroRoadshowDefaultImgKey                     = "micro_roadshow_default_img"       // 音视频封面图
 	PERMISSION_ID_YANXUAN_DIFF                     = 20000                              // 买方研选区分3w和5w的差值
 	ZHUAN_JIA_NAME                          string = "专家"
 	ZHUAN_JIA_ID                            int    = 29