Procházet zdrojové kódy

/teacher/attendanceConfig/ 打卡考勤配置
/teacher/attendanceRecord/ 打卡考勤记录,进行打卡
/teacher/attendancePersonnel/ 打卡考勤人员管理

phoenix před 2 roky
rodič
revize
14b65e2702
34 změnil soubory, kde provedl 1917 přidání a 0 odebrání
  1. 120 0
      src/main/java/com/xjrsoft/module/teacher/controller/AttendanceConfigController.java
  2. 121 0
      src/main/java/com/xjrsoft/module/teacher/controller/AttendancePersonnelController.java
  3. 136 0
      src/main/java/com/xjrsoft/module/teacher/controller/AttendanceRecordController.java
  4. 63 0
      src/main/java/com/xjrsoft/module/teacher/dto/AddAttendanceConfigDto.java
  5. 33 0
      src/main/java/com/xjrsoft/module/teacher/dto/AddAttendancePersonnelDto.java
  6. 73 0
      src/main/java/com/xjrsoft/module/teacher/dto/AddAttendanceRecordDto.java
  7. 26 0
      src/main/java/com/xjrsoft/module/teacher/dto/AttendanceConfigPageDto.java
  8. 26 0
      src/main/java/com/xjrsoft/module/teacher/dto/AttendancePersonnelPageDto.java
  9. 49 0
      src/main/java/com/xjrsoft/module/teacher/dto/AttendanceRecordPageDto.java
  10. 57 0
      src/main/java/com/xjrsoft/module/teacher/dto/ClockInDto.java
  11. 27 0
      src/main/java/com/xjrsoft/module/teacher/dto/GetCheckInDayDto.java
  12. 32 0
      src/main/java/com/xjrsoft/module/teacher/dto/UpdateAttendanceConfigDto.java
  13. 32 0
      src/main/java/com/xjrsoft/module/teacher/dto/UpdateAttendancePersonnelDto.java
  14. 32 0
      src/main/java/com/xjrsoft/module/teacher/dto/UpdateAttendanceRecordDto.java
  15. 113 0
      src/main/java/com/xjrsoft/module/teacher/entity/AttendanceConfig.java
  16. 46 0
      src/main/java/com/xjrsoft/module/teacher/entity/AttendancePersonnel.java
  17. 123 0
      src/main/java/com/xjrsoft/module/teacher/entity/AttendanceRecord.java
  18. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/AttendanceConfigMapper.java
  19. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/AttendancePersonnelMapper.java
  20. 22 0
      src/main/java/com/xjrsoft/module/teacher/mapper/AttendanceRecordMapper.java
  21. 17 0
      src/main/java/com/xjrsoft/module/teacher/service/IAttendanceConfigService.java
  22. 17 0
      src/main/java/com/xjrsoft/module/teacher/service/IAttendancePersonnelService.java
  23. 32 0
      src/main/java/com/xjrsoft/module/teacher/service/IAttendanceRecordService.java
  24. 25 0
      src/main/java/com/xjrsoft/module/teacher/service/impl/AttendanceConfigServiceImpl.java
  25. 25 0
      src/main/java/com/xjrsoft/module/teacher/service/impl/AttendancePersonnelServiceImpl.java
  26. 146 0
      src/main/java/com/xjrsoft/module/teacher/service/impl/AttendanceRecordServiceImpl.java
  27. 94 0
      src/main/java/com/xjrsoft/module/teacher/vo/AttendanceConfigPageVo.java
  28. 64 0
      src/main/java/com/xjrsoft/module/teacher/vo/AttendanceConfigVo.java
  29. 49 0
      src/main/java/com/xjrsoft/module/teacher/vo/AttendancePersonnelPageVo.java
  30. 34 0
      src/main/java/com/xjrsoft/module/teacher/vo/AttendancePersonnelVo.java
  31. 70 0
      src/main/java/com/xjrsoft/module/teacher/vo/AttendanceRecordPageVo.java
  32. 74 0
      src/main/java/com/xjrsoft/module/teacher/vo/AttendanceRecordVo.java
  33. 14 0
      src/main/resources/mapper/teacher/AttendanceRecordMapper.xml
  34. 91 0
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

+ 120 - 0
src/main/java/com/xjrsoft/module/teacher/controller/AttendanceConfigController.java

@@ -0,0 +1,120 @@
+package com.xjrsoft.module.teacher.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.teacher.dto.AddAttendanceConfigDto;
+import com.xjrsoft.module.teacher.dto.UpdateAttendanceConfigDto;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+
+import com.xjrsoft.module.teacher.dto.AttendanceConfigPageDto;
+import com.xjrsoft.module.teacher.entity.AttendanceConfig;
+import com.xjrsoft.module.teacher.service.IAttendanceConfigService;
+import com.xjrsoft.module.teacher.vo.AttendanceConfigPageVo;
+
+import com.xjrsoft.module.teacher.vo.AttendanceConfigVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+* @title: 考勤-配置
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/teacher" + "/attendanceConfig")
+@Api(value = "/teacher"  + "/attendanceConfig",tags = "考勤-配置代码")
+@AllArgsConstructor
+public class AttendanceConfigController {
+
+
+    private final IAttendanceConfigService attendanceConfigService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="考勤-配置列表(分页)")
+    @SaCheckPermission("attendanceconfig:detail")
+    public RT<PageOutput<AttendanceConfigPageVo>> page(@Valid AttendanceConfigPageDto dto){
+
+        LambdaQueryWrapper<AttendanceConfig> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+                    .orderByDesc(AttendanceConfig::getId)
+                .select(AttendanceConfig.class,x -> VoToColumnUtil.fieldsToColumns(AttendanceConfigPageVo.class).contains(x.getProperty()));
+        IPage<AttendanceConfig> page = attendanceConfigService.page(ConventPage.getPage(dto), queryWrapper);
+        PageOutput<AttendanceConfigPageVo> pageOutput = ConventPage.getPageOutput(page, AttendanceConfigPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询考勤-配置信息")
+    @SaCheckPermission("attendanceconfig:detail")
+    public RT<AttendanceConfigVo> info(@RequestParam Long id){
+        AttendanceConfig attendanceConfig = attendanceConfigService.getById(id);
+        if (attendanceConfig == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(attendanceConfig, AttendanceConfigVo.class));
+    }
+
+    @GetMapping(value = "/get-present-config")
+    @ApiOperation(value="获取当前使用的配置信息")
+    @SaCheckPermission("attendanceconfig:detail")
+    public RT<AttendanceConfigVo> getPresentConfig(){
+        LambdaQueryWrapper<AttendanceConfig> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+                .orderByDesc(AttendanceConfig::getId)
+                .select(AttendanceConfig.class,x -> VoToColumnUtil.fieldsToColumns(AttendanceConfigPageVo.class).contains(x.getProperty()))
+                .eq(AttendanceConfig::getDeleteMark,0)
+                .eq(AttendanceConfig::getEnabledMark,1);
+        List<AttendanceConfig> attendanceConfigList = attendanceConfigService.list(queryWrapper);
+
+        if (attendanceConfigList == null || !(attendanceConfigList.size() > 0)) {
+            return RT.error("找不到打卡配置数据!");
+        }
+        return RT.ok(BeanUtil.toBean(attendanceConfigList.get(0), AttendanceConfigVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增考勤-配置")
+    @SaCheckPermission("attendanceconfig:add")
+    public RT<Boolean> add(@Valid @RequestBody AddAttendanceConfigDto dto){
+        AttendanceConfig attendanceConfig = BeanUtil.toBean(dto, AttendanceConfig.class);
+        boolean isSuccess = attendanceConfigService.save(attendanceConfig);
+    return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改考勤-配置")
+    @SaCheckPermission("attendanceconfig:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateAttendanceConfigDto dto){
+
+        AttendanceConfig attendanceConfig = BeanUtil.toBean(dto, AttendanceConfig.class);
+        return RT.ok(attendanceConfigService.updateById(attendanceConfig));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除考勤-配置")
+    @SaCheckPermission("attendanceconfig:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(attendanceConfigService.removeBatchByIds(ids));
+
+    }
+
+}

+ 121 - 0
src/main/java/com/xjrsoft/module/teacher/controller/AttendancePersonnelController.java

@@ -0,0 +1,121 @@
+package com.xjrsoft.module.teacher.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.teacher.dto.AddAttendancePersonnelDto;
+import com.xjrsoft.module.teacher.dto.UpdateAttendancePersonnelDto;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.xjrsoft.module.teacher.entity.AttendanceRecord;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+import com.xjrsoft.module.teacher.vo.AttendanceRecordPageVo;
+import org.springframework.http.ResponseEntity;
+import java.io.ByteArrayOutputStream;
+import java.util.ArrayList;
+
+import com.xjrsoft.module.teacher.dto.AttendancePersonnelPageDto;
+import com.xjrsoft.module.teacher.entity.AttendancePersonnel;
+import com.xjrsoft.module.teacher.service.IAttendancePersonnelService;
+import com.xjrsoft.module.teacher.vo.AttendancePersonnelPageVo;
+
+import com.xjrsoft.module.teacher.vo.AttendancePersonnelVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+* @title: 考勤-人员
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/teacher" + "/attendancePersonnel")
+@Api(value = "/teacher"  + "/attendancePersonnel",tags = "考勤-人员代码")
+@AllArgsConstructor
+public class AttendancePersonnelController {
+
+
+    private final IAttendancePersonnelService attendancePersonnelService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="考勤-人员列表(分页)")
+    @SaCheckPermission("attendancepersonnel:detail")
+    public RT<PageOutput<AttendancePersonnelPageVo>> page(@Valid AttendancePersonnelPageDto dto){
+
+        MPJLambdaWrapper<AttendancePersonnel> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.select(AttendancePersonnel::getId)
+                .selectAs(XjrUser::getName, AttendancePersonnelPageVo::getUserName)
+                .leftJoin(XjrUser.class, XjrUser::getId, AttendancePersonnel::getUserId)
+                .orderByDesc(AttendancePersonnel::getId);
+        IPage<AttendanceRecordPageVo> page = attendancePersonnelService.selectJoinListPage(ConventPage.getPage(dto),AttendanceRecordPageVo.class, queryWrapper);
+        PageOutput<AttendancePersonnelPageVo> pageOutput = ConventPage.getPageOutput(page, AttendancePersonnelPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询考勤-人员信息")
+    @SaCheckPermission("attendancepersonnel:detail")
+    public RT<AttendancePersonnelVo> info(@RequestParam Long id){
+        AttendancePersonnel attendancePersonnel = attendancePersonnelService.getById(id);
+        if (attendancePersonnel == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(attendancePersonnel, AttendancePersonnelVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增考勤-人员")
+    @SaCheckPermission("attendancepersonnel:add")
+    public RT<Boolean> add(@Valid @RequestBody AddAttendancePersonnelDto dto){
+        AttendancePersonnel attendancePersonnel = BeanUtil.toBean(dto, AttendancePersonnel.class);
+        boolean isSuccess = attendancePersonnelService.save(attendancePersonnel);
+    return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改考勤-人员")
+    @SaCheckPermission("attendancepersonnel:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateAttendancePersonnelDto dto){
+
+        AttendancePersonnel attendancePersonnel = BeanUtil.toBean(dto, AttendancePersonnel.class);
+        return RT.ok(attendancePersonnelService.updateById(attendancePersonnel));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除考勤-人员")
+    @SaCheckPermission("attendancepersonnel:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(attendancePersonnelService.removeBatchByIds(ids));
+
+    }
+
+    @GetMapping("/export")
+    @ApiOperation(value = "导出")
+    public ResponseEntity<byte[]> exportData(@Valid AttendancePersonnelPageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
+        List<AttendancePersonnelPageVo> customerList = isTemplate != null && isTemplate ? new ArrayList<>() : ((PageOutput<AttendancePersonnelPageVo>) page(dto).getData()).getList();
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, AttendancePersonnelPageVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(customerList);
+
+        return RT.fileStream(bot.toByteArray(), "AttendancePersonnel" + ExcelTypeEnum.XLSX.getValue());
+    }
+}

+ 136 - 0
src/main/java/com/xjrsoft/module/teacher/controller/AttendanceRecordController.java

@@ -0,0 +1,136 @@
+package com.xjrsoft.module.teacher.controller;
+
+import ch.qos.logback.core.rolling.helper.IntegerTokenConverter;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.teacher.dto.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.xjrsoft.module.teacher.entity.AttendanceConfig;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+import com.xjrsoft.module.teacher.vo.AttendanceConfigPageVo;
+import org.springframework.http.ResponseEntity;
+import java.io.ByteArrayOutputStream;
+import java.util.ArrayList;
+
+import com.xjrsoft.module.teacher.entity.AttendanceRecord;
+import com.xjrsoft.module.teacher.service.IAttendanceRecordService;
+import com.xjrsoft.module.teacher.vo.AttendanceRecordPageVo;
+
+import com.xjrsoft.module.teacher.vo.AttendanceRecordVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+* @title: 考勤-记录
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/teacher" + "/attendanceRecord")
+@Api(value = "/teacher"  + "/attendanceRecord",tags = "考勤-记录代码")
+@AllArgsConstructor
+public class AttendanceRecordController {
+
+
+    private final IAttendanceRecordService attendanceRecordService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="考勤-记录列表(分页)")
+    @SaCheckPermission("attendancerecord:detail")
+    public RT<PageOutput<AttendanceRecordPageVo>> page(@Valid AttendanceRecordPageDto dto){
+
+        MPJLambdaWrapper<AttendanceRecord> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.select(AttendanceRecord::getId)
+                .selectAs(XjrUser::getName, AttendanceRecordPageVo::getUserName)
+                .select(AttendanceRecord.class, x -> VoToColumnUtil.fieldsToColumns(AttendanceRecordPageVo.class).contains(x.getProperty()))
+                .leftJoin(XjrUser.class, XjrUser::getId, AttendanceRecord::getUserId)
+                .like(ObjectUtil.isNotNull(dto.getUserName()) && !(dto.getUserName().equals("")),XjrUser::getName,dto.getUserName())
+                .between(ObjectUtil.isNotNull(dto.getCheckTimeStart()) && ObjectUtil.isNotNull(dto.getCheckTimeEnd()) && !dto.getCheckTimeStart().equals("") && !dto.getCheckTimeEnd().equals(""),
+                        AttendanceRecord::getCheckTime,dto.getCheckTimeStart(),dto.getCheckTimeEnd())
+                .orderByDesc(AttendanceRecord::getId);
+        IPage<AttendanceRecordPageVo> page = attendanceRecordService.selectJoinListPage(ConventPage.getPage(dto),AttendanceRecordPageVo.class, queryWrapper);
+        PageOutput<AttendanceRecordPageVo> pageOutput = ConventPage.getPageOutput(page, AttendanceRecordPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/getCheckInDay")
+    @ApiOperation(value="获取当月打卡的天")
+    @SaCheckPermission("attendancerecord:detail")
+    public RT<List<String>> getCheckInDay(@Valid GetCheckInDayDto dto){
+        List<String> dayList = attendanceRecordService.getCheckInDay(dto);
+        return RT.ok(dayList);
+    }
+
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询考勤-记录信息")
+    @SaCheckPermission("attendancerecord:detail")
+    public RT<AttendanceRecordVo> info(@RequestParam Long id){
+        AttendanceRecord attendanceRecord = attendanceRecordService.getById(id);
+        if (attendanceRecord == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(attendanceRecord, AttendanceRecordVo.class));
+    }
+
+    @PostMapping
+    @ApiOperation(value = "新增考勤-记录")
+    @SaCheckPermission("attendancerecord:add")
+    public RT<Boolean> add(@Valid @RequestBody AddAttendanceRecordDto dto){
+        AttendanceRecord attendanceRecord = BeanUtil.toBean(dto, AttendanceRecord.class);
+        boolean isSuccess = attendanceRecordService.save(attendanceRecord);
+        return RT.ok(isSuccess);
+    }
+
+    @PostMapping(value = "/clock-in")
+    @ApiOperation(value = "新增考勤-记录(打卡)")
+    @SaCheckPermission("attendancerecord:add")
+    public RT<Boolean> clockIn(@Valid @RequestBody ClockInDto dto){
+        AttendanceRecord AttendanceRecord = BeanUtil.toBean(dto, AttendanceRecord.class);
+        boolean isSuccess = attendanceRecordService.addAttendanceRecordOfClockIn(AttendanceRecord);
+        return  RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改考勤-记录")
+    @SaCheckPermission("attendancerecord:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateAttendanceRecordDto dto){
+
+        AttendanceRecord attendanceRecord = BeanUtil.toBean(dto, AttendanceRecord.class);
+        return RT.ok(attendanceRecordService.updateById(attendanceRecord));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除考勤-记录")
+    @SaCheckPermission("attendancerecord:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(attendanceRecordService.removeBatchByIds(ids));
+
+    }
+
+    @GetMapping("/export")
+    @ApiOperation(value = "导出")
+    public ResponseEntity<byte[]> exportData(@Valid AttendanceRecordPageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
+        List<AttendanceRecordPageVo> customerList = isTemplate != null && isTemplate ? new ArrayList<>() : ((PageOutput<AttendanceRecordPageVo>) page(dto).getData()).getList();
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, AttendanceRecordPageVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(customerList);
+
+        return RT.fileStream(bot.toByteArray(), "AttendanceRecord" + ExcelTypeEnum.XLSX.getValue());
+    }
+}

+ 63 - 0
src/main/java/com/xjrsoft/module/teacher/dto/AddAttendanceConfigDto.java

@@ -0,0 +1,63 @@
+package com.xjrsoft.module.teacher.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 考勤-配置
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+public class AddAttendanceConfigDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 考勤时间
+    */
+    @ApiModelProperty("考勤时间")
+    private LocalTime attendanceTime;
+    /**
+    * 考勤节点(xjr_dictionary_item[attendance_node])
+    */
+    @ApiModelProperty("考勤节点(xjr_dictionary_item[attendance_node])")
+    private String leaveReason;
+    /**
+    * 地点
+    */
+    @ApiModelProperty("地点")
+    private String address;
+    /**
+    * 经度
+    */
+    @ApiModelProperty("经度")
+    private Double longitude;
+    /**
+    * 纬度
+    */
+    @ApiModelProperty("纬度")
+    private Double latitude;
+    /**
+    * 范围(米)
+    */
+    @ApiModelProperty("范围(米)")
+    private Integer attendanceRange;
+
+}

+ 33 - 0
src/main/java/com/xjrsoft/module/teacher/dto/AddAttendancePersonnelDto.java

@@ -0,0 +1,33 @@
+package com.xjrsoft.module.teacher.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 考勤-人员
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+public class AddAttendancePersonnelDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 用户编号
+    */
+    @ApiModelProperty("用户编号")
+    private Long userId;
+
+}

+ 73 - 0
src/main/java/com/xjrsoft/module/teacher/dto/AddAttendanceRecordDto.java

@@ -0,0 +1,73 @@
+package com.xjrsoft.module.teacher.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 考勤-记录
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+public class AddAttendanceRecordDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 用户编号
+    */
+    @ApiModelProperty("用户编号")
+    private Long userId;
+    /**
+    * 考勤时间
+    */
+    @ApiModelProperty("考勤时间")
+    private LocalTime attendanceTime;
+    /**
+    * 打卡时间
+    */
+    @ApiModelProperty("打卡时间")
+    private Date checkTime;
+    /**
+    * 考勤节点(xjr_dictionary_item[attendance_node])
+    */
+    @ApiModelProperty("考勤节点(xjr_dictionary_item[attendance_node])")
+    private String leaveReason;
+    /**
+    * 地点
+    */
+    @ApiModelProperty("地点")
+    private String address;
+    /**
+    * 纬度
+    */
+    @ApiModelProperty("纬度")
+    private Double longitude;
+    /**
+    * 纬度
+    */
+    @ApiModelProperty("纬度")
+    private Double latitude;
+    /**
+    * 状态(1:正常 2:迟到)
+    */
+    @ApiModelProperty("状态(1:正常 2:迟到)")
+    private Integer status;
+
+}

+ 26 - 0
src/main/java/com/xjrsoft/module/teacher/dto/AttendanceConfigPageDto.java

@@ -0,0 +1,26 @@
+package com.xjrsoft.module.teacher.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: 考勤-配置分页查询入参
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class AttendanceConfigPageDto extends PageInput {
+
+
+}

+ 26 - 0
src/main/java/com/xjrsoft/module/teacher/dto/AttendancePersonnelPageDto.java

@@ -0,0 +1,26 @@
+package com.xjrsoft.module.teacher.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: 考勤-人员分页查询入参
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class AttendancePersonnelPageDto extends PageInput {
+
+
+}

+ 49 - 0
src/main/java/com/xjrsoft/module/teacher/dto/AttendanceRecordPageDto.java

@@ -0,0 +1,49 @@
+package com.xjrsoft.module.teacher.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: 考勤-记录分页查询入参
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class AttendanceRecordPageDto extends PageInput {
+
+    /**
+     * 打卡人姓名
+     */
+    @ApiModelProperty("打卡人姓名")
+    private String userName;
+
+    /**
+     * 打卡时间
+     */
+    @ApiModelProperty("打卡时间-范围开始")
+    private Date checkTimeStart;
+
+    /**
+     * 打卡时间
+     */
+    @ApiModelProperty("打卡时间-范围结束")
+    private Date checkTimeEnd;
+
+    /**
+     * 状态(1:正常 2:迟到)
+     */
+    @ApiModelProperty("状态(1:正常 2:迟到)")
+    private Integer status;
+
+}

+ 57 - 0
src/main/java/com/xjrsoft/module/teacher/dto/ClockInDto.java

@@ -0,0 +1,57 @@
+package com.xjrsoft.module.teacher.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.util.Date;
+
+
+/**
+* @title: 打卡入参
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+public class ClockInDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 用户编号
+    */
+    @ApiModelProperty("用户编号")
+    private Long userId;
+    /**
+    * 考勤时间
+    */
+    @ApiModelProperty("考勤时间")
+    private String attendanceTime;
+    /**
+    * 打卡时间
+    */
+    @ApiModelProperty("打卡时间")
+    private Date checkTime;
+    /**
+    * 考勤节点(xjr_dictionary_item[attendance_node])
+    */
+    @ApiModelProperty("考勤节点(xjr_dictionary_item[attendance_node])")
+    private String leaveReason;
+    /**
+    * 地点
+    */
+    @ApiModelProperty("地点")
+    private String address;
+    /**
+    * 纬度
+    */
+    @ApiModelProperty("经度")
+    private Double longitude;
+    /**
+    * 纬度
+    */
+    @ApiModelProperty("纬度")
+    private Double latitude;
+}

+ 27 - 0
src/main/java/com/xjrsoft/module/teacher/dto/GetCheckInDayDto.java

@@ -0,0 +1,27 @@
+package com.xjrsoft.module.teacher.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+
+/**
+* @title: 考勤-记录获取该月已经打卡天入参
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class GetCheckInDayDto {
+
+    /**
+     * 时间戳
+     */
+    @ApiModelProperty("时间戳")
+    private Long timestamp;
+
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/teacher/dto/UpdateAttendanceConfigDto.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.teacher.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 考勤-配置
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+public class UpdateAttendanceConfigDto extends AddAttendanceConfigDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/teacher/dto/UpdateAttendancePersonnelDto.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.teacher.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 考勤-人员
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+public class UpdateAttendancePersonnelDto extends AddAttendancePersonnelDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/teacher/dto/UpdateAttendanceRecordDto.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.teacher.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 考勤-记录
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+public class UpdateAttendanceRecordDto extends AddAttendanceRecordDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+}

+ 113 - 0
src/main/java/com/xjrsoft/module/teacher/entity/AttendanceConfig.java

@@ -0,0 +1,113 @@
+package com.xjrsoft.module.teacher.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 考勤-配置
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+@TableName("attendance_config")
+@ApiModel(value = "attendance_config", description = "考勤-配置")
+public class AttendanceConfig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 考勤时间
+    */
+    @ApiModelProperty("考勤时间")
+    private LocalTime attendanceTime;
+    /**
+    * 考勤节点(xjr_dictionary_item[attendance_node])
+    */
+    @ApiModelProperty("考勤节点(xjr_dictionary_item[attendance_node])")
+    private String leaveReason;
+    /**
+    * 地点
+    */
+    @ApiModelProperty("地点")
+    private String address;
+    /**
+    * 经度
+    */
+    @ApiModelProperty("经度")
+    private Double longitude;
+    /**
+    * 纬度
+    */
+    @ApiModelProperty("纬度")
+    private Double latitude;
+    /**
+    * 范围(米)
+    */
+    @ApiModelProperty("范围(米)")
+    private Integer attendanceRange;
+
+
+}

+ 46 - 0
src/main/java/com/xjrsoft/module/teacher/entity/AttendancePersonnel.java

@@ -0,0 +1,46 @@
+package com.xjrsoft.module.teacher.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 考勤-人员
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+@TableName("attendance_personnel")
+@ApiModel(value = "attendance_personnel", description = "考勤-人员")
+public class AttendancePersonnel implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 用户编号
+    */
+    @ApiModelProperty("用户编号")
+    private Long userId;
+
+
+}

+ 123 - 0
src/main/java/com/xjrsoft/module/teacher/entity/AttendanceRecord.java

@@ -0,0 +1,123 @@
+package com.xjrsoft.module.teacher.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 考勤-记录
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+@TableName("attendance_record")
+@ApiModel(value = "attendance_record", description = "考勤-记录")
+public class AttendanceRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 用户编号
+    */
+    @ApiModelProperty("用户编号")
+    private Long userId;
+    /**
+    * 考勤时间
+    */
+    @ApiModelProperty("考勤时间")
+    private LocalTime attendanceTime;
+    /**
+    * 打卡时间
+    */
+    @ApiModelProperty("打卡时间")
+    private Date checkTime;
+    /**
+    * 考勤节点(xjr_dictionary_item[attendance_node])
+    */
+    @ApiModelProperty("考勤节点(xjr_dictionary_item[attendance_node])")
+    private String leaveReason;
+    /**
+    * 地点
+    */
+    @ApiModelProperty("地点")
+    private String address;
+    /**
+    * 纬度
+    */
+    @ApiModelProperty("纬度")
+    private Double longitude;
+    /**
+    * 纬度
+    */
+    @ApiModelProperty("纬度")
+    private Double latitude;
+    /**
+    * 状态(1:正常 2:迟到)
+    */
+    @ApiModelProperty("状态(1:正常 2:迟到)")
+    private Integer status;
+
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/AttendanceConfigMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.AttendanceConfig;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 考勤-配置
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Mapper
+public interface AttendanceConfigMapper extends MPJBaseMapper<AttendanceConfig> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/AttendancePersonnelMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.AttendancePersonnel;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 考勤-人员
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Mapper
+public interface AttendancePersonnelMapper extends MPJBaseMapper<AttendancePersonnel> {
+
+}

+ 22 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/AttendanceRecordMapper.java

@@ -0,0 +1,22 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.dto.GetCheckInDayDto;
+import com.xjrsoft.module.teacher.entity.AttendanceRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+* @title: 考勤-记录
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Mapper
+public interface AttendanceRecordMapper extends MPJBaseMapper<AttendanceRecord> {
+    List<String> getCheckInDay(Date beginOfMonth, Date endOfMonth);
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/service/IAttendanceConfigService.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.teacher.entity.AttendanceConfig;
+import lombok.Data;
+import java.util.List;
+
+/**
+* @title: 考勤-配置
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+
+public interface IAttendanceConfigService extends MPJBaseService<AttendanceConfig> {
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/service/IAttendancePersonnelService.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.teacher.entity.AttendancePersonnel;
+import lombok.Data;
+import java.util.List;
+
+/**
+* @title: 考勤-人员
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+
+public interface IAttendancePersonnelService extends MPJBaseService<AttendancePersonnel> {
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/teacher/service/IAttendanceRecordService.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.teacher.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.teacher.dto.AddAttendanceRecordDto;
+import com.xjrsoft.module.teacher.dto.ClockInDto;
+import com.xjrsoft.module.teacher.dto.GetCheckInDayDto;
+import com.xjrsoft.module.teacher.entity.AttendanceRecord;
+import lombok.Data;
+import java.util.List;
+
+/**
+* @title: 考勤-记录
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+
+public interface IAttendanceRecordService extends MPJBaseService<AttendanceRecord> {
+
+    /**
+     * 新增考勤-记录(打卡)
+     * @param attendanceRecord
+     */
+    Boolean addAttendanceRecordOfClockIn(AttendanceRecord attendanceRecord);
+
+    /**
+     * 获取当月打卡的天
+     * @param dto
+     */
+    List<String> getCheckInDay(GetCheckInDayDto dto);
+}

+ 25 - 0
src/main/java/com/xjrsoft/module/teacher/service/impl/AttendanceConfigServiceImpl.java

@@ -0,0 +1,25 @@
+package com.xjrsoft.module.teacher.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.teacher.entity.AttendanceConfig;
+import com.xjrsoft.module.teacher.mapper.AttendanceConfigMapper;
+import com.xjrsoft.module.teacher.service.IAttendanceConfigService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+/**
+* @title: 考勤-配置
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class AttendanceConfigServiceImpl extends MPJBaseServiceImpl<AttendanceConfigMapper, AttendanceConfig> implements IAttendanceConfigService {
+}

+ 25 - 0
src/main/java/com/xjrsoft/module/teacher/service/impl/AttendancePersonnelServiceImpl.java

@@ -0,0 +1,25 @@
+package com.xjrsoft.module.teacher.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.teacher.entity.AttendancePersonnel;
+import com.xjrsoft.module.teacher.mapper.AttendancePersonnelMapper;
+import com.xjrsoft.module.teacher.service.IAttendancePersonnelService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+/**
+* @title: 考勤-人员
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class AttendancePersonnelServiceImpl extends MPJBaseServiceImpl<AttendancePersonnelMapper, AttendancePersonnel> implements IAttendancePersonnelService {
+}

+ 146 - 0
src/main/java/com/xjrsoft/module/teacher/service/impl/AttendanceRecordServiceImpl.java

@@ -0,0 +1,146 @@
+package com.xjrsoft.module.teacher.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.mysql.cj.jdbc.exceptions.MySQLQueryInterruptedException;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.teacher.dto.ClockInDto;
+import com.xjrsoft.module.teacher.dto.GetCheckInDayDto;
+import com.xjrsoft.module.teacher.entity.AttendanceConfig;
+import com.xjrsoft.module.teacher.entity.AttendanceRecord;
+import com.xjrsoft.module.teacher.mapper.AttendanceRecordMapper;
+import com.xjrsoft.module.teacher.service.IAttendanceConfigService;
+import com.xjrsoft.module.teacher.service.IAttendanceRecordService;
+import com.xjrsoft.module.teacher.vo.AttendanceConfigPageVo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+/**
+* @title: 考勤-记录
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class AttendanceRecordServiceImpl extends MPJBaseServiceImpl<AttendanceRecordMapper, AttendanceRecord> implements IAttendanceRecordService {
+
+    private final double EARTH_RADIUS = 6371; // 地球半径,单位为千米
+    private final IAttendanceConfigService attendanceConfigService;
+
+    private final AttendanceRecordMapper attendanceRecordMapper;
+    @Override
+    public Boolean addAttendanceRecordOfClockIn(AttendanceRecord attendanceRecord) {
+        if(ObjectUtil.isNotNull(attendanceRecord.getLeaveReason())
+                && ObjectUtil.isNotNull(attendanceRecord.getLongitude())
+                && ObjectUtil.isNotNull(attendanceRecord.getLatitude())
+                && ObjectUtil.isNotNull(attendanceRecord.getAddress())
+                && ObjectUtil.isNotNull(attendanceRecord.getCheckTime())
+                &&attendanceRecord.getLeaveReason().equals("start_work")){//上班打卡
+
+            //判断是否已经打卡,一天只能打卡一次
+            Date date = DateUtil.parse(attendanceRecord.getCheckTime().toString());
+
+            //一天的开始,结果:2017-03-01 00:00:00
+            Date beginOfDay = DateUtil.beginOfDay(date);
+
+            //一天的结束,结果:2017-03-01 23:59:59
+            Date endOfDay = DateUtil.endOfDay(date);
+            LambdaQueryWrapper<AttendanceRecord> queryWrapper01 = new LambdaQueryWrapper<>();
+            queryWrapper01
+                    .eq(AttendanceRecord::getUserId,attendanceRecord.getUserId())
+                    .between(AttendanceRecord::getCheckTime,beginOfDay,endOfDay);
+            List<AttendanceRecord> attendanceRecordList = this.list(queryWrapper01);
+            if(ObjectUtil.isNotNull(attendanceRecordList) && attendanceRecordList.size() > 0){
+                throw new MyException("今日已经上班打卡,请勿重复打卡");
+            }
+
+            //判断打卡距离范围
+            LambdaQueryWrapper<AttendanceConfig> queryWrapper02 = new LambdaQueryWrapper<>();
+            queryWrapper02
+                    .orderByDesc(AttendanceConfig::getId)
+                    .select(AttendanceConfig.class,x -> VoToColumnUtil.fieldsToColumns(AttendanceConfigPageVo.class).contains(x.getProperty()))
+                    .eq(AttendanceConfig::getDeleteMark,0)
+                    .eq(AttendanceConfig::getEnabledMark,1);
+            List<AttendanceConfig> attendanceConfigList = attendanceConfigService.list(queryWrapper02);
+
+            if (attendanceConfigList == null || !(attendanceConfigList.size() > 0)) {
+                throw new MyException("打卡配置出现未知错误,请联系管理员!");
+            }
+            AttendanceConfig attendanceConfigCurrent = attendanceConfigList.get(0);
+
+            Double latitude = attendanceConfigCurrent.getLatitude();
+            Double longitude = attendanceConfigCurrent.getLongitude();
+            double distance = calculateDistance(latitude,longitude,attendanceRecord.getLatitude(), attendanceRecord.getLongitude());
+
+            if(distance < attendanceConfigCurrent.getAttendanceRange()){//距离小于配置的打卡范围
+                //更改打卡状态
+                //配置的打卡时间解析
+                LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(),attendanceConfigCurrent.getAttendanceTime());
+                Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
+                Date attendanceConfigTinme = Date.from(instant);
+
+                if(attendanceConfigTinme.compareTo(attendanceRecord.getCheckTime()) == 1){//当为1表示正常
+                    attendanceRecord.setStatus(1);
+                }else {
+                    attendanceRecord.setStatus(2);
+                }
+
+                this.save(attendanceRecord);
+            }else{
+                throw new MyException("未在打卡范围内,进入打卡范围!");
+            }
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public List<String> getCheckInDay(GetCheckInDayDto dto) {
+        if(ObjectUtil.isNotNull(dto.getTimestamp()) && dto.getTimestamp()>0){
+            Date date = DateUtil.date(dto.getTimestamp());
+            //一个月的开始,结果:2017-03-01 00:00:00
+            Date beginOfMonth = DateUtil.beginOfMonth(date);
+            //一个月的结束,结果:2017-03-31 23:59:59
+            Date endOfMonth = DateUtil.endOfMonth(date);
+            List<String> result = attendanceRecordMapper.getCheckInDay(beginOfMonth,endOfMonth);
+            return result;
+        }
+        return new ArrayList<String>();
+    }
+
+    //通过经纬度计算距离
+    private double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
+        double dLat = Math.toRadians(lat2 - lat1);
+        double dLon = Math.toRadians(lon2 - lon1);
+
+        double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
+                + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
+                * Math.sin(dLon / 2) * Math.sin(dLon / 2);
+
+        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+
+        double distance = EARTH_RADIUS * c;
+        return distance*1000;
+    }
+}

+ 94 - 0
src/main/java/com/xjrsoft/module/teacher/vo/AttendanceConfigPageVo.java

@@ -0,0 +1,94 @@
+package com.xjrsoft.module.teacher.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import com.xjrsoft.common.annotation.Trans;
+import com.xjrsoft.common.enums.TransType;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 考勤-配置分页列表出参
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+public class AttendanceConfigPageVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private String id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    private Integer enabledMark;
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 考勤时间
+    */
+    @ApiModelProperty("考勤时间")
+    private LocalTime attendanceTime;
+    /**
+    * 考勤节点(xjr_dictionary_item[attendance_node])
+    */
+    @ApiModelProperty("考勤节点(xjr_dictionary_item[attendance_node])")
+    private String leaveReason;
+    /**
+    * 地点
+    */
+    @ApiModelProperty("地点")
+    private String address;
+    /**
+    * 经度
+    */
+    @ApiModelProperty("经度")
+    private Double longitude;
+    /**
+    * 纬度
+    */
+    @ApiModelProperty("纬度")
+    private Double latitude;
+    /**
+    * 范围(米)
+    */
+    @ApiModelProperty("范围(米)")
+    private Integer attendanceRange;
+
+}

+ 64 - 0
src/main/java/com/xjrsoft/module/teacher/vo/AttendanceConfigVo.java

@@ -0,0 +1,64 @@
+package com.xjrsoft.module.teacher.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+/**
+* @title: 考勤-配置表单出参
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+public class AttendanceConfigVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 考勤时间
+    */
+    @ApiModelProperty("考勤时间")
+    private LocalTime attendanceTime;
+    /**
+    * 考勤节点(xjr_dictionary_item[attendance_node])
+    */
+    @ApiModelProperty("考勤节点(xjr_dictionary_item[attendance_node])")
+    private String leaveReason;
+    /**
+    * 地点
+    */
+    @ApiModelProperty("地点")
+    private String address;
+    /**
+    * 经度
+    */
+    @ApiModelProperty("经度")
+    private Double longitude;
+    /**
+    * 纬度
+    */
+    @ApiModelProperty("纬度")
+    private Double latitude;
+    /**
+    * 范围(米)
+    */
+    @ApiModelProperty("范围(米)")
+    private Integer attendanceRange;
+
+
+
+}

+ 49 - 0
src/main/java/com/xjrsoft/module/teacher/vo/AttendancePersonnelPageVo.java

@@ -0,0 +1,49 @@
+package com.xjrsoft.module.teacher.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import com.xjrsoft.common.annotation.Trans;
+import com.xjrsoft.common.enums.TransType;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 考勤-人员分页列表出参
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+public class AttendancePersonnelPageVo {
+
+    /**
+    * 主键编号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主键编号")
+    @ApiModelProperty("主键编号")
+    private String id;
+    /**
+    * 用户编号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("用户编号")
+    @ApiModelProperty("用户编号")
+    private Long userId;
+    /**
+     * 用户编号
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("用户姓名")
+    @ApiModelProperty("用户姓名")
+    private String userName;
+
+
+}

+ 34 - 0
src/main/java/com/xjrsoft/module/teacher/vo/AttendancePersonnelVo.java

@@ -0,0 +1,34 @@
+package com.xjrsoft.module.teacher.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+/**
+* @title: 考勤-人员表单出参
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+public class AttendancePersonnelVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+    /**
+    * 用户编号
+    */
+    @ApiModelProperty("用户编号")
+    private Long userId;
+
+
+
+}

+ 70 - 0
src/main/java/com/xjrsoft/module/teacher/vo/AttendanceRecordPageVo.java

@@ -0,0 +1,70 @@
+package com.xjrsoft.module.teacher.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import com.xjrsoft.common.annotation.Trans;
+import com.xjrsoft.common.enums.TransType;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 考勤-记录分页列表出参
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+public class AttendanceRecordPageVo {
+
+    /**
+    * 主键编号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主键编号")
+    @ApiModelProperty("主键编号")
+    private String id;
+    /**
+    * 用户编号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("用户编号")
+    @ApiModelProperty("用户编号")
+    private Long userId;
+    /**
+     * 用户名
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("用户名")
+    @ApiModelProperty("用户名")
+    private String userName;
+    /**
+    * 打卡时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("打卡时间")
+    @ApiModelProperty("打卡时间")
+    private Date checkTime;
+    /**
+    * 地点
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("地点")
+    @ApiModelProperty("地点")
+    private String address;
+
+    /**
+    * 状态(1:正常 2:迟到)
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("状态(1:正常 2:迟到)")
+    @ApiModelProperty("状态(1:正常 2:迟到)")
+    private Integer status;
+
+}

+ 74 - 0
src/main/java/com/xjrsoft/module/teacher/vo/AttendanceRecordVo.java

@@ -0,0 +1,74 @@
+package com.xjrsoft.module.teacher.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+/**
+* @title: 考勤-记录表单出参
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+public class AttendanceRecordVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 用户编号
+    */
+    @ApiModelProperty("用户编号")
+    private Long userId;
+    /**
+    * 考勤时间
+    */
+    @ApiModelProperty("考勤时间")
+    private LocalTime attendanceTime;
+    /**
+    * 打卡时间
+    */
+    @ApiModelProperty("打卡时间")
+    private Date checkTime;
+    /**
+    * 考勤节点(xjr_dictionary_item[attendance_node])
+    */
+    @ApiModelProperty("考勤节点(xjr_dictionary_item[attendance_node])")
+    private String leaveReason;
+    /**
+    * 地点
+    */
+    @ApiModelProperty("地点")
+    private String address;
+    /**
+    * 纬度
+    */
+    @ApiModelProperty("纬度")
+    private Double longitude;
+    /**
+    * 纬度
+    */
+    @ApiModelProperty("纬度")
+    private Double latitude;
+    /**
+    * 状态(1:正常 2:迟到)
+    */
+    @ApiModelProperty("状态(1:正常 2:迟到)")
+    private Integer status;
+
+
+
+}

+ 14 - 0
src/main/resources/mapper/teacher/AttendanceRecordMapper.xml

@@ -0,0 +1,14 @@
+<?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.xjrsoft.module.teacher.mapper.AttendanceRecordMapper">
+    <select id="getCheckInDay" resultType="java.lang.String">
+        select
+            date_format(t.check_time,'%d') evertday
+        FROM attendance_record t
+        WHERE t.check_time BETWEEN #{beginOfMonth} AND #{endOfMonth}
+        GROUP BY evertday
+        ORDER BY evertday DESC
+    </select>
+</mapper>

+ 91 - 0
src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

@@ -951,4 +951,95 @@ public class FreeMarkerGeneratorTest {
 
         apiGeneratorService.generateCodes(params);
     }
+
+    /**
+     * 考勤配置
+     *
+     */
+    @Test
+    public void gcAttendanceConfig() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("attendance_config");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("szs");//作者名称
+        params.setPackageName("teacher");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(false);//是否生成导入接口
+        params.setExport(false);//是否生成导出接口
+        params.setOutMainDir(true);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
+    /**
+     * 考勤记录
+     *
+     */
+    @Test
+    public void gcAttendanceRecord() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("attendance_record");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("szs");//作者名称
+        params.setPackageName("teacher");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(false);//是否生成导入接口
+        params.setExport(true);//是否生成导出接口
+        params.setOutMainDir(true);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
+    /**
+     * 需要考勤的人员管理
+     *
+     */
+    @Test
+    public void gcAttendancePersonneld() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("attendance_personnel");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("szs");//作者名称
+        params.setPackageName("teacher");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(false);//是否生成导入接口
+        params.setExport(true);//是否生成导出接口
+        params.setOutMainDir(true);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
 }