## 가장 흔한 입력이 조용히 0건이었다 차트번호는 <b>완전일치</b>다. 병원 P_PatInf 는 고정 폭이라 실제 값이 0으로 채워져 있는데 사람은 "12345" 처럼 앞의 0 을 빼고 친다 — 그러면 0건이다. 저장소는 주석으로 "병원별 zero-pad 후 전달"을 요구하는데(PatientVisitStore.cs:8) 유일한 호출부가 그 계약을 안 지키고 있었다. <b>자릿수를 설정으로 정하지 않았다.</b> 병원마다 다르고 틀리면 멀쩡한 검색을 망친다. 대신 0건일 때만 8·10자리로 한 번 더 찾는다(레거시가 쓰던 두 폭이다). 찾았으면 "자릿수를 채워 '0000012345' 로 찾았습니다"를 적고 그 번호를 칸에 되쓴다 — 다음부터 그 번호를 쓸 수 있게. 틀릴 여지가 없는 방식이다. ## 0건일 때 무엇으로 찾았는지 말하지 않았다 유형이 틀려서 0건인 경우가 가장 흔한데(습관대로 이름을 쳤는데 유형은 차트번호) 화면에 힌트가 하나도 없어 접속이나 권한을 의심하게 된다. "없습니다(차트번호 완전일치로 찾았습니다)"로 유형과 일치 방식을 함께 적는다. ## '기준 시점'이 무슨 뜻인지 알 수 없었다 입원 내원은 <b>구간</b>이라 어느 시점의 진료과·병실·보험 자격을 쓸지 정해야 하는데, 목록에 접수일시만 있어서 그것이 구간이라는 사실 자체가 안 보였다. 이미 조회돼 있으면서 화면에 없던 <b>퇴원일시</b> 열을 붙이고, 선택지를 '마지막(퇴원 시점)'·'처음(입원 시점)'으로 바꿔 무엇을 고르는지 글자로 말한다. 열을 하나 더하면서 상태 열이 화면 밖으로 밀리고 콤보 글자가 잘렸다 — 사진으로 확인하고 일곱 열이 다 들어오도록 폭을 다시 잡았다. ## 판정 - 단위 시험 388 · edit-smoke 390건 전건 통과 - --dialog-shots 69장 전건 통과(다크·라이트 눈으로 확인 — 열·콤보 잘림 없음) - --modal-check · --maxrect · --scale-budget 전건 통과 - --db-render P062 md5 8d683835f5d81e7bb41c79071d6bf954 불변 ## 남은 것 검색 유형 자동 판별(입력 모양으로 주민번호·휴대전화·성명·차트번호를 가려내는 것)은 안 넣었다 — 콤보를 사람 몰래 바꾸는 동작이라 "왜 유형이 저절로 바뀌지"를 새로 만든다. 0건 안내가 유형을 밝히게 된 것으로 같은 혼란의 대부분은 없어진다. 자릿수 보정 뒤 재조회는 DB 가 붙은 단말에서 실제 차트번호로 확인이 필요하다. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
152 lines
9.9 KiB
XML
152 lines
9.9 KiB
XML
<Window x:Class="SheetMe.Designer.Views.PatientPickerDialogView"
|
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
Title="환자 선택 — 미리보기" Width="1040" Height="620"
|
|
MinWidth="880" MinHeight="480"
|
|
WindowStartupLocation="CenterOwner" ShowInTaskbar="False"
|
|
Style="{StaticResource ThemedDialogWindow}">
|
|
<DockPanel Margin="16">
|
|
|
|
<!-- 검색 줄. 유형을 먼저 고른다 — 유형마다 일치 방식이 달라서(차트번호는 완전일치,
|
|
성명은 접두, 휴대전화는 부분) 한 칸에 몰아넣으면 왜 안 찾아지는지 설명할 수 없다. -->
|
|
<Grid DockPanel.Dock="Top" Margin="0,0,0,10">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="Auto"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<TextBlock Grid.Column="0" Text="검색" VerticalAlignment="Center" Margin="0,0,8,0"
|
|
Foreground="{DynamicResource B.Muted}"/>
|
|
<ComboBox x:Name="KindCombo" Grid.Column="1" Width="110" SelectedIndex="0"
|
|
AutomationProperties.Name="검색 유형">
|
|
<ComboBoxItem Content="차트번호"/>
|
|
<ComboBoxItem Content="성명"/>
|
|
<ComboBoxItem Content="주민번호"/>
|
|
<ComboBoxItem Content="휴대전화"/>
|
|
</ComboBox>
|
|
<TextBox x:Name="TermBox" Grid.Column="2" Margin="8,0" VerticalContentAlignment="Center"
|
|
KeyDown="OnTermKeyDown" AutomationProperties.Name="검색어"/>
|
|
<Button x:Name="SearchButton" Grid.Column="3" Content="찾기(_F)" Padding="18,4" Click="OnSearch"/>
|
|
</Grid>
|
|
|
|
<!-- 감사 고지. 이 창은 실제 환자 정보를 꺼낸다 — 기록된다는 사실을 화면에서 말한다. -->
|
|
<TextBlock DockPanel.Dock="Top" Margin="0,0,0,8" TextWrapping="Wrap"
|
|
Foreground="{DynamicResource B.Muted}"
|
|
Text="실제 환자 정보를 불러옵니다. 조회한 사용자와 내원번호가 감사 로그에 남습니다(환자 이름은 남기지 않습니다)."/>
|
|
|
|
<!-- 아래 줄. 고른 것을 글로 확인시키고 기준 시점을 함께 둔다.
|
|
기준 시점은 입원 내원의 진료과·병실·자격 값을 실제로 바꾼다 — 숨기면 값이 왜 다른지 알 수 없다. -->
|
|
<Grid DockPanel.Dock="Bottom" Margin="0,10,0,0">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<TextBlock x:Name="ChosenText" Grid.Column="0" VerticalAlignment="Center"
|
|
TextTrimming="CharacterEllipsis" Foreground="{DynamicResource B.Muted}"
|
|
Text="환자를 찾아 내원을 고르세요."/>
|
|
|
|
<StackPanel Grid.Column="1" Orientation="Horizontal">
|
|
<TextBlock Text="기준 시점" VerticalAlignment="Center" Margin="0,0,6,0"
|
|
Foreground="{DynamicResource B.Muted}"
|
|
ToolTip="입원 내원은 구간이라 어느 시점의 진료과·병실·보험 자격을 쓸지 정해야 합니다. 외래는 접수일시로 같습니다."/>
|
|
<ComboBox x:Name="EdgeCombo" Width="150" SelectedIndex="0"
|
|
AutomationProperties.Name="기준 시점">
|
|
<ComboBoxItem Content="마지막(퇴원 시점)"/>
|
|
<ComboBoxItem Content="처음(입원 시점)"/>
|
|
</ComboBox>
|
|
<Button x:Name="SelectButton" Content="선택" Padding="20,4" Margin="10,0,0,0"
|
|
Click="OnSelect" IsDefault="True" IsEnabled="False"
|
|
Style="{StaticResource Primary}"/>
|
|
<Button Content="취소" Padding="18,4" Margin="8,0,0,0" IsCancel="True"/>
|
|
</StackPanel>
|
|
</Grid>
|
|
|
|
<!-- 본문. 환자 목록과 그 환자의 내원 목록을 동시에 둔다 —
|
|
고르는 대상은 내원이므로 환자를 고른 뒤 화면이 바뀌면 왕복이 생긴다. -->
|
|
<Grid>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="47*"/>
|
|
<ColumnDefinition Width="6"/>
|
|
<ColumnDefinition Width="53*"/>
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<DockPanel Grid.Column="0">
|
|
<TextBlock x:Name="PatientCountText" DockPanel.Dock="Top" Margin="0,0,0,4"
|
|
Foreground="{DynamicResource B.Muted}"
|
|
Text="환자 — 검색어를 넣고 찾기를 누르세요"/>
|
|
<ListView x:Name="PatientList" SelectionChanged="OnPatientChanged"
|
|
BorderBrush="{DynamicResource B.Line}" BorderThickness="1"
|
|
VirtualizingPanel.IsVirtualizing="True"
|
|
AutomationProperties.Name="환자 목록">
|
|
<ListView.View>
|
|
<GridView>
|
|
<GridViewColumn Header="차트번호" Width="90" DisplayMemberBinding="{Binding ChtNum}"/>
|
|
<GridViewColumn Header="성명" Width="80" DisplayMemberBinding="{Binding Name}"/>
|
|
<GridViewColumn Header="주민번호" Width="105" DisplayMemberBinding="{Binding ResNumMasked}"/>
|
|
<GridViewColumn Header="휴대전화" Width="100" DisplayMemberBinding="{Binding MobilePhone}"/>
|
|
<GridViewColumn Header="비고" Width="70">
|
|
<GridViewColumn.CellTemplate>
|
|
<DataTemplate>
|
|
<TextBlock>
|
|
<TextBlock.Style>
|
|
<Style TargetType="TextBlock">
|
|
<Setter Property="Foreground" Value="{DynamicResource B.Muted}"/>
|
|
<Style.Triggers>
|
|
<DataTrigger Binding="{Binding Inpatient}" Value="True">
|
|
<Setter Property="Text" Value="재원"/>
|
|
<Setter Property="Foreground" Value="{DynamicResource B.Accent}"/>
|
|
</DataTrigger>
|
|
<DataTrigger Binding="{Binding Active}" Value="False">
|
|
<Setter Property="Text" Value="사용중지"/>
|
|
</DataTrigger>
|
|
<DataTrigger Binding="{Binding Shielded}" Value="True">
|
|
<Setter Property="Text" Value="정보보호"/>
|
|
<Setter Property="Foreground" Value="{DynamicResource B.Danger}"/>
|
|
</DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</TextBlock.Style>
|
|
</TextBlock>
|
|
</DataTemplate>
|
|
</GridViewColumn.CellTemplate>
|
|
</GridViewColumn>
|
|
</GridView>
|
|
</ListView.View>
|
|
</ListView>
|
|
</DockPanel>
|
|
|
|
<GridSplitter Grid.Column="1" Width="6" HorizontalAlignment="Stretch"
|
|
Background="Transparent"/>
|
|
|
|
<DockPanel Grid.Column="2">
|
|
<TextBlock x:Name="VisitCountText" DockPanel.Dock="Top" Margin="0,0,0,4"
|
|
Foreground="{DynamicResource B.Muted}"
|
|
Text="내원 — 환자를 고르면 나옵니다"/>
|
|
<ListView x:Name="VisitList" MouseDoubleClick="OnSelect"
|
|
SelectionChanged="OnVisitChanged"
|
|
BorderBrush="{DynamicResource B.Line}" BorderThickness="1"
|
|
VirtualizingPanel.IsVirtualizing="True"
|
|
AutomationProperties.Name="내원 목록">
|
|
<ListView.View>
|
|
<GridView>
|
|
<GridViewColumn Header="구분" Width="46" DisplayMemberBinding="{Binding Kind}"/>
|
|
<GridViewColumn Header="접수일시" Width="106" DisplayMemberBinding="{Binding AcceptedAtText}"/>
|
|
<!-- 퇴원일시 — 이미 조회돼 있는데 화면에 없었다.
|
|
입원 내원이 '구간'이라는 사실이 이 열 하나로 눈에 보인다.
|
|
그래야 아래 기준 시점 선택이 무슨 뜻인지 알 수 있다. -->
|
|
<GridViewColumn Header="퇴원일시" Width="106" DisplayMemberBinding="{Binding LeftAtText}"/>
|
|
<GridViewColumn Header="진료과" Width="86" DisplayMemberBinding="{Binding Department}"/>
|
|
<GridViewColumn Header="담당의" Width="68" DisplayMemberBinding="{Binding Doctor}"/>
|
|
<GridViewColumn Header="보험" Width="74" DisplayMemberBinding="{Binding Insurance}"/>
|
|
<GridViewColumn Header="상태" Width="58" DisplayMemberBinding="{Binding State}"/>
|
|
</GridView>
|
|
</ListView.View>
|
|
</ListView>
|
|
</DockPanel>
|
|
</Grid>
|
|
</DockPanel>
|
|
</Window>
|