| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- import type {
- MedicalTalkDTO,
- MedicalTalkSubmitVO,
- MedicalTalkVO,
- } from './medical-talk.schema';
- import type { PageQueryMethodArgs } from '#/request/schema';
- import type { PageVO } from '#/request/schema/record';
- import { pageQueryArgsTransform } from '#/request/schema';
- import {
- decodeMedicalTalk,
- encodeMedicalTalk,
- encodeMedicalTalkQuery,
- } from './medical-talk.schema';
- /** 后端接口就绪后改为 false */
- export const USE_MEDICAL_TALK_MOCK = false;
- type MethodLike<T> = PromiseLike<T> & {
- send?: (force?: boolean) => PromiseLike<T>;
- };
- const SEED_RECORDS: Omit<
- MedicalTalkDTO,
- 'createTime' | 'id' | 'personalStudioId' | 'updateTime'
- >[] = [
- {
- name: '浅谈《伤寒论》六经辨证在现代临床中的应用',
- type: '1',
- author: '张教授',
- content:
- '《伤寒论》六经辨证是中医辨证论治的重要基石。在现代临床中,结合现代医学检查结果,灵活运用六经辨证,可显著提高诊疗效果。',
- browseCount: 328,
- praiseCount: 45,
- commentCount: 12,
- createBy: '张教授',
- fileUrl: '',
- },
- {
- name: '春季养生与肝脾调理',
- type: '2',
- author: '李医师',
- content:
- '春季属木,与肝相应。养生重在疏肝理气、健脾和胃,饮食宜清淡,起居有常,情志舒畅。',
- browseCount: 256,
- praiseCount: 38,
- commentCount: 8,
- createBy: '李医师',
- fileUrl: '',
- },
- {
- name: '疑难病案:顽固性失眠的辨证思路',
- type: '3',
- author: '王主任',
- content:
- '患者失眠三年,多方求治无效。经四诊合参,辨为心肾不交,以交泰丸加减治疗,两周后睡眠明显改善。',
- browseCount: 189,
- praiseCount: 52,
- commentCount: 15,
- createBy: '王主任',
- fileUrl: '',
- },
- {
- name: '经方学术讨论:小柴胡汤的临床应用',
- type: '0',
- author: '赵教授',
- content:
- '小柴胡汤为和解少阳之主方,临床适用范围广泛。本文结合经典原文与现代研究,探讨其辨证要点与加减变化。',
- browseCount: 412,
- praiseCount: 67,
- commentCount: 23,
- createBy: '赵教授',
- fileUrl: '',
- },
- ];
- function createInitialStore(): MedicalTalkDTO[] {
- const records: MedicalTalkDTO[] = [];
- for (let index = 0; index < 67; index += 1) {
- const seed = SEED_RECORDS[index % SEED_RECORDS.length] ?? SEED_RECORDS[0];
- if (!seed) continue;
- const day = String((index % 28) + 1).padStart(2, '0');
- const month = String((index % 12) + 1).padStart(2, '0');
- records.push({
- ...seed,
- id: String(index + 1),
- personalStudioId: '327477138296832',
- browseCount: (seed.browseCount ?? 0) + (index % 20),
- praiseCount: (seed.praiseCount ?? 0) + (index % 10),
- commentCount: (seed.commentCount ?? 0) + (index % 5),
- createTime: `2026-${month}-${day}T10:00:00`,
- updateTime: `2026-05-${day}T10:00:00`,
- });
- }
- return records;
- }
- let nextId = 100;
- let store = createInitialStore();
- function delay<T>(runner: () => Promise<T> | T, ms = 120): MethodLike<T> {
- const run = async () => {
- await new Promise((resolve) => setTimeout(resolve, ms));
- return runner();
- };
- const promise = run();
- return Object.assign(promise, { send: run });
- }
- function matchKeyword(record: MedicalTalkDTO, keyword?: string) {
- if (!keyword) return true;
- const text = [record.name, record.author, record.content, record.createBy]
- .filter(Boolean)
- .join(' ');
- return text.includes(keyword);
- }
- function matchWorkroom(record: MedicalTalkDTO, workroomId?: string) {
- if (!workroomId) return true;
- return String(record.personalStudioId ?? '') === String(workroomId);
- }
- function matchCategory(record: MedicalTalkDTO, type?: string) {
- if (!type) return true;
- return String(record.type ?? '') === String(type);
- }
- function sortRecords(records: MedicalTalkDTO[]) {
- return records.toSorted((a, b) => {
- const timeA = a.createTime ? Date.parse(a.createTime) : 0;
- const timeB = b.createTime ? Date.parse(b.createTime) : 0;
- return timeB - timeA;
- });
- }
- function toVo(dto: MedicalTalkDTO): MedicalTalkVO {
- return decodeMedicalTalk(dto);
- }
- export function mockListMedicalTalkMethod(...args: PageQueryMethodArgs) {
- const { params, data } = pageQueryArgsTransform(args, encodeMedicalTalkQuery);
- const pageNum = Number(params.pageNum ?? 1);
- const pageSize = Number(params.pageSize ?? 20);
- const keyword = data.mixture;
- const workroomId = data.personalStudioId?.toString();
- const type = data.type?.toString();
- const filtered = sortRecords(
- store.filter(
- (record) =>
- matchKeyword(record, keyword) &&
- matchWorkroom(record, workroomId) &&
- matchCategory(record, type),
- ),
- );
- const start = (pageNum - 1) * pageSize;
- const items = filtered
- .slice(start, start + pageSize)
- .map((record) => toVo(record));
- const result: PageVO<MedicalTalkVO> = {
- total: filtered.length,
- items,
- };
- return delay(() => result);
- }
- export function mockGetMedicalTalkMethod(vo: Partial<MedicalTalkVO>) {
- return delay(() => {
- const record = store.find((item) => String(item.id) === String(vo.id));
- if (!record) {
- throw new Error('医话不存在');
- }
- return toVo(record);
- });
- }
- export function mockEditMedicalTalkMethod(vo: MedicalTalkSubmitVO) {
- return delay(() => {
- const dto = encodeMedicalTalk(vo);
- const now = new Date().toISOString();
- if (vo.id) {
- const index = store.findIndex(
- (item) => String(item.id) === String(vo.id),
- );
- if (index === -1) {
- throw new Error('医话不存在');
- }
- store[index] = {
- ...store[index],
- ...dto,
- updateTime: now,
- };
- return String(vo.id);
- }
- const id = String(nextId++);
- store.unshift({
- ...dto,
- id,
- browseCount: 0,
- praiseCount: 0,
- commentCount: 0,
- createBy: dto.author ?? '当前用户',
- createTime: now,
- updateTime: now,
- });
- return id;
- });
- }
- export function mockDeleteMedicalTalkMethod(vo: Pick<MedicalTalkVO, 'id'>) {
- return delay(() => {
- const before = store.length;
- store = store.filter((item) => String(item.id) !== String(vo.id));
- if (store.length === before) {
- throw new Error('医话不存在');
- }
- return null;
- });
- }
- /** 仅用于本地调试,重置 mock 数据 */
- export function resetMedicalTalkMockStore() {
- nextId = 100;
- store = createInitialStore();
- }
|