当前位置: 首页 > news >正文

小程序(十四)后端-签到成功

文章目录

  • 一、持久层
    • 1、CheckinMapper.xml
    • 2、CheckinMapper.java
    • 3、TbHolidaysDao.xml
    • 4、TbHolidaysDao.java
    • 5、TbWorkdayDao.xml
    • 6、TbWorkdayDao.java
  • 二、业务层
    • 1、 CheckinService.java
  • 三、conroller层
    • 1、编写 TbUserDao.xml 文件,查询员工的入职日期。
    • 2、编写 TbUserDao.java 接口,定义抽象方法。
    • 3、在 UserService.java
    • 4、实现查询考勤结果的Web方法


一、持久层

1、CheckinMapper.xml

<select id="searchTodayCheckin" parameterType="int" resultType="HashMap">SELECTu.name,u.photo,d.dept_name AS deptName,ck.address,CASEWHEN ck.status=1 THEN '正常'WHEN ck.status=2 THEN '迟到'END AS status,DATE_FORMAT(ck.create_time,'%H:%i') AS checkinTime,ck.dateFROM tb_user AS uLEFT JOIN tb_dept AS d ON u.dept_id = d.idLEFT JOIN tb_checkin AS ck ON u.id = ck.user_id AND ck.date = CURRENT_DATEWHERE u.id = #{userId} AND u.status=1</select><select id="searchCheckinDays" parameterType="int" resultType="long">SELECT COUNT(*) AS countFROM tb_checkinWHERE user_id=#{userId}</select><select id="searchWeekCheckin" parameterType="HashMap" resultType="HashMap">SELECTCAST(date AS CHAR) AS date,IF(status=1,'正常','迟到') AS statusFROM tb_checkinWHERE user_id=#{userId} AND date BETWEEN #{startDate} AND #{endDate}</select>

2、CheckinMapper.java

@Mapper
public interface TbCheckinDao {public HashMap searchTodayCheckin(int userId);public long searchCheckinDays(int userId);public ArrayList<HashMap> searchWeekCheckin(HashMap param);}

3、TbHolidaysDao.xml

<select id="searchHolidaysInRange" parameterType="HashMap" resultType="String">SELECT dateFROM tb_holidaysWHERE date BETWEEN #{startDate} AND #{endDate}</select>

4、TbHolidaysDao.java

public interface TbHolidaysDao {
……public ArrayList<String> searchHolidaysInRange(HashMap param);}

5、TbWorkdayDao.xml

<select id="searchWorkdayInRange" parameterType="HashMap" resultType="String">SELECT dateFROM tb_workdayWHERE date BETWEEN #{startDate} AND #{endDate}</select>

6、TbWorkdayDao.java

public interface TbWorkdayDao {……
public ArrayList<String> searchWorkdayInRange(HashMap param);
}

二、业务层

1、 CheckinService.java

 public class CheckinServiceImpl{……public HashMap searchTodayCheckin(int userId) {HashMap map = checkinDao.searchTodayCheckin(userId);return map;}public long searchCheckinDays(int userId) {long days = checkinDao.searchCheckinDays(userId);return days;}public ArrayList<HashMap> searchWeekCheckin(HashMap param) {ArrayList<HashMap> checkinList = checkinDao.searchWeekCheckin(param);ArrayList<String> holidaysList = holidaysDao.searchHolidaysInRange(param);ArrayList<String> workdayList = workdayDao.searchWorkdayInRange(param);DateTime startDate = DateUtil.parseDate(param.get("startDate").toString());DateTime endDate = DateUtil.parseDate(param.get("endDate").toString());DateRange range = DateUtil.range(startDate, endDate, DateField.DAY_OF_MONTH);ArrayList list = new ArrayList();range.forEach(one -> {String date = one.toString("yyyy-MM-dd");//查看今天是不是假期或者工作日String type = "工作日";if (one.isWeekend()) {type = "节假日";}if (holidaysList != null && holidaysList.contains(date)) {type = "节假日";} else if (workdayList != null && workdayList.contains(date)) {type = "工作日";}String status = "";//如果date1 < date2,返回数小于0,date1==date2返回0,date1 > date2 大于0if (type.equals("工作日") && DateUtil.compare(one, DateUtil.date()) <= 0) {status = "缺勤";boolean flag=false;for (HashMap<String, String> map : checkinList) {if (map.containsValue(date)) {status = map.get("status");flag=true;break;}DateTime endTime=DateUtil.parse(DateUtil.today()+""+constants.attendanceEndTime);String today=DateUtil.today();if(date.equals(today)&&DateUtil.date().isBefore(endTime)&&flag==false)
{status="";}}}HashMap map = new HashMap();map.put("date", date);map.put("status", status);map.put("type", type);map.put("day", one.dayOfWeekEnum().toChinese("周"));list.add(map);});return list;}}

三、conroller层

1、编写 TbUserDao.xml 文件,查询员工的入职日期。

 <select id="searchUserHiredate" parameterType="int" resultType="String">SELECT hiredate FROM tb_user WHERE id=#{userId} AND status = 1
</select>

2、编写 TbUserDao.java 接口,定义抽象方法。

 public interface TbUserDao {……public String searchUserHiredate(int userId);}

3、在 UserService.java

 public class UserServiceImpl implements UserService {……@Overridepublic String searchUserHiredate(int userId) {String hiredate = userDao.searchUserHiredate(userId);return hiredate;}}

4、实现查询考勤结果的Web方法

 public class CheckinController {……@Autowiredprivate UserService userService;@Autowiredprivate SystemConstants constants;@GetMapping("/searchTodayCheckin")@ApiOperation("查询用户当日签到数据")public Result searchTodayCheckin(@RequestHeader("token") String token) {int userId = jwtUtil.getUserId(token);HashMap map = checkinService.searchTodayCheckin(userId);map.put("attendanceTime", constants.attendanceTime);map.put("closingTime", constants.closingTime);long days = checkinService.searchCheckinDays(userId);map.put("checkinDays", days);//判断日期是否在用户入职之前DateTime hiredate = DateUtil.parse(userService.searchUserHiredate(userId));DateTime startDate = DateUtil.beginOfWeek(DateUtil.date());if (startDate.isBefore(hiredate)) {startDate = hiredate;}DateTime endDate = DateUtil.endOfWeek(DateUtil.date());HashMap param = new HashMap();param.put("startDate", startDate.toString());param.put("endDate", endDate.toString());param.put("userId", userId);ArrayList<HashMap> list = checkinService.searchWeekCheckin(param);map.put("weekCheckin", list);return Result.ok().put("result", map);}}

相关文章:

小程序(十四)后端-签到成功

文章目录一、持久层1、CheckinMapper.xml2、CheckinMapper.java3、TbHolidaysDao.xml4、TbHolidaysDao.java5、TbWorkdayDao.xml6、TbWorkdayDao.java二、业务层1、 CheckinService.java三、conroller层1、编写 TbUserDao.xml 文件&#xff0c;查询员工的入职日期。2、编写 TbU…...

X264简介-Android使用(一)

X264 简介及使用 1、简介 2、环境搭建 3、使用 4、小结 简介 官网连接&#xff1a;https://www.videolan.org/developers/x264.html 官方文档&#xff1a;https://wiki.videolan.org/Category:X264/ x264是用于编码H.264/MPEG-4 AVC视频流的免费软件库。它世界上最流行的…...

DetectGPT:使用概率曲率的零样本机器生成文本检测

DetectGPT的目的是确定一段文本是否由特定的llm生成&#xff0c;例如GPT-3。为了对段落 x 进行分类&#xff0c;DetectGPT 首先使用通用的预训练模型&#xff08;例如 T5&#xff09;对段落 ~xi 生成较小的扰动。然后DetectGPT将原始样本x的对数概率与每个扰动样本~xi进行比较。…...

【深度学习】BERT变体—BERT-wwm

1.BERT-wwm 1-1 Whole Word Masking Whole Word Masking (wwm)是谷歌在2019年5月31日发布的一项BERT的升级版本&#xff0c;主要更改了原预训练阶段的训练样本生成策略。 原有基于WordPiece的分词方式会把一个完整的词切分成若干个子词&#xff0c;在生成训练样本时&#xff…...

【华为OD机试真题 java、python、c++】优秀学员统计【2022 Q4 100分】(100%通过)

代码请进行一定修改后使用,本代码保证100%通过率。本文章提供java、python、c++三种代码 题目描述 公司某部门软件教导团正在组织新员工每日打卡学习活动,他们开展这项学习活动已经一个月了,所以想统计下这个月优秀的打卡员工。 每个员工会对应一个id,每天的打卡记录记录当…...

JavaScript里的循环方法:forEach,for-in,for-of

文章目录forEach循环for–in循环for-of循环for-of循环使用例子&#xff1a;循环一个数组(Array):循环一个字符串&#xff1a;循环一个类型化的数组(TypedArray)&#xff1a;循环一个Map:循环一个 Set:循环一个 DOM collection循环一个拥有enumerable属性的对象循环一个生成器(g…...

汽车标定知识整理(二):CCP报文基本命令介绍

目录 一、基本命令 CRO命令报文的基本命令表&#xff1a; 二、基本命令与可选命令帧格式介绍 1、CONNECT——建立连接&#xff08;0x01&#xff09; 2、GET_CPP_VERSION——获取CCP版本&#xff08;0x1B&#xff09; 3、SET_MTA——设置内存传输地址&#xff08;0x02&#…...

windows系统安装Linux虚拟机教程

虚拟机的安装首先要下载虚拟机的安装包&#xff0c;当前最新版本是VMware 16.2.1。软件我都已经给大家准备好了&#xff08;含序列号&#xff09;&#xff0c;大家在这里下载就好。虚拟机安装包下载完毕之后&#xff0c;将它安装到电脑里。这个安装过程很简单&#xff0c;一路下…...

“基于Spring Cloud Alibaba的微服务架构实战:Nacos配置管理“

引言 Spring Cloud Alibaba 是 Spring Cloud 和 Alibaba 集团联合推出的开源微服务框架&#xff0c;旨在为 Java 开发者提供一种简单、易用、高效的微服务解决方案。Nacos 是一个面向云原生应用的动态服务发现、配置管理和服务管理平台&#xff0c;提供了服务注册与发现、配置管…...

【Linux】常见面试题

1. 查看文件内容 cat tail head less more 2. 几个查看文件内容的命令有什么区别 cat 文件名 # 将文件内的内容全部打印出来&#xff0c;cat 文件1 文件2 先将文件1全部法印&#xff0c;然后在打印文件2 more 文件名 # 分屏查看 less 文件名 # 上下分页查看 head 文件…...

【数据结构】顺序表:尾部操作我很行,随机访问我超快!!!

顺序表的模拟实现 文章目录顺序表的模拟实现1.线性表2.顺序表2.1概念结构2.2顺序表的模拟实现2.2.1顺序表的初始化2.2.2顺序表的销毁2.2.3尾插数据2.2.4尾删数据2.2.5头插数据2.2.6头删数据2.2.7中间插入数据2.2.8中间删除数据2.2.9打印顺序表2.2.10查找数据2.2.11复用Insert和…...

SQL优化

SQL优化 SQL优化的方法&#xff1a; sql查询语句尽不使用select * &#xff0c;而是具体的字段。 节约资源&#xff0c;减少网络开销。减少回表&#xff0c;提高查询效率。 避免在where子句中使用or来连接条件。 or可能会使索引失效&#xff0c;从而进行全表查询。 尽量使用…...

Java ArrayList 和 LinkList 原理对比

Java 中的 ArrayList 和 LinkedList 都是实现了 List 接口的集合类它们都允许添加、删除和修改元素。但是它们的底层实现原理不同导致它们在不同的场景下拥有不同的优劣势。 ArrayListArrayList 的底层是通过数组实现的因此它具有数组的特性。它允许快速随机访问元素但是在插入…...

【Spring】入门概述(一)

&#x1f697;Spring学习第一站~ &#x1f6a9;本文已收录至专栏&#xff1a;Spring家族学习之旅 &#x1f44d;希望您能有所收获 一.初识 Spring并不是单一的一个技术&#xff0c;而是一个大家族&#xff0c;发展到今天已经形成了一种开发的生态圈&#xff0c;Spring提供了若…...

十二、面向切面编程AOP

IoC使软件组件松耦合。AOP让你能够捕捉系统中经常使用的功能&#xff0c;把它转化成组件。 AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;面向切面编程&#xff0c;面向方面编程。&#xff08;AOP是一种编程技术&#xff09; AOP是对OOP的补充延伸。 …...

Mybatis 处理 CLOB/BLOB 类型数据

Mybatis 处理 CLOB/BLOB 类型数据 BLOB 和 CLOB 都是大型字段类型。 BLOB通过二进制存储&#xff0c;而CLOB可以直接存储文本。 通常&#xff0c;图片、文件、音乐等信息存储在 BLOB 字段中。首先&#xff0c;文件是转换为二进制&#xff0c;然后存储在。文章或较长的文本存…...

【NLP经典论文阅读】Efficient Estimation of Word Representations in Vector Space(附代码)

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…...

Spring bean生命周期分为几个阶段?

bean 的生命周期从调用 beanFactory 的 getBean 开始&#xff0c;到这个 bean 被销毁&#xff0c;可以总结为以下七个阶段&#xff1a;处理名称&#xff0c;检查缓存→处理父子容器→处理 dependsOn→选择 scope 策略→创建 bean→类型转换处理→销毁 bean划分的阶段和名称并不…...

【基础算法】单链表的OJ练习(4) # 分割链表 # 回文链表 #

文章目录前言分割链表回文链表写在最后前言 本章的OJ练习相对前面的难度加大了&#xff0c;但是换汤不换药&#xff0c;还是围绕单链表的性质来出题的。我相信&#xff0c;能够过了前面的OJ练习&#xff0c;本章的OJ也是轻轻松松。 对于OJ练习(3)&#xff1a;-> 传送门 <…...

SpringBoot整合定时任务和邮件发送(邮箱 信息轰炸 整蛊)

SpringBoot整合定时任务和邮件发送&#xff08;邮箱 信息轰炸 整蛊&#xff09; 目录SpringBoot整合定时任务和邮件发送&#xff08;邮箱 信息轰炸 整蛊&#xff09;1.概述2.最佳实践2.1创建项目引入依赖(mail)2.2 修改yml配置文件2.3 启动类添加EnableScheduling注解2.4 执行的…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...