feat: update order s

This commit is contained in:
yanghao05
2025-04-18 22:55:37 +08:00
parent 6ca359ec1e
commit 75bbca00cf
4 changed files with 111 additions and 16 deletions

View File

@@ -12,6 +12,7 @@ import (
. "github.com/go-jet/jet/v2/postgres" . "github.com/go-jet/jet/v2/postgres"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/samber/lo"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@@ -100,20 +101,56 @@ func (m *ordersModel) List(ctx context.Context, pagination *requests.Pagination,
m.log.Infof("sql: %s", stmt.DebugSql()) m.log.Infof("sql: %s", stmt.DebugSql())
var orders []model.Orders = make([]model.Orders, 0) var orders []model.Orders = make([]model.Orders, 0)
err := stmt.QueryContext(ctx, db, &orders) if err := stmt.QueryContext(ctx, db, &orders); err != nil {
if err != nil {
m.log.Errorf("error querying orders: %v", err) m.log.Errorf("error querying orders: %v", err)
return nil, err return nil, err
} }
postsMap, err := Posts.GetPostsMapByIDs(ctx, lo.Map(orders, func(order model.Orders, _ int) int64 {
return order.PostID
}))
if err != nil {
m.log.Errorf("error getting posts map: %v", err)
return nil, err
}
userMap, err := Users.GetUsersMapByIDs(ctx, lo.Map(orders, func(order model.Orders, _ int) int64 {
return order.UserID
}))
if err != nil {
m.log.Errorf("error getting users map: %v", err)
return nil, err
}
count, err := m.countByCondition(ctx, cond) count, err := m.countByCondition(ctx, cond)
if err != nil { if err != nil {
m.log.Errorf("error getting order count: %v", err) m.log.Errorf("error getting order count: %v", err)
return nil, err return nil, err
} }
type orderItem struct {
model.Orders
PostTitle string `json:"post_title"`
Username string `json:"username"`
}
return &requests.Pager{ return &requests.Pager{
Items: orders, Items: lo.Map(orders, func(order model.Orders, _ int) *orderItem {
item := &orderItem{
Orders: order,
}
if post, ok := postsMap[order.PostID]; ok {
item.PostTitle = post.Title
}
if user, ok := userMap[order.UserID]; ok {
item.Username = user.Username
}
return item
}),
Total: count, Total: count,
Pagination: *pagination, Pagination: *pagination,
}, nil }, nil

View File

@@ -343,3 +343,30 @@ func (m *postsModel) Bought(ctx context.Context, userId int64, pagination *reque
Pagination: *pagination, Pagination: *pagination,
}, nil }, nil
} }
// GetPostsMapByIDs
func (m *postsModel) GetPostsMapByIDs(ctx context.Context, ids []int64) (map[int64]model.Posts, error) {
if len(ids) == 0 {
return nil, nil
}
tbl := table.Posts
stmt := tbl.
SELECT(tbl.AllColumns).
WHERE(
tbl.ID.IN(lo.Map(ids, func(id int64, _ int) Expression { return Int64(id) })...),
)
m.log.Infof("sql: %s", stmt.DebugSql())
var posts []model.Posts = make([]model.Posts, 0)
err := stmt.QueryContext(ctx, db, &posts)
if err != nil {
m.log.Errorf("error querying posts: %v", err)
return nil, err
}
return lo.SliceToMap(posts, func(item model.Posts) (int64, model.Posts) {
return item.ID, item
}), nil
}

View File

@@ -256,3 +256,30 @@ func (m *usersModel) GetUserByOpenID(ctx context.Context, openID string) (*model
return &user, nil return &user, nil
} }
// GetUsersMapByIDs
func (m *usersModel) GetUsersMapByIDs(ctx context.Context, ids []int64) (map[int64]model.Users, error) {
if len(ids) == 0 {
return nil, nil
}
tbl := table.Users
stmt := tbl.
SELECT(tbl.AllColumns).
WHERE(
tbl.ID.IN(lo.Map(ids, func(id int64, _ int) Expression { return Int64(id) })...),
)
m.log.Infof("sql: %s", stmt.DebugSql())
var users []model.Users = make([]model.Users, 0)
err := stmt.QueryContext(ctx, db, &users)
if err != nil {
m.log.Errorf("error querying users: %v", err)
return nil, err
}
return lo.SliceToMap(users, func(item model.Users) (int64, model.Users) {
return item.ID, item
}), nil
}

View File

@@ -2,7 +2,6 @@
import { orderService } from '@/api/orderService'; import { orderService } from '@/api/orderService';
import { formatDate } from '@/utils/date'; import { formatDate } from '@/utils/date';
import Badge from 'primevue/badge'; import Badge from 'primevue/badge';
import Button from 'primevue/button';
import Column from 'primevue/column'; import Column from 'primevue/column';
import ConfirmDialog from 'primevue/confirmdialog'; import ConfirmDialog from 'primevue/confirmdialog';
import DataTable from 'primevue/datatable'; import DataTable from 'primevue/datatable';
@@ -161,8 +160,22 @@ onMounted(() => {
:severity="orderStatusMap[data.status]?.severity" /> :severity="orderStatusMap[data.status]?.severity" />
</template> </template>
</Column> </Column>
<Column field="user_id" header="用户ID" sortable></Column> <Column field="user_id" header="用户ID" sortable>
<Column field="post_id" header="文章ID" sortable></Column> <template #body="{ data }">
<div class="flex flex-col">
<span class="text-gray-700">用户名: {{ data.username }}</span>
<span class="text-gray-500">ID: {{ data.user_id || '-' }}</span>
</div>
</template>
</Column>
<Column field="post_id" header="文章ID" sortable>
<template #body="{ data }">
<div class="flex flex-col">
<span class="text-gray-700"> 标题: {{ data.post_title }}</span>
<span class="text-gray-500">ID: {{ data.post_id || '-' }}</span>
</div>
</template>
</Column>
<Column field="price" header="价格信息" sortable> <Column field="price" header="价格信息" sortable>
<template #body="{ data }"> <template #body="{ data }">
<div class="flex flex-col"> <div class="flex flex-col">
@@ -170,7 +183,7 @@ onMounted(() => {
<span class="text-orange-500">优惠: -¥{{ formatPrice(getDiscountAmount(data.price, <span class="text-orange-500">优惠: -¥{{ formatPrice(getDiscountAmount(data.price,
data.discount)) }}</span> data.discount)) }}</span>
<span class="font-bold">实付: ¥{{ formatPrice(getFinalPrice(data.price, data.discount)) <span class="font-bold">实付: ¥{{ formatPrice(getFinalPrice(data.price, data.discount))
}}</span> }}</span>
</div> </div>
</template> </template>
</Column> </Column>
@@ -183,15 +196,6 @@ onMounted(() => {
</div> </div>
</template> </template>
</Column> </Column>
<Column header="操作" :exportable="false" style="min-width:8rem">
<template #body="{ data }">
<div class="flex justify-center space-x-2">
<Button icon="pi pi-trash" rounded text severity="danger" @click="handleDelete(data)"
aria-label="删除" />
</div>
</template>
</Column>
</DataTable> </DataTable>
</div> </div>
</div> </div>