1125 lines
40 KiB
VB.net
1125 lines
40 KiB
VB.net
|
|
Imports System.Reflection
|
|||
|
|
Imports UTS_Core.Database
|
|||
|
|
Imports UTS_Core.DebugLog
|
|||
|
|
Imports UTS_Core.UTSModule
|
|||
|
|
Imports UTS_Core.UTSModule.DbConnect
|
|||
|
|
Imports UTS_Core.UTSModule.DbTableModel.Customer
|
|||
|
|
|
|||
|
|
Public Class FrmMain
|
|||
|
|
Public Property UserInfo As Login.UserInfo
|
|||
|
|
|
|||
|
|
Public Property Lic As License.License
|
|||
|
|
|
|||
|
|
Private _ftp As FtpService
|
|||
|
|
|
|||
|
|
Private Function RunningInstance() As Process
|
|||
|
|
Dim current As Process = Process.GetCurrentProcess()
|
|||
|
|
Dim processes() As Process = Process.GetProcessesByName(current.ProcessName)
|
|||
|
|
For Each p As Process In processes
|
|||
|
|
If p.Id <> current.Id Then
|
|||
|
|
If Assembly.GetExecutingAssembly().Location.Replace("/", "\\") = current.MainModule.FileName Then
|
|||
|
|
Return p
|
|||
|
|
End If
|
|||
|
|
End If
|
|||
|
|
Next
|
|||
|
|
Return Nothing
|
|||
|
|
End Function
|
|||
|
|
|
|||
|
|
|
|||
|
|
Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
|
|||
|
|
ApplicationLog.WriteInfoLog($"{Application.ProductName} {Application.ProductVersion} 加载中。")
|
|||
|
|
|
|||
|
|
'加载License
|
|||
|
|
ShowLoginForm()
|
|||
|
|
|
|||
|
|
_ftp = New FtpService(UtsRegistry.FtpHost, CInt(Lic.FtpPort), Lic.FtpUser, Lic.FtpPwd)
|
|||
|
|
|
|||
|
|
Text = $"{Application.ProductName} {Application.ProductVersion})"
|
|||
|
|
|
|||
|
|
'开启录像软件
|
|||
|
|
|
|||
|
|
Dim exePath As String = $"{Application.StartupPath}\ScreenCapture\AMCAP.exe"
|
|||
|
|
If Process.GetProcessesByName("AMCAP").Length = 0 Then
|
|||
|
|
Try
|
|||
|
|
ExecuteCmd(exePath)
|
|||
|
|
Catch ex As Exception
|
|||
|
|
ApplicationLog.WriteErrorLog($"开启摄像头软件失败!原因:{ex.Message}")
|
|||
|
|
MsgBox($"开启摄像头软件失败!原因:{ex.Message}")
|
|||
|
|
End Try
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
'开启截图软件
|
|||
|
|
exePath = $"{Application.StartupPath}\ScreenCapture\Apowersoft Screen Capture Pro.exe"
|
|||
|
|
Try
|
|||
|
|
ExecuteCmd(exePath)
|
|||
|
|
Catch ex As Exception
|
|||
|
|
ApplicationLog.WriteErrorLog($"开启截屏软件失败!原因:{ex.Message}")
|
|||
|
|
MsgBox($"开启截屏软件失败!原因:{ex.Message}")
|
|||
|
|
End Try
|
|||
|
|
|
|||
|
|
Dim cmd As String
|
|||
|
|
Dim dtTable As DataTable
|
|||
|
|
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
|
|||
|
|
db.Open()
|
|||
|
|
|
|||
|
|
'查询维修类型
|
|||
|
|
cmd = db.CmdHelper.DbSearchAll(UtsDb.RemotePrivateDb, RepairTypesTable.TableName)
|
|||
|
|
dtTable = db.ExecuteDataTable(cmd)
|
|||
|
|
|
|||
|
|
Dim id As Integer
|
|||
|
|
Dim name As String
|
|||
|
|
For Each dtRow As DataRow In dtTable.Rows
|
|||
|
|
id = CInt(dtRow($"{RepairTypesTable.ColNames.ID}"))
|
|||
|
|
name = CStr(dtRow($"{RepairTypesTable.ColNames.Name}"))
|
|||
|
|
|
|||
|
|
Dim type As New RepairTypes With {.ID = id, .Name = name}
|
|||
|
|
_RepairTypes.Add(name, type)
|
|||
|
|
|
|||
|
|
'查询维修原因
|
|||
|
|
cmd = db.CmdHelper.DbSearchAll(UtsDb.RemotePrivateDb, RepairReasonTable.TableName, $"`{RepairReasonTable.ColNames.RepairType}` = {id}")
|
|||
|
|
Dim dtReason As DataTable = db.ExecuteDataTable(cmd)
|
|||
|
|
For Each drReason As DataRow In dtReason.Rows
|
|||
|
|
id = CInt(drReason($"{RepairReasonTable.ColNames.ID}"))
|
|||
|
|
name = CStr(drReason($"{RepairReasonTable.ColNames.Name}"))
|
|||
|
|
|
|||
|
|
type.RepairReason.Add(name, id)
|
|||
|
|
Next
|
|||
|
|
Next
|
|||
|
|
CboRepairType.Items.AddRange(_RepairTypes.Keys.ToArray)
|
|||
|
|
|
|||
|
|
|
|||
|
|
'查询维修结果
|
|||
|
|
cmd = db.CmdHelper.DbSearchAll(UtsDb.RemotePrivateDb, RepairResultTable.TableName)
|
|||
|
|
dtTable = db.ExecuteDataTable(cmd)
|
|||
|
|
For Each dtRow As DataRow In dtTable.Rows
|
|||
|
|
id = CInt(dtRow($"{RepairResultTable.ColNames.ID}"))
|
|||
|
|
name = CStr(dtRow($"{RepairResultTable.ColNames.Name}"))
|
|||
|
|
_RepairResult.Add(name, id)
|
|||
|
|
Next
|
|||
|
|
CboRepairResult.Items.AddRange(_RepairResult.Keys.ToArray)
|
|||
|
|
|
|||
|
|
cmd = db.CmdHelper.DbDistinctSearch(UtsDb.RemotePrivateDb, $"{RepairLogTable.ColNames.RepairComment}", RepairLogTable.TableName, $"1 = 1 limit 100")
|
|||
|
|
dtTable = db.ExecuteDataTable(cmd)
|
|||
|
|
Dim sl As New AutoCompleteStringCollection
|
|||
|
|
For Each dtRow As DataRow In dtTable.Rows
|
|||
|
|
sl.Add(dtRow($"{RepairLogTable.ColNames.RepairComment}").ToString)
|
|||
|
|
Next
|
|||
|
|
CboRepairScheme.AutoCompleteCustomSource = sl
|
|||
|
|
|
|||
|
|
db.Close()
|
|||
|
|
End Using
|
|||
|
|
|
|||
|
|
ApplicationLog.WriteInfoLog("窗体加载完成。")
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
Private _RepairResult As New Dictionary(Of String, Integer)
|
|||
|
|
Private _RepairSource As New Dictionary(Of String, Integer)
|
|||
|
|
|
|||
|
|
Private _RepairTypes As New Dictionary(Of String, RepairTypes)
|
|||
|
|
|
|||
|
|
Public Class RepairTypes
|
|||
|
|
Public ID As Integer
|
|||
|
|
|
|||
|
|
Public Name As String
|
|||
|
|
|
|||
|
|
Public RepairReason As Dictionary(Of String, Integer)
|
|||
|
|
|
|||
|
|
Sub New()
|
|||
|
|
RepairReason = New Dictionary(Of String, Integer)
|
|||
|
|
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
|
|||
|
|
Private Sub FrmMain_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
|
|||
|
|
'初始化产品图,默认4张项目图
|
|||
|
|
ProductImgs = New List(Of ProductRepairImage)
|
|||
|
|
ProductImgs.Add(New ProductRepairImage With {.Control = TsBtnImg0})
|
|||
|
|
ProductImgs.Add(New ProductRepairImage With {.Control = TsBtnImg1})
|
|||
|
|
ProductImgs.Add(New ProductRepairImage With {.Control = TsBtnImg2})
|
|||
|
|
ProductImgs.Add(New ProductRepairImage With {.Control = TsBtnImg3})
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 显示登录窗口
|
|||
|
|
''' </summary>
|
|||
|
|
Private Sub ShowLoginForm()
|
|||
|
|
If Login.LoginParams.IsShowLoginForm = False Then Return
|
|||
|
|
Using frmLogin As New Login.LoginForm
|
|||
|
|
If frmLogin.ShowDialog() = DialogResult.OK Then
|
|||
|
|
UserInfo = frmLogin.UserLoginInfo
|
|||
|
|
Lic = frmLogin.UserLicense
|
|||
|
|
Else
|
|||
|
|
Close()
|
|||
|
|
End If
|
|||
|
|
End Using
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#Region "记录查询"
|
|||
|
|
Private Sub SearchRepairRecord(sn As String)
|
|||
|
|
If String.IsNullOrEmpty(sn) Then
|
|||
|
|
MsgBox($"条码不能为空,请扫码后重试")
|
|||
|
|
Return
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
'获取SN总表中信息
|
|||
|
|
Dim barcodeInfo As SnListResult = GetBarcodeInfo(sn)
|
|||
|
|
If barcodeInfo Is Nothing Then
|
|||
|
|
MsgBox($“未查询到条码[{ sn}]相关的信息”)
|
|||
|
|
Return
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
'获取条码所属项目与站位信息
|
|||
|
|
Dim pInfo As New Project.ProjectInfo(UserInfo.UserId, UserInfo.UserName, barcodeInfo.ProductID, Project.ProjectInfo.InitializeModeEnum.RemoteDatabaseLoad)
|
|||
|
|
|
|||
|
|
Dim pTestLog As New ProductTestLog
|
|||
|
|
pTestLog.BarCode = sn
|
|||
|
|
pTestLog.ProjectIndex = barcodeInfo.ProductID
|
|||
|
|
pTestLog.ProjectName = pInfo.Name
|
|||
|
|
|
|||
|
|
'获取条码所有经过站位记录
|
|||
|
|
pTestLog.StationTestLogs.Clear()
|
|||
|
|
For sIndex As Integer = 0 To pInfo.Station.Count - 1
|
|||
|
|
Dim sTestLog As New StationTestLog
|
|||
|
|
sTestLog.StationIndex = pInfo.Station(sIndex).StationID
|
|||
|
|
sTestLog.StationName = pInfo.Station(sIndex).Name
|
|||
|
|
sTestLog.TimeString = barcodeInfo.TestResults(sIndex).TestTime
|
|||
|
|
sTestLog.Result = barcodeInfo.TestResults(sIndex).TestResult
|
|||
|
|
sTestLog.ParentProductLog = pTestLog
|
|||
|
|
|
|||
|
|
'获取条码测试站所有测试记录
|
|||
|
|
sTestLog.BarcodeTestLogs.Clear()
|
|||
|
|
Dim dtTable As DataTable = DbConnector.GetTestResult(pTestLog.ProjectIndex, sTestLog.StationIndex, pTestLog.BarCode)
|
|||
|
|
|
|||
|
|
For Each dtRow As DataRow In dtTable.Rows
|
|||
|
|
Dim bTestLog As New BarcodeTestLog
|
|||
|
|
|
|||
|
|
bTestLog.TimeString = dtRow($"{TestLogTable.ColNames.StartTime}").ToString
|
|||
|
|
bTestLog.ErrorCode = dtRow($"{TestLogTable.ColNames.ErrCode}").ToString
|
|||
|
|
bTestLog.ParentStationLog = sTestLog
|
|||
|
|
|
|||
|
|
Dim tmpResult As Object = dtRow($"{TestLogTable.ColNames.TestResult}")
|
|||
|
|
If IsDBNull(tmpResult) Then
|
|||
|
|
bTestLog.Result = Nothing
|
|||
|
|
Else
|
|||
|
|
bTestLog.Result = CBool(tmpResult)
|
|||
|
|
If bTestLog.Result = True Then
|
|||
|
|
|
|||
|
|
Else
|
|||
|
|
|
|||
|
|
End If
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
Dim bytes1(10) As Byte
|
|||
|
|
Dim bytes2(19) As Byte
|
|||
|
|
Array.Copy(bytes2, 1, bytes1, 0, 10)
|
|||
|
|
|
|||
|
|
For col As Integer = TestLogTable.ColNames.ID To dtTable.Columns.Count - 1
|
|||
|
|
bTestLog.Fileds.Add(dtTable.Columns(col).ColumnName, dtRow(dtTable.Columns(col).ColumnName).ToString)
|
|||
|
|
Next
|
|||
|
|
|
|||
|
|
sTestLog.BarcodeTestLogs.Add(bTestLog)
|
|||
|
|
Next
|
|||
|
|
pTestLog.StationTestLogs.Add(sTestLog)
|
|||
|
|
Next
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
'更新测试历史
|
|||
|
|
If TabRepairSource.SelectedIndex = 0 Then
|
|||
|
|
UpdateTestLog(TvwTestLog, pTestLog)
|
|||
|
|
Else
|
|||
|
|
UpdateTestLog(TvwTestLog_Request, pTestLog)
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
'查询条码历史维修记录
|
|||
|
|
_productRepairData.DUT_SN = pTestLog.BarCode
|
|||
|
|
_productRepairData.ProductID = pTestLog.ProjectIndex
|
|||
|
|
_productRepairData.ErrCode = ""
|
|||
|
|
_productRepairData.RepairType = -1
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
Private Sub BtnSearch_Click(sender As Object, e As EventArgs)
|
|||
|
|
Dim sn As String = TxtDevSn.Text
|
|||
|
|
SearchRepairRecord(TxtDevSn.Text)
|
|||
|
|
TxtDevSn.Focus()
|
|||
|
|
TxtDevSn.SelectAll()
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Private Sub TxtMarketSn_KeyDown(sender As Object, e As KeyEventArgs) Handles TxtMarketSn.KeyDown
|
|||
|
|
If e.KeyCode = Keys.Enter Then
|
|||
|
|
If String.IsNullOrWhiteSpace(TxtMarketSn.Text) Then Return
|
|||
|
|
SearchRepairRequest(TxtMarketSn.Text)
|
|||
|
|
|
|||
|
|
SearchRepairRecord(TxtMarketSn.Text)
|
|||
|
|
End If
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 项目索引
|
|||
|
|
''' </summary>
|
|||
|
|
Private _pid As Integer
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 返修订单号
|
|||
|
|
''' </summary>
|
|||
|
|
Private _num As String
|
|||
|
|
|
|||
|
|
Private Sub SearchRepairRequest(sn As String)
|
|||
|
|
If String.IsNullOrEmpty(sn) Then
|
|||
|
|
MsgBox($"条码不能为空,请扫码后重试")
|
|||
|
|
Return
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
Dim dtTable As DataTable
|
|||
|
|
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
|
|||
|
|
db.Open()
|
|||
|
|
|
|||
|
|
Dim cmd As String = db.CmdHelper.DbSearchAll(UtsDb.RemotePrivateDb, RepairRequestTable.TableName, $" `Barcode` = '{sn}' Order by ID Desc Limit 1")
|
|||
|
|
dtTable = db.ExecuteDataTable(cmd, False)
|
|||
|
|
|
|||
|
|
db.Close()
|
|||
|
|
End Using
|
|||
|
|
|
|||
|
|
If dtTable Is Nothing OrElse dtTable.Rows.Count = 0 Then
|
|||
|
|
MsgBox("未查询到报修记录!")
|
|||
|
|
Return
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
TvwRepairRequest.Nodes.Clear()
|
|||
|
|
For Each dtRow As DataRow In dtTable.Rows
|
|||
|
|
_pid = CInt(dtRow($"{RepairRequestTable.ColNames.ProductID}"))
|
|||
|
|
|
|||
|
|
Dim pInfo As New Project.ProjectInfo(UserInfo.UserId, UserInfo.UserName, _pid, Project.ProjectInfo.InitializeModeEnum.RemoteDatabaseLoad)
|
|||
|
|
|
|||
|
|
Dim pNode As New TreeNode($"{pInfo.Name}:{sn}")
|
|||
|
|
pNode.Nodes.Add($"产品类型:{pInfo.Name}")
|
|||
|
|
pNode.Nodes.Add($"产品条码:{sn}")
|
|||
|
|
pNode.Nodes.Add($"报修单号:{dtRow($"{RepairRequestTable.ColNames.RepairRequestNum}")}")
|
|||
|
|
pNode.Nodes.Add($"不良品来源:{dtRow($"{RepairRequestTable.ColNames.RejectSource}")}")
|
|||
|
|
pNode.Nodes.Add($"不良代码:{dtRow($"{RepairRequestTable.ColNames.RejectCode}")}")
|
|||
|
|
pNode.Nodes.Add($"不良说明:{dtRow($"{RepairRequestTable.ColNames.RejectDesc}")}")
|
|||
|
|
pNode.Nodes.Add($"创建时间:{dtRow($"{RepairRequestTable.ColNames.CreateTime}")}")
|
|||
|
|
pNode.Nodes.Add($"维修进度:{dtRow($"{RepairRequestTable.ColNames.RepairProgress}")}")
|
|||
|
|
pNode.Nodes.Add($"维修结果:{dtRow($"{RepairRequestTable.ColNames.RepairResult}")}")
|
|||
|
|
|
|||
|
|
TvwRepairRequest.Nodes.Add(pNode)
|
|||
|
|
|
|||
|
|
_num = dtRow($"{RepairRequestTable.ColNames.RepairRequestNum}").ToString
|
|||
|
|
Next
|
|||
|
|
TvwRepairRequest.ExpandAll()
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Private Sub TxtDevSn_KeyDown(sender As Object, e As KeyEventArgs) Handles TxtDevSn.KeyDown
|
|||
|
|
If e.KeyCode = Keys.Enter Then
|
|||
|
|
If String.IsNullOrWhiteSpace(TxtDevSn.Text) Then Return
|
|||
|
|
SearchRepairRecord(TxtDevSn.Text)
|
|||
|
|
|
|||
|
|
lblPassFailDisplay.Text = "Testing"
|
|||
|
|
lblPassFailDisplay.ForeColor = Color.Yellow
|
|||
|
|
|
|||
|
|
' TxtDevSn.Focus()
|
|||
|
|
' TxtDevSn.SelectAll()
|
|||
|
|
End If
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
Private Function GetBarcodeInfo(barcode As String) As SnListResult
|
|||
|
|
' Dim dtTable As DataTable = DbConnector.GetLocalBarcode(barcode)
|
|||
|
|
Dim dtTable As DataTable = DbConnector.GetRemoteBarcode(barcode)
|
|||
|
|
If dtTable.Rows.Count = 0 Then Return Nothing
|
|||
|
|
|
|||
|
|
Dim dtRow As DataRow = dtTable(0)
|
|||
|
|
Dim bt As New SnListResult
|
|||
|
|
|
|||
|
|
bt.BarCode = barcode
|
|||
|
|
bt.ProductID = CInt(dtRow($"{SnListTable.ColNames.ProductID}"))
|
|||
|
|
bt.CreateTime = CDate(dtRow($"{SnListTable.ColNames.CreateTime}"))
|
|||
|
|
|
|||
|
|
bt.TestResults.Clear()
|
|||
|
|
Dim testTime As String
|
|||
|
|
Dim testResult As Boolean?
|
|||
|
|
|
|||
|
|
Dim tmp As Object
|
|||
|
|
For stationIndex As Integer = 0 To 11
|
|||
|
|
tmp = dtRow($"S{stationIndex + 1}")
|
|||
|
|
If IsDBNull(tmp) Then
|
|||
|
|
If tmp Is Nothing Then
|
|||
|
|
Console.WriteLine($"S{stationIndex + 1} is nothing")
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
testTime = Nothing
|
|||
|
|
Else
|
|||
|
|
testTime = tmp.ToString()
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
tmp = dtRow($"Result{stationIndex + 1}")
|
|||
|
|
If IsDBNull(tmp) Then
|
|||
|
|
testResult = Nothing
|
|||
|
|
Else
|
|||
|
|
testResult = CBool(tmp)
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
bt.TestResults.Add(New TResult(testTime, testResult))
|
|||
|
|
Next
|
|||
|
|
|
|||
|
|
Return bt
|
|||
|
|
End Function
|
|||
|
|
|
|||
|
|
Private Sub UpdateTestLog(tvw As TreeView, pTestLog As ProductTestLog)
|
|||
|
|
tvw.Nodes.Clear()
|
|||
|
|
tvw.ExpandAll()
|
|||
|
|
Dim pNode As TreeNode = tvw.Nodes.Add($"{pTestLog.ProjectName}:{pTestLog.BarCode}")
|
|||
|
|
pNode.Tag = pTestLog
|
|||
|
|
For Each sTestLog As StationTestLog In pTestLog.StationTestLogs
|
|||
|
|
Dim sNode As TreeNode
|
|||
|
|
If sTestLog.Result Is Nothing Then
|
|||
|
|
sNode = pNode.Nodes.Add($"{sTestLog.StationName}:NoData")
|
|||
|
|
sNode.ForeColor = Color.Gray
|
|||
|
|
|
|||
|
|
ElseIf sTestLog.Result Then
|
|||
|
|
sNode = pNode.Nodes.Add($"{sTestLog.StationName}:Pass")
|
|||
|
|
sNode.ForeColor = Color.Green
|
|||
|
|
Else
|
|||
|
|
sNode = pNode.Nodes.Add($"{sTestLog.StationName}:Fail")
|
|||
|
|
sNode.ForeColor = Color.Red
|
|||
|
|
End If
|
|||
|
|
sNode.Tag = sTestLog
|
|||
|
|
|
|||
|
|
For Each bTestLog As BarcodeTestLog In sTestLog.BarcodeTestLogs
|
|||
|
|
Dim bNode As TreeNode
|
|||
|
|
If bTestLog.Result Is Nothing Then
|
|||
|
|
bNode = sNode.Nodes.Add($"{bTestLog.TimeString}")
|
|||
|
|
bNode.ForeColor = Color.Gray
|
|||
|
|
ElseIf bTestLog.Result Then
|
|||
|
|
bNode = sNode.Nodes.Add($"{bTestLog.TimeString} Pass")
|
|||
|
|
bNode.ForeColor = Color.Green
|
|||
|
|
Else
|
|||
|
|
bNode = sNode.Nodes.Add($"{bTestLog.TimeString} Fail")
|
|||
|
|
bNode.ForeColor = Color.Red
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
For Each filed As KeyValuePair(Of String, String) In bTestLog.Fileds
|
|||
|
|
bNode.Nodes.Add($"{filed.Key} : {filed.Value}")
|
|||
|
|
Next
|
|||
|
|
bNode.Collapse()
|
|||
|
|
bNode.Tag = bTestLog
|
|||
|
|
Next
|
|||
|
|
sNode.Expand()
|
|||
|
|
Next
|
|||
|
|
pNode.Expand()
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
Public Class SnListResult
|
|||
|
|
Sub New()
|
|||
|
|
TestResults = New List(Of TResult)()
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Public Property ProductID() As Integer
|
|||
|
|
|
|||
|
|
Public Property BarCode() As String
|
|||
|
|
|
|||
|
|
Public Property CreateTime() As DateTime
|
|||
|
|
|
|||
|
|
Public Property TestResults() As List(Of TResult)
|
|||
|
|
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
|
|||
|
|
Public Class TResult
|
|||
|
|
Sub New(time As String, result As Boolean?)
|
|||
|
|
TestTime = time
|
|||
|
|
TestResult = result
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Public Property TestTime As String
|
|||
|
|
|
|||
|
|
Public Property TestResult() As Boolean?
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
|
|||
|
|
Public Class ProductTestLog
|
|||
|
|
Sub New()
|
|||
|
|
ProjectIndex = -1
|
|||
|
|
StationTestLogs = New List(Of StationTestLog)
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Public ProjectIndex As Integer
|
|||
|
|
|
|||
|
|
Public ProjectName As String
|
|||
|
|
|
|||
|
|
Public BarCode As String
|
|||
|
|
|
|||
|
|
Public StationTestLogs As List(Of StationTestLog)
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
Public Class StationTestLog
|
|||
|
|
Sub New()
|
|||
|
|
StationIndex = -1
|
|||
|
|
BarcodeTestLogs = New List(Of BarcodeTestLog)
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Public ParentProductLog As ProductTestLog
|
|||
|
|
|
|||
|
|
Public StationIndex As Integer
|
|||
|
|
|
|||
|
|
Public StationName As String
|
|||
|
|
|
|||
|
|
Public TimeString As String
|
|||
|
|
|
|||
|
|
Public Result As Boolean?
|
|||
|
|
|
|||
|
|
Public BarcodeTestLogs As List(Of BarcodeTestLog)
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
Public Class BarcodeTestLog
|
|||
|
|
Sub New()
|
|||
|
|
ErrorCode = String.Empty
|
|||
|
|
TimeString = String.Empty
|
|||
|
|
Fileds = New Dictionary(Of String, String)
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
Public ParentStationLog As StationTestLog
|
|||
|
|
|
|||
|
|
Public ErrorCode As String
|
|||
|
|
|
|||
|
|
Public TimeString As String
|
|||
|
|
|
|||
|
|
Public Result As Boolean?
|
|||
|
|
|
|||
|
|
Public Fileds As Dictionary(Of String, String)
|
|||
|
|
End Class
|
|||
|
|
#End Region
|
|||
|
|
|
|||
|
|
|
|||
|
|
#Region "拍摄"
|
|||
|
|
''' <summary>当前编辑产品图像的序号</summary>
|
|||
|
|
Private _imgIndex As Integer
|
|||
|
|
|
|||
|
|
''' <summary>产品处理图像信息,当前上限4</summary>
|
|||
|
|
Private ProductImgs As List(Of ProductRepairImage)
|
|||
|
|
|
|||
|
|
''' <summary>修改图像显示时图像线程锁</summary>
|
|||
|
|
Private _changeImgLock As New Object
|
|||
|
|
|
|||
|
|
''' <summary>从数据库中读取或保存,产品维修数据</summary>
|
|||
|
|
Private _productRepairData As New ProductRepairData
|
|||
|
|
|
|||
|
|
|
|||
|
|
Private Sub GetBarcodeRepairLog(barcode As String, ByRef _repairData As ProductRepairData)
|
|||
|
|
Dim dtTable As DataTable = DbConnector.GetBarcodeRepairLog(barcode)
|
|||
|
|
|
|||
|
|
If dtTable.Rows.Count = 0 Then Return
|
|||
|
|
|
|||
|
|
_repairData.ErrCode = ""
|
|||
|
|
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
Private Sub TsBtnImg0_Click(sender As Object, e As EventArgs) Handles TsBtnImg3.Click, TsBtnImg2.Click, TsBtnImg1.Click, TsBtnImg0.Click
|
|||
|
|
Dim index As Integer = CInt(CType(sender, ToolStripButton).Tag)
|
|||
|
|
If _imgIndex = index Then Return
|
|||
|
|
|
|||
|
|
For i As Integer = 0 To ProductImgs.Count - 1
|
|||
|
|
If i = index Then
|
|||
|
|
ProductImgs(i).Control.Checked = True
|
|||
|
|
Else
|
|||
|
|
ProductImgs(i).Control.Checked = False
|
|||
|
|
End If
|
|||
|
|
Next
|
|||
|
|
|
|||
|
|
SyncLock _changeImgLock
|
|||
|
|
_imgIndex = index
|
|||
|
|
End SyncLock
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Public Class ProductRepairImage
|
|||
|
|
Public Property Image As Image
|
|||
|
|
|
|||
|
|
Public Property ImageName As String
|
|||
|
|
|
|||
|
|
Public Property ImagePath As String
|
|||
|
|
|
|||
|
|
Public Property Control As ToolStripButton
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
|
|||
|
|
Private Sub BtnCommit_Click(sender As Object, e As EventArgs) Handles BtnCommit.Click
|
|||
|
|
If CboRepairType.SelectedIndex = -1 Then
|
|||
|
|
MsgBox("请选择返修类型")
|
|||
|
|
Return
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
If CboRepairReason.SelectedIndex = -1 Then
|
|||
|
|
MsgBox("请选择返修原因")
|
|||
|
|
Return
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
If CboRepairResult.SelectedIndex = -1 Then
|
|||
|
|
MsgBox("请选择返修结果")
|
|||
|
|
Return
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
If String.IsNullOrWhiteSpace(CboRepairScheme.Text) Then
|
|||
|
|
MsgBox("请选择或输入返修方案")
|
|||
|
|
Return
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
Dim barcode As String
|
|||
|
|
If TabRepairSource.SelectedIndex = 0 Then
|
|||
|
|
barcode = TxtDevSn.Text
|
|||
|
|
|
|||
|
|
If String.IsNullOrWhiteSpace(barcode) Then
|
|||
|
|
MsgBox("请输入待维修产品条码")
|
|||
|
|
Return
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
Dim node As TreeNode = TvwTestLog.SelectedNode
|
|||
|
|
If node Is Nothing Then
|
|||
|
|
MsgBox("请选择维修记录进行维修")
|
|||
|
|
Return
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
If node.Level <> 2 Then
|
|||
|
|
MsgBox("请选择有效的站位维修记录进行维修")
|
|||
|
|
Return
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
ApplicationLog.WriteInfoLog($"产线返修录入,条码:{barcode}")
|
|||
|
|
|
|||
|
|
Dim tLog As BarcodeTestLog = CType(node.Tag, BarcodeTestLog)
|
|||
|
|
|
|||
|
|
_productRepairData.ProductID = tLog.ParentStationLog.ParentProductLog.ProjectIndex
|
|||
|
|
_productRepairData.StationID = tLog.ParentStationLog.StationIndex
|
|||
|
|
_productRepairData.OrderID = CInt(tLog.Fileds("OrderID"))
|
|||
|
|
_productRepairData.TestLogID = CInt(tLog.Fileds("ID"))
|
|||
|
|
|
|||
|
|
_productRepairData.TestPlan = tLog.Fileds("TestPlan")
|
|||
|
|
_productRepairData.FailSteps = tLog.Fileds("FailSteps")
|
|||
|
|
Try
|
|||
|
|
_productRepairData.FailMsg = tLog.Fileds("FailMsg")
|
|||
|
|
Catch ex As Exception
|
|||
|
|
ApplicationLog.WriteWarningLog($"填充FailMsg字段失败!原因:{ex.Message}")
|
|||
|
|
_productRepairData.FailMsg = ""
|
|||
|
|
End Try
|
|||
|
|
_productRepairData.ErrCode = tLog.Fileds("ErrCode")
|
|||
|
|
|
|||
|
|
_productRepairData.DUT_SN = barcode
|
|||
|
|
|
|||
|
|
_productRepairData.RepairSource = "产线返修"
|
|||
|
|
_productRepairData.DocuNumber = ""
|
|||
|
|
Else
|
|||
|
|
barcode = TxtMarketSn.Text
|
|||
|
|
|
|||
|
|
If String.IsNullOrWhiteSpace(barcode) Then
|
|||
|
|
MsgBox("请输入待维修产品条码")
|
|||
|
|
Return
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
ApplicationLog.WriteInfoLog($"生产返修录入,条码:{barcode}")
|
|||
|
|
|
|||
|
|
_productRepairData.ProductID = _pid
|
|||
|
|
|
|||
|
|
_productRepairData.DUT_SN = barcode
|
|||
|
|
|
|||
|
|
_productRepairData.RepairSource = "市场返修"
|
|||
|
|
_productRepairData.DocuNumber = _num
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
_productRepairData.RepairDate = Now
|
|||
|
|
|
|||
|
|
_productRepairData.RepairType = _RepairTypes(CboRepairType.Text).ID
|
|||
|
|
_productRepairData.RepairReason = _RepairTypes(CboRepairType.Text).RepairReason(CboRepairReason.Text)
|
|||
|
|
|
|||
|
|
_productRepairData.RepairComment = CboRepairScheme.Text
|
|||
|
|
|
|||
|
|
_productRepairData.RepairResult = _RepairResult(CboRepairResult.Text)
|
|||
|
|
|
|||
|
|
_productRepairData.ProductImages.Clear()
|
|||
|
|
|
|||
|
|
'ftp:图像上传
|
|||
|
|
For i As Integer = 0 To ProductImgs.Count - 1
|
|||
|
|
If ProductImgs(i).Image IsNot Nothing Then
|
|||
|
|
ProductImgs(i).ImageName = $"{_productRepairData.DUT_SN}_{Now:yyyyMMdd_HHmmss}_{i}.jpg"
|
|||
|
|
ProductImgs(i).ImagePath = $"{Application.StartupPath}\RepairImage\{ProductImgs(i).ImageName}"
|
|||
|
|
|
|||
|
|
Try
|
|||
|
|
ProductImgs(i).Image.Save(ProductImgs(i).ImagePath)
|
|||
|
|
_ftp.FtpUpload($"/uts_Manager/AUTS/{Lic.VendorName}/Repair/MasterImg/{ProductImgs(i).ImageName}", ProductImgs(i).ImagePath)
|
|||
|
|
Catch ex As Exception
|
|||
|
|
lblPassFailDisplay.Text = "FAIL"
|
|||
|
|
lblPassFailDisplay.ForeColor = Color.Red
|
|||
|
|
|
|||
|
|
ApplicationLog.WriteErrorLog($"保存产品图像错误,{ex.Message}")
|
|||
|
|
MsgBox($"保存产品图像错误,{ex.Message}")
|
|||
|
|
Return
|
|||
|
|
End Try
|
|||
|
|
|
|||
|
|
_productRepairData.ProductImages.Add(ProductImgs(i).ImageName)
|
|||
|
|
Else
|
|||
|
|
_productRepairData.ProductImages.Add("")
|
|||
|
|
End If
|
|||
|
|
Next
|
|||
|
|
|
|||
|
|
Try
|
|||
|
|
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
|
|||
|
|
db.Open()
|
|||
|
|
|
|||
|
|
Dim tbName As String = RepairLogTable.TableName
|
|||
|
|
Dim fileds As Dictionary(Of String, String) = _productRepairData.ToDbFileds
|
|||
|
|
Dim cmd As String = db.CmdHelper.DbInsert(UtsDb.RemotePrivateDb, tbName, fileds)
|
|||
|
|
|
|||
|
|
'保存维修记录
|
|||
|
|
db.ExecuteNonQuery(cmd)
|
|||
|
|
|
|||
|
|
'更新报修记录
|
|||
|
|
If TabRepairSource.SelectedIndex = 1 Then
|
|||
|
|
Dim condition As String = $"`{RepairLogTable.ColNames.DUT_SN}` = '{barcode}' order by id limit 1"
|
|||
|
|
Dim logId As Integer = CInt(db.ExecuteScalar(db.CmdHelper.DbSearch(UtsDb.RemotePrivateDb, $"{RepairLogTable.ColNames.ID}", tbName, condition)))
|
|||
|
|
|
|||
|
|
condition = $"`{RepairRequestTable.ColNames.Barcode}` = '{barcode}'"
|
|||
|
|
fileds.Clear()
|
|||
|
|
fileds.Add($"{RepairRequestTable.ColNames.RepairProgress}", $"已维修")
|
|||
|
|
fileds.Add($"{RepairRequestTable.ColNames.RepairResult}", $"{_RepairResult(CboRepairResult.Text)}")
|
|||
|
|
fileds.Add($"{RepairRequestTable.ColNames.RepairLogID}", $"{logId}")
|
|||
|
|
fileds.Add($"{RepairRequestTable.ColNames.Repairier}", $"{UserInfo.UserId}")
|
|||
|
|
cmd = db.CmdHelper.DbUpdate(UtsDb.RemotePrivateDb, RepairRequestTable.TableName, fileds, condition)
|
|||
|
|
db.ExecuteNonQuery(cmd)
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
db.Close()
|
|||
|
|
End Using
|
|||
|
|
|
|||
|
|
For i As Integer = 0 To ProductImgs.Count - 1
|
|||
|
|
ProductImgs(i).Image = Nothing
|
|||
|
|
ProductImgs(i).Control.Image = My.Resources.NoImg40_30
|
|||
|
|
Next
|
|||
|
|
|
|||
|
|
lblPassFailDisplay.ForeColor = Color.Green
|
|||
|
|
lblPassFailDisplay.Text = "PASS"
|
|||
|
|
|
|||
|
|
CboRepairScheme.AutoCompleteCustomSource.Add(CboRepairScheme.Text)
|
|||
|
|
|
|||
|
|
TxtDevSn.SelectAll()
|
|||
|
|
TxtDevSn.Focus()
|
|||
|
|
Catch ex As Exception
|
|||
|
|
lblPassFailDisplay.ForeColor = Color.Red
|
|||
|
|
lblPassFailDisplay.Text = "FAIL"
|
|||
|
|
|
|||
|
|
ApplicationLog.WriteErrorLog($"保存维修记录至云端错误,{ex.Message}")
|
|||
|
|
MsgBox($"保存维修记录至云端错误,{ex.Message}")
|
|||
|
|
End Try
|
|||
|
|
|
|||
|
|
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
Public Class ProductRepairData
|
|||
|
|
''' <summary>
|
|||
|
|
''' 维修产品索引
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Public Property ProductID As Integer
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 维修站位索引
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Public Property StationID As Integer
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 内部订单索引
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Public Property OrderID As Integer
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 绑定测试记录索引
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Public Property TestLogID As Integer
|
|||
|
|
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 产品条码
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Public Property DUT_SN As String
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 测试流程
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Public Property TestPlan As String
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 失败步骤
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Public Property FailSteps As String
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 失败提示信息
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Public Property FailMsg As String
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 错误代码
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Public Property ErrCode As String
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 维修日期
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Public Property RepairDate As DateTime
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 维修类型
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Public Property RepairType As Integer
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 维修原因
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Public Property RepairReason As Integer
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 维修来源
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Public Property RepairSource As String
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 产品单号
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Public Property DocuNumber As String
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 维修方案
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Public Property RepairComment As String
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 维修结果
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Public Property RepairResult As Integer
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 维修产品图
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Public Property ProductImages As List(Of String)
|
|||
|
|
|
|||
|
|
Sub New()
|
|||
|
|
ProductImages = New List(Of String)
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
Public Function ToDbFileds() As Dictionary(Of String, String)
|
|||
|
|
Dim dicFileds As New Dictionary(Of String, String)
|
|||
|
|
dicFileds.Add($"{RepairLogTable.ColNames.ProductID}", $"{ProductID}")
|
|||
|
|
dicFileds.Add($"{RepairLogTable.ColNames.StationID}", $"{StationID}")
|
|||
|
|
dicFileds.Add($"{RepairLogTable.ColNames.OrderID}", $"{OrderID}")
|
|||
|
|
dicFileds.Add($"{RepairLogTable.ColNames.TestLogID}", $"{TestLogID}")
|
|||
|
|
dicFileds.Add($"{RepairLogTable.ColNames.DUT_SN}", $"{DUT_SN}")
|
|||
|
|
dicFileds.Add($"{RepairLogTable.ColNames.TestPlan}", $"{TestPlan}")
|
|||
|
|
dicFileds.Add($"{RepairLogTable.ColNames.FailSteps}", $"{FailSteps}")
|
|||
|
|
dicFileds.Add($"{RepairLogTable.ColNames.FailMsg}", $"{FailMsg}")
|
|||
|
|
dicFileds.Add($"{RepairLogTable.ColNames.ErrCode}", $"{ErrCode}")
|
|||
|
|
dicFileds.Add($"{RepairLogTable.ColNames.RepairDate}", $"{RepairDate}")
|
|||
|
|
dicFileds.Add($"{RepairLogTable.ColNames.RepairType}", $"{RepairType}")
|
|||
|
|
dicFileds.Add($"{RepairLogTable.ColNames.RepairReason}", $"{RepairReason}")
|
|||
|
|
dicFileds.Add($"{RepairLogTable.ColNames.RepairSource}", $"{RepairSource}")
|
|||
|
|
dicFileds.Add($"{RepairLogTable.ColNames.DocuNumber}", $"{DocuNumber}")
|
|||
|
|
dicFileds.Add($"{RepairLogTable.ColNames.RepairComment}", $"{RepairComment}")
|
|||
|
|
dicFileds.Add($"{RepairLogTable.ColNames.RepairResult}", $"{RepairResult}")
|
|||
|
|
|
|||
|
|
For i As Integer = 0 To ProductImages.Count - 1
|
|||
|
|
dicFileds.Add($"ProductImg{i + 1}", ProductImages(i))
|
|||
|
|
Next
|
|||
|
|
|
|||
|
|
Return dicFileds
|
|||
|
|
End Function
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#End Region
|
|||
|
|
|
|||
|
|
|
|||
|
|
#Region "绘制图像"
|
|||
|
|
Private Sub FrmMain_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
|
|||
|
|
If e.Control Then
|
|||
|
|
Select Case e.KeyCode
|
|||
|
|
Case Keys.C
|
|||
|
|
CopyImage()
|
|||
|
|
Case Keys.D
|
|||
|
|
DeleteImage()
|
|||
|
|
Case Keys.V
|
|||
|
|
PasteImage()
|
|||
|
|
End Select
|
|||
|
|
End If
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Private Sub TsmiCopy_Click(sender As Object, e As EventArgs) Handles TsmiCopy.Click
|
|||
|
|
CopyImage()
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Private Sub TsmiPaste_Click(sender As Object, e As EventArgs) Handles TsmiPaste.Click
|
|||
|
|
PasteImage()
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Private Sub TsmiDelete_Click(sender As Object, e As EventArgs) Handles TsmiDelete.Click
|
|||
|
|
DeleteImage()
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Public Sub CopyImage()
|
|||
|
|
Console.WriteLine("Copy Data!")
|
|||
|
|
If ProductImgs(_imgIndex).Image Is Nothing Then Return
|
|||
|
|
Clipboard.SetDataObject(ProductImgs(_imgIndex).Image)
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Public Sub PasteImage()
|
|||
|
|
If Clipboard.ContainsImage Then
|
|||
|
|
Try
|
|||
|
|
ToolStrip2.Focus()
|
|||
|
|
|
|||
|
|
ProductImgs(_imgIndex).Control.Image = Clipboard.GetImage
|
|||
|
|
|
|||
|
|
ProductImgs(_imgIndex).Image = ProductImgs(_imgIndex).Control.Image
|
|||
|
|
Catch ex As Exception
|
|||
|
|
ApplicationLog.WriteErrorLog($"更新预览图失败!原因:{ex.Message}")
|
|||
|
|
MsgBox($"更新预览图失败!原因:{ex.Message}")
|
|||
|
|
End Try
|
|||
|
|
End If
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Public Sub DeleteImage()
|
|||
|
|
ProductImgs(_imgIndex).Image = Nothing
|
|||
|
|
|
|||
|
|
ProductImgs(_imgIndex).Control.Image = My.Resources.NoImg40_30
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Public Sub ExecuteCmd(filePath As String)
|
|||
|
|
Dim proc As New Process
|
|||
|
|
|
|||
|
|
With proc.StartInfo
|
|||
|
|
.FileName = filePath
|
|||
|
|
End With
|
|||
|
|
|
|||
|
|
Try
|
|||
|
|
proc.Start()
|
|||
|
|
Catch ex As Exception
|
|||
|
|
ApplicationLog.WriteErrorLog($"启动程序[{filePath}]失败,原因:{ex.Message}")
|
|||
|
|
Console.WriteLine($"ExecuteCmd Error:{ex.Message}")
|
|||
|
|
End Try
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Private Sub CboRepairType_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CboRepairType.SelectedIndexChanged
|
|||
|
|
If CboRepairType.SelectedIndex = -1 Then Return
|
|||
|
|
If _RepairTypes.ContainsKey(CboRepairType.Text) Then
|
|||
|
|
CboRepairReason.Items.Clear()
|
|||
|
|
CboRepairReason.Items.AddRange(_RepairTypes(CboRepairType.Text).RepairReason.Keys.ToArray)
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Private _lastNode As TreeNode
|
|||
|
|
|
|||
|
|
Private Sub TvwTestLog_NodeMouseClick(sender As Object, e As TreeNodeMouseClickEventArgs) Handles TvwTestLog.NodeMouseClick, TvwTestLog_Request.NodeMouseClick
|
|||
|
|
Console.WriteLine($"Level:{e.Node.Level},Index :{e.Node.Index}")
|
|||
|
|
|
|||
|
|
If e.Node.Level <> 2 Then Return
|
|||
|
|
Dim tLog As BarcodeTestLog = CType(e.Node.Tag, BarcodeTestLog)
|
|||
|
|
|
|||
|
|
Dim pid As Integer = tLog.ParentStationLog.ParentProductLog.ProjectIndex
|
|||
|
|
Dim sid As Integer = tLog.ParentStationLog.StationIndex
|
|||
|
|
Dim errCode As String = tLog.ErrorCode
|
|||
|
|
Dim failStep As String = tLog.Fileds("FailSteps")
|
|||
|
|
Dim testPlan As String = tLog.Fileds("TestPlan")
|
|||
|
|
Dim sn As String = tLog.Fileds("DUT_SN")
|
|||
|
|
|
|||
|
|
If _lastNode IsNot Nothing Then
|
|||
|
|
_lastNode.BackColor = TvwTestLog.BackColor
|
|||
|
|
End If
|
|||
|
|
e.Node.BackColor = Color.SkyBlue
|
|||
|
|
_lastNode = e.Node
|
|||
|
|
|
|||
|
|
Dim cmd As String
|
|||
|
|
Dim dtTable As DataTable
|
|||
|
|
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
|
|||
|
|
db.Open()
|
|||
|
|
|
|||
|
|
'更新ErrCode表
|
|||
|
|
cmd = db.CmdHelper.DbSearchAll(UtsDb.RemotePrivateDb, RepairLogTable.TableName, $"{RepairLogTable.ColNames.ErrCode} = '{errCode}' order by id desc limit 100")
|
|||
|
|
dtTable = db.ExecuteDataTable(cmd)
|
|||
|
|
GrdErrCode.DataSource = dtTable
|
|||
|
|
GrdErrCode.DisplayRowNumber = True
|
|||
|
|
GrdErrCode.ExtendLastCol = True
|
|||
|
|
repairCheckRows.Clear()
|
|||
|
|
|
|||
|
|
For i As Integer = 1 To GrdErrCode.Cols - 1
|
|||
|
|
repairCheckRows.Add(GrdErrCode.Cell(0, i).Text, "1")
|
|||
|
|
Next
|
|||
|
|
|
|||
|
|
'更新错误步骤表
|
|||
|
|
cmd = db.CmdHelper.DbSearchAll(UtsDb.RemotePrivateDb, RepairLogTable.TableName, $"{RepairLogTable.ColNames.TestPlan} = '{testPlan}' and {RepairLogTable.ColNames.FailSteps} = '{failStep}' order by id desc limit 100")
|
|||
|
|
dtTable = db.ExecuteDataTable(cmd)
|
|||
|
|
GrdTestPlan.DataSource = dtTable
|
|||
|
|
GrdTestPlan.ExtendLastCol = True
|
|||
|
|
GrdTestPlan.DisplayRowNumber = True
|
|||
|
|
|
|||
|
|
'更新SN的维修记录
|
|||
|
|
cmd = db.CmdHelper.DbSearchAll(UtsDb.RemotePrivateDb, RepairLogTable.TableName, $"{RepairLogTable.ColNames.DUT_SN} = '{sn}' order by id desc limit 100")
|
|||
|
|
dtTable = db.ExecuteDataTable(cmd)
|
|||
|
|
GrdSnRepair.DataSource = dtTable
|
|||
|
|
GrdSnRepair.ExtendLastCol = True
|
|||
|
|
GrdSnRepair.DisplayRowNumber = True
|
|||
|
|
|
|||
|
|
Dim tableName As String = TestLogTable.TableName(pid, sid)
|
|||
|
|
'更新当前站位所有测试记录表
|
|||
|
|
cmd = db.CmdHelper.DbSearchAll(UtsDb.RemotePrivateDb, tableName, "id > 0 order by id desc limit 100")
|
|||
|
|
dtTable = db.ExecuteDataTable(cmd, False)
|
|||
|
|
GrdAllRecord.DataSource = dtTable
|
|||
|
|
GrdAllRecord.ExtendLastCol = True
|
|||
|
|
GrdAllRecord.DisplayRowNumber = True
|
|||
|
|
|
|||
|
|
'更新当前站位Pass测试记录表
|
|||
|
|
cmd = db.CmdHelper.DbSearchAll(UtsDb.RemotePrivateDb, tableName, $"{TestLogTable.ColNames.TestResult} = 1 order by id desc limit 100")
|
|||
|
|
dtTable = db.ExecuteDataTable(cmd, False)
|
|||
|
|
GrdPassRecord.DataSource = dtTable
|
|||
|
|
GrdPassRecord.ExtendLastCol = True
|
|||
|
|
GrdPassRecord.DisplayRowNumber = True
|
|||
|
|
|
|||
|
|
'更新当前站位Fail测试记录表
|
|||
|
|
cmd = db.CmdHelper.DbSearchAll(UtsDb.RemotePrivateDb, tableName, $"{TestLogTable.ColNames.TestResult} = 0 order by id desc limit 100")
|
|||
|
|
dtTable = db.ExecuteDataTable(cmd, False)
|
|||
|
|
GrdFailRecord.DataSource = dtTable
|
|||
|
|
GrdFailRecord.ExtendLastCol = True
|
|||
|
|
GrdFailRecord.DisplayRowNumber = True
|
|||
|
|
|
|||
|
|
'更新当前站位对应SN测试记录表
|
|||
|
|
cmd = db.CmdHelper.DbSearchAll(UtsDb.RemotePrivateDb, tableName, $"{TestLogTable.ColNames.DUT_SN} = '{sn}' order by id desc limit 100")
|
|||
|
|
dtTable = db.ExecuteDataTable(cmd, False)
|
|||
|
|
GrdSnRecord.DataSource = dtTable
|
|||
|
|
GrdSnRecord.ExtendLastCol = True
|
|||
|
|
GrdSnRecord.DisplayRowNumber = True
|
|||
|
|
|
|||
|
|
testCheckRows.Clear()
|
|||
|
|
For i As Integer = 1 To GrdSnRecord.Cols - 1
|
|||
|
|
testCheckRows.Add(GrdSnRecord.Cell(0, i).Text, "1")
|
|||
|
|
Next
|
|||
|
|
|
|||
|
|
db.Close()
|
|||
|
|
End Using
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Dim frm As FrmImage
|
|||
|
|
Dim watch As New Stopwatch
|
|||
|
|
|
|||
|
|
Private Sub ShowImage(index As Integer)
|
|||
|
|
If ProductImgs(index).Image Is Nothing Then Return
|
|||
|
|
|
|||
|
|
If frm Is Nothing OrElse frm.Visible = False Then
|
|||
|
|
frm = New FrmImage
|
|||
|
|
frm.Location = New Point(Location.X + (Width - frm.Width) \ 2, Location.Y + (Height - frm.Height) \ 2)
|
|||
|
|
frm.StartPosition = FormStartPosition.Manual
|
|||
|
|
frm.TopMost = True
|
|||
|
|
frm.PictureBox1.Image = ProductImgs(index).Image
|
|||
|
|
frm.Show()
|
|||
|
|
Else
|
|||
|
|
frm.PictureBox1.Image = ProductImgs(index).Image
|
|||
|
|
End If
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Private Sub 完整图像ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 完整图像ToolStripMenuItem.Click
|
|||
|
|
ShowImage(_imgIndex)
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
Dim repairCheckRows As New Dictionary(Of String, String)
|
|||
|
|
Dim testCheckRows As New Dictionary(Of String, String)
|
|||
|
|
|
|||
|
|
Private Sub BtnCheckTest_Click(sender As Object, e As EventArgs) Handles BtnCheckTest.Click
|
|||
|
|
Dim frm As New FrmCheckLog
|
|||
|
|
frm.CheckRows = testCheckRows
|
|||
|
|
If frm.ShowDialog() <> DialogResult.OK Then Return
|
|||
|
|
Dim rows As Dictionary(Of String, String) = frm.CheckRows
|
|||
|
|
|
|||
|
|
For i As Integer = 0 To frm.CheckRows.Count - 1
|
|||
|
|
If frm.CheckRows.Values(i) = "1" Then
|
|||
|
|
GrdAllRecord.Column(i + 1).Visible = True
|
|||
|
|
GrdAllRecord.Column(i + 1).Visible = True
|
|||
|
|
GrdAllRecord.Column(i + 1).Visible = True
|
|||
|
|
GrdAllRecord.Column(i + 1).Visible = True
|
|||
|
|
Else
|
|||
|
|
GrdAllRecord.Column(i + 1).Visible = False
|
|||
|
|
GrdAllRecord.Column(i + 1).Visible = False
|
|||
|
|
GrdAllRecord.Column(i + 1).Visible = False
|
|||
|
|
GrdAllRecord.Column(i + 1).Visible = False
|
|||
|
|
End If
|
|||
|
|
Next
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Private Sub BtnCheckRepair_Click(sender As Object, e As EventArgs) Handles BtnCheckRepair.Click
|
|||
|
|
Dim frm As New FrmCheckLog
|
|||
|
|
frm.CheckRows = repairCheckRows
|
|||
|
|
If frm.ShowDialog() <> DialogResult.OK Then Return
|
|||
|
|
Dim rows As Dictionary(Of String, String) = frm.CheckRows
|
|||
|
|
|
|||
|
|
For i As Integer = 0 To frm.CheckRows.Count - 1
|
|||
|
|
If frm.CheckRows.Values(i) = "1" Then
|
|||
|
|
GrdTestPlan.Column(i + 1).Visible = True
|
|||
|
|
GrdErrCode.Column(i + 1).Visible = True
|
|||
|
|
GrdSnRepair.Column(i + 1).Visible = True
|
|||
|
|
Else
|
|||
|
|
GrdTestPlan.Column(i + 1).Visible = False
|
|||
|
|
GrdErrCode.Column(i + 1).Visible = False
|
|||
|
|
GrdSnRepair.Column(i + 1).Visible = False
|
|||
|
|
End If
|
|||
|
|
Next
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Private Sub FrmMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
|
|||
|
|
ApplicationLog.WriteInfoLog($"{Application.ProductName} {Application.ProductVersion} 运行程序关闭中。")
|
|||
|
|
|
|||
|
|
|
|||
|
|
ApplicationLog.WriteInfoLog($"运行程序已关闭。")
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
'鼠标移动至控件即出现预览图
|
|||
|
|
'Private Sub TsBtnImg0_MouseHover(sender As Object, e As EventArgs) Handles TsBtnImg0.MouseHover, TsBtnImg1.MouseHover, TsBtnImg2.MouseHover, TsBtnImg3.MouseHover
|
|||
|
|
' Dim tsBtn As ToolStripButton = CType(sender, ToolStripButton)
|
|||
|
|
' ShowImage(CInt(tsBtn.Tag))
|
|||
|
|
'End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
'Private Sub SplitContainer1_MouseLeave(sender As Object, e As EventArgs) Handles TsBtnImg0.MouseLeave, TsBtnImg1.MouseLeave, TsBtnImg2.MouseLeave, TsBtnImg3.MouseLeave
|
|||
|
|
' If frm.Visible Then frm.Visible = False
|
|||
|
|
|
|||
|
|
' Console.WriteLine("Hide Image!")
|
|||
|
|
'End Sub
|
|||
|
|
#End Region
|
|||
|
|
|
|||
|
|
|
|||
|
|
End Class
|