diff --git a/.cursor/rules/Code-Standards.mdc b/.cursor/rules/Code-Standards.mdc new file mode 100644 index 00000000..9e5c2433 --- /dev/null +++ b/.cursor/rules/Code-Standards.mdc @@ -0,0 +1,10 @@ +--- +description: +alwaysApply: true +--- + +1. 写代码的时候要补充详细的中文注释(每个方法是干嘛的,为什么要这样写),如果是工作区,则所有项目都适用该规则 +2. 注意不要生成太多的空行,上一部分代码和下一部分代码中间的空行不要大于2行 +3. 有封装好的方法、组件需要复用,不要重复造轮子 +4. 小程序端的抽屉全部需要用page-container来防止用户意外退出页面(记得使用v-if而不是v-show) +5. 数据库的(created_at、updated_at、deleted_at)统一使用时间戳,不要使用字符串,并且我在查询器中一级格式化成字符串了,无需再次格式化 diff --git a/.gitignore b/.gitignore index b3814386..f73c2ad7 100644 --- a/.gitignore +++ b/.gitignore @@ -49,5 +49,5 @@ vite.config.ts.* *.sln *.sw? .history -/.cursor/ /.mimocode/ +/.cursor/skills/ diff --git a/apps/web-antd/src/api/core/file-gallery.ts b/apps/web-antd/src/api/core/file-gallery.ts index 6f8f2015..aacc8ce3 100644 --- a/apps/web-antd/src/api/core/file-gallery.ts +++ b/apps/web-antd/src/api/core/file-gallery.ts @@ -11,6 +11,7 @@ export interface FileGalleryItem { type?: number; type_text?: string; type_icon?: string; + group_ids?: number[]; created_at?: string; original_name?: string; object_key?: string; @@ -36,6 +37,7 @@ export async function getFileGalleryList(params?: { page_size?: number; pid?: number; type?: number; + group_id?: number; keyword?: string; }) { return requestClient.get<{ @@ -76,3 +78,13 @@ export async function getFileTypes() { export async function syncFileGalleryFromOss() { return requestClient.post<{ synced: number; skipped: number; scanned: number }>(`${prefix}sync-oss`); } + +/** 文件加入自定义分组 */ +export async function addFileToGroup(file_id: number, group_id: number) { + return requestClient.post(`${prefix}add-to-group`, { file_id, group_id }); +} + +/** 文件移出自定义分组 */ +export async function removeFileFromGroup(file_id: number, group_id: number) { + return requestClient.post(`${prefix}remove-from-group`, { file_id, group_id }); +} diff --git a/apps/web-antd/src/api/core/file-group.ts b/apps/web-antd/src/api/core/file-group.ts new file mode 100644 index 00000000..36673a12 --- /dev/null +++ b/apps/web-antd/src/api/core/file-group.ts @@ -0,0 +1,51 @@ +import { requestClient } from '#/api/request'; + +const prefix = 'file-group/'; + +export interface FileGroupRecord { + id: number; + name: string; + sort: number; + created_at?: number; + updated_at?: number; +} + +export interface FileGroupOptionItem { + id: number; + name: string; + sort: number; +} + +/** 分组选项缓存结构 */ +export interface FileGroupCachePayload { + hash: string; + items: FileGroupOptionItem[]; +} + +/** + * 管理端分组列表 + */ +export async function getFileGroupList() { + return requestClient.get(`${prefix}list`); +} + +/** + * 带 hash 的分组选项:无变化时 result 为 0 + */ +export async function getFileGroupOptions(hash?: string) { + return requestClient.get(`${prefix}options`, { + params: hash ? { hash } : undefined, + }); +} + +export async function createFileGroup(data: Partial) { + return requestClient.post(`${prefix}create`, data); +} + +export async function updateFileGroup(data: Partial & { id: number }) { + return requestClient.post(`${prefix}update`, data); +} + +export async function deleteFileGroup(id: number) { + return requestClient.post(`${prefix}delete`, { id }); +} diff --git a/apps/web-antd/src/app.vue b/apps/web-antd/src/app.vue index 5d779892..b93e7d5c 100644 --- a/apps/web-antd/src/app.vue +++ b/apps/web-antd/src/app.vue @@ -9,6 +9,7 @@ import { App, ConfigProvider, theme } from 'ant-design-vue'; import { antdLocale } from '#/locales'; import { GlobalContextMenu } from '#/components/context-menu'; +import DoctorTransferFloat from '#/components/doctor-transfer-float/DoctorTransferFloat.vue'; import { useWebSocket } from '#/views/business/chat/composables/useWebSocket'; import { useChatStore } from '#/views/business/chat/stores/chat'; import { useUserStore } from '#/views/business/chat/stores/user'; @@ -75,6 +76,13 @@ watch(userInfoLoaded, (loaded) => { initWebsocket(); } }); + +/** 诊所医生账号显示传方悬浮窗(有 doctor_id 且绑定门店) */ +const showDoctorTransferFloat = computed(() => { + const info = vbenUserStore.userInfo as Record | null; + if (!info) return false; + return !!(info.doctor_id && info.store_id); +}); diff --git a/apps/web-antd/src/components/doctor-transfer-float/DoctorTransferFloat.vue b/apps/web-antd/src/components/doctor-transfer-float/DoctorTransferFloat.vue new file mode 100644 index 00000000..c5688cee --- /dev/null +++ b/apps/web-antd/src/components/doctor-transfer-float/DoctorTransferFloat.vue @@ -0,0 +1,847 @@ + + +