⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 payroll.vb

📁 人事管理系统(VB.NET2005+SQL Server2005)
💻 VB
字号:
Imports System.Data
Imports System.Text
Imports CommonDB
Imports CommonSystem


Public Class Payroll

#Region "Members"
    Private m_iPayrollId As Integer
    Private m_iEmployeeId As Integer
    Public Year As Integer
    Public Month As Integer

    Public Shared PayrollItems As PayrollItemCollection = BuildPayrollItems()
    Public Shared ItemRecordTable As DataTable = BuildRecordTable()
#End Region

#Region "Properties"
    Default Public Property Item(ByVal iItemId As Integer) As PayrollItem
        Get
            Return Payroll.PayrollItems(iItemId)
        End Get
        Set(ByVal Value As PayrollItem)
            Payroll.PayrollItems(iItemId) = Value
        End Set
    End Property

    Public Shared ReadOnly Property Items() As ArrayList
        Get
            Return Payroll.PayrollItems.Items
        End Get
    End Property

    Public Property Id() As Integer
        Get
            Return m_iPayrollId
        End Get
        Set(ByVal Value As Integer)
            m_iPayrollId = Value
        End Set
    End Property

    Public Property Employee() As Employee
        Get
            Return New Employee(m_iEmployeeId)
        End Get
        Set(ByVal Value As Employee)
            m_iEmployeeId = Value.Id
        End Set
    End Property
#End Region

#Region "Construcions"
    Public Sub New()
        m_iPayrollId = 0
        m_iEmployeeId = 0
        Year = Microsoft.VisualBasic.Year(Now())
        Month = Microsoft.VisualBasic.Month(Now()) - 1
    End Sub

    Public Sub New(ByVal iEmployeeId As Integer, ByVal iYear As Integer, ByVal iMonth As Integer)
        m_iEmployeeId = iEmployeeId
        Year = iYear
        Month = iMonth
        Try
            Me.m_iPayrollId = DbBase.DataInterface().Execute4Value("select id from payroll where employee_id = " & Me.m_iEmployeeId & " and year = " & Me.Year & " and month = " & Me.Month)
            Dim dsTemp As DataSet = DbBase.DataInterface.Execute4DS("select id,item_id,sum from payroll_item_record where payroll_id = " & Me.m_iPayrollId)
            For Each drTemp As DataRow In dsTemp.Tables(0).Rows
                Payroll.PayrollItems(drTemp("item_id")).Sum = drTemp("sum")
            Next
        Catch ex As Exception
            If ex.Message = "value unavailable!" Then
                DbBase.DataInterface.ExecuteSql("insert into payroll (employee_id,[year],[month]) values (" & Me.m_iEmployeeId & "," & Me.Year & "," & Me.Month & ")")
                Me.m_iPayrollId = DbBase.DataInterface.Execute4Value("select top 1 id from payroll order by id desc")
            Else
                Throw New Exception(ex.Message)
            End If
        End Try
        Me.CalculatePay()
    End Sub

    Public Sub New(ByVal sEmployeeNumber As String, ByVal iYear As Integer, ByVal iMonth As Integer)
        Me.New(DbBase.DataInterface.Execute4Value("select id from v_employee where number = '" & sEmployeeNumber & "'"), iYear, iMonth)
    End Sub
#End Region

#Region "Private Methods"
    '建立工资项列表
    Private Shared Function BuildPayrollItems() As PayrollItemCollection
        Dim aicRes As New PayrollItemCollection
        For Each drTemp As DataRow In DbBase.DataInterface().Execute4DS("select id,name,field,expression from payroll_item").Tables(0).Rows
            aicRes.Add(drTemp("id"), New PayrollItem(CInt(drTemp("id")), drTemp("name"), drTemp("field"), drTemp("expression")))
        Next
        Return aicRes
    End Function
    '建立工资记录表
    Private Shared Function BuildRecordTable() As DataTable
        Dim dtRes As New DataTable("payroll")
        dtRes.Columns.Add("月份", Type.GetType("System.String"))
        For Each oPI As PayrollItem In Payroll.PayrollItems.Items
            dtRes.Columns.Add(oPI.Name, Type.GetType("System.String"))
        Next
        Return dtRes
    End Function
    '计算员工工资
    Private Function CalculatePay() As DataTable
        Dim dsTemp As DataSet = DbBase.DataInterface.Execute4DS("SELECT payroll_level.coefficient, employee.work_age FROM payroll_level INNER JOIN employee ON payroll_level.[level] = employee.employee_level WHERE (employee.id = " & Me.m_iEmployeeId & ")")
        Dim dtTemp As DataTable = dsTemp.Tables(0)

        Dim sbCode As StringBuilder = New StringBuilder
        '定义局部变量,和表的字段名
        sbCode.Append("Dim " & dtTemp.Columns(0).Caption & " As Single = " & dtTemp.Rows(0)(0) & vbCrLf)
        sbCode.Append("Dim " & dtTemp.Columns(1).Caption & " As Single = " & dtTemp.Rows(0)(1) & vbCrLf)

        sbCode.Append("Dim dtResult As DataTable = New DataTable" & vbCrLf)
        sbCode.Append("dtResult.Columns.Add(""" & dtTemp.Columns(0).Caption & """, Type.GetType(""System.Single""))" & vbCrLf)
        sbCode.Append("dtResult.Columns.Add(""" & dtTemp.Columns(1).Caption & """, Type.GetType(""System.Single""))" & vbCrLf)

        '计算上一个月的考勤数据
        Attendance.FillLastMonthRecord(Me.Employee.Number)
        For Each oAI As AttendanceItem In Attendance.Items
            sbCode.Append("Dim " & oAI.Field & " As Single = " & oAI.Amount & vbCrLf)
            sbCode.Append("dtResult.Columns.Add(""" & oAI.Field & """, Type.GetType(""System.Single""))" & vbCrLf)
        Next
        For Each oPI As PayrollItem In Payroll.Items
            sbCode.Append("Dim " & oPI.Field & " As Single = " & oPI.Expression & vbCrLf)
            sbCode.Append("dtResult.Columns.Add(""" & oPI.Field & """, Type.GetType(""System.Single""))" & vbCrLf)
        Next
        '填充表各字段的数值
        sbCode.Append("Dim drResult As DataRow = dtResult.NewRow" & vbCrLf)
        sbCode.Append("drResult(""" & dtTemp.Columns(0).Caption & """) = " & dtTemp.Rows(0)(0) & vbCrLf)
        sbCode.Append("drResult(""" & dtTemp.Columns(1).Caption & """) = " & dtTemp.Rows(0)(1) & vbCrLf)
        For Each oAI As AttendanceItem In Attendance.Items
            sbCode.Append("drResult(""" & oAI.Field & """) = " & oAI.Field & vbCrLf)
        Next
        For Each oPI As PayrollItem In Payroll.Items
            sbCode.Append("drResult(""" & oPI.Field & """) = " & oPI.Field & vbCrLf)
        Next

        sbCode.Append("dtResult.Rows.Clear()" & vbCrLf)
        sbCode.Append("dtResult.Rows.Add(drResult)" & vbCrLf)
        sbCode.Append("Return dtResult" & vbCrLf)
        '定义DataTable保存计算得到的各项工资金额
        Dim dtPayrollItemSum As DataTable = CType(EvalProvider.Eval(sbCode.ToString), DataTable)
        For Each oPI As PayrollItem In Payroll.Items
            oPI.Sum = dtPayrollItemSum.Rows(0)(oPI.Field)
        Next
        Return dtPayrollItemSum
    End Function
#End Region

#Region "Operations"
    '发放工资
    Public Function Payoff() As Short
        If m_iPayrollId = 0 Then
            Return -1
            Exit Function
        End If
        If Not CBool(DbBase.DataInterface.Execute4Object("select already_pay from payroll where id = " & Me.m_iPayrollId & ";")) Then
            Dim iCount As Integer = Payroll.Items.Count
            Dim arrSql(iCount + 1) As String
            arrSql(0) = "update payroll set already_pay = 1 where id = " & Me.m_iPayrollId & ";"
            For i As Integer = 1 To iCount
                arrSql(i) = "insert into payroll_item_record (item_id,sum,payroll_id) values (" & CType(Payroll.Items(i), PayrollItem).Id & "," & CType(Payroll.Items(i), PayrollItem).Sum & "," & Me.m_iPayrollId & ");"
            Next
            arrSql(iCount + 1) = "insert into bank_record (sum,date,account) values (" & CType(Payroll.Items(iCount - 1), PayrollItem).Sum & "," & Today() & "," & Me.Employee.BankAccount & ");"
            Return DbBase.DataInterface.ExecuteSqls(arrSql)
        Else
            Throw New Exception("工资已经发放!")
        End If
    End Function
    '预支工资
    'Public Function Prepay(ByVal fSum As Single) As Boolean
    '    If DbBase.DataInterface.ExecuteSql("update payroll set sum = " & fSum & " where id = " & m_iPayrollId) = 0 Then
    '        Return True
    '    End If
    'End Function

    '记录各工资项的金额
    Public Sub RecordItem(ByVal iItemId As Integer, ByVal fSum As Single)
        Payroll.PayrollItems(iItemId).Sum = fSum
        Payroll.PayrollItems(iItemId).Expression = CStr(fSum)
        CalculatePay()
        FillRecord()
    End Sub
    '将各工资项的金额填充到数据表中
    Public Sub FillRecord()
        Payroll.ItemRecordTable.Rows.Clear()
        Dim drTemp As DataRow = Payroll.ItemRecordTable.NewRow
        drTemp(0) = Me.Year & "年" & Me.Month & "月"
        For Each oPI As PayrollItem In Payroll.PayrollItems.Items
            drTemp(oPI.Name) = oPI.Sum
        Next
        Payroll.ItemRecordTable.Rows.Add(drTemp)
    End Sub
    '获取员工历史工资记录
    Public Function GetHistoryRecord() As DataTable
        Return HistoryRecord(Me.Id)
    End Function

    Public Shared Function HistoryRecord(ByVal iEmployeeId As Integer) As DataTable
        Dim dtRes As DataTable = Payroll.ItemRecordTable.Clone
        For Each drPayroll As DataRow In DbBase.DataInterface.Execute4DS("select id,year,month from payroll where already_pay = 1 and employee_id = " & iEmployeeId).Tables(0).Rows
            Dim drTemp As DataRow = dtRes.NewRow
            drTemp(0) = drPayroll("year") & "年" & drPayroll("month") & "月"
            Dim dtPayrollItem As DataTable = DbBase.DataInterface.Execute4DS("SELECT payroll_item_record.[sum], payroll_item.name FROM payroll_item_record INNER JOIN payroll_item ON payroll_item_record.item_id = payroll_item.id WHERE (payroll_item_record.payroll_id = " & drPayroll("id") & ")").Tables(0)
            For Each drPayrollItem As DataRow In dtPayrollItem.Rows
                drTemp(drPayrollItem("name")) = drPayrollItem("sum")
            Next
            dtRes.Rows.Add(drTemp)
        Next
        Return dtRes
    End Function

    Public Shared Function HistoryRecord(ByVal sEmployeeNumber As String) As DataTable
        Dim iEmployeeId As Integer = DbBase.DataInterface.Execute4Value("select id from v_employee where number = '" & sEmployeeNumber & "'")
        Return HistoryRecord(iEmployeeId)
    End Function
#End Region

End Class

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -