Files

101 lines
3.8 KiB
Go
Raw Permalink Normal View History

// 功能描述用户本人押金汇总、状态筛选和规则读取版本1.0.0。
package user
import (
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/infra"
"git.apinb.com/heqiapp/platforms/backend/api/internal/impl"
"git.apinb.com/heqiapp/platforms/backend/api/internal/logic/common"
"git.apinb.com/heqiapp/platforms/backend/api/internal/models"
"github.com/gin-gonic/gin"
)
// ListDeposits 只按JWT账户返回押金事实不接受调用方指定用户。
func ListDeposits(ctx *gin.Context) {
account, ok := common.UserAccount(ctx)
if !ok {
return
}
status := ctx.Query("status")
var summary struct {
RefundableAmount int64 `gorm:"column:refundable_amount"`
UsingCount int `gorm:"column:using_count"`
}
if err := impl.DBService.Model(&models.DepositRecord{}).
Where("user_account_id = ? AND status <> ? AND deposit_status = ?", account.ID, common.StatusArchived, 10).
Select("COALESCE(SUM(amount), 0) AS refundable_amount, COUNT(*) AS using_count").Scan(&summary).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
query := impl.DBService.Where("user_account_id = ? AND status <> ?", account.ID, common.StatusArchived)
switch status {
case "", "all":
case "using":
query = query.Where("deposit_status = ?", 10)
case "refunding":
query = query.Where("deposit_status = ?", 20)
case "returned":
query = query.Where("deposit_status = ?", 23)
default:
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
return
}
var records []models.DepositRecord
if err := query.Order("paid_at desc, identity desc").Find(&records).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
items := make([]gin.H, 0, len(records))
returnByDeposit := make(map[uint64]models.DepositReturnRequest, len(records))
if len(records) > 0 {
ids := make([]uint64, 0, len(records))
for _, record := range records {
ids = append(ids, record.ID)
}
var returns []models.DepositReturnRequest
if err := impl.DBService.Where("deposit_record_id IN ? AND return_status <> ?", ids, 50).Find(&returns).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
for _, request := range returns {
returnByDeposit[request.DepositRecordID] = request
}
}
for _, record := range records {
var product models.ProductInfo
if err := impl.DBService.Where("id = ?", record.ProductInfoID).Take(&product).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
var productType models.ProductType
if err := impl.DBService.Where("id = ?", product.ProductTypeID).Take(&productType).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
statusName := map[int]string{10: "使用中", 20: "退款中", 23: "已退回"}[record.DepositStatus]
if statusName == "" {
statusName = "处理中"
}
item := gin.H{
"identity": record.Identity, "deposit_no": record.DepositNo, "deposit_status": record.DepositStatus,
"status_name": statusName, "amount": record.Amount, "product_name": productType.Name,
"product_code": product.Code, "paid_at": record.PaidAt, "refunded_at": record.RefundedAt,
"allowed_actions": func() []string {
if record.DepositStatus == 10 {
return []string{"return_bottle"}
}
return []string{}
}(),
}
if request, exists := returnByDeposit[record.ID]; exists {
item["return_request_identity"] = request.Identity
item["return_status"] = request.ReturnStatus
item["return_status_name"] = map[int]string{10: "待上门", 20: "已回收待验收", 30: "已验收待退款", 40: "已完成"}[request.ReturnStatus]
}
items = append(items, item)
}
var policy models.DepositPolicy
_ = impl.DBService.Where("status = ?", common.StatusEnable).Order("updated_at desc").Find(&policy).Error
infra.Response.Success(ctx, gin.H{"refundable_amount": summary.RefundableAmount, "using_count": summary.UsingCount, "items": items, "rule_text": policy.RuleText})
}