historyList.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <template>
  2. <view class="historyList padding30">
  3. <z-paging
  4. ref="pagingRef"
  5. class="paginng-contaner"
  6. :default-page-size="20"
  7. :use-refresher-status-bar-placeholder="true"
  8. v-model="list"
  9. @query="handleQuery"
  10. >
  11. <view class="bg_color_fff padding20 border_radius_20">
  12. <u-search placeholder="查找对话内容" v-model="keyword"
  13. @search="reloadList" @custom="reloadList" @clear="reloadList"
  14. :showAction="false" borderColor="#ffffff"></u-search>
  15. </view>
  16. <view class="padding20" v-for="group in groupedList" :key="group.date">
  17. <view>{{group.date}}</view>
  18. <view class="flex-between padding20 bg_color_fff border_radius_20 mt10"
  19. v-for="message in group.messages" :key="message.sessionId">
  20. <view class="payment-radio mr20" @click="checkboxChange(message.sessionId)">
  21. <view
  22. class="radio-circle"
  23. :class="{ checked: selected.includes(message.sessionId) }"
  24. ></view>
  25. </view>
  26. <image src="/static/img/wenhua.png" class="mr20" mode="" style="width: 40rpx;height: 40rpx;"/>
  27. <view class="flex_1 mr20" @click="add(message.sessionId)">{{message.firstMessageContent}}</view>
  28. <text class="gray font_size20">{{message.HS}}</text>
  29. </view>
  30. </view>
  31. <view class="footplaceholder"></view>
  32. <!-- foot -->
  33. <view class="foot bg_color_fff flex-center-between">
  34. <view class="order_btn paddingTB20 flex_1 text_align_center mr20 plain" @click="del">删除</view>
  35. <view class="order_btn paddingTB20 flex_1 text_align_center" @click="add">新增会话</view>
  36. </view>
  37. </z-paging>
  38. </view>
  39. </template>
  40. <script setup>
  41. import { ref, computed } from 'vue'
  42. import dayjs from 'dayjs'
  43. import { chatHistoryList, delChatHistoryList } from '@/api/ai'
  44. import { useAppStore } from '@/stores/app'
  45. const appStore = useAppStore();
  46. const pagingRef = ref();
  47. const keyword = ref('');
  48. const list = ref([]);
  49. const selected = ref([]);
  50. function checkboxChange(sessionId){
  51. if(selected.value.includes(sessionId)){
  52. selected.value = selected.value.filter(item => item !== sessionId);
  53. }else{
  54. selected.value.push(sessionId);
  55. }
  56. }
  57. function del(){
  58. if(selected.value.length==0){
  59. uni.showToast({
  60. title: '请选择要删除的会话',
  61. icon: 'none'
  62. });
  63. return;
  64. }
  65. uni.showModal({
  66. title: '提示',
  67. content: '确定要删除吗?',
  68. success: function (res) {
  69. if (res.confirm) {
  70. delChatHistoryList(selected.value).then(res => {
  71. if(res.code == 200){
  72. uni.showToast({
  73. title: '删除成功',
  74. icon: 'success'
  75. });
  76. selected.value = [];
  77. reloadList();
  78. }
  79. })
  80. } else if (res.cancel) {
  81. console.log('用户点击取消');
  82. }
  83. }
  84. });
  85. }
  86. //跳转ai页面
  87. function add(sessionId){
  88. if(sessionId) appStore.sessionId = sessionId;
  89. uni.switchTab({
  90. url: '/pages/ai/ai'
  91. });
  92. }
  93. function reloadList(item) {
  94. pagingRef.value.reload();
  95. }
  96. // 下拉刷新和滚动底部会自动触发此方法
  97. async function handleQuery(page, pageSize, from) {
  98. try {
  99. const params = {
  100. pageNum: page,
  101. pageSize,
  102. agentId:appStore.agentId,
  103. };
  104. const { rows } = await chatHistoryList(params);
  105. pagingRef.value.complete(rows);
  106. } catch (e) {
  107. console.log('msg-comment',e)
  108. pagingRef.value.complete(false);
  109. }
  110. }
  111. const groupedList = computed(() => {
  112. const groups = {};
  113. list.value.forEach(message => {
  114. const date = dayjs(message.firstMessageTime);
  115. const today = dayjs().startOf('day');
  116. const yesterday = today.subtract(1, 'day');
  117. message.HS=date.format('HH:mm');
  118. let groupKey;
  119. if (date.isSame(today, 'day')) {
  120. groupKey = '今天';
  121. } else if (date.isSame(yesterday, 'day')) {
  122. groupKey = '昨天';
  123. } else {
  124. groupKey = date.format('YYYY-MM-DD');
  125. }
  126. if (!groups[groupKey]) {
  127. groups[groupKey] = [];
  128. }
  129. groups[groupKey].push(message);
  130. });
  131. // 转换并排序
  132. return Object.keys(groups)
  133. .map(key => ({
  134. date: key,
  135. messages: groups[key]
  136. }))
  137. .sort((a, b) => {
  138. // 按日期倒序排列
  139. if (a.date === '今天') return -1;
  140. if (b.date === '今天') return 1;
  141. if (a.date === '昨天') return -1;
  142. if (b.date === '昨天') return 1;
  143. return new Date(b.date) - new Date(a.date);
  144. });
  145. });
  146. </script>
  147. <style lang="less" scoped>
  148. .historyList{
  149. }
  150. </style>