diff --git a/src/api/index.js b/src/api/index.js
index 43da387..6bce0cd 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -92,6 +92,21 @@ export const getReportByToken = (token) => get('/report/get', { token })
// 报告列表
export const getReportList = (params) => get('/report/list', params)
+// 报告页:下次服务建议日期
+export const getReportSuggestion = (token) => get(`/report/${encodeURIComponent(token)}/suggestion`)
+
+// 报告页:宠主留资(下次提醒)
+export const submitReportReminder = (token, phone) =>
+ post(`/report/${encodeURIComponent(token)}/reminder`, { phone, consent: true })
+
+// 报告页:一键退订
+export const unsubscribeReportReminder = (unsubscribeToken) =>
+ post('/report/unsubscribe', { unsubscribeToken })
+
+// 老板后台:回访池列表
+export const getReportLeads = (storeId, status = 'pending') =>
+ get('/report/leads', { storeId, status })
+
// 服务类型列表(不传 storeId 时仅返回系统默认,供未写入门店会话的 C 端展示)
export const getServiceTypeList = (storeId) => {
const params = {}
diff --git a/src/components/report/ReminderCard.vue b/src/components/report/ReminderCard.vue
new file mode 100644
index 0000000..a0d60d0
--- /dev/null
+++ b/src/components/report/ReminderCard.vue
@@ -0,0 +1,306 @@
+
+
+
+
+
+ 🐾
+ {{ titleText }}
+
+
+
+ {{ formatChineseDate(suggestion.remindDate) }}
+ {{ suggestion.intervalText }}
+
+
+
+
+
+
+
+
+
+ ✓
+
+
+ 同意门店通过短信/微信向我发送服务到期提醒
+ (可随时退订)
+
+
+
+
+
+
+ {{ errorMsg }}
+
+
+
+
+ ✓
+ 已为您设置提醒
+
+ {{ formatChineseDate(savedDate) }}
+
+
+ 到点我们会通过微信/短信告诉你,无需惦记。
+
+
+
+
+
+
+
+
diff --git a/src/pages.json b/src/pages.json
index 129ea9a..b462684 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -15,7 +15,9 @@
{"path": "pages/mine/MyPets"},
{"path": "pages/mine/Profile"},
{"path": "pages/video-player/videoPlayer"},
- {"path": "pages/report-view/reportView"}
+ {"path": "pages/report-view/reportView"},
+ {"path": "pages/unsubscribe/Unsubscribe"},
+ {"path": "pages/mine/Leads"}
],
"globalStyle": {
"navigationStyle": "custom",
diff --git a/src/pages/mine/Leads.vue b/src/pages/mine/Leads.vue
new file mode 100644
index 0000000..1347fd4
--- /dev/null
+++ b/src/pages/mine/Leads.vue
@@ -0,0 +1,399 @@
+
+
+
+
+
+
+
+ 回访池
+
+
+
+
+
+ 即将到期 · 待回访
+
+ 共 {{ pendingCount }} 位宠主等着你联系。
+ 系统根据服务类型自动推算下次到店时间。
+
+
+
+
+
+
+ 待回访
+
+
+ 全部留资
+
+
+
+
+
+
+ 加载中…
+
+
+
+ {{ tab === 'pending' ? '暂无待回访,今天可以喘口气' : '还没有宠主留资' }}
+
+
+
+
+
+
+ {{ item.petName || '未命名' }}
+ {{ item.serviceType || '-' }}
+
+
+
+ {{ statusText(item) }}
+
+
+
+
+
+
+ 下次建议
+ {{ formatDate(item.remindDate) }}
+ {{ dueTagText(item) }}
+
+
+ 手机号
+ {{ item.phone }}
+
+
+ 留资时间
+ {{ formatDateTime(item.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/mine/Mine.vue b/src/pages/mine/Mine.vue
index 46c8cc7..fe6c268 100644
--- a/src/pages/mine/Mine.vue
+++ b/src/pages/mine/Mine.vue
@@ -39,6 +39,11 @@
+
@@ -102,6 +107,7 @@ const goStaffPage = () => uni.navigateTo({ url: '/pages/mine/Staff' })
const goServiceTypePage = () => uni.navigateTo({ url: '/pages/mine/ServiceType' })
const goStorePage = () => uni.navigateTo({ url: '/pages/mine/Store' })
const goSchedulePage = () => uni.navigateTo({ url: '/pages/mine/Schedule' })
+const goLeadsPage = () => uni.navigateTo({ url: '/pages/mine/Leads' })
const openProfile = () => uni.navigateTo({ url: '/pages/mine/Profile' })
const goMyPetsPage = () => uni.navigateTo({ url: '/pages/mine/MyPets' })
const goMyOrdersPage = () => uni.navigateTo({ url: '/pages/mine/MyOrders' })
diff --git a/src/pages/unsubscribe/Unsubscribe.vue b/src/pages/unsubscribe/Unsubscribe.vue
new file mode 100644
index 0000000..06687c3
--- /dev/null
+++ b/src/pages/unsubscribe/Unsubscribe.vue
@@ -0,0 +1,160 @@
+
+
+
+
+
+ 正在为您处理…
+
+
+
+
+ ✓
+
+ 已退订
+
+ 我们不会再向您发送服务到期提醒。
+
+
+ 如果您改变主意,随时可以在报告页重新设置。
+
+
+
+
+
+ !
+
+ 链接缺少退订标识
+ 请从微信/短信中的退订链接直接打开。
+
+
+
+
+ !
+
+ 退订未成功
+ {{ errorMsg || '链接无效或已失效,您可以直接忽略后续消息。' }}
+
+
+
+
+
+
+
+
+
diff --git a/src/views/ReportView.vue b/src/views/ReportView.vue
index f52373b..999261e 100644
--- a/src/views/ReportView.vue
+++ b/src/views/ReportView.vue
@@ -84,6 +84,12 @@
+
+
+
@@ -103,6 +109,7 @@ import { onLoad } from '@dcloudio/uni-app'
import { getReportByToken, imgUrl } from '../api/index.js'
import { formatDateTimeYMDHM } from '../utils/datetime.js'
import AppIcon from '../components/AppIcon.vue'
+import ReminderCard from '../components/report/ReminderCard.vue'
import { navigateTo } from '../utils/globalState.js'
const loading = ref(true)