整改一期:发布这条链路先跑顺

四条改动都在"发布一个代喂任务"这条路上:

定位拿不到不再把人卡死。地址可以不带坐标保存,界面标成"未核验定位",
这条地址的打卡照常,只是不比对距离——总比逼着用户放弃发布要好。客户端
另外给了两条退路:去系统设置开权限,或者地图选点。

价格从写死的 30 元改成服务端按物种、城市、每次时长算的推荐价,规则放在
配置里,运营改一次不用等发版;用户改过之后就以他填的为准,不再被覆盖。

发布与支付并成一步:底部常驻"合计 ¥x = n 次 × ¥y",主按钮是"支付并发布"。
没付成的任务留在"我的任务"里能接着付,超过 24 小时由后台关掉,不再变成
既看不见又删不掉的孤儿。

选宠物换成带头像的卡片,缺免疫记录或照片的当场标出来,不用等提交才知道。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Your Name
2026-09-07 10:31:39 +08:00
co-authored by Claude Opus 5
parent 9345805133
commit ebf7189533
6 changed files with 287 additions and 15 deletions
@@ -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)
}
}
}()