初始化提交

仓库转移到Gitea,初始化提交,可能丢失以前的git版本日志
This commit is contained in:
2025-11-27 16:41:05 +08:00
commit 027d0f8024
663 changed files with 171319 additions and 0 deletions

View File

@@ -0,0 +1,145 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{ADAAE578-C251-416E-B46F-D0B4D50C3663}</ProjectGuid>
<OutputType>WinExe</OutputType>
<StartupObject>AUTS_Studio.My.MyApplication</StartupObject>
<RootNamespace>AUTS_Studio</RootNamespace>
<AssemblyName>AUTS_Studio</AssemblyName>
<FileAlignment>512</FileAlignment>
<MyType>WindowsForms</MyType>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<DefineDebug>true</DefineDebug>
<DefineTrace>true</DefineTrace>
<OutputPath>bin\Debug\</OutputPath>
<DocumentationFile>AUTS_Studio.xml</DocumentationFile>
<NoWarn>
</NoWarn>
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<DefineDebug>false</DefineDebug>
<DefineTrace>true</DefineTrace>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DocumentationFile>AUTS_Studio.xml</DocumentationFile>
<NoWarn>
</NoWarn>
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
</PropertyGroup>
<PropertyGroup>
<OptionExplicit>On</OptionExplicit>
</PropertyGroup>
<PropertyGroup>
<OptionCompare>Binary</OptionCompare>
</PropertyGroup>
<PropertyGroup>
<OptionStrict>On</OptionStrict>
</PropertyGroup>
<PropertyGroup>
<OptionInfer>Off</OptionInfer>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>MeIcon.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="MySql.Data, Version=8.0.20.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\UTS_Core\bin\Debug\MySql.Data.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Net.Http" />
</ItemGroup>
<ItemGroup>
<Import Include="Microsoft.VisualBasic" />
<Import Include="System" />
<Import Include="System.Collections" />
<Import Include="System.Collections.Generic" />
<Import Include="System.Data" />
<Import Include="System.Drawing" />
<Import Include="System.Diagnostics" />
<Import Include="System.Windows.Forms" />
<Import Include="System.Linq" />
<Import Include="System.Xml.Linq" />
<Import Include="System.Threading.Tasks" />
</ItemGroup>
<ItemGroup>
<Compile Include="FrmMain.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmMain.Designer.vb">
<DependentUpon>FrmMain.vb</DependentUpon>
<SubType>Form</SubType>
</Compile>
<Compile Include="My Project\AssemblyInfo.vb" />
<Compile Include="My Project\Application.Designer.vb">
<AutoGen>True</AutoGen>
<DependentUpon>Application.myapp</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<Compile Include="My Project\Resources.Designer.vb">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="My Project\Settings.Designer.vb">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="FrmMain.resx">
<DependentUpon>FrmMain.vb</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="My Project\Resources.resx">
<Generator>VbMyResourcesResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
<CustomToolNamespace>My.Resources</CustomToolNamespace>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Include="My Project\Application.myapp">
<Generator>MyApplicationCodeGenerator</Generator>
<LastGenOutput>Application.Designer.vb</LastGenOutput>
</None>
<None Include="My Project\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<CustomToolNamespace>My</CustomToolNamespace>
<LastGenOutput>Settings.Designer.vb</LastGenOutput>
</None>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\UTS_Core\UTS_Core.vbproj">
<Project>{33c6456c-f00d-41ac-a6fb-db0601495c6a}</Project>
<Name>UTS_Core</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="Document\Version.txt" />
<Content Include="MeIcon.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
</Project>

26
AUTS_Studio/App.config Normal file
View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.4.0" newVersion="4.0.4.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Google.Protobuf" publicKeyToken="a7d26565bac4d604" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.30.1.0" newVersion="3.30.1.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -0,0 +1,16 @@
UTS_Studio
V0.1 2020-10-09 ML
1.实现项目创建,可设置项目名称,项目描述,以及项目站设计,项目站设计包含站名,站描述,站包等设计。
2.实现项目保存与读取,可将项目临时保存至本地,后续读取本地文件,还原项目设计,也可以从远端数据库直接读取设置好的项目。
3.实现项目发布,将当前设计的项目信息与项目站信息保至云端数据库,同时创建项目相关数据表与触发器。
4.实现项目站编辑,支持项目站顺序调整,添加或删除。
V0.2 2020-10-12 ML
1.将项目设计相关页面集合至Uts_core集合里,便于其他uts项目使用。
V1.0 2021-05-28 ML
1.重构项目创建发布过程内容,包括新增项目索引,项目发布前重名检测,新增项目预览图
2.项目工艺站新增预览图
3.新增工艺站类型Q1,用于扫码目检

143
AUTS_Studio/FrmMain.Designer.vb generated Normal file
View File

@@ -0,0 +1,143 @@
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
Partial Class FrmMain
Inherits System.Windows.Forms.Form
'Form 重写 Dispose以清理组件列表。
<System.Diagnostics.DebuggerNonUserCode()>
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer
'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改它。
'不要使用代码编辑器修改它。
<System.Diagnostics.DebuggerStepThrough()>
Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(FrmMain))
Me.MnsMain = New System.Windows.Forms.MenuStrip()
Me.MsiUser = New System.Windows.Forms.ToolStripMenuItem()
Me.注销ToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.退出QToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.MsiProject = New System.Windows.Forms.ToolStripMenuItem()
Me.MsiHelp = New System.Windows.Forms.ToolStripMenuItem()
Me.MsiAbout = New System.Windows.Forms.ToolStripMenuItem()
Me.StuMain = New System.Windows.Forms.StatusStrip()
Me.TsrMain = New System.Windows.Forms.ToolStrip()
Me.TabMain = New System.Windows.Forms.TabControl()
Me.MnsMain.SuspendLayout
Me.SuspendLayout
'
'MnsMain
'
Me.MnsMain.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.MsiUser, Me.MsiProject, Me.MsiHelp, Me.MsiAbout})
Me.MnsMain.Location = New System.Drawing.Point(0, 0)
Me.MnsMain.Name = "MnsMain"
Me.MnsMain.Size = New System.Drawing.Size(1008, 25)
Me.MnsMain.TabIndex = 0
Me.MnsMain.Text = "MenuStrip1"
'
'MsiUser
'
Me.MsiUser.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.注销ToolStripMenuItem, Me.退出QToolStripMenuItem})
Me.MsiUser.Name = "MsiUser"
Me.MsiUser.Size = New System.Drawing.Size(61, 21)
Me.MsiUser.Text = "用户(&U)"
'
'注销ToolStripMenuItem
'
Me.注销ToolStripMenuItem.Name = "注销ToolStripMenuItem"
Me.注销ToolStripMenuItem.Size = New System.Drawing.Size(118, 22)
Me.注销ToolStripMenuItem.Text = "注销(&C)"
'
'退出QToolStripMenuItem
'
Me.退出QToolStripMenuItem.Name = "退出QToolStripMenuItem"
Me.退出QToolStripMenuItem.Size = New System.Drawing.Size(118, 22)
Me.退出QToolStripMenuItem.Text = "退出(&Q)"
'
'MsiProject
'
Me.MsiProject.Name = "MsiProject"
Me.MsiProject.Size = New System.Drawing.Size(59, 21)
Me.MsiProject.Text = "项目(&P)"
'
'MsiHelp
'
Me.MsiHelp.Name = "MsiHelp"
Me.MsiHelp.Size = New System.Drawing.Size(61, 21)
Me.MsiHelp.Text = "帮助(&H)"
'
'MsiAbout
'
Me.MsiAbout.Name = "MsiAbout"
Me.MsiAbout.Size = New System.Drawing.Size(60, 21)
Me.MsiAbout.Text = "关于(&A)"
'
'StuMain
'
Me.StuMain.Location = New System.Drawing.Point(0, 707)
Me.StuMain.Name = "StuMain"
Me.StuMain.Size = New System.Drawing.Size(1008, 22)
Me.StuMain.TabIndex = 1
Me.StuMain.Text = "StatusStrip1"
'
'TsrMain
'
Me.TsrMain.Location = New System.Drawing.Point(0, 25)
Me.TsrMain.Name = "TsrMain"
Me.TsrMain.Size = New System.Drawing.Size(1008, 25)
Me.TsrMain.TabIndex = 2
Me.TsrMain.Text = "ToolStrip1"
'
'TabMain
'
Me.TabMain.Dock = System.Windows.Forms.DockStyle.Fill
Me.TabMain.Location = New System.Drawing.Point(0, 50)
Me.TabMain.Name = "TabMain"
Me.TabMain.SelectedIndex = 0
Me.TabMain.Size = New System.Drawing.Size(1008, 657)
Me.TabMain.TabIndex = 3
'
'FrmMain
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(7!, 15!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.BackColor = System.Drawing.Color.White
Me.ClientSize = New System.Drawing.Size(1008, 729)
Me.Controls.Add(Me.TabMain)
Me.Controls.Add(Me.TsrMain)
Me.Controls.Add(Me.StuMain)
Me.Controls.Add(Me.MnsMain)
Me.Font = New System.Drawing.Font("Microsoft Sans Serif", 9!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134,Byte))
Me.Icon = CType(resources.GetObject("$this.Icon"),System.Drawing.Icon)
Me.MainMenuStrip = Me.MnsMain
Me.Name = "FrmMain"
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
Me.Text = "Form1"
Me.MnsMain.ResumeLayout(false)
Me.MnsMain.PerformLayout
Me.ResumeLayout(false)
Me.PerformLayout
End Sub
Friend WithEvents MnsMain As MenuStrip
Friend WithEvents MsiUser As ToolStripMenuItem
Friend WithEvents 注销ToolStripMenuItem As ToolStripMenuItem
Friend WithEvents 退出QToolStripMenuItem As ToolStripMenuItem
Friend WithEvents MsiProject As ToolStripMenuItem
Friend WithEvents MsiHelp As ToolStripMenuItem
Friend WithEvents MsiAbout As ToolStripMenuItem
Friend WithEvents StuMain As StatusStrip
Friend WithEvents TsrMain As ToolStrip
Friend WithEvents TabMain As TabControl
End Class

209
AUTS_Studio/FrmMain.resx Normal file
View File

@@ -0,0 +1,209 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="MnsMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="StuMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>138, 17</value>
</metadata>
<metadata name="TsrMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>261, 18</value>
</metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>57</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AAfw8AAP+PAAH/zwAD//8AD///AD///8H/8=
</value>
</data>
</root>

92
AUTS_Studio/FrmMain.vb Normal file
View File

@@ -0,0 +1,92 @@
Public Class FrmMain
''' <summary>
''' 分页控件包含的页面
''' </summary>
Enum TabControlEnum
TpProject
TpStationDesign
TpStationPlan
TpHelp
TpAbout
End Enum
Public Property UserInfo As UTS_Core.UTSModule.Login.UserInfo
Public Property UserLicense As UTS_Core.UTSModule.License.License
''' <summary>
''' 显示登录窗口
''' </summary>
Private Sub ShowLoginForm()
If UTS_Core.UTSModule.Login.LoginParams.IsShowLoginForm = False Then Return
Using frmLogin As New UTS_Core.UTSModule.Login.LoginForm
If frmLogin.ShowDialog() = DialogResult.OK Then
UserInfo = frmLogin.UserLoginInfo
UserLicense = frmLogin.UserLicense
Else
Close()
End If
End Using
End Sub
''' <summary>修改窗体标题</summary>
Private Sub ShowFormTitle()
Text = $"{My.Application.Info.ProductName} {My.Application.Info.Version} Main"
End Sub
Private Sub InitTabMain()
'隐藏TabControl的表头
TabMain.SizeMode = TabSizeMode.Fixed
TabMain.ItemSize = New Size(0, 1)
AddProjectFormToTabControl(TabControlEnum.TpProject.ToString(), "Project")
End Sub
Private Sub InitForm()
ShowFormTitle()
InitTabMain()
End Sub
''' <summary>
''' 校验文件夹,若文件夹不存在则创建
''' </summary>
Private Sub CheckDirectory()
UTS_Core.UTSModule.UtsPath.CheckDirectory()
End Sub
Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles Me.Load
CheckDirectory()
ShowLoginForm()
InitForm()
End Sub
''' <summary>
''' 添加项目设计窗体到分页控件中
''' </summary>
Private Sub AddProjectFormToTabControl(pageName As String, pageText As String)
If TabMain.TabPages.ContainsKey(pageName) Then Return
Dim page As New TabPage With {.Name = pageName, .Text = pageText}
Dim frm As New UTS_Core.UTSModule.Project.FrmProject
frm.ShowForm(page, UserInfo)
TabMain.TabPages.Add(page)
End Sub
Private Sub MsiProject_Click(sender As Object, e As EventArgs) Handles MsiProject.Click
TabMain.SelectedIndex = TabControlEnum.TpProject
End Sub
Private Sub MsiHelp_Click(sender As Object, e As EventArgs) Handles MsiHelp.Click
'帮助与关于页面暂时为设置
' TabMain.SelectedIndex = TabControlEnum.TpHelp
End Sub
Private Sub MsiAbout_Click(sender As Object, e As EventArgs) Handles MsiAbout.Click
'帮助与关于页面暂时为设置
'TabMain.SelectedIndex = TabControlEnum.TpAbout
End Sub
End Class

BIN
AUTS_Studio/MeIcon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1,38 @@
'------------------------------------------------------------------------------
' <auto-generated>
' 此代码由工具生成。
' 运行时版本:4.0.30319.42000
'
' 对此文件的更改可能会导致不正确的行为,并且如果
' 重新生成代码,这些更改将会丢失。
' </auto-generated>
'------------------------------------------------------------------------------
Option Strict On
Option Explicit On
Namespace My
'注意:此文件是自动生成的;请勿直接进行修改。若要更改,
' 或者如果您在此文件中遇到生成错误,请转至项目设计器
' (转至“项目属性”或在解决方案资源管理器中双击“我的项目”节点)
' 然后在“应用程序”选项卡中进行更改。
'
Partial Friend Class MyApplication
<Global.System.Diagnostics.DebuggerStepThroughAttribute()> _
Public Sub New()
MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows)
Me.IsSingleInstance = false
Me.EnableVisualStyles = true
Me.SaveMySettingsOnExit = true
Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses
End Sub
<Global.System.Diagnostics.DebuggerStepThroughAttribute()> _
Protected Overrides Sub OnCreateMainForm()
Me.MainForm = Global.AUTS_Studio.FrmMain
End Sub
End Class
End Namespace

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<MySubMain>true</MySubMain>
<MainForm>FrmMain</MainForm>
<SingleInstance>false</SingleInstance>
<ShutdownMode>0</ShutdownMode>
<EnableVisualStyles>true</EnableVisualStyles>
<AuthenticationMode>0</AuthenticationMode>
<SaveMySettingsOnExit>true</SaveMySettingsOnExit>
</MyApplicationData>

View File

@@ -0,0 +1,35 @@
Imports System
Imports System.Reflection
Imports System.Runtime.InteropServices
' 有关程序集的一般信息由以下
' 控制。更改这些特性值可修改
' 与程序集关联的信息。
'查看程序集特性的值
<Assembly: AssemblyTitle("AUTS_Studio")>
<Assembly: AssemblyDescription("")>
<Assembly: AssemblyCompany("")>
<Assembly: AssemblyProduct("AUTS_Studio")>
<Assembly: AssemblyCopyright("Copyright © 2020")>
<Assembly: AssemblyTrademark("")>
<Assembly: ComVisible(False)>
'如果此项目向 COM 公开,则下列 GUID 用于 typelib 的 ID
<Assembly: Guid("5a523b93-14de-4f2c-9f5a-c46e357ebbe7")>
' 程序集的版本信息由下列四个值组成:
'
' 主版本
' 次版本
' 生成号
' 修订号
'
'可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
'通过使用 "*",如下所示:
' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("1.0.0.0")>
<Assembly: AssemblyFileVersion("1.0.0.0")>

View File

@@ -0,0 +1,63 @@
'------------------------------------------------------------------------------
' <auto-generated>
' 此代码由工具生成。
' 运行时版本:4.0.30319.42000
'
' 对此文件的更改可能会导致不正确的行为,并且如果
' 重新生成代码,这些更改将会丢失。
' </auto-generated>
'------------------------------------------------------------------------------
Option Strict On
Option Explicit On
Imports System
Namespace My.Resources
'此类是由 StronglyTypedResourceBuilder
'类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
'若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
'(以 /str 作为命令选项),或重新生成 VS 项目。
'''<summary>
''' 一个强类型的资源类,用于查找本地化的字符串等。
'''</summary>
<Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0"), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
Friend Module Resources
Private resourceMan As Global.System.Resources.ResourceManager
Private resourceCulture As Global.System.Globalization.CultureInfo
'''<summary>
''' 返回此类使用的缓存的 ResourceManager 实例。
'''</summary>
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
Get
If Object.ReferenceEquals(resourceMan, Nothing) Then
Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("AUTS_Studio.Resources", GetType(Resources).Assembly)
resourceMan = temp
End If
Return resourceMan
End Get
End Property
'''<summary>
''' 重写当前线程的 CurrentUICulture 属性,对
''' 使用此强类型资源类的所有资源查找执行重写。
'''</summary>
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
Friend Property Culture() As Global.System.Globalization.CultureInfo
Get
Return resourceCulture
End Get
Set
resourceCulture = value
End Set
End Property
End Module
End Namespace

View File

@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,73 @@
'------------------------------------------------------------------------------
' <auto-generated>
' 此代码由工具生成。
' 运行时版本:4.0.30319.42000
'
' 对此文件的更改可能会导致不正确的行为,并且如果
' 重新生成代码,这些更改将会丢失。
' </auto-generated>
'------------------------------------------------------------------------------
Option Strict On
Option Explicit On
Namespace My
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0"), _
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
Partial Friend NotInheritable Class MySettings
Inherits Global.System.Configuration.ApplicationSettingsBase
Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings)
#Region "My.Settings 自动保存功能"
#If _MyType = "WindowsForms" Then
Private Shared addedHandler As Boolean
Private Shared addedHandlerLockObject As New Object
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs)
If My.Application.SaveMySettingsOnExit Then
My.Settings.Save()
End If
End Sub
#End If
#End Region
Public Shared ReadOnly Property [Default]() As MySettings
Get
#If _MyType = "WindowsForms" Then
If Not addedHandler Then
SyncLock addedHandlerLockObject
If Not addedHandler Then
AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
addedHandler = True
End If
End SyncLock
End If
#End If
Return defaultInstance
End Get
End Property
End Class
End Namespace
Namespace My
<Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _
Friend Module MySettingsProperty
<Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _
Friend ReadOnly Property Settings() As Global.AUTS_Studio.My.MySettings
Get
Return Global.AUTS_Studio.My.MySettings.Default
End Get
End Property
End Module
End Namespace

View File

@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

660
AUTS_Studio/ProjectInfo.vb Normal file
View File

@@ -0,0 +1,660 @@
Imports System.IO
Imports System.Text
Imports System.Xml
Imports MySql.Data.MySqlClient
Imports UTS_Studio.UtsPath
Imports UTS_Core.Database.Mysql
Imports UTS_Core.UTSModule.DatabaseTable
Public Class ProjectInfo
''' <summary>
''' 初始化项目模式
''' </summary>
Enum InitializeModeEnum
''' <summary>
''' 云端加载项目信息
''' </summary>
RemoteLoad
''' <summary>
''' 本地加载项目信息
''' </summary>
LocalLoad
''' <summary>
''' 新建项目信息
''' </summary>
Create
End Enum
Sub New(userName As String, projectName As String)
Creator = userName
Name = projectName
Description = String.Empty
InitializeMode = InitializeModeEnum.Create
Station = New List(Of ProjectStationInfo)()
End Sub
Sub New(userName As String, projectName As String, mode As InitializeModeEnum)
Creator = userName
Name = projectName
Description = String.Empty
InitializeMode = mode
Station = New List(Of ProjectStationInfo)()
InitializeProject(projectName, InitializeMode)
End Sub
''' <summary>
''' 当前项目初始化方式
''' </summary>
''' <returns></returns>
Property InitializeMode() As InitializeModeEnum
''' <summary>
''' 项目代号,创建项目时生成,作为项目索引存在
''' </summary>
''' <returns></returns>
Property Code() As String
''' <summary>
''' 项目名称
''' </summary>
''' <returns></returns>
Property Name() As String
''' <summary>
''' 项目描述
''' </summary>
''' <returns></returns>
Property Description() As String
''' <summary>
''' 项目站集合
''' </summary>
''' <returns></returns>
Property Station() As List(Of ProjectStationInfo)
''' <summary>
''' 名称是否被修改
''' </summary>
''' <returns></returns>
Property NameChanged() As Boolean
''' <summary>
''' 项目描述是否被修改
''' </summary>
''' <returns></returns>
Property DescriptionChanged() As Boolean
''' <summary>
''' 项目创建者
''' </summary>
''' <returns></returns>
Property Creator() As String
''' <summary>
''' 初始化项目
''' </summary>
''' <param name="projectName"></param>
''' <param name="mode"></param>
Public Sub InitializeProject(projectName As String, mode As InitializeModeEnum)
If mode = InitializeModeEnum.RemoteLoad Then
LoadRemoteProject(projectName)
ElseIf mode = InitializeModeEnum.LocalLoad Then
LoadLocalProject(projectName)
ElseIf mode = InitializeModeEnum.Create Then
Code = Name '新建的项目代号与产品名称相同
Else
Console.WriteLine($"InitializeProject Untreated Mode:{mode}")
End If
End Sub
''' <summary>
''' 加载本地项目
''' </summary>
''' <param name="projectName"></param>
Private Sub LoadLocalProject(projectName As String)
Dim filename As String = $"{SystemDirPath}\{SystemFolderEnum.Temp}\{SystemTempFolderEnum.ProjectDesign}\{projectName}\{projectName}.xml"
Dim xd As New XmlDocument() : xd.Load(filename)
Dim nodeList As XmlNodeList = xd.SelectSingleNode("Project").ChildNodes
For Each node As XmlNode In nodeList
Dim xe As XmlElement = CType(node, XmlElement)
Select Case xe.LocalName
Case $"Code"
Code = xe.InnerText
Case $"Name"
Name = xe.InnerText
Case $"Description"
Description = xe.InnerText
Case "Stations"
LoadAllStation(node.ChildNodes)
Case Else
Console.WriteLine($"LoadLocalProject Unknow XmlNodeName:{xe.LocalName}")
End Select
Next
End Sub
''' <summary>
''' 加载项目所有站
''' </summary>
''' <param name="nodeList"></param>
Private Sub LoadAllStation(nodeList As XmlNodeList)
Station.Clear()
Dim xe As XmlElement
For Each node As XmlNode In nodeList
xe = CType(node, XmlElement)
Select Case xe.LocalName
Case "Station"
LoadStation(xe.ChildNodes)
End Select
Next
End Sub
''' <summary>
''' 加载测试站信息
''' </summary>
''' <param name="nodeList">Xml节点</param>
Private Sub LoadStation(nodeList As XmlNodeList)
Dim stationInfo As New ProjectStationInfo
Dim xe As XmlElement
For Each node As XmlNode In nodeList
xe = CType(node, XmlElement)
Select Case xe.LocalName
Case $"Code"
stationInfo.Code = xe.InnerText
Case $"Name"
stationInfo.Name = xe.InnerText
Case $"Description"
stationInfo.Description = xe.InnerText
Case $"PacketName"
stationInfo.PacketName = xe.InnerText
Case Else
Console.WriteLine($"LoadStationInfo Unknow XmlNodeName:{xe.LocalName}")
End Select
Next
Station.Add(stationInfo)
End Sub
''' <summary>
''' 加载远程项目站
''' </summary>
''' <param name="mysqlConn"></param>
''' <param name="projectName"></param>
Private Sub LoadRemoteProjectStation(mysqlConn As MySqlConnection, projectName As String)
Dim tableName As String = StationTable.TableName(projectName)
Dim colNames As String = $"{StationTable.ColNamesEnum.工作站编号},{StationTable.ColNamesEnum.操作站名},
{StationTable.ColNamesEnum.作业内容描述},{StationTable.ColNamesEnum.测试版本包名}"
Dim dtStation As DataTable = Executor.Search(mysqlConn, tableName, colNames)
Station.Clear()
For Each row As DataRow In dtStation.Rows
Station.Add(New ProjectStationInfo() With {
.Code = row(0).ToString(),
.Name = row(1).ToString(),
.Description = row(2).ToString(),
.PacketName = row(3).ToString()})
Next
End Sub
''' <summary>
''' 加载远程项目信息
''' </summary>
''' <param name="mysqlConn"></param>
''' <param name="projectName"></param>
Private Sub LoadRemoteProjectInfo(mysqlConn As MySqlConnection, projectName As String)
Dim tableName As String = ProjectTable.Name
Dim colNames As String = $"{ProjectTable.ColNamesEnum.功能描述},{ProjectTable.ColNamesEnum.项目代号}"
Dim condition As String = $"{ProjectTable.ColNamesEnum.产品名称} = '{projectName}' Limit 1"
Dim dtProject As DataTable = Executor.Search(mysqlConn, tableName, colNames, condition)
If dtProject.Rows.Count <= 0 Then Throw New Exception($"LoadRemoteProjectInfo Error,Not Find ProjectName - {projectName}")
Description = dtProject.Rows(0)(0).ToString()
Code = dtProject.Rows(0)(1).ToString()
End Sub
''' <summary>
''' 加载远程项目
''' </summary>
''' <param name="projectName"></param>
Private Sub LoadRemoteProject(projectName As String)
Dim connectionString As String = CommandHelpers.ConnectionString(ConnectionParams.Server, ConnectionParams.Port,
ConnectionParams.UserID, ConnectionParams.Password,
ConnectionParams.Database, ConnectionParams.Pooling)
Using mysqlConn As New MySqlConnection(connectionString)
LoadRemoteProjectInfo(mysqlConn, projectName)
LoadRemoteProjectStation(mysqlConn, projectName)
End Using
End Sub
''' <summary>
''' 加载本地项目列表
''' </summary>
''' <param name="parentPath"></param>
''' <returns></returns>
Private Shared Function LoadLocalProjectList(parentPath As String) As String()
If Directory.Exists(parentPath) = False Then Return New String() {}
Dim prjName, prjDirName As String
Dim lstProjects As New List(Of String)
Dim prjDirPaths As String() = Directory.GetDirectories(parentPath)
For Each prjDirPath As String In prjDirPaths
For Each fileName As String In Directory.GetFiles(prjDirPath)
prjName = Path.GetFileNameWithoutExtension(fileName)
prjDirName = Path.GetDirectoryName(fileName)
If prjDirName.EndsWith(prjName) Then
lstProjects.Add(prjName)
Exit For
End If
Next
Next
Return lstProjects.ToArray()
End Function
''' <summary>
''' 加载远程所有项目
''' </summary>
''' <param name="mysqlConn"></param>
''' <returns></returns>
Private Shared Function LoadRemoteAllProjects(mysqlConn As MySqlConnection) As String()
Dim tableName As String = ProjectTable.Name
Dim colNames As String = $"{ProjectTable.ColNamesEnum.产品名称}"
Dim dtProjects As DataTable = Executor.Search(mysqlConn, tableName, colNames)
Dim lstProjects As New List(Of String)
For Each row As DataRow In dtProjects.Rows
lstProjects.Add(row(0).ToString())
Next
Return lstProjects.ToArray()
End Function
''' <summary>
''' 加载远程项目列表
''' </summary>
''' <returns></returns>
Private Shared Function LoadRemoteProjectList() As String()
Dim connectionString As String = CommandHelpers.ConnectionString(ConnectionParams.Server, ConnectionParams.Port,
ConnectionParams.UserID, ConnectionParams.Password,
ConnectionParams.Database, ConnectionParams.Pooling)
Using mysqlConn As New MySqlConnection(connectionString)
Return LoadRemoteAllProjects(mysqlConn)
End Using
End Function
''' <summary>
''' 加载项目列表
''' </summary>
''' <param name="mode"></param>
''' <returns></returns>
Public Shared Function LoadProjectList(mode As InitializeModeEnum) As String()
Select Case mode
Case InitializeModeEnum.RemoteLoad
Return LoadRemoteProjectList()
Case InitializeModeEnum.LocalLoad
Dim parentPath As String = $"{SystemDirPath}\{SystemFolderEnum.Temp}\{SystemTempFolderEnum.ProjectDesign}"
Return LoadLocalProjectList(parentPath)
Case InitializeModeEnum.Create
Console.WriteLine($"LoadProjectList Untreated Mode:{mode}")
Return New String() {}
Case Else
Console.WriteLine($"LoadProjectList Untreated Mode:{mode}")
Return New String() {}
End Select
End Function
''' <summary>
''' 保存项目所有站信息
''' </summary>
''' <param name="xw"></param>
Private Sub SaveProjectAllStation(xw As XmlWriter)
xw.WriteStartElement($"Stations") '保存测试站信息节点
For Each stationInfo As ProjectStationInfo In Station
xw.WriteStartElement($"Station")
xw.WriteElementString("Code", stationInfo.Code)
xw.WriteElementString("Name", stationInfo.Name)
xw.WriteElementString("Description", stationInfo.Description)
xw.WriteElementString("PacketName", stationInfo.PacketName)
xw.WriteEndElement()
Next
xw.WriteEndElement()
End Sub
''' <summary>
''' 保存项目至本地文件
''' </summary>
''' <param name="filePath"></param>
Private Sub SaveProjectToLocalFile(filePath As String)
Dim xws As New XmlWriterSettings
With xws
.Indent = True
.NewLineOnAttributes = False
.Encoding = New UTF8Encoding(False)
End With
Dim xw As XmlWriter = XmlWriter.Create(filePath, xws)
xw.WriteStartDocument()
xw.WriteStartElement($"Project") '创建跟节点
xw.WriteElementString("Code", Code)
xw.WriteElementString("Name", Name)
xw.WriteElementString("Description", Description)
SaveProjectAllStation(xw)
xw.WriteEndElement()
xw.WriteEndDocument()
xw.Flush()
xw.Close()
End Sub
''' <summary>
''' 将项目信息保存至本Xml文件
''' </summary>
Public Sub ExportToXml()
Dim fileDirPath As String = $"{SystemDirPath}\{SystemFolderEnum.Temp}\{SystemTempFolderEnum.ProjectDesign}\{Name}"
Dim filePath As String = $"{fileDirPath}\{Name}.xml"
If Directory.Exists(fileDirPath) = False Then Directory.CreateDirectory(fileDirPath)
If File.Exists(filePath) Then File.Delete(filePath)
SaveProjectToLocalFile(filePath)
End Sub
Private Function ProjectExists(mysqlConn As MySqlConnection, project As ProjectInfo) As Boolean
Dim tableName As String = ProjectTable.Name
Dim colNames As String = $"{ProjectTable.ColNamesEnum.产品名称}"
Dim condition As String = $"{ProjectTable.ColNamesEnum.产品名称} = '{project.Name}'"
Dim dtProjects As DataTable = Executor.Search(mysqlConn, tableName, colNames, condition)
Return dtProjects.Rows.Count > 0
End Function
''' <summary>
''' 项目表修改原有项目信息
''' </summary>
''' <param name="mysqlConn"></param>
''' <param name="project"></param>
Private Sub UpdateProjectTable(mysqlConn As MySqlConnection, project As ProjectInfo)
If NameChanged Or DescriptionChanged Then
Dim tableName As String = ProjectTable.Name
Dim updateColValue As New Dictionary(Of String, String)
If NameChanged Then
updateColValue.Add(ProjectTable.ColNamesEnum.产品名称.ToString(), project.Name)
End If
If DescriptionChanged Then
updateColValue.Add(ProjectTable.ColNamesEnum.功能描述.ToString(), project.Description)
End If
Dim condition As String = $"{ProjectTable.ColNamesEnum.项目代号} = '{project.Code}'"
Using mysqlComm As MySqlCommand = mysqlConn.CreateCommand()
Executor.Update(mysqlComm, tableName, updateColValue, condition)
End Using
End If
End Sub
''' <summary>
''' 项目表添加新项目
''' </summary>
''' <param name="mysqlConn"></param>
''' <param name="project"></param>
Private Sub InsertProjectTable(mysqlConn As MySqlConnection, project As ProjectInfo)
Dim tableName As String = ProjectTable.Name
Dim insetColValue As New Dictionary(Of String, String)
insetColValue.Add(ProjectTable.ColNamesEnum.项目代号.ToString(), project.Code)
insetColValue.Add(ProjectTable.ColNamesEnum.产品名称.ToString(), project.Name)
insetColValue.Add(ProjectTable.ColNamesEnum.功能描述.ToString(), project.Description)
insetColValue.Add(ProjectTable.ColNamesEnum.Creator.ToString(), project.Creator)
insetColValue.Add(ProjectTable.ColNamesEnum.记录日期.ToString(), $"{Now:yyyy-MM-dd HH:mm:ss}")
Using mysqlComm As MySqlCommand = mysqlConn.CreateCommand()
Executor.Insert(mysqlComm, tableName, insetColValue)
End Using
End Sub
Private Sub AlterUserAuthTable(mysqlConn As MySqlConnection, project As ProjectInfo)
Dim num As Integer = Executor.AlterColumnCheckExists(mysqlConn, UserAuthTable.TableName, project.Name, UserAuthTable.ProjectColType, UserAuthTable.ProjectColIsNull)
Console.WriteLine($"AlterUserAuthTable num:{num}")
End Sub
Private Sub UploadUserAuthTable(mysqlConn As MySqlConnection, project As ProjectInfo)
AlterUserAuthTable(mysqlConn, project)
End Sub
Private Sub CreateErrorCodeTable(mysqlConn As MySqlConnection, project As ProjectInfo)
Executor.ExecuteNonQuery(mysqlConn, ErrorCodeTable.CreateTableString(project.Name))
End Sub
''' <summary>
''' 将表名添加到表版本记录表中,供数据同步软件下载
''' </summary>
''' <param name="mysqlConn"></param>
''' <param name="tableName"></param>
Private Sub InsertRowVersionTable(mysqlConn As MySqlConnection, tableName As String, syncType As TableVersionTable.SyncTypeEnum)
Dim keyValues As New Dictionary(Of String, String)
keyValues.Add(TableVersionTable.ColNamesEnum.TableName.ToString(), tableName)
keyValues.Add(TableVersionTable.ColNamesEnum.SyncType.ToString(), syncType.ToString())
keyValues.Add(TableVersionTable.ColNamesEnum.UpdateTime.ToString(), Now.ToString("yyyy-MM-dd HH:mm:ss"))
Executor.InsertRowCheckExists(mysqlConn, TableVersionTable.TableName,
TableVersionTable.ColNamesEnum.TableName.ToString(),
tableName,
keyValues)
End Sub
''' <summary>
''' 创建触发器,当源表变动时,同步更新版本记录表更新时间列
''' </summary>
''' <param name="mysqlConn">mysql连接句柄</param>
''' <param name="tableName">添加触发器的数据表名</param>
Private Sub AddressOfVersionTable(mysqlConn As MySqlConnection, tableName As String)
Executor.ExecuteNonQuery(mysqlConn, TableVersionTable.AfterInsertUpdateTimeTrigger(tableName))
Executor.ExecuteNonQuery(mysqlConn, TableVersionTable.AfterUpdateUpdateTimeTrigger(tableName))
Executor.ExecuteNonQuery(mysqlConn, TableVersionTable.AfterDeleteUpdateTimeTrigger(tableName))
End Sub
''' <summary>
''' 发布项目时更新上传ErrorCode表格
''' </summary>
Private Sub UploadErrorCodeTable(mysqlConn As MySqlConnection, project As ProjectInfo)
'创建错误代码表
CreateErrorCodeTable(mysqlConn, project)
'添加记录至VersionTable
InsertRowVersionTable(mysqlConn, ErrorCodeTable.TableName(project.Name), TableVersionTable.SyncTypeEnum.new)
'添加触发器触发器,当表变更时,更新VersionTable的数据
AddressOfVersionTable(mysqlConn, ErrorCodeTable.TableName(project.Name))
End Sub
Private Sub CreateStationTable(mysqlConn As MySqlConnection, project As ProjectInfo)
Executor.ExecuteNonQuery(mysqlConn, StationTable.CreateTableString(project.Name))
End Sub
''' <summary>
''' 发布项目时,更新项目站表信息
''' </summary>
''' <param name="mysqlConn">Mysql连接句柄</param>
''' <param name="project">项目信息</param>
Private Sub UploadStationTable(mysqlConn As MySqlConnection, project As ProjectInfo)
'因为项目站表名称根据项目不同会有所变化,所有需要提前记录
Dim tableName As String = StationTable.TableName(project.Name)
'创建项目站表
CreateStationTable(mysqlConn, project)
'添加记录至VersionTable
InsertRowVersionTable(mysqlConn, tableName, TableVersionTable.SyncTypeEnum.all)
'添加触发器触发器,当表变更时,更新VersionTable的数据
AddressOfVersionTable(mysqlConn, tableName)
End Sub
Private Sub CreateFlowChartTable(mysqlConn As MySqlConnection, project As ProjectInfo)
Executor.ExecuteNonQuery(mysqlConn, FlowChartTable.CreateTableString(project.Name))
End Sub
''' <summary>
''' 发布项目时,更新产品经过流程表信息
''' </summary>
''' <param name="mysqlConn">Mysql连接句柄</param>
''' <param name="project">项目信息</param>
Private Sub UploadFlowChartTable(mysqlConn As MySqlConnection, project As ProjectInfo)
CreateFlowChartTable(mysqlConn, project)
End Sub
Private Sub CreateReleaseLogTable(mysqlConn As MySqlConnection, project As ProjectInfo)
Executor.ExecuteNonQuery(mysqlConn, ReleaseLogTable.CreateTableString(project.Name))
End Sub
''' <summary>
''' 发布项目时,更新项目站发布记录表信息
''' </summary>
''' <param name="mysqlConn">Mysql连接句柄</param>
''' <param name="project">项目信息</param>
Private Sub UploadReleaseLogTable(mysqlConn As MySqlConnection, project As ProjectInfo)
CreateReleaseLogTable(mysqlConn, project)
End Sub
Private Sub UploadProjectTable(mysqlConn As MySqlConnection, project As ProjectInfo)
If ProjectExists(mysqlConn, project) Then
UpdateProjectTable(mysqlConn, project)
Else
InsertProjectTable(mysqlConn, project) '项目表添加一行
End If
End Sub
''' <summary>
''' 更新上传项目信息
''' </summary>
''' <param name="mysqlConn"></param>
''' <param name="project"></param>
Private Sub UploadProjectInfo(mysqlConn As MySqlConnection, project As ProjectInfo)
UploadProjectTable(mysqlConn, project) '将项目信息更新到项目表
UploadUserAuthTable(mysqlConn, project) '用户权限表添加一个项目列
UploadErrorCodeTable(mysqlConn, project) '创建错误代码ErrorCode表,并在Version表添加记录,添加触发器
UploadStationTable(mysqlConn, project) '创建项目站Process表并在Version表添加记录'添加触发器
UploadFlowChartTable(mysqlConn, project) '创建流程签名FlowChart表
UploadReleaseLogTable(mysqlConn, project) '创建发布记录ReleaseLog表
End Sub
Private Sub InsertRowStationTable(mysqlConn As MySqlConnection, project As ProjectInfo, stationInfo As ProjectStationInfo)
Dim keyValues As New Dictionary(Of String, String)
keyValues.Add(StationTable.ColNamesEnum.工作站编号.ToString(), stationInfo.Code)
keyValues.Add(StationTable.ColNamesEnum.Creator.ToString(), stationInfo.Author)
keyValues.Add(StationTable.ColNamesEnum.操作站名.ToString(), stationInfo.Name)
keyValues.Add(StationTable.ColNamesEnum.作业内容描述.ToString(), stationInfo.Description)
keyValues.Add(StationTable.ColNamesEnum.测试版本包名.ToString(), stationInfo.PacketName)
Executor.InsertRowCheckExists(mysqlConn, StationTable.TableName(project.Name),
StationTable.ColNamesEnum.工作站编号.ToString(),
stationInfo.Code,
keyValues)
End Sub
Private Sub UploadStationTable(mysqlConn As MySqlConnection, project As ProjectInfo, stationInfo As ProjectStationInfo)
InsertRowStationTable(mysqlConn, project, stationInfo)
End Sub
Private Sub CreateErrorLogTable(mysqlConn As MySqlConnection, project As ProjectInfo, stationInfo As ProjectStationInfo)
Executor.ExecuteNonQuery(mysqlConn, ErrorLogTable.CreateTableString(project.Name, stationInfo.Code))
End Sub
Private Sub UploadErrorLogTable(mysqlConn As MySqlConnection, project As ProjectInfo, stationInfo As ProjectStationInfo)
'创建站错误代码记录表
CreateErrorLogTable(mysqlConn, project, stationInfo)
'添加记录至VersionTable
InsertRowVersionTable(mysqlConn, ErrorLogTable.TableName(project.Name, stationInfo.Code), TableVersionTable.SyncTypeEnum.new)
'添加触发器触发器,当表变更时,更新VersionTable的数据
AddressOfVersionTable(mysqlConn, ErrorLogTable.TableName(project.Name, stationInfo.Code))
End Sub
Private Sub CreateTestLogTable(mysqlConn As MySqlConnection, project As ProjectInfo, stationInfo As ProjectStationInfo)
Executor.ExecuteNonQuery(mysqlConn, TestLogTable.CreateTableString(project.Name, stationInfo.Code))
End Sub
Private Sub UploadTestLogTable(mysqlConn As MySqlConnection, project As ProjectInfo, stationInfo As ProjectStationInfo)
CreateTestLogTable(mysqlConn, project, stationInfo) '创建站测试记录表
'添加触发器,测试失败时,将失败记录添加到错误代码记录表中(考虑删除,手动增加)
End Sub
Private Sub AlterFlowChartTable(mysqlConn As MySqlConnection, project As ProjectInfo, stationInfo As ProjectStationInfo)
Dim num As Integer = Executor.AlterColumnCheckExists(mysqlConn, FlowChartTable.TableName(project.Name), stationInfo.Code, FlowChartTable.StationColType, FlowChartTable.StationColIsNull)
Console.WriteLine($"AlterFlowChartTable num:{num}")
End Sub
Private Sub UploadStationFlowChartTable(mysqlConn As MySqlConnection, project As ProjectInfo, stationInfo As ProjectStationInfo)
AlterFlowChartTable(mysqlConn, project, stationInfo)
End Sub
Private Sub UploadStationInfo(mysqlConn As MySqlConnection, project As ProjectInfo)
For Each stationInfo As ProjectStationInfo In project.Station
UploadStationTable(mysqlConn, project, stationInfo) '项目站Process表更新一行数据
UploadErrorLogTable(mysqlConn, project, stationInfo) '创建错误记录ErrorLog表,并在Version表添加记录,添加触发器
UploadTestLogTable(mysqlConn, project, stationInfo) '创建测试站记录表,添加触发器?
UploadStationFlowChartTable(mysqlConn, project, stationInfo) '流程签名FlowChart表新增项目站列
'成功发布站包则更新项目站发布Release记录(当前工具仅供设计项目及其包含测试站,不支持发布站包功能,所以不处理当前功能)
Next
End Sub
Private Sub ReleaseDataToDatabase()
'项目创建者要当前用户关联
'项目站要与当前用户关联
Dim connectionString As String = CommandHelpers.ConnectionString(ConnectionParams.Server, ConnectionParams.Port,
ConnectionParams.UserID, ConnectionParams.Password,
ConnectionParams.Database, ConnectionParams.Pooling)
Using mysqlConn As New MySqlConnection(connectionString)
mysqlConn.Open()
UploadProjectInfo(mysqlConn, Me) '更新数据库项目相关信息
UploadStationInfo(mysqlConn, Me) '更新数据库项目站相关信息
mysqlConn.Close()
End Using
End Sub
''' <summary>
''' 发布项目
''' </summary>
Public Sub Release()
ExportToXml()
ReleaseDataToDatabase()
End Sub
End Class

View File

@@ -0,0 +1,49 @@
Public Class ProjectStationInfo
''' <summary>
''' 项目站序号,项目站唯一索引,新建站时自动生成,生成后不能修改
''' </summary>
''' <returns></returns>
Public Property Code As String
''' <summary>
''' 项目站名称
''' </summary>
''' <returns></returns>
Public Property Name As String
''' <summary>
''' 项目备注
''' </summary>
''' <returns></returns>
Public Property Description As String
''' <summary>
''' 项目站最新包
''' </summary>
''' <returns></returns>
Public Property PacketName As String
''' <summary>
''' 项目站发布人员,自动生成,当前登录人员账号
''' </summary>
''' <returns></returns>
Public Property Author As String
''' <summary>
''' 站名已被修改
''' </summary>
''' <returns></returns>
Public Property NameChanged() As Boolean
''' <summary>
''' 站描述已被修改
''' </summary>
''' <returns></returns>
Public Property DescriptionChanged() As Boolean
''' <summary>
''' 站包名已被修改
''' </summary>
''' <returns></returns>
Public Property PacketNameChanged() As Boolean
End Class

48
AUTS_Studio/Service1.designer.vb generated Normal file
View File

@@ -0,0 +1,48 @@
Imports System.ServiceProcess
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Service1
Inherits System.ServiceProcess.ServiceBase
'UserService 重写 Dispose以清理组件列表。
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
' 此进程的主入口点
<MTAThread()> _
<System.Diagnostics.DebuggerNonUserCode()> _
Shared Sub Main()
Dim ServicesToRun() As System.ServiceProcess.ServiceBase
' 同一进程内可运行多个 NT 服务。若要将
' 另一个服务添加到此进程中,请更改下行以
' 创建另一个服务对象。例如,
'
' ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService}
'
ServicesToRun = New System.ServiceProcess.ServiceBase() {New Service1}
System.ServiceProcess.ServiceBase.Run(ServicesToRun)
End Sub
'组件设计器所必需的
Private components As System.ComponentModel.IContainer
' 注意: 以下过程是组件设计器所必需的
' 可使用组件设计器修改它。
'不要使用代码编辑器修改它。
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
components = New System.ComponentModel.Container()
Me.ServiceName = "Service1"
End Sub
End Class

12
AUTS_Studio/Service1.vb Normal file
View File

@@ -0,0 +1,12 @@
Public Class Service1
Protected Overrides Sub OnStart(ByVal args() As String)
' 请在此处添加代码以启动您的服务。此方法应完成设置工作,
' 以使您的服务开始工作。
End Sub
Protected Overrides Sub OnStop()
' 在此处添加代码以执行任何必要的拆解操作,从而停止您的服务。
End Sub
End Class

49
AUTS_Studio/UtsPath.vb Normal file
View File

@@ -0,0 +1,49 @@
Public Class UtsPath
''' <summary>系统文件夹枚举值</summary>
Public Enum SystemFolderEnum
''' <summary>错误记录文件夹</summary>
Log
''' <summary>用户鉴权文件夹</summary>
License
''' <summary>设置文件夹</summary>
Setting
''' <summary>用户临时操作文件夹</summary>
Temp
End Enum
''' <summary>
''' Temp文件夹下文件夹
''' </summary>
Public Enum SystemTempFolderEnum
''' <summary>创建项目时使用文件夹</summary>
ProjectDesign
''' <summary>设计时使用文件夹</summary>
StationDesign
''' <summary>测试时使用文件夹</summary>
StationPlan
End Enum
''' <summary>
''' 本地缓存数据路径
''' </summary>
''' <returns></returns>
Shared Property SystemDirPath() As String = Application.StartupPath
''' <summary>
''' 项目发布路径
''' </summary>
''' <returns></returns>
Shared Property ProjectReleaseDirPath() As String = $"{SystemDirPath}\Release"
''' <summary>
''' 数据库路径
''' </summary>
''' <returns></returns>
Shared Property DatabasePath() As String = $"{SystemDirPath}\Database"
End Class

View File

@@ -0,0 +1,105 @@
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
1<><31><EFBFBD>ƶ˽<C6B6><CBBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ⣺Weistech
<20><><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD>SW-430-BattTestTool
2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˺ţ<CBBA>sa
<20><>¼<EFBFBD><C2BC><EFBFBD>룺%*UgFTR#SW*kj?n
Զ<><D4B6>IP<49><50>122.152.232.170
<20><><EFBFBD>ʶ˿<CAB6>:2233
3<><33><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1>ֶΣ<D6B6>
Device:<3A><><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD>
FW<46><57><EFBFBD>̼<EFBFBD><CCBC><EFBFBD><E6B1BE>
SN<53><4E><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD> <20><>ͨ<EFBFBD><CDA8>ɨ<EFBFBD><C9A8>ǹɨ<C7B9><C9A8><EFBFBD><EFBFBD><EFBFBD>
DateTime_1st<73><74><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
BattLevel_1st<73><74><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>¼<EFBFBD><C2BC>ʱ<EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>
DateTime_2nd<6E><64><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
BattLevel_2nd<6E><64><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>¼<EFBFBD><C2BC>ʱ<EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>
TimeDiff<66><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD><C3B3><EFBFBD>
BattDiff<66><66><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD><C3B3><EFBFBD>
4<><34>ʹ<EFBFBD><CAB9>ʱ<EFBFBD><CAB1><EFBFBD>û<EFBFBD><C3BB>ȸ<EFBFBD><C8B8><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD>ϵ磬Ȼ<E7A3AC><C8BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>һ<EFBFBD><D2BB>¼<EFBFBD>
<20><>һ<EFBFBD><D2BB>¼<EFBFBD><C2BC><EFBFBD>󣬿<EFBFBD><F3A3ACBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>죬Ȼ<ECA3AC><C8BB>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еڶ<D0B5><DAB6><EFBFBD>¼<EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>ʾ<EFBFBD>û<EFBFBD><C3BB><EFBFBD>
1<><31><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>¼<EFBFBD><C2BC>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>100%
2<><32><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>¼<EFBFBD><C2BC>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>в<EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
3<><33><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1>Ų<EFBFBD><C5B2>Ի<EFBFBD>FW<46><EFBFBD><E6B1BE><EFBFBD><EFBFBD>
5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򿪺<EFBFBD><F2BFAABA>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>Ҫд<D2AA><D0B4><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD>ݿ<EFBFBD>
6<><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>кŲ<D0BA>ѯ<EFBFBD><D1AF><EFBFBD>ݼ<EFBFBD>¼
V1.0.0: 2020-06-19 Momo/QiZhengBiao Frist Released
V2.0.0: 2020-7-20 Momo
1<><31><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>¼<EFBFBD>룬ԭ<EBA3AC>޶<EFBFBD><DEB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ100%<25><><EFBFBD>޸<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>90~100%֮<><EFBFBD><E4A3AC><EFBFBD><EFBFBD>С<EFBFBD><D0A1>100%<25><>
V2.1.0: 2020-7-27 Momo
1<><31><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>¼<EFBFBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>30~99%֮<>
2<><32><EFBFBD>޶<EFBFBD>FW<46><EFBFBD><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>V1_36<33><36>
V2.2.0<EFBFBD><EFBFBD>2020-8-21 Qizhenbiao
1<><31><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޶<EFBFBD><DEB6>޸ģ<DEB8>30~95%֮<><EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>󲢾ܾ<F3B2A2BE>¼<EFBFBD><C2BC>
2<><32><EFBFBD>ڶ<EFBFBD><DAB6>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>С<EFBFBD>ڵ<EFBFBD><DAB5>ڵ<EFBFBD>һ<EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>󲢾ܾ<F3B2A2BE>¼<EFBFBD><C2BC>
3<><33><EFBFBD>ڶ<EFBFBD><DAB6>ε<EFBFBD><CEB5><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>һ<EFBFBD><D2BB>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>48~144Сʱ<D0A1><CAB1>2~6<>죩֮<ECA3A9><EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>󲢾ܾ<F3B2A2BE>¼<EFBFBD><C2BC>
4<><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ǰ<EFBFBD><C7B0><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-5%~0%֮<><EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>ж<EFBFBD>Ϊʧ<CEAA>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ,<2C><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>PASS<53><53>FAIL<49><4C>ʾ<EFBFBD><CABE>
5<><35><EFBFBD>ڼ<EFBFBD><DABC>ز<EFBFBD><D8B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
6<><36><EFBFBD>ڼ<EFBFBD><DABC>ز<EFBFBD><D8B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0%<25><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>ֱ<EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
7<><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˫<EFBFBD><CBAB><EFBFBD><EFBFBD><EFBFBD>򣬰<EFBFBD><F2A3ACB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
8<><38>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD>һ<EFBFBD><D2BB>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD>
V2.2.1.1<EFBFBD><EFBFBD>2020-8-21 Qizhenbiao
1<><31>ָ<EFBFBD><D6B8>Sn<53><6E>ѯʱ<D1AF><CAB1>Ӧ<EFBFBD><D3A6>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF>ͳ<EFBFBD>ƹ<EFBFBD><C6B9>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ʾ<EFBFBD><CABE>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ɫ<EFBFBD><C9AB>δ<EFBFBD><CEB4><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ɫ<EFBFBD><C9AB>
2<><32>Sn<53><6E>ѯ֧<D1AF><D6A7>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD>ѯһ<D1AF><D2BB><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD>ַ<EFBFBD>Χ<EFBFBD><CEA7><EFBFBD>ݲ<EFBFBD>ѯ<EFBFBD><D1AF>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯʱ<D1AF><CAB1><EFBFBD><EFBFBD><EABDB9><EFBFBD>Զ<EFBFBD><D4B6>ص<EFBFBD>SN<53><4E><EFBFBD><EFBFBD><EFBFBD>򣬲<EFBFBD><F2A3ACB2>ҽ<EFBFBD><D2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫѡ<C8AB><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>ǹɨ<C7B9><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯʱ<D1AF><CAB1>pass<73><73>fail<69><6C>ʾ<EFBFBD><CABE>ɫ<EFBFBD><C9AB>ͬʱ<CDAC><CAB1><EFBFBD>Ͻ<EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>ʾPASS<53><53>FAIL<49><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>в<EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>---<2D><><EFBFBD><EFBFBD>
4, ÿ<>γ<EFBFBD><CEB3><EFBFBD><EFBFBD>ر<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>xls<6C><73>ʽ<EFBFBD>ı<EFBFBD><C4B1>ݡ<EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> app.path\DATA\BAK\ Ŀ¼<C4BF>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DAT_BAK_20200827_111606<30><36>
V2.2.2.0<EFBFBD><EFBFBD>2020-8-21 Qizhenbiao
1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>зǿ<D0B7><C7BF>жϣ<D0B6><CFA3>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ʱ<EFBFBD><CAB1><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><ECB3A3>
V2.3.0.0<EFBFBD><EFBFBD>2020-9-10 MomoWen
1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ԭ2~6<><EFBFBD><ECA3AC>Ϊ8~12<31>
2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭС<D4AD>ڵ<EFBFBD><DAB5><EFBFBD>5%<25><><EFBFBD><EFBFBD>ΪС<CEAA><D0A1>5%<25><>
3<><33>ÿ<EFBFBD>ιرճ<D8B1><D5B3>򣬱<EFBFBD><F2A3ACB1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
V2.4.0.0<EFBFBD><EFBFBD>2020-9-15 QiZhengbiao
1<><31><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>һ<EFBFBD>Ρ<EFBFBD><CEA1>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㣬ֱ<E3A3AC>ӱȽϵ<C8BD><CFB5><EFBFBD>ֵ<EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=50%Ϊpass<73><73>
2<><32>load<61><64><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD>pass<73><73>fail<69>ж<EFBFBD>
3<><33>load<61><64><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ե<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6>С<EFBFBD><D0A1>8<EFBFBD><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>12<31><32><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD>ɫ<EFBFBD><C9AB>ɫ<EFBFBD><C9AB>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>pass<73><73>fail<69><6C><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
4<><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>һ<EFBFBD><EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD>
V2.5.0.0:2020-11-02 Qizengbiao
1.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UTS_Core<72><65><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
V2.5.1.0:2020-12-09 Qizengbiao
1.<2E><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>ԭ8~12<31><EFBFBD>޸<EFBFBD>Ϊ6~12<31><32>
V2.5.3.0:2020-12-10 Qizengbiao
1.<2E>ϴ<EFBFBD><CFB4><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪDevSN<53>ֶ<EFBFBD>
2.<2E><>һ<EFBFBD><D2BB>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD>¼UserID<49><44>StartTime
3.<2E>ڶ<EFBFBD><DAB6><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD>¼TestResult