新增代理注册申请管理
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m41s
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m41s
This commit is contained in:
@@ -5,6 +5,8 @@ package distributionwithdrawal
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
|
||||
@@ -13,6 +15,8 @@ import (
|
||||
"github.com/break/junhong_cmp_fiber/internal/model/dto"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/constants"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/errors"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/middleware"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/utils"
|
||||
)
|
||||
|
||||
// Query 提供提现资料资格与提现申请详情的只读投影。
|
||||
@@ -286,3 +290,149 @@ func decodeAttemptAccount(payload []byte) (string, string) {
|
||||
}
|
||||
return info["account_name"], info["account_number"]
|
||||
}
|
||||
|
||||
// ListAgentDistributionRegistrations 查询代理注册申请列表,并按调用方固定数据范围过滤。
|
||||
func (q *Query) ListAgentDistributionRegistrations(ctx context.Context, req *dto.AgentDistributionRegistrationListReq) (*dto.AgentDistributionRegistrationPageResult, error) {
|
||||
if q == nil || q.db == nil {
|
||||
return nil, errors.New(errors.CodeInternalError, "代理注册申请查询能力未配置")
|
||||
}
|
||||
if req == nil {
|
||||
req = &dto.AgentDistributionRegistrationListReq{}
|
||||
}
|
||||
page, size := req.Page, req.PageSize
|
||||
if page <= 0 {
|
||||
page = constants.DefaultPage
|
||||
}
|
||||
if size <= 0 {
|
||||
size = constants.DefaultPageSize
|
||||
}
|
||||
if size > constants.MaxPageSize {
|
||||
size = constants.MaxPageSize
|
||||
}
|
||||
query, err := q.registrationScope(ctx, req.ParentShopID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if req.Status != nil {
|
||||
query = query.Where("r.status = ?", *req.Status)
|
||||
}
|
||||
if req.Phone != "" {
|
||||
query = query.Where("r.phone = ?", req.Phone)
|
||||
}
|
||||
if keyword := strings.TrimSpace(req.Keyword); keyword != "" {
|
||||
like := "%" + keyword + "%"
|
||||
query = query.Where("(r.shop_name ILIKE ? OR r.shop_code ILIKE ? OR r.username ILIKE ? OR r.contact_name ILIKE ?)", like, like, like, like)
|
||||
}
|
||||
for _, f := range []struct{ start, end, columnStart, columnEnd string }{{req.StartTime, req.EndTime, "r.created_at >= ?", "r.created_at <= ?"}, {req.DecidedStartTime, req.DecidedEndTime, "r.decided_at >= ?", "r.decided_at <= ?"}} {
|
||||
start, end, err := utils.ParseTimeRange(f.start, f.end)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if start != nil {
|
||||
query = query.Where(f.columnStart, *start)
|
||||
}
|
||||
if end != nil {
|
||||
query = query.Where(f.columnEnd, *end)
|
||||
}
|
||||
}
|
||||
if req.SubmissionAnomaly != nil && *req.SubmissionAnomaly {
|
||||
query = query.Where("(wc.submission_status IN ? OR ai.status IN ?)", []int{constants.WeComSubmissionStatusFailed, constants.WeComSubmissionStatusUnknown}, []int{constants.ApprovalStatusSubmissionFailed, constants.ApprovalStatusSubmissionUnknown})
|
||||
}
|
||||
var total int64
|
||||
if err := query.Count(&total).Error; err != nil {
|
||||
return nil, errors.Wrap(errors.CodeDatabaseError, err, "统计代理注册申请失败")
|
||||
}
|
||||
var rows []registrationProjection
|
||||
if err := query.Order("r.created_at DESC, r.id DESC").Offset((page - 1) * size).Limit(size).Find(&rows).Error; err != nil {
|
||||
return nil, errors.Wrap(errors.CodeDatabaseError, err, "查询代理注册申请失败")
|
||||
}
|
||||
items := make([]dto.AgentDistributionRegistrationItem, 0, len(rows))
|
||||
for _, row := range rows {
|
||||
items = append(items, projectRegistration(row))
|
||||
}
|
||||
return &dto.AgentDistributionRegistrationPageResult{Items: items, Total: total, Page: page, Size: size}, nil
|
||||
}
|
||||
|
||||
// AgentDistributionRegistrationDetail 查询单笔代理注册申请详情。
|
||||
func (q *Query) AgentDistributionRegistrationDetail(ctx context.Context, id uint) (*dto.AgentDistributionRegistrationItem, error) {
|
||||
query, err := q.registrationScope(ctx, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var row registrationProjection
|
||||
if err := query.Where("r.id = ?", id).First(&row).Error; err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
return nil, errors.New(errors.CodeNotFound, "代理注册申请不存在")
|
||||
}
|
||||
return nil, errors.Wrap(errors.CodeDatabaseError, err, "查询代理注册申请详情失败")
|
||||
}
|
||||
item := projectRegistration(row)
|
||||
return &item, nil
|
||||
}
|
||||
|
||||
type registrationProjection struct {
|
||||
ID uint `gorm:"column:id"`
|
||||
Status int `gorm:"column:status"`
|
||||
ShopName string `gorm:"column:shop_name"`
|
||||
ShopCode string `gorm:"column:shop_code"`
|
||||
Username string `gorm:"column:username"`
|
||||
ContactName string `gorm:"column:contact_name"`
|
||||
Phone string `gorm:"column:phone"`
|
||||
Province string `gorm:"column:province"`
|
||||
City string `gorm:"column:city"`
|
||||
District string `gorm:"column:district"`
|
||||
Address string `gorm:"column:address"`
|
||||
ParentShopID uint `gorm:"column:parent_shop_id"`
|
||||
ParentShopName string `gorm:"column:parent_shop_name"`
|
||||
DistributionCode string `gorm:"column:distribution_code"`
|
||||
CreatedAt time.Time `gorm:"column:created_at"`
|
||||
DecidedAt *time.Time `gorm:"column:decided_at"`
|
||||
RejectReason string `gorm:"column:reject_reason"`
|
||||
ApprovalInstanceID uint `gorm:"column:approval_instance_id"`
|
||||
ApprovalStatus int `gorm:"column:approval_status"`
|
||||
SubmissionStatus int `gorm:"column:submission_status"`
|
||||
FailureSummary string `gorm:"column:failure_summary"`
|
||||
LastRecoveryAt *time.Time `gorm:"column:last_recovery_at"`
|
||||
ParentShopStatus int `gorm:"column:parent_shop_status"`
|
||||
}
|
||||
|
||||
func (q *Query) registrationScope(ctx context.Context, parentShopFilter *uint) (*gorm.DB, error) {
|
||||
userType := middleware.GetUserTypeFromContext(ctx)
|
||||
if userType == constants.UserTypeEnterprise || (userType != constants.UserTypeSuperAdmin && userType != constants.UserTypePlatform && userType != constants.UserTypeAgent) {
|
||||
return nil, errors.New(errors.CodeForbidden, "无权限访问该资源或资源不存在")
|
||||
}
|
||||
query := q.db.WithContext(ctx).Table("tb_agent_distribution_registration r").Select("r.id, r.status, r.shop_name, r.shop_code, r.username, r.contact_name, r.phone, r.province, r.city, r.district, r.address, r.parent_shop_id, COALESCE(s.shop_name, '') AS parent_shop_name, r.distribution_code, r.created_at, r.decided_at, r.reject_reason, COALESCE(r.approval_instance_id, 0) AS approval_instance_id, COALESCE(ai.status, -1) AS approval_status, COALESCE(wc.submission_status, 0) AS submission_status, COALESCE(wc.last_error, '') AS failure_summary, wc.last_recovery_at, COALESCE(s.status, 0) AS parent_shop_status").Joins("LEFT JOIN tb_shop s ON s.id = r.parent_shop_id").Joins("LEFT JOIN tb_approval_instance ai ON ai.id = r.approval_instance_id AND ai.business_type = ?", constants.ApprovalBusinessTypeAgentDistribution).Joins("LEFT JOIN tb_wecom_approval_context wc ON wc.approval_instance_id = r.approval_instance_id AND wc.business_type = ?", constants.ApprovalBusinessTypeAgentDistribution)
|
||||
if userType == constants.UserTypeAgent {
|
||||
shopID := middleware.GetShopIDFromContext(ctx)
|
||||
if shopID == 0 {
|
||||
return query.Where("1 = 0"), nil
|
||||
}
|
||||
query = query.Where("r.parent_shop_id = ?", shopID)
|
||||
} else if parentShopFilter != nil {
|
||||
if userType != constants.UserTypeSuperAdmin && userType != constants.UserTypePlatform {
|
||||
return query, nil
|
||||
}
|
||||
query = query.Where("r.parent_shop_id = ?", *parentShopFilter)
|
||||
}
|
||||
return query, nil
|
||||
}
|
||||
|
||||
func projectRegistration(row registrationProjection) dto.AgentDistributionRegistrationItem {
|
||||
failureSummary := ""
|
||||
if strings.TrimSpace(row.FailureSummary) != "" {
|
||||
failureSummary = "审批提交失败,请检查审批模板与渠道状态"
|
||||
}
|
||||
item := dto.AgentDistributionRegistrationItem{ID: row.ID, Status: row.Status, StatusName: constants.GetAgentDistributionRegistrationStatusName(row.Status), ShopName: row.ShopName, ShopCode: row.ShopCode, Username: row.Username, ContactName: row.ContactName, Phone: row.Phone, Province: row.Province, City: row.City, District: row.District, Address: row.Address, ParentShopID: row.ParentShopID, ParentShopName: row.ParentShopName, DistributionCode: row.DistributionCode, CreatedAt: row.CreatedAt.Format("2006-01-02 15:04:05"), RejectReason: row.RejectReason, ApprovalInstanceID: row.ApprovalInstanceID, ApprovalStatus: row.ApprovalStatus, ApprovalStatusName: constants.GetApprovalStatusName(row.ApprovalStatus), SubmissionStatus: row.SubmissionStatus, FailureSummary: failureSummary}
|
||||
if row.DecidedAt != nil {
|
||||
item.DecidedAt = row.DecidedAt.Format("2006-01-02 15:04:05")
|
||||
}
|
||||
if row.LastRecoveryAt != nil {
|
||||
item.LastRecoveryAt = row.LastRecoveryAt.Format("2006-01-02 15:04:05")
|
||||
}
|
||||
item.SubmissionStatusName = map[int]string{0: "待提交", 1: "发送中", 2: "已提交", 3: "失败", 4: "结果未知"}[row.SubmissionStatus]
|
||||
if item.SubmissionStatusName == "" {
|
||||
item.SubmissionStatusName = "未知"
|
||||
}
|
||||
item.Recoverable = row.Status == constants.AgentDistributionRegistrationStatusPending && row.ParentShopStatus == 1 && row.ApprovalInstanceID > 0 && (row.ApprovalStatus == constants.ApprovalStatusSubmitting || row.ApprovalStatus == constants.ApprovalStatusPending || row.ApprovalStatus == constants.ApprovalStatusSubmissionFailed || row.ApprovalStatus == constants.ApprovalStatusSubmissionUnknown || row.SubmissionStatus == constants.WeComSubmissionStatusFailed || row.SubmissionStatus == constants.WeComSubmissionStatusUnknown)
|
||||
return item
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user