go-common/app/admin/ep/saga/service/wechat.go

328 lines
7.9 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
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
}