Ver código fonte

考勤统计模块初始化

dzx 4 meses atrás
pai
commit
c00ae6122b
18 arquivos alterados com 1137 adições e 0 exclusões
  1. 168 0
      src/main/java/com/xjrsoft/module/attendance/controller/AttendanceStatisticsController.java
  2. 84 0
      src/main/java/com/xjrsoft/module/attendance/dto/AddAttendanceStatisticsDto.java
  3. 57 0
      src/main/java/com/xjrsoft/module/attendance/dto/AddAttendanceStatisticsRecordDto.java
  4. 21 0
      src/main/java/com/xjrsoft/module/attendance/dto/AttendanceRuleCategoryListDto.java
  5. 30 0
      src/main/java/com/xjrsoft/module/attendance/dto/AttendanceStatisticsPageDto.java
  6. 24 0
      src/main/java/com/xjrsoft/module/attendance/dto/UpdateAttendanceStatisticsDto.java
  7. 138 0
      src/main/java/com/xjrsoft/module/attendance/entity/AttendanceStatistics.java
  8. 109 0
      src/main/java/com/xjrsoft/module/attendance/entity/AttendanceStatisticsRecord.java
  9. 20 0
      src/main/java/com/xjrsoft/module/attendance/mapper/AttendanceStatisticsMapper.java
  10. 16 0
      src/main/java/com/xjrsoft/module/attendance/mapper/AttendanceStatisticsRecordMapper.java
  11. 52 0
      src/main/java/com/xjrsoft/module/attendance/service/IAttendanceStatisticsService.java
  12. 114 0
      src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceStatisticsServiceImpl.java
  13. 23 0
      src/main/java/com/xjrsoft/module/attendance/vo/AttendanceRuleCategoryListVo.java
  14. 79 0
      src/main/java/com/xjrsoft/module/attendance/vo/AttendanceStatisticsPageVo.java
  15. 64 0
      src/main/java/com/xjrsoft/module/attendance/vo/AttendanceStatisticsRecordVo.java
  16. 79 0
      src/main/java/com/xjrsoft/module/attendance/vo/AttendanceStatisticsVo.java
  17. 25 0
      src/main/resources/mapper/attendance/AttendanceStatisticsMapper.xml
  18. 34 0
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

+ 168 - 0
src/main/java/com/xjrsoft/module/attendance/controller/AttendanceStatisticsController.java

@@ -0,0 +1,168 @@
+package com.xjrsoft.module.attendance.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.excel.support.ExcelTypeEnum;
+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.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.module.activity.dto.ChangeStatusDto;
+import com.xjrsoft.module.attendance.dto.AddAttendanceStatisticsDto;
+import com.xjrsoft.module.attendance.dto.AttendanceRuleCategoryListDto;
+import com.xjrsoft.module.attendance.dto.AttendanceStatisticsPageDto;
+import com.xjrsoft.module.attendance.dto.UpdateAttendanceStatisticsDto;
+import com.xjrsoft.module.attendance.entity.AttendanceRuleCategory;
+import com.xjrsoft.module.attendance.entity.AttendanceStatistics;
+import com.xjrsoft.module.attendance.service.IAttendanceRuleCategoryService;
+import com.xjrsoft.module.attendance.service.IAttendanceStatisticsService;
+import com.xjrsoft.module.attendance.vo.AttendanceRuleCategoryListVo;
+import com.xjrsoft.module.attendance.vo.AttendanceStatisticsPageVo;
+import com.xjrsoft.module.attendance.vo.AttendanceStatisticsRecordVo;
+import com.xjrsoft.module.attendance.vo.AttendanceStatisticsVo;
+import com.xjrsoft.module.classtime.dto.RefreshStatisticsDto;
+import com.xjrsoft.module.classtime.entity.ClassTimeStatistics;
+import com.xjrsoft.module.classtime.entity.ClassTimeStatisticsSet;
+import com.xjrsoft.module.classtime.vo.ClassTimeStatisticsRecordVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.Date;
+import java.util.List;
+
+/**
+* @title: 考勤统计
+* @Author dzx
+* @Date: 2024-10-19
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/attendance" + "/statistics")
+@Api(value = "/attendance"  + "/statistics",tags = "考勤统计代码")
+@AllArgsConstructor
+public class AttendanceStatisticsController {
+
+    private final IAttendanceRuleCategoryService ruleCategoryService;
+    private final IAttendanceStatisticsService attendanceStatisticsService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="考勤统计列表(分页)")
+    @SaCheckPermission("attendancestatistics:detail")
+    public RT<PageOutput<AttendanceStatisticsPageVo>> page(@Valid AttendanceStatisticsPageDto dto){
+        IPage<AttendanceStatisticsPageVo> page = attendanceStatisticsService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        PageOutput<AttendanceStatisticsPageVo> pageOutput = ConventPage.getPageOutput(page, AttendanceStatisticsPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/rule-list")
+    @ApiOperation(value="考勤规则列表")
+    @SaCheckPermission("attendancestatistics:detail")
+    public RT<List<AttendanceRuleCategoryListVo>> list(@Valid AttendanceRuleCategoryListDto dto){
+        List<AttendanceRuleCategory> list = ruleCategoryService.list(
+                new QueryWrapper<AttendanceRuleCategory>().lambda()
+                        .eq(dto.getRoleId() != null, AttendanceRuleCategory::getRoleId, dto.getRoleId())
+        );
+        return RT.ok(BeanUtil.copyToList(list, AttendanceRuleCategoryListVo.class));
+    }
+
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询考勤统计信息")
+    @SaCheckPermission("attendancestatistics:detail")
+    public RT<AttendanceStatisticsVo> info(@RequestParam Long id){
+        AttendanceStatistics attendanceStatistics = attendanceStatisticsService.getById(id);
+        if (attendanceStatistics == null) {
+           return RT.error("找不到此数据!");
+        }
+        AttendanceRuleCategory ruleCategory = ruleCategoryService.getById(attendanceStatistics.getAttendanceRuleCategoryId());
+        AttendanceStatisticsVo statisticsVo = BeanUtil.toBean(attendanceStatistics, AttendanceStatisticsVo.class);
+        if (ruleCategory != null) {
+            statisticsVo.setRuleName(ruleCategory.getName());
+        }
+        return RT.ok(statisticsVo);
+    }
+
+    @PostMapping(value = "/change-status")
+    @ApiOperation(value="修改状态")
+    @SaCheckPermission("attendancestatistics:detail")
+    public RT<Boolean> changeStatus(@Valid @RequestBody ChangeStatusDto dto) throws Exception {
+        AttendanceStatistics statistics = attendanceStatisticsService.getById(dto.getId());
+        if(statistics == null){
+            throw new MyException("未能查到数据");
+        }
+        statistics.setStatus(dto.getStatus());
+        attendanceStatisticsService.updateById(statistics);
+        return RT.ok(true);
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增考勤统计")
+    @SaCheckPermission("attendancestatistics:add")
+    public RT<Boolean> add(@Valid @RequestBody AddAttendanceStatisticsDto dto){
+        boolean isSuccess = attendanceStatisticsService.add(dto);
+        return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改考勤统计")
+    @SaCheckPermission("attendancestatistics:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateAttendanceStatisticsDto dto){
+        AttendanceStatistics attendanceStatistics = BeanUtil.toBean(dto, AttendanceStatistics.class);
+        return RT.ok(attendanceStatisticsService.update(attendanceStatistics));
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除考勤统计")
+    @SaCheckPermission("attendancestatistics:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(attendanceStatisticsService.delete(ids));
+    }
+
+    @GetMapping(value = "/record-list")
+    @ApiOperation(value="考情统计详情列表")
+    @SaCheckPermission("attendancestatistics:detail")
+    public RT<List<AttendanceStatisticsRecordVo>> recordPage(@Valid RefreshStatisticsDto dto){
+        List<AttendanceStatisticsRecordVo> recordList = attendanceStatisticsService.getRecordList(dto.getId());
+        return RT.ok(recordList);
+    }
+
+    @PostMapping("/refresh-statistics")
+    @ApiOperation(value = "刷新课时统计")
+    @SaCheckPermission("attendancestatistics:detail")
+    public RT<Boolean> refreshStatistics(@Valid @RequestBody RefreshStatisticsDto dto){
+
+        AttendanceStatistics statistics = attendanceStatisticsService.getById(dto.getId());
+        statistics.setStatus(0);
+        statistics.setModifyDate(new Date());
+
+        Boolean aBoolean = attendanceStatisticsService.refreshRecord(statistics);
+
+        return RT.ok(aBoolean);
+    }
+
+    @PostMapping(value = "/record-export-query")
+    @ApiOperation(value="考勤统计详情导出")
+    @SaCheckPermission("attendancestatistics:detail")
+    public ResponseEntity<byte[]> recordExport(@Valid @RequestBody  RefreshStatisticsDto dto) throws IOException {
+        byte[] bytes = attendanceStatisticsService.recordExport(dto.getId());
+        String fileName = "recordExport" + ExcelTypeEnum.XLSX.getValue();
+        return RT.fileStream(bytes, fileName);
+    }
+
+}

+ 84 - 0
src/main/java/com/xjrsoft/module/attendance/dto/AddAttendanceStatisticsDto.java

@@ -0,0 +1,84 @@
+package com.xjrsoft.module.attendance.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+
+/**
+* @title: 考勤统计
+* @Author dzx
+* @Date: 2024-10-19
+* @Version 1.0
+*/
+@Data
+public class AddAttendanceStatisticsDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 统计年份
+    */
+    @ApiModelProperty("统计年份")
+    private Integer year;
+    /**
+    * 统计月份
+    */
+    @ApiModelProperty("统计月份")
+    private Integer month;
+    /**
+    * 统计名称
+    */
+    @ApiModelProperty("统计名称")
+    private String name;
+    /**
+    * 开始日期
+    */
+    @ApiModelProperty("开始日期")
+    private Date startDate;
+    /**
+    * 结束日期
+    */
+    @ApiModelProperty("结束日期")
+    private Date endDate;
+    /**
+    * 关联考勤规则(attendance_rule_category)
+    */
+    @ApiModelProperty("关联考勤规则(attendance_rule_category)")
+    private Long attendanceRuleCategoryId;
+    /**
+    * 统计人数
+    */
+    @ApiModelProperty("统计人数")
+    private Integer personCount;
+    /**
+    * 状态(0:数据统计中 1:统计完成 2:已解锁 3:已锁定)
+    */
+    @ApiModelProperty("状态(0:数据统计中 1:统计完成 2:已解锁 3:已锁定)")
+    private Integer status;
+    /**
+    * 是否需要刷新(0:否 1:是)
+    */
+    @ApiModelProperty("是否需要刷新(0:否 1:是)")
+    private Integer isNeedRefresh;
+    /**
+    * 时间段(1:上午 2:下午)
+    */
+    @ApiModelProperty("时间段(1:上午 2:下午)")
+    private Integer timePeriod;
+    /**
+    * 应出勤天数
+    */
+    @ApiModelProperty("应出勤天数")
+    private Integer attendanceDays;
+
+    /**
+    * attendanceStatisticsRecord
+    */
+    @ApiModelProperty("attendanceStatisticsRecord子表")
+    private List<AddAttendanceStatisticsRecordDto> attendanceStatisticsRecordList;
+}

+ 57 - 0
src/main/java/com/xjrsoft/module/attendance/dto/AddAttendanceStatisticsRecordDto.java

@@ -0,0 +1,57 @@
+package com.xjrsoft.module.attendance.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+
+/**
+* @title: 考勤统计-教师详情
+* @Author dzx
+* @Date: 2024-10-19
+* @Version 1.0
+*/
+@Data
+public class AddAttendanceStatisticsRecordDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 课时统计(attendance_statistics)
+    */
+    @ApiModelProperty("课时统计(attendance_statistics)")
+    private Long attendanceStatisticsId;
+    /**
+    * 教师id(xjr_user)
+    */
+    @ApiModelProperty("教师id(xjr_user)")
+    private Long userId;
+    /**
+    * 正常考勤次数
+    */
+    @ApiModelProperty("正常考勤次数")
+    private Integer normalCount;
+    /**
+    * 请假次数
+    */
+    @ApiModelProperty("请假次数")
+    private Integer leaveCount;
+    /**
+    * 旷工次数
+    */
+    @ApiModelProperty("旷工次数")
+    private Integer absenteeCount;
+    /**
+    * 所在部门(存在多个,用“,”隔开)
+    */
+    @ApiModelProperty("所在部门(存在多个,用“,”隔开)")
+    private String deptIds;
+    /**
+    * 每天数据
+    */
+    @ApiModelProperty("每天数据")
+    private String daysData;
+
+}

+ 21 - 0
src/main/java/com/xjrsoft/module/attendance/dto/AttendanceRuleCategoryListDto.java

@@ -0,0 +1,21 @@
+package com.xjrsoft.module.attendance.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+/**
+* @title: 考勤规则分页查询入参
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class AttendanceRuleCategoryListDto extends PageInput {
+
+    @ApiModelProperty("被考勤角色(xjr_role)")
+    private Long roleId;
+}

+ 30 - 0
src/main/java/com/xjrsoft/module/attendance/dto/AttendanceStatisticsPageDto.java

@@ -0,0 +1,30 @@
+package com.xjrsoft.module.attendance.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+/**
+* @title: 考勤统计分页查询入参
+* @Author dzx
+* @Date: 2024-10-19
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class AttendanceStatisticsPageDto extends PageInput {
+
+    @ApiModelProperty("统计名称")
+    private String name;
+
+    @ApiModelProperty("统计年份")
+    private Integer year;
+
+    @ApiModelProperty("统计月份")
+    private Integer month;
+
+    @ApiModelProperty("状态(0:数据统计中 1:统计完成 2:已解锁 3:已锁定)")
+    private Integer status;
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/attendance/dto/UpdateAttendanceStatisticsDto.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.attendance.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+
+/**
+* @title: 考勤统计
+* @Author dzx
+* @Date: 2024-10-19
+* @Version 1.0
+*/
+@Data
+public class UpdateAttendanceStatisticsDto extends AddAttendanceStatisticsDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+}

+ 138 - 0
src/main/java/com/xjrsoft/module/attendance/entity/AttendanceStatistics.java

@@ -0,0 +1,138 @@
+package com.xjrsoft.module.attendance.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+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.util.Date;
+import java.util.List;
+
+
+/**
+* @title: 考勤统计
+* @Author dzx
+* @Date: 2024-10-19
+* @Version 1.0
+*/
+@Data
+@TableName("attendance_statistics")
+@ApiModel(value = "attendance_statistics", description = "考勤统计")
+public class AttendanceStatistics 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 year;
+    /**
+    * 统计月份
+    */
+    @ApiModelProperty("统计月份")
+    private Integer month;
+    /**
+    * 统计名称
+    */
+    @ApiModelProperty("统计名称")
+    private String name;
+    /**
+    * 开始日期
+    */
+    @ApiModelProperty("开始日期")
+    private Date startDate;
+    /**
+    * 结束日期
+    */
+    @ApiModelProperty("结束日期")
+    private Date endDate;
+    /**
+    * 关联考勤规则(attendance_rule_category)
+    */
+    @ApiModelProperty("关联考勤规则(attendance_rule_category)")
+    private Long attendanceRuleCategoryId;
+    /**
+    * 统计人数
+    */
+    @ApiModelProperty("统计人数")
+    private Integer personCount;
+    /**
+    * 状态(0:数据统计中 1:统计完成 2:已解锁 3:已锁定)
+    */
+    @ApiModelProperty("状态(0:数据统计中 1:统计完成 2:已解锁 3:已锁定)")
+    private Integer status;
+    /**
+    * 是否需要刷新(0:否 1:是)
+    */
+    @ApiModelProperty("是否需要刷新(0:否 1:是)")
+    private Integer isNeedRefresh;
+    /**
+    * 时间段(1:上午 2:下午)
+    */
+    @ApiModelProperty("时间段(1:上午 2:下午)")
+    private Integer timePeriod;
+    /**
+    * 应出勤天数
+    */
+    @ApiModelProperty("应出勤天数")
+    private Integer attendanceDays;
+
+    /**
+    * attendanceStatisticsRecord
+    */
+    @ApiModelProperty("attendanceStatisticsRecord子表")
+    @TableField(exist = false)
+    @EntityMapping(thisField = "id", joinField = "attendanceStatisticsId")
+    private List<AttendanceStatisticsRecord> attendanceStatisticsRecordList;
+
+}

+ 109 - 0
src/main/java/com/xjrsoft/module/attendance/entity/AttendanceStatisticsRecord.java

@@ -0,0 +1,109 @@
+package com.xjrsoft.module.attendance.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+* @title: 考勤统计-教师详情
+* @Author dzx
+* @Date: 2024-10-19
+* @Version 1.0
+*/
+@Data
+@TableName("attendance_statistics_record")
+@ApiModel(value = "attendance_statistics_record", description = "考勤统计-教师详情")
+public class AttendanceStatisticsRecord 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;
+    /**
+    * 课时统计(attendance_statistics)
+    */
+    @ApiModelProperty("课时统计(attendance_statistics)")
+    private Long attendanceStatisticsId;
+    /**
+    * 教师id(xjr_user)
+    */
+    @ApiModelProperty("教师id(xjr_user)")
+    private Long userId;
+    /**
+    * 正常考勤次数
+    */
+    @ApiModelProperty("正常考勤次数")
+    private Integer normalCount;
+    /**
+    * 请假次数
+    */
+    @ApiModelProperty("请假次数")
+    private Integer leaveCount;
+    /**
+    * 旷工次数
+    */
+    @ApiModelProperty("旷工次数")
+    private Integer absenteeCount;
+    /**
+    * 所在部门(存在多个,用“,”隔开)
+    */
+    @ApiModelProperty("所在部门(存在多个,用“,”隔开)")
+    private String deptIds;
+    /**
+    * 每天数据
+    */
+    @ApiModelProperty("每天数据")
+    private String daysData;
+
+
+}

+ 20 - 0
src/main/java/com/xjrsoft/module/attendance/mapper/AttendanceStatisticsMapper.java

@@ -0,0 +1,20 @@
+package com.xjrsoft.module.attendance.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.attendance.dto.AttendanceStatisticsPageDto;
+import com.xjrsoft.module.attendance.entity.AttendanceStatistics;
+import com.xjrsoft.module.attendance.vo.AttendanceStatisticsPageVo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 考勤统计
+* @Author dzx
+* @Date: 2024-10-19
+* @Version 1.0
+*/
+@Mapper
+public interface AttendanceStatisticsMapper extends MPJBaseMapper<AttendanceStatistics> {
+
+    Page<AttendanceStatisticsPageVo> getPage(Page<AttendanceStatisticsPageVo> page, AttendanceStatisticsPageDto dto);
+}

+ 16 - 0
src/main/java/com/xjrsoft/module/attendance/mapper/AttendanceStatisticsRecordMapper.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.attendance.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.attendance.entity.AttendanceStatisticsRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 考勤统计-教师详情
+* @Author dzx
+* @Date: 2024-10-19
+* @Version 1.0
+*/
+@Mapper
+public interface AttendanceStatisticsRecordMapper extends MPJBaseMapper<AttendanceStatisticsRecord> {
+
+}

+ 52 - 0
src/main/java/com/xjrsoft/module/attendance/service/IAttendanceStatisticsService.java

@@ -0,0 +1,52 @@
+package com.xjrsoft.module.attendance.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.attendance.dto.AddAttendanceStatisticsDto;
+import com.xjrsoft.module.attendance.dto.AttendanceStatisticsPageDto;
+import com.xjrsoft.module.attendance.entity.AttendanceStatistics;
+import com.xjrsoft.module.attendance.vo.AttendanceStatisticsPageVo;
+import com.xjrsoft.module.attendance.vo.AttendanceStatisticsRecordVo;
+import com.xjrsoft.module.classtime.entity.ClassTimeStatistics;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+* @title: 考勤统计
+* @Author dzx
+* @Date: 2024-10-19
+* @Version 1.0
+*/
+
+public interface IAttendanceStatisticsService extends MPJBaseService<AttendanceStatistics> {
+    /**
+    * 新增
+    *
+    */
+    Boolean add(AddAttendanceStatisticsDto dto);
+
+    /**
+    * 更新
+    *
+    * @param attendanceStatistics
+    * @return
+    */
+    Boolean update(AttendanceStatistics attendanceStatistics);
+
+    /**
+    * 删除
+    *
+    * @param ids
+    * @return
+    */
+    Boolean delete(List<Long> ids);
+
+    Page<AttendanceStatisticsPageVo> getPage(Page<AttendanceStatisticsPageVo> page, AttendanceStatisticsPageDto dto);
+
+    List<AttendanceStatisticsRecordVo> getRecordList(Long id);
+
+    Boolean refreshRecord(AttendanceStatistics statistics);
+
+    byte[] recordExport(Long id) throws IOException;
+}

+ 114 - 0
src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceStatisticsServiceImpl.java

@@ -0,0 +1,114 @@
+package com.xjrsoft.module.attendance.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.attendance.dto.AddAttendanceStatisticsDto;
+import com.xjrsoft.module.attendance.dto.AttendanceStatisticsPageDto;
+import com.xjrsoft.module.attendance.entity.AttendanceStatistics;
+import com.xjrsoft.module.attendance.entity.AttendanceStatisticsRecord;
+import com.xjrsoft.module.attendance.mapper.AttendanceStatisticsMapper;
+import com.xjrsoft.module.attendance.mapper.AttendanceStatisticsRecordMapper;
+import com.xjrsoft.module.attendance.service.IAttendanceStatisticsService;
+import com.xjrsoft.module.attendance.vo.AttendanceStatisticsPageVo;
+import com.xjrsoft.module.attendance.vo.AttendanceStatisticsRecordVo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.IOException;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+* @title: 考勤统计
+* @Author dzx
+* @Date: 2024-10-19
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<AttendanceStatisticsMapper, AttendanceStatistics> implements IAttendanceStatisticsService {
+    private final AttendanceStatisticsMapper statisticsMapper;
+
+    private final AttendanceStatisticsRecordMapper recordMapper;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean add(AddAttendanceStatisticsDto dto) {
+        AttendanceStatistics attendanceStatistics = BeanUtil.toBean(dto, AttendanceStatistics.class);
+        attendanceStatistics.setCreateDate(new Date());
+        statisticsMapper.insert(attendanceStatistics);
+
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean update(AttendanceStatistics attendanceStatistics) {
+        statisticsMapper.updateById(attendanceStatistics);
+        //********************************* AttendanceStatisticsRecord  增删改  开始 *******************************************/
+        {
+            // 查出所有子级的id
+            List<AttendanceStatisticsRecord> attendanceStatisticsRecordList = recordMapper.selectList(Wrappers.lambdaQuery(AttendanceStatisticsRecord.class).eq(AttendanceStatisticsRecord::getAttendanceStatisticsId, attendanceStatistics.getId()).select(AttendanceStatisticsRecord::getId));
+            List<Long> attendanceStatisticsRecordIds = attendanceStatisticsRecordList.stream().map(AttendanceStatisticsRecord::getId).collect(Collectors.toList());
+            //原有子表单 没有被删除的主键
+            List<Long> attendanceStatisticsRecordOldIds = attendanceStatistics.getAttendanceStatisticsRecordList().stream().map(AttendanceStatisticsRecord::getId).filter(Objects::nonNull).collect(Collectors.toList());
+            //找到需要删除的id
+            List<Long> attendanceStatisticsRecordRemoveIds = attendanceStatisticsRecordIds.stream().filter(item -> !attendanceStatisticsRecordOldIds.contains(item)).collect(Collectors.toList());
+
+            for (AttendanceStatisticsRecord attendanceStatisticsRecord : attendanceStatistics.getAttendanceStatisticsRecordList()) {
+                //如果不等于空则修改
+                if (attendanceStatisticsRecord.getId() != null) {
+                    recordMapper.updateById(attendanceStatisticsRecord);
+                }
+                //如果等于空 则新增
+                else {
+                    //已经不存在的id 删除
+                    attendanceStatisticsRecord.setAttendanceStatisticsId(attendanceStatistics.getId());
+                    recordMapper.insert(attendanceStatisticsRecord);
+                }
+            }
+            //已经不存在的id 删除
+            if(attendanceStatisticsRecordRemoveIds.size() > 0){
+                recordMapper.deleteBatchIds(attendanceStatisticsRecordRemoveIds);
+            }
+        }
+        //********************************* AttendanceStatisticsRecord  增删改  结束 *******************************************/
+
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean delete(List<Long> ids) {
+        statisticsMapper.deleteBatchIds(ids);
+        recordMapper.delete(Wrappers.lambdaQuery(AttendanceStatisticsRecord.class).in(AttendanceStatisticsRecord::getAttendanceStatisticsId, ids));
+
+        return true;
+    }
+
+    @Override
+    public Page<AttendanceStatisticsPageVo> getPage(Page<AttendanceStatisticsPageVo> page, AttendanceStatisticsPageDto dto) {
+        return this.baseMapper.getPage(page, dto);
+    }
+
+    @Override
+    public List<AttendanceStatisticsRecordVo> getRecordList(Long id) {
+        return null;
+    }
+
+    @Override
+    public Boolean refreshRecord(AttendanceStatistics statistics) {
+        return null;
+    }
+
+    @Override
+    public byte[] recordExport(Long id) throws IOException {
+        return new byte[0];
+    }
+}

+ 23 - 0
src/main/java/com/xjrsoft/module/attendance/vo/AttendanceRuleCategoryListVo.java

@@ -0,0 +1,23 @@
+package com.xjrsoft.module.attendance.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+* @title: 考勤规则list列表出参
+* @Author dzx
+* @Date: 2024年10月19日
+* @Version 1.0
+*/
+@Data
+public class AttendanceRuleCategoryListVo {
+
+    @ApiModelProperty("主键编号")
+    private String id;
+
+    @ApiModelProperty("考勤规则名称")
+    private String name;
+
+}

+ 79 - 0
src/main/java/com/xjrsoft/module/attendance/vo/AttendanceStatisticsPageVo.java

@@ -0,0 +1,79 @@
+package com.xjrsoft.module.attendance.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+* @title: 考勤统计分页列表出参
+* @Author dzx
+* @Date: 2024-10-19
+* @Version 1.0
+*/
+@Data
+public class AttendanceStatisticsPageVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private String id;
+    /**
+    /**
+    * 统计年份
+    */
+    @ApiModelProperty("统计年份")
+    private Integer year;
+    /**
+    * 统计月份
+    */
+    @ApiModelProperty("统计月份")
+    private Integer month;
+    /**
+    * 统计名称
+    */
+    @ApiModelProperty("统计名称")
+    private String name;
+    /**
+    * 开始日期
+    */
+    @ApiModelProperty("开始日期")
+    private Date startDate;
+    /**
+    * 结束日期
+    */
+    @ApiModelProperty("结束日期")
+    private Date endDate;
+    /**
+    * 关联考勤规则(attendance_rule_category)
+    */
+    @ApiModelProperty("关联考勤规则")
+    private String ruleName;
+    /**
+    * 统计人数
+    */
+    @ApiModelProperty("统计人数")
+    private Integer personCount;
+    /**
+    * 状态(0:数据统计中 1:统计完成 2:已解锁 3:已锁定)
+    */
+    @ApiModelProperty("状态(0:数据统计中 1:统计完成 2:已解锁 3:已锁定)")
+    private Integer status;
+    /**
+    * 是否需要刷新(0:否 1:是)
+    */
+    @ApiModelProperty("是否需要刷新(0:否 1:是)")
+    private Integer isNeedRefresh;
+    /**
+    * 时间段(1:上午 2:下午)
+    */
+    @ApiModelProperty("时间段(1:上午 2:下午)")
+    private Integer timePeriod;
+    /**
+    * 应出勤天数
+    */
+    @ApiModelProperty("应出勤天数")
+    private Integer attendanceDays;
+
+}

+ 64 - 0
src/main/java/com/xjrsoft/module/attendance/vo/AttendanceStatisticsRecordVo.java

@@ -0,0 +1,64 @@
+package com.xjrsoft.module.attendance.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+* @title: 考勤统计-教师详情表单出参
+* @Author dzx
+* @Date: 2024-10-19
+* @Version 1.0
+*/
+@Data
+public class AttendanceStatisticsRecordVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+    /**
+    * 课时统计(attendance_statistics)
+    */
+    @ApiModelProperty("课时统计(attendance_statistics)")
+    private Long attendanceStatisticsId;
+    /**
+    * 教师id(xjr_user)
+    */
+    @ApiModelProperty("教师id(xjr_user)")
+    private Long userId;
+    /**
+    * 正常考勤次数
+    */
+    @ApiModelProperty("正常考勤次数")
+    private Integer normalCount;
+    /**
+    * 请假次数
+    */
+    @ApiModelProperty("请假次数")
+    private Integer leaveCount;
+    /**
+    * 旷工次数
+    */
+    @ApiModelProperty("旷工次数")
+    private Integer absenteeCount;
+    /**
+    * 所在部门(存在多个,用“,”隔开)
+    */
+    @ApiModelProperty("所在部门(存在多个,用“,”隔开)")
+    private String deptIds;
+    /**
+    * 每天数据
+    */
+    @ApiModelProperty("每天数据")
+    private String daysData;
+
+    @ApiModelProperty("工号")
+    private String userName;
+
+    @ApiModelProperty("部门成")
+    private String deptName;
+
+
+
+}

+ 79 - 0
src/main/java/com/xjrsoft/module/attendance/vo/AttendanceStatisticsVo.java

@@ -0,0 +1,79 @@
+package com.xjrsoft.module.attendance.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+* @title: 考勤统计表单出参
+* @Author dzx
+* @Date: 2024-10-19
+* @Version 1.0
+*/
+@Data
+public class AttendanceStatisticsVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+    /**
+    * 统计年份
+    */
+    @ApiModelProperty("统计年份")
+    private Integer year;
+    /**
+    * 统计月份
+    */
+    @ApiModelProperty("统计月份")
+    private Integer month;
+    /**
+    * 统计名称
+    */
+    @ApiModelProperty("统计名称")
+    private String name;
+    /**
+    * 开始日期
+    */
+    @ApiModelProperty("开始日期")
+    private Date startDate;
+    /**
+    * 结束日期
+    */
+    @ApiModelProperty("结束日期")
+    private Date endDate;
+    /**
+    * 关联考勤规则(attendance_rule_category)
+    */
+    @ApiModelProperty("关联考勤规则")
+    private String ruleName;
+    /**
+    * 统计人数
+    */
+    @ApiModelProperty("统计人数")
+    private Integer personCount;
+    /**
+    * 状态(0:数据统计中 1:统计完成 2:已解锁 3:已锁定)
+    */
+    @ApiModelProperty("状态(0:数据统计中 1:统计完成 2:已解锁 3:已锁定)")
+    private Integer status;
+    /**
+    * 是否需要刷新(0:否 1:是)
+    */
+    @ApiModelProperty("是否需要刷新(0:否 1:是)")
+    private Integer isNeedRefresh;
+    /**
+    * 时间段(1:上午 2:下午)
+    */
+    @ApiModelProperty("时间段(1:上午 2:下午)")
+    private Integer timePeriod;
+    /**
+    * 应出勤天数
+    */
+    @ApiModelProperty("应出勤天数")
+    private Integer attendanceDays;
+
+}

+ 25 - 0
src/main/resources/mapper/attendance/AttendanceStatisticsMapper.xml

@@ -0,0 +1,25 @@
+<?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.attendance.mapper.AttendanceStatisticsMapper">
+    <select id="getPage" parameterType="com.xjrsoft.module.attendance.dto.AttendanceStatisticsPageDto" resultType="com.xjrsoft.module.attendance.vo.AttendanceStatisticsPageVo">
+        SELECT t1.id,t1.year,t1.month,t1.name,t1.start_date,t2.end_date,t2.name AS rule_name,
+        t1.person_count,t1.d, t1.status,t1.is_need_refresh,t1.time_period FROM attendance_statistics t1
+        LEFT JOIN attendance_rule_category t2 ON t1.attendance_rule_category_id = t2.id
+        WHERE t1.delete_mark = 0
+        <if test="dto.name != null and dto.name != ''">
+            and t1.name like concat('%', #{dto.name},'%')
+        </if>
+        <if test="dto.year != null">
+            and t1.year = #{dto.year}
+        </if>
+        <if test="dto.month != null">
+            and t1.month = #{dto.month}
+        </if>
+        <if test="dto.status != null">
+            and t1.status = #{dto.status}
+        </if>
+        ORDER BY t1.create_date DESC
+    </select>
+</mapper>

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

@@ -3828,4 +3828,38 @@ public class FreeMarkerGeneratorTest {
 
         apiGeneratorService.generateCodes(params);
     }
+
+    @Test
+    public void gcAttendanceStatistics() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("attendance_statistics");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        mainTable = new TableConfig();
+        mainTable.setTableName("attendance_statistics_record");//init_sql中的表名
+        mainTable.setIsMain(false);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        mainTable.setRelationField("attendance_statistics_id");//设置外键
+        mainTable.setRelationTableField(GlobalConstant.DEFAULT_PK);//设置外键
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("dzx");//作者名称
+        params.setPackageName("attendance");//包名
+        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);
+    }
 }