From 1a1c8e71fcd14858f595029f089b2d4a00202b32 Mon Sep 17 00:00:00 2001
From: ogi <Administrator@S-OGI-PC>
Date: Fri, 05 Dec 2025 09:24:16 +0900
Subject: [PATCH] プロジェクトファイルを追加。
---
HotelPms.Client.Blazor/Pages/UseDetail/PersonInfo.razor | 297 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 297 insertions(+), 0 deletions(-)
diff --git a/HotelPms.Client.Blazor/Pages/UseDetail/PersonInfo.razor b/HotelPms.Client.Blazor/Pages/UseDetail/PersonInfo.razor
new file mode 100644
index 0000000..8c425a4
--- /dev/null
+++ b/HotelPms.Client.Blazor/Pages/UseDetail/PersonInfo.razor
@@ -0,0 +1,297 @@
+@using System.ComponentModel.DataAnnotations
+@using System.Text.RegularExpressions
+@using System.Reflection
+@using HotelPms.Client.Blazor.ViewModel
+@using HotelPms.Data.Common
+@using HotelPms.Data.Common.Interface.Master
+@using HotelPms.DataAccessGrpc.Client
+@using HotelPms.Share.IO
+@using HotelPms.Share.Util
+@using ViewModel = HotelPms.Client.Blazor.ViewModel
+@using static HotelPms.Client.Blazor.Util.SystemEnum
+@inject IJSRuntime JSRuntime
+
+<MudCard Style="@Style" Elevation="6">
+ <MudCardHeader Class="mb-0 pb-0">
+ <CardHeaderAvatar>
+ <MudTooltip Text="顧客割当" Color="MudBlazor.Color.Tertiary" Placement="Placement.Top" Arrow="true">
+ <MudAvatar Color="MudBlazor.Color.Secondary">済</MudAvatar>
+ </MudTooltip>
+ </CardHeaderAvatar>
+ <CardHeaderContent>
+ <MudText Typo="Typo.body1">個人情報</MudText>
+ </CardHeaderContent>
+ <CardHeaderActions>
+ <MudIconButton Icon="@Icons.Material.Filled.Search" Color="MudBlazor.Color.Default" Title="顧客検索" />
+ <MudIconButton Icon="@Icons.Material.Filled.Cancel" Color="MudBlazor.Color.Default" Title="顧客解除" />
+ </CardHeaderActions>
+ </MudCardHeader>
+ <MudCardContent Class="mt-0 pt-0 mb-0 pb-0">
+ <MudGrid Spacing="3" Justify="Justify.FlexStart" Class="align-center mt-0 pt-0 mb-0 pb-0">
+ @foreach (var field in Data.GetGroup(ViewModel.UseInput.GroupKey.Person))
+ {
+ EnvironmentSetting.Debug($"Index={field.Index},Text={field.Text},Error={field.Error},ErrorText={field.ErrorText}");
+ if (field.DispNameEnabled)
+ {
+ <MudItem lg="@field.WidthUnit" Class="@rowSpaceStyle">
+ <MudGrid Spacing="0" Justify="Justify.FlexStart" Class="align-center mt-0 pt-0 mb-0 pb-0">
+ <MudItem xs="@(12 - field.DispWidthUnit)" Class="mt-0 pt-0 mb-0 pb-0">
+ <MudTextField Class="input-pink" @bind-Value="field.Text" Error="@field.Error" ErrorText="@field.ErrorText" @ref="field.Ref" T="string" Label="@field.Caption"
+ AutoFocus="@(field.Index == 0)" Margin="Margin.Dense" MaxLength="@field.MaxLenth" Disabled="@field.Disabled" ReadOnly="@field.ReadOnly"
+ id="@($"{Data.ID}-{field.Index}")" data-guid="@Data.ID" data-valid-index="@field.Index" data-valid-name="@field.Name" data-valid-org-text="@field.OrgText" data-valid-text="@field.Text"
+ data-valid-input-char="@((int)field.InputChar)" data-valid-show-style="@((int)field.ShowStyle)" data-valid-thousand-format="@field.ThousandFormat"/>
+ </MudItem>
+ <MudItem xs="@field.DispWidthUnit" Class="mt-0 pt-0 mb-0 pb-0">
+ <MudField Margin="Margin.Dense">@field.DispText</MudField>
+ </MudItem>
+ </MudGrid>
+ </MudItem>
+ }
+ else
+ {
+ <MudItem lg="@field.WidthUnit" Class="@rowSpaceStyle">
+ <MudTextField Class="@(field.ShowStyle == EShowStyle.ShowList ? "input-pink" : string.Empty)" @bind-Value="field.Text" Error="@field.Error" ErrorText="@field.ErrorText" @ref="field.Ref" T="string" Label="@field.Caption"
+ AutoFocus="@(field.Index == 0)" Margin="Margin.Dense" MaxLength="@field.MaxLenth" Disabled="@field.Disabled" ReadOnly="@field.ReadOnly"
+ id="@($"{Data.ID}-{field.Index}")" data-guid="@Data.ID" data-valid-index="@field.Index" data-valid-name="@field.Name" data-valid-org-text="@field.OrgText" data-valid-text="@field.Text"
+ data-valid-input-char="@((int)field.InputChar)" data-valid-show-style="@((int)field.ShowStyle)" data-valid-thousand-format="@field.ThousandFormat"/>
+ </MudItem>
+ }
+ }
+ </MudGrid>
+ </MudCardContent>
+</MudCard>
+
+@*<style>
+ /* 伪类选择器 :focus-within */
+ /* 它表示一个元素获得焦点,或,该元素的后代元素获得焦点。划重点,它或它的后代获得焦点。 */
+ /* 这也就意味着,它或它的后代获得焦点,都可以触发 :focus-within。 */
+ .focus-button:focus-within {
+ border: 1px solid;
+ border-color: #00FF00;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(0, 255, 0, 0.6);
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(0, 255, 0, 0.6);
+ box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.075), 0px 0px 8px rgba(0, 255, 0, 0.6);
+ }
+</style>
+*@
+
+@code {
+ [Inject] private IDialogService DialogService { get; set; }
+ [Inject] private GrpcChannel Channel { get; set; }
+ [CascadingParameter] MudDialogInstance MudDialog { get; set; }
+ [Parameter] public ViewModel.UseInput? Data { get; set; }
+ [Parameter] public EventCallback<ValidField> ParentShowList { get; set; }
+ [Parameter] public string Style { get; set; }
+
+ private string errorAll = string.Empty;
+ private MudButton btnSave;
+ private string rowSpaceStyle = "mt-2 pt-0 mb-0 pb-0";
+
+ protected override void OnInitialized()
+ {
+ //Data.Refresh = new Action(StateHasChanged); //メイン画面の更新
+ //Data.BeforeAutoNextFocus += BeforeAutoNextFocus;
+ //Data.BusinessValid += BusinessValid;
+ //Data.ShowList += ShowList;
+ }
+
+ private async void ShowList(ValidField sender, ValidEventArgs e)
+ {
+ await ParentShowList.InvokeAsync(sender);
+ //await ShowListAction(sender);
+ }
+
+ /// <summary>
+ /// 業務チェックを行う
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
+ /// <returns></returns>
+ private async Task<bool> BusinessValid(ValidField sender, ValidEventArgs e)
+ {
+ if (sender.Name == "ID")
+ {
+ using (BuildingAccess access = new BuildingAccess(Channel))
+ {
+ bool ret = await access.ExistsAsync(CConvert.ToInt(e.Text));
+ EnvironmentSetting.Debug($"access.Exists:{ret}");
+ if(Data.EditMode == (int)EMasterEditStatus.Create && ret)
+ {
+ if (e.EnterPush)
+ {
+ sender.Error = true;
+ sender.ErrorText = "当該データが既に存在します。";
+ }
+ else
+ {
+ sender.Error = false;
+ sender.ErrorText = string.Empty;
+ }
+ //StateHasChanged();
+ return false;
+ }
+ else if(Data.EditMode == (int)EMasterEditStatus.Update && !ret)
+ {
+ if (e.EnterPush)
+ {
+ sender.Error = true;
+ sender.ErrorText = "当該データが存在しません。";
+ }
+ else
+ {
+ sender.Error = false;
+ sender.ErrorText = string.Empty;
+ }
+ //StateHasChanged();
+ return false;
+ }
+ }
+ }
+
+ sender.Error = false;
+ sender.ErrorText = string.Empty;
+ //StateHasChanged();
+ return true;
+ }
+
+ /// <summary>
+ /// フォーカスを移動
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
+ /// <returns></returns>
+ private async Task<bool> BeforeAutoNextFocus(ValidField sender, ValidEventArgs e)
+ {
+ if (sender.Index == Data.Fields.Count - 1 && e.EnterPush)
+ {
+ await btnSave.FocusAsync(); //ここから非同期処理
+ return false;
+ }
+ return true;
+ }
+
+ /// <summary>
+ /// Endキー
+ /// </summary>
+ /// <param name="item"></param>
+ private async Task ShowListAction(ViewModel.ValidField item)
+ {
+ if (item.Name == "ZipCode")
+ {
+ if(item.Text.Length == 0) { return; }
+ using (DataTable data = await HotelPms.DataAccessGrpc.Client.AddressAccess.GetPostNoSearch(Channel, item.Text))
+ {
+ if (data.Rows.Count == 0)
+ {
+ await DialogService.ShowMessageBox($"{item.Caption}検索","該当データがありません。",yesText: "OK");
+ return;
+ }
+
+ if (data.Rows.Count > 1000)
+ {
+ await DialogService.ShowMessageBox($"{item.Caption}検索","対象データが1000件以上超えていますので、更に条件を調整してください。",yesText: "OK");
+ return;
+ }
+
+ var parameters = new DialogParameters { ["Data"] = data };
+ var dialog = DialogService.Show<SelectList>($"{item.Caption}検索", parameters);
+ var ret = await dialog.Result;
+ if (!ret.Cancelled)
+ {
+ var row = ret.Data as DataRow;
+ item.Text = row[0].ToString();
+ Data.GetField("Address2").Text = row[1].ToString();
+ StateHasChanged();
+ }
+ }
+ }
+ else if (item.Name == "Address2")
+ {
+ if(item.Text.Length == 0) { return; }
+ using (DataTable data = await HotelPms.DataAccessGrpc.Client.AddressAccess.GetAddressSearch(Channel, item.Text))
+ {
+ if (data.Rows.Count == 0)
+ {
+ await DialogService.ShowMessageBox($"{item.Caption}検索","該当データがありません。",yesText: "OK");
+ return;
+ }
+
+ if (data.Rows.Count > 1000)
+ {
+ await DialogService.ShowMessageBox($"{item.Caption}検索","対象データが1000件以上超えていますので、更に条件を調整してください。",yesText: "OK");
+ return;
+ }
+
+ var parameters = new DialogParameters { ["Data"] = data };
+ var dialog = DialogService.Show<SelectList>($"{item.Caption}検索", parameters);
+ var ret = await dialog.Result;
+ if (!ret.Cancelled)
+ {
+ var row = ret.Data as DataRow;
+ Data.GetField("ZipCode").Text = row[0].ToString();
+ item.Text = row[1].ToString();
+ StateHasChanged();
+ }
+ }
+ }
+ else
+ {
+ await DialogService.ShowMessageBox(
+ "Warning",
+ "未実装!",
+ yesText: "OK", cancelText: "Cancel");
+ }
+ }
+
+ /// <summary>
+ /// 画面閉じる
+ /// </summary>
+ private void Close()
+ {
+ MudDialog.Cancel();
+ }
+
+ public void SetResvNo(string no)
+ {
+ Data.GetField("ResvNo").Text = no;
+ StateHasChanged();
+ }
+
+ /// <summary>
+ /// 保存
+ /// </summary>
+ private async void Save()
+ {
+ if (!await Data.IsValidAll())
+ {
+ //errorAll = Data.ErrText;
+ return;
+ }
+
+ //データ保存
+ using (BuildingAccess access = new BuildingAccess(Channel))
+ {
+ HotelPms.Data.Master.Building item = new HotelPms.Data.Master.Building()
+ {
+ ID = CConvert.ToInt(Data.GetField("ID").Text),
+ Name = Data.GetField("Name").Text,
+ ShortName = Data.GetField("ShortName").Text,
+ ZipCode = Data.GetField("ZipCode").Text,
+ Tel = Data.GetField("Tel").Text,
+ Fax = Data.GetField("Fax").Text,
+ Address2 = Data.GetField("Address2").Text,
+ };
+ //IMaster im = item as IMaster;
+
+ var result = Data.EditMode == (int)EMasterEditStatus.Create ? await access.AddAsync(item) : await access.UpdateAsync(item);
+ if(result.ErrNo != 0)
+ {
+ errorAll = $"更新に失敗しました。";
+ OperationLog.Instance.WriteLog($"Building.Save:{result.ErrNo}.{result.ErrData}");
+ return;
+ }
+ }
+
+ MudDialog.Close(DialogResult.Ok(Data));
+ }
+}
\ No newline at end of file
--
Gitblit v1.10.0