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/SQLliteReading/DbConnect/BAK_DbConnector.vb
2024-03-11 16:34:21 +08:00

1824 lines
78 KiB
VB.net
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Imports System.Data.Common
Imports System.IO
Imports System.Net
Imports System.Text
Imports UTS_Core.Database
Imports UTS_Core.Security
Imports UTS_Core.UTSModule.DbTableModel.Customer
Imports UTS_Core.UTSModule.DbTableModel.LocalPrivate
Imports UTS_Core.UTSModule.DbTableModel.Manage
Imports UTS_Core.UTSModule.Production
Imports UTS_Core.UTSModule.Station
Imports UTS_Core.UTSModule.Test
Namespace UTSModule.DbConnect
''' <summary>
''' 测试数据入库类
''' </summary>
Public Class DbConnector
#Region "通用执行"
''' <summary>
''' 是否能够连接远程网络
''' </summary>
''' <returns></returns>
Public Shared Function CanConnectToRemote() As Boolean
Return My.Computer.Network.IsAvailable
End Function
Public Shared Sub Update(db As DbExecutor, dbName As String, tbName As String, field As Dictionary(Of String, String), condition As String)
Dim cmdText As String = db.CmdHelper.DbUpdate(dbName, tbName, field, condition)
db.ExecuteNonQuery(cmdText) '执行语句
End Sub
Public Shared Sub Insert(db As DbExecutor, dbName As String, tbName As String, field As Dictionary(Of String, String))
Dim cmdText As String = db.CmdHelper.DbInsert(dbName, tbName, field)
db.ExecuteNonQuery(cmdText) '执行语句
End Sub
Public Shared Sub InsetOrUpdate(db As DbExecutor, dbName As String, tbName As String, field As Dictionary(Of String, String), condition As String)
If CInt(db.ExecuteScalar(db.CmdHelper.DbSearchCount(dbName, tbName, condition))) > 0 Then
Update(db, dbName, tbName, field, condition)
Else
Insert(db, dbName, tbName, field)
End If
End Sub
Public Shared Function SearchRowCount(db As DbExecutor, tbName As String, Optional condition As String = "") As Integer
Return CInt(db.ExecuteScalar(db.CmdHelper.SearchCount(tbName, condition)))
End Function
''' <summary>
''' 创建本地测试记录表
''' 由于同步数据不会下载测试记录表,所以本地测试记录表需要手动创建
''' <param name="projectIndex">项目索引</param>
''' <param name="stationIndex">工艺站索引</param>
''' </summary>
Public Shared Sub UtsCreateTestLogTableToLocal(projectIndex As Integer, stationIndex As Integer)
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
db.ExecuteNonQuery(TestLogTable.CreateTableString(String.Empty, TestLogTable.TableName(projectIndex, stationIndex), db.DatabaseType))
db.Close()
End Using
End Sub
''' <summary>
''' 创建本地测试记录表
''' 由于同步数据不会下载测试记录表,所以本地测试记录表需要手动创建
''' </summary>
''' <param name="tbName">测试记录表名</param>
Public Shared Sub UtsCreateTestLogTableToLocal(tbName As String)
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
db.ExecuteNonQuery(TestLogTable.CreateTableString(String.Empty, tbName, db.DatabaseType))
db.Close()
End Using
End Sub
Public Shared Sub UtsCreateTestLogTableToLocal(db As DbExecutor, tbName As String)
db.ExecuteNonQuery(TestLogTable.CreateTableString(String.Empty, tbName, db.DatabaseType))
End Sub
''' <summary>
''' 获取指定表中未存在的数据列集合
''' </summary>
''' <param name="db">数据库执行器</param>
''' <param name="dbName">需要查询的数据库名</param>
''' <param name="tbName">需要查询的数据表名</param>
''' <param name="fieldName">需要查询的字段名集合</param>
''' <returns></returns>
Public Shared Function GetUnExistsColList(db As DbExecutor, dbName As String, tbName As String, fieldName As List(Of String)) As List(Of String)
Dim colList As New List(Of String)
Dim dtCol As DataTable = db.ExecuteDataTable(db.CmdHelper.DbSearchAll(dbName, tbName, "1 = 0"))
For Each colName As String In fieldName
If String.IsNullOrWhiteSpace(colName) Then Continue For '剔除无效数据库字段名
If dtCol.Columns.Contains(colName) = False Then '当前数据表是否已经存在对应列信息
colList.Add(colName)
End If
Next
Return colList
End Function
''' <summary>
''' 检测测试记录字段名是否存在远端数据库,如果不存在则新增,存在则检测字段长度是否需要加长
''' </summary>
''' <param name="db">数据库执行器</param>
''' <param name="dbName">数据库名</param>
''' <param name="tbName">数据表名</param>
''' <param name="field">测试记录字段集合</param>
Public Shared Sub CheckTestLogFiledToRemote(db As DbExecutor, dbName As String, tbName As String, field As Dictionary(Of String, String))
Dim dtCol As DataTable = db.ExecuteDataTable(db.CmdHelper.DbSearchAll(dbName, tbName, "1 = 0"))
Dim fieldName As List(Of String) = field.Keys.ToList
Dim typeString As String
Dim length As Integer
For Each colName As String In fieldName
If String.IsNullOrWhiteSpace(colName) Then Continue For '剔除无效数据库字段名
If dtCol.Columns.Contains(colName) Then '当前数据表是否已经存在对应列信息
Select Case dtCol.Columns(colName).DataType.Name
Case "String" '仅处理VarChar类型
If field(colName).Length > dtCol.Columns(colName).MaxLength Then
length = GetFiledLength(field(colName).Length)
If length = -1 Then
Throw New Exception($"字段[{colName}] 超过最大长度2048的限制,无法入库!")
Else
typeString = $"varchar({length})"
End If
'修改列字段长度
db.ExecuteNonQuery($"Call `{dbName}`.`AlterTestLogFiled`('{dbName}','{tbName}','{colName}','{length}')")
End If
Case Else
Console.WriteLine(colName & ":" & dtCol.Columns(colName).DataType.Name)
End Select
Else
length = GetFiledLength(field(colName).Length)
If length = -1 Then
Throw New Exception($"字段[{colName}] 超过最大长度4096的限制,无法入库!")
Else
typeString = $"varchar({length})"
End If
'插入字段语句
db.ExecuteNonQuery($"Call `{dbName}`.`AlterTestLogFiled`('{dbName}','{tbName}','{colName}','{length}')")
End If
Next
End Sub
''' <summary>
''' 检测测试记录字段名是否存在远端数据库,如果不存在则新增,存在则检测字段长度是否需要加长
''' </summary>
''' <param name="db">数据库执行器</param>
''' <param name="dbName">数据库名</param>
''' <param name="tbName">数据表名</param>
''' <param name="field">测试记录字段集合</param>
Public Shared Sub CheckTestLogFiledToLocal(db As DbExecutor, dbName As String, tbName As String, field As Dictionary(Of String, String), Optional saveCache As Boolean = True)
Dim dtCol As DataTable = db.ExecuteDataTable(db.CmdHelper.DbSearchAll(dbName, tbName, "1 = 0"))
Dim fieldName As List(Of String) = field.Keys.ToList
Dim typeString As String
Dim length As Integer
For Each colName As String In fieldName
If String.IsNullOrWhiteSpace(colName) Then Continue For '剔除无效数据库字段名
length = GetFiledLength(field(colName).Length)
If length = -1 Then
Throw New Exception($"字段[{colName}] 超过最大长度2048的限制,无法入库!")
Else
typeString = $"varchar({length})"
End If
If dtCol.Columns.Contains(colName) Then '当前数据表是否已经存在对应列信息
Select Case dtCol.Columns(colName).DataType.Name
Case "String" '仅处理VarChar类型
If field(colName).Length > dtCol.Columns(colName).MaxLength Then
'修改字段语句
If db.DatabaseType = DbExecutor.DbTypeEnum.Sqlite Then
'由于sqlite的特殊性varchar类型不需要修改长度
Else
Throw New Exception($"暂未支持[{db.DatabaseType}]该类型数据库,请联系管理员添加支持!")
End If
If saveCache Then
Dim cmdText As String = $"Call `{UtsDb.RemotePrivateDb}`.`AlterTestLogFiled`('{UtsDb.RemotePrivateDb}','{tbName}','{colName}','{length}')"
SaveCmdStringToCacheTable(db, cmdText) '执行命令入缓存库
End If
End If
Case Else
Console.WriteLine("Other ColName - " & colName & ":" & dtCol.Columns(colName).DataType.Name)
End Select
Else
'插入字段语句
db.ExecuteNonQuery(db.CmdHelper.DbAddCol(dbName, tbName, colName, typeString))
If saveCache Then
Dim cmdText As String = $"Call `{UtsDb.RemotePrivateDb}`.`AlterTestLogFiled`('{UtsDb.RemotePrivateDb}','{tbName}','{colName}','{length}')"
SaveCmdStringToCacheTable(db, cmdText) '执行命令入缓存库
End If
End If
Next
End Sub
Private Shared Function GetFiledLength(len As Integer) As Integer
Dim result As Integer
If len = 0 Then
result = 8
ElseIf len <= 2048 Then
If len Mod 8 = 0 Then
result = len
Else
result = ((len \ 8) + 1) * 8
End If
Else
result = -1
End If
Return result
End Function
#End Region
#Region "远程执行"
Public Shared Sub UtsInsetOrUpdateToRemote(dbName As String, tbName As String, field As Dictionary(Of String, String), condition As String)
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
db.Open()
Dim remoteDbName As String = UtsFilterDbName(db.DatabaseType, dbName) '过滤库名
CheckTestLogFiledToRemote(db, remoteDbName, tbName, field)
InsetOrUpdate(db, remoteDbName, tbName, field, condition)
db.Close()
End Using
End Sub
Public Shared Sub UtsInsertToRemote(dbName As String, tbName As String, field As Dictionary(Of String, String))
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
db.Open()
Dim remoteDbName As String = UtsFilterDbName(db.DatabaseType, dbName) '过滤库名
CheckTestLogFiledToRemote(db, remoteDbName, tbName, field)
Insert(db, remoteDbName, tbName, field)
db.Close()
End Using
End Sub
Public Shared Sub UtsInsertToRemote(db As DbExecutor, dbName As String, tbName As String, field As Dictionary(Of String, String))
Dim remoteDbName As String = UtsFilterDbName(db.DatabaseType, dbName) '过滤库名
CheckTestLogFiledToRemote(db, remoteDbName, tbName, field)
Insert(db, remoteDbName, tbName, field)
End Sub
Public Shared Sub UtsUpdateToRemote(dbName As String, tbName As String, field As Dictionary(Of String, String), condition As String)
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
db.Open()
Dim remoteDbName As String = UtsFilterDbName(db.DatabaseType, dbName) '过滤库名
CheckTestLogFiledToRemote(db, remoteDbName, tbName, field)
Update(db, remoteDbName, tbName, field, condition)
db.Close()
End Using
End Sub
#End Region
#Region "本地执行"
''' <summary>
''' 在指定数据表中添加指定字段集合
''' </summary>
''' <param name="db">数据库执行器</param>
''' <param name="tbName">需要查询的数据表名</param>
''' <param name="field">添加字段的键值对,键为字段名,值为列的修饰</param>
''' <param name="saveCache">是否将执行命令保存到缓存表中</param>
Public Shared Sub UtsAddColsToLocal(db As DbExecutor, dbName As String, tbName As String, field As Dictionary(Of String, String), Optional saveCache As Boolean = True)
Dim localDbName As String = UtsFilterDbName(db.DatabaseType, dbName) '过滤库名
Dim remoteDbName As String = dbName
For Each colName As KeyValuePair(Of String, String) In field
db.ExecuteNonQuery(db.CmdHelper.DbAddCol(localDbName, tbName, colName.Key, colName.Value))
If saveCache = False Then Continue For '执行命令不保存在缓冲区则退出执行
Dim cmdHelper As DbCmdHelper = DbCmdHelper.CreateCmdHelper(UtsDb.RemoteDbType)
SaveCmdStringToCacheTable(db, cmdHelper.DbAddCol(remoteDbName, tbName, colName.Key, colName.Value)) '执行命令入缓存库
Next
End Sub
Public Shared Sub UtsInsetOrUpdateToLocal(dbName As String, tbName As String, field As Dictionary(Of String, String), condition As String, Optional saveCache As Boolean = True)
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
Dim localDbName As String = UtsFilterDbName(db.DatabaseType, dbName) '过滤库名
Dim remoteDbName As String = dbName
If CInt(db.ExecuteScalar(db.CmdHelper.DbSearchCount(localDbName, tbName, condition))) > 0 Then
UtsUpdateToLocal(db, remoteDbName, tbName, field, condition, saveCache)
Else
UtsInsertToLocal(db, remoteDbName, tbName, field, saveCache)
End If
db.Close()
End Using
End Sub
Public Shared Sub UtsInsertToLocal(dbName As String, tbName As String, field As Dictionary(Of String, String), Optional saveCache As Boolean = True)
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
UtsInsertToLocal(db, dbName, tbName, field, saveCache)
db.Close()
End Using
End Sub
Public Shared Sub UtsInsertToLocal(db As DbExecutor, dbName As String, tbName As String, field As Dictionary(Of String, String), Optional saveCache As Boolean = True)
Dim localDbName As String = UtsFilterDbName(db.DatabaseType, dbName) '过滤库名
Dim remoteDbName As String = dbName
CheckTestLogFiledToLocal(db, localDbName, tbName, field saveCache)
Dim cmdText As String = db.CmdHelper.DbInsert(localDbName, tbName, field)
db.ExecuteNonQuery(cmdText) '执行语句
If saveCache = False Then Return '执行命令不保存在缓冲区则退出执行
Dim cmdHelper As DbCmdHelper = DbCmdHelper.CreateCmdHelper(UtsDb.RemoteDbType)
SaveCmdStringToCacheTable(db, cmdHelper.DbInsert(remoteDbName, tbName, field)) '执行命令入缓存库
End Sub
Public Shared Sub UtsUpdateToLocal(dbName As String, tbName As String, field As Dictionary(Of String, String), condition As String, Optional saveCache As Boolean = True)
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
UtsUpdateToLocal(db, dbName, tbName, field, condition, saveCache)
db.Close()
End Using
End Sub
''' <summary>
''' 过滤数据库名当前sqlite数据库不需要指定库名
''' </summary>
''' <param name="dbType"></param>
''' <param name="dbName"></param>
''' <returns></returns>
Public Shared Function UtsFilterDbName(dbType As DbExecutor.DbTypeEnum, dbName As String) As String
If dbType = DbExecutor.DbTypeEnum.Sqlite Then 'sqlite数据库不需要指定dbName
Return String.Empty
Else
Return dbName
End If
End Function
Public Shared Sub UtsUpdateToLocal(db As DbExecutor, dbName As String, tbName As String, field As Dictionary(Of String, String), condition As String, Optional saveCache As Boolean = True)
Dim localDbName As String = UtsFilterDbName(db.DatabaseType, dbName) '过滤库名
Dim remoteDbName As String = dbName
CheckTestLogFiledToLocal(db, localDbName, tbName, field saveCache)
Dim cmdText As String = db.CmdHelper.DbUpdate(localDbName, tbName, field, condition)
db.ExecuteNonQuery(cmdText) '执行语句
If saveCache = False Then Return '执行命令不保存在缓冲区则退出执行
Dim cmdHelper As DbCmdHelper = DbCmdHelper.CreateCmdHelper(UtsDb.RemoteDbType)
SaveCmdStringToCacheTable(db, cmdHelper.DbUpdate(remoteDbName, tbName, field, condition)) '执行命令入缓存库
End Sub
''' <summary>
''' 保存执行语句到缓存表中
''' </summary>
''' <param name="db">数据库执行器</param>
''' <param name="commandText">Sql语句</param>
Public Shared Sub SaveCmdStringToCacheTable(db As DbExecutor, commandText As String)
'todo更改入库方式
Dim colName As String
Dim colNames As New List(Of String)
db.ClearDbParameter()
colName = $"{CacheTable.ColNamesEnum.DateTime}"
colNames.Add(colName)
db.AddDbParameter(DbType.DateTime, colName, $"{Now:yyyy-MM-dd HH:mm:ss}")
colName = $"{CacheTable.ColNamesEnum.SqlCmd}"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, commandText)
colName = $"{CacheTable.ColNamesEnum.IsUpload}"
colNames.Add(colName)
db.AddDbParameter(DbType.Boolean, colName, False)
Try
db.ExecuteNonQuery(db.CmdHelper.InsertParam(CacheTable.TableName, colNames))
Catch ex As Exception
Console.WriteLine($"SaveCmdStringToCacheTable DbType:{db.DatabaseType} Error:{ex.Message}")
End Try
End Sub
''' <summary>
''' 保存执行语句到缓存表中
''' </summary>
''' <param name="commandText">Sql语句</param>
Public Shared Sub SaveCmdStringToCacheTable(commandText As String)
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
SaveCmdStringToCacheTable(db, commandText)
db.Close()
End Using
End Sub
#End Region
#Region "指定执行句柄特殊操作"
''' <summary>
''' 查询对应产品名的对应产品索引,指定执行器方式
''' </summary>
''' <param name="db"></param>
''' <param name="dbName"></param>
''' <param name="projectName"></param>
''' <returns></returns>
Public Shared Function SearchProjectIndex(db As DbExecutor, dbName As String, projectName As String) As Integer
Dim tbName As String = ProjectTable.TableName
Dim colName As String = $"`{ProjectTable.ColNames.ID}`"
Dim condition As String = $"`{ProjectTable.ColNames.ProjectName}` = '{projectName}'"
Return CInt(db.ExecuteScalar(db.CmdHelper.DbSearch(dbName, colName, tbName, condition)))
End Function
Public Shared Function SearchStationIndex(db As DbExecutor, dbName As String, projectIndex As Integer, stationName As String) As Integer
Dim tbName As String = StationListTable.TableName
Dim colName As String = $"`{StationListTable.ColNames.ID}`"
Dim condition As String = $"`{StationListTable.ColNames.ProjectID}` = {projectIndex} and `{StationListTable.ColNames.StationName}` = '{stationName}'"
Return CInt(db.ExecuteScalar(db.CmdHelper.DbSearch(dbName, colName, tbName, condition)))
End Function
Public Shared Function SearchProjectIndex(db As DbExecutor, projectName As String) As Integer
Dim tbName As String = ProjectTable.TableName
Dim colName As String = $"`{ProjectTable.ColNames.ID}`"
Dim condition As String = $"`{ProjectTable.ColNames.ProjectName}` = '{projectName}'"
Return CInt(db.ExecuteScalar(db.CmdHelper.Search(colName, tbName, condition)))
End Function
Public Shared Function SearchStationIndex(db As DbExecutor, projectIndex As Integer, stationName As String) As Integer
Dim tbName As String = StationListTable.TableName
Dim colName As String = $"`{StationListTable.ColNames.ID}`"
Dim condition As String = $"`{StationListTable.ColNames.ProjectID}` = {projectIndex} and `{StationListTable.ColNames.StationName}` = '{stationName}'"
Return CInt(db.ExecuteScalar(db.CmdHelper.Search(colName, tbName, condition)))
End Function
Public Shared Function SearchStationIndex(db As DbExecutor, projectName As String, stationName As String) As Integer
Return SearchStationIndex(db, SearchProjectIndex(db, projectName), stationName)
End Function
#End Region
#Region "通用自动识别"
''' <summary>
''' 根据判断条件获取数据库是否存在数据,若存在则更新该数据,不存在则插入一条数据
''' </summary>
''' <param name="dbName">数据库名,账号操作多库时必填</param>
''' <param name="tbName">数据表名</param>
''' <param name="field">需要更新或插入的数据</param>
''' <param name="condition">判断条件,如 `Sn` = '1001'</param>
Public Shared Sub UtsInsertOrUpdate(dbName As String, tbName As String, field As Dictionary(Of String, String), condition As String)
If CanConnectToRemote() Then
UtsInsetOrUpdateToRemote(dbName, tbName, field, condition)
UtsInsetOrUpdateToLocal(dbName, tbName, field, condition, False)
Else
UtsInsetOrUpdateToLocal(dbName, tbName, field, condition, True)
End If
End Sub
Public Shared Sub UtsInsert(dbName As String, tbName As String, field As Dictionary(Of String, String))
If CanConnectToRemote() Then
UtsInsertToRemote(dbName, tbName, field)
UtsInsertToLocal(dbName, tbName, field, False)
Else
UtsInsertToLocal(dbName, tbName, field, True)
End If
End Sub
Public Shared Sub UtsUpdate(dbName As String, tbName As String, field As Dictionary(Of String, String), condition As String)
If CanConnectToRemote() Then
UtsUpdateToRemote(dbName, tbName, field, condition)
UtsUpdateToLocal(dbName, tbName, field, condition, False)
Else
UtsUpdateToLocal(dbName, tbName, field, condition, True)
End If
End Sub
#End Region
#Region "特殊自动识别"
''' <summary>
''' 获取匹配的用户信息
''' </summary>
''' <param name="userAccount">用户账号</param>
''' <param name="userPassword">用户密码</param>
''' <returns></returns>
Public Shared Function UtsGetUserInfo(userAccount As String, userPassword As String) As DataTable
Dim dtUser As DataTable
Dim tbName As String = UserListTable.TableName
Dim condition As String = $"`{UserListTable.ColNamesEnum.UserName}` = @user and `{UserListTable.ColNamesEnum.Password}` = @pwd"
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
db.AddDbParameter(DbType.AnsiString, "user", userAccount)
db.AddDbParameter(DbType.AnsiString, "pwd", Md5.GetStringMd5(Md5.GetStringMd5(userPassword)))
dtUser = db.ExecuteDataTable(db.CmdHelper.SearchAll(tbName, condition))
db.Close()
End Using
'todo:厂商校验
'本地查询到匹配用户信息
If dtUser.Rows.Count <> 0 Then Return dtUser
'本地未查询到用户,从云端查询
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
db.Open()
db.AddDbParameter(DbType.AnsiString, "user", userAccount)
db.AddDbParameter(DbType.AnsiString, "pwd", Md5.GetStringMd5(Md5.GetStringMd5(userPassword)))
dtUser = db.ExecuteDataTable(db.CmdHelper.DbSearchAll(UtsDb.RemotePublicDb, tbName, condition))
db.Close()
End Using
Return dtUser
End Function
''' <summary>
''' 保存指定字段得测试记录至指定表格中。
''' 直接执行保存操作,未检测表格是否存在。
''' 保存失败则会抛出异常。
''' </summary>
''' <param name="tbName">数据表名</param>
''' <param name="field">字段内容</param>
Public Shared Sub SaveTestRecord(tbName As String, field As Dictionary(Of String, String))
If CanConnectToRemote() Then
UtsInsertToRemote(UtsDb.RemotePrivateDb, tbName, field)
UtsInsertToLocal(UtsDb.RemotePrivateDb, tbName, field, False)
Else
UtsInsertToLocal(UtsDb.RemotePrivateDb, tbName, field, True)
End If
End Sub
''' <summary>
''' 新增SN至云端总表仅针对产品条码生成方式为测试录入的类型
''' </summary>
''' <param name="db">数据库执行器</param>
''' <param name="dbName">数据库名</param>
''' <param name="station">站位信息</param>
''' <param name="result">测试结果</param>
Public Shared Sub InsertBarcodeToRemote(db As DbExecutor, dbName As String, station As ProcessStation, result As TestResult)
If station.SnType <> ProcessStation.SnTypeEnum.Test Then Return
Dim condition As String = $"`{SnListTable.ColNames.BarCode}` = '{result.DUT_SN}' and `{SnListTable.ColNames.SnType}` = " & ProcessStation.SnTypeEnum.Test
Dim cmd As String = db.CmdHelper.DbSearchCount(dbName, SnListTable.TableName, condition)
If CInt(db.ExecuteScalar(cmd)) > 0 Then Return
'采用存储过程
cmd = $"Call {dbName}.AlterSnListBarcode(-1,-1,{station.ParentProject.Index},'{result.DUT_SN}',{station.SnType})"
db.ExecuteNonQuery(cmd)
End Sub
''' <summary>
''' 新增SN至本地总表仅针对产品条码生成方式为测试录入的类型
''' </summary>
''' <param name="db">数据库执行器</param>
''' <param name="dbName">数据库名</param>
''' <param name="station">站位信息</param>
''' <param name="result">测试结果</param>
''' <param name="saveCache">是否将结果保存至本地缓存表</param>
Public Shared Sub InsertBarcodeToLocal(db As DbExecutor, dbName As String, station As ProcessStation, result As TestResult, Optional saveCache As Boolean = True)
If station.SnType <> ProcessStation.SnTypeEnum.Test Then Return
Dim condition As String = $"`{SnListTable.ColNames.BarCode}` = '{result.DUT_SN}' and `{SnListTable.ColNames.SnType}` = " & ProcessStation.SnTypeEnum.Test
Dim cmdText As String = db.CmdHelper.DbSearchCount(dbName, SnListTable.TableName, condition)
If CInt(db.ExecuteScalar(cmdText)) > 0 Then Return
Dim filed As New Dictionary(Of String, String) From {
{$"{SnListTable.ColNames.ProductID}", station.ParentProject.Index.ToString},
{$"{SnListTable.ColNames.BarCode}", result.DUT_SN},
{$"{SnListTable.ColNames.SnType}", station.SnType.ToString},
{$"{SnListTable.ColNames.OrderID}", "-1"},
{$"{SnListTable.ColNames.OrderInternalID}", "-1"}
}
cmdText = db.CmdHelper.DbInsert(dbName, SnListTable.TableName, filed)
db.ExecuteNonQuery(cmdText)
If saveCache Then
'采用存储过程
cmdText = $"Call {UtsDb.RemotePrivateDb}.AlterSnListBarcode(-1,-1,{station.ParentProject.Index},'{result.DUT_SN}',{station.SnType})"
SaveCmdStringToCacheTable(db, cmdText)
End If
End Sub
''' <summary>
''' 更新Sn总表内容至远端数据库
''' </summary>
''' <param name="db">DB执行器</param>
''' <param name="dbName">数据库名</param>
''' <param name="station">当前站位信息</param>
''' <param name="result">当前测试结果</param>
Public Shared Sub UpdateSnListTableToRemote(db As DbExecutor, dbName As String, station As ProcessStation, result As TestResult)
Dim timeString As String = $"{result.StartTime:yyyy-MM-dd HH:mm:ss}"
Dim logResult As Integer = CInt(IIf(result.TestResult = TestResult.TestResultEnum.Pass, 1, 0))
Dim a1String As String = ""
'A类型站额外更新组装字段
If station.StationType = ProcessStation.StationTypeEnum.Assem Then
a1String = result.CustomRecord("AssemblySn")
End If
Dim sqlText As String = $"Call `{dbName}`.`UpdateSnListBarcode`('{result.DUT_SN}',{station.SnListOrder},'{timeString}',{logResult},'{a1String}');"
db.ExecuteNonQuery(sqlText)
'发送广播通知局域网其他设备
Dim app As UtsAppForm = UtsAppForm.CreateSingleton
Dim fileds As New Dictionary(Of String, String)
fileds.Add("DB", dbName) '用于区分是否同一厂商
fileds.Add("Barcode", result.DUT_SN)
fileds.Add("SnListOrder", station.SnListOrder.ToString)
fileds.Add("StartTime", timeString)
fileds.Add("Result", logResult.ToString)
fileds.Add("A1String", a1String)
app.SendAppMsg(Service.TaskJsonParam.AppMsgTypes.SnListChanged, fileds)
End Sub
Public Shared Sub UpdateSnListTableToLocal(db As DbExecutor, dbName As String, station As ProcessStation, result As TestResult, Optional saveCache As Boolean = True)
Dim timeString As String = $"{result.StartTime:yyyy-MM-dd HH:mm:ss}"
Dim logResult As Integer = CInt(IIf(result.TestResult = TestResult.TestResultEnum.Pass, 1, 0))
Dim a1String As String = ""
Dim localDbName As String = UtsFilterDbName(db.DatabaseType, dbName) '过滤库名
Dim updateString As String = $"`S{station.SnListOrder}` = '{timeString}',`Result{station.SnListOrder}` = {logResult}"
'A类型站额外更新组装字段
If station.StationType = ProcessStation.StationTypeEnum.Assem Then
a1String = result.CustomRecord("AssemblySn")
updateString &= $",`{SnListTable.ColNames.AssemblySn}` = '{a1String}',`{SnListTable.ColNames.AssemblyTime}` = '{timeString}'"
End If
Dim condition As String = $"`{SnListTable.ColNames.ProductID}` = '{station.ParentProject.Index}' and `{SnListTable.ColNames.BarCode}` = '{result.DUT_SN}'"
Dim cmdText As String = db.CmdHelper.DbUpdate(localDbName, SnListTable.TableName, updateString, condition)
db.ExecuteNonQuery(cmdText)
If saveCache Then
cmdText = $"Call `{UtsDb.RemotePrivateDb}`.`UpdateSnListBarcode`('{result.DUT_SN}',{station.SnListOrder},'{timeString}',{logResult},'{a1String}');"
SaveCmdStringToCacheTable(db, cmdText)
'发送广播通知局域网其他设备
Dim app As UtsAppForm = UtsAppForm.CreateSingleton
Dim fileds As New Dictionary(Of String, String)
fileds.Add("DB", dbName) '用于区分是否同一厂商
fileds.Add("Barcode", result.DUT_SN)
fileds.Add("SnListOrder", station.SnListOrder.ToString)
fileds.Add("StartTime", timeString)
fileds.Add("Result", logResult.ToString)
fileds.Add("A1String", a1String)
app.SendAppMsg(Service.TaskJsonParam.AppMsgTypes.SnListChanged, fileds)
End If
End Sub
''' <summary>
''' 更新本地SN总表的测试记录(用于处理组播写入Sn总表操作)
''' </summary>
''' <param name="barcode">测试条码</param>
''' <param name="snListOrder">对应总表站位顺序</param>
''' <param name="timeString">测试时间</param>
''' <param name="result">测试结果</param>
''' <param name="a1String">A1站对应条码</param>
Public Shared Sub UpdateLocalSnList(barcode As String, snListOrder As String, timeString As String, result As String, a1String As String)
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
Dim updateString As String = $"`S{snListOrder}` = '{timeString}',`Result{snListOrder}` = {result}"
If String.IsNullOrEmpty(a1String) = False Then
updateString &= $",`{SnListTable.ColNames.AssemblySn}` = '{a1String}',`{SnListTable.ColNames.AssemblyTime}` = '{timeString}'"
End If
Dim condition As String = $"`{SnListTable.ColNames.BarCode}` = '{barcode}'"
Dim cmdText As String = db.CmdHelper.DbUpdate("", SnListTable.TableName, updateString, condition)
db.ExecuteNonQuery(cmdText)
db.Close()
End Using
End Sub
''' <summary>
''' 更新远程订单表订单状态
''' </summary>
''' <param name="db">数据库句柄</param>
''' <param name="dbName">数据库名</param>
''' <param name="station">站位信息</param>
''' <param name="result">测试结果</param>
Public Shared Sub UpdateInternalOrderTableToRemote(db As DbExecutor, dbName As String, station As ProcessStation, result As TestResult)
If result.OrderID = -1 Then Return
Dim order As InternalOrderManager = InternalOrderManager.CreateManager()
If order.ID <> result.OrderID Then order.Initialize(result.OrderID)
Dim cmdText As String
Dim filed As New Dictionary(Of String, String)
Dim condition As String = $"`{OrderInternalTable.ColNames.ID}` = {result.OrderID}"
If station.ArtworkOrder = 1 Then
'仅在订单状态为3时更新状态为4
If order.OrderStatus > 3 Then Return
filed.Add($"{OrderInternalTable.ColNames.OrderStatus}", "4")
cmdText = db.CmdHelper.DbUpdate(dbName, OrderInternalTable.TableName, filed, condition)
db.ExecuteNonQuery(cmdText)
order.OrderStatus = 4
Try
GetData("http://uts-data.com/api/Common/ClearCache")
Catch ex As Exception
Console.WriteLine($"更新缓存数据失败,{ex.Message}")
End Try
End If
End Sub
''' <summary>
''' 更新本地订单表订单状态
''' </summary>
''' <param name="db">数据库句柄</param>
''' <param name="dbName">数据库名</param>
''' <param name="station">站位信息</param>
''' <param name="result">测试结果</param>
''' <param name="saveCache">是否将执行命令保存到缓存表中</param>
Public Shared Sub UpdateInternalOrderTableToLocal(db As DbExecutor, dbName As String, station As ProcessStation, result As TestResult, Optional saveCache As Boolean = True)
If result.OrderID = -1 Then Return
Dim order As InternalOrderManager = InternalOrderManager.CreateManager()
If order.ID <> result.OrderID Then order.Initialize(result.OrderID)
Dim localDbName As String = UtsFilterDbName(db.DatabaseType, dbName) '过滤库名
Dim remoteDbName As String = dbName
Dim cmdText As String
Dim filed As New Dictionary(Of String, String)
Dim condition As String = $"`{OrderInternalTable.ColNames.ID}` = {result.OrderID}"
If station.ArtworkOrder = 1 Then
'仅在订单状态为3时更新状态为4
If order.OrderStatus > 3 Then Return
filed.Add($"{OrderInternalTable.ColNames.OrderStatus}", "4")
cmdText = db.CmdHelper.DbUpdate(localDbName, OrderInternalTable.TableName, filed, condition)
db.ExecuteNonQuery(cmdText)
order.OrderStatus = 4
If saveCache Then
Dim cmdHelper As DbCmdHelper = DbCmdHelper.CreateCmdHelper(UtsDb.RemoteDbType)
cmdText = cmdHelper.DbUpdate(remoteDbName, OrderInternalTable.TableName, filed, condition)
SaveCmdStringToCacheTable(db, cmdText)
End If
End If
'If station.ArtworkOrder = station.ParentProject.Station.Count Then
' '仅在订单状态为4且生产数量与目标产品匹配更新状态为5
' If order.OrderStatus > 4 Then Return
' '查询订单数量
' cmdText = db.CmdHelper.DbSearchCount(localDbName, $"{SnListTable.TableName}", $" `{SnListTable.ColNames.OrderInternalID}` = {order.ID} and `{SnListTable.ColNames.ProductID}` = {order.ProductID} and `Result{station.SnListOrder}` = 1")
' Dim total As Integer = CInt(db.ExecuteScalar(cmdText))
' If total < order.ObjectiveYield Then Return
' '达到目标产能则更换订单状态
' filed.Add($"{OrderInternalTable.ColNames.OrderStatus}", "5")
' cmdText = db.CmdHelper.DbUpdate(localDbName, OrderInternalTable.TableName, filed, condition)
' db.ExecuteNonQuery(cmdText)
' order.OrderStatus = 5
' If saveCache Then
' Dim cmdHelper As DbCmdHelper = DbCmdHelper.CreateCmdHelper(UtsDb.RemoteDbType)
' cmdText = cmdHelper.DbUpdate(remoteDbName, OrderInternalTable.TableName, filed, condition)
' SaveCmdStringToCacheTable(db, cmdText)
' End If
'End If
End Sub
Public Shared Sub UpdateUniqueTestLogToRemote(db As DbExecutor, dbName As String, tbName As String, result As TestResult)
Dim field As Dictionary(Of String, String) = result.ToStringDictionary()
'新增不存在的字段
CheckTestLogFiledToRemote(db, dbName, tbName, field)
'删除并插入一行数据,实现存在则更新不存在则删除
Dim condition As String = $"`{TestLogTable.ColNames.DUT_SN}` = '{result.DUT_SN}'"
Dim cmdText As String = db.CmdHelper.DbDeleteRows(dbName, tbName, condition)
cmdText &= db.CmdHelper.DbInsert(dbName, tbName, field)
db.ExecuteNonQuery(cmdText)
End Sub
Public Shared Sub UpdateTestLogToRemote(db As DbExecutor, dbName As String, tbName As String, result As TestResult)
Dim field As Dictionary(Of String, String) = result.ToStringDictionary()
'新增不存在的字段
CheckTestLogFiledToRemote(db, dbName, tbName, field)
'添加测试记录
Dim cmdText As String = db.CmdHelper.DbInsert(dbName, tbName, field)
db.ExecuteNonQuery(cmdText)
End Sub
''' <summary>
''' 更新本地数据库测试记录,若存在相同条码号的记录则删除后添加
''' </summary>
''' <param name="db"></param>
''' <param name="dbName"></param>
''' <param name="tbName"></param>
''' <param name="result"></param>
''' <param name="saveCache"></param>
Public Shared Sub UpdateUniqueTestLogToLocal(db As DbExecutor, dbName As String, tbName As String, result As TestResult, Optional saveCache As Boolean = True)
Dim field As Dictionary(Of String, String) = result.ToStringDictionary()
Dim localDbName As String = UtsFilterDbName(db.DatabaseType, dbName) '过滤库名
Dim remoteDbName As String = dbName
'增加列
CheckTestLogFiledToLocal(db, localDbName, tbName, field saveCache)
'删除并插入一行数据,实现存在则更新不存在则删除
Dim condition As String = $"`{TestLogTable.ColNames.DUT_SN}` = '{result.DUT_SN}'"
Dim cmdText As String = db.CmdHelper.DbDeleteRows(localDbName, tbName, condition)
cmdText &= db.CmdHelper.DbInsert(localDbName, tbName, field)
db.ExecuteNonQuery(cmdText)
'执行命令不保存在缓冲区则退出执行
If saveCache Then
Dim cmdHelper As DbCmdHelper = DbCmdHelper.CreateCmdHelper(UtsDb.RemoteDbType)
cmdText = cmdHelper.DbDeleteRows(remoteDbName, tbName, condition)
cmdText &= cmdHelper.DbInsert(remoteDbName, tbName, field)
SaveCmdStringToCacheTable(db, cmdText)
End If
End Sub
''' <summary>
''' 更新本地数据库测试记录
''' </summary>
''' <param name="db"></param>
''' <param name="dbName"></param>
''' <param name="tbName"></param>
''' <param name="result"></param>
''' <param name="saveCache"></param>
Public Shared Sub UpdateTestLogToLocal(db As DbExecutor, dbName As String, tbName As String, result As TestResult, Optional saveCache As Boolean = True)
Dim field As Dictionary(Of String, String) = result.ToStringDictionary()
Dim localDbName As String = UtsFilterDbName(db.DatabaseType, dbName) '过滤库名
Dim remoteDbName As String = dbName
'增加不存在的列
CheckTestLogFiledToLocal(db, localDbName, tbName, field saveCache)
'执行保存操作
Dim cmdText As String = db.CmdHelper.DbInsert(localDbName, tbName, field)
db.ExecuteNonQuery(cmdText)
'执行命令不保存在缓冲区则退出执行
If saveCache Then
Dim cmdHelper As DbCmdHelper = DbCmdHelper.CreateCmdHelper(UtsDb.RemoteDbType)
cmdText = cmdHelper.DbInsert(remoteDbName, tbName, field)
SaveCmdStringToCacheTable(db, cmdText) '执行命令入缓存库
End If
End Sub
''' <summary>
''' 保存测试记录至云端数据库
''' </summary>
''' <param name="dbName"></param>
''' <param name="tbName"></param>
''' <param name="station"></param>
''' <param name="result"></param>
''' <returns></returns>
Public Shared Function SaveTestLogToRemote(dbName As String, tbName As String, station As ProcessStation, result As TestResult) As Boolean
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
Try
db.Open()
Catch ex As Exception
Console.WriteLine($"Open remote db error,{ex.Message}")
Return False
End Try
Dim dbTran As DbTransaction = db.BeginTransaction()
Try
'保存测试记录
UpdateTestLogToRemote(db, dbName, tbName, result)
'无序列模式,仅保存测试记录
If station.SnType <> ProcessStation.SnTypeEnum.None Then
'检测是否需要新增Sn仅当产品sntype为test的时候
InsertBarcodeToRemote(db, dbName, station, result)
'更新Sn列表
UpdateSnListTableToRemote(db, dbName, station, result)
'更新内部订单表
UpdateInternalOrderTableToRemote(db, dbName, station, result)
End If
Catch ex As Exception
Console.WriteLine($"save remote db error,{ex.Message}")
dbTran.Rollback() '失败则回滚
db.Close()
Return False
End Try
dbTran.Commit()
db.Close()
End Using
Return True
End Function
''' <summary>
''' 保存唯一测试日志至云端数据库,若存在相同条码号的记录则覆盖
''' </summary>
''' <param name="dbName"></param>
''' <param name="tbName"></param>
''' <param name="station"></param>
''' <param name="result"></param>
''' <returns></returns>
Public Shared Function SaveUniqueTestLogToRemote(dbName As String, tbName As String, station As ProcessStation, result As TestResult) As Boolean
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
Try
db.Open()
Catch ex As Exception
Console.WriteLine($"Open remote db error,{ex.Message}")
Return False
End Try
Dim remoteDbName As String = UtsFilterDbName(db.DatabaseType, dbName) '过滤库名
Dim dbTran As DbTransaction = db.BeginTransaction()
Try
'保存测试记录
UpdateUniqueTestLogToRemote(db, remoteDbName, tbName, result)
'无序列模式,仅保存测试记录
If station.SnType <> ProcessStation.SnTypeEnum.None Then
'检测是否需要新增Sn仅当产品sntype为test的时候
InsertBarcodeToRemote(db, dbName, station, result)
'更新Sn列表
UpdateSnListTableToRemote(db, remoteDbName, station, result)
'更新内部订单表
UpdateInternalOrderTableToRemote(db, dbName, station, result)
End If
Catch ex As Exception
Console.WriteLine($"Save unique remote db error,{ex.Message}")
dbTran.Rollback() '失败则回滚
db.Close()
Return False
End Try
dbTran.Commit()
db.Close()
End Using
Return True
End Function
''' <summary>
''' 保存测试记录至本地数据库
''' </summary>
''' <param name="dbName"></param>
''' <param name="tbName"></param>
''' <param name="station"></param>
''' <param name="result"></param>
''' <param name="saveCache"></param>
Public Shared Sub SaveTestLogToLocal(dbName As String, tbName As String, station As ProcessStation, result As TestResult, Optional saveCache As Boolean = True)
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
Try
db.Open()
Catch ex As Exception
Throw New Exception($"Open local db error,{ex.Message}")
End Try
Dim dbTran As DbTransaction = db.BeginTransaction()
Try
'保存测试记录
UpdateTestLogToLocal(db, dbName, tbName, result, saveCache)
'无序列模式,仅保存测试记录
If station.SnType <> ProcessStation.SnTypeEnum.None Then
'检测是否新增Sn至Sn总表
InsertBarcodeToLocal(db, dbName, station, result, saveCache)
'更新Sn列表测试时间
UpdateSnListTableToLocal(db, dbName, station, result, saveCache)
'更新内部订单表
UpdateInternalOrderTableToLocal(db, dbName, station, result, saveCache)
End If
Catch ex As Exception
Try
dbTran.Rollback() '失败则回滚
db.Close()
Catch ex2 As Exception
End Try
Throw New Exception($"Save test log error,{ex.Message}")
End Try
dbTran.Commit()
db.Close()
End Using
End Sub
''' <summary>
''' 保存唯一测试记录至本地数据库,若存在相同条码号的记录则覆盖
''' </summary>
''' <param name="dbName"></param>
''' <param name="tbName"></param>
''' <param name="station"></param>
''' <param name="result"></param>
''' <param name="saveCache"></param>
Public Shared Sub SaveUniqueTestLogToLocal(dbName As String, tbName As String, station As ProcessStation, result As TestResult, Optional saveCache As Boolean = True)
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
Try
db.Open()
Catch ex As Exception
Throw New Exception($"Open local db error,{ex.Message}")
End Try
Dim dbTran As DbTransaction = db.BeginTransaction()
Try
'保存测试记录
UpdateUniqueTestLogToLocal(db, dbName, tbName, result, saveCache)
'无序列模式,仅保存测试记录
If station.SnType <> ProcessStation.SnTypeEnum.None Then
'检测是否新增Sn至Sn总表
InsertBarcodeToLocal(db, dbName, station, result, saveCache)
'更新Sn列表测试时间与结果
UpdateSnListTableToLocal(db, dbName, station, result, saveCache)
'更新内部订单表
UpdateInternalOrderTableToLocal(db, dbName, station, result, saveCache)
End If
Catch ex As Exception
Try
dbTran.Rollback() '失败则回滚
db.Close()
Catch ex2 As Exception
End Try
Throw New Exception($"Save unique test log error,{ex.Message}")
End Try
dbTran.Commit()
db.Close()
End Using
End Sub
''' <summary>
''' 保存唯一测试记录至数据库,若存在相同条码号的记录则覆盖
''' </summary>
''' <param name="tbName"></param>
''' <param name="station"></param>
''' <param name="result"></param>
Public Shared Sub SaveUniqueTestLog(tbName As String, station As ProcessStation, result As TestResult)
If String.IsNullOrWhiteSpace(result.DUT_SN) Then
Return
End If
Dim saveCache As Boolean
If CanConnectToRemote() Then
Try
saveCache = SaveUniqueTestLogToRemote(UtsDb.RemotePrivateDb, tbName, station, result) = False
Catch ex As Exception
saveCache = True
Console.WriteLine($"SaveUniqueTestLogToRemote Error:{ex.Message}")
End Try
SaveUniqueTestLogToLocal(UtsDb.RemotePrivateDb, tbName, station, result, saveCache)
Else
saveCache = True
SaveUniqueTestLogToLocal(UtsDb.RemotePrivateDb, tbName, station, result, saveCache)
End If
End Sub
''' <summary>
''' 保存测试记录至数据库。
''' </summary>
''' <param name="tbName"></param>
''' <param name="station"></param>
''' <param name="result"></param>
Public Shared Sub SaveTestLog(tbName As String, station As ProcessStation, result As TestResult)
If String.IsNullOrWhiteSpace(result.DUT_SN) Then Return
Dim saveCache As Boolean
If CanConnectToRemote() Then
Try
saveCache = SaveTestLogToRemote(UtsDb.RemotePrivateDb, tbName, station, result) = False
Catch ex As Exception
Console.WriteLine($"Save TestLogToRemote Error:{ex.Message}")
saveCache = True
End Try
SaveTestLogToLocal(UtsDb.RemotePrivateDb, tbName, station, result, saveCache)
Else
saveCache = True
SaveTestLogToLocal(UtsDb.RemotePrivateDb, tbName, station, result, saveCache)
End If
End Sub
Public Shared Function SaveOtherSnToLocal(station As ProcessStation, result As TestResult, Optional saveCache As Boolean = True) As Boolean
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
Try
db.Open()
Catch ex As Exception
Console.WriteLine($"Open local db error,{ex.Message}")
Return False
End Try
'添加测试记录
Dim cmdText As String = db.CmdHelper.Insert(TestLogTable.TableName(station.ParentProject.Index, station.StationID), result.ToStringDictionary)
Try
db.ExecuteNonQuery(cmdText)
Catch ex As Exception
Return False
End Try
'检测是否新增Sn至Sn总表
Try
InsertBarcodeToLocal(db, "", station, result, saveCache)
Catch ex As Exception
Return False
End Try
'更新Sn总表对应站信息
Dim updateString As String = $"`S{station.SnListOrder}` = '{result.StartTime:yyyy-MM-dd HH:mm:ss}',`Result{station.SnListOrder}` = {IIf(result.TestResult = TestResult.TestResultEnum.Pass, 1, 0)}"
Dim condition As String = $"`{SnListTable.ColNames.ProductID}` = '{station.ParentProject.Index}' and `{SnListTable.ColNames.BarCode}` = '{result.DUT_SN}'"
Dim sqlText As String = db.CmdHelper.Update(SnListTable.TableName, updateString, condition)
Try
db.ExecuteNonQuery(sqlText)
Catch ex As Exception
Return False
End Try
'执行命令不保存在缓冲区则退出执行
If saveCache Then
Dim cmdHelper As DbCmdHelper = DbCmdHelper.CreateCmdHelper(UtsDb.RemoteDbType)
cmdText = cmdHelper.DbInsert(UtsDb.RemotePrivateDb, TestLogTable.TableName(station.ParentProject.Index, station.StationID), result.ToStringDictionary)
SaveCmdStringToCacheTable(db, cmdText) '执行命令入缓存库
cmdText = cmdHelper.DbUpdate(UtsDb.RemotePrivateDb, SnListTable.TableName, updateString, condition)
SaveCmdStringToCacheTable(db, cmdText) '执行命令入缓存库
End If
db.Close()
End Using
Return True
End Function
Public Shared Function SaveOtherSnToRemote(dbName As String, station As ProcessStation, result As TestResult) As Boolean
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
Try
db.Open()
Catch ex As Exception
Console.WriteLine($"Open remote db error,{ex.Message}")
Return False
End Try
'添加测试记录
Dim cmdText As String = db.CmdHelper.DbInsert(dbName, TestLogTable.TableName(station.ParentProject.Index, station.StationID), result.ToStringDictionary)
Try
db.ExecuteNonQuery(cmdText)
Catch ex As Exception
Return False
End Try
'增加条码检测
Try
InsertBarcodeToRemote(db, dbName, station, result)
Catch ex As Exception
Return False
End Try
'更新Sn总表对应站信息
Dim updateString As String = $"`S{station.SnListOrder}` = '{result.StartTime:yyyy-MM-dd HH:mm:ss}',`Result{station.SnListOrder}` = {IIf(result.TestResult = TestResult.TestResultEnum.Pass, 1, 0)}"
Dim condition As String = $"`{SnListTable.ColNames.ProductID}` = '{station.ParentProject.Index}' and `{SnListTable.ColNames.BarCode}` = '{result.DUT_SN}'"
Dim sqlText As String = db.CmdHelper.DbUpdate(dbName, SnListTable.TableName, updateString, condition)
Try
db.ExecuteNonQuery(sqlText)
Catch ex As Exception
Return False
End Try
db.Close()
End Using
Return True
End Function
''' <summary>
''' 更新组装站所有条码中与主条码产品相同的条码的测试信息(除主条码)
''' </summary>
''' <param name="snLst"></param>
''' <param name="station"></param>
''' <param name="result"></param>
Public Shared Sub SaveOtherSn(snLst As List(Of String), station As ProcessStation, result As TestResult)
Dim dbName As String = UtsDb.RemotePrivateDb
'0位置存放主条码,从1位置开始
For i As Integer = 1 To snLst.Count - 1
'其他类型
result.DUT_SN = snLst(i)
result.TestResult = TestResult.TestResultEnum.Pass
'自定义字段
result.AddCustomRecord("AssemblySn", String.Empty)
'查询条码所在的产品ID'与当前产品id符合则新增一条测试记录并更新序号总表中的站位测试时间
Dim pid As Integer = SearchProjectIndex(result.DUT_SN)
If pid = -1 Then
If station.SnType = ProcessStation.SnTypeEnum.Test Then
Dim saveCache As Boolean
If CanConnectToRemote() Then
saveCache = SaveOtherSnToRemote(dbName, station, result) = False
SaveOtherSnToLocal(station, result, saveCache)
Else
saveCache = True
SaveOtherSnToLocal(station, result, saveCache)
End If
End If
ElseIf pid = station.ParentProject.Index Then
Dim saveCache As Boolean
If CanConnectToRemote() Then
saveCache = SaveOtherSnToRemote(dbName, station, result) = False
SaveOtherSnToLocal(station, result, saveCache)
Else
saveCache = True
SaveOtherSnToLocal(station, result, saveCache)
End If
End If
Next
End Sub
Public Shared Function AddTestLogColsToRemote(dbName As String, tbName As String, field As Dictionary(Of String, String)) As Boolean
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
Try
db.Open()
Catch ex As Exception
Throw New Exception($"Open remote db error,{ex.Message}")
End Try
Dim dbTran As DbTransaction = db.BeginTransaction()
Try
Dim remoteDbName As String = UtsFilterDbName(db.DatabaseType, dbName) '过滤库名
Dim colList As List(Of String) = GetUnExistsColList(db, remoteDbName, tbName, field.Keys.ToList())
For Each colName As String In colList
db.ExecuteNonQuery(db.CmdHelper.DbAddCol(dbName, tbName, colName, field(colName)))
Next
Catch ex As Exception
dbTran.Rollback() '失败则回滚
db.Close()
Return False
End Try
dbTran.Commit()
db.Close()
End Using
Return True
End Function
Public Shared Sub AddTestLogColsToLocal(dbName As String, tbName As String, field As Dictionary(Of String, String), Optional saveCache As Boolean = True)
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
Try
db.Open()
Catch ex As Exception
Throw New Exception($"Open local db error,{ex.Message}")
End Try
Dim dbTran As DbTransaction = db.BeginTransaction()
Try
Dim remoteDbName As String = UtsFilterDbName(db.DatabaseType, dbName) '过滤库名
Dim colList As List(Of String) = GetUnExistsColList(db, remoteDbName, tbName, field.Keys.ToList())
Dim destField As New Dictionary(Of String, String)
For Each colName As String In colList
destField.Add(colName, field(colName))
Next
UtsAddColsToLocal(db, dbName, tbName, destField, saveCache)
Catch ex As Exception
dbTran.Rollback() '失败则回滚
db.Close()
Throw New Exception($"Add test log cols error,{ex.Message}")
End Try
dbTran.Commit()
db.Close()
End Using
End Sub
''' <summary>
''' 添加指定字段到测试记录表中
''' </summary>
''' <param name="tbName">测试记录表明</param>
''' <param name="field">字段键值对,键为字段名,值为字段描述</param>
Public Shared Sub AddTestLogCols(tbName As String, field As Dictionary(Of String, String))
Dim saveCache As Boolean
If CanConnectToRemote() Then
saveCache = AddTestLogColsToRemote(UtsDb.RemotePrivateDb, tbName, field) = False
AddTestLogColsToLocal(UtsDb.RemotePrivateDb, tbName, field, saveCache)
Else
saveCache = True
AddTestLogColsToLocal(UtsDb.RemotePrivateDb, tbName, field, saveCache)
End If
End Sub
''' <summary>
''' 从数据表中查询对应客户订单号的内部订单信息
''' </summary>
''' <param name="orderID">客户订单索引</param>
''' <returns></returns>
Public Shared Function GetInternalOrder(orderID As Integer) As DataTable
Dim dtTable As DataTable
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
Dim colNames As New List(Of String) From {
$"{OrderInternalTable.ColNames.ID}",
$"{OrderInternalTable.ColNames.OrderID}",
$"{OrderInternalTable.ColNames.OrderStatus}",
$"{OrderInternalTable.ColNames.CompanyID}",
$"{OrderInternalTable.ColNames.ProductID}",
$"{OrderInternalTable.ColNames.ProductTypeID}",
$"{OrderInternalTable.ColNames.CreateTime}",
$"{OrderInternalTable.ColNames.DeliveryTime}",
$"{OrderInternalTable.ColNames.InternalNo}",
$"{OrderInternalTable.ColNames.ObjectiveYield}",
$"{OrderInternalTable.ColNames.ObjectiveYieldTotal}"
}
Dim condition As New StringBuilder
condition.Append($"`{OrderInternalTable.ColNames.ID}` = {orderID}")
Dim cmdText As String = db.CmdHelper.Search(colNames, OrderInternalTable.TableName, condition.ToString())
dtTable = db.ExecuteDataTable(cmdText)
db.Close()
End Using
Return dtTable
End Function
''' <summary>
''' 从数据表中查询对应客户订单号的客户订单信息
''' </summary>
''' <param name="id">客户订单索引</param>
''' <returns></returns>
Public Shared Function SearchCustomerOrder(id As Integer) As CustomerOrderManager
Dim order As New CustomerOrderManager
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
Dim colNames As New List(Of String) From {
$"{OrdersTable.ColNames.CompanyID}",
$"{OrdersTable.ColNames.CostPrice}",
$"{OrdersTable.ColNames.TransactPrice}",
$"{OrdersTable.ColNames.CreateTime}",
$"{OrdersTable.ColNames.DeliveryTime}",
$"{OrdersTable.ColNames.OrderCount}",
$"{OrdersTable.ColNames.OrderNo}",
$"{OrdersTable.ColNames.OrderStatus}",
$"{OrdersTable.ColNames.ProductID}"
}
Dim condition As New StringBuilder
condition.Append($"`{OrdersTable.ColNames.ID}` = {id}")
Dim cmdText As String = db.CmdHelper.Search(colNames, OrdersTable.TableName, condition.ToString())
Using dtReader As DbDataReader = db.ExecuteReader(cmdText)
While dtReader.Read()
If System.Enum.TryParse(CStr(dtReader($"{OrdersTable.ColNames.OrderStatus}")), order.OrderStatus) = False Then
Throw New Exception($"Invalid OrderStatus :{dtReader($"{OrdersTable.ColNames.OrderStatus}")}.")
End If
order.OrderID = id
order.CompanyID = CInt(dtReader($"{OrdersTable.ColNames.CompanyID}"))
order.OrderCount = CInt(dtReader($"{OrdersTable.ColNames.OrderCount}"))
order.ProductID = CInt(dtReader($"{OrdersTable.ColNames.ProductID}"))
order.CostPrice = CDbl(dtReader($"{OrdersTable.ColNames.CostPrice}"))
order.TransactPrice = CDbl(dtReader($"{OrdersTable.ColNames.TransactPrice}"))
order.CreateTime = CDate(dtReader($"{OrdersTable.ColNames.CreateTime}"))
order.DeliveryTime = CDate(dtReader($"{OrdersTable.ColNames.DeliveryTime}"))
order.OrderNo = CStr(dtReader($"{OrdersTable.ColNames.OrderNo}"))
Exit While
End While
End Using
db.Close()
End Using
Return order
End Function
''' <summary>
''' 通过项目(产品)索引与条码查询客户订单号
''' </summary>
''' <param name="projectIndex"></param>
''' <param name="barcode"></param>
''' <returns></returns>
Public Shared Function SearchOrderID(projectIndex As Integer, barcode As String) As Integer
Dim orderID As Integer = -1
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
Dim cmd As String = db.CmdHelper.Search(SnListTable.ColNames.OrderInternalID.ToString(), SnListTable.TableName, $"`{SnListTable.ColNames.ProductID}` = {projectIndex} and `{SnListTable.ColNames.BarCode}` = '{barcode}' Order by `{SnListTable.ColNames.ID}` Desc limit 1")
Dim obj As Object = db.ExecuteScalar(cmd)
If IsNothing(obj) = False Then
orderID = CInt(obj)
End If
db.Close()
End Using
Return orderID
End Function
''' <summary>
''' 查询所有MO的名称与索引,优先云端,其次本地
''' </summary>
''' <returns></returns>
Public Shared Function SearchMoTable() As DataTable
Dim dt As DataTable = Nothing
Try
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
db.Open()
Dim colName As New List(Of String) From {OrderInternalTable.ColNames.ID.ToString, OrderInternalTable.ColNames.InternalNo.ToString}
dt = db.ExecuteDataTable(db.CmdHelper.DbSearch(UtsDb.RemotePrivateDb, colName, OrderInternalTable.TableName))
db.Close()
End Using
Return dt
Catch ex As Exception
Console.WriteLine($"Search Remote MoTable Error:{ex.Message}")
End Try
Try
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
Dim colName As New List(Of String) From {OrderInternalTable.ColNames.ID.ToString, OrderInternalTable.ColNames.InternalNo.ToString}
dt = db.ExecuteDataTable(db.CmdHelper.Search(colName, OrderInternalTable.TableName))
db.Close()
End Using
Return dt
Catch ex As Exception
Console.WriteLine($"Search MoTable Error:{ex.Message}")
End Try
Return dt
End Function
''' <summary>
''' 查询对应条码的对应产品索引,本地查询方式
''' </summary>
''' <param name="barcode"></param>
''' <returns></returns>
Public Shared Function SearchProjectIndex(barcode As String) As Integer
Dim pid As Integer = -1
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
Dim cmd As String = db.CmdHelper.Search(SnListTable.ColNames.ProductID.ToString(), SnListTable.TableName, $"`{SnListTable.ColNames.BarCode}` = '{barcode}'")
Dim obj As Object = db.ExecuteScalar(cmd)
If IsNothing(obj) = False Then
pid = CInt(obj)
End If
db.Close()
End Using
Return pid
End Function
''' <summary>
''' 查询对应条码的对应产品索引,本地查询方式
''' </summary>
''' <param name="barcode"></param>
''' <returns></returns>
Public Shared Function SearchBarcodeExists(barcode As String) As Boolean
Dim result As Boolean = False
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
Dim cmd As String = db.CmdHelper.SearchCount(SnListTable.TableName, $"`{SnListTable.ColNames.BarCode}` = '{barcode}'")
Try
Dim obj As Object = db.ExecuteScalar(cmd)
If CInt(obj) = 0 Then result = True
Catch ex As Exception
result = False
End Try
db.Close()
End Using
Return result
End Function
''' <summary>
''' 查询所有的错误代码,返回数据表
''' </summary>
''' <returns></returns>
Public Shared Function GetAllErrCode() As DataTable
Dim dtTable As DataTable
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
Dim cmd As String = db.CmdHelper.SearchAll(ErrCodeTable.TableName)
dtTable = db.ExecuteDataTable(cmd)
db.Close()
End Using
Return dtTable
End Function
''' <summary>
''' 查询所有的产品类相关,返回数据表
''' </summary>
''' <returns></returns>
Public Shared Function GetAllProductTypes() As DataTable
Dim dtTable As DataTable
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
Dim cmd As String = db.CmdHelper.SearchAll(ProductTypesTable.TableName)
dtTable = db.ExecuteDataTable(cmd)
db.Close()
End Using
Return dtTable
End Function
''' <summary>
''' 获取当前的测试记录数据表
''' </summary>
''' <param name="pid">项目索引</param>
''' <param name="sid">站位索引</param>
''' <returns></returns>
Public Shared Function GetTodayTestResult(pid As Integer, sid As Integer) As DataTable
Dim dtTable As DataTable
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
Dim tbName As String = TestLogTable.TableName(pid, sid)
Dim condition As String = $"`{TestLogTable.ColNames.StartTime}` like '{Now:yyyy-MM-dd}%'"
Dim cols As New List(Of String) From {
$"{TestLogTable.ColNames.StartTime}",
$"{TestLogTable.ColNames.DUT_SN}",
$"{TestLogTable.ColNames.TestResult}",
$"{TestLogTable.ColNames.ErrCode}"
}
Dim cmd As String = db.CmdHelper.Search(cols, tbName, condition)
dtTable = db.ExecuteDataTable(cmd, False)
db.Close()
End Using
Return dtTable
End Function
''' <summary>
''' 获取当前的条码指定站位的测试记录数据
''' </summary>
''' <param name="pid">项目索引</param>
''' <param name="sid">站位索引</param>
''' <returns></returns>
Public Shared Function GetTestResult(pid As Integer, sid As Integer, barcode As String) As DataTable
Dim dtTable As DataTable
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
db.Open()
Dim tbName As String = TestLogTable.TableName(pid, sid)
Dim condition As String = $"`{TestLogTable.ColNames.DUT_SN}` = '{barcode}'"
Dim cmd As String = db.CmdHelper.DbSearchAll(UtsDb.RemotePrivateDb, tbName, condition)
dtTable = db.ExecuteDataTable(cmd)
db.Close()
End Using
Return dtTable
End Function
''' <summary>
''' 从远程条码总表中获取条码信息
''' </summary>
''' <param name="barcode"></param>
''' <returns></returns>
Public Shared Function GetRemoteBarcode(barcode As String) As DataTable
Dim dtTable As DataTable
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
db.Open()
Dim tbName As String = SnListTable.TableName
Dim condition As String = $"`{SnListTable.ColNames.BarCode}` = '{barcode}'"
Dim cmd As String = db.CmdHelper.DbSearchAll(UtsDb.RemotePrivateDb, tbName, condition)
dtTable = db.ExecuteDataTable(cmd)
db.Close()
End Using
Return dtTable
End Function
''' <summary>
''' 从本地条码总表中获取条码信息
''' </summary>
''' <param name="barcode"></param>
''' <returns></returns>
Public Shared Function GetLocalBarcode(barcode As String) As DataTable
Dim dtTable As DataTable
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
db.Open()
Dim tbName As String = SnListTable.TableName
Dim condition As String = $"`{SnListTable.ColNames.BarCode}` = '{barcode}'"
Dim cmd As String = db.CmdHelper.SearchAll(tbName, condition)
dtTable = db.ExecuteDataTable(cmd)
db.Close()
End Using
Return dtTable
End Function
''' <summary>
''' 更新数据库服务表中的信息
''' </summary>
''' <param name="dsIndex">服务索引</param>
''' <param name="filed">更新字段值及内容</param>
Public Shared Sub UpdateServiceTable(dsIndex As String, filed As Dictionary(Of String, String))
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
db.Open()
Dim tableName As String = $"{DataServiceListTable.TableName}"
Dim condition As String = $"{DataServiceListTable.ColNames.ID} = {dsIndex}"
db.ExecuteNonQuery(db.CmdHelper.DbUpdate(UtsDb.RemotePublicDb, tableName, filed, condition))
db.Close()
End Using
End Sub
Public Shared Function GetBarcodeRepairLog(barcode As String) As DataTable
Dim dtTable As DataTable
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
db.Open()
Dim tbName As String = RepairLogTable.TableName
Dim condition As String = $"`{RepairLogTable.ColNames.DUT_SN}` = '{barcode}'"
Dim cmd As String = db.CmdHelper.DbSearchAll(UtsDb.RemotePrivateDb, tbName, condition)
dtTable = db.ExecuteDataTable(cmd)
db.Close()
End Using
Return dtTable
End Function
''' <summary>
''' 更新缓存
''' </summary>
''' <param name="url"></param>
''' <returns></returns>
Public Shared Function GetData(url As String) As String
Dim request As HttpWebRequest = CType(WebRequest.Create(url & "?" & $"cmd=UP&dbName={""}"), HttpWebRequest)
request.Accept = "text/html,application/xhtml+xml,*/*"
request.ContentType = "application/json"
request.Method = "GET"
Dim sr As New StreamReader(request.GetResponse().GetResponseStream)
Return sr.ReadToEnd
End Function
#End Region
End Class
End Namespace