整改一期:发布这条链路先跑顺
四条改动都在"发布一个代喂任务"这条路上: 定位拿不到不再把人卡死。地址可以不带坐标保存,界面标成"未核验定位", 这条地址的打卡照常,只是不比对距离——总比逼着用户放弃发布要好。客户端 另外给了两条退路:去系统设置开权限,或者地图选点。 价格从写死的 30 元改成服务端按物种、城市、每次时长算的推荐价,规则放在 配置里,运营改一次不用等发版;用户改过之后就以他填的为准,不再被覆盖。 发布与支付并成一步:底部常驻"合计 ¥x = n 次 × ¥y",主按钮是"支付并发布"。 没付成的任务留在"我的任务"里能接着付,超过 24 小时由后台关掉,不再变成 既看不见又删不掉的孤儿。 选宠物换成带头像的卡片,缺免疫记录或照片的当场标出来,不用等提交才知道。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
9345805133
commit
ebf7189533
@@ -365,6 +365,27 @@ func (a *App) autoConfirmFeedTasks(ctx context.Context) int {
|
||||
return settled
|
||||
}
|
||||
|
||||
// closeStaleUnpaidTasks clears out tasks that were created but never paid for.
|
||||
// Without it they sit in "我的任务" forever looking published, which is exactly
|
||||
// the confusion the pay-then-publish change is meant to remove.
|
||||
func (a *App) closeStaleUnpaidTasks(ctx context.Context) int64 {
|
||||
hours := a.configInt(ctx, "pet.feed_unpaid_close_hours", 24)
|
||||
if hours < 1 {
|
||||
hours = 24
|
||||
}
|
||||
result, err := a.db.ExecContext(ctx, `UPDATE pet_feed_tasks SET status='CANCELLED'
|
||||
WHERE status='CREATED' AND created_at<DATE_SUB(NOW(3),INTERVAL ? HOUR)`, hours)
|
||||
if err != nil {
|
||||
log.Printf("pet feed: 关闭超时未支付任务失败: %v", err)
|
||||
return 0
|
||||
}
|
||||
affected, _ := result.RowsAffected()
|
||||
if affected > 0 {
|
||||
log.Printf("pet feed: 关闭了 %d 个超过 %d 小时未支付的任务", affected, hours)
|
||||
}
|
||||
return affected
|
||||
}
|
||||
|
||||
func (a *App) startFeedSettlementWorker(ctx context.Context) {
|
||||
go func() {
|
||||
ticker := time.NewTicker(5 * time.Minute)
|
||||
@@ -375,6 +396,7 @@ func (a *App) startFeedSettlementWorker(ctx context.Context) {
|
||||
return
|
||||
case <-ticker.C:
|
||||
a.autoConfirmFeedTasks(ctx)
|
||||
a.closeStaleUnpaidTasks(ctx)
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
Reference in New Issue
Block a user