371 lines
20 KiB
VB.net
Raw Normal View History

Imports MySql.Data.MySqlClient
Imports Renci.SshNet
Module mySQLModule
'' MySQL 접속 정보
Private Const LocalHostIP As String = "192.168.0.250"
Private Const UserName As String = "root"
Private Const UserPasswrod As String = "JOMT1646db!!"
Private DataBaseName As String = "jomtOrderTestDB"
Private Conn As String = "Server=" + LocalHostIP + ";DataBase=" + DataBaseName + ";user=" + UserName + ";password=" + UserPasswrod + ";"
Private sqlCon As New MySqlConnection(Conn)
Private sqlCmd As New MySqlCommand()
Private sqlData As MySqlDataReader '' SQL Server와 연결을 유지한 상태에서 한번에 한 레코드(One Row)씩 데이타를 가져오는데 사용된다
Public sqlDataQuery() As Object
Public Const SaleDB As String = "jomtTesterDB.jomtSalesPackingTbl"
Public Const NonTDDB As String = "jomtTesterDB.jomtNonTDTbl"
Public Const CartTDDB As String = "jomtTesterDB.jomtCartridgeTbl"
Public Const OrderDB As String = "jomtOrderDB.jomtOrderTbl"
Public Const PlistDB As String = "jomtTesterDB.jomtProdList"
Dim genuineProductDtoMap As Dictionary(Of String, GenuineProductDto)
Private orderCodeList As HashSet(Of String)
Public Function GetDBConn() As MySqlConnection
Try
If sqlCon.State <> ConnectionState.Open Then
sqlCon.Open()
End If
Return sqlCon
Catch ex As Exception
MsgBox("MySQL Command Error:" + vbCrLf + Err.Description)
Return Nothing
End Try
End Function
Public Sub lowProdList(dic As Dictionary(Of String, String))
Using Conn As MySqlConnection = GetDBConn()
Dim cmd As New MySqlCommand("SELECT 88_Code, ModelNum, ColorNum FROM jomtTesterDB.jomtProdList WHERE 88_Code IS NOT NULL", Conn)
Using reader As MySqlDataReader = cmd.ExecuteReader()
While reader.Read
Dim key = reader("88_Code").ToString.Trim
Dim value = reader("ModelNum").ToString.Trim + reader("ColorNum").ToString.Trim
dic.Add(key, value)
End While
End Using
End Using
End Sub
Public Function FindSerialsByDate(targetDate As Date) As ValueTuple(Of List(Of String), List(Of String))
Using conn As MySqlConnection = GetDBConn()
Dim getSerialCmd As New MySqlCommand("SELECT Serial_Number,Order_Code FROM jomtOrderDB.jomtOrderTbl
WHERE Invoice_Number IS NOT NULL
AND Serial_Number IS NOT NULL
AND ((LEFT(Serial_Number,1) < '8' AND LENGTH(Serial_Number) > 11 ) OR Serial_Number in (SELECT 88_Code FROM jomtTesterDB.jomtProdList WHERE 88_Code IS NOT NULL))
AND genuine_date is null
AND Shipment_Date = @date", conn)
getSerialCmd.Parameters.AddWithValue("@date", targetDate)
Dim serials As New List(Of String)
Dim unmatchedSerials As New List(Of String)
orderCodeList = New HashSet(Of String)
Using reader As MySqlDataReader = getSerialCmd.ExecuteReader()
While reader.Read()
orderCodeList.Add(reader("Order_Code").ToString().Trim())
Dim raw = reader("Serial_Number").ToString().Trim()
If raw.Contains("/") Then
serials.AddRange(raw.Split("/"c).Select(Function(s) s.Trim()).Where(Function(s) s.Length > 0))
unmatchedSerials.Add(raw.Split("/"c).Select(Function(s) s.Trim()).FirstOrDefault(Function(s) s.Length > 0))
ElseIf raw.Length > 0 Then
serials.Add(raw)
End If
End While
End Using
Return (serials.ToList(), unmatchedSerials.ToList())
End Using
End Function
Public Sub FillFromOrderTblByLike(dtoMap As Dictionary(Of String, GenuineProductDto), likeClauses As List(Of String))
Using conn As MySqlConnection = GetDBConn()
For Each clause In likeClauses
Dim query As String =
"SELECT Serial_Number, Item_Code, Item_Name, Invoice_Number, Packing_Code, DATE_FORMAT(Shipment_Date, '%Y-%m-%d') AS Shipment_Date, " &
"Account_Name, Order_Code, Orderer_Name, Receiver_Name, Phone_Number, Address, Refer " &
"FROM jomtOrderDB.jomtOrderTbl " &
"WHERE " & clause
Using cmd As New MySqlCommand(query, conn)
Using reader = cmd.ExecuteReader()
While reader.Read()
Dim serialRaw = reader("Serial_Number").ToString().Trim()
Dim serials = serialRaw.Split("/"c)
For Each sn In serials
Dim key = sn.Trim()
If dtoMap.ContainsKey(key) Then
Dim dto = dtoMap(key)
dto.ModelCode = reader("Item_Code").ToString()
dto.Model = reader("Item_Name").ToString()
dto.InvoiceNumber = reader("Invoice_Number").ToString()
dto.PackingSn = reader("Packing_Code").ToString()
dto.BuyDate = reader("Shipment_Date").ToString()
dto.SalesStore = reader("Account_Name").ToString()
dto.SalesOrderNo = reader("Order_Code").ToString()
dto.OrderName = reader("Orderer_Name").ToString()
dto.RecipientName = reader("Receiver_Name").ToString()
dto.OrderHp = reader("Phone_Number").ToString()
dto.OrderAddress = reader("Address").ToString()
dto.Note = reader("Refer").ToString()
End If
Next
End While
End Using
End Using
Next
End Using
End Sub
Public Sub FillFromOrderTblByIn(dtoMap As Dictionary(Of String, GenuineProductDto), inClauses As List(Of String))
Dim serials = dtoMap.Keys.ToList()
Dim missingItemCodeSNs As New List(Of String)
Using conn As MySqlConnection = GetDBConn()
For Each clause In inClauses
Dim query As String =
"SELECT Serial_Number, Item_Code, Item_Name, Invoice_Number, Packing_Code, DATE_FORMAT(Shipment_Date, '%Y-%m-%d') AS Shipment_Date, " &
"Account_Name, Order_Code, Orderer_Name, Receiver_Name, Phone_Number, Address, Refer " &
"FROM jomtOrderDB.jomtOrderTbl " &
"WHERE Serial_Number IN " & clause
Using cmd As New MySqlCommand(query, conn)
Using reader = cmd.ExecuteReader()
While reader.Read()
Dim sn = reader("Serial_Number").ToString().Trim()
If dtoMap.ContainsKey(sn) Then
Dim dto = dtoMap(sn)
dto.ModelCode = reader("Item_Code").ToString()
dto.Model = reader("Item_Name").ToString()
dto.InvoiceNumber = reader("Invoice_Number").ToString()
dto.PackingSn = reader("Packing_Code").ToString()
dto.BuyDate = reader("Shipment_Date").ToString()
dto.SalesStore = reader("Account_Name").ToString()
dto.SalesOrderNo = reader("Order_Code").ToString()
dto.OrderName = reader("Orderer_Name").ToString()
dto.RecipientName = reader("Receiver_Name").ToString()
dto.OrderHp = reader("Phone_Number").ToString()
dto.OrderAddress = reader("Address").ToString()
dto.Note = reader("Refer").ToString()
End If
End While
End Using
End Using
Next
End Using
End Sub
Public Sub FillFromProductTbl(dtoMap As Dictionary(Of String, GenuineProductDto), inClauses As List(Of String))
Dim serials = dtoMap.Keys.ToList()
Using conn As MySqlConnection = GetDBConn()
For Each clause In inClauses
Dim query As String =
"SELECT Product_SN, FaceCart_SN, EyeCart_SN " &
"FROM jomtTesterDB.jomtProductTbl " &
"WHERE Product_SN IN " & clause
Using cmd As New MySqlCommand(query, conn)
Using reader = cmd.ExecuteReader()
While reader.Read()
Dim sn = reader("Product_SN").ToString()
If dtoMap.ContainsKey(sn) Then
dtoMap(sn).FaceSn = reader("FaceCart_SN").ToString()
dtoMap(sn).EyeSn = reader("EyeCart_SN").ToString()
End If
End While
End Using
End Using
Next
End Using
End Sub
Public Sub FillFromProdData(dtoMap As Dictionary(Of String, GenuineProductDto), inClauses As List(Of String))
Dim serials = dtoMap.Keys.ToList()
Using conn As MySqlConnection = GetDBConn()
For Each clause In inClauses
Dim query As String =
"SELECT Product_SN, Ct_Abroad AS Country, DATE_FORMAT(P3_DateTime, '%Y-%m-%d') AS MfgDate " &
"FROM jomtTesterDB.jomtCartridgeTbl WHERE Product_SN IN " & clause &
"UNION ALL " &
"SELECT Product_SN, Abroad AS Country, DATE_FORMAT(DateTime, '%Y-%m-%d') AS MfgDate " &
"FROM jomtTesterDB.jomtDeviceTbl WHERE Product_SN IN " & clause &
"UNION ALL " &
"SELECT Product_SN, Ct_Abroad AS Country, DATE_FORMAT(P3_DateTime, '%Y-%m-%d') AS MfgDate " &
"FROM jomtTesterDB.jomtNonTDTbl WHERE Product_SN IN " & clause
Using cmd As New MySqlCommand(query, conn)
Using reader = cmd.ExecuteReader()
While reader.Read()
Dim sn = reader("Product_SN").ToString()
If dtoMap.ContainsKey(sn) AndAlso String.IsNullOrEmpty(dtoMap(sn).CountryCode) Then
dtoMap(sn).CountryCode = reader("Country").ToString()
dtoMap(sn).ManufactureDate = reader("MfgDate").ToString()
End If
End While
End Using
End Using
Next
End Using
End Sub
Public Function getOyList(dic As Dictionary(Of String, String)) As Dictionary(Of String, GenuineProductDto)
Dim TdTableList As New List(Of String) From {"jomtTesterDB.jomtCartridgeTbl", "jomtTesterDB.jomtLDMTbl", "jomtTesterDB.jomtNonTDTbl"}
genuineProductDtoMap = New Dictionary(Of String, GenuineProductDto)
Dim OliveYoungRelateDTOList As New List(Of OliveYoungRelateDTO)
Dim Serial_NumberFilterList As New List(Of String)()
For Each sn In dic.Keys
If Not String.IsNullOrWhiteSpace(sn) Then
Serial_NumberFilterList.Add(sn.Trim())
End If
Next
Using conn As MySqlConnection = GetDBConn()
'' 첫 번째 쿼리: Serial_Number IN (파라미터)
If Serial_NumberFilterList.Count > 0 Then
Dim inParams As New List(Of String)
For i As Integer = 0 To Serial_NumberFilterList.Count - 1
inParams.Add("@sno" & i)
Next
Dim inClause As String = String.Join(", ", inParams)
Dim query As String = "SELECT DISTINCT item_code, item_name, Serial_Number, Invoice_Number, DATE_FORMAT(Shipment_Date, '%Y-%m-%d') AS Shipment_Date, Account_Name FROM jomtOrderDB.jomtOrderTbl WHERE Serial_Number IN (" & inClause & ") AND genuine_date IS NULL"
Using cmd As New MySqlCommand(query, conn)
For i As Integer = 0 To Serial_NumberFilterList.Count - 1
cmd.Parameters.AddWithValue("@sno" & i, Serial_NumberFilterList(i))
Next
Using reader = cmd.ExecuteReader()
While reader.Read()
Dim oy_object As New OliveYoungRelateDTO(reader("Serial_Number").ToString().Trim())
oy_object.colorFlag = dic(oy_object.Serial_Number)
oy_object.itemCode = reader("item_code").ToString().Trim()
oy_object.item_name = reader("item_name").ToString().Trim()
oy_object.invoice = reader("Invoice_Number").ToString().Trim()
oy_object.Shipment_Date = reader("Shipment_Date").ToString().Trim()
oy_object.Account_Name = reader("Account_Name").ToString().Trim()
OliveYoungRelateDTOList.Add(oy_object)
End While
End Using
End Using
End If
'' 두 번째 쿼리: Product_SN LIKE (파라미터) - TdTableList 각 테이블 조회 (동일 스키마: Product_SN, Ct_Abroad, P3_DateTime, LastQC_Date, TestStep, genuine_date)
For Each obj In OliveYoungRelateDTOList
Dim likeValue As String = obj.colorFlag & "%"
For Each tableName As String In TdTableList
If String.IsNullOrWhiteSpace(tableName) Then Continue For
Dim query2 As String = "SELECT Product_SN, Ct_Abroad AS Country, DATE_FORMAT(P3_DateTime, '%Y-%m-%d') AS MfgDate FROM " & tableName & " WHERE Product_SN LIKE @colorPrefix AND LastQC_Date IS NOT NULL AND TestStep = 31 AND genuine_date IS NULL"
Try
Using sec_cmd As New MySqlCommand(query2, conn)
sec_cmd.Parameters.AddWithValue("@colorPrefix", likeValue)
Using sec_reader = sec_cmd.ExecuteReader()
While sec_reader.Read()
Dim productSn As String = sec_reader("Product_SN").ToString()
If genuineProductDtoMap.ContainsKey(productSn) Then Continue While
Dim dto As New GenuineProductDto(productSn)
dto.ModelCode = obj.itemCode
dto.Model = obj.item_name
dto.PackingSn = obj.Serial_Number
dto.SalesStore = obj.Account_Name
dto.ManufactureDate = sec_reader("MfgDate").ToString()
dto.InvoiceNumber = obj.invoice
dto.BuyDate = obj.Shipment_Date
genuineProductDtoMap.Add(productSn, dto)
End While
End Using
End Using
Catch ex As MySqlException
'' 테이블/컬럼 스키마가 다르면 해당 테이블만 스킵 (예: jomtLDMTbl이 Abroad/DateTime 사용 시)
'' 필요 시 로그: MsgBox("테이블 조회 제외: " & tableName & " - " & ex.Message)
End Try
Next
Next
End Using
Return genuineProductDtoMap
End Function
Public Function updateOliveYoungGenuineDate(dic As Dictionary(Of String, String)) As Boolean
'' Product_SN, genuine_date 컬럼이 있는 테이블만 포함 (스키마 동일한 테이블만)
Dim TdTableList As New List(Of String) From {"jomtTesterDB.jomtCartridgeTbl", "jomtTesterDB.jomtLDMTbl", "jomtTesterDB.jomtNonTDTbl"}
Try
Dim productSnList As New List(Of String)()
If genuineProductDtoMap IsNot Nothing Then
productSnList.AddRange(genuineProductDtoMap.Keys)
End If
Dim serialFilterList As New List(Of String)() ''88코드
For Each sn In dic.Keys
If Not String.IsNullOrWhiteSpace(sn) Then serialFilterList.Add(sn.Trim())
Next
Dim orderList As New List(Of String)()
If orderCodeList IsNot Nothing Then
orderList.AddRange(orderCodeList)
End If
Using conn As MySqlConnection = GetDBConn()
'' TD 테이블들: Product_SN IN (파라미터)
If productSnList.Count > 0 Then
Dim inParams As New List(Of String)
For i As Integer = 0 To productSnList.Count - 1
inParams.Add("@psn" & i)
Next
Dim inClause As String = String.Join(", ", inParams)
For Each tableName As String In TdTableList
Dim query As String = "UPDATE " & tableName & " SET genuine_date = NOW() WHERE Product_SN IN (" & inClause & ")"
Using cmd As New MySqlCommand(query, conn)
For i As Integer = 0 To productSnList.Count - 1
cmd.Parameters.AddWithValue("@psn" & i, productSnList(i))
Next
cmd.ExecuteNonQuery()
End Using
Next
End If
'' 주문 테이블: Order_Code IN, Serial_Number IN (파라미터)
If orderList.Count = 0 Then Return True
Dim orderParams As New List(Of String)
For i As Integer = 0 To orderList.Count - 1
orderParams.Add("@ord" & i)
Next
Dim orderInClause As String = String.Join(", ", orderParams)
Dim serialInClause As String
Dim queryOrder As String
If serialFilterList.Count > 0 Then
Dim serialParams As New List(Of String)
For i As Integer = 0 To serialFilterList.Count - 1
serialParams.Add("@sno" & i)
Next
serialInClause = String.Join(", ", serialParams)
queryOrder = "UPDATE jomtOrderDB.jomtOrderTbl SET genuine_date = NOW() WHERE Order_Code IN (" & orderInClause & ") AND ((LEFT(Serial_Number,1) < '8' AND LENGTH(Serial_Number) > 11) OR Serial_Number IN (" & serialInClause & "))"
Else
queryOrder = "UPDATE jomtOrderDB.jomtOrderTbl SET genuine_date = NOW() WHERE Order_Code IN (" & orderInClause & ") AND (LEFT(Serial_Number,1) < '8' AND LENGTH(Serial_Number) > 11)"
End If
Using cmd As New MySqlCommand(queryOrder, conn)
For i As Integer = 0 To orderList.Count - 1
cmd.Parameters.AddWithValue("@ord" & i, orderList(i))
Next
If serialFilterList.Count > 0 Then
For i As Integer = 0 To serialFilterList.Count - 1
cmd.Parameters.AddWithValue("@sno" & i, serialFilterList(i))
Next
End If
cmd.ExecuteNonQuery()
End Using
End Using
Return True
Catch ex As Exception
MsgBox("정품 등록 중 NAS 오류 발생!" & vbCrLf & ex.Message)
Return False
End Try
End Function
End Module