当前位置: 首页 > news >正文

山东大学创新实训项目个人博客——第七篇

本周完成内容:
1.导航界面的流式输出与历史对话查询功能;


2.适配新的会话历史查询api,增加agent_type参数,使得三个阶段的对话历史可以分开查询;


3.康复界面搭建和api适配。

前两项任务不再赘述。

康复界面设计如下,上部分使用一个镶嵌在抽屉组件里的日历组件来展示日程、每一天的日程详情,抽屉可以收起以展示更多对话;中间部分使用前几次博客中提到的ChatScreen组件展示对话;下部分使用前面搭建的InputBox组件来供用户输入消息和多模态文件:

//可折叠日历组件 AnimatedVisibility( visible = uiState.showCalendar, enter = expandVertically(), exit = shrinkVertically() ) { Box( modifier = Modifier .fillMaxWidth() .fillMaxHeight(fraction = 0.4f) .background(colorResource(id = R.color.primaryContainer)) ) { CalendarPanel( schedules = allSchedules, selectedDate = uiState.selectedDate, onSelectDate = { viewModel.selectDate(it) }, onShowDetail = { viewModel.showScheduleDetail(it) } ) } }

其他功能与前几期博客实现的差不太多,这里主要看一下批量添加功能是如何实现的:

批量添加模式的有关参数:

val isBatchMode: Boolean = false, // 是否开启批量模式 val batchEveryNDays: Int = 1, // 每隔N天执行一次 val batchTotalTimes: Int = 7, // 总执行次数 val batchTimesPerDay: Int = 1, // 每天执行次数 val batchHourSlots: List<Int> = listOf(9), // 每个时段的小时列表 val batchMinuteSlots: List<Int> = listOf(0) // 每个时段的分钟列表

使用这些参数在前端通过数次调用api手动完成批量添加日程:

private fun submitBatchSchedules(state: RehabilitationUiState) { val taskType = state.newScheduleTaskType val taskContent = state.newScheduleContent.trim() val startDate = runCatching { LocalDate.parse(state.newScheduleDate, DateTimeFormatter.ISO_LOCAL_DATE) }.getOrNull() if (startDate == null) { _uiState.update { it.copy(errorMessage = "日期格式错误") }; return } val everyN = state.batchEveryNDays val totalTimes = state.batchTotalTimes val timesPerDay = state.batchTimesPerDay val slots = state.batchHourSlots val totalRequests = totalTimes * timesPerDay Log.d(TAG, "batch: totalRequests=$totalRequests, every${everyN}天, ${totalTimes}次, 每天${timesPerDay}次") _uiState.update { it.copy(isAddingSchedule = true, errorMessage = null) } var completed = 0 for (batchIdx in 0 until totalTimes) { val date = startDate.plusDays(batchIdx.toLong() * everyN.toLong()) for (slotIdx in 0 until timesPerDay) { val slot = if (slotIdx < slots.size) slots[slotIdx] else IntPair(8, 0) val executeTime = date.format(DateTimeFormatter.ISO_LOCAL_DATE) + "T" + slot.toTimeStr() val request = RehabScheduleAddRequest(taskType = taskType, taskContent = taskContent, executeTime = executeTime) val call = NetworkUtil.request( ApiService.api.rehabAddSchedule(request), object : NetworkCallback<BaseResponse<RehabSchedule>> { override fun onSuccess(data: BaseResponse<RehabSchedule>) { completed++ if (data.code == "0" && data.data != null) { val schedules = _uiState.value.schedules.toMutableList() schedules.add(data.data) _uiState.update { it.copy(schedules = schedules) } } if (completed >= totalRequests) finishBatchAdd() } override fun onFailure(error: String) { completed++ if (completed >= totalRequests) finishBatchAdd() } } ) pendingCalls.add(call) } } }

从logcat的输出可以看出这种实现方案有效:

不过最佳的方案还是在后端就提供方法接口。

目前项目还存在导航推荐医院api概率超时、康复对话api稳定超时、康复对话生成康复计划逻辑不清晰等问题,需要前后端进行联调。此外还缺少一个查询日程的api。这些也是下周的工作内容。

http://www.jsqmd.com/news/974884/

相关文章:

  • 如何免费突破网盘限速:LinkSwift直链下载助手完整使用指南
  • ComfyUI-FramePackWrapper:8GB显存流畅生成AI视频的终极指南
  • 别再手动写报表了!用Stimulsoft.Reports.js + Vue CLI 5分钟搞定数据可视化
  • 丽江黄金上门回收避坑指南:6家正规店铺实测排名,2026年6月报价全公开 - 余生黄金回收
  • 项目生命周期,重点是:构建、打包、发布分别是什么意思?
  • STM32 PID温度控制实战:从零开始构建你的智能温控系统
  • 性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
  • ViGEmBus虚拟游戏控制器驱动:终极完整指南与安装教程
  • 嵌入式串口通信:中断驱动环形缓冲区设计与C语言实现
  • 南京大学LaTeX论文模板:5分钟快速上手指南
  • 69.x的平方根
  • 5个常见游戏串流痛点:Sunshine开源方案如何彻底解决?
  • 如何在CS2中实现跨平台游戏增强:Osiris完整指南
  • MIFARE Ultralight AES安全芯片:低成本应用的AES-128与CMAC实战指南
  • Motorola 8位MCU SDK:硬件抽象与静态配置的嵌入式开发实践
  • 抖音视频批量下载神器:douyin-downloader 让你的收藏永不丢失
  • 天龙八部GM工具终极指南:一键掌握游戏数据管理的完整解决方案
  • Steam创意工坊下载终极指南:三步搞定跨平台模组获取
  • 3步快速找回压缩包密码:ArchivePasswordTestTool终极指南
  • Steam创意工坊跨平台模组下载技术架构解析
  • 小学期学习报告-4
  • Web Components主题热切换方案揭秘
  • DSP56311嵌入式音频均衡器:从IIR滤波器设计到EFCOP硬件加速实现
  • Magnet2Torrent:磁力链接到种子文件的自动化转换技术解决方案
  • 从68HC908MR24到MR32的嵌入式MCU升级:硬件兼容与软件迁移实战
  • 如何快速下载网页视频和音频:猫抓Cat-Catch浏览器扩展完整指南
  • m4s-converter:5分钟解锁B站缓存视频,让你的离线收藏重获新生!
  • 4大实战模块深度解析:Win11Debloat如何实现Windows系统精简与性能优化
  • DSP56301 HI32 PCI主控与Scatter/Gather DMA技术详解
  • 谷歌ads搜索广告叫什么名字?英语渣也能自己投的5个实操步骤