go-common/app/job/main/growup/service/data.go
2019-04-22 18:49:16 +08:00

888 lines
25 KiB
Go

package service
import (
"bytes"
"context"
"fmt"
"strconv"
"time"
"go-common/app/job/main/growup/model"
"go-common/library/database/sql"
"go-common/library/log"
)
const (
_updateUpAccount = "UPDATE up_account SET withdraw_date_version = '%s', total_unwithdraw_income=total_income - total_withdraw_income - exchange_income where withdraw_date_version = '%s' AND is_deleted = 0"
_updateTagAdjust = "UPDATE tag_info SET adjust_type = 1 WHERE id = %d AND adjust_type = 0"
// fix data
_txUpdateAvIncome = "UPDATE av_income SET total_income = total_income %s, income = income %s WHERE av_id = %d AND mid = %d AND date = '%s'"
_txUpdateAvIncomeStatis = "UPDATE av_income_statis SET total_income = total_income %s WHERE av_id = %d AND mid = %d"
_txUpdateAvIncomeStatisIncome = "UPDATE av_income_%s_statis SET income = income %s WHERE category_id = %d AND cdate = '%s'"
_txUpAccount = "UPDATE up_account SET total_income = total_income %s, total_unwithdraw_income = total_unwithdraw_income %s WHERE mid = %d AND is_deleted = 0"
_txUpIncomeTable = "UPDATE %s SET av_income = av_income %s, total_income = total_income %s, income = income %s WHERE mid = %d AND date = '%s'"
_txUpIncomeStatis = "UPDATE up_income_statis SET total_income = total_income %s WHERE mid = %d"
_txUpIncomeDailyStatis = "UPDATE up_income_daily_statis set income = income %s WHERE cdate = '%s'"
_txTagInsertUpIncomeDate = "INSERT INTO %s(mid,income,total_income,date) VALUES(%d,%d,%d,'%s') ON DUPLICATE KEY UPDATE total_income=VALUES(total_income),income=VALUES(income)"
_txTagInsertUpIncomeStatis = "INSERT INTO up_income_statis(mid, total_income) VALUES(%d,%d) ON DUPLICATE KEY UPDATE total_income=VALUES(total_income)"
_txTagInsertUpAccount = "INSERT INTO up_account(mid,has_sign_contract,state,total_income,total_unwithdraw_income,withdraw_date_version) VALUES(%d,1,1,%d,%d,'%s') ON DUPLICATE KEY UPDATE total_income=VALUES(total_income),total_unwithdraw_income=VALUES(total_unwithdraw_income)"
_txTagUpIncomeDailyStatis = "UPDATE up_income_daily_statis SET ups = ups + %d WHERE cdate = '%s' AND money_section = %d"
_txUpAvStatis = "INSERT INTO up_av_statis(mid,weekly_date,weekly_av_ids,monthly_date,monthly_av_ids) VALUES(%d,'2018-05-28','%s', '2018-05-01', '%s') ON DUPLICATE KEY UPDATE mid=VALUES(mid)"
_txAddUpIncomeStatis = "UPDATE up_income_statis SET total_income = total_income + %d WHERE mid = %d"
_txAddAvIncomeStatis = "UPDATE av_income_statis SET total_income = total_income + %d WHERE av_id = %d"
_txAddUpIncome = "UPDATE %s SET total_income = total_income + %d, income = income + %d, av_income = av_income + %d WHERE mid = %d AND date = '%s'"
_txAddAvIncome = "UPDATE av_income SET total_income = total_income + %d, income = income + %d WHERE av_id = %d AND date = '%s'"
_txAddUpAccount = "UPDATE up_account SET total_income = total_income + %d, total_unwithdraw_income = total_unwithdraw_income + %d WHERE mid = %d"
_txUpdateAccountType = "UPDATE up_info_video SET account_type=%d WHERE mid=%d"
_txUpdateUpAccountMoney = "UPDATE up_account SET total_income = total_income + %d, total_unwithdraw_income = total_unwithdraw_income + %d WHERE mid = %d LIMIT 1"
_txUpdateUpBaseIncome = "UPDATE up_income SET base_income=%d WHERE mid=%d AND date='%s'"
_txInUpInfoPGCSQL = "INSERT INTO up_info_bgm(mid,nickname,fans,account_type,account_state,sign_type) values(%d,%s,%d,%d,%d,%d) ON DUPLICATE KEY UPDATE account_type=VALUES(account_type)"
_txDelAvBreachSQL = "DELETE FROM av_breach_record WHERE id = %d LIMIT 1"
_txUpTotalIncomeSQL = "UPDATE %s SET total_income = total_income - %d WHERE mid = %d AND date = '%s' LIMIT 1"
_txColumnTagSQL = "UPDATE %s SET tag_id = %d WHERE date = '2018-08-19' AND tag_id in (%s) AND inc_charge > 0"
_txUpdateBgmBaseIncome = "UPDATE up_income SET bgm_base_income=bgm_income WHERE mid=%d AND date='%s' AND bgm_base_income=0"
_txDelData = "DELETE FROM %s LIMIT %d"
)
// DelDataLimit del up_bill
func (s *Service) DelDataLimit(c context.Context, table string, count int64) (err error) {
if table == "" {
return
}
return s.txUpdateSQL(c, fmt.Sprintf(_txDelData, table, count), count)
}
// FixBgmBaseIncome fix bgm base income
func (s *Service) FixBgmBaseIncome(c context.Context, mid int64, date string) (err error) {
sql := fmt.Sprintf(_txUpdateBgmBaseIncome, mid, date)
return s.txUpdateSQL(c, sql, 1)
}
// FixBaseIncome fix income
func (s *Service) FixBaseIncome(c context.Context, base int64, mid int64, date string) (err error) {
sql := fmt.Sprintf(_txUpdateUpBaseIncome, base, mid, date)
return s.txUpdateSQL(c, sql, 1)
}
// FixIncome fix income
func (s *Service) FixIncome(c context.Context) (err error) {
date := time.Date(2018, 9, 10, 0, 0, 0, 0, time.Local)
total, err := s.getAvIncome(c, date)
if err != nil {
log.Error("s.getAvIncome error(%v)", err)
return
}
avIncomes := make([]*model.IncomeInfo, 0)
for _, av := range total {
if av.UploadTime.Unix() >= date.Unix() {
avIncomes = append(avIncomes, av)
}
}
if len(avIncomes) != 1768 {
err = fmt.Errorf("get av_income(%d) != 1768", len(avIncomes))
return
}
var tx *sql.Tx
tx, err = s.dao.BeginTran(c)
if err != nil {
log.Error("s.dao.BeginTran error(%v)", err)
return
}
for _, av := range avIncomes {
// av_income_statis
err = s.updateSQL(tx, fmt.Sprintf(_txAddAvIncomeStatis, av.Income, av.AVID), 1)
if err != nil {
log.Error("s.UpdateSQL(%s) error(%v)", _txAddAvIncomeStatis, err)
return
}
// up_income_statis
err = s.updateSQL(tx, fmt.Sprintf(_txAddUpIncomeStatis, av.Income, av.MID), 1)
if err != nil {
log.Error("s.UpdateSQL(%s) error(%v)", _txAddUpIncomeStatis, err)
return
}
// av_income
err = s.updateSQL(tx, fmt.Sprintf(_txAddAvIncome, av.Income, av.Income, av.AVID, "2018-09-10"), 1)
if err != nil {
log.Error("s.UpdateSQL(%s) error(%v)", _txAddAvIncome, err)
return
}
// up_income
err = s.updateSQL(tx, fmt.Sprintf(_txAddUpIncome, "up_income", av.Income, av.Income, av.Income, av.MID, "2018-09-10"), 1)
if err != nil {
log.Error("s.UpdateSQL(%s) error(%v)", _txAddUpIncome, err)
return
}
// up_income_weekly
err = s.updateSQL(tx, fmt.Sprintf(_txAddUpIncome, "up_income_weekly", av.Income, av.Income, av.Income, av.MID, "2018-09-10"), 1)
if err != nil {
log.Error("s.UpdateSQL(%s) error(%v)", _txAddUpIncome, err)
return
}
// up_income_monthly
err = s.updateSQL(tx, fmt.Sprintf(_txAddUpIncome, "up_income_monthly", av.Income, av.Income, av.Income, av.MID, "2018-09-01"), 1)
if err != nil {
log.Error("s.UpdateSQL(%s) error(%v)", _txAddUpIncome, err)
return
}
// up_account
err = s.updateSQL(tx, fmt.Sprintf(_txAddUpAccount, av.Income, av.Income, av.MID), 1)
if err != nil {
log.Error("s.UpdateSQL(%s) error(%v)", _txAddUpAccount, err)
return
}
}
if err = tx.Commit(); err != nil {
log.Error("tx.Commit error")
}
return
}
// FixUpAvStatis fix up_av_statis
func (s *Service) FixUpAvStatis(c context.Context, count int) (err error) {
upIncome, err := s.GetUpIncome(c, "up_income", "2018-05-31")
if err != nil {
log.Error("s.GetUpIncome error(%v)", err)
return
}
tx, err := s.dao.BeginTran(c)
if err != nil {
log.Error("s.dao.BeginTran error(%v)", err)
return
}
// 301
addCount := 0
for _, up := range upIncome {
if up.TotalIncome == 12700 && up.Income == 12700 {
err = s.updateSQL(tx, fmt.Sprintf(_txUpAvStatis, up.MID, "", ""), 0)
if err != nil {
log.Error("s.UpdateSQL error(%v)", err)
return
}
addCount++
}
}
if count != addCount {
err = fmt.Errorf("需要添加的record不匹配 %d:%d", count, addCount)
tx.Rollback()
return
}
if err = tx.Commit(); err != nil {
log.Error("tx.Commit error")
}
return
}
// FixUpIncome fix up_income
func (s *Service) FixUpIncome(c context.Context, date string, tagID int64, addCount, needAddIncome int) (err error) {
upIncome, err := s.GetUpIncome(c, "up_income", date)
if err != nil {
log.Error("s.GetUpIncome error(%v)", err)
return
}
upChargeRatio, err := s.dao.GetUpChargeRatio(c, tagID)
if err != nil {
log.Error("s.dao.GetUpChargeRatio error(%v)", err)
return
}
for _, up := range upIncome {
if _, ok := upChargeRatio[up.MID]; ok {
delete(upChargeRatio, up.MID)
}
}
if len(upChargeRatio) != addCount {
err = fmt.Errorf("需要调节的up主数量不匹配 %d:%d", len(upChargeRatio), addCount)
return
}
mids := make([]int64, 0)
for mid := range upChargeRatio {
mids = append(mids, mid)
}
upIncomeStatis, err := s.dao.GetUpIncomeStatis(c, mids)
if err != nil {
log.Error("s.dao.GetUpIncomeStatis error(%v)", err)
return
}
upIncomeWeek, err := s.dao.GetUpIncomeDate(c, mids, "up_income_weekly", "2018-05-28")
if err != nil {
log.Error("s.dao.GetUpIncomeDate error(%v)", err)
return
}
upIncomeMonth, err := s.dao.GetUpIncomeDate(c, mids, "up_income_monthly", "2018-05-01")
if err != nil {
log.Error("s.dao.GetUpIncomeDate error(%v)", err)
return
}
tx, err := s.dao.BeginTran(c)
if err != nil {
log.Error("s.dao.BeginTran error(%v)", err)
return
}
// start add
var totalAddIncome int64
for mid, ratio := range upChargeRatio {
totalIncome := upIncomeStatis[mid]
weekIncome := upIncomeWeek[mid]
monthIncome := upIncomeMonth[mid]
// up_income
err = s.insertIntoSQL(tx, fmt.Sprintf(_txTagInsertUpIncomeDate, "up_income", mid, ratio, totalIncome+ratio, date), 1)
if err != nil {
log.Error("s.UpdateSQL error(%v)", err)
return
}
// up_income_weekly todo
weekDate := "2018-05-28"
err = s.insertIntoSQL(tx, fmt.Sprintf(_txTagInsertUpIncomeDate, "up_income_weekly", mid, ratio+weekIncome, totalIncome+ratio, weekDate), 0)
if err != nil {
log.Error("s.UpdateSQL error(%v)", err)
return
}
// up_income_monthly todo
monthDate := "2018-05-01"
err = s.insertIntoSQL(tx, fmt.Sprintf(_txTagInsertUpIncomeDate, "up_income_monthly", mid, ratio+monthIncome, totalIncome+ratio, monthDate), 0)
if err != nil {
log.Error("s.UpdateSQL error(%v)", err)
return
}
// up_income_statis
err = s.insertIntoSQL(tx, fmt.Sprintf(_txTagInsertUpIncomeStatis, mid, ratio+totalIncome), 0)
if err != nil {
log.Error("s.insertIntoSQL error(%v)", err)
return
}
// up_account
err = s.insertIntoSQL(tx, fmt.Sprintf(_txTagInsertUpAccount, mid, ratio+totalIncome, ratio+totalIncome, "2018-04"), 0)
if err != nil {
log.Error("s.insertIntoSQL error(%v)", err)
return
}
totalAddIncome += ratio
}
// up_income_daily_statis
if totalAddIncome != int64(needAddIncome) {
err = fmt.Errorf("需要调节的up主总收入不匹配 %d:%d", totalAddIncome, needAddIncome)
tx.Rollback()
return
}
add := fmt.Sprintf(" + %d", totalAddIncome)
err = s.updateSQL(tx, fmt.Sprintf(_txUpIncomeDailyStatis, add, date), 12)
if err != nil {
log.Error("s.UpdateSQL error(%v)", err)
return
}
err = s.updateSQL(tx, fmt.Sprintf(_txTagUpIncomeDailyStatis, len(upChargeRatio), date, 3), 1)
if err != nil {
log.Error("s.UpdateSQL error(%v)", err)
return
}
if err = tx.Commit(); err != nil {
log.Error("tx.Commit error")
}
return
}
func (s *Service) getAllAvRatio(c context.Context, limit int64) (rs map[int64]*model.AvChargeRatio, err error) {
rs = make(map[int64]*model.AvChargeRatio)
var id int64
for {
var ros map[int64]*model.AvChargeRatio
ros, id, err = s.dao.AvChargeRatio(c, id, limit)
if err != nil {
return
}
if len(ros) == 0 {
break
}
for k, v := range ros {
rs[k] = v
}
}
return
}
// UpdateTagIncome update tag_Info income
func (s *Service) UpdateTagIncome(c context.Context, date string) (err error) {
avRatio, err := s.getAllAvRatio(c, 2000)
if err != nil {
log.Error("s.getAllAvRatio error(%v)", err)
return
}
log.Info("get avratios:%d", len(avRatio))
updateDate := time.Date(2018, 6, 24, 0, 0, 0, 0, time.Local)
avIncome, err := s.getAvIncome(c, updateDate)
if err != nil {
log.Error("s.getAvIncome error(%v)", err)
return
}
log.Info("get av_income:%d ", len(avIncome))
err = s.updateIncome(c, avIncome, avRatio)
if err != nil {
log.Error("s.updateIncome error(%v)", err)
return
}
return
}
// GetTrueAvsIncome get true av_income
func (s *Service) GetTrueAvsIncome(c context.Context, mids []int64, date string) (avs map[int64]*model.Patch, err error) {
avs = make(map[int64]*model.Patch)
for _, mid := range mids {
var av map[int64]*model.Patch
av, err = s.AvIncomes(c, mid, date)
if err != nil {
return
}
for key, val := range av {
avs[key] = val
}
}
return
}
func (s *Service) updateIncome(c context.Context, avIncome []*model.IncomeInfo, avRatio map[int64]*model.AvChargeRatio) (err error) {
trueAvs := make([]*model.IncomeInfo, 0)
uploadTime := time.Date(2018, 6, 24, 0, 0, 0, 0, time.Local)
for _, av := range avIncome {
if !uploadTime.After(av.UploadTime) {
if _, ok := avRatio[av.AVID]; !ok {
trueAvs = append(trueAvs, av)
}
}
}
if len(trueAvs) != 1856 {
err = fmt.Errorf("实际被作用稿件(%d) != 1856", len(trueAvs))
return
}
tx, err := s.dao.BeginTran(c)
if err != nil {
log.Error("s.dao.BeginTran error(%v)", err)
return
}
for _, av := range trueAvs {
var incIncome, categoryID int64
incIncome, categoryID, err = s.dao.AvDailyIncCharge(c, av.AVID)
if err != nil {
log.Error("s.dao.AvDailyIncCharge avid(%d) error(%v)", av.MID, err)
return
}
err = s.TxUpdateIncome(tx, av.AVID, av.MID, categoryID, incIncome)
if err != nil {
log.Error("ERROR(%v) avid(%d), mid(%d)", err, av.AVID, av.MID)
return
}
}
if err = tx.Commit(); err != nil {
log.Error("tx.Commit error")
}
return
}
// TxUpdateIncome update creative income
func (s *Service) TxUpdateIncome(tx *sql.Tx, avID, mid, categoryID int64, incIncome int64) (err error) {
if incIncome <= 0 {
return
}
var incIncomeStr string
if incIncome > 0 {
incIncomeStr = fmt.Sprintf("+ %d", incIncome)
}
date := "2018-06-24"
// av_income
avIncomeSQL := fmt.Sprintf(_txUpdateAvIncome, incIncomeStr, incIncomeStr, avID, mid, date)
err = s.updateSQL(tx, avIncomeSQL, 1)
if err != nil {
log.Error("s.UpdateSQL error(%v)", err)
return
}
// av_income_statis
avIncomeStatisSQL := fmt.Sprintf(_txUpdateAvIncomeStatis, incIncomeStr, avID, mid)
err = s.updateSQL(tx, avIncomeStatisSQL, 1)
if err != nil {
log.Error("s.UpdateSQL error(%v)", err)
return
}
// av_income_daily_statis
avIncomeDailyStatisIncome := fmt.Sprintf(_txUpdateAvIncomeStatisIncome, "daily", incIncomeStr, categoryID, date)
err = s.updateSQL(tx, avIncomeDailyStatisIncome, 12)
if err != nil {
log.Error("s.UpdateSQL error(%v)", err)
return
}
// av_income_weekly_statis
avIncomeWeeklyStatisIncome := fmt.Sprintf(_txUpdateAvIncomeStatisIncome, "weekly", incIncomeStr, categoryID, "2018-06-18")
err = s.updateSQL(tx, avIncomeWeeklyStatisIncome, 12)
if err != nil {
log.Error("s.UpdateSQL error(%v)", err)
return
}
// av_income_monthly_statis
avIncomeMonthlyStatisIncome := fmt.Sprintf(_txUpdateAvIncomeStatisIncome, "monthly", incIncomeStr, categoryID, "2018-06-01")
err = s.updateSQL(tx, avIncomeMonthlyStatisIncome, 12)
if err != nil {
log.Error("s.UpdateSQL error(%v)", err)
return
}
// up_account
upAcccountSQL := fmt.Sprintf(_txUpAccount, incIncomeStr, incIncomeStr, mid)
err = s.updateSQL(tx, upAcccountSQL, 1)
if err != nil {
log.Error("s.UpdateSQL error(%v)", err)
return
}
// up_income_statis
upIncomeStatisSQL := fmt.Sprintf(_txUpIncomeStatis, incIncomeStr, mid)
err = s.updateSQL(tx, upIncomeStatisSQL, 1)
if err != nil {
log.Error("s.UpdateSQL error(%v)", err)
return
}
// up_income_daily_statis
upIncomeDailyStatisSQL := fmt.Sprintf(_txUpIncomeDailyStatis, incIncomeStr, date)
err = s.updateSQL(tx, upIncomeDailyStatisSQL, 12)
if err != nil {
log.Error("s.UpdateSQL error(%v)", err)
return
}
// up_income
upIncomeSQL := fmt.Sprintf(_txUpIncomeTable, "up_income", incIncomeStr, incIncomeStr, incIncomeStr, mid, date)
err = s.updateSQL(tx, upIncomeSQL, 1)
if err != nil {
log.Error("s.UpdateSQL error(%v)", err)
return
}
// up_income_weekly
upIncomeWeeklySQL := fmt.Sprintf(_txUpIncomeTable, "up_income_weekly", incIncomeStr, incIncomeStr, incIncomeStr, mid, "2018-06-18")
err = s.updateSQL(tx, upIncomeWeeklySQL, 1)
if err != nil {
log.Error("s.UpdateSQL error(%v)", err)
return
}
// up_income_monthly
upIncomeMonthlySQL := fmt.Sprintf(_txUpIncomeTable, "up_income_monthly", incIncomeStr, incIncomeStr, incIncomeStr, mid, "2018-06-01")
err = s.updateSQL(tx, upIncomeMonthlySQL, 1)
if err != nil {
log.Error("s.UpdateSQL error(%v)", err)
return
}
// up_av_statis 不需要修改
// up_income_withdraw 不需要修改
return
}
// UpdateWithdraw update up_account withdraw
func (s *Service) UpdateWithdraw(c context.Context, oldDate, newDate string, count int64) (err error) {
sql := fmt.Sprintf(_updateUpAccount, newDate, oldDate)
return s.txUpdateSQL(c, sql, count)
}
// UpdateTagAdjust update tag adjust_type
func (s *Service) UpdateTagAdjust(c context.Context, id int64) (err error) {
sql := fmt.Sprintf(_updateTagAdjust, id)
return s.txUpdateSQL(c, sql, 1)
}
// UpdateAccountType update account type
func (s *Service) UpdateAccountType(c context.Context, mid int64, accType int) (err error) {
sql := fmt.Sprintf(_txUpdateAccountType, accType, mid)
return s.txUpdateSQL(c, sql, 1)
}
// UpdateUpAccountMoney update up_account
func (s *Service) UpdateUpAccountMoney(c context.Context, mid int64, total, unwithdraw int64) (err error) {
sql := fmt.Sprintf(_txUpdateUpAccountMoney, total, unwithdraw, mid)
return s.txUpdateSQL(c, sql, 1)
}
// SyncUpPGC sync pgc up from up_info_video to up_info_column
func (s *Service) SyncUpPGC(c context.Context) (err error) {
ups, err := s.getAllUps(c, 2000)
if err != nil {
log.Error("s.getAllUps error(%v)", err)
return
}
tx, err := s.dao.BeginTran(c)
if err != nil {
log.Error("s.dao.BeginTran error(%v)", err)
return
}
for _, up := range ups {
if up.AccountType == 2 {
sql := fmt.Sprintf(_txInUpInfoPGCSQL, up.MID, "\""+up.Nickname+"\"", up.Fans, 2, 1, 2)
err = s.insertIntoSQL(tx, sql, 0)
if err != nil {
log.Error("s.UpdateSQL(%s) error(%v)", _txInUpInfoPGCSQL, err)
return
}
}
}
if err = tx.Commit(); err != nil {
log.Error("tx.Commit error")
}
return
}
// FixAvBreach fix av_breach_record data
func (s *Service) FixAvBreach(c context.Context, mid int64, date string, count int) (err error) {
breachs, err := s.dao.GetAvBreach(c, date, date)
if err != nil {
log.Error("s.dao.GetAvBreach error(%v)", err)
return
}
tx, err := s.dao.BeginTran(c)
if err != nil {
log.Error("s.dao.BeginTran error(%v)", err)
return
}
avMap := make(map[int64]bool)
var delCount int
for _, b := range breachs {
if b.MID != mid {
continue
}
if avMap[b.AvID] {
err = s.updateSQL(tx, fmt.Sprintf(_txDelAvBreachSQL, b.ID), 1)
if err != nil {
log.Error("s.UpdateSQL(%s) error(%v)", _txDelAvBreachSQL, err)
return
}
delCount++
} else {
avMap[b.AvID] = true
}
}
if count != delCount {
tx.Rollback()
log.Error("delete count error %d %d", count, delCount)
err = fmt.Errorf("delete count error")
return
}
if err = tx.Commit(); err != nil {
log.Error("tx.Commit error")
}
return
}
// FixUpTotalIncome fix up_income total income
func (s *Service) FixUpTotalIncome(c context.Context, table, date string, count int) (err error) {
upIncome, err := s.GetUpIncome(c, "up_income", date)
if err != nil {
log.Error("s.GetUpIncome error(%v)", err)
return
}
tx, err := s.dao.BeginTran(c)
if err != nil {
log.Error("s.dao.BeginTran error(%v)", err)
return
}
trueCount := 0
for _, up := range upIncome {
err = s.updateSQL(tx, fmt.Sprintf(_txUpTotalIncomeSQL, table, up.Income, up.MID, date), 1)
if err != nil {
log.Error("s.UpdateSQL(%s) error(%v)", _txUpTotalIncomeSQL, err)
return
}
trueCount++
}
if count != trueCount {
tx.Rollback()
log.Error("count error %d %d", count, trueCount)
err = fmt.Errorf(" count error")
return
}
if err = tx.Commit(); err != nil {
log.Error("tx.Commit error")
}
return
}
// UpdateColumnTag update column tag
func (s *Service) UpdateColumnTag(c context.Context, table string, oldTag string, newTag int, count int64) (err error) {
sql := fmt.Sprintf(_txColumnTagSQL, table, newTag, oldTag)
return s.txUpdateSQL(c, sql, count)
}
func (s *Service) txUpdateSQL(c context.Context, sql string, count int64) (err error) {
tx, err := s.dao.BeginTran(c)
if err != nil {
log.Error("s.dao.BeginTran error(%v)", err)
return
}
err = s.updateSQL(tx, sql, count)
if err != nil {
log.Error("s.UpdateSQL(%s) error(%v)", sql, err)
return
}
if err = tx.Commit(); err != nil {
log.Error("tx.Commit error")
}
return
}
func (s *Service) updateSQL(tx *sql.Tx, stmt string, count int64) error {
rows, err := s.dao.UpdateDate(tx, stmt)
if err != nil {
tx.Rollback()
log.Error("s.dao.UpdateDate (%s) error(%v)", stmt, err)
return err
}
if count == 0 && rows <= 1 {
return nil
}
if rows != count {
tx.Rollback()
return fmt.Errorf("%s : rows(%d) != count(%d) error", stmt, rows, count)
}
return nil
}
func (s *Service) insertIntoSQL(tx *sql.Tx, stmt string, count int) error {
rows, err := s.dao.UpdateDate(tx, stmt)
if err != nil {
tx.Rollback()
log.Error("s.dao.UpdateDate (%s) error(%v)", stmt, err)
return err
}
if count == 0 {
if rows > 2 {
tx.Rollback()
return fmt.Errorf("rows(%d) error", rows)
}
} else if rows != int64(count) {
tx.Rollback()
return fmt.Errorf("rows(%d) != count(%d) error", rows, count)
}
return nil
}
// SyncAvBaseIncome sync base_income to av_base_income by mid_date
func (s *Service) SyncAvBaseIncome(c context.Context, table string) (err error) {
data, err := s.avBaseIncomes(c, table)
if err != nil {
return
}
err = s.batchUpdateUpIncome(c, data, table)
if err != nil {
log.Error("batch update av base income error(%v)", err)
}
return
}
func (s *Service) avBaseIncomes(c context.Context, table string) (data []*model.AvBaseIncome, err error) {
var id int64
for {
var abs []*model.AvBaseIncome
abs, id, err = s.dao.GetAvBaseIncome(c, table, id, 2000)
if err != nil {
return
}
if len(abs) == 0 {
break
}
for _, ab := range abs {
if ab.AvBaseIncome > 0 {
data = append(data, ab)
}
}
}
return
}
func (s *Service) batchUpdateUpIncome(c context.Context, us []*model.AvBaseIncome, table string) (err error) {
var (
buff = make([]*model.AvBaseIncome, 2000)
buffEnd = 0
)
for _, u := range us {
buff[buffEnd] = u
buffEnd++
if buffEnd >= 2000 {
values := avBaseIncomeValues(buff[:buffEnd])
buffEnd = 0
_, err = s.dao.BatchUpdateUpIncome(c, table, values)
if err != nil {
return
}
}
}
if buffEnd > 0 {
values := avBaseIncomeValues(buff[:buffEnd])
buffEnd = 0
_, err = s.dao.BatchUpdateUpIncome(c, table, values)
}
return
}
func avBaseIncomeValues(us []*model.AvBaseIncome) (values string) {
var buf bytes.Buffer
for _, u := range us {
buf.WriteString("(")
buf.WriteString(strconv.FormatInt(u.MID, 10))
buf.WriteByte(',')
buf.WriteString("'" + u.Date.Time().Format(_layout) + "'")
buf.WriteByte(',')
buf.WriteString(strconv.FormatInt(u.AvBaseIncome, 10))
buf.WriteString(")")
buf.WriteByte(',')
}
if buf.Len() > 0 {
buf.Truncate(buf.Len() - 1)
}
values = buf.String()
buf.Reset()
return
}
// SyncCreditScore sync credit score
func (s *Service) SyncCreditScore(c context.Context) (err error) {
m := make(map[int64]int)
am, err := s.getCreditScore(c, "video")
if err != nil {
return
}
for mid, score := range am {
m[mid] = score
}
cm, err := s.getCreditScore(c, "column")
if err != nil {
return
}
for mid, score := range cm {
m[mid] = score
}
return s.batchInsertCreditScore(c, m)
}
func (s *Service) batchInsertCreditScore(c context.Context, m map[int64]int) (err error) {
batch := make(map[int64]int)
for mid, score := range m {
batch[mid] = score
if len(batch) == 2000 {
values := creditScoreValues(batch)
_, err = s.dao.SyncCreditScore(c, values)
if err != nil {
return
}
batch = make(map[int64]int)
}
}
if len(batch) > 0 {
values := creditScoreValues(batch)
_, err = s.dao.SyncCreditScore(c, values)
}
return
}
func creditScoreValues(m map[int64]int) (values string) {
var buf bytes.Buffer
for mid, score := range m {
buf.WriteString("(")
buf.WriteString(strconv.FormatInt(mid, 10))
buf.WriteByte(',')
buf.WriteString(strconv.Itoa(score))
buf.WriteString(")")
buf.WriteByte(',')
}
if buf.Len() > 0 {
buf.Truncate(buf.Len() - 1)
}
values = buf.String()
buf.Reset()
return
}
func (s *Service) getCreditScore(c context.Context, table string) (m map[int64]int, err error) {
m = make(map[int64]int)
var id int64
for {
var sm map[int64]int
sm, id, err = s.dao.GetCreditScore(c, table, id, 2000)
if err != nil {
return
}
if len(sm) == 0 {
break
}
for k, v := range sm {
m[k] = v
}
}
return
}
// FixBgmIncomeStatis fix bgm income statis
func (s *Service) FixBgmIncomeStatis(c context.Context) (err error) {
total, err := s.dao.GetBGMIncome(c)
if err != nil {
return
}
for sid, income := range total {
_, err = s.dao.InsertBGMIncomeStatis(c, sid, income)
if err != nil {
return
}
}
return
}