|
@ -25,23 +25,23 @@ |
|
|
<div v-if="isCollapsed" class="collapsed-bottom-container"> |
|
|
<div v-if="isCollapsed" class="collapsed-bottom-container"> |
|
|
<div |
|
|
<div |
|
|
class="collapsed-bottom-btn" |
|
|
class="collapsed-bottom-btn" |
|
|
@click="handleFeedbackClick" |
|
|
|
|
|
title="用户反馈" |
|
|
|
|
|
|
|
|
@click="handleAnnouncementClick" |
|
|
|
|
|
title="公告" |
|
|
> |
|
|
> |
|
|
<img |
|
|
<img |
|
|
class="collapsed-bottom-feedback" |
|
|
|
|
|
src="https://d31zlh4on95l9h.cloudfront.net/images/41d6e25c19466718d462bcee2f050140.png" |
|
|
|
|
|
|
|
|
class="collapsed-bottom-announcement" |
|
|
|
|
|
src="https://d31zlh4on95l9h.cloudfront.net/images/c51c7fbb68671729801fb10d65bd7789.png" |
|
|
alt="icon" |
|
|
alt="icon" |
|
|
/> |
|
|
/> |
|
|
</div> |
|
|
</div> |
|
|
<div |
|
|
<div |
|
|
class="collapsed-bottom-btn" |
|
|
class="collapsed-bottom-btn" |
|
|
@click="handleAnnouncementClick" |
|
|
|
|
|
title="公告" |
|
|
|
|
|
|
|
|
@click="handleFeedbackClick" |
|
|
|
|
|
title="用户反馈" |
|
|
> |
|
|
> |
|
|
<img |
|
|
<img |
|
|
class="collapsed-bottom-announcement" |
|
|
|
|
|
src="https://d31zlh4on95l9h.cloudfront.net/images/c51c7fbb68671729801fb10d65bd7789.png" |
|
|
|
|
|
|
|
|
class="collapsed-bottom-feedback" |
|
|
|
|
|
src="https://d31zlh4on95l9h.cloudfront.net/images/41d6e25c19466718d462bcee2f050140.png" |
|
|
alt="icon" |
|
|
alt="icon" |
|
|
/> |
|
|
/> |
|
|
</div> |
|
|
</div> |
|
@ -96,11 +96,27 @@ |
|
|
</div> |
|
|
</div> |
|
|
<div class="record-msg"> |
|
|
<div class="record-msg"> |
|
|
<div class="record-text"> |
|
|
<div class="record-text"> |
|
|
<span class="stock-name">{{ record.stockName || record.stockCode }}</span> |
|
|
|
|
|
|
|
|
<span class="stock-name">{{ record.stockName }}</span> |
|
|
<span class="stock-code">({{ record.stockCode }})</span> |
|
|
<span class="stock-code">({{ record.stockCode }})</span> |
|
|
|
|
|
<div v-if="history.name === '置顶'"> |
|
|
|
|
|
<svg |
|
|
|
|
|
t="1755227529729" |
|
|
|
|
|
class="top-icon" |
|
|
|
|
|
viewBox="320 280 380 460" |
|
|
|
|
|
version="1.1" |
|
|
|
|
|
xmlns="http://www.w3.org/2000/svg" |
|
|
|
|
|
p-id="7392" |
|
|
|
|
|
> |
|
|
|
|
|
<path |
|
|
|
|
|
d="M351.085714 292.571429h321.828572v29.257142H351.085714v-29.257142z m175.542857 125.805714l146.285715 146.285714-20.48 20.48-125.805715-125.805714V731.428571h-29.257142v-272.091428L371.565714 585.142857l-20.48-20.48 146.285715-146.285714h29.257142z" |
|
|
|
|
|
fill="#FFFFFF" |
|
|
|
|
|
p-id="7393" |
|
|
|
|
|
></path> |
|
|
|
|
|
</svg> |
|
|
|
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
<div class="record-time"> |
|
|
<div class="record-time"> |
|
|
{{ moment(record.updatedTime).format("YYYY-MM-DD HH:mm:ss") }} |
|
|
|
|
|
|
|
|
{{ moment(record.createdTime).format("YYYY-MM-DD HH:mm:ss") }} |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
@ -170,17 +186,17 @@ |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="bottom-container"> |
|
|
<div class="bottom-container"> |
|
|
<div class="bottom-btn" @click="handleFeedbackClick" title="用户反馈"> |
|
|
|
|
|
|
|
|
<div class="bottom-btn" @click="handleAnnouncementClick" title="公告"> |
|
|
<img |
|
|
<img |
|
|
class="bottom-feedback" |
|
|
|
|
|
src="https://d31zlh4on95l9h.cloudfront.net/images/41d6e25c19466718d462bcee2f050140.png" |
|
|
|
|
|
|
|
|
class="bottom-announcement" |
|
|
|
|
|
src="https://d31zlh4on95l9h.cloudfront.net/images/c51c7fbb68671729801fb10d65bd7789.png" |
|
|
alt="icon" |
|
|
alt="icon" |
|
|
/> |
|
|
/> |
|
|
</div> |
|
|
</div> |
|
|
<div class="bottom-btn" @click="handleAnnouncementClick" title="公告"> |
|
|
|
|
|
|
|
|
<div class="bottom-btn" @click="handleFeedbackClick" title="用户反馈"> |
|
|
<img |
|
|
<img |
|
|
class="bottom-announcement" |
|
|
|
|
|
src="https://d31zlh4on95l9h.cloudfront.net/images/c51c7fbb68671729801fb10d65bd7789.png" |
|
|
|
|
|
|
|
|
class="bottom-feedback" |
|
|
|
|
|
src="https://d31zlh4on95l9h.cloudfront.net/images/41d6e25c19466718d462bcee2f050140.png" |
|
|
alt="icon" |
|
|
alt="icon" |
|
|
/> |
|
|
/> |
|
|
</div> |
|
|
</div> |
|
@ -242,9 +258,27 @@ |
|
|
/> |
|
|
/> |
|
|
</div> |
|
|
</div> |
|
|
<div class="record-msg"> |
|
|
<div class="record-msg"> |
|
|
<div class="record-text">{{ record.stockCode }}</div> |
|
|
|
|
|
|
|
|
<div class="record-text"> |
|
|
|
|
|
{{ record.stockCode }} |
|
|
|
|
|
<div v-if="history.name === '置顶'"> |
|
|
|
|
|
<svg |
|
|
|
|
|
t="1755227529729" |
|
|
|
|
|
class="top-icon" |
|
|
|
|
|
viewBox="320 280 380 460" |
|
|
|
|
|
version="1.1" |
|
|
|
|
|
xmlns="http://www.w3.org/2000/svg" |
|
|
|
|
|
p-id="7392" |
|
|
|
|
|
> |
|
|
|
|
|
<path |
|
|
|
|
|
d="M351.085714 292.571429h321.828572v29.257142H351.085714v-29.257142z m175.542857 125.805714l146.285715 146.285714-20.48 20.48-125.805715-125.805714V731.428571h-29.257142v-272.091428L371.565714 585.142857l-20.48-20.48 146.285715-146.285714h29.257142z" |
|
|
|
|
|
fill="#FFFFFF" |
|
|
|
|
|
p-id="7393" |
|
|
|
|
|
></path> |
|
|
|
|
|
</svg> |
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
<div class="record-time"> |
|
|
<div class="record-time"> |
|
|
{{ moment(record.updatedTime).format("YYYY-MM-DD HH:mm:ss") }} |
|
|
|
|
|
|
|
|
{{ moment(record.createdTime).format("YYYY-MM-DD HH:mm:ss") }} |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
@ -316,27 +350,27 @@ |
|
|
<div class="mobile-bottom-container"> |
|
|
<div class="mobile-bottom-container"> |
|
|
<div |
|
|
<div |
|
|
class="mobile-bottom-btn" |
|
|
class="mobile-bottom-btn" |
|
|
@click="handleFeedbackClick" |
|
|
|
|
|
title="用户反馈" |
|
|
|
|
|
|
|
|
@click="handleAnnouncementClick" |
|
|
|
|
|
title="公告" |
|
|
> |
|
|
> |
|
|
<img |
|
|
<img |
|
|
class="mobile-bottom-feedback" |
|
|
|
|
|
src="https://d31zlh4on95l9h.cloudfront.net/images/41d6e25c19466718d462bcee2f050140.png" |
|
|
|
|
|
|
|
|
class="mobile-bottom-announcement" |
|
|
|
|
|
src="https://d31zlh4on95l9h.cloudfront.net/images/c51c7fbb68671729801fb10d65bd7789.png" |
|
|
alt="icon" |
|
|
alt="icon" |
|
|
/> |
|
|
/> |
|
|
<div class="mobile-bottom-text">用户反馈</div> |
|
|
|
|
|
|
|
|
<div class="mobile-bottom-text">公告</div> |
|
|
</div> |
|
|
</div> |
|
|
<div |
|
|
<div |
|
|
class="mobile-bottom-btn" |
|
|
class="mobile-bottom-btn" |
|
|
@click="handleAnnouncementClick" |
|
|
|
|
|
title="公告" |
|
|
|
|
|
|
|
|
@click="handleFeedbackClick" |
|
|
|
|
|
title="用户反馈" |
|
|
> |
|
|
> |
|
|
<img |
|
|
<img |
|
|
class="mobile-bottom-announcement" |
|
|
|
|
|
src="https://d31zlh4on95l9h.cloudfront.net/images/c51c7fbb68671729801fb10d65bd7789.png" |
|
|
|
|
|
|
|
|
class="mobile-bottom-feedback" |
|
|
|
|
|
src="https://d31zlh4on95l9h.cloudfront.net/images/41d6e25c19466718d462bcee2f050140.png" |
|
|
alt="icon" |
|
|
alt="icon" |
|
|
/> |
|
|
/> |
|
|
<div class="mobile-bottom-text">公告</div> |
|
|
|
|
|
|
|
|
<div class="mobile-bottom-text">用户反馈</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
@ -418,12 +452,24 @@ const closeDeleteDialog = () => { |
|
|
|
|
|
|
|
|
const historyRecords = ref([]); |
|
|
const historyRecords = ref([]); |
|
|
const categoryHistory = ref([]); |
|
|
const categoryHistory = ref([]); |
|
|
|
|
|
let firstFlag = false; |
|
|
const getHistoryList = async (params) => { |
|
|
const getHistoryList = async (params) => { |
|
|
try { |
|
|
try { |
|
|
const result = await getHistoryListAPI(params); |
|
|
const result = await getHistoryListAPI(params); |
|
|
historyRecords.value = result.data; |
|
|
historyRecords.value = result.data; |
|
|
let remainingRecords = result.data; // 复制原数组 |
|
|
let remainingRecords = result.data; // 复制原数组 |
|
|
|
|
|
|
|
|
|
|
|
console.log("result", result.data, "firstFlag", firstFlag); |
|
|
|
|
|
if (result.data.length != 0 && !firstFlag) { |
|
|
|
|
|
const userAgent = navigator.userAgent; |
|
|
|
|
|
if ( |
|
|
|
|
|
!/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( |
|
|
|
|
|
userAgent |
|
|
|
|
|
) |
|
|
|
|
|
) { |
|
|
|
|
|
isCollapsed.value = false; |
|
|
|
|
|
} |
|
|
|
|
|
firstFlag = true; |
|
|
|
|
|
} |
|
|
// 1. 筛选置顶记录 |
|
|
// 1. 筛选置顶记录 |
|
|
let topList = remainingRecords.filter((record) => record.isTop === 1); |
|
|
let topList = remainingRecords.filter((record) => record.isTop === 1); |
|
|
remainingRecords = remainingRecords.filter((record) => record.isTop !== 1); |
|
|
remainingRecords = remainingRecords.filter((record) => record.isTop !== 1); |
|
@ -431,12 +477,12 @@ const getHistoryList = async (params) => { |
|
|
// 2. 筛选今日记录 |
|
|
// 2. 筛选今日记录 |
|
|
let todayList = remainingRecords.filter((record) => { |
|
|
let todayList = remainingRecords.filter((record) => { |
|
|
const today = moment().format("YYYY-MM-DD"); |
|
|
const today = moment().format("YYYY-MM-DD"); |
|
|
const recordDate = moment(record.updatedTime).format("YYYY-MM-DD"); |
|
|
|
|
|
|
|
|
const recordDate = moment(record.createdTime).format("YYYY-MM-DD"); |
|
|
return recordDate === today; |
|
|
return recordDate === today; |
|
|
}); |
|
|
}); |
|
|
remainingRecords = remainingRecords.filter((record) => { |
|
|
remainingRecords = remainingRecords.filter((record) => { |
|
|
const today = moment().format("YYYY-MM-DD"); |
|
|
const today = moment().format("YYYY-MM-DD"); |
|
|
const recordDate = moment(record.updatedTime).format("YYYY-MM-DD"); |
|
|
|
|
|
|
|
|
const recordDate = moment(record.createdTime).format("YYYY-MM-DD"); |
|
|
return recordDate !== today; |
|
|
return recordDate !== today; |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
@ -444,13 +490,13 @@ const getHistoryList = async (params) => { |
|
|
let recent3DaysList = remainingRecords.filter((record) => { |
|
|
let recent3DaysList = remainingRecords.filter((record) => { |
|
|
const threeDaysAgo = moment().subtract(3, "days").startOf("day"); |
|
|
const threeDaysAgo = moment().subtract(3, "days").startOf("day"); |
|
|
const yesterday = moment().subtract(1, "days").endOf("day"); |
|
|
const yesterday = moment().subtract(1, "days").endOf("day"); |
|
|
const recordDate = moment(record.updatedTime); |
|
|
|
|
|
|
|
|
const recordDate = moment(record.createdTime); |
|
|
return recordDate.isAfter(threeDaysAgo) && recordDate.isBefore(yesterday); |
|
|
return recordDate.isAfter(threeDaysAgo) && recordDate.isBefore(yesterday); |
|
|
}); |
|
|
}); |
|
|
remainingRecords = remainingRecords.filter((record) => { |
|
|
remainingRecords = remainingRecords.filter((record) => { |
|
|
const threeDaysAgo = moment().subtract(3, "days").startOf("day"); |
|
|
const threeDaysAgo = moment().subtract(3, "days").startOf("day"); |
|
|
const yesterday = moment().subtract(1, "days").endOf("day"); |
|
|
const yesterday = moment().subtract(1, "days").endOf("day"); |
|
|
const recordDate = moment(record.updatedTime); |
|
|
|
|
|
|
|
|
const recordDate = moment(record.createdTime); |
|
|
return !( |
|
|
return !( |
|
|
recordDate.isAfter(threeDaysAgo) && recordDate.isBefore(yesterday) |
|
|
recordDate.isAfter(threeDaysAgo) && recordDate.isBefore(yesterday) |
|
|
); |
|
|
); |
|
@ -459,24 +505,24 @@ const getHistoryList = async (params) => { |
|
|
// 4. 筛选近7日记录(不包括今日和近3日) |
|
|
// 4. 筛选近7日记录(不包括今日和近3日) |
|
|
let recent7DaysList = remainingRecords.filter((record) => { |
|
|
let recent7DaysList = remainingRecords.filter((record) => { |
|
|
const sevenDaysAgo = moment().subtract(7, "days").startOf("day"); |
|
|
const sevenDaysAgo = moment().subtract(7, "days").startOf("day"); |
|
|
const recordDate = moment(record.updatedTime); |
|
|
|
|
|
|
|
|
const recordDate = moment(record.createdTime); |
|
|
return recordDate.isAfter(sevenDaysAgo); |
|
|
return recordDate.isAfter(sevenDaysAgo); |
|
|
}); |
|
|
}); |
|
|
remainingRecords = remainingRecords.filter((record) => { |
|
|
remainingRecords = remainingRecords.filter((record) => { |
|
|
const sevenDaysAgo = moment().subtract(7, "days").startOf("day"); |
|
|
const sevenDaysAgo = moment().subtract(7, "days").startOf("day"); |
|
|
const recordDate = moment(record.updatedTime); |
|
|
|
|
|
|
|
|
const recordDate = moment(record.createdTime); |
|
|
return !recordDate.isAfter(sevenDaysAgo); |
|
|
return !recordDate.isAfter(sevenDaysAgo); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
// 5. 筛选近30日记录(不包括前面已筛选的) |
|
|
// 5. 筛选近30日记录(不包括前面已筛选的) |
|
|
let recent30DaysList = remainingRecords.filter((record) => { |
|
|
let recent30DaysList = remainingRecords.filter((record) => { |
|
|
const thirtyDaysAgo = moment().subtract(30, "days").startOf("day"); |
|
|
const thirtyDaysAgo = moment().subtract(30, "days").startOf("day"); |
|
|
const recordDate = moment(record.updatedTime); |
|
|
|
|
|
|
|
|
const recordDate = moment(record.createdTime); |
|
|
return recordDate.isAfter(thirtyDaysAgo); |
|
|
return recordDate.isAfter(thirtyDaysAgo); |
|
|
}); |
|
|
}); |
|
|
remainingRecords = remainingRecords.filter((record) => { |
|
|
remainingRecords = remainingRecords.filter((record) => { |
|
|
const thirtyDaysAgo = moment().subtract(30, "days").startOf("day"); |
|
|
const thirtyDaysAgo = moment().subtract(30, "days").startOf("day"); |
|
|
const recordDate = moment(record.updatedTime); |
|
|
|
|
|
|
|
|
const recordDate = moment(record.createdTime); |
|
|
return !recordDate.isAfter(thirtyDaysAgo); |
|
|
return !recordDate.isAfter(thirtyDaysAgo); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
@ -579,28 +625,28 @@ const selectRecord = async (record) => { |
|
|
parentId: record.parentId, |
|
|
parentId: record.parentId, |
|
|
recordId: record.id, |
|
|
recordId: record.id, |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (result && result.data) { |
|
|
if (result && result.data) { |
|
|
historyData.value = result.data; |
|
|
historyData.value = result.data; |
|
|
chatStore.dbqbClickRecord = historyData.value; |
|
|
chatStore.dbqbClickRecord = historyData.value; |
|
|
// 构造股票数据对象,保持与现有结构一致 |
|
|
// 构造股票数据对象,保持与现有结构一致 |
|
|
const stockData = { |
|
|
const stockData = { |
|
|
queryText: record.stockCode || record.stockName || '', // 使用记录中的股票代码或名称作为查询文本 |
|
|
|
|
|
|
|
|
queryText: record.stockCode || record.stockName || "", // 使用记录中的股票代码或名称作为查询文本 |
|
|
stockInfo: { |
|
|
stockInfo: { |
|
|
name: result.data.stockData?.stockName || record.stockName || '', |
|
|
|
|
|
code: record.stockCode || '', |
|
|
|
|
|
market: record.stockMarket || 'cn' |
|
|
|
|
|
|
|
|
name: result.data.stockData?.stockName || record.stockName || "", |
|
|
|
|
|
code: record.stockCode || "", |
|
|
|
|
|
market: record.stockMarket || "cn", |
|
|
}, |
|
|
}, |
|
|
apiData: result.data.stockData || {}, // 图表数据 |
|
|
apiData: result.data.stockData || {}, // 图表数据 |
|
|
conclusionData: result.data.wokeFlowData?.One || {}, // 场景应用的结论和音频 |
|
|
conclusionData: result.data.wokeFlowData?.One || {}, // 场景应用的结论和音频 |
|
|
timestamp: new Date().toISOString() |
|
|
|
|
|
|
|
|
timestamp: new Date().toISOString(), |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 通过emit将数据传递给父组件 |
|
|
// 通过emit将数据传递给父组件 |
|
|
emit('selectRecord', stockData); |
|
|
|
|
|
console.log('历史记录数据已发送给父组件:', stockData); |
|
|
|
|
|
|
|
|
emit("selectRecord", stockData); |
|
|
|
|
|
console.log("历史记录数据已发送给父组件:", stockData); |
|
|
} else { |
|
|
} else { |
|
|
console.error('历史记录数据格式不正确:', result); |
|
|
|
|
|
|
|
|
console.error("历史记录数据格式不正确:", result); |
|
|
} |
|
|
} |
|
|
} catch (e) { |
|
|
} catch (e) { |
|
|
console.error("获取历史记录数据失败", e); |
|
|
console.error("获取历史记录数据失败", e); |
|
@ -657,6 +703,7 @@ defineExpose({ |
|
|
isCollapsed, |
|
|
isCollapsed, |
|
|
toggleCollapse, |
|
|
toggleCollapse, |
|
|
getHistoryList, |
|
|
getHistoryList, |
|
|
|
|
|
selectedRecordId, |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
// 生命周期 |
|
|
// 生命周期 |
|
@ -708,6 +755,7 @@ onMounted(() => { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.mobileCollapsed { |
|
|
.mobileCollapsed { |
|
|
|
|
|
/* max-width: 400px */ |
|
|
width: 80vw; |
|
|
width: 80vw; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -915,6 +963,10 @@ onMounted(() => { |
|
|
background: rgba(255, 255, 255, 0.1); |
|
|
background: rgba(255, 255, 255, 0.1); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.history-item.active { |
|
|
|
|
|
background: rgba(255, 255, 255, 0.5); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
.record-content { |
|
|
.record-content { |
|
|
display: flex; |
|
|
display: flex; |
|
|
width: 100%; |
|
|
width: 100%; |
|
@ -938,9 +990,16 @@ onMounted(() => { |
|
|
margin-bottom: 6px; |
|
|
margin-bottom: 6px; |
|
|
overflow: hidden; |
|
|
overflow: hidden; |
|
|
text-overflow: ellipsis; |
|
|
text-overflow: ellipsis; |
|
|
display: -webkit-box; |
|
|
|
|
|
-webkit-line-clamp: 2; |
|
|
-webkit-line-clamp: 2; |
|
|
-webkit-box-orient: vertical; |
|
|
-webkit-box-orient: vertical; |
|
|
|
|
|
display: flex; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.top-icon { |
|
|
|
|
|
margin-left: 5px; |
|
|
|
|
|
color: white; |
|
|
|
|
|
height: auto; |
|
|
|
|
|
width: 15px; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.stock-name { |
|
|
.stock-name { |
|
|