ssy99 0d99692938 feat: 최초 커밋
기존 프로그램 업로드
2025-04-30 16:36:46 +09:00

290 lines
11 KiB
VB.net

Imports System.Reflection
Imports System.Runtime.Remoting.Metadata.W3cXsd2001
Imports System.Text
Imports MySql.Data.MySqlClient
Public Class mainform
Private Sub mainform_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.Text = "DUALSONIC Authentication Register Program Ver 1.1.0"
End Sub
Private PackOk As Boolean = False
Private StateOk As Boolean = False
Private Const COL_COUNT As Byte = 19
Private Sub BtnOrderSearch_Click(sender As Object, e As EventArgs) Handles btnOrderSearch.Click
lbWait.Visible = True
lbWait.Refresh()
dgvNormal.Rows.Clear()
mcDate.Enabled = False
Dim genuineProductDtos = GetGenuineDatasByDate(mcDate.SelectionStart)
If genuineProductDtos.Count > 0 Then
For Each genuineProductDto As GenuineProductDto In genuineProductDtos
Dim RowData(COL_COUNT) As String
RowData(0) = genuineProductDto.Seq
RowData(1) = genuineProductDto.ModelCode
RowData(2) = genuineProductDto.Model
RowData(3) = genuineProductDto.InvoiceNumber
RowData(4) = genuineProductDto.PackingSn
RowData(5) = genuineProductDto.BodySn
RowData(6) = genuineProductDto.FaceSn
RowData(7) = genuineProductDto.EyeSn
RowData(8) = genuineProductDto.BuyRental
RowData(9) = genuineProductDto.CountryCode
RowData(10) = genuineProductDto.ManufactureDate
RowData(11) = genuineProductDto.BuyDate
RowData(12) = genuineProductDto.SalesStore
RowData(13) = genuineProductDto.SalesOrderNo
RowData(14) = genuineProductDto.OrderName
RowData(15) = genuineProductDto.RecipientName
RowData(16) = genuineProductDto.OrderHp
RowData(17) = genuineProductDto.OrderAddress
RowData(18) = genuineProductDto.Note
dgvNormal.Rows.Add(RowData)
Next
MsgBox("총 건수: " & genuineProductDtos.Count)
Else
MsgBox("진행한 일반 포장건이 존재하지 않습니다.", vbExclamation)
If PackOk = False And StateOk = False Then
mcDate.Enabled = True
End If
End If
lbWait.Visible = False
lbWait.Refresh()
End Sub
Private Function GetGenuineDatasByDate(targetDate As Date) As List(Of GenuineProductDto)
Dim results = FindSerialsByDate(targetDate)
Dim individualSerials = results.Item1
Dim bundledSerials = results.Item2
Dim genuineProductDtoMap As New Dictionary(Of String, GenuineProductDto)
For Each serial In individualSerials
Dim genuineProductDto As New GenuineProductDto(serial)
genuineProductDtoMap(serial) = genuineProductDto
Next
FillGenuineProductDto(individualSerials, bundledSerials, genuineProductDtoMap)
Return genuineProductDtoMap.Values.ToList()
End Function
Private Sub FillGenuineProductDto(individualSerials As List(Of String), bundledSerials As List(Of String), dtoMap As Dictionary(Of String, GenuineProductDto))
Dim inClauses = BuildInClauses(individualSerials, maxPerQuery:=100)
Dim likeClauses = BuildLikeClauses(bundledSerials, maxPerClause:=100, field:="Serial_Number")
FillFromOrderTblByLike(dtoMap, likeClauses)
FillFromOrderTblByIn(dtoMap, inClauses)
FillFromProductTbl(dtoMap, inClauses)
FillFromProdData(dtoMap, inClauses)
End Sub
Private Function BuildInClauses(serials As IEnumerable(Of String), maxPerQuery As Integer) As List(Of String)
Dim inClauseList As New List(Of String)()
Dim temp As New List(Of String)()
For Each sn In serials.Distinct()
temp.Add("'" & sn.Replace("'", "''") & "'")
If temp.Count >= maxPerQuery Then
inClauseList.Add("(" & String.Join(",", temp) & ")")
temp.Clear()
End If
Next
If temp.Count > 0 Then
inClauseList.Add("(" & String.Join(",", temp) & ")")
End If
Return inClauseList
End Function
Private Function BuildLikeClauses(serials As List(Of String), maxPerClause As Integer, field As String) As List(Of String)
Dim likeClauses As New List(Of String)()
Dim temp As New List(Of String)()
For Each sn In serials.Distinct()
If Not String.IsNullOrWhiteSpace(sn) Then
Dim cleanedSn = sn.Trim().Replace("'", "''")
temp.Add(field & " LIKE '%" & cleanedSn & "%'")
End If
If temp.Count >= maxPerClause Then
likeClauses.Add(String.Join(" OR ", temp))
temp.Clear()
End If
Next
If temp.Count > 0 Then
likeClauses.Add(String.Join(" OR ", temp))
End If
Return likeClauses
End Function
Private Sub BtnCsv_Click(sender As Object, e As EventArgs) Handles btnCsv.Click
Try
lbsave.Text = "변환중.."
lbsave.Visible = True
lbsave.Refresh()
If dgvNormal.Rows.Count = 1 Then
MsgBox("먼저 데이터를 불러와 주십시오.", vbExclamation)
Else
' 파일 경로 설정
Dim FilePath As String = System.AppDomain.CurrentDomain.BaseDirectory & "\AuthData"
If Dir(FilePath, vbDirectory) = "" Then
MkDir(FilePath)
End If
' 파일 이름 설정
Dim FileName As String = FilePath & "\Auth_N_" & mcDate.SelectionStart & ".csv"
Dim WriteData As String = String.Empty
' CSV의 헤더
Dim StartData As String = "seq,model_code,model,invoice_number,packing_sn,body_sn,face_sn,eye_sn,buy_rental,country_code,manufacture_date,buy_date,sales_store,sales_order_no,order_name,recipient_name,order_hp,order_address,note"
WriteData = StartData & vbCrLf
' 데이터를 추가
For i = 0 To dgvNormal.Rows.Count - 2
' 각 셀의 값을 따옴표로 감싸고, 콤마를 포함하는지 확인
Dim SaveData As String = String.Join(",", dgvNormal.Rows(i).Cells.Cast(Of DataGridViewCell).Select(Function(cell) EncloseInQuotesIfNeeded(cell.Value.ToString)))
' 데이터를 줄바꿈하면서 추가
WriteData &= SaveData & vbCrLf
Next
' 파일에 쓰기
System.IO.File.WriteAllText(FileName, WriteData, System.Text.Encoding.UTF8)
MsgBox("변환 완료!", vbInformation)
End If
Catch ex As Exception
MsgBox(".csv 로 변환하는데 오류가 발생하였습니다." & vbCrLf & ex.Message)
End Try
lbsave.Visible = False
lbsave.Refresh()
End Sub
' 콤마가 있는 필드에 대해 이중 따옴표로 감싸는 함수
Private Function EncloseInQuotesIfNeeded(value As String) As String
' 값에 콤마 또는 따옴표가 포함되어 있으면 따옴표로 감싼다
If value.Contains(",") OrElse value.Contains("""") Then
' 따옴표를 이스케이프하기 위해 따옴표 두 개로 변경 (CSV 규칙에 맞게)
value = value.Replace("""", """""")
Return $"""{value}"""
Else
Return value
End If
End Function
Private Sub BtnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
lbsave.Text = "저장중.."
lbsave.Visible = True
lbsave.Refresh()
If dgvNormal.Rows.Count = 1 Then
MsgBox("불러온 데이터가 존재하지 않습니다. 데이터를 먼저 불러와 주십시오.", vbExclamation)
Else
Dim UpdateData As String = String.Empty
For i = 0 To dgvNormal.Rows.Count - 2
Dim RowData As String = String.Empty
For n = 1 To dgvNormal.ColumnCount - 1
If RowData = String.Empty Then
If String.IsNullOrWhiteSpace(dgvNormal.Rows(i).Cells(n).Value.ToString) Then
RowData = "NULL"
Else
dgvNormal.Rows(i).Cells(n).Value = dgvNormal.Rows(i).Cells(n).Value.ToString.Replace("'", "''")
RowData = "'" & dgvNormal.Rows(i).Cells(n).Value.ToString & "'"
End If
Else
If String.IsNullOrWhiteSpace(dgvNormal.Rows(i).Cells(n).Value.ToString) Then
RowData = RowData & "," & "NULL"
Else
dgvNormal.Rows(i).Cells(n).Value = dgvNormal.Rows(i).Cells(n).Value.ToString.Replace("'", "''")
RowData = RowData & "," & "'" & dgvNormal.Rows(i).Cells(n).Value.ToString & "'"
End If
End If
Next
If UpdateData = String.Empty Then
UpdateData = "(" & RowData & ")"
Else
UpdateData = UpdateData & "," & vbCrLf & "(" & RowData & ")"
End If
Next
Const ColName As String = "(model_code,model,invoice_number,packing_sn,body_sn,face_sn,eye_sn,buy_rental,country_code,manufacture_date,buy_date,sales_store,sales_order_no,order_name,recipient_name,order_hp,order_address,note)"
UpdateData = "INSERT INTO fm_genuine" & ColName & " VALUES " & UpdateData
If SSHCommand(UpdateData) Then
MsgBox("저장 완료 !", vbInformation)
Else
MsgBox("저장 실패 !", vbCritical)
End If
End If
lbsave.Visible = False
lbsave.Refresh()
End Sub
Private Sub BtnLoad_Click(sender As Object, e As EventArgs) Handles btnLoad.Click
lbWait.Visible = True
lbWait.Refresh()
dgvNormal.Rows.Clear()
Dim DBCmd As String = "SELECT seq,model_code,model,invoice_number,packing_sn,body_sn,face_sn,eye_sn,buy_rental,country_code,manufacture_date,buy_date,sales_store,sales_order_no,order_name,recipient_name,order_hp,order_address,note FROM fm_genuine WHERE buy_date = '" & mcDate.SelectionStart & "'"
If SSHQueryReader(DBCmd) Then
Dim RowNum As Short = (sshDataQuery.Length / COL_COUNT) - 1
Dim ColNum As Byte = COL_COUNT - 1
Dim SqlCount As Short = 0
For i = 0 To RowNum
Dim RowData(ColNum) As String
For n = 0 To ColNum
RowData(n) = sshDataQuery(SqlCount)
SqlCount += 1
Next
dgvNormal.Rows.Add(RowData)
Next
Else
MsgBox("등록된 데이터가 존재하지 않습니다.", vbExclamation)
End If
lbWait.Visible = False
lbWait.Refresh()
End Sub
Private Sub BtnReset_Click(sender As Object, e As EventArgs) Handles btnReset.Click
mcDate.Enabled = True
dgvNormal.Rows.Clear()
End Sub
End Class