fix: TTS时间朗读优化 + 补充要求完成/截止时间

1. 时间格式转中文朗读:"04.28 09:10" → "4月28日9点10分"
2. 补充要求完成时间(preFinishTime)和截止时间(expireTime)
3. 积分读"X分"而非"+X"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
dongliang
2026-05-08 13:29:07 +09:30
parent 032657fb60
commit 26589f0197
2 changed files with 58 additions and 4 deletions

View File

@@ -309,8 +309,12 @@ class TaskDetailFragment : BaseFragment<FragmentTaskDetailBinding>() {
val parts = mutableListOf<String>()
if (detail.name.isNotBlank()) parts.add("任务:${detail.displayName}")
if (detail.positionText.isNotBlank()) parts.add("地点:${detail.positionText}")
if (detail.sendTime.isNotBlank()) parts.add("时间:${detail.sendTime}")
if (detail.point > 0) parts.add("积分:${detail.pointText}")
if (detail.sendTime.isNotBlank()) parts.add("派单时间:${formatTimeForTts(detail.sendTime)}")
when {
!detail.preFinishTime.isNullOrEmpty() -> parts.add("要求完成:${formatTimeForTts(detail.preFinishTime!!)}")
!detail.expireTime.isNullOrEmpty() -> parts.add("截止时间:${formatTimeForTts(detail.expireTime!!)}")
}
if (detail.point > 0) parts.add("积分:${detail.point.toInt()}")
if (detail.content.isNotBlank()) parts.add("备注:${detail.content}")
if (parts.isEmpty()) return
@@ -338,6 +342,27 @@ class TaskDetailFragment : BaseFragment<FragmentTaskDetailBinding>() {
updateTtsButton(playing = false)
}
/**
* 将时间字符串转为适合朗读的中文格式
* "04.28 09:10" → "4月28日9点10分"
* "2026-04-28 09:10:00" → "4月28日9点10分"
*/
private fun formatTimeForTts(time: String): String {
try {
val shortPattern = Regex("""(\d{1,2})\.(\d{1,2})\s+(\d{1,2}):(\d{2})""")
shortPattern.find(time)?.let { match ->
val (month, day, hour, minute) = match.destructured
return "${month.toInt()}${day.toInt()}${hour.toInt()}${minute}"
}
val longPattern = Regex("""(\d{4})-(\d{1,2})-(\d{1,2})\s+(\d{1,2}):(\d{2})""")
longPattern.find(time)?.let { match ->
val (_, month, day, hour, minute) = match.destructured
return "${month.toInt()}${day.toInt()}${hour.toInt()}${minute}"
}
} catch (_: Exception) { }
return time
}
/** 更新 TTS 按钮的 UI 状态 */
private fun updateTtsButton(playing: Boolean) {
binding.btnTts.setImageResource(

View File

@@ -1035,8 +1035,13 @@ class TaskListFragment : BaseFragment<FragmentTaskListBinding>() {
val parts = mutableListOf<String>()
if (detail.name.isNotBlank()) parts.add("任务:${detail.displayName}")
if (detail.positionText.isNotBlank()) parts.add("地点:${detail.positionText}")
if (detail.sendTime.isNotBlank()) parts.add("时间:${detail.sendTime}")
if (detail.point > 0) parts.add("积分:${detail.pointText}")
if (detail.sendTime.isNotBlank()) parts.add("派单时间:${formatTimeForTts(detail.sendTime)}")
// 要求完成时间 / 截止时间(优先要求,和页面显示逻辑一致)
when {
!detail.preFinishTime.isNullOrEmpty() -> parts.add("要求完成:${formatTimeForTts(detail.preFinishTime!!)}")
!detail.expireTime.isNullOrEmpty() -> parts.add("截止时间:${formatTimeForTts(detail.expireTime!!)}")
}
if (detail.point > 0) parts.add("积分:${detail.point.toInt()}")
if (detail.content.isNotBlank()) parts.add("备注:${detail.content}")
if (parts.isEmpty()) return
@@ -1064,6 +1069,30 @@ class TaskListFragment : BaseFragment<FragmentTaskListBinding>() {
updateTtsButton(playing = false)
}
/**
* 将时间字符串转为适合朗读的中文格式
* "04.28 09:10" → "4月28日9点10分"
* "2026-04-28 09:10:00" → "4月28日9点10分"
* 无法解析时返回原文
*/
private fun formatTimeForTts(time: String): String {
try {
// 匹配 "MM.dd HH:mm" 格式
val shortPattern = Regex("""(\d{1,2})\.(\d{1,2})\s+(\d{1,2}):(\d{2})""")
shortPattern.find(time)?.let { match ->
val (month, day, hour, minute) = match.destructured
return "${month.toInt()}${day.toInt()}${hour.toInt()}${minute}"
}
// 匹配 "yyyy-MM-dd HH:mm:ss" 或 "yyyy-MM-dd HH:mm" 格式
val longPattern = Regex("""(\d{4})-(\d{1,2})-(\d{1,2})\s+(\d{1,2}):(\d{2})""")
longPattern.find(time)?.let { match ->
val (_, month, day, hour, minute) = match.destructured
return "${month.toInt()}${day.toInt()}${hour.toInt()}${minute}"
}
} catch (_: Exception) { }
return time
}
/** 更新 TTS 按钮的 UI 状态 */
private fun updateTtsButton(playing: Boolean) {
binding.btnTts.setImageResource(