修复戒烟首页与统计中抽烟/忍住口径混淆
This commit is contained in:
+4
-3
@@ -23,7 +23,8 @@
|
|||||||
- `smoke_time` 可选;不传则默认“当天”。
|
- `smoke_time` 可选;不传则默认“当天”。
|
||||||
- `smoke_at` 可选;真实抽烟时间(格式 `YYYY-MM-DD HH:MM:SS`)。用于“按时间节点分析/AI 建议”;不传则可用 `createtime` 近似。
|
- `smoke_at` 可选;真实抽烟时间(格式 `YYYY-MM-DD HH:MM:SS`)。用于“按时间节点分析/AI 建议”;不传则可用 `createtime` 近似。
|
||||||
- `level/num` 可选;不传时后端会按 `1` 处理。
|
- `level/num` 可选;不传时后端会按 `1` 处理。
|
||||||
- “想抽但忍住了”请传 `level=0` 且 `num=0`,系统以 `num=0` 作为“忍住”的判断条件(计入忍住次数,但不计入抽烟支数)。
|
- `POST /api/v1/smoke/logs` 仅用于“抽烟记录”,`num` 必须 `>0`。
|
||||||
|
- “想抽但忍住了”请使用 `POST /api/v1/smoke/logs/resisted`;系统以 `level=0 且 num=0` 作为“忍住”的判断条件。
|
||||||
|
|
||||||
curl 示例:
|
curl 示例:
|
||||||
|
|
||||||
@@ -73,7 +74,7 @@ curl -X GET 'http://127.0.0.1:8080/api/v1/smoke/logs/5202' \
|
|||||||
- `page`:页码,默认 `1`
|
- `page`:页码,默认 `1`
|
||||||
- `page_size`:每页数量,默认 `20`,最大 `200`
|
- `page_size`:每页数量,默认 `20`,最大 `200`
|
||||||
- `start/end`:可选,按 `smoke_time` 过滤(格式 `YYYY-MM-DD`)
|
- `start/end`:可选,按 `smoke_time` 过滤(格式 `YYYY-MM-DD`)
|
||||||
- `type`:可选,默认 `all`;`smoke` 表示抽烟记录(`num>0`),`resisted` 表示忍住记录(`num=0`)
|
- `type`:可选,默认 `all`;`smoke` 表示抽烟记录(`num>0`),`resisted` 表示忍住记录(`level=0 && num=0`)
|
||||||
|
|
||||||
说明:
|
说明:
|
||||||
- 列表按时间倒序返回(优先 `smoke_at`,其次 `createtime`,最后 `smoke_time`)。
|
- 列表按时间倒序返回(优先 `smoke_at`,其次 `createtime`,最后 `smoke_time`)。
|
||||||
@@ -558,7 +559,7 @@ AI 生成说明:
|
|||||||
字段说明(新增首页字段):
|
字段说明(新增首页字段):
|
||||||
- `last_smoke_at`:上次“实际抽烟”时间(忽略忍住记录),格式 `RFC3339`(含时区)。
|
- `last_smoke_at`:上次“实际抽烟”时间(忽略忍住记录),格式 `RFC3339`(含时区)。
|
||||||
- `today_count`:今日抽烟支数(累加 `num`)。
|
- `today_count`:今日抽烟支数(累加 `num`)。
|
||||||
- `resisted_count`:今日克制次数(`num=0`)。
|
- `resisted_count`:今日克制次数(`level=0 && num=0`)。
|
||||||
- `reduced_from_yesterday`:较昨日减少的支数(允许为负数;为负时表示“今天超出昨日”)。
|
- `reduced_from_yesterday`:较昨日减少的支数(允许为负数;为负时表示“今天超出昨日”)。
|
||||||
- `exceeded_yesterday`:是否超出昨日(`true` 表示今天超出昨日,前端可用作单独标识)。
|
- `exceeded_yesterday`:是否超出昨日(`true` 表示今天超出昨日,前端可用作单独标识)。
|
||||||
|
|
||||||
|
|||||||
@@ -78,6 +78,10 @@ func (h *SmokeHandler) Create(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
num = *req.Num
|
num = *req.Num
|
||||||
}
|
}
|
||||||
|
if num == 0 {
|
||||||
|
c.JSON(http.StatusBadRequest, model.Error(http.StatusBadRequest, "num=0 请使用 /api/v1/smoke/logs/resisted"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if level < 0 || num < 0 {
|
if level < 0 || num < 0 {
|
||||||
c.JSON(http.StatusBadRequest, model.Error(http.StatusBadRequest, "level/num 不能为负数"))
|
c.JSON(http.StatusBadRequest, model.Error(http.StatusBadRequest, "level/num 不能为负数"))
|
||||||
|
|||||||
@@ -494,7 +494,7 @@ func (s *SmokeAINextSmokeService) loadRecent3Days(ctx context.Context, uid int,
|
|||||||
}
|
}
|
||||||
snap := ensure(day)
|
snap := ensure(day)
|
||||||
|
|
||||||
isResisted := l.Num == 0
|
isResisted := l.Level == 0 && l.Num == 0
|
||||||
if isResisted {
|
if isResisted {
|
||||||
snap.ResistedCount++
|
snap.ResistedCount++
|
||||||
} else if l.Num > 0 {
|
} else if l.Num > 0 {
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ func (s *SmokeLogService) List(ctx context.Context, uid int, req ListSmokeLogsRe
|
|||||||
case "smoke":
|
case "smoke":
|
||||||
tx = tx.Where("num > 0")
|
tx = tx.Where("num > 0")
|
||||||
case "resisted":
|
case "resisted":
|
||||||
tx = tx.Where("num = 0")
|
tx = tx.Where("level = 0 AND num = 0")
|
||||||
}
|
}
|
||||||
|
|
||||||
var total int64
|
var total int64
|
||||||
@@ -287,7 +287,7 @@ func (s *SmokeLogService) HomeSummary(ctx context.Context, uid int, asOf time.Ti
|
|||||||
if err := s.db.WithContext(ctx).
|
if err := s.db.WithContext(ctx).
|
||||||
Model(&smokemodel.SmokeLog{}).
|
Model(&smokemodel.SmokeLog{}).
|
||||||
Where("uid = ? AND (deletetime IS NULL OR deletetime = 0)", uid).
|
Where("uid = ? AND (deletetime IS NULL OR deletetime = 0)", uid).
|
||||||
Where("num = 0 AND smoke_time = ?", todayKey).
|
Where("level = 0 AND num = 0 AND smoke_time = ?", todayKey).
|
||||||
Count(&resistedCount).Error; err != nil {
|
Count(&resistedCount).Error; err != nil {
|
||||||
return SmokeHomeSummary{}, fmt.Errorf("count resisted logs: %w", err)
|
return SmokeHomeSummary{}, fmt.Errorf("count resisted logs: %w", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ func (s *SmokeNextService) countResistedLastDays(ctx context.Context, uid int, d
|
|||||||
if err := s.db.WithContext(ctx).
|
if err := s.db.WithContext(ctx).
|
||||||
Model(&smokemodel.SmokeLog{}).
|
Model(&smokemodel.SmokeLog{}).
|
||||||
Where("uid = ? AND (deletetime IS NULL OR deletetime = 0)", uid).
|
Where("uid = ? AND (deletetime IS NULL OR deletetime = 0)", uid).
|
||||||
Where("num = 0").
|
Where("level = 0 AND num = 0").
|
||||||
Where("smoke_time BETWEEN ? AND ?", start.Format("2006-01-02"), end.Format("2006-01-02")).
|
Where("smoke_time BETWEEN ? AND ?", start.Format("2006-01-02"), end.Format("2006-01-02")).
|
||||||
Count(&count).Error; err != nil {
|
Count(&count).Error; err != nil {
|
||||||
return 0, fmt.Errorf("count resisted logs: %w", err)
|
return 0, fmt.Errorf("count resisted logs: %w", err)
|
||||||
|
|||||||
@@ -244,7 +244,7 @@ func (s *SmokeLogService) countResisted(ctx context.Context, uid int, start, end
|
|||||||
if err := s.db.WithContext(ctx).
|
if err := s.db.WithContext(ctx).
|
||||||
Model(&smokemodel.SmokeLog{}).
|
Model(&smokemodel.SmokeLog{}).
|
||||||
Where("uid = ? AND (deletetime IS NULL OR deletetime = 0)", uid).
|
Where("uid = ? AND (deletetime IS NULL OR deletetime = 0)", uid).
|
||||||
Where("num = 0").
|
Where("level = 0 AND num = 0").
|
||||||
Where("smoke_time BETWEEN ? AND ?", start.Format("2006-01-02"), end.Format("2006-01-02")).
|
Where("smoke_time BETWEEN ? AND ?", start.Format("2006-01-02"), end.Format("2006-01-02")).
|
||||||
Count(&count).Error; err != nil {
|
Count(&count).Error; err != nil {
|
||||||
return 0, fmt.Errorf("count resisted: %w", err)
|
return 0, fmt.Errorf("count resisted: %w", err)
|
||||||
|
|||||||
Reference in New Issue
Block a user