// Package area ----------------------------- // @file : areaBankInfo.go // @author : JJXu // @contact : wavingbear@163.com // @time : 2024/7/22 上午10:44 // ------------------------------------------- package area import ( "encoding/json" "fmt" "github.com/fonchain_enterprise/utils/bankQuery" "sync" "strings" ) const CacheAreaBankKey = "area_bank_info" var cacheLocker sync.Mutex type AreaBank struct { AreaInfo BankList []bankQuery.Bank Children []*AreaBank } type BankService struct { } func (a BankService) GetAreaBankListFromCache() (bankList []*AreaBank, err error) { bankList = []*AreaBank{} cacheLocker.Lock() cacheBytes, err := AreaRedis().Get(a.getCacheKey(0)).Bytes() cacheLocker.Unlock() if err != nil { if err.Error() == "redis: nil" { err = nil return } fmt.Println("从缓存获取银行数据失败", err) return } else if len(cacheBytes) > 0 { fmt.Println("cacheBytes", string(cacheBytes)) err = json.Unmarshal(cacheBytes, &bankList) if err != nil { fmt.Println("从缓存解析省市区数据失败", err) } } else { fmt.Println("缓存为空") } return } func (a BankService) getCacheKey(day int) string { //var now = time.Now() //var timeDate string //if day != 0 { // //最多只能查询前两天的缓存 // if day > 2 { // day = 2 // } // timeDate = now.AddDate(0, 0, day).Format(stime.Format_NoSpacer_YMD) //} else { // timeDate = now.Format(stime.Format_NoSpacer_YMD) //} //return fmt.Sprintf("%s:%s", CacheAreaBankKey, timeDate) return CacheAreaBankKey } func (a BankService) SetCache(areaBankList []*AreaBank) { cacheData, _ := json.Marshal(areaBankList) fmt.Println("缓存数据", string(cacheData)) cacheLocker.Lock() var err = AreaRedis().Set(a.getCacheKey(0), cacheData, 0).Err() cacheLocker.Unlock() if err != nil { fmt.Println("缓存失败", err) } } // bankName 总行名称 // LBankName 支行名称 func (a BankService) QueryBanInfoList(province, city, bankName, LBankName string) (data []bankQuery.Bank, err error) { if province == "" || city == "" { err = fmt.Errorf("省市不能为空") return } data = make([]bankQuery.Bank, 0) //从缓存中查询 var all []*AreaBank all, err = a.GetAreaBankListFromCache() if err != nil { return } for _, v := range all { if strings.Contains(v.Name, province) || strings.Contains(province, v.Name) { for _, vv := range v.Children { if strings.Contains(vv.Name, city) || strings.Contains(city, vv.Name) { //银行信息查询 for _, bank := range vv.BankList { bank := bank if bankName != "" && !strings.Contains(bank.Bank, bankName) && !strings.Contains(bankName, bank.Bank) { continue } if LBankName != "" && !strings.Contains(bank.LName, LBankName) && !strings.Contains(LBankName, bank.LName) { continue } data = append(data, bank) } } } } } if len(data) > 0 { return } fmt.Println("缓存中没有数据,开始抓取银行数据") // 总行名称需要与第三方接口匹配,转换为第三方接口的名称 if convertBankName, ok := mainBankNameConvertMap[bankName]; ok { bankName = convertBankName } data, err = new(BankInfoCrawler2).Request3(province, city, bankName, LBankName, "") if err != nil { return } //存入缓存 if len(data) > 0 { go func() { if len(all) == 0 { areaTree, _ := GetChinaAreaTree() all = make([]*AreaBank, 0) areaBytes, _ := json.Marshal(areaTree) json.Unmarshal(areaBytes, &all) } for i, v := range all { if strings.Contains(v.Name, province) || strings.Contains(province, v.Name) { fmt.Println("省份匹配", v.Name) for ii, vv := range v.Children { if strings.Contains(vv.Name, city) || strings.Contains(city, vv.Name) { fmt.Println("市匹配", vv.Name) all[i].Children[ii].BankList = append(all[i].Children[ii].BankList, data...) //all[i].Children[ii].BankList去重 break } } } } //fmt.Printf("all:%+v\n", all) a.SetCache(all) }() } return } func (a BankService) QueryMainBanInfoList() (data []string) { //var all []*AreaBank //all = a.GetAllAreaBank() //var mainBankMap = make(map[string]bool) //for _, v := range all { // for _, vv := range v.Children { // for _, bank := range vv.BankList { // mainBankMap[bank.Bank] = true // } // } //} //for k := range mainBankMap { // data = append(data, k) //} //return return mainBankList }