From 80635aa46e4bd4366b3b1c701a314da608063b5e Mon Sep 17 00:00:00 2001 From: guohongshuang <379515420@qq.com> Date: Thu, 30 Apr 2026 11:34:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SamplePre.Common/ConcurrentQueueExt.cs | 75 ++ SamplePre.Common/Helper/ObjectCopyHelper.cs | 91 +++ .../Helper/ReflectionCommHelper.cs | 46 ++ .../Helper/XmlSerializerHelper.cs | 74 ++ SamplePre.Common/LoggerHelper.cs | 100 +++ SamplePre.Common/SamplePre.Common.csproj | 14 + SamplePre.Communication/CommEnum.cs | 43 ++ .../Communication/ICommunication.cs | 40 ++ .../Communication/ModbusTcpCommunicator.cs | 236 +++++++ .../Communication/S7PlcCommunicator.cs | 236 +++++++ .../Communication/S7PlcCommunicatorBack.cs | 424 +++++++++++ .../Communication/SocketClient.cs | 98 +++ .../CommunicationFactory.cs | 64 ++ .../SamplePre.Communication.csproj | 19 + SamplePre.DAL/DAL/LogDal.cs | 96 +++ SamplePre.DAL/DAL/SOPDal.cs | 72 ++ SamplePre.DAL/DAL/SampleSequenceDal.cs | 24 + SamplePre.DAL/DAL/SystemDal.cs | 59 ++ SamplePre.DAL/DBContext/DBFactory.cs | 108 +++ SamplePre.DAL/DBContext/DapperDBContext.cs | 27 + SamplePre.DAL/SamplePre.DAL.csproj | 22 + SamplePre.Models/Const/SystemConst.cs | 67 ++ SamplePre.Models/EnumType.cs | 26 + SamplePre.Models/Ext/LogQuery.cs | 19 + SamplePre.Models/Ext/LoginUserInfo.cs | 23 + SamplePre.Models/Ext/MenuNode.cs | 26 + SamplePre.Models/Ext/config_function_ext.cs | 17 + SamplePre.Models/Ext/config_role_ext.cs | 16 + SamplePre.Models/Ext/config_user_ext.cs | 16 + .../Ext/sample_exec_detail_ext.cs | 25 + SamplePre.Models/Ext/sample_exec_ext.cs | 17 + SamplePre.Models/Ext/sys_action_ext.cs | 15 + .../Ext/sys_action_parm_map_ext.cs | 23 + .../Ext/sys_standard_action_ext.cs | 27 + .../Ext/sys_standard_action_parm_ext.cs | 21 + SamplePre.Models/Ext/sys_standard_ext.cs | 38 + SamplePre.Models/Ext/tube_input_ext.cs | 40 ++ SamplePre.Models/Models/ComboBoxListItem.cs | 26 + SamplePre.Models/Models/SopDataInfo.cs | 18 + SamplePre.Models/Models/SysConfigData.cs | 84 +++ SamplePre.Models/Models/TreeListItem.cs | 20 + SamplePre.Models/SamplePre.Models.csproj | 22 + SamplePre.Models/Tables/QRcode.cs | 25 + SamplePre.Models/Tables/config_function.cs | 18 + SamplePre.Models/Tables/config_role.cs | 21 + .../Tables/config_role_permisson.cs | 20 + SamplePre.Models/Tables/config_user.cs | 25 + SamplePre.Models/Tables/config_user_role.cs | 20 + SamplePre.Models/Tables/run_log_info.cs | 30 + SamplePre.Models/Tables/sample_exec.cs | 22 + SamplePre.Models/Tables/sample_exec_detail.cs | 18 + SamplePre.Models/Tables/sample_record.cs | 26 + SamplePre.Models/Tables/sys_action.cs | 22 + .../Tables/sys_action_parm_map.cs | 21 + SamplePre.Models/Tables/sys_dict.cs | 19 + SamplePre.Models/Tables/sys_dict_class.cs | 18 + SamplePre.Models/Tables/sys_parm.cs | 25 + SamplePre.Models/Tables/sys_standard.cs | 19 + .../Tables/sys_standard_action.cs | 20 + .../Tables/sys_standard_action_parm.cs | 31 + SamplePre.Models/Tables/tube_input.cs | 24 + SamplePre.ProcessBll/BLL/ActionMangerBll.cs | 178 +++++ SamplePre.ProcessBll/BLL/CommunicationBll.cs | 80 +++ SamplePre.ProcessBll/BLL/MonitorBll.cs | 50 ++ SamplePre.ProcessBll/BLL/SOPManagerBll.cs | 518 ++++++++++++++ SamplePre.ProcessBll/BLL/SampleSequenceBll.cs | 539 ++++++++++++++ SamplePre.ProcessBll/BLL/SysParamBll.cs | 86 +++ SamplePre.ProcessBll/BLL/SystemBll.cs | 107 +++ .../ConfigManagerBLL/RolesBll.cs | 159 +++++ .../ConfigManagerBLL/UsersBll.cs | 176 +++++ .../SamplePre.ProcessBll.csproj | 22 + SamplePre.ViewModel/Class1.cs | 7 + .../SamplePre.ViewModel.csproj | 9 + SamplePreSystem.UI/Assets/App.png | Bin 0 -> 1357 bytes SamplePreSystem.UI/Assets/Warning.png | Bin 0 -> 905 bytes SamplePreSystem.UI/Assets/login.png | Bin 0 -> 163297 bytes SamplePreSystem.UI/Assets/progressBar.png | Bin 0 -> 50166 bytes SamplePreSystem.UI/Assets/分液1.png | Bin 0 -> 1040 bytes SamplePreSystem.UI/Assets/加液1.png | Bin 0 -> 955 bytes SamplePreSystem.UI/Assets/固相萃取1.png | Bin 0 -> 1948 bytes SamplePreSystem.UI/Assets/机器人1.png | Bin 0 -> 1673 bytes SamplePreSystem.UI/Assets/样品管理.png | Bin 0 -> 955 bytes SamplePreSystem.UI/Assets/氮吹1.png | Bin 0 -> 1608 bytes SamplePreSystem.UI/Assets/离心机1.png | Bin 0 -> 2402 bytes SamplePreSystem.UI/BaseControls/BaseWindow.cs | 156 +++++ .../BaseControls/PasswordAttaExt.cs | 86 +++ .../BaseControls/RingProgressBar.cs | 117 ++++ .../Behaviors/BorderMouseMoveBehavior.cs | 35 + .../Behaviors/DataGridDragBehavior.cs | 90 +++ .../Behaviors/TreeViewDragBehavior.cs | 85 +++ SamplePreSystem.UI/SamplePreSystem.UI.csproj | 77 ++ .../Styles/BaseButtonStyle.xaml | 59 ++ SamplePreSystem.UI/Styles/BaseDataGrid.xaml | 23 + SamplePreSystem.UI/Styles/BaseTreeView.xaml | 13 + .../Styles/BaseWindowStyle.xaml | 277 ++++++++ .../ViewModel/Child/ImportSampleViewModel.cs | 211 ++++++ .../ViewModel/Child/NewActionViewModel.cs | 120 ++++ .../Child/SelectParmListViewModel.cs | 218 ++++++ .../ConfigManager/PermissionViewModel.cs | 171 +++++ .../ViewModel/ConfigManager/RoleViewModel.cs | 154 ++++ .../ConfigManager/SysConfigMangerViewModel.cs | 253 +++++++ .../ViewModel/ConfigManager/TreeItemModel.cs | 80 +++ .../ViewModel/ConfigManager/UsersViewModel.cs | 286 ++++++++ .../ViewModel/Login/AppMainViewModel.cs | 118 ++++ .../ViewModel/Login/LoginViewModel.cs | 113 +++ .../ViewModel/Login/MenuBarFuc.cs | 20 + .../ViewModel/Login/UserInfoViewModel.cs | 72 ++ .../ViewModel/Monitor/FaultInfo.cs | 57 ++ .../ViewModel/Monitor/MonitorViewModel.cs | 549 +++++++++++++++ .../ViewModel/Monitor/UnitDetailViewModel.cs | 110 +++ .../ViewModel/Monitor/WorkUnit.cs | 149 ++++ .../QueryManager/SampleQueryViewModel.cs | 163 +++++ .../SampleManager/SampleExecViewModel.cs | 656 ++++++++++++++++++ .../SopManager/ActionManagerViewModel.cs | 255 +++++++ .../ViewModel/SopManager/DataGroup.cs | 18 + .../SopManager/ParamManagerViewModel.cs | 258 +++++++ .../SopManager/SopMangerViewModel.cs | 376 ++++++++++ .../Views/ConfigManager/RoleView.xaml | 119 ++++ .../Views/ConfigManager/RoleView.xaml.cs | 71 ++ .../ConfigManager/SysConfigMangerView.xaml | 211 ++++++ .../ConfigManager/SysConfigMangerView.xaml.cs | 37 + .../Views/ConfigManager/UsersView.xaml | 114 +++ .../Views/ConfigManager/UsersView.xaml.cs | 37 + .../chirld/NewDictClassWindow.xaml | 82 +++ .../chirld/NewDictClassWindow.xaml.cs | 46 ++ .../chirld/NewDictDetailWindow.xaml | 102 +++ .../chirld/NewDictDetailWindow.xaml.cs | 46 ++ .../ConfigManager/chirld/NewRoleWindow.xaml | 84 +++ .../chirld/NewRoleWindow.xaml.cs | 46 ++ .../ConfigManager/chirld/NewUserWindow.xaml | 146 ++++ .../chirld/NewUserWindow.xaml.cs | 56 ++ .../chirld/PermissionWindow.xaml | 76 ++ .../chirld/PermissionWindow.xaml.cs | 61 ++ .../Views/MainView/UserInfoWindow.xaml | 78 +++ .../Views/MainView/UserInfoWindow.xaml.cs | 39 ++ .../Views/MonitorManager/MonitorView.xaml | 489 +++++++++++++ .../Views/MonitorManager/MonitorView.xaml.cs | 36 + .../Views/MonitorManager/SopExecInfo.cs | 25 + .../chirld/SampleDetailWindow.xaml | 51 ++ .../chirld/SampleDetailWindow.xaml.cs | 29 + .../chirld/UnitDetailWindow.xaml | 47 ++ .../chirld/UnitDetailWindow.xaml.cs | 33 + .../Views/QueryManager/SampleQueryView.xaml | 148 ++++ .../QueryManager/SampleQueryView.xaml.cs | 34 + .../Views/SOPManager/ActionManagerView.xaml | 230 ++++++ .../SOPManager/ActionManagerView.xaml.cs | 43 ++ .../Views/SOPManager/ParamManagerView.xaml | 141 ++++ .../Views/SOPManager/ParamManagerView.xaml.cs | 37 + .../Views/SOPManager/SopManagerView.xaml | 385 ++++++++++ .../Views/SOPManager/SopManagerView.xaml.cs | 102 +++ .../SOPManager/chirld/NewActionWindow.xaml | 112 +++ .../SOPManager/chirld/NewActionWindow.xaml.cs | 53 ++ .../SOPManager/chirld/NewStandParmWindow.xaml | 139 ++++ .../chirld/NewStandParmWindow.xaml.cs | 52 ++ .../chirld/SelectParmListWindow.xaml | 93 +++ .../chirld/SelectParmListWindow.xaml.cs | 53 ++ .../Views/SampleManager/SampleExecView.xaml | 250 +++++++ .../SampleManager/SampleExecView.xaml.cs | 38 + .../chirld/ActionShowWindow.xaml | 90 +++ .../chirld/ActionShowWindow.xaml.cs | 46 ++ .../chirld/ImportSampleWindow.xaml | 144 ++++ .../chirld/ImportSampleWindow.xaml.cs | 52 ++ .../SampleManager/chirld/NewSampleWindow.xaml | 193 ++++++ .../chirld/NewSampleWindow.xaml.cs | 64 ++ SamplePreSystemApp.sln | 61 ++ SamplePreSystemApp/App.config | 18 + SamplePreSystemApp/App.xaml | 46 ++ SamplePreSystemApp/App.xaml.cs | 140 ++++ SamplePreSystemApp/AppMainView.xaml | 317 +++++++++ SamplePreSystemApp/AppMainView.xaml.cs | 280 ++++++++ SamplePreSystemApp/AssemblyInfo.cs | 10 + SamplePreSystemApp/Assets/app.ico | Bin 0 -> 9662 bytes SamplePreSystemApp/LoginWindow.xaml | 206 ++++++ SamplePreSystemApp/LoginWindow.xaml.cs | 51 ++ SamplePreSystemApp/NLog.config | 28 + .../Properties/Settings.Designer.cs | 38 + .../Properties/Settings.settings | 9 + SamplePreSystemApp/SamplePreSystemApp.csproj | 52 ++ SamplePreSystemApp/SystemConfig.xml | 17 + SamplePreSystemApp/Window1.xaml | 33 + SamplePreSystemApp/Window1.xaml.cs | 78 +++ 181 files changed, 16378 insertions(+) create mode 100644 SamplePre.Common/ConcurrentQueueExt.cs create mode 100644 SamplePre.Common/Helper/ObjectCopyHelper.cs create mode 100644 SamplePre.Common/Helper/ReflectionCommHelper.cs create mode 100644 SamplePre.Common/Helper/XmlSerializerHelper.cs create mode 100644 SamplePre.Common/LoggerHelper.cs create mode 100644 SamplePre.Common/SamplePre.Common.csproj create mode 100644 SamplePre.Communication/CommEnum.cs create mode 100644 SamplePre.Communication/Communication/ICommunication.cs create mode 100644 SamplePre.Communication/Communication/ModbusTcpCommunicator.cs create mode 100644 SamplePre.Communication/Communication/S7PlcCommunicator.cs create mode 100644 SamplePre.Communication/Communication/S7PlcCommunicatorBack.cs create mode 100644 SamplePre.Communication/Communication/SocketClient.cs create mode 100644 SamplePre.Communication/CommunicationFactory.cs create mode 100644 SamplePre.Communication/SamplePre.Communication.csproj create mode 100644 SamplePre.DAL/DAL/LogDal.cs create mode 100644 SamplePre.DAL/DAL/SOPDal.cs create mode 100644 SamplePre.DAL/DAL/SampleSequenceDal.cs create mode 100644 SamplePre.DAL/DAL/SystemDal.cs create mode 100644 SamplePre.DAL/DBContext/DBFactory.cs create mode 100644 SamplePre.DAL/DBContext/DapperDBContext.cs create mode 100644 SamplePre.DAL/SamplePre.DAL.csproj create mode 100644 SamplePre.Models/Const/SystemConst.cs create mode 100644 SamplePre.Models/EnumType.cs create mode 100644 SamplePre.Models/Ext/LogQuery.cs create mode 100644 SamplePre.Models/Ext/LoginUserInfo.cs create mode 100644 SamplePre.Models/Ext/MenuNode.cs create mode 100644 SamplePre.Models/Ext/config_function_ext.cs create mode 100644 SamplePre.Models/Ext/config_role_ext.cs create mode 100644 SamplePre.Models/Ext/config_user_ext.cs create mode 100644 SamplePre.Models/Ext/sample_exec_detail_ext.cs create mode 100644 SamplePre.Models/Ext/sample_exec_ext.cs create mode 100644 SamplePre.Models/Ext/sys_action_ext.cs create mode 100644 SamplePre.Models/Ext/sys_action_parm_map_ext.cs create mode 100644 SamplePre.Models/Ext/sys_standard_action_ext.cs create mode 100644 SamplePre.Models/Ext/sys_standard_action_parm_ext.cs create mode 100644 SamplePre.Models/Ext/sys_standard_ext.cs create mode 100644 SamplePre.Models/Ext/tube_input_ext.cs create mode 100644 SamplePre.Models/Models/ComboBoxListItem.cs create mode 100644 SamplePre.Models/Models/SopDataInfo.cs create mode 100644 SamplePre.Models/Models/SysConfigData.cs create mode 100644 SamplePre.Models/Models/TreeListItem.cs create mode 100644 SamplePre.Models/SamplePre.Models.csproj create mode 100644 SamplePre.Models/Tables/QRcode.cs create mode 100644 SamplePre.Models/Tables/config_function.cs create mode 100644 SamplePre.Models/Tables/config_role.cs create mode 100644 SamplePre.Models/Tables/config_role_permisson.cs create mode 100644 SamplePre.Models/Tables/config_user.cs create mode 100644 SamplePre.Models/Tables/config_user_role.cs create mode 100644 SamplePre.Models/Tables/run_log_info.cs create mode 100644 SamplePre.Models/Tables/sample_exec.cs create mode 100644 SamplePre.Models/Tables/sample_exec_detail.cs create mode 100644 SamplePre.Models/Tables/sample_record.cs create mode 100644 SamplePre.Models/Tables/sys_action.cs create mode 100644 SamplePre.Models/Tables/sys_action_parm_map.cs create mode 100644 SamplePre.Models/Tables/sys_dict.cs create mode 100644 SamplePre.Models/Tables/sys_dict_class.cs create mode 100644 SamplePre.Models/Tables/sys_parm.cs create mode 100644 SamplePre.Models/Tables/sys_standard.cs create mode 100644 SamplePre.Models/Tables/sys_standard_action.cs create mode 100644 SamplePre.Models/Tables/sys_standard_action_parm.cs create mode 100644 SamplePre.Models/Tables/tube_input.cs create mode 100644 SamplePre.ProcessBll/BLL/ActionMangerBll.cs create mode 100644 SamplePre.ProcessBll/BLL/CommunicationBll.cs create mode 100644 SamplePre.ProcessBll/BLL/MonitorBll.cs create mode 100644 SamplePre.ProcessBll/BLL/SOPManagerBll.cs create mode 100644 SamplePre.ProcessBll/BLL/SampleSequenceBll.cs create mode 100644 SamplePre.ProcessBll/BLL/SysParamBll.cs create mode 100644 SamplePre.ProcessBll/BLL/SystemBll.cs create mode 100644 SamplePre.ProcessBll/ConfigManagerBLL/RolesBll.cs create mode 100644 SamplePre.ProcessBll/ConfigManagerBLL/UsersBll.cs create mode 100644 SamplePre.ProcessBll/SamplePre.ProcessBll.csproj create mode 100644 SamplePre.ViewModel/Class1.cs create mode 100644 SamplePre.ViewModel/SamplePre.ViewModel.csproj create mode 100644 SamplePreSystem.UI/Assets/App.png create mode 100644 SamplePreSystem.UI/Assets/Warning.png create mode 100644 SamplePreSystem.UI/Assets/login.png create mode 100644 SamplePreSystem.UI/Assets/progressBar.png create mode 100644 SamplePreSystem.UI/Assets/分液1.png create mode 100644 SamplePreSystem.UI/Assets/加液1.png create mode 100644 SamplePreSystem.UI/Assets/固相萃取1.png create mode 100644 SamplePreSystem.UI/Assets/机器人1.png create mode 100644 SamplePreSystem.UI/Assets/样品管理.png create mode 100644 SamplePreSystem.UI/Assets/氮吹1.png create mode 100644 SamplePreSystem.UI/Assets/离心机1.png create mode 100644 SamplePreSystem.UI/BaseControls/BaseWindow.cs create mode 100644 SamplePreSystem.UI/BaseControls/PasswordAttaExt.cs create mode 100644 SamplePreSystem.UI/BaseControls/RingProgressBar.cs create mode 100644 SamplePreSystem.UI/Behaviors/BorderMouseMoveBehavior.cs create mode 100644 SamplePreSystem.UI/Behaviors/DataGridDragBehavior.cs create mode 100644 SamplePreSystem.UI/Behaviors/TreeViewDragBehavior.cs create mode 100644 SamplePreSystem.UI/SamplePreSystem.UI.csproj create mode 100644 SamplePreSystem.UI/Styles/BaseButtonStyle.xaml create mode 100644 SamplePreSystem.UI/Styles/BaseDataGrid.xaml create mode 100644 SamplePreSystem.UI/Styles/BaseTreeView.xaml create mode 100644 SamplePreSystem.UI/Styles/BaseWindowStyle.xaml create mode 100644 SamplePreSystem.UI/ViewModel/Child/ImportSampleViewModel.cs create mode 100644 SamplePreSystem.UI/ViewModel/Child/NewActionViewModel.cs create mode 100644 SamplePreSystem.UI/ViewModel/Child/SelectParmListViewModel.cs create mode 100644 SamplePreSystem.UI/ViewModel/ConfigManager/PermissionViewModel.cs create mode 100644 SamplePreSystem.UI/ViewModel/ConfigManager/RoleViewModel.cs create mode 100644 SamplePreSystem.UI/ViewModel/ConfigManager/SysConfigMangerViewModel.cs create mode 100644 SamplePreSystem.UI/ViewModel/ConfigManager/TreeItemModel.cs create mode 100644 SamplePreSystem.UI/ViewModel/ConfigManager/UsersViewModel.cs create mode 100644 SamplePreSystem.UI/ViewModel/Login/AppMainViewModel.cs create mode 100644 SamplePreSystem.UI/ViewModel/Login/LoginViewModel.cs create mode 100644 SamplePreSystem.UI/ViewModel/Login/MenuBarFuc.cs create mode 100644 SamplePreSystem.UI/ViewModel/Login/UserInfoViewModel.cs create mode 100644 SamplePreSystem.UI/ViewModel/Monitor/FaultInfo.cs create mode 100644 SamplePreSystem.UI/ViewModel/Monitor/MonitorViewModel.cs create mode 100644 SamplePreSystem.UI/ViewModel/Monitor/UnitDetailViewModel.cs create mode 100644 SamplePreSystem.UI/ViewModel/Monitor/WorkUnit.cs create mode 100644 SamplePreSystem.UI/ViewModel/QueryManager/SampleQueryViewModel.cs create mode 100644 SamplePreSystem.UI/ViewModel/SampleManager/SampleExecViewModel.cs create mode 100644 SamplePreSystem.UI/ViewModel/SopManager/ActionManagerViewModel.cs create mode 100644 SamplePreSystem.UI/ViewModel/SopManager/DataGroup.cs create mode 100644 SamplePreSystem.UI/ViewModel/SopManager/ParamManagerViewModel.cs create mode 100644 SamplePreSystem.UI/ViewModel/SopManager/SopMangerViewModel.cs create mode 100644 SamplePreSystem.UI/Views/ConfigManager/RoleView.xaml create mode 100644 SamplePreSystem.UI/Views/ConfigManager/RoleView.xaml.cs create mode 100644 SamplePreSystem.UI/Views/ConfigManager/SysConfigMangerView.xaml create mode 100644 SamplePreSystem.UI/Views/ConfigManager/SysConfigMangerView.xaml.cs create mode 100644 SamplePreSystem.UI/Views/ConfigManager/UsersView.xaml create mode 100644 SamplePreSystem.UI/Views/ConfigManager/UsersView.xaml.cs create mode 100644 SamplePreSystem.UI/Views/ConfigManager/chirld/NewDictClassWindow.xaml create mode 100644 SamplePreSystem.UI/Views/ConfigManager/chirld/NewDictClassWindow.xaml.cs create mode 100644 SamplePreSystem.UI/Views/ConfigManager/chirld/NewDictDetailWindow.xaml create mode 100644 SamplePreSystem.UI/Views/ConfigManager/chirld/NewDictDetailWindow.xaml.cs create mode 100644 SamplePreSystem.UI/Views/ConfigManager/chirld/NewRoleWindow.xaml create mode 100644 SamplePreSystem.UI/Views/ConfigManager/chirld/NewRoleWindow.xaml.cs create mode 100644 SamplePreSystem.UI/Views/ConfigManager/chirld/NewUserWindow.xaml create mode 100644 SamplePreSystem.UI/Views/ConfigManager/chirld/NewUserWindow.xaml.cs create mode 100644 SamplePreSystem.UI/Views/ConfigManager/chirld/PermissionWindow.xaml create mode 100644 SamplePreSystem.UI/Views/ConfigManager/chirld/PermissionWindow.xaml.cs create mode 100644 SamplePreSystem.UI/Views/MainView/UserInfoWindow.xaml create mode 100644 SamplePreSystem.UI/Views/MainView/UserInfoWindow.xaml.cs create mode 100644 SamplePreSystem.UI/Views/MonitorManager/MonitorView.xaml create mode 100644 SamplePreSystem.UI/Views/MonitorManager/MonitorView.xaml.cs create mode 100644 SamplePreSystem.UI/Views/MonitorManager/SopExecInfo.cs create mode 100644 SamplePreSystem.UI/Views/MonitorManager/chirld/SampleDetailWindow.xaml create mode 100644 SamplePreSystem.UI/Views/MonitorManager/chirld/SampleDetailWindow.xaml.cs create mode 100644 SamplePreSystem.UI/Views/MonitorManager/chirld/UnitDetailWindow.xaml create mode 100644 SamplePreSystem.UI/Views/MonitorManager/chirld/UnitDetailWindow.xaml.cs create mode 100644 SamplePreSystem.UI/Views/QueryManager/SampleQueryView.xaml create mode 100644 SamplePreSystem.UI/Views/QueryManager/SampleQueryView.xaml.cs create mode 100644 SamplePreSystem.UI/Views/SOPManager/ActionManagerView.xaml create mode 100644 SamplePreSystem.UI/Views/SOPManager/ActionManagerView.xaml.cs create mode 100644 SamplePreSystem.UI/Views/SOPManager/ParamManagerView.xaml create mode 100644 SamplePreSystem.UI/Views/SOPManager/ParamManagerView.xaml.cs create mode 100644 SamplePreSystem.UI/Views/SOPManager/SopManagerView.xaml create mode 100644 SamplePreSystem.UI/Views/SOPManager/SopManagerView.xaml.cs create mode 100644 SamplePreSystem.UI/Views/SOPManager/chirld/NewActionWindow.xaml create mode 100644 SamplePreSystem.UI/Views/SOPManager/chirld/NewActionWindow.xaml.cs create mode 100644 SamplePreSystem.UI/Views/SOPManager/chirld/NewStandParmWindow.xaml create mode 100644 SamplePreSystem.UI/Views/SOPManager/chirld/NewStandParmWindow.xaml.cs create mode 100644 SamplePreSystem.UI/Views/SOPManager/chirld/SelectParmListWindow.xaml create mode 100644 SamplePreSystem.UI/Views/SOPManager/chirld/SelectParmListWindow.xaml.cs create mode 100644 SamplePreSystem.UI/Views/SampleManager/SampleExecView.xaml create mode 100644 SamplePreSystem.UI/Views/SampleManager/SampleExecView.xaml.cs create mode 100644 SamplePreSystem.UI/Views/SampleManager/chirld/ActionShowWindow.xaml create mode 100644 SamplePreSystem.UI/Views/SampleManager/chirld/ActionShowWindow.xaml.cs create mode 100644 SamplePreSystem.UI/Views/SampleManager/chirld/ImportSampleWindow.xaml create mode 100644 SamplePreSystem.UI/Views/SampleManager/chirld/ImportSampleWindow.xaml.cs create mode 100644 SamplePreSystem.UI/Views/SampleManager/chirld/NewSampleWindow.xaml create mode 100644 SamplePreSystem.UI/Views/SampleManager/chirld/NewSampleWindow.xaml.cs create mode 100644 SamplePreSystemApp.sln create mode 100644 SamplePreSystemApp/App.config create mode 100644 SamplePreSystemApp/App.xaml create mode 100644 SamplePreSystemApp/App.xaml.cs create mode 100644 SamplePreSystemApp/AppMainView.xaml create mode 100644 SamplePreSystemApp/AppMainView.xaml.cs create mode 100644 SamplePreSystemApp/AssemblyInfo.cs create mode 100644 SamplePreSystemApp/Assets/app.ico create mode 100644 SamplePreSystemApp/LoginWindow.xaml create mode 100644 SamplePreSystemApp/LoginWindow.xaml.cs create mode 100644 SamplePreSystemApp/NLog.config create mode 100644 SamplePreSystemApp/Properties/Settings.Designer.cs create mode 100644 SamplePreSystemApp/Properties/Settings.settings create mode 100644 SamplePreSystemApp/SamplePreSystemApp.csproj create mode 100644 SamplePreSystemApp/SystemConfig.xml create mode 100644 SamplePreSystemApp/Window1.xaml create mode 100644 SamplePreSystemApp/Window1.xaml.cs diff --git a/SamplePre.Common/ConcurrentQueueExt.cs b/SamplePre.Common/ConcurrentQueueExt.cs new file mode 100644 index 0000000..5186a93 --- /dev/null +++ b/SamplePre.Common/ConcurrentQueueExt.cs @@ -0,0 +1,75 @@ +using System.Collections.Concurrent; +using System.Collections.Generic; + +namespace SamplePre.Common +{ + public class ConcurrentQueueExt + { + + private readonly ConcurrentQueue queue = new ConcurrentQueue(); + + public void Enqueue(T msgData) + { + if (msgData != null) + { + queue.Enqueue(msgData); + } + } + + //public void Enqueue(List msgDatas) + //{ + // if (msgDatas.IsNullOrEmpty()) return; + // foreach (var msgData in msgDatas) + // { + // queue.Enqueue(msgData); + // } + //} + + public T GetOne() + { + if (queue.TryDequeue(out T result)) + { + return result; + } + else + { + return default; + } + } + + public List GetAll() + { + List result = new List(); + int count = queue.Count; + if (count > 0) + { + for (int i = 0; i < count; i++) + { + if (queue.TryDequeue(out T t)) + { + result.Add(t); + } + } + } + return result; + } + + + public void Clear() + { + while (!queue.IsEmpty) + { + queue.TryDequeue(out _); + } + } + + public int Count + { + get + { + return queue.Count; + } + } + + } +} diff --git a/SamplePre.Common/Helper/ObjectCopyHelper.cs b/SamplePre.Common/Helper/ObjectCopyHelper.cs new file mode 100644 index 0000000..ca84f64 --- /dev/null +++ b/SamplePre.Common/Helper/ObjectCopyHelper.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Common.Helper +{ + /// + /// 实体对象复制工具类(反射实现) + /// 适配.NET Framework 4.8,支持同实体/不同实体间同名字段值复制(浅拷贝) + /// + public static class ObjectCopyHelper + { + /// + /// 核心方法:将源对象的同名字段值复制到目标对象 + /// + /// 源对象类型 + /// 目标对象类型 + /// 源对象(提供值) + /// 目标对象(接收值,需提前实例化) + /// 是否忽略属性名大小写(默认true:Name和name视为同一个) + /// 是否忽略源对象的null值(默认false:源null会覆盖目标值) + public static void CopyProperties(this TSource source, TTarget target, + bool ignoreCase = true, bool ignoreNull = false) + where TSource : class // 源对象不能为空引用类型 + where TTarget : class // 目标对象不能为空引用类型 + { + // 空值校验 + if (source == null) throw new ArgumentNullException(nameof(source), "源对象不能为null"); + if (target == null) throw new ArgumentNullException(nameof(target), "目标对象不能为null"); + + // 获取源对象和目标对象的属性信息(仅获取公共可读写属性) + PropertyInfo[] sourceProps = typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance); + PropertyInfo[] targetProps = typeof(TTarget).GetProperties(BindingFlags.Public | BindingFlags.Instance); + + // 遍历源对象的所有属性,匹配目标对象的同名字段 + foreach (PropertyInfo sourceProp in sourceProps) + { + // 跳过源对象中不可读的属性(无getter) + if (!sourceProp.CanRead) continue; + + // 获取源对象当前属性的值 + object sourceValue = sourceProp.GetValue(source, null); + + // 忽略源对象的null值(若开启该配置) + if (ignoreNull && sourceValue == null) continue; + + // 在目标对象中查找同名字段(支持忽略大小写) + PropertyInfo targetProp = Array.Find(targetProps, p => + string.Equals(p.Name, sourceProp.Name, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal)); + + // 目标对象无该属性/目标属性不可写/类型不匹配 → 跳过 + if (targetProp == null || !targetProp.CanWrite + || !sourceProp.PropertyType.IsAssignableFrom(targetProp.PropertyType)) + { + continue; + } + + // 给目标对象的属性赋值 + targetProp.SetValue(target, sourceValue, null); + } + } + + /// + /// 重载方法:快速复制(默认忽略大小写、不忽略null) + /// + public static void CopyProperties(this TSource source, TTarget target) + where TSource : class + where TTarget : class + { + CopyProperties(source, target, true, false); + } + + /// + /// 便捷方法:创建目标对象并完成复制(一步到位,无需提前实例化目标对象) + /// + public static TTarget CopyToNew(this TSource source, + bool ignoreCase = true, bool ignoreNull = false) + where TSource : class + where TTarget : class, new() // 目标对象必须有无参构造函数 + { + if (source == null) throw new ArgumentNullException(nameof(source)); + // 实例化目标对象并赋值 + TTarget target = new TTarget(); + source.CopyProperties(target, ignoreCase, ignoreNull); + return target; + } + } +} diff --git a/SamplePre.Common/Helper/ReflectionCommHelper.cs b/SamplePre.Common/Helper/ReflectionCommHelper.cs new file mode 100644 index 0000000..237b54e --- /dev/null +++ b/SamplePre.Common/Helper/ReflectionCommHelper.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Common +{ + public class ReflectionCommHelper + { + + /// + /// 根据属性名获取对象的属性值(支持公共/非公共属性) + /// + /// 目标对象(不能为null) + /// 属性名(大小写敏感) + /// 是否忽略大小写(默认false) + /// 属性值(不存在返回null) + public static object GetPropertyValue(object obj, string propertyName, bool ignoreCase = false) + { + // 空值校验 + if (obj == null) + throw new ArgumentNullException(nameof(obj), "目标对象不能为null"); + if (string.IsNullOrEmpty(propertyName)) + throw new ArgumentNullException(nameof(propertyName), "属性名不能为空"); + + // 获取对象类型 + Type type = obj.GetType(); + // 获取属性信息(BindingFlags控制是否查找非公共/实例成员) + PropertyInfo propInfo = type.GetProperty( + propertyName, + BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | + (ignoreCase ? BindingFlags.IgnoreCase : BindingFlags.Default) + ); + + // 属性不存在返回null + if (propInfo == null) + return null; + + // 获取属性值 + return propInfo.GetValue(obj); + } + + } +} diff --git a/SamplePre.Common/Helper/XmlSerializerHelper.cs b/SamplePre.Common/Helper/XmlSerializerHelper.cs new file mode 100644 index 0000000..9b80f84 --- /dev/null +++ b/SamplePre.Common/Helper/XmlSerializerHelper.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Serialization; + +namespace SamplePre.Common.Helper +{ + /// + /// XML序列化/反序列化工具类(强类型读取) + /// + public static class XmlSerializerHelper + { + /// + /// 从XML文件反序列化为指定类型的对象 + /// + /// 目标实体类型 + /// XML文件路径 + /// 实体对象 + public static T DeserializeFromXml(string filePath) where T : class, new() + { + // 检查文件是否存在 + if (!File.Exists(filePath)) + { + throw new FileNotFoundException("XML配置文件不存在", filePath); + } + + try + { + // 初始化序列化器 + XmlSerializer serializer = new XmlSerializer(typeof(T)); + // 读取文件并反序列化 + using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) + { + return serializer.Deserialize(fs) as T; + } + } + catch (Exception ex) + { + throw new Exception("XML反序列化失败,检查XML格式和实体类是否匹配", ex); + } + } + + /// + /// 将对象序列化为XML并保存到文件 + /// + /// 实体类型 + /// 实体对象 + /// 保存路径 + public static void SerializeToXml(T obj, string filePath) where T : class + { + if (obj == null) + { + throw new ArgumentNullException(nameof(obj), "序列化对象不能为null"); + } + + try + { + XmlSerializer serializer = new XmlSerializer(typeof(T)); + // 写入文件(UTF8编码,避免中文乱码) + using (StreamWriter sw = new StreamWriter(filePath, false, System.Text.Encoding.UTF8)) + { + serializer.Serialize(sw, obj); + } + } + catch (Exception ex) + { + throw new Exception("XML序列化失败", ex); + } + } + } +} diff --git a/SamplePre.Common/LoggerHelper.cs b/SamplePre.Common/LoggerHelper.cs new file mode 100644 index 0000000..4a473e9 --- /dev/null +++ b/SamplePre.Common/LoggerHelper.cs @@ -0,0 +1,100 @@ +using NLog; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Common +{ + /// + /// nLog使用帮助类 + /// + public class LoggerHelper + { + /// + /// 实例化nLog,即为获取配置文件相关信息(获取以当前正在初始化的类命名的记录器) + /// + private readonly NLog.Logger _logger = LogManager.GetCurrentClassLogger(); + + private static LoggerHelper _obj; + + public static LoggerHelper Logger + { + get => _obj ?? (new LoggerHelper()); + set => _obj = value; + } + + #region Debug,调试 + public void Debug(string msg) + { + _logger.Debug(msg); + } + + public void Debug(string msg, Exception err) + { + _logger.Debug(err, msg); + } + #endregion + + #region Info,信息 + public void Info(string msg) + { + _logger.Info(msg); + } + + public void Info(string msg, Exception err) + { + _logger.Info(err, msg); + } + #endregion + + #region Warn,警告 + public void Warn(string msg) + { + _logger.Warn(msg); + } + + public void Warn(string msg, Exception err) + { + _logger.Warn(err, msg); + } + #endregion + + #region Trace,追踪 + public void Trace(string msg) + { + _logger.Trace(msg); + } + + public void Trace(string msg, Exception err) + { + _logger.Trace(err, msg); + } + #endregion + + #region Error,错误 + public void Error(string msg) + { + _logger.Error(msg); + } + + public void Error(string msg, Exception err) + { + _logger.Error(err, msg); + } + #endregion + + #region Fatal,致命错误 + public void Fatal(string msg) + { + _logger.Fatal(msg); + } + + public void Fatal(string msg, Exception err) + { + _logger.Fatal(err, msg); + } + #endregion + } +} diff --git a/SamplePre.Common/SamplePre.Common.csproj b/SamplePre.Common/SamplePre.Common.csproj new file mode 100644 index 0000000..e32c1b7 --- /dev/null +++ b/SamplePre.Common/SamplePre.Common.csproj @@ -0,0 +1,14 @@ + + + + net8.0 + enable + enable + + + + + + + + diff --git a/SamplePre.Communication/CommEnum.cs b/SamplePre.Communication/CommEnum.cs new file mode 100644 index 0000000..305e23a --- /dev/null +++ b/SamplePre.Communication/CommEnum.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Communication +{ + + /// + /// 通讯协议类型枚举 + /// + public enum CommProtocolType + { + S7 = 0, + ModbusTcp = 1, + ModbusRtu = 2 + } + + /// + /// 通讯状态枚举 + /// + public enum CommunicationState + { + Disconnected = 0, + Connected = 1, + Connecting = 2, + Error = 3 + } + + /// + /// 通讯数据类型枚举 + /// + public enum CommDataType + { + Bit, // 位 + Byte, // 字节 + Int16, // 16位整数 + Int32, // 32位整数 + Float // 浮点型 + } + +} diff --git a/SamplePre.Communication/Communication/ICommunication.cs b/SamplePre.Communication/Communication/ICommunication.cs new file mode 100644 index 0000000..cb0fcef --- /dev/null +++ b/SamplePre.Communication/Communication/ICommunication.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Communication +{ + public interface ICommunication + { + + /// + /// 下发下位机指令 + /// + /// + /// + /// + /// + bool WriteArraysBtye(int Dbno, int start, T[] bytes); + + + + /// + /// 读取监控数据,读取数组 + /// + /// + ushort[] ReadArraysShort(int Dbno, int start, int lenth); + + + /// + /// 写入数据 + /// + /// 地址(如"M0.0", "DB1.DBW2") + /// 要写入的值 + /// 是否写入成功 + public bool WriteSingleData(string address, object value); + + + } +} diff --git a/SamplePre.Communication/Communication/ModbusTcpCommunicator.cs b/SamplePre.Communication/Communication/ModbusTcpCommunicator.cs new file mode 100644 index 0000000..7fd61cb --- /dev/null +++ b/SamplePre.Communication/Communication/ModbusTcpCommunicator.cs @@ -0,0 +1,236 @@ +using Modbus.Device; +using S7.Net; +using SamplePre.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Communication.Communication +{ + + public class ModbusTcpCommunicator : ICommunication, IDisposable + { + IModbusMaster _modbusMaster = null; + TcpClient _tcpClient = null; + private readonly string _ipAddress; + private readonly int _port; + + + /// + /// 是否连接 + /// + private bool _isConnected = false; + + /// + /// 是否连接 + /// + public bool IsConnected + { + get => _isConnected; + set + { + if (_isConnected != value) + { + _isConnected = value; + ConnectionStatusChanged?.Invoke(value); + } + } + } + + /// + /// 连接状态变化事件 + /// + public event Action ConnectionStatusChanged; + + /// + /// 构造函数 + /// + /// IP地址 + /// 端口号 + public ModbusTcpCommunicator(string ipAddress, int port=502) + { + + try + { + _ipAddress = ipAddress; + _port = port; + + _tcpClient = new TcpClient(ipAddress, port);//Modbus主设备 + + _modbusMaster = ModbusIpMaster.CreateIp(_tcpClient); + _modbusMaster.Transport.ReadTimeout = 2000; + _modbusMaster.Transport.Retries = 3; + + IsConnected = true; + } + catch (Exception ex) + { + LoggerHelper.Logger.Error("初始化ModbusTcpCommunicator失败!" + ex.Message); + + } + + } + + /// + /// 连接PLC + /// + /// 是否连接成功 + public bool Connect() + { + try + { + if (IsConnected) + { + LoggerHelper.Logger.Info("已经处于连接状态!"); + return true; + } + + // 如果之前的连接对象已释放,创建新的 + if (_modbusMaster == null) + { + _tcpClient = new TcpClient(_ipAddress, _port);//Modbus主设备 + + _modbusMaster = ModbusIpMaster.CreateIp(_tcpClient); + _modbusMaster.Transport.ReadTimeout = 2000; // + _modbusMaster.Transport.Retries = 3; + + + } + + + + LoggerHelper.Logger.Info("PLC连接成功"); + IsConnected = true; + + return IsConnected; + } + catch (Exception ex) + { + + LoggerHelper.Logger.Info($"连接PLC失败: {ex.Message}"); + IsConnected = false; + + return false; + } + } + + /// + /// 断开连接 + /// + public void Disconnect() + { + try + { + if (IsConnected) + { + + _modbusMaster.Dispose(); + _tcpClient.Close(); + + IsConnected = false; + LoggerHelper.Logger.Info("PLC连接已断开"); + + } + } + catch (Exception ex) + { + LoggerHelper.Logger.Info($"断开PLC连接失败: {ex.Message}"); + } + } + + + + /// + /// 写入数组数据 + /// + /// + /// + /// + /// + public bool WriteArraysBtye(int Dbno, int start, T[] data) + { + + + try + { + if (!IsConnected && !Connect()) + { + return false; + } + + ushort[] ushorts = data.Cast().ToArray(); + + _modbusMaster.WriteMultipleRegisters((byte)Dbno, (ushort)start, ushorts); + + + return true; + } + catch (Exception ex) + { + LoggerHelper.Logger.Info($"写入数组失败: {ex.Message}"); + return false; + } + + + + + } + + + /// + /// 读取数组 + /// + /// + public ushort[] ReadArraysShort(int Dbno, int start, int lenth) + { + + //try + //{ + // if (!IsConnected && !Connect()) + // { + // return null; + // } + + // //public object? Read(DataType dataType, int db, int startByteAdr, VarType varType, int varCount, byte bitAdr = 0) + // ushort[] datas = _plc.Read(DataType.DataBlock, Dbno, start, VarType.Word, lenth) as ushort[]; + // return datas; + //} + //catch (Exception ex) + //{ + + // LoggerHelper.Logger.Info($"读取数组失败: {ex.Message}"); + // return null; + //} + + return null; + + + } + + + /// + /// 释放资源 + /// + public void Dispose() + { + // 释放托管资源 + Disconnect(); + + } + + public bool WriteSingleData(string address, object value) + { + throw new NotImplementedException(); + } + + ~ModbusTcpCommunicator() + { + Dispose(); + } + + } + +} diff --git a/SamplePre.Communication/Communication/S7PlcCommunicator.cs b/SamplePre.Communication/Communication/S7PlcCommunicator.cs new file mode 100644 index 0000000..0831148 --- /dev/null +++ b/SamplePre.Communication/Communication/S7PlcCommunicator.cs @@ -0,0 +1,236 @@ + +using S7.Net; +using S7.Net.Types; +using SamplePre.Common; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +namespace SamplePre.Communication +{ + public class S7PlcCommunicator : ICommunication, IDisposable + { + public Plc _plc; + private readonly string _ipAddress; + private readonly int _rack; + private readonly int _slot; + private readonly CpuType _cpuType; + + /// + /// 是否连接 + /// + private bool _isConnected = false; + + /// + /// 是否连接 + /// + public bool IsConnected + { + get => _isConnected; + set + { + if (_isConnected != value) + { + _isConnected = value; + ConnectionStatusChanged?.Invoke(value); + } + } + } + + /// + /// 连接状态变化事件 + /// + public event Action ConnectionStatusChanged; + + /// + /// 构造函数 + /// + /// PLC型号 + /// IP地址 + /// 机架号 + /// 插槽号 + public S7PlcCommunicator(CpuType cpuType, string ipAddress, int rack = 0, int slot = 1) + { + _cpuType = cpuType; + _ipAddress = ipAddress; + _rack = rack; + _slot = slot; + _plc = new Plc(cpuType, ipAddress, (short)rack, (short)slot); + } + + /// + /// 连接PLC + /// + /// 是否连接成功 + public bool Connect() + { + try + { + if (IsConnected) + { + LoggerHelper.Logger.Info("已经处于连接状态!"); + return true; + } + + // 如果之前的连接对象已释放,创建新的 + if (_plc == null) + { + _plc = new Plc(_cpuType, _ipAddress, (short)_rack, (short)_slot); + } + + _plc.Open(); + bool connected = _plc.IsConnected; + LoggerHelper.Logger.Info(connected ? "PLC连接成功" : "PLC连接失败"); + IsConnected = connected; + + return connected; + } + catch (Exception ex) + { + + LoggerHelper.Logger.Info($"连接PLC失败: {ex.Message}"); + IsConnected = false; + + return false; + } + } + + /// + /// 断开连接 + /// + public void Disconnect() + { + try + { + if (IsConnected) + { + _plc.Close(); + IsConnected = false; + LoggerHelper.Logger.Info("PLC连接已断开"); + + } + } + catch (Exception ex) + { + LoggerHelper.Logger.Info($"断开PLC连接失败: {ex.Message}"); + } + } + + /// + /// 写入数组数据 + /// + /// + /// + /// + /// + public bool WriteArraysBtye(int Dbno, int start, T[] bytes) + { + + try + { + if (!IsConnected && !Connect()) + { + return false; + } + + byte[] data = bytes.Cast().ToArray(); + + + _plc.WriteBytes(DataType.DataBlock, Dbno, start, data); + + return true; + } + catch (Exception ex) + { + LoggerHelper.Logger.Info($"写入数组失败: {ex.Message}"); + return false; + } + + + + + } + + + /// + /// 读取数组 + /// + /// + public ushort[] ReadArraysShort(int Dbno,int start,int lenth) + { + + try + { + if (!IsConnected && !Connect()) + { + return null; + } + + //public object? Read(DataType dataType, int db, int startByteAdr, VarType varType, int varCount, byte bitAdr = 0) + ushort[] datas = _plc.Read(DataType.DataBlock, Dbno, start, VarType.Word, lenth) as ushort[]; + return datas; + } + catch (Exception ex) + { + + LoggerHelper.Logger.Info($"读取数组失败: {ex.Message}"); + return null; + } + + + + + } + + + /// + /// 写入数据 + /// + /// 地址(如"M0.0", "DB1.DBW2") + /// 要写入的值 + /// 是否写入成功 + public bool WriteSingleData(string address, object value) + { + try + { + if (!IsConnected && !Connect()) + { + return false; + } + + _plc.Write(address, value); + Console.WriteLine($"写入 {address} 成功: {value}"); + return true; + } + catch (Exception ex) + { + Console.WriteLine($"写入 {address} 失败: {ex.Message}"); + return false; + } + } + + + /// + /// 释放资源 + /// + public void Dispose() + { + // 释放托管资源 + Disconnect(); + //_plc?.Dispose(); + _plc = null; + } + + ~S7PlcCommunicator() + { + Dispose(); + } + + } + + +} diff --git a/SamplePre.Communication/Communication/S7PlcCommunicatorBack.cs b/SamplePre.Communication/Communication/S7PlcCommunicatorBack.cs new file mode 100644 index 0000000..a06b100 --- /dev/null +++ b/SamplePre.Communication/Communication/S7PlcCommunicatorBack.cs @@ -0,0 +1,424 @@ + +using S7.Net; +using S7.Net.Types; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +namespace SamplePre.Communication +{ + public class S7PlcCommunicatorBack : IDisposable + { + public Plc _plc; + private readonly string _ipAddress; + private readonly int _rack; + private readonly int _slot; + private readonly CpuType _cpuType; + + /// + /// 是否连接 + /// + public bool IsConnected => _plc?.IsConnected ?? false; + + /// + /// 连接状态变化事件 + /// + public event Action ConnectionStatusChanged; + + /// + /// 构造函数 + /// + /// PLC型号 + /// IP地址 + /// 机架号 + /// 插槽号 + public S7PlcCommunicatorBack(CpuType cpuType, string ipAddress, int rack = 0, int slot = 1) + { + _cpuType = cpuType; + _ipAddress = ipAddress; + _rack = rack; + _slot = slot; + _plc = new Plc(cpuType, ipAddress, (short)rack, (short)slot); + } + + /// + /// 连接PLC + /// + /// 是否连接成功 + public bool Connect() + { + try + { + if (IsConnected) + { + Console.WriteLine("已经处于连接状态"); + return true; + } + + // 如果之前的连接对象已释放,创建新的 + if (_plc == null) + { + _plc = new Plc(_cpuType, _ipAddress, (short)_rack, (short)_slot); + } + + _plc.Open(); + bool connected = _plc.IsConnected; + Console.WriteLine(connected ? "PLC连接成功" : "PLC连接失败"); + ConnectionStatusChanged?.Invoke(connected); + return connected; + } + catch (Exception ex) + { + Console.WriteLine($"连接PLC失败: {ex.Message}"); + ConnectionStatusChanged?.Invoke(false); + return false; + } + } + + /// + /// 断开连接 + /// + public void Disconnect() + { + try + { + if (IsConnected) + { + _plc.Close(); + Console.WriteLine("PLC连接已断开"); + ConnectionStatusChanged?.Invoke(false); + } + } + catch (Exception ex) + { + Console.WriteLine($"断开PLC连接失败: {ex.Message}"); + } + } + + + + /// + /// 读取数据 + /// + /// 地址(如"M0.0", "DB1.DBW2") + /// 读取的值 + public object ReadData(string address) + { + try + { + if (!IsConnected && !Connect()) + { + return null; + } + + object value = _plc.Read(address); + Console.WriteLine($"a读取 {address} 成功: {value}"); + return value; + } + catch (Exception ex) + { + Console.WriteLine($"读取 {address} 失败: {ex.Message}"); + return null; + } + + + + } + + /// + /// 写入数据 + /// + /// 地址(如"M0.0", "DB1.DBW2") + /// 要写入的值 + /// 是否写入成功 + public bool WriteData(string address, object value) + { + try + { + if (!IsConnected && !Connect()) + { + return false; + } + + _plc.Write(address, value); + Console.WriteLine($"写入 {address} 成功: {value}"); + return true; + } + catch (Exception ex) + { + Console.WriteLine($"写入 {address} 失败: {ex.Message}"); + return false; + } + } + + /// + /// 批量读取数据 + /// + /// 地址数组 + /// 值数组,与地址数组顺序对应 + public object[] ReadMultipleData(string[] addresses) + { + if (addresses == null || addresses.Length == 0) + return new object[0]; + + try + { + if (!IsConnected && !Connect()) + { + return null; + } + + var values = new object[addresses.Length]; + for (int i = 0; i < addresses.Length; i++) + { + values[i] = _plc.Read(addresses[i]); + } + Console.WriteLine($"批量读取 {addresses.Length} 个地址成功"); + return values; + } + catch (Exception ex) + { + Console.WriteLine($"批量读取失败: {ex.Message}"); + return null; + } + } + + /// + /// 写入数组数据 + /// + /// + /// + /// + /// + public bool WriteArraysBtye(int Dbno, int start, byte[] bytes) + { + + try + { + if (!IsConnected && !Connect()) + { + return false; + } + + + _plc.WriteBytes(DataType.DataBlock, Dbno, start, bytes); + + return true; + } + catch (Exception ex) + { + Console.WriteLine($"写入数组: {ex.Message}"); + return false; + } + + + + + } + + + /// + /// 读取数组 + /// + /// + public ushort[] ReadArraysShort(int Dbno,int start,int lenth) + { + + try + { + if (!IsConnected && !Connect()) + { + return null; + } + + //public object? Read(DataType dataType, int db, int startByteAdr, VarType varType, int varCount, byte bitAdr = 0) + ushort[] datas = _plc.Read(DataType.DataBlock, Dbno, start, VarType.Word, lenth) as ushort[]; + return datas; + } + catch (Exception ex) + { + Console.WriteLine($"读取数组: {ex.Message}"); + return null; + } + + + + + } + + + + + /// + /// 读结构体 + /// + public T ReadStruct(int dbno, int start) + { + + T t; + try + { + if (!IsConnected && !Connect()) + { + return default(T); + } + + + t = (T)_plc.ReadStruct(typeof(T), dbno, start); + return t; + } + catch (Exception) + { + + Console.WriteLine($"读结构体失败!"); + return default(T); + } + + } + + /// + /// 写结构体 + /// + public bool WriteStruct(T t,int dbno,int start) + { + + try + { + if (!IsConnected && !Connect()) + { + return false; + } + + _plc.WriteStruct(t, dbno, start); + return true; + } + catch (Exception) + { + + Console.WriteLine($"写入失败!"); + return false; + } + + } + /// + /// 读取字符串 + /// + /// + /// + /// + public string ReadString(int DBno, int startNo) + { + + try + { + if (!IsConnected && !Connect()) + { + return ""; + } + + int totalLenth = (byte)_plc.Read(S7.Net.DataType.DataBlock, DBno, startNo, VarType.Byte, 1); + int len = (byte)_plc.Read(S7.Net.DataType.DataBlock, DBno, startNo + 1, VarType.Byte, 1); + byte[] bytes = _plc.ReadBytes(S7.Net.DataType.DataBlock, DBno, startNo + 2, len); + string mesg = Encoding.ASCII.GetString(bytes); + + + return mesg; + } + catch (Exception ex) + { + Console.WriteLine($"读取字符串失败!"); + return ""; + } + + + } + + + /// + /// 写入字符串 + /// + /// + /// + /// + /// + public bool WriteString(int DBno,int startNo, string contextStr) + { + + try + { + if (!IsConnected && !Connect()) + { + return false; + } + + _plc.Write(S7.Net.DataType.DataBlock, DBno, startNo + 1, (byte)contextStr.Length); + _plc.Write(S7.Net.DataType.DataBlock, DBno, startNo + 2, contextStr); + + Console.WriteLine($"写入字符串成功!"); + return true; + } + catch (Exception ex) + { + Console.WriteLine($"写入字符串失败!"); + return false; + } + + + } + + + /// + /// 写入bool + /// + /// + /// + /// + /// + public bool WriteBoolen(int DBno, int startByteAdr, int bitAdr, bool val) + { + + try + { + if (!IsConnected && !Connect()) + { + return false; + } + + _plc.WriteBit(DataType.DataBlock, DBno, startByteAdr, bitAdr, val); + + + Console.WriteLine($"写入成功!"); + return true; + } + catch (Exception ex) + { + Console.WriteLine($"写入失败!"); + return false; + } + + + } + + /// + /// 释放资源 + /// + public void Dispose() + { + Disconnect(); + //_plc?.Dispose(); + _plc = null; + } + } + + struct TestA + { + public ushort value1; + public ushort value2; + } + + +} diff --git a/SamplePre.Communication/Communication/SocketClient.cs b/SamplePre.Communication/Communication/SocketClient.cs new file mode 100644 index 0000000..cb54a78 --- /dev/null +++ b/SamplePre.Communication/Communication/SocketClient.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Communication.Communication +{ + public class SocketClient + { + // 服务端 IP 和端口(和你服务端一致) + private const string ServerIp = "127.0.0.1"; + private const int ServerPort = 8888; + + private Socket _clientSocket; + + public Action ReceiveMsgAction; + + //static async Task Main(string[] args) + //{ + // var client = new SocketClient(); + // await client.StartClientAsync(); + //} + + /// + /// 启动客户端 + /// + public async Task StartClientAsync() + { + try + { + // 创建客户端 Socket + _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + ReceiveMsgAction?.Invoke("正在连接服务端..."); + + // 连接服务端 + await _clientSocket.ConnectAsync(IPAddress.Parse(ServerIp), ServerPort); + ReceiveMsgAction?.Invoke("✅ 连接服务端成功!"); + + // 启动接收消息任务(后台异步监听) + _ = Task.Run(ReceiveMsgAsync); + + + } + catch (Exception ex) + { + ReceiveMsgAction?.Invoke($"连接失败:{ex.Message}"); + } + + } + + public void CloseConnect() + { + _clientSocket.Close(); + ReceiveMsgAction?.Invoke("客户端已断开"); + } + + /// + /// 发送消息 + /// + public async Task SendMsgAsync(string msg) + { + if (string.IsNullOrEmpty(msg)) return; + + byte[] data = Encoding.UTF8.GetBytes(msg); + await _clientSocket.SendAsync(data, SocketFlags.None); + } + + /// + /// 接收服务端消息 + /// + private async Task ReceiveMsgAsync() + { + byte[] buffer = new byte[1024]; + + while (true) + { + try + { + int len = await _clientSocket.ReceiveAsync(buffer, SocketFlags.None); + if (len == 0) break; + + string recMsg = Encoding.UTF8.GetString(buffer, 0, len); + + //回调函数 + ReceiveMsgAction?.Invoke($"\n📩 服务端回复:{recMsg}"); + + } + catch + { + break; + } + } + } + } +} diff --git a/SamplePre.Communication/CommunicationFactory.cs b/SamplePre.Communication/CommunicationFactory.cs new file mode 100644 index 0000000..e3dceda --- /dev/null +++ b/SamplePre.Communication/CommunicationFactory.cs @@ -0,0 +1,64 @@ +using S7.Net; +using SamplePre.Communication.Communication; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Communication +{ + public class CommunicationFactory + { + /// + /// 创建通讯实例 + /// + /// 协议类型 + /// 连接参数 + /// + /// + public static ICommunication CreateCommunication(CommProtocolType protocolType, string connectionParams) + { + ICommunication comm = null; + + switch (protocolType) + { + case CommProtocolType.S7: + comm = CreateS7(connectionParams); + break; + case CommProtocolType.ModbusTcp: + comm = CreateModbusTcp(connectionParams); + break; + case CommProtocolType.ModbusRtu: + break; + default: + break; + } + + + return comm; + } + + + public static ICommunication CreateS7(string connectionParams) + { + string[] params1 = connectionParams.Split(':'); + if(params1 == null || params1.Length < 3) return null; + //ICommunication comm = new S7PlcCommunicator(CpuType.S71500, "192.168.10.2", 0, 1); + ICommunication comm = new S7PlcCommunicator(CpuType.S71500, params1[0], int.Parse( params1[1]), int.Parse( params1[2])); + + return comm; + } + + public static ICommunication CreateModbusTcp(string connectionParams) + { + string[] params1 = connectionParams.Split(':'); + if (params1 == null || params1.Length < 2) return null; + ICommunication comm = new ModbusTcpCommunicator(params1[0], int.Parse(params1[1])); + + return comm; + } + + } +} diff --git a/SamplePre.Communication/SamplePre.Communication.csproj b/SamplePre.Communication/SamplePre.Communication.csproj new file mode 100644 index 0000000..51bb875 --- /dev/null +++ b/SamplePre.Communication/SamplePre.Communication.csproj @@ -0,0 +1,19 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + diff --git a/SamplePre.DAL/DAL/LogDal.cs b/SamplePre.DAL/DAL/LogDal.cs new file mode 100644 index 0000000..bffc80b --- /dev/null +++ b/SamplePre.DAL/DAL/LogDal.cs @@ -0,0 +1,96 @@ +using Dapper; +using Models.Models; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using System.Windows.Documents; + +namespace DataDAL.DBContext +{ + public class LogDal + { + + public LogDal() + { + + } + + + + /// + /// 保存日志 + /// + /// + /// + /// + public int SaveLog(run_log_info runLogInfo) + { + + //using (IDbConnection dbConnection = new DapperDBContext().Connection) + //{ + // dbConnection.Open(); + + // string insertSql = @"insert into run_log_info ( id,run_date + // ,log_level + // ,log_content,log_type + // ) + // values(@id,@run_date + // ,@log_level + // ,@log_content ,@log_type + // )"; + + + // var item = dbConnection.QueryFirstOrDefault(insertSql, runLogInfo); + + return 1; + //} + + + } + + /// + /// 查询日志信息 + /// + public List QueryLogByDate(DateTime dt1,DateTime dt2) + { + using (IDbConnection dbConnection = new DapperDBContext().Connection) + { + dbConnection.Open(); + + string querySql = "select * from run_log_info where run_date >= @dt1 and run_date <= @dt2"; + + List data = dbConnection.Query(querySql, new { dt1 = dt1,dt2 = dt2 }).ToList(); + + return data; + + } + } + + ///// + ///// 查询二维码开始编号 + ///// + //public string QueryQrcode() + //{ + // using (IDbConnection dbConnection = new BaseDBContext().Connection) + // { + // dbConnection.Open(); + + // string qrcode = ""; + + // List data = dbConnection.Query("select * from sys_dict where data_type='二维码编号'").ToList(); + // if (data.Count > 0) + // { + // qrcode = (int.Parse(data[0].data_value) + 1).ToString("0000"); + // } + // return qrcode; + + // } + //} + + + + } +} diff --git a/SamplePre.DAL/DAL/SOPDal.cs b/SamplePre.DAL/DAL/SOPDal.cs new file mode 100644 index 0000000..5539f0d --- /dev/null +++ b/SamplePre.DAL/DAL/SOPDal.cs @@ -0,0 +1,72 @@ +using Dapper; +using DataDAL.DBContext; +using Models.Models; +using SamplePre.Common; +using SamplePre.DAL.DBContext; +using SamplePre.Models.Ext; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Dapper.SqlMapper; + +namespace SamplePre.DAL +{ + public class SOPDal + { + + /// + /// 获取标准下的动作,动作中包含参数 + /// + /// + /// + public List QueryStandardProcessByStandardId(string standId) + { + using (IDbConnection dbConnection = new DapperDBContext().Connection) + { + dbConnection.Open(); + + string querySql = @" + SELECT + a.*, + b.action_name, + b.action_unit, + e.data_value AS action_unit_name, + b.remark, + c.all_param + FROM + sys_standard_action a + LEFT JOIN sys_action b ON a.process_id = b.id + LEFT JOIN sys_dict e ON b.action_unit = e.id + LEFT JOIN ( + SELECT + x.action_id, + x.action_seqno, + GROUP_CONCAT( CONCAT( y.title, ':', x.data_value, y.unit ) SEPARATOR ',' ) AS all_param + FROM + sys_standard_action_parm x + LEFT JOIN sys_parm y ON x.parm_id = y.id + WHERE + x.standard_id = @standId + GROUP BY + x.action_id, + x.action_seqno + ) c ON a.process_id = c.action_id + AND a.process_no = c.action_seqno + WHERE + a.standard_id = @standId + ORDER BY a.process_no + "; + + List data = dbConnection.Query(querySql, new { standId = standId }).ToList(); + + return data; + + } + } + + } +} diff --git a/SamplePre.DAL/DAL/SampleSequenceDal.cs b/SamplePre.DAL/DAL/SampleSequenceDal.cs new file mode 100644 index 0000000..e2503ab --- /dev/null +++ b/SamplePre.DAL/DAL/SampleSequenceDal.cs @@ -0,0 +1,24 @@ +using Dapper; +using DataDAL.DBContext; +using Models.Models; +using SamplePre.Common; +using SamplePre.DAL.DBContext; +using SamplePre.Models.Ext; +using SamplePre.Models.Models; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Dapper.SqlMapper; + +namespace SamplePre.DAL +{ + public class SampleSequenceDal + { + + + } +} diff --git a/SamplePre.DAL/DAL/SystemDal.cs b/SamplePre.DAL/DAL/SystemDal.cs new file mode 100644 index 0000000..a5a40e1 --- /dev/null +++ b/SamplePre.DAL/DAL/SystemDal.cs @@ -0,0 +1,59 @@ +using Dapper; +using DataDAL.DBContext; +using Models.Models; +using SamplePre.DAL.DBContext; +using SamplePre.Models.Ext; +using SamplePre.Models.Models; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.DAL +{ + public class SystemDal + { + /// + /// 获取用户数据 + /// + /// + /// + public List QueryUserData() + { + using (IDbConnection dbConnection = new DapperDBContext().Connection) + { + dbConnection.Open(); + + string querySql = @" + SELECT a.*,b.all_role_names from config_user a + LEFT JOIN ( + + SELECT + x.user_id, + + GROUP_CONCAT(x.role_id SEPARATOR ',') AS all_role_ids, + + GROUP_CONCAT(y.`name` SEPARATOR ',') AS all_role_names + FROM + config_user_role x + LEFT JOIN config_role y ON x.role_id = y.id + + GROUP BY + x.user_id + + ) b on a.id = b.user_id + "; + + List data = dbConnection.Query(querySql).ToList(); + + return data; + + } + } + + + } +} diff --git a/SamplePre.DAL/DBContext/DBFactory.cs b/SamplePre.DAL/DBContext/DBFactory.cs new file mode 100644 index 0000000..81aa1bd --- /dev/null +++ b/SamplePre.DAL/DBContext/DBFactory.cs @@ -0,0 +1,108 @@ +using Models.Const; +using SamplePre.Common; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.DAL.DBContext +{ + public class DBFactory + { + + #region 单例实例 + private static readonly Lazy _lazySqlSugarClient = new Lazy(() => + { + return CreateSqlSugarClient(); + }); + + /// + /// 获取默认数据库的SqlSugarClient单例实例 + /// + public static SqlSugarClient Instance => _lazySqlSugarClient.Value; + #endregion + + #region 从App.config读取的配置项(静态构造函数初始化,仅执行一次) + private static readonly string _connStr; // 数据库连接字符串 + private static readonly bool _isAutoCloseConn; // 是否自动关闭连接 + + /// + /// 静态构造函数:读取App.config配置,初始化全局参数 + /// + static DBFactory() + { + try + { + // 1. 读取数据库连接字符串(MySQL) + + _connStr = SystemConst.SysConfigInfo.DbConfig.MySql.ConnStr;//"Data Source=localhost;Database=fanghuayuan;AllowLoadLocalInfile=true;User ID=root;Password=123;allowPublicKeyRetrieval=true;pooling=true;port=3306;"; + + // 2. 读取SqlSugar全局配置(AppSettings节点) + _isAutoCloseConn = true;//Convert.ToBoolean(ConfigurationManager.AppSettings["SqlSugar_IsAutoCloseConnection"]); + + } + catch (Exception ex) + { + throw new Exception("SqlSugar工厂类配置读取失败:" + ex.Message); + } + } + #endregion + + #region 核心方法:创建SqlSugarClient并配置全局参数 + /// + /// 封装SqlSugarClient的创建、数据库配置、全局AOP + /// + /// 配置完成的SqlSugarClient实例 + private static SqlSugarClient CreateSqlSugarClient() + { + // 1. 数据库连接核心配置(按需修改DbType:对应连接字符串) + var connectionConfig = new ConnectionConfig + { + ConnectionString = _connStr, // 连接字符串 + DbType = SqlSugar.DbType.MySql, // 数据库类型: + IsAutoCloseConnection = _isAutoCloseConn, // 自动关闭连接(必开,避免连接泄漏) + InitKeyType = InitKeyType.Attribute, // 从实体类特性读取主键/自增配置(核心) + + }; + + // 2. 创建SqlSugarClient实例 + var db = new SqlSugarClient(connectionConfig); + + db.Aop.OnError = (ex) => + { + string errorLog = $@"【SQL执行异常】{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} + 【异常信息】{ex.Message} + 【SQL语句】{ex.Sql}"; + // 异常日志写入本地文件 + LoggerHelper.Logger.Error(errorLog); + + }; + + return db; + } + #endregion + + + + #region 辅助:手动释放资源(单例模式一般无需调用,程序退出时可选) + /// + /// 手动释放SqlSugarClient资源(仅特殊场景使用) + /// + public static void DisposeInstance() + { + if (_lazySqlSugarClient.IsValueCreated) + { + Instance.Dispose(); + } + } + #endregion + + + + } +} diff --git a/SamplePre.DAL/DBContext/DapperDBContext.cs b/SamplePre.DAL/DBContext/DapperDBContext.cs new file mode 100644 index 0000000..1e2cd2b --- /dev/null +++ b/SamplePre.DAL/DBContext/DapperDBContext.cs @@ -0,0 +1,27 @@ +using Models.Const; +using MySql.Data.MySqlClient; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DataDAL.DBContext +{ + public class DapperDBContext + { + public IDbConnection Connection { get; set; } + + //string connectionString = "Data Source=localhost;Database=fanghuayuan;AllowLoadLocalInfile=true;User ID=root;Password=123;allowPublicKeyRetrieval=true;pooling=true;port=3306;"; //"Data Source=DESKTOP-T4SGEQ7;Initial Catalog=防化院毒素;Integrated Security=True;TrustServerCertificate=True"; + + public DapperDBContext() + { + + Connection = new MySqlConnection(SystemConst.SysConfigInfo.DbConfig.MySql.ConnStr); + } + + + } +} diff --git a/SamplePre.DAL/SamplePre.DAL.csproj b/SamplePre.DAL/SamplePre.DAL.csproj new file mode 100644 index 0000000..db251e2 --- /dev/null +++ b/SamplePre.DAL/SamplePre.DAL.csproj @@ -0,0 +1,22 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + + diff --git a/SamplePre.Models/Const/SystemConst.cs b/SamplePre.Models/Const/SystemConst.cs new file mode 100644 index 0000000..62eac60 --- /dev/null +++ b/SamplePre.Models/Const/SystemConst.cs @@ -0,0 +1,67 @@ +using Models.Models; +using SamplePre.Common; +using SamplePre.Communication; +using SamplePre.Models.Ext; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models.Const +{ + public class SystemConst + { + + /// + /// 运行、成功色-绿色 + /// + public static Color SuccessColor = Color.FromArgb(40, 167, 69); // 运行、成功色-绿色 + + /// + /// 待机-浅绿色 + /// + public static Color AwaitColor = Color.FromArgb(66, 202, 171); // 待机-浅绿色 + + /// + /// 结束 + /// + public static Color FinishColor = Color.FromArgb(22, 167, 169); // 运行、成功色-绿色 + + /// + /// 警告色-黄色 + /// + public static Color WarningColor = Color.FromArgb(255, 193, 7); // 停止、警告色-黄色 + /// + /// 危险色-红色 + /// + public static Color DangerColor = Color.FromArgb(220, 53, 69); // 危险色-红色 + + + + + /// + /// 主PLC对象 + /// + public static ICommunication MasterPLC; + + /// + /// 字典数据 + /// + public static List dictDatas = new List(); + + + public static SysConfigData SysConfigInfo = new SysConfigData(); + + /// + /// 当前通信协议类型 + /// + public static CommProtocolType ProtocolType = CommProtocolType.ModbusTcp; + + /// + /// 当前登录用户信息 + /// + public static LoginUserInfo loginUserInfo = new LoginUserInfo(); + } +} diff --git a/SamplePre.Models/EnumType.cs b/SamplePre.Models/EnumType.cs new file mode 100644 index 0000000..9e67cc0 --- /dev/null +++ b/SamplePre.Models/EnumType.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models +{ + + + + public enum LiXinJiEnum + { + //待机 + Wait = 0, + //运行 + Run = 1, + //故障 + Err = 2 + + } + + + + +} diff --git a/SamplePre.Models/Ext/LogQuery.cs b/SamplePre.Models/Ext/LogQuery.cs new file mode 100644 index 0000000..e6e4d6e --- /dev/null +++ b/SamplePre.Models/Ext/LogQuery.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models.Ext +{ + public class LogQuery + { + public string runDate { get; set; } + public string errType { get; set; } + public string errlevel { get; set; } + public string content { get; set; } + + + + } +} diff --git a/SamplePre.Models/Ext/LoginUserInfo.cs b/SamplePre.Models/Ext/LoginUserInfo.cs new file mode 100644 index 0000000..82d41a0 --- /dev/null +++ b/SamplePre.Models/Ext/LoginUserInfo.cs @@ -0,0 +1,23 @@ +using SamplePre.Models.Tables; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Ext +{ + public class LoginUserInfo + { + + /// + /// 用户信息 + /// + public config_user user { get; set; } + + /// + /// 功能权限 + /// + public List functions { get; set; } + } +} diff --git a/SamplePre.Models/Ext/MenuNode.cs b/SamplePre.Models/Ext/MenuNode.cs new file mode 100644 index 0000000..c6d28c4 --- /dev/null +++ b/SamplePre.Models/Ext/MenuNode.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models.Ext +{ + public class MenuNode + { + public string Id { get; set; } + public string Name { get; set; } + public string Icon { get; set; } + public List Children { get; set; } + + //public MenuNode(string id, string name, List children = null) + //{ + // Id = id; + // Name = name; + + // Children = children ?? new List(); + //} + } + + +} diff --git a/SamplePre.Models/Ext/config_function_ext.cs b/SamplePre.Models/Ext/config_function_ext.cs new file mode 100644 index 0000000..552a3ea --- /dev/null +++ b/SamplePre.Models/Ext/config_function_ext.cs @@ -0,0 +1,17 @@ +using SamplePre.Models.Tables; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Ext +{ + public class config_function_ext : config_function + { + + public bool IsChecked { get; set; } + + + } +} diff --git a/SamplePre.Models/Ext/config_role_ext.cs b/SamplePre.Models/Ext/config_role_ext.cs new file mode 100644 index 0000000..f21335c --- /dev/null +++ b/SamplePre.Models/Ext/config_role_ext.cs @@ -0,0 +1,16 @@ +using SamplePre.Models.Tables; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Ext +{ + public class config_role_ext : config_role + { + + public bool IsSelected { get; set; } + + } +} diff --git a/SamplePre.Models/Ext/config_user_ext.cs b/SamplePre.Models/Ext/config_user_ext.cs new file mode 100644 index 0000000..75319bd --- /dev/null +++ b/SamplePre.Models/Ext/config_user_ext.cs @@ -0,0 +1,16 @@ +using SamplePre.Models.Tables; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Ext +{ + public class config_user_ext : config_user + { + + public string all_role_names { get; set; } + + } +} diff --git a/SamplePre.Models/Ext/sample_exec_detail_ext.cs b/SamplePre.Models/Ext/sample_exec_detail_ext.cs new file mode 100644 index 0000000..55594b1 --- /dev/null +++ b/SamplePre.Models/Ext/sample_exec_detail_ext.cs @@ -0,0 +1,25 @@ +using SamplePre.Models.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Ext +{ + public class sample_exec_detail_ext : sample_exec_detail + { + + public string exec_state { get; set; } + public string item_name { get; set; } + + public string standrad_id { get; set; } + public string standrad { get; set; } + public DateTime input_date { get; set; } + public string input_user { get; set; } + public string tube_type_name { get; set; } + + + + } +} diff --git a/SamplePre.Models/Ext/sample_exec_ext.cs b/SamplePre.Models/Ext/sample_exec_ext.cs new file mode 100644 index 0000000..65cfe25 --- /dev/null +++ b/SamplePre.Models/Ext/sample_exec_ext.cs @@ -0,0 +1,17 @@ +using SamplePre.Models.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Ext +{ + public class sample_exec_ext : sample_exec + { + public string standradName { get; set; } + + + public List sampleExecDetails { get; set; } + } +} diff --git a/SamplePre.Models/Ext/sys_action_ext.cs b/SamplePre.Models/Ext/sys_action_ext.cs new file mode 100644 index 0000000..a8ce5b0 --- /dev/null +++ b/SamplePre.Models/Ext/sys_action_ext.cs @@ -0,0 +1,15 @@ +using Models.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Ext +{ + public class sys_action_ext : sys_action + { + public string action_unitname { get; set; } + + } +} diff --git a/SamplePre.Models/Ext/sys_action_parm_map_ext.cs b/SamplePre.Models/Ext/sys_action_parm_map_ext.cs new file mode 100644 index 0000000..4f9e2fc --- /dev/null +++ b/SamplePre.Models/Ext/sys_action_parm_map_ext.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models.Ext +{ + public class sys_action_parm_map_ext + { + public int id { get; set; } + public string process_id { get; set; } + public string parm_id { get; set; } + public string process_name { get; set; } + public string title { get; set; } + public string unit { get; set; } + public string data_type { get; set; } + public string data_value { get; set; } + + public string plc_type { get; set; } + + } +} diff --git a/SamplePre.Models/Ext/sys_standard_action_ext.cs b/SamplePre.Models/Ext/sys_standard_action_ext.cs new file mode 100644 index 0000000..31c8507 --- /dev/null +++ b/SamplePre.Models/Ext/sys_standard_action_ext.cs @@ -0,0 +1,27 @@ +using Models.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Ext +{ + public class sys_standard_action_ext : sys_standard_action + { + public string action_name { get; set; } + public string remark { get; set; } + + public string all_param { get; set; } + + public string action_unit { get; set; } + public string action_unit_name { set; get; } + + public int new_action_seqno { set; get; } + + /// + /// 执行完成标识 + /// + public bool ExecFinishFlag { set; get; } = false; + } +} diff --git a/SamplePre.Models/Ext/sys_standard_action_parm_ext.cs b/SamplePre.Models/Ext/sys_standard_action_parm_ext.cs new file mode 100644 index 0000000..f83e62a --- /dev/null +++ b/SamplePre.Models/Ext/sys_standard_action_parm_ext.cs @@ -0,0 +1,21 @@ +using Models.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Ext +{ + public class sys_standard_action_parm_ext : sys_standard_action_parm + { + public string action_name { get; set; } + public string title { get; set; } + public string unit { get; set; } + public string data_type { get; set; } + public string plc_type { get; set; } + + public string actionAndseqno { get; set; } + + } +} diff --git a/SamplePre.Models/Ext/sys_standard_ext.cs b/SamplePre.Models/Ext/sys_standard_ext.cs new file mode 100644 index 0000000..9c68ab1 --- /dev/null +++ b/SamplePre.Models/Ext/sys_standard_ext.cs @@ -0,0 +1,38 @@ +using Models.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Ext +{ + public class sys_standard_ext : sys_standard ,INotifyPropertyChanged + { + + //public bool IsSelected { get; set; } + + + private bool _isSelected; + + public bool IsSelected + { + get { return _isSelected; } + set { _isSelected = value; + + OnPropertyChanged(); + } + } + protected void OnPropertyChanged([CallerMemberName] string? propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + + + + public event PropertyChangedEventHandler? PropertyChanged; + } +} diff --git a/SamplePre.Models/Ext/tube_input_ext.cs b/SamplePre.Models/Ext/tube_input_ext.cs new file mode 100644 index 0000000..1430342 --- /dev/null +++ b/SamplePre.Models/Ext/tube_input_ext.cs @@ -0,0 +1,40 @@ +using Models.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Ext +{ + public class tube_input_ext : tube_input,INotifyPropertyChanged + { + //public bool isChecked { get; set; } = false; + + public string tube_type_name { get; set; } + + + private bool isSelected = false; + + public event PropertyChangedEventHandler? PropertyChanged; + + public bool IsSelected + { + get { return isSelected; } + set + { + isSelected = value; + + OnPropertyChanged(); + } + } + + protected void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + } +} diff --git a/SamplePre.Models/Models/ComboBoxListItem.cs b/SamplePre.Models/Models/ComboBoxListItem.cs new file mode 100644 index 0000000..94f487c --- /dev/null +++ b/SamplePre.Models/Models/ComboBoxListItem.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models +{ + public class ComboBoxListItem : Object + { + public string Text { get; set; } + + public object Value { get; set; } + + public ComboBoxListItem(string text, object value) + { + this.Text = text; + this.Value = value; + } + + public override string ToString() + { + return this.Text; + } + } +} diff --git a/SamplePre.Models/Models/SopDataInfo.cs b/SamplePre.Models/Models/SopDataInfo.cs new file mode 100644 index 0000000..bf73d56 --- /dev/null +++ b/SamplePre.Models/Models/SopDataInfo.cs @@ -0,0 +1,18 @@ +using Models.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models +{ + public class SopDataInfo + { + public sys_standard sysStandard { get; set; } = new sys_standard(); + + public List sysStandActions { get; set; } = new List(); + + public List sysStandardActionParms { get; set; } = new List(); + } +} diff --git a/SamplePre.Models/Models/SysConfigData.cs b/SamplePre.Models/Models/SysConfigData.cs new file mode 100644 index 0000000..fc610dc --- /dev/null +++ b/SamplePre.Models/Models/SysConfigData.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models +{ + using System.Xml.Serialization; + + /// + /// 系统配置根实体类(对应XML根节点SystemConfig) + /// + [XmlRoot("SystemConfig")] + public class SysConfigData + { + /// + /// 数据库配置(对应DbConfig节点) + /// + [XmlElement("DbConfig")] + public DbConfigModel DbConfig { get; set; } + + /// + /// 应用配置(对应AppConfig节点) + /// + [XmlElement("AppConfig")] + public AppConfigModel AppConfig { get; set; } + } + + + /// + /// 数据库配置实体(对应DbConfig节点) + /// + public class DbConfigModel + { + /// + /// SQL Server配置(对应SqlServer节点,含属性) + /// + [XmlElement("SqlServer")] + public DbItemModel SqlServer { get; set; } + + /// + /// MySQL配置(对应MySql节点,含属性) + /// + [XmlElement("MySql")] + public DbItemModel MySql { get; set; } + } + + /// + /// 数据库子项配置(对应SqlServer/MySql节点,含属性) + /// + public class DbItemModel + { + /// + /// 连接串(对应ConnStr属性) + /// + [XmlAttribute("ConnStr")] + public string ConnStr { get; set; } + + /// + /// 超时时间(对应TimeOut属性) + /// + [XmlAttribute("TimeOut")] + public int TimeOut { get; set; } + } + + /// + /// 应用配置实体(对应AppConfig节点) + /// + public class AppConfigModel + { + [XmlElement("AppName")] + public string AppName { get; set; } + + [XmlElement("Version")] + public string Version { get; set; } + + [XmlElement("MaxLoginCount")] + public int MaxLoginCount { get; set; } + + [XmlElement("IsDebug")] + public bool IsDebug { get; set; } + } +} diff --git a/SamplePre.Models/Models/TreeListItem.cs b/SamplePre.Models/Models/TreeListItem.cs new file mode 100644 index 0000000..d6faaff --- /dev/null +++ b/SamplePre.Models/Models/TreeListItem.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models +{ + // 定义树节点数据模型 + public class TreeListItem + { + // 节点唯一ID(主键) + public string ID { get; set; } + // 父节点ID(根节点的ParentID为0,子节点对应父节点的ID) + public string ParentID { get; set; } + // 节点显示的文本 + public string DisplayText { get; set; } + + } +} diff --git a/SamplePre.Models/SamplePre.Models.csproj b/SamplePre.Models/SamplePre.Models.csproj new file mode 100644 index 0000000..25a17f8 --- /dev/null +++ b/SamplePre.Models/SamplePre.Models.csproj @@ -0,0 +1,22 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + + diff --git a/SamplePre.Models/Tables/QRcode.cs b/SamplePre.Models/Tables/QRcode.cs new file mode 100644 index 0000000..5aca20f --- /dev/null +++ b/SamplePre.Models/Tables/QRcode.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models.Models +{ + public class QRcode + { + public string code { get; set; } + public string checkItem { get; set; } //检测项目 + public string jizhi { get; set; } // 基质 + public string sqno { get; set; } // 序号 + public string position { get; set; } // 试管位置 + public string stand { get; set; } // 标准 + public string user { get; set; } //录入人员 + public string inputDate { get; set; } //录入日期 + + + + + + } +} diff --git a/SamplePre.Models/Tables/config_function.cs b/SamplePre.Models/Tables/config_function.cs new file mode 100644 index 0000000..d506117 --- /dev/null +++ b/SamplePre.Models/Tables/config_function.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Tables +{ + public class config_function + { + public int id { get; set; } // 功能ID + public string name { get; set; } // 功能名称(如:用户管理、角色新增) + public string code { get; set; } // 功能编码(唯一标识,如:User_Manage) + public int parent_id { get; set; } // 父功能编码(用于构建菜单层级) + public string description { get; set; } // 功能描述 + + } +} diff --git a/SamplePre.Models/Tables/config_role.cs b/SamplePre.Models/Tables/config_role.cs new file mode 100644 index 0000000..e6b622a --- /dev/null +++ b/SamplePre.Models/Tables/config_role.cs @@ -0,0 +1,21 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Tables +{ + public class config_role + { + + [SugarColumn(IsPrimaryKey = true, IsIdentity = false)] + public string id { get; set; } // 角色ID + public string name { get; set; } // 角色名称(如:管理员、普通用户) + public string description { get; set; } // 角色描述 + + + + } +} diff --git a/SamplePre.Models/Tables/config_role_permisson.cs b/SamplePre.Models/Tables/config_role_permisson.cs new file mode 100644 index 0000000..13ab012 --- /dev/null +++ b/SamplePre.Models/Tables/config_role_permisson.cs @@ -0,0 +1,20 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Tables +{ + public class config_role_permisson + { + + [SugarColumn(IsPrimaryKey = true, IsIdentity = false)] + public int id { get; set; } + public string role_id { get; set; } + public int function_id { get; set; } + + + } +} diff --git a/SamplePre.Models/Tables/config_user.cs b/SamplePre.Models/Tables/config_user.cs new file mode 100644 index 0000000..8aed73d --- /dev/null +++ b/SamplePre.Models/Tables/config_user.cs @@ -0,0 +1,25 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Tables +{ + public class config_user + { + [SugarColumn(IsPrimaryKey = true, IsIdentity = false)] + public string id { get; set; } // 用户ID + public string username { get; set; } // 用户名 + public string password { get; set; } // 密码(实际项目需加密存储) + public bool is_enabled { get; set; } // 是否启用 + + + + + + + + } +} diff --git a/SamplePre.Models/Tables/config_user_role.cs b/SamplePre.Models/Tables/config_user_role.cs new file mode 100644 index 0000000..3f06167 --- /dev/null +++ b/SamplePre.Models/Tables/config_user_role.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Tables +{ + public class config_user_role + { + + public int id { get; set; } + public string user_id { get; set; } + public string role_id { get; set; } + + + + + } +} diff --git a/SamplePre.Models/Tables/run_log_info.cs b/SamplePre.Models/Tables/run_log_info.cs new file mode 100644 index 0000000..4811bfb --- /dev/null +++ b/SamplePre.Models/Tables/run_log_info.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models.Models +{ + public class run_log_info + { + public string id { get; set; } + + public DateTime run_date { get; set; } + + /// + /// 信息,警告,故障 + /// + public string log_level { get; set; } + + public string log_content { get; set; } + + public string log_type { get; set; } + + /// + /// 运行时间 + /// + public string run_time { get; set; } + + } +} diff --git a/SamplePre.Models/Tables/sample_exec.cs b/SamplePre.Models/Tables/sample_exec.cs new file mode 100644 index 0000000..cf1b4b4 --- /dev/null +++ b/SamplePre.Models/Tables/sample_exec.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Models +{ + public class sample_exec + { + public string id { get; set; } + public string standrad_id { get; set; } + public string cmd_content { get; set; } + public string cmd_content2 { get; set; } + public string qrcodes { get; set; } + public int sample_count { get; set; } + public string exec_state { get; set; } + + public DateTime exec_date { get; set; } + + } +} diff --git a/SamplePre.Models/Tables/sample_exec_detail.cs b/SamplePre.Models/Tables/sample_exec_detail.cs new file mode 100644 index 0000000..1fd7990 --- /dev/null +++ b/SamplePre.Models/Tables/sample_exec_detail.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Models +{ + public class sample_exec_detail + { + + public int id { get; set; } + public string master_id { get; set; } + public string qrcode { get; set; } + + + } +} diff --git a/SamplePre.Models/Tables/sample_record.cs b/SamplePre.Models/Tables/sample_record.cs new file mode 100644 index 0000000..a1f7e49 --- /dev/null +++ b/SamplePre.Models/Tables/sample_record.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models.Models +{ + /// + /// 样本记录 + /// + public class sample_record + { + + public int id { get; set; } + public string qrcode { get; set; } + public string check_item { get; set; } + public string jizhi { get; set; } + public string xuhao { get; set; } + public string standard_id { get; set; } + public string input_user { get; set; } + public DateTime inpu_date { get; set; } + public string weight { get; set; } + + } +} diff --git a/SamplePre.Models/Tables/sys_action.cs b/SamplePre.Models/Tables/sys_action.cs new file mode 100644 index 0000000..03ccaf9 --- /dev/null +++ b/SamplePre.Models/Tables/sys_action.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models.Models +{ + public class sys_action + { + + public string id { get; set; } + public string action_name { get; set; } + + public string action_unit { get; set; } + + public string action_adress { get; set; } + public string plc_type { get; set; } + public string remark { get; set; } + + } +} diff --git a/SamplePre.Models/Tables/sys_action_parm_map.cs b/SamplePre.Models/Tables/sys_action_parm_map.cs new file mode 100644 index 0000000..1407c2c --- /dev/null +++ b/SamplePre.Models/Tables/sys_action_parm_map.cs @@ -0,0 +1,21 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models.Models +{ + public class sys_action_parm_map + { + + [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] + public int id { get; set; } + public string process_id { get; set; } + public string parm_id { get; set; } + + //public string parm_name { get; set; } + + } +} diff --git a/SamplePre.Models/Tables/sys_dict.cs b/SamplePre.Models/Tables/sys_dict.cs new file mode 100644 index 0000000..63dbc5d --- /dev/null +++ b/SamplePre.Models/Tables/sys_dict.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models.Models +{ + public class sys_dict + { + public string id { get; set; } + public string data_type { get; set; } + public string data_value { get; set; } + + public int class_id { get;set; } + + public string remark { get; set; } + } +} diff --git a/SamplePre.Models/Tables/sys_dict_class.cs b/SamplePre.Models/Tables/sys_dict_class.cs new file mode 100644 index 0000000..01ba1b6 --- /dev/null +++ b/SamplePre.Models/Tables/sys_dict_class.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.Models.Models +{ + public class sys_dict_class + { + + public int id { get; set; } + public string dict_type { get; set; } + public string remark { get; set; } + + + } +} diff --git a/SamplePre.Models/Tables/sys_parm.cs b/SamplePre.Models/Tables/sys_parm.cs new file mode 100644 index 0000000..dee02bc --- /dev/null +++ b/SamplePre.Models/Tables/sys_parm.cs @@ -0,0 +1,25 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models.Models +{ + public class sys_parm + { + [SugarColumn(IsPrimaryKey = true)] + //[SugarColumn(IsPrimaryKey = true, IsIdentity = true)] + public string id { get; set; } + public string title { get; set; } + public string unit { get; set; } + public string data_type { get; set; } + public string data_value { get; set; } + + public string plc_type { get; set; } + + public string param_type { get;set; } + + } +} diff --git a/SamplePre.Models/Tables/sys_standard.cs b/SamplePre.Models/Tables/sys_standard.cs new file mode 100644 index 0000000..0de8d98 --- /dev/null +++ b/SamplePre.Models/Tables/sys_standard.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models.Models +{ + public class sys_standard + { + + public string id { get; set; } + public string sample_id { get; set; } + + //public string sample_name { get; set; } + public string standard_name { get; set; } + + } +} diff --git a/SamplePre.Models/Tables/sys_standard_action.cs b/SamplePre.Models/Tables/sys_standard_action.cs new file mode 100644 index 0000000..3ec590f --- /dev/null +++ b/SamplePre.Models/Tables/sys_standard_action.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models.Models +{ + public class sys_standard_action + { + + + public string id { get; set; } + public string standard_id { get; set; } + public string process_id { get; set; } + //public string process_name { get; set; } + public int process_no { get; set; } + + } +} diff --git a/SamplePre.Models/Tables/sys_standard_action_parm.cs b/SamplePre.Models/Tables/sys_standard_action_parm.cs new file mode 100644 index 0000000..3ebe4a3 --- /dev/null +++ b/SamplePre.Models/Tables/sys_standard_action_parm.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models.Models +{ + public class sys_standard_action_parm + { + //[SugarColum(IsPrimaryKey = true)] + public string id { get; set; } + + public string standard_id { get; set; } + + public string action_id { get; set; } + + public int action_seqno { get; set; } + + public string parm_id { get; set; } + + public int parm_seqno { get; set; } + + public int standard_process_id { get; set; } + + public string data_value { get; set; } + + + + } +} diff --git a/SamplePre.Models/Tables/tube_input.cs b/SamplePre.Models/Tables/tube_input.cs new file mode 100644 index 0000000..c595680 --- /dev/null +++ b/SamplePre.Models/Tables/tube_input.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models.Models +{ + public class tube_input + { + public string qrcode { get; set; } + public string item_name { get; set; } + public string tube_type { get; set; } + public string standrad_id { get; set; } + public string standrad { get; set; } + public string input_user { get; set; } + public DateTime input_date { get; set; } + public string weight { get; set; } + public int tube_count { get; set; } + public string bach_no { get; set; } + + } +} diff --git a/SamplePre.ProcessBll/BLL/ActionMangerBll.cs b/SamplePre.ProcessBll/BLL/ActionMangerBll.cs new file mode 100644 index 0000000..cb6413c --- /dev/null +++ b/SamplePre.ProcessBll/BLL/ActionMangerBll.cs @@ -0,0 +1,178 @@ +using DataDAL; +using Models.Ext; +using Models.Models; +using SamplePre.Common; +using SamplePre.DAL.DBContext; +using SamplePre.Models.Ext; +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.ProcessBll.BLL +{ + public class ActionMangerBll + { + + + + public int DelProcessParmMap(int id) + { + + + int val = DBFactory.Instance.Deleteable().Where(p=>p.id == id).ExecuteCommand(); + return val; + } + + public int DelSysActionData(string actionId) + { + var _db = DBFactory.Instance; + + + + try + { + _db.BeginTran(); + + int val = _db.Deleteable().Where(p => p.id == actionId).ExecuteCommand(); + + int val2 = _db.Deleteable().Where(p => p.process_id == actionId).ExecuteCommand(); + + _db.CommitTran(); + } + catch (Exception ex) + { + _db.RollbackTran(); + LoggerHelper.Logger.Error(ex.Message); + return -1; + } + + + + return 1; + } + + public List GetProcess_parm_mapByProcessId(string processId) + { + + var result = DBFactory.Instance.Queryable() + .LeftJoin((a, b) => a.parm_id == b.id) + .Where((a, b) => a.process_id == processId && b.title != null) + .Select((a, b) => new sys_action_parm_map_ext + { + id = a.id, + process_id = a.process_id, + parm_id = a.parm_id, + title = b.title, + unit = b.unit, + data_type = b.data_type, + data_value = b.data_value, + plc_type = b.plc_type + + + }) + .ToList(); + + + + return result;//standardDal.GetProcess_parm_mapByProcessId(processId); + } + + /// + /// 获取系统动作字典 + /// + /// + /// + public List GetTreeListSysAction() + { + + List treeListItems = new List(); + + + //获取动作 + List actions = QuerySysAction(); + + //拼装组 + var groups = actions.GroupBy(p => new { p.action_unitname, p.action_unit }).ToList(); + foreach (var item in groups) + { + treeListItems.Add(new sys_action_ext() + { + id = item.Key.action_unit, + action_name = item.Key.action_unitname, + action_unit = "0" + }); + } + + //组织数据 + foreach (var item in actions) + { + treeListItems.Add(item); + } + + + return treeListItems; + + } + + public bool IsExtisPlCcode(string text) + { + var val = DBFactory.Instance.Queryable().Where(p=>p.plc_type == text).ToList(); + if(val.Count > 0) return true; + + return false; + + } + + public List QuerySysAction() + { + var result = DBFactory.Instance.Queryable() + .LeftJoin((a, s) => a.action_unit == s.id) + .Where((a, s) => s.class_id == 2) + .Select((a, s) => new sys_action_ext + { + id = a.id, + action_name = a.action_name, + action_unit = a.action_unit, + action_adress = a.action_adress, + plc_type = a.plc_type, + remark = a.remark, + action_unitname = s.data_value + }) + .ToList(); + + return result; + } + + /// + /// 查询系统动作参数 + /// + /// + public List QuerySysParm() + { + //string querySql = "select * from sys_parm "; + List data = DBFactory.Instance.Queryable().ToList(); + + return data; + } + + /// + /// 保存动作中的参数 + /// + /// + public int SaveActionParm(List actionParams) + { + + int val = DBFactory.Instance.Insertable(actionParams).ExecuteCommand(); + return val; + } + + public int SaveSysAction(sys_action process) + { + int val = DBFactory.Instance.Insertable(process).ExecuteCommand(); + return val; + } + } +} diff --git a/SamplePre.ProcessBll/BLL/CommunicationBll.cs b/SamplePre.ProcessBll/BLL/CommunicationBll.cs new file mode 100644 index 0000000..4ca69e4 --- /dev/null +++ b/SamplePre.ProcessBll/BLL/CommunicationBll.cs @@ -0,0 +1,80 @@ +using Models.Const; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.ProcessBll.BLL +{ + public class CommunicationBll + { + + + /// + /// 读取PLC状态数据-数组 + /// + /// + /// + /// + /// + public ushort[] ReadSateData(int Dbno, int start, int lenth) + { + + if (SystemConst.ProtocolType == Communication.CommProtocolType.S7) + { + //读取下位机状态 + ushort[] data1 = SystemConst.MasterPLC.ReadArraysShort(Dbno, start, lenth); + + return data1; + } + + //这里应该增加一个协议数据解析层,解析后的格式返回给UI,后续完善 + /// + + return null; + } + + /// + /// 写入plc指令,字节数组 + /// + /// + /// + /// + /// + /// + public bool WritePlcData(int Dbno, int start, T[] bytes) + { + bool val = false; + //if (SystemConst.ProtocolType == Communication.CommProtocolType.S7) + //{ + //写入PLC + val = SystemConst.MasterPLC.WriteArraysBtye(Dbno, start, bytes); + //} + //else if (SystemConst.ProtocolType == Communication.CommProtocolType.ModbusTcp) + //{ + // //写入PLC + // val = SystemConst.MasterPLC.WriteArraysBtye(Dbno, start, bytes); + //} + + + return val; + } + + /// + /// 写plc数据,单数据 + /// + /// + /// + /// + public bool WriteSingleData(string Dbno, object obj) + { + //写入PLC + var val = SystemConst.MasterPLC.WriteSingleData(Dbno, obj); + + return val; + } + + + } +} diff --git a/SamplePre.ProcessBll/BLL/MonitorBll.cs b/SamplePre.ProcessBll/BLL/MonitorBll.cs new file mode 100644 index 0000000..c1608b3 --- /dev/null +++ b/SamplePre.ProcessBll/BLL/MonitorBll.cs @@ -0,0 +1,50 @@ +using DataDAL; +using DataDAL.DBContext; +using Models.Const; +using Models.Models; +using Org.BouncyCastle.Utilities; +using SamplePre.Common; +using SamplePre.Communication; +using SamplePre.DAL; +using SamplePre.DAL.DBContext; +using SamplePre.Models.Ext; +using SamplePre.Models.Models; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Data.Odbc; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.ProcessBll.SampleSequence +{ + /// + /// 样本序列管理业务逻辑 + /// + public class MonitorBll + { + SampleSequenceDal sampleSequenceDal = new SampleSequenceDal(); + + + + SOPDal sopDal = new SOPDal(); + + + public List GetSampleType() + { + + + List data = DBFactory.Instance.Queryable().Where(p => p.class_id == 3).ToList(); + + return data; + + + } + + + } + + +} diff --git a/SamplePre.ProcessBll/BLL/SOPManagerBll.cs b/SamplePre.ProcessBll/BLL/SOPManagerBll.cs new file mode 100644 index 0000000..e7fcd1e --- /dev/null +++ b/SamplePre.ProcessBll/BLL/SOPManagerBll.cs @@ -0,0 +1,518 @@ +using DataDAL; +using Models.Const; +using Models.Ext; +using Models.Models; +using Newtonsoft.Json; +using SamplePre.Common; +using SamplePre.DAL; +using SamplePre.DAL.DBContext; +using SamplePre.Models; +using SamplePre.Models.Ext; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net.Http.Headers; +using System.Text; +using System.Threading.Tasks; +using System.Xml; +using static System.Collections.Specialized.BitVector32; + +namespace SamplePre.ProcessBll.BLL +{ + public class SOPManagerBll + { + + SOPDal sopDal = new SOPDal(); + + public List GetActionParmById(string actionID) + { + + var result = DBFactory.Instance.Queryable() + .LeftJoin((a, b) => a.parm_id == b.id) + .Where((a, b) => a.process_id == actionID && b.title != null) + .Select((a, b) => new sys_action_parm_map_ext + { + id = a.id, + process_id = a.process_id, + parm_id = a.parm_id, + title = b.title, + unit = b.unit, + data_type = b.data_type, + data_value = b.data_value, + plc_type = b.plc_type + + + }) + .ToList(); + + + //List paramsList = standardDal.GetProcess_parm_mapByProcessId(actionID); + return result;//paramsList; + } + + + public List GetStrandActionParamByStrandId(string standId) + { + + var result = DBFactory.Instance.Queryable() + .LeftJoin< sys_action >((a,b)=>a.action_id == b.id) + .LeftJoin< sys_parm >((a,b,c)=>a.parm_id == c.id) + .Where((a,b,c)=>a.standard_id == standId) + .OrderBy((a,b,c)=>a.action_seqno) + .Select((a,b,c)=> new sys_standard_action_parm_ext { + id = a.id, + standard_id = a.standard_id, + action_id = a.action_id, + action_seqno = a.action_seqno, + parm_id = a.parm_id, + parm_seqno = a.parm_seqno, + standard_process_id = a.standard_process_id, + data_value = a.data_value, + action_name = b.action_name, + title = c.title, + unit = c.unit, + data_type = c.data_type, + plc_type = c.plc_type + }) + .ToList(); + + + //List paramsList = sopDal.GetStrandActionParamByStrandId(standId); + return result; //paramsList; + } + + /// + /// 删除动作下的参数配置 + /// + /// + /// + /// + public int removeActionParmByActionId(string standId, string actionId, int seqno) + { + + var val = DBFactory.Instance.Deleteable(p => p.standard_id == standId && p.action_id == actionId && p.action_seqno == seqno) + .ExecuteCommand(); + return val; + //sopDal.removeActionParmByActionId(standId, actionId, seqno); + } + + /// + /// 删除动作下的参数配置byid + /// + /// + /// + /// + public int removeActionParmByParamId(string standId, string actionId, int seqno,string paramId) + { + + var val = DBFactory.Instance.Deleteable(p => p.standard_id == standId && p.action_id == actionId && p.action_seqno == seqno && p.parm_id == paramId) + .ExecuteCommand(); + return val; + //sopDal.removeActionParmByActionId(standId, actionId, seqno); + } + + + + public int updateStandardActionParm(sys_standard_action_parm item) + { + //sopDal.updateStandardActionParm(item); + + int val = DBFactory.Instance.Updateable() + .SetColumns(p=> new sys_standard_action_parm() { data_value = item.data_value }) + .Where(p=>p.id == item.id) + .ExecuteCommand(); + + return val; + } + + public bool IsExisAction(string actionId) + { + + List data = DBFactory.Instance.Queryable().Where(p => p.action_id == actionId).ToList(); + + return data.Count() > 0 ? true : false; + + } + + + + public List QueryStandardActionByStandardId(string standId) + { + + var result = DBFactory.Instance.Queryable(). + LeftJoin((a, b) => a.process_id == b.id). + Where((a, b) => a.standard_id == standId). + Select((a, b) => new sys_standard_action_ext { + id = a.id, + standard_id = a.standard_id, + process_id = a.process_id, + process_no = a.process_no, + action_name = b.action_name, + remark = b.remark + }).ToList(); + + + return result;//standardDal.QueryStandardActionByStandardId(standId); + } + + + + /// + /// 更新动作序号 + /// + /// + /// + public int UpdateActionSeqno(sys_standard_action_ext action) + { + // return sopDal.UpdateActionSeqno(action); + + var _db = DBFactory.Instance; + + try + { + _db.BeginTran(); + var val = _db.Updateable() + .SetColumns(it => new sys_standard_action() { process_no = action.new_action_seqno }) + .Where(p => p.standard_id == action.standard_id && p.process_id == action.process_id && p.process_no == action.process_no) + .ExecuteCommand(); + + + ////参数里的动作顺序 + var val2 = _db.Updateable() + .SetColumns(it => new sys_standard_action_parm() { action_seqno = action.new_action_seqno }) + .Where(p => p.standard_id == action.standard_id && p.action_id == action.process_id && p.action_seqno == action.process_no) + .ExecuteCommand(); + + _db.CommitTran(); + } + catch (Exception ex) + { + _db.RollbackTran(); + LoggerHelper.Logger.Error(ex.Message); + return -1; + } + + return 1; + } + + /// + /// 删除标准,及标准下的所有配置 + /// + /// + /// + public int DelStandardActionParamByStandId(string standardId) + { + + var _db = DBFactory.Instance; + + try + { + _db.BeginTran(); + + _db.Deleteable().Where(p => p.id == standardId).ExecuteCommand(); + _db.Deleteable().Where(p => p.standard_id == standardId).ExecuteCommand(); + _db.Deleteable().Where(p => p.standard_id == standardId).ExecuteCommand(); + + _db.CommitTran(); + + + } + catch (Exception ex) + { + _db.RollbackTran(); + LoggerHelper.Logger.Error(ex.Message); + return -1; + } + + return 1; + //return sopDal.DelStandardActionParamByStandId(iD); + } + + /// + /// 获取标准下的动作,动作中包含参数的预览 + /// + /// + /// + public List QueryStandardProcessByStandardId(string standID) + { + return sopDal.QueryStandardProcessByStandardId(standID); + } + + + /// + /// 保存标准动作表、动作参数表 + /// + /// + /// + public int SaveStandardAction_param(sys_standard_action action) + { + //return standardDal.Save_standard_process_map(procemodel); + + var _db = DBFactory.Instance; + + try + { + _db.BeginTran(); + //保存标准动作 + _db.Insertable(action).ExecuteCommand(); + + + //保存标准动作参数表 + //获取动作下的参数 + List paramList = GetActionParmById(action.process_id); + List new_parms = new List(); + foreach (var item in paramList) + { + //保存标准动作参数表 + sys_standard_action_parm parmmodel = new sys_standard_action_parm() + { + id = Guid.NewGuid().ToString(), + standard_id = action.standard_id, + action_id = action.process_id, + action_seqno = action.process_no, + parm_id = item.parm_id, + data_value = item.data_value, + parm_seqno = item.id + }; + new_parms.Add(parmmodel); + } + _db.Insertable(new_parms).ExecuteCommand(); + + _db.CommitTran(); + } + catch (Exception ex) + { + _db.RollbackTran(); + LoggerHelper.Logger.Error(ex.Message); + return -1; + } + + + return 1; + } + + + /// + /// sop导出 + /// + /// + public void ExprotSop(string sysStandardId ,string filePath) + { + //标准信息 + sys_standard sysStandard = DBFactory.Instance.Queryable().Where(p=>p.id == sysStandardId).Single(); + + //标准动作信息 + List standardActions = DBFactory.Instance.Queryable().Where(p => p.standard_id == sysStandardId).ToList(); + + //标准动作信息 + List standardActionsParams = DBFactory.Instance.Queryable().Where(p => p.standard_id == sysStandardId).ToList(); + + + SopDataInfo sopDataInfo = new SopDataInfo(); + sopDataInfo.sysStandard = sysStandard; + sopDataInfo.sysStandActions = standardActions; + sopDataInfo.sysStandardActionParms = standardActionsParams; + + + // 2. 序列化:格式化易读、保留中文 + string jsonStr = JsonConvert.SerializeObject(sopDataInfo); + + // 3. 写入TXT文件 + File.WriteAllText(filePath, jsonStr); + + + } + + /// + /// 导入SOP + /// + /// + /// + public bool ImportSop(string selectFilePath) + { + + string fileContent = File.ReadAllText(selectFilePath, System.Text.Encoding.UTF8); + + SopDataInfo sopDataInfo = JsonConvert.DeserializeObject(fileContent); + + var _db = DBFactory.Instance; + + try + { + //开始事务 + _db.BeginTran(); + + //标准 + sopDataInfo.sysStandard.id = Guid.NewGuid().ToString(); + sopDataInfo.sysStandard.standard_name = sopDataInfo.sysStandard.standard_name + "_imp"; + DBFactory.Instance.Insertable(sopDataInfo.sysStandard).ExecuteCommand(); + + + //标准动作 + foreach (var item in sopDataInfo.sysStandActions) + { + item.id = Guid.NewGuid().ToString(); + item.standard_id = sopDataInfo.sysStandard.id; + } + DBFactory.Instance.Insertable(sopDataInfo.sysStandActions).ExecuteCommand(); + //标准动作参数 + foreach (var item in sopDataInfo.sysStandardActionParms) + { + item.id = Guid.NewGuid().ToString(); + item.standard_id = sopDataInfo.sysStandard.id; + } + DBFactory.Instance.Insertable(sopDataInfo.sysStandardActionParms).ExecuteCommand(); + + //提交事务 + _db.CommitTran(); + } + catch (Exception ex) + { + _db.RollbackTran(); + + LoggerHelper.Logger.Error(ex.Message); + return false; + } + + + return true; + } + + /// + /// 获取左侧标准树 + /// + /// + /// + public List GetStandardData() + { + List treeListItems = new List(); + + //获取样本 + List yangbens = SystemConst.dictDatas.Where(p => p.class_id == 3).ToList(); //sopBll.QueryGyData(); //standardDal.QueryGyData(); + + foreach (var item in yangbens) + { + treeListItems.Add(new TreeListItem() { ID = item.id, DisplayText = item.data_value, ParentID = "0" }); + } + + //获取标准 + List SopList = QueryAllGyStandards(); //standardDal.QueryAllGyStandards(); + foreach (var item in SopList) + { + treeListItems.Add(new TreeListItem() { ID = item.id, DisplayText = item.standard_name, ParentID = item.sample_id }); + } + + return treeListItems; + } + + /// + /// 获取所有标准 + /// + /// + public List QueryAllGyStandards() + { + List data = DBFactory.Instance.Queryable().ToList(); + return data; + } + + /// + /// 获取动作字典 + /// + /// + /// + public List QuerySysAction() + { + var result = DBFactory.Instance.Queryable() + .LeftJoin((a, s) => a.action_unit == s.id) + .Where((a, s) => s.class_id == 2) + .Select((a, s) => new sys_action_ext + { + id = a.id, + action_name = a.action_name, + action_unit = a.action_unit, + action_adress = a.action_adress, + plc_type = a.plc_type, + remark = a.remark, + action_unitname = s.data_value + }) + .ToList(); + + + return result; + } + + /// + /// 移除标准的动作 + /// + /// + public void removeStandAction(sys_standard_action_ext sysStandardAction) + { + //移除动作 + var _db = DBFactory.Instance; + + try + { + _db.BeginTran(); + + var va11 = _db.Deleteable(p => p.id == sysStandardAction.id).ExecuteCommand(); + + //移除动作下的参数配置 + var val2 = _db.Deleteable(p => p.standard_id == sysStandardAction.standard_id + && p.action_id == sysStandardAction.process_id + && p.action_seqno == sysStandardAction.process_no).ExecuteCommand(); + _db.CommitTran(); + } + catch (Exception ex) + { + _db.RollbackTran(); + LoggerHelper.Logger.Error(ex.Message); + + } + + } + + /// + /// 保存动作参数配置 + /// + /// + /// + public int SaveStandardActionParam(List actionParms) + { + int val = DBFactory.Instance.Insertable(actionParms).ExecuteCommand(); + + return val; + } + + public int SaveStandardCopy(sys_standard new_sysStandard, List newStandActions, List sysStandardActionParms) + { + var _db = DBFactory.Instance; + + try + { + _db.BeginTran(); + + _db.Insertable(new_sysStandard).ExecuteCommand(); + + _db.Insertable(newStandActions).ExecuteCommand(); + + _db.Insertable(sysStandardActionParms).ExecuteCommand(); + + _db.CommitTran(); + } + catch (Exception ex) + { + _db.RollbackTran(); + + LoggerHelper.Logger.Error(ex.Message); + return -1; + } + + + return 1; + } + } +} diff --git a/SamplePre.ProcessBll/BLL/SampleSequenceBll.cs b/SamplePre.ProcessBll/BLL/SampleSequenceBll.cs new file mode 100644 index 0000000..4297158 --- /dev/null +++ b/SamplePre.ProcessBll/BLL/SampleSequenceBll.cs @@ -0,0 +1,539 @@ +using DataDAL; +using DataDAL.DBContext; +using Models.Models; +using SamplePre.Common; +using SamplePre.DAL; +using SamplePre.DAL.DBContext; +using SamplePre.Models.Ext; +using SamplePre.Models.Models; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Data.Odbc; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.ProcessBll.SampleSequence +{ + /// + /// 样本序列管理业务逻辑 + /// + public class SampleSequenceBll + { + SampleSequenceDal sampleSequenceDal = new SampleSequenceDal(); + + + + SOPDal sopDal = new SOPDal(); + + + public List GetSampleType() + { + + + List data = DBFactory.Instance.Queryable().Where(p => p.class_id == 3).ToList(); + + return data; + + + } + + + /// + /// 获取标准动作参数 + /// + /// + /// + public List GetStrandActionParamByStrandId(string standId) + { + var result = DBFactory.Instance.Queryable() + .LeftJoin((a, b) => a.action_id == b.id) + .LeftJoin((a, b, c) => a.parm_id == c.id) + .LeftJoin((a, b, c,d) => a.standard_id == d.id) + .Where((a, b, c, d) => a.standard_id == standId) + .OrderBy((a, b, c, d) => a.action_seqno) + .Select((a, b, c, d) => new sys_standard_action_parm_ext + { + id = a.id, + standard_id = a.standard_id, + action_id = a.action_id, + action_seqno = a.action_seqno, + parm_id = a.parm_id, + parm_seqno = a.parm_seqno, + standard_process_id = a.standard_process_id, + data_value = a.data_value, + action_name = b.action_name, + title = c.title, + unit = c.unit, + data_type = c.data_type, + plc_type = c.plc_type, + actionAndseqno = $"{d.standard_name}: {a.action_seqno}{b.action_name}" + }) + .ToList(); + + + + //List datas = sopDal.GetStrandActionParamByStrandId(standId); + + return result; + } + + public List QuerySysAction() + { + var result = DBFactory.Instance.Queryable() + .LeftJoin((a, s) => a.action_unit == s.id) + .Where((a, s) => s.class_id == 2) + .Select((a, s) => new sys_action_ext + { + id = a.id, + action_name = a.action_name, + action_unit = a.action_unit, + action_adress = a.action_adress, + plc_type = a.plc_type, + remark = a.remark, + action_unitname = s.data_value + }) + .ToList(); + + //List sysActions = standardDal.QuerySysAction(); + + return result; + } + + public int DelTubeInputByCode(string code) + { + + + int val = DBFactory.Instance.Deleteable().Where(p => p.qrcode == code).ExecuteCommand(); + + return val; + } + + /// + /// 保存下发命令记录 + /// + /// + /// + public int SaveCmdExec(sample_exec_ext cmdExec) + { + + var _db = DBFactory.Instance; + + try + { + _db.BeginTran(); + + //主记录 + int val = _db.Insertable(cmdExec).ExecuteCommand(); + //明细 + int val2 = _db.Insertable(cmdExec.sampleExecDetails).ExecuteCommand(); + + _db.CommitTran(); + } + catch (Exception ex) + { + _db.RollbackTran(); + LoggerHelper.Logger.Error(ex.Message); + return -1; + } + + + return 1; + + } + + public List QuerySysStandards(string sampleId) + { + + List data = DBFactory.Instance.Queryable().Where(p => p.sample_id == sampleId).ToList(); + + return data; + } + + public string QueryQrcode() + { + string qrcode = ""; + + List data = DBFactory.Instance.Queryable().Where(p => p.class_id == 1).ToList(); + if (data.Count > 0) + { + qrcode = (int.Parse(data[0].data_value) + 1).ToString("0000"); + } + return qrcode; + + } + + public int SaveDataAndQrcode(tube_input qRcode, sys_dict sys_Dict) + { + + var _db = DBFactory.Instance; + + try + { + _db.BeginTran(); + + //保存样品记录 + _db.Insertable(qRcode).ExecuteCommand(); + + //更新二维码 + int val = _db.Updateable() + .SetColumns(p => new sys_dict() { data_value = sys_Dict.data_value }) + .Where(p => p.class_id == 1) + .ExecuteCommand(); + + _db.CommitTran(); + } + catch (Exception ex) + { + _db.RollbackTran(); + LoggerHelper.Logger.Error(ex.Message); + return -1; + } + + + return 1; + } + + public List GetTubeData(DateTime dt1, DateTime dt2) + { + List data = DBFactory.Instance.Queryable().Where(p => p.input_date >= dt1 && p.input_date <= dt2).ToList(); + + + return data;; + } + + /// + /// 生成指令字节数组byte + /// + /// + /// + /// + public List CreateCmdBytes(List sysAction, List sopIds, List standardProcessParms) + { + string cmdReamrk = ""; + + List sop = new List(); + + try + { + //起始位 + sop.Insert(0, 0xCC); + cmdReamrk += $"【0 开始:{sop[0]}】 "; + + //插入总字节数-占位 + sop.Insert(1, 0); + //cmdReamrk += $"【1 总字节数:{Convert.ToByte(seq + 1)}】 "; + + //插入总动作数 + sop.Insert(2, 0); + //cmdReamrk += $"【2 总动作数:0】 "; + + int seq = 3; + + //总动作数 + int actionCount = 0; + //=============== + foreach (string standrad_id in sopIds) + { + //查询标准下的动作 + var standardActions = GetStrandActionByStrandId(standrad_id); + //动作排序 + standardActions = standardActions.OrderBy(p => p.process_no).ToList(); + + actionCount += standardActions.Count(); + + foreach (var actionItem in standardActions) + { + //int start = seq; //记录起始位置 + + //转换PLC映射名称 + string action_plc = sysAction.FirstOrDefault(p => p.id == actionItem.process_id)?.plc_type; + //动作类型(如:离心) + byte action_byte = Convert.ToByte(action_plc); + sop.Insert(seq, action_byte); + cmdReamrk += $"【{seq} 动作:{sop[seq]}】 "; + seq++; + + //查询动作下的参数 + var paramData = standardProcessParms.Where(p => p.action_id == actionItem.process_id && p.action_seqno == actionItem.process_no && p.standard_id == standrad_id).ToList(); + //插入动作字节长度 + int actionLenth = (int)(paramData.Count() * 5 + 2); + sop.Insert(seq, (byte)actionLenth); + cmdReamrk += $"【{seq} 动作字节长度:{sop[seq]}】 "; + seq++; + + foreach (var item in paramData) + { + //转换plc参数类型 + string param_plc = item.plc_type;//parms.FirstOrDefault(p => p.title == item.title).plc_type; + + //参数类型(如:时间) + byte parm_byte = Convert.ToByte(param_plc); + sop.Insert(seq, parm_byte); + cmdReamrk += $"【{seq} 参数类型:{sop[seq]}】 "; + seq++; + + + sys_standard_action_parm_ext actionParm = standardProcessParms.FirstOrDefault(p => p.title == item.title); + string param_val = actionParm.data_value; + if (actionParm.unit.ToUpper() == "ML") //都转换成最小单位ul + { + param_val = (float.Parse(param_val) * 1000).ToString(); + } + + + //参数值 + float paramval = 0; + paramval = float.Parse(param_val); + + cmdReamrk += $"【{seq} 参数值float:{paramval}】 "; + + + byte[] paramval_bytes = BitConverter.GetBytes(paramval); + + sop.Insert(seq, paramval_bytes[0]); + cmdReamrk += $"【{seq} 参数值byte:{sop[seq]}-"; + seq++; + sop.Insert(seq, paramval_bytes[1]); + cmdReamrk += $"{sop[seq]}-"; + seq++; + sop.Insert(seq, paramval_bytes[2]); + cmdReamrk += $"{sop[seq]}-"; + seq++; + sop.Insert(seq, paramval_bytes[3]); + cmdReamrk += $"{sop[seq]}】 "; + seq++; + + } + + + } + + } + + + //================= + + + + + + + //结束 + sop.Insert(seq, 0xEE); + cmdReamrk += $"【{seq} 结束:{sop[seq]}-"; + seq++; + sop.Insert(seq, 0xEE); + cmdReamrk += $"{sop[seq]}】 "; + seq++; + + + //修改总字节数 + sop[1] = (byte)sop.Count; + cmdReamrk += $"【1 总字节数:{sop[1]}】 "; + + //修改总动作数据 + sop[2] = (byte)actionCount; + cmdReamrk += $"【2 总动作数:{sop[2]}】 "; + + LoggerHelper.Logger.Info($"{cmdReamrk}"); + + + return sop; + } + catch (Exception ex) + { + + LoggerHelper.Logger.Error(ex.StackTrace); + + + return null; + } + } + + + /// + /// 生成指令字节数组ushort + /// + /// + /// + /// + public List CreateCmdUshorts(List sysAction, List standardActions, List standardProcessParms) + { + string cmdReamrk = ""; + + List sop = new List(); + + try + { + //起始位 + sop.Insert(0, 0xCC); + cmdReamrk += $"【0 开始:{sop[0]}】 "; + + //插入总字节数 + sop.Insert(1, 0); + //cmdReamrk += $"【1 总字节数:{0}】 "; + + //插入总动作数 + sop.Insert(2, Convert.ToByte(standardActions.Count())); + cmdReamrk += $"【2 总动作数:{Convert.ToByte(standardActions.Count())}】 "; + + + + int seq = 3; + foreach (var actionItem in standardActions) + { + int start = seq; //记录起始位置 + + //转换PLC映射名称 + string action_plc = sysAction.FirstOrDefault(p => p.id == actionItem.process_id)?.plc_type; + //动作类型(如:离心) + ushort action_byte = Convert.ToUInt16(action_plc); + sop.Insert(seq, action_byte); + cmdReamrk += $"【{seq} 动作:{sop[seq]}】 "; + seq++; + + //查询动作下的参数 + var paramData = standardProcessParms.Where(p => p.action_id == actionItem.process_id && p.action_seqno == actionItem.process_no).ToList(); + //插入动作寄存器长度 + int actionLenth = (int)(paramData.Count() * 3 + 2); + sop.Insert(seq, (byte)actionLenth); + cmdReamrk += $"【{seq} 动作长度:{sop[seq]}】 "; + seq++; + + foreach (var item in paramData) + { + //转换plc参数类型 + string param_plc = item.plc_type;//parms.FirstOrDefault(p => p.title == item.title).plc_type; + + //参数类型(如:时间) + ushort parm_byte = Convert.ToUInt16(param_plc); + sop.Insert(seq, parm_byte); + cmdReamrk += $"【{seq} 参数类型:{sop[seq]}】 "; + seq++; + + + sys_standard_action_parm_ext actionParm = standardProcessParms.FirstOrDefault(p => p.title == item.title); + string param_val = actionParm.data_value; + if (actionParm.unit.ToUpper() == "ML") //都转换成最小单位ul + { + param_val = (float.Parse(param_val) * 1000).ToString(); + } + + + //参数值 + float paramval = 0; + paramval = float.Parse(param_val); + + cmdReamrk += $"【{seq} 参数值float:{paramval}】 "; + + //===float转ushort数组 + byte[] bytes = BitConverter.GetBytes(paramval); + var a = BitConverter.ToUInt16(new byte[] { bytes[0], bytes[1] }, 0); + var b = BitConverter.ToUInt16(new byte[] { bytes[2], bytes[3] }, 0); + + ushort[] ushorts = { b, a }; + + sop.Insert(seq, ushorts[0]); + cmdReamrk += $"【{seq} 参数值ushort:{sop[seq]}-"; + seq++; + + sop.Insert(seq, ushorts[1]); + cmdReamrk += $"{sop[seq]}】 "; + seq++; + + //============ + + + } + + + } + + + + //结束 + sop.Insert(seq, 0xEE); + cmdReamrk += $"【{seq} 结束:{sop[seq]}-"; + seq++; + sop.Insert(seq, 0xEE); + cmdReamrk += $"{sop[seq]}】 "; + seq++; + + + //修改总寄存器数量 + sop[1] = (ushort)sop.Count; + cmdReamrk += $"【1 总寄存器数:{sop[1]}】 "; + + LoggerHelper.Logger.Info($"{cmdReamrk}"); + + + return sop; + } + catch (Exception ex) + { + + LoggerHelper.Logger.Error(ex.StackTrace); + + + return null; + } + } + + + + public List GetSampleExecDetails() + { + var result = DBFactory.Instance.Queryable() + .LeftJoin((a, b) => a.master_id == b.id) + .LeftJoin((a, b, c) => a.qrcode == c.qrcode) + .Where((a, b, c) => b.exec_state == "执行中") + .Select((a, b, c) => new sample_exec_detail_ext { + id = a.id, + master_id = a.master_id, + qrcode = a.qrcode, + exec_state = b.exec_state, + item_name= c.item_name, + standrad_id = c.standrad_id, + standrad = c.standrad, + input_date = c.input_date, + input_user = c.input_user + + }) + .ToList(); + + + return result;// sampleSequenceDal.GetSampleExecDetails(); + } + + public List QueryTubeInputByBachNo(string bachNo) + { + return DBFactory.Instance.Queryable().Where(p => p.bach_no == bachNo).ToList(); + } + + public List GetStrandActionByStrandId(string standrad_id) + { + + + List data = DBFactory.Instance.Queryable() + .LeftJoin((a, b) => a.process_id == b.id) + .Where((a, b) => a.standard_id == standrad_id) + .Select((a, b) => new sys_standard_action_ext + { + id = a.id, + standard_id = a.standard_id, + process_id = a.process_id, + process_no = a.process_no, + action_name = b.action_name, + remark = b.remark + }) + .ToList(); + + return data; + } + } + + +} diff --git a/SamplePre.ProcessBll/BLL/SysParamBll.cs b/SamplePre.ProcessBll/BLL/SysParamBll.cs new file mode 100644 index 0000000..c6559cd --- /dev/null +++ b/SamplePre.ProcessBll/BLL/SysParamBll.cs @@ -0,0 +1,86 @@ +using Models.Models; +using SamplePre.DAL; +using SamplePre.DAL.DBContext; +using SamplePre.Models.Ext; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.ProcessBll.BLL +{ + public class SysParamBll + { + public int DelSysParm(string id) + { + + int val = DBFactory.Instance.Deleteable().Where(p => p.id == id).ExecuteCommand(); + + return val; + } + + /// + /// 判断该参数是否被使用,已使用不能删除 + /// + /// + /// + /// + public bool IsExtisActionParam(string parmId) + { + + //动作参数 + List data = DBFactory.Instance.Queryable() + .Where(p=>p.parm_id == parmId).ToList(); + if(data.Count > 0) return true; + + //标准动作参数配置表 + List data2 = DBFactory.Instance.Queryable() + .Where(p => p.parm_id == parmId).ToList(); + if (data2.Count > 0) return true; + + + return false; + } + + /// + /// 判断plc编码是否存在 + /// + /// + /// + public bool IsExtisPlCcode(string plcCode) + { + List data2 = DBFactory.Instance.Queryable() + .Where(p => p.plc_type == plcCode).ToList(); + if (data2.Count > 0) return true; + + return false; + } + + public List QuerySysParm() + { + + List data = DBFactory.Instance.Queryable().ToList(); + + return data; + } + + public int SaveSysParm(sys_parm parm) + { + int val = DBFactory.Instance.Insertable(parm).ExecuteCommand(); + return val; + } + + /// + /// 更新参数数据 + /// + /// + /// + public int UpdateSysParm(sys_parm parm) + { + int val = DBFactory.Instance.Updateable(parm).ExecuteCommand(); + + return val; + } + } +} diff --git a/SamplePre.ProcessBll/BLL/SystemBll.cs b/SamplePre.ProcessBll/BLL/SystemBll.cs new file mode 100644 index 0000000..b97ac72 --- /dev/null +++ b/SamplePre.ProcessBll/BLL/SystemBll.cs @@ -0,0 +1,107 @@ +using DataDAL; +using Models.Ext; +using Models.Models; +using S7.Net.Types; +using SamplePre.DAL; +using SamplePre.DAL.DBContext; +using SamplePre.Models.Ext; +using SamplePre.Models.Models; +using SamplePre.Models.Tables; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SamplePre.ProcessBll.BLL +{ + public class SystemBll + { + + + SystemDal systemDal = new SystemDal(); + + + public int DelDictClassById(int classid) + { + var val = DBFactory.Instance.Deleteable(p => p.id == classid).ExecuteCommand(); + return val; + } + + public int DelSysDictByid(sys_dict sys_Dict) + { + var val = DBFactory.Instance.Deleteable(p => p.id == sys_Dict.id).ExecuteCommand(); + + return val; + } + + + /// + /// 根据分类id查询字典明细 + /// + /// + /// + public List QueryDictByClassId(int classid) + { + List data = DBFactory.Instance.Queryable().Where(p => p.class_id == classid).ToList(); + + return data; + } + + /// + /// 查询字典分类 + /// + /// + public List QueryDictClassData() + { + List data = DBFactory.Instance.Queryable().ToList(); + return data; + } + + public List QueryDictData() + { + List data = DBFactory.Instance.Queryable().ToList(); + + return data; + } + + public int SaveSysDict(sys_dict sysDict) + { + var val = DBFactory.Instance.Insertable(sysDict).ExecuteCommand(); + return val; + } + + public int SaveSysDictClass(sys_dict_class sysDictClass) + { + var val = DBFactory.Instance.Insertable(sysDictClass).ExecuteCommand(); + return val; + } + + + + /// + /// 查询系统功能 + /// + /// + /// + public List QueryFunctionList() + { + List data = DBFactory.Instance.Queryable().ToList(); + + List newData = new List(); + foreach (var item in data.Where(p=>p.parent_id == 0)) + { + foreach(var newItem in data.Where(p => p.parent_id == item.id).ToList()) + { + newItem.description = item.name; + newData.Add(newItem); + } + + } + + return newData; + } + + } +} diff --git a/SamplePre.ProcessBll/ConfigManagerBLL/RolesBll.cs b/SamplePre.ProcessBll/ConfigManagerBLL/RolesBll.cs new file mode 100644 index 0000000..ab49f93 --- /dev/null +++ b/SamplePre.ProcessBll/ConfigManagerBLL/RolesBll.cs @@ -0,0 +1,159 @@ +using DataDAL; +using Models.Const; +using Models.Ext; +using Models.Models; +using SamplePre.Common; +using SamplePre.Common.Helper; +using SamplePre.DAL; +using SamplePre.DAL.DBContext; +using SamplePre.Models; +using SamplePre.Models.Ext; +using SamplePre.Models.Tables; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static System.Collections.Specialized.BitVector32; + +namespace SamplePre.ProcessBll.BLL +{ + public class RolesBll + { + + + /// + /// 删除角色 + /// + /// + /// + /// + public int DeleteRole(config_role role) + { + + var _db = DBFactory.Instance; + + try + { + _db.BeginTran(); + var val = _db.Deleteable(role) + .Where(p => p.id == role.id) + .ExecuteCommand(); + + + //// + //删除角色权限 + _db.Deleteable().Where(p => p.role_id == role.id).ExecuteCommand(); + + + _db.CommitTran(); + } + catch (Exception ex) + { + _db.RollbackTran(); + LoggerHelper.Logger.Error(ex.Message); + return -1; + } + + return 1; + + } + + /// + /// 获取功能树 + /// + /// + /// + public List GetFuncDataTree() + { + List funcList = DBFactory.Instance.Queryable().ToList(); + List funcList2 = new List(); + + foreach(var item in funcList) + { + config_function_ext ext = new config_function_ext(); + ext.code = item.code; + ext.id = item.id; + ext.name = item.name; + ext.description = item.description; + ext.IsChecked = false; + ext.parent_id = item.parent_id; + + funcList2.Add(ext); + } + + return funcList2; + + } + + /// + /// 获取角色的权限id集合 + /// + /// + /// + public List GetPermission(string id) + { + var list = DBFactory.Instance.Queryable() + .Where(p => p.role_id == id) + .Select(p => p.function_id) + .ToList(); + + return list; + } + + public List GetRoles() + { + List roles = DBFactory.Instance.Queryable().ToList(); + + return roles; + } + + public int SavePermission(List rolePermissonList) + { + var _db = DBFactory.Instance; + + try + { + _db.BeginTran(); + + //先删除 + var val = _db.Deleteable() + .Where(p => p.role_id == rolePermissonList[0].role_id) + .ExecuteCommand(); + + + ///保存权限 + DBFactory.Instance.Insertable(rolePermissonList).ExecuteCommand(); + + _db.CommitTran(); + } + catch (Exception ex) + { + _db.RollbackTran(); + LoggerHelper.Logger.Error(ex.Message); + return -1; + } + + return 1; + + + + } + + public int SaveRoleData(config_role configRole) + { + var val = DBFactory.Instance.Insertable(configRole).ExecuteCommand(); + + return val; + } + + public int UpdateRoleData(config_role configRole) + { + var val = DBFactory.Instance.Updateable(configRole).ExecuteCommand(); + + return val; + } + } +} diff --git a/SamplePre.ProcessBll/ConfigManagerBLL/UsersBll.cs b/SamplePre.ProcessBll/ConfigManagerBLL/UsersBll.cs new file mode 100644 index 0000000..0b7ec0b --- /dev/null +++ b/SamplePre.ProcessBll/ConfigManagerBLL/UsersBll.cs @@ -0,0 +1,176 @@ +using DataDAL; +using Models.Const; +using Models.Ext; +using Models.Models; +using SamplePre.Common; +using SamplePre.DAL; +using SamplePre.DAL.DBContext; +using SamplePre.Models.Ext; +using SamplePre.Models.Tables; +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static System.Collections.Specialized.BitVector32; + +namespace SamplePre.ProcessBll.BLL +{ + public class UsersBll + { + + SystemDal systemDal = new SystemDal(); + + /// + /// 获取用户数据 + /// + /// + public List GetUsers() + { + //List users = DBFactory.Instance.Queryable().ToList(); + + var users = systemDal.QueryUserData(); + return users; + } + + + public List GetRoles() + { + List roles = DBFactory.Instance.Queryable() + .ToList(); + + return roles; + } + + public int SaveUserData(config_user configUser, List roles) + { + //throw new NotImplementedException(); + + var _db = DBFactory.Instance; + + try + { + _db.BeginTran(); + var val = _db.Insertable(configUser).ExecuteCommand(); + + var val2 = _db.Insertable(roles).ExecuteCommand(); + + _db.CommitTran(); + } + catch (Exception ex) + { + _db.RollbackTran(); + LoggerHelper.Logger.Error(ex.Message); + return -1; + } + + return 1; + + + } + + public int UpdateUserData(config_user configUser, List roles) + { + var _db = DBFactory.Instance; + + try + { + _db.BeginTran(); + var val = _db.Updateable() + .SetColumns(it => new config_user() { username = configUser.username + ,password = configUser.password + ,is_enabled = configUser.is_enabled }) + .Where(p => p.id == configUser.id) + .ExecuteCommand(); + + + ////用户角色 + //先删除,后插入 + _db.Deleteable().Where(p => p.user_id == configUser.id).ExecuteCommand(); + var val2 = _db.Insertable(roles).ExecuteCommand(); + + _db.CommitTran(); + } + catch (Exception ex) + { + _db.RollbackTran(); + LoggerHelper.Logger.Error(ex.Message); + return -1; + } + + return 1; + } + + public int DeleteUser(config_user user) + { + var _db = DBFactory.Instance; + + try + { + _db.BeginTran(); + var val = _db.Deleteable(user) + .Where(p => p.id == user.id) + .ExecuteCommand(); + + + //// + //先删除用户角色 + _db.Deleteable().Where(p => p.user_id == user.id).ExecuteCommand(); + + + _db.CommitTran(); + } + catch (Exception ex) + { + _db.RollbackTran(); + LoggerHelper.Logger.Error(ex.Message); + return -1; + } + + return 1; + } + + public List GetUserRoles(string userId) + { + + var result = DBFactory.Instance.Queryable() + .Where(a=> a.user_id == userId) + .ToList(); + + + + return result; + } + + + public bool CheckUser(string userName, string pwd) + { + var users = DBFactory.Instance.Queryable().Where(p => p.username == userName && p.password == pwd).Single(); + if(users == null || string.IsNullOrEmpty(users.username)) return false; + + SystemConst.loginUserInfo.user = users; + + //查询用户权限 + var result = DBFactory.Instance.Queryable() + .RightJoin((a, b) => a.role_id == b.role_id) + .LeftJoin((a, b, c) => b.function_id == c.id) + .Where((a, b, c) => a.user_id == users.id) + .Select((a, b, c) => new config_function + { + id = c.id, + name = c.name, + code = c.code, + parent_id = c.parent_id, + description = c.description + }) + .ToList(); + + SystemConst.loginUserInfo.functions = result; + + return true; + } + + + } +} diff --git a/SamplePre.ProcessBll/SamplePre.ProcessBll.csproj b/SamplePre.ProcessBll/SamplePre.ProcessBll.csproj new file mode 100644 index 0000000..163a4e6 --- /dev/null +++ b/SamplePre.ProcessBll/SamplePre.ProcessBll.csproj @@ -0,0 +1,22 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + + diff --git a/SamplePre.ViewModel/Class1.cs b/SamplePre.ViewModel/Class1.cs new file mode 100644 index 0000000..d67b6bd --- /dev/null +++ b/SamplePre.ViewModel/Class1.cs @@ -0,0 +1,7 @@ +namespace SamplePre.ViewModel +{ + public class Class1 + { + + } +} diff --git a/SamplePre.ViewModel/SamplePre.ViewModel.csproj b/SamplePre.ViewModel/SamplePre.ViewModel.csproj new file mode 100644 index 0000000..fa71b7a --- /dev/null +++ b/SamplePre.ViewModel/SamplePre.ViewModel.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/SamplePreSystem.UI/Assets/App.png b/SamplePreSystem.UI/Assets/App.png new file mode 100644 index 0000000000000000000000000000000000000000..d281cd419eac5bba1b0c01a97e64b72ce736455d GIT binary patch literal 1357 zcmV-T1+w~yP)m>|cIuq}T&lX7OyA-8yZdX`^j1;-3(VvD+y3MG(cRZ~qa_qKoos1x z8)EF!-1Fu;2ViS3w%iI(7DL?5LsVWWn#G{8iT+HAD=G9nZ$9{!Z9%mHgTSFJw*pBk zEABl{0(1r4Tt7|jOm6p{?*~2RI-Bj4`QY!Cpr*86E#CwK5DPH@BD10^D}GfflRvJ0 zTbXYM)DT%qdzk5?z>msEdcmr`ta5gK`oKR^W}` zMYA5RKUjI@K<{}nvzNS#uuYG7=qQ*n;VO^VBFlI)*-HQ#ASii=x>1gT0XgAuXzsnR zv7l`S&pJn@4)rb(rhZWT1vy>wP}k)E3=D*aED4=)#buY8s(w|&JFLd-P5PWMqp6Po zcyj2A6dszSJcjU-$U~_<9%xDjU>Hr|xqd2=)q*#jFvX%d$|7Wii4gd)93SG%DS2^4 z7{(#S4>9P0KKV9jPz>3PqJEBrvE4@wPjsfz0D~fcc-+>wmN;83`F*f(amGO2Q6_aZ zG38SX>Oy!xa$dl5vRtg!9Ewt5Y+M+4#oPeH;0H*y$h8S2|4`@UqD5!39h)K+t}il! zA769m!6S@GITAzoV*VwIHF`p-mwLXsV@%7YUUYDYJ(ORdMcQY3${vM)@)%Lbb^)Ogzq? zV-_=27l+EAde0NTF81htU_;DYg)GEv(z_2vG00&tZz8;cOG9PNA}IUIfb<<7bT+}9 zveu}h^e1((w7$4V;lVRDbl)@4*`0RG z?jjQLCZ_GGOSbjEiRU98AbAWLhq%cdw%s*t+M!HbWLj?%Ohh3<>a9k*F5bF?Dp}$L zj+~$dDYj>)Jp9fF6hB%)6_q+n9<0s>X?x%u&s(XzA%#`posqAgekJ4v8=@|C))TBJ zok?ES08=209MMXM&9F!EiJ9*7k&XAkgF9Hnn2k2A(K zLVj(S&sH;ZSS(9?%1BDb19e@Ff^lwiHroMQ<@GT99z!;0OL)v7WO=gyn$QQl?OWvJ zfafR}i!dN7r)@9Xiyh_=wIS9tigTp!i0m;gTgR`nC&7rvit*4DP2Suo1ZSPL2Jy&E zj(j4?L!X=)uLW0k&5XI5tw#jp>OP+A3dtA6IgRxgjD=?J= z3p6MTH!#NSa+8y>{sW)@FiD{sRC2|Nj^9KnDN-00v1!K~w_(m@5QS^5k31 P00000NkvXXu0mjfUM_#T literal 0 HcmV?d00001 diff --git a/SamplePreSystem.UI/Assets/Warning.png b/SamplePreSystem.UI/Assets/Warning.png new file mode 100644 index 0000000000000000000000000000000000000000..04e242b63493e4b8d85e2bfec82f61ea0580ab5f GIT binary patch literal 905 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≠$LvbDZTi9y%OTAnWqR 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 literal 0 HcmV?d00001 diff --git a/SamplePreSystem.UI/Assets/分液1.png b/SamplePreSystem.UI/Assets/分液1.png new file mode 100644 index 0000000000000000000000000000000000000000..49f856b8af8d5928e02c31eccc751e8275e1692d GIT binary patch literal 1040 zcmV+r1n>KaP)F^aRYX=C!t;O+8(0qA=)m1lTdctfcKI`d;ka>An~BTU719d zEhWf~lV`mswmv*FKaDKQk`*057~D;7Ufxf?4(_KixS!0BuEN@TV1N?SH4~js7I=vC z;9>G9OIm+>3;g2Y#}Keg^aM)lLCBfESHOTocSW~Vax|-iB^{U^$q_maY#`xHK%%=6 z@sK=05r1)2QLfA`CcN%_dRSN2YR$Mpld8eLPHAOro1?w zUyhG)M4Vra80jilT)uM;8_4x83)AeFL&AH2nqQ4>{#?Axyo)2EeT6H%GhhR1JXzai zwKol9o%dXTc3!K%1~RnEnl1`&+JyM=)HkRnLn8GT^*YT79JWnCMnKMUdu;n99W4I zlX%5^-Zr4EuW?|E!1=Rv#Q!@>vW?#+-8e9eYWmp<9ig!m;80`Qs22_R^~3Z8bL8+i znY96E>xc%t6uP#B*Qa;$T#g2e(O8HcDJY13kCkMpmVxzyga%cL28_}8_vPr6^c>lz zIpyW)T(4B@VlZ<8V+uIHg0?53o)0dx9P7v-Ix$v+%5>Fp0_Rge%#iBi>a@`%e4{+! zGs;#YSTY-3~(ZsPt+iZk=ko{3T9c z+*@^mg*d4z_p2?}fKH{Tau8#dB*sk52}}nZdf)?gZid!-IBSN3{iEg=0J_$8eV6W< zM`GL4dpLHBc1>RI;jVckwmrRvW4CD6=zPU>_%dG{*2ANBos`wV!Rd)@)+ASe;r%i5qA3*uFJQ(E5IW!Q1B^R`Xb0z)XaU2rsU?%7_c+dar-NRoLn zPn7;qwz|!O29MdmUSJrI@A>3knwKoJGGH8xw6cq&3iy&I+c(a(T_t(ORPuNsY>N{w zFl6F0LG0%O25Dckdxfcwh6s^?M&4AX(cwD=0sDm5>tv4jy2rv|v2A_rp zJLn9FjRC{UX7E8*_6>F+#>S}g7XSeN|7>!hPyhe`21!IgR09AI5Y8>?`#CfK0000< KMNUMnLSTZRfcPi? literal 0 HcmV?d00001 diff --git a/SamplePreSystem.UI/Assets/加液1.png b/SamplePreSystem.UI/Assets/加液1.png new file mode 100644 index 0000000000000000000000000000000000000000..c1a441143eebfed5b6b675625d0f6e82c8c062a9 GIT binary patch literal 955 zcmV;s14R6ZP)i+>5Z;r>*r_rR^r4_hlQDh)7k-bp$a92(JO_nS`WceKc>u_yNkc(;z?06Ii8${k zp&4{{k`BaSBTl2^es*ua{dOe|qzmZoEu<14%CVBcfCxH@pmtYw zrEHBYwwan0{#Ga|ON zD?Dq$wvIwi(&`WDLzQjttO*BVHIyXpt4W9%bgAY68!qsy2`}2e?jJfoud&vZmvIle zHTe>3xWKa}T$jL0nePd|luWqt!#cyR*2N-XuJEi0yIL2E2)n|wCS2s0XnkoW2ZI3f8YM*dsyDGY~vI+`u(^eR+{+HKqQp=SKg+!DR-n}hr`nd!<#t#_XTyX zNWu>JL2k^@iRS$Q-}m2DkB&D7k8Yg;EEvkT4wLKl;Oh$U|INFn8IWDBlOg(++`GN*Jyo@^Sds zLVeJBME5e1I9g*M(009601;y@T00006 dNkl=&&>b; literal 0 HcmV?d00001 diff --git a/SamplePreSystem.UI/Assets/固相萃取1.png b/SamplePreSystem.UI/Assets/固相萃取1.png new file mode 100644 index 0000000000000000000000000000000000000000..0b9b7795bf9ed0287a91e03d118b7e3c219069f0 GIT binary patch literal 1948 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 T4koXm00000NkvXXu0mjfGS(JX literal 0 HcmV?d00001 diff --git a/SamplePreSystem.UI/Assets/样品管理.png b/SamplePreSystem.UI/Assets/样品管理.png new file mode 100644 index 0000000000000000000000000000000000000000..f2603acfcb425d52f2f8defb4bf739b17fb974f2 GIT binary patch literal 955 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 U8Z`LEumAu607*qoM6N<$f*7}oEdT%j literal 0 HcmV?d00001 diff --git a/SamplePreSystem.UI/BaseControls/BaseWindow.cs b/SamplePreSystem.UI/BaseControls/BaseWindow.cs new file mode 100644 index 0000000..eac6395 --- /dev/null +++ b/SamplePreSystem.UI/BaseControls/BaseWindow.cs @@ -0,0 +1,156 @@ +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.Input; +using System.Windows.Media; + +namespace SamplePre.UIWpf.BaseWindows +{ + public class BaseWindow : Window + { + public BaseWindow() + { + //InitializeStyle(); + //this.Loaded += delegate + //{ + // InitializeEvent(); + //}; + + InitializeStyle(); + // 一定要在 Loaded 里执行,确保模板已加载 + Loaded += (s, e) => InitializeEvent(); + + + } + + + private void InitializeEvent() + { + // ✅ 关键:从可视化树查找模板内的元素 + Button btnMin = FindChild