matchjob.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package service
  2. import (
  3. "fmt"
  4. IC "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXSubscribe/rpc/init"
  5. "log"
  6. util "app.yhyue.com/moapp/jybase/common"
  7. "github.com/zeromicro/go-zero/core/logx"
  8. )
  9. //用户基本信息
  10. type UserInfo struct {
  11. Entniche *Entniche
  12. SubSet map[string]interface{}
  13. }
  14. //
  15. type Entniche struct {
  16. EntId int //企业id
  17. EntName string //企业名称
  18. DeptId int //部门id
  19. DeptName string //部门名称
  20. DisId string //分发id
  21. UserId int
  22. }
  23. type MatchJob struct {
  24. }
  25. func (m *MatchJob) Start(entId, entUserId int) (map[string]interface{}, int) {
  26. defer util.Catch()
  27. defer ClearEnt()
  28. InitEnt(IC.MainMysql, &IC.Mgo, "qfw", entId, entUserId)
  29. users := m.LoadSubSet(entId)
  30. return FinalSub(entUserId, users), EntUserDept[entUserId].DeptId
  31. }
  32. func (m *MatchJob) LoadSubSet(entId int) map[*UserInfo]bool {
  33. defer util.Catch()
  34. Users := map[*UserInfo]bool{}
  35. sess := IC.Mgo.GetMgoConn()
  36. defer IC.Mgo.DestoryMongoConn(sess)
  37. it := sess.DB("qfw").C("entniche_rule").Find(map[string]interface{}{
  38. "i_entid": entId,
  39. }).Select(map[string]interface{}{
  40. "i_entid": 1,
  41. "i_deptid": 1,
  42. "i_userid": 1,
  43. "o_entniche": 1,
  44. "i_type": 1,
  45. }).Iter()
  46. log.Println("it", it)
  47. for _temp := make(map[string]interface{}); it.Next(&_temp); {
  48. func(temp map[string]interface{}) {
  49. log.Println("temp", temp)
  50. entId := util.IntAll(temp["i_entid"])
  51. deptId := util.IntAll(temp["i_deptid"])
  52. userId := util.IntAll(temp["i_userid"])
  53. if entId == 0 || (deptId == 0 && userId == 0) {
  54. return
  55. }
  56. entName := fmt.Sprint(entId)
  57. if deptId > 0 && EntDepts[deptId] == nil {
  58. logx.Info("没有找到该部门", entName, entId, deptId)
  59. return
  60. }
  61. deptName := ""
  62. if EntDepts[deptId] != nil {
  63. deptName = EntDepts[deptId].Name
  64. }
  65. subSet, _ := temp["o_entniche"].(map[string]interface{})
  66. if subSet == nil || len(subSet) == 0 {
  67. logx.Info("订阅设置为空,过滤掉", entName, entId, deptName, deptId, userId)
  68. return
  69. }
  70. subSet["i_type"] = temp["i_type"]
  71. //
  72. if deptId > 0 { //部门订阅
  73. if EntDepts[deptId].Subdis == 0 {
  74. logx.Info("该部门的订阅分发没有开启,过滤掉", entName, entId, deptName, deptId)
  75. return
  76. } else if EntDepts[deptId].Nodiff == 0 && EntDeptDis[deptId] == nil {
  77. logx.Info("该部门开启了订阅分发,没有开启全员无差别接收,但是没有分发规则,过滤掉", entName, entId, deptName, deptId)
  78. return
  79. }
  80. //如果我的上级部门打开了订阅分发,并且开启了全员无差别接收,本部门规则无效
  81. for _, dept := range EntParentDept[deptId] {
  82. if EntDepts[dept.Pid].Subdis == 1 && EntDepts[dept.Pid].Nodiff == 1 {
  83. logx.Info("我的上级部门", dept.Pid, "开启了订阅分发和全员无差别,过滤掉", entName, entId, deptName, deptId)
  84. return
  85. }
  86. }
  87. } else if userId > 0 { //个人订阅
  88. if EntUsers[userId] == nil {
  89. logx.Info("没有找到该用户,过滤掉", entName, entId, userId)
  90. return
  91. }
  92. }
  93. user := &UserInfo{
  94. Entniche: &Entniche{
  95. EntId: entId,
  96. EntName: entName,
  97. DeptId: deptId,
  98. DeptName: deptName,
  99. UserId: userId,
  100. },
  101. SubSet: subSet,
  102. }
  103. logx.Info("加载订阅设置", "entId", entId, "entName", entName, "deptId", deptId, "deptName", deptName, "userId", userId)
  104. Users[user] = true
  105. //分发规则
  106. itemMap := map[string]interface{}{}
  107. items, _ := subSet["a_items"].([]interface{})
  108. for _, v := range items {
  109. item, _ := v.(map[string]interface{})
  110. if item == nil {
  111. continue
  112. }
  113. item_name, _ := item["s_item"].(string)
  114. if item_name == "" {
  115. continue
  116. }
  117. itemMap[item_name] = item
  118. }
  119. for _, dis := range EntDeptDis[deptId] {
  120. child_items := []interface{}{}
  121. for _, item_name := range dis.Items {
  122. if itemMap[item_name] == nil {
  123. continue
  124. }
  125. child_items = append(child_items, itemMap[item_name])
  126. }
  127. child_subSet := map[string]interface{}{}
  128. if len(dis.Buyerclass) > 0 {
  129. child_subSet["a_buyerclass"] = dis.Buyerclass
  130. }
  131. if len(dis.Area) > 0 {
  132. child_subSet["o_area"] = dis.Area
  133. }
  134. if len(child_items) > 0 {
  135. child_subSet["a_items"] = child_items
  136. }
  137. if len(child_subSet) == 0 {
  138. continue
  139. }
  140. child_user := &UserInfo{
  141. Entniche: &Entniche{
  142. EntId: user.Entniche.EntId,
  143. EntName: user.Entniche.EntName,
  144. DeptId: user.Entniche.DeptId,
  145. DeptName: user.Entniche.DeptName,
  146. DisId: dis.Id,
  147. },
  148. SubSet: child_subSet,
  149. }
  150. Users[child_user] = true
  151. }
  152. }(_temp)
  153. _temp = make(map[string]interface{})
  154. }
  155. return Users
  156. }
  157. func FinalSub(entUserId int, users map[*UserInfo]bool) map[string]interface{} {
  158. for k, _ := range users {
  159. if k.Entniche.DeptId > 0 {
  160. k.Entniche.DeptName = EntDepts[k.Entniche.DeptId].Name
  161. staffIds := GetDeptUserIds(&UserInfo{
  162. Entniche: &Entniche{
  163. EntId: k.Entniche.EntId,
  164. EntName: k.Entniche.EntName,
  165. DeptId: k.Entniche.DeptId,
  166. DeptName: k.Entniche.DeptName,
  167. DisId: k.Entniche.DisId,
  168. },
  169. })
  170. if staffIds == nil {
  171. continue
  172. }
  173. if staffIds[entUserId] {
  174. return k.SubSet
  175. }
  176. } else if k.Entniche.UserId > 0 {
  177. return k.SubSet
  178. } else {
  179. continue
  180. }
  181. }
  182. return nil
  183. }
  184. func GetDeptUserIds(ui *UserInfo) map[int]bool {
  185. if EntDepts[ui.Entniche.DeptId].Subdis == 0 {
  186. logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, "没有开启订阅分发,过滤掉")
  187. return nil
  188. } else if EntDepts[ui.Entniche.DeptId].Nodiff == 0 && ui.Entniche.DisId == "" {
  189. logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, "没有开启全员无差别接收,并且没有分发规则,过滤掉")
  190. return nil
  191. }
  192. //对我的对着生效的用户
  193. myIds := map[int]bool{}
  194. //打开了全员无差别,下面所有员工都生效
  195. if EntDepts[ui.Entniche.DeptId].Nodiff == 1 {
  196. for _, v := range EntDeptUsers[ui.Entniche.DeptId] {
  197. myIds[v.UserId] = true
  198. }
  199. for _, v := range EntChildDept[ui.Entniche.DeptId] {
  200. for _, vv := range EntDeptUsers[v.Id] {
  201. myIds[vv.UserId] = true
  202. }
  203. }
  204. logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, "该部门打开了全员无差别", len(myIds), "人接收")
  205. } else if ui.Entniche.DisId != "" {
  206. for _, v := range EntRuleUsers[ui.Entniche.DisId] {
  207. myIds[v.UserId] = true
  208. }
  209. logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, "该规则开启了订阅分发", ui.Entniche.DisId, "规则分发了", len(myIds), "人")
  210. }
  211. //我的上级部门,过滤掉本部门的人
  212. for _, v := range EntParentDept[ui.Entniche.DeptId] {
  213. //看我的上级部门,有没有开启订阅分发
  214. if EntDepts[v.Pid].Subdis == 0 {
  215. continue
  216. }
  217. //看我的上级部门,有没有全员无差别接收
  218. if EntDepts[v.Pid].Nodiff == 1 {
  219. logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, ui.Entniche.DisId, "上级部门", v.Pid, "打开了全员无差别开关,过滤掉")
  220. return nil
  221. }
  222. //看我的上级部门,有没有对我设置规则
  223. for _, vv := range EntDeptDis[v.Pid] {
  224. for _, vvv := range EntRuleUsers[vv.Id] {
  225. _, ok := myIds[vvv.UserId]
  226. if !ok {
  227. continue
  228. }
  229. delete(myIds, vvv.UserId)
  230. logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, "上级部门", v.Pid, "对我设置的有", vvv.RuleId, "分发规则,此规则作废", vvv.UserId)
  231. }
  232. }
  233. }
  234. logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, ui.Entniche.DisId, "该规则匹配到", len(myIds), "人")
  235. return myIds
  236. }