Files
2022-03-17 15:59:24 +08:00

419 lines
14 KiB
Go

package dao
import (
"gitlab.33.cn/chat/dtalk/pkg/util"
"gitlab.33.cn/chat/dtalk/service/backend/model/db"
"gitlab.33.cn/utils/go-kit/convert"
"math"
"strings"
"time"
)
const (
_InsertCdkType = `INSERT INTO dtalk_cdk_info ( cdk_id, cdk_name, cdk_info, coin_name, exchange_rate, create_time, update_time, delete_time)VALUES( ?, ?, ?, ?, ?, ?, ?, ?)`
_GetCdkTypes = `SELECT * FROM dtalk_cdk_info WHERE delete_time = 0 AND coin_name LIKE ? ORDER BY create_time DESC LIMIT ?,?`
_DeleteCdkType = `UPDATE dtalk_cdk_info SET delete_time = ? WHERE cdk_id = ? AND delete_time = 0`
_InsertCdk = `INSERT INTO dtalk_cdk_list ( id, cdk_id, cdk_content, user_id, cdk_status, order_id, create_time, update_time, delete_time, exchange_time)VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
_GetCdks = `SELECT * FROM dtalk_cdk_list WHERE delete_time = 0 AND cdk_id = ? AND cdk_content LIKE ? ORDER BY create_time DESC LIMIT ?,?`
_DeleteCdk = `UPDATE dtalk_cdk_list SET delete_time = ? WHERE id = ? AND delete_time = 0`
_UpdateCdkStatus = `UPDATE dtalk_cdk_list SET cdk_status = ?, update_time = ? WHERE id = ? AND delete_time = 0`
_UpdateCdkUserId = `UPDATE dtalk_cdk_list SET user_id = ?, update_time = ? WHERE id = ? AND delete_time = 0`
_UpdateCdkOrderId = `UPDATE dtalk_cdk_list SET order_id = ?, cdk_status = 1, update_time = ? WHERE id = ? AND delete_time = 0`
_GetCdkTypesCount = `SELECT COUNT(*) FROM dtalk_cdk_info WHERE delete_time = 0 AND coin_name LIKE ?`
_GetCdksCount = `SELECT COUNT(*) FROM dtalk_cdk_list WHERE delete_time = 0 AND cdk_id = ?`
_GetCdksWithUserId = `SELECT * FROM dtalk_cdk_list WHERE delete_time = 0 AND user_id = ? AND cdk_status >= ? ORDER BY create_time DESC LIMIT ?,?`
_GetCdksCountWithUserId = `SELECT COUNT(*) FROM dtalk_cdk_list WHERE delete_time = 0 AND user_id = ? AND cdk_status >= ?`
_GetCdkTypesWithCoinName = `SELECT * FROM dtalk_cdk_info WHERE delete_time = 0 AND coin_name = ?`
_GetUnusedCdksCount = `SELECT COUNT(*) FROM dtalk_cdk_list WHERE delete_time = 0 AND cdk_id = ? AND cdk_status = 0`
_GetFrozenCdksCount = `SELECT COUNT(*) FROM dtalk_cdk_list WHERE delete_time = 0 AND cdk_id = ? AND cdk_status = 1`
_GetUsedCdksCount = `SELECT COUNT(*) FROM dtalk_cdk_list WHERE delete_time = 0 AND cdk_id = ? AND cdk_status >= 2`
_GetCdkType = `SELECT * FROM dtalk_cdk_info WHERE delete_time = 0 AND cdk_id = ?`
_DeleteCdks = `UPDATE dtalk_cdk_list SET delete_time = ? WHERE delete_time = 0 AND id in `
_DeleteCdkTypes = `UPDATE dtalk_cdk_info SET delete_time = ? WHERE delete_time = 0 AND cdk_id in `
_DeleteCdksByCdkIds = `UPDATE dtalk_cdk_list SET delete_time = ? WHERE delete_time = 0 AND cdk_id in `
_UpdateCdkType = `UPDATE dtalk_cdk_info SET cdk_name = ?, coin_name = ?, exchange_rate = ?, update_time = ? WHERE delete_time = 0 AND cdk_id = ?`
_GetCdksByOrderId = `SELECT * FROM dtalk_cdk_list WHERE delete_time = 0 AND order_id = ?`
_UpdateCdksStatus = `UPDATE dtalk_cdk_list SET cdk_status = ?, update_time = ?, exchange_time = ? WHERE delete_time = 0 AND id in `
_FrozenCdksStatus = `UPDATE dtalk_cdk_list SET cdk_status = ?, user_id = ?, order_id = ?, update_time = ? WHERE delete_time = 0 AND id in `
_GetUnusedCdks = `SELECT * FROM dtalk_cdk_list WHERE cdk_id = ? AND cdk_status = ? AND delete_time = 0 ORDER BY create_time ASC LIMIT 0,?`
_CheckCdkExist = `SELECT COUNT(*) FROM dtalk_cdk_list WHERE delete_time = 0 AND cdk_id = ? AND cdk_content = ?`
_GetFrozenCdks = `SElECT * FROM dtalk_cdk_list WHERE delete_time = 0 AND cdk_status = 1`
_CleanFrozenCdks = `UPDATE dtalk_cdk_list SET cdk_status = ?, update_time = ? WHERE delete_time = 0 AND order_id = ?`
_GetCdksCountByUserIdAndCdkId = `SELECT COUNT(*) FROM dtalk_cdk_list WHERE delete_time = 0 AND cdk_id = ? AND user_id = ? AND cdk_status >= 1`
)
func (d *Dao) InsertCdkType(cdkType *db.CdkType) error {
_, _, err := d.conn.Exec(_InsertCdkType, cdkType.CdkId, cdkType.CdkName, cdkType.CdkInfo, cdkType.CoinName, cdkType.ExchangeRate, cdkType.CreateTime, cdkType.UpdateTime, cdkType.DeleteTime)
return err
}
func (d *Dao) InsertCdk(cdk *db.Cdk) error {
_, _, err := d.conn.Exec(_InsertCdk, cdk.Id, cdk.CdkId, cdk.CdkContent, cdk.UserId, cdk.CdkStatus, cdk.OrderId, cdk.CreateTime, cdk.UpdateTime, cdk.DeleteTime, cdk.ExchangeTime)
return err
}
func (d *Dao) DeleteCdkType(cdkId int64, deleteTime int64) error {
_, _, err := d.conn.Exec(_DeleteCdkType, deleteTime, cdkId)
return err
}
func (d *Dao) DeleteCdk(id int64, deleteTime int64) error {
_, _, err := d.conn.Exec(_DeleteCdk, deleteTime, id)
return err
}
func (d *Dao) DeleteCdks(ids []int64, deleteTime int64) error {
idStrs := make([]string, 0, len(ids))
for _, id := range ids {
idStrs = append(idStrs, convert.ToString(id))
}
idStr := "(" + strings.Join(idStrs, ",") + ")"
execSql := _DeleteCdks + idStr
_, _, err := d.conn.Exec(execSql, deleteTime)
return err
}
func (d *Dao) DeleteCdkTypes(cdkIds []int64) error {
idStrs := make([]string, 0, len(cdkIds))
for _, id := range cdkIds {
idStrs = append(idStrs, convert.ToString(id))
}
idStr := "(" + strings.Join(idStrs, ",") + ")"
execSql := _DeleteCdkTypes + idStr
_, _, err := d.conn.Exec(execSql, d.getNowTime())
return err
}
func (d *Dao) DeleteCdksByCdkIds(cdkIds []int64) error {
idStrs := make([]string, 0, len(cdkIds))
for _, id := range cdkIds {
idStrs = append(idStrs, convert.ToString(id))
}
idStr := "(" + strings.Join(idStrs, ",") + ")"
execSql := _DeleteCdksByCdkIds + idStr
_, _, err := d.conn.Exec(execSql, d.getNowTime())
return err
}
func (d *Dao) UpdateCdkType(cdkId int64, cdkName, coinName string, exchangeRate int64) error {
_, _, err := d.conn.Exec(_UpdateCdkType, cdkName, coinName, exchangeRate, d.getNowTime(), cdkId)
return err
}
func (d *Dao) UpdateCdkStatus(id int64, cdkStatus int32) error {
_, _, err := d.conn.Exec(_UpdateCdkStatus, cdkStatus, d.getNowTime(), id)
return err
}
func (d *Dao) UpdateCdkUserId(id int64, userId int64) error {
_, _, err := d.conn.Exec(_UpdateCdkUserId, userId, d.getNowTime(), id)
return err
}
func (d *Dao) UpdateCdkOrderId(id int64, orderId int64) error {
_, _, err := d.conn.Exec(_UpdateCdkOrderId, orderId, d.getNowTime(), id)
return err
}
func (d *Dao) GetCdkType(cdkId int64) (*db.CdkType, error) {
var records []map[string]string
records, err := d.conn.Query(_GetCdkType, cdkId)
if err != nil {
return nil, err
}
response, err := d.ToCdkTypes(records)
if err != nil {
return nil, err
}
if len(response) == 0 {
return nil, nil
}
return &response[0], nil
}
func (d *Dao) GetCdkTypes(coinName string, page int64, size int64) ([]db.CdkType, int64, int64, error) {
var records []map[string]string
offset := page * size
if coinName == "" {
coinName = "%"
}
records, err := d.conn.Query(_GetCdkTypes, coinName, offset, size)
if err != nil {
return nil, 0, 0, err
}
response, err := d.ToCdkTypes(records)
if err != nil {
return nil, 0, 0, err
}
if coinName == "" {
coinName = "%"
}
recordsCount, err := d.conn.Query(_GetCdkTypesCount, coinName)
if err != nil {
return nil, 0, 0, err
}
totalElements := convert.ToInt64(recordsCount[0]["COUNT(*)"])
totalPages := int64(math.Ceil(float64(totalElements) / float64(size)))
return response, totalElements, totalPages, nil
}
func (d *Dao) GetCdks(cdkId int64, cdkContent string, page int64, size int64) ([]db.Cdk, int64, int64, error) {
var records []map[string]string
offset := page * size
cdkContent += "%"
records, err := d.conn.Query(_GetCdks, cdkId, cdkContent, offset, size)
if err != nil {
return nil, 0, 0, err
}
response, err := d.ToCdks(records)
if err != nil {
return nil, 0, 0, err
}
recordsCount, err := d.conn.Query(_GetCdksCount, cdkId)
if err != nil {
return nil, 0, 0, err
}
totalElements := convert.ToInt64(recordsCount[0]["COUNT(*)"])
totalPages := int64(math.Ceil(float64(totalElements) / float64(size)))
return response, totalElements, totalPages, nil
}
func (d *Dao) GetCdksWithUserId(userId string, page int64, size int64) ([]db.Cdk, int64, int64, error) {
var records []map[string]string
offset := page * size
records, err := d.conn.Query(_GetCdksWithUserId, userId, db.CdkFrozen, offset, size)
if err != nil {
return nil, 0, 0, err
}
response, err := d.ToCdks(records)
if err != nil {
return nil, 0, 0, err
}
recordsCount, err := d.conn.Query(_GetCdksCountWithUserId, userId, db.CdkFrozen)
if err != nil {
return nil, 0, 0, err
}
totalElements := convert.ToInt64(recordsCount[0]["COUNT(*)"])
totalPages := int64(math.Ceil(float64(totalElements) / float64(size)))
return response, totalElements, totalPages, nil
}
func (d *Dao) GetCdkTypesWithCoinName(coinName string) ([]db.CdkType, error) {
var records []map[string]string
records, err := d.conn.Query(_GetCdkTypesWithCoinName, coinName)
if err != nil {
return nil, err
}
response, err := d.ToCdkTypes(records)
if err != nil {
return nil, err
}
return response, nil
}
func (d *Dao) GetCdksCount(cdkId int64) (int64, int64, int64, error) {
res, err := d.conn.Query(_GetUnusedCdksCount, cdkId)
if err != nil {
return 0, 0, 0, err
}
Unused := convert.ToInt64(res[0]["COUNT(*)"])
res, err = d.conn.Query(_GetFrozenCdksCount, cdkId)
if err != nil {
return 0, 0, 0, err
}
Frozen := convert.ToInt64(res[0]["COUNT(*)"])
res, err = d.conn.Query(_GetUsedCdksCount, cdkId)
if err != nil {
return 0, 0, 0, err
}
Used := util.ToInt64(res[0]["COUNT(*)"])
return Unused, Frozen, Used, nil
}
func (d *Dao) GetUnusedCdksCount(cdkId string) (int64, error) {
recordsCount, err := d.conn.Query(_GetUnusedCdksCount, cdkId)
if err != nil {
return 0, err
}
response := convert.ToInt64(recordsCount[0]["COUNT(*)"])
return response, nil
}
func (d *Dao) GetFrozenCdksCount(cdkId string) (int64, error) {
recordsCount, err := d.conn.Query(_GetFrozenCdksCount, cdkId)
if err != nil {
return 0, err
}
response := convert.ToInt64(recordsCount[0]["COUNT(*)"])
return response, nil
}
func (d *Dao) GetUsedCdksCount(cdkId string) (int64, error) {
recordsCount, err := d.conn.Query(_GetUsedCdksCount, cdkId)
if err != nil {
return 0, err
}
response := convert.ToInt64(recordsCount[0]["COUNT(*)"])
return response, nil
}
func (d *Dao) ToCdkTypes(records []map[string]string) ([]db.CdkType, error) {
cdkTypes := make([]db.CdkType, len(records), len(records))
for i, record := range records {
cdkType := db.CdkType{
CdkId: convert.ToInt64(record["cdk_id"]),
CdkName: record["cdk_name"],
CdkInfo: record["cdl_info"],
CoinName: record["coin_name"],
ExchangeRate: convert.ToInt64(record["exchange_rate"]),
TimeInfo: db.TimeInfo{
CreateTime: convert.ToInt64(record["create_time"]),
UpdateTime: convert.ToInt64(record["update_time"]),
DeleteTime: convert.ToInt64(record["delete_time"]),
},
}
cdkTypes[i] = cdkType
}
return cdkTypes, nil
}
func (d *Dao) ToCdks(records []map[string]string) ([]db.Cdk, error) {
cdks := make([]db.Cdk, len(records), len(records))
for i, record := range records {
cdk := db.Cdk{
Id: convert.ToInt64(record["id"]),
CdkId: convert.ToInt64(record["cdk_id"]),
CdkContent: record["cdk_content"],
UserId: record["user_id"],
CdkStatus: convert.ToInt32(record["cdk_status"]),
OrderId: convert.ToInt64(record["order_id"]),
TimeInfo: db.TimeInfo{
CreateTime: convert.ToInt64(record["create_time"]),
UpdateTime: convert.ToInt64(record["update_time"]),
DeleteTime: convert.ToInt64(record["delete_time"]),
},
ExchangeTime: convert.ToInt64(record["exchange_time"]),
}
//fmt.Println(cdk)
cdks[i] = cdk
}
return cdks, nil
}
func (d *Dao) UpdateCdksStatus(ids []int64, status int64) error {
idStrs := make([]string, 0, len(ids))
for _, id := range ids {
idStrs = append(idStrs, convert.ToString(id))
}
idStr := "(" + strings.Join(idStrs, ",") + ")"
execSql := _UpdateCdksStatus + idStr
var exchangeTime int64
if status == db.CdkUsed || status == db.CdkExchange {
exchangeTime = d.getNowTime()
}
_, _, err := d.conn.Exec(execSql, status, d.getNowTime(), exchangeTime)
return err
}
func (d *Dao) GetCdksByOrderId(orderId int64) ([]db.Cdk, error) {
var records []map[string]string
records, err := d.conn.Query(_GetCdksByOrderId, orderId)
if err != nil {
return nil, err
}
response, err := d.ToCdks(records)
if err != nil {
return nil, err
}
return response, nil
}
func (d *Dao) GetUnusedCdks(cdkId int64, number int64) ([]db.Cdk, error) {
var records []map[string]string
records, err := d.conn.Query(_GetUnusedCdks, cdkId, db.CdkUnused, number)
if err != nil {
return nil, err
}
response, err := d.ToCdks(records)
if err != nil {
return nil, err
}
return response, nil
}
func (d *Dao) FrozenCdksStatus(ids []int64, userId string, orderId int64) error {
idStrs := make([]string, 0, len(ids))
for _, id := range ids {
idStrs = append(idStrs, convert.ToString(id))
}
idStr := "(" + strings.Join(idStrs, ",") + ")"
execSql := _FrozenCdksStatus + idStr
_, _, err := d.conn.Exec(execSql, db.CdkFrozen, userId, orderId, d.getNowTime())
return err
}
func (d *Dao) getNowTime() int64 {
return time.Now().UnixNano() / 1e6
}
func (d *Dao) CheckCdkExist(cdkId int64, cdkContent string) (bool, error) {
recordsCount, err := d.conn.Query(_CheckCdkExist, cdkId, cdkContent)
if err != nil {
return false, err
}
response := convert.ToInt64(recordsCount[0]["COUNT(*)"])
return response >= 1, nil
}
func (d *Dao) GetFrozenCdks() ([]db.Cdk, error) {
var records []map[string]string
records, err := d.conn.Query(_GetFrozenCdks)
if err != nil {
return nil, err
}
response, err := d.ToCdks(records)
if err != nil {
return nil, err
}
return response, nil
}
func (d *Dao) CleanFrozenCdks(orderId int64) error {
_, _, err := d.conn.Exec(_CleanFrozenCdks, db.CdkUnused, d.getNowTime(), orderId)
if err != nil {
return err
}
return nil
}
func (d *Dao) GetCdksCountByUserIdAndCdkId(cdkId int64, userId string) (int64, error) {
recordsCount, err := d.conn.Query(_GetCdksCountByUserIdAndCdkId, cdkId, userId)
if err != nil {
return 0, err
}
response := convert.ToInt64(recordsCount[0]["COUNT(*)"])
return response, nil
}