|
|
@@ -1,144 +1,217 @@
|
|
|
package service
|
|
|
|
|
|
import (
|
|
|
- "errors"
|
|
|
+ "time"
|
|
|
|
|
|
- "gorm.io/gorm"
|
|
|
+ "github.com/pkg/errors"
|
|
|
"kpt.notice/apiserver/model"
|
|
|
"kpt.notice/apiserver/model/http"
|
|
|
"kpt.notice/pkg/log"
|
|
|
"kpt.notice/pkg/util"
|
|
|
)
|
|
|
|
|
|
-func (svc *Service) UpdateMessage(statics int, id int, val map[string]interface{}) (err error) {
|
|
|
-
|
|
|
- var res *gorm.DB
|
|
|
- if statics == 1 {
|
|
|
- // update update_at
|
|
|
- res = svc.DB.Model(&model.Message{}).Where("id= ?", id).Updates(val)
|
|
|
- }
|
|
|
- if statics == 2 {
|
|
|
- // update push_count,update_at,status
|
|
|
- res = svc.DB.Model(&model.Message{}).Where("id= ?", id).Updates(val)
|
|
|
- }
|
|
|
- if statics == 3 {
|
|
|
- // update status
|
|
|
- res = svc.DB.Model(&model.Message{}).Where("id= ?", id).Updates(val)
|
|
|
- }
|
|
|
-
|
|
|
- if res.Error != nil {
|
|
|
- return res.Error
|
|
|
+func (svc *Service) UpdateMessage(msg *model.Message) (err error) {
|
|
|
+ mtype := &http.MessageTypeReq{
|
|
|
+ SysName: msg.SysName,
|
|
|
+ PastureID: msg.PastureID,
|
|
|
+ ServiceID: msg.ServiceID,
|
|
|
+ }
|
|
|
+ if mtypes, e := svc.QueryMsgType(mtype); e != nil {
|
|
|
+ err = e
|
|
|
+ return
|
|
|
+ } else if len(mtypes) == 0 {
|
|
|
+ err = errors.New("没有匹配的消息类型")
|
|
|
+ return
|
|
|
+ } else {
|
|
|
+ m := make(map[string]interface{}, 3)
|
|
|
+ if mtypes[0].RemindType == 1 {
|
|
|
+ m["status"] = 1
|
|
|
+ } else if mtypes[0].RemindType == 2 {
|
|
|
+ if mtypes[0].CycleType == 1 || mtypes[0].CycleType == 3 {
|
|
|
+ m["status"] = 1
|
|
|
+ } else {
|
|
|
+ m["updated_at"] = time.Now()
|
|
|
+ m["push_count"] = msg.PushCount + 1
|
|
|
+ if msg.PushCount+1 >= mtypes[0].PushLimit {
|
|
|
+ m["status"] = 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if mtypes[0].RemindType == 3 {
|
|
|
+ m["push_count"] = msg.PushCount + 1
|
|
|
+ m["updated_at"] = time.Now()
|
|
|
+ }
|
|
|
+ if res := svc.DB.Table("message").Where("id=?", msg.ID).Updates(m); res.Error != nil {
|
|
|
+ err = errors.Wrap(res.Error, "UpdateMessage.update=")
|
|
|
+ log.Errorf("%v", err)
|
|
|
+ }
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-// send message
|
|
|
-//type statics ,1:instant,
|
|
|
-func (svc *Service) getMsgByType(statics int) (msgs []model.Message, err error) {
|
|
|
- // instant message
|
|
|
- var sql string
|
|
|
- if statics == 1 {
|
|
|
- sql = `select * from message m join message_type mt on m.msg_type_id = mt.id
|
|
|
- where m.status = 1 and mt.remind_type_id = 1 and timestampdiff(second,m.update_at,now())>7200`
|
|
|
- err = svc.DB.Exec(sql).Find(&msgs).Error
|
|
|
- // err = svc.DB.Where("msg_type_id =? and status =0 and timestampdiff(second,update_at,now())>7200", 1).Find(&msgs).Error
|
|
|
- }
|
|
|
- if statics == 2 {
|
|
|
- sql = `select m.* from message m join message_type mt on m.msg_type_id = mt.id
|
|
|
- where m.status = 1 and mt.remind_type_id = 2 and timestampdiff(hour,m.create_at,now())>=48
|
|
|
- and timestampdiff(hour,m.update_at,now())>=24 and m.push_count mt.notice_count`
|
|
|
- }
|
|
|
- if statics == 3 {
|
|
|
- sql = `select * from message m join message_type mt on m.msg_type_id = mt.id
|
|
|
- where m.status = 1 and mt.remind_type_id = 3
|
|
|
- and ( mt.push_date=concat('w', weekday(now() ) +1) mt.push_date=concat('w', day(now() ) +1) )`
|
|
|
+func (svc *Service) QueryMsg() (msgs []model.Message, err error) {
|
|
|
+
|
|
|
+ sql := `select m.* from message m join message_type mt
|
|
|
+ on m.sys_name=mt.sys_name and m.pasture_id=mt.pasture_id and m.service_id=mt.service_id
|
|
|
+ where m.status=0 and (
|
|
|
+ mt.remind_type=1
|
|
|
+ or
|
|
|
+ (
|
|
|
+ mt.remind_type=2 and
|
|
|
+ timestampdiff(minute,m.created_at,now())>=mt.delay_time and
|
|
|
+ (date_format(now(),'%H:%i')>=mt.push_time or mt.push_time='') and
|
|
|
+ (
|
|
|
+ cycle_type=1 or cycle_type=3 or
|
|
|
+ (
|
|
|
+ cycle_type=2 and timestampdiff(minute,m.updated_at,now()) >=mt.interval_time
|
|
|
+ and m.push_count<mt.push_limit
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ or
|
|
|
+ (
|
|
|
+ mt.remind_type=3 and
|
|
|
+ (
|
|
|
+ mt.date_type=1
|
|
|
+ or (mt.date_type=2 and weekday(now() ) +1 =mt.push_date)
|
|
|
+ or (mt.date_type=3 and (day(now()) =mt.push_date or DAYOFMONTH(now())<mt.push_date))
|
|
|
+ )
|
|
|
+ and date_format(now(),'%H:%i')>=mt.push_time
|
|
|
+ and
|
|
|
+ (
|
|
|
+ push_count=0
|
|
|
+ or
|
|
|
+ ( day(now())> day(mt.updated_at) and push_count>0)
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ) `
|
|
|
+ if err = svc.DB.Raw(sql).Scan(&msgs).Error; err != nil {
|
|
|
+ err = errors.Wrap(err, "queryMsg{query msg exec sql err}==%v")
|
|
|
+ log.Errorf("%v", err)
|
|
|
+ return
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
-func (svc *Service) InsertMessage(msg *http.MessageReq) (resp *http.MessageResp, err error) {
|
|
|
- log.Error("InsertMessage=============enter")
|
|
|
+func (svc *Service) InsertMessage(msg *http.MessageReq, body []byte) (resp *http.MessageResp, err error) {
|
|
|
tmp := make(map[string]interface{})
|
|
|
tmp["miniprogram"] = msg.Miniprogram
|
|
|
msgType := &http.MessageTypeReq{
|
|
|
- ID: msg.MsgTypeID,
|
|
|
+ SysName: msg.SysName,
|
|
|
+ PastureID: msg.PastureID,
|
|
|
+ ServiceID: msg.ServiceID,
|
|
|
+ }
|
|
|
+
|
|
|
+ sysuserList, e := svc.GetSysUser(msg.Target, msg.SysName, msg.PastureID)
|
|
|
+ if err != nil {
|
|
|
+ err = e
|
|
|
+ return
|
|
|
}
|
|
|
- mt := svc.QueryMsgType(msgType)
|
|
|
- if mt == nil {
|
|
|
- log.Errorf("InsertMessage=====QueryMsgType====%v", errors.New("没有匹配的模板"))
|
|
|
- return nil, errors.New("没有匹配的模板")
|
|
|
+ var targetList []string
|
|
|
+ for _, user := range sysuserList {
|
|
|
+ targetList = append(targetList, user.Openid)
|
|
|
+ }
|
|
|
+
|
|
|
+ if mt, e := svc.QueryMsgType(msgType); e != nil {
|
|
|
+ err = e
|
|
|
+ return
|
|
|
+ } else if len(mt) == 0 {
|
|
|
+ err = errors.New("没有匹配的消息类型")
|
|
|
+ return
|
|
|
+ } else {
|
|
|
+ tmp["template_id"] = mt[0].TemplateID
|
|
|
}
|
|
|
- tmp["template_id"] = mt[0].TemplateID
|
|
|
data := make(map[string]http.Tag)
|
|
|
for i, v := range msg.Keys {
|
|
|
data[v] = msg.Content[i]
|
|
|
}
|
|
|
tmp["data"] = data
|
|
|
msgDb := model.Message{
|
|
|
- Target: util.MarshalToString(msg.Target),
|
|
|
- MsgTypeID: msg.MsgTypeID,
|
|
|
- RemindTypeID: mt[0].RemindTypeID,
|
|
|
- MsgContent: util.MarshalToString(tmp),
|
|
|
+ SysName: msg.SysName,
|
|
|
+ PastureID: msg.PastureID,
|
|
|
+ ServiceID: msg.ServiceID,
|
|
|
+ Target: util.MarshalToString(targetList),
|
|
|
+ MsgTypeID: msg.MsgTypeID,
|
|
|
+ MsgContent: util.MarshalToString(tmp),
|
|
|
+ UpdatedAt: time.Now(),
|
|
|
+ BodyData: string(body),
|
|
|
}
|
|
|
|
|
|
- result := svc.DB.Create(&msgDb)
|
|
|
- if result.Error != nil {
|
|
|
- log.Errorf("InsertMessage=====Create%v", result.Error)
|
|
|
- return nil, result.Error
|
|
|
+ if err = svc.DB.Create(&msgDb).Error; err != nil {
|
|
|
+ err = errors.Wrap(err, "InsertMessage{insert msg}==%v")
|
|
|
+ log.Errorf("%v", err)
|
|
|
+ return
|
|
|
}
|
|
|
resp = &http.MessageResp{
|
|
|
- Rows: int(result.RowsAffected),
|
|
|
+ ID: msgDb.ID,
|
|
|
}
|
|
|
- err = result.Error
|
|
|
return
|
|
|
}
|
|
|
|
|
|
// query the id or remind_type of the message by name
|
|
|
func (svc *Service) QueryRemindTypeID(name string) (int, error) {
|
|
|
- m := new(model.MessageType)
|
|
|
- tx := svc.DB.Where("type_name = ?").First(m)
|
|
|
+ m := new(http.MessageTypeReq)
|
|
|
+ tx := svc.DB.Table("message_type").Where("type_name = ?").First(m)
|
|
|
if tx.RowsAffected == 0 {
|
|
|
return 0, errors.New("没有匹配的类型")
|
|
|
}
|
|
|
return m.ID, nil
|
|
|
}
|
|
|
|
|
|
-func (svc *Service) InsertMessageType(req *http.MessageTypeReq) (m *model.MessageType, err error) {
|
|
|
- // m = &model.MessageType{
|
|
|
- // SysName: req.SysName,
|
|
|
- // TypeName: req.TypeName,
|
|
|
- // RemindTypeID: req.RemindTypeID,
|
|
|
- // RemindType: req.RemindType,
|
|
|
- // PushDate: req.PushDate,
|
|
|
- // PushTime: req.PushTime,
|
|
|
- // IntervalTime: req.IntervalTime,
|
|
|
- // PushLimit: req.PushLimit,
|
|
|
- // TemplateID: req.TemplateID,
|
|
|
- // }
|
|
|
- result := svc.DB.Table("message_type").Create(req)
|
|
|
- if result.Error != nil {
|
|
|
- return nil, result.Error
|
|
|
- }
|
|
|
- return m, nil
|
|
|
-
|
|
|
+func (svc *Service) InsertMsgType(req *http.MessageTypeReq) (resp *http.MessageTypeResp, err error) {
|
|
|
+ if query, e := svc.QueryMsgType(req); e != nil {
|
|
|
+ err = e
|
|
|
+ return
|
|
|
+ } else {
|
|
|
+ resp = new(http.MessageTypeResp)
|
|
|
+ switch {
|
|
|
+ case len(query) == 0:
|
|
|
+ resp.Method = "insert"
|
|
|
+ if res := svc.DB.Table("message_type").Create(req); res.Error != nil {
|
|
|
+ err = errors.Wrap(res.Error, "InsertMsgType{create msg type===%v}")
|
|
|
+ log.Errorf("%v", err)
|
|
|
+ } else {
|
|
|
+ resp.RowsAffected = int(res.RowsAffected)
|
|
|
+ }
|
|
|
+ break
|
|
|
+ case len(query) > 0:
|
|
|
+ resp.Method = "update"
|
|
|
+ index := map[string]interface{}{
|
|
|
+ "service_id": req.ServiceID,
|
|
|
+ "pasture_id": req.PastureID,
|
|
|
+ "sys_name": req.SysName,
|
|
|
+ }
|
|
|
+ log.Infof("msg type update index%v", index)
|
|
|
+ req.PastureID = 0
|
|
|
+ req.SysName = ""
|
|
|
+ req.ServiceID = 0
|
|
|
+ log.Infof("msg type update value%v", req)
|
|
|
+ if res := svc.DB.Table("message_type").Where(index).Updates(req); res.Error != nil {
|
|
|
+ err = errors.Wrap(err, "InsertMsgType{update msg type ===%v}")
|
|
|
+ log.Errorf("%v", err)
|
|
|
+ } else {
|
|
|
+ resp.RowsAffected = int(res.RowsAffected)
|
|
|
+ }
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
-// func (svc *Service) queryMsgType(id int) (m *model.MessageType, err error) {
|
|
|
-// if tx.RowsAffected == 0 {
|
|
|
-// return nil, errors.New("没有匹配的模板")
|
|
|
-// }
|
|
|
-// return m, nil
|
|
|
-// }
|
|
|
-func (svc *Service) QueryMsgType(msgTypeReq *http.MessageTypeReq) (m []model.MessageType) {
|
|
|
- // reqType := map[string]interface{}{
|
|
|
- // "sys_name": msgTypeReq.SysName,
|
|
|
- // "pasture_id": msgTypeReq.PastureID,
|
|
|
- // "id": msgTypeReq.ID,
|
|
|
- // })
|
|
|
- svc.DB.Table("message_type").Where(msgTypeReq).Find(&m)
|
|
|
- if svc.DB.Error != nil {
|
|
|
- log.Errorf("QueryMsgType=====%v", svc.DB.Error)
|
|
|
- return nil
|
|
|
- }
|
|
|
- log.Infof("result====%#v", m)
|
|
|
- return m
|
|
|
+func (svc *Service) QueryMsgType(req *http.MessageTypeReq) (m []http.MessageTypeReq, err error) {
|
|
|
+ index := map[string]interface{}{}
|
|
|
+
|
|
|
+ if req.ServiceID != 0 {
|
|
|
+ index["service_id"] = req.ServiceID
|
|
|
+ }
|
|
|
+ if req.PastureID != 0 {
|
|
|
+ index["pasture_id"] = req.PastureID
|
|
|
+ }
|
|
|
+ if req.SysName != "" {
|
|
|
+ index["sys_name"] = req.SysName
|
|
|
+ }
|
|
|
+ log.Infof("query msg type===%v", index)
|
|
|
+ if err = svc.DB.Table("message_type").Where(index).Find(&m).Error; err != nil {
|
|
|
+ err = errors.Wrap(err, "QueryMsgType.find=")
|
|
|
+ log.Errorf("%v", err)
|
|
|
+ }
|
|
|
+ return
|
|
|
}
|