diff --git a/src/components/popup/index.wxml b/src/components/popup/index.wxml index 71c5abc..64d7c0b 100644 --- a/src/components/popup/index.wxml +++ b/src/components/popup/index.wxml @@ -252,7 +252,7 @@ - + 档案已保存 下次就医时可出示该卡给医生 diff --git a/src/components/toast/index.wxml b/src/components/toast/index.wxml index 10d24d1..fa0cb4a 100644 --- a/src/components/toast/index.wxml +++ b/src/components/toast/index.wxml @@ -854,7 +854,7 @@ - + 记录复诊信息 diff --git a/src/pages/d_interactiveDoctor/index.scss b/src/pages/d_interactiveDoctor/index.scss index ce4a11a..d931dc6 100644 --- a/src/pages/d_interactiveDoctor/index.scss +++ b/src/pages/d_interactiveDoctor/index.scss @@ -186,6 +186,49 @@ page { } } } + .follow-result-reason { + margin-bottom: 32rpx; + padding: 32rpx; + border-radius: 32rpx; + background-color: #fff; + .title { + font-size: 32rpx; + color: rgba(33, 29, 46, 1); + } + .info { + margin-top: 20rpx; + padding: 24rpx; + background-color: rgba(246, 248, 249, 1); + border-radius: 16rpx; + .info-item { + font-size: 32rpx; + padding-left: 50rpx; + color: rgba(33, 29, 46, 1); + .label { + display: inline; + font-weight: bold; + } + .value { + display: inline; + } + &::before { + margin-left: -30rpx; + margin-right: 20rpx; + margin-top: 20rpx; + display: inline-block; + flex-shrink: 0; + content: ''; + width: 10rpx; + height: 10rpx; + border-radius: 50%; + background-color: #7d7d82; + } + &:not(:first-of-type) { + margin-top: 24rpx; + } + } + } + } .follow-result { margin-bottom: 32rpx; padding: 32rpx; @@ -522,14 +565,22 @@ page { display: flex; align-items: center; justify-content: center; + &.disabled { + color: rgba(105, 104, 110, 1); + border-color: rgba(105, 104, 110, 1); + } } .btn2 { padding: 0; - background: linear-gradient(344deg, #ffbcf9 0%, #b982ff 100%); + background: linear-gradient(180deg, #ffbcf9 0%, #b982ff 100%); color: #ffffff; display: flex; align-items: center; justify-content: center; + &.disabled { + background: rgba(246, 248, 249, 1); + color: rgba(105, 104, 110, 1); + } } } } @@ -572,8 +623,12 @@ page { display: flex; align-items: center; justify-content: center; - background: linear-gradient(180deg, #e98ff8 0%, #b073ff 100%); + background: linear-gradient(180deg, #ffbcf9 0%, #b982ff 100%); border-radius: 64rpx 64rpx 64rpx 64rpx; + &.disabled { + background: rgba(246, 248, 249, 1); + color: rgba(105, 104, 110, 1); + } } } .follow-reset { @@ -593,8 +648,12 @@ page { display: flex; align-items: center; justify-content: center; - background: linear-gradient(180deg, #e98ff8 0%, #b073ff 100%); + background: linear-gradient(180deg, #ffbcf9 0%, #b982ff 100%); border-radius: 64rpx 64rpx 64rpx 64rpx; + &.disabled { + background: rgba(246, 248, 249, 1); + color: rgba(105, 104, 110, 1); + } } } .follow-next { @@ -614,8 +673,12 @@ page { display: flex; align-items: center; justify-content: center; - background: linear-gradient(180deg, #e98ff8 0%, #b073ff 100%); + background: linear-gradient(180deg, #ffbcf9 0%, #b982ff 100%); border-radius: 64rpx 64rpx 64rpx 64rpx; + &.disabled { + background: rgba(246, 248, 249, 1); + color: rgba(105, 104, 110, 1); + } } } } diff --git a/src/pages/d_interactiveDoctor/index.ts b/src/pages/d_interactiveDoctor/index.ts index aecac39..91a0a58 100644 --- a/src/pages/d_interactiveDoctor/index.ts +++ b/src/pages/d_interactiveDoctor/index.ts @@ -4,7 +4,7 @@ const app = getApp() interface IMessageItem { msgId: string - msgContentType: '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '12' | '13' | '14' | '15' // 1:文本 2: 出诊时间 3: adl卡片 4: 语音 5: 欢迎语 6:补充真实姓名 7: 提醒完善信息 8: 复诊卡片 9:患者恢复复诊消息 12:复诊提醒 13:复诊提醒-快速问答 14:复诊提醒-未复诊鼓励 15:复诊提醒-已复诊结果 + msgContentType: '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '12' | '13' | '14' | '15' | '16' | '17' // 1:文本 2: 出诊时间 3: adl卡片 4: 语音 5: 欢迎语 6:补充真实姓名 7: 提醒完善信息 8: 复诊卡片 9:患者恢复复诊消息 12:复诊提醒 13:复诊提醒-快速问答 14:未复诊原因 15:未复诊原因回复 16:未复诊鼓励 17:下一步 msgContent: any msgVisitTime: string msgVisitTimeType?: string @@ -13,7 +13,13 @@ interface IMessageItem { msgCreateTime: string // 消息创建时间 msgCreateTimeName?: string // 消息创建时间 showTime?: boolean + ReVisitInfo?: any msgCustomSendStatus?: number | string + msgTipsInfo?: string + followUpStatus?: number // 复诊状态,>0 表示已回复 + replyMsgId?: number // 回复消息ID,>0 表示已回复 + followUpTitle?: string // 复诊原因标题 + followUpTitleChoice?: string // 复诊原因多选提示 } interface Item { @@ -136,6 +142,31 @@ Page({ item.ReVisitInfo = JSON.parse(item.ReVisitInfo) item.ReVisitInfo.visitDateName = dayjs(item.ReVisitInfo.visitDate).format('YYYY年M月DD日') } + if (item.msgContentType === '13') { + const rawInfo = JSON.parse(item.ReVisitInfo) + // 解析结构:{title, lastVisitTitle, visitDate, mySolutionTitle, reVisitSolution} + item.ReVisitInfo = rawInfo + } + if (item.msgContentType === '14') { + const rawInfo = JSON.parse(item.ReVisitInfo) + // 解析结构:{title, titleChoice, missionReasonList, reasonList} + const missionReasonList = rawInfo.missionReasonList || {} + const reasonList = rawInfo.reasonList || [] + item.ReVisitInfo = Object.keys(missionReasonList).map(key => ({ + key, + label: missionReasonList[key], + isSelected: reasonList.includes(key), + })) + item.followUpTitle = rawInfo.title || '请问您没能按时复诊的主要原因是?' + item.followUpTitleChoice = rawInfo.titleChoice || '(多选)' + } + if (item.msgContentType === '15') { + const rawInfo = JSON.parse(item.ReVisitInfo) + // 解析结构:{title, reasonInfoList} + const reasonInfoList = rawInfo.reasonInfoList || {} + item.followUpTitle = rawInfo.title || '没能按时复诊的主要原因是?' + item.ReVisitInfo = Object.keys(reasonInfoList).map(key => reasonInfoList[key]) + } return item }) diff --git a/src/pages/d_interactiveDoctor/index.wxml b/src/pages/d_interactiveDoctor/index.wxml index d6122f8..a467a98 100644 --- a/src/pages/d_interactiveDoctor/index.wxml +++ b/src/pages/d_interactiveDoctor/index.wxml @@ -69,20 +69,24 @@ 9.其他 + + {{message.ReVisitInfo.title}} + + + {{message.ReVisitInfo.lastVisitTitle}} + {{message.ReVisitInfo.visitDate}} + + + {{message.ReVisitInfo.mySolutionTitle}} + {{item}} + + + - 医生您好,我刚刚完成了复诊记录: + {{message.followUpTitle}} - - - 我最近一次复诊时间是: - 2025年6月11日 - - - - - 我的方案是: - 生物制剂IGF-1R抗体(替妥尤单抗)第2次使用替妥尤单抗 - + + {{item}} @@ -151,13 +155,13 @@ {{message.msgContent}} 完善个人信息 - - - 您最近有按照医生的 提醒,定期复诊吗? - + + + 您好!出院后的康复需要我们双方共同努力,请问您最近有按照医生的提醒,定期到院复诊吗? - - 已复诊 + + 已复诊 + 未复诊 @@ -171,21 +175,47 @@ - 请问您没能按时复诊的主要原因是? - (多选) + {{message.followUpTitle}} + {{message.followUpTitleChoice}} - 症状感觉好转,觉得不用去了 + {{item.label}} 提交 - - 规范治疗可获得更好的疗效,减少复发。 + + + {{message.followUpTitle}} + {{message.followUpTitleChoice}} + + + {{item.label}} + 提交 - - 坚持规范治疗,继续加油,愿身体稳步向好! - 提交 + + {{message.followUpTitle}} + + + {{item}} + + + + + {{message.msgContent}} + 重新预约复诊 + + + {{message.msgContent}} + 设置下一次复诊提醒 diff --git a/src/patient/pages/follow/index.json b/src/patient/pages/follow/index.json index 46da783..e9ca0a2 100644 --- a/src/patient/pages/follow/index.json +++ b/src/patient/pages/follow/index.json @@ -1,5 +1,7 @@ { "navigationStyle": "default", "navigationBarTitleText": "复诊记录", - "usingComponents": {} + "usingComponents": { + "popup": "/components/popup/index" + } } diff --git a/src/patient/pages/follow/index.scss b/src/patient/pages/follow/index.scss index a9aa785..aea16f7 100644 --- a/src/patient/pages/follow/index.scss +++ b/src/patient/pages/follow/index.scss @@ -3,7 +3,7 @@ page { } .page { - padding: 48rpx 32rpx; + padding: 48rpx 32rpx 200rpx; .card { display: flex; gap: 14rpx; @@ -45,6 +45,8 @@ page { } } .container { + flex: 1; + padding-bottom: 48rpx; .date { font-size: 36rpx; color: rgba(33, 29, 46, 1); @@ -105,6 +107,48 @@ page { color: rgba(248, 166, 26, 1); } } + .actions { + margin-top: 24rpx; + display: flex; + justify-content: flex-end; + gap: 24rpx; + .action-btn { + padding: 10rpx 32rpx; + font-size: 28rpx; + border-radius: 32rpx; + } + .edit { + color: rgba(185, 130, 255, 1); + border: 1px solid rgba(185, 130, 255, 1); + } + .delete { + color: rgba(173, 172, 178, 1); + border: 1px solid rgba(173, 172, 178, 1); + } + } + } + &:first-child { + .aside { + .line-top { + opacity: 0; + } + } + } + &:last-of-type { + .container { + padding-bottom: 0; + } + } + } + .add-btn { + position: fixed; + bottom: 140rpx; + left: 50%; + transform: translateX(-50%); + .icon { + display: block; + width: 136rpx; + height: 136rpx; } } } diff --git a/src/patient/pages/follow/index.ts b/src/patient/pages/follow/index.ts index 067b6bb..e7594fe 100644 --- a/src/patient/pages/follow/index.ts +++ b/src/patient/pages/follow/index.ts @@ -1,8 +1,120 @@ -const _app = getApp(); +const app = getApp() Page({ - data: {}, - onLoad() {}, -}); + data: { + list: [] as any[], + planMap: {} as Record, + pagination: { + page: 1, + pages: 1, + count: 0, + }, + popupShow: false, + popupType: 'popup15', + popupParams: {} as any, + deleteId: '', + }, + + onShow() { + app.waitLogin({ type: [1] }).then(() => { + this.getEnum().then(() => { + this.getList() + }) + }) + }, + + getEnum() { + return wx.ajax({ + method: 'GET', + url: '?r=xd/follow-up-reminder/enum', + }).then((res: any) => { + const tp = res.treatmentPlan || {} + const planMap: Record = {} + Object.keys(tp).forEach((key) => { + planMap[key] = tp[key] + }) + this.setData({ planMap }) + }) + }, + + getList(newPage = 1) { + wx.ajax({ + method: 'GET', + url: '?r=xd/follow-up-reminder/list', + data: { page: newPage }, + loading: true, + }).then((res: any) => { + const rawList = res.list || res || [] + const planMap = this.data.planMap + const list = (newPage === 1 ? [] : [...this.data.list]).concat( + rawList.map((item: any) => { + const planKeys = item.treatmentPlan ? item.treatmentPlan.split(',') : [] + const planList = planKeys.map((key: string) => { + const label = planMap[key] || key + if (key === '5' && item.usageCount) { + return `${label} 第${item.usageCount}次使用` + } + return label + }) + return { ...item, planList } + }), + ) + this.setData({ + list, + pagination: { + page: res.page || newPage, + pages: res.pages || 1, + count: res.count || list.length, + }, + }) + }) + }, + + onReachBottom() { + const { page, pages } = this.data.pagination + if (pages > page) { + this.getList(page + 1) + } + }, + + handleAdd() { + wx.navigateTo({ + url: '/patient/pages/followForm/index', + }) + }, + + handleEdit(e: any) { + const id = e.currentTarget.dataset.id + wx.navigateTo({ + url: `/patient/pages/followForm/index?id=${id}`, + }) + }, + + handleDelete(e: any) { + const id = e.currentTarget.dataset.id + this.setData({ + deleteId: id, + popupShow: true, + popupType: 'popup15', + }) + }, + + handlePopupOk() { + this.setData({ popupShow: false }) + wx.ajax({ + method: 'POST', + url: '?r=xd/follow-up-reminder/delete', + data: { id: this.data.deleteId }, + loading: true, + }).then(() => { + wx.showToast({ title: '删除成功', icon: 'none' }) + this.getList() + }) + }, + + handlePopupCancel() { + this.setData({ popupShow: false }) + }, +}) export {} diff --git a/src/patient/pages/follow/index.wxml b/src/patient/pages/follow/index.wxml index 5d2e5d1..985c542 100644 --- a/src/patient/pages/follow/index.wxml +++ b/src/patient/pages/follow/index.wxml @@ -1,22 +1,37 @@ - + - 复诊时间:2025-06-11 + 复诊时间:{{item.visitTime}} 复诊方案 - 生物制剂IGF-1R抗体(替妥尤单抗) 第2次使用 - 传统免疫抑制剂(如:吗替麦考酚酯、环孢素等、甲氨蝶呤) + {{plan}} - - 下次复诊时间:2025-06-11 + + 下次复诊时间:{{item.nextVisitTime}} + + + + + + + + + diff --git a/src/patient/pages/followForm/index.ts b/src/patient/pages/followForm/index.ts index 44405f1..4b9941b 100644 --- a/src/patient/pages/followForm/index.ts +++ b/src/patient/pages/followForm/index.ts @@ -1,23 +1,221 @@ -const _app = getApp(); +const app = getApp() Page({ data: { + id: '', + isEdit: false, + visitTime: '', + treatmentPlan: [] as string[], + planOptions: [] as any[], + teprotumumabCount: 1, + showUsageCount: false, + nextVisitTime: '', + nextVisitPreset: '', + intervalOptions: [] as any[], popupShow: false, - popupType: 'popup19', - popupParams: {}, + popupType: 'popup16', + popupParams: {} as any, + hasChange: false, + }, + + onLoad(options: any) { + app.waitLogin({ type: [1] }).then(() => { + this.getEnum().then(() => { + if (options.id) { + this.setData({ + id: options.id, + isEdit: true, + }) + this.getDetail() + } + }) + }) + }, + + getEnum() { + return wx.ajax({ + method: 'GET', + url: '?r=xd/follow-up-reminder/enum', + }).then((res: any) => { + const tp = res.treatmentPlan || {} + const planOptions = Object.keys(tp).map(key => ({ + value: key, + label: tp[key], + isSelected: false, + })) + const nvi = res.nextVisitInterval || {} + const intervalOptions = Object.keys(nvi).map(key => ({ + value: key, + label: nvi[key], + })) + this.setData({ planOptions, intervalOptions }) + }) + }, + + updatePlanOptions(treatmentPlan: string[]) { + const planOptions = this.data.planOptions.map((opt: any) => ({ + ...opt, + isSelected: treatmentPlan.includes(opt.value), + })) + const showUsageCount = treatmentPlan.includes('5') + this.setData({ planOptions, showUsageCount }) + }, + + getDetail() { + wx.ajax({ + method: 'GET', + url: '?r=xd/follow-up-reminder/detail', + data: { id: this.data.id }, + loading: true, + }).then((res: any) => { + const treatmentPlan = res.treatmentPlan ? res.treatmentPlan.split(',') : [] + this.setData({ + visitTime: res.visitTime || '', + treatmentPlan, + teprotumumabCount: res.teprotumumabCount || 1, + nextVisitTime: res.nextVisitTime || '', + hasChange: false, + }) + this.updatePlanOptions(treatmentPlan) + }) + }, + + onVisitDateChange(e: any) { + this.setData({ visitTime: e.detail.value, hasChange: true }) + }, + + onNextDateChange(e: any) { + this.setData({ nextVisitTime: e.detail.value, nextVisitPreset: '', hasChange: true }) + }, + + togglePlan(e: any) { + const value = e.currentTarget.dataset.value + const treatmentPlan = [...this.data.treatmentPlan] + const index = treatmentPlan.indexOf(value) + if (index > -1) { + treatmentPlan.splice(index, 1) + } + else { + treatmentPlan.push(value) + } + this.setData({ treatmentPlan, hasChange: true }) + this.updatePlanOptions(treatmentPlan) + }, + + onStepperChange(e: any) { + this.setData({ teprotumumabCount: e.detail, hasChange: true }) + }, + + onNextPresetChange(e: any) { + const preset = e.currentTarget.dataset.value + const { visitTime } = this.data + if (!visitTime) { + wx.showToast({ title: '请先选择复诊时间', icon: 'none' }) + return + } + const date = new Date(visitTime) + if (preset === '21') { + date.setDate(date.getDate() + 21) + } + else if (preset === '30') { + date.setMonth(date.getMonth() + 1) + } + else if (preset === '60') { + date.setMonth(date.getMonth() + 2) + } + const nextVisitTime = this.formatDate(date) + this.setData({ nextVisitPreset: preset, nextVisitTime, hasChange: true }) + }, + + formatDate(date: Date) { + const y = date.getFullYear() + const m = String(date.getMonth() + 1).padStart(2, '0') + const d = String(date.getDate()).padStart(2, '0') + return `${y}-${m}-${d}` + }, + + handleSubmit() { + const { visitTime, treatmentPlan, teprotumumabCount, nextVisitTime, id, isEdit } = this.data + if (!visitTime) { + wx.showToast({ title: '请选择复诊时间', icon: 'none' }) + return + } + if (!treatmentPlan.length) { + wx.showToast({ title: '请选择复诊方案', icon: 'none' }) + return + } + if (!nextVisitTime) { + wx.showToast({ title: '请选择下次复诊时间', icon: 'none' }) + return + } + const data = { + visitTime, + treatmentPlan: treatmentPlan.join(','), + teprotumumabCount, + nextVisitTime, + } + if (isEdit) { + wx.ajax({ + method: 'POST', + url: '?r=xd/follow-up-reminder/update', + data: { id, ...data }, + loading: true, + }).then(() => { + wx.showToast({ title: '更新成功', icon: 'none' }) + setTimeout(() => wx.navigateBack(), 1500) + }) + } + else { + wx.ajax({ + method: 'POST', + url: '?r=xd/follow-up-reminder/create', + data, + loading: true, + }).then(() => { + wx.showToast({ title: '创建成功', icon: 'none' }) + setTimeout(() => wx.navigateBack(), 1500) + }) + } + }, + + handleCancel() { + if (this.data.hasChange) { + this.setData({ popupShow: true, popupType: 'popup16' }) + } + else { + wx.navigateBack() + } + }, + + handleDelete() { + this.setData({ popupShow: true, popupType: 'popup15' }) }, - onLoad() {}, - // popup 确认(继续退出) handlePopupOk() { + const { popupType } = this.data this.setData({ popupShow: false }) - wx.navigateBack() + if (popupType === 'popup15') { + // 删除确认 + wx.ajax({ + method: 'POST', + url: '?r=xd/follow-up-reminder/delete', + data: { id: this.data.id }, + loading: true, + }).then(() => { + wx.showToast({ title: '删除成功', icon: 'none' }) + setTimeout(() => wx.navigateBack(), 1500) + }) + } + else { + // 保存记录 + this.handleSubmit() + } }, - // popup 取消 handlePopupCancel() { this.setData({ popupShow: false }) + wx.navigateBack() }, -}); +}) export {} diff --git a/src/patient/pages/followForm/index.wxml b/src/patient/pages/followForm/index.wxml index 2588f94..8de92aa 100644 --- a/src/patient/pages/followForm/index.wxml +++ b/src/patient/pages/followForm/index.wxml @@ -1,26 +1,33 @@ 您的复诊时间 - - - 年 / 月 / 日 + + + {{visitTime || '年 / 月 / 日'}} + 您复诊后的方案是?(多选) - 1、激素静脉冲击治疗 - 2、生物制剂IGF-1R 抗体(替妥尤单抗) + {{item.label}} - + + 您是第几次使用替妥尤单抗? 注:替妥尤单抗常规疗程共 8 次注射(每3周1次) + 您的下次复诊时间 配合就医建议周期 - - - 年 / 月 / 日 + + + {{nextVisitTime || '年 / 月 / 日'}} - 21天后 - 1个月后 - 2个月后 + {{item.label}} + - 取消 - 提交 + + 删除 + 提交 + + + 取消 + 提交 + diff --git a/src/patient/pages/index/index.scss b/src/patient/pages/index/index.scss index ce9aa5b..470e581 100644 --- a/src/patient/pages/index/index.scss +++ b/src/patient/pages/index/index.scss @@ -121,12 +121,20 @@ page { } } .f-container { + position: relative; padding: 16rpx 20rpx 16rpx 40rpx; background: linear-gradient(70deg, #e98ff8 0%, #b073ff 100%); - border-radius: 24rpx; + border-radius: 26rpx; display: flex; align-items: center; gap: 42rpx; + .pos { + position: absolute; + top: 0; + right: 0; + width: 212rpx; + height: 76rpx; + } .aside { padding-top: 70rpx; width: 150rpx; @@ -143,6 +151,13 @@ page { color: rgba(185, 130, 255, 1); font-weight: bold; } + .a-name { + padding-top: 16rpx; + font-size: 40rpx; + font-weight: bold; + color: rgba(105, 104, 110, 0.83); + letter-spacing: 10rpx; + } } .wrap { padding-top: 30rpx; diff --git a/src/patient/pages/index/index.ts b/src/patient/pages/index/index.ts index df40ec9..5b51a05 100644 --- a/src/patient/pages/index/index.ts +++ b/src/patient/pages/index/index.ts @@ -50,6 +50,8 @@ Page({ unreadCount: 0, + followLatest: null as any, + options: {} as any, }, onLoad(options) { @@ -105,6 +107,7 @@ Page({ this.getPopup() this.getConfig(zdUserInfo) this.getSystemConfig() + this.getFollowLatest() if (zdUserInfo.ExclusiveDoctorId > 0) { this.getUnreadCount() } @@ -113,7 +116,39 @@ Page({ }, async getPopup() { // https://fa0ci3qr2z.feishu.cn/wiki/EBX6woN7xiaartkYkBpcfbYQnfn - if (this.data.toastShow) return + if (this.data.toastShow) + return + + const data4 = await wx.ajax({ + method: 'GET', + url: '?r=zd/popup/get-need-popup', + data: { + type: 1, + }, + }) + if (data4.showAlert) { + this.setData({ + toastShow: data4.showAlert, + toastType: 'guideEnterInfo', + toastParams: {}, + }) + return + } + + const data5 = await wx.ajax({ + method: 'GET', + url: '?r=zd/popup/get-popup', + data: { + type: 4, + }, + }) + if (data5.showAlert) { + this.setData({ + toastShow: data5.showAlert, + toastType: 'followGuide', + toastParams: { close: true }, + }) + } const noteGuideShown = wx.getStorageSync('noteGuideShown') if (!noteGuideShown) { @@ -156,21 +191,6 @@ Page({ toastParams: { close: true }, }) } - - const data4 = await wx.ajax({ - method: 'GET', - url: '?r=zd/popup/get-need-popup', - data: { - type: 1, - }, - }) - if (data4.showAlert) { - this.setData({ - toastShow: data4.showAlert, - toastType: 'guideEnterInfo', - toastParams: {}, - }) - } }, getUnreadCount() { wx.ajax({ @@ -183,6 +203,34 @@ Page({ }) }) }, + getFollowLatest() { + wx.ajax({ + method: 'GET', + url: '?r=xd/follow-up-reminder/latest', + data: {}, + }).then((res: any) => { + if (res && res.nextVisitTime) { + const date = dayjs(res.nextVisitTime) + const year = date.format('YYYY') + this.setData({ + followLatest: { + ...res, + year, + yearPrefix: year.slice(0, 2), + yearSuffix: year.slice(2), + month: date.format('MM'), + day: date.format('DD'), + week: date.format('dddd'), + }, + }) + } + else { + this.setData({ followLatest: null }) + } + }).catch(() => { + this.setData({ followLatest: null }) + }) + }, getSystemConfig() { wx.ajax({ method: 'GET', @@ -228,11 +276,13 @@ Page({ // 设置显示状态 if (code === 'medicalInsurance' && showStatus == 1) { statusMap.medicalInsuranceShow = true - if (openStatus == 1) statusMap.medicalInsuranceJump = true + if (openStatus == 1) + statusMap.medicalInsuranceJump = true } if (code === 'hospitalMap' && showStatus == 1) { statusMap.hospitalMapShow = true - if (openStatus == 1) statusMap.hospitalMapJump = true + if (openStatus == 1) + statusMap.hospitalMapJump = true } if (code === 'adl' && showStatus == 1) { statusMap.qolShow = true @@ -352,7 +402,8 @@ Page({ }) return } - if (!url) return + if (!url) + return if (code === 'doctor') { app.mpBehavior({ PageName: 'BTN_PatientHomeDoctorCard' }) } @@ -386,8 +437,8 @@ Page({ }, handleAddQol() { const { qolDetail } = this.data - const url = - qolDetail.Id && qolDetail.isTodayRecord + const url + = qolDetail.Id && qolDetail.isTodayRecord ? `/patient/pages/qolAdd/index?id=${qolDetail.Id}&edit=1` : `/patient/pages/qol/index` wx.navigateTo({ @@ -408,7 +459,8 @@ Page({ wx.navigateTo({ url: `/patient/pages/hormones/index?id=${hormoneDetail.recordId}`, }) - } else { + } + else { wx.navigateTo({ url: '/patient/pages/hormonesStart/index', }) @@ -424,12 +476,14 @@ Page({ url: '/patient/pages/adl/index?nrdl=1', }) this.handleToastCancel() - } else if (toastType === 'doubleStandards') { + } + else if (toastType === 'doubleStandards') { wx.navigateTo({ url: '/patient/pages/adl/index', }) this.handleToastCancel() - } else if (toastType === 'dedicatedDoctor') { + } + else if (toastType === 'dedicatedDoctor') { wx.ajax({ method: 'POST', url: '?r=zd/popup/close-popup', @@ -442,7 +496,8 @@ Page({ }) }) this.handleToastCancel(null, false) - } else if (toastType === 'medical-guide') { + } + else if (toastType === 'medical-guide') { wx.ajax({ method: 'POST', url: '?r=zd/popup/add-record', @@ -453,7 +508,8 @@ Page({ }) }) this.handleToastCancel(null, false) - } else if (toastType === 'guideEnterInfo') { + } + else if (toastType === 'guideEnterInfo') { wx.ajax({ method: 'POST', url: '?r=zd/popup/close-need-popup', @@ -464,12 +520,25 @@ Page({ }) this.handleToastCancel(null, false) }) - } else if (toastType === 'guideEnterInfoJump') { + } + else if (toastType === 'guideEnterInfoJump') { wx.navigateTo({ url: '/patient/pages/personalInformation/index', }) this.handleToastCancel(null, false) } + else if (toastType === 'followGuide') { + wx.ajax({ + method: 'POST', + url: '?r=zd/popup/add-record', + data: { type: 4 }, + }).then(() => { + wx.navigateTo({ + url: '/patient/pages/followForm/index', + }) + }) + this.handleToastCancel(null, false) + } }, handleToastCancel(_e = null, sure = true) { const { toastType } = this.data @@ -481,7 +550,8 @@ Page({ Type: 5, }, }) - } else if (toastType === 'dedicatedDoctor' && sure) { + } + else if (toastType === 'dedicatedDoctor' && sure) { wx.ajax({ method: 'POST', url: '?r=zd/popup/close-popup', @@ -489,19 +559,28 @@ Page({ Type: 6, }, }) - } else if (toastType === 'medical-guide' && sure) { + } + else if (toastType === 'medical-guide' && sure) { wx.ajax({ method: 'POST', url: '?r=zd/popup/add-record', data: { type: 3 }, }) - } else if (toastType === 'guideEnterInfo' && sure) { + } + else if (toastType === 'guideEnterInfo' && sure) { wx.ajax({ method: 'POST', url: '?r=zd/popup/close-need-popup', data: { type: 1 }, }) } + else if (toastType === 'followGuide' && sure) { + wx.ajax({ + method: 'POST', + url: '?r=zd/popup/add-record', + data: { type: 4 }, + }) + } this.setData({ toastShow: false, @@ -538,7 +617,8 @@ Page({ infoList: list, }) }) - } else { + } + else { wx.ajax({ method: 'POST', url: '?r=zd/pic-text/collection', diff --git a/src/patient/pages/index/index.wxml b/src/patient/pages/index/index.wxml index 102f53d..a7365bb 100644 --- a/src/patient/pages/index/index.wxml +++ b/src/patient/pages/index/index.wxml @@ -36,33 +36,37 @@ - - + + 设置复诊提醒 - - - 10 - 天 + + + + + {{followLatest.remainingDays}} + 天 + + -天 - + 复诊时间 - 20 + {{followLatest.yearPrefix}} - 26 + {{followLatest.yearSuffix}} - 06 + {{followLatest.month}} 月 - 10 + {{followLatest.day}} 日 - 星期三 + {{followLatest.week}} diff --git a/src/patient/pages/interactivePatient/index.scss b/src/patient/pages/interactivePatient/index.scss index ef5a1a9..8178bb0 100644 --- a/src/patient/pages/interactivePatient/index.scss +++ b/src/patient/pages/interactivePatient/index.scss @@ -368,6 +368,18 @@ page { align-items: center; justify-content: center; } + .tip { + margin-top: 30rpx; + width: 100%; + height: 76rpx; + font-size: 32rpx; + display: flex; + align-items: center; + justify-content: center; + border-radius: 64rpx 64rpx 64rpx 64rpx; + background: rgba(246, 248, 249, 1); + color: rgba(105, 104, 110, 1); + } } } .follow-form { @@ -407,6 +419,10 @@ page { justify-content: center; background: linear-gradient(180deg, #e98ff8 0%, #b073ff 100%); border-radius: 64rpx 64rpx 64rpx 64rpx; + &.disabled { + background: rgba(246, 248, 249, 1); + color: rgba(105, 104, 110, 1); + } } } .follow-reset { @@ -581,7 +597,7 @@ page { } } } - .follow-result { + .follow-result-reason { margin-bottom: 32rpx; padding: 32rpx; border-radius: 32rpx; @@ -590,14 +606,56 @@ page { font-size: 32rpx; color: rgba(33, 29, 46, 1); } - .list { + .info { margin-top: 20rpx; padding: 24rpx; background-color: rgba(246, 248, 249, 1); border-radius: 16rpx; - .list-item { + .info-item { font-size: 32rpx; + padding-left: 50rpx; color: rgba(33, 29, 46, 1); + .label { + display: inline; + font-weight: bold; + } + .value { + display: inline; + } + &::before { + margin-left: -30rpx; + margin-right: 20rpx; + margin-top: 20rpx; + display: inline-block; + flex-shrink: 0; + content: ''; + width: 10rpx; + height: 10rpx; + border-radius: 50%; + background-color: #7d7d82; + } + &:not(:first-of-type) { + margin-top: 24rpx; + } + } + } + } + .follow-result { + margin-bottom: 32rpx; + padding: 32rpx; + border-radius: 32rpx; + background-color: rgba(185, 130, 255, 1); + .title { + font-size: 32rpx; + color: #fff; + } + .list { + margin-top: 20rpx; + padding: 24rpx; + border-radius: 16rpx; + .list-item { + font-size: 32rpx; + color: #fff; display: flex; .blob { font-weight: bold; @@ -611,7 +669,7 @@ page { width: 10rpx; height: 10rpx; border-radius: 50%; - background-color: #7d7d82; + background-color: #fff; } &:not(:first-of-type) { margin-top: 24rpx; diff --git a/src/patient/pages/interactivePatient/index.ts b/src/patient/pages/interactivePatient/index.ts index 0896ad2..75a2023 100644 --- a/src/patient/pages/interactivePatient/index.ts +++ b/src/patient/pages/interactivePatient/index.ts @@ -4,7 +4,24 @@ const app = getApp() interface IMessageItem { msgId: string - msgContentType: '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '12' // 1:文本 2: 出诊时间 3: adl卡片 4: 语音 5: 欢迎语 6:补充真实姓名 7: 提醒完善信息 8: 复诊卡片 9:患者恢复复诊消息 + msgContentType: + | '1' + | '2' + | '3' + | '4' + | '5' + | '6' + | '7' + | '8' + | '9' + | '10' + | '11' + | '12' + | '13' + | '14' + | '15' + | '16' + | '17' // 1:文本 2: 出诊时间 3: adl卡片 4: 语音 5: 欢迎语 6:补充真实姓名 7: 提醒完善信息 8: 复诊卡片 9:患者恢复复诊消息 13: 患者复诊回复 14: 未复诊原因 15: 患者未复诊原因回复 16: 其他输入 17: 下一步 msgContent: any msgVisitTime: string msgFromType: '1' | '2' // 1: 患者 2: 医生 @@ -18,6 +35,12 @@ interface IMessageItem { ReVisitInfo?: any msgCustomSendStatus?: number | string msgTipsInfo?: string + followUpStatus?: number // 复诊状态,>0 表示已回复 + replyMsgId?: number // 回复消息ID,>0 表示已回复 + followUpTitle?: string // 复诊原因标题 + followUpTitleChoice?: string // 复诊原因多选提示 + selectedReasons?: string[] // 选中的未复诊原因 + otherReason?: string // 其他原因文本 } interface Item { @@ -153,6 +176,34 @@ Page({ item.ReVisitInfo = JSON.parse(item.ReVisitInfo) item.ReVisitInfo.visitDateName = dayjs(item.ReVisitInfo.visitDate).format('YYYY年M月DD日') } + if (item.msgContentType === '14') { + const rawInfo = JSON.parse(item.ReVisitInfo) + // 解析结构:{title, titleChoice, missionReasonList, reasonList} + const missionReasonList = rawInfo.missionReasonList || {} + const reasonList = rawInfo.reasonList || [] + // 将对象转换为数组 {key, label, isSelected} 格式 + item.ReVisitInfo = Object.keys(missionReasonList).map(key => ({ + key, + label: missionReasonList[key], + isSelected: reasonList.includes(key), + })) + item.followUpTitle = rawInfo.title || '请问您没能按时复诊的主要原因是?' + item.followUpTitleChoice = rawInfo.titleChoice || '(多选)' + item.selectedReasons = [...reasonList] + } + if (item.msgContentType === '13') { + const rawInfo = JSON.parse(item.ReVisitInfo) + // 解析结构:{title, lastVisitTitle, visitDate, mySolutionTitle, reVisitSolution} + item.ReVisitInfo = rawInfo + } + if (item.msgContentType === '15') { + const rawInfo = JSON.parse(item.ReVisitInfo) + // 解析结构:{title, reasonInfoList} + const reasonInfoList = rawInfo.reasonInfoList || {} + item.followUpTitle = rawInfo.title || '没能按时复诊的主要原因是?' + // 将 reasonInfoList 对象转换为数组 + item.ReVisitInfo = Object.keys(reasonInfoList).map(key => reasonInfoList[key]) + } return item }) @@ -483,4 +534,141 @@ Page({ }, }) }, + + // 复诊消息回复 - 已复诊/未复诊 + handleFollowUpReply(e: any) { + const { status, mindex } = e.currentTarget.dataset + const { messageList } = this.data + const message = messageList[mindex] + + if (Number(message.followUpStatus) > 0) + return + + wx.ajax({ + method: 'POST', + url: '?r=zd/message-interact/send-reply-followup-message', + data: { + msgId: message.msgId, + followUpStatus: status, // 1-未复诊, 2-已复诊 + }, + loading: true, + }).then((res: any) => { + // 刷新消息列表 + setTimeout(() => { + this.refreshMessageList() + }, 500) + }) + }, + + // 未复诊原因选择 + handleReasonToggle(e: any) { + const { key, mindex } = e.currentTarget.dataset + const { messageList } = this.data + const message = messageList[mindex] + const selectedReasons = message.selectedReasons || [] + + const index = selectedReasons.indexOf(key) + if (index > -1) { + selectedReasons.splice(index, 1) + } + else { + selectedReasons.push(key) + } + + messageList[mindex].selectedReasons = [...selectedReasons] + // 更新每个选项的选中状态 + messageList[mindex].ReVisitInfo = messageList[mindex].ReVisitInfo.map((item: any) => ({ + ...item, + isSelected: selectedReasons.includes(item.key), + })) + this.setData({ messageList }) + }, + + // 提交未复诊原因 + handleReasonSubmit(e: any) { + const { mindex } = e.currentTarget.dataset + const { messageList } = this.data + const message = messageList[mindex] + const selectedReasons = message.selectedReasons || [] + + if (selectedReasons.length === 0) { + wx.showToast({ title: '请选择至少一个原因', icon: 'none' }) + return + } + + // 构建 reasonList 参数 + const data: any = { msgId: message.msgId, reasonList: [] } + selectedReasons.forEach((reason, index) => { + data.reasonList.push(reason) + }) + + wx.ajax({ + method: 'POST', + url: '?r=zd/message-interact/send-reply-followup-reason', + data, + loading: true, + }).then(() => { + // 刷新消息列表 + setTimeout(() => { + this.refreshMessageList() + }, 500) + }) + }, + + // 其他原因输入 + handleOtherReasonInput(e: any) { + const { mindex } = e.currentTarget.dataset + const { messageList } = this.data + messageList[mindex].otherReason = e.detail.value + this.setData({ messageList }) + }, + + // 提交其他原因 (msgContentType 16) + handleOtherReasonSubmit(e: any) { + const { mindex } = e.currentTarget.dataset + const { messageList } = this.data + const message = messageList[mindex] + const otherReason = message.otherReason || '' + + if (!otherReason.trim()) { + wx.showToast({ title: '请输入原因', icon: 'none' }) + return + } + + // TODO: 需要确认 16 类型的提交接口 + wx.ajax({ + method: 'POST', + url: '?r=zd/message-interact/send-reply-followup-reason', + data: { + 'msgId': message.msgId, + 'reasonList[0]': 'other', + 'otherReason': otherReason.trim(), + }, + loading: true, + }).then(() => { + setTimeout(() => { + this.refreshMessageList() + }, 500) + }) + }, + + // 刷新消息列表 + refreshMessageList() { + this.setData({ + messageList: [], + nextMsgId: '', + isFinish: false, + }) + this.getMessageList() + }, + handleResetFollowUp() { + wx.navigateTo({ + url: '/patient/pages/follow/index', + }) + }, + handleNextFollowUp() { + wx.navigateTo({ + url: '/patient/pages/follow/index', + }) + }, }) diff --git a/src/patient/pages/interactivePatient/index.wxml b/src/patient/pages/interactivePatient/index.wxml index 6eeb281..30bdcf1 100644 --- a/src/patient/pages/interactivePatient/index.wxml +++ b/src/patient/pages/interactivePatient/index.wxml @@ -105,33 +105,46 @@ 完善个人信息 - + 您好!出院后的康复需要我们双方共同努力,请问您最近有按照医生的提醒,定期到院复诊吗? - - 已复诊 - 未复诊 + + 已复诊 + 未复诊 + + + 已回复 - + - 请问您没能按时复诊的主要原因是? - (多选) + {{message.followUpTitle}} + {{message.followUpTitleChoice}} - 症状感觉好转,觉得不用去了 + + {{item.label}} + - 提交 + 提交 + 已提交 - - 规范治疗可获得更好的疗效,减少复发。 - 提交 + + {{message.msgContent}} + 重新预约复诊 - - 坚持规范治疗,继续加油,愿身体稳步向好! - 提交 + + {{message.msgContent}} + 设置下一次复诊提醒 @@ -170,20 +183,24 @@ 9.其他 - - 医生您好,我刚刚完成了复诊记录: - - - - 我最近一次复诊时间是: - 2025年6月11日 - + + {{message.ReVisitInfo.title}} + + + {{message.ReVisitInfo.lastVisitTitle}} + {{message.ReVisitInfo.visitDate}} - - - 我的方案是: - 生物制剂IGF-1R抗体(替妥尤单抗)第2次使用替妥尤单抗 - + + {{message.ReVisitInfo.mySolutionTitle}} + {{item}} + + + + + {{message.followUpTitle}} + + + {{item}} diff --git a/src/patient/pages/my/index.wxml b/src/patient/pages/my/index.wxml index 5bca891..7966aca 100644 --- a/src/patient/pages/my/index.wxml +++ b/src/patient/pages/my/index.wxml @@ -26,11 +26,11 @@ - + 健康档案 - + 复诊记录 diff --git a/接口文档.md b/接口文档.md index a63584b..6476857 100644 --- a/接口文档.md +++ b/接口文档.md @@ -1,765 +1,19 @@ -# 突眼日记接口文档 +# 复诊提醒接口文档 -## 一、接口规范 +{"target_id":"1da0b0467b7060","project_id":"359c53","parent_id":"1da09b3c3b705d","target_type":"api","name":"列表","version":766,"sort":1000,"method":"GET","url":"{{m}}?r=xd/follow-up-reminder/list","protocol":"http/1.1","mark_id":"1","description":"","request":{"auth":{"type":"inherit","kv":{"key":"","value":"","in":"header"},"bearer":{"key":""},"basic":{"username":"","password":""},"digest":{"username":"","password":"","realm":"","nonce":"","algorithm":"","qop":"","nc":"","cnonce":"","opaque":""},"hawk":{"authId":"","authKey":"","algorithm":"","user":"","nonce":"","extraData":"","default":"","delegation":"","timestamp":"","includePayloadHash":false},"awsv4":{"accessKey":"","secretKey":"","region":"","service":"","sessionToken":"","addAuthDataToQuery":false},"ntlm":{"username":"","password":"","entity":"","workstation":"","disableRetryRequest":false},"edgegrid":{"accessToken":"","clientToken":"","clientSecret":"","nonce":"","timestamp":"","baseURi":"","headersToSign":""},"oauth1":{"consumerKey":"","consumerSecret":"","signatureMethod":"HMAC-SHA1","addEmptyParamsToSign":true,"includeBodyHash":true,"addParamsToHeader":false,"disableHeaderEncoding":false,"realm":"","version":"1.0","nonce":"","timestamp":"","verifier":"","callback":"","tokenSecret":"","token":""},"jwt":{"addTokenTo":"header","algorithm":"HS256","secret":"","isSecretBase64Encoded":false,"payload":"","headerPrefix":"Bearer","queryParamKey":"token","header":""},"asap":{"alg":"HS256","iss":"","aud":"","kid":"","privateKey":"","sub":"","claims":"","exp":""}},"body":{"mode":"none","parameter":[],"raw":"","raw_parameter":[],"raw_schema":{"type":"object"},"binary":null},"pre_tasks":[],"post_tasks":[],"header":{"parameter":[]},"query":{"query_add_equal":1,"parameter":[{"param_id":"1da0b1717b708d","description":"","field_type":"string","is_checked":1,"key":"r","not_null":1,"value":"xd/follow-up-reminder/list","schema":{"type":"string"}}]},"cookie":{"cookie_encode":1,"parameter":[]},"restful":{"parameter":[]}},"response":{"example":[{"example_id":"1","raw":"{\r\n \"code\": 0,\r\n \"data\": {\r\n \"list\": [\r\n {\r\n \"id\": \"1\",\r\n \"userId\": \"331\",\r\n \"patientId\": \"251\",\r\n \"visitTime\": \"2025-09-09\",\r\n \"treatmentPlan\": \"2,3,4\",\r\n \"treatmentPlanName\": \"激素口服治疗、局部激素注射治疗、传统免疫抑制剂\",\r\n \"teprotumumabCount\": null,\r\n \"nextVisitTime\": \"2026-06-19\",\r\n \"sequence\": 1,\r\n \"remark\": \"sdf\",\r\n \"createTime\": \"2026-06-08 14:26:15\"\r\n },\r\n {\r\n \"id\": \"3\",\r\n \"userId\": \"331\",\r\n \"patientId\": \"251\",\r\n \"visitTime\": \"2025-09-01\",\r\n \"treatmentPlan\": \"2,3,4\",\r\n \"treatmentPlanName\": \"激素口服治疗、局部激素注射治疗、传统免疫抑制剂\",\r\n \"teprotumumabCount\": null,\r\n \"nextVisitTime\": \"2025-09-19\",\r\n \"sequence\": 3,\r\n \"remark\": \"sdf\",\r\n \"createTime\": \"2026-06-09 15:18:36\"\r\n },\r\n {\r\n \"id\": \"2\",\r\n \"userId\": \"331\",\r\n \"patientId\": \"251\",\r\n \"visitTime\": \"2025-05-05\",\r\n \"treatmentPlan\": \"1,2,3\",\r\n \"treatmentPlanName\": \"激素静脉冲击治疗、激素口服治疗、局部激素注射治疗\",\r\n \"teprotumumabCount\": null,\r\n \"nextVisitTime\": \"2026-06-10\",\r\n \"sequence\": 2,\r\n \"remark\": \"\",\r\n \"createTime\": \"2026-06-09 15:15:26\"\r\n }\r\n ],\r\n \"pagination\": {\r\n \"total\": 3,\r\n \"page\": 1,\r\n \"pageSize\": 10\r\n }\r\n }\r\n}","raw_parameter":[{"param_id":"1f118c1ebb7096","description":"","field_type":"number","is_checked":1,"key":"code","not_null":1,"value":"0","schema":{"type":"number"}},{"param_id":"1f118c1ebb7097","description":"","field_type":"object","is_checked":1,"key":"data","not_null":1,"value":"","schema":{"type":"object"}},{"param_id":"1f118c1ebb7098","description":"","field_type":"array","is_checked":1,"key":"data.list","not_null":1,"value":"","schema":{"type":"array"}},{"param_id":"1f118c1ebb7099","description":"","field_type":"string","is_checked":1,"key":"data.list.id","not_null":1,"value":"1","schema":{"type":"string"}},{"param_id":"1f118c1ebb709a","description":"","field_type":"string","is_checked":1,"key":"data.list.userId","not_null":1,"value":"331","schema":{"type":"string"}},{"param_id":"1f118c1ebb709b","description":"患者id","field_type":"string","is_checked":1,"key":"data.list.patientId","not_null":1,"value":"251","schema":{"type":"string"}},{"param_id":"1f118c1ebb709c","description":"复诊时间","field_type":"string","is_checked":1,"key":"data.list.visitTime","not_null":1,"value":"2025-09-09","schema":{"type":"string"}},{"param_id":"1f118c1ebb709d","description":"复诊方案id","field_type":"string","is_checked":1,"key":"data.list.treatmentPlan","not_null":1,"value":"2,3,4","schema":{"type":"string"}},{"param_id":"1f118c1ebb709e","description":"用药方案","field_type":"string","is_checked":1,"key":"data.list.treatmentPlanName","not_null":1,"value":"激素口服治疗、局部激素注射治疗、传统免疫抑制剂","schema":{"type":"string"}},{"param_id":"1f118c1ebb709f","description":"使用替妥尤次数","field_type":"null","is_checked":1,"key":"data.list.teprotumumabCount","not_null":1,"value":"","schema":{"type":"null"}},{"param_id":"1f118c1ebb70a0","description":"下次复诊","field_type":"string","is_checked":1,"key":"data.list.nextVisitTime","not_null":1,"value":"2026-06-19","schema":{"type":"string"}},{"param_id":"1f118c1ebb70a1","description":"设置次数","field_type":"number","is_checked":1,"key":"data.list.sequence","not_null":1,"value":"1","schema":{"type":"number"}},{"param_id":"1f118c1ebb70a2","description":"备注","field_type":"string","is_checked":1,"key":"data.list.remark","not_null":1,"value":"sdf","schema":{"type":"string"}},{"param_id":"1f118c1efb70a3","description":"问卷回答时间","field_type":"string","is_checked":1,"key":"data.list.createTime","not_null":1,"value":"2026-06-08 14:26:15","schema":{"type":"string"}},{"param_id":"1f118c1efb70a4","description":"","field_type":"object","is_checked":1,"key":"data.pagination","not_null":1,"value":"","schema":{"type":"object"}},{"param_id":"1f118c1efb70a5","description":"","field_type":"number","is_checked":1,"key":"data.pagination.total","not_null":1,"value":"3","schema":{"type":"number"}},{"param_id":"1f118c1efb70a6","description":"","field_type":"number","is_checked":1,"key":"data.pagination.page","not_null":1,"value":"1","schema":{"type":"number"}},{"param_id":"1f118c1efb70a7","description":"","field_type":"number","is_checked":1,"key":"data.pagination.pageSize","not_null":1,"value":"10","schema":{"type":"number"}}],"headers":[],"expect":{"code":"200","content_type":"json","is_default":1,"mock":"","name":"成功","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}},{"example_id":"2","raw":"","raw_parameter":[],"headers":[],"expect":{"code":"404","content_type":"json","is_default":-1,"mock":"","name":"失败","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}}],"is_check_result":1},"mock_server_enable":1,"mock_ip_white_list_enable":-1,"mock_ip_white_list":"","mock_show_target_id":0,"attribute_info":{},"tags":[],"created_at":"2026-06-08T14:21:05+08:00","created_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"updated_at":"2026-06-09T17:12:30+08:00","updated_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"status":1,"is_locked":-1} -### 1.1 基本规范 +{"target_id":"1da1b4a57b70a8","project_id":"359c53","parent_id":"1da09b3c3b705d","target_type":"api","name":"创建","version":737,"sort":2000,"method":"POST","url":"{{m}}?r=xd/follow-up-reminder/create","protocol":"http/1.1","mark_id":"1","description":"","request":{"auth":{"type":"inherit","kv":{"key":"","value":"","in":"header"},"bearer":{"key":""},"basic":{"username":"","password":""},"digest":{"username":"","password":"","realm":"","nonce":"","algorithm":"","qop":"","nc":"","cnonce":"","opaque":""},"hawk":{"authId":"","authKey":"","algorithm":"","user":"","nonce":"","extraData":"","default":"","delegation":"","timestamp":"","includePayloadHash":false},"awsv4":{"accessKey":"","secretKey":"","region":"","service":"","sessionToken":"","addAuthDataToQuery":false},"ntlm":{"username":"","password":"","entity":"","workstation":"","disableRetryRequest":false},"edgegrid":{"accessToken":"","clientToken":"","clientSecret":"","nonce":"","timestamp":"","baseURi":"","headersToSign":""},"oauth1":{"consumerKey":"","consumerSecret":"","signatureMethod":"HMAC-SHA1","addEmptyParamsToSign":true,"includeBodyHash":true,"addParamsToHeader":false,"disableHeaderEncoding":false,"realm":"","version":"1.0","nonce":"","timestamp":"","verifier":"","callback":"","tokenSecret":"","token":""},"jwt":{"addTokenTo":"header","algorithm":"HS256","secret":"","isSecretBase64Encoded":false,"payload":"","headerPrefix":"Bearer","queryParamKey":"token","header":""},"asap":{"alg":"HS256","iss":"","aud":"","kid":"","privateKey":"","sub":"","claims":"","exp":""}},"body":{"mode":"form-data","parameter":[{"param_id":"1da1d264f710eb","description":"复诊日期","field_type":"string","is_checked":1,"key":"visitTime","not_null":1,"value":"2025-05-01","content_type":"","file_name":"","file_base64":"","schema":{"type":"string"}},{"param_id":"1da1d333371116","description":"复诊方案","field_type":"string","is_checked":1,"key":"treatmentPlan","not_null":1,"value":"1,2,3","content_type":"","file_name":"","file_base64":"","schema":{"type":"string"}},{"param_id":"1da1da32771141","description":"第几次使用替妥尤","field_type":"string","is_checked":1,"key":"teprotumumabCount","not_null":1,"value":"2","content_type":"","file_name":"","file_base64":"","schema":{"type":"string"}},{"param_id":"1da1dfbff7116c","description":"下次复诊日期","field_type":"string","is_checked":1,"key":"nextVisitTime","not_null":1,"value":"2026-06-06","content_type":"","file_name":"","file_base64":"","schema":{"type":"string"}},{"param_id":"1da1e423371197","description":"备注","field_type":"string","is_checked":1,"key":"remark","not_null":1,"value":"","content_type":"","file_name":"","file_base64":"","schema":{"type":"string"}}],"raw":"","raw_parameter":[],"raw_schema":{"type":"object"},"binary":null},"pre_tasks":[],"post_tasks":[],"header":{"parameter":[]},"query":{"query_add_equal":1,"parameter":[{"param_id":"1da1b6163b70d5","description":"","field_type":"string","is_checked":1,"key":"r","not_null":1,"value":"xd/follow-up-reminder/create","schema":{"type":"string"}}]},"cookie":{"cookie_encode":1,"parameter":[]},"restful":{"parameter":[]}},"response":{"example":[{"example_id":"1","raw":"{\r\n \"code\": 0,\r\n \"data\": {\r\n \"id\": \"1\"\r\n }\r\n}","raw_parameter":[{"param_id":"1da3bef37b7002","description":"","field_type":"number","is_checked":1,"key":"code","not_null":1,"value":"0","schema":{"type":"number"}},{"param_id":"1da3bef37b7003","description":"","field_type":"object","is_checked":1,"key":"data","not_null":1,"value":"","schema":{"type":"object"}},{"param_id":"1da3bef37b7004","description":"","field_type":"string","is_checked":1,"key":"data.id","not_null":1,"value":"1","schema":{"type":"string"}}],"headers":[],"expect":{"code":"200","content_type":"json","is_default":1,"mock":"","name":"成功","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}},{"example_id":"2","raw":"","raw_parameter":[],"headers":[],"expect":{"code":"404","content_type":"json","is_default":-1,"mock":"","name":"失败","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}}],"is_check_result":1},"mock_server_enable":1,"mock_ip_white_list_enable":-1,"mock_ip_white_list":"","mock_show_target_id":0,"attribute_info":{},"tags":[],"created_at":"2026-06-08T14:27:00+08:00","created_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"updated_at":"2026-06-09T15:21:50+08:00","updated_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"status":1,"is_locked":-1} -- **接口路径格式**: `/?r=xd/xxx` (Yii2路由格式) -- **请求方式**: GET / POST -- **返回格式**: JSON -- **字符编码**: UTF-8 -- **用户认证**: 通过Session/Token获取用户ID,接口内部逻辑处理 +{"target_id":"1da2e2007b71f2","project_id":"359c53","parent_id":"1da09b3c3b705d","target_type":"api","name":"更新","version":742,"sort":3000,"method":"POST","url":"{{m}}?r=xd/follow-up-reminder/update","protocol":"http/1.1","mark_id":"1","description":"","request":{"auth":{"type":"inherit","kv":{"key":"","value":"","in":"header"},"bearer":{"key":""},"basic":{"username":"","password":""},"digest":{"username":"","password":"","realm":"","nonce":"","algorithm":"","qop":"","nc":"","cnonce":"","opaque":""},"hawk":{"authId":"","authKey":"","algorithm":"","user":"","nonce":"","extraData":"","default":"","delegation":"","timestamp":"","includePayloadHash":false},"awsv4":{"accessKey":"","secretKey":"","region":"","service":"","sessionToken":"","addAuthDataToQuery":false},"ntlm":{"username":"","password":"","entity":"","workstation":"","disableRetryRequest":false},"edgegrid":{"accessToken":"","clientToken":"","clientSecret":"","nonce":"","timestamp":"","baseURi":"","headersToSign":""},"oauth1":{"consumerKey":"","consumerSecret":"","signatureMethod":"HMAC-SHA1","addEmptyParamsToSign":true,"includeBodyHash":true,"addParamsToHeader":false,"disableHeaderEncoding":false,"realm":"","version":"1.0","nonce":"","timestamp":"","verifier":"","callback":"","tokenSecret":"","token":""},"jwt":{"addTokenTo":"header","algorithm":"HS256","secret":"","isSecretBase64Encoded":false,"payload":"","headerPrefix":"Bearer","queryParamKey":"token","header":""},"asap":{"alg":"HS256","iss":"","aud":"","kid":"","privateKey":"","sub":"","claims":"","exp":""}},"body":{"mode":"form-data","parameter":[{"param_id":"1da2eb3ef71235","description":"","field_type":"string","is_checked":1,"key":"id","not_null":1,"value":"3","content_type":"","file_name":"","file_base64":"","schema":{"type":"string"}},{"param_id":"1da2f088f71260","description":"复诊日期","field_type":"string","is_checked":1,"key":"visitTime","not_null":1,"value":"2025-09-01","content_type":"","file_name":"","file_base64":"","schema":{"type":"string","default":"2025-05-05"}},{"param_id":"1da2fe69b7128b","description":"复诊方案","field_type":"string","is_checked":1,"key":"treatmentPlan","not_null":1,"value":"2,3,4","content_type":"","file_name":"","file_base64":"","schema":{"type":"string","default":"1,2,3"}},{"param_id":"1da3027a3712b6","description":"第几次使用替妥尤","field_type":"string","is_checked":1,"key":"teprotumumabCount","not_null":1,"value":"55","content_type":"","file_name":"","file_base64":"","schema":{"type":"string","default":"2"}},{"param_id":"1da306057712e1","description":"下次复诊日期","field_type":"string","is_checked":1,"key":"nextVisitTime","not_null":1,"value":"2025-09-19","content_type":"","file_name":"","file_base64":"","schema":{"type":"string","default":"2026-06-06"}},{"param_id":"1da30958f7130c","description":"备注","field_type":"string","is_checked":1,"key":"remark","not_null":1,"value":"sdf","content_type":"","file_name":"","file_base64":"","schema":{"type":"string","default":""}}],"raw":"","raw_parameter":[],"raw_schema":{"type":"object"},"binary":null},"pre_tasks":[],"post_tasks":[],"header":{"parameter":[]},"query":{"query_add_equal":1,"parameter":[{"param_id":"1da2e2f9bb721f","description":"","field_type":"string","is_checked":1,"key":"r","not_null":1,"value":"xd/follow-up-reminder/update","schema":{"type":"string"}}]},"cookie":{"cookie_encode":1,"parameter":[]},"restful":{"parameter":[]}},"response":{"example":[{"example_id":"1","raw":"{\r\n \"code\": 0,\r\n \"data\": \"修改成功\"\r\n}","raw_parameter":[{"param_id":"1da3b5667b7000","description":"","field_type":"number","is_checked":1,"key":"code","not_null":1,"value":"0","schema":{"type":"number"}},{"param_id":"1da3b5667b7001","description":"","field_type":"string","is_checked":1,"key":"data","not_null":1,"value":"修改成功","schema":{"type":"string"}}],"headers":[],"expect":{"code":"200","content_type":"json","is_default":1,"mock":"","name":"成功","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}},{"example_id":"2","raw":"","raw_parameter":[],"headers":[],"expect":{"code":"404","content_type":"json","is_default":-1,"mock":"","name":"失败","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}}],"is_check_result":1},"mock_server_enable":1,"mock_ip_white_list_enable":-1,"mock_ip_white_list":"","mock_show_target_id":0,"attribute_info":{},"tags":[],"created_at":"2026-06-08T14:31:28+08:00","created_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"updated_at":"2026-06-09T15:35:48+08:00","updated_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"status":1,"is_locked":-1} -### 1.2 返回格式 +{"target_id":"1da38f417b7367","project_id":"359c53","parent_id":"1da09b3c3b705d","target_type":"api","name":"详情","version":727,"sort":4000,"method":"GET","url":"{{m}}?r=xd/follow-up-reminder/detail&id=1","protocol":"http/1.1","mark_id":"1","description":"","request":{"auth":{"type":"inherit","kv":{"key":"","value":"","in":"header"},"bearer":{"key":""},"basic":{"username":"","password":""},"digest":{"username":"","password":"","realm":"","nonce":"","algorithm":"","qop":"","nc":"","cnonce":"","opaque":""},"hawk":{"authId":"","authKey":"","algorithm":"","user":"","nonce":"","extraData":"","default":"","delegation":"","timestamp":"","includePayloadHash":false},"awsv4":{"accessKey":"","secretKey":"","region":"","service":"","sessionToken":"","addAuthDataToQuery":false},"ntlm":{"username":"","password":"","entity":"","workstation":"","disableRetryRequest":false},"edgegrid":{"accessToken":"","clientToken":"","clientSecret":"","nonce":"","timestamp":"","baseURi":"","headersToSign":""},"oauth1":{"consumerKey":"","consumerSecret":"","signatureMethod":"HMAC-SHA1","addEmptyParamsToSign":true,"includeBodyHash":true,"addParamsToHeader":false,"disableHeaderEncoding":false,"realm":"","version":"1.0","nonce":"","timestamp":"","verifier":"","callback":"","tokenSecret":"","token":""},"jwt":{"addTokenTo":"header","algorithm":"HS256","secret":"","isSecretBase64Encoded":false,"payload":"","headerPrefix":"Bearer","queryParamKey":"token","header":""},"asap":{"alg":"HS256","iss":"","aud":"","kid":"","privateKey":"","sub":"","claims":"","exp":""}},"body":{"mode":"none","parameter":[],"raw":"","raw_parameter":[],"raw_schema":{"type":"object"},"binary":null},"pre_tasks":[],"post_tasks":[],"header":{"parameter":[]},"query":{"query_add_equal":1,"parameter":[{"param_id":"1da39068bb7394","description":"","field_type":"string","is_checked":1,"key":"r","not_null":1,"value":"xd/follow-up-reminder/detail","schema":{"type":"string"}},{"param_id":"1da3a5befb73af","description":"","field_type":"string","is_checked":1,"key":"id","not_null":1,"value":"1","schema":{"type":"string"}}]},"cookie":{"cookie_encode":1,"parameter":[]},"restful":{"parameter":[]}},"response":{"example":[{"example_id":"1","raw":"{\r\n \"code\": 0,\r\n \"data\": {\r\n \"id\": \"1\",\r\n \"userId\": \"331\",\r\n \"patientId\": \"251\",\r\n \"visitTime\": \"2025-09-09\",\r\n \"treatmentPlan\": \"2,3,4\",\r\n \"treatmentPlanName\": \"激素口服治疗、局部激素注射治疗、传统免疫抑制剂\",\r\n \"teprotumumabCount\": null,\r\n \"nextVisitTime\": \"2025-09-19\",\r\n \"remark\": \"sdf\",\r\n \"createTime\": \"2026-06-08 14:26:15\",\r\n \"updateTime\": \"2026-06-08 14:31:32\"\r\n }\r\n}","raw_parameter":[{"param_id":"1da4257a3b7016","description":"","field_type":"number","is_checked":1,"key":"code","not_null":1,"value":"0","schema":{"type":"number"}},{"param_id":"1da4257a3b7017","description":"","field_type":"object","is_checked":1,"key":"data","not_null":1,"value":"","schema":{"type":"object"}},{"param_id":"1da4257a3b7018","description":"","field_type":"string","is_checked":1,"key":"data.id","not_null":1,"value":"1","schema":{"type":"string"}},{"param_id":"1da4257a7b7019","description":"","field_type":"string","is_checked":1,"key":"data.userId","not_null":1,"value":"331","schema":{"type":"string"}},{"param_id":"1da4257a7b701a","description":"","field_type":"string","is_checked":1,"key":"data.patientId","not_null":1,"value":"251","schema":{"type":"string"}},{"param_id":"1da4257a7b701b","description":"复诊日期","field_type":"string","is_checked":1,"key":"data.visitTime","not_null":1,"value":"2025-09-09","schema":{"type":"string"}},{"param_id":"1da4257a7b701c","description":"复诊方案","field_type":"string","is_checked":1,"key":"data.treatmentPlan","not_null":1,"value":"2,3,4","schema":{"type":"string"}},{"param_id":"1da4257a7b701d","description":"复诊方案信息","field_type":"string","is_checked":1,"key":"data.treatmentPlanName","not_null":1,"value":"激素口服治疗、局部激素注射治疗、传统免疫抑制剂","schema":{"type":"string"}},{"param_id":"1da4257a7b701e","description":"第几次使用替妥尤","field_type":"null","is_checked":1,"key":"data.teprotumumabCount","not_null":1,"value":"","schema":{"type":"null"}},{"param_id":"1da4257a7b701f","description":"下次复诊日期","field_type":"string","is_checked":1,"key":"data.nextVisitTime","not_null":1,"value":"2025-09-19","schema":{"type":"string"}},{"param_id":"1da4257a7b7020","description":"备注","field_type":"string","is_checked":1,"key":"data.remark","not_null":1,"value":"sdf","schema":{"type":"string"}},{"param_id":"1da4257a7b7021","description":"","field_type":"string","is_checked":1,"key":"data.createTime","not_null":1,"value":"2026-06-08 14:26:15","schema":{"type":"string"}},{"param_id":"1da4257a7b7022","description":"","field_type":"string","is_checked":1,"key":"data.updateTime","not_null":1,"value":"2026-06-08 14:31:32","schema":{"type":"string"}}],"headers":[],"expect":{"code":"200","content_type":"json","is_default":1,"mock":"","name":"成功","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}},{"example_id":"2","raw":"","raw_parameter":[],"headers":[],"expect":{"code":"404","content_type":"json","is_default":-1,"mock":"","name":"失败","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}}],"is_check_result":1},"mock_server_enable":1,"mock_ip_white_list_enable":-1,"mock_ip_white_list":"","mock_show_target_id":0,"attribute_info":{},"tags":[],"created_at":"2026-06-08T14:33:54+08:00","created_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"updated_at":"2026-06-08T14:36:04+08:00","updated_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"status":1,"is_locked":-1} -```json -{ - "code": 0, - "msg": "success", - "data": {} -} -``` +{"target_id":"1da432ca7b74bf","project_id":"359c53","parent_id":"1da09b3c3b705d","target_type":"api","name":"删除","version":730,"sort":5000,"method":"POST","url":"{{m}}?r=xd/follow-up-reminder/delete","protocol":"http/1.1","mark_id":"1","description":"","request":{"auth":{"type":"inherit","kv":{"key":"","value":"","in":"header"},"bearer":{"key":""},"basic":{"username":"","password":""},"digest":{"username":"","password":"","realm":"","nonce":"","algorithm":"","qop":"","nc":"","cnonce":"","opaque":""},"hawk":{"authId":"","authKey":"","algorithm":"","user":"","nonce":"","extraData":"","default":"","delegation":"","timestamp":"","includePayloadHash":false},"awsv4":{"accessKey":"","secretKey":"","region":"","service":"","sessionToken":"","addAuthDataToQuery":false},"ntlm":{"username":"","password":"","entity":"","workstation":"","disableRetryRequest":false},"edgegrid":{"accessToken":"","clientToken":"","clientSecret":"","nonce":"","timestamp":"","baseURi":"","headersToSign":""},"oauth1":{"consumerKey":"","consumerSecret":"","signatureMethod":"HMAC-SHA1","addEmptyParamsToSign":true,"includeBodyHash":true,"addParamsToHeader":false,"disableHeaderEncoding":false,"realm":"","version":"1.0","nonce":"","timestamp":"","verifier":"","callback":"","tokenSecret":"","token":""},"jwt":{"addTokenTo":"header","algorithm":"HS256","secret":"","isSecretBase64Encoded":false,"payload":"","headerPrefix":"Bearer","queryParamKey":"token","header":""},"asap":{"alg":"HS256","iss":"","aud":"","kid":"","privateKey":"","sub":"","claims":"","exp":""}},"body":{"mode":"form-data","parameter":[{"param_id":"1da446e5371503","description":"复诊记录id","field_type":"string","is_checked":1,"key":"id","not_null":1,"value":"1","content_type":"","file_name":"","file_base64":"","schema":{"type":"string"}}],"raw":"","raw_parameter":[],"raw_schema":{"type":"object"},"binary":null},"pre_tasks":[],"post_tasks":[],"header":{"parameter":[]},"query":{"query_add_equal":1,"parameter":[{"param_id":"1da433dabb74ec","description":"","field_type":"string","is_checked":1,"key":"r","not_null":1,"value":"xd/follow-up-reminder/delete","schema":{"type":"string"}}]},"cookie":{"cookie_encode":1,"parameter":[]},"restful":{"parameter":[]}},"response":{"example":[{"example_id":"1","raw":"{\r\n \"code\": 0,\r\n \"data\": {\r\n \"success\": true\r\n }\r\n}","raw_parameter":[{"param_id":"1da51513fb7023","description":"","field_type":"number","is_checked":1,"key":"code","not_null":1,"value":"0","schema":{"type":"number"}},{"param_id":"1da51513fb7024","description":"","field_type":"object","is_checked":1,"key":"data","not_null":1,"value":"","schema":{"type":"object"}},{"param_id":"1da51513fb7025","description":"","field_type":"boolean","is_checked":1,"key":"data.success","not_null":1,"value":"true","schema":{"type":"boolean"}}],"headers":[],"expect":{"code":"200","content_type":"json","is_default":1,"mock":"","name":"成功","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}},{"example_id":"2","raw":"","raw_parameter":[],"headers":[],"expect":{"code":"404","content_type":"json","is_default":-1,"mock":"","name":"失败","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}}],"is_check_result":1},"mock_server_enable":1,"mock_ip_white_list_enable":-1,"mock_ip_white_list":"","mock_show_target_id":0,"attribute_info":{},"tags":[],"created_at":"2026-06-08T14:36:18+08:00","created_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"updated_at":"2026-06-08T14:40:05+08:00","updated_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"status":1,"is_locked":-1} -### 1.3 错误码说明 +{"target_id":"1f1d9ef2bb7986","project_id":"359c53","parent_id":"1da09b3c3b705d","target_type":"api","name":"枚举数据","version":780,"sort":10000,"method":"GET","url":"{{m}}?r=xd/follow-up-reminder/enum","protocol":"http/1.1","mark_id":"1","description":"","request":{"auth":{"type":"inherit","kv":{"key":"","value":"","in":"header"},"bearer":{"key":""},"basic":{"username":"","password":""},"digest":{"username":"","password":"","realm":"","nonce":"","algorithm":"","qop":"","nc":"","cnonce":"","opaque":""},"hawk":{"authId":"","authKey":"","algorithm":"","user":"","nonce":"","extraData":"","default":"","delegation":"","timestamp":"","includePayloadHash":false},"awsv4":{"accessKey":"","secretKey":"","region":"","service":"","sessionToken":"","addAuthDataToQuery":false},"ntlm":{"username":"","password":"","entity":"","workstation":"","disableRetryRequest":false},"edgegrid":{"accessToken":"","clientToken":"","clientSecret":"","nonce":"","timestamp":"","baseURi":"","headersToSign":""},"oauth1":{"consumerKey":"","consumerSecret":"","signatureMethod":"HMAC-SHA1","addEmptyParamsToSign":true,"includeBodyHash":true,"addParamsToHeader":false,"disableHeaderEncoding":false,"realm":"","version":"1.0","nonce":"","timestamp":"","verifier":"","callback":"","tokenSecret":"","token":""},"jwt":{"addTokenTo":"header","algorithm":"HS256","secret":"","isSecretBase64Encoded":false,"payload":"","headerPrefix":"Bearer","queryParamKey":"token","header":""},"asap":{"alg":"HS256","iss":"","aud":"","kid":"","privateKey":"","sub":"","claims":"","exp":""}},"body":{"mode":"none","parameter":[],"raw":"","raw_parameter":[],"raw_schema":{"type":"object"},"binary":null},"pre_tasks":[],"post_tasks":[],"header":{"parameter":[]},"query":{"query_add_equal":1,"parameter":[{"param_id":"1f1d9fd47b79b3","description":"","field_type":"string","is_checked":1,"key":"r","not_null":1,"value":"xd/follow-up-reminder/enum","schema":{"type":"string"}}]},"cookie":{"cookie_encode":1,"parameter":[]},"restful":{"parameter":[]}},"response":{"example":[{"example_id":"1","raw":"{\r\n \"code\": 0,\r\n \"data\": {\r\n \"treatmentPlan\": {\r\n \"1\": \"激素静脉冲击治疗\",\r\n \"2\": \"激素口服治疗\",\r\n \"3\": \"局部激素注射治疗\",\r\n \"4\": \"传统免疫抑制剂\",\r\n \"5\": \"生物制剂IGF-1R抗体/替妥尤单抗\",\r\n \"6\": \"生物制剂CD20抗体\",\r\n \"7\": \"生物制剂IL-6受体抗体\",\r\n \"8\": \"放射治疗\",\r\n \"9\": \"手术治疗\"\r\n },\r\n \"nextVisitInterval\": {\r\n \"21\": \"21天后\",\r\n \"30\": \"1个月后\",\r\n \"60\": \"2个月后\"\r\n },\r\n \"missReason\": {\r\n \"symptomsImproved\": \"症状感觉好转,觉得不用去了\",\r\n \"cnnotRegister\": \"挂不上号/预约不上\",\r\n \"timeDonflict\": \"时间冲突/工作太忙\",\r\n \"costIssue\": \"费用或报销问题\",\r\n \"forgot\": \"忘记了/疏忽了\",\r\n \"other\": \"其他原因\"\r\n }\r\n }\r\n}","raw_parameter":[{"param_id":"1f1db9d6fb70bf","description":"","field_type":"number","is_checked":1,"key":"code","not_null":1,"value":"0","schema":{"type":"number"}},{"param_id":"1f1db9d6fb70c0","description":"","field_type":"object","is_checked":1,"key":"data","not_null":1,"value":"","schema":{"type":"object"}},{"param_id":"1f1db9d6fb70c1","description":"复诊方案","field_type":"object","is_checked":1,"key":"data.treatmentPlan","not_null":1,"value":"","schema":{"type":"object"}},{"param_id":"1f1db9d6fb70c2","description":"","field_type":"string","is_checked":1,"key":"data.treatmentPlan.1","not_null":1,"value":"激素静脉冲击治疗","schema":{"type":"string"}},{"param_id":"1f1db9d6fb70c3","description":"","field_type":"string","is_checked":1,"key":"data.treatmentPlan.2","not_null":1,"value":"激素口服治疗","schema":{"type":"string"}},{"param_id":"1f1db9d6fb70c4","description":"","field_type":"string","is_checked":1,"key":"data.treatmentPlan.3","not_null":1,"value":"局部激素注射治疗","schema":{"type":"string"}},{"param_id":"1f1db9d6fb70c5","description":"","field_type":"string","is_checked":1,"key":"data.treatmentPlan.4","not_null":1,"value":"传统免疫抑制剂","schema":{"type":"string"}},{"param_id":"1f1db9d6fb70c6","description":"","field_type":"string","is_checked":1,"key":"data.treatmentPlan.5","not_null":1,"value":"生物制剂IGF-1R抗体/替妥尤单抗","schema":{"type":"string"}},{"param_id":"1f1db9d6fb70c7","description":"","field_type":"string","is_checked":1,"key":"data.treatmentPlan.6","not_null":1,"value":"生物制剂CD20抗体","schema":{"type":"string"}},{"param_id":"1f1db9d6fb70c8","description":"","field_type":"string","is_checked":1,"key":"data.treatmentPlan.7","not_null":1,"value":"生物制剂IL-6受体抗体","schema":{"type":"string"}},{"param_id":"1f1db9d6fb70c9","description":"","field_type":"string","is_checked":1,"key":"data.treatmentPlan.8","not_null":1,"value":"放射治疗","schema":{"type":"string"}},{"param_id":"1f1db9d6fb70ca","description":"","field_type":"string","is_checked":1,"key":"data.treatmentPlan.9","not_null":1,"value":"手术治疗","schema":{"type":"string"}},{"param_id":"1f1db9d6fb70cb","description":"下次时间项","field_type":"object","is_checked":1,"key":"data.nextVisitInterval","not_null":1,"value":"","schema":{"type":"object"}},{"param_id":"1f1db9d6fb70cc","description":"","field_type":"string","is_checked":1,"key":"data.nextVisitInterval.21","not_null":1,"value":"21天后","schema":{"type":"string"}},{"param_id":"1f1db9d6fb70cd","description":"","field_type":"string","is_checked":1,"key":"data.nextVisitInterval.30","not_null":1,"value":"1个月后","schema":{"type":"string"}},{"param_id":"1f1db9d6fb70ce","description":"","field_type":"string","is_checked":1,"key":"data.nextVisitInterval.60","not_null":1,"value":"2个月后","schema":{"type":"string"}},{"param_id":"1f1db9d6fb70cf","description":"未复诊原因列表","field_type":"object","is_checked":1,"key":"data.missReason","not_null":1,"value":"","schema":{"type":"object"}},{"param_id":"1f1db9d6fb70d0","description":"","field_type":"string","is_checked":1,"key":"data.missReason.symptomsImproved","not_null":1,"value":"症状感觉好转,觉得不用去了","schema":{"type":"string"}},{"param_id":"1f1db9d6fb70d1","description":"","field_type":"string","is_checked":1,"key":"data.missReason.cnnotRegister","not_null":1,"value":"挂不上号/预约不上","schema":{"type":"string"}},{"param_id":"1f1db9d6fb70d2","description":"","field_type":"string","is_checked":1,"key":"data.missReason.timeDonflict","not_null":1,"value":"时间冲突/工作太忙","schema":{"type":"string"}},{"param_id":"1f1db9d6fb70d3","description":"","field_type":"string","is_checked":1,"key":"data.missReason.costIssue","not_null":1,"value":"费用或报销问题","schema":{"type":"string"}},{"param_id":"1f1db9d73b70d4","description":"","field_type":"string","is_checked":1,"key":"data.missReason.forgot","not_null":1,"value":"忘记了/疏忽了","schema":{"type":"string"}},{"param_id":"1f1db9d73b70d5","description":"","field_type":"string","is_checked":1,"key":"data.missReason.other","not_null":1,"value":"其他原因","schema":{"type":"string"}}],"headers":[],"expect":{"code":"200","content_type":"json","is_default":1,"mock":"","name":"成功","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}},{"example_id":"2","raw":"","raw_parameter":[],"headers":[],"expect":{"code":"404","content_type":"json","is_default":-1,"mock":"","name":"失败","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}}],"is_check_result":1},"mock_server_enable":1,"mock_ip_white_list_enable":-1,"mock_ip_white_list":"","mock_show_target_id":0,"attribute_info":{},"tags":[],"created_at":"2026-06-09T18:05:18+08:00","created_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"updated_at":"2026-06-09T18:06:12+08:00","updated_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"status":1,"is_locked":-1} -| 错误码 | 说明 | -| ------ | -------------- | -| 0 | 成功 | -| 400 | 参数错误 | -| 401 | 未授权 | -| 403 | 禁止访问 | -| 404 | 资源不存在 | -| 500 | 服务器内部错误 | +{"target_id":"1da88fbc3b769a","project_id":"359c53","parent_id":"1da09b3c3b705d","target_type":"api","name":"获取最近的复诊记录","version":782,"sort":6000,"method":"GET","url":"{{m}}?r=xd/follow-up-reminder/latest","protocol":"http/1.1","mark_id":"1","description":"","request":{"auth":{"type":"inherit","kv":{"key":"","value":"","in":"header"},"bearer":{"key":""},"basic":{"username":"","password":""},"digest":{"username":"","password":"","realm":"","nonce":"","algorithm":"","qop":"","nc":"","cnonce":"","opaque":""},"hawk":{"authId":"","authKey":"","algorithm":"","user":"","nonce":"","extraData":"","default":"","delegation":"","timestamp":"","includePayloadHash":false},"awsv4":{"accessKey":"","secretKey":"","region":"","service":"","sessionToken":"","addAuthDataToQuery":false},"ntlm":{"username":"","password":"","entity":"","workstation":"","disableRetryRequest":false},"edgegrid":{"accessToken":"","clientToken":"","clientSecret":"","nonce":"","timestamp":"","baseURi":"","headersToSign":""},"oauth1":{"consumerKey":"","consumerSecret":"","signatureMethod":"HMAC-SHA1","addEmptyParamsToSign":true,"includeBodyHash":true,"addParamsToHeader":false,"disableHeaderEncoding":false,"realm":"","version":"1.0","nonce":"","timestamp":"","verifier":"","callback":"","tokenSecret":"","token":""},"jwt":{"addTokenTo":"header","algorithm":"HS256","secret":"","isSecretBase64Encoded":false,"payload":"","headerPrefix":"Bearer","queryParamKey":"token","header":""},"asap":{"alg":"HS256","iss":"","aud":"","kid":"","privateKey":"","sub":"","claims":"","exp":""}},"body":{"mode":"none","parameter":[],"raw":"","raw_parameter":[],"raw_schema":{"type":"object"},"binary":null},"pre_tasks":[],"post_tasks":[],"header":{"parameter":[]},"query":{"query_add_equal":1,"parameter":[{"param_id":"1da890dd3b76c7","description":"","field_type":"string","is_checked":1,"key":"r","not_null":1,"value":"xd/follow-up-reminder/latest","schema":{"type":"string"}}]},"cookie":{"cookie_encode":1,"parameter":[]},"restful":{"parameter":[]}},"response":{"example":[{"example_id":"1","raw":"{\r\n \"code\": 0,\r\n \"data\": {\r\n \"id\": \"1\",\r\n \"userId\": \"331\",\r\n \"patientId\": \"251\",\r\n \"visitTime\": \"2025-09-09\",\r\n \"treatmentPlan\": \"2,3,4\",\r\n \"treatmentPlanName\": \"激素口服治疗、局部激素注射治疗、传统免疫抑制剂\",\r\n \"teprotumumabCount\": null,\r\n \"nextVisitTime\": \"2026-06-19\",\r\n \"sequence\": 1,\r\n \"remainingDays\": 10,\r\n \"remark\": \"sdf\",\r\n \"createTime\": \"2026-06-08 14:26:15\"\r\n }\r\n}","raw_parameter":[{"param_id":"1f24c2ec7b70d6","description":"","field_type":"number","is_checked":1,"key":"code","not_null":1,"value":"0","schema":{"type":"number"}},{"param_id":"1f24c2ec7b70d7","description":"","field_type":"object","is_checked":1,"key":"data","not_null":1,"value":"","schema":{"type":"object"}},{"param_id":"1f24c2ec7b70d8","description":"","field_type":"string","is_checked":1,"key":"data.id","not_null":1,"value":"1","schema":{"type":"string"}},{"param_id":"1f24c2ec7b70d9","description":"","field_type":"string","is_checked":1,"key":"data.userId","not_null":1,"value":"331","schema":{"type":"string"}},{"param_id":"1f24c2ec7b70da","description":"","field_type":"string","is_checked":1,"key":"data.patientId","not_null":1,"value":"251","schema":{"type":"string"}},{"param_id":"1f24c2ec7b70db","description":"复诊时间","field_type":"string","is_checked":1,"key":"data.visitTime","not_null":1,"value":"2025-09-09","schema":{"type":"string"}},{"param_id":"1f24c2ec7b70dc","description":"复诊方案","field_type":"string","is_checked":1,"key":"data.treatmentPlan","not_null":1,"value":"2,3,4","schema":{"type":"string"}},{"param_id":"1f24c2ec7b70dd","description":"复诊方案名称","field_type":"string","is_checked":1,"key":"data.treatmentPlanName","not_null":1,"value":"激素口服治疗、局部激素注射治疗、传统免疫抑制剂","schema":{"type":"string"}},{"param_id":"1f24c2ec7b70de","description":"第几次使用替妥尤","field_type":"null","is_checked":1,"key":"data.teprotumumabCount","not_null":1,"value":"","schema":{"type":"null"}},{"param_id":"1f24c2ec7b70df","description":"下次复诊时间","field_type":"string","is_checked":1,"key":"data.nextVisitTime","not_null":1,"value":"2026-06-19","schema":{"type":"string"}},{"param_id":"1f24c2ec7b70e0","description":"","field_type":"number","is_checked":1,"key":"data.sequence","not_null":1,"value":"1","schema":{"type":"number"}},{"param_id":"1f24c2ec7b70e1","description":"距离下次复诊还剩天数","field_type":"number","is_checked":1,"key":"data.remainingDays","not_null":1,"value":"10","schema":{"type":"number"}},{"param_id":"1f24c2ec7b70e2","description":"","field_type":"string","is_checked":1,"key":"data.remark","not_null":1,"value":"sdf","schema":{"type":"string"}},{"param_id":"1f24c2ecbb70e3","description":"复诊记录创建时间","field_type":"string","is_checked":1,"key":"data.createTime","not_null":1,"value":"2026-06-08 14:26:15","schema":{"type":"string"}}],"headers":[],"expect":{"code":"200","content_type":"json","is_default":1,"mock":"","name":"成功","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}},{"example_id":"2","raw":"","raw_parameter":[],"headers":[],"expect":{"code":"404","content_type":"json","is_default":-1,"mock":"","name":"失败","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}}],"is_check_result":1},"mock_server_enable":1,"mock_ip_white_list_enable":-1,"mock_ip_white_list":"","mock_show_target_id":0,"attribute_info":{},"tags":[],"created_at":"2026-06-08T14:55:24+08:00","created_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"updated_at":"2026-06-09T18:38:01+08:00","updated_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"status":1,"is_locked":-1} ---- +{"target_id":"1ef58cf67b707a","project_id":"359c53","parent_id":"1da09b3c3b705d","target_type":"api","name":"患者回复复诊消息","version":752,"sort":8000,"method":"POST","url":"{{m}}?r=zd/message-interact/send-reply-followup-message","protocol":"http/1.1","mark_id":"1","description":"","request":{"auth":{"type":"inherit","kv":{"key":"","value":"","in":"header"},"bearer":{"key":""},"basic":{"username":"","password":""},"digest":{"username":"","password":"","realm":"","nonce":"","algorithm":"","qop":"","nc":"","cnonce":"","opaque":""},"hawk":{"authId":"","authKey":"","algorithm":"","user":"","nonce":"","extraData":"","default":"","delegation":"","timestamp":"","includePayloadHash":false},"awsv4":{"accessKey":"","secretKey":"","region":"","service":"","sessionToken":"","addAuthDataToQuery":false},"ntlm":{"username":"","password":"","entity":"","workstation":"","disableRetryRequest":false},"edgegrid":{"accessToken":"","clientToken":"","clientSecret":"","nonce":"","timestamp":"","baseURi":"","headersToSign":""},"oauth1":{"consumerKey":"","consumerSecret":"","signatureMethod":"HMAC-SHA1","addEmptyParamsToSign":true,"includeBodyHash":true,"addParamsToHeader":false,"disableHeaderEncoding":false,"realm":"","version":"1.0","nonce":"","timestamp":"","verifier":"","callback":"","tokenSecret":"","token":""},"jwt":{"addTokenTo":"header","algorithm":"HS256","secret":"","isSecretBase64Encoded":false,"payload":"","headerPrefix":"Bearer","queryParamKey":"token","header":""},"asap":{"alg":"HS256","iss":"","aud":"","kid":"","privateKey":"","sub":"","claims":"","exp":""}},"body":{"mode":"form-data","parameter":[{"param_id":"1efb7628371161","description":"消息id","field_type":"string","is_checked":1,"key":"msgId","not_null":1,"value":"1457","content_type":"","file_name":"","file_base64":"","schema":{"type":"string","default":"1457"}},{"param_id":"1efb7799371195","description":"复诊状态,1-未复诊,2-已复诊","field_type":"string","is_checked":1,"key":"followUpStatus","not_null":1,"value":"2","content_type":"","file_name":"","file_base64":"","schema":{"type":"string"}}],"raw":"","raw_parameter":[],"raw_schema":{"type":"object"},"binary":null},"pre_tasks":[],"post_tasks":[],"header":{"parameter":[]},"query":{"query_add_equal":1,"parameter":[{"param_id":"1ef58e443b70a7","description":"","field_type":"string","is_checked":1,"key":"r","not_null":1,"value":"zd/message-interact/send-reply-followup-message","schema":{"type":"string"}}]},"cookie":{"cookie_encode":1,"parameter":[]},"restful":{"parameter":[]}},"response":{"example":[{"example_id":"1","raw":"{\r\n \"code\": 0,\r\n \"data\": 1462\r\n}","raw_parameter":[{"param_id":"1efd23863b7027","description":"","field_type":"number","is_checked":1,"key":"code","not_null":1,"value":"0","schema":{"type":"number"}},{"param_id":"1efd23863b7028","description":"","field_type":"number","is_checked":1,"key":"data","not_null":1,"value":"1462","schema":{"type":"number"}}],"headers":[],"expect":{"code":"200","content_type":"json","is_default":1,"mock":"","name":"成功","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}},{"example_id":"2","raw":"","raw_parameter":[],"headers":[],"expect":{"code":"404","content_type":"json","is_default":-1,"mock":"","name":"失败","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}}],"is_check_result":1},"mock_server_enable":1,"mock_ip_white_list_enable":-1,"mock_ip_white_list":"","mock_show_target_id":0,"attribute_info":{},"tags":[],"created_at":"2026-06-09T15:11:09+08:00","created_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"updated_at":"2026-06-09T15:58:00+08:00","updated_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"status":1,"is_locked":-1} -## 二、患者端接口 - -### 2.1 获取基准照设置状态 - -#### 接口信息 - -- **接口路径**: `/?r=xd/proptosis/baseline-status` -- **请求方式**: GET -- **代码位置**: `shop/modules/xd_frontend/controllers/ProptosisController.php` -- **认证方式**: 内部获取当前登录用户ID - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| ---------------- | ------ | -------------------- | -| hasBaseline | bool | 是否已设置基准照 | -| baselineRecordId | string | 基准照记录ID(如果有) | - ---- - -### 2.2 获取突眼记录列表 - -#### 接口信息 - -- **接口路径**: `/?r=xd/proptosis/record-list` -- **请求方式**: GET -- **代码位置**: `shop/modules/xd_frontend/controllers/ProptosisController.php` -- **认证方式**: 内部获取当前登录用户ID - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ---- | ---- | ---------------- | -| page | int | 否 | 页码(默认1) | -| pageSize | int | 否 | 每页数量(默认10) | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| --------------------------- | ------- | ------------------------------- | -| list[].recordId | string | 记录ID | -| list[].recordDate | string | 记录日期 | -| list[].isBaseline | int | 是否基准照(0-否,1-是) | -| list[].photoCount | int | 已上传照片数量 | -| list[].firstPhotoUrl | string | 第一张角度图片 | -| list[].treatmentCount | int | 替妥尤单抗使用次数 | -| list[].leftEye | decimal | 左眼凸眼度(mm) | -| list[].rightEye | decimal | 右眼凸眼度(mm) | -| list[].interorbitalDistance | decimal | 框间距(mm) | -| list[].uploadCompleted | int | 上传是否完成(0-未完成,1-已完成) | -| pagination.total | int | 总记录数 | -| pagination.page | int | 当前页码 | -| pagination.pageSize | int | 每页数量 | - ---- - -### 2.3 获取突眼记录详情 - -#### 接口信息 - -- **接口路径**: `/?r=xd/proptosis/record-detail` -- **请求方式**: GET -- **代码位置**: `shop/modules/xd_frontend/controllers/ProptosisController.php` -- **认证方式**: 内部获取当前登录用户ID - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------ | ---- | ------ | -| recordId | string | 是 | 记录ID | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| ----------------------- | ------- | ------------------------------- | -| recordId | string | 记录ID | -| recordDate | string | 记录日期 | -| treatmentCount | int | 替妥尤单抗使用次数 | -| isBaseline | int | 是否基准照(0-否,1-是) | -| leftEye | decimal | 左眼凸眼度(mm) | -| rightEye | decimal | 右眼凸眼度(mm) | -| interorbitalDistance | decimal | 框间距(mm) | -| uploadCompleted | int | 上传是否完成(0-未完成,1-已完成) | -| photos[] | array | 照片列表 | -| photos[].photoId | string | 照片ID | -| photos[].photoAngle | string | 照片角度 | -| photos[].photoAngleName | string | 照片角度名称 | -| photos[].photoUrl | string | 照片链接 | -| photos[].uploadTime | string | 上传时间 | - ---- - -### 2.4 创建/更新突眼记录(含图片ID列表) - -#### 接口信息 - -- **接口路径**: `/?r=xd/proptosis/record-save` -- **请求方式**: POST -- **代码位置**: `shop/modules/xd_frontend/controllers/ProptosisController.php` -- **认证方式**: 内部获取当前登录用户ID -- **Content-Type**: application/json - -#### 请求参数(修订) - -| 参数名 | 类型 | 必填 | 说明 | -| -------------------- | ------- | ---- | ---------------------------------------------------- | -| recordId | string | 否 | 记录ID(更新时必填) | -| recordDate | string | 是 | 记录日期(YYYY-MM-DD) | -| treatmentCount | int | 是 | 替妥尤单抗使用次数(0-9,9表示大于8) | -| isBaseline | int | 是 | 是否基准照(0-否,1-是) | -| leftEye | decimal | 否 | 左眼凸眼度(mm) | -| rightEye | decimal | 否 | 右眼凸眼度(mm) | -| interorbitalDistance | decimal | 否 | 框间距(mm) | -| photoIds | string | 否 | 图片ID列表(多个用逗号分隔,photoUpload返回的photoId) | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| -------- | ------ | ------ | -| recordId | string | 记录ID | - -#### 业务流程(修订后) - -1. 前端:点击保存按钮时,先调用 photo-checker 上传照片(此时没有recordId,返回临时photoId) -2. 前端:然后调用 record-save 保存基本信息(含photoIds),将照片关联到记录 -3. 这样设计是因为只有一个保存按钮,需要先创建记录,再上传照片 - -#### 业务规则 - -- 同一天只能创建一条记录,若已存在返回错误提示:"该日期已有记录,同一天不可重复记录" - ---- - -### 2.5 上传照片(含图片安全校验) - -#### 接口信息 - -- **接口路径**: `/?r=xd/proptosis/photo-checker` -- **请求方式**: POST -- **代码位置**: `shop/modules/xd_frontend/controllers/ProptosisController.php` -- **认证方式**: 内部获取当前登录用户ID -- **Content-Type**: application/json - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| ---------- | ------ | ---- | ------------------------------------ | -| recordId | string | 否 | 记录ID(创建记录后可传,用于关联记录) | -| sessionId | string | 否 | 会话ID | -| photoAngle | string | 是 | 照片角度 | -| photoUrl | string | 是 | 照片链接 | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| ----------- | ------ | -------------------------------------------------- | -| photoId | string | 照片ID(用于后续关联到记录) | -| checkStatus | int | 审核状态(1-机审通过,2-机审不通过,3-人工审核不通过) | -| isContinue | bool | 是否允许继续(不合规时根据配置决定) | -| message | string | 提示信息 | - -#### 业务流程(调整后) - -1. 前端:先调用 photo-checker 上传照片,返回 photoId -2. 前端:再调用 record-save,传入 photoIds 关联照片和记录 - -#### 同步保存数据 - -- userId(内部获取) -- sessionId(可能不存在) -- photoUrl -- uploadTime -- recordId(创建记录后传入) - ---- - -### 2.6 删除突眼记录 - -#### 接口信息 - -- **接口路径**: `/?r=xd/proptosis/record-delete` -- **请求方式**: POST -- **代码位置**: `shop/modules/xd_frontend/controllers/ProptosisController.php` -- **认证方式**: 内部获取当前登录用户ID -- **Content-Type**: application/json - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------ | ---- | ------ | -| recordId | string | 是 | 记录ID | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| ------- | ---- | -------- | -| success | bool | 是否成功 | - ---- - -### 2.7 获取对比照片可用日期 - -#### 接口信息 - -- **接口路径**: `/?r=xd/proptosis/compare-dates` -- **请求方式**: GET -- **代码位置**: `shop/modules/xd_frontend/controllers/ProptosisController.php` -- **认证方式**: 内部获取当前登录用户ID - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| ---------- | ------ | ---- | -------- | -| photoAngle | string | 是 | 照片角度 | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| ---------------------------- | ------ | ---------------- | -| baseline | object | 基准照信息 | -| baseline.recordId | string | 记录ID | -| baseline.recordDate | string | 记录日期 | -| nonBaselineList[] | array | 非基准照日期列表 | -| nonBaselineList[].recordId | string | 记录ID | -| nonBaselineList[].recordDate | string | 记录日期 | - ---- - -### 2.8 根据角度和日期列表获取照片 - -#### 接口信息 - -- **接口路径**: `/?r=xd/proptosis/compare-photos` -- **请求方式**: GET -- **代码位置**: `shop/modules/xd_frontend/controllers/ProptosisController.php` -- **认证方式**: 内部获取当前登录用户ID - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| ---------- | ------ | ---- | -------------------------- | -| photoAngle | string | 是 | 照片角度 | -| recordIds | string | 是 | 记录ID列表(多个用逗号分隔) | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| ----------------------------- | ------- | -------------- | -| photos[] | array | 照片列表 | -| photos[].recordId | string | 记录ID | -| photos[].recordDate | string | 记录日期 | -| photos[].isBaseline | int | 是否基准照 | -| photos[].photoUrl | string | 照片链接 | -| photos[].leftEye | decimal | 左眼凸眼度 | -| photos[].rightEye | decimal | 右眼凸眼度 | -| photos[].interorbitalDistance | decimal | 框间距 | -| photos[].treatmentCount | int | 替妥尤使用次数 | - ---- - -### 2.9 获取对比角度列表 - -#### 接口信息 - -- **接口路径**: `/?r=xd/proptosis/get-compare-angle` -- **请求方式**: GET -- **代码位置**: `shop/modules/xd_frontend/controllers/ProptosisController.php` -- **认证方式**: 内部获取当前登录用户ID - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| ------ | ---- | ---- | ---- | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| --------------------------- | ------ | ------------ | -| photoAngle | object | 对比角度列表 | -| photoAngle.front_open | string | 正面睁眼 | -| photoAngle.front_closed | string | 正面闭眼 | -| photoAngle.front_looking_up | string | 正面仰头 | -| photoAngle.side_left_90 | string | 90°左侧 | -| photoAngle.side_right_90 | string | 90°右侧 | -| photoAngle.side_left_45 | string | 45°左侧 | -| photoAngle.side_right_45 | string | 45°右侧 | -| photoAngle.eye_up_left | string | 左上 | -| photoAngle.eye_up | string | 向上 | -| photoAngle.eye_up_right | string | 右上 | -| photoAngle.eye_left | string | 向左 | -| photoAngle.eye_right | string | 向右 | -| photoAngle.eye_down_left | string | 左下 | -| photoAngle.eye_down | string | 向下 | -| photoAngle.eye_down_right | string | 右下 | - ---- - -### 2.10 获取唯一标识 - -#### 接口信息 - -- **接口路径**: `/?r=xd/proptosis/get-session-id` -- **请求方式**: GET -- **代码位置**: `shop/modules/xd_frontend/controllers/ProptosisController.php` -- **认证方式**: 内部获取当前登录用户ID - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| ------ | ---- | ---- | ---- | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| --------- | ------ | -------- | -| sessionId | string | 唯一标识 | - ---- - -## 三、医生端接口 - -### 3.1 获取患者最近的突眼记录 - -#### 接口信息 - -- **接口路径**: `/?r=xd/doctor/proptosis/latest` -- **请求方式**: GET -- **代码位置**: `shop/modules/xd_frontend/controllers/doctor/ProptosisController.php` -- **认证方式**: 内部获取当前登录医生ID - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| --------- | ------ | ---- | ------ | -| patientId | string | 是 | 患者ID | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| -------------------- | ------- | --------------------- | -| recordId | string | 记录ID | -| recordDate | string | 记录日期 | -| treatmentCount | int | 替妥尤单抗使用次数 | -| leftEye | decimal | 左眼凸眼度(mm) | -| rightEye | decimal | 右眼凸眼度(mm) | -| interorbitalDistance | decimal | 框间距(mm) | -| isBaseline | int | 是否基准照(0-否,1-是) | -| photoCount | int | 照片数量 | -| firstPhotoUrl | string | 第一张角度图片 | - ---- - -### 3.2 获取患者所有突眼记录列表 - -#### 接口信息 - -- **接口路径**: `/?r=xd/doctor/proptosis/list` -- **请求方式**: GET -- **代码位置**: `shop/modules/xd_frontend/controllers/doctor/ProptosisController.php` -- **认证方式**: 内部获取当前登录医生ID - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| --------- | ------ | ---- | ---------------- | -| patientId | string | 是 | 患者ID | -| page | int | 否 | 页码(默认1) | -| pageSize | int | 否 | 每页数量(默认10) | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| --------------------------- | ------- | --------------------- | -| list[].recordId | string | 记录ID | -| list[].recordDate | string | 记录日期 | -| list[].treatmentCount | int | 替妥尤单抗使用次数 | -| list[].leftEye | decimal | 左眼凸眼度(mm) | -| list[].rightEye | decimal | 右眼凸眼度(mm) | -| list[].interorbitalDistance | decimal | 框间距(mm) | -| list[].isBaseline | int | 是否基准照(0-否,1-是) | -| list[].photoCount | int | 照片数量 | -| list[].firstPhotoUrl | string | 第一张角度图片 | -| list[].uploadCompleted | int | 上传是否完成 | -| pagination.total | int | 总记录数 | - ---- - -### 3.3 获取患者某条突眼记录详情 - -#### 接口信息 - -- **接口路径**: `/?r=xd/doctor/proptosis/detail` -- **请求方式**: GET -- **代码位置**: `shop/modules/xd_frontend/controllers/doctor/ProptosisController.php` -- **认证方式**: 内部获取当前登录医生ID - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------ | ---- | ------ | -| recordId | string | 是 | 记录ID | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| ----------------------- | ------- | ------------------------------- | -| recordId | string | 记录ID | -| userId | string | 用户ID | -| patientId | string | 患者ID | -| recordDate | string | 记录日期 | -| treatmentCount | int | 替妥尤单抗使用次数 | -| isBaseline | int | 是否基准照(0-否,1-是) | -| leftEye | decimal | 左眼凸眼度(mm) | -| rightEye | decimal | 右眼凸眼度(mm) | -| interorbitalDistance | decimal | 框间距(mm) | -| uploadCompleted | int | 上传是否完成(0-未完成,1-已完成) | -| photos[] | array | 照片列表 | -| photos[].photoId | string | 照片ID | -| photos[].photoAngle | string | 照片角度 | -| photos[].photoAngleName | string | 照片角度名称 | -| photos[].photoUrl | string | 照片链接 | -| photos[].uploadTime | string | 上传时间 | - ---- - -### 3.4 获取患者凸眼度对比(Excel导出) - -#### 接口信息 - -- **接口路径**: `/?r=xd/doctor/proptosis/export` -- **请求方式**: GET -- **代码位置**: `shop/modules/xd_frontend/controllers/doctor/ProptosisController.php` -- **认证方式**: 内部获取当前登录医生ID - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| --------- | ------ | ---- | ------ | -| patientId | string | 是 | 患者ID | - -#### 返回格式 - -- **Content-Type**: application/vnd.ms-excel -- **Content-Disposition**: attachment; filename="凸眼度对比\_日期.xlsx" - -#### Excel数据格式 - -| 列名 | 说明 | -| -------------- | ------------------ | -| 日期 | 记录日期 | -| 替妥尤输入次数 | 替妥尤单抗使用次数 | -| 左眼度 | 左眼凸眼度(mm) | -| 右眼度 | 右眼凸眼度(mm) | -| 框间距 | 框间距(mm) | - ---- - -### 3.5 获取患者凸眼照对比数据(统一使用recordIds) - -#### 接口信息 - -- **接口路径**: `/?r=xd/doctor/proptosis/compare` -- **请求方式**: GET -- **代码位置**: `shop/modules/xd_frontend/controllers/doctor/ProptosisController.php` -- **认证方式**: 内部获取当前登录医生ID - -#### 请求参数(修订) - -| 参数名 | 类型 | 必填 | 说明 | -| ---------- | ------ | ---- | ------------------------------------------------ | -| patientId | string | 是 | 患者ID | -| photoAngle | string | 是 | 照片角度 | -| recordIds | string | 否 | 需对比的记录ID列表(多个用逗号分隔,与患者端一致) | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| ---------------------------------- | ------- | -------------- | -| baseline | object | 基准照信息 | -| baseline.recordId | string | 记录ID | -| baseline.recordDate | string | 记录日期 | -| baseline.photoUrl | string | 照片链接 | -| baseline.leftEye | decimal | 左眼凸眼度(mm) | -| baseline.rightEye | decimal | 右眼凸眼度(mm) | -| baseline.interorbitalDistance | decimal | 框间距(mm) | -| baseline.treatmentCount | int | 替妥尤使用次数 | -| compareList[] | array | 对比记录列表 | -| compareList[].recordId | string | 记录ID | -| compareList[].recordDate | string | 记录日期 | -| compareList[].photoUrl | string | 照片链接 | -| compareList[].leftEye | decimal | 左眼凸眼度(mm) | -| compareList[].rightEye | decimal | 右眼凸眼度(mm) | -| compareList[].interorbitalDistance | decimal | 框间距(mm) | -| compareList[].treatmentCount | int | 替妥尤使用次数 | - ---- - -### 3.6 获取对比角度列表 - -#### 接口信息 - -- **接口路径**: `/?r=xd/doctor/proptosis/get-compare-angle` -- **请求方式**: GET -- **代码位置**: `shop/modules/xd_frontend/controllers/doctor/ProptosisController.php` -- **认证方式**: 内部获取当前登录医生ID - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| ------ | ---- | ---- | ---- | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| --------------------------- | ------ | ------------ | -| photoAngle | object | 对比角度列表 | -| photoAngle.front_open | string | 正面睁眼 | -| photoAngle.front_closed | string | 正面闭眼 | -| photoAngle.front_looking_up | string | 正面仰头 | -| photoAngle.side_left_90 | string | 90°左侧 | -| photoAngle.side_right_90 | string | 90°右侧 | -| photoAngle.side_left_45 | string | 45°左侧 | -| photoAngle.side_right_45 | string | 45°右侧 | -| photoAngle.eye_up_left | string | 左上 | -| photoAngle.eye_up | string | 向上 | -| photoAngle.eye_up_right | string | 右上 | -| photoAngle.eye_left | string | 向左 | -| photoAngle.eye_right | string | 向右 | -| photoAngle.eye_down_left | string | 左下 | -| photoAngle.eye_down | string | 向下 | -| photoAngle.eye_down_right | string | 右下 | - ---- - -### 3.7 获取对比照片可用日期 - -#### 接口信息 - -- **接口路径**: `/?r=xd/doctor/proptosis/compare-dates` -- **请求方式**: GET -- **代码位置**: `shop/modules/xd_frontend/controllers/doctor/ProptosisController.php` -- **认证方式**: 内部获取当前登录医生ID - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| ---------- | ------ | ---- | -------- | -| patientId | string | 是 | 患者ID | -| photoAngle | string | 是 | 照片角度 | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| ---------------------------- | ------ | ---------------- | -| baseline | object | 基准照信息 | -| baseline.recordId | string | 记录ID | -| baseline.recordDate | string | 记录日期 | -| nonBaselineList[] | array | 非基准照日期列表 | -| nonBaselineList[].recordId | string | 记录ID | -| nonBaselineList[].recordDate | string | 记录日期 | - ---- - -## 四、管理后台接口 - -### 4.1 获取图片列表 - -#### 接口信息 - -- **接口路径**: `/?r=photo/list` -- **请求方式**: GET -- **代码位置**: `shop/family/controller/PhotoController.php` -- **认证方式**: 内部获取当前登录管理员ID - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| ----------- | ------ | ---- | -------------------------------------------------- | -| page | int | 否 | 页码(默认1) | -| pageSize | int | 否 | 每页数量(默认10) | -| userId | string | 否 | 用户ID | -| patientId | string | 否 | 患者ID | -| startDate | string | 否 | 开始日期(YYYY-MM-DD) | -| endDate | string | 否 | 结束日期(YYYY-MM-DD) | -| checkStatus | int | 否 | 审核状态(1-机审通过,2-机审不通过,3-人工审核不通过) | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| -------------------------- | ------ | -------------------------------------------------- | -| list[].photoId | string | 照片ID | -| list[].submitTime | string | 提交时间 | -| list[].doctorName | string | 邀约医生 | -| list[].userIdentity | string | 用户身份 | -| list[].userName | string | 用户姓名 | -| list[].photoAngle | string | 拍摄角度 | -| list[].photoAngleName | string | 拍摄角度名称 | -| list[].photoUrl | string | 拍摄图片 | -| list[].checkStatus | int | 审核状态(1-机审通过,2-机审不通过,3-人工审核不通过) | -| list[].operation | object | 可操作信息 | -| list[].operation.canReject | bool | 是否可驳回 | -| pagination.total | int | 总记录数 | - -#### 业务规则 - -- 机审通过(状态1)时,显示"审核驳回"按钮 -- 机审不通过(状态2)时,无操作按钮 -- 人工审核不通过(状态3)时,无操作按钮 - ---- - -### 4.2 人工审核驳回 - -#### 接口信息 - -- **接口路径**: `/?r=photo/reject` -- **请求方式**: POST -- **代码位置**: `shop/family/controller/PhotoController.php` -- **认证方式**: 内部获取当前登录管理员ID -- **Content-Type**: application/json - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| ------- | ------ | ---- | ------ | -| photoId | string | 是 | 照片ID | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| ------- | ---- | -------- | -| success | bool | 是否成功 | - ---- - -### 4.3 获取系统配置 - -#### 接口信息 - -- **接口路径**: `/?r=settings/get-proptosis-config` -- **请求方式**: GET -- **代码位置**: `shop/family/controller/SettingsController.php` -- **认证方式**: 内部获取当前登录管理员ID - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| --------- | ------ | ---- | -------------------------- | -| configKey | string | 否 | 配置键(不传则返回所有配置) | - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| ----------- | ------ | -------- | -| configKey | string | 配置键 | -| configValue | string | 配置值 | -| description | string | 配置描述 | - ---- - -### 4.4 设置系统配置 - -#### 接口信息 - -- **接口路径**: `/?r=settings/set-proptosis-config` -- **请求方式**: POST -- **代码位置**: `shop/family/controller/SettingsController.php` -- **认证方式**: 内部获取当前登录管理员ID -- **Content-Type**: application/json - -#### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -| ----------- | ------ | ---- | -------- | -| configKey | string | 是 | 配置键 | -| configValue | string | 是 | 配置值 | -| description | string | 否 | 配置描述 | - -#### 预置配置 - -- `proptosis_continue_on_failed`: 不合规图片是否继续(1-是,0-否) - -#### 返回字段 - -| 字段名 | 类型 | 说明 | -| ------- | ---- | -------- | -| success | bool | 是否成功 | - ---- - -## 五、腾讯云IMS集成说明 - -### 5.1 图片内容安全校验 - -- 调用腾讯云图片内容安全(Image Moderation)接口 -- 检测图片是否包含违规内容(色情、暴力等) -- 同步返回检测结果 - -### 5.2 配置项说明(使用t_settings表) - -| 配置键 | 配置值 | 说明 | -| ---------------------------- | ------ | ------------------------------ | -| proptosis_continue_on_failed | 1 | 不合规图片允许继续上传 | -| proptosis_continue_on_failed | 0 | 不合规图片不允许继续上传(报错) | - -### 5.3 校验结果处理 - -| 校验结果 | 配置值 | 返回状态 | 是否允许继续 | -| -------- | --------- | ------------- | ------------ | -| 通过 | - | 1(机审通过) | 是 | -| 不通过 | 1(继续) | 2(机审不通过) | 是 | -| 不通过 | 0(不继续) | 2(机审不通过) | 否 | - ---- - -## 六、代码文件结构 - -``` -shop/ -├── modules/ -│ └── xd_frontend/ -│ └── controllers/ -│ ├── ProptosisController.php # 患者端控制器 -│ └── doctor/ -│ └── ProptosisController.php # 医生端控制器 -└── family/ - └── controller/ - ├── PhotoController.php # 管理后台-图片管理 - └── SettingsController.php # 管理后台-配置管理 -``` +{"target_id":"1efcf83c3b71ff","project_id":"359c53","parent_id":"1da09b3c3b705d","target_type":"api","name":"患者回复未复诊原因","version":751,"sort":9000,"method":"POST","url":"{{m}}?r=zd/message-interact/send-reply-followup-reason","protocol":"http/1.1","mark_id":"1","description":"","request":{"auth":{"type":"inherit","kv":{"key":"","value":"","in":"header"},"bearer":{"key":""},"basic":{"username":"","password":""},"digest":{"username":"","password":"","realm":"","nonce":"","algorithm":"","qop":"","nc":"","cnonce":"","opaque":""},"hawk":{"authId":"","authKey":"","algorithm":"","user":"","nonce":"","extraData":"","default":"","delegation":"","timestamp":"","includePayloadHash":false},"awsv4":{"accessKey":"","secretKey":"","region":"","service":"","sessionToken":"","addAuthDataToQuery":false},"ntlm":{"username":"","password":"","entity":"","workstation":"","disableRetryRequest":false},"edgegrid":{"accessToken":"","clientToken":"","clientSecret":"","nonce":"","timestamp":"","baseURi":"","headersToSign":""},"oauth1":{"consumerKey":"","consumerSecret":"","signatureMethod":"HMAC-SHA1","addEmptyParamsToSign":true,"includeBodyHash":true,"addParamsToHeader":false,"disableHeaderEncoding":false,"realm":"","version":"1.0","nonce":"","timestamp":"","verifier":"","callback":"","tokenSecret":"","token":""},"jwt":{"addTokenTo":"header","algorithm":"HS256","secret":"","isSecretBase64Encoded":false,"payload":"","headerPrefix":"Bearer","queryParamKey":"token","header":""},"asap":{"alg":"HS256","iss":"","aud":"","kid":"","privateKey":"","sub":"","claims":"","exp":""}},"body":{"mode":"form-data","parameter":[{"param_id":"1efd07acb71242","description":"消息id","field_type":"string","is_checked":1,"key":"msgId","not_null":1,"value":"1461","content_type":"","file_name":"","file_base64":"","schema":{"type":"string","default":"1457"}},{"param_id":"1efd23057b72ec","description":"","field_type":"string","is_checked":1,"key":"reasonList[0]","not_null":1,"value":"symptomsImproved","content_type":"","file_name":"","file_base64":"","schema":{"type":"string"}},{"param_id":"1eff01adf71317","description":"","field_type":"string","is_checked":1,"key":"reasonList[1]","not_null":1,"value":"other","content_type":"","file_name":"","file_base64":"","schema":{"type":"string"}}],"raw":"","raw_parameter":[],"raw_schema":{"type":"object"},"binary":null},"pre_tasks":[],"post_tasks":[],"header":{"parameter":[]},"query":{"query_add_equal":1,"parameter":[{"param_id":"1efcf93e3b722c","description":"","field_type":"string","is_checked":1,"key":"r","not_null":1,"value":"zd/message-interact/send-reply-followup-reason","schema":{"type":"string"}}]},"cookie":{"cookie_encode":1,"parameter":[]},"restful":{"parameter":[]}},"response":{"example":[{"example_id":"1","raw":"","raw_parameter":[],"headers":[],"expect":{"code":"200","content_type":"json","is_default":1,"mock":"","name":"成功","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}},{"example_id":"2","raw":"","raw_parameter":[],"headers":[],"expect":{"code":"404","content_type":"json","is_default":-1,"mock":"","name":"失败","schema":{"type":"object","properties":{}},"verify_type":"schema","sleep":0}}],"is_check_result":1},"mock_server_enable":1,"mock_ip_white_list_enable":-1,"mock_ip_white_list":"","mock_show_target_id":0,"attribute_info":{},"tags":[],"created_at":"2026-06-09T15:42:43+08:00","created_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"updated_at":"2026-06-09T15:55:33+08:00","updated_user":{"uid":"f28c1","nick_name":"小丸子","alias_name":"juli","portrait":"https://img.cdn.apipost.cn/user/default_profile_photo/Vector-5.png"},"status":1,"is_locked":-1}