Selaa lähdekoodia

ETA试用平台原内容

hsun 1 vuosi sitten
vanhempi
commit
f2b5ad5f4d

+ 70 - 0
controller/eta_trial/questionnaire.go

@@ -0,0 +1,70 @@
+package eta_trial
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/go-playground/validator/v10"
+	"hongze/hz_crm_eta/controller/resp"
+	"hongze/hz_crm_eta/global"
+	"hongze/hz_crm_eta/models/crm"
+	etaTrialReq "hongze/hz_crm_eta/models/request/eta_trial"
+	"hongze/hz_crm_eta/utils"
+	"sort"
+	"strings"
+)
+
+// GetQuestionnaireList
+// @Description 获取问卷列表
+// @Success 200 {string} string "操作成功"
+// @Router /eta_trial/questionnaire/list [post]
+func (a *EtaTrialController) GetQuestionnaireList(c *gin.Context) {
+	ob := new(crm.EtaTrialQuestionnaire)
+	list, e := ob.List(``, make([]interface{}, 0))
+	if e != nil {
+		resp.FailData("获取失败", "获取问卷列表失败, Err: "+e.Error(), c)
+		return
+	}
+
+	var result crm.EtaTrialQuestionnaireResp
+	for _, v := range list {
+		item := crm.EtaTrialQuestionnaireRespItem{
+			QuestionnaireId: v.QuestionnaireId,
+			Question:        v.Question,
+			Type:            v.Type,
+			Sort:            v.Sort,
+			Option:          strings.Split(v.Options, "~#"),
+			IsMust:          v.IsMust,
+			CreateTime:      v.CreateTime.Format(utils.FormatDateTime),
+		}
+		result.List = append(result.List, item)
+	}
+	sort.Sort(result)
+	resp.OkData("操作成功", result, c)
+}
+
+// QuestionnaireCommit
+// @Description 提交问卷
+// @Success 200 {string} string "操作成功"
+// @Router /eta_trial/questionnaire/commit [post]
+func (a *EtaTrialController) QuestionnaireCommit(c *gin.Context) {
+	var req etaTrialReq.QuestionnaireCommitReq
+	err := c.Bind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+	if len(req.List) == 0 {
+		return
+	}
+
+	ob := new(crm.EtaTrialQuestionnaireRecord)
+	if e := ob.CreateMulti(req.List); e != nil {
+		resp.FailData("操作失败", "新增试用客户问卷记录失败, Err:"+e.Error(), c)
+		return
+	}
+	resp.OkData("操作成功", true, c)
+}

+ 274 - 0
controller/eta_trial/user.go

@@ -0,0 +1,274 @@
+package eta_trial
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/go-playground/validator/v10"
+	"hongze/hz_crm_eta/controller/resp"
+	"hongze/hz_crm_eta/global"
+	"hongze/hz_crm_eta/models/crm"
+	etaTrialReq "hongze/hz_crm_eta/models/request/eta_trial"
+	"hongze/hz_crm_eta/utils"
+	"time"
+)
+
+type EtaTrialController struct{}
+
+// GetUserByMobile
+// @Description 手机号获取用户信息
+// @Success 200 {string} string "操作成功"
+// @Router /eta_trial/user/mobile_fetch [post]
+func (a *EtaTrialController) GetUserByMobile(c *gin.Context) {
+	var req etaTrialReq.GetUserReq
+	err := c.Bind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+	if req.Mobile == "" {
+		resp.FailData("参数有误", "参数有误: Mobile", c)
+		return
+	}
+
+	item, e := crm.GetEtaTrialByMobile(req.Mobile)
+	if e != nil && e != utils.ErrNoRow {
+		resp.FailData("操作失败", "获取试用客户信息失败, Err:"+e.Error(), c)
+		return
+	}
+	resp.OkData("操作成功", item, c)
+}
+
+// Disable
+// @Description 禁用
+// @Success 200 {string} string "操作成功"
+// @Router /eta_trial/user/disable [post]
+func (a *EtaTrialController) Disable(c *gin.Context) {
+	var req etaTrialReq.GetUserReq
+	err := c.Bind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+	if req.Mobile == "" {
+		resp.FailData("参数有误", "参数有误: Mobile", c)
+		return
+	}
+
+	if e := crm.DisableEtaTrailByMobile(req.Mobile); e != nil {
+		resp.FailData("操作失败", "禁用试用客户失败, Err:"+e.Error(), c)
+		return
+	}
+	resp.OkData("操作成功", true, c)
+}
+
+// Edit
+// @Description 编辑
+// @Success 200 {string} string "操作成功"
+// @Router /eta_trial/user/edit [post]
+func (a *EtaTrialController) Edit(c *gin.Context) {
+	var req etaTrialReq.UserEditReq
+	err := c.Bind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+
+	if e := crm.UpdateEtaTrialPositionByMobile(req.RealName, req.Position, req.Mobile, req.Enabled); e != nil {
+		resp.FailData("操作失败", "更新试用客户失败, Err:"+e.Error(), c)
+		return
+	}
+	resp.OkData("操作成功", true, c)
+}
+
+// Remove
+// @Description 删除用户
+// @Success 200 {string} string "操作成功"
+// @Router /eta_trial/user/remove [post]
+func (a *EtaTrialController) Remove(c *gin.Context) {
+	var req etaTrialReq.GetUserReq
+	err := c.Bind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+	if req.Mobile == "" {
+		resp.FailData("参数有误", "参数有误: Mobile", c)
+		return
+	}
+
+	if e := crm.DeleteEtaTrialByMobile(req.Mobile); e != nil {
+		resp.FailData("操作失败", "删除试用客户失败, Err:"+e.Error(), c)
+		return
+	}
+	resp.OkData("操作成功", true, c)
+}
+
+// UpdateLogin
+// @Description 更新登录时间和次数
+// @Success 200 {string} string "操作成功"
+// @Router /eta_trial/user/update_login [post]
+func (a *EtaTrialController) UpdateLogin(c *gin.Context) {
+	var req etaTrialReq.UpdateUserLoginReq
+	err := c.Bind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+	if req.Mobile == "" {
+		resp.FailData("参数有误", "参数有误: Mobile", c)
+		return
+	}
+
+	if e := crm.UpdateEtaTrialLoginByMobile(req.Mobile); e != nil {
+		resp.FailData("操作失败", "更新试用客户登录时间和次数失败, Err:"+e.Error(), c)
+		return
+	}
+	resp.OkData("操作成功", true, c)
+}
+
+// UpdateIndexNum
+// @Description 更新累计新增指标数
+// @Success 200 {string} string "操作成功"
+// @Router /eta_trial/user/update_index_num [post]
+func (a *EtaTrialController) UpdateIndexNum(c *gin.Context) {
+	var req etaTrialReq.UpdateUserIndexNumReq
+	err := c.Bind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+	if req.Mobile == "" {
+		resp.FailData("参数有误", "参数有误: Mobile", c)
+		return
+	}
+
+	if e := crm.UpdateEtaTrialIndexNumByMobile(req.Mobile); e != nil {
+		resp.FailData("操作失败", "更新试用客户累计新增指标数失败, Err:"+e.Error(), c)
+		return
+	}
+	resp.OkData("操作成功", true, c)
+}
+
+// UpdateChartNum
+// @Description 更新累计新增图表数
+// @Success 200 {string} string "操作成功"
+// @Router /eta_trial/user/update_chart_num [post]
+func (a *EtaTrialController) UpdateChartNum(c *gin.Context) {
+	var req etaTrialReq.UpdateUserIndexNumReq
+	err := c.Bind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+	if req.Mobile == "" {
+		resp.FailData("参数有误", "参数有误: Mobile", c)
+		return
+	}
+
+	if e := crm.UpdateEtaTrialChartNumByMobile(req.Mobile); e != nil {
+		resp.FailData("操作失败", "更新试用客户累计新增图表数失败, Err:"+e.Error(), c)
+		return
+	}
+	resp.OkData("操作成功", true, c)
+}
+
+// UpdateActiveTime
+// @Description 更新活跃时间
+// @Success 200 {string} string "操作成功"
+// @Router /eta_trial/user/update_active_time [post]
+func (a *EtaTrialController) UpdateActiveTime(c *gin.Context) {
+	var req etaTrialReq.UpdateUserActiveTimeReq
+	err := c.Bind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+
+	record := new(crm.EtaTrialActiveRecord)
+	record.UserName = req.UserName
+	record.Mobile = req.Mobile
+	record.ActiveTime = req.ActiveTime
+	record.Part = req.Part
+	record.CreateTime = time.Now().Local()
+	if e := record.Create(); e != nil {
+		resp.FailData("操作失败", "新增试用客户活跃记录失败, Err:"+e.Error(), c)
+		return
+	}
+	if e := crm.UpdateEtaTrailActiveTime(req.ActiveTime, req.Mobile); e != nil {
+		resp.FailData("操作失败", "更新试用客户累计活跃时长失败, Err:"+e.Error(), c)
+		return
+	}
+	resp.OkData("操作成功", true, c)
+}
+
+// UpdateLoginDuration
+// @Description 更新登录时长
+// @Success 200 {string} string "操作成功"
+// @Router /eta_trial/user/update_login_duration [post]
+//func (a *EtaTrialController) UpdateLoginDuration(c *gin.Context) {
+//	var req etaTrialReq.UpdateUserLoginDurationReq
+//	err := c.Bind(&req)
+//	if err != nil {
+//		errs, ok := err.(validator.ValidationErrors)
+//		if !ok {
+//			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+//			return
+//		}
+//		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+//		return
+//	}
+//
+//	record := new(crm.EtaTrialLoginDurationRecord)
+//	record.UserName = req.UserName
+//	record.Mobile = req.Mobile
+//	record.Duration = req.ActiveTime
+//	record.CreateTime = time.Now().Local()
+//	if e := record.Create(); e != nil {
+//		resp.FailData("操作失败", "新增试用客户登录时长记录失败, Err:"+e.Error(), c)
+//		return
+//	}
+//	if e := crm.UpdateEtaTrailLastLoginDuration(req.ActiveTime, req.Mobile); e != nil {
+//		resp.FailData("操作失败", "更新试用客户登录时长失败, Err:"+e.Error(), c)
+//		return
+//	}
+//	resp.OkData("操作成功", true, c)
+//}

+ 1 - 0
init_serve/router.go

@@ -18,5 +18,6 @@ func InitRouter() (r *gin.Engine) {
 
 	rBase := r.Group("api/")
 	routers.InitAuth(rBase)
+	routers.InitEtaTrial(rBase)
 	return
 }

+ 135 - 0
models/crm/eta_trial.go

@@ -0,0 +1,135 @@
+package crm
+
+import (
+	"hongze/hz_crm_eta/global"
+	"time"
+)
+
+// EtaTrial ETA试用
+type EtaTrial struct {
+	EtaTrialId    int       `gorm:"primaryKey;column:eta_trial_id;type:int(11);not null" json:"eta_trial_id"`
+	UserName      string    `gorm:"column:user_name;type:varchar(100);default:''" json:"user_name"`
+	CompanyName   string    `gorm:"column:company_name;type:varchar(100);default:''" json:"company_name"`
+	Position      string    `gorm:"column:position;type:varchar(100);default:''" json:"position"`          // 职务
+	Account       string    `gorm:"column:account;type:varchar(100);default:''" json:"account"`            // 账号
+	Password      string    `gorm:"column:password;type:varchar(100);default:''" json:"password"`          // 账号
+	Mobile        string    `gorm:"column:mobile;type:varchar(20)" json:"mobile"`                          // 手机号
+	ActiveTime    int       `gorm:"column:active_time;type:int(11) unsigned;default:0" json:"active_time"` // 累计活跃时长
+	IndexNum      int       `gorm:"column:index_num;type:int(11) unsigned;default:0" json:"index_num"`     // 累计添加指标
+	ChartNum      int       `gorm:"column:chart_num;type:int(11) unsigned;default:0" json:"chart_num"`     // 累计添加图表
+	LoginNum      int       `gorm:"column:login_num;type:int(11) unsigned;default:0" json:"login_num"`     // 累计登录次数
+	Enabled       int       `gorm:"column:enabled;type:tinyint(1);not null;default:1" json:"enabled"`      // 1:有效,0:禁用
+	LastLoginTime time.Time `gorm:"column:last_login_time;type:datetime" json:"last_login_time"`           // 最后一次登陆时间
+	CreateTime    time.Time `gorm:"column:create_time;type:datetime" json:"create_time"`                   // 申请时间
+	ModifyTime    time.Time `gorm:"column:modify_time;type:datetime" json:"modify_time"`                   // 账号更新时间
+	Seller        string    `gorm:"column:seller;type:varchar(200);default:''" json:"seller"`              // 销售员
+	SellerId      int       `gorm:"column:seller_id;type:bigint(20);default:0" json:"seller_id"`           // 销售员id
+}
+
+type EtaTrialItem struct {
+	EtaTrialId    int       `gorm:"primaryKey;column:eta_trial_id;type:int(11);not null"`
+	UserName      string    `gorm:"column:user_name;type:varchar(100);default:''"`
+	CompanyName   string    `gorm:"column:company_name;type:varchar(100);default:''"`
+	Position      string    `gorm:"column:position;type:varchar(100);default:''"`       // 职务
+	Account       string    `gorm:"column:account;type:varchar(100);default:''"`        // 账号
+	Password      string    `gorm:"column:password;type:varchar(100);default:''"`       // 账号
+	Mobile        string    `gorm:"column:mobile;type:varchar(20)"`                     // 手机号
+	ActiveTime    int       `gorm:"column:active_time;type:int(11) unsigned;default:0"` // 累计活跃时长
+	IndexNum      int       `gorm:"column:index_num;type:int(11) unsigned;default:0"`   // 累计添加指标
+	ChartNum      int       `gorm:"column:chart_num;type:int(11) unsigned;default:0"`   // 累计添加图表
+	LoginNum      int       `gorm:"column:login_num;type:int(11) unsigned;default:0"`   // 累计登录次数
+	Enabled       int       `gorm:"column:enabled;type:tinyint(1);not null;default:1"`  // 1:有效,0:禁用
+	LastLoginTime time.Time `gorm:"column:last_login_time;type:datetime"`               // 最后一次登陆时间
+	CreateTime    time.Time `gorm:"column:create_time;type:datetime"`                   // 申请时间
+	ModifyTime    time.Time `gorm:"column:modify_time;type:datetime"`                   // 账号更新时间
+	Seller        string    `gorm:"column:seller;type:varchar(200);default:''"`         // 销售员
+	SellerId      int       `gorm:"column:seller_id;type:bigint(20);default:0"`         // 销售员id
+}
+
+func (m *EtaTrial) TableName() string {
+	return "eta_trial"
+}
+
+// Create 新增
+func (m *EtaTrial) Create() (err error) {
+	err = global.MYSQL["hz_crm"].Create(m).Error
+	return
+}
+
+// Update 更新
+func (m *EtaTrial) Update(cols []string) (err error) {
+	err = global.MYSQL["hz_crm"].Model(m).Select(cols).Updates(m).Error
+	return
+}
+
+// GetEtaTrialByMobile 手机号获取试用客户
+func GetEtaTrialByMobile(mobile string) (item *EtaTrialItem, err error) {
+	err = global.MYSQL["hz_crm"].Model(EtaTrial{}).Where("mobile = ?", mobile).First(&item).Error
+	return
+}
+
+// DisableEtaTrailByMobile 禁用客户
+func DisableEtaTrailByMobile(mobile string) (err error) {
+	expTime := time.Now().AddDate(0, 0, -14)
+	sql := `UPDATE eta_trial SET enabled = 0, modify_time = ? WHERE mobile = ?`
+	err = global.MYSQL["hz_crm"].Exec(sql, expTime, mobile).Error
+	return
+}
+
+// DeleteEtaTrialByMobile 删除客户
+func DeleteEtaTrialByMobile(mobile string) (err error) {
+	sql := `DELETE FROM eta_trial WHERE mobile = ?`
+	err = global.MYSQL["hz_crm"].Exec(sql, mobile).Error
+	return
+}
+
+// UpdateEtaTrailActiveTime 更新用户累计活跃时间
+func UpdateEtaTrailActiveTime(activeTime int, mobile string) (err error) {
+	sql := `UPDATE eta_trial SET active_time = active_time + ? WHERE mobile = ?`
+	err = global.MYSQL["hz_crm"].Exec(sql, activeTime, mobile).Error
+	return
+}
+
+// UpdateEtaTrialLoginByMobile 更新用户最后登录时间和次数
+func UpdateEtaTrialLoginByMobile(mobile string) (err error) {
+	sql := `UPDATE eta_trial SET last_login_time = NOW(), login_num = login_num + 1 WHERE mobile = ?`
+	err = global.MYSQL["hz_crm"].Exec(sql, mobile).Error
+	return
+}
+
+// UpdateEtaTrialIndexNumByMobile 更新累计添加指标数
+func UpdateEtaTrialIndexNumByMobile(mobile string) (err error) {
+	sql := `UPDATE eta_trial SET index_num = index_num + 1 WHERE mobile = ?`
+	err = global.MYSQL["hz_crm"].Exec(sql, mobile).Error
+	return
+}
+
+// UpdateEtaTrialChartNumByMobile 更新累计添加图表数
+func UpdateEtaTrialChartNumByMobile(mobile string) (err error) {
+	sql := `UPDATE eta_trial SET chart_num = chart_num + 1 WHERE mobile = ?`
+	err = global.MYSQL["hz_crm"].Exec(sql, mobile).Error
+	return
+}
+
+// UpdateEtaTrialPositionByMobile 更新用户相关信息
+func UpdateEtaTrialPositionByMobile(realName, position, mobile string, enable int) (err error) {
+	sql := ``
+	// 禁用
+	if enable == 0 {
+		expTime := time.Now().AddDate(0, 0, -14)
+		sql = `UPDATE eta_trial SET user_name = ?, position = ?, enabled = ?, modify_time = ? WHERE mobile = ?`
+		err = global.MYSQL["hz_crm"].Exec(sql, realName, position, enable, expTime, mobile).Error
+		return
+	}
+	// 启用
+	sql = `UPDATE eta_trial SET user_name = ?, position = ?, enabled = ? WHERE mobile = ?`
+	err = global.MYSQL["hz_crm"].Exec(sql, realName, position, enable, mobile).Error
+	return
+}
+
+// UpdateEtaTrailLastLoginDuration 更新用户最后一次登录时长
+func UpdateEtaTrailLastLoginDuration(activeTime int, mobile string) (err error) {
+	sql := `UPDATE eta_trial SET last_login_duration = ? WHERE mobile = ?`
+	err = global.MYSQL["hz_crm"].Exec(sql, activeTime, mobile).Error
+	return
+}

+ 32 - 0
models/crm/eta_trial_active_record.go

@@ -0,0 +1,32 @@
+package crm
+
+import (
+	"hongze/hz_crm_eta/global"
+	"time"
+)
+
+// EtaTrialActiveRecord ETA试用用户活跃记录表
+type EtaTrialActiveRecord struct {
+	RecordId   int       `gorm:"primaryKey;column:record_id;type:int(11);not null" json:"record_id"`
+	UserName   string    `gorm:"column:user_name;type:varchar(100);default:0" json:"user_name"`
+	Mobile     string    `gorm:"column:mobile;type:varchar(20)" json:"mobile"`        // 手机号
+	ActiveTime int       `gorm:"column:active_time;type:int(11)" json:"active_time"`  // 累计活跃时长
+	CreateTime time.Time `gorm:"column:create_time;type:datetime" json:"create_time"` // 申请时间
+	Part       string    `gorm:"column:part;type:varchar(100)" json:"part"`           // 活跃板块
+}
+
+func (m *EtaTrialActiveRecord) TableName() string {
+	return "eta_trial_active_record"
+}
+
+// Create 新增
+func (m *EtaTrialActiveRecord) Create() (err error) {
+	err = global.MYSQL["hz_crm"].Create(m).Error
+	return
+}
+
+// Update 更新
+func (m *EtaTrialActiveRecord) Update(cols []string) (err error) {
+	err = global.MYSQL["hz_crm"].Model(m).Select(cols).Updates(m).Error
+	return
+}

+ 26 - 0
models/crm/eta_trial_login_duration_record.go

@@ -0,0 +1,26 @@
+package crm
+
+// EtaTrialLoginDurationRecord ETA试用客户登录时长记录表
+//type EtaTrialLoginDurationRecord struct {
+//	RecordId   int       `gorm:"primaryKey;column:record_id;type:int(10) unsigned;not null" json:"record_id"`
+//	UserName   string    `gorm:"column:user_name;type:varchar(128);not null;default:''" json:"user_name"`  // 用户名称
+//	Mobile     string    `gorm:"column:mobile;type:varchar(16);not null;default:''" json:"mobile"`         // 手机号
+//	Duration   int       `gorm:"column:duration;type:int(10) unsigned;not null;default:0" json:"duration"` // 登录时长,单位秒
+//	CreateTime time.Time `gorm:"column:create_time;type:datetime" json:"create_time"`                      // 创建时间
+//}
+//
+//func (m *EtaTrialLoginDurationRecord) TableName() string {
+//	return "eta_trial_login_duration_record"
+//}
+//
+//// Create 新增
+//func (m *EtaTrialLoginDurationRecord) Create() (err error) {
+//	err = global.MYSQL["hz_crm"].Create(m).Error
+//	return
+//}
+//
+//// Update 更新
+//func (m *EtaTrialLoginDurationRecord) Update(cols []string) (err error) {
+//	err = global.MYSQL["hz_crm"].Model(m).Select(cols).Updates(m).Error
+//	return
+//}

+ 67 - 0
models/crm/eta_trial_questionnaire.go

@@ -0,0 +1,67 @@
+package crm
+
+import (
+	"hongze/hz_crm_eta/global"
+	"time"
+)
+
+// EtaTrialQuestionnaire 问卷调查题目
+type EtaTrialQuestionnaire struct {
+	QuestionnaireId int       `gorm:"primaryKey;column:questionnaire_id;type:int(11);not null" json:"questionnaire_id"`
+	Question        string    `gorm:"column:question;type:varchar(255)" json:"question"`          // 题目
+	Options         string    `gorm:"column:options;type:varchar(255);default:''" json:"options"` // 选项
+	Type            int       `gorm:"column:type;type:tinyint(4)" json:"type"`                    // 1单选 2多选 3简答题 4标题
+	CreateTime      time.Time `gorm:"column:create_time;type:datetime" json:"create_time"`        // 创建时间
+	Sort            int       `gorm:"column:sort;type:int(11);default:0" json:"sort"`
+	IsMust          int       `gorm:"column:is_must;type:tinyint(4);not null;default:0" json:"is_must"` // 0必填 1非必填
+}
+
+func (m *EtaTrialQuestionnaire) TableName() string {
+	return "eta_trial_questionnaire"
+}
+
+// Create 新增
+func (m *EtaTrialQuestionnaire) Create() (err error) {
+	err = global.MYSQL["hz_crm"].Create(m).Error
+	return
+}
+
+// Update 更新
+func (m *EtaTrialQuestionnaire) Update(cols []string) (err error) {
+	err = global.MYSQL["hz_crm"].Model(m).Select(cols).Updates(m).Error
+	return
+}
+
+// List 列表
+func (m *EtaTrialQuestionnaire) List(cond string, pars []interface{}) (items []*EtaTrialQuestionnaire, err error) {
+	err = global.MYSQL["hz_crm"].Where(cond, pars...).Find(&items).Error
+	return
+}
+
+// EtaTrialQuestionnaireRespItem 问卷调查信息
+type EtaTrialQuestionnaireRespItem struct {
+	QuestionnaireId int      `orm:"column(questionnaire_id);pk" description:"问卷题目id"`
+	Question        string   `description:"题目"`
+	Type            int      `description:"1单选 2多选 3简答题"`
+	Sort            int      `description:"排序"`
+	Option          []string `description:"选项"`
+	IsMust          int      `description:"是否必填"`
+	CreateTime      string
+}
+
+// EtaTrialQuestionnaireResp 问卷调查列表响应体
+type EtaTrialQuestionnaireResp struct {
+	List []EtaTrialQuestionnaireRespItem
+}
+
+func (m EtaTrialQuestionnaireResp) Len() int {
+	return len(m.List)
+}
+
+func (m EtaTrialQuestionnaireResp) Less(i, j int) bool {
+	return m.List[i].Sort < m.List[j].Sort
+}
+
+func (m EtaTrialQuestionnaireResp) Swap(i, j int) {
+	m.List[i], m.List[j] = m.List[j], m.List[i]
+}

+ 32 - 0
models/crm/eta_trial_questionnaire_record.go

@@ -0,0 +1,32 @@
+package crm
+
+import (
+	"hongze/hz_crm_eta/global"
+	"time"
+)
+
+// EtaTrialQuestionnaireRecord 问卷记录表
+type EtaTrialQuestionnaireRecord struct {
+	RecordId        int       `gorm:"primaryKey;column:record_id;type:int(11);not null" json:"-"`
+	UserName        string    `gorm:"column:user_name;type:varchar(255);not null" json:"user_name"`
+	CompanyName     string    `gorm:"column:company_name;type:varchar(255);not null" json:"company_name"`
+	Position        string    `gorm:"column:position;type:varchar(255);not null" json:"position"`
+	Mobile          string    `gorm:"column:mobile;type:varchar(255);not null" json:"mobile"`
+	QuestionnaireId int       `gorm:"column:questionnaire_id;type:int(11);not null" json:"questionnaire_id"`
+	Options         string    `gorm:"column:options;type:varchar(255)" json:"options"`     // 选项
+	Type            int       `gorm:"column:type;type:tinyint(4)" json:"type"`             // 1单选 2多选 3简答题
+	CreateTime      time.Time `gorm:"column:create_time;type:datetime" json:"create_time"` // 创建时间
+}
+
+func (m *EtaTrialQuestionnaireRecord) TableName() string {
+	return "eta_trial_questionnaire_record"
+}
+
+// CreateMulti 批量新增
+func (m *EtaTrialQuestionnaireRecord) CreateMulti(items []EtaTrialQuestionnaireRecord) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	err = global.MYSQL["hz_crm"].CreateInBatches(items, len(items)).Error
+	return
+}

+ 7 - 0
models/request/eta_trial/questionnaire.go

@@ -0,0 +1,7 @@
+package eta_trial
+
+import "hongze/hz_crm_eta/models/crm"
+
+type QuestionnaireCommitReq struct {
+	List []crm.EtaTrialQuestionnaireRecord
+}

+ 44 - 0
models/request/eta_trial/user.go

@@ -0,0 +1,44 @@
+package eta_trial
+
+// GetUserReq 获取用户请求体
+type GetUserReq struct {
+	Mobile string `description:"手机号"`
+}
+
+// UserEditReq 更新用户信息请求体
+type UserEditReq struct {
+	RealName string `description:"姓名"`
+	Position string `description:"职务"`
+	Mobile   string `description:"手机号"`
+	Enabled  int    `description:"禁启用"`
+}
+
+// UpdateUserLoginReq 更新用户登录请求体
+type UpdateUserLoginReq struct {
+	Mobile string `description:"手机号"`
+}
+
+// UpdateUserIndexNumReq 更新用户累计新增指标数请求体
+type UpdateUserIndexNumReq struct {
+	Mobile string `description:"手机号"`
+}
+
+// UpdateUserChartNumReq 更新用户累计新增图表数请求体
+type UpdateUserChartNumReq struct {
+	Mobile string `description:"手机号"`
+}
+
+// UpdateUserActiveTimeReq 更新用户活跃时间请求体
+type UpdateUserActiveTimeReq struct {
+	Mobile     string `description:"手机号"`
+	UserName   string `description:"用户姓名"`
+	ActiveTime int    `description:"活跃时长, 单位秒"`
+	Part       string `description:"活跃板块"`
+}
+
+// UpdateUserLoginDurationReq 更新用户登录时长请求体
+type UpdateUserLoginDurationReq struct {
+	Mobile     string `description:"手机号"`
+	UserName   string `description:"用户姓名"`
+	ActiveTime int    `description:"活跃时长, 单位秒"`
+}

+ 24 - 0
routers/eta_trial.go

@@ -0,0 +1,24 @@
+package routers
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hz_crm_eta/controller/eta_trial"
+)
+
+// InitEtaTrial ETA试用
+func InitEtaTrial(r *gin.RouterGroup) {
+	control := new(eta_trial.EtaTrialController)
+	group := r.Group("eta_trial/")
+	group.POST("user/mobile_fetch", control.GetUserByMobile)
+	group.POST("user/disable", control.Disable)
+	group.POST("user/edit", control.Edit)
+	group.POST("user/remove", control.Remove)
+	group.POST("user/update_login", control.UpdateLogin)
+	group.POST("user/update_index_num", control.UpdateIndexNum)
+	group.POST("user/update_chart_num", control.UpdateChartNum)
+	group.POST("user/update_active_time", control.UpdateActiveTime)
+	//group.POST("user/update_login_duration", control.UpdateLoginDuration)
+
+	group.POST("questionnaire/list", control.GetQuestionnaireList)
+	group.POST("questionnaire/commit", control.QuestionnaireCommit)
+}