From ba2e2e40874af221fbd11c151fbacd5d4d6a5025 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 17 Oct 2026 16:51:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/setting/prescription_ai_visibility.ts | 49 +++ admin/src/api/tcm.ts | 2 + .../PrescriptionOrderDetailDrawer.vue | 63 +++- .../consumer/prescription/order_list_h5.vue | 61 ++++ .../prescription_ai_visibility/index.vue | 227 +++++++++++++ .../tests/prescription-ai-visibility.test.cjs | 253 ++++++++++++++ .../tests/prescription-aux-bag-count.test.cjs | 167 ++++++++++ admin/vite.config.ts | 2 + app/scripts/render_issued_prescription_ai.py | 9 +- .../render_prescription_ai_visibility.py | 111 +++++++ .../doctor_workstation/services/repository.py | 6 + .../ui/dialogs/issued_prescription_ai.py | 138 +++++++- .../dialogs/issued_prescription_ai_console.py | 38 ++- .../issued_prescription_ai_workspace.py | 43 ++- .../ui/pages/prescriptions.py | 78 ++++- app/tests/test_issued_prescription_ai.py | 234 ++++++++++++- artifacts/aux-bag-count-backend-research.md | 99 ++++++ ...tion-ai-visibility-admin-implementation.md | 32 ++ ...prescription-ai-visibility-admin-local.png | Bin 0 -> 47597 bytes ...on-ai-visibility-backend-implementation.md | 63 ++++ ...cription-ai-visibility-backend-research.md | 118 +++++++ ...on-ai-visibility-desktop-implementation.md | 57 ++++ ...ription-ai-visibility-frontend-research.md | 113 +++++++ .../prescription-ai-visibility-validation.md | 51 +++ .../candidate-restricted.png | Bin 0 -> 113841 bytes .../list-authorized.png | Bin 0 -> 70252 bytes .../list-restricted.png | Bin 0 -> 63982 bytes .../report-authorized.png | Bin 0 -> 177219 bytes .../report-restricted.png | Bin 0 -> 128675 bytes .../review-restricted.png | Bin 0 -> 100195 bytes .../statistics-restricted.png | Bin 0 -> 36127 bytes .../tcm/PrescriptionAiController.php | 22 ++ .../tcm/PrescriptionOrderController.php | 2 +- .../logic/tcm/PrescriptionAiLogic.php | 27 +- .../logic/tcm/PrescriptionOrderLogic.php | 110 ++++--- .../tcm/PrescriptionOrderValidate.php | 20 +- .../PrescriptionAiVisibility.php | 224 +++++++++++++ ...7_prescription_ai_agreement_visibility.sql | 27 ++ server/tests/PrescriptionAiQueueTest.php | 133 +++++++- server/tests/PrescriptionAiVisibilityTest.php | 60 ++++ .../PrescriptionOrderAuxBagCountTest.php | 308 ++++++++++++++++++ 41 files changed, 2851 insertions(+), 96 deletions(-) create mode 100644 admin/src/api/setting/prescription_ai_visibility.ts create mode 100644 admin/src/views/setting/prescription_ai_visibility/index.vue create mode 100644 admin/tests/prescription-ai-visibility.test.cjs create mode 100644 admin/tests/prescription-aux-bag-count.test.cjs create mode 100644 app/scripts/render_prescription_ai_visibility.py create mode 100644 artifacts/aux-bag-count-backend-research.md create mode 100644 artifacts/prescription-ai-visibility-admin-implementation.md create mode 100644 artifacts/prescription-ai-visibility-admin-local.png create mode 100644 artifacts/prescription-ai-visibility-backend-implementation.md create mode 100644 artifacts/prescription-ai-visibility-backend-research.md create mode 100644 artifacts/prescription-ai-visibility-desktop-implementation.md create mode 100644 artifacts/prescription-ai-visibility-frontend-research.md create mode 100644 artifacts/prescription-ai-visibility-validation.md create mode 100644 artifacts/prescription-ai-visibility/candidate-restricted.png create mode 100644 artifacts/prescription-ai-visibility/list-authorized.png create mode 100644 artifacts/prescription-ai-visibility/list-restricted.png create mode 100644 artifacts/prescription-ai-visibility/report-authorized.png create mode 100644 artifacts/prescription-ai-visibility/report-restricted.png create mode 100644 artifacts/prescription-ai-visibility/review-restricted.png create mode 100644 artifacts/prescription-ai-visibility/statistics-restricted.png create mode 100644 server/app/common/service/prescriptionai/PrescriptionAiVisibility.php create mode 100644 server/database/migrations/2026_10_17_prescription_ai_agreement_visibility.sql create mode 100644 server/tests/PrescriptionAiVisibilityTest.php create mode 100644 server/tests/PrescriptionOrderAuxBagCountTest.php diff --git a/admin/src/api/setting/prescription_ai_visibility.ts b/admin/src/api/setting/prescription_ai_visibility.ts new file mode 100644 index 000000000..0ed04c953 --- /dev/null +++ b/admin/src/api/setting/prescription_ai_visibility.ts @@ -0,0 +1,49 @@ +import request from '@/utils/request' + +export interface PrescriptionAiVisibilityConfig { + role_ids: number[] + admin_ids: number[] +} + +export interface PrescriptionAiVisibilityOptions { + roles: { id: number; name: string }[] + admins: { id: number; name: string; account: string }[] +} + +export interface PrescriptionAiCapabilities { + agreement_visible: boolean + can_manage_visibility: boolean +} + +// A failed or malformed read must never become an empty policy that can be saved. +function readVisibilityConfig(value: unknown): PrescriptionAiVisibilityConfig { + const config = value as Partial | null + const validIds = (ids: unknown): ids is number[] => + Array.isArray(ids) && ids.every((id) => Number.isSafeInteger(id) && id > 0) + if (!config || !validIds(config.role_ids) || !validIds(config.admin_ids)) { + throw new Error('可见范围配置响应格式不正确') + } + return { role_ids: [...config.role_ids], admin_ids: [...config.admin_ids] } +} + +export async function getPrescriptionAiVisibilityConfig() { + const data = await request.get({ url: '/tcm.prescriptionAi/getVisibilityConfig' }) + return readVisibilityConfig(data) +} + +export async function setPrescriptionAiVisibilityConfig(params: PrescriptionAiVisibilityConfig) { + const data = await request.post({ url: '/tcm.prescriptionAi/setVisibilityConfig', params }) + return readVisibilityConfig(data) +} + +export function getPrescriptionAiVisibilityOptions() { + return request.get({ + url: '/tcm.prescriptionAi/visibilityOptions' + }) as Promise +} + +export function getPrescriptionAiCapabilities() { + return request.get({ + url: '/tcm.prescriptionAi/capabilities' + }) as Promise +} diff --git a/admin/src/api/tcm.ts b/admin/src/api/tcm.ts index 67c836b24..5a70075eb 100644 --- a/admin/src/api/tcm.ts +++ b/admin/src/api/tcm.ts @@ -490,8 +490,10 @@ export function prescriptionOrderPatchPrescriptionUsage(params: { times_per_day: number usage_days: number medication_days: number + dosage_bag_count?: number aux_times_per_day?: number aux_usage_days?: number + aux_dosage_bag_count?: number }) { return request.post({ url: '/tcm.prescriptionOrder/patchPrescriptionUsage', params }) } diff --git a/admin/src/views/consumer/prescription/components/PrescriptionOrderDetailDrawer.vue b/admin/src/views/consumer/prescription/components/PrescriptionOrderDetailDrawer.vue index d6a5e0b5a..27fae4ce4 100644 --- a/admin/src/views/consumer/prescription/components/PrescriptionOrderDetailDrawer.vue +++ b/admin/src/views/consumer/prescription/components/PrescriptionOrderDetailDrawer.vue @@ -312,6 +312,17 @@ {{ detailPrescription.dosage_amount }}{{ detailPrescription.dosage_unit || 'g' }} ({{ detailPrescription.need_decoction ? '代煎' : '不代煎' }}) @@ -325,6 +336,17 @@ {{ detailAuxUsage.dosage_amount }}{{ detailPrescription.dosage_unit || 'g' }} ({{ detailAuxUsage.need_decoction ? '代煎' : '不代煎' }}) @@ -943,6 +965,15 @@ label-width="108px" >
主方
+ + + + +