|
@@ -0,0 +1,148 @@
|
|
|
+package models
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "github.com/beego/beego/v2/client/orm"
|
|
|
+ "strings"
|
|
|
+ "sync"
|
|
|
+)
|
|
|
+
|
|
|
+// UserReportViewRecord 用户报告阅读记录表(汇总表)
|
|
|
+type UserReportViewRecord struct {
|
|
|
+ Id int `orm:"column(id);pk"`
|
|
|
+ Source int8 `description:"来源,1:rddp的报告;2:weekly_report的PHP报告;3:weekly_report商品的报告(应该是作废了);4:察研观向的报告"`
|
|
|
+ UserId int `description:"用户id"`
|
|
|
+ ReportId int `description:"报告id"`
|
|
|
+ ReportChapterId int `description:"报告章节id"`
|
|
|
+ Mobile string `description:"手机号"`
|
|
|
+ Email string `description:"邮箱"`
|
|
|
+ RealName string `description:"用户实际姓名"`
|
|
|
+ CompanyName string `description:"公司名称"`
|
|
|
+ StopTime int `description:"停留时间"`
|
|
|
+ OutId string `description:"外部关联id"`
|
|
|
+ CreateTime string `description:"创建时间"`
|
|
|
+}
|
|
|
+
|
|
|
+// TableName 表名
|
|
|
+func (obj UserReportViewRecord) TableName() string {
|
|
|
+ return `user_report_view_record`
|
|
|
+}
|
|
|
+
|
|
|
+// GetViewReportList 单条记录插入
|
|
|
+func (obj UserReportViewRecord) GetViewReportList(year int, condition string, pars []interface{}, startSize, pageSize int) (total int64, items []*UserReportViewRecord, err error) {
|
|
|
+ tableName := obj.GetTableName(year)
|
|
|
+
|
|
|
+ o := orm.NewOrm()
|
|
|
+ sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1 = 1 `, tableName)
|
|
|
+ if condition != "" {
|
|
|
+ sql += condition
|
|
|
+ }
|
|
|
+ sql += ` ORDER BY create_time DESC,id DESC LIMIT ?,? `
|
|
|
+ total, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
|
|
|
+
|
|
|
+ return
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+// Insert 单条记录插入
|
|
|
+func (obj UserReportViewRecord) Insert(year int, item *UserReportViewRecord) (err error) {
|
|
|
+ tableName := obj.GetTableName(year)
|
|
|
+
|
|
|
+ sql := "INSERT INTO " + tableName + " (`source`, `user_id`, `report_id`, `report_chapter_id`, `mobile`, `email`, `real_name`, `company_name`, `stop_time`, `out_id`, `create_time`) VALUES "
|
|
|
+
|
|
|
+ valStr := fmt.Sprintf(`( %d, %d, %d, %d, "%s", "%s","%s", "%s", %d, "%s", "%s")`, item.Source, item.UserId, item.ReportId, item.ReportChapterId, item.Mobile, item.Email, item.RealName, item.CompanyName, item.StopTime, item.OutId, item.CreateTime)
|
|
|
+
|
|
|
+ sql = sql + valStr + ";"
|
|
|
+
|
|
|
+ o := orm.NewOrm()
|
|
|
+
|
|
|
+ // 先校验表是否存在,不存在的话,需要创建表
|
|
|
+ err = obj.CheckAndCreateTable(o, tableName)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 插入数据
|
|
|
+ _, err = o.Raw(sql).Exec()
|
|
|
+
|
|
|
+ return
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+// InsertMul 单条记录插入
|
|
|
+func (obj UserReportViewRecord) InsertMul(year int, items []*UserReportViewRecord) (err error) {
|
|
|
+ tableName := obj.GetTableName(year)
|
|
|
+
|
|
|
+ sql := "INSERT INTO " + tableName + " (`source`, `user_id`, `report_id`, `report_chapter_id`, `mobile`, `email`, `real_name`, `company_name`, `stop_time`, `out_id`, `create_time`) VALUES "
|
|
|
+
|
|
|
+ valStrList := make([]string, 0)
|
|
|
+ for _, item := range items {
|
|
|
+ valStrList = append(valStrList, fmt.Sprintf(`( %d, %d, %d, %d, "%s", "%s","%s", "%s", %d, "%s", "%s")`, item.Source, item.UserId, item.ReportId, item.ReportChapterId, item.Mobile, item.Email, item.RealName, item.CompanyName, item.StopTime, item.OutId, item.CreateTime))
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(valStrList) <= 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ valStr := strings.Join(valStrList, ",")
|
|
|
+ sql = sql + valStr + ";"
|
|
|
+
|
|
|
+ o := orm.NewOrm()
|
|
|
+
|
|
|
+ // 先校验表是否存在,不存在的话,需要创建表
|
|
|
+ err = obj.CheckAndCreateTable(o, tableName)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 插入数据
|
|
|
+ _, err = o.Raw(sql).Exec()
|
|
|
+
|
|
|
+ return
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+// GetTableName 获取表名
|
|
|
+func (obj UserReportViewRecord) GetTableName(year int) string {
|
|
|
+ return fmt.Sprintf(`user_report_view_record_%d`, year)
|
|
|
+}
|
|
|
+
|
|
|
+// tableNameMap 已创建表的map
|
|
|
+var tableNameMap = map[string]string{}
|
|
|
+
|
|
|
+// createTableMutex 创建表的时候的锁
|
|
|
+var createTableMutex = &sync.Mutex{}
|
|
|
+
|
|
|
+// CheckAndCreateTable 通过表名校验表是否存在,不存在的话,需要创建表
|
|
|
+func (obj UserReportViewRecord) CheckAndCreateTable(o orm.Ormer, tableName string) (err error) {
|
|
|
+ if _, ok := tableNameMap[tableName]; ok {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 表判断的时候需要加锁,避免多个协程调用时,表还没有创建成功,又被另一个协程发现表不存在,然后再次创建表
|
|
|
+ createTableMutex.Lock()
|
|
|
+ defer func() {
|
|
|
+ createTableMutex.Unlock()
|
|
|
+ }()
|
|
|
+
|
|
|
+ db := o.Raw(fmt.Sprintf(`SHOW TABLES LIKE "%s"`, tableName))
|
|
|
+ var result []orm.Params
|
|
|
+ _, err = db.Values(&result)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("查询表失败:", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 不存在该表,那么就去创建表
|
|
|
+ if len(result) <= 0 {
|
|
|
+ baseSql := fmt.Sprintf("CREATE TABLE `%s` (\n `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',\n `source` tinyint(20) NOT NULL DEFAULT '0' COMMENT '来源,1:rddp的报告;2:weekly_report的PHP报告;3:weekly_report商品的报告(应该是作废了);4:察研观向的报告',\n `user_id` int(11) DEFAULT '0' COMMENT '用户id',\n `report_id` int(11) DEFAULT '0' COMMENT '报告id',\n `report_chapter_id` int(10) DEFAULT NULL COMMENT '报告章节id',\n `mobile` varchar(20) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '手机号',\n `email` varchar(100) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '邮箱',\n `real_name` varchar(30) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '用户时间名称',\n `company_name` varchar(100) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '公司名称',\n `stop_time` int(5) NOT NULL DEFAULT '0' COMMENT '停留时间',\n `out_id` varchar(20) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '外部关联id',\n `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '阅读时间',\n PRIMARY KEY (`id`),\n KEY `idx_user_id` (`user_id`),\n KEY `idx_report_id` (`report_id`),\n KEY `idx_mobile` (`mobile`),\n KEY `idx_email` (`email`),\n KEY `idx_ctime` (`create_time`)\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;", tableName)
|
|
|
+ _, err = o.Raw(baseSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ tableNameMap[tableName] = tableName
|
|
|
+
|
|
|
+ return
|
|
|
+}
|