|
|
@@ -8,6 +8,7 @@ import (
|
|
|
"encoding/xml"
|
|
|
"fmt"
|
|
|
"github.com/elliotchance/pie/pie"
|
|
|
+ "github.com/valyala/fastjson"
|
|
|
"io/ioutil"
|
|
|
"net/http"
|
|
|
"strconv"
|
|
|
@@ -61,10 +62,10 @@ func (l *CallbackMsgLogic) CallbackMsg(req *types.CallbackMsgRequest, w http.Res
|
|
|
//事件处理
|
|
|
if ct.MsgType == types.Event && ct.Event == types.KfMsgOrEvent {
|
|
|
//新消息事件
|
|
|
- go kfMsgOrEventHandle(l.svcCtx, ct)
|
|
|
+ go KfMsgOrEventHandle(l.svcCtx, ct)
|
|
|
} else if ct.MsgType == types.Event && ct.Event == types.KfAccountAuthChange {
|
|
|
//客服账号变动事件
|
|
|
- go kfAccountAuthChangeHandle(l.svcCtx, ct)
|
|
|
+ go KfAccountAuthChangeHandle(l.svcCtx, ct)
|
|
|
}
|
|
|
}
|
|
|
//加密返回
|
|
|
@@ -77,8 +78,8 @@ func (l *CallbackMsgLogic) CallbackMsg(req *types.CallbackMsgRequest, w http.Res
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-// 保存新消息或者事件
|
|
|
-func kfMsgOrEventHandle(svcCtx *svc.ServiceContext, ct types.EventContent) {
|
|
|
+// KfMsgOrEventHandle 新消息或者事件上报处理
|
|
|
+func KfMsgOrEventHandle(svcCtx *svc.ServiceContext, ct types.EventContent) {
|
|
|
//获取分布式锁
|
|
|
rl := lock.NewRedisLock(ct.OpenKfId, svcCtx.Redis)
|
|
|
if err := rl.Lock(); err != nil {
|
|
|
@@ -91,7 +92,7 @@ func kfMsgOrEventHandle(svcCtx *svc.ServiceContext, ct types.EventContent) {
|
|
|
cbService, err = svcCtx.CbServiceModel.GetServiceByOpenKfid(ct.OpenKfId)
|
|
|
cursor = cbService.NextCursor
|
|
|
if err != nil {
|
|
|
- go kfAccountAuthChangeHandle(svcCtx, ct)
|
|
|
+ go KfAccountAuthChangeHandle(svcCtx, ct)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -129,6 +130,14 @@ func kfMsgOrEventHandle(svcCtx *svc.ServiceContext, ct types.EventContent) {
|
|
|
if err != nil {
|
|
|
logx.Error("Insert cb_msg fail ", err)
|
|
|
}
|
|
|
+ //消息额外处理
|
|
|
+ if cbMsg.Msgtype == types.MsgTypeText {
|
|
|
+ msgTypeTextHandle(svcCtx, cbMsg)
|
|
|
+ }
|
|
|
+ //事件消息额外处理
|
|
|
+ if cbMsg.Msgtype == types.MsgTypeEvent {
|
|
|
+ msgTypeEventHandle(svcCtx, cbMsg)
|
|
|
+ }
|
|
|
}
|
|
|
go updateCustomerList(svcCtx, userIds)
|
|
|
if more == 0 {
|
|
|
@@ -138,8 +147,8 @@ func kfMsgOrEventHandle(svcCtx *svc.ServiceContext, ct types.EventContent) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-// 更新客服账号列表、接待人员列表
|
|
|
-func kfAccountAuthChangeHandle(svcCtx *svc.ServiceContext, ct types.EventContent) {
|
|
|
+// KfAccountAuthChangeHandle 管理员权限修改事件上报处理
|
|
|
+func KfAccountAuthChangeHandle(svcCtx *svc.ServiceContext, ct types.EventContent) {
|
|
|
err, list := svcCtx.WxApi.GetServiceList()
|
|
|
if err != nil {
|
|
|
logx.Error("GetServiceList fail ", err)
|
|
|
@@ -168,20 +177,22 @@ func kfAccountAuthChangeHandle(svcCtx *svc.ServiceContext, ct types.EventContent
|
|
|
logx.Error("GetServicerList fail ", err)
|
|
|
}
|
|
|
for _, a := range accounts {
|
|
|
- cbServicer, err := svcCtx.CbServicerModel.GetServicer(s.OpenKfid, a.Userid)
|
|
|
+ err := svcCtx.CbServicerModel.DeleteServicerByOpenKfid(s.OpenKfid)
|
|
|
if err != nil {
|
|
|
- cbServicer.OpenKfid = s.OpenKfid
|
|
|
- cbServicer.Corpid = svcCtx.Config.Wxwork.Corpid
|
|
|
- cbServicer.Userid = a.Userid
|
|
|
- cbServicer.Status = a.Status
|
|
|
- cbServicer.DepartmentId = a.DepartmentId
|
|
|
- now := time.Now()
|
|
|
- cbServicer.CreatedAt = now
|
|
|
- cbServicer.UpdatedAt = now
|
|
|
- _, err := svcCtx.CbServicerModel.Insert(nil, cbServicer)
|
|
|
- if err != nil {
|
|
|
- logx.Error("Insert cb_servicer fail ", err)
|
|
|
- }
|
|
|
+ logx.Error("DeleteServicerByOpenKfid fail ", err)
|
|
|
+ }
|
|
|
+ cbServicer := &model.CbServicer{}
|
|
|
+ cbServicer.OpenKfid = s.OpenKfid
|
|
|
+ cbServicer.Corpid = svcCtx.Config.Wxwork.Corpid
|
|
|
+ cbServicer.Userid = a.Userid
|
|
|
+ cbServicer.Status = a.Status
|
|
|
+ cbServicer.DepartmentId = a.DepartmentId
|
|
|
+ now := time.Now()
|
|
|
+ cbServicer.CreatedAt = now
|
|
|
+ cbServicer.UpdatedAt = now
|
|
|
+ _, err = svcCtx.CbServicerModel.Insert(nil, cbServicer)
|
|
|
+ if err != nil {
|
|
|
+ logx.Error("Insert cb_servicer fail ", err)
|
|
|
}
|
|
|
//保存成员信息
|
|
|
staff, err := svcCtx.CbStaffModel.GetStaff(svcCtx.Config.Wxwork.Corpid, a.Userid)
|
|
|
@@ -240,3 +251,26 @@ func updateCustomerList(svcCtx *svc.ServiceContext, userIds pie.Strings) {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+// 消息额外处理
|
|
|
+func msgTypeTextHandle(svcCtx *svc.ServiceContext, msg *model.CbMsg) {
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// 事件消息额外处理
|
|
|
+func msgTypeEventHandle(svcCtx *svc.ServiceContext, msg *model.CbMsg) {
|
|
|
+ content, err := fastjson.Parse(msg.DataInfo)
|
|
|
+ if err != nil {
|
|
|
+ logx.Error("fastjson.Parse(cbMsg.DataInfo) fail ", err)
|
|
|
+ }
|
|
|
+ eventType := content.GetStringBytes("event_type")
|
|
|
+ switch string(eventType) {
|
|
|
+ case types.EventTypeEnterSession:
|
|
|
+ //进入会话事件,加入消息流转池
|
|
|
+ err := svcCtx.WxApi.UpdateSessionState(msg.OpenKfid, msg.ExternalUserid, "", 2)
|
|
|
+ if err != nil {
|
|
|
+ logx.Error("UpdateSessionState fail ", err)
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }
|
|
|
+}
|