You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
327 lines
7.9 KiB
327 lines
7.9 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
"net/url" |
|
|
|
"go-common/app/admin/ep/saga/conf" |
|
"go-common/app/admin/ep/saga/model" |
|
"go-common/app/admin/ep/saga/service/wechat" |
|
"go-common/library/log" |
|
|
|
"github.com/pkg/errors" |
|
) |
|
|
|
const qyWechatURL = "https://qyapi.weixin.qq.com" |
|
|
|
// CollectWachatUsers send required wechat visible users stored in memcache by email |
|
func (s *Service) CollectWachatUsers(c context.Context) (err error) { |
|
var ( |
|
contactInfo *model.ContactInfo |
|
userMap = make(map[string]model.RequireVisibleUser) |
|
user string |
|
) |
|
|
|
if err = s.dao.RequireVisibleUsersRedis(c, &userMap); err != nil { |
|
log.Error("get require visible user error(%v)", err) |
|
return |
|
} |
|
|
|
for k, v := range userMap { |
|
if contactInfo, err = s.dao.QueryUserByID(k); err == nil { |
|
if contactInfo.VisibleSaga { |
|
continue |
|
} |
|
} |
|
user += v.UserName + " , " + v.NickName + "\n" |
|
} |
|
|
|
/*content := fmt.Sprintf("\n\n邮箱前缀 昵称\n\n%s", user) |
|
for _, addr := range conf.Conf.Property.ReportRequiredVisible.AlertAddrs { |
|
if err = mail.SendMail2(addr, "需添加的企业微信名单", content); err != nil { |
|
return |
|
} |
|
}*/ |
|
if err = s.dao.DeleteRequireVisibleUsersRedis(c); err != nil { |
|
log.Error("Delete require visible user error(%v)", err) |
|
return |
|
} |
|
|
|
return |
|
} |
|
|
|
// SyncContacts sync the wechat contacts 更新企业微信列表(用户信息和saga信息) |
|
func (s *Service) SyncContacts(c context.Context) (err error) { |
|
var ( |
|
w = wechat.New(s.dao) |
|
) |
|
|
|
if err = w.SyncContacts(c); err != nil { |
|
return |
|
} |
|
return |
|
} |
|
|
|
// QueryContacts query machine logs. |
|
func (s *Service) QueryContacts(c context.Context, queryRequest *model.Pagination) (p *model.PaginateContact, err error) { |
|
var ( |
|
total int64 |
|
contacts []*model.ContactInfo |
|
) |
|
fmt.Print(queryRequest.PageNum) |
|
if total, contacts, err = s.dao.FindContacts(queryRequest.PageNum, queryRequest.PageSize); err != nil { |
|
return |
|
} |
|
fmt.Print(queryRequest.PageNum) |
|
p = &model.PaginateContact{ |
|
PageNum: queryRequest.PageNum, |
|
PageSize: queryRequest.PageSize, |
|
Total: total, |
|
Contacts: contacts, |
|
} |
|
return |
|
} |
|
|
|
// QueryContactLogs query contact logs. |
|
func (s *Service) QueryContactLogs(c context.Context, queryRequest *model.QueryContactLogRequest) (p *model.PaginateContactLog, err error) { |
|
var ( |
|
total int64 |
|
machineLogs []*model.AboundContactLog |
|
) |
|
if total, machineLogs, err = s.dao.FindMachineLogs(queryRequest); err != nil { |
|
return |
|
} |
|
p = &model.PaginateContactLog{ |
|
PageNum: queryRequest.PageNum, |
|
PageSize: queryRequest.PageSize, |
|
Total: total, |
|
MachineLogs: machineLogs, |
|
} |
|
return |
|
} |
|
|
|
// Wechat ... |
|
func (s *Service) Wechat() *wechat.Wechat { |
|
return wechat.New(s.dao) |
|
} |
|
|
|
// CreateWechat ... |
|
func (s *Service) CreateWechat(c context.Context, req *model.CreateChatReq, username string) (resp *model.CreateChatResp, err error) { |
|
var ( |
|
token string |
|
userIDs []string |
|
ownerInfo *model.ContactInfo |
|
w = wechat.New(s.dao) |
|
) |
|
u := qyWechatURL + "/cgi-bin/appchat/create" |
|
params := url.Values{} |
|
wechatInfo := &model.WechatCreateLog{ |
|
Name: req.Name, |
|
Owner: req.Owner, |
|
ChatID: req.ChatID, |
|
Cuser: username, |
|
Status: 1, |
|
} |
|
|
|
//获取企业token |
|
if token, err = w.AccessToken(c, conf.Conf.Property.Wechat); err != nil { |
|
return |
|
} |
|
params.Set("access_token", token) |
|
|
|
//get owner and users id |
|
if ownerInfo, err = s.dao.QueryUserByUserName(req.Owner); err != nil { |
|
return |
|
} |
|
if userIDs, err = s.QueryUserIds(req.UserList); err != nil { |
|
return |
|
} |
|
|
|
req.Owner = ownerInfo.UserID |
|
req.UserList = userIDs |
|
if err = s.dao.PostJSON(c, u, "", params, &resp, req); err != nil { |
|
return |
|
} |
|
|
|
//add create wechat info to database |
|
if err = s.dao.AddWechatCreateLog(wechatInfo); err != nil { |
|
return |
|
} |
|
|
|
resp = &model.CreateChatResp{ |
|
ChatID: wechatInfo.ChatID, |
|
} |
|
return |
|
} |
|
|
|
// QueryUserIds ... |
|
func (s *Service) QueryUserIds(userNames []string) (userIds []string, err error) { |
|
var ( |
|
userName string |
|
contactInfo *model.ContactInfo |
|
) |
|
if len(userNames) == 0 { |
|
err = errors.Errorf("UserIds: userNames is empty!") |
|
return |
|
} |
|
|
|
for _, userName = range userNames { |
|
if contactInfo, err = s.dao.QueryUserByUserName(userName); err != nil { |
|
err = errors.Wrapf(err, "UserIds: no such user (%s) in db, err (%s)", userName, err.Error()) |
|
return |
|
} |
|
|
|
log.Info("UserIds: username (%s), userid (%s)", userName, contactInfo.UserID) |
|
if contactInfo.UserID != "" { |
|
userIds = append(userIds, contactInfo.UserID) |
|
} |
|
} |
|
return |
|
} |
|
|
|
// QueryWechatCreateLog ... |
|
func (s *Service) QueryWechatCreateLog(c context.Context, req *model.Pagination, username string) (resp *model.CreateChatLogResp, err error) { |
|
var ( |
|
logs []*model.WechatCreateLog |
|
logsResp []*model.CreateChatLog |
|
total int |
|
wechatCreateInfo *model.WechatCreateLog |
|
) |
|
|
|
if logs, total, err = s.dao.QueryWechatCreateLog(true, req, wechatCreateInfo); err != nil { |
|
return |
|
} |
|
for _, log := range logs { |
|
createChatlog := &model.CreateChatLog{} |
|
if log.Cuser == username { |
|
createChatlog.Buttons = append(createChatlog.Buttons, "WECHAT_TEST") |
|
} |
|
createChatlog.WechatCreateLog = log |
|
logsResp = append(logsResp, createChatlog) |
|
} |
|
resp = &model.CreateChatLogResp{ |
|
Total: total, |
|
Pagination: req, |
|
Logs: logsResp, |
|
} |
|
return |
|
} |
|
|
|
// WechatParams ... |
|
func (s *Service) WechatParams(c context.Context, chatid string) (resp *model.GetChatResp, err error) { |
|
var ( |
|
w = wechat.New(s.dao) |
|
token string |
|
) |
|
|
|
if token, err = w.AccessToken(c, conf.Conf.Property.Wechat); err != nil { |
|
return |
|
} |
|
|
|
u := qyWechatURL + "/cgi-bin/appchat/get" |
|
params := url.Values{} |
|
params.Set("access_token", token) |
|
params.Set("chatid", chatid) |
|
err = s.dao.WechatParams(c, u, params, &resp) |
|
return |
|
} |
|
|
|
// SendGroupWechat ... |
|
func (s *Service) SendGroupWechat(c context.Context, req *model.SendChatReq) (resp *model.ChatResp, err error) { |
|
var ( |
|
token string |
|
w = wechat.New(s.dao) |
|
total int |
|
getChatResp *model.GetChatResp |
|
owner string |
|
contentDB = req.Text.Content |
|
) |
|
u := qyWechatURL + "/cgi-bin/appchat/send" |
|
params := url.Values{} |
|
|
|
if token, err = w.AccessToken(c, conf.Conf.Property.Wechat); err != nil { |
|
return |
|
} |
|
params.Set("access_token", token) |
|
|
|
if err = s.dao.PostJSON(c, u, "", params, &resp, req); err != nil { |
|
return |
|
} |
|
if len(contentDB) > model.MaxWechatLen { |
|
contentDB = contentDB[:model.MaxWechatLen] |
|
} |
|
chatLog := &model.WechatChatLog{ |
|
ChatID: req.ChatID, |
|
MsgType: req.MsgType, |
|
Content: contentDB, |
|
Safe: req.Safe, |
|
Status: 1, |
|
} |
|
if err = s.dao.CreateChatLog(chatLog); err != nil { |
|
return |
|
} |
|
|
|
info := &model.WechatCreateLog{ |
|
ChatID: req.ChatID, |
|
} |
|
if _, total, err = s.dao.QueryWechatCreateLog(false, nil, info); err != nil { |
|
return |
|
} |
|
|
|
if total == 0 { |
|
getChatResp, _ = s.WechatParams(c, req.ChatID) |
|
owner = getChatResp.ChatInfo.Owner |
|
contactInfo, _ := s.dao.QueryUserByID(owner) |
|
wechatInfo := &model.WechatCreateLog{ |
|
Name: getChatResp.ChatInfo.Name, |
|
Owner: contactInfo.UserName, |
|
ChatID: req.ChatID, |
|
Status: 2, |
|
} |
|
if err = s.dao.AddWechatCreateLog(wechatInfo); err != nil { |
|
return |
|
} |
|
} |
|
return |
|
} |
|
|
|
// SendWechat ... |
|
func (s *Service) SendWechat(c context.Context, req *model.SendMessageReq) (resp *model.ChatResp, err error) { |
|
var ( |
|
w = wechat.New(s.dao) |
|
) |
|
err = w.PushMsg(c, req.Touser, req.Content) |
|
return |
|
} |
|
|
|
// UpdateWechat ... |
|
func (s *Service) UpdateWechat(c context.Context, req *model.UpdateChatReq) (resp *model.ChatResp, err error) { |
|
var ( |
|
token string |
|
w = wechat.New(s.dao) |
|
) |
|
u := qyWechatURL + "/cgi-bin/appchat/update" |
|
params := url.Values{} |
|
|
|
if token, err = w.AccessToken(c, conf.Conf.Property.Wechat); err != nil { |
|
return |
|
} |
|
params.Set("access_token", token) |
|
if err = s.dao.PostJSON(c, u, "", params, &resp, req); err != nil { |
|
return |
|
} |
|
return |
|
} |
|
|
|
// SyncWechatContacts ... |
|
func (s *Service) SyncWechatContacts(c context.Context) (message string, err error) { |
|
var ( |
|
w = wechat.New(s.dao) |
|
) |
|
if err = w.AnalysisContacts(c); err != nil { |
|
return |
|
} |
|
message = "同步完成" |
|
return |
|
}
|
|
|