Konflike behoben
This commit is contained in:
BIN
BeWo/AI/Controls/Icon_KI_Chat_Weiss_TEMP.png
Normal file
BIN
BeWo/AI/Controls/Icon_KI_Chat_Weiss_TEMP.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.3 KiB |
21
BeWo/AI/Controls/VoiceToTextButtonControl.xaml
Normal file
21
BeWo/AI/Controls/VoiceToTextButtonControl.xaml
Normal file
@@ -0,0 +1,21 @@
|
||||
<UserControl x:Class="BeWo.AI.Controls.VoiceToTextButtonControl"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition />
|
||||
<RowDefinition />
|
||||
</Grid.RowDefinitions>
|
||||
<Button x:Name="ButtonOpenTranskriptionView" Click="ButtonOpenTranskriptionView_Click">
|
||||
|
||||
<Image Source="Icon_KI_Chat_Weiss_TEMP.png"
|
||||
Width="22"
|
||||
Height="22"
|
||||
Margin="0,0,0,0"/>
|
||||
|
||||
</Button>
|
||||
|
||||
</Grid>
|
||||
|
||||
|
||||
</UserControl>
|
||||
102
BeWo/AI/Controls/VoiceToTextButtonControl.xaml.cs
Normal file
102
BeWo/AI/Controls/VoiceToTextButtonControl.xaml.cs
Normal file
@@ -0,0 +1,102 @@
|
||||
using BeWo.AI.View;
|
||||
using BeWo.Services;
|
||||
using BS.Shared.Translation;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace BeWo.AI.Controls
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaktionslogik für VoiceToTextButtonControl.xaml
|
||||
/// </summary>
|
||||
public partial class VoiceToTextButtonControl : UserControl
|
||||
{
|
||||
public static readonly DependencyProperty TargetTextBoxProperty =
|
||||
DependencyProperty.Register(
|
||||
nameof(TargetTextBox),
|
||||
typeof(TextBox),
|
||||
typeof(VoiceToTextButtonControl));
|
||||
|
||||
public VoiceToTextButtonControl()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public TextBox TargetTextBox
|
||||
{
|
||||
get => (TextBox)GetValue(TargetTextBoxProperty);
|
||||
set => SetValue(TargetTextBoxProperty, value);
|
||||
}
|
||||
|
||||
private void ButtonOpenTranskriptionView_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
OpenTranskriptionView();
|
||||
}
|
||||
|
||||
public void OpenTranskriptionView()
|
||||
{
|
||||
|
||||
var view = new AiTranskriptionView();
|
||||
|
||||
view.InitView();
|
||||
|
||||
var factory = new BeWoWindowFactory();
|
||||
var beWoWindow = factory.GetAnimatedBeWoWindow(Translator.Translate("BeWoPlaner"), view, 500, 600);
|
||||
|
||||
view.ApplyClicked += (s, e) =>
|
||||
{
|
||||
if (TargetTextBox != null)
|
||||
{
|
||||
InsertTextAtSelection(view.GetText());
|
||||
}
|
||||
|
||||
beWoWindow.Close();
|
||||
};
|
||||
|
||||
view.CancelClicked += (s, e) =>
|
||||
{
|
||||
if (!String.IsNullOrEmpty(view.GetText()))
|
||||
{
|
||||
if (MessageBox.Show("Sind Sie sicher, dass Sie abbrechnen und den Text verwerfen möchten?", "Abbrechen", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
|
||||
{
|
||||
beWoWindow.Close();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
beWoWindow.Close();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
beWoWindow.ShowDialog();
|
||||
}
|
||||
|
||||
private void InsertTextAtSelection(string neuerText)
|
||||
{
|
||||
int start = TargetTextBox.SelectionStart;
|
||||
int length = TargetTextBox.SelectionLength;
|
||||
|
||||
TargetTextBox.Text =
|
||||
TargetTextBox.Text.Remove(start, length)
|
||||
.Insert(start, neuerText);
|
||||
|
||||
TargetTextBox.CaretIndex = start + neuerText.Length;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
222
BeWo/AI/View/AiTranskriptionView.xaml
Normal file
222
BeWo/AI/View/AiTranskriptionView.xaml
Normal file
@@ -0,0 +1,222 @@
|
||||
<view:BeWoView
|
||||
x:Class="BeWo.AI.View.AiTranskriptionView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:controls="clr-namespace:BeWo.Controls;assembly=BeWo.Controls"
|
||||
xmlns:core="clr-namespace:BS.Shared.Core;assembly=BS.Shared"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
|
||||
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
|
||||
xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:t="clr-namespace:BeWo.MultiLanguage.Markup"
|
||||
xmlns:validation="clr-namespace:BeWo.Validation"
|
||||
xmlns:view="clr-namespace:BeWo.View"
|
||||
Width="Auto"
|
||||
Height="Auto"
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Stretch"
|
||||
d:DesignHeight="400"
|
||||
d:DesignWidth="500"
|
||||
Focusable="True"
|
||||
mc:Ignorable="d">
|
||||
<Grid Margin="0" Background="{DynamicResource ObjectEditBackgroundBrush}" >
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="*" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
<StackPanel
|
||||
Grid.Row="0"
|
||||
Height="Auto"
|
||||
VerticalAlignment="Center"
|
||||
Orientation="Vertical">
|
||||
<Button x:Name="ButtonStart"
|
||||
Click="ButtonStartStop_Click"
|
||||
Grid.Row="1"
|
||||
HorizontalAlignment="Center"
|
||||
Width="220"
|
||||
Height="50"
|
||||
Margin="0,10,0,0">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="120"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Image Source="Icon_KI_Chat_Weiss_TEMP.png"
|
||||
Width="32"
|
||||
Height="32"
|
||||
Margin="0,0,10,0"/>
|
||||
<TextBlock Grid.Column="1" x:Name="ButtonText" VerticalAlignment="Center" Text="Aufnahme initiieren"/>
|
||||
<Viewbox Grid.Column="2" x:Name="VBPlay" Width="40" Height="40" Visibility="Visible">
|
||||
<Grid Width="100" Height="100">
|
||||
<Ellipse
|
||||
Width="80"
|
||||
Height="80"
|
||||
Stroke="White"
|
||||
StrokeThickness="6"
|
||||
Fill="Transparent"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"/>
|
||||
|
||||
<Path
|
||||
Fill="White"
|
||||
Data="M 40,30 L 40,70 L 70,50 Z"/>
|
||||
</Grid>
|
||||
</Viewbox>
|
||||
<Viewbox Grid.Column="2" x:Name="VBStop" Width="40" Height="40" Visibility="Hidden">
|
||||
<Grid Width="100" Height="100">
|
||||
<Ellipse
|
||||
Width="80"
|
||||
Height="80"
|
||||
StrokeThickness="6"
|
||||
Fill="Transparent"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center">
|
||||
<Ellipse.Stroke>
|
||||
<LinearGradientBrush
|
||||
x:Name="RingGradient"
|
||||
StartPoint="0,0"
|
||||
EndPoint="1,0">
|
||||
|
||||
<LinearGradientBrush.RelativeTransform>
|
||||
<RotateTransform x:Name="GradientRotate"
|
||||
CenterX="0.5"
|
||||
CenterY="0.5"/>
|
||||
</LinearGradientBrush.RelativeTransform>
|
||||
|
||||
<GradientStop Color="Red" Offset="0"/>
|
||||
<GradientStop Color="#00FF0000" Offset="1"/>
|
||||
</LinearGradientBrush>
|
||||
</Ellipse.Stroke>
|
||||
|
||||
<Ellipse.Triggers>
|
||||
<EventTrigger RoutedEvent="Loaded">
|
||||
<BeginStoryboard>
|
||||
<Storyboard RepeatBehavior="Forever">
|
||||
<DoubleAnimation
|
||||
Storyboard.TargetName="GradientRotate"
|
||||
Storyboard.TargetProperty="Angle"
|
||||
From="0"
|
||||
To="360"
|
||||
Duration="0:0:2"/>
|
||||
</Storyboard>
|
||||
</BeginStoryboard>
|
||||
</EventTrigger>
|
||||
</Ellipse.Triggers>
|
||||
</Ellipse>
|
||||
|
||||
<Rectangle
|
||||
Width="33"
|
||||
Height="33"
|
||||
Fill="Red"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"/>
|
||||
</Grid>
|
||||
</Viewbox>
|
||||
</Grid>
|
||||
</Button>
|
||||
<Label x:Name="lblStatus" Height="23" HorizontalAlignment="Center"></Label>
|
||||
<StackPanel x:Name="PanelAnimation" Visibility="Hidden" Orientation="Horizontal"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center">
|
||||
|
||||
<StackPanel.Resources>
|
||||
<Storyboard x:Key="DotAnimation"
|
||||
RepeatBehavior="Forever">
|
||||
<DoubleAnimation
|
||||
Storyboard.TargetProperty="Opacity"
|
||||
From="0.3"
|
||||
To="1"
|
||||
Duration="0:0:0.6"
|
||||
AutoReverse="True"/>
|
||||
</Storyboard>
|
||||
</StackPanel.Resources>
|
||||
|
||||
<!-- Punkt 1 -->
|
||||
<Ellipse Width="8" Height="8" Fill="#007ACC" Margin="3">
|
||||
<Ellipse.Triggers>
|
||||
<EventTrigger RoutedEvent="Loaded">
|
||||
<BeginStoryboard Storyboard="{StaticResource DotAnimation}"/>
|
||||
</EventTrigger>
|
||||
</Ellipse.Triggers>
|
||||
</Ellipse>
|
||||
|
||||
<!-- Punkt 2 -->
|
||||
<Ellipse Width="8" Height="8" Fill="#007ACC" Margin="3" Opacity="0.3">
|
||||
<Ellipse.Triggers>
|
||||
<EventTrigger RoutedEvent="Loaded">
|
||||
<BeginStoryboard>
|
||||
<Storyboard RepeatBehavior="Forever">
|
||||
<DoubleAnimation
|
||||
Storyboard.TargetProperty="Opacity"
|
||||
From="0.3"
|
||||
To="1"
|
||||
Duration="0:0:0.6"
|
||||
BeginTime="0:0:0.2"
|
||||
AutoReverse="True"/>
|
||||
</Storyboard>
|
||||
</BeginStoryboard>
|
||||
</EventTrigger>
|
||||
</Ellipse.Triggers>
|
||||
</Ellipse>
|
||||
|
||||
<!-- Punkt 3 -->
|
||||
<Ellipse Width="8" Height="8" Fill="#007ACC" Margin="3" Opacity="0.3">
|
||||
<Ellipse.Triggers>
|
||||
<EventTrigger RoutedEvent="Loaded">
|
||||
<BeginStoryboard>
|
||||
<Storyboard RepeatBehavior="Forever">
|
||||
<DoubleAnimation
|
||||
Storyboard.TargetProperty="Opacity"
|
||||
From="0.3"
|
||||
To="1"
|
||||
Duration="0:0:0.6"
|
||||
BeginTime="0:0:0.4"
|
||||
AutoReverse="True"/>
|
||||
</Storyboard>
|
||||
</BeginStoryboard>
|
||||
</EventTrigger>
|
||||
</Ellipse.Triggers>
|
||||
</Ellipse>
|
||||
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
<TextBox
|
||||
Style="{x:Null}"
|
||||
x:Name="TextBoxErgebnis"
|
||||
Grid.Row="1"
|
||||
AcceptsReturn="True"
|
||||
AcceptsTab="True"
|
||||
HorizontalScrollBarVisibility="Disabled"
|
||||
TextWrapping="Wrap"
|
||||
VerticalScrollBarVisibility="Auto"
|
||||
Margin="3"
|
||||
/>
|
||||
|
||||
|
||||
|
||||
|
||||
<StackPanel
|
||||
Grid.Row="2"
|
||||
Height="Auto"
|
||||
Margin="5,10,10,10"
|
||||
HorizontalAlignment="Right"
|
||||
VerticalAlignment="Center"
|
||||
Orientation="Horizontal">
|
||||
<Button
|
||||
x:Name="btnApply"
|
||||
Height="25"
|
||||
Margin="0,0,3,0"
|
||||
Click="ButtonApply_Click"
|
||||
Content="{t:Translate Text übernehmen}" />
|
||||
<Button
|
||||
x:Name="btnClose"
|
||||
Height="25"
|
||||
Margin="0,0,3,0"
|
||||
Click="ButtonClose_Click"
|
||||
Content=" Abbrechen " />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</view:BeWoView>
|
||||
163
BeWo/AI/View/AiTranskriptionView.xaml.cs
Normal file
163
BeWo/AI/View/AiTranskriptionView.xaml.cs
Normal file
@@ -0,0 +1,163 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Forms;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Threading;
|
||||
using BeWo.Annotations;
|
||||
using BeWo.Core;
|
||||
using BeWo.ServiceProxy;
|
||||
using BeWo.Validation;
|
||||
using BeWo.View;
|
||||
using BeWo.View.Controls;
|
||||
using BeWo.ViewModel;
|
||||
using BeWo.ViewModel.ListViewModel;
|
||||
|
||||
using BS.Shared;
|
||||
using BS.Shared.Core;
|
||||
using BS.Shared.DataContracts;
|
||||
using BS.Shared.Extensions;
|
||||
using BS.Shared.Translation;
|
||||
using DevExpress.Utils;
|
||||
using DevExpress.Xpf.Editors;
|
||||
using DevExpress.Xpf.Grid;
|
||||
using MessageBox = System.Windows.MessageBox;
|
||||
|
||||
namespace BeWo.AI.View
|
||||
{
|
||||
public partial class AiTranskriptionView : BeWoView
|
||||
{
|
||||
public event EventHandler ApplyClicked;
|
||||
public event EventHandler CancelClicked;
|
||||
|
||||
|
||||
bool cancel = false;
|
||||
AiVoiceDataDC currentVoiceData = null;
|
||||
|
||||
public AiTranskriptionView()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
}
|
||||
|
||||
public void InitView()
|
||||
{
|
||||
}
|
||||
|
||||
public string GetText()
|
||||
{
|
||||
return TextBoxErgebnis.Text;
|
||||
}
|
||||
|
||||
private void StartAufnahme()
|
||||
{
|
||||
cancel = false;
|
||||
//lblStatus.Content = "Um die Aufnahme zu starten, klicken Sie auf den Link, den Sie in ownChat erhalten haben.";
|
||||
StartTimer();
|
||||
|
||||
ButtonText.Text = "Aufnahme abbrechen";
|
||||
currentVoiceData = ServiceFacade.DoOperationsServiceSync(s => s.StartAIVoice());
|
||||
PanelAnimation.Visibility = Visibility.Visible;
|
||||
|
||||
VBPlay.Visibility = Visibility.Hidden;
|
||||
VBStop.Visibility = Visibility.Visible;
|
||||
}
|
||||
|
||||
private void StopAufnahme()
|
||||
{
|
||||
cancel = true;
|
||||
|
||||
VBPlay.Visibility = Visibility.Visible;
|
||||
VBStop.Visibility = Visibility.Hidden;
|
||||
}
|
||||
|
||||
|
||||
private void StartTimer()
|
||||
{
|
||||
var sec = BeWoApp.AppSettings.AiVoiceRequestInterval;
|
||||
|
||||
new DispatcherTimer(
|
||||
TimeSpan.FromMilliseconds(10000),
|
||||
DispatcherPriority.Background,
|
||||
(s1, e1) =>
|
||||
{
|
||||
CheckTranskriptionStatus();
|
||||
if (cancel)
|
||||
{
|
||||
((DispatcherTimer)s1).Stop();
|
||||
|
||||
PanelAnimation.Visibility = Visibility.Hidden;
|
||||
ButtonText.Text = "Neue Aufnahme starten";
|
||||
}
|
||||
},
|
||||
this.Dispatcher).Start();
|
||||
}
|
||||
|
||||
private void CheckTranskriptionStatus()
|
||||
{
|
||||
currentVoiceData = ServiceFacade.DoOperationsServiceSync(s => s.GetAIVoiceTranscript(currentVoiceData));
|
||||
|
||||
if (!String.IsNullOrEmpty(currentVoiceData.TranskriptionText))
|
||||
{
|
||||
InsertTextAtSelection(currentVoiceData.TranskriptionText);
|
||||
lblStatus.Content = Translator.Translate("Transkription erfolgreich durchgeführt");
|
||||
StopAufnahme();
|
||||
}
|
||||
else if (!String.IsNullOrEmpty(currentVoiceData.Error))
|
||||
{
|
||||
lblStatus.Content = currentVoiceData.Error;
|
||||
StopAufnahme();
|
||||
}
|
||||
else if (!String.IsNullOrEmpty(currentVoiceData.StatusMessage))
|
||||
{
|
||||
lblStatus.Content = currentVoiceData.StatusMessage;
|
||||
}
|
||||
}
|
||||
|
||||
private void InsertTextAtSelection(string neuerText)
|
||||
{
|
||||
int start = TextBoxErgebnis.SelectionStart;
|
||||
int length = TextBoxErgebnis.SelectionLength;
|
||||
|
||||
TextBoxErgebnis.Text =
|
||||
TextBoxErgebnis.Text.Remove(start, length)
|
||||
.Insert(start, neuerText);
|
||||
|
||||
TextBoxErgebnis.CaretIndex = start + neuerText.Length;
|
||||
}
|
||||
|
||||
private void ButtonStartStop_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
if (ButtonText.Text.Contains("Aufnahme"))
|
||||
{
|
||||
StartAufnahme();
|
||||
}
|
||||
else
|
||||
{
|
||||
ButtonText.Text = "Bitte warten...";
|
||||
lblStatus.Content = "Aufnahme wird abgebrochen. Bitte warten...";
|
||||
StopAufnahme();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void ButtonApply_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
ApplyClicked?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
private void ButtonClose_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
CancelClicked?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
BIN
BeWo/AI/View/Icon_KI_Chat_Weiss_TEMP.png
Normal file
BIN
BeWo/AI/View/Icon_KI_Chat_Weiss_TEMP.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.3 KiB |
@@ -95,6 +95,12 @@
|
||||
</StartupObject>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="AI\Controls\VoiceToTextButtonControl.xaml.cs">
|
||||
<DependentUpon>VoiceToTextButtonControl.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="AI\View\AiTranskriptionView.xaml.cs">
|
||||
<DependentUpon>AiTranskriptionView.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Converter\AddressToStringConverter.cs" />
|
||||
<Compile Include="Converter\NewlineConverter.cs" />
|
||||
<Compile Include="Core\Commands\CommandFactory.cs" />
|
||||
@@ -133,6 +139,14 @@
|
||||
<Compile Include="View\Windows\AnimatedBeWoWindow.xaml.cs">
|
||||
<DependentUpon>AnimatedBeWoWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Page Include="AI\Controls\VoiceToTextButtonControl.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="AI\View\AiTranskriptionView.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="View\Detail\AI\AiConfigView.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
@@ -3575,6 +3589,18 @@
|
||||
<ItemGroup>
|
||||
<None Include="Scripts\src\SvcUtil.exe" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Resource Include="Ressources\Icons\micro.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Resource Include="AI\Controls\micro.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Resource Include="AI\Controls\Icon_KI_Chat_Weiss_TEMP.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Resource Include="AI\View\Icon_KI_Chat_Weiss_TEMP.png" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>
|
||||
|
||||
@@ -228,6 +228,9 @@ namespace BeWo
|
||||
|
||||
val = UserSettingsUtils.GetSettingValue(_Mandator.Settings, SettingsKeys.ShowChat);
|
||||
AppSettings.ShowOwnChat = val != null && val.Equals("1");
|
||||
|
||||
val = UserSettingsUtils.GetSettingValue(_Mandator.Settings, SettingsKeys.ShowAIVoice);
|
||||
AppSettings.ShowAIVoice = val != null && val.Equals("1");
|
||||
|
||||
val = UserSettingsUtils.GetSettingValue(_Mandator.Settings, SettingsKeys.ShowOwnChatSettings);
|
||||
AppSettings.ShowOwnChatSettings = val != null && val.Equals("1");
|
||||
@@ -568,8 +571,12 @@ namespace BeWo
|
||||
{
|
||||
_AppSettings.ServiceRecordAllowChangeHours = Convert.ToInt32(val);
|
||||
}
|
||||
|
||||
val = UserSettingsUtils.GetSettingValue(_Mandator.Settings, SettingsKeys.ShowServicesOverviewHalfOrWholeMonth);
|
||||
val = UserSettingsUtils.GetSettingValue(_Mandator.Settings, SettingsKeys.AiVoiceRequestInterval);
|
||||
if (val != null)
|
||||
{
|
||||
_AppSettings.AiVoiceRequestInterval = Convert.ToInt32(val);
|
||||
}
|
||||
val = UserSettingsUtils.GetSettingValue(_Mandator.Settings, SettingsKeys.ShowServicesOverviewHalfOrWholeMonth);
|
||||
AppSettings.ShowServicesOverviewHalfOrWholeMonth = val?.Equals("1") ?? false;
|
||||
|
||||
val = UserSettingsUtils.GetSettingValue(_Mandator.Settings, SettingsKeys.AllowGkvAbrechnung);
|
||||
|
||||
@@ -52,6 +52,8 @@ namespace BeWo.Core.Config
|
||||
|
||||
private FLSAnalysisConfigDC _DefaultFlsAnalysisConfig = null;
|
||||
|
||||
private int mAiVoiceRequestInterval = 5;
|
||||
|
||||
public enum WindowStateType
|
||||
{
|
||||
Default,
|
||||
@@ -395,6 +397,20 @@ namespace BeWo.Core.Config
|
||||
|
||||
}
|
||||
|
||||
public int AiVoiceRequestInterval
|
||||
{
|
||||
get { return mAiVoiceRequestInterval; }
|
||||
|
||||
set
|
||||
{
|
||||
if (mAiVoiceRequestInterval != value)
|
||||
{
|
||||
mAiVoiceRequestInterval = value;
|
||||
IsDirty = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int ServiceRecordAllowChangeHours
|
||||
{
|
||||
get { return mServiceRecordAllowChangeHours; }
|
||||
@@ -444,7 +460,7 @@ namespace BeWo.Core.Config
|
||||
public bool IsWohnheimAllowed { get; set; }
|
||||
|
||||
public bool ShowOwnChat { get; set; }
|
||||
|
||||
public bool ShowAIVoice { get; set; }
|
||||
public bool ShowOwnChatSettings { get; set; }
|
||||
|
||||
public bool IsMedicationAllowed { get; set; }
|
||||
|
||||
BIN
BeWo/Ressources/Icons/Icon_KI_Chat_Weiss_TEMP.png
Normal file
BIN
BeWo/Ressources/Icons/Icon_KI_Chat_Weiss_TEMP.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.3 KiB |
@@ -99,6 +99,7 @@ namespace BeWo.ServiceProxy
|
||||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.CheckObjectDeletionResultDC))]
|
||||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List<BS.Shared.DataContracts.ConfirmationReceiptSignatureDC>))]
|
||||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.ConfirmationReceiptSignatureDC))]
|
||||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.AiVoiceDataDC))]
|
||||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.DienstvertretungDC))]
|
||||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List<BS.Shared.DataContracts.DienstEintragDC>))]
|
||||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.DienstEintragDC))]
|
||||
@@ -478,6 +479,14 @@ namespace BeWo.ServiceProxy
|
||||
"", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BS.Shared.Core")]
|
||||
string CreateRtfDocumentFromTemplate(long vorlageOid, BS.Shared.TableID objectTid, System.Collections.Generic.List<long> objectOids);
|
||||
|
||||
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IOperationsService/StartAIVoice", ReplyAction="http://tempuri.org/IOperationsService/StartAIVoiceResponse")]
|
||||
[System.ServiceModel.FaultContractAttribute(typeof(BS.Shared.Core.BeWoFault), Action="http://tempuri.org/IOperationsService/StartAIVoiceBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BS.Shared.Core")]
|
||||
BS.Shared.DataContracts.AiVoiceDataDC StartAIVoice();
|
||||
|
||||
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IOperationsService/GetAIVoiceTranscript", ReplyAction="http://tempuri.org/IOperationsService/GetAIVoiceTranscriptResponse")]
|
||||
[System.ServiceModel.FaultContractAttribute(typeof(BS.Shared.Core.BeWoFault), Action="http://tempuri.org/IOperationsService/GetAIVoiceTranscriptBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BS.Shared.Core")]
|
||||
BS.Shared.DataContracts.AiVoiceDataDC GetAIVoiceTranscript(BS.Shared.DataContracts.AiVoiceDataDC data);
|
||||
|
||||
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IOperationsService/DeleteDienstvertretung2", ReplyAction="http://tempuri.org/IOperationsService/DeleteDienstvertretung2Response")]
|
||||
[System.ServiceModel.FaultContractAttribute(typeof(BS.Shared.Core.BeWoFault), Action="http://tempuri.org/IOperationsService/DeleteDienstvertretung2BeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BS.Shared.Core")]
|
||||
bool DeleteDienstvertretung2(long empId, long wohnId, int zeile, System.DateTime date, BS.Shared.DataContracts.DienstvertretungDC dienstvertretung, System.Collections.Generic.List<BS.Shared.DataContracts.DienstEintragDC> alleDiensteintraege, System.Collections.Generic.List<BS.Shared.DataContracts.DienstvertretungDC> alleDienstvertretungen, int day, System.DateTime pflichtStart, System.DateTime pflichtEnde);
|
||||
@@ -2068,6 +2077,16 @@ namespace BeWo.ServiceProxy
|
||||
return base.Channel.CreateRtfDocumentFromTemplate(vorlageOid, objectTid, objectOids);
|
||||
}
|
||||
|
||||
public BS.Shared.DataContracts.AiVoiceDataDC StartAIVoice()
|
||||
{
|
||||
return base.Channel.StartAIVoice();
|
||||
}
|
||||
|
||||
public BS.Shared.DataContracts.AiVoiceDataDC GetAIVoiceTranscript(BS.Shared.DataContracts.AiVoiceDataDC data)
|
||||
{
|
||||
return base.Channel.GetAIVoiceTranscript(data);
|
||||
}
|
||||
|
||||
public bool DeleteDienstvertretung2(long empId, long wohnId, int zeile, System.DateTime date, BS.Shared.DataContracts.DienstvertretungDC dienstvertretung, System.Collections.Generic.List<BS.Shared.DataContracts.DienstEintragDC> alleDiensteintraege, System.Collections.Generic.List<BS.Shared.DataContracts.DienstvertretungDC> alleDienstvertretungen, int day, System.DateTime pflichtStart, System.DateTime pflichtEnde)
|
||||
{
|
||||
return base.Channel.DeleteDienstvertretung2(empId, wohnId, zeile, date, dienstvertretung, alleDiensteintraege, alleDienstvertretungen, day, pflichtStart, pflichtEnde);
|
||||
|
||||
@@ -21,7 +21,8 @@
|
||||
xmlns:uc="clr-namespace:BeWo.Controls;assembly=BeWo.Controls"
|
||||
xmlns:val="clr-namespace:BeWo.Validation"
|
||||
xmlns:ve="http://schemas.devexpress.com/winfx/2008/xaml/docking/visualelements"
|
||||
xmlns:zeit="clr-namespace:BeWo.View.Detail.Zeiterfassung"
|
||||
xmlns:zeit="clr-namespace:BeWo.View.Detail.Zeiterfassung"
|
||||
xmlns:ai="clr-namespace:BeWo.AI.Controls"
|
||||
Width="Auto"
|
||||
Height="Auto"
|
||||
HorizontalAlignment="Stretch"
|
||||
@@ -1718,6 +1719,8 @@
|
||||
Content="A-"
|
||||
IsTabStop="False"
|
||||
TabIndex="999" />
|
||||
|
||||
<ai:VoiceToTextButtonControl Margin="3" TargetTextBox="{Binding ElementName=dokumentationsTextBox}"/>
|
||||
</DockPanel>
|
||||
|
||||
<Button
|
||||
|
||||
@@ -1781,4 +1781,32 @@ ALTER TABLE `CustomerVermittlungArbeit` ADD COLUMN Fallnummer VARCHAR(256) NULL
|
||||
|
||||
|
||||
ALTER TABLE `settings`
|
||||
CHANGE COLUMN `Value` `Value` MEDIUMTEXT NULL DEFAULT NULL ;
|
||||
CHANGE COLUMN `Value` `Value` MEDIUMTEXT NULL DEFAULT NULL ;
|
||||
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `AiVoiceData` (
|
||||
`Oid` bigint NOT NULL AUTO_INCREMENT,
|
||||
`Tid` int NOT NULL,
|
||||
`Notice` varchar(1024) DEFAULT NULL,
|
||||
`InsTs` datetime DEFAULT NULL,
|
||||
`InsUser` varchar(256) DEFAULT NULL,
|
||||
`Version` bigint DEFAULT NULL,
|
||||
`UdpUser` varchar(256) DEFAULT NULL,
|
||||
`UpdTs` datetime DEFAULT NULL,
|
||||
`IsActive` tinyint DEFAULT NULL,
|
||||
`SystemEntryID` int DEFAULT NULL,
|
||||
|
||||
|
||||
`ChangeType` tinyint NULL DEFAULT NULL,
|
||||
`OvertimeOid` bigint NULL DEFAULT NULL,
|
||||
`OvertimeEmployeeOid` bigint DEFAULT NULL,
|
||||
`OvertimeDatum` datetime DEFAULT NULL,
|
||||
`OvertimeBetrag` decimal(18,10) DEFAULT NULL,
|
||||
`OvertimeAuszahlungsartOid` bigint DEFAULT NULL,
|
||||
PRIMARY KEY (`Oid`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
||||
|
||||
|
||||
UPDATE `query` SET `SQL` = 'SELECT \np.LastName as \'Nachname\',\np.Firstname as \'Vorname\',\nc2s.ApprovedStartDate as \'Bewilligt von\',\nc2s.ApprovedEndDate as \'Bewilligt bis\',\nscat.Name as \'Kategorie\',\nDate_Format(sr.StartDate, \'%d.%m.%Y\') as \'Datum\',\nIF (Date_Format(sr.StartDate, \'%s\') <> \'00\', \'\', Date_Format(sr.StartDate, \'%H:%i\')) as \'von\',\nIF (Date_Format(sr.StartDate, \'%s\') <> \'00\', \'\', Date_Format(Date_Add(sr.StartDate, INTERVAL sr.Roundedduration MINUTE), \'%H:%i\')) as \'bis\',\nRound(sr.Roundedduration, 0) as \'Minuten\',\nsr.InsUser as \'Angelegt von\',\nDATE_FORMAT(sr.InsTs, \'%d.%m.%Y %H:%i\') as \'Angelegt am\',\n(select CONCAT(emp1p.`FirstName`, \' \', emp1p.`LastName`) from employee emp1 join `person` emp1p on emp1p.`Oid` = emp1.`PersonOid` where emp1.`Oid` in (select employeeoid from `employee2customer` e2c1 join `valuelistentry2object` vl2o on e2c1.`Oid` = vl2o.`ObjectOid` join `valuelistentry` vle on vl2o.`ValueListEntryOid` = vle.`Oid` where e2c1.`CustomerOid` = c.`Oid` and vle.`SystemEntryID` = 3) LIMIT 1) as \'Hauptbetreuung\',\n(select t.`Name` from team t where t.`Oid` in (select teamoid from `team2customer` t2c where t2c.`CustomerOid` = c.`Oid`) LIMIT 1) as \'Team\' \nFROM servicerecord sr\njoin costbearer2supportconcept c2s on sr.costbearer2supportconceptoid = c2s.oid\njoin supportconcept sc on c2s.supportconceptoid = sc.oid\njoin customer c on sc.customeroid = c.oid\njoin person p on c.personoid = p.oid\njoin servicedescription sd on sd.oid = sr.servicedescriptionoid\njoin servicecategory scat on scat.oid = sd.servicecategoryoid\nwhere sr.SignatureOID is null and\nscat.billable = true and\nsr.startdate >= \':Von\' and sr.startdate < \':bis\'\norder by p.Lastname, sr.startdate' WHERE (`Oid` = '4711');
|
||||
UPDATE `query` SET `SQL` = 'SELECT \np.LastName as \'Nachname\',\np.Firstname as \'Vorname\',\nc2s.ApprovedStartDate as \'Bewilligt von\',\nc2s.ApprovedEndDate as \'Bewilligt bis\',\nscat.Name as \'Kategorie\',\nDate_Format(sr.StartDate, \'%d.%m.%Y\') as \'Datum\',\nIF (Date_Format(sr.StartDate, \'%s\') <> \'00\', \'\', Date_Format(sr.StartDate, \'%H:%i\')) as \'von\',\nIF (Date_Format(sr.StartDate, \'%s\') <> \'00\', \'\', Date_Format(Date_Add(sr.StartDate, INTERVAL sr.Roundedduration MINUTE), \'%H:%i\')) as \'bis\',\nRound(sr.Roundedduration, 0) as \'Minuten\',\nsr.InsUser as \'Angelegt von\',\nDATE_FORMAT(sr.InsTs, \'%d.%m.%Y %H:%i\') as \'Angelegt am\',\n(select CONCAT(emp1p.`FirstName`, \' \', emp1p.`LastName`) from employee emp1 join `person` emp1p on emp1p.`Oid` = emp1.`PersonOid` where emp1.`Oid` in (select employeeoid from `employee2customer` e2c1 join `valuelistentry2object` vl2o on e2c1.`Oid` = vl2o.`ObjectOid` join `valuelistentry` vle on vl2o.`ValueListEntryOid` = vle.`Oid` where e2c1.`CustomerOid` = c.`Oid` and vle.`SystemEntryID` = 3) LIMIT 1) as \'Hauptbetreuung\',\n(select t.`Name` from team t where t.`Oid` in (select teamoid from `team2customer` t2c where t2c.`CustomerOid` = c.`Oid`) LIMIT 1) as \'Team\' \nFROM servicerecord sr\njoin costbearer2supportconcept c2s on sr.costbearer2supportconceptoid = c2s.oid\njoin supportconcept sc on c2s.supportconceptoid = sc.oid\njoin customer c on sc.customeroid = c.oid\njoin person p on c.personoid = p.oid\njoin servicedescription sd on sd.oid = sr.servicedescriptionoid\njoin servicecategory scat on scat.oid = sd.servicecategoryoid\nwhere sr.oid \nnot in (select servicerecordoid from confirmationreceiptsignature2servicerecord crs2s\njoin confirmationreceiptsignature crs on crs2s.confirmationreceiptsignatureoid = crs.oid where crs.employeeoid is null and crs.customeroid is not null) and\nscat.billable = true and\nsr.startdate >= \':Von\' and sr.startdate < \':bis\'\norder by p.Lastname, sr.startdate' WHERE (`Oid` = '4712');
|
||||
UPDATE `query` SET `SQL` = 'SELECT \np.LastName as \'Nachname\',\np.Firstname as \'Vorname\',\nc2s.ApprovedStartDate as \'Bewilligt von\',\nc2s.ApprovedEndDate as \'Bewilligt bis\',\nscat.Name as \'Kategorie\',\nDate_Format(sr.StartDate, \'%d.%m.%Y\') as \'Datum\',\nIF (Date_Format(sr.StartDate, \'%s\') <> \'00\', \'\', Date_Format(sr.StartDate, \'%H:%i\')) as \'von\',\nIF (Date_Format(sr.StartDate, \'%s\') <> \'00\', \'\', Date_Format(Date_Add(sr.StartDate, INTERVAL sr.Roundedduration MINUTE), \'%H:%i\')) as \'bis\',\nRound(sr.Roundedduration, 0) as \'Minuten\',\nsr.InsUser as \'Angelegt von\',\nDATE_FORMAT(sr.InsTs, \'%d.%m.%Y %H:%i\') as \'Angelegt am\',\n(select CONCAT(emp1p.`FirstName`, \' \', emp1p.`LastName`) from employee emp1 join `person` emp1p on emp1p.`Oid` = emp1.`PersonOid` where emp1.`Oid` in (select employeeoid from `employee2customer` e2c1 join `valuelistentry2object` vl2o on e2c1.`Oid` = vl2o.`ObjectOid` join `valuelistentry` vle on vl2o.`ValueListEntryOid` = vle.`Oid` where e2c1.`CustomerOid` = c.`Oid` and vle.`SystemEntryID` = 3) LIMIT 1) as \'Hauptbetreuung\',\n(select t.`Name` from team t where t.`Oid` in (select teamoid from `team2customer` t2c where t2c.`CustomerOid` = c.`Oid`) LIMIT 1) as \'Team\' \nFROM servicerecord sr\njoin costbearer2supportconcept c2s on sr.costbearer2supportconceptoid = c2s.oid\njoin supportconcept sc on c2s.supportconceptoid = sc.oid\njoin customer c on sc.customeroid = c.oid\njoin person p on c.personoid = p.oid\njoin servicedescription sd on sd.oid = sr.servicedescriptionoid\njoin servicecategory scat on scat.oid = sd.servicecategoryoid\nwhere sr.oid \nnot in (select servicerecordoid from confirmationreceiptsignature2servicerecord crs2s\njoin confirmationreceiptsignature crs on crs2s.confirmationreceiptsignatureoid = crs.oid where crs.employeeoid is not null and crs.customeroid is null) and\nscat.billable = true and\nsr.startdate >= \':Von\' and sr.startdate < \':bis\'\norder by p.Lastname, sr.startdate' WHERE (`Oid` = '4713');
|
||||
|
||||
@@ -4,6 +4,7 @@ using System.Configuration;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text.RegularExpressions;
|
||||
using BeWo.Data.Access;
|
||||
using BeWo.Data.Entities;
|
||||
using BeWo.Service.Configuration;
|
||||
@@ -15,6 +16,7 @@ namespace BeWo.Service.OwnChat
|
||||
{
|
||||
public class OwnChatHelper
|
||||
{
|
||||
|
||||
public static void StartOwnChatSync()
|
||||
{
|
||||
//if (AppSettings.CreateSettings().ShowChat)
|
||||
@@ -33,7 +35,7 @@ namespace BeWo.Service.OwnChat
|
||||
{
|
||||
try
|
||||
{
|
||||
var serverUrl = ErmittleServerURL(tenant);
|
||||
var serverUrl = ErmittleServerURL("1", tenant);
|
||||
|
||||
if (!String.IsNullOrEmpty(serverUrl))
|
||||
{
|
||||
@@ -63,30 +65,35 @@ namespace BeWo.Service.OwnChat
|
||||
|
||||
public static string ErmittleServerURL(string tenant)
|
||||
{
|
||||
//CB HACK solange App4 nicht geht:
|
||||
return GetUrlFromApp6(tenant);
|
||||
return ErmittleServerURL("1", tenant);
|
||||
}
|
||||
|
||||
public static string ErmittleServerURL(string typ, string tenant)
|
||||
{
|
||||
//CB HACK solange App4 nicht geht:
|
||||
#if !DEBUG
|
||||
return GetUrlFromApp6(typ, tenant);
|
||||
#endif
|
||||
try
|
||||
{
|
||||
|
||||
string url = "https://dict.ownchat.de/api/server/resolve/1/" + tenant;
|
||||
string url = String.Format("https://dict.ownchat.de/api/server/resolve/{0}/{1}", typ, tenant);
|
||||
|
||||
WebRequest request = WebRequest.Create(url);
|
||||
|
||||
request.Credentials = CredentialCache.DefaultCredentials;
|
||||
|
||||
WebResponse response = request.GetResponse();
|
||||
using (var response = request.GetResponse())
|
||||
{
|
||||
string responseFromServer = ReadStringFromResponse(response);
|
||||
|
||||
string responseFromServer = ReadStreamForChatCode(response);
|
||||
var definition = new { status = "", URL = "", SYNCTYPE = "" };
|
||||
|
||||
var definition = new { status = "", URL = "", SYNCTYPE = "" };
|
||||
var jsondaten = JsonConvert.DeserializeAnonymousType(responseFromServer, definition);
|
||||
|
||||
var jsondaten = JsonConvert.DeserializeAnonymousType(responseFromServer, definition);
|
||||
string serverUrl = jsondaten.URL;
|
||||
return serverUrl;
|
||||
}
|
||||
|
||||
string serverUrl = jsondaten.URL;
|
||||
response.Close();
|
||||
|
||||
return serverUrl;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -142,7 +149,7 @@ LG
|
||||
|
||||
#if DEBUG
|
||||
tenant = "4368658435";
|
||||
var serverUrl = OwnChatHelper.ErmittleServerURL(tenant);
|
||||
var serverUrl = OwnChatHelper.ErmittleServerURL("1", tenant);
|
||||
var apikey = "hNykpBwxE1Y6NmwZBTDQOpPXW6xCgnVHjJ5lh0QDQyCefgcnimC32aZ3CwB4qQl4";
|
||||
var userid = "1432790061";
|
||||
|
||||
@@ -190,20 +197,20 @@ LG
|
||||
|
||||
}
|
||||
|
||||
private static string GetUrlFromApp6(string tenant)
|
||||
private static string GetUrlFromApp6(string typ, string tenant)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
string url = "https://app6.bewoplaner.de/mobil/Chat/GetServerUrl?k=" + tenant;
|
||||
string url = String.Format("https://app6.bewoplaner.de/mobil/Chat/GetServerUrl?t={0}&k={1}", typ, tenant);
|
||||
|
||||
WebRequest request = WebRequest.Create(url);
|
||||
|
||||
|
||||
request.Credentials = CredentialCache.DefaultCredentials;
|
||||
|
||||
WebResponse response = request.GetResponse();
|
||||
|
||||
string responseFromServer = ReadStreamForChatCode(response);
|
||||
string responseFromServer = ReadStringFromResponse(response);
|
||||
|
||||
|
||||
return responseFromServer;
|
||||
@@ -215,23 +222,19 @@ LG
|
||||
|
||||
}
|
||||
|
||||
private static string ReadStreamForChatCode(WebResponse response)
|
||||
private static string ReadStringFromResponse(WebResponse response)
|
||||
{
|
||||
try
|
||||
{
|
||||
Stream dataStream = response.GetResponseStream();
|
||||
using (Stream dataStream = response.GetResponseStream())
|
||||
{
|
||||
using (StreamReader reader = new StreamReader(dataStream))
|
||||
{
|
||||
string responseFromServer = reader.ReadToEnd();
|
||||
|
||||
StreamReader reader = new StreamReader(dataStream);
|
||||
|
||||
string responseFromServer = reader.ReadToEnd();
|
||||
|
||||
dataStream.Dispose();
|
||||
reader.Dispose();
|
||||
|
||||
dataStream.Close();
|
||||
reader.Close();
|
||||
|
||||
return responseFromServer;
|
||||
return responseFromServer;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
||||
@@ -85,7 +85,7 @@ namespace BeWo.Service.Plugins
|
||||
//t = "4867997795"; // ADiK Kleve
|
||||
//t = "3184859776"; // Sergej Becker
|
||||
//t = "7752610643"; // BWK Gbr
|
||||
//t = "3785623125"; // Betreuwo
|
||||
t = "3785623125"; // Betreuwo
|
||||
//t = "7130228334"; // LH Borken
|
||||
//t = "4209820830"; // VKM Hamm
|
||||
//t = "5700328131"; // Betreutes Wohnen St. Ludgerus Essen-Werden
|
||||
@@ -226,7 +226,7 @@ namespace BeWo.Service.Plugins
|
||||
//t = "7817461089"; // FAB e.V. (Familienarbeit und Beratung e.V.)
|
||||
//t = "5207911843"; // Pro Balance
|
||||
//t = "8619663355"; // HSH Cologne
|
||||
//t = "1652658918"; // LH Frankfurt Oder
|
||||
t = "1652658918"; // LH Frankfurt Oder
|
||||
//t = "7696927868"; // Kuhring Betreuung
|
||||
//t = "6251348980"; // BeWo Gün
|
||||
//t = "6782533512"; // LH Dorsten
|
||||
|
||||
@@ -222,6 +222,8 @@
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="AI\AiVoiceData.cs" />
|
||||
<Compile Include="AI\TranscriptionService.cs" />
|
||||
<Compile Include="Attributes\RequireWcfAuthorizationAttribute.cs" />
|
||||
<Compile Include="Attributes\RequireApiAuthorizationAttribute.cs" />
|
||||
<Compile Include="BeWoServiceEnums.cs" />
|
||||
|
||||
@@ -1415,5 +1415,13 @@ namespace BeWo.Service.ServiceContracts
|
||||
[FaultContract(typeof(BeWoFault))]
|
||||
[OperationContract]
|
||||
String CreateRtfDocumentFromTemplate(long vorlageOid, TableID objectTid, List<long> objectOids);
|
||||
|
||||
[FaultContract(typeof(BeWoFault))]
|
||||
[OperationContract]
|
||||
AiVoiceDataDC StartAIVoice();
|
||||
|
||||
[FaultContract(typeof(BeWoFault))]
|
||||
[OperationContract]
|
||||
AiVoiceDataDC GetAIVoiceTranscript(AiVoiceDataDC data);
|
||||
}
|
||||
}
|
||||
@@ -42,6 +42,7 @@ using System.Collections.Specialized;
|
||||
using BeWo.ServiceUtils.History;
|
||||
|
||||
using SecurityUtils = BeWo.Service.Security.SecurityUtils;
|
||||
using BeWo.Service.AI;
|
||||
|
||||
namespace BeWo.Service.ServiceImplementations
|
||||
{
|
||||
@@ -9032,5 +9033,40 @@ namespace BeWo.Service.ServiceImplementations
|
||||
throw Utils.CreateBeWoFaultException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public AiVoiceDataDC StartAIVoice()
|
||||
{
|
||||
try
|
||||
{
|
||||
var s = PluginLoader.FindClass<TranscriptionService>();
|
||||
|
||||
var data = s.StartTranskription(PluginLoader.Tenant);
|
||||
return s.MapAiVoiceDataDC(data);
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw Utils.CreateBeWoFaultException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public AiVoiceDataDC GetAIVoiceTranscript(AiVoiceDataDC data)
|
||||
{
|
||||
try
|
||||
{
|
||||
var s = PluginLoader.FindClass<TranscriptionService>();
|
||||
|
||||
var avd = s.MapAiVoiceData(data);
|
||||
|
||||
var result = s.GetTranskription(avd);
|
||||
return s.MapAiVoiceDataDC(result);
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw Utils.CreateBeWoFaultException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
20
Service/ai/AiVoiceData.cs
Normal file
20
Service/ai/AiVoiceData.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BeWo.Service.AI
|
||||
{
|
||||
public class AiVoiceData
|
||||
{
|
||||
public String Result { get; set; }
|
||||
public String Status { get; set; }
|
||||
public String StatusMessage { get; set; }
|
||||
public String Error { get; set; }
|
||||
public String TranskriptionText { get; set; }
|
||||
public String Token { get; set; }
|
||||
public String UploadUrl { get; set; }
|
||||
public String ResultUrl { get; set; }
|
||||
}
|
||||
}
|
||||
206
Service/ai/TranscriptionService.cs
Normal file
206
Service/ai/TranscriptionService.cs
Normal file
@@ -0,0 +1,206 @@
|
||||
using BeWo.Data.Security;
|
||||
using BeWo.Service.OwnChat;
|
||||
using BS.Shared.DataContracts;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BeWo.Service.AI
|
||||
{
|
||||
public class TranscriptionService
|
||||
{
|
||||
public AiVoiceData StartTranskription(String tenant, String sprache = "de")
|
||||
{
|
||||
AiVoiceData avd = null;
|
||||
try
|
||||
{
|
||||
avd = GetTranskriptionToken(tenant, sprache);
|
||||
|
||||
if (!String.IsNullOrEmpty(avd.Token))
|
||||
{
|
||||
var url = String.Format("ownchat://voice/?token={0}", avd.Token);
|
||||
var msg = String.Format("Bitte klicken Sie auf folgenden Link um die Aufnahme zu starten:\n\n{0}", url);
|
||||
|
||||
OwnChatHelper.SendOwnChatMessage(msg, UserRightHelper.GetLoggedInUser().Employee);
|
||||
}
|
||||
|
||||
return avd;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
if (avd == null)
|
||||
{
|
||||
avd = new AiVoiceData();
|
||||
}
|
||||
avd.Error = e.Message;
|
||||
return avd;
|
||||
}
|
||||
}
|
||||
|
||||
public AiVoiceData GetTranskription(AiVoiceData avd)
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
if (!String.IsNullOrEmpty(avd.ResultUrl))
|
||||
{
|
||||
if (CheckValidUrl(avd.ResultUrl))
|
||||
{
|
||||
WebRequest request = WebRequest.Create(avd.ResultUrl);
|
||||
request.Credentials = CredentialCache.DefaultCredentials;
|
||||
|
||||
using (var response = request.GetResponse())
|
||||
{
|
||||
var responseString = ReadStringFromResponse(response);
|
||||
|
||||
var jsonDef = new { result = "", token = "", transcription = "", transcription_started_at = "", transcription_finished_at = "", state = "", callback_result = "" };
|
||||
|
||||
var json = JsonConvert.DeserializeAnonymousType(responseString, jsonDef);
|
||||
|
||||
avd.Result = json.result;
|
||||
avd.Token = json.token;
|
||||
avd.TranskriptionText = json.transcription;
|
||||
avd.Status = json.state;
|
||||
|
||||
if (json.result == "20" && json.state == "0")
|
||||
{
|
||||
avd.StatusMessage = "Um die Aufnahme zu starten, klicken Sie auf den Link, den wir an Ihren ownChat Account gesendet haben.";
|
||||
}
|
||||
else if (json.result == "0" && json.state == "10")
|
||||
{
|
||||
avd.StatusMessage = "Die Aufnahme wurde erfolgreich hochgeladen und wird gerade transkribiert";
|
||||
}
|
||||
else if (json.result == "0" && json.state == "20")
|
||||
{
|
||||
avd.StatusMessage = "Die Transkription läuft gerade";
|
||||
}
|
||||
else if (json.result == "0" && json.state == "30")
|
||||
{
|
||||
avd.StatusMessage = "Transkription erfolgreich abgeschlossen";
|
||||
}
|
||||
else
|
||||
{
|
||||
avd.StatusMessage = String.Format("Es ist leider ein Fehler aufgetreten: Result = {0}, Status = {1}", json.result, json.state);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return avd;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
avd.Error = e.Message;
|
||||
return avd;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private bool CheckValidUrl(String url)
|
||||
{
|
||||
string pattern = @"^https:\/\/.{1,3}\.ownsoft\.de\/.*$";
|
||||
|
||||
return Regex.IsMatch(url, pattern);
|
||||
}
|
||||
|
||||
private AiVoiceData GetTranskriptionToken(String tenant, String sprache)
|
||||
{
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
var serverUrl = OwnChatHelper.ErmittleServerURL("4", tenant);
|
||||
|
||||
if (!String.IsNullOrEmpty(serverUrl))
|
||||
{
|
||||
|
||||
var endurl = String.Format("{0}/api/token/{1}/{2}", serverUrl, sprache, tenant);
|
||||
|
||||
WebRequest request = WebRequest.Create(endurl);
|
||||
request.Credentials = CredentialCache.DefaultCredentials;
|
||||
|
||||
using (var response = request.GetResponse())
|
||||
{
|
||||
var responseString = ReadStringFromResponse(response);
|
||||
|
||||
var jsonDef = new { result = "", token = "", upload_url = "", result_url = "" };
|
||||
|
||||
var json = JsonConvert.DeserializeAnonymousType(responseString, jsonDef);
|
||||
|
||||
var avd = new AiVoiceData();
|
||||
avd.Result = json.result;
|
||||
avd.Token = json.token;
|
||||
avd.UploadUrl = json.upload_url;
|
||||
avd.ResultUrl = json.result_url;
|
||||
|
||||
return avd;
|
||||
}
|
||||
|
||||
}
|
||||
return null;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return null;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private string ReadStringFromResponse(WebResponse response)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (Stream dataStream = response.GetResponseStream())
|
||||
{
|
||||
using (StreamReader reader = new StreamReader(dataStream))
|
||||
{
|
||||
string responseFromServer = reader.ReadToEnd();
|
||||
|
||||
return responseFromServer;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public AiVoiceDataDC MapAiVoiceDataDC(AiVoiceData data)
|
||||
{
|
||||
return new AiVoiceDataDC
|
||||
{
|
||||
Error = data.Error,
|
||||
Result = data.Result,
|
||||
ResultUrl = data.ResultUrl,
|
||||
Status = data.Status,
|
||||
StatusMessage = data.StatusMessage,
|
||||
Token = data.Token,
|
||||
TranskriptionText = data.TranskriptionText,
|
||||
UploadUrl = data.UploadUrl
|
||||
};
|
||||
}
|
||||
|
||||
public AiVoiceData MapAiVoiceData(AiVoiceDataDC data)
|
||||
{
|
||||
return new AiVoiceData
|
||||
{
|
||||
Error = data.Error,
|
||||
Result = data.Result,
|
||||
ResultUrl = data.ResultUrl,
|
||||
Status = data.Status,
|
||||
StatusMessage = data.StatusMessage,
|
||||
Token = data.Token,
|
||||
TranskriptionText = data.TranskriptionText,
|
||||
UploadUrl = data.UploadUrl
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -50,12 +50,14 @@ namespace BS.Shared.Core
|
||||
public static string LastKassenSortOrder => "LastKassenSortOrder";
|
||||
public static string LastBewilligungSortOrder => "LastBewilligungSortOrder";
|
||||
public static string ServiceRecordAllowChangeHours => "ServiceRecordAllowChangeHours";
|
||||
public static string AiVoiceRequestInterval => "AiVoiceRequestInterval";
|
||||
public static string LetzteZeiterfassungsDauer => "LetzteZeiterfassungsDauer";
|
||||
public static string StartupPanelOrder => "StartupPanelOrder";
|
||||
public static string ShowMedication => "ShowMedication";
|
||||
public static string ShowScheduler => "ShowScheduler";
|
||||
public static string ShowWohnheime => "ShowWohnheime";
|
||||
public static string ShowChat => "ShowChat";
|
||||
public static string ShowAIVoice => "ShowAIVoice";
|
||||
public static string ShowOwnChatSettings => "ShowOwnChatSettings";
|
||||
public static string SetStartTimeToEndTimeAfterSave => "SetStartTimeToEndTimeAfterSave";
|
||||
public static string IsPasswordSecurityActiv => "IsPasswordSecurityActiv";
|
||||
|
||||
25
Shared/DataContracts/AiVoiceDataDC.cs
Normal file
25
Shared/DataContracts/AiVoiceDataDC.cs
Normal file
@@ -0,0 +1,25 @@
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace BS.Shared.DataContracts
|
||||
{
|
||||
[DataContract]
|
||||
public partial class AiVoiceDataDC : IDataContract
|
||||
{
|
||||
[DataMember]
|
||||
public string Result { get; set; }
|
||||
[DataMember]
|
||||
public string Status { get; set; }
|
||||
[DataMember]
|
||||
public string StatusMessage { get; set; }
|
||||
[DataMember]
|
||||
public string Error { get; set; }
|
||||
[DataMember]
|
||||
public string TranskriptionText { get; set; }
|
||||
[DataMember]
|
||||
public string Token { get; set; }
|
||||
[DataMember]
|
||||
public string UploadUrl { get; set; }
|
||||
[DataMember]
|
||||
public string ResultUrl { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -188,6 +188,7 @@
|
||||
<Compile Include="DataContracts\AdminService\IAdminServiceDC.cs" />
|
||||
<Compile Include="DataContracts\AdminService\AdminServiceSumReqDC.cs" />
|
||||
<Compile Include="DataContracts\IAbsenceTime.cs" />
|
||||
<Compile Include="DataContracts\AiVoiceDataDC.cs" />
|
||||
<Compile Include="DataContracts\Invoicing\GkvAbrechnung\GkvServerGetNumberRequestDC.cs" />
|
||||
<Compile Include="DataContracts\Invoicing\GkvAbrechnung\GkvServerGetNumberResponseDC.cs" />
|
||||
<Compile Include="DataContracts\Person2TeamDC.cs" />
|
||||
|
||||
Reference in New Issue
Block a user