Files
junhong_cmp_fiber/pkg/constants/constants.go
break 62419d4b17
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 13m40s
feat(导出时间筛选): AUG26-014 统一时间筛选与临期导出,归档并同步主 Spec 与证据链
统一时间筛选:新增共享严格解析器 pkg/utils/time_range.go,只接受带显式时区的 RFC3339 秒级时间(拒绝小数秒、无时区、date-only、空格分隔、±hhmm、未补零、非法日期与越界偏移),闭区间含两端、归一为 UTC 瞬时,创建期与执行期共用同一份实现。

端点改造(13 个入口):IoT 卡导入任务、设备导入任务、导出任务列表、订单列表参数名不变仅收紧解析;换货、分配记录、代理充值、临期列表改名 start_time/end_time(旧参数名显式拒绝);提现记录两处删除解析失败静默跳过,非法参数一律 1001;授权记录由起始闭结束开改为闭区间含两端;临期列表改按当前生效主套餐最终到期时刻比较,保留剩余天数上下限与既有粗放窗口。

临期导出新建:新场景 expiring_asset 与受控入口 POST /api/admin/expiring-assets/export,复用列表候选预筛与最终到期推算,一行一资产、加油包不单独成行,列序与 111 §18.1 逐列一致,店铺/业务员/用户组按执行时当前归属补充且不超出创建时冻结范围。

佣金明细导出新增按创建时间闭区间筛选(原佣金与回溯两条分支各自创建时间列),记录粒度、列定义与余额口径不变。

冻结与遗留任务:创建期把筛选与时间边界规范化为 UTC RFC3339 秒级串写入既有 query_json,无新列无迁移;执行期只按冻结值严格解析,非法冻结值在任何分片与文件动作前落任务失败并写安全摘要,不放行全量;重试沿用原快照。达量预警导出执行期同样纳入严格解析(其入口契约、列定义与触发快照口径不变)。

归档 add-export-time-filter-standards 并新建主 Spec openspec/specs/export-time-filter/spec.md,同步 requirement-evidence.json 与入口能力矩阵,README 导出场景清单更新为 11 个场景。

验证:junhong_cmp_test + 本地隔离 Redis(DB7,测试部署共享队列 DB6 未被占用)实跑 85 PASS / 0 FAIL(接受/拒绝集合、区间与顺序语义、列表与导出同筛选行集一致、代理 HTTP 全链路与范围冻结、遗留旧格式任务安全失败、列与余额口径回归、表头逐字),门禁 gofmt/go build/gendocs 两次一致/openspec validate/doctor/context-health 全绿;无 Schema 变更、无迁移、无运行时开关。
2026-09-17 18:37:02 +08:00

620 lines
24 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package constants
import (
"time"
"github.com/break/junhong_cmp_fiber/pkg/asynctask"
)
// Fiber Locals 的上下文键
const (
ContextKeyRequestID = "requestid" // 请求记录ID
ContextKeyStartTime = "start_time" // 请求开始时间
ContextKeyUserID = "user_id" // 用户ID
ContextKeyUserType = "user_type" // 用户类型
ContextKeyShopID = "shop_id" // 店铺ID
ContextKeyEnterpriseID = "enterprise_id" // 企业ID
ContextKeyCustomerID = "customer_id" // 个人客户ID
ContextKeyUserInfo = "user_info" // 完整的用户信息
ContextKeyIP = "ip_address" // IP地址
ContextKeyUserAgent = "user_agent" // User-Agent
ContextKeyRequestPath = "request_path" // 请求路径
ContextKeyRequestMethod = "request_method" // 请求方法
ContextKeySubordinateShopIDs = "subordinate_shop_ids" // 下级店铺ID列表代理用户预计算
)
// 配置环境变量
const (
EnvConfigPath = "CONFIG_PATH"
EnvConfigEnv = "CONFIG_ENV" // dev, staging, prod
)
// 默认配置值
const (
DefaultConfigPath = "configs/config.yaml"
DefaultServerAddr = ":3000"
DefaultRedisAddr = "localhost:6379"
)
// 数据库配置常量
const (
DefaultMaxOpenConns = 25
DefaultMaxIdleConns = 10
DefaultConnMaxLifetime = 5 * time.Minute
DefaultPage = 1 // 默认页码
DefaultPageSize = 20
MaxPageSize = 100
SlowQueryThreshold = 500 * time.Millisecond
)
// 任务类型常量
const (
TaskTypeEmailSend = "email:send" // 发送邮件
TaskTypeCommission = "commission:calculate" // 分佣计算
TaskTypeIotCardImport = "iot_card:import" // IoT 卡批量导入
TaskTypeDeviceImport = "device:import" // 设备批量导入
TaskTypeExportDispatch = "export:dispatch" // 导出任务分发
TaskTypeExportShard = "export:shard" // 导出任务分片执行
TaskTypeExportFinalize = "export:finalize" // 导出任务收尾汇总
TaskTypeCommissionStatsUpdate = "commission:stats:update" // 佣金统计更新
TaskTypeCommissionStatsSync = "commission:stats:sync" // 佣金统计同步
TaskTypeCommissionStatsArchive = "commission:stats:archive" // 佣金统计归档
// 轮询任务类型
TaskTypePollingRealname = "polling:realname" // 实名状态检查
TaskTypePollingCarddata = "polling:carddata" // 卡流量检查
TaskTypePollingPackage = "polling:package" // 套餐流量检查
TaskTypePollingProtect = "polling:protect" // 保护期一致性检查
TaskTypePollingCardStatus = "polling:card_status" // 卡开停机状态检查
// 套餐激活任务类型
TaskTypePackageFirstActivation = "package:first:activation" // 首次实名激活
TaskTypePackageQueueActivation = "package:queue:activation" // 主套餐排队激活
TaskTypePackageDataReset = "package:data:reset" // 套餐流量重置
// 订单套餐失效任务类型
TaskTypeOrderPackageInvalidate = "order:package:invalidate" // 批量失效订单套餐
TaskTypeAssetPackageBatchOrder = "asset:package:batch_order" // 资产套餐批量订购
// 店铺负责人 CSV 导入任务类型,独立成队列以隔离逐行执行的长时任务。
TaskTypeShopBusinessOwnerImport = "shop_business_owner:import"
TaskTypePhoneAssetUnbindImport = "phone_asset_unbind:import" // 手机号—资产关联 CSV 解绑导入
// 订单超时任务类型
TaskTypeOrderExpire = "order:expire" // 订单超时自动取消
TaskTypeAutoPurchaseAfterRecharge = "task:auto_purchase_after_recharge" // 充值后自动购包
// 定时任务类型(由 Asynq Scheduler 调度)
TaskTypeAlertCheck = "alert:check" // 告警检查
TaskTypeDataCleanup = "data:cleanup" // 数据清理
TaskTypeNotificationCleanup = "notification:cleanup" // 站内通知保留清理
TaskTypePackageExpiryReminder = "package:expiry:reminder" // 每日套餐临期提醒扫描
TaskTypeDailyTrafficFlush = "traffic:daily:flush" // 每日流量落盘
TaskTypeOutboxDeliver = "outbox:deliver" // 公共 Outbox 事件投递
TaskTypeCardObservationSeries = "card_observation:series" // 卡观测事件序列尝试
TaskTypeWeComApprovalSync = "wecom:approval:sync" // 企业微信审批详情异步同步
TaskTypeWeComApprovalRecovery = "wecom:approval:recovery" // 企业微信审批主动恢复与轮询
TaskTypeAgentRechargeRecovery = "agent_recharge:payment:recovery" // 代理在线充值支付恢复与查单
TaskTypeRefundChannelRecovery = "refund:channel:recovery" // 渠道原路退款结果恢复与查询
TaskTypeRefundCommissionRecovery = "refund:commission:recovery" // 退款佣金回溯后处理补偿
TaskTypePackageTrafficAlertScan = "package:traffic:alert:scan" // 每日套餐真流量达量预警扫描
// 运营商通道流量阈值任务类型(由 Asynq Scheduler 调度)
TaskTypeCarrierThresholdCycle = "carrier_threshold:cycle" // 通道阈值周期处理:跨期解锁与条件复机
TaskTypeCarrierThresholdRecovery = "carrier_threshold:recovery" // 通道阈值停复机结果恢复扫描
// 资产钱包自动续费任务类型(由 Asynq Scheduler 调度)
TaskTypeAssetAutoRenewalScan = "asset_auto_renewal:scan" // 每日自动续费扫描:终态收敛、候选判定与续购执行
TaskTypeAssetAutoRenewalRecovery = "asset_auto_renewal:recovery" // 自动续费复机结果恢复扫描
)
// 用户状态常量
const (
UserStatusActive = "active" // 激活
UserStatusInactive = "inactive" // 未激活
UserStatusSuspended = "suspended" // 暂停
)
// RBAC 用户类型常量
const (
UserTypeSuperAdmin = 1 // 超级管理员(跳过数据权限过滤)
UserTypePlatform = 2 // 平台用户
UserTypeAgent = 3 // 代理账号
UserTypeEnterprise = 4 // 企业账号
UserTypePersonalCustomer = 5 // 个人客户C端用户
)
const (
// AssetResolveTypeCard 表示统一资产详情中的卡类型。
AssetResolveTypeCard = "card"
// ExchangeTraceDirectionPrevious 表示换货链前代查询方向。
ExchangeTraceDirectionPrevious = "previous"
// ExchangeTraceDirectionNext 表示换货链后代查询方向。
ExchangeTraceDirectionNext = "next"
)
// RBAC 角色类型常量
const (
RoleTypePlatform = 1 // 平台角色(适用于平台用户)
RoleTypeCustomer = 2 // 客户角色(适用于代理/企业账号)
)
// RBAC 权限类型常量
const (
PermissionTypeMenu = 1 // 菜单权限
PermissionTypeButton = 2 // 按钮权限
)
// RBAC 权限端口常量
const (
PlatformAll = "all" // 全部端口Web + H5
PlatformWeb = "web" // Web 后台
PlatformH5 = "h5" // H5 端
)
// RBAC 状态常量
const (
StatusDisabled = 0 // 禁用
StatusEnabled = 1 // 启用
)
// 上架状态常量
const (
ShelfStatusOn = 1 // 上架
ShelfStatusOff = 2 // 下架
)
// 套餐周期类型常量
const (
PackageCalendarTypeNaturalMonth = "natural_month" // 自然月周期
PackageCalendarTypeByDay = "by_day" // 按天周期
)
// 套餐生效条件常量
const (
PackageExpiryBaseFromActivation = "from_activation" // 实名激活时生效
PackageExpiryBaseFromPurchase = "from_purchase" // 购买即生效
)
// 套餐流量重置周期常量
const (
PackageDataResetDaily = "daily" // 每日重置
PackageDataResetMonthly = "monthly" // 每月重置
PackageDataResetYearly = "yearly" // 每年重置
PackageDataResetNone = "none" // 不重置
)
// 套餐使用状态常量
const (
PackageUsageStatusPending = 0 // 待生效
PackageUsageStatusActive = 1 // 生效中
PackageUsageStatusDepleted = 2 // 已用完
PackageUsageStatusExpired = 3 // 已过期
PackageUsageStatusInvalidated = 4 // 已失效
)
// 运营商类型常量
const (
CarrierTypeCMCC = "CMCC" // 中国移动
CarrierTypeCUCC = "CUCC" // 中国联通
CarrierTypeCTCC = "CTCC" // 中国电信
CarrierTypeCBN = "CBN" // 中国广电
)
// 订单状态常量
const (
OrderStatusPending = "pending" // 待支付
OrderStatusPaid = "paid" // 已支付
OrderStatusProcessing = "processing" // 处理中
OrderStatusCompleted = "completed" // 已完成
OrderStatusCancelled = "cancelled" // 已取消
)
// 订单超时配置常量
const (
OrderExpireTimeout = 30 * time.Minute // 订单超时时间30分钟
OrderExpireBatchSize = 100 // 每次批量处理超时订单的数量上限
)
// 队列配置常量
const (
QueueCritical = "critical" // 旧版关键任务队列(兼容历史任务)
QueueDefault = "default" // 旧版默认队列(兼容历史任务)
QueueLow = "low" // 旧版低优先级队列(兼容历史任务)
QueueEmailSend = TaskTypeEmailSend // 发送邮件任务队列
QueueCommission = TaskTypeCommission // 分佣计算任务队列
QueueIotCardImport = TaskTypeIotCardImport // IoT 卡导入任务队列
QueueDeviceImport = TaskTypeDeviceImport // 设备导入任务队列
QueueExportDispatch = TaskTypeExportDispatch // 导出分发任务队列
QueueExportShard = TaskTypeExportShard // 导出分片任务队列
QueueExportFinalize = TaskTypeExportFinalize // 导出收尾任务队列
QueueCommissionStatsUpdate = TaskTypeCommissionStatsUpdate // 佣金统计更新任务队列
QueueCommissionStatsSync = TaskTypeCommissionStatsSync // 佣金统计同步任务队列
QueueCommissionStatsArchive = TaskTypeCommissionStatsArchive // 佣金统计归档任务队列
QueuePollingRealname = TaskTypePollingRealname // 实名轮询任务队列
QueuePollingCarddata = TaskTypePollingCarddata // 流量轮询任务队列
QueuePollingPackage = TaskTypePollingPackage // 套餐轮询任务队列
QueuePollingProtect = TaskTypePollingProtect // 保护期轮询任务队列
QueuePollingCardStatus = TaskTypePollingCardStatus // 卡状态轮询任务队列
QueuePackageFirstActivation = TaskTypePackageFirstActivation // 首次实名激活任务队列
QueuePackageQueueActivation = TaskTypePackageQueueActivation // 主套餐排队激活任务队列
QueuePackageDataReset = TaskTypePackageDataReset // 套餐流量重置任务队列
QueueOrderPackageInvalidate = TaskTypeOrderPackageInvalidate // 批量失效订单套餐任务队列
QueueAssetPackageBatchOrder = TaskTypeAssetPackageBatchOrder // 资产套餐批量订购任务队列
QueueShopBusinessOwnerImport = TaskTypeShopBusinessOwnerImport // 店铺负责人 CSV 导入任务队列
QueuePhoneAssetUnbindImport = TaskTypePhoneAssetUnbindImport // 手机号—资产关联 CSV 解绑导入任务队列
QueueOrderExpire = TaskTypeOrderExpire // 订单超时取消任务队列
QueueAutoPurchase = TaskTypeAutoPurchaseAfterRecharge // 充值后自动购包任务队列
QueueAlertCheck = TaskTypeAlertCheck // 告警检查任务队列
QueueDataCleanup = TaskTypeDataCleanup // 数据清理任务队列
QueueDailyTrafficFlush = TaskTypeDailyTrafficFlush // 每日流量落盘任务队列
QueueOutboxDeliver = TaskTypeOutboxDeliver // 公共 Outbox 投递队列
QueueCardObservationSeries = TaskTypeCardObservationSeries // 卡观测事件序列队列
QueueWeComApproval = "wecom:approval" // 企业微信审批同步与恢复队列
DefaultRetryMax = 5 // 默认任务最大重试次数
DefaultTimeout = 10 * time.Minute // 默认任务超时时间
DefaultConcurrency = 10 // 默认 Worker 并发数
)
// QueueForTaskType 根据任务类型返回独立队列名。
func QueueForTaskType(taskType string) string {
switch taskType {
case TaskTypeEmailSend:
return QueueEmailSend
case TaskTypeCommission:
return QueueCommission
case TaskTypeIotCardImport:
return QueueIotCardImport
case TaskTypeDeviceImport:
return QueueDeviceImport
case TaskTypeExportDispatch:
return QueueExportDispatch
case TaskTypeExportShard:
return QueueExportShard
case TaskTypeExportFinalize:
return QueueExportFinalize
case TaskTypeCommissionStatsUpdate:
return QueueCommissionStatsUpdate
case TaskTypeCommissionStatsSync:
return QueueCommissionStatsSync
case TaskTypeCommissionStatsArchive:
return QueueCommissionStatsArchive
case TaskTypePollingRealname:
return QueuePollingRealname
case TaskTypePollingCarddata:
return QueuePollingCarddata
case TaskTypePollingPackage:
return QueuePollingPackage
case TaskTypePollingProtect:
return QueuePollingProtect
case TaskTypePollingCardStatus:
return QueuePollingCardStatus
case TaskTypePackageFirstActivation:
return QueuePackageFirstActivation
case TaskTypePackageQueueActivation:
return QueuePackageQueueActivation
case TaskTypePackageDataReset:
return QueuePackageDataReset
case TaskTypeOrderPackageInvalidate:
return QueueOrderPackageInvalidate
case TaskTypeAssetPackageBatchOrder:
return QueueAssetPackageBatchOrder
case TaskTypeShopBusinessOwnerImport:
return QueueShopBusinessOwnerImport
case TaskTypePhoneAssetUnbindImport:
return QueuePhoneAssetUnbindImport
case TaskTypeOrderExpire:
return QueueOrderExpire
case TaskTypeAutoPurchaseAfterRecharge:
return QueueAutoPurchase
case TaskTypeAlertCheck:
return QueueAlertCheck
case TaskTypeDataCleanup:
return QueueDataCleanup
case TaskTypeNotificationCleanup:
return QueueDataCleanup
case TaskTypePackageExpiryReminder:
return QueueDataCleanup
case TaskTypePackageTrafficAlertScan:
// 与套餐临期扫描同队列:轻量只读扫描,复用既有已监听队列,不新增队列与权重。
return QueueDataCleanup
case TaskTypeDailyTrafficFlush:
return QueueDailyTrafficFlush
case TaskTypeAuditDailyArchive, TaskTypeIntegrationDailyArchive, TaskTypeAuditDailyRetention:
return QueueDataCleanup
case TaskTypeOutboxDeliver:
return QueueOutboxDeliver
case TaskTypeCardObservationSeries:
return QueueCardObservationSeries
case TaskTypeWeComApprovalSync, TaskTypeWeComApprovalRecovery:
return QueueWeComApproval
case TaskTypeAgentRechargeRecovery, TaskTypeRefundChannelRecovery, TaskTypeRefundCommissionRecovery:
return QueueDefault
case TaskTypeCarrierThresholdCycle, TaskTypeCarrierThresholdRecovery:
// 与退款恢复同队列:每分钟轻量扫描,复用既有已监听队列,不新增队列与权重。
return QueueDefault
case TaskTypeAssetAutoRenewalScan, TaskTypeAssetAutoRenewalRecovery:
// 与套餐临期扫描同队列:轻量只读扫描与收敛,复用既有已监听队列,不新增队列与权重。
return QueueDataCleanup
default:
return QueueDefault
}
}
// DefaultTaskQueueWeights 返回 Worker 默认监听的全部任务队列及其权重。
func DefaultTaskQueueWeights() map[string]int {
return map[string]int{
QueueCritical: 6,
QueueIotCardImport: 6,
QueueDeviceImport: 6,
QueueAutoPurchase: 5,
QueuePackageFirstActivation: 5,
QueuePackageQueueActivation: 5,
QueueOrderPackageInvalidate: 5,
QueueAssetPackageBatchOrder: 5,
QueueShopBusinessOwnerImport: 4,
QueuePhoneAssetUnbindImport: 4,
QueueOrderExpire: 4,
QueueEmailSend: 4,
QueueExportDispatch: 4,
QueueExportFinalize: 4,
QueueCommission: 3,
QueueAlertCheck: 3,
QueueExportShard: 2,
QueueCommissionStatsUpdate: 2,
QueueCommissionStatsSync: 2,
QueueCommissionStatsArchive: 2,
QueuePollingRealname: 1,
QueuePollingCarddata: 1,
QueuePollingPackage: 1,
QueuePollingProtect: 1,
QueuePollingCardStatus: 1,
QueuePackageDataReset: 1,
QueueDataCleanup: 1,
QueueDailyTrafficFlush: 1,
QueueOutboxDeliver: 4,
QueueCardObservationSeries: 2,
QueueWeComApproval: 2,
QueueDefault: 1,
QueueLow: 1,
}
}
// 导出任务相关常量
const (
ExportTaskSceneDevice = "device" // 导出场景:设备
ExportTaskSceneIotCard = "iot_card" // 导出场景IoT 卡
ExportTaskSceneOrder = "order" // 导出场景:订单
ExportTaskScenePackage = "package" // 导出场景:套餐
// ExportTaskSceneAgentWalletTransaction 表示代理主钱包流水导出场景。
ExportTaskSceneAgentWalletTransaction = "agent_wallet_transaction"
// ExportTaskSceneAgentRecharge 表示代理充值记录导出场景。
ExportTaskSceneAgentRecharge = "agent_recharge"
// ExportTaskSceneRefund 表示退款记录导出场景。
ExportTaskSceneRefund = "refund"
// ExportTaskSceneExchange 表示换货记录导出场景。
ExportTaskSceneExchange = "exchange"
// ExportTaskSceneCommissionRecord 表示佣金明细导出场景,原佣金与回溯明细各占一行。
ExportTaskSceneCommissionRecord = "commission_record"
// ExportTaskScenePackageTrafficAlert 表示套餐真流量达量预警导出场景,一行对应一条预警记录。
ExportTaskScenePackageTrafficAlert = "package_traffic_alert"
// ExportTaskSceneExpiringAsset 表示临期资产导出场景,一行对应一项资产,取当前生效主套餐最终到期时间。
ExportTaskSceneExpiringAsset = "expiring_asset"
)
// ExportTaskInvalidTimeFilterMessage 是导出任务冻结的时间边界非法时写入 error_message 的安全失败摘要。
// 该摘要不含底层错误细节,只说明任务因冻结筛选非法而终止。
const ExportTaskInvalidTimeFilterMessage = "导出筛选的时间边界非法,任务已终止"
// 导出文件格式常量
const (
ExportTaskFormatXLSX = "xlsx" // 导出格式Excel
ExportTaskFormatCSV = "csv" // 导出格式CSV
)
// 导出主任务状态常量
const (
ExportTaskStatusPending = asynctask.StatusPending // 待处理
ExportTaskStatusProcessing = asynctask.StatusProcessing // 处理中
ExportTaskStatusCompleted = asynctask.StatusCompleted // 已完成
ExportTaskStatusFailed = asynctask.StatusFailed // 已失败
ExportTaskStatusCancelled = asynctask.StatusCancelled // 已取消
)
// 导出分片任务状态常量
const (
ExportShardStatusPending = 1 // 待处理
ExportShardStatusProcessing = 2 // 处理中
ExportShardStatusSuccess = 3 // 已成功
ExportShardStatusFailed = 4 // 已失败
ExportShardStatusCancelled = 5 // 已取消
)
// 导出任务执行配置常量
const (
ExportDefaultShardSize = 2000 // 默认分片大小
ExportDownloadURLExpire = 24 * time.Hour // 下载链接固定有效期
ExportDispatchTaskTimeout = 10 * time.Minute // dispatch 任务超时
ExportShardTaskTimeout = 15 * time.Minute // shard 任务超时
ExportFinalizeTaskTimeout = 10 * time.Minute // finalize 任务超时
ExportFinalizeRetryMax = 30 // finalize 最大重试次数
ExportShardRetryMax = 3 // shard 最大重试次数
ExportDispatchRetryMax = 5 // dispatch 最大重试次数
)
// 店铺配置常量
const (
MaxShopLevel = 7 // 店铺最大层级
)
// 验证码配置常量
const (
VerificationCodeLength = 6 // 验证码长度6位数字
VerificationCodeExpiration = 5 * time.Minute // 验证码过期时间5分钟
VerificationCodeRateLimit = 60 * time.Second // 验证码发送频率限制60秒
)
// ======== 默认超级管理员账号配置(用于系统初始化) ========
// DefaultAdminUsername 默认超级管理员用户名
const DefaultAdminUsername = "admin"
// DefaultAdminPassword 默认超级管理员密码
const DefaultAdminPassword = "Admin@123456"
// DefaultAdminPhone 默认超级管理员手机号
const DefaultAdminPhone = "13800000000"
// ======== 企业卡授权相关常量 ========
// AuthorizerType 授权人类型
const (
AuthorizerTypePlatform = UserTypePlatform // 平台用户授权(2)
AuthorizerTypeAgent = UserTypeAgent // 代理账号授权(3)
)
// 自动代购状态常量(强充二阶段异步购买)
const (
AutoPurchaseStatusPending = "pending" // 待处理
AutoPurchaseStatusSuccess = "success" // 成功
AutoPurchaseStatusFailed = "failed" // 失败
)
// 设备保护期相关时长常量
const (
DeviceProtectPeriodDuration = 1 * time.Hour // 设备停/复机保护期时长1小时
DeviceRefreshCooldownDuration = 30 * time.Second // 设备网关刷新冷却时长30秒
)
// 换货单状态常量
const (
ExchangeStatusPendingInfo = 1 // 待填写信息(等待客户端填写收货地址)
ExchangeStatusPendingShip = 2 // 待发货(客户端已填写,等待后台发货)
ExchangeStatusShipped = 3 // 已发货待确认(后台已发货,等待确认完成)
ExchangeStatusCompleted = 4 // 已完成
ExchangeStatusCancelled = 5 // 已取消
)
// 换货流程类型常量
const (
ExchangeFlowTypeShipping = "shipping" // 物流换货
ExchangeFlowTypeDirect = "direct" // 直接换货
)
// 换货资产类型常量
const (
ExchangeAssetTypeIotCard = "iot_card" // 物联网卡
ExchangeAssetTypeDevice = "device" // 设备
)
// 换货业务数据迁移状态常量
// 与 tb_exchange_order 的 chk_exchange_order_migration_status 取值白名单保持一致。
const (
ExchangeMigrationStatusNotMigrated = "not_migrated" // 不迁移(未选择业务数据迁移)
ExchangeMigrationStatusPending = "pending" // 待迁移(已选择迁移但尚未成功完成)
ExchangeMigrationStatusMigrated = "migrated" // 已迁移(完整迁移成功)
ExchangeMigrationStatusFailed = "failed" // 迁移失败(最近一次迁移执行失败,可再次确认完成重试)
)
// GetStatusName 获取通用启用/禁用状态名称
// 用于 status 字段0=禁用, 1=启用
func GetStatusName(status int) string {
switch status {
case StatusDisabled:
return "禁用"
case StatusEnabled:
return "启用"
default:
return "未知"
}
}
// GetShelfStatusName 获取上架状态名称
// 用于 shelf_status 字段1=上架, 2=下架
func GetShelfStatusName(status int) string {
switch status {
case ShelfStatusOn:
return "上架"
case ShelfStatusOff:
return "下架"
default:
return "未知"
}
}
// GetExportTaskStatusName 获取导出主任务状态名称
func GetExportTaskStatusName(status int) string {
name := asynctask.StatusName(status)
if name == "" {
return "未知"
}
return name
}
// GetExportShardStatusName 获取导出分片任务状态名称
func GetExportShardStatusName(status int) string {
switch status {
case ExportShardStatusPending:
return "待处理"
case ExportShardStatusProcessing:
return "处理中"
case ExportShardStatusSuccess:
return "已成功"
case ExportShardStatusFailed:
return "已失败"
case ExportShardStatusCancelled:
return "已取消"
default:
return "未知"
}
}
// GetExchangeStatusName 获取换货单状态名称
// 用于 exchange_status 字段
func GetExchangeStatusName(status int) string {
switch status {
case ExchangeStatusPendingInfo:
return "待填写信息"
case ExchangeStatusPendingShip:
return "待发货"
case ExchangeStatusShipped:
return "已发货待确认"
case ExchangeStatusCompleted:
return "已完成"
case ExchangeStatusCancelled:
return "已取消"
default:
return "未知"
}
}
// GetExchangeFlowTypeName 获取换货流程类型名称
func GetExchangeFlowTypeName(flowType string) string {
switch flowType {
case "", ExchangeFlowTypeShipping:
return "物流换货"
case ExchangeFlowTypeDirect:
return "直接换货"
default:
return "未知"
}
}
// GetExchangeMigrationStatusName 获取换货业务数据迁移状态名称
// 用于 migration_status 字段
func GetExchangeMigrationStatusName(status string) string {
switch status {
case ExchangeMigrationStatusNotMigrated:
return "不迁移"
case ExchangeMigrationStatusPending:
return "待迁移"
case ExchangeMigrationStatusMigrated:
return "已迁移"
case ExchangeMigrationStatusFailed:
return "迁移失败"
default:
return "未知"
}
}