feat(topup):基本完成商户充值记录的数据库操作部分。
This commit is contained in:
parent
541932d62e
commit
234e811324
22
model/top_up.go
Normal file
22
model/top_up.go
Normal file
|
@ -0,0 +1,22 @@
|
|||
package model
|
||||
|
||||
import (
|
||||
"electricity_bill_calc/types"
|
||||
|
||||
"github.com/shopspring/decimal"
|
||||
)
|
||||
|
||||
type TopUp struct {
|
||||
TopUpCode string `json:"topUpCode" db:"top_up_code"`
|
||||
Park string `json:"parkId" db:"park_id"`
|
||||
Tenement string `json:"tenementId" db:"tenement_id"`
|
||||
TenementName string `json:"tenementName" db:"tenement_name"`
|
||||
Meter string `json:"meterId" db:"meter_id"`
|
||||
MeterAddress *string `json:"meterAddress" db:"meter_address"`
|
||||
ToppedUpAt types.DateTime `json:"toppedUpAt" db:"topped_up_at"`
|
||||
Amount decimal.Decimal `json:"amount" db:"amount"`
|
||||
PaymentType int16 `json:"paymentType" db:"payment_type"`
|
||||
SuccessfulSynchronized bool `json:"successfulSynchronized" db:"successful_synchronized"`
|
||||
SynchronizedAt *types.DateTime `json:"synchronizedAt" db:"synchronized_at"`
|
||||
CancelledAt *types.DateTime `json:"cancelledAt" db:"cancelled_at"`
|
||||
}
|
186
repository/top_up.go
Normal file
186
repository/top_up.go
Normal file
|
@ -0,0 +1,186 @@
|
|||
package repository
|
||||
|
||||
import (
|
||||
"electricity_bill_calc/cache"
|
||||
"electricity_bill_calc/config"
|
||||
"electricity_bill_calc/global"
|
||||
"electricity_bill_calc/logger"
|
||||
"electricity_bill_calc/model"
|
||||
"electricity_bill_calc/tools/serial"
|
||||
"electricity_bill_calc/types"
|
||||
"electricity_bill_calc/vo"
|
||||
"fmt"
|
||||
|
||||
"github.com/doug-martin/goqu/v9"
|
||||
_ "github.com/doug-martin/goqu/v9/dialect/postgres"
|
||||
"github.com/georgysavva/scany/v2/pgxscan"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
type _TopUpRepository struct {
|
||||
log *zap.Logger
|
||||
ds goqu.DialectWrapper
|
||||
}
|
||||
|
||||
var TopUpRepository = _TopUpRepository{
|
||||
log: logger.Named("Repository", "TopUp"),
|
||||
ds: goqu.Dialect("postgres"),
|
||||
}
|
||||
|
||||
// 检索符合条件的商户充值记录
|
||||
func (tur _TopUpRepository) ListTopUps(pid string, startDate, endDate *types.Date, keyword *string, page uint) ([]*model.TopUp, int64, error) {
|
||||
tur.log.Info("查询符合条件的商户充值记录", zap.String("Park", pid), logger.DateFieldp("StartDate", startDate), logger.DateFieldp("EndDate", endDate), zap.Stringp("keyword", keyword), zap.Uint("page", page))
|
||||
cacheConditions := []string{
|
||||
pid,
|
||||
cache.NullableStringKey(keyword),
|
||||
cache.NullableConditionKey(startDate),
|
||||
cache.NullableConditionKey(endDate),
|
||||
fmt.Sprintf("%d", page),
|
||||
}
|
||||
if topUps, total, err := cache.RetrievePagedSearch[[]*model.TopUp]("top_ups", cacheConditions...); err == nil && topUps != nil && len(*topUps) > 0 {
|
||||
tur.log.Info("从缓存中获取到商户充值记录", zap.Int("Count", len(*topUps)), zap.Int64("Total", total))
|
||||
return *topUps, total, nil
|
||||
}
|
||||
ctx, cancel := global.TimeoutContext()
|
||||
defer cancel()
|
||||
|
||||
topUpQuery := tur.ds.
|
||||
From(goqu.T("tenement_top_ups").As("t")).
|
||||
LeftJoin(goqu.T("tenement").As("te"), goqu.On(goqu.I("te.id").Eq(goqu.I("t.tenement_id")), goqu.I("te.park_id").Eq(goqu.I("t.park_id")))).
|
||||
LeftJoin(goqu.T("meter").As("m"), goqu.On(goqu.I("m.code").Eq(goqu.I("t.meter_id")), goqu.I("m.park_id").Eq(goqu.I("t.park_id")))).
|
||||
Select("t.*", goqu.I("te.full_name").As("tenement_name"), goqu.I("m.address").As("meter_address")).
|
||||
Where(goqu.I("t.park_id").Eq(pid))
|
||||
countQuery := tur.ds.
|
||||
From(goqu.T("tenement_top_ups").As("t")).
|
||||
LeftJoin(goqu.T("tenement").As("te"), goqu.On(goqu.I("te.id").Eq(goqu.I("t.tenement_id")), goqu.I("te.park_id").Eq(goqu.I("t.park_id")))).
|
||||
LeftJoin(goqu.T("meter").As("m"), goqu.On(goqu.I("m.code").Eq(goqu.I("t.meter_id")), goqu.I("m.park_id").Eq(goqu.I("t.park_id")))).
|
||||
Select(goqu.COUNT("t.*")).
|
||||
Where(goqu.I("t.park_id").Eq(pid))
|
||||
|
||||
if keyword != nil && len(*keyword) > 0 {
|
||||
pattern := fmt.Sprintf("%%%s%%", *keyword)
|
||||
topUpQuery = topUpQuery.Where(goqu.Or(
|
||||
goqu.I("te.full_name").ILike(pattern),
|
||||
goqu.I("te.short_name").ILike(pattern),
|
||||
goqu.I("te.abbr").ILike(pattern),
|
||||
goqu.I("m.code").ILike(pattern),
|
||||
goqu.I("m.address").ILike(pattern),
|
||||
))
|
||||
countQuery = countQuery.Where(goqu.Or(
|
||||
goqu.I("te.full_name").ILike(pattern),
|
||||
goqu.I("te.short_name").ILike(pattern),
|
||||
goqu.I("te.abbr").ILike(pattern),
|
||||
goqu.I("m.code").ILike(pattern),
|
||||
goqu.I("m.address").ILike(pattern),
|
||||
))
|
||||
}
|
||||
|
||||
if startDate != nil {
|
||||
topUpQuery = topUpQuery.Where(goqu.I("t.topped_up_at").Gte(startDate.ToBeginningOfDate()))
|
||||
countQuery = countQuery.Where(goqu.I("t.topped_up_at").Gte(startDate.ToBeginningOfDate()))
|
||||
}
|
||||
|
||||
if endDate != nil {
|
||||
topUpQuery = topUpQuery.Where(goqu.I("t.topped_up_at").Lte(endDate.ToEndingOfDate()))
|
||||
countQuery = countQuery.Where(goqu.I("t.topped_up_at").Lte(endDate.ToEndingOfDate()))
|
||||
}
|
||||
|
||||
startRow := (page - 1) * config.ServiceSettings.ItemsPageSize
|
||||
topUpQuery = topUpQuery.Order(goqu.I("t.topped_up_at").Desc()).Offset(startRow).Limit(config.ServiceSettings.ItemsPageSize)
|
||||
|
||||
topUpSql, topUpArgs, _ := topUpQuery.Prepared(true).ToSQL()
|
||||
countSql, countArgs, _ := countQuery.Prepared(true).ToSQL()
|
||||
|
||||
var (
|
||||
topUps []*model.TopUp = make([]*model.TopUp, 0)
|
||||
total int64 = 0
|
||||
)
|
||||
if err := pgxscan.Select(ctx, global.DB, &topUps, topUpSql, topUpArgs...); err != nil {
|
||||
tur.log.Error("查询商户充值记录失败", zap.Error(err))
|
||||
return topUps, 0, err
|
||||
}
|
||||
if err := pgxscan.Get(ctx, global.DB, &total, countSql, countArgs...); err != nil {
|
||||
tur.log.Error("查询商户充值记录总数失败", zap.Error(err))
|
||||
return topUps, 0, err
|
||||
}
|
||||
cache.CachePagedSearch(topUps, total, []string{fmt.Sprintf("top_up:%s", pid), fmt.Sprintf("tenement:%s", pid), fmt.Sprintf("meter:%s", pid)}, "top_ups", cacheConditions...)
|
||||
return topUps, total, nil
|
||||
}
|
||||
|
||||
// 取得一个充值记录的详细信息
|
||||
func (tur _TopUpRepository) GetTopUp(pid, topUpCode string) (*model.TopUp, error) {
|
||||
tur.log.Info("查询充值记录", zap.String("Park", pid), zap.String("TopUpCode", topUpCode))
|
||||
if topUp, err := cache.RetrieveEntity[model.TopUp]("top_up", topUpCode); err == nil && topUp != nil {
|
||||
tur.log.Info("从缓存中获取到充值记录")
|
||||
return topUp, err
|
||||
}
|
||||
ctx, cancel := global.TimeoutContext()
|
||||
defer cancel()
|
||||
|
||||
topUpSql, topUpArgs, _ := tur.ds.
|
||||
From(goqu.T("tenement_top_ups").As("t")).
|
||||
LeftJoin(goqu.T("tenement").As("te"), goqu.On(goqu.I("te.id").Eq(goqu.I("t.tenement_id")), goqu.I("te.park_id").Eq(goqu.I("t.park_id")))).
|
||||
LeftJoin(goqu.T("meter").As("m"), goqu.On(goqu.I("m.code").Eq(goqu.I("t.meter_id")), goqu.I("m.park_id").Eq(goqu.I("t.park_id")))).
|
||||
Select("t.*", goqu.I("te.full_name").As("tenement_name"), goqu.I("m.address").As("meter_address")).
|
||||
Where(goqu.I("t.park_id").Eq(pid), goqu.I("t.top_up_code").Eq(topUpCode)).
|
||||
Prepared(true).ToSQL()
|
||||
|
||||
var topUp model.TopUp
|
||||
if err := pgxscan.Get(ctx, global.DB, &topUp, topUpSql, topUpArgs...); err != nil {
|
||||
tur.log.Error("查询充值记录失败", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
cache.CacheEntity(&topUp, []string{fmt.Sprintf("top_up:%s", pid), fmt.Sprintf("tenement:%s", pid), fmt.Sprintf("meter:%s", pid)}, "top_up", topUpCode)
|
||||
return &topUp, nil
|
||||
}
|
||||
|
||||
// 创建一条新的充值记录
|
||||
func (tur _TopUpRepository) CreateTopUp(pid string, form *vo.TopUpCreationForm) error {
|
||||
tur.log.Info("创建一条新的充值记录", zap.String("Park", pid), zap.String("Tenement", form.Tenement), zap.String("Meter", form.Meter))
|
||||
ctx, cancel := global.TimeoutContext()
|
||||
defer cancel()
|
||||
|
||||
serial.StringSerialRequestChan <- 1
|
||||
topUpCode := serial.Prefix("U", <-serial.StringSerialResponseChan)
|
||||
topUpTime := types.Now()
|
||||
topUpSql, topUpArgs, _ := tur.ds.
|
||||
Insert("tenement_top_ups").
|
||||
Cols("top_up_code", "park_id", "tenement_id", "meter_id", "topped_up_at", "amount", "payment_type").
|
||||
Vals(goqu.Vals{
|
||||
topUpCode,
|
||||
pid,
|
||||
form.Tenement,
|
||||
form.Meter,
|
||||
topUpTime,
|
||||
form.Amount,
|
||||
model.PAYMENT_CASH,
|
||||
}).
|
||||
Prepared(true).ToSQL()
|
||||
|
||||
if _, err := global.DB.Exec(ctx, topUpSql, topUpArgs...); err != nil {
|
||||
tur.log.Error("创建充值记录失败", zap.Error(err))
|
||||
return err
|
||||
}
|
||||
cache.AbolishRelation(fmt.Sprintf("top_ups:%s", pid))
|
||||
return nil
|
||||
}
|
||||
|
||||
// 删除一条充值记录
|
||||
func (tur _TopUpRepository) DeleteTopUp(pid, topUpCode string) error {
|
||||
tur.log.Info("删除一条充值记录", zap.String("Park", pid), zap.String("TopUpCode", topUpCode))
|
||||
ctx, cancel := global.TimeoutContext()
|
||||
defer cancel()
|
||||
|
||||
topUpSql, topUpArgs, _ := tur.ds.
|
||||
Update("tenement_top_ups").
|
||||
Set(goqu.Record{"cancelled_at": types.Now()}).
|
||||
Where(goqu.I("park_id").Eq(pid), goqu.I("top_up_code").Eq(topUpCode)).
|
||||
Prepared(true).ToSQL()
|
||||
|
||||
if _, err := global.DB.Exec(ctx, topUpSql, topUpArgs...); err != nil {
|
||||
tur.log.Error("删除充值记录失败", zap.Error(err))
|
||||
return err
|
||||
}
|
||||
cache.AbolishRelation(fmt.Sprintf("top_ups:%s", pid))
|
||||
return nil
|
||||
}
|
9
vo/top_up.go
Normal file
9
vo/top_up.go
Normal file
|
@ -0,0 +1,9 @@
|
|||
package vo
|
||||
|
||||
import "github.com/shopspring/decimal"
|
||||
|
||||
type TopUpCreationForm struct {
|
||||
Tenement string `json:"tenement"`
|
||||
Meter string `json:"meter"`
|
||||
Amount decimal.Decimal `json:"amount"`
|
||||
}
|
Loading…
Reference in New Issue
Block a user