github.com/chanxuehong/wechat@v0.0.0-20230222024006-36f0325263cd/mp/poi/list.go (about) 1 package poi 2 3 import ( 4 "fmt" 5 6 "github.com/chanxuehong/wechat/mp/core" 7 ) 8 9 type ListResult struct { 10 TotalCount int `json:"total_count"` // 门店总数量 11 ItemCount int `json:"item_count"` // 本次调用获取的门店数量 12 List []Poi `json:"business_list"` // 本次调用获取的门店列表 13 } 14 15 // List 查询门店列表. 16 // 17 // begin: 开始位置,0 即为从第一条开始查询 18 // limit: 返回数据条数,最大允许50,默认为20 19 func List(clt *core.Client, begin, limit int) (rslt *ListResult, err error) { 20 const incompleteURL = "https://api.weixin.qq.com/cgi-bin/poi/getpoilist?access_token=" 21 22 if begin < 0 { 23 err = fmt.Errorf("invalid begin: %d", begin) 24 return 25 } 26 if limit <= 0 { 27 err = fmt.Errorf("invalid limit: %d", limit) 28 return 29 } 30 31 var request = struct { 32 Begin int `json:"begin"` 33 Limit int `json:"limit"` 34 }{ 35 Begin: begin, 36 Limit: limit, 37 } 38 var result struct { 39 core.Error 40 ListResult 41 } 42 if err = clt.PostJSON(incompleteURL, &request, &result); err != nil { 43 return 44 } 45 if result.ErrCode != core.ErrCodeOK { 46 err = &result.Error 47 return 48 } 49 result.ListResult.ItemCount = len(result.ListResult.List) 50 rslt = &result.ListResult 51 return 52 } 53 54 // ===================================================================================================================== 55 56 // PoiIterator 57 // 58 // iter, err := NewPoiIterator(clt, 0, 10) 59 // if err != nil { 60 // // TODO: 增加你的代码 61 // } 62 // 63 // for iter.HasNext() { 64 // items, err := iter.NextPage() 65 // if err != nil { 66 // // TODO: 增加你的代码 67 // } 68 // // TODO: 增加你的代码 69 // } 70 type PoiIterator struct { 71 clt *core.Client 72 73 nextOffset int 74 count int 75 76 lastListResult *ListResult 77 nextPageCalled bool 78 } 79 80 func (iter *PoiIterator) TotalCount() int { 81 return iter.lastListResult.TotalCount 82 } 83 84 func (iter *PoiIterator) HasNext() bool { 85 if !iter.nextPageCalled { 86 return iter.lastListResult.ItemCount > 0 || iter.nextOffset < iter.lastListResult.TotalCount 87 } 88 return iter.nextOffset < iter.lastListResult.TotalCount 89 } 90 91 func (iter *PoiIterator) NextPage() (list []Poi, err error) { 92 if !iter.nextPageCalled { 93 iter.nextPageCalled = true 94 list = iter.lastListResult.List 95 return 96 } 97 98 rslt, err := List(iter.clt, iter.nextOffset, iter.count) 99 if err != nil { 100 return 101 } 102 103 iter.lastListResult = rslt 104 iter.nextOffset += rslt.ItemCount 105 106 list = rslt.List 107 return 108 } 109 110 func NewPoiIterator(clt *core.Client, begin, limit int) (iter *PoiIterator, err error) { 111 // 逻辑上相当于第一次调用 PoiIterator.NextPage, 112 // 因为第一次调用 PoiIterator.HasNext 需要数据支撑, 所以提前获取了数据 113 rslt, err := List(clt, begin, limit) 114 if err != nil { 115 return 116 } 117 118 iter = &PoiIterator{ 119 clt: clt, 120 121 nextOffset: begin + rslt.ItemCount, 122 count: limit, 123 124 lastListResult: rslt, 125 nextPageCalled: false, 126 } 127 return 128 }