新增MES模块,包含供应商、客户、车辆和地磅数据记录管理功能,支持免密接口和数据同步。更新相关控制器、实体、服务和数据库配置,优化权限管理和数据字典支持,确保系统的灵活性和可扩展性。

This commit is contained in:
geht
2026-04-30 15:28:20 +08:00
parent 142a0bdaba
commit b03cbeff9b
121 changed files with 10540 additions and 424 deletions

View File

@@ -0,0 +1,112 @@
<UserControl x:Class="YY.Admin.Views.SysManage.LoginSettingsView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:hc="https://handyorg.github.io/handycontrol"
xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:prism="http://prismlibrary.com/"
mc:Ignorable="d"
d:DesignHeight="560" d:DesignWidth="980"
prism:ViewModelLocator.AutoWireViewModel="True">
<Grid Style="{StaticResource BaseViewStyle}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Border Grid.Row="0" Margin="0,0,0,12">
<hc:UniformSpacingPanel Spacing="10">
<ToggleButton IsChecked="{Binding NeverExpire, Mode=TwoWay}" MinWidth="110" Height="32" Padding="12,0">
<TextBlock Text="永不过期"/>
</ToggleButton>
<Button Style="{StaticResource ButtonDefault}" Command="{Binding LoadCommand}">
<StackPanel Orientation="Horizontal">
<md:PackIcon Kind="Refresh"/>
<TextBlock Text="重新加载" Style="{StaticResource IconButtonStyle}"/>
</StackPanel>
</Button>
<Button Style="{StaticResource ButtonPrimary}" Command="{Binding SaveCommand}">
<StackPanel Orientation="Horizontal">
<md:PackIcon Kind="ContentSaveOutline"/>
<TextBlock Text="保存" Style="{StaticResource IconButtonStyle}"/>
</StackPanel>
</Button>
</hc:UniformSpacingPanel>
</Border>
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
<StackPanel MaxWidth="980">
<TextBlock TextWrapping="Wrap" Margin="0,0,0,16" Opacity="0.85"
Text="以下参数保存在本地库 sys_config 中,保存后立即影响新登录与当前会话的续期逻辑;检查间隔会立即应用到已运行的登录状态定时器。开启“永不过期”后,下方参数将锁定为只读,且系统不再弹出登录超时重新登录提示。"/>
<StackPanel IsEnabled="{Binding IsConfigEditable}">
<Border CornerRadius="4" Padding="16" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1">
<hc:Row>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=12, Lg=12, Xl=12}">
<TextBlock FontWeight="SemiBold" Text="会话与检查" Margin="0,0,0,8"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=6, Lg=6, Xl=6}">
<hc:NumericUpDown Value="{Binding TokenExpireMinutes, Mode=TwoWay}"
Minimum="5" Maximum="43200" DecimalPlaces="0"
hc:InfoElement.Title="Token 过期时间"
hc:InfoElement.TitleWidth="140"
hc:InfoElement.TitlePlacement="Left"
Style="{StaticResource NumericUpDownPlus}"
Margin="0,0,0,12"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=6, Lg=6, Xl=6}">
<hc:NumericUpDown Value="{Binding IdleExtendMinutes, Mode=TwoWay}"
Minimum="1" Maximum="1440" DecimalPlaces="0"
hc:InfoElement.Title="操作时续期阈值"
hc:InfoElement.TitleWidth="140"
hc:InfoElement.TitlePlacement="Left"
Style="{StaticResource NumericUpDownPlus}"
Margin="0,0,0,12"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=12, Lg=12, Xl=12}">
<TextBlock TextWrapping="Wrap" Opacity="0.75" Margin="0,-4,0,12"
Text="用户有鼠标或键盘操作时若距离过期不足「续期阈值」分钟则将过期时间重新延长为「Token 过期时间」整段。"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=6, Lg=6, Xl=6}">
<hc:NumericUpDown Value="{Binding CheckIntervalMinutes, Mode=TwoWay}"
Minimum="1" Maximum="120" DecimalPlaces="0"
hc:InfoElement.Title="状态检查间隔"
hc:InfoElement.TitleWidth="140"
hc:InfoElement.TitlePlacement="Left"
Style="{StaticResource NumericUpDownPlus}"
Margin="0,0,0,12"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=12, Lg=12, Xl=12}">
<TextBlock TextWrapping="Wrap" Opacity="0.75" Margin="0,-4,0,0"
Text="桌面端定时检查登录是否仍有效的间隔(分钟)。间隔越大,过期后提示可能越晚出现。"/>
</hc:Col>
</hc:Row>
</Border>
<Border CornerRadius="4" Padding="12" Margin="0,16,0,0" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1">
<hc:Row>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=12, Lg=12, Xl=12}">
<TextBlock FontWeight="SemiBold" Text="RefreshToken分钟" Margin="0,0,0,8"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=12, Lg=12, Xl=12}">
<hc:NumericUpDown Value="{Binding RefreshTokenExpireMinutes, Mode=TwoWay}"
Minimum="60" Maximum="999999" DecimalPlaces="0"
hc:InfoElement.Title="过期时间"
hc:InfoElement.TitleWidth="140"
hc:InfoElement.TitlePlacement="Left"
Style="{StaticResource NumericUpDownPlus}"
Margin="0,0,0,8"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=12, Lg=12, Xl=12}">
<TextBlock TextWrapping="Wrap" Opacity="0.75"
Text="与 Web 端约定一致,建议 ≥ 2 × Token 过期时间。当前桌面端内存会话主要受「Token 过期时间」控制,此项仍写入配置供扩展或对接使用。"/>
</hc:Col>
</hc:Row>
</Border>
</StackPanel>
</StackPanel>
</ScrollViewer>
</Grid>
</UserControl>

View File

@@ -0,0 +1,11 @@
using System.Windows.Controls;
namespace YY.Admin.Views.SysManage;
public partial class LoginSettingsView : UserControl
{
public LoginSettingsView()
{
InitializeComponent();
}
}

View File

@@ -0,0 +1,211 @@
<UserControl x:Class="YY.Admin.Views.SysManage.MenuManagementView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:hc="https://handyorg.github.io/handycontrol"
xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:core="clr-namespace:YY.Admin.Core;assembly=YY.Admin.Core"
xmlns:prism="http://prismlibrary.com/"
mc:Ignorable="d"
d:DesignHeight="600" d:DesignWidth="980"
prism:ViewModelLocator.AutoWireViewModel="True">
<Grid Style="{StaticResource BaseViewStyle}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Border Grid.Row="0" Margin="0,0,0,10">
<hc:UniformSpacingPanel Spacing="10">
<Button Style="{StaticResource ButtonPrimary}" Command="{Binding RefreshCommand}">
<StackPanel Orientation="Horizontal">
<md:PackIcon Kind="Refresh"/>
<TextBlock Text="刷新" Style="{StaticResource IconButtonStyle}"/>
</StackPanel>
</Button>
<Button Style="{StaticResource ButtonSuccess}" Command="{Binding AddRootCommand}">
<StackPanel Orientation="Horizontal">
<md:PackIcon Kind="FolderPlusOutline"/>
<TextBlock Text="新增根目录" Style="{StaticResource IconButtonStyle}"/>
</StackPanel>
</Button>
<Button Style="{StaticResource ButtonSuccess}" Command="{Binding AddChildCommand}">
<StackPanel Orientation="Horizontal">
<md:PackIcon Kind="FileTreeOutline"/>
<TextBlock Text="新增子级" Style="{StaticResource IconButtonStyle}"/>
</StackPanel>
</Button>
<Button Style="{StaticResource ButtonPrimary}" Command="{Binding SaveCommand}">
<StackPanel Orientation="Horizontal">
<md:PackIcon Kind="ContentSaveOutline"/>
<TextBlock Text="保存" Style="{StaticResource IconButtonStyle}"/>
</StackPanel>
</Button>
<Button Style="{StaticResource ButtonDanger}" Command="{Binding DeleteCommand}">
<StackPanel Orientation="Horizontal">
<md:PackIcon Kind="DeleteOutline"/>
<TextBlock Text="删除" Style="{StaticResource IconButtonStyle}"/>
</StackPanel>
</Button>
</hc:UniformSpacingPanel>
</Border>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="320" MinWidth="240"/>
<ColumnDefinition Width="12"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" CornerRadius="4" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" Padding="4">
<DockPanel LastChildFill="True">
<TextBlock DockPanel.Dock="Top" Margin="4,0,4,8" Text="菜单树(点击选中后在右侧编辑)" TextWrapping="Wrap" Opacity="0.85"/>
<ListBox ItemsSource="{Binding FlatRows}"
SelectedItem="{Binding SelectedRow, Mode=TwoWay}"
DisplayMemberPath="IndentTitle"
VirtualizingStackPanel.IsVirtualizing="True"/>
</DockPanel>
</Border>
<GridSplitter Grid.Column="1" Width="12" HorizontalAlignment="Stretch" Background="Transparent"/>
<ScrollViewer Grid.Column="2" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
<StackPanel>
<TextBlock Text="编辑区" FontWeight="SemiBold" Margin="0,0,0,8"/>
<TextBlock TextWrapping="Wrap" Margin="0,0,0,12" Opacity="0.75"
Text="桌面端左侧导航依赖「路径 / 组件 / 路由名」与 MenuTreeViewModel 中的路由映射。新增业务页时,请将「组件」填写为已在 Prism 中 RegisterForNavigation 的视图名(如 VehicleListView。"/>
<Border CornerRadius="4" Padding="8"
Visibility="{Binding HasEditor, Converter={StaticResource Boolean2VisibilityConverter}}">
<hc:Row DataContext="{Binding Editor}">
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=6, Lg=6, Xl=6}">
<hc:TextBox Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}"
hc:InfoElement.Title="菜单名称"
hc:InfoElement.TitleWidth="88"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.ShowClearButton="True"
Margin="0,0,0,10"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=6, Lg=6, Xl=6}">
<hc:ComboBox ItemsSource="{Binding DataContext.ParentOptions, RelativeSource={RelativeSource AncestorType=UserControl}}"
DisplayMemberPath="Value"
SelectedValuePath="Key"
SelectedValue="{Binding Pid, Mode=TwoWay}"
hc:InfoElement.Title="父级"
hc:InfoElement.TitleWidth="88"
hc:InfoElement.TitlePlacement="Left"
Margin="0,0,0,10"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=6, Lg=6, Xl=6}">
<hc:ComboBox ItemsSource="{Binding DataContext.MenuTypeList, RelativeSource={RelativeSource AncestorType=UserControl}}"
DisplayMemberPath="Key"
SelectedValuePath="Value"
SelectedValue="{Binding Type, Converter={StaticResource EnumToIntConverter}, ConverterParameter={x:Type core:MenuTypeEnum}}"
hc:InfoElement.Title="类型"
hc:InfoElement.TitleWidth="88"
hc:InfoElement.TitlePlacement="Left"
Margin="0,0,0,10"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=6, Lg=6, Xl=6}">
<hc:ComboBox ItemsSource="{Binding DataContext.StatusList, RelativeSource={RelativeSource AncestorType=UserControl}}"
DisplayMemberPath="Key"
SelectedValuePath="Value"
SelectedValue="{Binding Status, Converter={StaticResource EnumToIntConverter}, ConverterParameter={x:Type core:StatusEnum}}"
hc:InfoElement.Title="状态"
hc:InfoElement.TitleWidth="88"
hc:InfoElement.TitlePlacement="Left"
Margin="0,0,0,10"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=6, Lg=6, Xl=6}">
<hc:TextBox Text="{Binding OrderNo, UpdateSourceTrigger=PropertyChanged}"
hc:InfoElement.Title="排序号"
hc:InfoElement.TitleWidth="88"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.ShowClearButton="True"
Margin="0,0,0,10"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=6, Lg=6, Xl=6}">
<hc:TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"
hc:InfoElement.Title="路由名称"
hc:InfoElement.TitleWidth="88"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.ShowClearButton="True"
Margin="0,0,0,10"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=12, Lg=12, Xl=12}">
<hc:TextBox Text="{Binding Path, UpdateSourceTrigger=PropertyChanged}"
hc:InfoElement.Title="路径"
hc:InfoElement.TitleWidth="88"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.ShowClearButton="True"
Margin="0,0,0,10"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=12, Lg=12, Xl=12}">
<hc:TextBox Text="{Binding Component, UpdateSourceTrigger=PropertyChanged}"
hc:InfoElement.Title="组件/视图名"
hc:InfoElement.TitleWidth="88"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.ShowClearButton="True"
Margin="0,0,0,10"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=6, Lg=6, Xl=6}">
<hc:TextBox Text="{Binding Icon, UpdateSourceTrigger=PropertyChanged}"
hc:InfoElement.Title="图标"
hc:InfoElement.TitleWidth="88"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.ShowClearButton="True"
Margin="0,0,0,10"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=6, Lg=6, Xl=6}">
<hc:TextBox Text="{Binding Permission, UpdateSourceTrigger=PropertyChanged}"
hc:InfoElement.Title="权限标识"
hc:InfoElement.TitleWidth="88"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.ShowClearButton="True"
Margin="0,0,0,10"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=12, Lg=12, Xl=12}">
<hc:TextBox Text="{Binding Redirect, UpdateSourceTrigger=PropertyChanged}"
hc:InfoElement.Title="重定向"
hc:InfoElement.TitleWidth="88"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.ShowClearButton="True"
Margin="0,0,0,10"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=12, Lg=12, Xl=12}">
<hc:TextBox Text="{Binding Remark, UpdateSourceTrigger=PropertyChanged}"
hc:InfoElement.Title="备注"
hc:InfoElement.TitleWidth="88"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.ShowClearButton="True"
Margin="0,0,0,10"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=12, Lg=12, Xl=12}">
<hc:TextBox Text="{Binding OutLink, UpdateSourceTrigger=PropertyChanged}"
hc:InfoElement.Title="外链"
hc:InfoElement.TitleWidth="88"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.ShowClearButton="True"
Margin="0,0,0,10"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=4, Lg=4, Xl=4}">
<CheckBox Content="内嵌 IFrame" IsChecked="{Binding IsIframe}" Margin="0,6,0,0"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=4, Lg=4, Xl=4}">
<CheckBox Content="隐藏菜单" IsChecked="{Binding IsHide}" Margin="0,6,0,0"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=4, Lg=4, Xl=4}">
<CheckBox Content="固定页签" IsChecked="{Binding IsAffix}" Margin="0,6,0,0"/>
</hc:Col>
<hc:Col Layout="{hc:ColLayout Xs=12, Sm=12, Md=4, Lg=4, Xl=4}">
<CheckBox Content="缓存页面" IsChecked="{Binding IsKeepAlive}" Margin="0,6,0,0"/>
</hc:Col>
</hc:Row>
</Border>
</StackPanel>
</ScrollViewer>
</Grid>
</Grid>
</UserControl>

View File

@@ -0,0 +1,11 @@
using System.Windows.Controls;
namespace YY.Admin.Views.SysManage;
public partial class MenuManagementView : UserControl
{
public MenuManagementView()
{
InitializeComponent();
}
}

View File

@@ -28,18 +28,17 @@
<hc:ScrollViewer Grid.Row="1" IsInertiaEnabled="True">
<StackPanel x:Name="RootPanel" Margin="20 0 20 0">
<hc:Row Gutter="10">
<hc:Col Span="12" Visibility="{Binding IsAddMode, Converter={StaticResource Boolean2VisibilityConverter}}">
<hc:TextBox
<hc:Col Span="12">
<hc:TextBox
Text="{Binding SysUser.Account, UpdateSourceTrigger=PropertyChanged}"
hc:InfoElement.TitleWidth="70"
Margin="0,0,0,20"
hc:InfoElement.ShowClearButton="True"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.Placeholder="请输入账号"
hc:InfoElement.Title="账号"
hc:InfoElement.Necessary="True"
hc:InfoElement.Symbol="*"
hc:IsEnabled="{Binding IsAddMode}"/>
hc:InfoElement.Symbol="*"/>
</hc:Col>
<hc:Col Span="12" Visibility="{Binding IsAddMode, Converter={StaticResource Boolean2VisibilityConverter}}">
<hc:PasswordBox

View File

@@ -150,6 +150,14 @@
<TextBlock Text="新增" Style="{StaticResource IconButtonStyle}"/>
</StackPanel>
</Button>
<Button
Style="{StaticResource ButtonPrimary}"
Command="{Binding ManualUploadCommand}">
<StackPanel Orientation="Horizontal">
<md:PackIcon Kind="Upload"/>
<TextBlock Text="手动上传" Style="{StaticResource IconButtonStyle}"/>
</StackPanel>
</Button>
<Button
Style="{StaticResource ButtonDanger}"
IsEnabled="{Binding HasSelectedItems}"