go-common/app/admin/ep/saga/service/wechat.go
2019-04-22 18:49:16 +08:00

328 lines
7.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}