123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363 |
- package upcrm
- import (
- "time"
- "go-common/app/admin/main/up/model/signmodel"
- "go-common/app/admin/main/up/model/upcrmmodel"
- "go-common/library/log"
- xtime "go-common/library/time"
- "github.com/jinzhu/gorm"
- )
- const (
- // PayStateUnpay not pay
- PayStateUnpay = 0
- // PayStatePayed payed
- PayStatePayed = 1
- )
- // InsertSignUp insert sign up
- func (d *Dao) InsertSignUp(db *gorm.DB, up *signmodel.SignUp) (affectedRow int64, err error) {
- var handle = db.Save(up)
- err = handle.Error
- affectedRow = handle.RowsAffected
- return
- }
- // InsertPayInfo inert pay
- func (d *Dao) InsertPayInfo(db *gorm.DB, info *signmodel.SignPay) (affectedRow int64, err error) {
- var handle = db.Save(info)
- err = handle.Error
- affectedRow = handle.RowsAffected
- return
- }
- // InsertTaskInfo insert task
- func (d *Dao) InsertTaskInfo(db *gorm.DB, info *signmodel.SignTask) (affectedRow int64, err error) {
- var handle = db.Save(info)
- err = handle.Error
- affectedRow = handle.RowsAffected
- return
- }
- // InsertContractInfo insert contract
- func (d *Dao) InsertContractInfo(db *gorm.DB, info interface{}) (affectedRow int64, err error) {
- var handle = db.Save(info)
- err = handle.Error
- affectedRow = handle.RowsAffected
- return
- }
- // DelPayInfo update payinfo
- func (d *Dao) DelPayInfo(db *gorm.DB, ids []int64) (affectedRow int64, err error) {
- var handle = db.Model(&signmodel.SignPay{}).Where("id IN (?)", ids).Update("state", 100)
- err = handle.Error
- affectedRow = handle.RowsAffected
- return
- }
- // DelTaskInfo update taskInfo
- func (d *Dao) DelTaskInfo(db *gorm.DB, ids []int64) (affectedRow int64, err error) {
- var handle = db.Model(&signmodel.SignTask{}).Where("id IN (?)", ids).Update("state", 100)
- err = handle.Error
- affectedRow = handle.RowsAffected
- return
- }
- // DelSignContract update signcontract
- func (d *Dao) DelSignContract(db *gorm.DB, ids []int64) (affectedRow int64, err error) {
- var handle = db.Model(&signmodel.SignContract{}).Where("id IN (?)", ids).Update("state", 100)
- err = handle.Error
- affectedRow = handle.RowsAffected
- return
- }
- // SignUpID .
- func (d *Dao) SignUpID(sigID int64) (su *signmodel.SignUp, msp map[int64]*signmodel.SignPay, mst map[int64]*signmodel.SignTask, msc map[int64]*signmodel.SignContract, err error) {
- su = &signmodel.SignUp{}
- if err = d.crmdb.Table(signmodel.TableSignUp).Where("id = ? AND state IN (0,1)", sigID).Find(su).Error; err != nil && err != gorm.ErrRecordNotFound {
- log.Error("db fail, err=%+v", err)
- return
- }
- if err == gorm.ErrRecordNotFound {
- err = nil
- su, msp, mst, msc = nil, nil, nil, nil
- return
- }
- var (
- sps []*signmodel.SignPay
- sts []*signmodel.SignTask
- scs []*signmodel.SignContract
- )
- msp = make(map[int64]*signmodel.SignPay)
- if err = d.crmdb.Table(signmodel.TableSignPay).Where("sign_id = ? AND state IN (0,1)", sigID).Find(&sps).Error; err != nil && err != gorm.ErrRecordNotFound {
- log.Error("db fail, err=%+v", err)
- return
- }
- for _, v := range sps {
- msp[v.ID] = v
- }
- mst = make(map[int64]*signmodel.SignTask)
- if err = d.crmdb.Table(signmodel.TableSignTask).Where("sign_id = ? AND state = 0", sigID).Find(&sts).Error; err != nil && err != gorm.ErrRecordNotFound {
- log.Error("db fail, err=%+v", err)
- return
- }
- for _, v := range sts {
- mst[v.ID] = v
- }
- msc = make(map[int64]*signmodel.SignContract)
- if err = d.crmdb.Table(signmodel.TableSignContract).Where("sign_id = ? AND state = 0", sigID).Find(&scs).Error; err != nil && err != gorm.ErrRecordNotFound {
- log.Error("db fail, err=%+v", err)
- return
- }
- for _, v := range scs {
- msc[v.ID] = v
- }
- return
- }
- // GetSignIDByCondition get sign id
- // arg query args
- func (d *Dao) GetSignIDByCondition(arg *signmodel.SignQueryArg) (signIDs []uint32, err error) {
- var signIDMap = map[uint32]struct{}{}
- switch {
- default:
- // 如果是mid,则不进行其他的查询
- if arg.Mid != 0 {
- var result []signmodel.SignUpOnlyID
- var db = d.crmdb.Table("sign_up").Where("mid=?", arg.Mid)
- err = db.Select("id").Find(&result).Error
- if err != nil && err != gorm.ErrRecordNotFound {
- log.Error("db fail, err=%+v", err)
- return
- }
- for _, v := range result {
- signIDMap[v.ID] = struct{}{}
- }
- break
- }
- var now = time.Now()
- // 1.增加查询条件
- if arg.DuePay == 1 {
- var duedate = now.AddDate(0, 0, 7)
- var result []signmodel.SignUpOnlySignID
- // due_date and state = PayStateUnpay
- err = d.crmdb.Table("sign_pay").Select("sign_id").Where("due_date <= ? and state = 0", duedate.Format(upcrmmodel.TimeFmtDate)).Where("state != 100").
- Find(&result).Error
- if err != nil && err != gorm.ErrRecordNotFound {
- log.Error("db fail, err=%+v", err)
- } else {
- for _, v := range result {
- signIDMap[v.SignID] = struct{}{}
- }
- }
- }
- if arg.DueSign == 1 || arg.ExpireSign == 1 {
- var duedate = now.AddDate(0, 0, 30)
- var result []signmodel.SignUpOnlyID
- var db = d.crmdb.Table("sign_up").Select("id")
- if arg.DueSign == 1 && arg.ExpireSign == 1 {
- db = db.Where("end_date < ?", duedate.Format(upcrmmodel.TimeFmtDate)).Where("state != 100") // 去掉已删除的
- } else {
- if arg.DueSign == 1 {
- db = db.Where("end_date >= ? and end_date <= ?", now.Format(upcrmmodel.TimeFmtDate), duedate.Format(upcrmmodel.TimeFmtDate))
- } else if arg.ExpireSign == 1 {
- db = db.Where("end_date < ?", now.Format(upcrmmodel.TimeFmtDate))
- }
- }
- err = db.
- Find(&result).Error
- if err != nil && err != gorm.ErrRecordNotFound {
- log.Error("db fail, err=%+v", err)
- } else {
- for _, v := range result {
- signIDMap[v.ID] = struct{}{}
- }
- }
- }
- }
- for k := range signIDMap {
- signIDs = append(signIDs, k)
- }
- return
- }
- //GetSignUpByID signid 可以是nil,如果是nil,则会取所有的信息
- // query, args, 额外的查询条件
- func (d *Dao) GetSignUpByID(signID []uint32, order string, offset int, limit int, query interface{}, args ...interface{}) (result []signmodel.SignUp, err error) {
- var db = d.crmdb.Table("sign_up")
- if signID != nil {
- db = db.Where("id in (?)", signID)
- }
- if query != nil {
- db = db.Where(query, args)
- }
- if order != "" {
- db = db.Order(order)
- }
- err = db.
- Offset(offset).
- Limit(limit).
- Find(&result).Error
- if err == gorm.ErrRecordNotFound {
- err = nil
- }
- return
- }
- //GetSignUpCount get sign up's count
- func (d *Dao) GetSignUpCount(query string, args ...interface{}) (count int) {
- d.crmdb.Table(signmodel.TableSignUp).Where(query, args).Count(&count)
- return
- }
- //GetTask get task by sign id and state
- func (d *Dao) GetTask(signID []uint32, state ...int) (result []signmodel.SignTask, err error) {
- err = d.crmdb.Table(signmodel.TableSignTask).Where("sign_id in (?) and state = ?", signID, state).Find(&result).Error
- if err == gorm.ErrRecordNotFound {
- err = nil
- }
- return
- }
- //GetPay get get sign id
- func (d *Dao) GetPay(signID []uint32) (result []signmodel.SignPay, err error) {
- err = d.crmdb.Table(signmodel.TableSignPay).Where("sign_id in (?)", signID).Find(&result).Error
- if err == gorm.ErrRecordNotFound {
- err = nil
- }
- return
- }
- //GetContract get get sign id
- func (d *Dao) GetContract(signID []uint32) (result []signmodel.SignContract, err error) {
- err = d.crmdb.Table(signmodel.TableSignContract).Where("sign_id in (?)", signID).Find(&result).Error
- if err == gorm.ErrRecordNotFound {
- err = nil
- }
- return
- }
- //PayComplete finish pay by pay id
- func (d *Dao) PayComplete(ids []int64) (affectedRow int64, err error) {
- var db = d.crmdb.Table(signmodel.TableSignPay).Where("id in (?)", ids).Updates(map[string]interface{}{"state": PayStatePayed})
- err = db.Error
- if err == nil {
- affectedRow = db.RowsAffected
- }
- return
- }
- //SignWithName sign with name, used to send mail
- type SignWithName struct {
- signmodel.SignUp
- Name string
- }
- //GetDueSignUp check due
- // expireAfterDays : how many days to expire
- func (d *Dao) GetDueSignUp(now time.Time, expireAfterDays int) (result []*SignWithName, err error) {
- var dueDate = now.AddDate(0, 0, expireAfterDays)
- var db = d.crmdb.Table(signmodel.TableSignUp).Select("id, mid, end_date, admin_id, admin_name")
- // email_state = 0 是未发过邮件的意思
- db = db.Where("end_date <= ? and end_date >= ? and email_state = 0", dueDate.Format(upcrmmodel.TimeFmtDate), now.Format(upcrmmodel.TimeFmtDate))
- err = db.Find(&result).Error
- return
- }
- //PayWithAdmin pay with name, used to send mail
- type PayWithAdmin struct {
- signmodel.SignPay
- Name string
- AdminID int
- AdminName string
- }
- //GetDuePay check due
- func (d *Dao) GetDuePay(now time.Time, expireAfterDays int) (result []*PayWithAdmin, err error) {
- var dueDate = now.AddDate(0, 0, expireAfterDays)
- err = d.crmdb.Raw("select p.id, "+
- "p.sign_id, "+
- "p.mid, "+
- "p.due_date, "+
- "p.pay_value,"+
- "s.admin_id, "+
- "s.admin_name"+
- " from sign_pay as p left join sign_up as s on p.sign_id = s.id "+
- " where p.due_date <= ? and p.email_state = 0 and p.state = 0", dueDate.Format(upcrmmodel.TimeFmtDate)).
- Scan(&result).Error
- return
- }
- //UpdateEmailState update email send state
- // state : @
- func (d *Dao) UpdateEmailState(table string, ids []int64, state int8) (affectedRow int64, err error) {
- var db = d.crmdb.Table(table).Where("id in (?)", ids).Update("email_state", state)
- err = db.Error
- if err == nil {
- affectedRow = db.RowsAffected
- } else {
- log.Error("update email state fail, err=%+v", err)
- }
- return
- }
- //CheckUpHasValidContract check if has valid contract
- func (d *Dao) CheckUpHasValidContract(mid int64, date time.Time) (exist bool, err error) {
- var ids []struct {
- ID int
- }
- err = d.crmdb.Table(signmodel.TableSignUp).Select("id").Where("mid=? and end_date>=?", mid, date.Format(upcrmmodel.TimeFmtDate)).Limit(1).Find(&ids).Error
- if err != nil && err != gorm.ErrRecordNotFound {
- log.Error("check exist from db fail, err=%+v", err)
- return
- }
- exist = len(ids) > 0
- return
- }
- // GetOrCreateTaskHistory .
- func (d *Dao) GetOrCreateTaskHistory(db *gorm.DB, st *signmodel.SignTask) (sth *signmodel.SignTaskHistory, init bool, err error) {
- sDate, _ := signmodel.GetTaskDuration(time.Now(), st.TaskType)
- sth = new(signmodel.SignTaskHistory)
- err = db.Select("*").Where("task_template_id=? and generate_date=?", st.ID, sDate).Find(&sth).Error
- // 创建一条,如果没找到的话
- if err == gorm.ErrRecordNotFound {
- sth = &signmodel.SignTaskHistory{
- Mid: st.Mid,
- SignID: int64(st.SignID),
- TaskTemplateID: int(st.ID),
- TaskType: st.TaskType,
- TaskCondition: int(st.TaskCondition),
- GenerateDate: xtime.Time(sDate.Unix()),
- Attribute: st.Attribute,
- State: signmodel.SignTaskStateRunning,
- }
- if err = db.Save(&sth).Error; err != nil {
- log.Error("create task history fail, err=%v, task=%v", err, st)
- }
- init = true
- }
- return
- }
- // UpSignTaskHistory .
- func (d *Dao) UpSignTaskHistory(db *gorm.DB, sth *signmodel.SignTaskHistory) (err error) {
- if err = db.Table(signmodel.TableSignTaskHistory).Where("id = ?", sth.ID).UpdateColumns(
- map[string]interface{}{
- "task_type": sth.TaskType,
- "task_condition": sth.TaskCondition,
- "attribute": sth.Attribute,
- "mtime": time.Now(),
- }).Error; err != nil {
- log.Error("dao.UpSignTaskHistory(%+v) , err=%+v", sth, err)
- }
- return
- }
|