This commit is contained in:
parent
bedf3229b4
commit
c1d9c77312
@ -1,105 +0,0 @@
|
|||||||
package database
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"gorm.io/gorm"
|
|
||||||
"math"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
defaultExchangeRate float64 = 7.3
|
|
||||||
defaultFreight float64 = 100
|
|
||||||
)
|
|
||||||
|
|
||||||
type Product struct {
|
|
||||||
ID uint `gorm:"primary_key" json:"id"`
|
|
||||||
CreatedAt time.Time `json:"createdAt"`
|
|
||||||
UpdatedAt time.Time `json:"updatedAt"`
|
|
||||||
DeletedAt gorm.DeletedAt `gorm:"index"`
|
|
||||||
|
|
||||||
Name string `gorm:"index" json:"name"`
|
|
||||||
Pid string `gorm:"unique;not null" json:"pid"`
|
|
||||||
Color string `json:"color"`
|
|
||||||
Link string `json:"link"`
|
|
||||||
Image string `json:"image"`
|
|
||||||
Orderable bool `json:"orderable"`
|
|
||||||
|
|
||||||
USPrice float64 `json:"usPrice"`
|
|
||||||
CNYPrice float64 `json:"cnyPrice"`
|
|
||||||
CalMark string `json:"calMark"` //计算价格的过程
|
|
||||||
DWPrice float64 `json:"dwPrice"`
|
|
||||||
Freight float64 `json:"freight"` //运费
|
|
||||||
ExchangeRate float64 `json:"exchangeRate" gorm:"-"` //汇率
|
|
||||||
Rate float64 `json:"rate"` //利润率
|
|
||||||
Remark string `json:"remark"` //备注
|
|
||||||
HistoryPrices []HistoryPrice `gorm:"foreignKey:Pid;references:Pid" json:"historyPrices"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Product) TableName() string {
|
|
||||||
return "products"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Product) BeforeSave(tx *gorm.DB) (err error) {
|
|
||||||
tx.Model(&Product{}).Where("pid = ?", p.Pid).Pluck("freight", &p.Freight)
|
|
||||||
p.CalRate()
|
|
||||||
var lastPrice float64
|
|
||||||
tx.Model(&HistoryPrice{}).Where("pid = ?", p.Pid).Order("created_at desc").Limit(1).Pluck("us_price", &lastPrice)
|
|
||||||
if p.USPrice != lastPrice {
|
|
||||||
p.HistoryPrices = append(p.HistoryPrices, HistoryPrice{
|
|
||||||
USPrice: p.USPrice,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Product) CalRate() {
|
|
||||||
calculationProcess := make([]string, 0, 2) //存放计算过程
|
|
||||||
if p.ExchangeRate == 0 {
|
|
||||||
p.ExchangeRate = defaultExchangeRate
|
|
||||||
}
|
|
||||||
if p.Freight == 0 {
|
|
||||||
p.Freight = defaultFreight
|
|
||||||
}
|
|
||||||
|
|
||||||
//先计算打九折的价格
|
|
||||||
tmpPrice := p.USPrice * 0.9 // 这是打九折的价格
|
|
||||||
p.CNYPrice = tmpPrice*p.ExchangeRate + p.Freight
|
|
||||||
calculationProcess = append(calculationProcess, fmt.Sprintf("【九折】%.2f * 0.9 * %.2f + %.2f = %.2f", p.USPrice, p.ExchangeRate, p.Freight, p.CNYPrice))
|
|
||||||
if p.USPrice >= 150 {
|
|
||||||
calculationProcess = append(calculationProcess, fmt.Sprintf("【150 -20 】(%.2f - 20) * %.2f + %.2f = %.2f", p.USPrice, p.ExchangeRate, p.Freight, (p.USPrice-20)*p.ExchangeRate+p.Freight))
|
|
||||||
if p.USPrice-20 < tmpPrice {
|
|
||||||
// 符合满150-20,而且比九折便宜
|
|
||||||
tmpPrice = p.USPrice - 20
|
|
||||||
p.CNYPrice = tmpPrice*p.ExchangeRate + p.Freight
|
|
||||||
}
|
|
||||||
} else if p.USPrice >= 100 {
|
|
||||||
calculationProcess = append(calculationProcess, fmt.Sprintf("【100 -10 】(%.2f - 10) * %.2f + %.2f = %.2f", p.USPrice, p.ExchangeRate, p.Freight, (p.USPrice-10)*p.ExchangeRate+p.Freight))
|
|
||||||
if p.USPrice-10 < tmpPrice {
|
|
||||||
// 符合满100 -10,而且比九折便宜
|
|
||||||
tmpPrice = p.USPrice - 10
|
|
||||||
p.CNYPrice = tmpPrice*p.ExchangeRate + p.Freight
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p.CalMark = strings.Join(calculationProcess, "\n")
|
|
||||||
if p.DWPrice > 0 {
|
|
||||||
// 如果有得物价格,就计算收益率
|
|
||||||
p.Rate = Decimal((p.DWPrice - p.CNYPrice) / p.CNYPrice * 100)
|
|
||||||
}
|
|
||||||
|
|
||||||
p.CNYPrice = Decimal(p.CNYPrice)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decimal 保留两位小数
|
|
||||||
func Decimal(value float64) float64 {
|
|
||||||
return math.Trunc(value*1e2+0.5) * 1e-2
|
|
||||||
}
|
|
||||||
|
|
||||||
type HistoryPrice struct {
|
|
||||||
ID uint `gorm:"primary_key" json:"id"`
|
|
||||||
CreatedAt time.Time `json:"createdAt"`
|
|
||||||
|
|
||||||
Pid string `gorm:"index" json:"pid"`
|
|
||||||
USPrice float64 `json:"usPrice"`
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
package database
|
|
||||||
|
|
||||||
import (
|
|
||||||
"gitea.timerzz.com/kedaya_haitao/common/pkg/database"
|
|
||||||
"gorm.io/gorm/clause"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestUpsert(t *testing.T) {
|
|
||||||
db, err := database.InitDatabase(&database.DBOption{
|
|
||||||
Host: "192.168.31.55",
|
|
||||||
User: "timerzz",
|
|
||||||
Password: "zhhg1997",
|
|
||||||
Port: "5432",
|
|
||||||
DBName: "kedaya",
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
err = db.AutoMigrate(&Product{}, &HistoryPrice{})
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
db.Clauses(clause.OnConflict{
|
|
||||||
Columns: []clause.Column{{Name: "pid"}},
|
|
||||||
DoUpdates: clause.AssignmentColumns([]string{"name", "color", "link", "orderable", "us_price", "cny_price", "cal_mark", "freight", "rate"}),
|
|
||||||
}).Create([]Product{
|
|
||||||
{
|
|
||||||
Name: "test",
|
|
||||||
Pid: "test-1",
|
|
||||||
Color: "green",
|
|
||||||
Link: "www.baidu.com",
|
|
||||||
Image: "image",
|
|
||||||
Orderable: false,
|
|
||||||
USPrice: 123,
|
|
||||||
DWPrice: 3000,
|
|
||||||
Freight: 120,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Name: "test2",
|
|
||||||
Pid: "test-2",
|
|
||||||
Color: "green",
|
|
||||||
Link: "www.baidu.com",
|
|
||||||
Image: "image",
|
|
||||||
Orderable: false,
|
|
||||||
USPrice: 421,
|
|
||||||
DWPrice: 3000,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
3
go.mod
3
go.mod
@ -3,7 +3,7 @@ module gitea.timerzz.com/kedaya_haitao/coach-spider
|
|||||||
go 1.22.2
|
go 1.22.2
|
||||||
|
|
||||||
require (
|
require (
|
||||||
gitea.timerzz.com/kedaya_haitao/common v0.0.0-20240513121252-d83795b6d236
|
gitea.timerzz.com/kedaya_haitao/common v0.0.0-20240514123648-99c3e85dbc18
|
||||||
github.com/go-resty/resty/v2 v2.13.1
|
github.com/go-resty/resty/v2 v2.13.1
|
||||||
github.com/golang/glog v1.2.1
|
github.com/golang/glog v1.2.1
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
@ -32,6 +32,7 @@ require (
|
|||||||
github.com/cloudwego/base64x v0.1.4 // indirect
|
github.com/cloudwego/base64x v0.1.4 // indirect
|
||||||
github.com/cloudwego/iasm v0.2.0 // indirect
|
github.com/cloudwego/iasm v0.2.0 // indirect
|
||||||
github.com/coreos/go-iptables v0.7.0 // indirect
|
github.com/coreos/go-iptables v0.7.0 // indirect
|
||||||
|
github.com/corpix/uarand v0.2.0 // indirect
|
||||||
github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 // indirect
|
github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 // indirect
|
||||||
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect
|
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect
|
||||||
github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 // indirect
|
github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 // indirect
|
||||||
|
6
go.sum
6
go.sum
@ -1,6 +1,6 @@
|
|||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
gitea.timerzz.com/kedaya_haitao/common v0.0.0-20240513121252-d83795b6d236 h1:1t5dh6l20cexlTqmGesIY2ClqrLBqy+OE8LAVp//JC8=
|
gitea.timerzz.com/kedaya_haitao/common v0.0.0-20240514123648-99c3e85dbc18 h1:lTARBVopKcR47VJGzumhNDTmxc0QUpzHnk9AuD/6kfs=
|
||||||
gitea.timerzz.com/kedaya_haitao/common v0.0.0-20240513121252-d83795b6d236/go.mod h1:jQhygETzidSqipdL3N77SJBJVEcvKYxdNDUPfIuHdL8=
|
gitea.timerzz.com/kedaya_haitao/common v0.0.0-20240514123648-99c3e85dbc18/go.mod h1:cgLy4gB0z2UZD3kBp1IAemt28dkaKNdt4RC0LNkE1I8=
|
||||||
github.com/3andne/restls-client-go v0.1.6 h1:tRx/YilqW7iHpgmEL4E1D8dAsuB0tFF3uvncS+B6I08=
|
github.com/3andne/restls-client-go v0.1.6 h1:tRx/YilqW7iHpgmEL4E1D8dAsuB0tFF3uvncS+B6I08=
|
||||||
github.com/3andne/restls-client-go v0.1.6/go.mod h1:iEdTZNt9kzPIxjIGSMScUFSBrUH6bFRNg0BWlP4orEY=
|
github.com/3andne/restls-client-go v0.1.6/go.mod h1:iEdTZNt9kzPIxjIGSMScUFSBrUH6bFRNg0BWlP4orEY=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
@ -51,6 +51,8 @@ github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
|
|||||||
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
|
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
|
||||||
github.com/coreos/go-iptables v0.7.0 h1:XWM3V+MPRr5/q51NuWSgU0fqMad64Zyxs8ZUoMsamr8=
|
github.com/coreos/go-iptables v0.7.0 h1:XWM3V+MPRr5/q51NuWSgU0fqMad64Zyxs8ZUoMsamr8=
|
||||||
github.com/coreos/go-iptables v0.7.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q=
|
github.com/coreos/go-iptables v0.7.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q=
|
||||||
|
github.com/corpix/uarand v0.2.0 h1:U98xXwud/AVuCpkpgfPF7J5TQgr7R5tqT8VZP5KWbzE=
|
||||||
|
github.com/corpix/uarand v0.2.0/go.mod h1:/3Z1QIqWkDIhf6XWn/08/uMHoQ8JUoTIKc2iPchBOmM=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
@ -3,8 +3,8 @@ package product
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"gitea.timerzz.com/kedaya_haitao/coach-spider/database"
|
|
||||||
coach_client "gitea.timerzz.com/kedaya_haitao/coach-spider/pkg/coach-client"
|
coach_client "gitea.timerzz.com/kedaya_haitao/coach-spider/pkg/coach-client"
|
||||||
|
"gitea.timerzz.com/kedaya_haitao/common/model/product"
|
||||||
"github.com/samber/lo"
|
"github.com/samber/lo"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"gorm.io/gorm/clause"
|
"gorm.io/gorm/clause"
|
||||||
@ -31,7 +31,7 @@ func NewController(client *coach_client.Client, db *gorm.DB) *Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Controller) AutoMigrate() {
|
func (c *Controller) AutoMigrate() {
|
||||||
if err := c.db.AutoMigrate(&database.Product{}, &database.HistoryPrice{}, &Option{}); err != nil {
|
if err := c.db.AutoMigrate(&productv1.Product{}, &productv1.HistoryPrice{}, &Option{}); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -77,13 +77,13 @@ func (c *Controller) Crawl() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Controller) saveRespData(list []coach_client.Product) error {
|
func (c *Controller) saveRespData(list []coach_client.Product) error {
|
||||||
var products = make([]database.Product, 0, len(list))
|
var products = make([]productv1.Product, 0, len(list))
|
||||||
for _, resp := range list {
|
for _, resp := range list {
|
||||||
for _, color := range resp.Colors {
|
for _, color := range resp.Colors {
|
||||||
price, _ := lo.Find(resp.VariantsOnSale, func(item coach_client.Variant) bool {
|
price, _ := lo.Find(resp.VariantsOnSale, func(item coach_client.Variant) bool {
|
||||||
return item.Id == color.VgId
|
return item.Id == color.VgId
|
||||||
})
|
})
|
||||||
products = append(products, database.Product{
|
products = append(products, productv1.Product{
|
||||||
Name: resp.Name,
|
Name: resp.Name,
|
||||||
Pid: color.VgId,
|
Pid: color.VgId,
|
||||||
Color: color.Text,
|
Color: color.Text,
|
||||||
@ -97,7 +97,7 @@ func (c *Controller) saveRespData(list []coach_client.Product) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 去重
|
// 去重
|
||||||
products = lo.UniqBy(products, func(p database.Product) string {
|
products = lo.UniqBy(products, func(p productv1.Product) string {
|
||||||
return p.Pid
|
return p.Pid
|
||||||
})
|
})
|
||||||
return c.db.Clauses(clause.OnConflict{
|
return c.db.Clauses(clause.OnConflict{
|
||||||
|
Loading…
Reference in New Issue
Block a user