Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["mobile_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-wall/conf:go_default_library",
"//app/interface/main/app-wall/model/mobile:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"cache.go",
"mobile.go",
],
importpath = "go-common/app/interface/main/app-wall/dao/mobile",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-wall/conf:go_default_library",
"//app/interface/main/app-wall/model/mobile:go_default_library",
"//library/cache/memcache:go_default_library",
"//library/database/sql:go_default_library",
"//library/log:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,133 @@
package mobile
import (
"context"
"fmt"
"go-common/app/interface/main/app-wall/model/mobile"
"go-common/library/cache/memcache"
"go-common/library/log"
)
const (
_prefix = "mobiles_user_%v"
)
func keyMobile(usermob string) string {
return fmt.Sprintf(_prefix, usermob)
}
// AddMobileCache
func (d *Dao) AddMobileCache(c context.Context, usermob string, m []*mobile.Mobile) (err error) {
var (
key = keyMobile(usermob)
conn = d.mc.Get(c)
)
if err = conn.Set(&memcache.Item{Key: key, Object: m, Flags: memcache.FlagJSON, Expiration: d.expire}); err != nil {
log.Error("addMobileCache d.mc.Set(%s,%v) error(%v)", key, m, err)
}
conn.Close()
return
}
// MobileCache
func (d *Dao) MobileCache(c context.Context, usermob string) (m []*mobile.Mobile, err error) {
var (
key = keyMobile(usermob)
conn = d.mc.Get(c)
r *memcache.Item
)
defer conn.Close()
if r, err = conn.Get(key); err != nil {
if err == memcache.ErrNotFound {
err = nil
return
}
log.Error("mobileCache MemchDB.Get(%s) error(%v)", key, err)
return
}
if err = conn.Scan(r, &m); err != nil {
log.Error("r.Scan(%s) error(%v)", r.Value, err)
}
return
}
// DeleteMobileCache
func (d *Dao) DeleteMobileCache(c context.Context, usermob string) (err error) {
var (
key = keyMobile(usermob)
conn = d.mc.Get(c)
)
defer conn.Close()
if err = conn.Delete(key); err != nil {
if err == memcache.ErrNotFound {
err = nil
return
}
log.Error("mobileCache MemchDB.Delete(%s) error(%v)", key, err)
return
}
return
}
// UpdateMobileCache
func (d *Dao) UpdateMobileCache(c context.Context, usermob string, m *mobile.Mobile) (err error) {
var (
ms []*mobile.Mobile
mobiles []*mobile.Mobile
uproductid = map[string]struct{}{}
)
if ms, err = d.MobileCache(c, usermob); err != nil && len(ms) > 0 {
log.Error("d.MobileCache error(%v)", err)
return
}
if len(ms) > 0 {
for _, ml := range ms {
tmp := &mobile.Mobile{}
*tmp = *ml
if tmp.Productid == m.Productid {
tmp = m
if m.Threshold == 0 {
tmp.Threshold = ml.Threshold
}
uproductid[m.Productid] = struct{}{}
}
mobiles = append(mobiles, tmp)
}
if _, ok := uproductid[m.Productid]; !ok {
mobiles = append(mobiles, m)
}
if err = d.AddMobileCache(c, usermob, mobiles); err != nil {
log.Error("d.AddMobileCache error(%v)", err)
return
}
}
return
}
// UpdateMobileFlowCache
func (d *Dao) UpdateMobileFlowCache(c context.Context, usermob string, m *mobile.Mobile) (err error) {
var (
ms []*mobile.Mobile
mobiles []*mobile.Mobile
)
if ms, err = d.MobileCache(c, usermob); err != nil && len(ms) > 0 {
log.Error("d.MobileCache error(%v)", err)
return
}
if len(ms) > 0 {
for _, ml := range ms {
tmp := &mobile.Mobile{}
*tmp = *ml
if tmp.Productid == m.Productid {
tmp.Threshold = m.Threshold
}
mobiles = append(mobiles, tmp)
}
if err = d.AddMobileCache(c, usermob, mobiles); err != nil {
log.Error("d.AddMobileCache error(%v)", err)
return
}
}
return
}

View File

@@ -0,0 +1,102 @@
package mobile
import (
"context"
"strconv"
"time"
"go-common/app/interface/main/app-wall/conf"
"go-common/app/interface/main/app-wall/model/mobile"
"go-common/library/cache/memcache"
xsql "go-common/library/database/sql"
"go-common/library/log"
)
const (
_inOrderSyncSQL = `INSERT IGNORE INTO mobile_order (orderid,userpseudocode,channelseqid,price,actiontime,actionid,effectivetime,expiretime,channelid,productid,ordertype,threshold)
VALUES(?,?,?,?,?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE orderid=?,channelseqid=?,price=?,actiontime=?,actionid=?,effectivetime=?,expiretime=?,channelid=?,productid=?,ordertype=?,threshold=?`
_upOrderFlowSQL = `UPDATE mobile_order SET threshold=?,resulttime=? WHERE userpseudocode=? AND productid=?`
_orderSyncByUserSQL = `SELECT orderid,userpseudocode,channelseqid,price,actionid,effectivetime,expiretime,channelid,productid,ordertype,threshold FROM mobile_order WHERE effectivetime<? AND userpseudocode=?`
)
type Dao struct {
db *xsql.DB
inOrderSyncSQL *xsql.Stmt
upOrderFlowSQL *xsql.Stmt
orderUserSyncSQL *xsql.Stmt
// memcache
mc *memcache.Pool
expire int32
}
func New(c *conf.Config) (d *Dao) {
d = &Dao{
db: xsql.NewMySQL(c.MySQL.Show),
// memcache
mc: memcache.NewPool(c.Memcache.Operator.Config),
expire: int32(time.Duration(c.Memcache.Operator.Expire) / time.Second),
}
d.inOrderSyncSQL = d.db.Prepared(_inOrderSyncSQL)
d.upOrderFlowSQL = d.db.Prepared(_upOrderFlowSQL)
d.orderUserSyncSQL = d.db.Prepared(_orderSyncByUserSQL)
return
}
func (d *Dao) InOrdersSync(ctx context.Context, u *mobile.MobileXML) (row int64, err error) {
res, err := d.inOrderSyncSQL.Exec(ctx, u.Orderid, u.Userpseudocode, u.Channelseqid, u.Price, u.Actiontime, u.Actionid, u.Effectivetime, u.Expiretime,
u.Channelid, u.Productid, u.Ordertype, u.Threshold,
u.Orderid, u.Channelseqid, u.Price, u.Actiontime, u.Actionid, u.Effectivetime, u.Expiretime,
u.Channelid, u.Productid, u.Ordertype, u.Threshold)
if err != nil {
log.Error("d.inOrderSyncSQL.Exec error(%v)", err)
return
}
tmp := &mobile.Mobile{}
tmp.MobileXMLMobile(u)
if err = d.UpdateMobileCache(ctx, u.Userpseudocode, tmp); err != nil {
log.Error("mobile d.UpdateMobileCache usermob(%v) error(%v)", u.Userpseudocode, err)
return
}
return res.RowsAffected()
}
// FlowSync update OrdersSync
func (d *Dao) FlowSync(ctx context.Context, u *mobile.MobileXML) (row int64, err error) {
res, err := d.upOrderFlowSQL.Exec(ctx, u.Threshold, u.Resulttime, u.Userpseudocode, u.Productid)
if err != nil {
log.Error("d.upOrderFlowSQL.Exec error(%v)", err)
return
}
thresholdInt, _ := strconv.Atoi(u.Threshold)
tmp := &mobile.Mobile{
Threshold: thresholdInt,
Productid: u.Productid,
}
if err = d.UpdateMobileFlowCache(ctx, u.Userpseudocode, tmp); err != nil {
log.Error("mobile d.UpdateMobileFlowCache usermob(%v) error(%v)", u.Userpseudocode, err)
return
}
return res.RowsAffected()
}
// OrdersUserFlow select user OrdersSync
func (d *Dao) OrdersUserFlow(ctx context.Context, usermob string, now time.Time) (res map[string][]*mobile.Mobile, err error) {
rows, err := d.orderUserSyncSQL.Query(ctx, now, usermob)
if err != nil {
log.Error("query error (%v)", err)
return
}
defer rows.Close()
res = map[string][]*mobile.Mobile{}
for rows.Next() {
u := &mobile.Mobile{}
if err = rows.Scan(&u.Orderid, &u.Userpseudocode, &u.Channelseqid, &u.Price, &u.Actionid, &u.Effectivetime, &u.Expiretime,
&u.Channelid, &u.Productid, &u.Ordertype, &u.Threshold); err != nil {
log.Error("Mobile OrdersUserFlow rows.Scan err (%v)", err)
return
}
u.MobileChange()
res[u.Userpseudocode] = append(res[u.Userpseudocode], u)
}
return
}

View File

@@ -0,0 +1,62 @@
package mobile
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-wall/conf"
"go-common/app/interface/main/app-wall/model/mobile"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-wall-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestInOrdersSync(t *testing.T) {
Convey("unicom InOrdersSync", t, func() {
res, err := d.InOrdersSync(ctx(), &mobile.MobileXML{})
So(err, ShouldBeNil)
So(res, ShouldNotBeEmpty)
})
}
func TestFlowSync(t *testing.T) {
Convey("unicom FlowSync", t, func() {
res, err := d.FlowSync(ctx(), &mobile.MobileXML{})
So(err, ShouldBeNil)
So(res, ShouldNotBeEmpty)
})
}
func TestOrdersUserFlow(t *testing.T) {
Convey("unicom OrdersUserFlow", t, func() {
res, err := d.OrdersUserFlow(ctx(), "", time.Now())
So(err, ShouldBeNil)
So(res, ShouldNotBeEmpty)
})
}
func TestMobileCache(t *testing.T) {
Convey("unicom MobileCache", t, func() {
res, err := d.MobileCache(ctx(), "")
So(err, ShouldBeNil)
So(res, ShouldNotBeEmpty)
})
}