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


一、持久层

1、CheckinMapper.xml

<select id="searchTodayCheckin" parameterType="int" resultType="HashMap">
 SELECT
 u.name,
 u.photo,
 d.dept_name AS deptName,
 ck.address,
 CASE
 WHEN ck.status=1 THEN '正常'
 WHEN ck.status=2 THEN '迟到'
 END AS status,
 DATE_FORMAT(ck.create_time,'%H:%i') AS checkinTime,
 ck.date
 FROM tb_user AS u
 LEFT JOIN tb_dept AS d ON u.dept_id = d.id
 LEFT JOIN tb_checkin AS ck ON u.id = ck.user_id AND ck.date = CURRENT_DATE
 WHERE u.id = #{userId} AND u.status=1
 </select>


 <select id="searchCheckinDays" parameterType="int" resultType="long">
 SELECT COUNT(*) AS count
 FROM tb_checkin
 WHERE user_id=#{userId}
 </select>
 
 <select id="searchWeekCheckin" parameterType="HashMap" resultType="HashMap">
 SELECT
 CAST(date AS CHAR) AS date,
 IF(status=1,'正常','迟到') AS status
 FROM tb_checkin
 WHERE 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 date
 FROM tb_holidays
 WHERE 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 date
 FROM tb_workday
 WHERE 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 大于0
 if (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 {
 ……
 @Override
 public String searchUserHiredate(int userId) {
 String hiredate = userDao.searchUserHiredate(userId);
 return hiredate;
 }
 }

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

 public class CheckinController {
 ……
 @Autowired
 private UserService userService;
 @Autowired
 private 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);
 }
 }

版权声明:本文为weixin_38380811原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。