fix: 编辑表单时签到地址错误显示为管理员范围名称的问题
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/tag/build Pipeline was successful

当任务没有历史已签到数据时,ParseFormJson 中 histRows 回退到 rows
(当前任务定义),此时 signPlaceSelected 包含的是管理员后台圈定范围的
数据(范围名称如"7"),而不是用户实际签到地址。

修复:
1. ParseFormJson: 只有有实际历史数据(historyRows 存在)时才从
   signPlaceSelected 提取地址/经纬度,否则跳过
2. QueryFormByTitle: 当前任务自身已签到时,不再将自身 rows 作为
   historyRows,让逻辑正常从历史月份查找其他已签到实例
This commit is contained in:
becomer
2026-07-04 00:48:58 +08:00
parent a41341e732
commit 65293c4f81
2 changed files with 42 additions and 30 deletions
+21 -15
View File
@@ -227,10 +227,11 @@ func (c *CpdailyAutoSignTask) QueryFormByTitle(ctx context.Context, titleGlob st
// 尝试从已签到的历史任务中获取历史数据用于预填充
signedMatch := findMatchTitle(signedTasks)
if signedMatch != nil {
// 如果已签到任务与当前匹配任务是同一个,直接用已有数据作为历史(避免重复API调用)
// 如果已签到任务与当前匹配任务是同一个,不设置 historyRows
// 因为同一任务的 signPlaceSelected 包含的是管理员圈定范围数据,不是实际签到地址
if matchTask != nil && signedMatch["signInstanceWid"] != nil && matchTask["signInstanceWid"] != nil &&
signedMatch["signInstanceWid"].String() == matchTask["signInstanceWid"].String() {
result["historyRows"] = result["rows"]
// 不设置 historyRows,让后面从历史月份查找
} else {
histResp, histErr := c.client.R().
SetBody(map[string]*gvar.Var{
@@ -442,9 +443,11 @@ func (c *CpdailyAutoSignTask) ParseFormJson(ctx context.Context, rawJson map[str
// 优先从 historyRows(已签到的历史任务详情)中提取历史值,否则从 rows 中提取
histRows := rows
hasHistory := false
if hr := rawJson["historyRows"]; hr != nil {
if hrMap := hr.MapStrVar(); len(hrMap) > 0 {
histRows = hrMap
hasHistory = true
}
}
@@ -456,19 +459,22 @@ func (c *CpdailyAutoSignTask) ParseFormJson(ctx context.Context, rawJson map[str
histSignPhotoUrl := ""
histIsMalposition := ""
// 优先从 signPlaceSelected 提取经纬度和地址
if sps := histRows["signPlaceSelected"]; sps != nil && sps.String() != "" && sps.String() != "[]" {
placeArr := gjson.Parse(sps.String()).Array()
if len(placeArr) > 0 {
place := placeArr[0]
lng := place.Get("longitude").String()
lat := place.Get("latitude").String()
addr := place.Get("address").String()
if lng != "" && lat != "" {
histLatAndLon = lng + "," + lat
}
if addr != "" {
histAddress = addr
// 只有有真实的已签到历史数据时,才从 signPlaceSelected 提取
// 否则 signPlaceSelected 包含的是管理员圈定范围的数据(范围名称可能为纯数字如"7"),不是实际签到地址
if hasHistory {
if sps := histRows["signPlaceSelected"]; sps != nil && sps.String() != "" && sps.String() != "[]" {
placeArr := gjson.Parse(sps.String()).Array()
if len(placeArr) > 0 {
place := placeArr[0]
lng := place.Get("longitude").String()
lat := place.Get("latitude").String()
addr := place.Get("address").String()
if lng != "" && lat != "" {
histLatAndLon = lng + "," + lat
}
if addr != "" {
histAddress = addr
}
}
}
}
+21 -15
View File
@@ -281,10 +281,11 @@ func (c *CpdailySleepCheckTask) QueryFormByTitle(ctx context.Context, titleGlob
// 无论当前任务是否已签到,都尝试获取历史数据
signedMatch := findMatchTitle(signedTasks)
if signedMatch != nil {
// 如果已签到任务与当前匹配任务是同一个,直接用已有数据作为历史(避免重复API调用)
// 如果已签到任务与当前匹配任务是同一个,不设置 historyRows
// 因为同一任务的 signPlaceSelected 包含的是管理员圈定范围数据,不是实际签到地址
if matchTask != nil && signedMatch["signInstanceWid"] != nil && matchTask["signInstanceWid"] != nil &&
signedMatch["signInstanceWid"].String() == matchTask["signInstanceWid"].String() {
result["historyRows"] = result["rows"]
// 不设置 historyRows,让后面从历史月份查找
} else {
histResp, histErr := c.client.R().
SetBody(map[string]*gvar.Var{
@@ -518,9 +519,11 @@ func (c *CpdailySleepCheckTask) ParseFormJson(ctx context.Context, rawJson map[s
// 优先从 historyRows(已签到的历史任务详情)中提取历史值,否则从 rows 中提取
histRows := rows
hasHistory := false
if hr := rawJson["historyRows"]; hr != nil {
if hrMap := hr.MapStrVar(); len(hrMap) > 0 {
histRows = hrMap
hasHistory = true
}
}
@@ -533,19 +536,22 @@ func (c *CpdailySleepCheckTask) ParseFormJson(ctx context.Context, rawJson map[s
histSignPhotoUrl := ""
histIsMalposition := ""
// 优先从 signPlaceSelected 提取经纬度和地址
if sps := histRows["signPlaceSelected"]; sps != nil && sps.String() != "" && sps.String() != "[]" {
placeArr := gjson.Parse(sps.String()).Array()
if len(placeArr) > 0 {
place := placeArr[0]
lng := place.Get("longitude").String()
lat := place.Get("latitude").String()
addr := place.Get("address").String()
if lng != "" && lat != "" {
histLatAndLon = lng + "," + lat
}
if addr != "" {
histAddress = addr
// 只有有真实的已签到历史数据时,才从 signPlaceSelected 提取
// 否则 signPlaceSelected 包含的是管理员圈定范围的数据(范围名称可能为纯数字如"7"),不是实际签到地址
if hasHistory {
if sps := histRows["signPlaceSelected"]; sps != nil && sps.String() != "" && sps.String() != "[]" {
placeArr := gjson.Parse(sps.String()).Array()
if len(placeArr) > 0 {
place := placeArr[0]
lng := place.Get("longitude").String()
lat := place.Get("latitude").String()
addr := place.Get("address").String()
if lng != "" && lat != "" {
histLatAndLon = lng + "," + lat
}
if addr != "" {
histAddress = addr
}
}
}
}