328 lines
7.9 KiB
Go
328 lines
7.9 KiB
Go
|
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
|
|||
|
}
|