Ver Fonte

Merge branch 'mfyx_3.6' of http://8.136.199.33:3000/cxzhang/hongze_mfyx into debug

xingzai há 8 meses atrás
pai
commit
ca703c695a

+ 115 - 34
controllers/activity.go

@@ -446,7 +446,8 @@ func (this *ActivityCoAntroller) Detail() {
 		}
 	}
 	activityInfo.Listndustrial = industrialList
-
+	var mapActivityId []int
+	mapActivityId = append(mapActivityId, activityId)
 	if havePower {
 		//是否展示限免标签
 		if services.GetShowSustainable() && strings.Contains(activityInfo.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
@@ -484,33 +485,7 @@ func (this *ActivityCoAntroller) Detail() {
 			//activityInfo.YidongActivityUrl = yidongLongLink + "?source=11&fromHz=true&tgc=" + ydTgc
 			activityInfo.YidongActivityUrl = yidongLongLink + "%26source=11%26fromHz=true%26tgc=" + ydTgc
 		}
-		//处理音频回放
-		var mapActivityId []int
-		mapActivityId = append(mapActivityId, activityId)
-		mapActivityVoice, err := services.GetActivityVoiceResp(mapActivityId)
-		if err != nil {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "GetActivityVoiceResp,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
-			return
-		}
-		if mapActivityVoice[activityId] != nil {
-			activityInfo.FileType = 1
-			activityInfo.AudioLink = true
-			activityInfo.VoiceList = mapActivityVoice[activityId]
-		}
 
-		//处理视频回放
-		mapActivityVideo, err := services.GetActivityVideoResp(mapActivityId)
-		if err != nil {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "GetActivityVideoResp,Err:" + err.Error()
-			return
-		}
-		if mapActivityVideo[activityId] != nil {
-			activityInfo.FileType = 2
-			activityInfo.AudioLink = true
-			activityInfo.VideoDetail = mapActivityVideo[activityId]
-		}
 		//8.5 小程序活动详情页 除专家电话外 其余属于新产业的活动 ,不显示 new 标签
 		if activityInfo.ActivityTypeName != "专家电话会" {
 			for _, rep := range activityInfo.Listndustrial {
@@ -601,14 +576,43 @@ func (this *ActivityCoAntroller) Detail() {
 		}
 	}
 
-	if (!activityInfo.IsResearchPoints && activityInfo.IsLimitPeople == 0) || activityInfo.YidongActivityId != "" { //易董的活动 或者(不扣点且不限制人数)走月卡日卡逻辑
-		resp.GoodsList = services.GetUserGoodsCardList() //日卡月卡商品信息
-	} else {
-		resp.GoodsList = services.GetGoodsInfoByActivity(activityInfo)                                             //单场活动信息
-		resp.OrderCode, resp.PayTimeCountdown = services.GetHaverEquallyOrderByUser10MinByActivty(uid, activityId) //截止支付时间倒计时
+	//处理音频回放
+	mapActivityVoice, err := services.GetActivityVoiceResp(mapActivityId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "GetActivityVoiceResp,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
+		return
 	}
-	if resp.PayTimeCountdown > 0 {
-		resp.IsShowWxPay = utils.IS_SHOW_WX_PAY //存在待支付的订单强制为true兼容前端
+	if mapActivityVoice[activityId] != nil {
+		activityInfo.FileType = 1
+		activityInfo.AudioLink = true
+		activityInfo.VoiceList = mapActivityVoice[activityId]
+	}
+	//处理视频回放
+	mapActivityVideo, err := services.GetActivityVideoResp(mapActivityId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "GetActivityVideoResp,Err:" + err.Error()
+		return
+	}
+	if mapActivityVideo[activityId] != nil {
+		activityInfo.FileType = 2
+		activityInfo.AudioLink = true
+		activityInfo.VideoDetail = mapActivityVideo[activityId]
+	}
+
+	//已结束的活动,音视频作为商品的价格处理
+	if activityInfo.ActiveState == "3" {
+		resp.GoodsList = services.GetGoodsInfoByActivityVivo(activityInfo)                                             //音视频回放商品信息
+		resp.VivoPoints = services.GetActivityVivoPoints(activityInfo, user, havePower)                                //单场活动信息
+		resp.OrderCode, resp.PayTimeCountdown = services.GetHaverEquallyOrderByUser10MinByActivtyVivo(uid, activityId) //截止支付时间倒计时
+	} else {
+		if (!activityInfo.IsResearchPoints && activityInfo.IsLimitPeople == 0) || activityInfo.YidongActivityId != "" { //易董的活动 或者(不扣点且不限制人数)走月卡日卡逻辑
+			resp.GoodsList = services.GetUserGoodsCardList() //日卡月卡商品信息
+		} else {
+			resp.GoodsList = services.GetGoodsInfoByActivity(activityInfo)                                             //单场活动信息
+			resp.OrderCode, resp.PayTimeCountdown = services.GetHaverEquallyOrderByUser10MinByActivty(uid, activityId) //截止支付时间倒计时
+		}
 	}
 
 	if len(resp.GoodsList) == 0 {
@@ -1950,3 +1954,80 @@ func (this *ActivityCoAntroller) Check() {
 	br.Success = true
 	br.Data = resp
 }
+
+// @Title 查看音视频扣点接口
+// @Description 查看音视频扣点接口
+// @Param	request	body models.ActivityIdRep true "type json string"
+// @Success Ret=200 {object}
+// @router /vivo_point_record [post]
+func (this *ActivityCoAntroller) VivoPointRecord() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+
+	var req models.ActivityIdRep
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	activityId := req.ActivityId
+	activityInfo, errInfo := models.GetAddActivityInfoById(activityId)
+	if activityInfo == nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "活动ID错误,不存在activityId:" + strconv.Itoa(activityId)
+		return
+	}
+	if errInfo != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败,Err:" + errInfo.Error()
+		return
+	}
+
+	total, err := models.GetCygxActivityVivoPointRecordCount(activityId, user.UserId)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败,获取历史记录信息失败Err:" + errInfo.Error()
+		return
+	}
+	if total == 0 {
+		vivoPointsSetDetail, err := models.GetCygxActivityVivoPointsSetByActivityId(activityId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			return
+		}
+		item := new(models.CygxActivityVivoPointRecord)
+		item.Source = vivoPointsSetDetail.Source
+		item.SourceId = activityId
+		item.UserId = user.UserId
+		item.Mobile = user.Mobile
+		item.Email = user.Email
+		item.CompanyId = user.CompanyId
+		item.CompanyName = user.CompanyName
+		item.RealName = user.RealName
+		item.SellerName, _ = services.GetSellerName(user) // 销售姓名
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+		item.RegisterPlatform = utils.REGISTER_PLATFORM
+		err = models.AddCygxActivityVivoPointRecord(item)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			return
+		}
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 2 - 1
controllers/home.go

@@ -70,7 +70,8 @@ func (this *HomeController) NewList() {
 	resp := new(models.HomeResourceDataListResp)
 
 	if keyWord == "" {
-		condition += " AND source IN ('article','activity','yanxuanspecial')   " // 只有研选的文章、研选的活动、研选的专栏这三种
+		//condition += " AND source IN ('article','activity','yanxuanspecial')   " // 只有研选的文章、研选的活动、研选的专栏这三种
+		condition += " AND source IN ('article','activity','yanxuanspecial','activityvoice','activityvideo')  AND IF   ( source IN('activityvoice','activityvideo') , chart_permission_id = 31 ,1=1 ) " // 只有研选的文章、研选的活动、研选的专栏这三种
 		if labelKeyword == "" {
 			//查询近一个月的数据
 			condition += " AND search_order_time  >   '" + time.Now().AddDate(0, 0, -60).Format(utils.FormatDateTime) + "'"

+ 59 - 1
controllers/micro_roadshow.go

@@ -1,6 +1,10 @@
 package controllers
 
-import "hongze/hongze_mfyx/models"
+import (
+	"encoding/json"
+	"hongze/hongze_mfyx/models"
+	"hongze/hongze_mfyx/services"
+)
 
 // 微路演 (查看留言详情,之前老的项目写到这个模块下了)
 type MicroRoadShowController struct {
@@ -64,3 +68,57 @@ func (this *MicroRoadShowController) CommentDetail() {
 	br.Msg = "操作成功"
 	return
 }
+
+// @Title 记录用户浏览音频回放接口
+// @Description 记录用户浏览音频回放接口
+// @Param	request	body models.ActivityIdRep true "type json string"
+// @Success Ret=200 {object} models.AddVideoHistoryReq
+// @router /videoHistory/add [post]
+func (this *MicroRoadShowController) VideoHistoryAdd() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	var req models.AddVideoHistoryReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	sourceId := req.SourceId
+	playSeconds := req.PlaySeconds
+	sourceType := req.SourceType
+	inviteShareCode := req.InviteShareCode
+
+	if sourceType == 0 {
+		sourceType = 1
+	}
+	if sourceType == 1 {
+		//添加活动音频的播放记录
+		go services.AddActivityVoiceHistory(user, sourceId, playSeconds, inviteShareCode)
+	} else if sourceType == 2 {
+		//添加活动视频的播放记录
+		go services.AddActivityVideoHistory(user, sourceId, playSeconds, inviteShareCode)
+	} else if sourceType == 3 {
+		//添加产业视频播放记录
+		go services.AddMicroRoadshowVideoRecord(user, sourceId, playSeconds)
+	} else if sourceType == 4 {
+		//问答系列音频播放记录
+		//go services.AddAskserieVideoHistoryRecord(user, sourceId, playSeconds)
+	}
+	go services.AddAllCygxVoiceAndVideoHistory(user, sourceId, sourceType, playSeconds)
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+	return
+}

+ 50 - 6
controllers/order.go

@@ -142,6 +142,7 @@ func (this *OrderController) AddByActivity() {
 	uid := user.UserId
 	goodsId := req.GoodsId
 	sourceId := req.SourceId
+	source := req.Source
 	if goodsId == 0 {
 		br.Msg = "支付失败"
 		br.ErrMsg = "支付失败,goodsId 信息错误Err:" + err.Error()
@@ -162,16 +163,21 @@ func (this *OrderController) AddByActivity() {
 	}
 	var title string
 	var oldOrderCode string
+	var payTimeCountdown int
 	//var _ int
 	item := new(order.CygxOrder)
-	if (!activityDetail.IsResearchPoints && activityDetail.IsLimitPeople == 0) || activityDetail.YidongActivityId != "" { //易董的活动 或者(不扣点且不限制人数)走月卡日卡逻辑
-		oldOrderCode = services.GetHaverEquallyOrderByUser10Min(uid, goodsId) //获取用户十分钟之内是否有相同的订单信息
-		item.OrderType = 1
+	if source == "ActivityVivo" {
+		oldOrderCode, payTimeCountdown = services.GetHaverEquallyOrderByUser10MinByActivtyVivo(uid, sourceId)
+		item.OrderType = 3
 	} else {
-		oldOrderCode, _ = services.GetHaverEquallyOrderByUser10MinByActivty(uid, sourceId)
-		item.OrderType = 2
+		if (!activityDetail.IsResearchPoints && activityDetail.IsLimitPeople == 0) || activityDetail.YidongActivityId != "" { //易董的活动 或者(不扣点且不限制人数)走月卡日卡逻辑
+			oldOrderCode = services.GetHaverEquallyOrderByUser10Min(uid, goodsId) //获取用户十分钟之内是否有相同的订单信息
+			item.OrderType = 1
+		} else {
+			oldOrderCode, payTimeCountdown = services.GetHaverEquallyOrderByUser10MinByActivty(uid, sourceId)
+			item.OrderType = 2
+		}
 	}
-
 	title = activityDetail.ActivityName
 	item.OrderCode = utils.GetOrdernum()
 	item.OutTradeNo = "TRADE" + item.OrderCode
@@ -189,6 +195,8 @@ func (this *OrderController) AddByActivity() {
 		item.GoodsName = "日卡"
 	case 2:
 		item.GoodsName = "月卡"
+	case 9:
+		item.GoodsName = "活动回放"
 	}
 	//如果活动有自定义的价格就优先按照自定义的价格来
 	if activityDetail.ActivityPrice > 0 {
@@ -214,6 +222,41 @@ func (this *OrderController) AddByActivity() {
 	item.ModifyTime = time.Now()
 	item.RegisterPlatform = utils.REGISTER_PLATFORM
 
+	//如果是音视频的订单,数据做二次处理
+	if source == "ActivityVivo" {
+		vivoPointsSetDetail, err := models.GetCygxActivityVivoPointsSetByActivityId(sourceId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			return
+		}
+		item.GoodsMoney = vivoPointsSetDetail.GoodsMoney
+		item.OrderMoney = vivoPointsSetDetail.GoodsMoney
+		item.Source = vivoPointsSetDetail.Source
+		if vivoPointsSetDetail.Source == utils.CYGX_OBJ_ACTIVITYVIDEO {
+			activityVideoInfo, err := models.GetCygxActivityVideoByActivityId(sourceId)
+			if err != nil {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取信息失败,Err:" + err.Error()
+				return
+			}
+			title = activityVideoInfo.VideoName
+		} else if vivoPointsSetDetail.Source == utils.CYGX_OBJ_ACTIVITYVOICE {
+			activityVoiceInfo, err := models.GetCygxActivityVoiceByActivityId(sourceId)
+			if err != nil {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取信息失败,Err:" + err.Error()
+				return
+			}
+			title = activityVoiceInfo.VoiceName
+		} else {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取信息失败,音视频数据类型错误"
+			return
+		}
+		item.SourceTitle = title
+	}
+
 	//如果十分钟之内有相同的订单就修改,没有就新增
 	if oldOrderCode == "" {
 		err = order.AddCygxOrder(item)
@@ -230,6 +273,7 @@ func (this *OrderController) AddByActivity() {
 	resp := new(order.WxJsapiApiResp)
 	resp.Detail = JsapiApiResp
 	resp.OrderCode = item.OrderCode
+	resp.PayTimeCountdown = payTimeCountdown //截止支付时间倒计时
 	if err != nil {
 		br.Msg = "创建订单信息失败"
 		br.ErrMsg = "创建订单信息失败,Err:" + err.Error()

+ 12 - 0
models/activity.go

@@ -269,6 +269,18 @@ type CygxActivityResp struct {
 	PayTimeCountdown   int                    `description:"支付时间倒计时"`
 	OrderCode          string                 `comment:"订单编号"`
 	GoodsList          []*order.CygxGoodsResp `description:"商品信息"`
+	VivoPoints         VivoPointsResp         `description:"音视频设置"`
+}
+
+type VivoPointsResp struct {
+	HavePoint       bool   `description:"是否被扣过点"`
+	PointPermission int    `description:"1:点数充足、2点数不足需付费、3:只能付费"`
+	CompanyPoints   string `description:"公司剩余点数"`
+	ActivityPoints  string `description:"本场活动要扣除的点数"`
+	//Title           string `description:"标题"`
+	//ResourceUrl     string `description:"链接"`
+	//Type            int    `description:"类型: 1-活动音频; 2-活动视频;"`
+	//PlaySeconds     string `description:"音视频时长"`
 }
 
 // 通过纪要ID获取活动详情

+ 39 - 0
models/activity_vivo_point_record.go

@@ -0,0 +1,39 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+//活动音视频,首次播放扣点记录
+
+type CygxActivityVivoPointRecord struct {
+	RecordId         int       `orm:"column(record_id);pk";comment:"主键ID"`
+	SourceId         int       `comment:"来源ID"`
+	Source           string    `comment:"来源 activityvoice:活动音频、activityvideo:活动视频"`
+	UserId           int       `comment:"用户ID"`
+	Mobile           string    `comment:"手机号"`
+	Email            string    `comment:"邮箱"`
+	CompanyId        int       `comment:"公司ID"`
+	CompanyName      string    `comment:"公司名称"`
+	RealName         string    `comment:"用户实际名称"`
+	SellerName       string    `comment:"所属销售"`
+	CreateTime       time.Time `comment:"创建时间"`
+	ModifyTime       time.Time `comment:"修改时间"`
+	RegisterPlatform int       `comment:"来源 1小程序,2:网页"`
+}
+
+// GetCygxActivityVivoPointRecordCount  查询用户是否扣过点
+func GetCygxActivityVivoPointRecordCount(sourceId, userId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) count	FROM cygx_activity_vivo_point_record WHERE source_id = ? AND user_id = ?  `
+	err = o.Raw(sql, sourceId, userId).QueryRow(&count)
+	return
+}
+
+// 添加
+func AddCygxActivityVivoPointRecord(item *CygxActivityVivoPointRecord) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}

+ 32 - 0
models/activity_vivo_points_set.go

@@ -0,0 +1,32 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxActivityVivoPointsSet struct {
+	PointSetId   int       `orm:"column(point_set_id);pk";comment:"主键id"`
+	ActivityId   int       `comment:"活动ID"`
+	PointsObject string    `comment:"扣点设置方式 1:同报名参会时的扣点数、2:输入其余点数"`
+	PointsNum    float64   `comment:"扣点数量"`
+	GoodsMoney   float64   `comment:"商品总价"`
+	Source       string    `comment:"来源 activityvideo 活动视频、activityvoice 活动音频"`
+	CreateTime   time.Time `comment:"创建时间"`
+	ModifyTime   time.Time `comment:"更新时间"`
+}
+
+// 根据活动ID判断音视频是否设置了扣点
+func GetCygxActivityVivoPointsSetCountByActivityId(activityId int) (count int, err error) {
+	o := orm.NewOrm()
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity_vivo_points_set  WHERE activity_id =?  `
+	err = o.Raw(sqlCount, activityId).QueryRow(&count)
+	return
+}
+
+func GetCygxActivityVivoPointsSetByActivityId(activityId int) (item *CygxActivityVivoPointsSet, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_activity_vivo_points_set WHERE activity_id = ?  `
+	err = o.Raw(sql, activityId).QueryRow(&item)
+	return
+}

+ 1 - 0
models/db.go

@@ -183,6 +183,7 @@ func init() {
 		new(CygxUserAdminShareHistory),
 		new(CygxUserAdminShareCode),
 		new(AliyunOcrLog),
+		new(CygxActivityVivoPointRecord),
 	)
 
 	initOrder() // 订单模块

+ 2 - 1
models/micro_roadshow.go

@@ -436,7 +436,8 @@ type AddVideoHistoryReq struct {
 	//VideoId     int `description:"视频ID"`
 	PlaySeconds int `description:"播放时长"`
 	//SourceType  int `description:"视频来源: 1-微路演; 2-活动 (不传默认为1)"`
-	SourceType int `description:"音视频来源: 1-活动音频; 2-活动视频; 3-产业视频; 4-系列问答"`
+	SourceType      int    `description:"音视频来源: 1-活动音频; 2-活动视频; 3-产业视频; 4-系列问答"`
+	InviteShareCode string `description:"销售账号邀请码"`
 }
 
 func GetLastCygxMicroRoadshowVideoHistory(videoId, userId int) (item *CygxMicroRoadshowVideoHistory, err error) {

+ 5 - 4
models/order/order.go

@@ -8,8 +8,9 @@ import (
 )
 
 type WxJsapiApiResp struct {
-	Detail    PrepayWithRequestPaymentResponse
-	OrderCode string `comment:"订单编号"`
+	Detail           PrepayWithRequestPaymentResponse
+	OrderCode        string `comment:"订单编号"`
+	PayTimeCountdown int    `description:"支付时间倒计时"`
 }
 
 // PrepayWithRequestPaymentResponse 预下单ID,并包含了调起支付的请求参数
@@ -24,8 +25,8 @@ type PrepayWithRequestPaymentResponse struct {
 }
 
 type CygxOrderAddReq struct {
-	GoodsId int `description:"商品ID"`
-	//Source   string `description:"资源(文章、活动)"`
+	GoodsId         int    `description:"商品ID"`
+	Source          string `description:"资源(文章、活动)"`
 	SourceId        int    `description:"资源ID"`
 	InviteShareCode string `description:"销售账号邀请码"`
 }

+ 8 - 0
models/order/order_virtual_asset.go

@@ -102,6 +102,14 @@ func AddCygxOrderVirtualAsset(item *CygxOrderVirtualAsset, itemOrder *CygxOrder)
 	return
 }
 
+// 获取数量
+func GetCygxOrderVirtualAssetdCountByVivo(sourceId int) (count int, err error) {
+	o := orm.NewOrm()
+	sqlCount := ` SELECT COUNT(1) AS  count  FROM cygx_order_virtual_asset WHERE source IN ('activityvideo','activityvoice')   AND  source_id = ? `
+	err = o.Raw(sqlCount, sourceId).QueryRow(&count)
+	return
+}
+
 // 获取数量
 func GetCygxOrderVirtualAssetdCount(condition string, pars []interface{}) (count int, err error) {
 	o := orm.NewOrm()

+ 18 - 0
routers/commentsRouter.go

@@ -115,6 +115,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_mfyx/controllers:ActivityCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hongze_mfyx/controllers:ActivityCoAntroller"],
+        beego.ControllerComments{
+            Method: "VivoPointRecord",
+            Router: `/vivo_point_record`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_mfyx/controllers:ActivitySignCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hongze_mfyx/controllers:ActivitySignCoAntroller"],
         beego.ControllerComments{
             Method: "ByHand",
@@ -313,6 +322,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_mfyx/controllers:MicroRoadShowController"] = append(beego.GlobalControllerRouter["hongze/hongze_mfyx/controllers:MicroRoadShowController"],
+        beego.ControllerComments{
+            Method: "VideoHistoryAdd",
+            Router: `/videoHistory/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_mfyx/controllers:OrderController"] = append(beego.GlobalControllerRouter["hongze/hongze_mfyx/controllers:OrderController"],
         beego.ControllerComments{
             Method: "AddByActivity",

+ 86 - 0
services/activity.go

@@ -1323,3 +1323,89 @@ func GetYanxuanActivityIds(user *models.WxUserItem, activeState string) (activit
 	}
 	return
 }
+
+func ActivityVideoUserRmind(user *models.WxUserItem, activityId, fileType int) (err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("用户音视频回放操作操作行为,模板消息推送失败"+err.Error(), 2)
+		}
+	}()
+	countUser, err := models.GetUserRemind(user.UserId)
+	if err != nil {
+		return err
+	}
+	if countUser == 0 {
+		return err
+	}
+	var first string
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var remark string
+	//获取销售手机号
+	sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return err
+	}
+	if sellerItemQy != nil {
+		openIdList, e := models.GetWxOpenIdByMobileList(sellerItemQy.Mobile)
+		if e != nil {
+			err = errors.New("GetSellerByAdminId, Err: " + e.Error())
+			return
+		}
+		//TripStatus            int    `description:"行程进行状态 1:预报名,2:确定行程"`
+		if fileType == 1 {
+			activityInfo, e := models.GetCygxActivityVideoByActivityId(activityId)
+			if e != nil {
+				err = errors.New("GetCygxActivitySpecialDetailById, Err: " + e.Error())
+				return
+			}
+			if activityInfo == nil {
+				return
+			}
+			keyword1 = activityInfo.VideoName
+			keyword2 = fmt.Sprint("互动:播放视频,", user.RealName, "--", user.CompanyName)
+			first = fmt.Sprint(user.RealName, "--", user.CompanyName, ",有新的互动:播放视频")
+
+		} else {
+			activityInfo, e := models.GetCygxActivityVoiceByActivityId(activityId)
+			if e != nil {
+				err = errors.New("GetCygxActivitySpecialDetailById, Err: " + e.Error())
+				return
+			}
+			if activityInfo == nil {
+				return
+			}
+			keyword1 = activityInfo.VoiceName
+			keyword2 = fmt.Sprint("互动:播放音频,", user.RealName, "--", user.CompanyName)
+			first = fmt.Sprint(user.RealName, "--", user.CompanyName, ",有新的互动:播放音频")
+		}
+
+		//keyword2 = "__"
+		//remark = "点击查看活动详情"
+		openIdArr := make([]string, 0)
+		for _, v := range openIdList {
+			openIdArr = append(openIdArr, v.OpenId)
+		}
+		redirectUrl := utils.WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL + strconv.Itoa(activityId)
+		sendInfo := new(SendWxTemplate)
+		sendInfo.First = first
+		sendInfo.Keyword1 = keyword1
+		sendInfo.Keyword2 = keyword2
+		sendInfo.Keyword3 = keyword3
+		sendInfo.Keyword4 = keyword4
+		sendInfo.Remark = remark
+		sendInfo.TemplateId = utils.WxMsgTemplateIdArticleUserRemind
+		sendInfo.RedirectUrl = redirectUrl
+		sendInfo.RedirectTarget = 3
+		sendInfo.Resource = strconv.Itoa(activityId)
+		sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+		sendInfo.OpenIdArr = openIdArr
+		err = PublicSendTemplateMsg(sendInfo)
+		if err != nil {
+			return
+		}
+	}
+	return
+}

+ 140 - 0
services/cygx_activity_video_history.go

@@ -1 +1,141 @@
 package services
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_mfyx/models"
+	"hongze/hongze_mfyx/utils"
+	"strconv"
+	"time"
+)
+
+// 记录用户活动音频播放记录
+func AddActivityVideoHistory(user *models.WxUserItem, activityId, playSeconds int, inviteShareCode string) {
+	// 十分钟之内的合并
+	key := utils.CYGX_VIDEO_HISTORY_KEY + utils.CYGX_OBJ_ACTIVITYVIDEO + strconv.Itoa(activityId) + "_" + strconv.Itoa(user.UserId)
+	if utils.Rc.IsExist(key) {
+		return
+	}
+	utils.Rc.Put(key, 1, 10*time.Minute)
+	var err error
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg(fmt.Sprint("添加活动视频的播放记录失败 AddActivityVideoHistory Err:", err.Error(), "活动ID:", activityId, "UserId:", user.UserId), 2)
+		}
+	}()
+	activityVideoInfo, e := models.GetCygxActivityVideoByActivityId(activityId)
+	if e != nil {
+		err = errors.New("GetSellerByCompanyIdCheckFicc, Err: " + e.Error())
+		return
+	}
+	item := new(models.CygxActivityVideoHistory)
+	item.UserId = user.UserId
+	item.RealName = user.RealName
+	item.ActivityId = activityId
+	item.VideoId = activityVideoInfo.VideoId
+	item.PlaySeconds = strconv.Itoa(playSeconds)
+	item.Mobile = user.Mobile
+	item.Email = user.Email
+	item.CompanyId = user.CompanyId
+	item.CompanyName = user.CompanyName
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.RegisterPlatform = utils.REGISTER_PLATFORM
+	sellerItem, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetSellerByCompanyIdCheckFicc, Err: " + e.Error())
+		return
+	}
+	if sellerItem != nil {
+		item.SellerName = sellerItem.RealName
+	}
+	//添加记录
+	e = models.AddCygxActivityVideoHistory(item)
+	if e != nil {
+		err = errors.New("AddCygxActivityVideoHistory, Err: " + e.Error())
+		return
+	}
+	//播放记录加1
+	e = models.UpdateActivityVideoCounts(activityId)
+	if e != nil {
+		err = errors.New("UpdateActivityVideoCounts, Err: " + e.Error())
+		return
+	}
+	//设置消息提醒
+	go ActivityVideoUserRmind(user, activityId, 1)
+
+	go AddCygxUserAdminShareHistory(user, utils.CYGX_OBJ_ACTIVITYVIDEO, activityVideoInfo.VideoName, inviteShareCode, activityId)
+
+	return
+}
+
+// 记录用户活动音频播放记录
+func AddActivityVoiceHistory(user *models.WxUserItem, activityId, playSeconds int, inviteShareCode string) {
+	if playSeconds == 0 {
+		return
+	}
+	key := utils.CYGX_VIDEO_HISTORY_KEY + utils.CYGX_OBJ_ACTIVITYVOICE + strconv.Itoa(activityId) + "_" + strconv.Itoa(user.UserId)
+
+	var err error
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg(fmt.Sprint("记录用户活动音频播放记录失败 AddActivityVoiceHistory Err:", err.Error(), "活动ID:", activityId, "UserId:", user.UserId), 2)
+		}
+	}()
+	item := new(models.CygxActivityVoiceHistory)
+	item.UserId = user.UserId
+	item.RealName = user.RealName
+	item.ActivityId = activityId
+	item.PlaySeconds = strconv.Itoa(playSeconds)
+	item.Mobile = user.Mobile
+	item.Email = user.Email
+	item.CompanyId = user.CompanyId
+	item.CompanyName = user.CompanyName
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.RegisterPlatform = utils.REGISTER_PLATFORM
+	sellerItem, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetSellerByCompanyIdCheckFicc, Err: " + e.Error())
+		return
+	}
+	if sellerItem != nil {
+		item.SellerName = sellerItem.RealName
+	}
+	activityVoiceInfo, e := models.GetCygxActivityVoiceByActivityId(activityId)
+	if e != nil {
+		err = errors.New("GetCygxActivityVoiceByActivityId, Err: " + e.Error())
+		return
+	}
+	if !utils.Rc.IsExist(key) {
+		//添加记录
+		e = models.AddCygxActivityVoiceHistory(item)
+		if e != nil {
+			err = errors.New("AddCygxActivityVoiceHistory, Err: " + e.Error())
+			return
+		}
+		//播放记录加1
+		e = models.UpdateCygxActivityVoiceCounts(activityId)
+		if e != nil {
+			err = errors.New("UpdateCygxActivityVoiceCounts, Err: " + e.Error())
+			return
+		}
+		utils.Rc.Put(key, 1, 10*time.Minute)
+		//设置消息提醒
+		go ActivityVideoUserRmind(user, activityId, 2)
+		go AddCygxUserAdminShareHistory(user, utils.CYGX_OBJ_ACTIVITYVOICE, activityVoiceInfo.VoiceName, inviteShareCode, activityId)
+	} else {
+		lastItem, e := models.GetLastCygxActivityVoiceHistory(activityId, user.UserId)
+		if e != nil {
+			err = errors.New("GetLastCygxActivityVoiceHistory, Err: " + e.Error())
+			return
+		}
+		e = models.UpdateLastCygxActivityVoiceHistory(strconv.Itoa(playSeconds), lastItem.Id)
+		if e != nil {
+			err = errors.New("UpdateLastCygxActivityVoiceHistory, Err: " + e.Error())
+			return
+		}
+	}
+
+	return
+}

+ 171 - 0
services/order.go

@@ -86,6 +86,145 @@ func GetGoodsInfoByActivity(item *models.ActivityDetail) (goodsListResp []*order
 	return
 }
 
+// 获取单场活动音视频关联的商品配置信息
+func GetGoodsInfoByActivityVivo(item *models.ActivityDetail) (goodsListResp []*order.CygxGoodsResp) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("获取单场活动关联的商品配置信息失败 GetGoodsInfoByActivity, err:", err.Error()), 2)
+		}
+	}()
+	activityId := item.ActivityId
+
+	total, e := models.GetCygxActivityVivoPointsSetCountByActivityId(activityId)
+	if e != nil {
+		err = errors.New("GetCygxActivityPointsSetUserNum, Err: " + e.Error())
+		return
+	}
+	if total == 0 {
+		goodsListResp = make([]*order.CygxGoodsResp, 0)
+		return
+	}
+
+	vivoPointsSetDetail, e := models.GetCygxActivityVivoPointsSetByActivityId(activityId)
+	if e != nil {
+		err = errors.New("GetCygxActivityVivoPointsSetCountByActivityId, Err: " + e.Error())
+		return
+	}
+
+	var condition string
+	var pars []interface{}
+	condition = ` AND  goods_id IN  (9) `
+
+	goodsList, e := order.GetCygxGoodsList(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxGoodsList, Err: " + e.Error())
+		return
+	}
+
+	for k, _ := range goodsList {
+		goodsList[k].CurrentPrice = fmt.Sprint(vivoPointsSetDetail.GoodsMoney)
+		goodsList[k].Price = fmt.Sprint(vivoPointsSetDetail.GoodsMoney)
+		goodsList[k].PopupPriceMsg = fmt.Sprint("¥", vivoPointsSetDetail.GoodsMoney)
+	}
+
+	goodsListResp = goodsList
+	return
+}
+
+func GetActivityVivoPoints(item *models.ActivityDetail, wxUser *models.WxUserItem, havePower bool) (vivoPointsResp models.VivoPointsResp) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("获取单场活动关联的商品配置信息失败 GetGoodsInfoByActivity, err:", err.Error()), 2)
+		}
+	}()
+	activityId := item.ActivityId
+
+	total, e := models.GetCygxActivityVivoPointsSetCountByActivityId(activityId)
+	if e != nil {
+		err = errors.New("GetCygxActivityPointsSetUserNum, Err: " + e.Error())
+		return
+	}
+	if total == 0 {
+		return
+	}
+
+	totalMySuccess, e := models.GetActivitySignupCount(wxUser.UserId, activityId)
+	if e != nil {
+		err = errors.New("GetCygxActivityPointsSetUserNum, Err: " + e.Error())
+		return
+	}
+
+	totalPayVivo, e := order.GetCygxOrderVirtualAssetdCountByVivo(activityId)
+	if e != nil {
+		err = errors.New("GetCygxActivityPointsSetUserNum, Err: " + e.Error())
+		return
+	}
+
+	totalPointRecord, e := models.GetCygxActivityVivoPointRecordCount(activityId, wxUser.UserId)
+	if e != nil {
+		err = errors.New("GetCygxActivityVivoPointRecordCount, Err: " + e.Error())
+		return
+	}
+	//如果报了名,或者付费了,或者单独扣点了;就直接观看
+	if totalMySuccess > 0 || totalPayVivo > 0 || totalPointRecord > 0 {
+		vivoPointsResp.HavePoint = true
+	}
+
+	vivoPointsSetDetail, e := models.GetCygxActivityVivoPointsSetByActivityId(activityId)
+	if e != nil {
+		err = errors.New("GetCygxActivityVivoPointsSetCountByActivityId, Err: " + e.Error())
+		return
+	}
+
+	vivoPointsResp.ActivityPoints = fmt.Sprint(vivoPointsSetDetail.PointsNum)
+	// 获取用户所在公司剩余的点
+	companyPointsNum, e := models.GetCompanyPoints(wxUser.CompanyId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyPoints, Err: " + e.Error())
+		return
+	}
+	vivoPointsResp.CompanyPoints = fmt.Sprint(companyPointsNum)
+
+	if havePower {
+		if companyPointsNum >= vivoPointsSetDetail.PointsNum {
+			vivoPointsResp.PointPermission = 1
+		} else {
+			vivoPointsResp.PointPermission = 2
+		}
+	} else {
+		if vivoPointsSetDetail.GoodsMoney > 0 {
+			vivoPointsResp.PointPermission = 3
+		}
+	}
+
+	//if vivoPointsSetDetail.Source == utils.CYGX_OBJ_ACTIVITYVIDEO { //活动视频
+	//	activityVideoInfo, e := models.GetCygxActivityVideoByActivityId(activityId)
+	//	if e != nil {
+	//		err = errors.New("GetCygxActivityVideoByActivityId, Err: " + e.Error())
+	//		return
+	//	}
+	//	vivoPointsResp.Type = 2
+	//	vivoPointsResp.Title = activityVideoInfo.VideoName
+	//	vivoPointsResp.ResourceUrl = activityVideoInfo.VideoUrl
+	//	vivoPointsResp.PlaySeconds = activityVideoInfo.VideoDuration
+	//} else if vivoPointsSetDetail.Source == utils.CYGX_OBJ_ACTIVITYVOICE { //活动音频
+	//	activityVoiceInfo, e := models.GetCygxActivityVoiceByActivityId(activityId)
+	//	if e != nil {
+	//		err = errors.New("GetCygxActivityVoiceByActivityId, Err: " + e.Error())
+	//		return
+	//	}
+	//	vivoPointsResp.Type = 1
+	//	vivoPointsResp.Title = activityVoiceInfo.VoiceName
+	//	vivoPointsResp.ResourceUrl = activityVoiceInfo.VoiceUrl
+	//	vivoPointsResp.PlaySeconds = activityVoiceInfo.VoicePlaySeconds
+	//}
+	return
+}
+
 // 获取用户十分钟之内是否有相同的订单信息
 func GetHaverEquallyOrderByUser10Min(userId, goodsId int) (orderCode string) {
 	var err error
@@ -277,6 +416,38 @@ func AddCygxOrderPayment(itemCallback *WechatPayCallback) {
 	return
 }
 
+// 获取用户十分钟之内是否有相同的订单信息
+func GetHaverEquallyOrderByUser10MinByActivtyVivo(userId, sourceId int) (orderCode string, seconds int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("获取用户十分钟之内是否有相同的订单信息失败 GetHaverEquallyOrderByUser10MinByActivty, err:", err.Error()), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	endTime := time.Now().Add(-10 * time.Minute)
+	condition = `  AND order_status = 1  AND source IN ( 'activityvideo', 'activityvoice') AND  user_id = ? AND  source_id = ? AND create_time > ?  AND register_platform = ? ORDER BY order_id DESC  `
+	pars = append(pars, userId, sourceId, endTime, utils.REGISTER_PLATFORM)
+	orderList, e := order.GetCygxOrderList(condition, pars, 0, 1)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxOrderList, Err: " + e.Error())
+		return
+	}
+	if len(orderList) == 0 {
+		return
+	} else {
+		for _, v := range orderList {
+			orderCode = v.OrderCode
+			duration := time.Now().Sub(v.CreateTime)
+			// 将时间差转换为秒数
+			seconds = 600 - int(duration.Seconds())
+		}
+	}
+	return
+}
+
 // 处理退款订单回调
 func HandleOrderRefundByWechatPay(itemCallback *WechatPayCallback) {
 

+ 5 - 1
services/user_admin_share.go

@@ -88,8 +88,12 @@ func AddCygxUserAdminShareHistory(user *models.WxUserItem, source, sourceTitle,
 		item.Action = "查看活动"
 	case utils.CYGX_OBJ_ARTICLE:
 		item.Action = "查看报告"
-	case utils.CYGX_OBJ_YANXUANSPECIAL:
+	case utils.CYGX_OBJ_ACTIVITYVIDEO:
 		item.Action = "查看专栏"
+	case utils.CYGX_OBJ_ACTIVITYVOICE:
+		item.Action = "查看活动回放"
+	case utils.CYGX_OBJ_YANXUANSPECIAL:
+		item.Action = "查看活动回放"
 	case "login":
 		item.Action = "注册"
 	}