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.

605 lines
16 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package ImRelateDao
import (
"dsSzxy/Utils/CommonUtil"
"dsSzxy/Utils/ConfigUtil"
"dsSzxy/Utils/DbUtil"
"dsSzxy/Utils/EsUtil"
"dsSzxy/Utils/RedisUtil"
ssdb "dsSzxy/Utils/SsdbUtil"
"encoding/json"
"errors"
"fmt"
"github.com/astaxie/beego/httplib"
"github.com/rongcloud/server-sdk-go/v3/sdk"
"github.com/xormplus/xorm"
"strconv"
"strings"
"time"
)
var db = DbUtil.Engine
//人员信息结构
type Person struct {
Success bool `json:"success"`
PageSize int `json:"pageSize"`
PageNumber int `json:"pageNumber"`
TotalRow int `json:"totalRow"`
TotalPage int `json:"totalPage"`
List []PersonList `json:"list"`
}
//人员信息LIST
type PersonList struct {
OrgName string `json:"org_name"`
OrgId string `json:"org_id"`
IdentityId string `json:"identity_id"`
PersonId string `json:"person_id"`
PersonName string `json:"person_name"`
BureauName string `json:"bureau_name"`
FinanceNo string `json:"finance_no"`
IdentityNum string `json:"identity_num"`
LoginPassword string `json:"login_password"`
SortId string `json:"sort_id"`
LoginName string `json:"login_name"`
XbName string `json:"xb_name"`
WorkersNo string `json:"workers_no"`
BureauId string `json:"bureau_id"`
AvatarUrl string `json:"avatar_url"`
}
//群组
type Group struct {
Id int `json:"id"`
Success bool `json:"success"`
Info string `json:"info"`
}
//聊天记录结构
type ChatRecordStruct struct {
SenderUserId string `json:"sender_user_id"`
SenderUserName string `json:"sender_user_name"`
SenderUserAvatar string `json:"sender_user_avatar"`
ReceiverUserId string `json:"receiver_user_id"`
ReceiverUserName string `json:"receiver_user_name"`
ReceiverUserAvatar string `json:"receiver_user_avatar"`
SendTime string `json:"send_time"`
Content string `json:"content"`
Base64 string `json:"base64"`
FileType string `json:"file_type"`
Url string `json:"url"`
Size string `json:"size"`
MessageType string `json:"message_type"`
ChatType string `json:"chat_type"`
}
/**
功能:获取头像
作者:吴缤
日期2021-08-12
*/
func GetPersonAvatar(personId string, identityId string) string {
fileId, extension := GetPersonAvatarFileId(personId, identityId)
url := ""
if fileId != "EA0BC5FB-52D9-E232-D3E3-E6C2960B5739" {
url = GetPersonAvatarUrl(fileId, extension)
}
return url
}
/**
功能获取头像文件ID
作者:吴缤
日期2021-08-12
*/
func GetPersonAvatarFileId(personId string, identityId string) (string, string) {
fileId := "EA0BC5FB-52D9-E232-D3E3-E6C2960B5739"
extension := "png"
ssdbClient, ssdbClientErr := ssdb.Connect(ConfigUtil.SSDBIp, ConfigUtil.SSDBPort)
if ssdbClientErr != nil {
return fileId, extension
}
res, resErr := ssdbClient.Get("space_ajson_personbaseinfo_" + personId + "_" + identityId)
if resErr != nil {
return fileId, extension
}
if res == nil {
return fileId, extension
}
jsonObj, jsonObjErr := CommonUtil.JsonStringToMap(fmt.Sprintf("%v", res))
if jsonObjErr != nil {
return fileId, extension
}
avatarId := fmt.Sprintf("%v", jsonObj["space_avatar_fileid"])
if len(avatarId) == 0 {
return fileId, extension
}
arr := strings.Split(avatarId, ".")
return arr[0], arr[1]
}
/**
功能根据头像ID获取头像地址
作者:吴缤
日期2021-09-03
*/
func GetPersonAvatarUrl(fileId string, extension string) string {
serverLocation := GetServerLocation()
url := ""
if serverLocation == "1" {
url = fmt.Sprintf("https://image.edusoa.com/down/Material/%s/%s.%s?x-image-process=image/resize,w_72,h_72/quality,q_100", fileId[0:2], fileId, extension)
} else {
url = fmt.Sprintf("%s/dsideal_yy/html/thumb/Material/%s/%s.%s@72w_72h_100Q_1x.png", ConfigUtil.DsidealYyPath, fileId[0:2], fileId, extension)
}
return url
}
/**
功能:获取群组名称和头像
作者:吴缤
日期2021-08-17
*/
func GetGroupNameAvatar(groupId string, w string, h string) (string, string) {
avatarUrl := "/dsideal_yy/html/thumb/Material/%s/%s@" + w + "w_" + h + "h_100Q_1x.png"
//默认头像
avatarId := "9750A6F8-2CBF-4CF0-A254-F2528C45D3A8.png"
avatar := fmt.Sprintf(avatarUrl, avatarId[0:2], avatarId)
db := DbUtil.Engine
record := make(xorm.Record)
sql := "select group_name,avater_url from t_base_group_new where id = ?"
_, err := db.SQL(sql, groupId).Get(&record)
if err != nil {
return "未知", avatar
}
avatarId = fmt.Sprintf("%v", record["avater_url"].String())
avatar = fmt.Sprintf(avatarUrl, avatarId[0:2], avatarId)
groupName := record["group_name"].String()
return groupName, avatar
}
/**
功能:获取人员姓名
作者:吴缤
日期2021-08-17
*/
func GetPersonName(personId string, identityId string) string {
personName := "未知"
personNameRedis, errRedis := GetPersonNameRedis(personId, identityId)
if errRedis != nil {
personNameMysql, errMysql := GetPersonNameMsyql(personId, identityId)
if errMysql != nil {
return personName
}
personName = personNameMysql
} else {
personName = personNameRedis
}
return personName
}
/**
功能在Redis中获取人员姓名
作者:吴缤
日期2021-08-17
*/
func GetPersonNameRedis(personId string, identityId string) (string, error) {
key := fmt.Sprintf("person_%s_%s", personId, identityId)
result := RedisUtil.HMGETALL(key)
if len(result) == 0 {
return "", errors.New("redis中未找到")
}
return result["person_name"], nil
}
/**
功能在Mysql中获取人员姓名
作者:吴缤
日期2021-08-17
*/
func GetPersonNameMsyql(personId string, identityId string) (string, error) {
db := DbUtil.Engine
record := make(xorm.Record)
sql := "select person_name from t_sys_loginperson where person_id = ? and identity_id=?"
_, err := db.SQL(sql, personId, identityId).Get(&record)
if err != nil {
return "", err
}
personName := record["person_name"].String()
return personName, nil
}
/**
功能获取用户TOKEN也可当作同步用户使用
作者:吴缤
日期2021-09-08
*/
func RongYunGetToken(personId string, identityId string, personName string, avatar string) (string, error) {
//获取云平台配置文件中的融云AK和SK
configMap, configErr := CommonUtil.GetRongYunConfig()
if configErr != nil {
return "", configErr
}
ak := configMap["app_key"]
sk := configMap["app_secret"]
suffix := configMap["rong_server_name"]
rc := sdk.NewRongCloud(ak, sk)
user, err := rc.UserRegister(personId+"_"+identityId+suffix, personName, avatar)
if err != nil {
return "", err
}
return user.Token, nil
}
/**
功能保存聊天记录到ES
作者:吴缤
日期2021-08-17
*/
func SaveChatRecord(indexName string, bodyString string) error {
esClient := EsUtil.EsClient
CTX := EsUtil.CTX
_, err := esClient.Index().
Index(indexName).
Id(CommonUtil.GetUUID()).
BodyString(bodyString).
Do(CTX)
if err != nil {
return err
}
return nil
}
/**
功能根据融云的userId拆分为人员ID和身份ID
作者:吴缤
日期2021-08-17
*/
func GetPersonIdIdentityId(userId string) (string, string) {
s := strings.Split(userId, "_")
return s[0], s[1]
}
/**
功能根据融云的groupId拆分出组ID
作者:吴缤
日期2021-08-17
*/
func GetGroupId(groupId string) string {
s := strings.Split(groupId, "_")
return s[0]
}
/**
功能根据融云的userId获取人员姓名
作者:吴缤
日期2021-08-17
*/
func GetPersonNameByUserId(userId string) string {
pId, iId := GetPersonIdIdentityId(userId)
personName := GetPersonName(pId, iId)
return personName
}
/**
功能根据融云的userId获取人员头像
作者:吴缤
日期2021-08-17
*/
func GetPersonAvatarByUserId(userId string) string {
pId, iId := GetPersonIdIdentityId(userId)
avatar := GetPersonAvatar(pId, iId)
return avatar
}
/**
功能根据融云的groupId获取群组名称和头像
作者:吴缤
日期2021-08-17
*/
func GetGroupNameAvatarByGroupId(groupId string) (string, string) {
gId := GetGroupId(groupId)
groupName, groupAvatar := GetGroupNameAvatar(gId, "36", "36")
return groupName, groupAvatar
}
/**
功能:根据发送人、接收人和发送类型获取人名和头像
作者:吴缤
日期2021-08-23
*/
func GetPersonNameAvatar(fromId string, toId string, sendType string) (fromName, fromAvatar, toName, toAvatar string) {
fromName = GetPersonNameByUserId(fromId)
fromAvatar = GetPersonAvatarByUserId(fromId)
if sendType == "p" {
toName = GetPersonNameByUserId(toId)
toAvatar = GetPersonAvatarByUserId(toId)
} else {
toName, toAvatar = GetGroupNameAvatarByGroupId(toId)
}
return
}
/**
功能:获取系统类型 1云版 2局版
作者:吴缤
日期2021-09-06
*/
func GetServerLocation() string {
url := ConfigUtil.DsidealYyPath + "/dsideal_yy/golbal/getValueByKey"
req := httplib.Get(url)
req.Param("key", "common.server.location")
resStr, err := req.String()
if err != nil {
return "2"
}
resObj, err := CommonUtil.JsonStringToMap(resStr)
if err != nil {
return "2"
}
return CommonUtil.ConvertInterfaceToString(resObj["common.server.location"])
}
func GetPersonList(bureauId string, orgId string, queryChild string, bUse string, personName string, queryBureauChild string, pageNumber string, pageSize string) (string, error) {
req := httplib.Get(fmt.Sprintf("%s/dsideal_yy/admin/new_base/personInfo_GetPersonInfoList", ConfigUtil.DsidealYyPath))
req.Param("bureau_id", bureauId)
req.Param("org_id", orgId)
req.Param("query_child", queryChild)
req.Param("b_use", bUse)
req.Param("person_name", personName)
req.Param("query_bureau_child", queryBureauChild)
req.Param("pageNumber", pageNumber)
req.Param("pageSize", pageSize)
resStr, err := req.String()
if err != nil {
return "", err
}
var p Person
json.Unmarshal([]byte(resStr), &p)
for i := 0; i < len(p.List); i++ {
personId := p.List[i].PersonId
identityId := p.List[i].IdentityId
p.List[i].AvatarUrl = GetPersonAvatar(personId, identityId)
}
jsonBytes, err := json.Marshal(p)
return string(jsonBytes), nil
}
/**
功能:调用云平台的创建群组接口
作者:吴缤
日期2021-09-09
*/
func SaveGroup(groupName string, personIdCookie string, identityIdCookie string, tokenCookie string, qAccessTokenCookie string) (string, error) {
req := httplib.Post(fmt.Sprintf("%s/dsideal_yy/ypt/group/saveGroup", ConfigUtil.DsidealYyPath))
req.Param("group_name", groupName)
req.Param("group_desc", "")
req.Param("avater_url", "OTc1MEE2RjgtMkNCRi00Q0YwLUEyNTQtRjI1MjhDNDVEM0E4LnBuZw==")
req.Param("parent_type", "-1")
req.Param("parent_id", "-1")
req.Param("group_type", "2")
req.Param("use_range", "1")
req.Param("plat_type", "1")
req.Param("plat_id", "0")
CommonUtil.AddCookie(req, personIdCookie, identityIdCookie, tokenCookie, qAccessTokenCookie)
resStr, err := req.String()
if err != nil {
return "", err
}
var g Group
json.Unmarshal([]byte(resStr), &g)
if !g.Success {
return "", errors.New(g.Info)
}
return strconv.Itoa(g.Id), nil
}
/**
功能:调用云平台的增加群组成员接口
作者:吴缤
日期2021-09-09
*/
func AddGroupMember(groupId string, personList string, personIdCookie string, identityIdCookie string, tokenCookie string, qAccessTokenCookie string) error {
req := httplib.Post(fmt.Sprintf("%s/dsideal_yy/ypt/group/addMember", ConfigUtil.DsidealYyPath))
req.Param("groupId", groupId)
req.Param("pids", personList)
req.Param("random_num", CommonUtil.GetSixRandom())
CommonUtil.AddCookie(req, personIdCookie, identityIdCookie, tokenCookie, qAccessTokenCookie)
resStr, err := req.String()
if err != nil {
return err
}
var g Group
json.Unmarshal([]byte(resStr), &g)
if !g.Success {
return errors.New("调用云平台的增加群组成员接口失败!")
}
return nil
}
/**
功能:向融云同步人员
作者:吴缤
日期2021-09-13
*/
func SyncRongYunUser() {
ts, inc := getRongYunSync("person")
sql := "select person_id,person_name,last_update_time from t_base_person where b_use=1 and identity_id=5 and ((last_update_time=? and person_id>?) or last_update_time>?) order by last_update_time,person_id limit 200"
res, _ := db.QueryString(sql, ts, inc, ts)
count := len(res) - 1
for i, v := range res {
personId := v["person_id"]
personName := v["person_name"]
updateTs := v["last_update_time"]
RongYunGetToken(personId, "5", personName, "")
if i == count {
updateRongYunSync("person", updateTs, personId)
}
}
// 每1分钟执行一次
time.AfterFunc(1*time.Minute, SyncRongYunUser)
}
/**
功能:向融云同步群组和人员关系
作者:吴缤
日期2021-09-13
*/
func SyncRongYunGroup() {
ts, inc := getRongYunSync("group")
sql := "select t1.id,t1.group_id,t2.group_name,t1.person_id,t1.identity_id,t1.last_update_time from t_base_group_member_new t1 inner join t_base_group_new t2 on t1.group_id=t2.id where t1.identity_id=5 and t1.state_id=1 and t1.b_use=1 and ((t1.last_update_time=? and t1.id>?) or t1.last_update_time>?) order by t1.last_update_time,t1.id limit 200"
res, _ := db.QueryString(sql, ts, inc, ts)
count := len(res) - 1
for i, v := range res {
personId := v["person_id"]
identityId := v["identity_id"]
groupId := v["group_id"]
groupName := v["group_name"]
updateTs := v["last_update_time"]
id := v["id"]
RongYunJoinGroup(personId, identityId, groupId, groupName)
if i == count {
updateRongYunSync("group", updateTs, id)
}
}
// 每1分钟执行一次
time.AfterFunc(1*time.Minute, SyncRongYunGroup)
}
/**
功能:融云加入群组
作者:吴缤
日期2021-09-13
*/
func RongYunJoinGroup(personId, identityId, groupId, groupName string) error {
//获取云平台配置文件中的融云AK和SK
configMap, configErr := CommonUtil.GetRongYunConfig()
if configErr != nil {
return configErr
}
ak := configMap["app_key"]
sk := configMap["app_secret"]
suffix := configMap["rong_server_name"]
rc := sdk.NewRongCloud(ak, sk)
group := []sdk.Group{sdk.Group{ID: groupId + suffix, Name: groupName}}
err := rc.GroupSync(
personId+"_"+identityId+suffix,
group,
)
return err
}
/**
功能根据分类获取时间戳和自增ID
作者:吴缤
日期2021-09-13
*/
func getRongYunSync(classify string) (string, string) {
record := make(xorm.Record)
sql := "select ts,inc from t_dsmin_rongyun_sync where classify=?"
db.SQL(sql, classify).Get(&record)
ts := record["ts"].String()
inc := record["inc"].String()
return ts, inc
}
/**
功能更新时间戳和自增ID
作者:吴缤
日期2021-09-13
*/
func updateRongYunSync(classify, ts, inc string) {
sql := "update t_dsmin_rongyun_sync set ts=?,inc=? where classify=?"
db.Exec(sql, ts, inc, classify)
}
/**
功能:发送系统消息
作者:吴缤
日期2021-09-17
*/
func SendSystemMsg(fromId, toId, content string) error {
req := httplib.Post(fmt.Sprintf("%s/message/system/publish.json", ConfigUtil.RongYunApiUri))
addHeader(req)
req.Param("fromUserId", fromId)
req.Param("toUserId", toId)
req.Param("objectName", "RC:TxtMsg")
req.Param("content", content)
resStr, err := req.String()
if err != nil {
return err
}
resMap := make(map[string]interface{})
errJson := json.Unmarshal([]byte(resStr), &resMap)
if errJson != nil {
return errJson
}
if resMap["code"].(float64) != 200 {
return errors.New(resMap["errorMessage"].(string))
}
return nil
}
/**
功能调用融云API时增加头信息
作者:吴缤
日期2021-09-17
*/
func addHeader(req *httplib.BeegoHTTPRequest) {
configMap, configErr := CommonUtil.GetRongYunConfig()
if configErr != nil {
fmt.Println("获取融云配置文件失败!")
return
}
ak := configMap["app_key"]
sk := configMap["app_secret"]
nonce := CommonUtil.GetSixRandom()
timestamp := CommonUtil.GetTimeStamp()
req.Header("RC-App-Key", ak)
req.Header("RC-Nonce", nonce)
req.Header("RC-Timestamp", timestamp)
req.Header("RC-Signature", CommonUtil.SHA1(sk+nonce+timestamp))
}