オンライン診療アプリにおける患者選択機能と支払い画面の実装

1. 家族アーカイブ画面における患者選択モードの実装

既存の家族アーカイブ画面を流用し、ルーティングパラメータに応じて「患者選択」モードへ切り替える機能を実装する。

実装のポイント:

  • URLクエリパラメータによるモード判定とUIの出し分け
  • 患者カードのクリックによる選択状態の管理
  • デフォルト患者の自動選択
  • 選択された患者IDの保存と決済画面への遷移

1.1 モード判定とUIの出し分け

views/UserProfile/UserList.vue において、クエリパラメータを検知してモードを切り替える。

import { useRoute } from 'vue-router'
import { computed } from 'vue'

const currentRoute = useRoute()
const isSelectMode = computed(() => currentRoute.query.mode === 'select')

テンプレート側では、このフラグに基づいてタイトルや補足説明、アクションボタンを表示する。

<app-header :title="isSelectMode ? '患者の選択' : '家族アーカイブ'" />

<div class="select-notice" v-if="isSelectMode">
  <h3>診療対象の患者を選択してください</h3>
  <p>適切な診療を行うための参考情報となり、医師のみ閲覧可能です</p>
</div>

<!-- 患者選択モード時のアクションボタン -->
<div class="action-area" v-if="isSelectMode">
  <van-button type="primary" round block @click="goToCheckout">支払いへ進む</van-button>
</div>

1.2 クリックによる選択状態の管理

選択モード時、リスト内の患者カードをクリックすることでアクティブ状態を切り替える。

import { ref } from 'vue'

const activeUserId = ref('')

const handleUserClick = (userProfile) => {
  if (isSelectMode.value) {
    activeUserId.value = userProfile.id
  }
}

テンプレートにはクリックイベントと動的クラスをバインドする。

<div 
  v-for="profile in userList" 
  :key="profile.id" 
  class="user-card"
  @click="handleUserClick(profile)"
  :class="{ active: activeUserId === profile.id }"
>
  <!-- コンテンツ -->
</div>

1.3 デフォルト患者の自動選択

リスト取得時、選択モードであればデフォルト設定されている患者、もしくは先頭の患者を自動で選択状態にする。

const fetchUserList = async () => {
  const response = await getUserList()
  userList.value = response.data
  
  if (isSelectMode.value && userList.value.length > 0) {
    const primaryUser = userList.value.find(u => u.isDefault)
    activeUserId.value = primaryUser ? primaryUser.id : userList.value[0].id
  }
}

1.4 決済画面への遷移

選択された患者IDをストアに保存し、注文確認画面へ遷移させる。

import { useRouter } from 'vue-router'
import { useMedicalStore } from '@/stores/medical'

const router = useRouter()
const medicalStore = useMedicalStore()

const goToCheckout = () => {
  if (!activeUserId.value) return showToast('患者を選択してください')
  medicalStore.setSelectedUser(activeUserId.value)
  router.push('/medical/payment')
}

2. 決済画面のルーティングと事前決済情報の取得

患者選択後の事前決済情報(注文概要)を表示する画面を構築する。

2.1 ルーティング設定

router/index.ts に決済画面のルートを追加する。

{
  path: '/medical/payment',
  name: 'MedicalPayment',
  component: () => import('@/views/medical/CheckoutView.vue'),
  meta: { title: '診療支払い' }
}

2.2 事前決済情報取得APIの定義

支払いに必要な情報と患者詳細を取得するための型定義とAPI関数を用意する。

types/medical.ts

タグ: Vue3 CompositionAPI Pinia vue-router TypeScript

7月3日 22:49 投稿