This repository has been archived on 2025-11-27. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
AUTS_OLD/AUTS_Repair/Form1.vb

1125 lines
40 KiB
VB.net
Raw Normal View History

2024-03-11 16:32:52 +08:00
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)
2024-03-11 16:32:52 +08:00
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)
2024-03-11 16:32:52 +08:00
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