package model
import (
"app.yhyue.com/moapp/jybase/common"
"app.yhyue.com/moapp/jybase/date"
"app.yhyue.com/moapp/jybase/encrypt"
"app.yhyue.com/moapp/jybase/mongodb"
"fmt"
"github.com/gogf/gf/v2/util/gconv"
IC "jyBXSubscribe/rpc/init"
"jyBXSubscribe/rpc/type/bxsubscribe"
"strings"
"time"
)
// PersonSubscribe 个人订阅结构体
type PersonSubscribe struct {
AInfotype []string `json:"a_infotype"`
ABuyerclass []string `json:"a_buyerclass"`
IProjectmatch int `json:"i_projectmatch"`
OArea map[string][]string `json:"o_area"`
Odistrict map[string][]string `json:"o_district"`
AItems []struct {
SItem string `json:"s_item"`
AKey []struct {
Key []string `json:"key"`
Notkey []string `json:"notkey"`
Matchway float64 `json:"matchway"`
} `json:"a_key"`
} `json:"a_items"`
IEntFastimport int `json:"i_ent_fastimport"`
IApppush int `json:"i_apppush"`
IMailpush int `json:"i_mailpush"`
IMatchway int `json:"i_matchway"`
IRatemode int `json:"i_ratemode"`
}
// IsEmpty 判断订阅内容是否为空
func (p *PersonSubscribe) IsEmpty() bool {
if len(p.AInfotype) > 0 || len(p.ABuyerclass) > 0 || len(p.OArea) > 0 {
return false
}
// 遍历订阅词
for _, item := range p.AItems {
for _, key := range item.AKey {
if len(key.Key) > 0 || len(key.Notkey) > 0 {
return false
}
}
}
return true
}
// GetStaffSubscribeList 员工订阅总览列表
// query 检索名字/手机号
// eStatus 是否有企业订阅 -1 无企业订阅 1 有企业订阅
// pStatus 是否有个人订阅 -1 无个人订阅 1 有个人订阅
func GetStaffSubscribeList(entId, entUserId int, query string, eStatus, pStatus, pageNum, pageSize int64) (total int64, list []*bxsubscribe.StaffSubscribe) {
userEnt := EntInfo(entId, entUserId)
// 非管理员无权限查询
if !(userEnt.Role_admin_system || userEnt.Role_admin_department) {
return
}
// 当检索是否有个人订阅时,因为无法关联查询,需要提前加载员工是否有个人订阅
pSubscribeList := getEntPersonOrderList(entId)
// 加载当前企业所有企业分发数据
ruleIds := getEntSubscirbeList(entId, userEnt.Dept.Id, userEnt.Role_admin_system)
allRule := ""
if len(ruleIds) > 0 {
allRule = " AND b.rule_id in ('" + strings.Join(ruleIds, "','") + "')"
} else {
allRule = " AND b.rule_id is NULL "
}
var sql string = ` FROM (
SELECT
a.id,
a.name,
a.phone,
b.rule_id,
a.createtime,
GROUP_CONCAT( a.product_type ) AS product_type
FROM
(
SELECT
u.id,
u.NAME,
u.phone,
'e' AS product_type,
u.createtime
FROM
entniche_info a
INNER JOIN entniche_user u ON ( a.id = ? AND a.STATUS = 1 AND u.power = 1 AND a.id = u.ent_id )
%s
UNION
SELECT
u.id,
u.NAME,
u.phone,
IF ( instr( a.product_type, 'v' )> 0, 'v', 'm' ) AS product_type ,
u.createtime
FROM
entniche_wait_empower a
INNER JOIN entniche_power b ON ( a.ent_id = ? AND a.end_time > ? AND b.STATUS = 1 AND a.id = b.wait_empower_id )
INNER JOIN entniche_user u ON ( b.ent_user_id = u.id )
%s
) a
LEFT JOIN entniche_user_rule b ON ( a.id = b.user_id %s)
GROUP BY
a.id,
a.NAME,
a.phone,
b.rule_id,
a.createtime
) as AllData
WHERE`
queryArr, valueArr := []string{" 1=1 "}, []interface{}{}
nowStr := time.Now().Format(date.Date_Full_Layout)
if userEnt.Role_admin_system { //企业管理员
sql = fmt.Sprintf(sql, "", "", allRule)
valueArr = append(valueArr, entId, entId, nowStr)
} else { //部门管理员
limit := fmt.Sprintf(" INNER JOIN entniche_department_user d ON ( d.user_id = u.id) WHERE d.dept_id =? ")
sql = fmt.Sprintf(sql, limit, limit, allRule)
valueArr = append(valueArr, entId, userEnt.Dept.Id, entId, nowStr, userEnt.Dept.Id)
}
// 查询条件过滤
if query = strings.TrimSpace(query); query != "" {
queryArr = append(queryArr, ` ( name LIKE ? or phone like ? ) `)
valueArr = append(valueArr, "%"+query+"%", "%"+query+"%")
}
// 企业分发过滤
if eStatus == 1 && len(ruleIds) == 0 {
return 0, nil
} else if eStatus != 0 && len(ruleIds) > 0 {
if eStatus == 1 { //有个人订阅
tStr := ``
for i, v := range ruleIds {
if i != 0 {
tStr += `,`
}
tStr += fmt.Sprintf(`"%s"`, v)
}
queryArr = append(queryArr, fmt.Sprintf(` rule_id in ( %s ) `, tStr))
} else if eStatus == -1 { //无个人订阅
queryArr = append(queryArr, ` rule_id is NULL `)
}
}
// 个人订阅过滤
if pStatus == 1 && len(pSubscribeList) == 0 {
return 0, nil
} else if pStatus != 0 && len(pSubscribeList) > 0 {
tStr := ``
for i, v := range pSubscribeList {
if i != 0 {
tStr += `,`
}
tStr += fmt.Sprintf("%d", v)
}
if pStatus == 1 { //有个人订阅
queryArr = append(queryArr, fmt.Sprintf(` id in ( %s ) `, tStr))
} else if pStatus == -1 { //无个人订阅
queryArr = append(queryArr, fmt.Sprintf(` id not in ( %s ) `, tStr))
}
}
countSql := fmt.Sprintf("SELECT count(id) %s %s", sql, strings.Join(queryArr, " AND "))
total = IC.MainMysql.CountBySql(countSql, valueArr...)
if total > 0 {
finalSql := fmt.Sprintf("SELECT * %s %s ORDER BY createtime DESC LIMIT %d,%d", sql, strings.Join(queryArr, " AND "), common.If(pageNum >= 0, pageNum, 0).(int64)*pageSize, pageSize)
finalRes := IC.MainMysql.SelectBySql(finalSql, valueArr...)
if finalRes != nil && len(*finalRes) > 0 {
for _, m := range *finalRes {
eUser := common.Int64All(m["id"])
hasPersonSubscribe := false
for _, pid := range pSubscribeList {
if pid == eUser {
hasPersonSubscribe = true
break
}
}
list = append(list, &bxsubscribe.StaffSubscribe{
Token: encodeSubscribeMsg(gconv.Int64(entId), gconv.Int64(entUserId), gconv.Int64(m["id"]), common.ObjToString(m["rule_id"]), gconv.String(m["product_type"])),
Name: common.ObjToString(m["name"]),
Phone: common.ObjToString(m["phone"]),
EStatus: gconv.Int64(common.If(common.ObjToString(m["rule_id"]) == "", -1, 1)),
PStatus: gconv.Int64(common.If(hasPersonSubscribe, 1, -1)),
})
}
}
}
return
}
// getEntPersonOrderList 查询企业订阅所有设置个人订阅的列表
func getEntPersonOrderList(entId int) (uIds []int64) {
res, _ := IC.Mgo.Find("entniche_rule", map[string]interface{}{"i_entid": entId, "i_userid": map[string]interface{}{"$exists": 1}, "i_type": map[string]interface{}{"$exists": 1}}, nil, `{"o_entniche":1,"i_userid":1}`, false, -1, -1)
if res == nil || len(*res) == 0 {
return
}
for _, mData := range *res {
uId := common.Int64All(mData["i_userid"])
if uId <= 0 {
continue
}
thisSub := &PersonSubscribe{}
if gconv.Struct(mData["o_entniche"], thisSub) == nil {
if !thisSub.IsEmpty() {
uIds = append(uIds, uId)
}
}
}
return
}
// getEntSubscirbeList 查询企业分发列表
func getEntSubscirbeList(entId, depId int, isAdmin bool) (rId []string) {
//查询是否有企业分发
dept_subscribe := IC.MainMysql.Count("entniche_info", map[string]interface{}{"dept_subscribe": 1, "id": entId}) > 0
queryMap := map[string]interface{}{
"1": "1",
}
if dept_subscribe && !isAdmin {
queryMap = map[string]interface{}{
"i_entid": entId,
"i_status": 0, //0未删除 1已删除
"i_deptid": depId,
}
} else if isAdmin {
queryMap = map[string]interface{}{
"i_entid": entId,
"i_status": 0, //0未删除 1已删除
"i_deptid": map[string]interface{}{
"$exists": false,
},
}
}
res, _ := IC.Mgo.Find("entniche_distribute", queryMap, nil, `{"_id":1,"o_area":1,"a_buyerclass":1,"a_items":1}`, false, -1, -1)
if len(*res) > 0 {
for _, v := range *res {
rId = append(rId, mongodb.BsonIdToSId(v["_id"]))
}
}
return
}
// GetStaffSubscribeDetail 获取企业个人订阅
func GetStaffSubscribeDetail(entId, uid int64, token string) (rData map[string]interface{}, err error) {
entIdCheck, uidCheck, staffId, ruleId, power, err := decodeSubscribeMsg(token)
if err != nil {
return
}
if entId != entIdCheck || uid != uidCheck {
err = fmt.Errorf("权限异常")
return
}
if power == "" {
err = fmt.Errorf("无订阅内容")
return
}
rData = map[string]interface{}{}
nameEntNiche, nameVipMember := "", "" //当只存在大会员或商机管理时 展示个人订阅;当都存在时展示产品信息
valueEntNiche, valueVipMember := map[string]interface{}{}, map[string]interface{}{}
if strings.Index(power, "e") > -1 {
//个人订阅商机管理
if data := getPersonSubscribe(map[string]interface{}{"i_entid": entId, "i_userid": staffId, "i_type": 0}); data != nil && len(data) > 0 {
nameEntNiche = "个人订阅
商机管理"
valueEntNiche = data
}
}
if strings.Index(power, "m") > -1 || strings.Index(power, "v") > -1 {
//大会员或超级订阅企业版
if data := getPersonSubscribe(map[string]interface{}{"i_entid": entId, "i_userid": staffId, "i_type": 1}); data != nil && len(data) > 0 {
nameVipMember = fmt.Sprintf("个人订阅
%s", common.If(strings.Index(power, "v") > -1, "超级订阅", "大会员"))
valueVipMember = data
}
}
if len(valueEntNiche) > 0 && len(valueVipMember) > 0 {
rData[nameEntNiche] = valueEntNiche
rData[nameVipMember] = valueVipMember
} else if len(valueEntNiche) > 0 {
rData["个人订阅"] = valueEntNiche
} else if len(valueVipMember) > 0 {
rData["个人订阅"] = valueVipMember
}
// 企业自动分发
if ruleId != "" {
if data := getEntDistribute(ruleId, entId, staffId); data != nil && len(data) > 0 {
rData["企业自动分发"] = data
}
}
return
}
// getPersonSubscribe 个人订阅
func getPersonSubscribe(query map[string]interface{}) (rData map[string]interface{}) {
res, _ := IC.Mgo.FindOneByField("entniche_rule", query, `{"o_entniche":1,"i_userid":1}`)
if res == nil || len(*res) == 0 {
return
}
subDetail, rData := &PersonSubscribe{}, map[string]interface{}{}
if err := gconv.Struct((*res)["o_entniche"], subDetail); err == nil {
if subDetail.IsEmpty() {
return
}
wordsList := []map[string]interface{}{}
for _, set := range subDetail.AItems {
for _, t := range set.AKey {
wordsList = append(wordsList, map[string]interface{}{
"key": t.Key,
"match": t.Matchway,
"notkey": t.Notkey,
})
}
}
rData["area"] = subDetail.OArea
rData["district"] = subDetail.Odistrict
rData["infotype"] = subDetail.AInfotype
rData["projectmatch"] = subDetail.IProjectmatch
rData["matchway"] = common.If(subDetail.IMatchway == 0, 1, subDetail.IMatchway) //匹配方式 默认标题匹配 1
rData["wordsList"] = wordsList
rData["buyerClass"] = subDetail.ABuyerclass
}
return
}
// getEntDistribute 获取企业分发订阅
func getEntDistribute(ruleId string, entId, uid int64) (rData map[string]interface{}) {
//查询分发内容
ruleRes, _ := IC.Mgo.FindById("entniche_distribute", ruleId, `{"i_deptid":1,"o_area":1,"a_buyerclass":1,"a_items":1}`)
if ruleRes == nil || len(*ruleRes) == 0 {
return
}
rData = map[string]interface{}{}
deptId := common.IntAll((*ruleRes)["i_deptid"]) //部门id
itemArr := gconv.SliceStr((*ruleRes)["a_items"]) //关键词分类名称
var area map[string][]string
_ = gconv.Struct((*ruleRes)["o_area"], &area) //订阅地区
var district map[string][]string
_ = gconv.Struct((*ruleRes)["o_district"], &district) //区县
//查询分发订阅关键词及信息类型
var wordsRes *map[string]interface{}
if deptId != 0 {
wordsRes, _ = IC.Mgo.FindOne("entniche_rule", map[string]interface{}{"i_entid": entId, "i_deptid": deptId, "i_userid": map[string]interface{}{"$exists": 0}})
} else {
wordsRes, _ = IC.Mgo.FindOne("entniche_rule", map[string]interface{}{"i_entid": entId, "i_deptid": map[string]interface{}{"$exists": 0}, "i_userid": map[string]interface{}{"$exists": 0}})
}
wordsList := []map[string]interface{}{}
infotype, i_projectmatch, i_matchway := []string{}, 0, 0
if wordsRes != nil && len(*wordsRes) > 0 {
thisSub := &PersonSubscribe{}
if gconv.Struct((*wordsRes)["o_entniche"], thisSub) == nil {
for _, set := range thisSub.AItems {
for _, name := range itemArr {
if set.SItem == name {
for _, t := range set.AKey {
wordsList = append(wordsList, map[string]interface{}{
"key": t.Key,
"match": t.Matchway,
"notkey": t.Notkey,
})
}
}
}
}
i_matchway = thisSub.IMatchway
i_projectmatch = thisSub.IProjectmatch
infotype = thisSub.AInfotype
}
}
rData["buyerClass"] = (*ruleRes)["a_buyerclass"] //采购单位类型
rData["area"] = area
rData["district"] = district
rData["infotype"] = infotype
rData["projectmatch"] = i_projectmatch
rData["matchway"] = i_matchway
rData["wordsList"] = wordsList
return
}
// decodeSubscribeMsg token解密
func decodeSubscribeMsg(token string) (entId, uId, staffId int64, ruleId, power string, err error) {
values := encrypt.DecodeArticleId2ByCheck(token)
if len(values) != 5 {
err = fmt.Errorf("解析异常")
return
}
entId = gconv.Int64(values[0])
uId = gconv.Int64(values[1])
staffId = gconv.Int64(values[2])
ruleId = gconv.String(values[3])
power = gconv.String(values[4])
if entId == 0 || uId == 0 || staffId == 0 {
err = fmt.Errorf("参数异常")
return
}
return
}
// encodeSubscribeMsg token加密
func encodeSubscribeMsg(entId, uId, staffId int64, ruleId, power string) string {
return encrypt.EncodeArticleId2ByCheck(fmt.Sprintf("%d,%d,%d,%s,%s", entId, uId, staffId, ruleId, strings.Replace(power, ",", "_", -1)))
}