From cd3cb071ebad82444f92575577e6975dae07d383 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期一, 09 二月 2026 17:22:12 +0800
Subject: [PATCH] 打卡签到列表和新增

---
 src/main/java/com/ruoyi/staff/service/PersonalAttendanceRecordsService.java          |   19 ++
 src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceRecords.java                    |   94 ++++++++-----
 src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java |  184 +++++++++++++++++++++++++
 src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java    |   54 +++----
 src/main/resources/mapper/staff/PersonalAttendanceRecordsMapper.xml                  |   40 +++++
 5 files changed, 317 insertions(+), 74 deletions(-)

diff --git a/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java b/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
index 53f55fd..1bf6b06 100644
--- a/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
+++ b/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
@@ -2,44 +2,42 @@
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.staff.dto.PersonalAttendanceRecordsDto;
+import com.ruoyi.staff.pojo.HolidayApplication;
 import com.ruoyi.staff.pojo.PersonalAttendanceRecords;
+import com.ruoyi.staff.service.HolidayApplicationService;
 import com.ruoyi.staff.service.PersonalAttendanceRecordsService;
-import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-@AllArgsConstructor
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-02-09 01:20:07
+ */
 @RestController
-@RequestMapping("/staff/personalAttendanceRecords")
+@RequestMapping("/personalAttendanceRecords")
 public class PersonalAttendanceRecordsController {
     @Autowired
     private PersonalAttendanceRecordsService personalAttendanceRecordsService;
-    /**
-     * 涓汉鑰冨嫟璁板綍鍒嗛〉鏌ヨ
-     */
+
+    // 鏂板
+    @PostMapping("")
+    public AjaxResult add(@RequestBody PersonalAttendanceRecords personalAttendanceRecord){
+        return AjaxResult.success(personalAttendanceRecordsService.add(personalAttendanceRecord));
+    }
+
+    // 鍒楄〃鏌ヨ
     @GetMapping("/listPage")
-    public AjaxResult personalAttendanceRecordsListPage(Page page, PersonalAttendanceRecords personalAttendanceRecords) {
-        return AjaxResult.success(personalAttendanceRecordsService.listPage(page, personalAttendanceRecords));
+    public AjaxResult listPage(Page page, PersonalAttendanceRecordsDto personalAttendanceRecordsDto){
+        return AjaxResult.success(personalAttendanceRecordsService.listPage(page, personalAttendanceRecordsDto));
     }
-    /**
-     * 鏂板涓汉鑰冨嫟璁板綍
-     */
-    @PostMapping("/add")
-    public AjaxResult add(@RequestBody PersonalAttendanceRecords personalAttendanceRecords) {
-        return AjaxResult.success(personalAttendanceRecordsService.save(personalAttendanceRecords));
-    }
-    /**
-     * 淇敼涓汉鑰冨嫟璁板綍
-     */
-    @PutMapping("/update")
-    public AjaxResult update(@RequestBody PersonalAttendanceRecords personalAttendanceRecords) {
-        return AjaxResult.success(personalAttendanceRecordsService.updateById(personalAttendanceRecords));
-    }
-    /**
-     * 鍒犻櫎涓汉鑰冨嫟璁板綍
-     */
-    @DeleteMapping("/delete/{id}")
-    public AjaxResult delete(@PathVariable("id") Long id) {
-        return AjaxResult.success(personalAttendanceRecordsService.removeById(id));
+
+    @GetMapping("/today")
+    public AjaxResult todayInfo(PersonalAttendanceRecordsDto personalAttendanceRecordsDto){
+        return AjaxResult.success(personalAttendanceRecordsService.todayInfo(personalAttendanceRecordsDto));
     }
 }
diff --git a/src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceRecords.java b/src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceRecords.java
index cbf11b7..7026364 100644
--- a/src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceRecords.java
+++ b/src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceRecords.java
@@ -1,52 +1,76 @@
 package com.ruoyi.staff.pojo;
 
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ruoyi.framework.aspectj.lang.annotation.Excel;
-import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
 import org.springframework.format.annotation.DateTimeFormat;
 
-import java.io.Serializable;
-import java.time.LocalDate;
-import java.time.LocalTime;
-
-@Data
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-02-09 01:20:07
+ */
+@Getter
+@Setter
 @TableName("personal_attendance_records")
+@ApiModel(value = "PersonalAttendanceRecords瀵硅薄", description = "")
 public class PersonalAttendanceRecords implements Serializable {
-    /**
-     * 搴忓彿
-     */
-    @TableId(type = IdType.AUTO)
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
     private Long id;
-    /**
-     * 鏃ユ湡
-     */
+
+    @ApiModelProperty("鍛樺伐鍦ㄨ亴id")
+    private Long staffOnJobId;
+
+    @ApiModelProperty("鏃ユ湡")
     @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate date;
-    /**
-     * 绛惧埌鏃堕棿
-     */
+
+    @ApiModelProperty("宸ヤ綔寮�濮嬫椂闂�")
     @JsonFormat(pattern = "HH:mm")
     @DateTimeFormat(pattern = "HH:mm")
-    private LocalTime checkIn;
-    /**
-     * 绛鹃��鏃堕棿
-     */
+    private LocalDateTime workStartAt;
+
+    @ApiModelProperty("宸ヤ綔缁撴潫鏃堕棿")
     @JsonFormat(pattern = "HH:mm")
     @DateTimeFormat(pattern = "HH:mm")
-    private LocalTime checkOut;
-    /**
-     * 宸ヤ綔鏃堕暱
-     */
-    private String workHours;
-    /**
-     * 鐘舵��
-     */
-    private String status;
-    /**
-     * 绉熸埛ID
-     */
+    private LocalDateTime workEndAt;
+
+    @ApiModelProperty("宸ヤ綔鏃堕暱")
+    private BigDecimal workHours;
+
+    @ApiModelProperty("鐘舵�� 0姝e父 1杩熷埌 2鏃╅��")
+    private Byte status;
+
+    @ApiModelProperty("澶囨敞")
+    private String remark;
+
+    @ApiModelProperty("绉熸埛id")
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
+
+    @ApiModelProperty("褰曞叆鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
 }
diff --git a/src/main/java/com/ruoyi/staff/service/PersonalAttendanceRecordsService.java b/src/main/java/com/ruoyi/staff/service/PersonalAttendanceRecordsService.java
index c39b007..4260e9e 100644
--- a/src/main/java/com/ruoyi/staff/service/PersonalAttendanceRecordsService.java
+++ b/src/main/java/com/ruoyi/staff/service/PersonalAttendanceRecordsService.java
@@ -2,9 +2,24 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.staff.dto.PersonalAttendanceRecordsDto;
+import com.ruoyi.staff.dto.StaffOnJobDto;
 import com.ruoyi.staff.pojo.PersonalAttendanceRecords;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.staff.pojo.StaffOnJob;
 
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-02-09 01:20:07
+ */
 public interface PersonalAttendanceRecordsService extends IService<PersonalAttendanceRecords> {
-    IPage listPage(Page page, PersonalAttendanceRecords personalAttendanceRecords);
+    IPage<PersonalAttendanceRecordsDto> listPage(Page page, PersonalAttendanceRecordsDto personalAttendanceRecordsDto);
+
+    int add(PersonalAttendanceRecords personalAttendanceRecords);
+
+    PersonalAttendanceRecordsDto todayInfo(PersonalAttendanceRecordsDto personalAttendanceRecordsDto);
 }
diff --git a/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java
index 1fc363b..241c202 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java
@@ -3,21 +3,195 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.staff.mapper.PersonalAttendanceRecordsMapper;
+import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.project.system.domain.SysDept;
+import com.ruoyi.project.system.mapper.SysDeptMapper;
+import com.ruoyi.project.system.service.ISysDictDataService;
+import com.ruoyi.staff.dto.PersonalAttendanceRecordsDto;
+import com.ruoyi.staff.mapper.StaffOnJobMapper;
 import com.ruoyi.staff.pojo.PersonalAttendanceRecords;
+import com.ruoyi.staff.mapper.PersonalAttendanceRecordsMapper;
+import com.ruoyi.staff.pojo.StaffOnJob;
 import com.ruoyi.staff.service.PersonalAttendanceRecordsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-02-09 01:20:07
+ */
 @Service
 public class PersonalAttendanceRecordsServiceImpl extends ServiceImpl<PersonalAttendanceRecordsMapper, PersonalAttendanceRecords> implements PersonalAttendanceRecordsService {
     @Autowired
     private PersonalAttendanceRecordsMapper personalAttendanceRecordsMapper;
 
+    @Autowired
+    private StaffOnJobMapper staffOnJobMapper;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    @Autowired
+    private SysDeptMapper sysDeptMapper;
+
     @Override
-    public IPage listPage(Page page, PersonalAttendanceRecords personalAttendanceRecords) {
-//        return personalAttendanceRecordsMapper.ListPage(page, personalAttendanceRecords);
-        return baseMapper.selectPage(page, new QueryWrapper<>(personalAttendanceRecords));
+    @Transactional(rollbackFor = Exception.class)
+    public int add(PersonalAttendanceRecords personalAttendanceRecords) {
+        // 褰撳墠鏃堕棿
+        LocalDate currentDate = LocalDate.now();
+
+        // 棣栧厛鏍规嵁鐢ㄦ埛ID鏌ヨ鍛樺伐淇℃伅
+        QueryWrapper<StaffOnJob> staffQueryWrapper = new QueryWrapper<>();
+        staffQueryWrapper.eq("staff_no", SecurityUtils.getUsername());
+        StaffOnJob staffOnJob = staffOnJobMapper.selectOne(staffQueryWrapper);
+        if (staffOnJob == null) {
+            throw new BaseException("褰撳墠鐢ㄦ埛娌℃湁瀵瑰簲鐨勫憳宸ヤ俊鎭�");
+        }
+
+        // 鏍规嵁鍛樺伐ID鍜屽綋鍓嶆棩鏈熸煡璇㈡墦鍗¤褰�
+        QueryWrapper<PersonalAttendanceRecords> attendanceQueryWrapper = new QueryWrapper<>();
+        attendanceQueryWrapper.eq("staff_on_job_id", staffOnJob.getId())
+                .eq("date", currentDate);
+        PersonalAttendanceRecords attendanceRecord = personalAttendanceRecordsMapper.selectOne(attendanceQueryWrapper);
+        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm");
+        // 鏍规嵁瀛楀吀璁剧疆鐨勮�冨嫟鏃堕棿鍒ゆ柇杩熷埌鏃╅��
+        if (attendanceRecord == null) {
+            // 涓嶅瓨鍦ㄦ墦鍗¤褰曪紝鍒涘缓鏂拌褰�
+            personalAttendanceRecords.setStaffOnJobId(staffOnJob.getId());
+            personalAttendanceRecords.setDate(currentDate);
+            personalAttendanceRecords.setWorkStartAt(LocalDateTime.now());
+            personalAttendanceRecords.setStatus(determineAttendanceStatus(personalAttendanceRecords.getWorkStartAt(), true));
+            personalAttendanceRecords.setRemark(personalAttendanceRecords.getRemark());
+            personalAttendanceRecords.setTenantId(staffOnJob.getTenantId());
+            return personalAttendanceRecordsMapper.insert(personalAttendanceRecords);
+        } else {
+            if (attendanceRecord.getWorkEndAt() == null) {
+                // 鏇存柊宸ヤ綔缁撴潫鏃堕棿鍜屽伐浣滄椂闀�
+                attendanceRecord.setWorkEndAt(LocalDateTime.now());
+                // 璁$畻宸ヤ綔鏃堕暱锛堢簿纭埌鍒嗛挓锛屼繚鐣�2浣嶅皬鏁帮級
+                LocalDateTime startTime = attendanceRecord.getWorkStartAt();
+                LocalDateTime endTime = attendanceRecord.getWorkEndAt();
+                // 璁$畻涓や釜鏃堕棿涔嬮棿鐨勫垎閽熸暟
+                long totalMinutes = java.time.Duration.between(startTime, endTime).toMinutes();
+                BigDecimal workHours = BigDecimal.valueOf(totalMinutes)
+                        .divide(BigDecimal.valueOf(60), 2, RoundingMode.HALF_UP);
+                attendanceRecord.setWorkHours(workHours);
+                // 鏇存柊鑰冨嫟鐘舵��
+                attendanceRecord.setStatus(determineAttendanceStatus(attendanceRecord.getWorkEndAt(), false));
+                return personalAttendanceRecordsMapper.updateById(attendanceRecord);
+            } else {
+                throw new BaseException("鎮ㄥ凡缁忔墦杩囧崱浜�,鏃犻渶閲嶅鎵撳崱!!!");
+            }
+        }
+    }
+
+    // 鏍规嵁瀹為檯鏃堕棿鍜屾槸鍚︿笂鐝椂闂村垽鏂�冨嫟鐘舵��
+    // 0 姝e父 1 杩熷埌 2 鏃╅��
+    private byte determineAttendanceStatus(LocalDateTime actualTime, boolean isStart) {
+        try {
+            // 鑾峰彇鑰冨嫟鏃堕棿閰嶇疆
+            String dictType = "sys_work_time"; // 鑰冨嫟鏃堕棿瀛楀吀绫诲瀷
+            String timeConfig;
+
+            if (isStart) {
+                // 涓婄彮鏃堕棿閰嶇疆锛岄粯璁や负09:00
+                timeConfig = dictDataService.selectDictLabel(dictType, "work_start_time");
+                if (timeConfig == null || timeConfig.trim().isEmpty()) {
+                    timeConfig = "09:00";
+                }
+            } else {
+                // 涓嬬彮鏃堕棿閰嶇疆锛岄粯璁や负18:00
+                timeConfig = dictDataService.selectDictLabel(dictType, "work_end_time");
+                if (timeConfig == null || timeConfig.trim().isEmpty()) {
+                    timeConfig = "18:00";
+                }
+            }
+
+            // 瑙f瀽鏍囧噯鏃堕棿
+            String[] timeParts = timeConfig.split(":");
+            int standardHour = Integer.parseInt(timeParts[0]);
+            int standardMinute = Integer.parseInt(timeParts[1]);
+
+            // 鑾峰彇瀹為檯鏃堕棿鐨勬椂鍒�
+            int actualHour = actualTime.getHour();
+            int actualMinute = actualTime.getMinute();
+
+            // 鍒ゆ柇鐘舵��
+            if (isStart) {
+                // 涓婄彮鎵撳崱锛氳秴杩囨爣鍑嗘椂闂寸畻杩熷埌
+                if (actualHour > standardHour || (actualHour == standardHour && actualMinute > standardMinute)) {
+                    return 1; // 杩熷埌
+                }
+            } else {
+                // 涓嬬彮鎵撳崱锛氭棭浜庢爣鍑嗘椂闂寸畻鏃╅��
+                if (actualHour < standardHour || (actualHour == standardHour && actualMinute < standardMinute)) {
+                    return 2; // 鏃╅��
+                }
+            }
+
+            return 0; // 姝e父
+
+        } catch (Exception e) {
+            // 濡傛灉鑾峰彇閰嶇疆澶辫触锛岄粯璁よ繑鍥炴甯哥姸鎬�
+            log.warn("鑾峰彇鑰冨嫟鏃堕棿閰嶇疆澶辫触锛屼娇鐢ㄩ粯璁ょ姸鎬侊細" + e.getMessage());
+            return 0;
+        }
+    }
+
+    @Override
+    public IPage<PersonalAttendanceRecordsDto> listPage(Page page, PersonalAttendanceRecordsDto personalAttendanceRecordsDto) {
+        return personalAttendanceRecordsMapper.listPage(page,personalAttendanceRecordsDto);
+    }
+
+    @Override
+    public PersonalAttendanceRecordsDto todayInfo(PersonalAttendanceRecordsDto personalAttendanceRecordsDto) {
+        // 鑾峰彇褰撳墠鏃ユ湡
+        LocalDate currentDate = LocalDate.now();
+
+        // 棣栧厛鏍规嵁鐢ㄦ埛ID鏌ヨ鍛樺伐淇℃伅
+        QueryWrapper<StaffOnJob> staffQueryWrapper = new QueryWrapper<>();
+        staffQueryWrapper.eq("staff_no", SecurityUtils.getUsername());
+        StaffOnJob staffOnJob = staffOnJobMapper.selectOne(staffQueryWrapper);
+
+        if (staffOnJob == null) {
+            return null; // 褰撳墠鐢ㄦ埛娌℃湁瀵瑰簲鐨勫憳宸ヤ俊鎭�
+        }
+
+        // 鏍规嵁鍛樺伐ID鍜屽綋鍓嶆棩鏈熸煡璇㈡墦鍗¤褰�
+        QueryWrapper<PersonalAttendanceRecords> attendanceQueryWrapper = new QueryWrapper<>();
+        attendanceQueryWrapper.eq("staff_on_job_id", staffOnJob.getId())
+                .eq("date", currentDate);
+        PersonalAttendanceRecords attendanceRecord = personalAttendanceRecordsMapper.selectOne(attendanceQueryWrapper);
+
+        // 杩斿洖鍙傛暟
+        PersonalAttendanceRecordsDto resultDto = new PersonalAttendanceRecordsDto();
+
+        if (attendanceRecord != null) {
+            // 濡傛灉鏈夋墦鍗¤褰曪紝澶嶅埗鎵撳崱璁板綍淇℃伅
+            BeanUtils.copyProperties(attendanceRecord, resultDto);
+        }
+
+        // 鍛樺伐鐩稿叧淇℃伅
+        resultDto.setStaffName(staffOnJob.getStaffName());
+        resultDto.setStaffNo(staffOnJob.getStaffNo());
+        resultDto.setDeptId(staffOnJob.getSysDeptId() != null ? staffOnJob.getSysDeptId() : null);
+        SysDept dept = sysDeptMapper.selectDeptById(staffOnJob.getSysDeptId());
+        resultDto.setDeptName(dept != null ? dept.getDeptName() : null);
+
+        return resultDto;
     }
 }
diff --git a/src/main/resources/mapper/staff/PersonalAttendanceRecordsMapper.xml b/src/main/resources/mapper/staff/PersonalAttendanceRecordsMapper.xml
index 13d3513..146830b 100644
--- a/src/main/resources/mapper/staff/PersonalAttendanceRecordsMapper.xml
+++ b/src/main/resources/mapper/staff/PersonalAttendanceRecordsMapper.xml
@@ -1,7 +1,39 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.staff.mapper.PersonalAttendanceRecordsMapper">
 
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.staff.pojo.PersonalAttendanceRecords">
+        <id column="id" property="id" />
+        <result column="staff_on_job_id" property="staffOnJobId" />
+        <result column="date" property="date" />
+        <result column="work_start_at" property="workStartAt" />
+        <result column="work_end_at" property="workEndAt" />
+        <result column="work_hours" property="workHours" />
+        <result column="status" property="status" />
+        <result column="remark" property="remark" />
+        <result column="tenant_id" property="tenantId" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
 
-
-</mapper>
\ No newline at end of file
+    <select id="listPage" resultType="com.ruoyi.staff.dto.PersonalAttendanceRecordsDto">
+        SELECT
+        personal_attendance_records.*,
+        soj.staff_name as staffName,
+        soj.staff_no as staffNo,
+        sd.dept_name as deptName
+        FROM personal_attendance_records
+        LEFT JOIN
+        staff_on_job soj ON soj.id = personal_attendance_records.staff_on_job_id
+        LEFT JOIN
+        sys_dept sd ON sd.dept_id = soj.sys_dept_id
+        where 1=1
+        <if test="params.deptId != null and params.deptId > 0">
+            AND sys_dept.dept_id = #{params.deptId}
+        </if>
+        <if test="params.date != null">
+            AND personal_attendance_records.date = DATE_FORMAT(#{params.date},'%Y-%m-%d')
+        </if>
+    </select>
+</mapper>

--
Gitblit v1.9.3