Forráskód Böngészése

Merge branch 'yb/6.0' of hongze/hongze_yb into master

hsun 2 éve
szülő
commit
db6b63c7da

+ 61 - 0
controller/price_driven/price_driven.go

@@ -0,0 +1,61 @@
+package price_driven
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/response"
+	"hongze/hongze_yb/models/request"
+	"hongze/hongze_yb/services/price_driven"
+	"hongze/hongze_yb/services/user"
+)
+
+// PriceDrivenDetail 价格驱动详情
+// @Tags 价格驱动模块
+// @Description 获取价格驱动详情
+// @Param chart_permission_id  query  int  true  "品种ID"
+// @Success 200 {object} response.PriceDrivenItem
+// @failure 400 {string} string "获取失败"
+// @Router /price_driven/detail [get]
+func PriceDrivenDetail(c *gin.Context) {
+	var req request.PriceDrivenDetailReq
+	if err := c.Bind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.ChartPermissionId <= 0 {
+		response.Fail("参数有误", c)
+		return
+	}
+	item, errMsg, err := price_driven.GetPriceDrivenDetail(req.ChartPermissionId)
+	if err != nil {
+		response.FailMsg(errMsg, "GetPriceDrivenDetail ErrMsg:"+err.Error(), c)
+		return
+	}
+	response.OkData("获取成功", item, c)
+}
+
+// PriceDrivenVisitLog 价格驱动访问记录
+// @Tags 价格驱动模块
+// @Description 价格驱动访问记录
+// @Param price_driven_id	query  int  true  "价格驱动ID"
+// @Param source_agent  	query  int  true  "来源"
+// @Success 200 {string} string "操作成功"
+// @failure 400 {string} string "操作失败"
+// @Router /price_driven/visit_log [post]
+func PriceDrivenVisitLog(c *gin.Context) {
+	var req request.PriceDrivenVisitReq
+	if err := c.Bind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.PriceDrivenId <= 0 {
+		response.Fail("参数有误", c)
+		return
+	}
+	userInfo := user.GetInfoByClaims(c)
+	errMsg, err := price_driven.SavePriceDrivenVisitLog(req.PriceDrivenId, req.SourceAgent, userInfo)
+	if err != nil {
+		response.FailMsg(errMsg, "PriceDrivenVisitLog ErrMsg:"+err.Error(), c)
+		return
+	}
+	response.Ok("操作成功", c)
+}

+ 2 - 0
init_serve/router.go

@@ -65,6 +65,8 @@ func InitRouter() (r *gin.Engine) {
 	routers.InitMessage(r)
 	//pc相关路由
 	routers.InitPc(r)
+	// 价格驱动相关路由
+	routers.InitPriceDriven(r)
 	//沙盘逻辑推演路由
 	routers.InitSandbox(r)
 	return

+ 10 - 0
models/request/price_driven.go

@@ -0,0 +1,10 @@
+package request
+
+type PriceDrivenDetailReq struct {
+	ChartPermissionId int `json:"chart_permission_id" form:"chart_permission_id"`
+}
+
+type PriceDrivenVisitReq struct {
+	PriceDrivenId int `json:"price_driven_id" description:"价格驱动ID"`
+	SourceAgent   int `json:"source_agent" description:"来源:1-小程序 2-小程序PC 3-公众号 4-Web官网"`
+}

+ 21 - 18
models/response/permission.go

@@ -1,33 +1,36 @@
 package response
 
 type PermissionFirstItem struct {
-	AuthOk     bool
-	Sort       int
-	IsCheck    bool
-	List       PermissionFiccSecondList
+	Id          int `description:"一级品种ID"`
+	AuthOk      bool
+	Sort        int
+	IsCheck     bool
+	List        PermissionFiccSecondList
 	YbIndexName string
 	YbIndexIcon string
 }
 
 type PermissionFiccItem struct {
-	ClassifyName    string   `json:"classify_name"`
-	List            PermissionFiccSecondList   `json:"list"`
-	Sort           int       `json:"sort"`
-	IconUrl       string     `json:"icon_url"`
-	SelectIconUrl     string     `json:"select_icon_url"`
+	Id            int                      `json:"id"`
+	ClassifyName  string                   `json:"classify_name"`
+	List          PermissionFiccSecondList `json:"list"`
+	Sort          int                      `json:"sort"`
+	IconUrl       string                   `json:"icon_url"`
+	SelectIconUrl string                   `json:"select_icon_url"`
 }
 
 type PermissionFiccSecondItem struct {
-	ChartPermissionName string    `json:"chart_permission_name"`
+	ChartPermissionName string `json:"chart_permission_name"`
 	ChartPermissionID   int    `json:"chart_permission_id"`
-	Sort           int 	`json:"sort"`
-	AuthOk     bool   `json:"auth_ok"`
+	Sort                int    `json:"sort"`
+	AuthOk              bool   `json:"auth_ok"`
+	PirceDrivenState    int    `json:"pirce_driven_state" description:"价格驱动品种状态:0-关闭 1-开启"`
 }
 
 type PermissionFiccResp struct {
-	PermissionList 	PermissionFiccList `json:"permission_list"`
-	ContactInfo     PermissionCheckContactInfo    `json:"contact_info"`
-	CheckFlag    bool        `json:"check_flag"`
+	PermissionList PermissionFiccList         `json:"permission_list"`
+	ContactInfo    PermissionCheckContactInfo `json:"contact_info"`
+	CheckFlag      bool                       `json:"check_flag"`
 }
 type PermissionFiccList []*PermissionFiccItem
 
@@ -68,8 +71,8 @@ type PermissionCheckInfo struct {
 
 // PermissionCheckInfoContact 权限校验完成后的结果
 type PermissionCheckContactInfo struct {
-	Name         string       `json:"name" description:"销售名称"`
-	Mobile       string       `json:"mobile" description:"手机号"`
+	Name   string `json:"name" description:"销售名称"`
+	Mobile string `json:"mobile" description:"手机号"`
 }
 
 // CustomerInfo 客户信息
@@ -80,4 +83,4 @@ type CustomerInfo struct {
 	Status      string `json:"status" description:"状态"`
 	IsSuspend   int8   `json:"is_suspend" description:"启用与否字段:1:暂停,0:启用"`
 	HasApply    bool   `json:"has_apply" description:"是否有申请过"`
-}
+}

+ 13 - 0
models/response/price_driven.go

@@ -0,0 +1,13 @@
+package response
+
+// PriceDrivenItem 价格驱动详情
+type PriceDrivenItem struct {
+	PriceDrivenID     int    `json:"price_driven_id" description:"价格驱动ID"`
+	ChartPermissionID int    `json:"chart_permission_id" description:"品种ID"`
+	MainVariable      string `json:"main_variable" description:"关键变量"`
+	CoreDrivenType    int    `json:"core_driven_type" description:"核心驱动类型 0-多 1-空"`
+	CoreDrivenContent string `json:"core_driven_content" description:"核心驱动内容"`
+	CoreContent       string `json:"core_content" description:"核心内容"`
+	CreateTime        string `json:"create_time" description:"创建时间"`
+	ModifyTime        string `json:"modify_time" description:"更新时间"`
+}

+ 7 - 6
models/tables/chart_permission/chart_permission.go

@@ -16,12 +16,13 @@ type ChartPermission struct {
 	ClassifyName        string    `gorm:"column:classify_name;type:varchar(50)" json:"classifyName"`
 	ProductName         string    `gorm:"column:product_name;type:varchar(50);default:''" json:"productName"`
 	ProductID           int       `gorm:"column:product_id;type:int(11);default:0" json:"productId"`
-	ImageURL            string    `gorm:"column:image_url;type:varchar(255)" json:"imageUrl"`                                  // 图片地址
-	ShowType            int8      `gorm:"column:show_type;type:tinyint(4);default:0" json:"showType"`                          // 1:查研观向小程序展示
-	IsOther             int8      `gorm:"column:is_other;type:tinyint(2);not null;default:0" json:"isOther"`                   // 是否是其他,用于查研观向小程序后台展示
-	IsReport            int8      `gorm:"index:is_report;column:is_report;type:tinyint(4);not null;default:0" json:"isReport"` // 是否是报告,用于查研观向小程序前台报告展示
-	CygxAuth            int8      `gorm:"column:cygx_auth;type:tinyint(4);not null;default:0" json:"cygxAuth"`                 // 是否是权限,用于查研观向小程序前台权限校验
-	YbImgUrl            string      `gorm:"column:yb_img_url;type:varchar(255)" json:"yb_img_url"`                            // 研报小程序报告列表icon
+	ImageURL            string    `gorm:"column:image_url;type:varchar(255)" json:"imageUrl"`                                     // 图片地址
+	ShowType            int8      `gorm:"column:show_type;type:tinyint(4);default:0" json:"showType"`                             // 1:查研观向小程序展示
+	IsOther             int8      `gorm:"column:is_other;type:tinyint(2);not null;default:0" json:"isOther"`                      // 是否是其他,用于查研观向小程序后台展示
+	IsReport            int8      `gorm:"index:is_report;column:is_report;type:tinyint(4);not null;default:0" json:"isReport"`    // 是否是报告,用于查研观向小程序前台报告展示
+	CygxAuth            int8      `gorm:"column:cygx_auth;type:tinyint(4);not null;default:0" json:"cygxAuth"`                    // 是否是权限,用于查研观向小程序前台权限校验
+	YbImgUrl            string    `gorm:"column:yb_img_url;type:varchar(255)" json:"yb_img_url"`                                  // 研报小程序报告列表icon
+	PriceDrivenState    int       `gorm:"column:price_driven_state;type:tinyint(4);not null;default:0" json:"price_driven_state"` // 品种价格驱动状态:0-关闭 1-开启
 }
 
 // TableName get sql table name.获取数据库表名

+ 1 - 1
models/tables/chart_permission_first/chart_permission_first.go

@@ -4,7 +4,7 @@ import "time"
 
 // ChartPermissionFirst 报告权限一级分类表
 type ChartPermissionFirst struct {
-	Id           uint64    `gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null" json:"-"`
+	Id           uint64    `gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null" json:"id"`
 	ClassifyName string    `gorm:"column:classify_name;type:varchar(50)"`                                        // 权限一级分类名称,与chart_permission的classify_name一致
 	YbIndexName  string    `gorm:"column:yb_index_name;type:varchar(50);default:''" `                            // 研报小程序首页简称
 	YbIndexSort  int      `gorm:"column:yb_index_sort;type:tinyint(4);default:0"`                               // 研报小程序首页排序

+ 55 - 0
models/tables/yb_price_driven/entity.go

@@ -0,0 +1,55 @@
+package yb_price_driven
+
+import (
+	"time"
+)
+
+// YbPriceDriven 研报-价格驱动表
+type YbPriceDriven struct {
+	PriceDrivenID       int       `gorm:"primaryKey;column:price_driven_id;type:int(10) unsigned;not null" json:"-"`
+	ChartPermissionID   int       `gorm:"index:idx_chart_permission_id;column:chart_permission_id;type:int(10) unsigned;not null;default:0" json:"chartPermissionId"` // 品种权限ID
+	MainVariable        string    `gorm:"column:main_variable;type:varchar(255);not null;default:''" json:"mainVariable"`                                             // 关键变量
+	CoreDrivenType      int       `gorm:"column:core_driven_type;type:tinyint(4) unsigned;not null;default:0" json:"coreDrivenType"`                                  // 核心驱动类型 0-多 1-空
+	CoreDrivenContent   string    `gorm:"column:core_driven_content;type:varchar(255);not null;default:''" json:"coreDrivenContent"`                                  // 核心驱动内容
+	CoreContent         string    `gorm:"column:core_content;type:longtext" json:"coreContent"`                                                                       // 核心内容
+	LastUpdateAdminID   int       `gorm:"column:last_update_admin_id;type:int(10) unsigned;not null;default:0" json:"lastUpdateAdminId"`                              // 最后一次更新人ID
+	LastUpdateAdminName string    `gorm:"column:last_update_admin_name;type:varchar(30);not null;default:''" json:"lastUpdateAdminName"`                              // 最后一次更新人姓名
+	LastThsMsgTime      time.Time `gorm:"column:last_ths_msg_time;type:datetime" json:"lastThsMsgTime"`                                                               // 最后一次推送客群消息的时间
+	LastTemplateMsgTime time.Time `gorm:"column:last_template_msg_time;type:datetime" json:"lastTemplateMsgTime"`                                                     // 最后一次推送模板消息的时间
+	CreateTime          time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`                                               // 创建时间
+	ModifyTime          time.Time `gorm:"column:modify_time;type:datetime;default:CURRENT_TIMESTAMP" json:"modifyTime"`                                               // 修改时间
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *YbPriceDriven) TableName() string {
+	return "yb_price_driven"
+}
+
+// YbPriceDrivenColumns get sql column name.获取数据库列名
+var YbPriceDrivenColumns = struct {
+	PriceDrivenID       string
+	ChartPermissionID   string
+	MainVariable        string
+	CoreDrivenType      string
+	CoreDrivenContent   string
+	CoreContent         string
+	LastUpdateAdminID   string
+	LastUpdateAdminName string
+	LastThsMsgTime      string
+	LastTemplateMsgTime string
+	CreateTime          string
+	ModifyTime          string
+}{
+	PriceDrivenID:       "price_driven_id",
+	ChartPermissionID:   "chart_permission_id",
+	MainVariable:        "main_variable",
+	CoreDrivenType:      "core_driven_type",
+	CoreDrivenContent:   "core_driven_content",
+	CoreContent:         "core_content",
+	LastUpdateAdminID:   "last_update_admin_id",
+	LastUpdateAdminName: "last_update_admin_name",
+	LastThsMsgTime:      "last_ths_msg_time",
+	LastTemplateMsgTime: "last_template_msg_time",
+	CreateTime:          "create_time",
+	ModifyTime:          "modify_time",
+}

+ 20 - 0
models/tables/yb_price_driven/model.go

@@ -0,0 +1,20 @@
+package yb_price_driven
+
+import "hongze/hongze_yb/global"
+
+// GetPriceDrivenByChartPermissionId 通过品种获取价格驱动
+func GetPriceDrivenByChartPermissionId(chartPermissionId int) (item *YbPriceDriven, err error) {
+	err = global.DEFAULT_MYSQL.
+		Where("chart_permission_id = ? AND publish_state = 1", chartPermissionId).
+		Order("create_time DESC").
+		First(&item).Error
+	return
+}
+
+// GetPriceDrivenById 主键获取价格驱动
+func GetPriceDrivenById(priceDrivenId int) (item *YbPriceDriven, err error) {
+	err = global.DEFAULT_MYSQL.
+		Where("price_driven_id = ? AND publish_state = 1", priceDrivenId).
+		First(&item).Error
+	return
+}

+ 50 - 0
models/tables/yb_price_driven_visit_log/entity.go

@@ -0,0 +1,50 @@
+package yb_price_driven_visit_log
+
+import "time"
+
+// YbPriceDrivenVisitLog 研报-价格驱动访问记录表
+type YbPriceDrivenVisitLog struct {
+	ID            int       `gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null" json:"-"`
+	PriceDrivenID int       `gorm:"index:idx_price_driven_id;column:price_driven_id;type:int(10) unsigned;not null" json:"priceDrivenId"` // 价格驱动ID
+	UserID        int       `gorm:"index:idx_user_id;column:user_id;type:int(10) unsigned;not null;default:0" json:"userId"`              // 用户ID
+	Mobile        string    `gorm:"column:mobile;type:varchar(30);not null;default:''" json:"mobile"`                                     // 手机号
+	RealName      string    `gorm:"column:real_name;type:varchar(100);not null;default:''" json:"realName"`                               // 真实姓名
+	NickName      string    `gorm:"column:nick_name;type:varchar(100);not null;default:''" json:"nickName"`                               // 昵称
+	CompanyID     int       `gorm:"column:company_id;type:int(10) unsigned;not null;default:0" json:"companyId"`                          // 客户ID
+	CompanyName   string    `gorm:"column:company_name;type:varchar(100);not null;default:''" json:"companyName"`                         // 客户名称
+	CompanyStatus string    `gorm:"column:company_status;type:varchar(30);not null;default:''" json:"companyStatus"`                      // 客户状态
+	SourceAgent   int       `gorm:"column:source_agent;type:tinyint(4) unsigned;not null;default:1" json:"sourceAgent"`                   // 操作来源,1:小程序,2:小程序 pc 3:弘则研究公众号,4:web pc
+	CreateTime    time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`                         // 创建时间
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *YbPriceDrivenVisitLog) TableName() string {
+	return "yb_price_driven_visit_log"
+}
+
+// YbPriceDrivenVisitLogColumns get sql column name.获取数据库列名
+var YbPriceDrivenVisitLogColumns = struct {
+	ID            string
+	PriceDrivenID string
+	UserID        string
+	Mobile        string
+	RealName      string
+	NickName      string
+	CompanyID     string
+	CompanyName   string
+	CompanyStatus string
+	SourceAgent   string
+	CreateTime    string
+}{
+	ID:            "id",
+	PriceDrivenID: "price_driven_id",
+	UserID:        "user_id",
+	Mobile:        "mobile",
+	RealName:      "real_name",
+	NickName:      "nick_name",
+	CompanyID:     "company_id",
+	CompanyName:   "company_name",
+	CompanyStatus: "company_status",
+	SourceAgent:   "source_agent",
+	CreateTime:    "create_time",
+}

+ 8 - 0
models/tables/yb_price_driven_visit_log/model.go

@@ -0,0 +1,8 @@
+package yb_price_driven_visit_log
+
+import "hongze/hongze_yb/global"
+
+func (item *YbPriceDrivenVisitLog) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(item).Error
+	return
+}

+ 15 - 0
routers/price_driven.go

@@ -0,0 +1,15 @@
+package routers
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/company"
+	"hongze/hongze_yb/controller/price_driven"
+	"hongze/hongze_yb/middleware"
+)
+
+func InitPriceDriven(r *gin.Engine) {
+	rGroup := r.Group("api/price_driven").Use(middleware.Token(), middleware.CheckBaseAuth())
+	rGroup.GET("/tab", company.GetHomeFiccPermissions)
+	rGroup.GET("/detail", price_driven.PriceDrivenDetail)
+	rGroup.POST("/visit_log", price_driven.PriceDrivenVisitLog)
+}

+ 20 - 4
services/company/permission.go

@@ -124,16 +124,16 @@ func CheckBaseFiccPermission(companyId int64, userId int) (ok bool, checkInfo re
 		err = errors.New("获取用户FICC权限失败 Err:" + e.Error())
 		return
 	}
-	// 客户状态是否为流失
-	if productInfo.Status == "流失" {
-		checkInfo.Type = CheckTypeApply
+	wxUser, e := wx_user.GetByUserId(userId)
+	if e != nil {
+		err = errors.New("不存在当前用户, Err:" + e.Error())
 		return
 	}
 	// 是否为弘则研究已禁用的联系人
 	if companyId == 16 {
 		userInfo, e := wx_user.GetByUserId(userId)
 		if e != nil {
-			err = errors.New("用户信息异常 Err:" + e.Error())
+			err = errors.New("用户信息异常, Err:" + e.Error())
 			return
 		}
 		if userInfo.Enabled != 1 {
@@ -141,6 +141,19 @@ func CheckBaseFiccPermission(companyId int64, userId int) (ok bool, checkInfo re
 			return
 		}
 	}
+	customerInfo := response.CustomerInfo{
+		CompanyName: productInfo.CompanyName,
+		Status:      productInfo.Status,
+		Name:        wxUser.RealName,
+		IsSuspend:   productInfo.IsSuspend,
+		Mobile:      wxUser.Mobile,
+	}
+	checkInfo.CustomerInfo = customerInfo
+	// 客户状态是否为流失
+	if productInfo.Status == "流失" {
+		checkInfo.Type = CheckTypeApply
+		return
+	}
 	// 客户对应的销售信息
 	sellerInfo, e := admin.GetByAdminId(productInfo.SellerID)
 	if e != nil {
@@ -664,6 +677,7 @@ func GetHomeFiccPermissions(user user.UserInfo) (ret response.PermissionFiccResp
 	}
 	for _, v := range permissionFirstList {
 		permissionFirstMap[v.ClassifyName] = &response.PermissionFirstItem{
+			Id:          int(v.Id),
 			Sort:        v.YbIndexSort + 1000,
 			YbIndexName: v.YbIndexName,
 			YbIndexIcon: v.YbIndexIcon,
@@ -692,6 +706,7 @@ func GetHomeFiccPermissions(user user.UserInfo) (ret response.PermissionFiccResp
 		temp.ChartPermissionID = int(v.ChartPermissionID)
 		temp.ChartPermissionName = v.PermissionName
 		temp.AuthOk = permissionMap[v.ChartPermissionID]
+		temp.PirceDrivenState = v.PriceDrivenState
 		if _, ok := permissionFirstMap[v.ClassifyName]; ok {
 			permissionFirstMap[v.ClassifyName].List = append(permissionFirstMap[v.ClassifyName].List, temp)
 		} else {
@@ -704,6 +719,7 @@ func GetHomeFiccPermissions(user user.UserInfo) (ret response.PermissionFiccResp
 	var list response.PermissionFiccList
 	for _, v := range permissionFirstMap {
 		temp := new(response.PermissionFiccItem)
+		temp.Id = v.Id
 		temp.Sort = v.Sort
 		temp.ClassifyName = v.YbIndexName
 		temp.IconUrl = v.YbIndexIcon

+ 78 - 0
services/price_driven/price_driven.go

@@ -0,0 +1,78 @@
+package price_driven
+
+import (
+	"errors"
+	"hongze/hongze_yb/models/response"
+	"hongze/hongze_yb/models/tables/company_product"
+	"hongze/hongze_yb/models/tables/yb_price_driven"
+	"hongze/hongze_yb/models/tables/yb_price_driven_visit_log"
+	"hongze/hongze_yb/services/user"
+	"hongze/hongze_yb/utils"
+)
+
+// GetPriceDrivenDetail 获取价格驱动详情
+func GetPriceDrivenDetail(chartPermissionId int) (resp *response.PriceDrivenItem, errMsg string, err error) {
+	resp = new(response.PriceDrivenItem)
+	// 获取详情
+	item, e := yb_price_driven.GetPriceDrivenByChartPermissionId(chartPermissionId)
+	if e != nil && e != utils.ErrNoRow {
+		errMsg = "获取失败"
+		err = errors.New("获取价格驱动信息失败, Err:" + e.Error())
+		return
+	}
+	if item != nil {
+		resp.PriceDrivenID = item.PriceDrivenID
+		resp.ChartPermissionID = item.ChartPermissionID
+		resp.MainVariable = item.MainVariable
+		resp.CoreDrivenType = item.CoreDrivenType
+		resp.CoreDrivenContent = item.CoreDrivenContent
+		resp.CoreContent = item.CoreContent
+		resp.CreateTime = item.CreateTime.Format(utils.FormatDateTime)
+		resp.ModifyTime = item.ModifyTime.Format(utils.FormatDateTime)
+	}
+	return
+}
+
+// SavePriceDrivenVisitLog 保存价格驱动访问记录
+func SavePriceDrivenVisitLog(priceDrivenId, sourceAgent int, userInfo user.UserInfo) (errMsg string, err error) {
+	companyInfo, e := company_product.GetByCompany2ProductId(userInfo.CompanyID, 1)
+	if e != nil && e != utils.ErrNoRow {
+		errMsg = "保存失败"
+		err = errors.New("获取客户信息失败, Err: " + e.Error())
+		return
+	}
+	var companyName, companyStatus string
+	if companyInfo != nil {
+		companyName = companyInfo.CompanyName
+		companyStatus = companyInfo.Status
+	} else {
+		// 是否是权益用户-视作潜在用户
+		equityCompany, e := company_product.GetByCompany2ProductId(userInfo.CompanyID, 2)
+		if e != nil && e != utils.ErrNoRow {
+			errMsg = "保存失败"
+			err = errors.New("获取客户权益信息失败, Err: " + e.Error())
+			return
+		}
+		if equityCompany != nil {
+			companyName = equityCompany.CompanyName
+			companyStatus = "潜在"
+		}
+	}
+	logItem := &yb_price_driven_visit_log.YbPriceDrivenVisitLog{
+		PriceDrivenID: priceDrivenId,
+		UserID:        int(userInfo.UserID),
+		Mobile:        userInfo.Mobile,
+		RealName:      userInfo.RealName,
+		NickName:      userInfo.NickName,
+		CompanyID:     int(userInfo.CompanyID),
+		CompanyName:   companyName,
+		CompanyStatus: companyStatus,
+		SourceAgent:   sourceAgent,
+	}
+	if e := logItem.Create(); e != nil {
+		errMsg = "保存失败"
+		err = errors.New("新增价格驱动访问记录失败, Err: " + e.Error())
+		return
+	}
+	return
+}

+ 46 - 34
services/share_poster.go

@@ -51,7 +51,7 @@ func CreatePosterFromSource(codePage, codeScene, source, version, pars string) (
 	}
 	path := fmt.Sprint(codePage, "?", codeScene)
 	// 非列表来源获取历史图片,无则生成
-	if !strings.Contains(source, "list") {
+	if !strings.Contains(source, "list") && source != "price_driven" {
 		poster, tmpErr := yb_poster_resource.GetPosterByCondition(path, "poster", version)
 		if tmpErr != nil && tmpErr != utils.ErrNoRow {
 			err = tmpErr
@@ -72,6 +72,7 @@ func CreatePosterFromSource(codePage, codeScene, source, version, pars string) (
 		"chart_list":            1352,
 		"report_detail":         1420,
 		"report_list":           1344,
+		"price_driven":          1344,
 	}
 	widthMap := map[string]int{
 		"activity_detail":       1280,
@@ -82,6 +83,7 @@ func CreatePosterFromSource(codePage, codeScene, source, version, pars string) (
 		"chart_list":            1176,
 		"report_detail":         1176,
 		"report_list":           1176,
+		"price_driven":          1176,
 	}
 	width := widthMap[source]
 	height := heightMap[source]
@@ -245,37 +247,41 @@ func CreateAndUploadSunCode(page, scene, version string) (imgUrl string, err err
 }
 
 type PosterParsReq struct {
-	ActivityTitle   string `json:"activity_title"`
-	ActivityAvatar  string `json:"activity_avatar"`
-	ActivitySpeaker string `json:"activity_speaker"`
-	ActivityTime    string `json:"activity_time"`
-	ChartName       string `json:"chart_name"`
-	ChartImage      string `json:"chart_image"`
-	ReportType      string `json:"report_type"`
-	ReportAvatar    string `json:"report_avatar"`
-	ReportTitle     string `json:"report_title"`
-	ReportAbstract  string `json:"report_abstract"`
-	Stage1          string `json:"stage_1"`
-	Avatar1         string `json:"avatar_1"`
-	Title1          string `json:"title_1"`
-	Author1         string `json:"author_1"`
-	Tag1            string `json:"tag_1"`
-	Img1            string `json:"img_1"`
-	Time1           string `json:"time_1"`
-	Abstract1       string `json:"abstract_1"`
-	Status1         string `json:"status_1"`
-	Speaker1        string `json:"speaker_1"`
-	Stage2          string `json:"stage_2"`
-	Avatar2         string `json:"avatar_2"`
-	Title2          string `json:"title_2"`
-	Author2         string `json:"author_2"`
-	Tag2            string `json:"tag_2"`
-	Img2            string `json:"img_2"`
-	Abstract2       string `json:"abstract_2"`
-	Time2           string `json:"time_2"`
-	Status2         string `json:"status_2"`
-	Speaker2        string `json:"speaker_2"`
-	ListTitle       string `json:"list_title"`
+	ActivityTitle     string `json:"activity_title"`
+	ActivityAvatar    string `json:"activity_avatar"`
+	ActivitySpeaker   string `json:"activity_speaker"`
+	ActivityTime      string `json:"activity_time"`
+	ChartName         string `json:"chart_name"`
+	ChartImage        string `json:"chart_image"`
+	ReportType        string `json:"report_type"`
+	ReportAvatar      string `json:"report_avatar"`
+	ReportTitle       string `json:"report_title"`
+	ReportAbstract    string `json:"report_abstract"`
+	Stage1            string `json:"stage_1"`
+	Avatar1           string `json:"avatar_1"`
+	Title1            string `json:"title_1"`
+	Author1           string `json:"author_1"`
+	Tag1              string `json:"tag_1"`
+	Img1              string `json:"img_1"`
+	Time1             string `json:"time_1"`
+	Abstract1         string `json:"abstract_1"`
+	Status1           string `json:"status_1"`
+	Speaker1          string `json:"speaker_1"`
+	Stage2            string `json:"stage_2"`
+	Avatar2           string `json:"avatar_2"`
+	Title2            string `json:"title_2"`
+	Author2           string `json:"author_2"`
+	Tag2              string `json:"tag_2"`
+	Img2              string `json:"img_2"`
+	Abstract2         string `json:"abstract_2"`
+	Time2             string `json:"time_2"`
+	Status2           string `json:"status_2"`
+	Speaker2          string `json:"speaker_2"`
+	ListTitle         string `json:"list_title"`
+	CoreDrivenType    string `json:"core_driven_type"`
+	CoreDrivenContent string `json:"core_driven_content"`
+	MainVariable      string `json:"main_variable"`
+	UpdateTime        string `json:"update_time"`
 }
 
 // fillContent2Html 填充HTML动态内容
@@ -382,12 +388,12 @@ func fillContent2Html(source, pars, sunCodeUrl string, height int) (contentStr s
 		contentStr = strings.Replace(contentStr, "{{REPORT_ABSTRACT}}", abstract, 1)
 	case "special_column_list":
 		contentStr = strings.Replace(contentStr, "{{LIST_TITLE}}", params.ListTitle, 1)
-		contentStr = strings.Replace(contentStr, "{{STAGE_1}}", "第" + params.Stage1 + "期", 1)
+		contentStr = strings.Replace(contentStr, "{{STAGE_1}}", "第"+params.Stage1+"期", 1)
 		contentStr = strings.Replace(contentStr, "{{AVATAR_1}}", params.Avatar1, 1)
 		contentStr = strings.Replace(contentStr, "{{TITLE_1}}", params.Title1, 1)
 		contentStr = strings.Replace(contentStr, "{{AUTHOR_1}}", params.Author1, 1)
 		contentStr = strings.Replace(contentStr, "{{TAG_1}}", params.Tag1, 1)
-		contentStr = strings.Replace(contentStr, "{{STAGE_2}}", "第" + params.Stage2 + "期", 1)
+		contentStr = strings.Replace(contentStr, "{{STAGE_2}}", "第"+params.Stage2+"期", 1)
 		contentStr = strings.Replace(contentStr, "{{AVATAR_2}}", params.Avatar2, 1)
 		contentStr = strings.Replace(contentStr, "{{TITLE_2}}", params.Title2, 1)
 		contentStr = strings.Replace(contentStr, "{{AUTHOR_2}}", params.Author2, 1)
@@ -408,6 +414,12 @@ func fillContent2Html(source, pars, sunCodeUrl string, height int) (contentStr s
 		contentStr = strings.Replace(contentStr, "{{ABSTRACT_2}}", params.Abstract2, 1)
 		contentStr = strings.Replace(contentStr, "{{IMG_2}}", params.Img2, 1)
 		contentStr = strings.Replace(contentStr, "{{TIME_2}}", params.Time2, 1)
+	case "price_driven":
+		contentStr = strings.Replace(contentStr, "{{LIST_TITLE}}", params.ListTitle, 1)
+		contentStr = strings.Replace(contentStr, "{{CORE_DRIVEN_TYPE}}", params.CoreDrivenType, 1)
+		contentStr = strings.Replace(contentStr, "{{CORE_DRIVEN_CONTENT}}", params.CoreDrivenContent, 1)
+		contentStr = strings.Replace(contentStr, "{{MAIN_VARIABLE}}", params.MainVariable, 1)
+		contentStr = strings.Replace(contentStr, "{{UPDATE_TIME}}", params.UpdateTime, 1)
 	case "activity_list":
 		bgColorMap := map[string]string{
 			"未开始": "#E3B377",

+ 111 - 0
static/htm2img/price_driven.html

@@ -0,0 +1,111 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Document</title>
+    <style>
+        html,body{
+            margin: 0;
+            padding: 0;
+        }
+        div{
+            box-sizing: border-box;
+        }
+        .box{
+            /* width: 294px;
+            height: 336px; */
+            width: 1176px;
+            height: 1344px;
+            background-color: #fff;
+            padding: 100px 64px 64px 60px;
+            border-radius: 16px;
+            border: 1px solid #ECECEC;
+            background-image: url('https://hzstatic.hzinsights.com/static/icon/hzyb/yb-bg-hzlogo.png');
+            background-position: top right;
+            background-size: 300px 300px;
+            background-repeat: no-repeat;
+        }
+        .title{
+            font-size: 64px;
+            font-weight: bold;
+            margin-bottom: 40px;
+        }
+        .flex{
+            height: 256x;
+            margin-top: 40px;
+            font-size: 56px;
+        }
+        .content-box{
+            height: 500px;
+            margin: 80px 0;
+            overflow: hidden;
+            font-size: 56px;
+        }
+        .text-one{
+            overflow: hidden;
+            white-space: nowrap;
+            text-overflow: ellipsis;
+        }
+        .item-img{
+            width: 188px;
+            height: 252px;
+            float: left;
+            object-fit: cover;
+            border-radius: 16px;
+            margin-right: 20px;
+        }
+        .item-title{
+            font-size: 52px;
+        }
+        .item-des{
+            height: 80px;
+            font-size: 44px;
+        }
+        .audio-box{
+            width: 200px;
+            height: 80px;
+            background: #E3B377;
+            border-radius: 40px;
+            color: #fff;
+            font-size: 48px;
+            float: right;
+            text-align: center;
+            line-height: 80px;
+        }
+        .audio-box img{
+            width: 60px;
+            height: 60px;
+            object-fit: cover;
+            position: relative;
+            top: 12px;
+        }
+        
+        
+        .xcx-img{
+            width: 256px;
+            height: 256px;
+            float: right;
+        }
+    </style>
+</head>
+<body>
+    <div class="box">
+        <div class="title">{{LIST_TITLE}}</div>
+        <div class="content-box">
+            <div style="margin-bottom: 40px;line-height: 80px">核心驱动({{CORE_DRIVEN_TYPE}}):{{CORE_DRIVEN_CONTENT}}</div>
+            <div style="margin-bottom: 40px;">关键变量: {{MAIN_VARIABLE}}</div>
+            <div>更新时间:{{UPDATE_TIME}}</div>
+        </div>
+        <div style="text-align:center;font-size:56px;color:#999">长按图片分享</div>
+        <div class="flex">
+            <div style="float: left;">
+                <div>长按识别小程序码</div>
+                <div style="color:#999">查看更多</div>
+            </div>
+            <img class="xcx-img" src="{{SUN_CODE}}" alt="">
+        </div>
+    </div>
+</body>
+</html>