|
@@ -0,0 +1,265 @@
|
|
|
+package service
|
|
|
+
|
|
|
+import (
|
|
|
+ util "app.yhyue.com/moapp/jybase/common"
|
|
|
+ . "app.yhyue.com/moapp/jybase/mongodb"
|
|
|
+ "app.yhyue.com/moapp/jybase/mysql"
|
|
|
+ "github.com/zeromicro/go-zero/core/logx"
|
|
|
+ IC "jyBXSubscribe/rpc/init"
|
|
|
+)
|
|
|
+
|
|
|
+var Mysql *mysql.Mysql
|
|
|
+var Mgo *MongodbSim
|
|
|
+
|
|
|
+//用户基本信息
|
|
|
+type UserInfo struct {
|
|
|
+ Entniche *Entniche
|
|
|
+ SubSet map[string]interface{}
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+type Entniche struct {
|
|
|
+ EntId int //企业id
|
|
|
+ EntName string //企业名称
|
|
|
+ DeptId int //部门id
|
|
|
+ DeptName string //部门名称
|
|
|
+ DisId string //分发id
|
|
|
+ UserId int
|
|
|
+}
|
|
|
+type MatchJob struct {
|
|
|
+}
|
|
|
+
|
|
|
+func (m *MatchJob) Start(entId, entUserId int) map[string]interface{} {
|
|
|
+ defer util.Catch()
|
|
|
+ defer ClearEnt()
|
|
|
+ InitEnt(IC.MainMysql, &IC.Mgo, "qfw", entId, entUserId)
|
|
|
+ users := m.LoadSubSet(entId)
|
|
|
+ return FinalSub(entUserId, users)
|
|
|
+}
|
|
|
+
|
|
|
+func (m *MatchJob) LoadSubSet(entId int) map[*UserInfo]bool {
|
|
|
+ defer util.Catch()
|
|
|
+ Users := map[*UserInfo]bool{}
|
|
|
+ sess := Mgo.GetMgoConn()
|
|
|
+ defer Mgo.DestoryMongoConn(sess)
|
|
|
+ it := sess.DB("qfw").C("entniche_rule").Find(map[string]interface{}{
|
|
|
+ "i_entid": entId,
|
|
|
+ }).Select(map[string]interface{}{
|
|
|
+ "i_entid": 1,
|
|
|
+ "i_deptid": 1,
|
|
|
+ "i_userid": 1,
|
|
|
+ "o_entniche": 1,
|
|
|
+ }).Iter()
|
|
|
+ for _temp := make(map[string]interface{}); it.Next(&_temp); {
|
|
|
+ func(temp map[string]interface{}) {
|
|
|
+ entId := util.IntAll(temp["i_entid"])
|
|
|
+ deptId := util.IntAll(temp["i_deptid"])
|
|
|
+ userId := util.IntAll(temp["i_userid"])
|
|
|
+ if entId == 0 || (deptId == 0 && userId == 0) {
|
|
|
+ return
|
|
|
+ } else if Ents[entId] == nil {
|
|
|
+ logx.Info("没有找到该企业", entId)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ entName := Ents[entId].Name
|
|
|
+ if deptId > 0 && EntDepts[deptId] == nil {
|
|
|
+ logx.Info("没有找到该部门", entName, entId, deptId)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ deptName := ""
|
|
|
+ if EntDepts[deptId] != nil {
|
|
|
+ deptName = EntDepts[deptId].Name
|
|
|
+ }
|
|
|
+ subSet, _ := temp["o_entniche"].(map[string]interface{})
|
|
|
+ if subSet == nil || len(subSet) == 0 {
|
|
|
+ logx.Info("订阅设置为空,过滤掉", entName, entId, deptName, deptId, userId)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //
|
|
|
+ if deptId > 0 { //部门订阅
|
|
|
+ if Ents[entId].Model != 1 {
|
|
|
+ logx.Info("不是统一订阅模式,过滤掉", entName, entId, deptName, deptId)
|
|
|
+ return
|
|
|
+ } else if EntDepts[deptId] == nil {
|
|
|
+ logx.Info("没有找到该部门,过滤掉", entName, entId, deptName, deptId)
|
|
|
+ return
|
|
|
+ } else if EntDepts[deptId].Subdis == 0 {
|
|
|
+ logx.Info("该部门的订阅分发没有开启,过滤掉", entName, entId, deptName, deptId)
|
|
|
+ return
|
|
|
+ } else if EntDepts[deptId].Nodiff == 0 && EntDeptDis[deptId] == nil {
|
|
|
+ logx.Info("该部门开启了订阅分发,没有开启全员无差别接收,但是没有分发规则,过滤掉", entName, entId, deptName, deptId)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //如果我的上级部门打开了订阅分发,并且开启了全员无差别接收,本部门规则无效
|
|
|
+ for _, dept := range EntParentDept[deptId] {
|
|
|
+ if EntDepts[dept.Pid].Subdis == 1 && EntDepts[dept.Pid].Nodiff == 1 {
|
|
|
+ logx.Info("我的上级部门", dept.Pid, "开启了订阅分发和全员无差别,过滤掉", entName, entId, deptName, deptId)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if userId > 0 { //个人订阅
|
|
|
+ if Ents[entId].Model != 2 {
|
|
|
+ logx.Info("不是个人订阅模式,过滤掉", entName, entId, userId)
|
|
|
+ return
|
|
|
+ } else if EntUsers[userId] == nil {
|
|
|
+ logx.Info("没有找到该用户,过滤掉", entName, entId, userId)
|
|
|
+ return
|
|
|
+ } else if EntUsers[userId].Power == 0 {
|
|
|
+ logx.Info("该用户没有权限,过滤掉", entName, entId, userId)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ user := &UserInfo{
|
|
|
+ Entniche: &Entniche{
|
|
|
+ EntId: entId,
|
|
|
+ EntName: entName,
|
|
|
+ DeptId: deptId,
|
|
|
+ DeptName: deptName,
|
|
|
+ UserId: userId,
|
|
|
+ },
|
|
|
+ SubSet: subSet,
|
|
|
+ }
|
|
|
+ logx.Info("加载订阅设置", "entId", entId, "entName", entName, "deptId", deptId, "deptName", deptName, "userId", userId)
|
|
|
+ Users[user] = true
|
|
|
+ if deptId <= 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //分发规则
|
|
|
+ if EntDepts[deptId].Nodiff == 1 {
|
|
|
+ logx.Info("该部门开启了全员无差别,分发规则无效", entName, entId, deptName, deptId)
|
|
|
+ return
|
|
|
+ } else if EntDeptDis[deptId] == nil {
|
|
|
+ logx.Info("该部门没有分发规则", entName, entId, deptName, deptId)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ itemMap := map[string]interface{}{}
|
|
|
+ items, _ := subSet["a_items"].([]interface{})
|
|
|
+ for _, v := range items {
|
|
|
+ item, _ := v.(map[string]interface{})
|
|
|
+ if item == nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ item_name, _ := item["s_item"].(string)
|
|
|
+ if item_name == "" {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ itemMap[item_name] = item
|
|
|
+ }
|
|
|
+ for _, dis := range EntDeptDis[deptId] {
|
|
|
+ child_items := []interface{}{}
|
|
|
+ for _, item_name := range dis.Items {
|
|
|
+ if itemMap[item_name] == nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ child_items = append(child_items, itemMap[item_name])
|
|
|
+ }
|
|
|
+ child_subSet := map[string]interface{}{}
|
|
|
+ if len(dis.Buyerclass) > 0 {
|
|
|
+ child_subSet["a_buyerclass"] = dis.Buyerclass
|
|
|
+ }
|
|
|
+ if len(dis.Area) > 0 {
|
|
|
+ child_subSet["o_area"] = dis.Area
|
|
|
+ }
|
|
|
+ if len(child_items) > 0 {
|
|
|
+ child_subSet["a_items"] = child_items
|
|
|
+ }
|
|
|
+ if len(child_subSet) == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ child_user := &UserInfo{
|
|
|
+ Entniche: &Entniche{
|
|
|
+ EntId: user.Entniche.EntId,
|
|
|
+ EntName: user.Entniche.EntName,
|
|
|
+ DeptId: user.Entniche.DeptId,
|
|
|
+ DeptName: user.Entniche.DeptName,
|
|
|
+ DisId: dis.Id,
|
|
|
+ },
|
|
|
+ SubSet: child_subSet,
|
|
|
+ }
|
|
|
+ Users[child_user] = true
|
|
|
+ }
|
|
|
+ }(_temp)
|
|
|
+ _temp = make(map[string]interface{})
|
|
|
+ }
|
|
|
+ return Users
|
|
|
+}
|
|
|
+func FinalSub(entUserId int, users map[*UserInfo]bool) map[string]interface{} {
|
|
|
+ for k, _ := range users {
|
|
|
+ if k.Entniche.DeptId > 0 {
|
|
|
+ k.Entniche.DeptName = EntDepts[k.Entniche.DeptId].Name
|
|
|
+ staffIds := GetDeptUserIds(&UserInfo{
|
|
|
+ Entniche: &Entniche{
|
|
|
+ EntId: k.Entniche.EntId,
|
|
|
+ EntName: k.Entniche.EntName,
|
|
|
+ DeptId: k.Entniche.DeptId,
|
|
|
+ DeptName: k.Entniche.DeptName,
|
|
|
+ DisId: k.Entniche.DisId,
|
|
|
+ },
|
|
|
+ })
|
|
|
+ if staffIds == nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if staffIds[entUserId] {
|
|
|
+ return k.SubSet
|
|
|
+ }
|
|
|
+ } else if k.Entniche.UserId > 0 {
|
|
|
+ return k.SubSet
|
|
|
+ } else {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|
|
|
+func GetDeptUserIds(ui *UserInfo) map[int]bool {
|
|
|
+ if EntDepts[ui.Entniche.DeptId].Subdis == 0 {
|
|
|
+ logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, "没有开启订阅分发,过滤掉")
|
|
|
+ return nil
|
|
|
+ } else if EntDepts[ui.Entniche.DeptId].Nodiff == 0 && ui.Entniche.DisId == "" {
|
|
|
+ logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, "没有开启全员无差别接收,并且没有分发规则,过滤掉")
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ //对我的对着生效的用户
|
|
|
+ myIds := map[int]bool{}
|
|
|
+ //打开了全员无差别,下面所有员工都生效
|
|
|
+ if EntDepts[ui.Entniche.DeptId].Nodiff == 1 {
|
|
|
+ for _, v := range EntDeptUsers[ui.Entniche.DeptId] {
|
|
|
+ myIds[v.UserId] = true
|
|
|
+ }
|
|
|
+ for _, v := range EntChildDept[ui.Entniche.DeptId] {
|
|
|
+ for _, vv := range EntDeptUsers[v.Id] {
|
|
|
+ myIds[vv.UserId] = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, "该部门打开了全员无差别", len(myIds), "人接收")
|
|
|
+ } else if ui.Entniche.DisId != "" {
|
|
|
+ for _, v := range EntRuleUsers[ui.Entniche.DisId] {
|
|
|
+ myIds[v.UserId] = true
|
|
|
+ }
|
|
|
+ logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, "该规则开启了订阅分发", ui.Entniche.DisId, "规则分发了", len(myIds), "人")
|
|
|
+ }
|
|
|
+ //我的上级部门,过滤掉本部门的人
|
|
|
+ for _, v := range EntParentDept[ui.Entniche.DeptId] {
|
|
|
+ //看我的上级部门,有没有开启订阅分发
|
|
|
+ if EntDepts[v.Pid].Subdis == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ //看我的上级部门,有没有全员无差别接收
|
|
|
+ if EntDepts[v.Pid].Nodiff == 1 {
|
|
|
+ logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, ui.Entniche.DisId, "上级部门", v.Pid, "打开了全员无差别开关,过滤掉")
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ //看我的上级部门,有没有对我设置规则
|
|
|
+ for _, vv := range EntDeptDis[v.Pid] {
|
|
|
+ for _, vvv := range EntRuleUsers[vv.Id] {
|
|
|
+ _, ok := myIds[vvv.UserId]
|
|
|
+ if !ok {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ delete(myIds, vvv.UserId)
|
|
|
+ logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, "上级部门", v.Pid, "对我设置的有", vvv.RuleId, "分发规则,此规则作废", vvv.UserId)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, ui.Entniche.DisId, "该规则匹配到", len(myIds), "人")
|
|
|
+ return myIds
|
|
|
+}
|