C#winform上下班打卡系统Demo

C# winform上下班打卡系统Demo

系统效果如图所示
在这里插入图片描述
7个label控件(lblUsername、lblLoggedInEmployeeId、lab_IP、lblCheckOutTime、lblCheckInTime、lab_starttime、lab_endtime)、3个按钮、1个dataGridView控件、2个groupBox控件

C#代码实现

using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class 员工打卡 : Form
    {
        private string loggedInUsername;
        private string loggedInEmployeeId;
        private string connectionString = "server=127.0.0.1;uid=sa;pwd=xyz@0123456;database=test";

        public 员工打卡(string username, string employeeId)
        {
            InitializeComponent();
            loggedInUsername = username;
            loggedInEmployeeId = employeeId;
            CheckTodaysPunchInRecord();
        }
        [DllImport("user32.dll")]
        public static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

        [DllImport("user32.dll")]
        public static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);

        // 禁用窗口大小改变
        private const uint SC_SIZE = 0xF000;
        private const uint MF_BYCOMMAND = 0x0000;
        private const uint MF_GRAYED = 0x0001;

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            IntPtr hMenu = GetSystemMenu(this.Handle, false);
            if (hMenu != IntPtr.Zero)
            {
                EnableMenuItem(hMenu, SC_SIZE, MF_BYCOMMAND | MF_GRAYED);
            }
        }
        private void 员工打卡_Load(object sender, EventArgs e)
        {

            lblUsername.Text = "当前登录用户:" + loggedInUsername;
            lblLoggedInEmployeeId.Text = "工号:" + loggedInEmployeeId.ToString();
            // 设置日期控件的显示格式为年-月-日
            startTime.Format = DateTimePickerFormat.Custom;
            startTime.CustomFormat = "yyyy-MM-dd";
            // 设置日期控件的显示格式为年-月-日
            endTime.Format = DateTimePickerFormat.Custom;
            endTime.CustomFormat = "yyyy-MM-dd";
            //不显示出dataGridView1的最后一行空白
            dataGridView1_Result.AllowUserToAddRows = false;
            // 设置数据和列名居中对齐
            dataGridView1_Result.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            dataGridView1_Result.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            // 设置列名加粗
            dataGridView1_Result.ColumnHeadersDefaultCellStyle.Font = new System.Drawing.Font(dataGridView1_Result.ColumnHeadersDefaultCellStyle.Font, FontStyle.Bold);
            // 设置列宽自适应
            dataGridView1_Result.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            LoadData();
            GetIP();

        }
        private void GetIP()
        {
            // 获取本机IP地址
            IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
            foreach (IPAddress ip in ipHost.AddressList)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork)
                {
                    lab_IP.Text = "IP地址:" + ip.ToString(); // 添加到label1的Text属性中
                }
            }
        }
        private void btnCheckIn_Click(object sender, EventArgs e)
        {
            if (IsPunchInRecordExists())
            {
                MessageBox.Show("你已打过上班卡。", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
                return;
            }

            DateTime currentTime = DateTime.Now;
            string punchInTime = currentTime.ToString("yyyy-MM-dd HH:mm:ss");
            string status = currentTime.TimeOfDay < new TimeSpan(8, 30, 0) ? "正常" : "迟到";

            InsertPunchInRecord(punchInTime, status);
            lblCheckInTime.Text = punchInTime;
            lblCheckInTime.Visible = true;
            // 刷新DataGridView显示最新打卡记录
            RefreshDataGridView();
        }

        private bool IsPunchInRecordExists()
        {
            DateTime currentDate = DateTime.Now.Date;
            string query = $"SELECT COUNT(*) FROM PunchIn WHERE emp_code='{loggedInEmployeeId}' AND punch_in_time >= '{currentDate}'";
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    int count = (int)command.ExecuteScalar();
                    return count > 0;
                }
            }
        }

        private void RefreshDataGridView()
        {
            // 执行查询语句
           string query = $@"
                    SELECT 
                        a.id,
                        a1.username AS 用户名,
                        a.emp_code AS 工号,
                        CONVERT(VARCHAR(19), a.punch_in_time, 120) AS 上班打卡时间,
                        a.status AS 上班打卡状态,
                        CONVERT(VARCHAR(19), b.punch_out_time, 120) AS 下班打卡时间,
                        b.status AS 下班打卡状态
                    FROM 
                        (SELECT * FROM Employee) a1
                    LEFT JOIN 
                        PunchIn a ON a1.emp_code = a.emp_code
                    LEFT JOIN 
                        PunchOut b ON a.emp_code = b.emp_code 
                                 AND CONVERT(DATE, a.punch_in_time) = CONVERT(DATE, b.punch_out_time)
                                 AND b.punch_out_time = (
                                     SELECT MAX(punch_out_time)
                                     FROM PunchOut
                                     WHERE emp_code = a.emp_code 
                                       AND CONVERT(DATE, punch_out_time) = CONVERT(DATE, a.punch_in_time)
                                 )
                    WHERE 
                        a.emp_code = '{loggedInEmployeeId}' AND MONTH(a.punch_in_time) = MONTH(GETDATE()) AND YEAR(a.punch_in_time) = YEAR(GETDATE())
                    ORDER BY 
                        a.id, a.emp_code, a.punch_in_time";
            Console.WriteLine("执行的SQL语句是:" + query);
            // 执行查询并获取结果
            // 你可以使用适合你数据库的查询方法
            DataTable dataTable = ExecuteQuery(query);

            // 将查询结果绑定到DataGridView的数据源
            dataGridView1_Result.DataSource = dataTable;
        }

        private DataTable ExecuteQuery(string query)
        {
            // 创建连接和命令对象并执行查询
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    // 创建适配器并填充数据到DataTable
                    SqlDataAdapter adapter = new SqlDataAdapter(command);
                    DataTable dataTable = new DataTable();
                    adapter.Fill(dataTable);
                    return dataTable;
                }
            }
        }

        private void InsertPunchInRecord(string punchInTime, string status)
        {
            string query = $"INSERT INTO PunchIn (emp_code, punch_in_time, status) VALUES ('{loggedInEmployeeId}', '{punchInTime}', '{status}')";
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    command.ExecuteNonQuery();
                }
            }
        }
        private void CheckTodaysPunchInRecord()
        {
            DateTime currentDate = DateTime.Now.Date;
            string query = $"SELECT punch_in_time FROM PunchIn WHERE emp_code='{loggedInEmployeeId}' AND punch_in_time >= '{currentDate}'";
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    object result = command.ExecuteScalar();
                    if (result != null)
                    {
                        string punchInTime = ((DateTime)result).ToString("yyyy-MM-dd HH:mm:ss");
                        lblCheckInTime.Text = punchInTime;
                        lblCheckInTime.Visible = true;
                    }
                }
            }
        }
        private void btnCheckOut_Click(object sender, EventArgs e)
        {
            DateTime currentTime = DateTime.Now;
            string punchOutTime = currentTime.ToString("yyyy-MM-dd HH:mm:ss");

            if (IsInvalidPunchOutTime(currentTime))
            {
                MessageBox.Show("21点30到23:59:59点打下班卡无效。");
                return;
            }

            string status = currentTime.TimeOfDay < new TimeSpan(18, 0, 0) ? "早退" : "正常"; // 判断下班打卡时间是否在18:00之前

            InsertPunchOutRecord(punchOutTime, status);
            lblCheckOutTime.Text = punchOutTime;
            lblCheckOutTime.Visible = true;
            // 刷新DataGridView显示最新打卡记录
            RefreshDataGridView();
        }

        private bool IsInvalidPunchOutTime(DateTime currentTime)
        {
            TimeSpan startTime = new TimeSpan(21, 30, 0);
            TimeSpan endTime = new TimeSpan(23, 59, 59);
            TimeSpan currentTimeOfDay = currentTime.TimeOfDay;

            return currentTimeOfDay >= startTime && currentTimeOfDay <= endTime;
        }

        private void InsertPunchOutRecord(string punchOutTime, string status)
        {
            string query = $"INSERT INTO PunchOut (emp_code, punch_out_time, status) VALUES ('{loggedInEmployeeId}', '{punchOutTime}', '{status}')";
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    command.ExecuteNonQuery();
                }
            }
        }

        private void btn_Serch_Click(object sender, EventArgs e)
        {
            // 获取所选时间范围
            DateTime startDate = startTime.Value.Date;
            DateTime endDate = endTime.Value.Date.AddDays(1).AddSeconds(-1);
            // 构建 SQL 查询语句
            string query = $@"
                    SELECT 
                        a.id,
                        a1.username AS 用户名,
                        a.emp_code AS 工号,
                        CONVERT(VARCHAR(19), a.punch_in_time, 120) AS 上班打卡时间,
                        a.status AS 上班打卡状态,
                        CONVERT(VARCHAR(19), b.punch_out_time, 120) AS 下班打卡时间,
                        b.status AS 下班打卡状态
                    FROM 
                        (SELECT * FROM Employee) a1
                    LEFT JOIN 
                        PunchIn a ON a1.emp_code = a.emp_code
                    LEFT JOIN 
                        PunchOut b ON a.emp_code = b.emp_code 
                                 AND CONVERT(DATE, a.punch_in_time) = CONVERT(DATE, b.punch_out_time)
                                 AND b.punch_out_time = (
                                     SELECT MAX(punch_out_time)
                                     FROM PunchOut
                                     WHERE emp_code = a.emp_code 
                                       AND CONVERT(DATE, punch_out_time) = CONVERT(DATE, a.punch_in_time)
                                 )
                    WHERE 
                        a.punch_in_time BETWEEN @StartDate AND @EndDate
                        AND a.emp_code = '{loggedInEmployeeId}'
                    ORDER BY 
                        a.id, a.emp_code, a.punch_in_time";

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    // 添加查询参数
                    command.Parameters.AddWithValue("@StartDate", startDate);
                    command.Parameters.AddWithValue("@EndDate", endDate);
                    Console.WriteLine("查询的SQL语句:" + query);
                    // 打开数据库连接
                    connection.Open();

                    // 创建数据适配器和数据表
                    SqlDataAdapter adapter = new SqlDataAdapter(command);
                    DataTable table = new DataTable();

                    // 填充数据表
                    adapter.Fill(table);

                    // 关闭数据库连接
                    connection.Close();

                    // 绑定数据表到 DataGridView 控件
                    dataGridView1_Result.DataSource = table;
                }
            }
        }

        private void LoadData()
        {
            // 获取所选时间范围
            DateTime startDate = startTime.Value.Date;
            DateTime endDate = endTime.Value.Date.AddDays(1).AddSeconds(-1);
            string query = $@"
                    SELECT 
                        a.id,
                        a1.username AS 用户名,
                        a.emp_code AS 工号,
                        CONVERT(VARCHAR(19), a.punch_in_time, 120) AS 上班打卡时间,
                        a.status AS 上班打卡状态,
                        CONVERT(VARCHAR(19), b.punch_out_time, 120) AS 下班打卡时间,
                        b.status AS 下班打卡状态
                    FROM 
                        (SELECT * FROM Employee) a1
                    LEFT JOIN 
                        PunchIn a ON a1.emp_code = a.emp_code
                    LEFT JOIN 
                        PunchOut b ON a.emp_code = b.emp_code 
                                 AND CONVERT(DATE, a.punch_in_time) = CONVERT(DATE, b.punch_out_time)
                                 AND b.punch_out_time = (
                                     SELECT MAX(punch_out_time)
                                     FROM PunchOut
                                     WHERE emp_code = a.emp_code 
                                       AND CONVERT(DATE, punch_out_time) = CONVERT(DATE, a.punch_in_time)
                                 )
                    WHERE 
                        a.punch_in_time BETWEEN @StartDate AND @EndDate
                        AND a.emp_code = '{loggedInEmployeeId}'
                    ORDER BY 
                        a.id, a.emp_code, a.punch_in_time";
            Console.WriteLine("开始时间:" + startDate);
            Console.WriteLine("结束时间:" + endDate);
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    // 添加查询参数
                    command.Parameters.AddWithValue("@StartDate", startDate);
                    command.Parameters.AddWithValue("@EndDate", endDate);
                    Console.WriteLine("一加载时获取数据查询的SQL语句:" + query);
                    // 打开数据库连接
                    connection.Open();

                    // 创建数据适配器和数据表
                    SqlDataAdapter adapter = new SqlDataAdapter(command);
                    DataTable table = new DataTable();

                    // 填充数据表
                    adapter.Fill(table);

                    // 关闭数据库连接
                    connection.Close();

                    // 绑定数据表到 DataGridView 控件
                    dataGridView1_Result.DataSource = table;
                }
            }
        }




    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/227611.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

极狐GitLab 和 ArgoCD 集成实现 GitOps

目录 ArgoCD 和 GitOps 概述 极狐GitLab 与 ArgoCD 的集成 ArgoCD 的安装 sops 介绍 探秘 gpg sops 和 gpg 的结合 ArgoCD 的使用 极狐GitLab 仓库的添加 gpg public key 的添加 ArgoCD Project 创建 ArgoCD Project 配置 ArgoCD GitOps workflow 验证 ArgoCD 和 Gi…

小航助学2023年6月GESP_Scratch三级真题(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号 单选题2.00分 删除编辑附件图文 答案:D 第1题高级语言编写的程序需要经过以下&#xff08; &#xff09;操作&#xff0c;可以生成在计算机上运行的可执行代码。 A、编辑B…

jQuery ajax读取本地json文件 三级联动下拉框

步骤 1&#xff1a;创建本地JSON文件 {"departments": [{"name": "会计学院","code": "052"},{"name": "金融学院","code": "053"},{"name": "财税学院",&qu…

python爬虫基础html内容解析库BeautifulSoup

我们通过Requests请求url获取数据&#xff0c;请求把数据返回来之后就要提取目标数据&#xff0c;不同的网站返回的内容通常有多种不同的格式&#xff0c;一种是 json 格式&#xff0c;我们可以直接通过json.loads转换python的json对象处理。另一种 XML 格式的&#xff0c;还有…

Facebook引流脚本的优势与编写教程!

在当今的数字化时代&#xff0c;社交媒体已经成为企业进行营销和推广的重要渠道之一&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;拥有数十亿的用户&#xff0c;为企业提供了无限的引流可能性。 然而&#xff0c;对于企业来说&#xff0c;在Facebook上吸引…

Java se之类和对象

目录 类的定义格式如何去自定义this的引用如何初始化对象构造方法的定义和使用 类的定义格式 class ClassName{ //属性(成员变量) //行为(成员方法) } 1>变量与方法 1.成员变量:普通成员变量 静态成员变量 2.成员方法:普通成员方法 静态成员方法 其中的静态变量与方法,在后…

传输层之TCP协议

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

最优化理论复习--对偶理论及灵敏度分析(一)

文章目录 上一篇对偶表示对偶问题的基本性质对偶问题的经济学解释&#xff1a;影子价格下一篇 上一篇 最优化理论复习–单纯形方法 对偶表示 一般情况&#xff1a; 对偶问题与原问题的字母表示: 对偶表示运用表格&#xff1a; m i n ⇒ m a x min \Rightarrow max min⇒m…

AI创作系统ChatGPT网站源码,AI绘画,支持GPT联网提问/即将支持TSS语音对话功能

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

【sgAutocomplete】自定义组件:基于elementUIel-autocomplete组件开发的自动补全下拉框组件(带输入建议的自动补全输入框)

特性&#xff1a; 1、支持本地保存选中过的记录 2、支持动态接口获取匹配下拉框内容 3、可以指定对应的显示label和字段组件key 4、自动生成速记符字段&#xff08;包含声母和全拼两种类型&#xff09;&#xff0c;增强搜索匹配效率 sgAutocomplete源码 <template><!…

【Linux】无法使用 screenfetch 查看系统信息,报错 command not found: screenfetch

问题描述 screenfetch是一个命令行工具&#xff0c;用于在终端显示系统的硬件和软件信息。它会收集各种系统和环境的信息&#xff0c;并以彩色 ASCII 艺术的形式在终端中展示出来。 当你在终端中运行screenfetch命令时&#xff0c;它会检测你的操作系统、主机名、内核版本、C…

利用eclipse导入外部java工程

利用eclipse导入外部java工程&#xff0c;打开eclipse&#xff0c;依次点击File-Import&#xff0c;…按下图依次执行…

vue中使用video.js播放m3u8格式的视频

文章目录 一、前言1.1、[官网](https://docs.videojs.com/)1.2、[Github](https://github.com/videojs/video.js) 二、实现2.1、安装依赖2.2、main.js2.3、video.vue2.4、其它 三、最后 一、前言 实时推送的视频流的需求&#xff0c;vue中就可以使用video.js播放m3u8格式的视频…

在 Mac 上使用浅色或深色外观

在 Mac 上&#xff0c;选取苹果菜单 >“系统设置”&#xff0c;然后点按边栏中的“外观” 。&#xff08;你可能需要向下滚动。&#xff09;选择右侧的“浅色”、“深色”或“自动”。 “浅色”表示不会发生变化的浅色外观。 “深色”表示不会发生变化的深色外观。“深色模式…

火狐浏览器无法打开有道云笔记网页解决

User-Agent Switcher and Manager 安装插件&#xff1a;User-Agent Switcher and Manager 可以直接在火狐插件管理中搜索&#xff0c;或者打开 https://addons.mozilla.org/zh-CN/firefox/addon/user-agent-string-switcher/?utm_sourceaddons.mozilla.org&utm_mediumre…

Spring MVC详解、静态资源访问、拦截器

1. Spring MVC概述 1.1 Spring MVC是什么 SpringMVC是Spring的一个模块&#xff0c;是一个基于MVC设计模式的web框架。 1.2 Spring MVC执行流程。 1.3 组件分析 前端控制器&#xff08;默认配置&#xff09;Dispatcher Servlet 作用&#xff1a;只负责分发请求。可以很好的对…

做题笔记:SQL Sever 方式做牛客SQL的题目--查询每天刷题通过数最多的前二名用户

----查询每天刷题通过数最多的前二名用户id和刷题数 现有牛客刷题表questions_pass_record&#xff0c;请查询每天刷题通过数最多的前二名用户id和刷题数&#xff0c;输出按照日期升序排序&#xff0c;查询返回结果名称和顺序为&#xff1a; date|user_id|pass_count 表单创建…

二十一章网络通信

计算机网络实现了多台计算机间的互联&#xff0c;使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序&#xff0c;这些程序借助于网络协议&#xff0c;相互之间可以交换数据。编写网络应用程序前&#xff0c;首先必须明确所要使用的网络协议…

如何搭建废品上门回收小程序

如今&#xff0c;随着环境保护意识的增强&#xff0c;废品的回收和再利用变得越来越重要。为了方便人们进行废品回收&#xff0c;搭建一个废品上门回收的小程序成为了一个不错的选择。本文将介绍如何从零开始搭建一个废品上门回收小程序。 …

JavaSE50题:16.(递归)按顺序打印一个数字的每一位(例如 1234,打印出 1 2 3 4)

文章目录 概述代码执行过程执行结果 概述 按顺序打印一个数字的每一位&#xff08;例如 1234&#xff0c;打印出 1 2 3 4&#xff09;。 因为我们是要按顺序打印1 2 3 4&#xff0c;所以&#xff0c;递归过程的流程图&#xff0c;如图所示&#xff1a; 代码 public static v…