diff --git a/TUICallKit-Vue3/debug/GenerateTestUserSig-es.js b/TUICallKit-Vue3/debug/GenerateTestUserSig-es.js index 7765ee04..e247f33a 100644 --- a/TUICallKit-Vue3/debug/GenerateTestUserSig-es.js +++ b/TUICallKit-Vue3/debug/GenerateTestUserSig-es.js @@ -6,7 +6,7 @@ import LibGenerateTestUserSig from './lib-generate-test-usersig-es.min.js'; * 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/rav ) 创建应用,即可看到 SDKAppId, * 它是腾讯云用于区分客户的唯一标识。 */ -let SDKAPPID = 1600127710; +let SDKAPPID = 1600131325; /** @@ -28,7 +28,7 @@ const EXPIRETIME = 604800; * 注意:该方案仅适用于调试Demo,正式上线前请将 UserSig 计算代码和密钥迁移到您的后台服务器上,以避免加密密钥泄露导致的流量盗用。 * 文档:https://cloud.tencent.com/document/product/647/17275#Server */ -let SECRETKEY = '8a6b3ce533b0e46b9d6e17d5c77bac240bc0ccdce4e3db93a0d6a1e55160c73d'; +let SECRETKEY = 'adc84842a817f6b9d124a1a15a6de4d0b3a940bef678820ed46d40db474c8ea4'; /* * Module: GenerateTestUserSig diff --git a/TUICallKit-Vue3/manifest.json b/TUICallKit-Vue3/manifest.json index 0035f6b0..5389584a 100644 --- a/TUICallKit-Vue3/manifest.json +++ b/TUICallKit-Vue3/manifest.json @@ -50,13 +50,13 @@ "quickapp" : {}, /* 小程序特有相关 */ "mp-weixin" : { - "appid" : "wx6b829b4ffce455b7", + "appid" : "wx79b9a0bfbfe7cbcd", "setting" : { "urlCheck" : false }, - "optimization" : { - "subPackages" : true - }, + "optimization" : { + "subPackages" : true + }, "usingComponents" : true }, "mp-alipay" : { diff --git a/TUICallKit-Vue3/static/logo.png b/TUICallKit-Vue3/static/logo.png deleted file mode 100644 index b5771e20..00000000 Binary files a/TUICallKit-Vue3/static/logo.png and /dev/null differ diff --git a/admin/package-lock.json b/admin/package-lock.json index 31b95d3e..d7f63f51 100644 --- a/admin/package-lock.json +++ b/admin/package-lock.json @@ -23,6 +23,8 @@ "echarts": "^5.6.0", "element-plus": "^2.9.4", "highlight.js": "^11.11.1", + "html2canvas": "^1.4.1", + "jspdf": "^2.5.2", "lodash": "^4.17.21", "lodash-es": "^4.17.21", "nprogress": "^0.2.0", @@ -4047,6 +4049,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/raf": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz", + "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==", + "license": "MIT", + "optional": true + }, "node_modules/@types/svgo": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-2.6.4.tgz", @@ -5200,7 +5209,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, "license": "(MIT OR Apache-2.0)", "bin": { "atob": "bin/atob.js" @@ -5377,6 +5385,15 @@ "node": ">=0.10.0" } }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/baseline-browser-mapping": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", @@ -5523,6 +5540,18 @@ "browserslist": "*" } }, + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "license": "(MIT OR Apache-2.0)", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -5662,6 +5691,33 @@ ], "license": "CC-BY-4.0" }, + "node_modules/canvg": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.11.tgz", + "integrity": "sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@types/raf": "^3.4.0", + "core-js": "^3.8.3", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "rgbcolor": "^1.0.1", + "stackblur-canvas": "^2.0.0", + "svg-pathdata": "^6.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/canvg/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT", + "optional": true + }, "node_modules/capital-case": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", @@ -6059,6 +6115,15 @@ "ms": "^2.1.1" } }, + "node_modules/css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "license": "MIT", + "dependencies": { + "utrie": "^1.0.2" + } + }, "node_modules/css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", @@ -6488,6 +6553,13 @@ "domelementtype": "1" } }, + "node_modules/dompurify": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.9.tgz", + "integrity": "sha512-i6mvVmWN4xo9LrhCOZrDgSs9noW6nOahbrmzjRbPF36YPyj5Ue5lgok0MHDWkG7xzpWFO2OYttXdzM7rJxHvNA==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optional": true + }, "node_modules/domutils": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", @@ -7517,6 +7589,12 @@ "reusify": "^1.0.4" } }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "license": "MIT" + }, "node_modules/figures": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", @@ -8162,6 +8240,19 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/html2canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + "license": "MIT", + "dependencies": { + "css-line-break": "^2.1.0", + "text-segmentation": "^1.0.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/htmlparser2": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", @@ -8967,6 +9058,24 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jspdf": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.2.tgz", + "integrity": "sha512-myeX9c+p7znDWPk0eTrujCzNjT+CXdXyk7YmJq5nD5V7uLLKmSXnlQ/Jn/kuo3X09Op70Apm0rQSnFWyGK8uEQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "atob": "^2.1.2", + "btoa": "^1.2.1", + "fflate": "^0.8.1" + }, + "optionalDependencies": { + "canvg": "^3.0.6", + "core-js": "^3.6.0", + "dompurify": "^2.5.4", + "html2canvas": "^1.0.0-rc.5" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -10104,6 +10213,13 @@ "dev": true, "license": "MIT" }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT", + "optional": true + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -10792,6 +10908,16 @@ ], "license": "MIT" }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "license": "MIT", + "optional": true, + "dependencies": { + "performance-now": "^2.1.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -11162,6 +11288,16 @@ "rgb": "bin/rgb" } }, + "node_modules/rgbcolor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", + "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==", + "license": "MIT OR SEE LICENSE IN FEEL-FREE.md", + "optional": true, + "engines": { + "node": ">= 0.8.15" + } + }, "node_modules/rollup": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", @@ -11943,6 +12079,16 @@ "dev": true, "license": "MIT" }, + "node_modules/stackblur-canvas": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz", + "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.14" + } + }, "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -12442,6 +12588,16 @@ "node": ">=0.10.0" } }, + "node_modules/svg-pathdata": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", + "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/svgo": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", @@ -12650,6 +12806,15 @@ "dev": true, "license": "MIT" }, + "node_modules/text-segmentation": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", + "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + "license": "MIT", + "dependencies": { + "utrie": "^1.0.2" + } + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -13673,6 +13838,15 @@ "dev": true, "license": "MIT" }, + "node_modules/utrie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", + "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + "license": "MIT", + "dependencies": { + "base64-arraybuffer": "^1.0.2" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/admin/package.json b/admin/package.json index 2688ea87..5c54b340 100644 --- a/admin/package.json +++ b/admin/package.json @@ -25,6 +25,8 @@ "echarts": "^5.6.0", "element-plus": "^2.9.4", "highlight.js": "^11.11.1", + "html2canvas": "^1.4.1", + "jspdf": "^2.5.2", "lodash": "^4.17.21", "lodash-es": "^4.17.21", "nprogress": "^0.2.0", @@ -67,4 +69,4 @@ "vite-plugin-vue-setup-extend": "^0.4.0", "vue-tsc": "^2.2.2" } -} \ No newline at end of file +} diff --git a/admin/src/api/order.ts b/admin/src/api/order.ts index 37db80ad..ad6d5b20 100644 --- a/admin/src/api/order.ts +++ b/admin/src/api/order.ts @@ -5,6 +5,11 @@ export function orderLists(params: any) { return request.get({ url: '/order.order/lists', params }) } +// 订单统计(0退款,1挂号费,2问诊费,3药品费用,4首付,5尾款,6其他) +export function orderStats(params?: { order_type?: number; days?: number }) { + return request.get({ url: '/order.order/orderStats', params }) +} + // 订单详情 export function orderDetail(params: any) { return request.post({ url: '/order.order/detail', params }) diff --git a/admin/src/api/tcm.ts b/admin/src/api/tcm.ts index bae1f05d..92dba2c7 100644 --- a/admin/src/api/tcm.ts +++ b/admin/src/api/tcm.ts @@ -5,6 +5,11 @@ export function tcmDiagnosisLists(params: any) { return request.get({ url: '/tcm.diagnosis/lists', params }) } +// 医助理诊单统计(按部门、按人) +export function assistantDiagnosisStats(params?: { start_time?: string; end_time?: string; days?: number }) { + return request.get({ url: '/tcm.diagnosis/assistantDiagnosisStats', params }) +} + // 添加中医诊单 export function tcmDiagnosisAdd(params: any) { return request.post({ url: '/tcm.diagnosis/add', params }) @@ -137,3 +142,25 @@ export function getWechatExternalContact(params: any) { export function getMsgAuditPermitUsers() { return request.get({ url: '/tcm.diagnosis/getMsgAuditPermitUsers' }) } + +// ========== 中医处方单 ========== + +// 添加处方 +export function prescriptionAdd(params: any) { + return request.post({ url: '/tcm.prescription/add', params }) +} + +// 处方详情 +export function prescriptionDetail(params: { id: number }) { + return request.get({ url: '/tcm.prescription/detail', params }) +} + +// 根据诊单获取处方列表 +export function prescriptionListByDiagnosis(params: { diagnosis_id: number }) { + return request.get({ url: '/tcm.prescription/listByDiagnosis', params }) +} + +// 根据预约获取处方 +export function prescriptionGetByAppointment(params: { appointment_id: number }) { + return request.get({ url: '/tcm.prescription/getByAppointment', params }) +} diff --git a/admin/src/components/chat-dialog/index.vue b/admin/src/components/chat-dialog/index.vue index 3334535d..8f969d5b 100644 --- a/admin/src/components/chat-dialog/index.vue +++ b/admin/src/components/chat-dialog/index.vue @@ -1,15 +1,21 @@ @@ -444,8 +621,8 @@ body > div[data-reka-focus-guard] { z-index: 9999 !important; } -/* 确保聊天对话框内的弹出层也能正确显示 */ -.chat-dialog [data-reka-popper-content-wrapper] { +/* 确保聊天窗口内的弹出层也能正确显示 */ +.chat-floating-window [data-reka-popper-content-wrapper] { z-index: 9999 !important; } diff --git a/admin/src/components/tcm-prescription/index.vue b/admin/src/components/tcm-prescription/index.vue new file mode 100644 index 00000000..5e86d7d1 --- /dev/null +++ b/admin/src/components/tcm-prescription/index.vue @@ -0,0 +1,756 @@ + + + + + diff --git a/admin/src/views/consumer/assistant/edit.vue b/admin/src/views/consumer/assistant/edit.vue new file mode 100644 index 00000000..e19bfccd --- /dev/null +++ b/admin/src/views/consumer/assistant/edit.vue @@ -0,0 +1,442 @@ + + + + + diff --git a/admin/src/views/consumer/assistant/index.vue b/admin/src/views/consumer/assistant/index.vue new file mode 100644 index 00000000..d4c72f30 --- /dev/null +++ b/admin/src/views/consumer/assistant/index.vue @@ -0,0 +1,164 @@ + + + + + + diff --git a/admin/src/views/order/index.vue b/admin/src/views/order/index.vue index 6f77e5ff..18424eb1 100644 --- a/admin/src/views/order/index.vue +++ b/admin/src/views/order/index.vue @@ -509,7 +509,11 @@ const getOrderTypeText = (type: number) => { const typeMap: Record = { 1: '挂号费', 2: '问诊费', - 3: '药品费用' + 3: '药品费用', + 4: '首付费用', + 5: '尾款费用', + 6:'其他费用', + 7:'全部费用', } return typeMap[type] || '未知' } diff --git a/admin/src/views/tcm/appointment/list.vue b/admin/src/views/tcm/appointment/list.vue index 2a142aae..9d4750ee 100644 --- a/admin/src/views/tcm/appointment/list.vue +++ b/admin/src/views/tcm/appointment/list.vue @@ -190,6 +190,15 @@ > 视频二维码 + + 开方 + @@ -250,8 +259,8 @@ - - + + @@ -298,7 +307,7 @@ import { appointmentLists, cancelAppointment, completeAppointment, appointmentDe import { getCallSignature, generateMiniProgramQrcode } from '@/api/tcm' import feedback from '@/utils/feedback' import EditPopup from '../diagnosis/edit.vue' -import PrescriptionDrawer from './components/prescription-drawer.vue' +import TcmPrescription from '@/components/tcm-prescription/index.vue' import ChatDialog from '@/components/chat-dialog/index.vue' import useUserStore from '@/stores/modules/user' import { getWeappConfig } from '@/api/channel/weapp' @@ -392,7 +401,7 @@ const handleReset = () => { const detailVisible = ref(false) const detailData = ref(null) const editRef = ref() -const prescriptionDrawerRef = ref() +const prescriptionRef = ref() const chatDialogRef = ref() // 小程序二维码相关 @@ -525,6 +534,15 @@ const handleMiniProgramQRCode = async (row: any) => { } } +// 开处方 +const handlePrescription = (row: any) => { + if (!row.diagnosis_id && !row.patient_id) { + feedback.msgWarning('该预约缺少诊单信息,请先编辑患者') + return + } + prescriptionRef.value?.open(row) +} + // 重新生成二维码 const handleRegenerateQRCode = () => { if (currentQRCodeRow.value) { diff --git a/admin/src/views/tcm/diagnosis/index.vue b/admin/src/views/tcm/diagnosis/index.vue index 030db8da..5dc9f360 100644 --- a/admin/src/views/tcm/diagnosis/index.vue +++ b/admin/src/views/tcm/diagnosis/index.vue @@ -284,6 +284,10 @@ + + + + diff --git a/admin/src/views/workbench/index.vue b/admin/src/views/workbench/index.vue index bc2a5f9f..354e3a4c 100644 --- a/admin/src/views/workbench/index.vue +++ b/admin/src/views/workbench/index.vue @@ -1,6 +1,8 @@