155 lines
4.7 KiB
JavaScript
155 lines
4.7 KiB
JavaScript
'use strict'
|
|
const db = uniCloud.database()
|
|
|
|
const allowedUpdateFields = [
|
|
'pet_id',
|
|
'type',
|
|
'title',
|
|
'scheduledDate',
|
|
'frequency',
|
|
'interval',
|
|
'status',
|
|
'reminderDays',
|
|
'relatedRecordId',
|
|
'note'
|
|
]
|
|
|
|
exports.main = async (event, context) => {
|
|
const { action, uid } = event
|
|
|
|
if (!uid) {
|
|
return { code: -1, message: '缺少用户标识' }
|
|
}
|
|
|
|
try {
|
|
switch (action) {
|
|
case 'list': {
|
|
const { status, petId, page, pageSize } = event
|
|
const where = { user_id: uid }
|
|
if (status && status !== 'all') where.status = status
|
|
if (petId) where.pet_id = petId
|
|
|
|
const p = page || 1
|
|
const ps = pageSize || 100
|
|
const skip = (p - 1) * ps
|
|
const res = await db.collection('schedules')
|
|
.where(where)
|
|
.orderBy('scheduledDate', 'asc')
|
|
.skip(skip)
|
|
.limit(ps)
|
|
.get()
|
|
|
|
return {
|
|
code: 0,
|
|
data: {
|
|
list: res.data || [],
|
|
total: res.affectedDocs !== undefined ? res.affectedDocs : (res.data || []).length
|
|
}
|
|
}
|
|
}
|
|
|
|
case 'detail': {
|
|
const { scheduleId } = event
|
|
if (!scheduleId) {
|
|
return { code: -1, message: '缺少提醒ID' }
|
|
}
|
|
const res = await db.collection('schedules').doc(scheduleId).get()
|
|
const schedule = res.data && res.data[0]
|
|
if (!schedule || schedule.user_id !== uid) {
|
|
return { code: -1, message: '提醒不存在' }
|
|
}
|
|
return { code: 0, data: schedule }
|
|
}
|
|
|
|
case 'add': {
|
|
const { pet_id, type, title, scheduledDate, frequency, interval, reminderDays, relatedRecordId, note } = event
|
|
const scheduleDate = normalizeScheduleDate(scheduledDate)
|
|
if (!pet_id || !title || !scheduleDate) {
|
|
return { code: -1, message: '请填写宠物、标题和日期' }
|
|
}
|
|
const now = Date.now()
|
|
const scheduleData = {
|
|
user_id: uid,
|
|
pet_id,
|
|
type: type || 'custom',
|
|
title: title || '',
|
|
scheduledDate: scheduleDate,
|
|
frequency: frequency || 'once',
|
|
interval: interval || 1,
|
|
status: 'pending',
|
|
reminderDays: Array.isArray(reminderDays) ? reminderDays : [7, 3, 1],
|
|
relatedRecordId: relatedRecordId || '',
|
|
note: note || '',
|
|
createdAt: now,
|
|
updatedAt: now
|
|
}
|
|
const res = await db.collection('schedules').add(scheduleData)
|
|
return { code: 0, data: { _id: res.id }, message: '添加成功' }
|
|
}
|
|
|
|
case 'update': {
|
|
const { scheduleId } = event
|
|
if (!scheduleId) {
|
|
return { code: -1, message: '缺少提醒ID' }
|
|
}
|
|
|
|
const detailRes = await db.collection('schedules').doc(scheduleId).get()
|
|
const schedule = detailRes.data && detailRes.data[0]
|
|
if (!schedule || schedule.user_id !== uid) {
|
|
return { code: -1, message: '提醒不存在' }
|
|
}
|
|
|
|
const updateFields = {}
|
|
allowedUpdateFields.forEach((field) => {
|
|
if (event[field] !== undefined) updateFields[field] = event[field]
|
|
})
|
|
if (event.scheduledDate !== undefined) {
|
|
const scheduleDate = normalizeScheduleDate(event.scheduledDate)
|
|
if (!scheduleDate) {
|
|
return { code: -1, message: '日期格式不正确' }
|
|
}
|
|
updateFields.scheduledDate = scheduleDate
|
|
}
|
|
updateFields.updatedAt = Date.now()
|
|
await db.collection('schedules').doc(scheduleId).update(updateFields)
|
|
return { code: 0, message: '更新成功' }
|
|
}
|
|
|
|
case 'delete': {
|
|
const { scheduleId } = event
|
|
if (!scheduleId) {
|
|
return { code: -1, message: '缺少提醒ID' }
|
|
}
|
|
|
|
const detailRes = await db.collection('schedules').doc(scheduleId).get()
|
|
const schedule = detailRes.data && detailRes.data[0]
|
|
if (!schedule || schedule.user_id !== uid) {
|
|
return { code: -1, message: '提醒不存在' }
|
|
}
|
|
|
|
await db.collection('schedules').doc(scheduleId).remove()
|
|
return { code: 0, message: '删除成功' }
|
|
}
|
|
|
|
default:
|
|
return { code: -1, message: `未知操作: ${action}` }
|
|
}
|
|
} catch (err) {
|
|
console.error('scheduleManager error:', err)
|
|
return { code: -1, message: err.message || '操作失败' }
|
|
}
|
|
}
|
|
|
|
function normalizeScheduleDate(value) {
|
|
if (!value) return 0
|
|
if (typeof value === 'number') return value
|
|
if (typeof value === 'string') {
|
|
const match = value.match(/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})/)
|
|
if (match) {
|
|
return new Date(Number(match[1]), Number(match[2]) - 1, Number(match[3])).getTime()
|
|
}
|
|
}
|
|
const date = new Date(value)
|
|
return Number.isNaN(date.getTime()) ? 0 : date.getTime()
|
|
}
|