finish
This commit is contained in:
93
fund/fund.go
93
fund/fund.go
@@ -20,6 +20,7 @@ import (
|
||||
"github.com/jageros/hawox/logx"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"sync"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -28,17 +29,45 @@ const (
|
||||
|
||||
var (
|
||||
jsonStr = regexp.MustCompile(`{(.*?)}`)
|
||||
|
||||
fds = &funds{fdsMap: map[string]*fund{}}
|
||||
)
|
||||
|
||||
type fund struct {
|
||||
Code string `json:"fundcode"`
|
||||
Name string `json:"name"`
|
||||
FName string `json:"name"`
|
||||
UnitVal string `json:"dwjz"`
|
||||
EstimateVal string `json:"gsz"`
|
||||
RisePer string `json:"gszzl"`
|
||||
UpdateTime string `json:"gztime"`
|
||||
}
|
||||
|
||||
func (f *fund) Name() string {
|
||||
return f.FName
|
||||
}
|
||||
|
||||
func (f *fund) Update() error {
|
||||
url := fmt.Sprintf(baseUrl, f.Code)
|
||||
result, err := httpc.Request(httpc.GET, url, httpc.FORM, nil, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
ss := jsonStr.FindStringSubmatch(string(result))
|
||||
if len(ss) <= 0 {
|
||||
return errcode.New(404, "找不到基金:"+f.Code)
|
||||
}
|
||||
ff := &fund{}
|
||||
err = json.Unmarshal([]byte(ss[0]), ff)
|
||||
if err == nil {
|
||||
f.FName = ff.FName
|
||||
f.UnitVal = ff.UnitVal
|
||||
f.EstimateVal = ff.EstimateVal
|
||||
f.RisePer = ff.RisePer
|
||||
f.UpdateTime = ff.UpdateTime
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (f *fund) Msg() string {
|
||||
var rise string
|
||||
last, err1 := strconv.ParseFloat(f.UnitVal, 64)
|
||||
@@ -46,17 +75,35 @@ func (f *fund) Msg() string {
|
||||
if err1 == nil && err2 == nil {
|
||||
rise = fmt.Sprintf("%.5f", cur-last)
|
||||
}
|
||||
msg := fmt.Sprintf(msgTemplate, f.Name, f.UpdateTime, f.UnitVal, f.EstimateVal, rise, f.RisePer)
|
||||
msg := fmt.Sprintf(msgTemplate, f.FName, f.UpdateTime, f.UnitVal, f.EstimateVal, rise, f.RisePer)
|
||||
return msg
|
||||
}
|
||||
|
||||
type funds struct {
|
||||
codes []string
|
||||
fdsMap map[string]*fund
|
||||
mx sync.RWMutex
|
||||
}
|
||||
|
||||
func NewFunds(codes ...string) *funds {
|
||||
return &funds{
|
||||
codes: codes,
|
||||
func (fs *funds) getFund(code string) *fund {
|
||||
fs.mx.RLock()
|
||||
defer fs.mx.RUnlock()
|
||||
if fd, ok := fs.fdsMap[code]; ok {
|
||||
return fd
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (fs *funds) addFund(fd *fund) {
|
||||
fs.mx.Lock()
|
||||
defer fs.mx.Unlock()
|
||||
fs.fdsMap[fd.Code] = fd
|
||||
}
|
||||
|
||||
func Clear() {
|
||||
fds.mx.Lock()
|
||||
defer fds.mx.Unlock()
|
||||
fds = &funds{
|
||||
fdsMap: map[string]*fund{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,17 +114,23 @@ func FundsMsg(codes ...string) string {
|
||||
//var msg = "基金定投估值 >>>\n"
|
||||
msg := ""
|
||||
for _, code := range codes {
|
||||
fd, err := newFund(code)
|
||||
if err != nil {
|
||||
logx.Error(err)
|
||||
continue
|
||||
fd := fds.getFund(code)
|
||||
if fd == nil {
|
||||
fd_, err := NewFund(code)
|
||||
if err == nil {
|
||||
fd = fd_
|
||||
fds.addFund(fd_)
|
||||
} else {
|
||||
logx.Error(err)
|
||||
continue
|
||||
}
|
||||
}
|
||||
msg += fd.Msg()
|
||||
}
|
||||
return msg
|
||||
}
|
||||
|
||||
func newFund(code string) (*fund, error) {
|
||||
func NewFund(code string) (*fund, error) {
|
||||
url := fmt.Sprintf(baseUrl, code)
|
||||
result, err := httpc.Request(httpc.GET, url, httpc.FORM, nil, nil)
|
||||
if err != nil {
|
||||
@@ -99,13 +152,27 @@ const msgTemplate = `%s
|
||||
|
||||
`
|
||||
|
||||
func (fs *funds) Arg(openid string) map[string]interface{} {
|
||||
type fundArg struct {
|
||||
codes []string
|
||||
}
|
||||
|
||||
func NewFundArg(codes ...string) *fundArg {
|
||||
return &fundArg{
|
||||
codes: codes,
|
||||
}
|
||||
}
|
||||
|
||||
func (fa *fundArg) Arg(openid string) map[string]interface{} {
|
||||
msg := FundsMsg(fa.codes...)
|
||||
if msg == "" {
|
||||
return nil
|
||||
}
|
||||
arg := map[string]interface{}{
|
||||
"touser": openid,
|
||||
"template_id": "SQXWp3RiYySb2GYG-vMYDsSIm-KZNM9szVpFOryUQGQ",
|
||||
"data": map[string]interface{}{
|
||||
"keyword": map[string]interface{}{
|
||||
"value": FundsMsg(fs.codes...),
|
||||
"value": msg,
|
||||
"color": "#173177",
|
||||
},
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user