charge_rule.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. package util
  2. import (
  3. "go.mongodb.org/mongo-driver/bson/primitive"
  4. "qfw/util"
  5. "regexp"
  6. "sort"
  7. "strings"
  8. )
  9. // 审批数据判断字段,包含三个以上属于拟建
  10. //var spFields = []string{"approvecode", "owner", "projectaddr", "project_scale_info", "projectname"}
  11. // ChargeDetailResult 检测内容是否符合 toptype=结果
  12. func ChargeDetailResult(detail string) bool {
  13. if ChargeDetailZB(detail) || ChargeDetailCJ(detail) {
  14. return true
  15. }
  16. return false
  17. }
  18. // ChargeDetailCJ 检测内容是否符合 toptype=结果;subtype=成交
  19. func ChargeDetailCJ(detail string) bool {
  20. var reg = regexp.MustCompile("(成交单位|成交人|成交供应商)[::][\\s ]*(.{2,25}(公司))")
  21. //含有 投标截止时间 关键词,代表不是结果,需要排除
  22. var reg2 = regexp.MustCompile("(投标截止时间)")
  23. res1 := reg.MatchString(detail)
  24. res2 := reg2.MatchString(detail)
  25. //针对 中南民族大学采购综合管理服务平台 站点 表格数据,匹配成交单位
  26. pattern := `<tr>.*<td>.*(成交供应商|成交单位|成交人)<br/>.*</td>.*<td.*>*(.{2,25}(公司))<br/>.*</td>.*</tr>`
  27. re := regexp.MustCompile(pattern)
  28. match := re.MatchString(detail)
  29. if !res2 && res1 || !res2 && match {
  30. return true
  31. }
  32. return false
  33. }
  34. // ChargeDetailZB 检测内容是否符合 toptype=结果;subtype=中标
  35. func ChargeDetailZB(detail string) bool {
  36. var reg = regexp.MustCompile("(中标人单位名称|中标供应商|中标供应商名称|中标人名称|中签单位名称|中签单位|中标商家)[::][\\s ]*(.{2,25}(公司|单位|局|厅))")
  37. var reg2 = regexp.MustCompile("(投标截止时间)")
  38. res1 := reg.MatchString(detail)
  39. res2 := reg2.MatchString(detail)
  40. if res1 && !res2 {
  41. return true
  42. }
  43. return false
  44. }
  45. // GetJyKey 免费订阅:o_jy.a_key.key/appendkey
  46. func GetJyKey(data map[string]interface{}) (res []interface{}) {
  47. // 获取o_jy.a_key.key的值
  48. if ojy, ok := data["o_jy"].(map[string]interface{}); ok {
  49. if akey, ok := ojy["a_key"].(primitive.A); ok {
  50. for _, v := range akey {
  51. if m, ok := v.(map[string]interface{}); ok {
  52. if key, ok := m["key"].(primitive.A); ok {
  53. res = append(res, key...)
  54. }
  55. if key, ok := m["appendkey"].(primitive.A); ok {
  56. res = append(res, key...)
  57. }
  58. }
  59. }
  60. }
  61. }
  62. return
  63. }
  64. // GetVipKey 超级订阅:o_vipjy.a_items.a_key.key/appendkey
  65. func GetVipKey(data map[string]interface{}) (res []interface{}) {
  66. //o_vipjy.a_items.a_key.key
  67. if o_vipjy, ok := data["o_vipjy"].(map[string]interface{}); ok {
  68. if aItems, ok := o_vipjy["a_items"].(primitive.A); ok {
  69. for _, aItem := range aItems {
  70. if a_k, ok := aItem.(map[string]interface{}); ok {
  71. if aKey, ok := a_k["a_key"].(primitive.A); ok {
  72. for _, ak := range aKey {
  73. if va, ok := ak.(map[string]interface{}); ok {
  74. if key, ok := va["key"].(primitive.A); ok {
  75. res = append(res, key...)
  76. }
  77. if key, ok := va["appendkey"].(primitive.A); ok {
  78. res = append(res, key...)
  79. }
  80. }
  81. }
  82. }
  83. }
  84. }
  85. }
  86. }
  87. return
  88. }
  89. // GetMemberKey 大会员订阅:o_member_jy.a_items.a_key.key/appendkey
  90. func GetMemberKey(data map[string]interface{}) (res []interface{}) {
  91. //o_member_jy.a_items.a_key.key
  92. if o_member_jy, ok := data["o_member_jy"].(map[string]interface{}); ok {
  93. if aItems, ok := o_member_jy["a_items"].(primitive.A); ok {
  94. for _, aItem := range aItems {
  95. if tem, ok := aItem.(map[string]interface{}); ok {
  96. if aKey, ok := tem["a_key"].(primitive.A); ok {
  97. for _, ak := range aKey {
  98. if va, ok := ak.(map[string]interface{}); ok {
  99. if key, ok := va["key"].(primitive.A); ok {
  100. res = append(res, key...)
  101. }
  102. if key, ok := va["appendkey"].(primitive.A); ok {
  103. res = append(res, key...)
  104. }
  105. }
  106. }
  107. }
  108. }
  109. }
  110. }
  111. }
  112. return
  113. }
  114. // RemoveDuplicates 过滤重复数据
  115. func RemoveDuplicates(elements []interface{}) []interface{} {
  116. encountered := map[interface{}]bool{}
  117. result := []interface{}{}
  118. for _, v := range elements {
  119. if encountered[v] == true {
  120. continue
  121. } else {
  122. encountered[v] = true
  123. result = append(result, v)
  124. }
  125. }
  126. return result
  127. }
  128. // GetUserKeys 获取用户订阅关键词
  129. func GetUserKeys(data map[string]interface{}) (res []interface{}) {
  130. keys := GetJyKey(data)
  131. vkeys := GetVipKey(data)
  132. mkeys := GetMemberKey(data)
  133. res = append(res, keys...)
  134. res = append(res, vkeys...)
  135. res = append(res, mkeys...)
  136. res = RemoveDuplicates(res)
  137. return
  138. }
  139. // RemoveDuplicateString 去除重复字符串
  140. func RemoveDuplicateString(arr []string) []string {
  141. encountered := map[string]bool{}
  142. result := []string{}
  143. for _, v := range arr {
  144. if encountered[v] == true {
  145. // Do not add duplicate.
  146. } else {
  147. // Append value to result slice.
  148. result = append(result, v)
  149. // Record this element as an encountered element.
  150. encountered[v] = true
  151. }
  152. }
  153. // Return the new slice.
  154. return result
  155. }
  156. // DealYuce 处理一级是预告,符合条件到采购意向
  157. func DealYuce(data string) bool {
  158. //标题含有招标计划,并且含有 预公告或者预公示,分类划分到采购意向
  159. re1 := strings.Contains(data, "招标计划")
  160. re2 := strings.Contains(data, "预公告")
  161. re3 := strings.Contains(data, "预公示")
  162. if re1 && (re2 || re3) {
  163. return true
  164. }
  165. return false
  166. }
  167. // IsPurchasingIntent 采购意向判断处理,符合采购意向返回true
  168. func IsPurchasingIntent(data map[string]interface{}) bool {
  169. if channel, ok := data["channel"]; ok && util.ObjToString(channel) != "" {
  170. if strings.Contains(channel.(string), "项目登记") {
  171. return true
  172. }
  173. }
  174. if title, ok := data["title"]; ok && util.ObjToString(title) != "" {
  175. if strings.HasPrefix(title.(string), "【项目登记】") {
  176. return true
  177. }
  178. if strings.HasSuffix(title.(string), "项目登记") {
  179. return true
  180. }
  181. }
  182. return false
  183. }
  184. // ProcessTopscopeclass 处理行业分类
  185. func ProcessTopscopeclass(tops, subs []string) ([]string, []string) {
  186. // 去除 tops 中每个元素末尾的不固定字符
  187. cleanedTops := make([]string, 0)
  188. for _, top := range tops {
  189. parts := strings.Split(top, "")
  190. cleanedTop := strings.Join(parts[:len(parts)-1], "")
  191. if !IsInStringArray(cleanedTop, cleanedTops) {
  192. cleanedTops = append(cleanedTops, cleanedTop)
  193. }
  194. }
  195. // 用于标记 cleanedTops 中已存在于 subs 的元素
  196. presentMap := make(map[string]bool)
  197. // 遍历 subs 数组,标记已存在的 cleanedTops 元素
  198. for _, sub := range subs {
  199. for _, top := range cleanedTops {
  200. if strings.Contains(sub, top) {
  201. presentMap[top] = true
  202. }
  203. }
  204. }
  205. // 补充缺失的 cleanedTops 元素到 subs 中
  206. for _, top := range cleanedTops {
  207. if !presentMap[top] {
  208. subs = append(subs, top+"_其它")
  209. }
  210. }
  211. return tops, subs
  212. }
  213. // IsInStringArray 判断数组中是否存在字符串
  214. func IsInStringArray(str string, arr []string) bool {
  215. // 先对字符串数组进行排序
  216. sort.Strings(arr)
  217. // 使用二分查找算法查找字符串
  218. pos := sort.SearchStrings(arr, str)
  219. // 如果找到了则返回 true,否则返回 false
  220. return pos < len(arr) && arr[pos] == str
  221. }