123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- 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
- }
|