diff --git a/server/adminserver/constant/constant.go b/server/adminserver/constant/constant.go index 513e6efc..376f050b 100644 --- a/server/adminserver/constant/constant.go +++ b/server/adminserver/constant/constant.go @@ -24,19 +24,3 @@ const ( API_MAIL_HOST_DEV = "localhost:9992" EMAIL_KEY = "520d8eeb8cf1d833a42c820432c020b2fd60f4b7|" + EMAIL_URL_DEV ) - -const ( - MAIL_TYPE_BEGIN = 0 - MAIL_TYPE_GROUP = 1 - MAIL_TYPE_ALL = 2 - MAIL_TYPE_END = iota -) - -const ( - EVENT_MAIL_UPDATE = "mail.update" - EVENT_UPSER_GROUP_UPDATE = "user_group.update" -) - -const ( - PARAM_NAME_LAST_SYNC_SYS_MAIL_IDX = "last_sync_sys_mail_idx" -) diff --git a/server/adminserver/task/taskmgr.go b/server/adminserver/task/taskmgr.go index 5c6c9163..a6fa0e2a 100644 --- a/server/adminserver/task/taskmgr.go +++ b/server/adminserver/task/taskmgr.go @@ -11,159 +11,13 @@ import ( ) type taskMgr struct { - lastSyncSysMailIdx int64 - syncSysMailCond *sync.Cond } var TaskMgr = new(taskMgr) func (this *taskMgr) Init() { - this.syncSysMailCond = sync.NewCond(new(sync.Mutex)) - f5.GetGoStyleDb().OrmSelectOne( - constant.MAIL_DB, - "t_param", - [][]string{ - {"param_name", constant.PARAM_NAME_LAST_SYNC_SYS_MAIL_IDX}, - }, - func (err error, ds *f5.DataSet) { - if err != nil { - panic(fmt.Sprintf("taskMgr init err:%s", err)) - return - } - if ds.Next() { - this.lastSyncSysMailIdx = q5.ToInt64(ds.GetByName("param_val1")) - } - go this.syncSysMail() - }) } func (this *taskMgr) UnInit() { } - -func (this *taskMgr) syncSysMail() { - go func () { - var waitMs int64 = 1000 * 2 - for { - select { - case <-time.After(time.Millisecond * time.Duration(waitMs)): - waitMs = 1000 * 2 - this.syncSysMailCond.Broadcast() - } - } - }() - lastOutTick := q5.GetTickCount() - for true { - this.pullSysMail() - this.syncSysMailCond.L.Lock() - this.syncSysMailCond.Wait() - this.syncSysMailCond.L.Unlock() - if q5.GetTickCount() - lastOutTick > 15 { - lastOutTick = q5.GetTickCount() - f5.GetSysLog().Info("taskMgr lastSyncSysMailIdx:%s", this.lastSyncSysMailIdx) - } - } -} - -func (this *taskMgr) pullSysMail() { - f5.GetGoStyleDb().SelectCustomQuery( - constant.MAIL_DB, - fmt.Sprintf("SELECT * FROM t_sys_mail WHERE idx>%d LIMIT 1000;", this.lastSyncSysMailIdx), - func (err error, ds *f5.DataSet) { - if err != nil { - f5.GetSysLog().Warning("pullSysMail %s", err) - return - } - for ds.Next() { - idx := q5.ToInt64(ds.GetByName("idx")) - f5.GetSysLog().Info("pullSysMail %s begin", idx) - if !this.writeMail(ds) { - return - } - f5.GetSysLog().Info("pullSysMail %s end", idx) - if idx > this.lastSyncSysMailIdx { - this.lastSyncSysMailIdx = idx - } - } - if ds.NumOfReaded() > 0 { - this.saveLastSyncSysMailIdx() - } - }) -} - -func (this *taskMgr) writeMail(ds *f5.DataSet) bool { - mailId := q5.ToString(f5.GetApp().NewLockNodeUuid()) - unikey := ds.GetByName("unikey") - subject := ds.GetByName("subject") - content := ds.GetByName("content") - recipients := ds.GetByName("recipients") - attachments := ds.GetByName("attachments") - tag1 := q5.ToInt32(ds.GetByName("tag1")) - tag2 := q5.ToInt32(ds.GetByName("tag2")) - sendTime := q5.ToInt32(ds.GetByName("sendtime")) - expireTime := q5.ToInt32(ds.GetByName("expiretime")) - userRegStartTime := q5.ToInt32(ds.GetByName("user_reg_start_time")) - userRegEndTime := q5.ToInt32(ds.GetByName("user_reg_end_time")) - var ok = false - f5.GetGoStyleDb().Upsert( - constant.MAIL_DB, - "t_mail", - [][]string{ - {"unikey", unikey}, - }, - [][]string{ - }, - [][]string{ - {"mail_id", mailId}, - {"mail_type", q5.ToString(constant.MAIL_TYPE_GROUP)}, - {"unikey", unikey}, - {"subject", subject}, - {"content", content}, - {"recipients", recipients}, - {"attachments", attachments}, - {"sendtime", q5.ToString(sendTime)}, - {"user_reg_start_time", q5.ToString(userRegStartTime)}, - {"user_reg_end_time", q5.ToString(userRegEndTime)}, - {"tag1", q5.ToString(tag1)}, - {"tag2", q5.ToString(tag2)}, - {"expiretime", q5.ToString(expireTime)}, - }, - func (err error, lastInsertId int64, rowsAffected int64) { - ok = err == nil - if err != nil { - f5.GetSysLog().Info("writeMail err:%s", err) - } else { - { - nowDaySeconds := int32(f5.GetApp().GetRealSeconds()) - e := new(system.MailEvent) - e.EventName = constant.EVENT_MAIL_UPDATE - e.Param1 = q5.ToString(mailId) - e.CreateTime = nowDaySeconds - e.ModifyTime = nowDaySeconds - f5.GetApp().GetOrmDb(constant.MAIL_DB).Create(e) - } - } - }) - return ok -} - -func (this *taskMgr) saveLastSyncSysMailIdx() { - f5.GetGoStyleDb().Upsert( - constant.MAIL_DB, - "t_param", - [][]string{ - {"param_name", constant.PARAM_NAME_LAST_SYNC_SYS_MAIL_IDX}, - }, - [][]string{ - {"param_val1", q5.ToString(this.lastSyncSysMailIdx)}, - }, - [][]string { - {"param_name", constant.PARAM_NAME_LAST_SYNC_SYS_MAIL_IDX}, - {"param_val1", q5.ToString(this.lastSyncSysMailIdx)}, - }, - func (err error, lastInsertId int64, rowsAffected int64) { - if err != nil { - f5.GetSysLog().Info("saveLastSyncSysMailIdx err:%s", err) - } - }) -} diff --git a/server/backtask/constant/constant.go b/server/backtask/constant/constant.go index b94757f1..2c362188 100644 --- a/server/backtask/constant/constant.go +++ b/server/backtask/constant/constant.go @@ -8,6 +8,7 @@ const ( BCNFT_DB = "bcnftdb" BCEVENT_DB = "bceventdb" GAME_DB = "gamedb" + MAIL_DB = "maildb" ) const ( diff --git a/server/backtask/model/mailevent.go b/server/backtask/model/mailevent.go new file mode 100644 index 00000000..f82f6f23 --- /dev/null +++ b/server/backtask/model/mailevent.go @@ -0,0 +1,15 @@ +package model + +import ( +) + +type MailEvent struct { + EventName string `gorm:"column:event_name" json:"event_name"` + Param1 string `gorm:"column:param1" json:"param1"` + CreateTime int32 `gorm:"column:createtime;<-:create" json:"createtime"` + ModifyTime int32 `gorm:"column:modifytime" json:"modifytime"` +} + +func (MailEvent) TableName() string { + return "t_event" +} diff --git a/server/backtask/task/sysmail.go b/server/backtask/task/sysmail.go new file mode 100644 index 00000000..9381d517 --- /dev/null +++ b/server/backtask/task/sysmail.go @@ -0,0 +1,167 @@ +package task + +import ( + "q5" + "f5" + "time" + "fmt" + "sync" + "jccommon" + "main/constant" + "main/model" +) + +type sysMail struct { + lastSyncSysMailIdx int64 + syncSysMailCond *sync.Cond +} + +func (this* sysMail) init() { + this.syncSysMailCond = sync.NewCond(new(sync.Mutex)) + f5.GetGoStyleDb().OrmSelectOne( + constant.MAIL_DB, + "t_param", + [][]string{ + {"param_name", jccommon.PARAM_NAME_LAST_SYNC_SYS_MAIL_IDX}, + }, + func (err error, ds *f5.DataSet) { + if err != nil { + panic(fmt.Sprintf("taskMgr init err:%s", err)) + return + } + if ds.Next() { + this.lastSyncSysMailIdx = q5.ToInt64(ds.GetByName("param_val1")) + } + go this.syncSysMail() + }) +} + +func (this* sysMail) unInit() { +} + +func (this *sysMail) syncSysMail() { + go func () { + var waitMs int64 = 1000 * 2 + for { + select { + case <-time.After(time.Millisecond * time.Duration(waitMs)): + waitMs = 1000 * 2 + this.syncSysMailCond.Broadcast() + } + } + }() + lastOutTick := q5.GetTickCount() + for true { + this.pullSysMail() + this.syncSysMailCond.L.Lock() + this.syncSysMailCond.Wait() + this.syncSysMailCond.L.Unlock() + if q5.GetTickCount() - lastOutTick > 15 { + lastOutTick = q5.GetTickCount() + f5.GetSysLog().Info("taskMgr lastSyncSysMailIdx:%s", this.lastSyncSysMailIdx) + } + } +} + +func (this *sysMail) pullSysMail() { + f5.GetGoStyleDb().SelectCustomQuery( + constant.MAIL_DB, + fmt.Sprintf("SELECT * FROM t_sys_mail WHERE idx>%d LIMIT 1000;", this.lastSyncSysMailIdx), + func (err error, ds *f5.DataSet) { + if err != nil { + f5.GetSysLog().Warning("pullSysMail %s", err) + return + } + for ds.Next() { + idx := q5.ToInt64(ds.GetByName("idx")) + f5.GetSysLog().Info("pullSysMail %s begin", idx) + if !this.writeMail(ds) { + return + } + f5.GetSysLog().Info("pullSysMail %s end", idx) + if idx > this.lastSyncSysMailIdx { + this.lastSyncSysMailIdx = idx + } + } + if ds.NumOfReaded() > 0 { + this.saveLastSyncSysMailIdx() + } + }) +} + +func (this *sysMail) writeMail(ds *f5.DataSet) bool { + mailId := q5.ToString(f5.GetApp().NewLockNodeUuid()) + unikey := ds.GetByName("unikey") + subject := ds.GetByName("subject") + content := ds.GetByName("content") + recipients := ds.GetByName("recipients") + attachments := ds.GetByName("attachments") + tag1 := q5.ToInt32(ds.GetByName("tag1")) + tag2 := q5.ToInt32(ds.GetByName("tag2")) + sendTime := q5.ToInt32(ds.GetByName("sendtime")) + expireTime := q5.ToInt32(ds.GetByName("expiretime")) + userRegStartTime := q5.ToInt32(ds.GetByName("user_reg_start_time")) + userRegEndTime := q5.ToInt32(ds.GetByName("user_reg_end_time")) + var ok = false + f5.GetGoStyleDb().Upsert( + constant.MAIL_DB, + "t_mail", + [][]string{ + {"unikey", unikey}, + }, + [][]string{ + }, + [][]string{ + {"mail_id", mailId}, + {"mail_type", q5.ToString(jccommon.MAIL_TYPE_GROUP)}, + {"unikey", unikey}, + {"subject", subject}, + {"content", content}, + {"recipients", recipients}, + {"attachments", attachments}, + {"sendtime", q5.ToString(sendTime)}, + {"user_reg_start_time", q5.ToString(userRegStartTime)}, + {"user_reg_end_time", q5.ToString(userRegEndTime)}, + {"tag1", q5.ToString(tag1)}, + {"tag2", q5.ToString(tag2)}, + {"expiretime", q5.ToString(expireTime)}, + }, + func (err error, lastInsertId int64, rowsAffected int64) { + ok = err == nil + if err != nil { + f5.GetSysLog().Info("writeMail err:%s", err) + } else { + { + nowDaySeconds := int32(f5.GetApp().GetRealSeconds()) + e := new(model.MailEvent) + e.EventName = jccommon.EVENT_MAIL_UPDATE + e.Param1 = q5.ToString(mailId) + e.CreateTime = nowDaySeconds + e.ModifyTime = nowDaySeconds + f5.GetApp().GetOrmDb(constant.MAIL_DB).Create(e) + } + } + }) + return ok +} + +func (this *sysMail) saveLastSyncSysMailIdx() { + f5.GetGoStyleDb().Upsert( + constant.MAIL_DB, + "t_param", + [][]string{ + {"param_name", jccommon.PARAM_NAME_LAST_SYNC_SYS_MAIL_IDX}, + }, + [][]string{ + {"param_val1", q5.ToString(this.lastSyncSysMailIdx)}, + }, + [][]string { + {"param_name", jccommon.PARAM_NAME_LAST_SYNC_SYS_MAIL_IDX}, + {"param_val1", q5.ToString(this.lastSyncSysMailIdx)}, + }, + func (err error, lastInsertId int64, rowsAffected int64) { + if err != nil { + f5.GetSysLog().Info("saveLastSyncSysMailIdx err:%s", err) + } + }) +} diff --git a/server/backtask/task/taskmgr.go b/server/backtask/task/taskmgr.go index a4c253e0..6ef95a06 100644 --- a/server/backtask/task/taskmgr.go +++ b/server/backtask/task/taskmgr.go @@ -14,6 +14,7 @@ type taskMgr struct { spec_transfer721.SpecTransfer721 repairNft openGoldLock sync.Mutex + sysMail } func (this *taskMgr) Init() { @@ -23,9 +24,11 @@ func (this *taskMgr) Init() { this.goldBullionReturn.init() this.SpecTransfer721.Init() this.repairNft.init() + this.sysMail.init() } func (this *taskMgr) UnInit() { + this.sysMail.unInit() this.repairNft.unInit() this.SpecTransfer721.UnInit() this.goldBullionReturn.unInit() diff --git a/server/jccommon/constant.go b/server/jccommon/constant.go index bf3fbd7a..ace0c6fa 100644 --- a/server/jccommon/constant.go +++ b/server/jccommon/constant.go @@ -60,3 +60,19 @@ const ( GOLD_BULLION_OPEN_STATUS_SENT = 1 GOLD_BULLION_OPEN_STATUS_RECEIVED = 2 ) + +const ( + PARAM_NAME_LAST_SYNC_SYS_MAIL_IDX = "last_sync_sys_mail_idx" +) + +const ( + MAIL_TYPE_BEGIN = 0 + MAIL_TYPE_GROUP = 1 + MAIL_TYPE_ALL = 2 + MAIL_TYPE_END = iota +) + +const ( + EVENT_MAIL_UPDATE = "mail.update" + EVENT_UPSER_GROUP_UPDATE = "user_group.update" +)