From 456dd667dfad0c6e20a1b5b8e7f7ec5f06c52e53 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 31 Aug 2026 15:17:34 +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 --- admin/src/api/first_visit.ts | 37 +- admin/src/api/tcm.ts | 5 + .../PrescriptionOrderDetailDrawer.vue | 46 ++ .../components/prescription-order-utils.ts | 1 + .../views/first_visit/conversion/index.vue | 22 +- .../components/PromotionAutomationForm.vue | 230 ++++++++++ .../components/WelcomeMessageEditor.vue | 246 +++++++++++ .../components/promotion-automation.ts | 195 +++++++++ .../first_visit/wecom_promotion/index.vue | 105 +++-- .../update_handoff_1_3_package_result.md | 134 ++++++ app/src/doctor_workstation/__init__.py | 2 +- .../doctor_workstation/services/app_update.py | 5 +- .../doctor_workstation/ui/diagnosis_drawer.py | 121 +++++- .../ui/dialogs/diagnosis.py | 24 +- .../doctor_workstation/ui/pages/reception.py | 9 +- app/tests/test_diagnosis_drawer_visual.py | 183 +++++++- app/tests/test_reception_parity_ui.py | 96 +++++ .../wecom-promotion-api-capabilities.md | 396 ++++++++++++++++++ docs/wecom-promotion-automation-deployment.md | 93 ++++ docs/wecom-promotion-validation.md | 22 + .../firstvisit/WecomPromotionController.php | 37 ++ .../tcm/PrescriptionOrderController.php | 12 + .../lists/tcm/PrescriptionOrderLists.php | 5 +- .../firstvisit/FirstVisitConversionLogic.php | 53 ++- .../logic/firstvisit/WecomPromotionLogic.php | 64 ++- .../logic/tcm/PrescriptionOrderLogic.php | 125 +++++- .../tcm/PrescriptionOrderValidate.php | 8 + .../QywxExternalContactCallbackController.php | 24 +- .../app/command/QywxRefreshPromotionMedia.php | 25 ++ .../command/QywxRetryPromotionAutomation.php | 26 ++ .../command/QywxWorkPromotionAutomation.php | 51 +++ .../qywx/QywxPromotionAutomationService.php | 363 ++++++++++++++++ .../qywx/QywxPromotionAutomationStore.php | 176 ++++++++ .../service/qywx/QywxPromotionCodeCipher.php | 89 ++++ .../service/qywx/QywxPromotionConfig.php | 273 ++++++++++++ .../qywx/QywxPromotionContactApiException.php | 16 + .../qywx/QywxPromotionContactApiService.php | 284 +++++++++++++ .../qywx/QywxPromotionEnqueueException.php | 9 + .../qywx/QywxPromotionMediaService.php | 303 ++++++++++++++ .../service/qywx/QywxPromotionMediaStore.php | 38 ++ .../service/qywx/QywxPromotionMemberRange.php | 26 +- .../QywxPromotionMemberSchedulerService.php | 2 +- .../qywx/QywxPromotionRangeSyncService.php | 4 +- server/config/console.php | 3 + server/config/qywx_promotion_automation.php | 8 + .../{.pnpm-Dwh6tNxD.js => .pnpm-BSw4l71J.js} | 2 +- .../{403-C8lEWSLB.js => 403-BnjcT6D5.js} | 2 +- .../{404-B3ZRrQhd.js => 404-BulZxIoQ.js} | 2 +- ...CipqHTHk.js => call-engine-js-D1CItQQ_.js} | 2 +- .../{chat-BVcoXjFo.js => chat-Des_07ef.js} | 2 +- ...QjlY3.js => chat-uikit-engine-Cr4__slg.js} | 2 +- ....js => AppointmentRecordPanel-DbNlbvwj.js} | 2 +- ...BVBq64f2.js => AssignLogPanel-EjcSdI9y.js} | 2 +- ...s => AssistantWatchCallDialog-Dr3UtWe_.js} | 2 +- .../admin/assets/BloodRecordList-Bz4_nxrr.js | 1 - .../admin/assets/BloodRecordList-Z_cASiyF.js | 1 + ...1LQS5Lj.js => CallRecordPanel-CpY_fqrL.js} | 2 +- ...DPNu4iKj.js => CaseRecordList-DgX7wlOk.js} | 2 +- ...ix-7f_kB7Qt.js => DailyMatrix-zNyGCqeG.js} | 2 +- ...83uZl.js => DiagnosisTodoList-BCC0mihp.js} | 2 +- ...C86vNF9e.js => DietRecordList-FukYinoA.js} | 2 +- ...DP1Q.js => ExerciseRecordList--hLRhRL0.js} | 2 +- ...ancaoSubmissionReconcileButton-4TibVNa5.js | 1 - ...ancaoSubmissionReconcileButton-ixMNiXVF.js | 1 + ...e_type_script_setup_true_lang-Dkug3Ge4.js} | 2 +- ...AMpNz.js => ImChatRecordPanel-caJG-Qwj.js} | 2 +- ...D3l6-.js => MediaSourceSelect-CRND3sor.js} | 2 +- ...e_type_script_setup_true_lang-CsbRGLkf.js} | 2 +- ...-UKzeJsc8.js => MessageBubble-BdjBsU3V.js} | 2 +- ...e-BXo4a6K1.js => NoteTimeline-Brvt2xX6.js} | 2 +- ...d6a8WTF.js => OrderActionHost-DwvAZ2hI.js} | 2 +- ...nel-B4NBLs1P.js => OrderPanel-CeMQ0CRS.js} | 2 +- ...el-52NmYdlx.js => PaibanPanel-Cr7-F8q4.js} | 2 +- ...i0Sx5mK.js => PatientCaseCard-DDMxeOhS.js} | 2 +- ...8N1vHan.js => PatientInfoCard-DFfdnCcB.js} | 2 +- ...W921Ju.js => PatientOrderList-Dtm0za07.js} | 2 +- ...criptionAiBatchGenerateDialog-SATMKfW3.js} | 2 +- ...=> PrescriptionAiReportDialog-BbnvvmHk.js} | 2 +- ...PrescriptionOrderDetailDrawer-B4rggqa1.css | 1 + .../PrescriptionOrderDetailDrawer-DDqDwYoJ.js | 1 + ...PrescriptionOrderDetailDrawer-DnrTcbh_.css | 1 - .../PrescriptionOrderDetailDrawer-XLzdVliK.js | 1 - ...-DHDXHySy.js => ProgressPanel-CxLNAldS.js} | 2 +- .../PromotionAutomationForm-Bb_8WSkH.css | 1 + .../PromotionAutomationForm-BfZAevtm.js | 1 + ....js => RecordingPlaybackBlock-Ci19TbAl.js} | 2 +- ...5-.js => RecordingVideoPlayer-fgB7SxV4.js} | 4 +- ...anel-Dao5W1n7.js => SendPanel-D1WdBUpi.js} | 2 +- ...B92IIbfO.js => TrackingMatrix-D6c9c4n4.js} | 2 +- ...pT.js => TrackingNoteTimeline-rKjxC0fX.js} | 2 +- ...=> WecomFloatingWidgetBuilder-BEveZXuV.js} | 2 +- .../assets/WelcomeMessageEditor-DD5mXWP2.css | 1 + .../assets/WelcomeMessageEditor-mapxdLUa.js | 1 + .../admin/assets/account-adjust-Co3HtH1A.js | 1 - .../admin/assets/account-adjust-dZx5ai0J.js | 1 + ...e_type_script_setup_true_lang-CrbSIkWk.js} | 2 +- ...t-DpW4IxSq.js => account_cost-BL730yuZ.js} | 2 +- .../{add-TGVmNNdK.js => add-Co1Teisr.js} | 2 +- .../public/admin/assets/add-nav-BUKkPb81.js | 1 + .../public/admin/assets/add-nav-e1-wZDCV.js | 1 - ...e_type_script_setup_true_lang-B_JUXGnm.js} | 2 +- .../{admin-DUSrrqT4.js => admin-Bmdzj8BE.js} | 2 +- ...nt-DKCESjei.js => appointment-D5VSXQn3.js} | 2 +- ...rticle-Dsf3Q7Pd.js => article-_SYv-ini.js} | 2 +- .../{asset-z-_BsZSa.js => asset--JBY6lcN.js} | 2 +- server/public/admin/assets/attr-BFKrLSq_.js | 1 + server/public/admin/assets/attr-BNKG1PcO.js | 1 - server/public/admin/assets/attr-BbEJ8TXr.js | 1 - .../{attr-D23inU0H.js => attr-C0yvI_DT.js} | 2 +- .../{attr-DbYvr5FK.js => attr-C3r7H7UP.js} | 2 +- server/public/admin/assets/attr-C8gKAb_R.js | 1 + server/public/admin/assets/attr-CIVvzcrw.js | 1 - server/public/admin/assets/attr-CNGLZm2I.js | 1 + server/public/admin/assets/attr-CPvmBees.js | 1 + server/public/admin/assets/attr-C_FfbMzX.js | 1 + server/public/admin/assets/attr-CfgtKm4z.js | 1 - server/public/admin/assets/attr-Cldn8Na8.js | 1 + server/public/admin/assets/attr-CoQg_s4D.js | 1 - server/public/admin/assets/attr-CxnsylC4.js | 1 + server/public/admin/assets/attr-D2pJFuq9.js | 1 + server/public/admin/assets/attr-DXOoD1cn.js | 1 - server/public/admin/assets/attr-Dlget2qH.js | 1 - server/public/admin/assets/attr-JKTDt6-w.js | 1 + server/public/admin/assets/attr-KnmjGyxi.js | 1 + server/public/admin/assets/attr-VYmMxH_S.js | 1 - server/public/admin/assets/attr-YeGdL1Qg.js | 1 - .../admin/assets/attr-setting-DCTBXd-z.js | 1 - .../admin/assets/attr-setting-DnHJKFRC.js | 1 + ...e_type_script_setup_true_lang-BAjQj504.js} | 2 +- server/public/admin/assets/attr-yXSTgyi9.js | 1 - ...e_type_script_setup_true_lang-BX4gdclK.js} | 2 +- ...e_type_script_setup_true_lang-C8lIxgDs.js} | 2 +- ...e_type_script_setup_true_lang-CNu0a1pL.js} | 2 +- ...e_type_script_setup_true_lang-CdNAifO0.js} | 2 +- ...e_type_script_setup_true_lang-Cxhd7Qdg.js} | 2 +- ...e_type_script_setup_true_lang-DOQJNCXj.js} | 2 +- ...e_type_script_setup_true_lang-bZoT5wvF.js} | 2 +- ...e_type_script_setup_true_lang-v5ByQeMO.js} | 2 +- ...e_type_script_setup_true_lang-vjIWb05X.js} | 2 +- ...e_type_script_setup_true_lang-xgAFCbr-.js} | 2 +- server/public/admin/assets/auth-CA7OBc_w.js | 1 - server/public/admin/assets/auth-t3iuOa7S.js | 1 + ...e_type_script_setup_true_lang-CFc2eGLT.js} | 2 +- ...ERYaktZ.js => balance_details-DglD1vU-.js} | 2 +- ...aOTXpx.js => bind-work-wechat-B3DcayyB.js} | 2 +- .../{cache-Xfq4Nf8F.js => cache-B_GTuZfc.js} | 2 +- ...FqjJIc4.js => change-password-DY5ghkT3.js} | 2 +- .../{code-CvQajwUj.js => code-DnwqHRNE.js} | 2 +- .../admin/assets/code-preview-HDxcbQlu.js | 1 - .../admin/assets/code-preview-wV9EdZl1.js | 1 + ...e_type_script_setup_true_lang-C3NgTrFu.js} | 2 +- ...u.js => commission-settlement-BzskJwPT.js} | 2 +- ...{config-D9GLkF44.js => config-DMoRRRXb.js} | 2 +- ...sumer-B0X_xd7a.js => consumer-DIWqLsDh.js} | 2 +- .../public/admin/assets/content-0aV5Nav7.js | 1 + ...ontent-BwrtrucD.js => content-1SM6TxNJ.js} | 2 +- .../public/admin/assets/content-1WSnqhr6.js | 1 + .../public/admin/assets/content-B3dYDSpA.js | 1 - .../public/admin/assets/content-BJelGmyK.js | 1 - .../public/admin/assets/content-Bc2co7U_.js | 1 - .../public/admin/assets/content-BkfDelq5.js | 1 - .../public/admin/assets/content-C4Lm1hWe.js | 1 - ...ontent-gLX1n3T8.js => content-CR-Jp8HE.js} | 2 +- ...ontent-D4fhwymx.js => content-CeRcUUHv.js} | 2 +- ...ontent-CkaTpHbB.js => content-D7TY9P5J.js} | 2 +- .../public/admin/assets/content-DMdllCpr.js | 1 + .../public/admin/assets/content-DT49xOR8.js | 1 + .../public/admin/assets/content-DbfcA86i.js | 1 + .../public/admin/assets/content-Ds8nmnYY.js | 1 + ...ontent-B48usMjw.js => content-IYJe5Twe.js} | 2 +- .../public/admin/assets/content-KOpIk4Jt.js | 1 - ...ontent-DWdZLXDI.js => content-stjF46XH.js} | 2 +- ...ontent-BCd-s9DE.js => content-udWiOD_Z.js} | 2 +- ...e_type_script_setup_true_lang---C_n7J8.js} | 2 +- ...e_type_script_setup_true_lang-BUSWRMQc.js} | 2 +- ...e_type_script_setup_true_lang-CXyDgMLw.js} | 2 +- ...e_type_script_setup_true_lang-IPr_LqG1.js} | 2 +- ...e_type_script_setup_true_lang-YorKB9i2.js} | 2 +- .../public/admin/assets/cost-edit-BIpViu2K.js | 1 + .../public/admin/assets/cost-edit-CymyMSUk.js | 1 - ...e_type_script_setup_true_lang-CwdTQaKE.js} | 2 +- .../admin/assets/data-table-CLbeeUey.js | 1 - .../admin/assets/data-table-DALudDnr.js | 1 + ...e_type_script_setup_true_lang-B-vLVq2k.js} | 2 +- .../{dayjs-Cbxn44tS.js => dayjs-CVa8MSSA.js} | 2 +- ...ion-CUkQOQLk.js => decoration-B9DxqqTF.js} | 2 +- ...Aio_OKJA.js => decoration-img-frlDOjkz.js} | 2 +- ...-B2rADVla.js => default_reply-_zbCb0Zi.js} | 2 +- ...ent-MTfWSQxp.js => department-w0Ka42uy.js} | 2 +- ...ji-B8hF-i1M.js => dept-tongji-Cq0YfkM7.js} | 2 +- ...{detail-6JMrZE4O.js => detail-BFXeegI9.js} | 2 +- ...{detail-BKhCLDx3.js => detail-CuJF77ro.js} | 2 +- .../{dict-CQ_C2o0J.js => dict-DpVHigns.js} | 2 +- ...{doctor-DQJF3mgr.js => doctor-DBWxvtwh.js} | 2 +- server/public/admin/assets/edit-10JdlICm.js | 1 - server/public/admin/assets/edit-5wXc4IMn.js | 1 + server/public/admin/assets/edit-7ccPGLmC.js | 1 - server/public/admin/assets/edit-AlvSrjUx.js | 1 - server/public/admin/assets/edit-B0elk-oH.js | 1 - server/public/admin/assets/edit-B2uGa413.js | 1 + server/public/admin/assets/edit-BIImMoQ7.js | 1 + server/public/admin/assets/edit-BWFwUbn-.js | 1 + .../{edit-B_cUNqr2.js => edit-C7iuIzTe.js} | 2 +- server/public/admin/assets/edit-C8RkKFVy.js | 1 + server/public/admin/assets/edit-CMfY_XKE.js | 1 - server/public/admin/assets/edit-CV6K_wNc.js | 1 - .../{edit-CKQojFsZ.js => edit-CaMk5-3P.js} | 2 +- server/public/admin/assets/edit-CoJXh142.js | 1 - .../{edit-Comk-Pnh.js => edit-CsDhlZd3.js} | 2 +- server/public/admin/assets/edit-D22Vv0Gb.js | 1 + .../{edit-HtfhyZMW.js => edit-D2mzBR_d.js} | 2 +- .../{edit-CLOdM6BH.js => edit-D6SStLu0.js} | 2 +- .../{edit-DL9KefVP.js => edit-DHnt66yB.js} | 2 +- .../{edit-CsedpvE-.js => edit-DIExe5AF.js} | 2 +- server/public/admin/assets/edit-D_Xe2uXf.js | 1 + server/public/admin/assets/edit-Ds4YIn84.js | 1 + server/public/admin/assets/edit-Dwv0yWaU.js | 1 + server/public/admin/assets/edit-Ii4YpLBA.js | 1 - server/public/admin/assets/edit-L-DOi0qo.js | 1 - server/public/admin/assets/edit-LYFv9iuX.js | 1 + server/public/admin/assets/edit-Ucf6ftg8.js | 1 - server/public/admin/assets/edit-cDoLjav3.js | 1 - .../{edit-Dekh9ZqA.js => edit-oco9EAK-.js} | 2 +- .../{edit-CRHtJvLC.js => edit-ryC0d3CG.js} | 2 +- server/public/admin/assets/edit-xU-e2mJ8.js | 1 + ...e_type_script_setup_true_lang-4nnxoZL9.js} | 2 +- ...e_type_script_setup_true_lang-BKEeE43w.js} | 2 +- ...e_type_script_setup_true_lang-Bb5pjrSX.js} | 2 +- ...e_type_script_setup_true_lang-CO9lbmZ7.js} | 2 +- ...e_type_script_setup_true_lang-CSDkyc0m.js} | 2 +- ...e_type_script_setup_true_lang-CtE21KfR.js} | 2 +- ...e_type_script_setup_true_lang-DOru9tXW.js} | 2 +- ...e_type_script_setup_true_lang-Om5TpmvI.js} | 2 +- ...e_type_script_setup_true_lang-UNWPRd1h.js} | 2 +- ...e_type_script_setup_true_lang-jdfSFJa2.js} | 2 +- ...e_name_articleColumnEdit_lang-D7JHFMBF.js} | 2 +- ...nt-Bi7eexR6.js => environment-BkriATHW.js} | 2 +- .../{error-D-uPyFBJ.js => error-abZoCXdu.js} | 2 +- .../{fans-Bb64fXyq.js => fans-FJRWzUKP.js} | 2 +- .../{file-D75Ivf9i.js => file-B8vAmxT-.js} | 2 +- .../{file-DWoFbTjb.js => file-BXk5F0Ys.js} | 2 +- ...{filing-Blolcld9.js => filing-MDR1oTS9.js} | 2 +- ...inance-CQGdd_Go.js => finance-glk8Sko5.js} | 2 +- .../admin/assets/first_visit-DAxtuCK2.js | 1 - .../admin/assets/first_visit-DEhGYh-J.js | 1 + ...y-BrXQTvVq.js => follow_reply-t-8zOU3R.js} | 2 +- ...e_type_script_setup_true_lang-CzPfxxzB.js} | 2 +- .../admin/assets/getExposeType-Bg3eQ4S7.js | 1 + .../admin/assets/getExposeType-DJc9Mp7l.js | 1 - ...{guahao-fsKR9vJW.js => guahao-Dpc6vnPB.js} | 2 +- .../assets/{h5-BjijOinF.js => h5-4MleGpK8.js} | 2 +- .../assets/{h5-CxPR9gaD.js => h5-r09kyT_D.js} | 2 +- .../{icon-1uy4iE8p.js => icon-CXilXDyn.js} | 2 +- ... => im-business-message-parse-oYIP1khU.js} | 2 +- server/public/admin/assets/index-ACf7LRwH.js | 1 + .../{index-C2RO7ZXL.js => index-B4tn80ww.js} | 2 +- .../{index-BSnMSmpl.js => index-B6fIMQze.js} | 4 +- .../{index-xpuJLSls.js => index-B6rU-plF.js} | 2 +- server/public/admin/assets/index-BC7h-DRM.js | 1 + .../{index-BrixtWVC.js => index-BGo6koia.js} | 2 +- .../{index-BFiquBi7.js => index-BOPo4KMm.js} | 2 +- .../{index-jRkFOHfc.js => index-BPKduYMm.js} | 2 +- server/public/admin/assets/index-BV6L59dz.css | 1 + server/public/admin/assets/index-BWlhxa68.js | 2 + .../{index-BvP6jKID.js => index-Bh7tEfy4.js} | 2 +- .../{index-CKIW3ABd.js => index-BhGuzk93.js} | 2 +- .../{index-CZRr_648.js => index-Bo2pHBTY.js} | 2 +- .../{index-BnfeBpgt.js => index-BqRKl0wi.js} | 2 +- .../{index-B8evJDsl.js => index-BqyBu5g8.js} | 2 +- server/public/admin/assets/index-Btf4HA-t.css | 1 - .../{index-Bmx1NuY2.js => index-Bv3TzZIB.js} | 2 +- .../{index--JXB9DHQ.js => index-C0ZGCLsb.js} | 2 +- .../{index-DrnibAL4.js => index-C1IpcoQZ.js} | 2 +- .../{index-77Euo7Ci.js => index-C3ggXFi2.js} | 2 +- .../{index-D0Qlwy5A.js => index-C7YoZCtn.js} | 2 +- .../{index-C7291G3H.js => index-C87K-Z1w.js} | 2 +- .../{index-BbIv2PHW.js => index-C8liezF7.js} | 2 +- server/public/admin/assets/index-CCW2jHkL.js | 1 - .../{index-BkwDFgzY.js => index-CHPIrM8-.js} | 2 +- server/public/admin/assets/index-CKylQnvr.js | 1 - .../{index-CgG9jXrQ.js => index-C_KuJ6qz.js} | 4 +- .../{index-BMtA1ooo.js => index-CbM5wK1d.js} | 2 +- .../{index-pm0C3F0W.js => index-ChUPMvdk.js} | 4 +- .../{index-dbNEla3L.js => index-CoqerWpH.js} | 2 +- .../{index-C_hJGcdG.js => index-Cov-EzHW.js} | 2 +- .../{index-B3NeDCR-.js => index-CtMJX_6d.js} | 2 +- .../{index-a5BG1BWa.js => index-CxlfG2e6.js} | 2 +- .../{index-DgdkrwCe.js => index-D0wliDS3.js} | 2 +- .../{index-Be51Lchh.js => index-D5ZASNGg.js} | 2 +- .../{index-BN2M6lGD.js => index-D8TXInkJ.js} | 2 +- server/public/admin/assets/index-D8Ue9ypt.css | 1 - .../{index-D1mL0Y2z.js => index-DCfUc3Nn.js} | 2 +- .../{index-CWtmv6c_.js => index-DDRApsfH.js} | 2 +- .../{index-CsxFhp2j.js => index-DLt1jKBt.js} | 4 +- .../{index-BuHCHmWh.js => index-DNtgDv3T.js} | 2 +- .../{index-Drab_Br1.js => index-DSN2YnxK.js} | 2 +- .../{index-CtSbqfbA.js => index-DVrcLx5z.js} | 2 +- .../{index-DH7raP3N.js => index-Dbu2gKMW.js} | 4 +- .../{index-B7n-FpxB.js => index-DdGEztH-.js} | 2 +- .../{index-jinPz6CE.js => index-DfI8gz4Z.js} | 8 +- server/public/admin/assets/index-DiLrIQPJ.css | 1 + .../{index-DFtvrIDK.js => index-DjU6IwMw.js} | 2 +- .../{index-l5Cq2faW.js => index-DkQkmNck.js} | 2 +- .../{index-BSwVDYZd.js => index-Du0eYB29.js} | 2 +- .../{index-BS82gb6r.js => index-Fsb-fRH9.js} | 2 +- .../{index-CJn0zdCA.js => index-IBEgpZdk.js} | 2 +- .../{index-vXlyiLlo.js => index-J5BM-zMe.js} | 2 +- .../{index-BtfryG-T.js => index-LrvZgLyd.js} | 2 +- .../{index-DFvgqKH8.js => index-PArzJ7v1.js} | 2 +- .../{index-BcTeGwNc.js => index-R-F1TfEb.js} | 2 +- .../{index-DCHFJLxs.js => index-RDhbExbW.js} | 2 +- .../{index-DctcvcVd.js => index-RalWxPEr.js} | 2 +- .../{index-Bj958_hn.js => index-SJIlBBgP.js} | 4 +- .../{index-B8LZ-HCp.js => index-TisaJaAB.js} | 2 +- .../{index-ayQNEW9Q.js => index-XKdYfxP_.js} | 2 +- .../{index-CmOl8Ts_.js => index-YwkBljgR.js} | 4 +- server/public/admin/assets/index-a_ZxLOOo.js | 2 - .../{index-CtgrQFM4.js => index-js2iKhLU.js} | 2 +- .../{index-Df0rI9Fp.js => index-yChcjY1t.js} | 2 +- ...e_type_script_setup_true_lang--kuEf_zw.js} | 2 +- ...e_type_script_setup_true_lang-BOJpu9c9.js} | 2 +- ...e_type_script_setup_true_lang-CI67ka5y.js} | 2 +- ...e_type_script_setup_true_lang-D3ZtXZaD.js} | 2 +- ...e_type_script_setup_true_lang-D6YizxbY.js} | 2 +- ...e_vue_type_style_index_0_lang-6ZIeNcsc.js} | 2 +- ...ex_h5-DK-hO-pX.js => index_h5-Bx3P7RKG.js} | 4 +- ...on-BtY6-e1D.js => information-D0_fTpck.js} | 2 +- ...ournal-DPOjySw-.js => journal-CTnbrhvB.js} | 2 +- ...-BzMCBMvw.js => keyword_reply-Xui2QW00.js} | 2 +- .../{link-Db0SWZfr.js => link-B-QMcsoR.js} | 2 +- .../{list-EyT7ualt.js => list-BW93YBY4.js} | 2 +- .../{list-BPqBZ8SM.js => list-uXqDbAgB.js} | 4 +- ...ist_h5-yqC6XpaH.js => list_h5-CxNMcZ8o.js} | 4 +- .../{login-Bvk_3iIJ.js => login-BV70sH7V.js} | 2 +- ...CyHVWiqe.js => login_register-DOddbm71.js} | 2 +- ...icine-DIEwHOeB.js => medicine-D8ZQ5ak7.js} | 2 +- ...icine-nsHwJViA.js => medicine-Dv65pEge.js} | 2 +- .../{menu-BMLd7Gi6.js => menu-4hqI2LGO.js} | 2 +- .../{menu-DlNXlk8k.js => menu-BVjq04Up.js} | 2 +- .../{menu-C7DGNCxH.js => menu-DNhfh4z9.js} | 2 +- .../public/admin/assets/menu-set-DmdKRr0A.js | 1 - .../public/admin/assets/menu-set-DzyLtrgj.js | 1 + ...e_type_script_setup_true_lang-CxXbGeBD.js} | 2 +- ...essage-CAHFWDnF.js => message-rt2JV_ag.js} | 2 +- .../admin/assets/mobile-style-C8MZrD7i.js | 1 - .../admin/assets/mobile-style-D7j4dFs8.js | 1 + ...e_type_script_setup_true_lang-xE8CM6Sx.js} | 2 +- ...{mubiao-Do05CGtS.js => mubiao-Dk-zZZaM.js} | 2 +- ...u1Or-m.js => mubiao-dept-card-88Hsg1TX.js} | 2 +- ...l4QS_J.js => mubiao-dept-node-BXj84IKs.js} | 2 +- ...a-attr-CEGE3U3o.js => oa-attr-_CV9AFPO.js} | 2 +- .../admin/assets/oa-menu-form-Dg8v7Jd9.js | 1 + .../admin/assets/oa-menu-form-eDjdjDB5.js | 1 - .../assets/oa-menu-form-edit-CFPHeHd-.js | 1 + .../assets/oa-menu-form-edit-W2DClkmp.js | 1 - ...e_type_script_setup_true_lang-CVk0vSPV.js} | 2 +- ...e_type_script_setup_true_lang-D2YNfIlQ.js} | 2 +- ...phone-CRp_i1VK.js => oa-phone-CcYCrwZ4.js} | 2 +- ...g-DLxiGNiR.js => open_setting-DAJO5M1O.js} | 2 +- .../{order-Dz1NL82W.js => order-CKwVRWzr.js} | 2 +- ...ist-lLpjaY3B.js => order_list-CpGE2546.js} | 4 +- ...-Daz8CjH0.js => order_list_h5-BTreEqnm.js} | 4 +- ...rflow-ErQsBwLa.js => overflow-Hm0n79oF.js} | 2 +- ...{paiban-woJxc_2K.js => paiban-CtrBW-2Q.js} | 2 +- ...atient-DiY8uj2P.js => patient-SnE6JXh9.js} | 2 +- ...l-DTS3e3dS.js => patient-call-DSwOmO2t.js} | 2 +- .../{pay-CVRnPrCn.js => pay-MmH2aQ_e.js} | 2 +- .../assets/{pc-kV-GzTmX.js => pc-D4RwpD7Y.js} | 2 +- .../admin/assets/pc_details-B4ZGhYHm.js | 1 - .../admin/assets/pc_details-C98ia8eg.js | 1 + .../{perm-tSma3sWL.js => perm-BdlAVcmi.js} | 2 +- ...{picker-RZLRR_G5.js => picker-B4EVDozl.js} | 2 +- ...{picker-tazliPuC.js => picker-C_3iViNJ.js} | 2 +- ...e_type_script_setup_true_lang-DEsPYilO.js} | 2 +- ...-DAJtR42p.js => popover_input-PNE9JPug.js} | 2 +- .../{post-JpabMAL_.js => post-BvNwM47F.js} | 2 +- ...5dL.js => prescription-drawer-hoB6wWHO.js} | 2 +- .../prescription-order-utils-B0fYlULc.js | 2 - .../prescription-order-utils-CpKeuzsa.js | 2 + ...review-BHKlkFM2.js => preview-Cjkqfxv9.js} | 2 +- ...-pc-lI4_qErz.js => preview-pc-lkXi8Tir.js} | 2 +- ...gress-PPaX2s9P.js => progress--D4kLOJS.js} | 2 +- ...tocol-Dj8DsORc.js => protocol-tnzHuF6S.js} | 2 +- .../{qywx-DNLk8l-B.js => qywx-NGCLmAZN.js} | 2 +- ...donly-Bzhw48AS.js => readonly-B6IlEEYw.js} | 2 +- ...WqElylR.js => recharge_record-BtmSX-pl.js} | 2 +- .../admin/assets/refund-log-CP-nReqp.js | 1 + .../admin/assets/refund-log-DsMdsR52.js | 1 - ...e_type_script_setup_true_lang-S6pjjj6S.js} | 2 +- ...-BYJT3v77.js => refund_record-nbV4Sf3R.js} | 2 +- .../admin/assets/relations-add-BHdwKSZz.js | 1 + .../admin/assets/relations-add-m0SAciy8.js | 1 - ...e_type_script_setup_true_lang-DSvHm9Wx.js} | 2 +- ...text-eShKmFm2.js => rich_text-BUbXcm8r.js} | 2 +- .../{role-BK9-X1JV.js => role-CHpVoaGw.js} | 2 +- ...{roster-BfTD7pra.js => roster-D3607D4X.js} | 2 +- ...ect-DyJ4vVvn.js => rtc-detect-DwzBINgK.js} | 2 +- ...kdEV8c.js => self_input_stats-BsN34aOT.js} | 2 +- ...etting-d4IYSzeT.js => setting-DFXrHPI9.js} | 2 +- .../{setup-BmxJqJoJ.js => setup-B-2KE9ct.js} | 2 +- ...ics-LrAz8bLV.js => statistics-BzjrRQ3t.js} | 2 +- .../{stats-Di_MlUCe.js => stats-CPQMaHKU.js} | 2 +- .../{style-C3CXqKKB.js => style-B2GTYpFV.js} | 2 +- ...{tabbar-DMb_epzy.js => tabbar-PrdH4_Ym.js} | 2 +- .../{tcm--WHZCSMq.js => tcm-Bv_Ly0A0.js} | 2 +- ...r-BsOiHacI.js => theme-picker-32bCJ-fJ.js} | 2 +- ...> tim-profanity-filter-plugin-pxG5lfA2.js} | 2 +- ...O84pK.js => tim-upload-plugin-Doi1tBqv.js} | 2 +- ...{tongji-BFhvh-uV.js => tongji-Bc8sXYbV.js} | 2 +- ...{upload-3IoSn2Ek.js => upload-BzGCpHnh.js} | 2 +- ...pz0NtZPZ.js => useDictOptions-DL_MQ7g9.js} | 2 +- ...nhP5x.js => useListTimeFilter-ZDlGSGqM.js} | 2 +- ...ckFn-DMpiF_Hj.js => useLockFn-DZ9wDgti.js} | 2 +- ...p.js => useMediaSourceOptions-DAfnJEWc.js} | 2 +- ...nuOa-CjKLE6t4.js => useMenuOa-qJ7Af1rq.js} | 2 +- ...ging-DOuAwzL9.js => usePaging-BeGcb2kN.js} | 2 +- .../{user-DRhBHUvG.js => user-CRZD_3lR.js} | 2 +- .../{weapp-B8wW_O4N.js => weapp-C6mHmUez.js} | 2 +- .../{weapp-awldkq-G.js => weapp-Cv-aJVvY.js} | 2 +- ...ebsite-CHqXkHCa.js => website-DAaBhFEN.js} | 2 +- .../{wx_oa-D94L7ur0.js => wx_oa-BcEVGRPA.js} | 2 +- .../{yeji-BXeKeLKG.js => yeji-BgjGKghf.js} | 2 +- .../public/admin/assets/yeji-edit-BVSNnhpQ.js | 1 - .../public/admin/assets/yeji-edit-CVUG3MJC.js | 1 + ...e_type_script_setup_true_lang-Bs3DWBA3.js} | 2 +- server/public/admin/index.html | 4 +- ...escription_order_unlink_pay_order_menu.sql | 21 + .../add_wecom_promotion_automation.sql | 72 ++++ ...sitConversionDeletedFansPermissionTest.php | 238 +++++++++++ ...FirstVisitConversionFanDetailSmokeTest.php | 30 +- .../PrescriptionOrderUnlinkPayOrderTest.php | 330 +++++++++++++++ .../QywxPromotionAutomationConfigTest.php | 84 ++++ .../QywxPromotionAutomationServiceTest.php | 192 +++++++++ server/tests/QywxPromotionCodeCipherTest.php | 76 ++++ .../QywxPromotionContactApiServiceTest.php | 93 ++++ server/tests/QywxPromotionCreateTagTest.php | 109 +++++ .../tests/QywxPromotionMediaServiceTest.php | 88 ++++ .../tests/WecomPromotionAutomationUiTest.mjs | 51 +++ .../WecomPromotionCreateTagControllerTest.php | 74 ++++ 439 files changed, 5720 insertions(+), 422 deletions(-) create mode 100644 admin/src/views/first_visit/wecom_promotion/components/PromotionAutomationForm.vue create mode 100644 admin/src/views/first_visit/wecom_promotion/components/WelcomeMessageEditor.vue create mode 100644 admin/src/views/first_visit/wecom_promotion/components/promotion-automation.ts create mode 100644 app/research/update_handoff_1_3_package_result.md create mode 100644 docs/research/wecom-promotion-api-capabilities.md create mode 100644 docs/wecom-promotion-automation-deployment.md create mode 100644 docs/wecom-promotion-validation.md create mode 100644 server/app/command/QywxRefreshPromotionMedia.php create mode 100644 server/app/command/QywxRetryPromotionAutomation.php create mode 100644 server/app/command/QywxWorkPromotionAutomation.php create mode 100644 server/app/common/service/qywx/QywxPromotionAutomationService.php create mode 100644 server/app/common/service/qywx/QywxPromotionAutomationStore.php create mode 100644 server/app/common/service/qywx/QywxPromotionCodeCipher.php create mode 100644 server/app/common/service/qywx/QywxPromotionConfig.php create mode 100644 server/app/common/service/qywx/QywxPromotionContactApiException.php create mode 100644 server/app/common/service/qywx/QywxPromotionContactApiService.php create mode 100644 server/app/common/service/qywx/QywxPromotionEnqueueException.php create mode 100644 server/app/common/service/qywx/QywxPromotionMediaService.php create mode 100644 server/app/common/service/qywx/QywxPromotionMediaStore.php create mode 100644 server/config/qywx_promotion_automation.php rename server/public/admin/assets/{.pnpm-Dwh6tNxD.js => .pnpm-BSw4l71J.js} (99%) rename server/public/admin/assets/{403-C8lEWSLB.js => 403-BnjcT6D5.js} (75%) rename server/public/admin/assets/{404-B3ZRrQhd.js => 404-BulZxIoQ.js} (58%) rename server/public/admin/assets/@tencentcloud/{call-engine-js-CipqHTHk.js => call-engine-js-D1CItQQ_.js} (99%) rename server/public/admin/assets/@tencentcloud/{chat-BVcoXjFo.js => chat-Des_07ef.js} (99%) rename server/public/admin/assets/@tencentcloud/{chat-uikit-engine-DMWQjlY3.js => chat-uikit-engine-Cr4__slg.js} (99%) rename server/public/admin/assets/{AppointmentRecordPanel-CLuAJpL9.js => AppointmentRecordPanel-DbNlbvwj.js} (96%) rename server/public/admin/assets/{AssignLogPanel-BVBq64f2.js => AssignLogPanel-EjcSdI9y.js} (95%) rename server/public/admin/assets/{AssistantWatchCallDialog-BYDb76Ai.js => AssistantWatchCallDialog-Dr3UtWe_.js} (94%) delete mode 100644 server/public/admin/assets/BloodRecordList-Bz4_nxrr.js create mode 100644 server/public/admin/assets/BloodRecordList-Z_cASiyF.js rename server/public/admin/assets/{CallRecordPanel-W1LQS5Lj.js => CallRecordPanel-CpY_fqrL.js} (84%) rename server/public/admin/assets/{CaseRecordList-DPNu4iKj.js => CaseRecordList-DgX7wlOk.js} (93%) rename server/public/admin/assets/{DailyMatrix-7f_kB7Qt.js => DailyMatrix-zNyGCqeG.js} (55%) rename server/public/admin/assets/{DiagnosisTodoList-Ddl83uZl.js => DiagnosisTodoList-BCC0mihp.js} (95%) rename server/public/admin/assets/{DietRecordList-C86vNF9e.js => DietRecordList-FukYinoA.js} (91%) rename server/public/admin/assets/{ExerciseRecordList-qRBhDP1Q.js => ExerciseRecordList--hLRhRL0.js} (73%) delete mode 100644 server/public/admin/assets/GancaoSubmissionReconcileButton-4TibVNa5.js create mode 100644 server/public/admin/assets/GancaoSubmissionReconcileButton-ixMNiXVF.js rename server/public/admin/assets/{GancaoSubmissionReconcileButton.vue_vue_type_script_setup_true_lang-DH8EYYzR.js => GancaoSubmissionReconcileButton.vue_vue_type_script_setup_true_lang-Dkug3Ge4.js} (96%) rename server/public/admin/assets/{ImChatRecordPanel-gwCAMpNz.js => ImChatRecordPanel-caJG-Qwj.js} (83%) rename server/public/admin/assets/{MediaSourceSelect-B61D3l6-.js => MediaSourceSelect-CRND3sor.js} (53%) rename server/public/admin/assets/{MediaSourceSelect.vue_vue_type_script_setup_true_lang-B_HCfW5z.js => MediaSourceSelect.vue_vue_type_script_setup_true_lang-CsbRGLkf.js} (91%) rename server/public/admin/assets/{MessageBubble-UKzeJsc8.js => MessageBubble-BdjBsU3V.js} (96%) rename server/public/admin/assets/{NoteTimeline-BXo4a6K1.js => NoteTimeline-Brvt2xX6.js} (90%) rename server/public/admin/assets/{OrderActionHost-Kd6a8WTF.js => OrderActionHost-DwvAZ2hI.js} (98%) rename server/public/admin/assets/{OrderPanel-B4NBLs1P.js => OrderPanel-CeMQ0CRS.js} (95%) rename server/public/admin/assets/{PaibanPanel-52NmYdlx.js => PaibanPanel-Cr7-F8q4.js} (95%) rename server/public/admin/assets/{PatientCaseCard-Di0Sx5mK.js => PatientCaseCard-DDMxeOhS.js} (98%) rename server/public/admin/assets/{PatientInfoCard-c8N1vHan.js => PatientInfoCard-DFfdnCcB.js} (96%) rename server/public/admin/assets/{PatientOrderList-CyW921Ju.js => PatientOrderList-Dtm0za07.js} (83%) rename server/public/admin/assets/{PrescriptionAiBatchGenerateDialog-WzKyH4aX.js => PrescriptionAiBatchGenerateDialog-SATMKfW3.js} (98%) rename server/public/admin/assets/{PrescriptionAiReportDialog-OA5l3kJM.js => PrescriptionAiReportDialog-BbnvvmHk.js} (99%) create mode 100644 server/public/admin/assets/PrescriptionOrderDetailDrawer-B4rggqa1.css create mode 100644 server/public/admin/assets/PrescriptionOrderDetailDrawer-DDqDwYoJ.js delete mode 100644 server/public/admin/assets/PrescriptionOrderDetailDrawer-DnrTcbh_.css delete mode 100644 server/public/admin/assets/PrescriptionOrderDetailDrawer-XLzdVliK.js rename server/public/admin/assets/{ProgressPanel-DHDXHySy.js => ProgressPanel-CxLNAldS.js} (97%) create mode 100644 server/public/admin/assets/PromotionAutomationForm-Bb_8WSkH.css create mode 100644 server/public/admin/assets/PromotionAutomationForm-BfZAevtm.js rename server/public/admin/assets/{RecordingPlaybackBlock-B2R-2s7-.js => RecordingPlaybackBlock-Ci19TbAl.js} (92%) rename server/public/admin/assets/{RecordingVideoPlayer-Xhx3gz5-.js => RecordingVideoPlayer-fgB7SxV4.js} (87%) rename server/public/admin/assets/{SendPanel-Dao5W1n7.js => SendPanel-D1WdBUpi.js} (98%) rename server/public/admin/assets/{TrackingMatrix-B92IIbfO.js => TrackingMatrix-D6c9c4n4.js} (91%) rename server/public/admin/assets/{TrackingNoteTimeline-Be4e5GpT.js => TrackingNoteTimeline-rKjxC0fX.js} (93%) rename server/public/admin/assets/{WecomFloatingWidgetBuilder-D0m6Z9zh.js => WecomFloatingWidgetBuilder-BEveZXuV.js} (88%) create mode 100644 server/public/admin/assets/WelcomeMessageEditor-DD5mXWP2.css create mode 100644 server/public/admin/assets/WelcomeMessageEditor-mapxdLUa.js delete mode 100644 server/public/admin/assets/account-adjust-Co3HtH1A.js create mode 100644 server/public/admin/assets/account-adjust-dZx5ai0J.js rename server/public/admin/assets/{account-adjust.vue_vue_type_script_setup_true_lang-Bqj5kT9K.js => account-adjust.vue_vue_type_script_setup_true_lang-CrbSIkWk.js} (94%) rename server/public/admin/assets/{account_cost-DpW4IxSq.js => account_cost-BL730yuZ.js} (90%) rename server/public/admin/assets/{add-TGVmNNdK.js => add-Co1Teisr.js} (91%) create mode 100644 server/public/admin/assets/add-nav-BUKkPb81.js delete mode 100644 server/public/admin/assets/add-nav-e1-wZDCV.js rename server/public/admin/assets/{add-nav.vue_vue_type_script_setup_true_lang-BHQKdn5u.js => add-nav.vue_vue_type_script_setup_true_lang-B_JUXGnm.js} (90%) rename server/public/admin/assets/{admin-DUSrrqT4.js => admin-Bmdzj8BE.js} (84%) rename server/public/admin/assets/{appointment-DKCESjei.js => appointment-D5VSXQn3.js} (92%) rename server/public/admin/assets/{article-Dsf3Q7Pd.js => article-_SYv-ini.js} (93%) rename server/public/admin/assets/{asset-z-_BsZSa.js => asset--JBY6lcN.js} (90%) create mode 100644 server/public/admin/assets/attr-BFKrLSq_.js delete mode 100644 server/public/admin/assets/attr-BNKG1PcO.js delete mode 100644 server/public/admin/assets/attr-BbEJ8TXr.js rename server/public/admin/assets/{attr-D23inU0H.js => attr-C0yvI_DT.js} (61%) rename server/public/admin/assets/{attr-DbYvr5FK.js => attr-C3r7H7UP.js} (89%) create mode 100644 server/public/admin/assets/attr-C8gKAb_R.js delete mode 100644 server/public/admin/assets/attr-CIVvzcrw.js create mode 100644 server/public/admin/assets/attr-CNGLZm2I.js create mode 100644 server/public/admin/assets/attr-CPvmBees.js create mode 100644 server/public/admin/assets/attr-C_FfbMzX.js delete mode 100644 server/public/admin/assets/attr-CfgtKm4z.js create mode 100644 server/public/admin/assets/attr-Cldn8Na8.js delete mode 100644 server/public/admin/assets/attr-CoQg_s4D.js create mode 100644 server/public/admin/assets/attr-CxnsylC4.js create mode 100644 server/public/admin/assets/attr-D2pJFuq9.js delete mode 100644 server/public/admin/assets/attr-DXOoD1cn.js delete mode 100644 server/public/admin/assets/attr-Dlget2qH.js create mode 100644 server/public/admin/assets/attr-JKTDt6-w.js create mode 100644 server/public/admin/assets/attr-KnmjGyxi.js delete mode 100644 server/public/admin/assets/attr-VYmMxH_S.js delete mode 100644 server/public/admin/assets/attr-YeGdL1Qg.js delete mode 100644 server/public/admin/assets/attr-setting-DCTBXd-z.js create mode 100644 server/public/admin/assets/attr-setting-DnHJKFRC.js rename server/public/admin/assets/{attr-setting.vue_vue_type_script_setup_true_lang-CQfoBfDB.js => attr-setting.vue_vue_type_script_setup_true_lang-BAjQj504.js} (88%) delete mode 100644 server/public/admin/assets/attr-yXSTgyi9.js rename server/public/admin/assets/{attr.vue_vue_type_script_setup_true_lang--WwiPUCL.js => attr.vue_vue_type_script_setup_true_lang-BX4gdclK.js} (70%) rename server/public/admin/assets/{attr.vue_vue_type_script_setup_true_lang-C69OXNgC.js => attr.vue_vue_type_script_setup_true_lang-C8lIxgDs.js} (92%) rename server/public/admin/assets/{attr.vue_vue_type_script_setup_true_lang-D3NJwrTZ.js => attr.vue_vue_type_script_setup_true_lang-CNu0a1pL.js} (91%) rename server/public/admin/assets/{attr.vue_vue_type_script_setup_true_lang-B4PfotVc.js => attr.vue_vue_type_script_setup_true_lang-CdNAifO0.js} (70%) rename server/public/admin/assets/{attr.vue_vue_type_script_setup_true_lang-BJHLs4e8.js => attr.vue_vue_type_script_setup_true_lang-Cxhd7Qdg.js} (70%) rename server/public/admin/assets/{attr.vue_vue_type_script_setup_true_lang-BIW0PBf5.js => attr.vue_vue_type_script_setup_true_lang-DOQJNCXj.js} (93%) rename server/public/admin/assets/{attr.vue_vue_type_script_setup_true_lang-Nqd2pOnE.js => attr.vue_vue_type_script_setup_true_lang-bZoT5wvF.js} (92%) rename server/public/admin/assets/{attr.vue_vue_type_script_setup_true_lang-1GfqKaWR.js => attr.vue_vue_type_script_setup_true_lang-v5ByQeMO.js} (93%) rename server/public/admin/assets/{attr.vue_vue_type_script_setup_true_lang-Cml7PP_W.js => attr.vue_vue_type_script_setup_true_lang-vjIWb05X.js} (93%) rename server/public/admin/assets/{attr.vue_vue_type_script_setup_true_lang-DNjGYBTD.js => attr.vue_vue_type_script_setup_true_lang-xgAFCbr-.js} (93%) delete mode 100644 server/public/admin/assets/auth-CA7OBc_w.js create mode 100644 server/public/admin/assets/auth-t3iuOa7S.js rename server/public/admin/assets/{auth.vue_vue_type_script_setup_true_lang-QP2AsqB7.js => auth.vue_vue_type_script_setup_true_lang-CFc2eGLT.js} (89%) rename server/public/admin/assets/{balance_details-kERYaktZ.js => balance_details-DglD1vU-.js} (88%) rename server/public/admin/assets/{bind-work-wechat-JOaOTXpx.js => bind-work-wechat-B3DcayyB.js} (95%) rename server/public/admin/assets/{cache-Xfq4Nf8F.js => cache-B_GTuZfc.js} (88%) rename server/public/admin/assets/{change-password-DFqjJIc4.js => change-password-DY5ghkT3.js} (90%) rename server/public/admin/assets/{code-CvQajwUj.js => code-DnwqHRNE.js} (92%) delete mode 100644 server/public/admin/assets/code-preview-HDxcbQlu.js create mode 100644 server/public/admin/assets/code-preview-wV9EdZl1.js rename server/public/admin/assets/{code-preview.vue_vue_type_script_setup_true_lang-B0eymNEd.js => code-preview.vue_vue_type_script_setup_true_lang-C3NgTrFu.js} (91%) rename server/public/admin/assets/{commission-settlement-CBBw8xmu.js => commission-settlement-BzskJwPT.js} (99%) rename server/public/admin/assets/{config-D9GLkF44.js => config-DMoRRRXb.js} (92%) rename server/public/admin/assets/{consumer-B0X_xd7a.js => consumer-DIWqLsDh.js} (81%) create mode 100644 server/public/admin/assets/content-0aV5Nav7.js rename server/public/admin/assets/{content-BwrtrucD.js => content-1SM6TxNJ.js} (70%) create mode 100644 server/public/admin/assets/content-1WSnqhr6.js delete mode 100644 server/public/admin/assets/content-B3dYDSpA.js delete mode 100644 server/public/admin/assets/content-BJelGmyK.js delete mode 100644 server/public/admin/assets/content-Bc2co7U_.js delete mode 100644 server/public/admin/assets/content-BkfDelq5.js delete mode 100644 server/public/admin/assets/content-C4Lm1hWe.js rename server/public/admin/assets/{content-gLX1n3T8.js => content-CR-Jp8HE.js} (84%) rename server/public/admin/assets/{content-D4fhwymx.js => content-CeRcUUHv.js} (85%) rename server/public/admin/assets/{content-CkaTpHbB.js => content-D7TY9P5J.js} (86%) create mode 100644 server/public/admin/assets/content-DMdllCpr.js create mode 100644 server/public/admin/assets/content-DT49xOR8.js create mode 100644 server/public/admin/assets/content-DbfcA86i.js create mode 100644 server/public/admin/assets/content-Ds8nmnYY.js rename server/public/admin/assets/{content-B48usMjw.js => content-IYJe5Twe.js} (81%) delete mode 100644 server/public/admin/assets/content-KOpIk4Jt.js rename server/public/admin/assets/{content-DWdZLXDI.js => content-stjF46XH.js} (81%) rename server/public/admin/assets/{content-BCd-s9DE.js => content-udWiOD_Z.js} (72%) rename server/public/admin/assets/{content.vue_vue_type_script_setup_true_lang-B9d1ard7.js => content.vue_vue_type_script_setup_true_lang---C_n7J8.js} (81%) rename server/public/admin/assets/{content.vue_vue_type_script_setup_true_lang-gQu8pk_V.js => content.vue_vue_type_script_setup_true_lang-BUSWRMQc.js} (81%) rename server/public/admin/assets/{content.vue_vue_type_script_setup_true_lang-BTu_Wnxq.js => content.vue_vue_type_script_setup_true_lang-CXyDgMLw.js} (79%) rename server/public/admin/assets/{content.vue_vue_type_script_setup_true_lang-DPbaLFgv.js => content.vue_vue_type_script_setup_true_lang-IPr_LqG1.js} (88%) rename server/public/admin/assets/{content.vue_vue_type_script_setup_true_lang-CJYh_L0u.js => content.vue_vue_type_script_setup_true_lang-YorKB9i2.js} (85%) create mode 100644 server/public/admin/assets/cost-edit-BIpViu2K.js delete mode 100644 server/public/admin/assets/cost-edit-CymyMSUk.js rename server/public/admin/assets/{cost-edit.vue_vue_type_script_setup_true_lang-DRg-B2Eh.js => cost-edit.vue_vue_type_script_setup_true_lang-CwdTQaKE.js} (91%) delete mode 100644 server/public/admin/assets/data-table-CLbeeUey.js create mode 100644 server/public/admin/assets/data-table-DALudDnr.js rename server/public/admin/assets/{data-table.vue_vue_type_script_setup_true_lang-DjVBoMxj.js => data-table.vue_vue_type_script_setup_true_lang-B-vLVq2k.js} (89%) rename server/public/admin/assets/{dayjs-Cbxn44tS.js => dayjs-CVa8MSSA.js} (99%) rename server/public/admin/assets/{decoration-CUkQOQLk.js => decoration-B9DxqqTF.js} (87%) rename server/public/admin/assets/{decoration-img-Aio_OKJA.js => decoration-img-frlDOjkz.js} (84%) rename server/public/admin/assets/{default_reply-B2rADVla.js => default_reply-_zbCb0Zi.js} (84%) rename server/public/admin/assets/{department-MTfWSQxp.js => department-w0Ka42uy.js} (86%) rename server/public/admin/assets/{dept-tongji-B8hF-i1M.js => dept-tongji-Cq0YfkM7.js} (95%) rename server/public/admin/assets/{detail-6JMrZE4O.js => detail-BFXeegI9.js} (95%) rename server/public/admin/assets/{detail-BKhCLDx3.js => detail-CuJF77ro.js} (89%) rename server/public/admin/assets/{dict-CQ_C2o0J.js => dict-DpVHigns.js} (92%) rename server/public/admin/assets/{doctor-DQJF3mgr.js => doctor-DBWxvtwh.js} (95%) delete mode 100644 server/public/admin/assets/edit-10JdlICm.js create mode 100644 server/public/admin/assets/edit-5wXc4IMn.js delete mode 100644 server/public/admin/assets/edit-7ccPGLmC.js delete mode 100644 server/public/admin/assets/edit-AlvSrjUx.js delete mode 100644 server/public/admin/assets/edit-B0elk-oH.js create mode 100644 server/public/admin/assets/edit-B2uGa413.js create mode 100644 server/public/admin/assets/edit-BIImMoQ7.js create mode 100644 server/public/admin/assets/edit-BWFwUbn-.js rename server/public/admin/assets/{edit-B_cUNqr2.js => edit-C7iuIzTe.js} (86%) create mode 100644 server/public/admin/assets/edit-C8RkKFVy.js delete mode 100644 server/public/admin/assets/edit-CMfY_XKE.js delete mode 100644 server/public/admin/assets/edit-CV6K_wNc.js rename server/public/admin/assets/{edit-CKQojFsZ.js => edit-CaMk5-3P.js} (93%) delete mode 100644 server/public/admin/assets/edit-CoJXh142.js rename server/public/admin/assets/{edit-Comk-Pnh.js => edit-CsDhlZd3.js} (91%) create mode 100644 server/public/admin/assets/edit-D22Vv0Gb.js rename server/public/admin/assets/{edit-HtfhyZMW.js => edit-D2mzBR_d.js} (93%) rename server/public/admin/assets/{edit-CLOdM6BH.js => edit-D6SStLu0.js} (96%) rename server/public/admin/assets/{edit-DL9KefVP.js => edit-DHnt66yB.js} (95%) rename server/public/admin/assets/{edit-CsedpvE-.js => edit-DIExe5AF.js} (93%) create mode 100644 server/public/admin/assets/edit-D_Xe2uXf.js create mode 100644 server/public/admin/assets/edit-Ds4YIn84.js create mode 100644 server/public/admin/assets/edit-Dwv0yWaU.js delete mode 100644 server/public/admin/assets/edit-Ii4YpLBA.js delete mode 100644 server/public/admin/assets/edit-L-DOi0qo.js create mode 100644 server/public/admin/assets/edit-LYFv9iuX.js delete mode 100644 server/public/admin/assets/edit-Ucf6ftg8.js delete mode 100644 server/public/admin/assets/edit-cDoLjav3.js rename server/public/admin/assets/{edit-Dekh9ZqA.js => edit-oco9EAK-.js} (94%) rename server/public/admin/assets/{edit-CRHtJvLC.js => edit-ryC0d3CG.js} (93%) create mode 100644 server/public/admin/assets/edit-xU-e2mJ8.js rename server/public/admin/assets/{edit.vue_vue_type_script_setup_true_lang-B1no4mCH.js => edit.vue_vue_type_script_setup_true_lang-4nnxoZL9.js} (95%) rename server/public/admin/assets/{edit.vue_vue_type_script_setup_true_lang-BZzHjun0.js => edit.vue_vue_type_script_setup_true_lang-BKEeE43w.js} (94%) rename server/public/admin/assets/{edit.vue_vue_type_script_setup_true_lang-BiKzVuYG.js => edit.vue_vue_type_script_setup_true_lang-Bb5pjrSX.js} (95%) rename server/public/admin/assets/{edit.vue_vue_type_script_setup_true_lang-CakiUTWY.js => edit.vue_vue_type_script_setup_true_lang-CO9lbmZ7.js} (95%) rename server/public/admin/assets/{edit.vue_vue_type_script_setup_true_lang-tZxQS8dk.js => edit.vue_vue_type_script_setup_true_lang-CSDkyc0m.js} (92%) rename server/public/admin/assets/{edit.vue_vue_type_script_setup_true_lang-BeimND-k.js => edit.vue_vue_type_script_setup_true_lang-CtE21KfR.js} (94%) rename server/public/admin/assets/{edit.vue_vue_type_script_setup_true_lang-DGmA-4eu.js => edit.vue_vue_type_script_setup_true_lang-DOru9tXW.js} (96%) rename server/public/admin/assets/{edit.vue_vue_type_script_setup_true_lang-C1SOMzbY.js => edit.vue_vue_type_script_setup_true_lang-Om5TpmvI.js} (94%) rename server/public/admin/assets/{edit.vue_vue_type_script_setup_true_lang-Cv8AoU01.js => edit.vue_vue_type_script_setup_true_lang-UNWPRd1h.js} (91%) rename server/public/admin/assets/{edit.vue_vue_type_script_setup_true_lang-Fs0sc62L.js => edit.vue_vue_type_script_setup_true_lang-jdfSFJa2.js} (96%) rename server/public/admin/assets/{edit.vue_vue_type_script_setup_true_name_articleColumnEdit_lang-BsgZdXbb.js => edit.vue_vue_type_script_setup_true_name_articleColumnEdit_lang-D7JHFMBF.js} (93%) rename server/public/admin/assets/{environment-Bi7eexR6.js => environment-BkriATHW.js} (92%) rename server/public/admin/assets/{error-D-uPyFBJ.js => error-abZoCXdu.js} (85%) rename server/public/admin/assets/{fans-Bb64fXyq.js => fans-FJRWzUKP.js} (89%) rename server/public/admin/assets/{file-D75Ivf9i.js => file-B8vAmxT-.js} (83%) rename server/public/admin/assets/{file-DWoFbTjb.js => file-BXk5F0Ys.js} (95%) rename server/public/admin/assets/{filing-Blolcld9.js => filing-MDR1oTS9.js} (88%) rename server/public/admin/assets/{finance-CQGdd_Go.js => finance-glk8Sko5.js} (95%) delete mode 100644 server/public/admin/assets/first_visit-DAxtuCK2.js create mode 100644 server/public/admin/assets/first_visit-DEhGYh-J.js rename server/public/admin/assets/{follow_reply-BrXQTvVq.js => follow_reply-t-8zOU3R.js} (86%) rename server/public/admin/assets/{footer.vue_vue_type_script_setup_true_lang-CkxOqaNG.js => footer.vue_vue_type_script_setup_true_lang-CzPfxxzB.js} (63%) create mode 100644 server/public/admin/assets/getExposeType-Bg3eQ4S7.js delete mode 100644 server/public/admin/assets/getExposeType-DJc9Mp7l.js rename server/public/admin/assets/{guahao-fsKR9vJW.js => guahao-Dpc6vnPB.js} (97%) rename server/public/admin/assets/{h5-BjijOinF.js => h5-4MleGpK8.js} (98%) rename server/public/admin/assets/{h5-CxPR9gaD.js => h5-r09kyT_D.js} (92%) rename server/public/admin/assets/{icon-1uy4iE8p.js => icon-CXilXDyn.js} (91%) rename server/public/admin/assets/{im-business-message-parse-CVnz1EnV.js => im-business-message-parse-oYIP1khU.js} (97%) create mode 100644 server/public/admin/assets/index-ACf7LRwH.js rename server/public/admin/assets/{index-C2RO7ZXL.js => index-B4tn80ww.js} (90%) rename server/public/admin/assets/{index-BSnMSmpl.js => index-B6fIMQze.js} (85%) rename server/public/admin/assets/{index-xpuJLSls.js => index-B6rU-plF.js} (98%) create mode 100644 server/public/admin/assets/index-BC7h-DRM.js rename server/public/admin/assets/{index-BrixtWVC.js => index-BGo6koia.js} (84%) rename server/public/admin/assets/{index-BFiquBi7.js => index-BOPo4KMm.js} (70%) rename server/public/admin/assets/{index-jRkFOHfc.js => index-BPKduYMm.js} (96%) create mode 100644 server/public/admin/assets/index-BV6L59dz.css create mode 100644 server/public/admin/assets/index-BWlhxa68.js rename server/public/admin/assets/{index-BvP6jKID.js => index-Bh7tEfy4.js} (98%) rename server/public/admin/assets/{index-CKIW3ABd.js => index-BhGuzk93.js} (94%) rename server/public/admin/assets/{index-CZRr_648.js => index-Bo2pHBTY.js} (94%) rename server/public/admin/assets/{index-BnfeBpgt.js => index-BqRKl0wi.js} (96%) rename server/public/admin/assets/{index-B8evJDsl.js => index-BqyBu5g8.js} (98%) delete mode 100644 server/public/admin/assets/index-Btf4HA-t.css rename server/public/admin/assets/{index-Bmx1NuY2.js => index-Bv3TzZIB.js} (93%) rename server/public/admin/assets/{index--JXB9DHQ.js => index-C0ZGCLsb.js} (62%) rename server/public/admin/assets/{index-DrnibAL4.js => index-C1IpcoQZ.js} (52%) rename server/public/admin/assets/{index-77Euo7Ci.js => index-C3ggXFi2.js} (94%) rename server/public/admin/assets/{index-D0Qlwy5A.js => index-C7YoZCtn.js} (82%) rename server/public/admin/assets/{index-C7291G3H.js => index-C87K-Z1w.js} (91%) rename server/public/admin/assets/{index-BbIv2PHW.js => index-C8liezF7.js} (97%) delete mode 100644 server/public/admin/assets/index-CCW2jHkL.js rename server/public/admin/assets/{index-BkwDFgzY.js => index-CHPIrM8-.js} (91%) delete mode 100644 server/public/admin/assets/index-CKylQnvr.js rename server/public/admin/assets/{index-CgG9jXrQ.js => index-C_KuJ6qz.js} (97%) rename server/public/admin/assets/{index-BMtA1ooo.js => index-CbM5wK1d.js} (98%) rename server/public/admin/assets/{index-pm0C3F0W.js => index-ChUPMvdk.js} (86%) rename server/public/admin/assets/{index-dbNEla3L.js => index-CoqerWpH.js} (86%) rename server/public/admin/assets/{index-C_hJGcdG.js => index-Cov-EzHW.js} (90%) rename server/public/admin/assets/{index-B3NeDCR-.js => index-CtMJX_6d.js} (94%) rename server/public/admin/assets/{index-a5BG1BWa.js => index-CxlfG2e6.js} (87%) rename server/public/admin/assets/{index-DgdkrwCe.js => index-D0wliDS3.js} (84%) rename server/public/admin/assets/{index-Be51Lchh.js => index-D5ZASNGg.js} (88%) rename server/public/admin/assets/{index-BN2M6lGD.js => index-D8TXInkJ.js} (86%) delete mode 100644 server/public/admin/assets/index-D8Ue9ypt.css rename server/public/admin/assets/{index-D1mL0Y2z.js => index-DCfUc3Nn.js} (94%) rename server/public/admin/assets/{index-CWtmv6c_.js => index-DDRApsfH.js} (97%) rename server/public/admin/assets/{index-CsxFhp2j.js => index-DLt1jKBt.js} (96%) rename server/public/admin/assets/{index-BuHCHmWh.js => index-DNtgDv3T.js} (69%) rename server/public/admin/assets/{index-Drab_Br1.js => index-DSN2YnxK.js} (98%) rename server/public/admin/assets/{index-CtSbqfbA.js => index-DVrcLx5z.js} (94%) rename server/public/admin/assets/{index-DH7raP3N.js => index-Dbu2gKMW.js} (72%) rename server/public/admin/assets/{index-B7n-FpxB.js => index-DdGEztH-.js} (98%) rename server/public/admin/assets/{index-jinPz6CE.js => index-DfI8gz4Z.js} (86%) create mode 100644 server/public/admin/assets/index-DiLrIQPJ.css rename server/public/admin/assets/{index-DFtvrIDK.js => index-DjU6IwMw.js} (90%) rename server/public/admin/assets/{index-l5Cq2faW.js => index-DkQkmNck.js} (97%) rename server/public/admin/assets/{index-BSwVDYZd.js => index-Du0eYB29.js} (79%) rename server/public/admin/assets/{index-BS82gb6r.js => index-Fsb-fRH9.js} (99%) rename server/public/admin/assets/{index-CJn0zdCA.js => index-IBEgpZdk.js} (93%) rename server/public/admin/assets/{index-vXlyiLlo.js => index-J5BM-zMe.js} (85%) rename server/public/admin/assets/{index-BtfryG-T.js => index-LrvZgLyd.js} (84%) rename server/public/admin/assets/{index-DFvgqKH8.js => index-PArzJ7v1.js} (96%) rename server/public/admin/assets/{index-BcTeGwNc.js => index-R-F1TfEb.js} (90%) rename server/public/admin/assets/{index-DCHFJLxs.js => index-RDhbExbW.js} (92%) rename server/public/admin/assets/{index-DctcvcVd.js => index-RalWxPEr.js} (71%) rename server/public/admin/assets/{index-Bj958_hn.js => index-SJIlBBgP.js} (89%) rename server/public/admin/assets/{index-B8LZ-HCp.js => index-TisaJaAB.js} (96%) rename server/public/admin/assets/{index-ayQNEW9Q.js => index-XKdYfxP_.js} (91%) rename server/public/admin/assets/{index-CmOl8Ts_.js => index-YwkBljgR.js} (84%) delete mode 100644 server/public/admin/assets/index-a_ZxLOOo.js rename server/public/admin/assets/{index-CtgrQFM4.js => index-js2iKhLU.js} (91%) rename server/public/admin/assets/{index-Df0rI9Fp.js => index-yChcjY1t.js} (99%) rename server/public/admin/assets/{index.vue_vue_type_script_setup_true_lang-C9hPqHM6.js => index.vue_vue_type_script_setup_true_lang--kuEf_zw.js} (93%) rename server/public/admin/assets/{index.vue_vue_type_script_setup_true_lang-D0KAQf1t.js => index.vue_vue_type_script_setup_true_lang-BOJpu9c9.js} (92%) rename server/public/admin/assets/{index.vue_vue_type_script_setup_true_lang-HGooEmU6.js => index.vue_vue_type_script_setup_true_lang-CI67ka5y.js} (96%) rename server/public/admin/assets/{index.vue_vue_type_script_setup_true_lang-Cxx3Fcm2.js => index.vue_vue_type_script_setup_true_lang-D3ZtXZaD.js} (97%) rename server/public/admin/assets/{index.vue_vue_type_script_setup_true_lang-Cq5qrGbU.js => index.vue_vue_type_script_setup_true_lang-D6YizxbY.js} (92%) rename server/public/admin/assets/{index.vue_vue_type_style_index_0_lang-CdHPtIC-.js => index.vue_vue_type_style_index_0_lang-6ZIeNcsc.js} (86%) rename server/public/admin/assets/{index_h5-DK-hO-pX.js => index_h5-Bx3P7RKG.js} (83%) rename server/public/admin/assets/{information-BtY6-e1D.js => information-D0_fTpck.js} (91%) rename server/public/admin/assets/{journal-DPOjySw-.js => journal-CTnbrhvB.js} (89%) rename server/public/admin/assets/{keyword_reply-BzMCBMvw.js => keyword_reply-Xui2QW00.js} (87%) rename server/public/admin/assets/{link-Db0SWZfr.js => link-B-QMcsoR.js} (60%) rename server/public/admin/assets/{list-EyT7ualt.js => list-BW93YBY4.js} (95%) rename server/public/admin/assets/{list-BPqBZ8SM.js => list-uXqDbAgB.js} (81%) rename server/public/admin/assets/{list_h5-yqC6XpaH.js => list_h5-CxNMcZ8o.js} (84%) rename server/public/admin/assets/{login-Bvk_3iIJ.js => login-BV70sH7V.js} (95%) rename server/public/admin/assets/{login_register-CyHVWiqe.js => login_register-DOddbm71.js} (95%) rename server/public/admin/assets/{medicine-DIEwHOeB.js => medicine-D8ZQ5ak7.js} (98%) rename server/public/admin/assets/{medicine-nsHwJViA.js => medicine-Dv65pEge.js} (81%) rename server/public/admin/assets/{menu-BMLd7Gi6.js => menu-4hqI2LGO.js} (66%) rename server/public/admin/assets/{menu-DlNXlk8k.js => menu-BVjq04Up.js} (86%) rename server/public/admin/assets/{menu-C7DGNCxH.js => menu-DNhfh4z9.js} (83%) delete mode 100644 server/public/admin/assets/menu-set-DmdKRr0A.js create mode 100644 server/public/admin/assets/menu-set-DzyLtrgj.js rename server/public/admin/assets/{menu-set.vue_vue_type_script_setup_true_lang-Go2YUSJ3.js => menu-set.vue_vue_type_script_setup_true_lang-CxXbGeBD.js} (92%) rename server/public/admin/assets/{message-CAHFWDnF.js => message-rt2JV_ag.js} (87%) delete mode 100644 server/public/admin/assets/mobile-style-C8MZrD7i.js create mode 100644 server/public/admin/assets/mobile-style-D7j4dFs8.js rename server/public/admin/assets/{mobile-style.vue_vue_type_script_setup_true_lang-DiZ4FSjA.js => mobile-style.vue_vue_type_script_setup_true_lang-xE8CM6Sx.js} (96%) rename server/public/admin/assets/{mubiao-Do05CGtS.js => mubiao-Dk-zZZaM.js} (96%) rename server/public/admin/assets/{mubiao-dept-card-Cvu1Or-m.js => mubiao-dept-card-88Hsg1TX.js} (97%) rename server/public/admin/assets/{mubiao-dept-node-U3l4QS_J.js => mubiao-dept-node-BXj84IKs.js} (95%) rename server/public/admin/assets/{oa-attr-CEGE3U3o.js => oa-attr-_CV9AFPO.js} (82%) create mode 100644 server/public/admin/assets/oa-menu-form-Dg8v7Jd9.js delete mode 100644 server/public/admin/assets/oa-menu-form-eDjdjDB5.js create mode 100644 server/public/admin/assets/oa-menu-form-edit-CFPHeHd-.js delete mode 100644 server/public/admin/assets/oa-menu-form-edit-W2DClkmp.js rename server/public/admin/assets/{oa-menu-form-edit.vue_vue_type_script_setup_true_lang-C2eiXbVk.js => oa-menu-form-edit.vue_vue_type_script_setup_true_lang-CVk0vSPV.js} (85%) rename server/public/admin/assets/{oa-menu-form.vue_vue_type_script_setup_true_lang-BVVPYTh8.js => oa-menu-form.vue_vue_type_script_setup_true_lang-D2YNfIlQ.js} (95%) rename server/public/admin/assets/{oa-phone-CRp_i1VK.js => oa-phone-CcYCrwZ4.js} (86%) rename server/public/admin/assets/{open_setting-DLxiGNiR.js => open_setting-DAJO5M1O.js} (93%) rename server/public/admin/assets/{order-Dz1NL82W.js => order-CKwVRWzr.js} (96%) rename server/public/admin/assets/{order_list-lLpjaY3B.js => order_list-CpGE2546.js} (97%) rename server/public/admin/assets/{order_list_h5-Daz8CjH0.js => order_list_h5-BTreEqnm.js} (88%) rename server/public/admin/assets/{overflow-ErQsBwLa.js => overflow-Hm0n79oF.js} (74%) rename server/public/admin/assets/{paiban-woJxc_2K.js => paiban-CtrBW-2Q.js} (94%) rename server/public/admin/assets/{patient-DiY8uj2P.js => patient-SnE6JXh9.js} (88%) rename server/public/admin/assets/{patient-call-DTS3e3dS.js => patient-call-DSwOmO2t.js} (60%) rename server/public/admin/assets/{pay-CVRnPrCn.js => pay-MmH2aQ_e.js} (85%) rename server/public/admin/assets/{pc-kV-GzTmX.js => pc-D4RwpD7Y.js} (90%) delete mode 100644 server/public/admin/assets/pc_details-B4ZGhYHm.js create mode 100644 server/public/admin/assets/pc_details-C98ia8eg.js rename server/public/admin/assets/{perm-tSma3sWL.js => perm-BdlAVcmi.js} (67%) rename server/public/admin/assets/{picker-RZLRR_G5.js => picker-B4EVDozl.js} (97%) rename server/public/admin/assets/{picker-tazliPuC.js => picker-C_3iViNJ.js} (94%) rename server/public/admin/assets/{picker.vue_vue_type_script_setup_true_lang-B7Bv38ga.js => picker.vue_vue_type_script_setup_true_lang-DEsPYilO.js} (95%) rename server/public/admin/assets/{popover_input-DAJtR42p.js => popover_input-PNE9JPug.js} (89%) rename server/public/admin/assets/{post-JpabMAL_.js => post-BvNwM47F.js} (86%) rename server/public/admin/assets/{prescription-drawer-BD0Nl5dL.js => prescription-drawer-hoB6wWHO.js} (97%) delete mode 100644 server/public/admin/assets/prescription-order-utils-B0fYlULc.js create mode 100644 server/public/admin/assets/prescription-order-utils-CpKeuzsa.js rename server/public/admin/assets/{preview-BHKlkFM2.js => preview-Cjkqfxv9.js} (58%) rename server/public/admin/assets/{preview-pc-lI4_qErz.js => preview-pc-lkXi8Tir.js} (53%) rename server/public/admin/assets/{progress-PPaX2s9P.js => progress--D4kLOJS.js} (98%) rename server/public/admin/assets/{protocol-Dj8DsORc.js => protocol-tnzHuF6S.js} (78%) rename server/public/admin/assets/{qywx-DNLk8l-B.js => qywx-NGCLmAZN.js} (98%) rename server/public/admin/assets/{readonly-Bzhw48AS.js => readonly-B6IlEEYw.js} (63%) rename server/public/admin/assets/{recharge_record-CWqElylR.js => recharge_record-BtmSX-pl.js} (88%) create mode 100644 server/public/admin/assets/refund-log-CP-nReqp.js delete mode 100644 server/public/admin/assets/refund-log-DsMdsR52.js rename server/public/admin/assets/{refund-log.vue_vue_type_script_setup_true_lang-Dp9fL011.js => refund-log.vue_vue_type_script_setup_true_lang-S6pjjj6S.js} (92%) rename server/public/admin/assets/{refund_record-BYJT3v77.js => refund_record-nbV4Sf3R.js} (92%) create mode 100644 server/public/admin/assets/relations-add-BHdwKSZz.js delete mode 100644 server/public/admin/assets/relations-add-m0SAciy8.js rename server/public/admin/assets/{relations-add.vue_vue_type_script_setup_true_lang-B0R4rWqT.js => relations-add.vue_vue_type_script_setup_true_lang-DSvHm9Wx.js} (93%) rename server/public/admin/assets/{rich_text-eShKmFm2.js => rich_text-BUbXcm8r.js} (59%) rename server/public/admin/assets/{role-BK9-X1JV.js => role-CHpVoaGw.js} (83%) rename server/public/admin/assets/{roster-BfTD7pra.js => roster-D3607D4X.js} (98%) rename server/public/admin/assets/{rtc-detect-DyJ4vVvn.js => rtc-detect-DwzBINgK.js} (99%) rename server/public/admin/assets/{self_input_stats-DpkdEV8c.js => self_input_stats-BsN34aOT.js} (91%) rename server/public/admin/assets/{setting-d4IYSzeT.js => setting-DFXrHPI9.js} (90%) rename server/public/admin/assets/{setup-BmxJqJoJ.js => setup-B-2KE9ct.js} (67%) rename server/public/admin/assets/{statistics-LrAz8bLV.js => statistics-BzjrRQ3t.js} (88%) rename server/public/admin/assets/{stats-Di_MlUCe.js => stats-CPQMaHKU.js} (97%) rename server/public/admin/assets/{style-C3CXqKKB.js => style-B2GTYpFV.js} (76%) rename server/public/admin/assets/{tabbar-DMb_epzy.js => tabbar-PrdH4_Ym.js} (66%) rename server/public/admin/assets/{tcm--WHZCSMq.js => tcm-Bv_Ly0A0.js} (71%) rename server/public/admin/assets/{theme-picker-BsOiHacI.js => theme-picker-32bCJ-fJ.js} (86%) rename server/public/admin/assets/{tim-profanity-filter-plugin-B2c46mgl.js => tim-profanity-filter-plugin-pxG5lfA2.js} (99%) rename server/public/admin/assets/{tim-upload-plugin-DhGO84pK.js => tim-upload-plugin-Doi1tBqv.js} (99%) rename server/public/admin/assets/{tongji-BFhvh-uV.js => tongji-Bc8sXYbV.js} (97%) rename server/public/admin/assets/{upload-3IoSn2Ek.js => upload-BzGCpHnh.js} (90%) rename server/public/admin/assets/{useDictOptions-pz0NtZPZ.js => useDictOptions-DL_MQ7g9.js} (69%) rename server/public/admin/assets/{useListTimeFilter-40qnhP5x.js => useListTimeFilter-ZDlGSGqM.js} (96%) rename server/public/admin/assets/{useLockFn-DMpiF_Hj.js => useLockFn-DZ9wDgti.js} (71%) rename server/public/admin/assets/{useMediaSourceOptions-CyWemm8p.js => useMediaSourceOptions-DAfnJEWc.js} (81%) rename server/public/admin/assets/{useMenuOa-CjKLE6t4.js => useMenuOa-qJ7Af1rq.js} (89%) rename server/public/admin/assets/{usePaging-DOuAwzL9.js => usePaging-BeGcb2kN.js} (91%) rename server/public/admin/assets/{user-DRhBHUvG.js => user-CRZD_3lR.js} (82%) rename server/public/admin/assets/{weapp-B8wW_O4N.js => weapp-C6mHmUez.js} (68%) rename server/public/admin/assets/{weapp-awldkq-G.js => weapp-Cv-aJVvY.js} (93%) rename server/public/admin/assets/{website-CHqXkHCa.js => website-DAaBhFEN.js} (91%) rename server/public/admin/assets/{wx_oa-D94L7ur0.js => wx_oa-BcEVGRPA.js} (93%) rename server/public/admin/assets/{yeji-BXeKeLKG.js => yeji-BgjGKghf.js} (99%) delete mode 100644 server/public/admin/assets/yeji-edit-BVSNnhpQ.js create mode 100644 server/public/admin/assets/yeji-edit-CVUG3MJC.js rename server/public/admin/assets/{yeji-edit.vue_vue_type_script_setup_true_lang-DBwQyZjc.js => yeji-edit.vue_vue_type_script_setup_true_lang-Bs3DWBA3.js} (96%) create mode 100644 server/sql/1.9.20260831/add_prescription_order_unlink_pay_order_menu.sql create mode 100644 server/sql/1.9.20260831/add_wecom_promotion_automation.sql create mode 100644 server/tests/FirstVisitConversionDeletedFansPermissionTest.php create mode 100644 server/tests/PrescriptionOrderUnlinkPayOrderTest.php create mode 100644 server/tests/QywxPromotionAutomationConfigTest.php create mode 100644 server/tests/QywxPromotionAutomationServiceTest.php create mode 100644 server/tests/QywxPromotionCodeCipherTest.php create mode 100644 server/tests/QywxPromotionContactApiServiceTest.php create mode 100644 server/tests/QywxPromotionCreateTagTest.php create mode 100644 server/tests/QywxPromotionMediaServiceTest.php create mode 100644 server/tests/WecomPromotionAutomationUiTest.mjs create mode 100644 server/tests/WecomPromotionCreateTagControllerTest.php diff --git a/admin/src/api/first_visit.ts b/admin/src/api/first_visit.ts index adb5f43f6..68452db28 100644 --- a/admin/src/api/first_visit.ts +++ b/admin/src/api/first_visit.ts @@ -168,11 +168,12 @@ export interface FirstVisitConversionFanDetailRow { wecom_userid: string wecom_staff_name: string add_time: string | null - is_deleted: boolean - delete_time: string | null + is_deleted?: boolean + delete_time?: string | null } -export interface FirstVisitConversionFansDetailResult { +export interface FirstVisitConversionFansDetailResult { + can_view_deleted_fans?: boolean lists?: FirstVisitConversionFanDetailRow[] rows?: FirstVisitConversionFanDetailRow[] total?: number @@ -237,6 +238,36 @@ export function wecomPromotionOverview() { export function wecomPromotionSavePool(params: Record) { return request.post({ url: '/firstvisit.wecomPromotion/savePool', params, timeout: 120000 }) } + +export interface WecomPromotionTagGroup { + group_id: string + group_name: string + tag: Array<{ id: string; name: string }> +} + +export function wecomPromotionTagOptions() { + return request.get<{ tag_groups: WecomPromotionTagGroup[] }>({ + url: '/firstvisit.wecomPromotion/tagOptions' + }) +} + +export function wecomPromotionCreateTag(params: { name: string }) { + return request.post<{ tag: { id: string; name: string }; group_id: string; group_name: string; reused: boolean }>({ + url: '/firstvisit.wecomPromotion/createTag', params, timeout: 30000 + }, { ignoreCancelToken: true }) +} + +export function wecomPromotionUploadWelcomeMedia(file: File, type: 'image' | 'video' | 'file') { + const data = new FormData() + data.append('file', file) + data.append('type', type) + return request.post<{ asset_id: string; name: string; type: string }>({ + url: '/firstvisit.wecomPromotion/uploadWelcomeMedia', + data, + headers: { 'Content-Type': 'multipart/form-data' }, + timeout: 120000 + }, { ignoreCancelToken: true }) +} export function wecomPromotionSaveWidget(params: Record) { return request.post({ url: '/firstvisit.wecomPromotion/saveWidget', params }) diff --git a/admin/src/api/tcm.ts b/admin/src/api/tcm.ts index fb32bc976..4b5b9d99b 100644 --- a/admin/src/api/tcm.ts +++ b/admin/src/api/tcm.ts @@ -578,6 +578,11 @@ export function prescriptionOrderAddLog(params: { return request.post({ url: '/tcm.prescriptionOrder/addLog', params }) } +/** 移除单笔收款关联,总金额不变,同步更新已付金额和需代收 */ +export function prescriptionOrderUnlinkPayOrder(params: { id: number; pay_order_id: number }) { + return request.post({ url: '/tcm.prescriptionOrder/unlinkPayOrder', params }) +} + /** 修改订单金额 */ export function prescriptionOrderUpdateAmount(params: { id: number; amount: number }) { return request.post({ url: '/tcm.prescriptionOrder/updateAmount', params }) diff --git a/admin/src/views/consumer/prescription/components/PrescriptionOrderDetailDrawer.vue b/admin/src/views/consumer/prescription/components/PrescriptionOrderDetailDrawer.vue index 35c628472..d6a5e0b5a 100644 --- a/admin/src/views/consumer/prescription/components/PrescriptionOrderDetailDrawer.vue +++ b/admin/src/views/consumer/prescription/components/PrescriptionOrderDetailDrawer.vue @@ -541,6 +541,19 @@ {{ formatOrderTime(row.create_time) }} + + + @@ -1014,6 +1027,7 @@ import { prescriptionOrderLogisticsTrace, prescriptionOrderLogisticsJdUpdate, prescriptionOrderPaidPayOrders, + prescriptionOrderUnlinkPayOrder, prescriptionOrderPatchPrescriptionUsage } from '@/api/tcm' import { getDictData } from '@/api/app' @@ -1107,6 +1121,38 @@ const detailLoading = ref(false) const detailData = ref | null>(null) const detailLogs = ref([]) const detailUnlinkedPayOrders = ref([]) +const unlinkPayOrderId = ref(null) +const canUnlinkPayOrder = computed(() => + !props.readonly && canUpdateAmount(detailData.value) && hasPerm('tcm.prescriptionOrder/unlinkPayOrder') +) + +async function confirmUnlinkPayOrder(row: { id: number; order_no?: string; amount: number | string; status: number | string }) { + const orderId = Number(detailData.value?.id) + const payOrderId = Number(row.id) + if (!canUnlinkPayOrder.value || !orderId || !payOrderId || unlinkPayOrderId.value !== null) return + if (![2, 5].includes(Number(row.status))) return + + unlinkPayOrderId.value = payOrderId + try { + await feedback.confirm( + `确定移除收款记录「${row.order_no || '#' + payOrderId}」(¥${formatMoney(row.amount)})?` + + '仅解除关联,原收款记录保留;订单总金额不变,已付金额与需代收金额按剩余关联收款重新计算。' + ) + if (!detailVisible.value || Number(detailData.value?.id) !== orderId) return + const res: any = await prescriptionOrderUnlinkPayOrder({ id: orderId, pay_order_id: payOrderId }) + const updated = res?.data ?? res + if (Number(detailData.value?.id) === orderId && Number(updated?.id) === orderId) { + Object.assign(detailData.value!, updated) + } + feedback.msgSuccess('收款关联已移除,金额已同步更新') + emit('detail-changed') + await refreshIfCurrent(orderId) + } catch { + /* 取消不提交;接口错误由拦截器提示,保留当前收款记录 */ + } finally { + unlinkPayOrderId.value = null + } +} const detailPrescription = computed(() => { const p = detailData.value?.prescription diff --git a/admin/src/views/consumer/prescription/components/prescription-order-utils.ts b/admin/src/views/consumer/prescription/components/prescription-order-utils.ts index 7b9342690..e2ca64c0c 100644 --- a/admin/src/views/consumer/prescription/components/prescription-order-utils.ts +++ b/admin/src/views/consumer/prescription/components/prescription-order-utils.ts @@ -168,6 +168,7 @@ export function logActionText(act: string) { ship: '确认发货', withdraw: '撤销', link_pay_order: '关联支付单', + unlink_pay_order: '移除收款关联', completion_request: '完单申请', auto_complete: '自动完成', revoke_rx_audit: '撤回处方审核', diff --git a/admin/src/views/first_visit/conversion/index.vue b/admin/src/views/first_visit/conversion/index.vue index 33477569b..f21aec6e6 100644 --- a/admin/src/views/first_visit/conversion/index.vue +++ b/admin/src/views/first_visit/conversion/index.vue @@ -108,7 +108,7 @@ (-{{ formatNumber(dashboard.summary.deleted_fans_count) }}) - {{ metric.hint }} + {{ metric.hint }} @@ -154,7 +154,7 @@

明细数据列表

-

展开部门可查看人员明细;加粉=总进线=区间新增加粉(按员工+客户去重,包含区间内添加后已删客户,剔除继承客户、扫一扫/搜手机号/名片分享添加及区间前已加过的重加),(-N)表示加粉总数中已删除;挂号=已支付且实收低于 10 元的订单,预约=有效预约记录;开口率=开口/加粉,挂号率=挂号/加粉,面诊率=面诊/挂号(看挂号后流失),预约率=面诊/预约(看预约后未面诊),面诊接诊率=接诊诊单/面诊,接诊率=接诊诊单/总进线

+

展开部门可查看人员明细;加粉=总进线=区间新增加粉(按员工+客户去重,包含区间内添加后已删客户,剔除继承客户、扫一扫/搜手机号/名片分享添加及区间前已加过的重加);挂号=已支付且实收低于 10 元的订单,预约=有效预约记录;开口率=开口/加粉,挂号率=挂号/加粉,面诊率=面诊/挂号(看挂号后流失),预约率=面诊/预约(看预约后未面诊),面诊接诊率=接诊诊单/面诊,接诊率=接诊诊单/总进线

{{ dashboard.rows.length }} 个顶层节点
@@ -339,7 +339,7 @@ - +