Files
shangbangbang/internal/handlers/user_reconciliation_handler.go
solosw 99b11b04e4 1.0
2026-01-05 14:11:34 +08:00

158 lines
5.8 KiB
Go

package handlers
import (
"awesomeProject/internal/common"
"awesomeProject/internal/models"
"net/http"
"time"
"github.com/gin-gonic/gin"
)
// UserReconciliationHandler 用户端对账管理处理器
type UserReconciliationHandler struct{}
// GetReconciliationStats 获取对账统计数据
func (h *UserReconciliationHandler) GetReconciliationStats(c *gin.Context) {
currentUser, _ := c.Get("current_user")
user := currentUser.(models.User)
// 获取日期参数
startDate := c.Query("start_date")
endDate := c.Query("end_date")
// 如果没有传入日期,默认为今天
if startDate == "" || endDate == "" {
today := time.Now().Format("2006-01-02")
startDate = today
endDate = today
}
// 解析日期
startTime, err := time.Parse("2006-01-02", startDate)
if err != nil {
c.JSON(http.StatusOK, common.Error(400, "开始日期格式错误"))
return
}
endTime, err := time.Parse("2006-01-02", endDate)
if err != nil {
c.JSON(http.StatusOK, common.Error(400, "结束日期格式错误"))
return
}
// 设置时间范围
startTime = time.Date(startTime.Year(), startTime.Month(), startTime.Day(), 0, 0, 0, 0, startTime.Location())
endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 23, 59, 59, 999999999, endTime.Location())
// 构建返回数据
result := map[string]interface{}{
"primary_confirmed": h.getPrimaryMarketStats(user.ID, startTime, endTime, 2), // 已确认
"primary_pending": h.getPrimaryMarketStats(user.ID, startTime, endTime, 1), // 待确认
"secondary_buy_confirmed": h.getSecondaryBuyStats(user.ID, startTime, endTime, 2), // 二级市场买单已确认
"secondary_buy_pending": h.getSecondaryBuyStats(user.ID, startTime, endTime, 1), // 二级市场买单待确认
"secondary_sell_confirmed": h.getSecondarySellStats(user.ID, startTime, endTime, 2), // 二级市场卖单已确认
"secondary_sell_pending": h.getSecondarySellStats(user.ID, startTime, endTime, 1), // 二级市场卖单待确认
"warehouse_active": h.getWarehouseStats(user.ID, 1), // 寄售中
"warehouse_inactive": h.getWarehouseStats(user.ID, 0), // 未寄售
"score_change": h.getScoreChangeStats(user.ID, startTime, endTime), // 积分变更
}
c.JSON(http.StatusOK, common.Success(result))
}
// getPrimaryMarketStats 获取一级市场统计数据
func (h *UserReconciliationHandler) getPrimaryMarketStats(userID uint, startTime, endTime time.Time, status int) map[string]interface{} {
var totalAmount float64
var totalQuantity int64
db := common.GetDB()
// 查询一级商品订单统计
db.Model(&models.PurchaseOrder{}).
Where("buyer_id = ? AND product_type = ? AND order_status = ? AND created_at BETWEEN ? AND ?",
userID, 1, status, startTime, endTime).
Select("COALESCE(SUM(total_amount), 0) as total_amount, COALESCE(SUM(quantity), 0) as total_quantity").
Row().Scan(&totalAmount, &totalQuantity)
return map[string]interface{}{
"amount": totalAmount,
"quantity": totalQuantity,
}
}
// getSecondaryBuyStats 获取二级市场买单统计数据
func (h *UserReconciliationHandler) getSecondaryBuyStats(userID uint, startTime, endTime time.Time, status int) map[string]interface{} {
var totalAmount float64
var totalQuantity int64
db := common.GetDB()
// 查询二级商品买单统计
db.Model(&models.PurchaseOrder{}).
Where("buyer_id = ? AND product_type = ? AND order_status = ? AND created_at BETWEEN ? AND ?",
userID, 2, status, startTime, endTime).
Select("COALESCE(SUM(total_amount), 0) as total_amount, COALESCE(SUM(quantity), 0) as total_quantity").
Row().Scan(&totalAmount, &totalQuantity)
return map[string]interface{}{
"amount": totalAmount,
"quantity": totalQuantity,
}
}
// getSecondarySellStats 获取二级市场卖单统计数据
func (h *UserReconciliationHandler) getSecondarySellStats(userID uint, startTime, endTime time.Time, status int) map[string]interface{} {
var totalAmount float64
var totalQuantity int64
db := common.GetDB()
// 查询二级商品卖单统计
db.Model(&models.SalesOrder{}).
Where("seller_id = ? AND order_status = ? AND created_at BETWEEN ? AND ?",
userID, status, startTime, endTime).
Select("COALESCE(SUM(total_amount), 0) as total_amount, COALESCE(SUM(quantity), 0) as total_quantity").
Row().Scan(&totalAmount, &totalQuantity)
return map[string]interface{}{
"amount": totalAmount,
"quantity": totalQuantity,
}
}
// getWarehouseStats 获取仓库商品统计数据
func (h *UserReconciliationHandler) getWarehouseStats(userID uint, status int) map[string]interface{} {
var totalAmount float64
var totalQuantity int64
db := common.GetDB()
// 查询仓库商品统计
db.Model(&models.UserWarehouse{}).
Where("user_id = ? AND status = ?", userID, status).
Select("COALESCE(SUM(warehouse_price * quantity), 0) as total_amount, COALESCE(SUM(quantity), 0) as total_quantity").
Row().Scan(&totalAmount, &totalQuantity)
return map[string]interface{}{
"amount": totalAmount,
"quantity": totalQuantity,
}
}
// getScoreChangeStats 获取积分变更统计数据
func (h *UserReconciliationHandler) getScoreChangeStats(userID uint, startTime, endTime time.Time) map[string]interface{} {
var increaseScore int64
var decreaseScore int64
db := common.GetDB()
// 查询增加的积分
db.Model(&models.ScoreRecord{}).
Where("user_id = ? AND change_number > 0 AND created_at BETWEEN ? AND ?",
userID, startTime, endTime).
Select("COALESCE(SUM(change_number), 0)").
Row().Scan(&increaseScore)
// 查询减少的积分(取绝对值)
db.Model(&models.ScoreRecord{}).
Where("user_id = ? AND change_number < 0 AND created_at BETWEEN ? AND ?",
userID, startTime, endTime).
Select("COALESCE(ABS(SUM(change_number)), 0)").
Row().Scan(&decreaseScore)
return map[string]interface{}{
"increase": increaseScore,
"decrease": decreaseScore,
}
}