123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- Imports System.Math
- Imports CefSharp.WinForms
- Public Class 考勤位置異常清單
- Private Sub Set_驗證清單()
- Dim ds1 As New DataSet
- 清單1_dgv.DataSource = Nothing : ds1.Clear()
- 清單1_dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing
- 清單1_dgv.ColumnHeadersHeight = 40 : 清單1_dgv.AllowUserToAddRows = False : 清單1_dgv.RowTemplate.Height = 25
- If 正常_ch.Checked = False Then : SQL2 = " WHERE (手機打卡考勤表.狀態 LIKE N'') OR (手機打卡考勤表.狀態 LIKE N'異常')"
- ElseIf 正常_ch.Checked = True Then : SQL2 = " WHERE (手機打卡考勤表.狀態 LIKE N'正常')" : End If
- SQL_考勤位置異常清單()
- da.Fill(ds1) : 清單1_dgv.DataSource = ds1.Tables(0) : conn.Close()
- 清單1_dgv.Columns(0).FillWeight = 110 : 清單1_dgv.Columns(6).FillWeight = 70 : 清單1_dgv.Columns(7).FillWeight = 70
- 清單1_dgv.Columns(3).FillWeight = 70 : 清單1_dgv.Columns(5).Visible = False : 清單1_dgv.Columns(6).Visible = False
- For i As Integer = 0 To 清單1_dgv.Rows.Count - 1
- If 清單1_dgv.Rows(i).Cells("設備認證").Value.ToString = "" Then
- 清單1_dgv.Rows(i).Cells("設備認證").Value = "自動核准"
- End If
- Next
- End Sub
- Private Sub Set_位置清單()
- Dim ds1 As New DataSet
- 清單_dgv.DataSource = Nothing : ds1.Clear()
- 清單_dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing
- 清單_dgv.ColumnHeadersHeight = 40 : 清單_dgv.AllowUserToAddRows = False : 清單_dgv.RowTemplate.Height = 25
- SQL_考勤位置清單()
- da.Fill(ds1) : 清單_dgv.DataSource = ds1.Tables(0) : conn.Close()
- 清單_dgv.Columns(3).DefaultCellStyle.Format = "#,##0"
- 清單_dgv.Columns(1).FillWeight = 70 : 清單_dgv.Columns(2).FillWeight = 70 : 清單_dgv.Columns(3).FillWeight = 50
- 清單_dgv.Columns(4).FillWeight = 110 : 清單_dgv.Columns(5).FillWeight = 90
- For i As Integer = 0 To 清單_dgv.Rows.Count - 1 : 清單_dgv.Rows(i).Cells(5).Value = "" : 清單_dgv.Rows(i).Cells(4).Value = "" : Next
- End Sub
- Private Sub 考勤位置異常清單_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- 清單1_dgv.RowsDefaultCellStyle.Font = New System.Drawing.Font("微軟正黑體", 7.6)
- 清單_dgv.RowsDefaultCellStyle.Font = New System.Drawing.Font("微軟正黑體", 7.6)
- End Sub
- Private Sub 考勤位置異常清單_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
- 計算分流.Enabled = True
- End Sub
- Private Sub 計算分流_Tick(sender As Object, e As EventArgs) Handles 計算分流.Tick
- 計算分流.Enabled = False : Set_驗證清單() : Set_位置清單() : 查詢_bt.PerformClick() : 首次開啟 = False
- End Sub
- Private Sub 清單1_dgv_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles 清單1_dgv.CellClick
- If e.RowIndex = -1 Then : Else
- Dim lat1 As Double = 清單1_dgv.Rows(e.RowIndex).Cells("緯度").Value.ToString
- Dim lon1 As Double = 清單1_dgv.Rows(e.RowIndex).Cells("經度").Value.ToString : Dim 狀態異常 As Boolean = True
- For I As Integer = 0 To 清單_dgv.Rows.Count - 1
- Dim lat2 As Double = 清單_dgv.Rows(I).Cells("緯度").Value.ToString
- Dim lon2 As Double = 清單_dgv.Rows(I).Cells("經度").Value.ToString
- Dim distance As Double = CalculateDistance(lat1, lon1, lat2, lon2)
- 清單_dgv.Rows(I).Cells("考勤距離").Value = "地點" & ": " & Strings.Format(distance, "#,##0.00") & " " & "米"
- If CDbl(清單_dgv.Rows(I).Cells("容許誤差").Value) >= distance Then
- 清單_dgv.Rows(I).Cells("判斷狀態").Value = "正常" : 狀態異常 = False
- Else
- 清單_dgv.Rows(I).Cells("判斷狀態").Value = "異常"
- End If
- Next
- If 狀態異常 = False Then
- 清單1_dgv.Rows(e.RowIndex).Cells("狀態").Value = "正常" : 清單1_dgv.Rows(e.RowIndex).Cells("狀態.").Value = "正常"
- Else
- 清單1_dgv.Rows(e.RowIndex).Cells("狀態").Value = "異常" : 清單1_dgv.Rows(e.RowIndex).Cells("狀態.").Value = "異常"
- End If
- MyBrowser.Controls.Clear()
- PA50 = "https://www.google.com/maps/@" & lat1 & "," & lon1 & ",20z?" & "hl=zh-TW" & "&basemap=satellite"
- Dim browser As New ChromiumWebBrowser(PA50) : browser.Dock = DockStyle.Fill : MyBrowser.Controls.Add(browser)
- End If
- End Sub
- Public Function CalculateDistance(ByVal lat1 As Double, ByVal lon1 As Double, ByVal lat2 As Double, ByVal lon2 As Double) As Double
- Dim R As Double = 6371000 ' 地球半徑(單位:米)
- Dim radLat1 As Double = lat1 * (PI / 180) : Dim radLon1 As Double = lon1 * (PI / 180) ' 將經緯度從度轉換為弧度
- Dim radLat2 As Double = lat2 * (PI / 180) : Dim radLon2 As Double = lon2 * (PI / 180)
- Dim dLat As Double = radLat2 - radLat1 : Dim dLon As Double = radLon2 - radLon1 ' Haversine 公式
- Dim a As Double = Sin(dLat / 2) * Sin(dLat / 2) + Cos(radLat1) * Cos(radLat2) * Sin(dLon / 2) * Sin(dLon / 2)
- Dim c As Double = 2 * Atan2(Sqrt(a), Sqrt(1 - a))
- Dim distance As Double = R * c
- Return distance ' 返回距離(單位:米)
- End Function
- Private Sub 查詢_bt_Click(sender As Object, e As EventArgs) Handles 查詢_bt.Click
- Set_驗證清單() : Set_位置清單()
- End Sub
- Private Sub 判斷_bt_Click(sender As Object, e As EventArgs) Handles 判斷_bt.Click
- For i As Integer = 0 To 清單1_dgv.Rows.Count - 1
- Dim lat1 As Double = 清單1_dgv.Rows(i).Cells("緯度").Value.ToString
- Dim lon1 As Double = 清單1_dgv.Rows(i).Cells("經度").Value.ToString : Dim 狀態異常 As Boolean = True
- For J As Integer = 0 To 清單_dgv.Rows.Count - 1
- Dim lat2 As Double = 清單_dgv.Rows(J).Cells("緯度").Value.ToString
- Dim lon2 As Double = 清單_dgv.Rows(J).Cells("經度").Value.ToString
- Dim distance As Double = CalculateDistance(lat1, lon1, lat2, lon2)
- 清單_dgv.Rows(J).Cells("考勤距離").Value = "地點" & ": " & Strings.Format(distance, "#,##0.00") & " " & "米"
- If CDbl(清單_dgv.Rows(J).Cells("容許誤差").Value) >= distance Then
- 清單_dgv.Rows(J).Cells("判斷狀態").Value = "正常" : 狀態異常 = False
- Else
- 清單_dgv.Rows(J).Cells("判斷狀態").Value = "異常"
- End If
- Next
- If 狀態異常 = False Then
- 清單1_dgv.Rows(i).Cells("狀態").Value = "正常" : 清單1_dgv.Rows(i).Cells("狀態.").Value = "正常"
- Else
- 清單1_dgv.Rows(i).Cells("狀態").Value = "異常" : 清單1_dgv.Rows(i).Cells("狀態.").Value = "異常"
- End If
- PA1 = 清單1_dgv.Rows(i).Cells("機碼").Value.ToString : PA2 = 清單1_dgv.Rows(i).Cells("打卡時間").Value.ToString
- PA3 = 清單1_dgv.Rows(i).Cells("狀態").Value.ToString : SQL_考勤地點異常修改()
- Next : Set_驗證清單() : Set_位置清單()
- End Sub
- Private Sub 異常_ch_CheckedChanged(sender As Object, e As EventArgs) Handles 異常_ch.Click
- 異常_ch.Checked = True : 正常_ch.Checked = False : Set_驗證清單()
- End Sub
- Private Sub 正常_ch_CheckedChanged(sender As Object, e As EventArgs) Handles 正常_ch.Click
- 異常_ch.Checked = False : 正常_ch.Checked = True : Set_驗證清單()
- End Sub
- End Class
|