package util import ( "go.mongodb.org/mongo-driver/bson/primitive" "qfw/util" "regexp" "sort" "strings" ) // 审批数据判断字段,包含三个以上属于拟建 //var spFields = []string{"approvecode", "owner", "projectaddr", "project_scale_info", "projectname"} // ChargeDetailResult 检测内容是否符合 toptype=结果 func ChargeDetailResult(detail string) bool { if ChargeDetailZB(detail) || ChargeDetailCJ(detail) { return true } return false } // ChargeDetailCJ 检测内容是否符合 toptype=结果;subtype=成交 func ChargeDetailCJ(detail string) bool { var reg = regexp.MustCompile("(成交单位|成交人|成交供应商)[::][\\s ]*(.{2,25}(公司))") //含有 投标截止时间 关键词,代表不是结果,需要排除 var reg2 = regexp.MustCompile("(投标截止时间)") res1 := reg.MatchString(detail) res2 := reg2.MatchString(detail) //针对 中南民族大学采购综合管理服务平台 站点 表格数据,匹配成交单位 pattern := `.*.*(成交供应商|成交单位|成交人)
.*.**(.{2,25}(公司))
.*.*` re := regexp.MustCompile(pattern) match := re.MatchString(detail) if !res2 && res1 || !res2 && match { return true } return false } // ChargeDetailZB 检测内容是否符合 toptype=结果;subtype=中标 func ChargeDetailZB(detail string) bool { var reg = regexp.MustCompile("(中标人单位名称|中标供应商|中标供应商名称|中标人名称|中签单位名称|中签单位|中标商家)[::][\\s ]*(.{2,25}(公司|单位|局|厅))") var reg2 = regexp.MustCompile("(投标截止时间)") res1 := reg.MatchString(detail) res2 := reg2.MatchString(detail) if res1 && !res2 { return true } return false } // GetJyKey 免费订阅:o_jy.a_key.key/appendkey func GetJyKey(data map[string]interface{}) (res []interface{}) { // 获取o_jy.a_key.key的值 if ojy, ok := data["o_jy"].(map[string]interface{}); ok { if akey, ok := ojy["a_key"].(primitive.A); ok { for _, v := range akey { if m, ok := v.(map[string]interface{}); ok { if key, ok := m["key"].(primitive.A); ok { res = append(res, key...) } if key, ok := m["appendkey"].(primitive.A); ok { res = append(res, key...) } } } } } return } // GetVipKey 超级订阅:o_vipjy.a_items.a_key.key/appendkey func GetVipKey(data map[string]interface{}) (res []interface{}) { //o_vipjy.a_items.a_key.key if o_vipjy, ok := data["o_vipjy"].(map[string]interface{}); ok { if aItems, ok := o_vipjy["a_items"].(primitive.A); ok { for _, aItem := range aItems { if a_k, ok := aItem.(map[string]interface{}); ok { if aKey, ok := a_k["a_key"].(primitive.A); ok { for _, ak := range aKey { if va, ok := ak.(map[string]interface{}); ok { if key, ok := va["key"].(primitive.A); ok { res = append(res, key...) } if key, ok := va["appendkey"].(primitive.A); ok { res = append(res, key...) } } } } } } } } return } // GetMemberKey 大会员订阅:o_member_jy.a_items.a_key.key/appendkey func GetMemberKey(data map[string]interface{}) (res []interface{}) { //o_member_jy.a_items.a_key.key if o_member_jy, ok := data["o_member_jy"].(map[string]interface{}); ok { if aItems, ok := o_member_jy["a_items"].(primitive.A); ok { for _, aItem := range aItems { if tem, ok := aItem.(map[string]interface{}); ok { if aKey, ok := tem["a_key"].(primitive.A); ok { for _, ak := range aKey { if va, ok := ak.(map[string]interface{}); ok { if key, ok := va["key"].(primitive.A); ok { res = append(res, key...) } if key, ok := va["appendkey"].(primitive.A); ok { res = append(res, key...) } } } } } } } } return } // RemoveDuplicates 过滤重复数据 func RemoveDuplicates(elements []interface{}) []interface{} { encountered := map[interface{}]bool{} result := []interface{}{} for _, v := range elements { if encountered[v] == true { continue } else { encountered[v] = true result = append(result, v) } } return result } // GetUserKeys 获取用户订阅关键词 func GetUserKeys(data map[string]interface{}) (res []interface{}) { keys := GetJyKey(data) vkeys := GetVipKey(data) mkeys := GetMemberKey(data) res = append(res, keys...) res = append(res, vkeys...) res = append(res, mkeys...) res = RemoveDuplicates(res) return } // RemoveDuplicateString 去除重复字符串 func RemoveDuplicateString(arr []string) []string { encountered := map[string]bool{} result := []string{} for _, v := range arr { if encountered[v] == true { // Do not add duplicate. } else { // Append value to result slice. result = append(result, v) // Record this element as an encountered element. encountered[v] = true } } // Return the new slice. return result } // DealYuce 处理一级是预告,符合条件到采购意向 func DealYuce(data string) bool { //标题含有招标计划,并且含有 预公告或者预公示,分类划分到采购意向 re1 := strings.Contains(data, "招标计划") re2 := strings.Contains(data, "预公告") re3 := strings.Contains(data, "预公示") if re1 && (re2 || re3) { return true } return false } // IsPurchasingIntent 采购意向判断处理,符合采购意向返回true func IsPurchasingIntent(data map[string]interface{}) bool { if channel, ok := data["channel"]; ok && util.ObjToString(channel) != "" { if strings.Contains(channel.(string), "项目登记") { return true } } if title, ok := data["title"]; ok && util.ObjToString(title) != "" { if strings.HasPrefix(title.(string), "【项目登记】") { return true } if strings.HasSuffix(title.(string), "项目登记") { return true } } return false } // ProcessTopscopeclass 处理行业分类 func ProcessTopscopeclass(tops, subs []string) ([]string, []string) { // 去除 tops 中每个元素末尾的不固定字符 cleanedTops := make([]string, 0) for _, top := range tops { parts := strings.Split(top, "") cleanedTop := strings.Join(parts[:len(parts)-1], "") if !IsInStringArray(cleanedTop, cleanedTops) { cleanedTops = append(cleanedTops, cleanedTop) } } // 用于标记 cleanedTops 中已存在于 subs 的元素 presentMap := make(map[string]bool) // 遍历 subs 数组,标记已存在的 cleanedTops 元素 for _, sub := range subs { for _, top := range cleanedTops { if strings.Contains(sub, top) { presentMap[top] = true } } } // 补充缺失的 cleanedTops 元素到 subs 中 for _, top := range cleanedTops { if !presentMap[top] { subs = append(subs, top+"_其它") } } return tops, subs } // IsInStringArray 判断数组中是否存在字符串 func IsInStringArray(str string, arr []string) bool { // 先对字符串数组进行排序 sort.Strings(arr) // 使用二分查找算法查找字符串 pos := sort.SearchStrings(arr, str) // 如果找到了则返回 true,否则返回 false return pos < len(arr) && arr[pos] == str }