初始化提交

仓库转移到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,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Root Type="DevExpress.CodeRush.VisualizePlugins.StructuralHighlighting.Options.StructuralHighlightingOptions">
<Options Language="Neutral">
<Enabled>False</Enabled>
</Options>
</Root>

47
.gitignore vendored Normal file
View File

@@ -0,0 +1,47 @@
.vs/
# .NET编译生成文件
[Bb]in
[Oo]bj
[Dd]ebug*/
*.pdb
*.user
*.suo
*.cache
*.ilk
*.ncb
*.opensdf
*.sdf
*.vsp
*.vspscc
# 发布输出
publish/
*.pubxml
# NuGet包
packages/
*.nupkg
# Visual Studio临时文件
_ReSharper.*
*.resharper
[Tt]emp/
# MSTest测试结果
TestResults/
*.trx
# Rider IDE
.idea/
*.sln.iml
# VS Code
.vscode/
*.code-workspace
# 用户特定文件
*.userprefs
# 构建日志
msbuild.log

217
AUTS_AOI/AUTS_AOI.vbproj Normal file
View File

@@ -0,0 +1,217 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\OpenCvSharp4.runtime.win.4.6.0.20220608\build\net48\OpenCvSharp4.runtime.win.props" Condition="Exists('..\packages\OpenCvSharp4.runtime.win.4.6.0.20220608\build\net48\OpenCvSharp4.runtime.win.props')" />
<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>{63C0C05D-77F2-4F37-9D0E-2EF197337FCF}</ProjectGuid>
<OutputType>WinExe</OutputType>
<StartupObject>AUTS_AOI.My.MyApplication</StartupObject>
<RootNamespace>AUTS_AOI</RootNamespace>
<AssemblyName>AUTS_AOI</AssemblyName>
<FileAlignment>512</FileAlignment>
<MyType>WindowsForms</MyType>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</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_AOI.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_AOI.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>iconfinder_Instagram_571111.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<SignManifests>false</SignManifests>
</PropertyGroup>
<PropertyGroup>
<ManifestCertificateThumbprint>0A24DBE81683427A18C6FFDAD761CAAF5FF0B642</ManifestCertificateThumbprint>
</PropertyGroup>
<ItemGroup>
<Reference Include="FluentFTP">
<HintPath>..\AUTS_UpdateService\FluentFTP.dll</HintPath>
</Reference>
<Reference Include="OpenCvSharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6adad1e807fea099, processorArchitecture=MSIL">
<HintPath>..\packages\OpenCvSharp4.4.6.0.20220608\lib\net48\OpenCvSharp.dll</HintPath>
</Reference>
<Reference Include="OpenCvSharp.Extensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6adad1e807fea099, processorArchitecture=MSIL">
<HintPath>..\packages\OpenCvSharp4.Extensions.4.6.0.20220608\lib\net48\OpenCvSharp.Extensions.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.4.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.6.0\lib\net462\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Drawing.Common, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Drawing.Common.6.0.0\lib\net461\System.Drawing.Common.dll</HintPath>
</Reference>
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Security" />
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
</Reference>
<Reference Include="System.Web" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xaml" />
<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="IStatisticsObserver.vb" />
<Compile Include="IFailTip.vb" />
<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>
<Compile Include="Statistics.vb" />
</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" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<Content Include="iconfinder_Instagram_571111.ico" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.8">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4.8 %28x86 和 x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\UTS_Core\UTS_Core.vbproj">
<Project>{33c6456c-f00d-41ac-a6fb-db0601495c6a}</Project>
<Name>UTS_Core</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\OpenCvSharp4.runtime.win.4.6.0.20220608\build\net48\OpenCvSharp4.runtime.win.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\OpenCvSharp4.runtime.win.4.6.0.20220608\build\net48\OpenCvSharp4.runtime.win.props'))" />
</Target>
</Project>

57
AUTS_AOI/App.config Normal file
View File

@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="AUTS_AOI.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<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.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.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>
<userSettings>
<AUTS_AOI.My.MySettings>
<setting name="Project" serializeAs="String">
<value />
</setting>
<setting name="ProcessStation" serializeAs="String">
<value />
</setting>
<setting name="ProductionLine" serializeAs="String">
<value />
</setting>
<setting name="UseCamera" serializeAs="String">
<value>True</value>
</setting>
<setting name="CameraFrameIndex" serializeAs="String">
<value>4</value>
</setting>
<setting name="DoubleCamera" serializeAs="String">
<value>True</value>
</setting>
</AUTS_AOI.My.MySettings>
</userSettings>
</configuration>

61
AUTS_AOI/CheckRecorder.vb Normal file
View File

@@ -0,0 +1,61 @@
Imports UTS_Core.Database
Imports UTS_Core.UTSModule
Imports UTS_Core.UTSModule.DbTableModel.Customer
Public Class CheckRecorder
Private ReadOnly _failTipDictionary As Dictionary(Of String, Integer)
Sub New()
_failTipDictionary = New Dictionary(Of String, Integer)()
End Sub
Public Property TestLogTableName As String
Public Sub Commit(failTip As String)
If _failTipDictionary.ContainsKey(failTip) Then
_failTipDictionary(failTip) += 1
Else
_failTipDictionary.Add(failTip, 1)
End If
End Sub
''' <summary>
''' 获取当前倒叙排序的结果信息
''' </summary>
''' <returns></returns>
Public Function UpdateFailStrings() As String()
Dim result As New List(Of String)
'排序
For Each valuePair As KeyValuePair(Of String, Integer) In _failTipDictionary.OrderByDescending(Function(x) x.Value)
result.Add(valuePair.Key)
Next
Return result.ToArray()
End Function
Public Sub ReloadFailString()
If String.IsNullOrWhiteSpace(TestLogTableName) Then Return
'以本地库为准
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
Dim cmdText As String
'统计日志表分组信息
cmdText = $"select `{TestLogTable.ColNamesEnum.QA_CheckResult}`,count(*) as count from `{TestLogTableName}` where `TestResult` = '0' group by `{TestLogTable.ColNamesEnum.QA_CheckResult}` order by count"
Dim dtTable As DataTable = db.ExecuteDataTable(cmdText)
For Each row As DataRow In dtTable.Rows
_failTipDictionary.Add(row($"{TestLogTable.ColNamesEnum.QA_CheckResult}").ToString(), CInt(row("count")))
Next
db.Close()
End Using
End Sub
End Class

452
AUTS_AOI/FrmMain.Designer.vb generated Normal file
View File

@@ -0,0 +1,452 @@
<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.StatusStrip1 = New System.Windows.Forms.StatusStrip()
Me.TssLblProductionLine = New System.Windows.Forms.ToolStripStatusLabel()
Me.TssLblStaion = New System.Windows.Forms.ToolStripStatusLabel()
Me.TsLblCheckSum = New System.Windows.Forms.ToolStripStatusLabel()
Me.TssLblInvalidCount = New System.Windows.Forms.ToolStripStatusLabel()
Me.TssLblValidCount = New System.Windows.Forms.ToolStripStatusLabel()
Me.TssLblPassCount = New System.Windows.Forms.ToolStripStatusLabel()
Me.TssLblFailCount = New System.Windows.Forms.ToolStripStatusLabel()
Me.TssLblYield = New System.Windows.Forms.ToolStripStatusLabel()
Me.ToolStrip1 = New System.Windows.Forms.ToolStrip()
Me.TsChangeStation = New System.Windows.Forms.ToolStripButton()
Me.ToolStripLabel1 = New System.Windows.Forms.ToolStripLabel()
Me.TsCboCameraFrame = New System.Windows.Forms.ToolStripComboBox()
Me.ToolStripLabel2 = New System.Windows.Forms.ToolStripLabel()
Me.SplitContainer1 = New System.Windows.Forms.SplitContainer()
Me.RdBtnDouble = New System.Windows.Forms.RadioButton()
Me.RdBtnSingle = New System.Windows.Forms.RadioButton()
Me.GroupBox3 = New System.Windows.Forms.GroupBox()
Me.RtxRecord = New System.Windows.Forms.RichTextBox()
Me.LblResult = New System.Windows.Forms.Label()
Me.GroupBox4 = New System.Windows.Forms.GroupBox()
Me.CboProductionLines = New System.Windows.Forms.ComboBox()
Me.BtnCommit = New System.Windows.Forms.Button()
Me.GroupBox1 = New System.Windows.Forms.GroupBox()
Me.RtxBarcodeSn = New System.Windows.Forms.RichTextBox()
Me.SplitContainer2 = New System.Windows.Forms.SplitContainer()
Me.GroupBox2 = New System.Windows.Forms.GroupBox()
Me.PicCamera1 = New System.Windows.Forms.PictureBox()
Me.GroupBox5 = New System.Windows.Forms.GroupBox()
Me.PicCamera2 = New System.Windows.Forms.PictureBox()
Me.StatusStrip1.SuspendLayout()
Me.ToolStrip1.SuspendLayout()
CType(Me.SplitContainer1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SplitContainer1.Panel1.SuspendLayout()
Me.SplitContainer1.Panel2.SuspendLayout()
Me.SplitContainer1.SuspendLayout()
Me.GroupBox3.SuspendLayout()
Me.GroupBox4.SuspendLayout()
Me.GroupBox1.SuspendLayout()
CType(Me.SplitContainer2, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SplitContainer2.Panel1.SuspendLayout()
Me.SplitContainer2.Panel2.SuspendLayout()
Me.SplitContainer2.SuspendLayout()
Me.GroupBox2.SuspendLayout()
CType(Me.PicCamera1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.GroupBox5.SuspendLayout()
CType(Me.PicCamera2, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'StatusStrip1
'
Me.StatusStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.TssLblProductionLine, Me.TssLblStaion, Me.TsLblCheckSum, Me.TssLblInvalidCount, Me.TssLblValidCount, Me.TssLblPassCount, Me.TssLblFailCount, Me.TssLblYield})
Me.StatusStrip1.Location = New System.Drawing.Point(0, 579)
Me.StatusStrip1.Name = "StatusStrip1"
Me.StatusStrip1.Size = New System.Drawing.Size(790, 22)
Me.StatusStrip1.TabIndex = 0
Me.StatusStrip1.Text = "StatusStrip1"
'
'TssLblProductionLine
'
Me.TssLblProductionLine.ForeColor = System.Drawing.Color.Black
Me.TssLblProductionLine.Name = "TssLblProductionLine"
Me.TssLblProductionLine.Size = New System.Drawing.Size(44, 17)
Me.TssLblProductionLine.Text = "A-Line"
'
'TssLblStaion
'
Me.TssLblStaion.ForeColor = System.Drawing.Color.Black
Me.TssLblStaion.Name = "TssLblStaion"
Me.TssLblStaion.Size = New System.Drawing.Size(68, 17)
Me.TssLblStaion.Text = "BLV-12 A1"
'
'TsLblCheckSum
'
Me.TsLblCheckSum.Name = "TsLblCheckSum"
Me.TsLblCheckSum.Size = New System.Drawing.Size(64, 17)
Me.TsLblCheckSum.Text = "Sum:0000"
'
'TssLblInvalidCount
'
Me.TssLblInvalidCount.Name = "TssLblInvalidCount"
Me.TssLblInvalidCount.Size = New System.Drawing.Size(77, 17)
Me.TssLblInvalidCount.Text = "Invalid:0000"
'
'TssLblValidCount
'
Me.TssLblValidCount.Name = "TssLblValidCount"
Me.TssLblValidCount.Size = New System.Drawing.Size(68, 17)
Me.TssLblValidCount.Text = "Valid:0000"
'
'TssLblPassCount
'
Me.TssLblPassCount.Name = "TssLblPassCount"
Me.TssLblPassCount.Size = New System.Drawing.Size(65, 17)
Me.TssLblPassCount.Text = "Pass:0000"
'
'TssLblFailCount
'
Me.TssLblFailCount.Name = "TssLblFailCount"
Me.TssLblFailCount.Size = New System.Drawing.Size(58, 17)
Me.TssLblFailCount.Text = "Fail:0000"
'
'TssLblYield
'
Me.TssLblYield.Name = "TssLblYield"
Me.TssLblYield.Size = New System.Drawing.Size(81, 17)
Me.TssLblYield.Text = "Yield:00.00%"
'
'ToolStrip1
'
Me.ToolStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.TsChangeStation, Me.ToolStripLabel1, Me.TsCboCameraFrame, Me.ToolStripLabel2})
Me.ToolStrip1.Location = New System.Drawing.Point(0, 0)
Me.ToolStrip1.Name = "ToolStrip1"
Me.ToolStrip1.Size = New System.Drawing.Size(790, 40)
Me.ToolStrip1.TabIndex = 1
Me.ToolStrip1.Text = "ToolStrip1"
'
'TsChangeStation
'
Me.TsChangeStation.Image = CType(resources.GetObject("TsChangeStation.Image"), System.Drawing.Image)
Me.TsChangeStation.ImageTransparentColor = System.Drawing.Color.Magenta
Me.TsChangeStation.Name = "TsChangeStation"
Me.TsChangeStation.Size = New System.Drawing.Size(60, 37)
Me.TsChangeStation.Text = "切换站位"
Me.TsChangeStation.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
Me.TsChangeStation.ToolTipText = "切换站位"
'
'ToolStripLabel1
'
Me.ToolStripLabel1.Name = "ToolStripLabel1"
Me.ToolStripLabel1.Size = New System.Drawing.Size(44, 37)
Me.ToolStripLabel1.Text = "分辨率"
'
'TsCboCameraFrame
'
Me.TsCboCameraFrame.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
Me.TsCboCameraFrame.Name = "TsCboCameraFrame"
Me.TsCboCameraFrame.Size = New System.Drawing.Size(121, 40)
'
'ToolStripLabel2
'
Me.ToolStripLabel2.Name = "ToolStripLabel2"
Me.ToolStripLabel2.Size = New System.Drawing.Size(0, 37)
'
'SplitContainer1
'
Me.SplitContainer1.Dock = System.Windows.Forms.DockStyle.Fill
Me.SplitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1
Me.SplitContainer1.Location = New System.Drawing.Point(0, 40)
Me.SplitContainer1.Name = "SplitContainer1"
'
'SplitContainer1.Panel1
'
Me.SplitContainer1.Panel1.Controls.Add(Me.RdBtnDouble)
Me.SplitContainer1.Panel1.Controls.Add(Me.RdBtnSingle)
Me.SplitContainer1.Panel1.Controls.Add(Me.GroupBox3)
Me.SplitContainer1.Panel1.Controls.Add(Me.LblResult)
Me.SplitContainer1.Panel1.Controls.Add(Me.GroupBox4)
Me.SplitContainer1.Panel1.Controls.Add(Me.BtnCommit)
Me.SplitContainer1.Panel1.Controls.Add(Me.GroupBox1)
'
'SplitContainer1.Panel2
'
Me.SplitContainer1.Panel2.Controls.Add(Me.SplitContainer2)
Me.SplitContainer1.Size = New System.Drawing.Size(790, 539)
Me.SplitContainer1.SplitterDistance = 429
Me.SplitContainer1.TabIndex = 0
Me.SplitContainer1.TabStop = False
'
'RdBtnDouble
'
Me.RdBtnDouble.AutoSize = True
Me.RdBtnDouble.Checked = True
Me.RdBtnDouble.Location = New System.Drawing.Point(347, 154)
Me.RdBtnDouble.Name = "RdBtnDouble"
Me.RdBtnDouble.Size = New System.Drawing.Size(71, 16)
Me.RdBtnDouble.TabIndex = 1
Me.RdBtnDouble.TabStop = True
Me.RdBtnDouble.Text = "双摄像头"
Me.RdBtnDouble.UseVisualStyleBackColor = True
'
'RdBtnSingle
'
Me.RdBtnSingle.AutoSize = True
Me.RdBtnSingle.Location = New System.Drawing.Point(259, 154)
Me.RdBtnSingle.Name = "RdBtnSingle"
Me.RdBtnSingle.Size = New System.Drawing.Size(71, 16)
Me.RdBtnSingle.TabIndex = 6
Me.RdBtnSingle.TabStop = True
Me.RdBtnSingle.Text = "单摄像头"
Me.RdBtnSingle.UseVisualStyleBackColor = True
'
'GroupBox3
'
Me.GroupBox3.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.GroupBox3.Controls.Add(Me.RtxRecord)
Me.GroupBox3.Font = New System.Drawing.Font("宋体", 12.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GroupBox3.Location = New System.Drawing.Point(12, 172)
Me.GroupBox3.Name = "GroupBox3"
Me.GroupBox3.Size = New System.Drawing.Size(406, 317)
Me.GroupBox3.TabIndex = 2
Me.GroupBox3.TabStop = False
Me.GroupBox3.Text = "校验日志"
'
'RtxRecord
'
Me.RtxRecord.BorderStyle = System.Windows.Forms.BorderStyle.None
Me.RtxRecord.Dock = System.Windows.Forms.DockStyle.Fill
Me.RtxRecord.Font = New System.Drawing.Font("微软雅黑", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.RtxRecord.Location = New System.Drawing.Point(3, 22)
Me.RtxRecord.Name = "RtxRecord"
Me.RtxRecord.ReadOnly = True
Me.RtxRecord.Size = New System.Drawing.Size(400, 292)
Me.RtxRecord.TabIndex = 0
Me.RtxRecord.TabStop = False
Me.RtxRecord.Text = ""
'
'LblResult
'
Me.LblResult.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.LblResult.Font = New System.Drawing.Font("宋体", 18.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.LblResult.Location = New System.Drawing.Point(12, 496)
Me.LblResult.Name = "LblResult"
Me.LblResult.Size = New System.Drawing.Size(249, 40)
Me.LblResult.TabIndex = 4
Me.LblResult.Text = "待开始测试"
Me.LblResult.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
'
'GroupBox4
'
Me.GroupBox4.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.GroupBox4.Controls.Add(Me.CboProductionLines)
Me.GroupBox4.Font = New System.Drawing.Font("宋体", 12.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GroupBox4.Location = New System.Drawing.Point(12, 9)
Me.GroupBox4.Name = "GroupBox4"
Me.GroupBox4.Size = New System.Drawing.Size(409, 50)
Me.GroupBox4.TabIndex = 3
Me.GroupBox4.TabStop = False
Me.GroupBox4.Text = "产线"
'
'CboProductionLines
'
Me.CboProductionLines.Dock = System.Windows.Forms.DockStyle.Fill
Me.CboProductionLines.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
Me.CboProductionLines.Font = New System.Drawing.Font("宋体", 12.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.CboProductionLines.ForeColor = System.Drawing.Color.Gray
Me.CboProductionLines.FormattingEnabled = True
Me.CboProductionLines.Items.AddRange(New Object() {"Q1", "Q2", "Q3", "Q4"})
Me.CboProductionLines.Location = New System.Drawing.Point(3, 22)
Me.CboProductionLines.Name = "CboProductionLines"
Me.CboProductionLines.Size = New System.Drawing.Size(403, 24)
Me.CboProductionLines.TabIndex = 0
Me.CboProductionLines.TabStop = False
'
'BtnCommit
'
Me.BtnCommit.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.BtnCommit.Font = New System.Drawing.Font("宋体", 20.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.BtnCommit.Location = New System.Drawing.Point(313, 495)
Me.BtnCommit.Name = "BtnCommit"
Me.BtnCommit.Size = New System.Drawing.Size(105, 40)
Me.BtnCommit.TabIndex = 2
Me.BtnCommit.Text = "提交"
Me.BtnCommit.UseVisualStyleBackColor = True
'
'GroupBox1
'
Me.GroupBox1.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.GroupBox1.Controls.Add(Me.RtxBarcodeSn)
Me.GroupBox1.Font = New System.Drawing.Font("宋体", 12.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GroupBox1.Location = New System.Drawing.Point(12, 65)
Me.GroupBox1.Name = "GroupBox1"
Me.GroupBox1.Size = New System.Drawing.Size(409, 86)
Me.GroupBox1.TabIndex = 0
Me.GroupBox1.TabStop = False
Me.GroupBox1.Text = "产品序号"
'
'RtxBarcodeSn
'
Me.RtxBarcodeSn.BorderStyle = System.Windows.Forms.BorderStyle.None
Me.RtxBarcodeSn.Dock = System.Windows.Forms.DockStyle.Fill
Me.RtxBarcodeSn.Font = New System.Drawing.Font("宋体", 12.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.RtxBarcodeSn.ForeColor = System.Drawing.Color.Gray
Me.RtxBarcodeSn.Location = New System.Drawing.Point(3, 22)
Me.RtxBarcodeSn.Name = "RtxBarcodeSn"
Me.RtxBarcodeSn.Size = New System.Drawing.Size(403, 61)
Me.RtxBarcodeSn.TabIndex = 0
Me.RtxBarcodeSn.Text = "123456ABCDEFabcdef"
'
'SplitContainer2
'
Me.SplitContainer2.Dock = System.Windows.Forms.DockStyle.Fill
Me.SplitContainer2.IsSplitterFixed = True
Me.SplitContainer2.Location = New System.Drawing.Point(0, 0)
Me.SplitContainer2.Name = "SplitContainer2"
Me.SplitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal
'
'SplitContainer2.Panel1
'
Me.SplitContainer2.Panel1.Controls.Add(Me.GroupBox2)
'
'SplitContainer2.Panel2
'
Me.SplitContainer2.Panel2.Controls.Add(Me.GroupBox5)
Me.SplitContainer2.Size = New System.Drawing.Size(357, 539)
Me.SplitContainer2.SplitterDistance = 258
Me.SplitContainer2.TabIndex = 0
'
'GroupBox2
'
Me.GroupBox2.Controls.Add(Me.PicCamera1)
Me.GroupBox2.Dock = System.Windows.Forms.DockStyle.Fill
Me.GroupBox2.Font = New System.Drawing.Font("微软雅黑", 12.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GroupBox2.Location = New System.Drawing.Point(0, 0)
Me.GroupBox2.Name = "GroupBox2"
Me.GroupBox2.Size = New System.Drawing.Size(357, 258)
Me.GroupBox2.TabIndex = 1
Me.GroupBox2.TabStop = False
Me.GroupBox2.Text = "主摄像头"
'
'PicCamera1
'
Me.PicCamera1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom
Me.PicCamera1.Dock = System.Windows.Forms.DockStyle.Fill
Me.PicCamera1.Location = New System.Drawing.Point(3, 25)
Me.PicCamera1.Name = "PicCamera1"
Me.PicCamera1.Size = New System.Drawing.Size(351, 230)
Me.PicCamera1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom
Me.PicCamera1.TabIndex = 3
Me.PicCamera1.TabStop = False
'
'GroupBox5
'
Me.GroupBox5.Controls.Add(Me.PicCamera2)
Me.GroupBox5.Dock = System.Windows.Forms.DockStyle.Fill
Me.GroupBox5.Font = New System.Drawing.Font("微软雅黑", 12.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GroupBox5.Location = New System.Drawing.Point(0, 0)
Me.GroupBox5.Name = "GroupBox5"
Me.GroupBox5.Size = New System.Drawing.Size(357, 277)
Me.GroupBox5.TabIndex = 2
Me.GroupBox5.TabStop = False
Me.GroupBox5.Text = "次摄像头"
'
'PicCamera2
'
Me.PicCamera2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom
Me.PicCamera2.Dock = System.Windows.Forms.DockStyle.Fill
Me.PicCamera2.Location = New System.Drawing.Point(3, 25)
Me.PicCamera2.Name = "PicCamera2"
Me.PicCamera2.Size = New System.Drawing.Size(351, 249)
Me.PicCamera2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom
Me.PicCamera2.TabIndex = 3
Me.PicCamera2.TabStop = False
'
'FrmMain
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(790, 601)
Me.Controls.Add(Me.SplitContainer1)
Me.Controls.Add(Me.ToolStrip1)
Me.Controls.Add(Me.StatusStrip1)
Me.ForeColor = System.Drawing.Color.Gray
Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
Me.Name = "FrmMain"
Me.Text = "Form1"
Me.StatusStrip1.ResumeLayout(False)
Me.StatusStrip1.PerformLayout()
Me.ToolStrip1.ResumeLayout(False)
Me.ToolStrip1.PerformLayout()
Me.SplitContainer1.Panel1.ResumeLayout(False)
Me.SplitContainer1.Panel1.PerformLayout()
Me.SplitContainer1.Panel2.ResumeLayout(False)
CType(Me.SplitContainer1,System.ComponentModel.ISupportInitialize).EndInit
Me.SplitContainer1.ResumeLayout(false)
Me.GroupBox3.ResumeLayout(false)
Me.GroupBox4.ResumeLayout(false)
Me.GroupBox1.ResumeLayout(false)
Me.SplitContainer2.Panel1.ResumeLayout(false)
Me.SplitContainer2.Panel2.ResumeLayout(false)
CType(Me.SplitContainer2,System.ComponentModel.ISupportInitialize).EndInit
Me.SplitContainer2.ResumeLayout(false)
Me.GroupBox2.ResumeLayout(false)
CType(Me.PicCamera1,System.ComponentModel.ISupportInitialize).EndInit
Me.GroupBox5.ResumeLayout(false)
CType(Me.PicCamera2,System.ComponentModel.ISupportInitialize).EndInit
Me.ResumeLayout(false)
Me.PerformLayout
End Sub
Friend WithEvents StatusStrip1 As StatusStrip
Friend WithEvents ToolStrip1 As ToolStrip
Friend WithEvents TsChangeStation As ToolStripButton
Friend WithEvents SplitContainer1 As SplitContainer
Friend WithEvents GroupBox2 As GroupBox
Friend WithEvents GroupBox1 As GroupBox
Friend WithEvents RtxBarcodeSn As RichTextBox
Friend WithEvents RtxRecord As RichTextBox
Friend WithEvents GroupBox3 As GroupBox
Friend WithEvents TsLblCheckSum As ToolStripStatusLabel
Friend WithEvents TssLblPassCount As ToolStripStatusLabel
Friend WithEvents TssLblFailCount As ToolStripStatusLabel
Friend WithEvents BtnCommit As Button
Friend WithEvents TssLblStaion As ToolStripStatusLabel
Friend WithEvents TssLblYield As ToolStripStatusLabel
Friend WithEvents GroupBox4 As GroupBox
Friend WithEvents CboProductionLines As ComboBox
Friend WithEvents TssLblProductionLine As ToolStripStatusLabel
Friend WithEvents TssLblInvalidCount As ToolStripStatusLabel
Friend WithEvents TssLblValidCount As ToolStripStatusLabel
Friend WithEvents PicCamera1 As PictureBox
Friend WithEvents LblResult As Label
Friend WithEvents ToolStripLabel1 As ToolStripLabel
Friend WithEvents TsCboCameraFrame As ToolStripComboBox
Friend WithEvents ToolStripLabel2 As ToolStripLabel
Friend WithEvents SplitContainer2 As SplitContainer
Friend WithEvents GroupBox5 As GroupBox
Friend WithEvents PicCamera2 As PictureBox
Friend WithEvents RdBtnDouble As RadioButton
Friend WithEvents RdBtnSingle As RadioButton
End Class

1978
AUTS_AOI/FrmMain.resx Normal file

File diff suppressed because it is too large Load Diff

541
AUTS_AOI/FrmMain.vb Normal file
View File

@@ -0,0 +1,541 @@
Imports System.Text
Imports System.Threading
Imports OpenCvSharp
Imports OpenCvSharp.Extensions
Imports UTS_Core.UTSModule.Test
Imports UTS_Core.UTSModule
Imports UTS_Core.UTSModule.Station
Public Class FrmMain
Implements IStatisticsObserver
Implements IProcessStation
Implements IProductionLine
Private _ftp As FtpService
Private _utsApp As UtsAppForm
Private _checkStatistics As Statistics
Private _snSqliteChar As Char = "|"c
Private _useCamera As Boolean
Private _doubleCarera As Boolean
Public Sub ProductionLineChanged() Implements IProductionLine.ProductionLineChanged
TssLblProductionLine.Text = CboProductionLines.Text
My.Settings.ProductionLine = CboProductionLines.Text
End Sub
Public Sub StationChanged() Implements IProcessStation.StationChanged
My.Settings.Project = _utsApp.ProcessStation.ParentProject.Name
My.Settings.ProcessStation = _utsApp.ProcessStation.Name
UpdateStation(_utsApp.ProcessStation.ParentProject.Name, _utsApp.ProcessStation.Name)
End Sub
Public Sub UpdateStation(projectName As String, stationName As String)
If String.IsNullOrWhiteSpace(projectName) OrElse
String.IsNullOrWhiteSpace(stationName) Then
TssLblStaion.Text = $"Invalid Station"
Else
TssLblStaion.Text = $"{projectName} - {stationName}"
End If
End Sub
Public Sub UpdateFailCount(failCount As Integer) Implements IStatisticsObserver.UpdateFailCount
TssLblFailCount.Text = $"Fail:{failCount:D4}"
End Sub
Public Sub UpdatePassCount(passCount As Integer) Implements IStatisticsObserver.UpdatePassCount
TssLblPassCount.Text = $"Pass:{passCount:D4}"
End Sub
Public Sub UpdateValidCount(validCount As Integer) Implements IStatisticsObserver.UpdateValidCount
TssLblValidCount.Text = $"Valid:{validCount:D4}"
End Sub
Public Sub UpdateInvalidCount(invalidCount As Integer) Implements IStatisticsObserver.UpdateInvalidCount
TssLblInvalidCount.Text = $"Invalid:{invalidCount:D4}"
End Sub
Public Sub UpdateSumCount(sumCount As Integer) Implements IStatisticsObserver.UpdateSumCount
TsLblCheckSum.Text = $"Sum:{sumCount:D4}"
End Sub
Public Sub UpdateYield(yield As Double) Implements IStatisticsObserver.UpdateYield
Select Case yield
Case > 90
TssLblYield.ForeColor = Color.DarkGreen
Case > 75
TssLblYield.ForeColor = Color.Green
Case > 60
TssLblYield.ForeColor = Color.Orange
Case > 40
TssLblYield.ForeColor = Color.OrangeRed
Case Else
TssLblYield.ForeColor = Color.Red
End Select
TssLblYield.Text = $"Yield:{yield:F2}%"
End Sub
Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles Me.Load
My.Application.SaveMySettingsOnExit = True
_checkStatistics = New Statistics()
_checkStatistics.AddStatisticsObserver(Me)
_utsApp = UtsAppForm.CreateSingleton()
Try
If _utsApp.IsInitialized = False Then
_utsApp.AddStatisticsObserver(Me)
_utsApp.Initialize(ProcessStation.StationTypeEnum.AOI)
_utsApp.LoadStation(My.Settings.Project, My.Settings.ProcessStation)
End If
Catch ex As Exception
MsgBox($"Initialize UTSForm Error:{ex.Message}")
Close()
Return
End Try
Try
_ftp = New FtpService(UtsRegistry.FtpHost, CInt(_utsApp.License.FtpPort), _utsApp.License.FtpUser, _utsApp.License.FtpPwd)
Catch ex As Exception
MsgBox($"Initialize FtpService Error:{ex.Message}")
Close()
Return
End Try
'初始化产线信息
CboProductionLines.Items.Clear()
CboProductionLines.Items.AddRange(_utsApp.ProductionLines.GetLineNames())
CboProductionLines.SelectedIndex = CboProductionLines.Items.IndexOf(My.Settings.ProductionLine)
_doubleCarera = My.Settings.DoubleCamera
If _doubleCarera Then
RdBtnDouble.Checked = True
Else
RdBtnSingle.Checked = True
End If
TsCboCameraFrame.Items.Clear()
For Each siz As Size In _cameraFrame
TsCboCameraFrame.Items.Add($"{siz.Width}*{siz.Height}")
Next
TsCboCameraFrame.SelectedIndex = My.Settings.CameraFrameIndex
RtxBarcodeSn.Clear()
InitImageControl()
Text = $"{Application.ProductName} {Application.ProductVersion}"
End Sub
Private Sub InitImageControl()
_imgControl(0) = PicCamera1
_imgControl(1) = PicCamera2
End Sub
Private Sub FrmMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
SaveLogFile()
My.Settings.CameraFrameIndex = _selectFrameSizeIndex
My.Settings.DoubleCamera = _doubleCarera
_utsApp.Dispose()
CloseForm()
End Sub
Private Sub CloseForm()
Text = $"Goodbye World."
For i As Double = 1 To 0 Step -0.05
Thread.Sleep(50)
Opacity = i
Next
End Sub
Private Sub RtxDUT_SN_KeyDown(sender As Object, e As KeyEventArgs) Handles RtxBarcodeSn.KeyDown
If e.KeyCode = Keys.Enter Then
If String.IsNullOrWhiteSpace(RtxBarcodeSn.Text) = False Then
My.Computer.Keyboard.SendKeys("|")
e.SuppressKeyPress = True
e.Handled = True
End If
ElseIf e.KeyCode = Keys.Space Then
CommitTestResult()
e.SuppressKeyPress = True
e.Handled = True
Console.WriteLine($"{ e.SuppressKeyPress} { e.Handled}")
End If
End Sub
Private Function UploadFileToFtp(localPath As String, remotePath As String) As Boolean
Try
_ftp.FtpUpload(remotePath, localPath)
Catch ex As Exception
MsgBox($"上传图像[{localPath}]失败:{ex.Message}")
'todo:添加本地缓存上传失败图像,定期上传
'记录本地位置上传文件位置写入FTP的缓存数据库
'服务新增ftp同步任务区分上传下载
'
'
'记录ftp命令
'只记录上传下载命令?
Return False
End Try
Return True
End Function
Private Function GetImageName(barCode As String, index As Integer) As String
Dim fileName As New StringBuilder
fileName.Append(_utsApp.ProcessStation.ParentProject.Name)
fileName.Append("_")
fileName.Append(_utsApp.ProcessStation.Name)
fileName.Append("_")
fileName.Append(barCode)
fileName.Append("_")
fileName.Append($"{Now:yyyyMMdd_HHmmss}")
fileName.Append("_")
fileName.Append($"{index}")
fileName.Append(".jpg")
Return fileName.ToString()
End Function
Private Function SaveImageToLocal(localPath As String, index As Integer) As Boolean
If _imgControl(index).Image Is Nothing Then
MsgBox($"未检测到Camera[{index}] Image,录入失败")
Return False
End If
Dim img As Image = CType(_imgControl(index).Image.Clone(), Image)
Try
img.Save(localPath, Imaging.ImageFormat.Jpeg)
Catch ex As Exception
MsgBox($"Save Camera[{index}] Image Error:{ex.Message}")
Return False
End Try
Return True
End Function
Private Sub BtnCommit_Click(sender As Object, e As EventArgs) Handles BtnCommit.Click
CommitTestResult()
End Sub
Private Sub CommitTestResult()
If _utsApp.ProcessStation Is Nothing Then
MsgBox($"请选择项目与测试站后再尝试录入!")
Return
End If
If String.IsNullOrWhiteSpace(CboProductionLines.Text) Then
MsgBox($"请选择生产线后再尝试录入!")
Return
End If
Dim barcodeString As String = RtxBarcodeSn.Text.ToUpper
If String.IsNullOrWhiteSpace(barcodeString) Then
MsgBox($"请输入合法的序列号!")
Return
End If
Dim barcodeList As String() = barcodeString.Split(New Char() {_snSqliteChar}, StringSplitOptions.RemoveEmptyEntries)
If barcodeList.Count() = 0 Then Return
For Each barcode As String In barcodeList
If barcode.Length <> 8 Then
MsgBox($"录入失败,条码[{barcode}]长度非法,请检查后重新录入!")
Return
End If
Static imgDirPath As String = $"{Application.StartupPath}\Img"
If IO.Directory.Exists(imgDirPath) = False Then IO.Directory.CreateDirectory(imgDirPath)
Dim imgFileName As String = GetImageName(barcode, 0)
Dim imgLocalPath As String = $"{imgDirPath}\{imgFileName}"
Dim imgRemotePath As String = $"/uts_Manager/AUTS/{_utsApp.License.VendorName}/AOI/{_utsApp.ProcessStation.ParentProject.Index}/{imgFileName}"
If SaveImageToLocal(imgLocalPath, 0) = False Then Return
If UploadFileToFtp(imgLocalPath, imgRemotePath) = False Then Return
Dim imgFileName2 As String = GetImageName(barcode, 1)
Dim imgRemotePath2 As String = ""
If _doubleCarera Then
Dim imgLocalPath2 As String = $"{imgDirPath}\{imgFileName2}"
If SaveImageToLocal(imgLocalPath2, 1) = False Then Return
imgRemotePath2 = $"/uts_Manager/AUTS/{_utsApp.License.VendorName}/AOI/{_utsApp.ProcessStation.ParentProject.Index}/{imgFileName2}"
If UploadFileToFtp(imgLocalPath2, imgRemotePath2) = False Then Return
End If
Try
FillTestResult(barcode, imgRemotePath, imgRemotePath2)
_utsApp.CommitTestResult()
_checkStatistics.AddPassCount()
AppendRecord(True, _utsApp.ProcessStation.ParentProject.Index, _utsApp.ProcessStation.StationID, _utsApp.TestResult.OrderID, _utsApp.TestResult.DUT_SN, "Pass")
LblResult.Text = $"{_utsApp.ProcessStation.ParentProject.Index:D2}-{_utsApp.ProcessStation.StationID:D2}-{_utsApp.TestResult.OrderID:D6}-{_utsApp.TestResult.DUT_SN} 录入成功"
LblResult.ForeColor = Color.Green
Catch ex As Exception
_checkStatistics.AddInvalidCount()
MsgBox($"测试结果录入失败:{ex.Message}")
LblResult.Text = $"{_utsApp.TestResult.DUT_SN} 录入失败"
LblResult.ForeColor = Color.Red
End Try
Next
TestResultCommitted()
End Sub
''' <summary>
''' 填充测试记录内容,每个应用程序这个部分有所差异
''' </summary>
Public Sub FillTestResult(barcodeSn As String, imgPath As String, imgPath2 As String)
_utsApp.TestResult.ResetTestResult()
'产线索引
Dim lineID As Integer = _utsApp.ProductionLines(CboProductionLines.Text).ID
_utsApp.TestResult.ProductionLineID = lineID
'测试开始时间
_utsApp.TestResult.StartTime = Now
_utsApp.TestResult.DUT_SN = barcodeSn
_utsApp.TestResult.TestResult = TestResult.TestResultEnum.Pass
_utsApp.TestResult.AddCustomRecord("ImagePath", imgPath)
_utsApp.TestResult.AddCustomRecord("ImagePath2", imgPath2)
End Sub
Public Sub TestResultCommitted()
RtxBarcodeSn.Focus()
RtxBarcodeSn.SelectAll()
End Sub
Private Sub TsChangeStation_Click(sender As Object, e As EventArgs) Handles TsChangeStation.Click
Try
Dim filed As New Dictionary(Of String, String) From {{"ImagePath", "varchar(128)"}, {"ImagePath2", "varchar(128)"}}
_utsApp.ChangeStation(filed)
Catch ex As Exception
MsgBox($"ChangeStation Error:{ex.Message}")
End Try
End Sub
''' <summary>
''' 添加提示信息
''' </summary>
''' <param name="checkResult">校验结果</param>
''' <param name="log">提示信息</param>
Private Sub AppendRecord(checkResult As Boolean, pid As Integer, sid As Integer, order As Integer, barcode As String, log As String)
Static recordMaxCount As Integer = 256
Static recordCount As Integer = 1
With RtxRecord
.Enabled = False
If recordCount >= recordMaxCount Then
SaveLogFile()
.Clear()
recordCount = 1
End If
.SelectionStart = .TextLength
.SelectionColor = Color.Black
.AppendText($"{recordCount:D4} ")
.SelectionStart = .TextLength
.SelectionColor = Color.DarkBlue
.AppendText($"{Now:MMdd_HH:mm:ss} ")
.SelectionStart = .TextLength
.SelectionColor = Color.Black
.AppendText($"{pid:D2}-")
.SelectionStart = .TextLength
.SelectionColor = Color.Black
.AppendText($"{sid:D2} ")
.SelectionStart = .TextLength
.SelectionColor = Color.DarkSeaGreen
.AppendText($"{order:D6} ")
.SelectionStart = .TextLength
.SelectionColor = Color.DarkOrange
.AppendText($"{barcode,8} ")
.SelectionStart = .TextLength
.SelectionColor = CType(IIf(checkResult, Color.Green, Color.Red), Color)
.AppendText($"{log}{vbNewLine}")
recordCount += 1
.ScrollToCaret()
.Enabled = True
End With
End Sub
Private Sub SaveLogFile()
Dim dirPath As String = $"{Application.StartupPath}\Log"
Dim filePath As String = $"{dirPath}\Log_{Now:yyyyMMdd_HHmmss}.txt"
If IO.Directory.Exists(dirPath) = False Then IO.Directory.CreateDirectory(dirPath)
RtxRecord.SaveFile(filePath, RichTextBoxStreamType.TextTextOleObjs)
End Sub
Private Sub CboProductionLines_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CboProductionLines.SelectedIndexChanged
ProductionLineChanged()
End Sub
#Region "相机"
Private ReadOnly _imgControl(1) As PictureBox
Private ReadOnly _camera(1) As VideoCapture
Private ReadOnly _frameChanged(1) As Boolean
Private _selectFrameSizeIndex As Integer
Private ReadOnly _cameraFrame() As Size = {New Size(640, 480), New Size(1280, 960), New Size(2048, 1536), New Size(2560, 1920), New Size(3200, 2400), New Size(3840, 2880)}
Private Sub UpdateText(w As Integer, h As Integer, fps As Double)
If InvokeRequired Then
Invoke(New Action(Sub()
Text = $"{Application.ProductName} {Application.ProductVersion} Camera : {w} * {h} : {CInt(fps)} Fps"
End Sub))
Else
Text = $"{Application.ProductName} {Application.ProductVersion} Camera : {w} * {h} : {CInt(fps)} Fps"
End If
End Sub
''' <summary>
''' 打开摄像头显示图像
''' </summary>
Private Sub OpenVideoThread(state As Object)
Dim index As Integer = CInt(state)
While _useCamera
Thread.Sleep(10)
If _doubleCarera = False AndAlso index = 1 Then
If _camera(index) IsNot Nothing Then
_camera(index).Release()
_camera(index).Dispose()
_camera(index) = Nothing
_imgControl(index).Image = Nothing
End If
Continue While
End If
If _camera(index) Is Nothing Then
_camera(index) = New VideoCapture(index) '打开默认的相机使用默认为0
'摄像头为4:3
If _selectFrameSizeIndex <> -1 Then
_camera(index).FrameWidth = _cameraFrame(_selectFrameSizeIndex).Width
_camera(index).FrameHeight = _cameraFrame(_selectFrameSizeIndex).Height
Else
_camera(index).FrameWidth = 2560
_camera(index).FrameHeight = 1920
End If
_camera(index).Fps = 30 '采集率FTP
_camera(index).Saturation = 60 '图像饱和度
_camera(index).Gain = 0 '图像增益
_camera(index).Contrast = 0 '对比度
_camera(index).Hue = 20 '色调
_camera(index).Brightness = 0
_camera(index).Exposure = 0 '曝光度
If _camera(index).IsOpened() = False Then
Thread.Sleep(1000)
Continue While
End If
UpdateText(_camera(index).FrameWidth, _camera(index).FrameHeight, _camera(index).Fps)
End If
If _frameChanged(index) Then
Console.WriteLine($"分辨率切换!")
_camera(index).Release()
_camera(index).Dispose()
_camera(index) = Nothing
_frameChanged(index) = False
Continue While
End If
Using src As New Mat
If _camera(index).Read(src) = False Then
Console.WriteLine($"图像为空!")
_camera(index).Release()
_camera(index).Dispose()
_camera(index) = Nothing
Continue While
End If
Cv2.Flip(src, src, FlipMode.XY) '反转图像
_imgControl(index).Image = src.ToBitmap
End Using
GC.Collect()
End While
End Sub
Private Sub FrmMain_Shown(sender As Object, e As EventArgs) Handles Me.Shown
_useCamera = True
ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf OpenVideoThread), 0)
ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf OpenVideoThread), 1)
End Sub
Private Sub TsCboCameraFrame_SelectedIndexChanged(sender As Object, e As EventArgs) Handles TsCboCameraFrame.SelectedIndexChanged
_frameChanged(0) = True
_frameChanged(1) = True
_selectFrameSizeIndex = TsCboCameraFrame.SelectedIndex
End Sub
Private Sub RdBtnDouble_CheckedChanged(sender As Object, e As EventArgs) Handles RdBtnDouble.CheckedChanged
_doubleCarera = RdBtnDouble.Checked
End Sub
Private Sub RtxRecord_TextChanged(sender As Object, e As EventArgs) Handles RtxRecord.TextChanged
End Sub
#End Region
End Class

51
AUTS_AOI/FtpService.vb Normal file
View File

@@ -0,0 +1,51 @@
Imports FluentFTP
Public Class FtpService
Private _ftpUser As String
Private _ftpPwd As String
Private _ftpPort As Integer
Private _ftpHost As String
Sub New(host As String, port As Integer, user As String, pwd As String)
_ftpHost = host
_ftpPort = port
_ftpUser = user
_ftpPwd = pwd
End Sub
Private Sub OnValidateCertificate(control As FtpClient, e As FtpSslValidationEventArgs)
e.Accept = True
End Sub
''' <summary>
''' 文件上传,覆盖式上传,文件夹不存在则回创建文件夹
''' </summary>
Public Sub UploadFile(remotePath As String, loadPath As String)
Using ftpClient As New FtpClient(_ftpHost, _ftpPort, _ftpUser, _ftpPwd)
AddHandler ftpClient.ValidateCertificate, AddressOf OnValidateCertificate
ftpClient.EncryptionMode = FtpEncryptionMode.Auto
ftpClient.Connect()
ftpClient.UploadFile(loadPath, remotePath, FtpRemoteExists.Overwrite, True)
ftpClient.Disconnect()
End Using
End Sub
''' <summary>
''' 文件下载
''' 从FTP下载压缩包到本地指定路径
''' </summary>
Public Sub DownloadFile(remotePath As String, loadPath As String)
Using ftpClient As New FtpClient(_ftpHost, _ftpPort, _ftpUser, _ftpPwd)
AddHandler ftpClient.ValidateCertificate, AddressOf OnValidateCertificate
ftpClient.EncryptionMode = FtpEncryptionMode.Auto
ftpClient.Connect()
ftpClient.DownloadFile(loadPath, remotePath)
ftpClient.Disconnect()
End Using
End Sub
End Class

3
AUTS_AOI/IFailTip.vb Normal file
View File

@@ -0,0 +1,3 @@
Public Interface IFailTip
Sub UpdateFailTips(failTips() As String)
End Interface

View File

@@ -0,0 +1,15 @@
Public Interface IStatisticsObserver
Sub UpdateFailCount(failCount As Integer)
Sub UpdatePassCount(passCount As Integer)
Sub UpdateValidCount(validCount As Integer)
Sub UpdateInvalidCount(invalidCount As Integer)
Sub UpdateSumCount(sumCount As Integer)
Sub UpdateYield(yield As Double)
End Interface

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_AOI.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_AOI")>
<Assembly: AssemblyDescription("")>
<Assembly: AssemblyCompany("")>
<Assembly: AssemblyProduct("AUTS_AOI")>
<Assembly: AssemblyCopyright("Copyright © 2021")>
<Assembly: AssemblyTrademark("")>
<Assembly: ComVisible(False)>
'如果此项目向 COM 公开,则下列 GUID 用于 typelib 的 ID
<Assembly: Guid("17469f21-f87e-49db-a07a-eab96b4e1476")>
' 程序集的版本信息由下列四个值组成:
'
' 主版本
' 次版本
' 生成号
' 修订号
'
'可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
'通过使用 "*",如下所示:
' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("1.0.0.0")>
<Assembly: AssemblyFileVersion("1.3.1.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_AOI.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>

145
AUTS_AOI/My Project/Settings.Designer.vb generated Normal file
View File

@@ -0,0 +1,145 @@
'------------------------------------------------------------------------------
' <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
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("")> _
Public Property Project() As String
Get
Return CType(Me("Project"),String)
End Get
Set
Me("Project") = value
End Set
End Property
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("")> _
Public Property ProcessStation() As String
Get
Return CType(Me("ProcessStation"),String)
End Get
Set
Me("ProcessStation") = value
End Set
End Property
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("")> _
Public Property ProductionLine() As String
Get
Return CType(Me("ProductionLine"),String)
End Get
Set
Me("ProductionLine") = value
End Set
End Property
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("True")> _
Public Property UseCamera() As Boolean
Get
Return CType(Me("UseCamera"),Boolean)
End Get
Set
Me("UseCamera") = value
End Set
End Property
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("4")> _
Public Property CameraFrameIndex() As Integer
Get
Return CType(Me("CameraFrameIndex"),Integer)
End Get
Set
Me("CameraFrameIndex") = value
End Set
End Property
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("True")> _
Public Property DoubleCamera() As Boolean
Get
Return CType(Me("DoubleCamera"),Boolean)
End Get
Set
Me("DoubleCamera") = value
End Set
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_AOI.My.MySettings
Get
Return Global.AUTS_AOI.My.MySettings.Default
End Get
End Property
End Module
End Namespace

View File

@@ -0,0 +1,24 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="My" GeneratedClassName="MySettings" UseMySettingsClassName="true">
<Profiles />
<Settings>
<Setting Name="Project" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="ProcessStation" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="ProductionLine" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="UseCamera" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="CameraFrameIndex" Type="System.Int32" Scope="User">
<Value Profile="(Default)">4</Value>
</Setting>
<Setting Name="DoubleCamera" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
</Settings>
</SettingsFile>

161
AUTS_AOI/Statistics.vb Normal file
View File

@@ -0,0 +1,161 @@
''' <summary>
''' 生产统计类(当前类线程仅限同步中使用)
''' </summary>
Public Class Statistics
''' <summary>
''' 校验总数,包含有效校验与无效检验
''' </summary>
Private _checkCount As Integer
''' <summary>
''' 检验有效总数中无效总数
''' </summary>
Private _invalidCount As Integer
''' <summary>
''' 检验总数中有效总数
''' </summary>
Private _validCount As Integer
''' <summary>
''' 检验有效总数中失败总数
''' </summary>
Private _failCount As Integer
''' <summary>
''' 检验有效总数中通过总数
''' </summary>
Private _passCount As Integer
''' <summary>
''' 产品运行时良品率,通过总数除以有效总数
''' </summary>
Private _yield As Double
Private ReadOnly _observerList As List(Of IStatisticsObserver)
Sub New()
_checkCount = 0
_failCount = 0
_passCount = 0
_observerList = New List(Of IStatisticsObserver)()
End Sub
Public ReadOnly Property CheckCount() As Integer
Get
Return _checkCount
End Get
End Property
Public ReadOnly Property InvalidCount() As Integer
Get
Return _invalidCount
End Get
End Property
Public ReadOnly Property FailCount() As Integer
Get
Return _failCount
End Get
End Property
Public ReadOnly Property PassCount() As Integer
Get
Return _passCount
End Get
End Property
Public Sub AddFailCount()
_failCount += 1
UpdateFailCount(_failCount)
_validCount +=1
UpdateValidCount(_validCount)
_checkCount += 1
UpdateSumCount(_checkCount)
_yield = (_passCount / _validCount) * 100
UpdateYield(_yield)
End Sub
Public Sub AddPassCount()
_passCount += 1
UpdatePassCount(_passCount)
_validCount +=1
UpdateValidCount(_validCount)
_checkCount += 1
UpdateSumCount(_checkCount)
_yield = (_passCount / _validCount) * 100
UpdateYield(_yield)
End Sub
Public Sub AddInvalidCount()
_invalidCount += 1
UpdateInvalidCount(_invalidCount)
_checkCount += 1
UpdateSumCount(_checkCount)
End Sub
Public Sub AddStatisticsObserver(observer As IStatisticsObserver)
_observerList.Add(observer)
End Sub
Public Sub RemoveStatisticsObserver(observer As IStatisticsObserver)
_observerList.Remove(observer)
End Sub
Public Sub ClearStatisticsObserver()
_observerList.Clear()
End Sub
Private Sub UpdateFailCount(count As Integer)
For Each observer As IStatisticsObserver In _observerList
observer.UpdateFailCount(count)
Next
End Sub
Private Sub UpdatePassCount(count As Integer)
For Each observer As IStatisticsObserver In _observerList
observer.UpdatePassCount(count)
Next
End Sub
Private Sub UpdateValidCount(count As Integer)
For Each observer As IStatisticsObserver In _observerList
observer.UpdateValidCount(count)
Next
End Sub
Private Sub UpdateInvalidCount(count As Integer)
For Each observer As IStatisticsObserver In _observerList
observer.UpdateInvalidCount(count)
Next
End Sub
Private Sub UpdateSumCount(count As Integer)
For Each observer As IStatisticsObserver In _observerList
observer.UpdateSumCount(count)
Next
End Sub
Private Sub UpdateYield(yield As Double)
For Each observer As IStatisticsObserver In _observerList
observer.UpdateYield(yield)
Next
End Sub
End Class

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

12
AUTS_AOI/packages.config Normal file
View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="OpenCvSharp4" version="4.6.0.20220608" targetFramework="net48" />
<package id="OpenCvSharp4.Extensions" version="4.6.0.20220608" targetFramework="net48" />
<package id="OpenCvSharp4.runtime.win" version="4.6.0.20220608" targetFramework="net48" />
<package id="System.Buffers" version="4.6.0" targetFramework="net48" />
<package id="System.Drawing.Common" version="6.0.0" targetFramework="net48" />
<package id="System.Memory" version="4.5.5" targetFramework="net48" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
<package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net48" />
<package id="System.ValueTuple" version="4.5.0" targetFramework="net48" />
</packages>

View File

@@ -0,0 +1,147 @@
<?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>{8DAB8B67-D59B-4413-9024-8FA8EBBE821D}</ProjectGuid>
<OutputType>WinExe</OutputType>
<StartupObject>AUTS_Assembly.My.MyApplication</StartupObject>
<RootNamespace>AUTS_Assembly</RootNamespace>
<AssemblyName>AUTS_Assembly</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_Assembly.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_Assembly.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>iconfinder_60_939814.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="FluentFTP">
<HintPath>..\packages\FluentFTP.33.0.3\lib\net45\FluentFTP.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Data.SQLite">
<HintPath>..\UTS_Core\bin\Debug\System.Data.SQLite.dll</HintPath>
</Reference>
<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="ApplicationEvents.vb" />
<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>
<Content Include="iconfinder_60_939814.ico" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\UTS_Core\UTS_Core.vbproj">
<Project>{33c6456c-f00d-41ac-a6fb-db0601495c6a}</Project>
<Name>UTS_Core</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
</Project>

50
AUTS_Assembly/App.config Normal file
View File

@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="AUTS_Assembly.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<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>
<userSettings>
<AUTS_Assembly.My.MySettings>
<setting name="Project" serializeAs="String">
<value />
</setting>
<setting name="ProcessStation" serializeAs="String">
<value />
</setting>
<setting name="ProductionLine" serializeAs="String">
<value />
</setting>
<setting name="SingleSn" serializeAs="String">
<value>True</value>
</setting>
<setting name="BarCount" serializeAs="String">
<value>1</value>
</setting>
</AUTS_Assembly.My.MySettings>
</userSettings>
</configuration>

View File

@@ -0,0 +1,10 @@
Namespace My
' 以下事件可用于 MyApplication:
' Startup:应用程序启动时在创建启动窗体之前引发。
' Shutdown:在关闭所有应用程序窗体后引发。如果应用程序非正常终止,则不会引发此事件。
' UnhandledException:在应用程序遇到未经处理的异常时引发。
' StartupNextInstance:在启动单实例应用程序且应用程序已处于活动状态时引发。
' NetworkAvailabilityChanged:在连接或断开网络连接时引发。
Partial Friend Class MyApplication
End Class
End Namespace

416
AUTS_Assembly/FrmMain.Designer.vb generated Normal file
View File

@@ -0,0 +1,416 @@
<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.lab_Result = New System.Windows.Forms.Label()
Me.lab_ModelName = New System.Windows.Forms.Label()
Me.BtnOpenProject = New System.Windows.Forms.Button()
Me.BtnStartProgramming = New System.Windows.Forms.Button()
Me.GroupBox2 = New System.Windows.Forms.GroupBox()
Me.TxtThirdRecord = New System.Windows.Forms.TextBox()
Me.TxtFifthRecord = New System.Windows.Forms.TextBox()
Me.TxtFourthRecord = New System.Windows.Forms.TextBox()
Me.RadFour = New System.Windows.Forms.RadioButton()
Me.RadThree = New System.Windows.Forms.RadioButton()
Me.RadTwo = New System.Windows.Forms.RadioButton()
Me.RadSingle = New System.Windows.Forms.RadioButton()
Me.TxtSecondRecord = New System.Windows.Forms.TextBox()
Me.GroupBox1 = New System.Windows.Forms.GroupBox()
Me.TxtFirstRecord = New System.Windows.Forms.TextBox()
Me.GroupBox3 = New System.Windows.Forms.GroupBox()
Me.RtxLog = New System.Windows.Forms.RichTextBox()
Me.GroupBox4 = New System.Windows.Forms.GroupBox()
Me.CboProductionLines = New System.Windows.Forms.ComboBox()
Me.StatusStrip1 = New System.Windows.Forms.StatusStrip()
Me.TssLblProductionLine = New System.Windows.Forms.ToolStripStatusLabel()
Me.TssLblStaion = New System.Windows.Forms.ToolStripStatusLabel()
Me.TsLblCheckSum = New System.Windows.Forms.ToolStripStatusLabel()
Me.TssLblPassCount = New System.Windows.Forms.ToolStripStatusLabel()
Me.TssLblFailCount = New System.Windows.Forms.ToolStripStatusLabel()
Me.TssLblYield = New System.Windows.Forms.ToolStripStatusLabel()
Me.GroupBox2.SuspendLayout()
Me.GroupBox1.SuspendLayout()
Me.GroupBox3.SuspendLayout()
Me.GroupBox4.SuspendLayout()
Me.StatusStrip1.SuspendLayout()
Me.SuspendLayout()
'
'lab_Result
'
Me.lab_Result.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.lab_Result.BackColor = System.Drawing.Color.Black
Me.lab_Result.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
Me.lab_Result.Font = New System.Drawing.Font("Consolas", 27.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.lab_Result.ForeColor = System.Drawing.Color.FromArgb(CType(CType(0, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(0, Byte), Integer))
Me.lab_Result.Location = New System.Drawing.Point(447, 84)
Me.lab_Result.Name = "lab_Result"
Me.lab_Result.Size = New System.Drawing.Size(433, 112)
Me.lab_Result.TabIndex = 13
Me.lab_Result.Text = "PASS"
Me.lab_Result.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
'
'lab_ModelName
'
Me.lab_ModelName.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.lab_ModelName.BackColor = System.Drawing.SystemColors.ActiveCaption
Me.lab_ModelName.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
Me.lab_ModelName.Font = New System.Drawing.Font("Consolas", 27.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.lab_ModelName.Location = New System.Drawing.Point(447, 9)
Me.lab_ModelName.Name = "lab_ModelName"
Me.lab_ModelName.Size = New System.Drawing.Size(433, 67)
Me.lab_ModelName.TabIndex = 12
Me.lab_ModelName.Text = "SW-570"
Me.lab_ModelName.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
'
'BtnOpenProject
'
Me.BtnOpenProject.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.BtnOpenProject.Font = New System.Drawing.Font("微软雅黑", 15.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.BtnOpenProject.Location = New System.Drawing.Point(447, 204)
Me.BtnOpenProject.Name = "BtnOpenProject"
Me.BtnOpenProject.Size = New System.Drawing.Size(169, 104)
Me.BtnOpenProject.TabIndex = 11
Me.BtnOpenProject.Text = "选择项目"
Me.BtnOpenProject.UseVisualStyleBackColor = True
'
'BtnStartProgramming
'
Me.BtnStartProgramming.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.BtnStartProgramming.Font = New System.Drawing.Font("微软雅黑", 24.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.BtnStartProgramming.ForeColor = System.Drawing.Color.Blue
Me.BtnStartProgramming.Location = New System.Drawing.Point(622, 204)
Me.BtnStartProgramming.Name = "BtnStartProgramming"
Me.BtnStartProgramming.Size = New System.Drawing.Size(258, 104)
Me.BtnStartProgramming.TabIndex = 10
Me.BtnStartProgramming.Text = "开始录入"
Me.BtnStartProgramming.UseVisualStyleBackColor = True
'
'GroupBox2
'
Me.GroupBox2.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.GroupBox2.Controls.Add(Me.TxtThirdRecord)
Me.GroupBox2.Controls.Add(Me.TxtFifthRecord)
Me.GroupBox2.Controls.Add(Me.TxtFourthRecord)
Me.GroupBox2.Controls.Add(Me.RadFour)
Me.GroupBox2.Controls.Add(Me.RadThree)
Me.GroupBox2.Controls.Add(Me.RadTwo)
Me.GroupBox2.Controls.Add(Me.RadSingle)
Me.GroupBox2.Controls.Add(Me.TxtSecondRecord)
Me.GroupBox2.Font = New System.Drawing.Font("微软雅黑", 15.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GroupBox2.ForeColor = System.Drawing.Color.Blue
Me.GroupBox2.Location = New System.Drawing.Point(3, 143)
Me.GroupBox2.Name = "GroupBox2"
Me.GroupBox2.Size = New System.Drawing.Size(439, 165)
Me.GroupBox2.TabIndex = 15
Me.GroupBox2.TabStop = False
Me.GroupBox2.Text = "其他序号"
'
'TxtThirdRecord
'
Me.TxtThirdRecord.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.TxtThirdRecord.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper
Me.TxtThirdRecord.Font = New System.Drawing.Font("微软雅黑", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.TxtThirdRecord.ImeMode = System.Windows.Forms.ImeMode.Disable
Me.TxtThirdRecord.Location = New System.Drawing.Point(0, 72)
Me.TxtThirdRecord.Multiline = True
Me.TxtThirdRecord.Name = "TxtThirdRecord"
Me.TxtThirdRecord.Size = New System.Drawing.Size(433, 26)
Me.TxtThirdRecord.TabIndex = 11
Me.TxtThirdRecord.TextAlign = System.Windows.Forms.HorizontalAlignment.Center
'
'TxtFifthRecord
'
Me.TxtFifthRecord.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.TxtFifthRecord.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper
Me.TxtFifthRecord.Font = New System.Drawing.Font("微软雅黑", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.TxtFifthRecord.ImeMode = System.Windows.Forms.ImeMode.Disable
Me.TxtFifthRecord.Location = New System.Drawing.Point(0, 134)
Me.TxtFifthRecord.Name = "TxtFifthRecord"
Me.TxtFifthRecord.Size = New System.Drawing.Size(433, 29)
Me.TxtFifthRecord.TabIndex = 10
Me.TxtFifthRecord.TextAlign = System.Windows.Forms.HorizontalAlignment.Center
'
'TxtFourthRecord
'
Me.TxtFourthRecord.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.TxtFourthRecord.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper
Me.TxtFourthRecord.Font = New System.Drawing.Font("微软雅黑", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.TxtFourthRecord.ImeMode = System.Windows.Forms.ImeMode.Disable
Me.TxtFourthRecord.Location = New System.Drawing.Point(0, 103)
Me.TxtFourthRecord.Multiline = True
Me.TxtFourthRecord.Name = "TxtFourthRecord"
Me.TxtFourthRecord.Size = New System.Drawing.Size(433, 26)
Me.TxtFourthRecord.TabIndex = 9
Me.TxtFourthRecord.TextAlign = System.Windows.Forms.HorizontalAlignment.Center
'
'RadFour
'
Me.RadFour.AutoSize = True
Me.RadFour.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.RadFour.Location = New System.Drawing.Point(370, 15)
Me.RadFour.Name = "RadFour"
Me.RadFour.Size = New System.Drawing.Size(62, 21)
Me.RadFour.TabIndex = 8
Me.RadFour.TabStop = True
Me.RadFour.Tag = "4"
Me.RadFour.Text = "四条码"
Me.RadFour.UseVisualStyleBackColor = True
'
'RadThree
'
Me.RadThree.AutoSize = True
Me.RadThree.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.RadThree.Location = New System.Drawing.Point(281, 15)
Me.RadThree.Name = "RadThree"
Me.RadThree.Size = New System.Drawing.Size(62, 21)
Me.RadThree.TabIndex = 7
Me.RadThree.TabStop = True
Me.RadThree.Tag = "3"
Me.RadThree.Text = "三条码"
Me.RadThree.UseVisualStyleBackColor = True
'
'RadTwo
'
Me.RadTwo.AutoSize = True
Me.RadTwo.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.RadTwo.Location = New System.Drawing.Point(192, 15)
Me.RadTwo.Name = "RadTwo"
Me.RadTwo.Size = New System.Drawing.Size(62, 21)
Me.RadTwo.TabIndex = 6
Me.RadTwo.TabStop = True
Me.RadTwo.Tag = "2"
Me.RadTwo.Text = "双条码"
Me.RadTwo.UseVisualStyleBackColor = True
'
'RadSingle
'
Me.RadSingle.AutoSize = True
Me.RadSingle.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.RadSingle.Location = New System.Drawing.Point(103, 15)
Me.RadSingle.Name = "RadSingle"
Me.RadSingle.Size = New System.Drawing.Size(62, 21)
Me.RadSingle.TabIndex = 5
Me.RadSingle.TabStop = True
Me.RadSingle.Tag = "1"
Me.RadSingle.Text = "单条码"
Me.RadSingle.UseVisualStyleBackColor = True
'
'TxtSecondRecord
'
Me.TxtSecondRecord.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.TxtSecondRecord.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper
Me.TxtSecondRecord.Font = New System.Drawing.Font("微软雅黑", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.TxtSecondRecord.ImeMode = System.Windows.Forms.ImeMode.Disable
Me.TxtSecondRecord.Location = New System.Drawing.Point(0, 41)
Me.TxtSecondRecord.Name = "TxtSecondRecord"
Me.TxtSecondRecord.Size = New System.Drawing.Size(433, 29)
Me.TxtSecondRecord.TabIndex = 2
Me.TxtSecondRecord.TextAlign = System.Windows.Forms.HorizontalAlignment.Center
'
'GroupBox1
'
Me.GroupBox1.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.GroupBox1.Controls.Add(Me.TxtFirstRecord)
Me.GroupBox1.Font = New System.Drawing.Font("微软雅黑", 15.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GroupBox1.Location = New System.Drawing.Point(3, 72)
Me.GroupBox1.Name = "GroupBox1"
Me.GroupBox1.Size = New System.Drawing.Size(439, 65)
Me.GroupBox1.TabIndex = 16
Me.GroupBox1.TabStop = False
Me.GroupBox1.Text = "成品序号"
'
'TxtFirstRecord
'
Me.TxtFirstRecord.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper
Me.TxtFirstRecord.Dock = System.Windows.Forms.DockStyle.Fill
Me.TxtFirstRecord.Font = New System.Drawing.Font("微软雅黑", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.TxtFirstRecord.ImeMode = System.Windows.Forms.ImeMode.Disable
Me.TxtFirstRecord.Location = New System.Drawing.Point(3, 30)
Me.TxtFirstRecord.Name = "TxtFirstRecord"
Me.TxtFirstRecord.Size = New System.Drawing.Size(433, 29)
Me.TxtFirstRecord.TabIndex = 1
Me.TxtFirstRecord.TextAlign = System.Windows.Forms.HorizontalAlignment.Center
'
'GroupBox3
'
Me.GroupBox3.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.GroupBox3.Controls.Add(Me.RtxLog)
Me.GroupBox3.Font = New System.Drawing.Font("宋体", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GroupBox3.Location = New System.Drawing.Point(0, 314)
Me.GroupBox3.Name = "GroupBox3"
Me.GroupBox3.Size = New System.Drawing.Size(878, 245)
Me.GroupBox3.TabIndex = 17
Me.GroupBox3.TabStop = False
Me.GroupBox3.Text = "录入记录"
'
'RtxLog
'
Me.RtxLog.BorderStyle = System.Windows.Forms.BorderStyle.None
Me.RtxLog.Dock = System.Windows.Forms.DockStyle.Fill
Me.RtxLog.Location = New System.Drawing.Point(3, 22)
Me.RtxLog.Name = "RtxLog"
Me.RtxLog.Size = New System.Drawing.Size(872, 220)
Me.RtxLog.TabIndex = 0
Me.RtxLog.Text = ""
'
'GroupBox4
'
Me.GroupBox4.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.GroupBox4.Controls.Add(Me.CboProductionLines)
Me.GroupBox4.Font = New System.Drawing.Font("微软雅黑", 15.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GroupBox4.Location = New System.Drawing.Point(3, 2)
Me.GroupBox4.Name = "GroupBox4"
Me.GroupBox4.Size = New System.Drawing.Size(439, 64)
Me.GroupBox4.TabIndex = 18
Me.GroupBox4.TabStop = False
Me.GroupBox4.Text = "产线"
'
'CboProductionLines
'
Me.CboProductionLines.Dock = System.Windows.Forms.DockStyle.Fill
Me.CboProductionLines.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
Me.CboProductionLines.Font = New System.Drawing.Font("微软雅黑", 14.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.CboProductionLines.ForeColor = System.Drawing.Color.Gray
Me.CboProductionLines.FormattingEnabled = True
Me.CboProductionLines.Items.AddRange(New Object() {"Q1", "Q2", "Q3", "Q4"})
Me.CboProductionLines.Location = New System.Drawing.Point(3, 30)
Me.CboProductionLines.Name = "CboProductionLines"
Me.CboProductionLines.Size = New System.Drawing.Size(433, 34)
Me.CboProductionLines.TabIndex = 0
Me.CboProductionLines.TabStop = False
'
'StatusStrip1
'
Me.StatusStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.TssLblProductionLine, Me.TssLblStaion, Me.TsLblCheckSum, Me.TssLblPassCount, Me.TssLblFailCount, Me.TssLblYield})
Me.StatusStrip1.Location = New System.Drawing.Point(0, 563)
Me.StatusStrip1.Name = "StatusStrip1"
Me.StatusStrip1.Size = New System.Drawing.Size(880, 22)
Me.StatusStrip1.TabIndex = 19
Me.StatusStrip1.Text = "StatusStrip1"
'
'TssLblProductionLine
'
Me.TssLblProductionLine.ForeColor = System.Drawing.Color.Black
Me.TssLblProductionLine.Name = "TssLblProductionLine"
Me.TssLblProductionLine.Size = New System.Drawing.Size(44, 17)
Me.TssLblProductionLine.Text = "A-Line"
'
'TssLblStaion
'
Me.TssLblStaion.ForeColor = System.Drawing.Color.Black
Me.TssLblStaion.Name = "TssLblStaion"
Me.TssLblStaion.Size = New System.Drawing.Size(68, 17)
Me.TssLblStaion.Text = "BLV-12 A1"
'
'TsLblCheckSum
'
Me.TsLblCheckSum.Name = "TsLblCheckSum"
Me.TsLblCheckSum.Size = New System.Drawing.Size(64, 17)
Me.TsLblCheckSum.Text = "Sum:0000"
'
'TssLblPassCount
'
Me.TssLblPassCount.Name = "TssLblPassCount"
Me.TssLblPassCount.Size = New System.Drawing.Size(65, 17)
Me.TssLblPassCount.Text = "Pass:0000"
'
'TssLblFailCount
'
Me.TssLblFailCount.Name = "TssLblFailCount"
Me.TssLblFailCount.Size = New System.Drawing.Size(58, 17)
Me.TssLblFailCount.Text = "Fail:0000"
'
'TssLblYield
'
Me.TssLblYield.Name = "TssLblYield"
Me.TssLblYield.Size = New System.Drawing.Size(81, 17)
Me.TssLblYield.Text = "Yield:00.00%"
'
'FrmMain
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6!, 12!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(880, 585)
Me.Controls.Add(Me.StatusStrip1)
Me.Controls.Add(Me.GroupBox4)
Me.Controls.Add(Me.GroupBox3)
Me.Controls.Add(Me.GroupBox2)
Me.Controls.Add(Me.GroupBox1)
Me.Controls.Add(Me.lab_Result)
Me.Controls.Add(Me.lab_ModelName)
Me.Controls.Add(Me.BtnOpenProject)
Me.Controls.Add(Me.BtnStartProgramming)
Me.Icon = CType(resources.GetObject("$this.Icon"),System.Drawing.Icon)
Me.Name = "FrmMain"
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
Me.Text = "Form1"
Me.GroupBox2.ResumeLayout(false)
Me.GroupBox2.PerformLayout
Me.GroupBox1.ResumeLayout(false)
Me.GroupBox1.PerformLayout
Me.GroupBox3.ResumeLayout(false)
Me.GroupBox4.ResumeLayout(false)
Me.StatusStrip1.ResumeLayout(false)
Me.StatusStrip1.PerformLayout
Me.ResumeLayout(false)
Me.PerformLayout
End Sub
Friend WithEvents lab_Result As Label
Friend WithEvents lab_ModelName As Label
Friend WithEvents BtnOpenProject As Button
Friend WithEvents BtnStartProgramming As Button
Friend WithEvents GroupBox2 As GroupBox
Friend WithEvents TxtSecondRecord As TextBox
Friend WithEvents GroupBox1 As GroupBox
Friend WithEvents TxtFirstRecord As TextBox
Friend WithEvents GroupBox3 As GroupBox
Friend WithEvents RtxLog As RichTextBox
Friend WithEvents GroupBox4 As GroupBox
Friend WithEvents CboProductionLines As ComboBox
Friend WithEvents StatusStrip1 As StatusStrip
Friend WithEvents TssLblProductionLine As ToolStripStatusLabel
Friend WithEvents TssLblStaion As ToolStripStatusLabel
Friend WithEvents TsLblCheckSum As ToolStripStatusLabel
Friend WithEvents TssLblPassCount As ToolStripStatusLabel
Friend WithEvents TssLblFailCount As ToolStripStatusLabel
Friend WithEvents TssLblYield As ToolStripStatusLabel
Friend WithEvents RadSingle As RadioButton
Friend WithEvents RadTwo As RadioButton
Friend WithEvents RadThree As RadioButton
Friend WithEvents RadFour As RadioButton
Friend WithEvents TxtFourthRecord As TextBox
Friend WithEvents TxtFifthRecord As TextBox
Friend WithEvents TxtThirdRecord As TextBox
End Class

6296
AUTS_Assembly/FrmMain.resx Normal file

File diff suppressed because it is too large Load Diff

382
AUTS_Assembly/FrmMain.vb Normal file
View File

@@ -0,0 +1,382 @@
Imports System.Text
Imports UTS_Core.UTSModule
Imports UTS_Core.UTSModule.Station
Imports UTS_Core.UTSModule.Test
Public Class FrmMain
Implements IProcessStation
Implements IProductionLine
Private _utsApp As UtsAppForm
Private _txtList As New List(Of TextBox)
''' <summary>
''' 条码总数
''' </summary>
Private _barCodeCount As Integer
''' <summary>
''' 测试总数
''' </summary>
Private _testCount As Integer = 0
''' <summary>
''' 测试成功总数
''' </summary>
Private _testFailCount As Integer = 0
''' <summary>
''' 测试失败总数
''' </summary>
Private _testPassCount As Integer = 0
Public Sub ProductionLineChanged() Implements IProductionLine.ProductionLineChanged
TssLblProductionLine.Text = CboProductionLines.Text
My.Settings.ProductionLine = CboProductionLines.Text
End Sub
Public Sub StationChanged() Implements IProcessStation.StationChanged
My.Settings.Project = _utsApp.ProcessStation.ParentProject.Name
My.Settings.ProcessStation = _utsApp.ProcessStation.Name
UpdateStation(_utsApp.ProcessStation.ParentProject.Name, _utsApp.ProcessStation.Name)
End Sub
Public Sub UpdateStation(projectName As String, stationName As String)
If String.IsNullOrWhiteSpace(projectName) OrElse
String.IsNullOrWhiteSpace(stationName) Then
TssLblStaion.Text = $"Invalid Station"
Else
TssLblStaion.Text = $"{projectName} - {stationName}"
lab_ModelName.Text = $"{projectName} - {stationName}"
End If
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
'自动保存设置
My.Application.SaveMySettingsOnExit = True
'初始化UTS窗体信息,失败则关闭窗体
If InitializeUtsApp() = False Then Return
'初始化界面信息
InitializeForm()
End Sub
Private Function InitializeUtsApp() As Boolean
_utsApp = UtsAppForm.CreateSingleton()
Try
If _utsApp.IsInitialized = False Then
_utsApp.AddStatisticsObserver(Me)
_utsApp.Initialize(ProcessStation.StationTypeEnum.Assem)
_utsApp.LoadStation(My.Settings.Project, My.Settings.ProcessStation)
End If
Catch ex As Exception
MsgBox($"Initialize UtsForm Error:{ex.Message}")
Close()
Return False
End Try
Return True
End Function
Private Sub InitializeForm()
'初始化产线信息
CboProductionLines.Items.Clear()
CboProductionLines.Items.AddRange(_utsApp.ProductionLines.GetLineNames())
CboProductionLines.SelectedIndex = CboProductionLines.Items.IndexOf(My.Settings.ProductionLine)
_txtList.Clear()
_txtList.Add(TxtFirstRecord)
_txtList.Add(TxtSecondRecord)
_txtList.Add(TxtThirdRecord)
_txtList.Add(TxtFourthRecord)
_txtList.Add(TxtFifthRecord)
RtxLog.Clear()
_barCodeCount = My.Settings.BarCount
If _barCodeCount < 1 Then _barCodeCount = 1
If _barCodeCount > 4 Then _barCodeCount = 4
Select Case _barCodeCount
Case 1
RadSingle.Checked = True
Case 2
RadTwo.Checked = True
Case 3
RadThree.Checked = True
Case 4
RadFour.Checked = True
End Select
Text = $"{Application.ProductName} {Application.ProductVersion} User:{_utsApp.Account.UserName}"
End Sub
Private Sub CboProductionLines_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CboProductionLines.SelectedIndexChanged
ProductionLineChanged()
End Sub
Private Sub BtnOpenProject_Click(sender As Object, e As EventArgs) Handles BtnOpenProject.Click
Try
_utsApp.ChangeStation()
Catch ex As Exception
MsgBox($"ChangeStation Error:{ex.Message}")
End Try
End Sub
Private Sub Tb_FirstRecord_KeyDown(sender As Object, e As KeyEventArgs) Handles TxtFirstRecord.KeyDown
If e.KeyCode = Keys.Enter Then
e.SuppressKeyPress = True
e.Handled = True
TxtSecondRecord.Focus()
TxtSecondRecord.SelectAll()
End If
End Sub
Private Sub Tb_SecondRecord_KeyDown(sender As Object, e As KeyEventArgs) Handles TxtSecondRecord.KeyDown
If e.KeyCode <> Keys.Enter Then Return
e.SuppressKeyPress = True
e.Handled = True
If _barCodeCount > 1 Then
TxtThirdRecord.Focus()
TxtThirdRecord.SelectAll()
Else
'此处为单个条码对应的执行逻辑
SaveTestResult()
End If
End Sub
Private Sub TxtThirdRecord_KeyDown(sender As Object, e As KeyEventArgs) Handles TxtThirdRecord.KeyDown
If e.KeyCode <> Keys.Enter Then Return
e.SuppressKeyPress = True
e.Handled = True
If _barCodeCount > 2 Then
TxtFourthRecord.Focus()
TxtFourthRecord.SelectAll()
Else
SaveTestResult()
End If
End Sub
Private Sub TxtFourthRecord_KeyDown(sender As Object, e As KeyEventArgs) Handles TxtFourthRecord.KeyDown
If e.KeyCode <> Keys.Enter Then Return
e.SuppressKeyPress = True
e.Handled = True
If _barCodeCount > 3 Then
TxtFifthRecord.Focus()
TxtFifthRecord.SelectAll()
Else
SaveTestResult()
End If
End Sub
Private Sub TxtFifthRecord_KeyDown(sender As Object, e As KeyEventArgs) Handles TxtFifthRecord.KeyDown
If e.KeyCode <> Keys.Enter Then Return
e.SuppressKeyPress = True
e.Handled = True
If _barCodeCount > 4 Then
MsgBox("条码达到上限,请重新选择条码数")
Else
SaveTestResult()
End If
End Sub
Private Sub BtnStartProgramming_Click(sender As Object, e As EventArgs) Handles BtnStartProgramming.Click
SaveTestResult()
End Sub
Private Sub SaveTestResult()
If _utsApp.ProcessStation Is Nothing Then
MsgBox($"请选择项目与测试站后再尝试录入!")
Return
End If
If String.IsNullOrWhiteSpace(CboProductionLines.Text) Then
MsgBox($"请选择生产线后再尝试录入!")
Return
End If
If String.IsNullOrWhiteSpace(TxtFirstRecord.Text) Then
MsgBox($"请输入成品序号!")
TxtFirstRecord.Focus()
Return
End If
Dim snMain As String = TxtFirstRecord.Text
Dim sb As New StringBuilder
Dim snLst As New List(Of String)
snLst.Add(TxtFirstRecord.Text)
For i As Integer = 1 To _barCodeCount
If String.IsNullOrWhiteSpace(_txtList(i).Text) Then
MsgBox($"请输入第 [{i}] 个其他序号!")
_txtList(i).Focus()
Return
Else
If snLst.Contains(_txtList(i).Text) Then
MsgBox($"第 [{i}] 个序号 [{_txtList(i).Text}] 与已有序号重复,请重新输入!")
_txtList(i).SelectAll()
_txtList(i).Focus()
Return
Else
snLst.Add(_txtList(i).Text)
sb.Append($"{_txtList(i).Text},")
End If
End If
Next
Dim assemblyString As String = sb.ToString()
If assemblyString.Length >= 128 Then
MsgBox($"整机序号超过128个字符,无法录入,请联系管理员!")
Return
End If
assemblyString = assemblyString.Replace(""c, ",")
If assemblyString.EndsWith(","c) OrElse assemblyString.EndsWith(""c) Then
assemblyString = assemblyString.Substring(0, assemblyString.Length - 1)
End If
Dim saveDb As Boolean
Try
FillTestResult(snMain, assemblyString)
_utsApp.CommitTestResult(uniqueRecord:=True)
DbConnect.DbConnector.SaveOtherSn(snLst, _utsApp.ProcessStation, _utsApp.TestResult)
saveDb = True
Catch ex As Exception
MsgBox($"测试结果录入失败:{ex.Message}")
saveDb = False
End Try
Static inputCount As Integer = 0
inputCount += 1 : If inputCount > 9999 Then inputCount = 0
RtxLog.SelectionStart = 0
RtxLog.SelectionLength = RtxLog.TextLength
RtxLog.SelectionColor = Color.Gray
If saveDb Then
lab_Result.ForeColor = Color.Green
lab_Result.Text = $"{snMain}-Pass"
RtxLog.SelectionStart = RtxLog.TextLength
RtxLog.SelectionColor = Color.Green
AppendRecord($"{inputCount:D4}.BarcodeSn:{snMain},AssemblySn:{assemblyString},录入成功!")
_testPassCount += 1
Else
lab_Result.ForeColor = Color.Red
lab_Result.Text = $"{snMain}-Fail"
RtxLog.SelectionStart = RtxLog.TextLength
RtxLog.SelectionColor = Color.Red
AppendRecord($"{inputCount:D4}.BarcodeSn:{snMain},AssemblySn:{assemblyString},录入失败!")
_testFailCount += 1
End If
_testCount += 1
TssLblPassCount.Text = "Pass:" & _testPassCount.ToString
TssLblFailCount.Text = "Fail:" & _testFailCount.ToString
TsLblCheckSum.Text = "Sum:" & _testCount.ToString
TssLblYield.Text = "Yield:" & (_testPassCount / _testCount * 100).ToString("F2") & "%"
TxtFirstRecord.Focus()
TxtFirstRecord.SelectAll()
End Sub
Public Sub AppendRecord(logString As String)
If RtxLog.InvokeRequired Then '判断是否需要开委托
RtxLog.Invoke(New Action(Of String)(AddressOf AppendRecord), New Object() {logString})
Return
End If
With RtxLog
If .Lines.Length > 256 Then '超过上限则移除最初行内容
.ReadOnly = False
.SelectionStart = 0
.SelectionLength = .GetFirstCharIndexFromLine(1)
.SelectedText = String.Empty
.ReadOnly = True
.SelectionStart = .TextLength
End If
.AppendText($"{Now:yyyy:MM:dd HH:mm:ss} - {logString}{vbNewLine}")
.ScrollToCaret()
End With
End Sub
''' <summary>
''' 填充测试记录内容,每个应用程序这个部分有所差异
''' </summary>
Public Sub FillTestResult(barcodeString As String, assemblyString As String)
_utsApp.TestResult.ResetTestResult()
'产线索引
Dim lineID As Integer = _utsApp.ProductionLines(CboProductionLines.Text).ID
_utsApp.TestResult.ProductionLineID = lineID
'测试开始时间
_utsApp.TestResult.StartTime = Now
_utsApp.TestResult.DUT_SN = barcodeString
_utsApp.TestResult.TestResult = TestResult.TestResultEnum.Pass
'自定义字段
_utsApp.TestResult.AddCustomRecord("AssemblySn", $"{assemblyString}")
End Sub
Private Sub RadSingle_CheckedChanged(sender As Object, e As EventArgs) Handles RadTwo.CheckedChanged, RadThree.CheckedChanged, RadSingle.CheckedChanged, RadFour.CheckedChanged
Dim rad As RadioButton = CType(sender, RadioButton)
If rad.Checked Then
_barCodeCount = CInt(rad.Tag)
My.Settings.BarCount = _barCodeCount
Select Case _barCodeCount
Case 1
TxtSecondRecord.Visible = True
TxtThirdRecord.Visible = False
TxtFourthRecord.Visible = False
TxtFifthRecord.Visible = False
Case 2
TxtSecondRecord.Visible = True
TxtThirdRecord.Visible = True
TxtFourthRecord.Visible = False
TxtFifthRecord.Visible = False
Case 3
TxtSecondRecord.Visible = True
TxtThirdRecord.Visible = True
TxtFourthRecord.Visible = True
TxtFifthRecord.Visible = False
Case 4
TxtSecondRecord.Visible = True
TxtThirdRecord.Visible = True
TxtFourthRecord.Visible = True
TxtFifthRecord.Visible = True
End Select
End If
End Sub
End Class

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_Assembly.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_Assembly")>
<Assembly: AssemblyDescription("")>
<Assembly: AssemblyCompany("")>
<Assembly: AssemblyProduct("AUTS_Assembly")>
<Assembly: AssemblyCopyright("Copyright © 2020")>
<Assembly: AssemblyTrademark("")>
<Assembly: ComVisible(False)>
'如果此项目向 COM 公开,则下列 GUID 用于 typelib 的 ID
<Assembly: Guid("7916ee8a-7f3c-49af-b4b5-1446c7611ad3")>
' 程序集的版本信息由下列四个值组成:
'
' 主版本
' 次版本
' 生成号
' 修订号
'
'可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
'通过使用 "*",如下所示:
' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("1.0.1.1")>
<Assembly: AssemblyFileVersion("1.1.1.1")>

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_Assembly.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,133 @@
'------------------------------------------------------------------------------
' <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
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("")> _
Public Property Project() As String
Get
Return CType(Me("Project"),String)
End Get
Set
Me("Project") = value
End Set
End Property
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("")> _
Public Property ProcessStation() As String
Get
Return CType(Me("ProcessStation"),String)
End Get
Set
Me("ProcessStation") = value
End Set
End Property
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("")> _
Public Property ProductionLine() As String
Get
Return CType(Me("ProductionLine"),String)
End Get
Set
Me("ProductionLine") = value
End Set
End Property
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("True")> _
Public Property SingleSn() As Boolean
Get
Return CType(Me("SingleSn"),Boolean)
End Get
Set
Me("SingleSn") = value
End Set
End Property
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("1")> _
Public Property BarCount() As Integer
Get
Return CType(Me("BarCount"),Integer)
End Get
Set
Me("BarCount") = value
End Set
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_Assembly.My.MySettings
Get
Return Global.AUTS_Assembly.My.MySettings.Default
End Get
End Property
End Module
End Namespace

View File

@@ -0,0 +1,21 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="My" GeneratedClassName="MySettings" UseMySettingsClassName="true">
<Profiles />
<Settings>
<Setting Name="Project" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="ProcessStation" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="ProductionLine" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="SingleSn" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="BarCount" Type="System.Int32" Scope="User">
<Value Profile="(Default)">1</Value>
</Setting>
</Settings>
</SettingsFile>

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

View File

@@ -0,0 +1,167 @@
<?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>{163446E7-7512-4ECE-819D-AF1A139E3DFB}</ProjectGuid>
<OutputType>WinExe</OutputType>
<StartupObject>AUTS_DataService.Service1</StartupObject>
<RootNamespace>AUTS_DataService</RootNamespace>
<AssemblyName>AUTS_DataService</AssemblyName>
<FileAlignment>512</FileAlignment>
<MyType>Console</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_DataService.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_DataService.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>
<ItemGroup>
<Reference Include="FluentFTP">
<HintPath>..\packages\FluentFTP.33.0.3\lib\net45\FluentFTP.dll</HintPath>
</Reference>
<Reference Include="MySql.Data, Version=8.0.26.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\UTS_Core\bin\Debug\MySql.Data.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\UTS_Core\bin\Debug\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration.Install" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Management" />
<Reference Include="System.ServiceProcess" />
<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.Diagnostics" />
<Import Include="System.Linq" />
<Import Include="System.Xml.Linq" />
<Import Include="System.Threading.Tasks" />
</ItemGroup>
<ItemGroup>
<Compile Include="ServiceError.vb" />
<Compile Include="UtsGroup\ServiceGroup.vb" />
<Compile Include="ServiceLog.vb" />
<Compile Include="ServiceConfig.vb" />
<Compile Include="ServiceTask\ServiceTasks.vb" />
<Compile Include="UtsApp\UtsApp.vb" />
<Compile Include="UtsApp\UtsAppManager.vb" />
<Compile Include="UtsGroup\ServiceGroupManager.vb" />
<Compile Include="UtsWeb\CheckSum.vb" />
<Compile Include="ServiceTask\DbSynchronizer.vb" />
<Compile Include="ServiceTask\DbSyncServiceTask.vb" />
<Compile Include="UtsWeb\IDataPacket.vb" />
<Compile Include="ServiceTask\JsonFileListen.vb" />
<Compile Include="ServiceTask\ListenJsonFileServiceTask.vb" />
<Compile Include="My Project\Application.Designer.vb">
<AutoGen>True</AutoGen>
<DependentUpon>Application.myapp</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<Compile Include="ProjectInstaller.Designer.vb">
<DependentUpon>ProjectInstaller.vb</DependentUpon>
</Compile>
<Compile Include="ProjectInstaller.vb">
<SubType>Component</SubType>
</Compile>
<Compile Include="Service1.vb">
<SubType>Component</SubType>
</Compile>
<Compile Include="Service1.Designer.vb">
<DependentUpon>Service1.vb</DependentUpon>
</Compile>
<Compile Include="My Project\AssemblyInfo.vb" />
<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>
<Compile Include="ServiceSettings.vb" />
<Compile Include="UtsWeb\UtsWebPacket.vb" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="My Project\Resources.resx">
<Generator>VbMyResourcesResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
<CustomToolNamespace>My.Resources</CustomToolNamespace>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="ProjectInstaller.resx">
<DependentUpon>ProjectInstaller.vb</DependentUpon>
</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>
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
</Project>

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="AUTS_DataService.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
<userSettings>
<AUTS_DataService.My.MySettings>
<setting name="dbLogType" serializeAs="String">
<value>30</value>
</setting>
</AUTS_DataService.My.MySettings>
</userSettings>
<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="Google.Protobuf" publicKeyToken="a7d26565bac4d604" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.30.1.0" newVersion="3.30.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="BouncyCastle.Crypto" publicKeyToken="0e99375e54769942" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.8.5.0" newVersion="1.8.5.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>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -0,0 +1,13 @@
'------------------------------------------------------------------------------
' <auto-generated>
' 此代码由工具生成。
' 运行时版本:4.0.30319.42000
'
' 对此文件的更改可能会导致不正确的行为,并且如果
' 重新生成代码,这些更改将会丢失。
' </auto-generated>
'------------------------------------------------------------------------------
Option Strict On
Option Explicit On

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>false</MySubMain>
<SingleInstance>false</SingleInstance>
<ShutdownMode>0</ShutdownMode>
<EnableVisualStyles>true</EnableVisualStyles>
<AuthenticationMode>0</AuthenticationMode>
<ApplicationType>3</ApplicationType>
<SaveMySettingsOnExit>true</SaveMySettingsOnExit>
</MyApplicationData>

View File

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

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_DataService.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,85 @@
'------------------------------------------------------------------------------
' <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
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("30")> _
Public Property dbLogType() As Byte
Get
Return CType(Me("dbLogType"),Byte)
End Get
Set
Me("dbLogType") = value
End Set
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_DataService.My.MySettings
Get
Return Global.AUTS_DataService.My.MySettings.Default
End Get
End Property
End Module
End Namespace

View File

@@ -0,0 +1,9 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="My" GeneratedClassName="MySettings" UseMySettingsClassName="true">
<Profiles />
<Settings>
<Setting Name="dbLogType" Type="System.Byte" Scope="User">
<Value Profile="(Default)">30</Value>
</Setting>
</Settings>
</SettingsFile>

View File

@@ -0,0 +1,47 @@
<System.ComponentModel.RunInstaller(True)> Partial Class ProjectInstaller
Inherits System.Configuration.Install.Installer
'Installer 重写 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
'组件设计器所必需的
Private components As System.ComponentModel.IContainer
'注意: 以下过程是组件设计器所必需的
'可使用组件设计器修改它。
'不要使用代码编辑器修改它。
<System.Diagnostics.DebuggerStepThrough()>
Private Sub InitializeComponent()
Me.ServiceProcessInstaller1 = New System.ServiceProcess.ServiceProcessInstaller()
Me.ServiceInstaller1 = New System.ServiceProcess.ServiceInstaller()
'
'ServiceProcessInstaller1
'
Me.ServiceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem
Me.ServiceProcessInstaller1.Password = Nothing
Me.ServiceProcessInstaller1.Username = Nothing
'
'ServiceInstaller1
'
Me.ServiceInstaller1.Description = "AUTS_DataService"
Me.ServiceInstaller1.DisplayName = "AUTS_DataService"
Me.ServiceInstaller1.ServiceName = "AUTS_DataService"
Me.ServiceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic
'
'ProjectInstaller
'
Me.Installers.AddRange(New System.Configuration.Install.Installer() {Me.ServiceProcessInstaller1, Me.ServiceInstaller1})
End Sub
Private WithEvents ServiceInstaller1 As ServiceProcess.ServiceInstaller
Private WithEvents ServiceProcessInstaller1 As ServiceProcess.ServiceProcessInstaller
End Class

View File

@@ -0,0 +1,129 @@
<?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="ServiceProcessInstaller1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 56</value>
</metadata>
<metadata name="ServiceInstaller1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>14, 22</value>
</metadata>
<metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
</root>

View File

@@ -0,0 +1,16 @@
Imports System.ComponentModel
Imports System.Configuration.Install
Public Class ProjectInstaller
Public Sub New()
MyBase.New()
'组件设计器需要此调用。
InitializeComponent()
'调用 InitializeComponent 后添加初始化代码
End Sub
End Class

48
AUTS_DataService/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

2233
AUTS_DataService/Service1.vb Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,294 @@
Imports System.Management
Imports System.Net
Imports UTS_Core.Database
Imports UTS_Core.UTSModule
Imports UTS_Core.UTSModule.DbTableModel.Manage
Public Class ServiceConfig
Private _privateIP As String
Private _publicIP As String
Private _mac As String
Private ReadOnly _dsIndex As Integer
Private ReadOnly _dsName As String
Private ReadOnly _dsVerString As String
Private _usVerString As String
Private ReadOnly _usName As String
Private _dsVer As Version
Private _usVer As Version
Sub New()
_dsIndex = CInt(UtsRegistry.DataServiceIndex)
_dsName = My.Application.Info.ProductName
_dsVer = My.Application.Info.Version
_dsVerString = My.Application.Info.Version.ToString
_usName = UtsRegistry.UpdateServiceName
_usVerString = UtsRegistry.UpdateServiceVersion
If Version.TryParse(_usVerString, _usVer) = False Then
_usVer = New Version(0, 0, 0, 0)
End If
BarnchNet = UtsRegistry.BarnchNet
If Integer.TryParse(UtsRegistry.Roles, Roles) = False Then
Roles = 0
End If
IsDBProxyConn = 0
CacheCount = 0
DbStatus = 0
FtpStatus = 0
NetworkNeiborhood = ""
UsConnected = 0
InitMacAndLocalIP()
End Sub
Public ReadOnly Property DsIndex() As Integer
Get
Return _dsIndex
End Get
End Property
''' <summary>
''' 数据服务的数据服务的名称
''' </summary>
''' <returns></returns>
Public ReadOnly Property DsName() As String
Get
Return _dsName
End Get
End Property
''' <summary>
''' 数据服务的版本字符串
''' </summary>
''' <returns></returns>
Public ReadOnly Property DsVerString() As String
Get
Return _dsVerString
End Get
End Property
''' <summary>
''' 更新服务的版本字符串
''' </summary>
''' <returns></returns>
Public Property UsVerString() As String
Get
Return _usVerString
End Get
Set(value As String)
_usVerString = value
If Version.TryParse(_usVerString, _usVer) = False Then
_usVer = New Version(0, 0, 0, 0)
End If
End Set
End Property
''' <summary>
''' 数据服务的版本
''' </summary>
''' <returns></returns>
Public ReadOnly Property DsVersion() As Version
Get
Return _dsVer
End Get
End Property
''' <summary>
''' 更新服务的版本
''' </summary>
''' <returns></returns>
Public ReadOnly Property UsVersion() As Version
Get
Return _usVer
End Get
End Property
''' <summary>
''' 更新服务的名称
''' </summary>
''' <returns></returns>
Public ReadOnly Property UsName() As String
Get
Return _usName
End Get
End Property
''' <summary>
''' 设备的局域网IP
''' </summary>
''' <returns></returns>
Public ReadOnly Property PrivateIP() As String
Get
Return _privateIP
End Get
End Property
''' <summary>
''' 设备的MAC地址
''' </summary>
''' <returns></returns>
Public ReadOnly Property Mac() As String
Get
Return _mac
End Get
End Property
''' <summary>
''' 与更新服务的连接状态
''' </summary>
''' <returns></returns>
Public Property UsConnected As Integer
''' <summary>
''' 设备运行中产生的异常
''' </summary>
''' <returns></returns>
Private Property ErrMsg As String
''' <summary>
''' 局域网中与主机的连接状态
''' </summary>
''' <returns></returns>
Public Property IsDBProxyConn As Integer
''' <summary>
''' 设备加入的子网名称
''' </summary>
''' <returns></returns>
Public Property BarnchNet As String
''' <summary>
''' 当前设备在局域网中的角色
''' </summary>
''' <returns></returns>
Public Property Roles As Integer
''' <summary>
''' 网上邻居集合
''' </summary>
''' <returns></returns>
Public Property NetworkNeiborhood As String
''' <summary>
''' 当前缓存表字段数量
''' </summary>
''' <returns></returns>
Public Property CacheCount As Integer
''' <summary>
''' 云端数据库连接状态
''' </summary>
''' <returns></returns>
Public Property DbStatus As Integer
''' <summary>
''' Ftp服务器连接状态
''' </summary>
''' <returns></returns>
Public Property FtpStatus As Integer
''' <summary>
''' 私有IP地址变化
''' </summary>
''' <param name="ip"></param>
Public Event PrivateIPChanged(ip As String)
''' <summary>
''' MAC地址变化
''' </summary>
''' <param name="mac"></param>
Public Event MACChanged(mac As String)
Public Sub UpdateErrMsg(type As String, msg As String)
ErrMsg = $"{type},{msg}"
End Sub
''' <summary>
''' 初始化MAC地址与获取本地IP
''' </summary>
Public Sub InitMacAndLocalIP()
' Dim ip As String
Dim mac As String
Dim searcher As New ManagementObjectSearcher("select * from win32_NetworkAdapterConfiguration")
Dim moc2 As ManagementObjectCollection = searcher.Get()
For Each mo As ManagementObject In moc2
If CBool(mo("IPEnabled")) Then
mac = mo("MACAddress").ToString()
If String.Compare(_mac, mac) <> 0 Then
_mac = mac
'触发MAC地址变化
RaiseEvent MACChanged(_mac)
End If
Dim a() As String = CType(mo("IpAddress"), String())
Dim address As IPAddress = Nothing
For Each ip As String In a
If IPAddress.TryParse(ip, address) Then
'使用IPV4地址
If address.AddressFamily = Sockets.AddressFamily.InterNetwork Then
If String.Compare(_privateIP, ip) <> 0 Then
'触发IP地址变化
_privateIP = ip
RaiseEvent PrivateIPChanged(_privateIP)
End If
Return
End If
End If
Next
End If
Next
End Sub
''' <summary>
''' 上传服务信息至数据库
''' </summary>
Public Sub UpdateServiceInfo()
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
db.Open()
Dim cmdText As String
Dim tbName As String = DataServiceListTable.TableName
Dim filed As New Dictionary(Of String, String)
filed.Add($"{DataServiceListTable.ColNames.ServiceVersion}", DsVerString)
filed.Add($"{DataServiceListTable.ColNames.CacheCount}", CacheCount.ToString)
filed.Add($"{DataServiceListTable.ColNames.IsDBProxyConn}", IsDBProxyConn.ToString)
filed.Add($"{DataServiceListTable.ColNames.NetworkNeiborhood}", NetworkNeiborhood)
If String.IsNullOrEmpty(ErrMsg) = False Then
filed.Add($"{DataServiceListTable.ColNames.ErrMsg}", ErrMsg)
ErrMsg = String.Empty
End If
Dim condition As String = $"`{DataServiceListTable.ColNames.ID}` = {_dsIndex}"
cmdText = db.CmdHelper.DbUpdate(UtsDb.RemotePublicDb, tbName, filed, condition)
Try
db.ExecuteNonQuery(cmdText)
Catch ex As Exception
ServiceLog.WriteErrorLog($"Update ServiceTable Error:{ex.Message}")
End Try
db.Close()
End Using
End Sub
End Class

View File

@@ -0,0 +1,7 @@
Public Class ServiceError
Public Shared Event ServiceError(type As String, msg As String)
Public Shared Sub RecodeError(type As String, msg As String)
RaiseEvent ServiceError(type, msg)
End Sub
End Class

View File

@@ -0,0 +1,334 @@
Imports UTS_Core.Database
Imports UTS_Core.UTSModule
Imports UTS_Core.UTSModule.DbConnect
Imports UTS_Core.UTSModule.DbTableModel.Manage
Public Class ServiceLog
Private Shared ReadOnly LogLock As New Object()
Private Shared ReadOnly LogQueue As New List(Of Dictionary(Of String, String))
''' <summary>厂商名</summary>
Public Shared VendorName As String
''' <summary>公网IP</summary>
Public Shared PublicIp As String
''' <summary>本地IP</summary>
Public Shared PrivateIp As String
''' <summary>本地MAC地址</summary>
Public Shared MAC As String
''' <summary>服务索引</summary>
Public Shared DsIndex As Integer
''' <summary>数据服务版本</summary>
Public Shared DsVersion As String
''' <summary>更新服务版本</summary>
Public Shared UsVersion As String
''' <summary>存入数据库日志类型</summary>
Public Shared DbLogType As Byte
''' <summary>日志文件夹路径</summary>
Public Shared Property LogDirPath As String
Get
Return UTS_Core.DebugLog.ApplicationLog.LogDirPath
End Get
Set(value As String)
UTS_Core.DebugLog.ApplicationLog.LogDirPath = value
End Set
End Property
''' <summary>日志文件前缀</summary>
Public Shared Property LogFilePrefix As String
Get
Return UTS_Core.DebugLog.ApplicationLog.LogFilePrefix
End Get
Set(value As String)
UTS_Core.DebugLog.ApplicationLog.LogFilePrefix = value
End Set
End Property
Public Shared ReadOnly Property LogFilePath() As String
Get
Return UTS_Core.DebugLog.ApplicationLog.LogFilePath
End Get
End Property
''' <summary>在线状态</summary>
Public Shared Online As Boolean
''' <summary>将日志写入到本地文件</summary>
Public Shared Sub WriteErrorLogToFile(logText As String)
UTS_Core.DebugLog.ApplicationLog.WriteErrorLog(logText)
End Sub
''' <summary>
''' 写入致命错误至本地与云端数据库
''' </summary>
''' <param name="logText">日志内容</param>
Public Shared Sub WriteFatalLog(logText As String)
WriteLogToLogQueue(UTS_Core.DebugLog.ApplicationLog.LogTypes.Fatal, logText)
End Sub
Public Shared Sub WriteErrorLog(logText As String)
WriteLogToLogQueue(UTS_Core.DebugLog.ApplicationLog.LogTypes.Error, logText)
End Sub
Public Shared Sub WriteWarningLog(logText As String)
WriteLogToLogQueue(UTS_Core.DebugLog.ApplicationLog.LogTypes.Warn, logText)
End Sub
Public Shared Sub WriteInfoLog(logText As String)
WriteLogToLogQueue(UTS_Core.DebugLog.ApplicationLog.LogTypes.Info, logText)
End Sub
Public Shared Sub WriteDebugLog(logText As String)
WriteLogToLogQueue(UTS_Core.DebugLog.ApplicationLog.LogTypes.Debug, logText)
End Sub
''' <summary>
''' 添加日志内容至缓存的日志队列中
''' 调用SaveLogQueueToDb将队列中的数据写入到数据库
'''
''' Tip:缓存队列仅记录每条日志不同的内容,例如写入时间,日志类型,日志内容等
''' </summary>
''' <param name="logType"></param>
''' <param name="logText"></param>
Public Shared Sub WriteLogToLogQueue(logType As UTS_Core.DebugLog.ApplicationLog.LogTypes, logText As String)
UTS_Core.DebugLog.ApplicationLog.WriteLog($"{logType}", logText) '写入本地文本日志
If ((DbLogType >> logType) And 1) = 0 Then Return '过滤不入库的信息
Dim dicFiled As New Dictionary(Of String, String)
dicFiled.Add($"{DataServiceLogTable.ColNames.DateTime}", $"{Now:yyyy-MM-dd HH:mm:ss}")
dicFiled.Add($"{DataServiceLogTable.ColNames.LogType}", $"{logType}")
dicFiled.Add($"{DataServiceLogTable.ColNames.LogText}", $"{logText.Replace("'"c, """"c).Replace("`", """"c)}")
SyncLock LogLock
LogQueue.Add(dicFiled) '将日志信息放入缓冲队列
End SyncLock
End Sub
Private Shared Sub SaveLogToLocalDb(count As Integer, Optional saveCache As Boolean = False)
Dim tableName As String = DataServiceLogTable.TableName
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
db.BeginTransaction()
Dim dicFiled As Dictionary(Of String, String)
Dim cmdText As String
Dim cmdHelper As DbCmdHelper = DbCmdHelper.CreateCmdHelper(UtsDb.RemoteDbType)
SyncLock LogLock
For i As Integer = 0 To count - 1
dicFiled = LogQueue.Item(i)
'修改上传方式为插值方式
Dim colName As String
Dim colNames As New List(Of String)
Dim remoteFileds As New Dictionary(Of String, String)
Try
colName = $"{DataServiceLogTable.ColNames.ServiceID}"
colNames.Add(colName)
db.AddDbParameter(DbType.Int32, colName, DsIndex)
remoteFileds.Add(colName, DsIndex.ToString)
colName = $"{DataServiceLogTable.ColNames.ServiceVersion}"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, DsVersion)
remoteFileds.Add(colName, DsVersion)
colName = $"{DataServiceLogTable.ColNames.UpdateServiceVersion}"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, UsVersion)
remoteFileds.Add(colName, UsVersion)
colName = $"{DataServiceLogTable.ColNames.VendorName}"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, VendorName)
remoteFileds.Add(colName, VendorName)
colName = $"{DataServiceLogTable.ColNames.DateTime}"
colNames.Add(colName)
db.AddDbParameter(DbType.DateTime, colName, dicFiled(colName))
remoteFileds.Add(colName, dicFiled(colName))
colName = $"{DataServiceLogTable.ColNames.PublicIp}"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, PublicIp)
remoteFileds.Add(colName, PublicIp)
colName = $"{DataServiceLogTable.ColNames.PrivateIp}"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, PrivateIp)
remoteFileds.Add(colName, PrivateIp)
colName = $"{DataServiceLogTable.ColNames.LogType}"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, dicFiled(colName))
remoteFileds.Add(colName, dicFiled(colName))
colName = $"{DataServiceLogTable.ColNames.LogText}"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, dicFiled(colName))
remoteFileds.Add(colName, dicFiled(colName).Replace("'", " ").Replace("", " "))
cmdText = db.CmdHelper.InsertParam(tableName, colNames)
db.ExecuteNonQuery(cmdText) '执行语句
Catch ex As Exception
WriteErrorLogToFile($"Write LogQueue To Local DB Error: {ex.Message}")
Continue For
End Try
If saveCache Then
Try
cmdText = cmdHelper.DbInsert(UtsDb.RemotePublicDb, tableName, remoteFileds)
DbConnector.SaveCmdStringToCacheTable(db, cmdText) '执行命令入缓存库
Catch ex As Exception
WriteErrorLogToFile($"Write LogQueue To Chche DB Error: {ex.Message}")
Continue For
End Try
End If
Next
End SyncLock
db.CommitTransaction()
db.Close()
End Using
End Sub
Private Shared Function SaveLogToRemoteDb(count As Integer) As Boolean
Dim tableName As String = DataServiceLogTable.TableName
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
db.Open()
db.BeginTransaction()
Dim dicFiled As Dictionary(Of String, String)
Dim cmdText As String
Dim colName As String
Dim colNames As New List(Of String)
For i As Integer = 0 To count - 1
colNames.Clear()
dicFiled = LogQueue.Item(i)
Try
colName = $"{DataServiceLogTable.ColNames.ServiceID}"
colNames.Add(colName)
db.AddDbParameter(DbType.Int32, colName, DsIndex)
colName = $"{DataServiceLogTable.ColNames.ServiceVersion}"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, DsVersion)
colName = $"{DataServiceLogTable.ColNames.UpdateServiceVersion}"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, UsVersion)
colName = $"{DataServiceLogTable.ColNames.VendorName}"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, VendorName)
colName = $"{DataServiceLogTable.ColNames.DateTime}"
colNames.Add(colName)
db.AddDbParameter(DbType.DateTime, colName, dicFiled(colName))
colName = $"{DataServiceLogTable.ColNames.PublicIp}"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, PublicIp)
colName = $"{DataServiceLogTable.ColNames.PrivateIp}"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, PrivateIp)
colName = $"{DataServiceLogTable.ColNames.Mac}"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, MAC)
colName = $"{DataServiceLogTable.ColNames.LogType}"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, dicFiled(colName))
colName = $"{DataServiceLogTable.ColNames.LogText}"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, dicFiled(colName))
cmdText = db.CmdHelper.DbInsertParam(UtsDb.RemotePublicDb, tableName, colNames)
db.ExecuteNonQuery(cmdText) '执行语句
db.ClearDbParameter()
Catch ex As Exception
WriteErrorLogToFile($"[{i}]Write LogQueue To Remote DB Error: {ex.Message}")
Try
db.RollbackTransaction()
db.Close()
Catch ex2 As Exception
WriteErrorLogToFile($"Write LogQueue To Remote DB Rollback Transaction Error: {ex.Message}")
End Try
Return False
End Try
Next
db.CommitTransaction()
db.Close()
End Using
Return True
End Function
Public Shared Sub SaveLogQueueToDb()
If LogQueue.Count <= 0 Then Return
Dim count As Integer = LogQueue.Count
Dim saveCache As Boolean
SyncLock LogLock
'执行
saveCache = SaveLogToRemoteDb(count) = False
SaveLogToLocalDb(count, saveCache)
'删除
For i As Integer = 0 To count - 1
LogQueue.RemoveAt(0)
Next
End SyncLock
End Sub
''' <summary>
''' 创建数据服务日志表,数据服务独有
''' </summary>
Public Shared Sub CreateServiceLogTable()
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
Dim cmdText As String = DataServiceLogTable.CreateTableString("", DbExecutor.DbTypeEnum.Sqlite)
db.ExecuteNonQuery(cmdText)
db.Close()
End Using
End Sub
End Class

View File

@@ -0,0 +1,16 @@
Imports System.Xml.Serialization
Imports UTS_Core.UTSModule.Service
<XmlInclude(GetType(ServiceSettings))>
<XmlInclude(GetType(ServiceTask))>
<XmlInclude(GetType(DbSyncServiceTask))>
<XmlInclude(GetType(ListenJsonFileServiceTask))>
Public Class ServiceSettings
Public Tasks As List(Of ServiceTask)
Sub New()
Tasks = New List(Of ServiceTask)()
End Sub
End Class

View File

@@ -0,0 +1,219 @@
Imports System.Threading
Imports System.Xml.Serialization
Imports UTS_Core.Database
Imports UTS_Core.UTSModule
Imports UTS_Core.UTSModule.Service
''' <summary>
''' 数据库同步类
''' </summary>
<XmlInclude(GetType(DbSyncServiceTask))>
Public Class DbSyncServiceTask
Inherits ServiceTask
Sub New()
TaskType = ServiceTaskTypeEnum.DbSync
TaskStatus = ServiceTaskStatusEnum.Stop
TaskName = "DbSync_Default"
Interval = 5
LocalDbType = UtsDb.LocalDbType
LocalConnString = UtsDb.LocalConnString
RemoteDbType = UtsDb.RemoteDbType
RemoteConnString = UtsDb.RemoteConnString
RemotePublicDb = UtsDb.RemotePublicDb
RemotePrivateDb = UtsDb.RemotePrivateDb
End Sub
Sub New(name As String, param As Dictionary(Of String, String))
TaskType = ServiceTaskTypeEnum.DbSync
TaskStatus = ServiceTaskStatusEnum.Stop
TaskName = name
LocalDbType = UtsDb.LocalDbType
LocalConnString = UtsDb.LocalConnString
RemoteDbType = UtsDb.RemoteDbType
RemoteConnString = UtsDb.RemoteConnString
RemotePublicDb = UtsDb.RemotePublicDb
RemotePrivateDb = UtsDb.RemotePrivateDb
SetParams(param)
End Sub
Private Sub StartCallback(stat As Object)
While TaskStatus = ServiceTaskStatusEnum.Start
'同步任务
Try
Dim syncParam As DbSynchronizer.SyncParam
syncParam.LocalConnString = LocalConnString
syncParam.LocalType = LocalDbType
syncParam.RemoteType = RemoteDbType
syncParam.RemoteConnString = RemoteConnString
syncParam.PublicDb = RemotePublicDb
syncParam.PrivateDb = RemotePrivateDb
'开始数据库同步
Dim sync As DbSynchronizer
sync = New DbSynchronizer(syncParam)
sync.SyncDatabase()
ServiceLog.WriteInfoLog($"DbSynchronizer Succeeded!")
'更新数据库更新时间
LastUpdateTime = $"{Now:yyyy-MM-dd HH:mm:ss}"
Catch ex As Exception
ServiceLog.WriteErrorLog($"TaskName:{TaskName},SyncDatabase Error:{ex.Message}")
End Try
'等待任务
Dim lastTime As Date = Now
While (Now - lastTime).TotalMinutes < Interval
If TaskStatus = ServiceTaskStatusEnum.Stop Then
Return
End If
Thread.Sleep(1000)
End While
End While
End Sub
Public Overrides Sub Start()
TaskStatus = ServiceTaskStatusEnum.Start
If _syncThread IsNot Nothing AndAlso _syncThread.IsAlive Then
ServiceLog.WriteDebugLog($"SyncThread IsAlive!")
Return
End If
_syncThread = New Thread(AddressOf StartCallback)
_syncThread.IsBackground = True
_syncThread.Start()
ServiceLog.WriteDebugLog($"DbSync Start!")
End Sub
Public Overrides Sub [Stop]()
TaskStatus = ServiceTaskStatusEnum.Stop
Dim lastTime As Date = Now
While _syncThread IsNot Nothing AndAlso _syncThread.IsAlive
If (Now - lastTime).TotalMilliseconds > 10000 Then
_syncThread.Abort()
End If
Thread.Sleep(100)
End While
ServiceLog.WriteInfoLog($"DbSync Stop!")
End Sub
Public Overrides Sub Restart()
If _syncThread IsNot Nothing AndAlso _syncThread.IsAlive Then
[Stop]()
End If
Start()
ServiceLog.WriteInfoLog($"DbSync Restart!")
End Sub
Public Overrides Sub SetParams(params As Dictionary(Of String, String))
Dim tmpStatus As ServiceTaskStatusEnum = TaskStatus
Dim tmpInterval As Integer = Interval
'将转换后的数据填充至临时缓存,一遍设置失败时可以保留上一次数据
For Each param As KeyValuePair(Of String, String) In params
Select Case param.Key
Case "Interval"
If Integer.TryParse(param.Value, tmpInterval) = False Then
Throw New Exception($"Error Interval :{param.Value}")
End If
Case "LocalDbType"
'If [Enum].TryParse(param.Value, tmpLocalType) = False Then
' Throw New Exception($"Error LocalDbType :{param.Value}")
'End If
Case "LocalConnString"
'tmpLocalConnString = UTS_Core.Security.Aes128.DecryptStr(param.Value, UTS_Core.Security.Aes128.ServerAesKey)
Case "Status", "Type", "Name" '不处理的字段
Case Else
ServiceLog.WriteWarningLog($"DbSync Unknown param name :{param.Key}")
End Select
Next
TaskStatus = tmpStatus
Interval = tmpInterval
End Sub
Public Overrides Function GetParams() As Dictionary(Of String, String)
Dim params As New Dictionary(Of String, String)
params.Add("Type", TaskType.ToString())
params.Add("Name", TaskName)
params.Add("Status", TaskStatus.ToString())
params.Add("Interval", Interval.ToString())
params.Add("LocalDbType", LocalDbType.ToString())
params.Add("LocalConnString", UTS_Core.Security.Aes128.EncryptStr(LocalConnString, UTS_Core.Security.Aes128.ServerAesKey))
Return params
End Function
''' <summary>
''' 远程数据库的类型
''' </summary>
Private RemoteDbType As DbExecutor.DbTypeEnum
''' <summary>
''' 远程数据库的连接字符串
''' </summary>
Private RemoteConnString As String
''' <summary>
''' 远端公共数据库名
''' </summary>
Private RemotePublicDb As String
''' <summary>
''' 远端私有库名
''' </summary>
Private RemotePrivateDb As String
''' <summary>
''' 本地数据库的类型
''' </summary>
Private LocalDbType As DbExecutor.DbTypeEnum
''' <summary>
''' 本地数据库的连接字符串
''' </summary>
Private LocalConnString As String
''' <summary>
''' 同步间隔,单位分钟,默认5分钟,最小值为1分钟
''' </summary>
''' <returns></returns>
Public Property Interval() As Integer
Private _syncThread As Thread
''' <summary>
''' 最后一次更新的时间字符串
''' </summary>
Public Shared LastUpdateTime As String = ""
End Class

View File

@@ -0,0 +1,678 @@
Imports System.Data.Common
Imports System.Text
Imports MySql.Data.MySqlClient
Imports UTS_Core.Database
Imports UTS_Core.UTSModule.DbTableModel
''' <summary>
''' 数据库同步器
''' </summary>
Public Class DbSynchronizer
''' <summary>
''' 同步表内容
''' </summary>
Structure SyncTableScheme
''' <summary>表名</summary>
Public TableName As String
''' <summary>同步类型</summary>
Public SyncType As String
''' <summary>是否存在当前数据表</summary>
Public IsExistsTable As Boolean
''' <summary>更新版本</summary>
Public RevisionID As String
''' <summary>上一次更新时间字符串</summary>
Public LastSyncTime As String
''' <summary>同步后更新的时间字符串</summary>
Public NowSyncTime As String
End Structure
''' <summary>
''' 同步数据库参数
''' </summary>
Structure SyncParam
Public PublicDb As String
Public PrivateDb As String
Public RemoteType As DbExecutor.DbTypeEnum
Public RemoteConnString As String
Public LocalType As DbExecutor.DbTypeEnum
Public LocalConnString As String
End Structure
Sub New(param As SyncParam)
Parameters = param
End Sub
''' <summary>
''' 连接参数
''' </summary>
''' <returns></returns>
Public Property Parameters() As SyncParam
''' <summary>
''' 同步数据库,开始同步
''' </summary>
Public Sub SyncDatabase()
Using remoteDb As New DbExecutor(Parameters.RemoteType, Parameters.RemoteConnString)
remoteDb.Open()
Using localDb As New DbExecutor(Parameters.LocalType, Parameters.LocalConnString)
localDb.Open()
SyncDatabase(localDb, remoteDb, Parameters.PublicDb, Parameters.PrivateDb)
localDb.Close()
End Using
remoteDb.Close()
End Using
End Sub
''' <summary>
''' 同步数据库执行过程
''' </summary>
''' <param name="localDb">本地数据库执行器</param>
''' <param name="remoteDb">云端数据库执行器</param>
''' <param name="publicDb">远端数据库公共库名</param>
''' <param name="privateDb">远端数据库私有库名</param>
Public Sub SyncDatabase(localDb As DbExecutor, remoteDb As DbExecutor, publicDb As String, privateDb As String)
If remoteDb Is Nothing Then Return
If localDb Is Nothing Then Return
'上传本地缓存数据
remoteDb.BeginTransaction()
UploadCacheData(remoteDb, localDb)
remoteDb.CommitTransaction()
ServiceLog.WriteDebugLog($"UploadCacheData Successded!")
'获取需要公有下载的数据表
DownloadSyncTable(remoteDb, localDb, publicDb, Manage.SyncListTable.TableName)
ServiceLog.WriteDebugLog($"Download Puclic SyncTable Successded!")
'获取需要私有下载的数据表
DownloadSyncTable(remoteDb, localDb, privateDb, Customer.SyncListTable.TableName)
ServiceLog.WriteDebugLog($"Download Private SyncTable Successded!")
End Sub
''' <summary>
''' 上传本地缓存数据DataTable的方式
''' </summary>
''' <param name="remoteDb">远程数据库执行器</param>
''' <param name="localDb">本地数据库执行器</param>
Private Sub UploadCacheData(remoteDb As DbExecutor, localDb As DbExecutor)
CreateCacheTableWhenNotExists(localDb)
Dim dataTable As DataTable = SearchCacheData(localDb)
UploadCacheData(remoteDb, localDb, dataTable)
End Sub
#Region "上传本地缓存数据"
''' <summary>
''' 本地创建缓存记录表,如果不存在则创建
''' </summary>
''' <param name="localDb">本地数据库的执行器</param>
Private Sub CreateCacheTableWhenNotExists(localDb As DbExecutor)
localDb.ExecuteNonQuery(LocalPrivate.CacheTable.CreateTableString)
End Sub
''' <summary>
''' 查询本地未上传的数据,单次查询5000条数据
''' </summary>
''' <param name="localDb">本地数据库的执行器</param>
''' <returns></returns>
Private Function SearchCacheData(localDb As DbExecutor) As DataTable
Dim tableName As String = LocalPrivate.CacheTable.TableName
Dim colNames As String = $"{LocalPrivate.CacheTable.ColNamesEnum.ID},{LocalPrivate.CacheTable.ColNamesEnum.SqlCmd}"
Dim condition As String = $"{LocalPrivate.CacheTable.ColNamesEnum.IsUpload} = 0 order by `{LocalPrivate.CacheTable.ColNamesEnum.ID}` Limit 5000"
Dim cmdText As String = localDb.CmdHelper.Search(colNames, tableName, condition)
Return localDb.ExecuteDataTable(cmdText)
End Function
''' <summary>
''' 上传本地数据至云端数据库
''' </summary>
''' <param name="remoteDb"></param>
''' <param name="localDb"></param>
''' <param name="dataTable"></param>
Private Sub UploadCacheData(remoteDb As DbExecutor, localDb As DbExecutor, dataTable As DataTable)
ServiceLog.WriteDebugLog($"Begin Upload Cache DataTable [{dataTable.Rows.Count}] Rows!")
For Each row As DataRow In dataTable.Rows
Try
Dim cmdText As String = row(LocalPrivate.CacheTable.ColNamesEnum.SqlCmd.ToString()).ToString()
remoteDb.ExecuteNonQuery(cmdText)
Catch ex As MySqlException
'记录失败
Dim id As String = row(LocalPrivate.CacheTable.ColNamesEnum.ID.ToString()).ToString()
ServiceLog.WriteErrorLog($"UploadData Error:{ex.Message},ErrorNumber:{ex.Number},ID:{id}")
Select Case ex.Number
Case MySqlErrorCode.DuplicateFieldName '重复字段
ServiceLog.WriteInfoLog($"DuplicateFieldName,Ignore the error!")
Case Else
ServiceLog.WriteWarningLog($"Unknown,Continue to perform!")
Exit For
End Select
Catch ex As Exception
'记录失败
ServiceLog.WriteErrorLog($"UploadData Error:{ex.Message}")
ServiceError.RecodeError("DbSync", $"UploadData Error:{ex.Message}")
Exit For
End Try
Try
DeleteUploadData(localDb, row(LocalPrivate.CacheTable.ColNamesEnum.ID).ToString)
Catch ex As Exception
'记录失败
ServiceLog.WriteErrorLog($"UpdateCacheTable Error:{ex.Message}")
End Try
Next
End Sub
''' <summary>
''' 数据上传完成后,删除本地数据库中对应序号的记录
''' </summary>
''' <param name="localDb"></param>
''' <param name="sn"></param>
Private Sub DeleteUploadData(localDb As DbExecutor, sn As String)
Dim tableName As String = LocalPrivate.CacheTable.TableName
Dim condition As String = $"{LocalPrivate.CacheTable.ColNamesEnum.ID} = '{sn}'"
localDb.ExecuteNonQuery(localDb.CmdHelper.DeleteRows(tableName, condition))
End Sub
#End Region
#Region "获取需要下载表集合"
''' <summary>
''' 比对本地与云端版本表,下载变化的数据表
''' </summary>
''' <param name="remoteDb"></param>
''' <param name="localDb"></param>
''' <param name="dbName"></param>
''' <param name="tbName"></param>
Public Sub DownloadSyncTable(remoteDb As DbExecutor, localDb As DbExecutor, dbName As String, tbName As String)
Dim downloadTables As List(Of SyncTableScheme)
downloadTables = CompareVersionTable(remoteDb, localDb, dbName, tbName)
UpdateTables(remoteDb, localDb, dbName, downloadTables) '更新本地数据
End Sub
''' <summary>
''' 比较本地与云端版本表的差异,获取需要下载的数据表
''' </summary>
''' <param name="remoteDb"></param>
''' <param name="localDb"></param>
''' <param name="tableName"></param>
''' <returns></returns>
Private Function CompareVersionTable(remoteDb As DbExecutor, localDb As DbExecutor, dbName As String, tableName As String) As List(Of SyncTableScheme)
CreateVersionTableWhenNotExists(localDb)
Dim localTable As DataTable = localDb.ExecuteDataTable(localDb.CmdHelper.SearchAll(Customer.SyncListTable.TableName))
Dim remoteTable As DataTable = remoteDb.ExecuteDataTable(remoteDb.CmdHelper.DbSearchAll(dbName, tableName))
Return CompareVersionTable(localTable, remoteTable)
End Function
''' <summary>
''' 创建本地数据库表版本记录表
''' </summary>
''' <param name="localDb"></param>
Private Sub CreateVersionTableWhenNotExists(localDb As DbExecutor)
Try
localDb.ExecuteNonQuery(Customer.SyncListTable.CreateTableString(localDb.DatabaseType))
Catch ex As Exception
'记录失败
ServiceLog.WriteErrorLog($"CreateVersionTableWhenNotExists Error:{ex.Message}")
End Try
End Sub
''' <summary>
''' 比较本地与云端版本表的差异
''' </summary>
''' <param name="srcDataTable">源DataTable</param>
''' <param name="destDataTable">目标DataTable</param>
''' <returns>差异信息列表</returns>
Private Function CompareVersionTable(srcDataTable As DataTable, destDataTable As DataTable) As List(Of SyncTableScheme)
Dim result As New List(Of SyncTableScheme)
Dim srcTableName As String
Dim destTableName As String
Dim isFind As Boolean
Dim srcReVId As String = String.Empty
Dim destRevId As String
For i As Integer = 0 To destDataTable.Rows.Count - 1
destTableName = $"{destDataTable.Rows(i)($"{Customer.SyncListTable.ColNamesEnum.TableName}")}"
isFind = False
For j As Integer = 0 To srcDataTable.Rows.Count - 1
srcTableName = $"{srcDataTable.Rows(j)($"{Customer.SyncListTable.ColNamesEnum.TableName}")}"
If String.Compare(destTableName, srcTableName, True) = 0 Then
srcReVId = $"{srcDataTable.Rows(j)($"{Customer.SyncListTable.ColNamesEnum.RevisionID}")}"
isFind = True
Exit For
End If
Next
If isFind Then
destRevId = $"{destDataTable.Rows(i)($"{Customer.SyncListTable.ColNamesEnum.RevisionID}")}"
If String.Compare(srcReVId, destRevId, True) <> 0 Then '源表中存在记录且与目的表记录时间不相同
result.Add(New SyncTableScheme() With {.TableName = destTableName,
.SyncType = $"{destDataTable.Rows(i)($"{Customer.SyncListTable.ColNamesEnum.SyncType}")}",
.LastSyncTime = $"{srcDataTable.Rows(i)($"{Customer.SyncListTable.ColNamesEnum.SyncTime}")}",
.RevisionID = destRevId,
.IsExistsTable = True})
End If
Else
result.Add(New SyncTableScheme() With {.TableName = destTableName,
.SyncType = $"{destDataTable.Rows(i)($"{Customer.SyncListTable.ColNamesEnum.SyncType}")}",
.LastSyncTime = $"2000-01-01 00:00:00",
.RevisionID = $"{destDataTable.Rows(i)($"{Customer.SyncListTable.ColNamesEnum.RevisionID}")}",
.IsExistsTable = False})
End If
Next
Return result
End Function
#End Region
#Region "下载远程数据至本地"
''' <summary>
''' 更新下载数据表
''' </summary>
''' <param name="remoteDb">远程数据库执行器</param>
''' <param name="localDb">本地数据库执行器</param>
''' <param name="tables">需要同步的数据表信息集合</param>
Private Sub UpdateTables(remoteDb As DbExecutor, localDb As DbExecutor, dbName As String, tables As List(Of SyncTableScheme))
Dim ts As Date
Try
ts = CDate(remoteDb.ExecuteScalar("select current_timestamp()"))
Catch ex As Exception
ServiceLog.WriteErrorLog($"Get DB System Time Error:{ex.Message}")
Return
End Try
For Each table As SyncTableScheme In tables
table.NowSyncTime = ts.ToString("yyyy-MM-dd HH:mm:ss")
localDb.BeginTransaction()
Try
If String.Compare(table.SyncType, "all", True) = 0 Then
UpdateTableForAll(remoteDb, localDb, dbName, table)
ElseIf String.Compare(table.SyncType, "new", True) = 0 Then
'增量更新Update限制,必须包含ID、UpdateTime字段且ID字段为主键
UpdateTableForNew(remoteDb, localDb, dbName, table)
Else
UpdateTableForAll(remoteDb, localDb, dbName, table)
End If
UpdateVersionTable(localDb, table)
Catch ex As Exception
ServiceLog.WriteErrorLog($"UpdateTable {table.TableName} Error:{ex.Message}")
End Try
localDb.CommitTransaction()
Next
End Sub
''' <summary>
''' 下载修改全表修改部分的方式下载表
''' </summary>
''' <param name="remoteDb"></param>
''' <param name="localDb"></param>
''' <param name="dbName"></param>
''' <param name="table"></param>
Private Sub UpdateTableForNew(remoteDb As DbExecutor, localDb As DbExecutor, dbName As String, table As SyncTableScheme)
Dim maxID As Integer = 0
If table.IsExistsTable = False Then
Dim remoteTable As DataTable = remoteDb.ExecuteDataTable(remoteDb.CmdHelper.DbSearchAll(dbName, table.TableName, "1 = 0"))
Dim createTableString As String = CreateTableStringByDataTable(table.TableName, remoteTable) '获取建表语句
localDb.ExecuteNonQuery(createTableString)
Else
'查询本地最大ID,主键必须为ID
Dim cmd As String = localDb.CmdHelper.SearchOrder(New List(Of String)() From {"ID"}, table.TableName, "ORDER BY [ID] DESC LIMIT 1")
Dim maxIdObject As Object = localDb.ExecuteScalar(cmd)
If IsDBNull(maxIdObject) = False Then
maxID = CInt(maxIdObject)
End If
End If
'通过dataReader插入数据,查询远程更新时间后的所有内容
Using reader As DbDataReader = remoteDb.ExecuteReader(remoteDb.CmdHelper.DbSearchAll(dbName, table.TableName, $"`UpdateTime` > '{table.LastSyncTime}'"))
While reader.Read()
If CInt(reader("ID")) > maxID Then '小于最大ID则更新,大于最大ID则插入
InsertDataByDataReader(localDb, table.TableName, reader)
Else
UpdateDataByDataReader(localDb, table.TableName, reader)
End If
End While
reader.Close()
End Using
End Sub
''' <summary>
''' 更新全表的方式下载表
''' </summary>
''' <param name="remoteDb"></param>
''' <param name="localDb"></param>
''' <param name="table"></param>
Private Sub UpdateTableForAll(remoteDb As DbExecutor, localDb As DbExecutor, dbName As String, table As SyncTableScheme)
'删除本地表
If table.IsExistsTable Then
localDb.ExecuteNonQuery(localDb.CmdHelper.DropTable(table.TableName))
End If
'新建表(考虑是否应该查询总数后,依此取1000行的方式下载,或考虑使用DataReader)
Dim remoteTable As DataTable = remoteDb.ExecuteDataTable(remoteDb.CmdHelper.DbSearchAll(dbName, table.TableName, "1 = 0"))
Dim createTableString As String = CreateTableStringByDataTable(table.TableName, remoteTable) '获取建表语句
localDb.ExecuteNonQuery(createTableString)
'通过dataReader插入数据
Using reader As DbDataReader = remoteDb.ExecuteReader(remoteDb.CmdHelper.DbSearchAll(dbName, table.TableName))
While reader.Read()
InsertDataByDataReader(localDb, table.TableName, reader)
End While
reader.Close()
End Using
End Sub
Private Sub UpdateDataByDataReader(localDb As DbExecutor, tableName As String, dbReader As DbDataReader)
Dim colNames As New List(Of String)
Using comm As DbCommand = localDb.CreateCommand()
For i As Integer = 0 To dbReader.FieldCount - 1
colNames.Add(dbReader.GetName(i))
Dim param As DbParameter = comm.CreateParameter()
param.DbType = DbType.Object
param.ParameterName = $"@{dbReader.GetName(i)}"
param.Value = dbReader.Item(i)
comm.Parameters.Add(param)
Next
comm.CommandText = localDb.CmdHelper.UpdateParam(tableName, colNames, $"`ID` = {dbReader("ID")}")
comm.ExecuteNonQuery()
End Using
End Sub
Private Sub InsertDataByDataReader(localDb As DbExecutor, tableName As String, dbReader As DbDataReader)
Dim colNames As New List(Of String)
Using comm As DbCommand = localDb.CreateCommand()
For i As Integer = 0 To dbReader.FieldCount - 1
colNames.Add(dbReader.GetName(i))
Dim param As DbParameter = comm.CreateParameter()
param.DbType = DbType.Object
param.ParameterName = $"@{dbReader.GetName(i)}"
param.Value = dbReader.Item(i)
comm.Parameters.Add(param)
Next
comm.CommandText = localDb.CmdHelper.InsertParam(tableName, colNames)
comm.ExecuteNonQuery()
End Using
End Sub
''' <summary>
''' 将目标DataTable的所有数据插入到指定数据表中,不检测是否需要新增列
'''
''' 后续插入字符需要区别数值与字符串
''' </summary>
''' <param name="localDb"></param>
''' <param name="tableName"></param>
''' <param name="dataTable"></param>
Private Sub InsertDataByDataTable(localDb As DbExecutor, tableName As String, dataTable As DataTable)
Dim colNameParams As New Dictionary(Of String, String)
' Dim colParamValues As New Dictionary(Of String, Object)
For Each dtRow As DataRow In dataTable.Rows
For Each dtCol As DataColumn In dataTable.Columns
colNameParams.Add(dtCol.ColumnName, $"@{dtCol.ColumnName}")
' colParamValues.Add($"@{dtCol.ColumnName}", dtRow(dtCol.ColumnName))
'存疑是否可以修改
Dim param As DbParameter = localDb.Command.CreateParameter()
param.DbType = DbType.Object
param.ParameterName = $"@{dtCol.ColumnName}"
param.Value = dtRow(dtCol.ColumnName)
localDb.Command.Parameters.Add(param)
Next
Dim cmdText As String = localDb.CmdHelper.Insert(tableName, colNameParams)
localDb.ExecuteNonQuery(cmdText) '执行插入
localDb.Command.Parameters.Clear() '清空参数
colNameParams.Clear() '复位
Next
End Sub
''' <summary>
''' 更新本地数据成功后,同步更新本地版本记录表
''' </summary>
''' <param name="localDb">本地数据库执行器</param>
''' <param name="table">需要同步的数据表信息</param>
Private Sub UpdateVersionTable(localDb As DbExecutor, table As SyncTableScheme)
Dim tableName As String = Customer.SyncListTable.TableName
Dim cmdText As String
If table.IsExistsTable Then
Dim colNameValue As New Dictionary(Of String, String) From {
{$"{Customer.SyncListTable.ColNamesEnum.RevisionID}", table.RevisionID},
{$"{Customer.SyncListTable.ColNamesEnum.SyncTime}", table.NowSyncTime}
}
Dim condition As String = $"{Customer.SyncListTable.ColNamesEnum.TableName} = '{table.TableName}'"
cmdText = localDb.CmdHelper.Update(tableName, colNameValue, condition)
Else
Dim colNameValue As New Dictionary(Of String, String) From {
{$"{Customer.SyncListTable.ColNamesEnum.TableName}", table.TableName},
{$"{Customer.SyncListTable.ColNamesEnum.RevisionID}", table.RevisionID},
{$"{Customer.SyncListTable.ColNamesEnum.SyncType}", table.SyncType},
{$"{Customer.SyncListTable.ColNamesEnum.SyncTime}", table.NowSyncTime}
}
cmdText = localDb.CmdHelper.Insert(tableName, colNameValue)
End If
Try
localDb.ExecuteNonQuery(cmdText)
Catch ex As Exception
ServiceLog.WriteErrorLog($"UpdateVersionTable Error:{ex.Message}")
End Try
End Sub
#End Region
#Region "数据类型转换"
Enum SystemTypeEnum
[AnsiString]
[AnsiStringFixedLength]
Binary
[Boolean]
[Byte]
[DateTime]
[Decimal]
[Double]
[Guid]
[Int16]
[Int32]
[Int64]
[SByte]
[Single]
[String]
[TimeSpan]
[UInt16]
[UInt32]
[UInt64]
End Enum
''' <summary>
''' 将.net数据类型转换为Sqlite数据类型
''' </summary>
''' <param name="dataType">.net数据类型</param>
''' <returns>转换后的Sqlite数据类型</returns>
Public Shared Function ConvertSystemTypeToSqliteType(dataType As String) As String
Dim reType As String
Select Case dataType
Case SystemTypeEnum.AnsiString.ToString()
reType = Sqlite.DataParam.DataTypeEnum.Varchar.ToString()
Case SystemTypeEnum.[AnsiStringFixedLength].ToString()
reType = Sqlite.DataParam.DataTypeEnum.Nchar.ToString()
Case SystemTypeEnum.Binary.ToString(), SystemTypeEnum.Byte.ToString()
reType = Sqlite.DataParam.DataTypeEnum.Blob.ToString()
Case SystemTypeEnum.[Boolean].ToString()
reType = Sqlite.DataParam.DataTypeEnum.Bit.ToString()
Case SystemTypeEnum.[DateTime].ToString()
reType = Sqlite.DataParam.DataTypeEnum.Datetime.ToString()
Case SystemTypeEnum.[Decimal].ToString()
reType = Sqlite.DataParam.DataTypeEnum.[Decimal].ToString()
Case SystemTypeEnum.[Double].ToString()
reType = Sqlite.DataParam.DataTypeEnum.Real.ToString()
Case SystemTypeEnum.[Guid].ToString()
reType = Sqlite.DataParam.DataTypeEnum.UniqueIdentifier.ToString()
Case SystemTypeEnum.[Int16].ToString()
reType = Sqlite.DataParam.DataTypeEnum.SmallInt.ToString()
Case SystemTypeEnum.[Int32].ToString()
reType = Sqlite.DataParam.DataTypeEnum.[Integer].ToString()
Case SystemTypeEnum.[Int64].ToString()
reType = Sqlite.DataParam.DataTypeEnum.[Integer].ToString()
Case SystemTypeEnum.[SByte].ToString()
reType = Sqlite.DataParam.DataTypeEnum.TinyInt.ToString()
Case SystemTypeEnum.[Single].ToString()
reType = Sqlite.DataParam.DataTypeEnum.[Single].ToString()
Case SystemTypeEnum.[String].ToString()
reType = Sqlite.DataParam.DataTypeEnum.Nvarchar.ToString()
Case SystemTypeEnum.TimeSpan.ToString()
reType = Sqlite.DataParam.DataTypeEnum.Datetime.ToString()
Case SystemTypeEnum.[UInt16].ToString()
reType = Sqlite.DataParam.DataTypeEnum.SmallUint.ToString()
Case SystemTypeEnum.[UInt32].ToString()
reType = Sqlite.DataParam.DataTypeEnum.Uint.ToString()
Case SystemTypeEnum.[UInt64].ToString()
reType = Sqlite.DataParam.DataTypeEnum.UnsignedInteger.ToString()
Case "Byte[]"
reType = Sqlite.DataParam.DataTypeEnum.Blob.ToString()
Case Else
'reType = Sqlite.DataParam.DataTypeEnum.Varchar.ToString()
Throw New Exception($"ConvertSystemTypeToSqliteTypeUnDealType:{dataType}{vbNewLine}")
End Select
Return reType
End Function
''' <summary>
''' 通过解析DbDataReader列名与列类型,暂不可用
''' </summary>
''' <param name="tableName"></param>
''' <param name="reader"></param>
''' <returns></returns>
Private Function CreateTableStringByDataReader(tableName As String, reader As DbDataReader) As String
Dim builder As New StringBuilder
builder.Append($"CREATE TABLE If Not Exists [{tableName}] (")
For i As Integer = 0 To reader.FieldCount - 1
If i = 0 Then
'应该修改成通用的类型转换
builder.Append($"[{reader.GetName(i)}] {ConvertSystemTypeToSqliteType(reader.GetDataTypeName(i))}")
Else
builder.Append($", [{reader.GetName(i)}] {ConvertSystemTypeToSqliteType(reader.GetDataTypeName(i))}")
End If
Next
builder.Append(" )")
Return builder.ToString()
End Function
''' <summary>
''' 通过解析DataTable,获取建表语句
''' </summary>
''' <param name="tableName">数据表名</param>
''' <param name="destTable">需要解析的内存数据表</param>
''' <returns></returns>
Private Function CreateTableStringByDataTable(tableName As String, destTable As DataTable) As String
Dim builder As New StringBuilder
builder.Append($"CREATE TABLE If Not Exists [{tableName}] (")
For i As Integer = 0 To destTable.Columns.Count - 1
If i = 0 Then
'应该修改成通用的类型转换
builder.Append($"[{destTable.Columns(i).ColumnName}] {ConvertSystemTypeToSqliteType(destTable.Columns(i).DataType.Name)}")
Else
builder.Append($", [{destTable.Columns(i).ColumnName}] {ConvertSystemTypeToSqliteType(destTable.Columns(i).DataType.Name)}")
End If
'列名长度
If destTable.Columns(i).MaxLength > -1 Then
builder.Append($"({destTable.Columns(i).MaxLength})")
End If
'列为空
If destTable.Columns(i).AllowDBNull = False Then
builder.Append($" NOT NULL")
End If
'列自增(默认列自增为主键)
If destTable.Columns(i).AutoIncrement Then
builder.Append($" PRIMARY KEY AutoIncrement")
'Else
' '唯一值
' If destTable.Columns(i).Unique Then
' builder.Append($" Unique")
' End If
End If
''默认值
'If destTable.Columns(i).DefaultValue IsNot Nothing Then
' If String.IsNullOrEmpty(destTable.Columns(i).DefaultValue.ToString()) = False Then
' builder.Append($" DEFAULT '{destTable.Columns(i).DefaultValue}'")
' End If
'End If
Next
builder.Append(" )")
Return builder.ToString()
End Function
#End Region
End Class

View File

@@ -0,0 +1,33 @@
''' <summary>
''' 任务类型接口,每个任务必须实现的功能
''' </summary>
Public Interface IServiceTask
''' <summary>
''' 任务开始
''' </summary>
Sub Start()
''' <summary>
''' 任务退出
''' </summary>
Sub [Stop]()
''' <summary>
''' 重启任务
''' </summary>
Sub Restart()
''' <summary>
''' 设置任务参数
''' </summary>
''' <param name="params"></param>
Sub SetParams(params As Dictionary(Of String, String))
''' <summary>
''' 获取任务参数
''' </summary>
''' <returns></returns>
Function GetParams() As Dictionary(Of String, String)
End Interface

View File

@@ -0,0 +1,127 @@
Imports System.IO
Imports Newtonsoft.Json
Imports UTS_Core.Database
Imports UTS_Core.UTSModule.DbConnect
Public Class JsonFileListen
''' <summary>
''' 读取文件并将内容保存在本地数据库中
''' </summary>
''' <param name="path"></param>
''' <returns></returns>
Public Function ReadFile(db As DbExecutor, path As String) As Boolean
ServiceLog.WriteInfoLog($"FileListen Begin ReadFile!")
If File.Exists(path) = False Then
Throw New Exception($"{path}不存在!")
End If
ServiceLog.WriteInfoLog($"FileListen Get fileLength!")
Dim fileInfo As New FileInfo(path) '获取文件大小
If fileInfo.Length = 0 Then Return True
ServiceLog.WriteInfoLog($"FileListen Begin Read Text String!")
Using reader As New StreamReader(path)
While reader.Peek() <> -1
Dim line As String = reader.ReadLine()
If String.IsNullOrWhiteSpace(line) Then Continue While '过滤信息
line = line.Replace("\", "\\") '处理转义字符
Dim tmpField As Dictionary(Of String, String)
Try
tmpField = CType(JsonConvert.DeserializeObject(line, GetType(Dictionary(Of String, String))), Dictionary(Of String, String))
Catch ex As Exception
ServiceLog.WriteErrorLog($"FileListen JsonConvertToKeyValue Error:{ex.Message};JsonString:{line}")
Continue While
End Try
ServiceLog.WriteInfoLog($"FileListen Filter Text String!")
''过滤缺失字段字符串
If tmpField.ContainsKey("ProjectName") = False OrElse tmpField.ContainsKey("StationName") = False Then
ServiceLog.WriteErrorLog($"FileListen Unexist ProjectName Or StationName Filed,JsonString:{line}")
Continue While
End If
ServiceLog.WriteInfoLog($"FileListen Filter Text String Success!")
'数据处理,根据表名进行分类,增删必要字段
Dim tableName As String
Try
Dim projectIndex As Integer = DbConnector.SearchProjectIndex(db, tmpField("ProjectName"))
Dim stationIndex As Integer = DbConnector.SearchStationIndex(db, projectIndex, tmpField("StationName"))
tableName = UTS_Core.UTSModule.DbTableModel.Customer.TestLogTable.TableName(projectIndex, stationIndex)
Catch ex As Exception
ServiceLog.WriteErrorLog($"FileListen GetTestLogTableName Error:{ex.Message};ProjectName:{tmpField("ProjectName")};StationName:{tmpField("StationName")}")
Continue While
End Try
ServiceLog.WriteInfoLog($"FileListen Begin CreateTestLogTable!")
Try '本地表格新建
DbConnector.UtsCreateTestLogTableToLocal(db, tableName)
Catch ex As Exception
ServiceLog.WriteErrorLog($"FileListen CreateTestLogTable Error:{ex.Message}")
Continue While
End Try
ServiceLog.WriteInfoLog($"FileListen Begin CreateTestLogTable Success!")
ServiceLog.WriteInfoLog($"FileListen Begin Filter Db Filed!")
Dim fields As New Dictionary(Of String, String) '入库字段
For Each valuePair As KeyValuePair(Of String, String) In tmpField
If String.IsNullOrWhiteSpace(valuePair.Key) Then Continue For
If String.Compare(valuePair.Key, "ProjectName", True) = 0 Then Continue For
If String.Compare(valuePair.Key, "StationName", True) = 0 Then Continue For
If String.Compare(valuePair.Key, "ProductionLineID", True) = 0 Then
If String.IsNullOrWhiteSpace(valuePair.Value) Then Continue For
End If
If String.Compare(valuePair.Key, "OrderID", True) = 0 Then
If String.IsNullOrWhiteSpace(valuePair.Value) Then Continue For
End If
If String.Compare(valuePair.Key, "ServiceID", True) = 0 Then
If String.IsNullOrWhiteSpace(valuePair.Value) Then Continue For
End If
If String.Compare(valuePair.Key, "UserID", True) = 0 Then
If String.IsNullOrWhiteSpace(valuePair.Value) Then Continue For
End If
fields.Add(valuePair.Key, valuePair.Value) '过滤字段,保留有效字段
Next
ServiceLog.WriteInfoLog($"FileListen Begin Filter Db Filed Success!")
ServiceLog.WriteInfoLog($"FileListen SaveTestRecord!")
Try '存储
DbConnector.UtsInsertToLocal(db, UTS_Core.UTSModule.UtsDb.RemotePrivateDb, tableName, fields)
Catch ex As Exception
ServiceLog.WriteErrorLog($"FileListen SaveTestRecord Error:{ex.Message}")
Continue While
End Try
ServiceLog.WriteInfoLog($"FileListen SaveTestRecord Success!")
End While
reader.Close()
End Using
ServiceLog.WriteInfoLog($"FileListen Begin Clear!")
File.WriteAllText(path, String.Empty) '清空文件内容,由于多地同时写的原因,有可能会失败
ServiceLog.WriteInfoLog($"FileListen Success!")
Return True
End Function
End Class

View File

@@ -0,0 +1,162 @@
Imports System.Threading
Imports System.Xml.Serialization
Imports UTS_Core.UTSModule.Service
<XmlInclude(GetType(ListenJsonFileServiceTask))>
Public Class ListenJsonFileServiceTask
Inherits ServiceTask
Private ReadOnly _jsonFile As JsonFileListen
Sub New()
TaskType = ServiceTaskTypeEnum.ListenJsonFile
TaskStatus = ServiceTaskStatusEnum.Stop
TaskName = "ListenJsonFile"
_jsonFile = New JsonFileListen()
End Sub
Sub New(name As String)
TaskType = ServiceTaskTypeEnum.ListenJsonFile
TaskStatus = ServiceTaskStatusEnum.Stop
TaskName = name
_jsonFile = New JsonFileListen()
End Sub
Sub New(name As String, param As Dictionary(Of String, String))
TaskType = ServiceTaskTypeEnum.ListenJsonFile
TaskStatus = ServiceTaskStatusEnum.Stop
TaskName = name
_jsonFile = New JsonFileListen()
SetParams(param)
End Sub
''' <summary>
''' 具体的执行过程
''' </summary>
''' <param name="stat">状态值,暂未启用</param>
Private Sub StartCallback(stat As Object)
While TaskStatus = ServiceTaskStatusEnum.Start
ServiceLog.WriteInfoLog($"SyncTask Wait Timeout.")
'等待任务
Dim lastTime As DateTime = Now
While (Now - lastTime).TotalMinutes < Interval
If TaskStatus = ServiceTaskStatusEnum.Stop Then
Return
End If
Thread.Sleep(1000)
End While
Using localDb As New UTS_Core.Database.DbExecutor(UTS_Core.UTSModule.UtsDb.LocalDbType, UTS_Core.UTSModule.UtsDb.LocalConnString) '连接本地字符串
localDb.Open()
localDb.BeginTransaction()
Try
_jsonFile.ReadFile(localDb, FilePath)
Catch ex As Exception
ServiceLog.WriteErrorLog($"_jsonFile.ReadFile TaskName:{TaskName},ListenJsonFile Error:{ex.Message}")
End Try
localDb.CommitTransaction()
localDb.Close()
End Using
End While
End Sub
Public Overrides Sub Start()
ServiceLog.WriteInfoLog($"FileListen Befor StartCallback")
TaskStatus = ServiceTaskStatusEnum.Start
If _syncThread IsNot Nothing AndAlso _syncThread.IsAlive Then
ServiceLog.WriteInfoLog($"FileListenThread IsAlive!")
Return
End If
_syncThread = New Thread(AddressOf StartCallback)
_syncThread.IsBackground = True
_syncThread.Start()
ServiceLog.WriteInfoLog($"FileListen After StartCallback")
End Sub
Public Overrides Sub [Stop]()
ServiceLog.WriteInfoLog($"FileListen Befor Stop!")
TaskStatus = ServiceTaskStatusEnum.Stop
Dim lastTime As DateTime = Now
While _syncThread IsNot Nothing AndAlso _syncThread.IsAlive
If (Now - lastTime).TotalMilliseconds > 10000 Then
_syncThread.Abort()
End If
Thread.Sleep(10)
End While
ServiceLog.WriteInfoLog($"FileListen Stop!")
End Sub
Public Overrides Sub Restart()
ServiceLog.WriteInfoLog($"FileListen Befor Restart!")
If _syncThread IsNot Nothing AndAlso _syncThread.IsAlive Then
[Stop]()
End If
Start()
ServiceLog.WriteInfoLog($"FileListen Restart!")
End Sub
Public Overrides Sub SetParams(params As Dictionary(Of String, String))
Dim tmpStatus As ServiceTaskStatusEnum
Dim tmpInterval As Integer
Dim tmpPath As String = String.Empty
'将转换后的数据填充至临时缓存,一遍设置失败时可以保留上一次数据
For Each param As KeyValuePair(Of String, String) In params
Select Case param.Key
Case "Interval"
If Integer.TryParse(param.Value, tmpInterval) = False Then
Throw New Exception($"Error Interval :{param.Value}")
End If
Case "Path"
tmpPath = param.Value
Case "Status", "Type", "Name" '不处理的字段
End Select
Next
TaskStatus = tmpStatus
Interval = tmpInterval
FilePath = tmpPath
End Sub
Public Overrides Function GetParams() As Dictionary(Of String, String)
Dim params As New Dictionary(Of String, String) From {
{"Type", TaskType.ToString()},
{"Name", TaskName},
{"Status", TaskStatus.ToString()},
{"Interval", Interval.ToString()},
{"Path", FilePath}
}
Return params
End Function
Public Property Interval() As Integer
Public Property FilePath() As String
Private _syncThread As Thread
End Class

View File

@@ -0,0 +1,88 @@
Imports System.Xml.Serialization
<Serializable>
<XmlInclude(GetType(DbSyncServiceTask))>
<XmlInclude(GetType(ListenJsonFileServiceTask))>
Public MustInherit Class ServiceTask
Implements IServiceTask
''' <summary>
''' 服务任务类型枚举集合
''' </summary>
Enum ServiceTaskTypeEnum
''' <summary>
''' 数据库同步
''' </summary>
DbSync
''' <summary>
''' 监听Json文件
''' </summary>
ListenJsonFile
End Enum
''' <summary>
''' 服务任务状态枚举值
''' </summary>
Enum ServiceTaskStatusEnum
''' <summary>
''' 启动状态
''' </summary>
Start
''' <summary>
''' 停止状态
''' </summary>
[Stop]
End Enum
''' <summary>
''' 服务任务类型
''' </summary>
''' <returns></returns>
Public Property TaskType() As ServiceTaskTypeEnum
''' <summary>
''' 服务任务名,服务任务的唯一索引
''' </summary>
''' <returns></returns>
Public Property TaskName() As String
''' <summary>
''' 服务任务的状态
''' </summary>
''' <returns></returns>
Public Property TaskStatus() As ServiceTaskStatusEnum
''' <summary>
''' 任务开启
''' </summary>
Public MustOverride Sub Start() Implements IServiceTask.Start
''' <summary>
''' 任务停止
''' </summary>
Public MustOverride Sub [Stop]() Implements IServiceTask.[Stop]
''' <summary>
''' 任务重启
''' </summary>
Public MustOverride Sub Restart() Implements IServiceTask.Restart
''' <summary>
''' 任务参数集合设置
''' </summary>
''' <param name="params">任务参数键值对</param>
Public MustOverride Sub SetParams(params As Dictionary(Of String, String)) Implements IServiceTask.SetParams
''' <summary>
''' 任务参数集合获取
''' </summary>
''' <returns></returns>
Public MustOverride Function GetParams() As Dictionary(Of String, String) Implements IServiceTask.GetParams
End Class

View File

@@ -0,0 +1,230 @@
Imports UTS_Core.UTSModule.Service
''' <summary>
''' 服务任务列表,管理服务的所有任务
''' </summary>
Public Class ServiceTasks
Private ReadOnly _tasks As Dictionary(Of String, ServiceTask)
Public Event AddTask(task As Dictionary(Of String, String))
Public Event UpdateTask(task As Dictionary(Of String, String))
Public Event DelTask(task As String)
Public Event ClearTask()
Sub New()
_tasks = New Dictionary(Of String, ServiceTask)()
End Sub
''' <summary>
''' 任务总数
''' </summary>
''' <returns></returns>
Public Function Count() As Integer
Return _tasks.Count
End Function
''' <summary>
''' 获取所有的服务任务
''' </summary>
''' <returns></returns>
Public Function GetAllServiceTasks() As List(Of ServiceTask)
Return _tasks.Values.ToList()
End Function
''' <summary>
''' 添加任务,默认开启任务
''' </summary>
Public Sub Add(task As ServiceTask, Optional start As Boolean = True)
If String.IsNullOrEmpty(task.TaskName) Then '无效的任务名
Throw New Exception($"TaskName {task.TaskName} is invalid!")
End If
If _tasks.ContainsKey(task.TaskName) Then '已存在的任务名
Throw New Exception($"TaskName {task.TaskName} already exists!")
End If
_tasks.Add(task.TaskName, task)
If start Then task.Start() '默认添加任务时,开启任务
RaiseEvent AddTask(task.GetParams())
End Sub
''' <summary>
''' 添加任务,默认开启服务
''' </summary>
Public Sub Add(taskInfo As Dictionary(Of String, String), Optional start As Boolean = True)
If taskInfo.ContainsKey("Type") AndAlso taskInfo.ContainsKey("Name") Then
Dim task As ServiceTask
Select Case taskInfo("Type")'根据类型进行不同任务的初始化
Case $"{ ServiceTask.ServiceTaskTypeEnum.DbSync}"
task = New DbSyncServiceTask(taskInfo("Name"), taskInfo)
Add(task, start)
ServiceLog.WriteInfoLog($"taskParam:{task.TaskName} {task.TaskStatus} {task.TaskType}")
Case $"{ ServiceTask.ServiceTaskTypeEnum.ListenJsonFile}"
task = New ListenJsonFileServiceTask(taskInfo("Name"), taskInfo)
Add(task, start)
Case Else
Throw New Exception($"Unknown Type:{taskInfo("Type")}")
End Select
Else
Throw New Exception($"AddTask Invalid TaskInfo")
End If
End Sub
''' <summary>
''' 添加任务列表
''' </summary>
''' <param name="tasks"></param>
Public Sub AddRange(tasks As List(Of ServiceTask), Optional start As Boolean = True)
For Each task As ServiceTask In tasks
Add(task, start)
Next
End Sub
''' <summary>
''' 移除指定的服务任务
''' </summary>
''' <param name="task"></param>
Sub Remove(task As ServiceTask)
If _tasks.ContainsKey(task.TaskName) Then
task.Stop()
RaiseEvent DelTask(task.TaskName)
_tasks.Remove(task.TaskName)
End If
End Sub
''' <summary>
''' 移除指定名称的服务任务
''' </summary>
Sub RemoveAt(taskName As String)
If _tasks.ContainsKey(taskName) Then
Remove(_tasks.Item(taskName))
End If
End Sub
''' <summary>
''' 清空所有的服务任务
''' </summary>
Sub Clear()
'关闭所有任务
For Each task As KeyValuePair(Of String, ServiceTask) In _tasks
task.Value.Stop()
Next
'清空任务列表
_tasks.Clear()
RaiseEvent ClearTask()
End Sub
''' <summary>
''' 设置指定任务的任务参数
''' </summary>
''' <param name="taskName"></param>
''' <param name="param"></param>
Public Sub SetTaskParams(taskName As String, param As Dictionary(Of String, String))
If _tasks.ContainsKey(taskName) = False Then '不存在的任务
Throw New Exception($"TaskName {taskName} is nonexistent!")
End If
_tasks.Item(taskName).SetParams(param)
RaiseEvent UpdateTask(_tasks.Item(taskName).GetParams())
End Sub
''' <summary>
''' 返回指定任务名称的任务参数
''' </summary>
''' <param name="taskName"></param>
''' <returns></returns>
Public Function GetTaskParams(taskName As String) As Dictionary(Of String, String)
If _tasks.ContainsKey(taskName) = False Then '不存在的任务
Throw New Exception($"TaskName {taskName} is nonexistent!")
End If
Return _tasks.Item(taskName).GetParams()
End Function
''' <summary>
''' 获取所有任务的参数信息
''' </summary>
''' <returns></returns>
Public Function GetAllTasksParam() As List(Of Dictionary(Of String, String))
Dim allParams As New List(Of Dictionary(Of String, String))
For Each task As KeyValuePair(Of String, ServiceTask) In _tasks
allParams.Add(task.Value.GetParams())
Next
Return allParams
End Function
Public Sub StartTask(taskName As String)
If _tasks.ContainsKey(taskName) = False Then '不存在的任务
Throw New Exception($"TaskName {taskName} is nonexistent!")
End If
_tasks.Item(taskName).Start()
RaiseEvent UpdateTask(_tasks.Item(taskName).GetParams())
End Sub
''' <summary>
'''开启所有任务
''' </summary>
Public Sub StartAllTasks()
For Each task As KeyValuePair(Of String, ServiceTask) In _tasks
task.Value.Start()
RaiseEvent UpdateTask(task.Value.GetParams())
Next
End Sub
''' <summary>
''' 结束休眠,立即执行任务
''' </summary>
''' <param name="taskName"></param>
Public Sub RestartTask(taskName As String)
If _tasks.ContainsKey(taskName) = False Then '不存在的任务
Throw New Exception($"TaskName {taskName} is nonexistent!")
End If
_tasks.Item(taskName).Restart()
RaiseEvent UpdateTask(_tasks.Item(taskName).GetParams())
End Sub
''' <summary>
'''开启所有任务
''' </summary>
Public Sub RestartAllTasks()
For Each task As KeyValuePair(Of String, ServiceTask) In _tasks
task.Value.Restart()
RaiseEvent UpdateTask(task.Value.GetParams())
Next
End Sub
''' <summary>
''' 停止指定任务名的任务
''' </summary>
''' <param name="taskName"></param>
Public Sub StopTask(taskName As String)
If _tasks.ContainsKey(taskName) = False Then '不存在的任务
Throw New Exception($"TaskName {taskName} is nonexistent!")
End If
_tasks.Item(taskName).Stop()
RaiseEvent UpdateTask(_tasks.Item(taskName).GetParams())
End Sub
''' <summary>
'''停止所有任务
''' </summary>
Public Sub StopAllTasks()
For Each task As KeyValuePair(Of String, ServiceTask) In _tasks
task.Value.Stop()
RaiseEvent UpdateTask(task.Value.GetParams())
Next
End Sub
End Class

View File

@@ -0,0 +1,55 @@
Imports System.Net.Sockets
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Converters
Imports UTS_Core.UTSModule.Test.StatusMonitor
Public Class UtsApp
Public Property Name As String
Public Property ProjectName As String
Public Property StationName As String
Public Property TestPlan As String
Public Property Version As String
<JsonConverter(GetType(StringEnumConverter))>
Public Property Status As AppStatus
<JsonIgnore>
Public Property UtsStatus As ComportStatusMonitor.ComPortConnectStatusEnum
<JsonIgnore>
Public Property TestStatus As TestCommandStatusMonitor.TestCommandStatusEnum
<JsonIgnore>
Public Property Client As TcpClient
Sub New()
Name = String.Empty
ProjectName = String.Empty
StationName = String.Empty
TestPlan = String.Empty
Version = String.Empty
UtsStatus = ComportStatusMonitor.ComPortConnectStatusEnum.UnConnected
TestStatus = TestCommandStatusMonitor.TestCommandStatusEnum.None
Status = AppStatus.Closed
End Sub
Enum AppStatus
''' <summary>
''' 已启动
''' </summary>
Started
''' <summary>
''' 已关闭
''' </summary>
Closed
End Enum
End Class

View File

@@ -0,0 +1,83 @@
Public Class UtsAppManager
''' <summary>
''' 设备运行APP列表,键为APP名称值为App对象
''' </summary>
Private _appDic As Dictionary(Of String, UtsApp)
Private _clientDic As Dictionary(Of Net.Sockets.TcpClient, UtsApp)
Sub New()
_appDic = New Dictionary(Of String, UtsApp)
_clientDic = New Dictionary(Of Net.Sockets.TcpClient, UtsApp)
End Sub
Public Sub AddApp(app As UtsApp)
If _appDic.ContainsKey(app.Name) = False Then
_appDic.Add(app.Name, app)
End If
End Sub
''' <summary>
''' 判断App是否存在队列中
''' </summary>
''' <param name="appName"></param>
''' <returns></returns>
Public Function AppExists(appName As String) As Boolean
Return _appDic.ContainsKey(appName)
End Function
''' <summary>
''' 获取UtsApp对象没有则添加对象至队列后再返回
''' </summary>
''' <param name="appName"></param>
''' <returns></returns>
Public Function GetApp(appName As String) As UtsApp
Static lock As New Object
SyncLock lock
If _appDic.ContainsKey(appName) = False Then
ServiceLog.WriteDebugLog($"{appName} Add!")
_appDic.Add(appName, New UtsApp())
End If
End SyncLock
Return _appDic(appName)
End Function
''' <summary>
''' 获取当前App列表
''' </summary>
''' <returns></returns>
Public Function GetAllApps() As List(Of UtsApp)
Return _appDic.Values.ToList()
End Function
Public Function GetClientBindApp(client As Net.Sockets.TcpClient) As UtsApp
If _clientDic.ContainsKey(client) Then
Return _clientDic(client)
Else
Return Nothing
End If
End Function
Public Sub BindClientAndApp(client As Net.Sockets.TcpClient, app As UtsApp)
Static lock As New Object
SyncLock lock
If _clientDic.ContainsKey(client) = False Then
_clientDic.Add(client, app)
ServiceLog.WriteDebugLog($"{_clientDic(client).Name} Connect!")
End If
End SyncLock
End Sub
Public Sub CancelClientBind(client As Net.Sockets.TcpClient)
If _clientDic.ContainsKey(client) Then
ServiceLog.WriteDebugLog($"{_clientDic(client).Name} Disconnect!")
_clientDic(client).Status = UtsApp.AppStatus.Closed
_clientDic(client).Client = Nothing
_clientDic.Remove(client)
End If
End Sub
End Class

View File

@@ -0,0 +1,31 @@
Public Class ServiceGroup
Sub New()
'Fileds = New Dictionary(Of String, String)
End Sub
''' <summary>
''' 当前服务所属子网组
''' </summary>
''' <returns></returns>
Public Property ServiceGroup As String
''' <summary>
''' 当前服务索引
''' </summary>
''' <returns></returns>
Public Property ServiceIndex As Integer
''' <summary>
''' 当前命令类型
''' </summary>
''' <returns></returns>
Public Property Type As String
''' <summary>
''' 当前包号
''' </summary>
''' <returns></returns>
Public Property Index As Integer
Public Property GroupInfo As New Dictionary(Of String, String)
End Class

View File

@@ -0,0 +1,116 @@
Imports System.Text
Public Class ServiceGroupManager
''' <summary>历史通讯数据服务集合</summary>
Private _groupService As Dictionary(Of Integer, OtherService)
Sub New()
_groupService = New Dictionary(Of Integer, OtherService)
End Sub
''' <summary>
''' 添加网上邻居,已存在则更新存活时间与状态
''' </summary>
''' <param name="other"></param>
Public Sub Add(other As OtherService)
If _groupService.ContainsKey(other.ServiceIndex) Then
_groupService(other.ServiceIndex).LastTime = Now
_groupService(other.ServiceIndex).IsAlive = True
Else
_groupService.Add(other.ServiceIndex, other)
End If
End Sub
''' <summary>
''' 校验其他服务的当前发送包索引是否与上一包索引重复相同返回True不相同返回False
''' </summary>
''' <returns></returns>
Public Function CheckServiceSendIndex(serviceId As Integer, sendId As Integer) As Boolean
If _groupService.ContainsKey(serviceId) Then
If _groupService(serviceId).LastPacketIndex = sendId Then
Return True
Else
Return False
End If
Else
Return False
End If
End Function
''' <summary>
''' 校验服务是否存活
''' </summary>
Public Sub CheckAliveService()
For Each other As KeyValuePair(Of Integer, OtherService) In _groupService
If (Now - other.Value.LastTime).TotalSeconds > 30 Then
other.Value.IsAlive = False
End If
Next
End Sub
''' <summary>
''' 获取存活状态的所有网上邻居的索引字符串,以逗号分割
''' </summary>
''' <returns></returns>
Public Function GetAliveServiceIndexString() As String
'排序后输出
Dim sb As New StringBuilder
Dim bt() As Integer = _groupService.Keys.ToArray()
Array.Sort(bt)
For i As Integer = 0 To bt.Length - 1
If _groupService(bt(i)).IsAlive = False Then Continue For
If sb.Length = 0 Then
sb.Append(bt(i))
Else
sb.Append("," & bt(i))
End If
Next
Return sb.ToString
'原来的顺序输出
'For Each other As KeyValuePair(Of Integer, OtherService) In _groupService
' If other.Value.IsAlive = False Then Continue For
' If sb.Length = 0 Then
' sb.Append(other.Key)
' Else
' sb.Append("," & other.Key)
' End If
'Next
End Function
End Class
Public Class OtherService
Sub New(index As Integer, packetIndex As Integer)
ServiceIndex = index
LastPacketIndex = packetIndex
LastTime = Now
IsAlive = True
End Sub
''' <summary>
''' 最后通讯时间
''' </summary>
Public Property LastTime As DateTime
''' <summary>
''' 最后通讯包ID
''' </summary>
Public Property LastPacketIndex As Integer
''' <summary>
''' 服务索引
''' </summary>
Public Property ServiceIndex As Integer
''' <summary>
''' 是否判定为在线
''' </summary>
Public Property IsAlive As Boolean
End Class

View File

@@ -0,0 +1,18 @@
Public Class CheckSum
''' <summary>
''' 获取数据包的和校验
''' </summary>
''' <param name="packet">数据包的内容</param>
''' <returns></returns>
Public Shared Function GetPacketCheck(packet() As Byte) As Byte
Dim result As Integer
'当packet的相加综合超过INT_MAX则会异常
For Each b As Byte In packet
result += b
Next
Return CByte(&HFF - (result And &HFF))
End Function
End Class

View File

@@ -0,0 +1,5 @@
Public Interface IDataPacket
Function FillPacket(cmd As Byte, param() As Byte) As Byte()
Function CheckPacket(packet() As Byte) As Boolean
End Interface

View File

@@ -0,0 +1,194 @@
Imports System.Net
Public Class UtsWebPacket
Implements IDataPacket
Private _packetSn As Integer
Sub New()
_packetSn = 0
End Sub
Public Function FillPacket(cmd As Byte) As Byte()
Dim packet(PacketBits.Command) As Byte
packet(PacketBits.Head) = &HAA
packet(PacketBits.SerialNumber) = CByte(_packetSn)
packet(PacketBits.ParamLength) = &H0
packet(PacketBits.ParamLength + 1) = &H0
packet(PacketBits.CheckValue) = &H0
packet(PacketBits.Command) = cmd
packet(PacketBits.CheckValue) = CheckSum.GetPacketCheck(packet)
_packetSn += 1
If _packetSn > &HFF Then _packetSn = 0
Return packet
End Function
''' <summary>
''' 用于填充发送包
''' </summary>
''' <param name="cmd">发送包命令</param>
''' <param name="param">发送包参数</param>
''' <returns></returns>
Public Function FillPacket(cmd As Byte, param() As Byte) As Byte() Implements IDataPacket.FillPacket
Dim packet(PacketBits.Command + param.Length) As Byte
packet(PacketBits.Head) = &HAA
packet(PacketBits.SerialNumber) = CByte(_packetSn)
Array.Copy(BitConverter.GetBytes(CShort(param.Length)), 0, packet, PacketBits.ParamLength, 2)
packet(PacketBits.CheckValue) = &H0
packet(PacketBits.Command) = cmd
Array.Copy(param, 0, packet, PacketBits.Param, param.Length)
packet(PacketBits.CheckValue) = CheckSum.GetPacketCheck(packet)
_packetSn += 1
If _packetSn > &HFF Then _packetSn = 0
Return packet
End Function
''' <summary>
''' 一般用于填充回复包
''' </summary>
''' <param name="sn">接收包序号</param>
''' <param name="cmd">接收包命令</param>
''' <param name="param">回复包参数</param>
''' <returns></returns>
Public Function FillPacket(sn As Byte, cmd As Byte, param() As Byte) As Byte()
Dim packet(PacketBits.Command + param.Length) As Byte
packet(PacketBits.Head) = &HAA
packet(PacketBits.SerialNumber) = sn
Array.Copy(BitConverter.GetBytes(CShort(param.Length)), 0, packet, PacketBits.ParamLength, 2)
packet(PacketBits.CheckValue) = &H0
packet(PacketBits.Command) = cmd
Array.Copy(param, 0, packet, PacketBits.Param, param.Length)
packet(PacketBits.CheckValue) = CheckSum.GetPacketCheck(packet)
Return packet
End Function
Public Function CheckPacket(packet() As Byte) As Boolean Implements IDataPacket.CheckPacket
If packet(PacketBits.Head) <> &HAA Then
Throw New Exception($"Invalid Packet Head!Src:{packet(PacketBits.Head)} Dest:{&HAA}")
End If
'If packet(PacketBits.SerialNumber) <> _packetSn Then
' Throw New Exception($"Invalid Packet Sn!Src: {packet(PacketBits.SerialNumber)} Dest:{_packetSn}")
'End If
Dim destLength As Integer = packet.Length - PacketBits.Param
If BitConverter.ToInt16(packet, PacketBits.ParamLength) <> destLength Then
Throw New Exception($"Invalid Packet Lengnt!Src:{packet(PacketBits.ParamLength)} Dest:{destLength}")
End If
If CheckSum.GetPacketCheck(packet) <> &H0 Then
Throw New Exception($"Invalid Packet CheckValue!Src:{BitConverter.ToString(packet)}")
End If
Return True
End Function
Enum PacketBits
''' <summary>包头</summary>
Head
''' <summary>序号</summary>
SerialNumber
''' <summary>包长,两位,小端模式</summary>
ParamLength
''' <summary>校验</summary>
CheckValue = ParamLength + 2
''' <summary>命令</summary>
Command
''' <summary>参数</summary>
Param
End Enum
<Flags>
Enum Commands
''' <summary>心跳包</summary>
Heartbeat = &H1
''' <summary>设置日志上报</summary>
SetLogType = &H2
''' <summary>读取日志上报</summary>
GetLogType = &H3
''' <summary>服务任务状态变化时,主动上报状态</summary>
UploadTaskStatus = &H10
''' <summary>增加服务任务</summary>
AddServiceTask = &H11
''' <summary>删除服务任务</summary>
DelServiceTask = &H12
''' <summary>获取服务任务</summary>
GetServiceTask = &H13
''' <summary>设置服务任务</summary>
SetServiceTask = &H14
''' <summary>开启服务任务</summary>
StartServiceTask = &H15
''' <summary>停止服务任务</summary>
StopServiceTask = &H16
''' <summary>重启服务任务</summary>
RestartServiceTask = &H17
''' <summary>上传文件</summary>
UploadFile = &H21
''' <summary>读取指定文件大小</summary>
ReadFileSize = &H22
''' <summary>App状态变化时主动上报状态</summary>
UploadAppStatus = &H30
''' <summary>获取App状态</summary>
GetAppStatus = &H31
''' <summary>设置App状态</summary>
SetAppStatus = &H32
End Enum
Public Class PublicIpChangedEventArgs
Inherits EventArgs
Sub New(ip As IPAddress)
PublicIP = ip
End Sub
Public Property PublicIP As IPAddress
End Class
Public Class AddTaskEventArgs
Inherits EventArgs
Sub New(jsonString As String)
Me.JsonString = jsonString
End Sub
Public Property JsonString As String
End Class
End Class

View File

@@ -0,0 +1,248 @@
'Imports System.Net
'Imports System.Net.Sockets
'Public Class WebService
' Implements IDisposable
' Enum PacketDataEnum
' Head
' SerialNumber
' ParamLength
' CheckValue
' Command
' Param
' End Enum
' <Flags()>
' Enum PacketSendCmdEnum
' Heartbeat = &H1
' End Enum
' <Flags()>
' Enum PacketReceiveCmdEnum
' Heartbeat = &HA1
' End Enum
' Private _localPublicIp As String
' Private ReadOnly _udpClient As UdpClient
' Private _sendPacketSn As Integer
' Private ReadOnly _hostName As String
' Private ReadOnly _remotePort As Integer
' Private _online As Boolean
' Private _failCount As Integer
' Sub New(hostName As String, port As Integer)
' _hostName = hostName
' _remotePort = port
' _udpClient = New UdpClient()
' _sendPacketSn = 0
' RetryCount = 2
' RetryInterval = 5
' WaitRelayTimeout = 2000
' _online = False
' _localPublicIp = String.Empty
' End Sub
' Public ReadOnly Property LocalPublicIp() As String
' Get
' Return _localPublicIp
' End Get
' End Property
' Public ReadOnly Property Online() As Boolean
' Get
' Return _online
' End Get
' End Property
' ''' <summary>
' ''' 重试次数不包含第一次发送次数默认值2
' ''' </summary>
' ''' <returns></returns>
' Public Property RetryCount() As Integer
' ''' <summary>
' ''' 重试间隔,单位ms默认5ms
' ''' </summary>
' ''' <returns></returns>
' Public Property RetryInterval() As Integer
' ''' <summary>
' ''' 等待接收超时时间,单位ms,默认2000ms
' ''' </summary>
' ''' <returns></returns>
' Public Property WaitRelayTimeout() As Integer
' Public Sub SendHeartbeatPacket(serviceIndex As Integer)
' Dim sendByte() As Byte = FillPacket(CByte(PacketSendCmdEnum.Heartbeat), BitConverter.GetBytes(serviceIndex))
' Send(sendByte)
' End Sub
' Public Function FillPacket(cmd As Byte, param() As Byte) As Byte()
' Dim result(PacketDataEnum.Command + param.Length) As Byte
' result(PacketDataEnum.Head) = &HAA
' result(PacketDataEnum.SerialNumber) = CByte(_sendPacketSn)
' result(PacketDataEnum.ParamLength) = CByte(param.Length)
' result(PacketDataEnum.CheckValue) = &H0
' result(PacketDataEnum.Command) = cmd
' Array.Copy(param, 0, result, PacketDataEnum.Param, param.Length)
' result(PacketDataEnum.CheckValue) = GetCheckSum(result)
' Return result
' End Function
' Public Sub Send(packet() As Byte)
' Static receivedReply As Boolean = False
' Static waitReplyStartTime As DateTime
' receivedReply = False
' For i As Integer = 0 To RetryCount
' _udpClient.Send(packet, packet.Length, _hostName, _remotePort)
' waitReplyStartTime = Now
' While receivedReply = False AndAlso (Now - waitReplyStartTime).TotalMilliseconds < WaitRelayTimeout
' If _udpClient.Available <= 0 Then
' Threading.Thread.Sleep(50)
' Continue While
' End If
' Dim ep As IPEndPoint = Nothing
' Dim receiveByte() As Byte = _udpClient.Receive(ep)
' '校验
' Try
' CheckPacket(receiveByte)
' Catch ex As Exception
' ApplicationLog.WriteErrorLog($"Check Receive Data Error:{ex.Message}")
' Continue While
' End Try
' '处理
' Try
' DealPacket(receiveByte)
' Catch ex As Exception
' ApplicationLog.WriteErrorLog($"Deal Receive Data Error:{ex.Message}")
' Continue While
' End Try
' receivedReply = True
' End While
' If receivedReply Then
' Exit For
' End If
' Threading.Thread.Sleep(RetryInterval)
' Next
' If _sendPacketSn + 1 >= 256 Then
' _sendPacketSn = 0
' Else
' _sendPacketSn += 1
' End If
' If receivedReply = False Then
' _failCount += 1
' If _failCount >= 3 Then
' _failCount = 3
' _online = False
' End If
' Else
' _failCount = 0
' _online = True
' End If
' End Sub
' Private Sub CheckPacket(packet() As Byte)
' If packet(PacketDataEnum.Head) <> &HAA Then
' Throw New Exception($"Invalid Packet Head!Src:{packet(PacketDataEnum.Head)} Dest:{&HAA}")
' End If
' If packet(PacketDataEnum.SerialNumber) <> _sendPacketSn Then
' Throw New Exception($"Invalid Packet Sn!Src: {packet(PacketDataEnum.SerialNumber)} Dest:{_sendPacketSn}")
' End If
' Dim destLength As Integer = packet.Length - PacketDataEnum.Param
' If packet(PacketDataEnum.ParamLength) <> destLength Then
' Throw New Exception($"Invalid Packet Lengnt!Src:{packet(PacketDataEnum.ParamLength)} Dest:{destLength}")
' End If
' If GetBytesSum(packet) <> &HFF Then
' Throw New Exception($"Invalid Packet CheckValue!Src:{BitConverter.ToString(packet)}")
' End If
' End Sub
' Private Function GetCheckSum(packet() As Byte) As Byte
' Dim result As Integer
' For Each b As Byte In packet
' result += b
' result = result And &HFF
' Next
' Return CByte(&HFF - result)
' End Function
' Private Function GetBytesSum(packet() As Byte) As Byte
' Dim result As Integer
' For Each b As Byte In packet
' result += b
' result = result And &HFF
' Next
' Return CByte(result)
' End Function
' Public Sub DealPacket(packet() As Byte)
' Select Case packet(PacketDataEnum.Command)
' Case CByte(PacketReceiveCmdEnum.Heartbeat)
' DealHeartbeatPacket(packet)
' Case Else
' Throw New Exception($"Unknown Command:{packet(PacketDataEnum.Command)}")
' End Select
' End Sub
' Private Sub DealHeartbeatPacket(packet() As Byte)
' Dim tmpIp As String
' tmpIp = $"{packet(PacketDataEnum.Param)}.{packet(PacketDataEnum.Param + 1)}.{packet(PacketDataEnum.Param + 2)}.{packet(PacketDataEnum.Param + 3)}"
' If String.Compare(LocalPublicIp,tmpIp) <> 0 Then
' _localPublicIp = tmpIp
' End If
' End Sub
' Public Sub Dispose() Implements IDisposable.Dispose
' _udpClient.Dispose()
' End Sub
'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

View File

@@ -0,0 +1,140 @@
<?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>{8FC266CE-FD61-4622-8B3C-9F6FFFD09A0C}</ProjectGuid>
<OutputType>WinExe</OutputType>
<StartupObject>AUTS_ProductEntry.My.MyApplication</StartupObject>
<RootNamespace>AUTS_ProductEntry</RootNamespace>
<AssemblyName>AUTS_ProductEntry</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_ProductEntry.xml</DocumentationFile>
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
</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_ProductEntry.xml</DocumentationFile>
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
</PropertyGroup>
<PropertyGroup>
<OptionExplicit>On</OptionExplicit>
</PropertyGroup>
<PropertyGroup>
<OptionCompare>Binary</OptionCompare>
</PropertyGroup>
<PropertyGroup>
<OptionStrict>Off</OptionStrict>
</PropertyGroup>
<PropertyGroup>
<OptionInfer>On</OptionInfer>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>iconfinder_60_973992.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Data.SQLite, Version=1.0.112.1, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\System.Data.SQLite.dll</HintPath>
</Reference>
<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>
<Content Include="iconfinder_60_973992.ico" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\UTS_Core\UTS_Core.vbproj">
<Project>{33c6456c-f00d-41ac-a6fb-db0601495c6a}</Project>
<Name>UTS_Core</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
</Project>

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="AUTS_ProductEntry.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<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>
<userSettings>
<AUTS_ProductEntry.My.MySettings>
<setting name="ProductionLine" serializeAs="String">
<value />
</setting>
<setting name="Project" serializeAs="String">
<value />
</setting>
<setting name="ProcessStation" serializeAs="String">
<value />
</setting>
</AUTS_ProductEntry.My.MySettings>
</userSettings>
</configuration>

278
AUTS_ProductEntry/FrmMain.Designer.vb generated Normal file
View File

@@ -0,0 +1,278 @@
<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.lab_Result = New System.Windows.Forms.Label()
Me.lab_ModelName = New System.Windows.Forms.Label()
Me.GroupBox3 = New System.Windows.Forms.GroupBox()
Me.RtxLog = New System.Windows.Forms.RichTextBox()
Me.StatusStrip1 = New System.Windows.Forms.StatusStrip()
Me.TssLblProductionLine = New System.Windows.Forms.ToolStripStatusLabel()
Me.TssLblStaion = New System.Windows.Forms.ToolStripStatusLabel()
Me.TsLblCheckSum = New System.Windows.Forms.ToolStripStatusLabel()
Me.TssLblInvalidCount = New System.Windows.Forms.ToolStripStatusLabel()
Me.TssLblValidCount = New System.Windows.Forms.ToolStripStatusLabel()
Me.TssLblPassCount = New System.Windows.Forms.ToolStripStatusLabel()
Me.TssLblFailCount = New System.Windows.Forms.ToolStripStatusLabel()
Me.TssLblYield = New System.Windows.Forms.ToolStripStatusLabel()
Me.GroupBox4 = New System.Windows.Forms.GroupBox()
Me.CboProductionLines = New System.Windows.Forms.ComboBox()
Me.GroupBox1 = New System.Windows.Forms.GroupBox()
Me.TxtFirstRecord = New System.Windows.Forms.TextBox()
Me.btn_OpenProject = New System.Windows.Forms.Button()
Me.btn_StartProgramming = New System.Windows.Forms.Button()
Me.GroupBox3.SuspendLayout
Me.StatusStrip1.SuspendLayout
Me.GroupBox4.SuspendLayout
Me.GroupBox1.SuspendLayout
Me.SuspendLayout
'
'lab_Result
'
Me.lab_Result.BackColor = System.Drawing.Color.Black
Me.lab_Result.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
Me.lab_Result.Font = New System.Drawing.Font("Consolas", 48!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0,Byte))
Me.lab_Result.ForeColor = System.Drawing.Color.FromArgb(CType(CType(0,Byte),Integer), CType(CType(192,Byte),Integer), CType(CType(0,Byte),Integer))
Me.lab_Result.Location = New System.Drawing.Point(0, 95)
Me.lab_Result.Name = "lab_Result"
Me.lab_Result.Size = New System.Drawing.Size(404, 201)
Me.lab_Result.TabIndex = 13
Me.lab_Result.Text = "PASS"
Me.lab_Result.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
'
'lab_ModelName
'
Me.lab_ModelName.BackColor = System.Drawing.SystemColors.ActiveCaption
Me.lab_ModelName.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
Me.lab_ModelName.Font = New System.Drawing.Font("Consolas", 27.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0,Byte))
Me.lab_ModelName.Location = New System.Drawing.Point(0, -1)
Me.lab_ModelName.Name = "lab_ModelName"
Me.lab_ModelName.Size = New System.Drawing.Size(404, 85)
Me.lab_ModelName.TabIndex = 12
Me.lab_ModelName.Text = "SW-570"
Me.lab_ModelName.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
'
'GroupBox3
'
Me.GroupBox3.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles)
Me.GroupBox3.Controls.Add(Me.RtxLog)
Me.GroupBox3.Font = New System.Drawing.Font("宋体", 12!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134,Byte))
Me.GroupBox3.Location = New System.Drawing.Point(0, 302)
Me.GroupBox3.Name = "GroupBox3"
Me.GroupBox3.Size = New System.Drawing.Size(740, 257)
Me.GroupBox3.TabIndex = 17
Me.GroupBox3.TabStop = false
Me.GroupBox3.Text = "录入记录"
'
'RtxLog
'
Me.RtxLog.BorderStyle = System.Windows.Forms.BorderStyle.None
Me.RtxLog.Dock = System.Windows.Forms.DockStyle.Fill
Me.RtxLog.Location = New System.Drawing.Point(3, 22)
Me.RtxLog.Name = "RtxLog"
Me.RtxLog.Size = New System.Drawing.Size(734, 232)
Me.RtxLog.TabIndex = 0
Me.RtxLog.Text = ""
'
'StatusStrip1
'
Me.StatusStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.TssLblProductionLine, Me.TssLblStaion, Me.TsLblCheckSum, Me.TssLblInvalidCount, Me.TssLblValidCount, Me.TssLblPassCount, Me.TssLblFailCount, Me.TssLblYield})
Me.StatusStrip1.Location = New System.Drawing.Point(0, 563)
Me.StatusStrip1.Name = "StatusStrip1"
Me.StatusStrip1.Size = New System.Drawing.Size(742, 22)
Me.StatusStrip1.TabIndex = 19
Me.StatusStrip1.Text = "StatusStrip1"
'
'TssLblProductionLine
'
Me.TssLblProductionLine.ForeColor = System.Drawing.Color.Black
Me.TssLblProductionLine.Name = "TssLblProductionLine"
Me.TssLblProductionLine.Size = New System.Drawing.Size(44, 17)
Me.TssLblProductionLine.Text = "A-Line"
'
'TssLblStaion
'
Me.TssLblStaion.ForeColor = System.Drawing.Color.Black
Me.TssLblStaion.Name = "TssLblStaion"
Me.TssLblStaion.Size = New System.Drawing.Size(68, 17)
Me.TssLblStaion.Text = "BLV-12 A1"
'
'TsLblCheckSum
'
Me.TsLblCheckSum.Name = "TsLblCheckSum"
Me.TsLblCheckSum.Size = New System.Drawing.Size(64, 17)
Me.TsLblCheckSum.Text = "Sum:0000"
'
'TssLblInvalidCount
'
Me.TssLblInvalidCount.Name = "TssLblInvalidCount"
Me.TssLblInvalidCount.Size = New System.Drawing.Size(77, 17)
Me.TssLblInvalidCount.Text = "Invalid:0000"
'
'TssLblValidCount
'
Me.TssLblValidCount.Name = "TssLblValidCount"
Me.TssLblValidCount.Size = New System.Drawing.Size(68, 17)
Me.TssLblValidCount.Text = "Valid:0000"
'
'TssLblPassCount
'
Me.TssLblPassCount.Name = "TssLblPassCount"
Me.TssLblPassCount.Size = New System.Drawing.Size(65, 17)
Me.TssLblPassCount.Text = "Pass:0000"
'
'TssLblFailCount
'
Me.TssLblFailCount.Name = "TssLblFailCount"
Me.TssLblFailCount.Size = New System.Drawing.Size(58, 17)
Me.TssLblFailCount.Text = "Fail:0000"
'
'TssLblYield
'
Me.TssLblYield.Name = "TssLblYield"
Me.TssLblYield.Size = New System.Drawing.Size(81, 17)
Me.TssLblYield.Text = "Yield:00.00%"
'
'GroupBox4
'
Me.GroupBox4.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles)
Me.GroupBox4.Controls.Add(Me.CboProductionLines)
Me.GroupBox4.Font = New System.Drawing.Font("微软雅黑", 18!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134,Byte))
Me.GroupBox4.Location = New System.Drawing.Point(410, -1)
Me.GroupBox4.Name = "GroupBox4"
Me.GroupBox4.Size = New System.Drawing.Size(320, 85)
Me.GroupBox4.TabIndex = 23
Me.GroupBox4.TabStop = false
Me.GroupBox4.Text = "产线"
'
'CboProductionLines
'
Me.CboProductionLines.Dock = System.Windows.Forms.DockStyle.Fill
Me.CboProductionLines.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
Me.CboProductionLines.Font = New System.Drawing.Font("Consolas", 20.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0,Byte))
Me.CboProductionLines.ForeColor = System.Drawing.Color.Gray
Me.CboProductionLines.FormattingEnabled = true
Me.CboProductionLines.Items.AddRange(New Object() {"Q1", "Q2", "Q3", "Q4"})
Me.CboProductionLines.Location = New System.Drawing.Point(3, 35)
Me.CboProductionLines.Name = "CboProductionLines"
Me.CboProductionLines.Size = New System.Drawing.Size(314, 40)
Me.CboProductionLines.TabIndex = 0
Me.CboProductionLines.TabStop = false
'
'GroupBox1
'
Me.GroupBox1.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles)
Me.GroupBox1.Controls.Add(Me.TxtFirstRecord)
Me.GroupBox1.Font = New System.Drawing.Font("微软雅黑", 18!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134,Byte))
Me.GroupBox1.Location = New System.Drawing.Point(410, 81)
Me.GroupBox1.Name = "GroupBox1"
Me.GroupBox1.Size = New System.Drawing.Size(320, 112)
Me.GroupBox1.TabIndex = 22
Me.GroupBox1.TabStop = false
Me.GroupBox1.Text = "成品序号"
'
'TxtFirstRecord
'
Me.TxtFirstRecord.Dock = System.Windows.Forms.DockStyle.Fill
Me.TxtFirstRecord.Font = New System.Drawing.Font("Consolas", 20.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0,Byte))
Me.TxtFirstRecord.ImeMode = System.Windows.Forms.ImeMode.Disable
Me.TxtFirstRecord.Location = New System.Drawing.Point(3, 35)
Me.TxtFirstRecord.Name = "TxtFirstRecord"
Me.TxtFirstRecord.Size = New System.Drawing.Size(314, 39)
Me.TxtFirstRecord.TabIndex = 1
Me.TxtFirstRecord.TextAlign = System.Windows.Forms.HorizontalAlignment.Center
'
'btn_OpenProject
'
Me.btn_OpenProject.Font = New System.Drawing.Font("微软雅黑", 20.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134,Byte))
Me.btn_OpenProject.Location = New System.Drawing.Point(410, 204)
Me.btn_OpenProject.Name = "btn_OpenProject"
Me.btn_OpenProject.Size = New System.Drawing.Size(140, 92)
Me.btn_OpenProject.TabIndex = 21
Me.btn_OpenProject.Text = "选择项目"
Me.btn_OpenProject.UseVisualStyleBackColor = true
'
'btn_StartProgramming
'
Me.btn_StartProgramming.Font = New System.Drawing.Font("微软雅黑", 24!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134,Byte))
Me.btn_StartProgramming.ForeColor = System.Drawing.Color.Blue
Me.btn_StartProgramming.Location = New System.Drawing.Point(571, 204)
Me.btn_StartProgramming.Name = "btn_StartProgramming"
Me.btn_StartProgramming.Size = New System.Drawing.Size(159, 92)
Me.btn_StartProgramming.TabIndex = 20
Me.btn_StartProgramming.Text = "开始录入"
Me.btn_StartProgramming.UseVisualStyleBackColor = true
'
'FrmMain
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6!, 12!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(742, 585)
Me.Controls.Add(Me.GroupBox4)
Me.Controls.Add(Me.GroupBox1)
Me.Controls.Add(Me.btn_OpenProject)
Me.Controls.Add(Me.btn_StartProgramming)
Me.Controls.Add(Me.StatusStrip1)
Me.Controls.Add(Me.GroupBox3)
Me.Controls.Add(Me.lab_Result)
Me.Controls.Add(Me.lab_ModelName)
Me.Icon = CType(resources.GetObject("$this.Icon"),System.Drawing.Icon)
Me.Name = "FrmMain"
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
Me.Text = "Form1"
Me.GroupBox3.ResumeLayout(false)
Me.StatusStrip1.ResumeLayout(false)
Me.StatusStrip1.PerformLayout
Me.GroupBox4.ResumeLayout(false)
Me.GroupBox1.ResumeLayout(false)
Me.GroupBox1.PerformLayout
Me.ResumeLayout(false)
Me.PerformLayout
End Sub
Friend WithEvents lab_Result As Label
Friend WithEvents lab_ModelName As Label
Friend WithEvents GroupBox3 As GroupBox
Friend WithEvents RtxLog As RichTextBox
Friend WithEvents StatusStrip1 As StatusStrip
Friend WithEvents TssLblProductionLine As ToolStripStatusLabel
Friend WithEvents TssLblStaion As ToolStripStatusLabel
Friend WithEvents TsLblCheckSum As ToolStripStatusLabel
Friend WithEvents TssLblInvalidCount As ToolStripStatusLabel
Friend WithEvents TssLblValidCount As ToolStripStatusLabel
Friend WithEvents TssLblPassCount As ToolStripStatusLabel
Friend WithEvents TssLblFailCount As ToolStripStatusLabel
Friend WithEvents TssLblYield As ToolStripStatusLabel
Friend WithEvents GroupBox4 As GroupBox
Friend WithEvents CboProductionLines As ComboBox
Friend WithEvents GroupBox1 As GroupBox
Friend WithEvents TxtFirstRecord As TextBox
Friend WithEvents btn_OpenProject As Button
Friend WithEvents btn_StartProgramming As Button
End Class

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,207 @@
Imports UTS_Core.UTSModule
Imports UTS_Core.UTSModule.Test
Public Class FrmMain
Implements IProcessStation
Implements IProductionLine
Private _utsApp As UtsAppForm
Public Sub ProductionLineChanged() Implements IProductionLine.ProductionLineChanged
TssLblProductionLine.Text = CboProductionLines.Text
My.Settings.ProductionLine = CboProductionLines.Text
End Sub
Public Sub StationChanged() Implements IProcessStation.StationChanged
My.Settings.Project = _utsApp.ProcessStation.ParentProject.Name
My.Settings.ProcessStation = _utsApp.ProcessStation.Name
UpdateStation(_utsApp.ProcessStation.ParentProject.Name, _utsApp.ProcessStation.Name)
End Sub
Public Sub UpdateStation(projectName As String, stationName As String)
If String.IsNullOrWhiteSpace(projectName) OrElse
String.IsNullOrWhiteSpace(stationName) Then
TssLblStaion.Text = $"Invalid Station"
Else
TssLblStaion.Text = $"{projectName} - {stationName}"
lab_ModelName.Text = $"{projectName} - {stationName}"
End If
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
'自动保存设置
My.Application.SaveMySettingsOnExit = True
'初始化UTS窗体信息,失败则关闭窗体
If InitializeUtsApp() = False Then Return
'初始化界面信息
InitializeForm()
End Sub
Private Function InitializeUtsApp() As Boolean
_utsApp = UtsAppForm.CreateSingleton
Try
If _utsApp.IsInitialized = False Then
_utsApp.AddStatisticsObserver(Me)
_utsApp.Initialize()
_utsApp.LoadStation(My.Settings.Project, My.Settings.ProcessStation)
End If
Catch ex As Exception
MsgBox($"Initialize UTSForm Error:{ex.Message}")
Close()
Return False
End Try
Return True
End Function
Private Sub InitializeForm()
CboProductionLines.Items.Clear()
CboProductionLines.Items.AddRange(_utsApp.ProductionLines.GetLineNames())
CboProductionLines.SelectedIndex = CboProductionLines.Items.IndexOf(My.Settings.ProductionLine)
TxtFirstRecord.Clear()
RtxLog.Clear()
Text = $"{Application.ProductName} {Application.ProductVersion} User:{_utsApp.Account.UserName}"
End Sub
Private Sub CboProductionLine_DropDown(sender As Object, e As EventArgs) Handles CboProductionLines.DropDown
'填充内容
CboProductionLines.Items.Clear()
CboProductionLines.Items.AddRange(_utsApp.ProductionLines.GetLineNames())
End Sub
Private Sub CboProductionLines_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CboProductionLines.SelectedIndexChanged
ProductionLineChanged()
End Sub
Private Sub Btn_OpenProject_Click(sender As Object, e As EventArgs) Handles btn_OpenProject.Click
Try
_utsApp.ChangeStation()
Catch ex As Exception
MsgBox($"ChangeStation Error:{ex.Message}")
End Try
End Sub
Private Sub Tb_FirstRecord_KeyDown(sender As Object, e As KeyEventArgs) Handles TxtFirstRecord.KeyDown
If e.KeyCode = Keys.Enter Then
SaveTestResult()
e.SuppressKeyPress = True
e.Handled = True
End If
End Sub
Private Sub Btn_StartProgramming_Click(sender As Object, e As EventArgs) Handles btn_StartProgramming.Click
SaveTestResult()
End Sub
Private Sub SaveTestResult()
If _utsApp.ProcessStation Is Nothing Then
MsgBox($"请选择项目与测试站后再尝试录入!")
Return
End If
If String.IsNullOrWhiteSpace(CboProductionLines.Text) Then
MsgBox($"请选择生产线后再尝试录入!")
Return
End If
Dim barcodeString As String = TxtFirstRecord.Text
If String.IsNullOrWhiteSpace(barcodeString) Then
MsgBox($"请输入PCB序号")
Return
End If
Dim saveDb As Boolean
Try
FillTestResult(barcodeString)
_utsApp.CommitTestResult(uniqueRecord:=True)
saveDb = True
Catch ex As Exception
MessageBox.Show($"测试结果录入失败:{ex.Message}", $"录入异常", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
saveDb = False
End Try
Static inputCount As Integer = 0
inputCount += 1 : If inputCount > 9999 Then inputCount = 0
RtxLog.SelectionStart = 0
RtxLog.SelectionLength = RtxLog.TextLength
RtxLog.SelectionColor = Color.Gray
If saveDb Then
lab_Result.ForeColor = Color.Green
lab_Result.Text = $"{barcodeString}{vbCrLf}Pass"
RtxLog.SelectionStart = RtxLog.TextLength
RtxLog.SelectionColor = Color.Green
AppendRecord($"{inputCount:D4}.BarcodeSn:{barcodeString},录入成功!")
Else
lab_Result.ForeColor = Color.Red
lab_Result.Text = $"{barcodeString}{vbCrLf}Fail"
RtxLog.SelectionStart = RtxLog.TextLength
RtxLog.SelectionColor = Color.Red
AppendRecord($"{inputCount:D4}.BarcodeSn:{barcodeString},录入失败!")
End If
TxtFirstRecord.Focus()
TxtFirstRecord.SelectAll()
End Sub
Public Sub AppendRecord(logString As String)
If RtxLog.InvokeRequired Then '判断是否需要开委托
RtxLog.Invoke(New Action(Of String)(AddressOf AppendRecord), New Object() {logString})
Return
End If
With RtxLog
If .Lines.Length > 256 Then '超过上限则移除最初行内容
.ReadOnly = False
.SelectionStart = 0
.SelectionLength = .GetFirstCharIndexFromLine(1)
.SelectedText = String.Empty
.ReadOnly = True
.SelectionStart = .TextLength
End If
.AppendText($"{Now:yyyy:MM:dd HH:mm:ss} - {logString}{vbNewLine}")
.ScrollToCaret()
End With
End Sub
''' <summary>
''' 填充测试记录内容,每个应用程序这个部分有所差异
''' </summary>
Public Sub FillTestResult(barcodeString As String)
_utsApp.TestResult.ResetTestResult()
'产线索引
Dim lineID As Integer = _utsApp.ProductionLines(CboProductionLines.Text).ID
_utsApp.TestResult.ProductionLineID = lineID
'测试开始时间
_utsApp.TestResult.StartTime = Now
_utsApp.TestResult.DUT_SN = barcodeString
_utsApp.TestResult.TestResult = TestResult.TestResultEnum.Pass
End Sub
Private Sub lab_ModelName_Click(sender As Object, e As EventArgs) Handles lab_ModelName.Click
Try
DbConnect.DbConnector.SaveTestLogToRemote(UtsDb.RemotePrivateDb, "", Nothing, Nothing)
Catch ex As Exception
Console.WriteLine($"Save Error:{ex.Message}")
End Try
End Sub
End Class

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_ProductEntry.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_ProductEntry")>
<Assembly: AssemblyDescription("")>
<Assembly: AssemblyCompany("")>
<Assembly: AssemblyProduct("AUTS_ProductEntry")>
<Assembly: AssemblyCopyright("Copyright © 2021")>
<Assembly: AssemblyTrademark("")>
<Assembly: ComVisible(False)>
'如果此项目向 COM 公开,则下列 GUID 用于 typelib 的 ID
<Assembly: Guid("26fb9525-133d-47eb-9ba1-0f1bb96eb661")>
' 程序集的版本信息由下列四个值组成:
'
' 主版本
' 次版本
' 生成号
' 修订号
'
'可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
'通过使用 "*",如下所示:
' <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_ProductEntry.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,109 @@
'------------------------------------------------------------------------------
' <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
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("")> _
Public Property ProductionLine() As String
Get
Return CType(Me("ProductionLine"),String)
End Get
Set
Me("ProductionLine") = value
End Set
End Property
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("")> _
Public Property Project() As String
Get
Return CType(Me("Project"),String)
End Get
Set
Me("Project") = value
End Set
End Property
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("")> _
Public Property ProcessStation() As String
Get
Return CType(Me("ProcessStation"),String)
End Get
Set
Me("ProcessStation") = value
End Set
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_ProductEntry.My.MySettings
Get
Return Global.AUTS_ProductEntry.My.MySettings.Default
End Get
End Property
End Module
End Namespace

View File

@@ -0,0 +1,15 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="My" GeneratedClassName="MySettings" UseMySettingsClassName="true">
<Profiles />
<Settings>
<Setting Name="ProductionLine" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="Project" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="ProcessStation" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
</Settings>
</SettingsFile>

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

View File

@@ -0,0 +1,194 @@
<?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>{DA8F65CE-2AE0-41F5-9BA8-27BAFDA270F8}</ProjectGuid>
<OutputType>WinExe</OutputType>
<StartupObject>AUTS_Repair.My.MyApplication</StartupObject>
<RootNamespace>AUTS_Repair</RootNamespace>
<AssemblyName>AUTS_Repair</AssemblyName>
<FileAlignment>512</FileAlignment>
<MyType>WindowsForms</MyType>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</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_Repair.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_Repair.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>1287509_tools_configuration_control_options_repair_icon.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="FlexCell, Version=4.7.0.0, Culture=neutral, PublicKeyToken=6f86587eb70ee309, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>C:\Program Files (x86)\FlexCell Technologies\FlexCell.NET4\bin\FlexCell.dll</HintPath>
</Reference>
<Reference Include="FluentFTP, Version=33.0.3.0, Culture=neutral, PublicKeyToken=f4af092b1d8df44f, processorArchitecture=MSIL">
<HintPath>..\packages\FluentFTP.33.0.3\lib\net45\FluentFTP.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.4.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.6.0\lib\net462\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Drawing.Common, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Drawing.Common.6.0.0\lib\net461\System.Drawing.Common.dll</HintPath>
</Reference>
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
</Reference>
<Reference Include="System.Web" />
<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" />
<Reference Include="TeeChart, Version=4.1.2017.2153, Culture=neutral, PublicKeyToken=9c8126276c77bdb7, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Debug\TeeChart.dll</HintPath>
</Reference>
</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="Form1.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.vb">
<DependentUpon>Form1.vb</DependentUpon>
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmCheckLog.Designer.vb">
<DependentUpon>FrmCheckLog.vb</DependentUpon>
</Compile>
<Compile Include="FrmCheckLog.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmImage.Designer.vb">
<DependentUpon>FrmImage.vb</DependentUpon>
</Compile>
<Compile Include="FrmImage.vb">
<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="Form1.resx">
<DependentUpon>Form1.vb</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmCheckLog.resx">
<DependentUpon>FrmCheckLog.vb</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmImage.resx">
<DependentUpon>FrmImage.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" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<Content Include="1287509_tools_configuration_control_options_repair_icon.ico" />
<None Include="bin\Debug\RepairImage\NoImg40_30.png" />
<None Include="Resources\NoImagePreview.bmp" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\UTS_Core\UTS_Core.vbproj">
<Project>{33C6456C-F00D-41AC-A6FB-DB0601495C6A}</Project>
<Name>UTS_Core</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
</Project>

26
AUTS_Repair/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>

933
AUTS_Repair/Form1.Designer.vb generated Normal file
View File

@@ -0,0 +1,933 @@
<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()
Me.components = New System.ComponentModel.Container()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(FrmMain))
Me.StatusStrip1 = New System.Windows.Forms.StatusStrip()
Me.SplitContainer1 = New System.Windows.Forms.SplitContainer()
Me.TabRepairSource = New System.Windows.Forms.TabControl()
Me.TabPage8 = New System.Windows.Forms.TabPage()
Me.GroupBox2 = New System.Windows.Forms.GroupBox()
Me.TxtDevSn = New System.Windows.Forms.TextBox()
Me.GroupBox3 = New System.Windows.Forms.GroupBox()
Me.TvwTestLog = New System.Windows.Forms.TreeView()
Me.lblPassFailDisplay = New System.Windows.Forms.Label()
Me.TabPage9 = New System.Windows.Forms.TabPage()
Me.GroupBox5 = New System.Windows.Forms.GroupBox()
Me.TvwTestLog_Request = New System.Windows.Forms.TreeView()
Me.GroupBox4 = New System.Windows.Forms.GroupBox()
Me.PictureBox1 = New System.Windows.Forms.PictureBox()
Me.TvwRepairRequest = New System.Windows.Forms.TreeView()
Me.GroupBox1 = New System.Windows.Forms.GroupBox()
Me.TxtMarketSn = New System.Windows.Forms.TextBox()
Me.SplitContainer2 = New System.Windows.Forms.SplitContainer()
Me.GrpTestLog = New System.Windows.Forms.GroupBox()
Me.BtnCheckTest = New System.Windows.Forms.Button()
Me.TabControl2 = New System.Windows.Forms.TabControl()
Me.TabPage6 = New System.Windows.Forms.TabPage()
Me.GrdSnRecord = New FlexCell.Grid()
Me.TabPage3 = New System.Windows.Forms.TabPage()
Me.GrdAllRecord = New FlexCell.Grid()
Me.TabPage4 = New System.Windows.Forms.TabPage()
Me.GrdPassRecord = New FlexCell.Grid()
Me.TabPage5 = New System.Windows.Forms.TabPage()
Me.GrdFailRecord = New FlexCell.Grid()
Me.GrpRepairLog = New System.Windows.Forms.GroupBox()
Me.BtnCheckRepair = New System.Windows.Forms.Button()
Me.TabControl1 = New System.Windows.Forms.TabControl()
Me.TabPage7 = New System.Windows.Forms.TabPage()
Me.GrdSnRepair = New FlexCell.Grid()
Me.TabPage1 = New System.Windows.Forms.TabPage()
Me.GrdTestPlan = New FlexCell.Grid()
Me.TabPage2 = New System.Windows.Forms.TabPage()
Me.GrdErrCode = New FlexCell.Grid()
Me.Label7 = New System.Windows.Forms.Label()
Me.CboRepairScheme = New System.Windows.Forms.ComboBox()
Me.CboRepairReason = New System.Windows.Forms.ComboBox()
Me.CboRepairType = New System.Windows.Forms.ComboBox()
Me.Label5 = New System.Windows.Forms.Label()
Me.Label4 = New System.Windows.Forms.Label()
Me.Label3 = New System.Windows.Forms.Label()
Me.CboRepairResult = New System.Windows.Forms.ComboBox()
Me.ToolStrip2 = New System.Windows.Forms.ToolStrip()
Me.ContextMenuStrip1 = New System.Windows.Forms.ContextMenuStrip(Me.components)
Me.TsmiCopy = New System.Windows.Forms.ToolStripMenuItem()
Me.TsmiPaste = New System.Windows.Forms.ToolStripMenuItem()
Me.TsmiDelete = New System.Windows.Forms.ToolStripMenuItem()
Me.ToolStripSeparator1 = New System.Windows.Forms.ToolStripSeparator()
Me.完整图像ToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.TsBtnImg0 = New System.Windows.Forms.ToolStripButton()
Me.TsBtnImg1 = New System.Windows.Forms.ToolStripButton()
Me.TsBtnImg2 = New System.Windows.Forms.ToolStripButton()
Me.TsBtnImg3 = New System.Windows.Forms.ToolStripButton()
Me.Label2 = New System.Windows.Forms.Label()
Me.BtnCommit = New System.Windows.Forms.Button()
CType(Me.SplitContainer1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SplitContainer1.Panel1.SuspendLayout()
Me.SplitContainer1.Panel2.SuspendLayout()
Me.SplitContainer1.SuspendLayout()
Me.TabRepairSource.SuspendLayout()
Me.TabPage8.SuspendLayout()
Me.GroupBox2.SuspendLayout()
Me.GroupBox3.SuspendLayout()
Me.TabPage9.SuspendLayout()
Me.GroupBox5.SuspendLayout()
Me.GroupBox4.SuspendLayout()
CType(Me.PictureBox1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.GroupBox1.SuspendLayout()
CType(Me.SplitContainer2, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SplitContainer2.Panel1.SuspendLayout()
Me.SplitContainer2.Panel2.SuspendLayout()
Me.SplitContainer2.SuspendLayout()
Me.GrpTestLog.SuspendLayout()
Me.TabControl2.SuspendLayout()
Me.TabPage6.SuspendLayout()
Me.TabPage3.SuspendLayout()
Me.TabPage4.SuspendLayout()
Me.TabPage5.SuspendLayout()
Me.GrpRepairLog.SuspendLayout()
Me.TabControl1.SuspendLayout()
Me.TabPage7.SuspendLayout()
Me.TabPage1.SuspendLayout()
Me.TabPage2.SuspendLayout()
Me.ToolStrip2.SuspendLayout()
Me.ContextMenuStrip1.SuspendLayout()
Me.SuspendLayout()
'
'StatusStrip1
'
Me.StatusStrip1.Location = New System.Drawing.Point(0, 679)
Me.StatusStrip1.Name = "StatusStrip1"
Me.StatusStrip1.Size = New System.Drawing.Size(798, 22)
Me.StatusStrip1.TabIndex = 2
Me.StatusStrip1.Text = "StatusStrip1"
'
'SplitContainer1
'
Me.SplitContainer1.Dock = System.Windows.Forms.DockStyle.Fill
Me.SplitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1
Me.SplitContainer1.Location = New System.Drawing.Point(0, 0)
Me.SplitContainer1.Name = "SplitContainer1"
'
'SplitContainer1.Panel1
'
Me.SplitContainer1.Panel1.Controls.Add(Me.TabRepairSource)
'
'SplitContainer1.Panel2
'
Me.SplitContainer1.Panel2.Controls.Add(Me.SplitContainer2)
Me.SplitContainer1.Panel2.Controls.Add(Me.Label7)
Me.SplitContainer1.Panel2.Controls.Add(Me.CboRepairScheme)
Me.SplitContainer1.Panel2.Controls.Add(Me.CboRepairReason)
Me.SplitContainer1.Panel2.Controls.Add(Me.CboRepairType)
Me.SplitContainer1.Panel2.Controls.Add(Me.Label5)
Me.SplitContainer1.Panel2.Controls.Add(Me.Label4)
Me.SplitContainer1.Panel2.Controls.Add(Me.Label3)
Me.SplitContainer1.Panel2.Controls.Add(Me.CboRepairResult)
Me.SplitContainer1.Panel2.Controls.Add(Me.ToolStrip2)
Me.SplitContainer1.Panel2.Controls.Add(Me.Label2)
Me.SplitContainer1.Panel2.Controls.Add(Me.BtnCommit)
Me.SplitContainer1.Size = New System.Drawing.Size(798, 679)
Me.SplitContainer1.SplitterDistance = 296
Me.SplitContainer1.TabIndex = 3
'
'TabRepairSource
'
Me.TabRepairSource.Controls.Add(Me.TabPage8)
Me.TabRepairSource.Controls.Add(Me.TabPage9)
Me.TabRepairSource.Dock = System.Windows.Forms.DockStyle.Fill
Me.TabRepairSource.Location = New System.Drawing.Point(0, 0)
Me.TabRepairSource.Name = "TabRepairSource"
Me.TabRepairSource.SelectedIndex = 0
Me.TabRepairSource.Size = New System.Drawing.Size(296, 679)
Me.TabRepairSource.TabIndex = 6
'
'TabPage8
'
Me.TabPage8.Controls.Add(Me.GroupBox2)
Me.TabPage8.Controls.Add(Me.GroupBox3)
Me.TabPage8.Controls.Add(Me.lblPassFailDisplay)
Me.TabPage8.Location = New System.Drawing.Point(4, 22)
Me.TabPage8.Name = "TabPage8"
Me.TabPage8.Padding = New System.Windows.Forms.Padding(3)
Me.TabPage8.Size = New System.Drawing.Size(288, 653)
Me.TabPage8.TabIndex = 0
Me.TabPage8.Text = "生产返修"
Me.TabPage8.UseVisualStyleBackColor = True
'
'GroupBox2
'
Me.GroupBox2.Controls.Add(Me.TxtDevSn)
Me.GroupBox2.Dock = System.Windows.Forms.DockStyle.Top
Me.GroupBox2.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GroupBox2.Location = New System.Drawing.Point(3, 3)
Me.GroupBox2.Name = "GroupBox2"
Me.GroupBox2.Size = New System.Drawing.Size(282, 51)
Me.GroupBox2.TabIndex = 2
Me.GroupBox2.TabStop = False
Me.GroupBox2.Text = "产品条码"
'
'TxtDevSn
'
Me.TxtDevSn.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.TxtDevSn.BackColor = System.Drawing.Color.White
Me.TxtDevSn.Font = New System.Drawing.Font("黑体", 15.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.TxtDevSn.ImeMode = System.Windows.Forms.ImeMode.Disable
Me.TxtDevSn.Location = New System.Drawing.Point(3, 15)
Me.TxtDevSn.Name = "TxtDevSn"
Me.TxtDevSn.Size = New System.Drawing.Size(273, 31)
Me.TxtDevSn.TabIndex = 0
Me.TxtDevSn.TextAlign = System.Windows.Forms.HorizontalAlignment.Center
'
'GroupBox3
'
Me.GroupBox3.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.GroupBox3.Controls.Add(Me.TvwTestLog)
Me.GroupBox3.Font = New System.Drawing.Font("微软雅黑", 9.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GroupBox3.Location = New System.Drawing.Point(2, 140)
Me.GroupBox3.Name = "GroupBox3"
Me.GroupBox3.Size = New System.Drawing.Size(283, 510)
Me.GroupBox3.TabIndex = 3
Me.GroupBox3.TabStop = False
Me.GroupBox3.Text = "测试历史"
'
'TvwTestLog
'
Me.TvwTestLog.BackColor = System.Drawing.SystemColors.InactiveBorder
Me.TvwTestLog.Dock = System.Windows.Forms.DockStyle.Fill
Me.TvwTestLog.ItemHeight = 20
Me.TvwTestLog.Location = New System.Drawing.Point(3, 21)
Me.TvwTestLog.Name = "TvwTestLog"
Me.TvwTestLog.Size = New System.Drawing.Size(277, 486)
Me.TvwTestLog.TabIndex = 1
'
'lblPassFailDisplay
'
Me.lblPassFailDisplay.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.lblPassFailDisplay.BackColor = System.Drawing.SystemColors.ActiveCaptionText
Me.lblPassFailDisplay.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.lblPassFailDisplay.Font = New System.Drawing.Font("Calibri", 48.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.lblPassFailDisplay.ForeColor = System.Drawing.Color.White
Me.lblPassFailDisplay.Location = New System.Drawing.Point(4, 57)
Me.lblPassFailDisplay.Name = "lblPassFailDisplay"
Me.lblPassFailDisplay.Size = New System.Drawing.Size(279, 80)
Me.lblPassFailDisplay.TabIndex = 5
Me.lblPassFailDisplay.Text = "No Test"
Me.lblPassFailDisplay.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
'
'TabPage9
'
Me.TabPage9.Controls.Add(Me.GroupBox5)
Me.TabPage9.Controls.Add(Me.GroupBox4)
Me.TabPage9.Controls.Add(Me.GroupBox1)
Me.TabPage9.Location = New System.Drawing.Point(4, 22)
Me.TabPage9.Name = "TabPage9"
Me.TabPage9.Padding = New System.Windows.Forms.Padding(3)
Me.TabPage9.Size = New System.Drawing.Size(288, 653)
Me.TabPage9.TabIndex = 1
Me.TabPage9.Text = "市场返修"
Me.TabPage9.UseVisualStyleBackColor = True
'
'GroupBox5
'
Me.GroupBox5.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.GroupBox5.Controls.Add(Me.TvwTestLog_Request)
Me.GroupBox5.Font = New System.Drawing.Font("微软雅黑", 9.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GroupBox5.Location = New System.Drawing.Point(3, 52)
Me.GroupBox5.Name = "GroupBox5"
Me.GroupBox5.Size = New System.Drawing.Size(282, 255)
Me.GroupBox5.TabIndex = 5
Me.GroupBox5.TabStop = False
Me.GroupBox5.Text = "测试历史"
'
'TvwTestLog_Request
'
Me.TvwTestLog_Request.BackColor = System.Drawing.SystemColors.InactiveBorder
Me.TvwTestLog_Request.Dock = System.Windows.Forms.DockStyle.Fill
Me.TvwTestLog_Request.ItemHeight = 20
Me.TvwTestLog_Request.Location = New System.Drawing.Point(3, 21)
Me.TvwTestLog_Request.Name = "TvwTestLog_Request"
Me.TvwTestLog_Request.Size = New System.Drawing.Size(276, 231)
Me.TvwTestLog_Request.TabIndex = 1
'
'GroupBox4
'
Me.GroupBox4.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.GroupBox4.Controls.Add(Me.PictureBox1)
Me.GroupBox4.Controls.Add(Me.TvwRepairRequest)
Me.GroupBox4.Font = New System.Drawing.Font("微软雅黑", 9.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GroupBox4.Location = New System.Drawing.Point(0, 307)
Me.GroupBox4.Name = "GroupBox4"
Me.GroupBox4.Size = New System.Drawing.Size(285, 343)
Me.GroupBox4.TabIndex = 4
Me.GroupBox4.TabStop = False
Me.GroupBox4.Text = "报修信息"
'
'PictureBox1
'
Me.PictureBox1.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.PictureBox1.Location = New System.Drawing.Point(6, 242)
Me.PictureBox1.Name = "PictureBox1"
Me.PictureBox1.Size = New System.Drawing.Size(276, 101)
Me.PictureBox1.TabIndex = 5
Me.PictureBox1.TabStop = False
'
'TvwRepairRequest
'
Me.TvwRepairRequest.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.TvwRepairRequest.BackColor = System.Drawing.SystemColors.InactiveBorder
Me.TvwRepairRequest.ItemHeight = 20
Me.TvwRepairRequest.Location = New System.Drawing.Point(6, 21)
Me.TvwRepairRequest.Name = "TvwRepairRequest"
Me.TvwRepairRequest.Size = New System.Drawing.Size(276, 223)
Me.TvwRepairRequest.TabIndex = 1
'
'GroupBox1
'
Me.GroupBox1.Controls.Add(Me.TxtMarketSn)
Me.GroupBox1.Dock = System.Windows.Forms.DockStyle.Top
Me.GroupBox1.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GroupBox1.Location = New System.Drawing.Point(3, 3)
Me.GroupBox1.Name = "GroupBox1"
Me.GroupBox1.Size = New System.Drawing.Size(282, 51)
Me.GroupBox1.TabIndex = 3
Me.GroupBox1.TabStop = False
Me.GroupBox1.Text = "产品条码"
'
'TxtMarketSn
'
Me.TxtMarketSn.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.TxtMarketSn.BackColor = System.Drawing.Color.White
Me.TxtMarketSn.Font = New System.Drawing.Font("黑体", 15.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.TxtMarketSn.ImeMode = System.Windows.Forms.ImeMode.Disable
Me.TxtMarketSn.Location = New System.Drawing.Point(3, 15)
Me.TxtMarketSn.Name = "TxtMarketSn"
Me.TxtMarketSn.Size = New System.Drawing.Size(273, 31)
Me.TxtMarketSn.TabIndex = 0
Me.TxtMarketSn.TextAlign = System.Windows.Forms.HorizontalAlignment.Center
'
'SplitContainer2
'
Me.SplitContainer2.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.SplitContainer2.Location = New System.Drawing.Point(3, 3)
Me.SplitContainer2.Name = "SplitContainer2"
Me.SplitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal
'
'SplitContainer2.Panel1
'
Me.SplitContainer2.Panel1.Controls.Add(Me.GrpTestLog)
'
'SplitContainer2.Panel2
'
Me.SplitContainer2.Panel2.Controls.Add(Me.GrpRepairLog)
Me.SplitContainer2.Size = New System.Drawing.Size(490, 552)
Me.SplitContainer2.SplitterDistance = 276
Me.SplitContainer2.TabIndex = 17
'
'GrpTestLog
'
Me.GrpTestLog.Controls.Add(Me.BtnCheckTest)
Me.GrpTestLog.Controls.Add(Me.TabControl2)
Me.GrpTestLog.Dock = System.Windows.Forms.DockStyle.Fill
Me.GrpTestLog.Font = New System.Drawing.Font("微软雅黑", 9.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GrpTestLog.Location = New System.Drawing.Point(0, 0)
Me.GrpTestLog.Name = "GrpTestLog"
Me.GrpTestLog.Size = New System.Drawing.Size(490, 276)
Me.GrpTestLog.TabIndex = 7
Me.GrpTestLog.TabStop = False
Me.GrpTestLog.Text = "测试记录"
'
'BtnCheckTest
'
Me.BtnCheckTest.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.BtnCheckTest.Font = New System.Drawing.Font("微软雅黑", 9.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.BtnCheckTest.Location = New System.Drawing.Point(404, 16)
Me.BtnCheckTest.Name = "BtnCheckTest"
Me.BtnCheckTest.Size = New System.Drawing.Size(82, 28)
Me.BtnCheckTest.TabIndex = 1
Me.BtnCheckTest.Text = "筛选"
Me.BtnCheckTest.UseVisualStyleBackColor = True
'
'TabControl2
'
Me.TabControl2.Controls.Add(Me.TabPage6)
Me.TabControl2.Controls.Add(Me.TabPage3)
Me.TabControl2.Controls.Add(Me.TabPage4)
Me.TabControl2.Controls.Add(Me.TabPage5)
Me.TabControl2.Dock = System.Windows.Forms.DockStyle.Fill
Me.TabControl2.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.TabControl2.HotTrack = True
Me.TabControl2.Location = New System.Drawing.Point(3, 21)
Me.TabControl2.Margin = New System.Windows.Forms.Padding(0)
Me.TabControl2.Name = "TabControl2"
Me.TabControl2.SelectedIndex = 0
Me.TabControl2.Size = New System.Drawing.Size(484, 252)
Me.TabControl2.TabIndex = 7
'
'TabPage6
'
Me.TabPage6.Controls.Add(Me.GrdSnRecord)
Me.TabPage6.Location = New System.Drawing.Point(4, 26)
Me.TabPage6.Margin = New System.Windows.Forms.Padding(0)
Me.TabPage6.Name = "TabPage6"
Me.TabPage6.Size = New System.Drawing.Size(476, 222)
Me.TabPage6.TabIndex = 3
Me.TabPage6.Text = "本条码记录"
Me.TabPage6.UseVisualStyleBackColor = True
'
'GrdSnRecord
'
Me.GrdSnRecord.BorderStyle = FlexCell.BorderStyleEnum.None
Me.GrdSnRecord.CheckedImage = Nothing
Me.GrdSnRecord.DefaultFont = New System.Drawing.Font("宋体", 9.0!)
Me.GrdSnRecord.Dock = System.Windows.Forms.DockStyle.Fill
Me.GrdSnRecord.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GrdSnRecord.GridColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer))
Me.GrdSnRecord.Location = New System.Drawing.Point(0, 0)
Me.GrdSnRecord.Name = "GrdSnRecord"
Me.GrdSnRecord.Size = New System.Drawing.Size(476, 222)
Me.GrdSnRecord.TabIndex = 2
Me.GrdSnRecord.UncheckedImage = Nothing
'
'TabPage3
'
Me.TabPage3.Controls.Add(Me.GrdAllRecord)
Me.TabPage3.Location = New System.Drawing.Point(4, 26)
Me.TabPage3.Margin = New System.Windows.Forms.Padding(0)
Me.TabPage3.Name = "TabPage3"
Me.TabPage3.Size = New System.Drawing.Size(476, 222)
Me.TabPage3.TabIndex = 0
Me.TabPage3.Text = "全部记录"
Me.TabPage3.UseVisualStyleBackColor = True
'
'GrdAllRecord
'
Me.GrdAllRecord.BorderStyle = FlexCell.BorderStyleEnum.None
Me.GrdAllRecord.CheckedImage = Nothing
Me.GrdAllRecord.DefaultFont = New System.Drawing.Font("宋体", 9.0!)
Me.GrdAllRecord.Dock = System.Windows.Forms.DockStyle.Fill
Me.GrdAllRecord.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GrdAllRecord.GridColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer))
Me.GrdAllRecord.Location = New System.Drawing.Point(0, 0)
Me.GrdAllRecord.Name = "GrdAllRecord"
Me.GrdAllRecord.Size = New System.Drawing.Size(476, 222)
Me.GrdAllRecord.TabIndex = 0
Me.GrdAllRecord.UncheckedImage = Nothing
'
'TabPage4
'
Me.TabPage4.Controls.Add(Me.GrdPassRecord)
Me.TabPage4.Location = New System.Drawing.Point(4, 26)
Me.TabPage4.Margin = New System.Windows.Forms.Padding(0)
Me.TabPage4.Name = "TabPage4"
Me.TabPage4.Size = New System.Drawing.Size(476, 222)
Me.TabPage4.TabIndex = 1
Me.TabPage4.Text = "成功记录"
Me.TabPage4.UseVisualStyleBackColor = True
'
'GrdPassRecord
'
Me.GrdPassRecord.BorderStyle = FlexCell.BorderStyleEnum.None
Me.GrdPassRecord.CheckedImage = Nothing
Me.GrdPassRecord.DefaultFont = New System.Drawing.Font("宋体", 9.0!)
Me.GrdPassRecord.Dock = System.Windows.Forms.DockStyle.Fill
Me.GrdPassRecord.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GrdPassRecord.GridColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer))
Me.GrdPassRecord.Location = New System.Drawing.Point(0, 0)
Me.GrdPassRecord.Name = "GrdPassRecord"
Me.GrdPassRecord.Size = New System.Drawing.Size(476, 222)
Me.GrdPassRecord.TabIndex = 1
Me.GrdPassRecord.UncheckedImage = Nothing
'
'TabPage5
'
Me.TabPage5.Controls.Add(Me.GrdFailRecord)
Me.TabPage5.Location = New System.Drawing.Point(4, 26)
Me.TabPage5.Margin = New System.Windows.Forms.Padding(0)
Me.TabPage5.Name = "TabPage5"
Me.TabPage5.Size = New System.Drawing.Size(476, 222)
Me.TabPage5.TabIndex = 2
Me.TabPage5.Text = "失败记录"
Me.TabPage5.UseVisualStyleBackColor = True
'
'GrdFailRecord
'
Me.GrdFailRecord.BorderStyle = FlexCell.BorderStyleEnum.None
Me.GrdFailRecord.CheckedImage = Nothing
Me.GrdFailRecord.DefaultFont = New System.Drawing.Font("宋体", 9.0!)
Me.GrdFailRecord.Dock = System.Windows.Forms.DockStyle.Fill
Me.GrdFailRecord.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GrdFailRecord.GridColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer))
Me.GrdFailRecord.Location = New System.Drawing.Point(0, 0)
Me.GrdFailRecord.Name = "GrdFailRecord"
Me.GrdFailRecord.Size = New System.Drawing.Size(476, 222)
Me.GrdFailRecord.TabIndex = 2
Me.GrdFailRecord.UncheckedImage = Nothing
'
'GrpRepairLog
'
Me.GrpRepairLog.Controls.Add(Me.BtnCheckRepair)
Me.GrpRepairLog.Controls.Add(Me.TabControl1)
Me.GrpRepairLog.Dock = System.Windows.Forms.DockStyle.Fill
Me.GrpRepairLog.Font = New System.Drawing.Font("微软雅黑", 9.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GrpRepairLog.Location = New System.Drawing.Point(0, 0)
Me.GrpRepairLog.Name = "GrpRepairLog"
Me.GrpRepairLog.Size = New System.Drawing.Size(490, 272)
Me.GrpRepairLog.TabIndex = 6
Me.GrpRepairLog.TabStop = False
Me.GrpRepairLog.Text = "维修记录"
'
'BtnCheckRepair
'
Me.BtnCheckRepair.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.BtnCheckRepair.Font = New System.Drawing.Font("微软雅黑", 9.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.BtnCheckRepair.Location = New System.Drawing.Point(401, 15)
Me.BtnCheckRepair.Name = "BtnCheckRepair"
Me.BtnCheckRepair.Size = New System.Drawing.Size(82, 28)
Me.BtnCheckRepair.TabIndex = 8
Me.BtnCheckRepair.Text = "筛选"
Me.BtnCheckRepair.UseVisualStyleBackColor = True
'
'TabControl1
'
Me.TabControl1.Controls.Add(Me.TabPage7)
Me.TabControl1.Controls.Add(Me.TabPage1)
Me.TabControl1.Controls.Add(Me.TabPage2)
Me.TabControl1.Dock = System.Windows.Forms.DockStyle.Fill
Me.TabControl1.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.TabControl1.HotTrack = True
Me.TabControl1.Location = New System.Drawing.Point(3, 21)
Me.TabControl1.Margin = New System.Windows.Forms.Padding(0)
Me.TabControl1.Name = "TabControl1"
Me.TabControl1.SelectedIndex = 0
Me.TabControl1.Size = New System.Drawing.Size(484, 248)
Me.TabControl1.TabIndex = 7
'
'TabPage7
'
Me.TabPage7.Controls.Add(Me.GrdSnRepair)
Me.TabPage7.Location = New System.Drawing.Point(4, 26)
Me.TabPage7.Name = "TabPage7"
Me.TabPage7.Size = New System.Drawing.Size(476, 218)
Me.TabPage7.TabIndex = 2
Me.TabPage7.Text = "本条码记录"
Me.TabPage7.UseVisualStyleBackColor = True
'
'GrdSnRepair
'
Me.GrdSnRepair.BorderStyle = FlexCell.BorderStyleEnum.None
Me.GrdSnRepair.CheckedImage = Nothing
Me.GrdSnRepair.DefaultFont = New System.Drawing.Font("宋体", 9.0!)
Me.GrdSnRepair.Dock = System.Windows.Forms.DockStyle.Fill
Me.GrdSnRepair.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GrdSnRepair.GridColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer))
Me.GrdSnRepair.Location = New System.Drawing.Point(0, 0)
Me.GrdSnRepair.Name = "GrdSnRepair"
Me.GrdSnRepair.Size = New System.Drawing.Size(476, 218)
Me.GrdSnRepair.TabIndex = 2
Me.GrdSnRepair.UncheckedImage = Nothing
'
'TabPage1
'
Me.TabPage1.Controls.Add(Me.GrdTestPlan)
Me.TabPage1.Location = New System.Drawing.Point(4, 26)
Me.TabPage1.Margin = New System.Windows.Forms.Padding(0)
Me.TabPage1.Name = "TabPage1"
Me.TabPage1.Size = New System.Drawing.Size(476, 218)
Me.TabPage1.TabIndex = 0
Me.TabPage1.Text = "相同失败步骤"
Me.TabPage1.UseVisualStyleBackColor = True
'
'GrdTestPlan
'
Me.GrdTestPlan.BorderStyle = FlexCell.BorderStyleEnum.None
Me.GrdTestPlan.CheckedImage = Nothing
Me.GrdTestPlan.DefaultFont = New System.Drawing.Font("宋体", 9.0!)
Me.GrdTestPlan.Dock = System.Windows.Forms.DockStyle.Fill
Me.GrdTestPlan.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GrdTestPlan.GridColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer))
Me.GrdTestPlan.Location = New System.Drawing.Point(0, 0)
Me.GrdTestPlan.Name = "GrdTestPlan"
Me.GrdTestPlan.Size = New System.Drawing.Size(476, 218)
Me.GrdTestPlan.TabIndex = 0
Me.GrdTestPlan.UncheckedImage = Nothing
'
'TabPage2
'
Me.TabPage2.Controls.Add(Me.GrdErrCode)
Me.TabPage2.Location = New System.Drawing.Point(4, 26)
Me.TabPage2.Margin = New System.Windows.Forms.Padding(0)
Me.TabPage2.Name = "TabPage2"
Me.TabPage2.Size = New System.Drawing.Size(476, 218)
Me.TabPage2.TabIndex = 1
Me.TabPage2.Text = "相同错误码"
Me.TabPage2.UseVisualStyleBackColor = True
'
'GrdErrCode
'
Me.GrdErrCode.BorderStyle = FlexCell.BorderStyleEnum.None
Me.GrdErrCode.CheckedImage = Nothing
Me.GrdErrCode.DefaultFont = New System.Drawing.Font("宋体", 9.0!)
Me.GrdErrCode.Dock = System.Windows.Forms.DockStyle.Fill
Me.GrdErrCode.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.GrdErrCode.GridColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer))
Me.GrdErrCode.Location = New System.Drawing.Point(0, 0)
Me.GrdErrCode.Name = "GrdErrCode"
Me.GrdErrCode.Size = New System.Drawing.Size(476, 218)
Me.GrdErrCode.TabIndex = 1
Me.GrdErrCode.UncheckedImage = Nothing
'
'Label7
'
Me.Label7.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
Me.Label7.AutoSize = True
Me.Label7.Location = New System.Drawing.Point(10, 644)
Me.Label7.Name = "Label7"
Me.Label7.Size = New System.Drawing.Size(53, 12)
Me.Label7.TabIndex = 16
Me.Label7.Text = "故障图像"
'
'CboRepairScheme
'
Me.CboRepairScheme.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
Me.CboRepairScheme.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest
Me.CboRepairScheme.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource
Me.CboRepairScheme.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.CboRepairScheme.FormattingEnabled = True
Me.CboRepairScheme.Location = New System.Drawing.Point(66, 592)
Me.CboRepairScheme.Name = "CboRepairScheme"
Me.CboRepairScheme.Size = New System.Drawing.Size(427, 25)
Me.CboRepairScheme.TabIndex = 0
'
'CboRepairReason
'
Me.CboRepairReason.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
Me.CboRepairReason.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
Me.CboRepairReason.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.CboRepairReason.FormattingEnabled = True
Me.CboRepairReason.Location = New System.Drawing.Point(228, 561)
Me.CboRepairReason.Name = "CboRepairReason"
Me.CboRepairReason.Size = New System.Drawing.Size(102, 25)
Me.CboRepairReason.TabIndex = 0
'
'CboRepairType
'
Me.CboRepairType.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
Me.CboRepairType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
Me.CboRepairType.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.CboRepairType.FormattingEnabled = True
Me.CboRepairType.Location = New System.Drawing.Point(66, 561)
Me.CboRepairType.Name = "CboRepairType"
Me.CboRepairType.Size = New System.Drawing.Size(102, 25)
Me.CboRepairType.TabIndex = 0
'
'Label5
'
Me.Label5.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
Me.Label5.AutoSize = True
Me.Label5.Location = New System.Drawing.Point(173, 568)
Me.Label5.Name = "Label5"
Me.Label5.Size = New System.Drawing.Size(53, 12)
Me.Label5.TabIndex = 13
Me.Label5.Text = "返修原因"
'
'Label4
'
Me.Label4.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
Me.Label4.AutoSize = True
Me.Label4.Location = New System.Drawing.Point(10, 567)
Me.Label4.Name = "Label4"
Me.Label4.Size = New System.Drawing.Size(53, 12)
Me.Label4.TabIndex = 12
Me.Label4.Text = "返修类型"
'
'Label3
'
Me.Label3.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
Me.Label3.AutoSize = True
Me.Label3.Location = New System.Drawing.Point(10, 598)
Me.Label3.Name = "Label3"
Me.Label3.Size = New System.Drawing.Size(53, 12)
Me.Label3.TabIndex = 11
Me.Label3.Text = "返修方案"
'
'CboRepairResult
'
Me.CboRepairResult.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
Me.CboRepairResult.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
Me.CboRepairResult.Font = New System.Drawing.Font("微软雅黑", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.CboRepairResult.FormattingEnabled = True
Me.CboRepairResult.Location = New System.Drawing.Point(387, 561)
Me.CboRepairResult.Name = "CboRepairResult"
Me.CboRepairResult.Size = New System.Drawing.Size(106, 25)
Me.CboRepairResult.TabIndex = 0
'
'ToolStrip2
'
Me.ToolStrip2.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
Me.ToolStrip2.ContextMenuStrip = Me.ContextMenuStrip1
Me.ToolStrip2.Dock = System.Windows.Forms.DockStyle.None
Me.ToolStrip2.ImageScalingSize = New System.Drawing.Size(60, 45)
Me.ToolStrip2.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.TsBtnImg0, Me.TsBtnImg1, Me.TsBtnImg2, Me.TsBtnImg3})
Me.ToolStrip2.Location = New System.Drawing.Point(66, 624)
Me.ToolStrip2.Name = "ToolStrip2"
Me.ToolStrip2.Size = New System.Drawing.Size(252, 48)
Me.ToolStrip2.TabIndex = 0
Me.ToolStrip2.Text = "ToolStrip2"
'
'ContextMenuStrip1
'
Me.ContextMenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.TsmiCopy, Me.TsmiPaste, Me.TsmiDelete, Me.ToolStripSeparator1, Me.完整图像ToolStripMenuItem})
Me.ContextMenuStrip1.Name = "ContextMenuStrip1"
Me.ContextMenuStrip1.Size = New System.Drawing.Size(125, 98)
'
'TsmiCopy
'
Me.TsmiCopy.Name = "TsmiCopy"
Me.TsmiCopy.Size = New System.Drawing.Size(124, 22)
Me.TsmiCopy.Text = "复制图像"
'
'TsmiPaste
'
Me.TsmiPaste.Name = "TsmiPaste"
Me.TsmiPaste.Size = New System.Drawing.Size(124, 22)
Me.TsmiPaste.Text = "粘贴图像"
'
'TsmiDelete
'
Me.TsmiDelete.Name = "TsmiDelete"
Me.TsmiDelete.Size = New System.Drawing.Size(124, 22)
Me.TsmiDelete.Text = "删除图像"
'
'ToolStripSeparator1
'
Me.ToolStripSeparator1.Name = "ToolStripSeparator1"
Me.ToolStripSeparator1.Size = New System.Drawing.Size(121, 6)
'
'完整图像ToolStripMenuItem
'
Me.完整图像ToolStripMenuItem.Name = "完整图像ToolStripMenuItem"
Me.完整图像ToolStripMenuItem.Size = New System.Drawing.Size(124, 22)
Me.完整图像ToolStripMenuItem.Text = "完整图像"
'
'TsBtnImg0
'
Me.TsBtnImg0.AutoSize = False
Me.TsBtnImg0.Checked = True
Me.TsBtnImg0.CheckState = System.Windows.Forms.CheckState.Checked
Me.TsBtnImg0.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
Me.TsBtnImg0.Image = Global.AUTS_Repair.My.Resources.Resources.NoImg40_30
Me.TsBtnImg0.ImageTransparentColor = System.Drawing.Color.Magenta
Me.TsBtnImg0.Name = "TsBtnImg0"
Me.TsBtnImg0.Size = New System.Drawing.Size(60, 45)
Me.TsBtnImg0.Tag = "0"
Me.TsBtnImg0.Text = "图1"
Me.TsBtnImg0.TextImageRelation = System.Windows.Forms.TextImageRelation.Overlay
'
'TsBtnImg1
'
Me.TsBtnImg1.AutoSize = False
Me.TsBtnImg1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom
Me.TsBtnImg1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
Me.TsBtnImg1.Image = Global.AUTS_Repair.My.Resources.Resources.NoImg40_30
Me.TsBtnImg1.ImageTransparentColor = System.Drawing.Color.Magenta
Me.TsBtnImg1.Name = "TsBtnImg1"
Me.TsBtnImg1.Size = New System.Drawing.Size(60, 45)
Me.TsBtnImg1.Tag = "1"
Me.TsBtnImg1.Text = "图2"
Me.TsBtnImg1.TextImageRelation = System.Windows.Forms.TextImageRelation.Overlay
'
'TsBtnImg2
'
Me.TsBtnImg2.AutoSize = False
Me.TsBtnImg2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom
Me.TsBtnImg2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
Me.TsBtnImg2.Image = Global.AUTS_Repair.My.Resources.Resources.NoImg40_30
Me.TsBtnImg2.ImageTransparentColor = System.Drawing.Color.Magenta
Me.TsBtnImg2.Name = "TsBtnImg2"
Me.TsBtnImg2.Size = New System.Drawing.Size(60, 45)
Me.TsBtnImg2.Tag = "2"
Me.TsBtnImg2.Text = "图3"
Me.TsBtnImg2.TextImageRelation = System.Windows.Forms.TextImageRelation.Overlay
'
'TsBtnImg3
'
Me.TsBtnImg3.AutoSize = False
Me.TsBtnImg3.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom
Me.TsBtnImg3.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
Me.TsBtnImg3.Image = Global.AUTS_Repair.My.Resources.Resources.NoImg40_30
Me.TsBtnImg3.ImageTransparentColor = System.Drawing.Color.Magenta
Me.TsBtnImg3.Name = "TsBtnImg3"
Me.TsBtnImg3.Size = New System.Drawing.Size(60, 45)
Me.TsBtnImg3.Tag = "3"
Me.TsBtnImg3.Text = "图4"
Me.TsBtnImg3.TextImageRelation = System.Windows.Forms.TextImageRelation.Overlay
'
'Label2
'
Me.Label2.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
Me.Label2.AutoSize = True
Me.Label2.Location = New System.Drawing.Point(333, 568)
Me.Label2.Name = "Label2"
Me.Label2.Size = New System.Drawing.Size(53, 12)
Me.Label2.TabIndex = 10
Me.Label2.Text = "返修结果"
'
'BtnCommit
'
Me.BtnCommit.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
Me.BtnCommit.Font = New System.Drawing.Font("微软雅黑", 15.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.BtnCommit.ForeColor = System.Drawing.Color.Green
Me.BtnCommit.Location = New System.Drawing.Point(371, 623)
Me.BtnCommit.Name = "BtnCommit"
Me.BtnCommit.Size = New System.Drawing.Size(122, 49)
Me.BtnCommit.TabIndex = 2
Me.BtnCommit.Text = "提交"
Me.BtnCommit.UseVisualStyleBackColor = True
'
'FrmMain
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(798, 701)
Me.Controls.Add(Me.SplitContainer1)
Me.Controls.Add(Me.StatusStrip1)
Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
Me.KeyPreview = True
Me.Name = "FrmMain"
Me.Text = "RepairStation"
Me.SplitContainer1.Panel1.ResumeLayout(False)
Me.SplitContainer1.Panel2.ResumeLayout(False)
Me.SplitContainer1.Panel2.PerformLayout()
CType(Me.SplitContainer1, System.ComponentModel.ISupportInitialize).EndInit()
Me.SplitContainer1.ResumeLayout(False)
Me.TabRepairSource.ResumeLayout(False)
Me.TabPage8.ResumeLayout(False)
Me.GroupBox2.ResumeLayout(False)
Me.GroupBox2.PerformLayout()
Me.GroupBox3.ResumeLayout(False)
Me.TabPage9.ResumeLayout(False)
Me.GroupBox5.ResumeLayout(False)
Me.GroupBox4.ResumeLayout(False)
CType(Me.PictureBox1, System.ComponentModel.ISupportInitialize).EndInit()
Me.GroupBox1.ResumeLayout(False)
Me.GroupBox1.PerformLayout()
Me.SplitContainer2.Panel1.ResumeLayout(False)
Me.SplitContainer2.Panel2.ResumeLayout(False)
CType(Me.SplitContainer2, System.ComponentModel.ISupportInitialize).EndInit()
Me.SplitContainer2.ResumeLayout(False)
Me.GrpTestLog.ResumeLayout(False)
Me.TabControl2.ResumeLayout(False)
Me.TabPage6.ResumeLayout(False)
Me.TabPage3.ResumeLayout(False)
Me.TabPage4.ResumeLayout(False)
Me.TabPage5.ResumeLayout(False)
Me.GrpRepairLog.ResumeLayout(False)
Me.TabControl1.ResumeLayout(False)
Me.TabPage7.ResumeLayout(False)
Me.TabPage1.ResumeLayout(False)
Me.TabPage2.ResumeLayout(False)
Me.ToolStrip2.ResumeLayout(False)
Me.ToolStrip2.PerformLayout()
Me.ContextMenuStrip1.ResumeLayout(False)
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents StatusStrip1 As StatusStrip
Friend WithEvents SplitContainer1 As SplitContainer
Friend WithEvents TxtDevSn As TextBox
Friend WithEvents ToolStrip2 As ToolStrip
Friend WithEvents TsBtnImg0 As ToolStripButton
Friend WithEvents GroupBox3 As GroupBox
Friend WithEvents TvwTestLog As TreeView
Friend WithEvents GroupBox2 As GroupBox
Friend WithEvents BtnCommit As Button
Friend WithEvents TsBtnImg1 As ToolStripButton
Friend WithEvents TsBtnImg2 As ToolStripButton
Friend WithEvents TsBtnImg3 As ToolStripButton
Friend WithEvents lblPassFailDisplay As Label
Friend WithEvents CboRepairType As ComboBox
Friend WithEvents CboRepairScheme As ComboBox
Friend WithEvents CboRepairReason As ComboBox
Friend WithEvents GrpTestLog As GroupBox
Friend WithEvents TabControl2 As TabControl
Friend WithEvents TabPage3 As TabPage
Friend WithEvents GrdAllRecord As FlexCell.Grid
Friend WithEvents TabPage4 As TabPage
Friend WithEvents GrdPassRecord As FlexCell.Grid
Friend WithEvents GrpRepairLog As GroupBox
Friend WithEvents TabControl1 As TabControl
Friend WithEvents TabPage1 As TabPage
Friend WithEvents GrdTestPlan As FlexCell.Grid
Friend WithEvents TabPage2 As TabPage
Friend WithEvents GrdErrCode As FlexCell.Grid
Friend WithEvents CboRepairResult As ComboBox
Friend WithEvents TabPage5 As TabPage
Friend WithEvents GrdFailRecord As FlexCell.Grid
Friend WithEvents TabPage6 As TabPage
Friend WithEvents GrdSnRecord As FlexCell.Grid
Friend WithEvents Label2 As Label
Friend WithEvents Label7 As Label
Friend WithEvents Label5 As Label
Friend WithEvents Label4 As Label
Friend WithEvents Label3 As Label
Friend WithEvents SplitContainer2 As SplitContainer
Friend WithEvents ContextMenuStrip1 As ContextMenuStrip
Friend WithEvents TsmiCopy As ToolStripMenuItem
Friend WithEvents TsmiPaste As ToolStripMenuItem
Friend WithEvents TsmiDelete As ToolStripMenuItem
Friend WithEvents TabPage7 As TabPage
Friend WithEvents GrdSnRepair As FlexCell.Grid
Friend WithEvents TabRepairSource As TabControl
Friend WithEvents TabPage8 As TabPage
Friend WithEvents TabPage9 As TabPage
Friend WithEvents GroupBox1 As GroupBox
Friend WithEvents TxtMarketSn As TextBox
Friend WithEvents GroupBox4 As GroupBox
Friend WithEvents TvwRepairRequest As TreeView
Friend WithEvents ToolStripSeparator1 As ToolStripSeparator
Friend WithEvents 完整图像ToolStripMenuItem As ToolStripMenuItem
Friend WithEvents BtnCheckTest As Button
Friend WithEvents BtnCheckRepair As Button
Friend WithEvents PictureBox1 As PictureBox
Friend WithEvents GroupBox5 As GroupBox
Friend WithEvents TvwTestLog_Request As TreeView
End Class

6305
AUTS_Repair/Form1.resx Normal file

File diff suppressed because it is too large Load Diff

1124
AUTS_Repair/Form1.vb Normal file

File diff suppressed because it is too large Load Diff

78
AUTS_Repair/FrmCheckLog.Designer.vb generated Normal file
View File

@@ -0,0 +1,78 @@
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class FrmCheckLog
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()
Me.Grid1 = New FlexCell.Grid()
Me.BtnOk = New System.Windows.Forms.Button()
Me.BtnCencel = New System.Windows.Forms.Button()
Me.SuspendLayout()
'
'Grid1
'
Me.Grid1.BorderStyle = FlexCell.BorderStyleEnum.None
Me.Grid1.CheckedImage = Nothing
Me.Grid1.DefaultFont = New System.Drawing.Font("宋体", 9.0!)
Me.Grid1.Font = New System.Drawing.Font("宋体", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.Grid1.GridColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer))
Me.Grid1.Location = New System.Drawing.Point(0, 0)
Me.Grid1.Name = "Grid1"
Me.Grid1.Size = New System.Drawing.Size(303, 405)
Me.Grid1.TabIndex = 0
Me.Grid1.UncheckedImage = Nothing
'
'BtnOk
'
Me.BtnOk.Location = New System.Drawing.Point(143, 423)
Me.BtnOk.Name = "BtnOk"
Me.BtnOk.Size = New System.Drawing.Size(64, 22)
Me.BtnOk.TabIndex = 1
Me.BtnOk.Text = "确定"
Me.BtnOk.UseVisualStyleBackColor = True
'
'BtnCencel
'
Me.BtnCencel.Location = New System.Drawing.Point(216, 422)
Me.BtnCencel.Name = "BtnCencel"
Me.BtnCencel.Size = New System.Drawing.Size(75, 23)
Me.BtnCencel.TabIndex = 2
Me.BtnCencel.Text = "取消"
Me.BtnCencel.UseVisualStyleBackColor = True
'
'FrmCheckLog
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(303, 450)
Me.Controls.Add(Me.BtnCencel)
Me.Controls.Add(Me.BtnOk)
Me.Controls.Add(Me.Grid1)
Me.Name = "FrmCheckLog"
Me.Text = "FrmCheckLog"
Me.ResumeLayout(False)
End Sub
Friend WithEvents Grid1 As FlexCell.Grid
Friend WithEvents BtnOk As Button
Friend WithEvents BtnCencel As Button
End Class

View File

@@ -0,0 +1,120 @@
<?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>
</root>

View File

@@ -0,0 +1,46 @@
Public Class FrmCheckLog
Private Sub FrmCheckLog_Load(sender As Object, e As EventArgs) Handles Me.Load
Text = "选择显示列"
InitGrid()
End Sub
Public CheckRows As Dictionary(Of String, String)
Private Sub InitGrid()
With Grid1
.AutoRedraw = False
.DisplayRowNumber = True
.Cols = 3
.Rows = CheckRows.Count + 1
.ExtendLastCol = True
.Column(1).CellType = FlexCell.CellTypeEnum.CheckBox
For i As Integer = 0 To CheckRows.Count - 1
.Cell(i + 1, 1).Text = CheckRows.Values(i)
.Cell(i + 1, 2).Text = CheckRows.Keys(i)
Next
.AutoRedraw = True
.Refresh()
End With
End Sub
Private Sub BtnOk_Click(sender As Object, e As EventArgs) Handles BtnOk.Click
DialogResult = DialogResult.OK
For i As Integer = 1 To Grid1.Rows - 1
If Grid1.Cell(i, 1).BooleanValue Then
CheckRows(Grid1.Cell(i, 2).Text) = "1"
Else
CheckRows(Grid1.Cell(i, 2).Text) = "0"
End If
Next
End Sub
Private Sub BtnCencel_Click(sender As Object, e As EventArgs) Handles BtnCencel.Click
DialogResult = DialogResult.Cancel
End Sub
End Class

57
AUTS_Repair/FrmImage.Designer.vb generated Normal file
View File

@@ -0,0 +1,57 @@
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class FrmImage
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()
Me.PictureBox1 = New System.Windows.Forms.PictureBox()
CType(Me.PictureBox1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'PictureBox1
'
Me.PictureBox1.Dock = System.Windows.Forms.DockStyle.Fill
Me.PictureBox1.Location = New System.Drawing.Point(0, 0)
Me.PictureBox1.Name = "PictureBox1"
Me.PictureBox1.Size = New System.Drawing.Size(584, 441)
Me.PictureBox1.TabIndex = 0
Me.PictureBox1.TabStop = False
'
'FrmImage
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(584, 441)
Me.Controls.Add(Me.PictureBox1)
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow
Me.Name = "FrmImage"
Me.ShowIcon = False
Me.ShowInTaskbar = False
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent
Me.Text = "Frm"
Me.TopMost = True
CType(Me.PictureBox1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
End Sub
Friend WithEvents PictureBox1 As PictureBox
End Class

120
AUTS_Repair/FrmImage.resx Normal file
View File

@@ -0,0 +1,120 @@
<?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>
</root>

13
AUTS_Repair/FrmImage.vb Normal file
View File

@@ -0,0 +1,13 @@
Public Class FrmImage
Public Shadows Function ShowImage(img As Image) As DialogResult
Using frm As New FrmImage
frm.PictureBox1.Image = img
Return frm.ShowDialog()
End Using
End Function
Private Sub FrmImage_Load(sender As Object, e As EventArgs) Handles Me.Load
PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
Text = $"Image"
End Sub
End Class

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_Repair.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_Repair")>
<Assembly: AssemblyDescription("")>
<Assembly: AssemblyCompany("")>
<Assembly: AssemblyProduct("AUTS_Repair")>
<Assembly: AssemblyCopyright("Copyright © 2021")>
<Assembly: AssemblyTrademark("")>
<Assembly: ComVisible(False)>
'如果此项目向 COM 公开,则下列 GUID 用于 typelib 的 ID
<Assembly: Guid("dc7139a5-4f3a-4173-836f-b35f0054e739")>
' 程序集的版本信息由下列四个值组成:
'
' 主版本
' 次版本
' 生成号
' 修订号
'
'可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
'通过使用 "*",如下所示:
' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("1.1.0.0")>
<Assembly: AssemblyFileVersion("1.1.0.0")>

View File

@@ -0,0 +1,73 @@
'------------------------------------------------------------------------------
' <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_Repair.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
'''<summary>
''' 查找 System.Drawing.Bitmap 类型的本地化资源。
'''</summary>
Friend ReadOnly Property NoImg40_30() As System.Drawing.Bitmap
Get
Dim obj As Object = ResourceManager.GetObject("NoImg40_30", resourceCulture)
Return CType(obj,System.Drawing.Bitmap)
End Get
End Property
End Module
End Namespace

View File

@@ -0,0 +1,124 @@
<?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>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="NoImg40_30" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\bin\Debug\RepairImage\NoImg40_30.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View File

@@ -0,0 +1,73 @@
'------------------------------------------------------------------------------
' <auto-generated>
' This code was generated by a tool.
' Runtime Version:4.0.30319.42000
'
' Changes to this file may cause incorrect behavior and will be lost if
' the code is regenerated.
' </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", "11.0.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 Auto-Save Functionality"
#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(ByVal sender As Global.System.Object, ByVal 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_Repair.My.MySettings
Get
Return Global.AUTS_Repair.My.MySettings.Default
End Get
End Property
End Module
End Namespace

Some files were not shown because too many files have changed in this diff Show More