135 lines
4.1 KiB
Go
135 lines
4.1 KiB
Go
package service
|
||
|
||
import (
|
||
"github.com/jinzhu/gorm"
|
||
"go-common/app/job/main/up/dao/upcrm"
|
||
"go-common/app/job/main/up/model/signmodel"
|
||
"go-common/app/service/main/upcredit/mathutil"
|
||
"go-common/library/log"
|
||
"time"
|
||
)
|
||
|
||
// change a lot state for sign up
|
||
// state, 签约状态,正常或过期
|
||
// due_wan, 签约状态即将过期
|
||
// pay_expire_state,付费状态
|
||
|
||
//CheckStateJob 检查sign_up中的状态
|
||
func (s *Service) CheckStateJob(date time.Time) {
|
||
log.Info("start run state job, date=%s", date)
|
||
s.checkState(date)
|
||
log.Info("finish run state job, date=%s", date)
|
||
}
|
||
|
||
func (s *Service) checkState(date time.Time) {
|
||
// 更新签约状态:
|
||
var crmdb = s.crmdb.GetDb()
|
||
// 签约30天内到期
|
||
var signExpireList []*signmodel.SignUp
|
||
var signDueList []*signmodel.SignUp
|
||
var limit, offset = 200, 0
|
||
var count = limit
|
||
var err error
|
||
var signEndDate = date.AddDate(0, 0, 30)
|
||
for count == limit {
|
||
var items []*signmodel.SignUp
|
||
// 把endDate在[-60, +30]范围内的用户全都找出来,过一遍
|
||
err = crmdb.Offset(offset).Limit(limit).Where("end_date<? and end_date>?", signEndDate, date.AddDate(0, -4, 0)).Find(&items).Error
|
||
if err != nil {
|
||
log.Error("fail to get sign ups, err=%v", err)
|
||
break
|
||
}
|
||
count = len(items)
|
||
offset += count
|
||
for _, v := range items {
|
||
if v.EndDate.Time().Before(date) && v.State == signmodel.SignStateOnSign {
|
||
// 过期
|
||
signExpireList = append(signExpireList, v)
|
||
} else if !(v.EndDate.Time().Before(date) || v.EndDate.Time().After(signEndDate)) && v.DueWarn <= signmodel.DueWarnNoWarn {
|
||
// 快到期
|
||
signDueList = append(signDueList, v)
|
||
}
|
||
}
|
||
}
|
||
|
||
var expireIDList []uint32
|
||
for _, v := range signExpireList {
|
||
expireIDList = append(expireIDList, v.ID)
|
||
}
|
||
|
||
err = updateListWithLimit(crmdb, "state", signmodel.SignStateExpire, expireIDList, limit)
|
||
if err != nil {
|
||
log.Error("fail to update sign state, err=%v", err)
|
||
return
|
||
}
|
||
var dueIDList []uint32
|
||
for _, v := range signDueList {
|
||
dueIDList = append(dueIDList, v.ID)
|
||
}
|
||
|
||
err = updateListWithLimit(crmdb, "due_warn", signmodel.DueWarnWarn, dueIDList, limit)
|
||
if err != nil {
|
||
log.Error("fail to update sign due_warn, err=%v", err)
|
||
return
|
||
}
|
||
// 付款7天内到期
|
||
offset = 0
|
||
count = limit
|
||
var payDueDate = date.AddDate(0, 0, 7)
|
||
var payExpireMap = map[uint32]int8{}
|
||
for count == limit {
|
||
var items []*signmodel.SignPay
|
||
// 把endDate在[-max, +7]范围内的用户全都找出来,过一遍
|
||
err = crmdb.Offset(offset).Limit(limit).Where("due_date<?", payDueDate).Find(&items).Error
|
||
if err != nil {
|
||
log.Error("fail to get sign ups, err=%v", err)
|
||
break
|
||
}
|
||
count = len(items)
|
||
offset += count
|
||
for _, v := range items {
|
||
// 如果有即将到期,则立即标记为即将到期
|
||
if v.State == upcrm.PayStateUnpay {
|
||
payExpireMap[v.SignID] = signmodel.PayExpireStateDue
|
||
} else {
|
||
// 如果没有即将到期的状态,则把其标记为未到期
|
||
// 即:只有所有的付款都已标记完成,才会认为是未到期状态
|
||
if payExpireMap[v.SignID] != signmodel.PayExpireStateDue {
|
||
payExpireMap[v.SignID] = signmodel.PayExpireStateNormal
|
||
}
|
||
}
|
||
}
|
||
}
|
||
// 更新到期状态
|
||
var stateSignIDListMap = map[int8][]uint32{}
|
||
for k, v := range payExpireMap {
|
||
stateSignIDListMap[v] = append(stateSignIDListMap[v], k)
|
||
}
|
||
// 分区更新
|
||
limit = 200
|
||
for state, list := range stateSignIDListMap {
|
||
err = updateListWithLimit(crmdb, "pay_expire_state", state, list, limit)
|
||
if err != nil {
|
||
log.Error("err update pay_expire_state, err=%v", err)
|
||
return
|
||
}
|
||
}
|
||
}
|
||
|
||
func updateListWithLimit(crmdb *gorm.DB, field string, state int8, list []uint32, limit int) (err error) {
|
||
for begin := 0; begin < len(list); begin += limit {
|
||
var end = mathutil.Min(begin+limit, len(list))
|
||
var needUpdate = list[begin:end]
|
||
err = updateSignTable(crmdb, needUpdate, field, state)
|
||
if err != nil {
|
||
log.Error("fail to update state [%s], err=%v", field, err)
|
||
return
|
||
}
|
||
}
|
||
return
|
||
}
|
||
func updateSignTable(crmdb *gorm.DB, ids interface{}, field string, state int8) (err error) {
|
||
err = crmdb.Table(signmodel.TableNameSignUp).Where("id in (?)", ids).Update(field, state).Error
|
||
return
|
||
}
|