新增打卡Demo模块

This commit is contained in:
yxz 2024-01-24 20:55:26 +08:00
parent c65ee4d28d
commit 0f39654327
39 changed files with 1762 additions and 0 deletions

50
Cpop-ClockIn-Demo/pom.xml Normal file
View File

@ -0,0 +1,50 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.cpop</groupId>
<artifactId>Cpop-Union</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>Cpop-ClockIn-Demo</artifactId>
<packaging>jar</packaging>
<name>Cpop-ClockIn</name>
<description>打卡Demo模块</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--核心包-->
<dependency>
<groupId>com.cpop</groupId>
<artifactId>Cpop-Core</artifactId>
</dependency>
<!--系统包-->
<dependency>
<groupId>com.cpop</groupId>
<artifactId>Cpop-System</artifactId>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20210307</version> <!-- 请检查最新版本 -->
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,83 @@
package com.cpop.clockin.business.bo;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
* @Author: Yxz
* @Date: 2024/1/23 21:39
* @Version: 1.0
*/
@Data
@ApiModel(value = "打卡记录VO")
public class ClockInRecordBo {
@ExcelProperty(value = "姓名")
private String staffName;
@ExcelProperty("考勤组")
private String clockInGroup;
@ExcelProperty("1")
private String day1;
@ExcelProperty("2")
private String day2;
@ExcelProperty("3")
private String day3;
@ExcelProperty("4")
private String day4;
@ExcelProperty("5")
private String day5;
@ExcelProperty("6")
private String day6;
@ExcelProperty("7")
private String day7;
@ExcelProperty("8")
private String day8;
@ExcelProperty("9")
private String day9;
@ExcelProperty("10")
private String day10;
@ExcelProperty("11")
private String day11;
@ExcelProperty("12")
private String day12;
@ExcelProperty("13")
private String day13;
@ExcelProperty("14")
private String day14;
@ExcelProperty("15")
private String day15;
@ExcelProperty("16")
private String day16;
@ExcelProperty("17")
private String day17;
@ExcelProperty("18")
private String day18;
@ExcelProperty("19")
private String day19;
@ExcelProperty("20")
private String day20;
@ExcelProperty("21")
private String day21;
@ExcelProperty("22")
private String day22;
@ExcelProperty("23")
private String day23;
@ExcelProperty("24")
private String day24;
@ExcelProperty("25")
private String day25;
@ExcelProperty("26")
private String day26;
@ExcelProperty("27")
private String day27;
@ExcelProperty("28")
private String day28;
@ExcelProperty("29")
private String day29;
@ExcelProperty("30")
private String day30;
@ExcelProperty("31")
private String day31;
}

View File

@ -0,0 +1,158 @@
package com.cpop.clockin.business.bo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
@JsonIgnoreProperties(ignoreUnknown = true)
public class EmployeeAttendanceBo {
@ExcelProperty("姓名")
@JsonProperty("姓名")
private String name;
@ExcelProperty("考勤组")
@JsonProperty("考勤组")
private String attendanceGroup;
@ExcelProperty("部门")
@JsonProperty("部门")
private String department;
@ExcelProperty("工号")
@JsonProperty("工号")
private String employeeId;
@ExcelProperty("职位")
@JsonProperty("职位")
private String position;
@ExcelProperty("UserId")
@JsonProperty("UserId")
private String userId;
@ExcelProperty("day1")
@JsonProperty("1")
private String day1;
@ExcelProperty("day2")
@JsonProperty("2")
private String day2;
@ExcelProperty("day3")
@JsonProperty("3")
private String day3;
@ExcelProperty("day4")
@JsonProperty("4")
private String day4;
@ExcelProperty("day5")
@JsonProperty("5")
private String day5;
@ExcelProperty("day6")
@JsonProperty("6")
private String day6;
@ExcelProperty("day7")
@JsonProperty("7")
private String day7;
@ExcelProperty("day8")
@JsonProperty("8")
private String day8;
@ExcelProperty("day9")
@JsonProperty("9")
private String day9;
@ExcelProperty("day10")
@JsonProperty("10")
private String day10;
@ExcelProperty("day11")
@JsonProperty("11")
private String day11;
@ExcelProperty("day12")
@JsonProperty("12")
private String day12;
@ExcelProperty("day13")
@JsonProperty("13")
private String day13;
@ExcelProperty("day14")
@JsonProperty("14")
private String day14;
@ExcelProperty("day15")
@JsonProperty("15")
private String day15;
@ExcelProperty("day16")
@JsonProperty("16")
private String day16;
@ExcelProperty("day17")
@JsonProperty("17")
private String day17;
@ExcelProperty("day18")
@JsonProperty("18")
private String day18;
@ExcelProperty("day19")
@JsonProperty("19")
private String day19;
@ExcelProperty("day20")
@JsonProperty("20")
private String day20;
@ExcelProperty("day21")
@JsonProperty("21")
private String day21;
@ExcelProperty("day22")
@JsonProperty("22")
private String day22;
@ExcelProperty("day23")
@JsonProperty("23")
private String day23;
@ExcelProperty("day24")
@JsonProperty("24")
private String day24;
@ExcelProperty("day25")
@JsonProperty("25")
private String day25;
@ExcelProperty("day26")
@JsonProperty("26")
private String day26;
@ExcelProperty("day27")
@JsonProperty("27")
private String day27;
@ExcelProperty("day28")
@JsonProperty("28")
private String day28;
@ExcelProperty("day29")
@JsonProperty("29")
private String day29;
@ExcelProperty("day30")
@JsonProperty("30")
private String day30;
@ExcelProperty("day31")
@JsonProperty("31")
private String day31;
}

View File

@ -0,0 +1,110 @@
package com.cpop.clockin.business.controller;
import com.cpop.core.base.R;
import com.mybatisflex.core.paginate.Page;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
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.beans.factory.annotation.Autowired;
import com.cpop.clockin.business.entity.Classes;
import com.cpop.clockin.business.service.ClassesService;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import java.io.Serializable;
import java.util.List;
/**
* 打卡班次表 控制层
*
* @author Yxz
* @since 2024-01-23
*/
@RestController
@Api(tags = "打卡班次表接口")
@RequestMapping("/backstage/classes")
public class ClassesController {
@Autowired
private ClassesService classesService;
/**
* 添加打卡班次表
*
* @param classes 打卡班次表
* @return {@code true} 添加成功{@code false} 添加失败
*/
@PostMapping("/save")
@ApiOperation("保存打卡班次表")
public R<Void> save(@RequestBody @ApiParam("打卡班次表") Classes classes) {
classesService.save(classes);
return R.ok();
}
/**
* 根据主键删除打卡班次表
*
* @param id 主键
* @return {@code true} 删除成功{@code false} 删除失败
*/
@DeleteMapping("/remove/{id}")
@ApiOperation("根据主键删除打卡班次表")
public R<Void> remove(@PathVariable @ApiParam("打卡班次表主键") Serializable id) {
classesService.removeById(id);
return R.ok();
}
/**
* 根据主键更新打卡班次表
*
* @param classes 打卡班次表
* @return {@code true} 更新成功{@code false} 更新失败
*/
@PutMapping("/update")
@ApiOperation("根据主键更新打卡班次表")
public R<Void> update(@RequestBody @ApiParam("打卡班次表主键") Classes classes) {
classesService.updateById(classes);
return R.ok();
}
/**
* 查询所有打卡班次表
*
* @return 所有数据
*/
@GetMapping("/list")
@ApiOperation("查询所有打卡班次表")
public R<List<Classes>> list() {
return R.ok(classesService.list());
}
/**
* 根据打卡班次表主键获取详细信息
*
* @param id 打卡班次表主键
* @return 打卡班次表详情
*/
@GetMapping("/getInfo/{id}")
@ApiOperation("根据主键获取打卡班次表")
public R<Classes> getInfo(@PathVariable @ApiParam("打卡班次表主键") Serializable id) {
return R.ok(classesService.getById(id));
}
/**
* 分页查询打卡班次表
*
* @param page 分页对象
* @return 分页对象
*/
@GetMapping("/page")
@ApiOperation("分页查询打卡班次表")
public R<Page<Classes>> page(@ApiParam("分页信息") Page<Classes> page) {
return R.ok(classesService.page(page));
}
}

View File

@ -0,0 +1,82 @@
package com.cpop.clockin.business.controller;
import com.alibaba.excel.EasyExcel;
import com.cpop.clockin.business.bo.ClockInRecordBo;
import com.cpop.clockin.business.bo.EmployeeAttendanceBo;
import com.cpop.clockin.business.service.ClockInRecordService;
import com.cpop.clockin.framework.constant.ClockInConstant;
import com.cpop.core.base.R;
import com.cpop.core.service.RedisService;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @Author: Yxz
* @Date: 2024/1/23 21:26
* @Version: 1.0
*/
@RestController
@Api(tags = "打卡记录接口")
@RequestMapping("/backstage/clockInRecord")
public class ClockInRecordController {
@Autowired
private ClockInRecordService clockInRecordService;
@Autowired
private RedisService redisService;
@PostMapping("/upload")
@ApiOperation("上传钉钉Excel表")
public R<String> uploadRecord(@RequestParam("file") MultipartFile file) throws IOException, ParseException {
/* List<ClockInRecordBo> clockInRecordBoList = ;
// 将对象数据返回给前端*/
return R.ok(clockInRecordService.uploadRecord(file));
}
@GetMapping("/output")
@ApiOperation("导出表格")
public void outPut(HttpServletResponse response) throws IOException {
String manTimeJson = redisService.getCacheObject(ClockInConstant.MAN_TIME_JSON);
/*byte[] bytes = manTimeJson.getBytes();
OutputStream outputStream = new FileOutputStream("output.json");
outputStream.write(bytes);*/
/* List<ClockInRecordBo> clockInRecordBoList = ;
// // 将对象数据返回给前端*/
ObjectMapper objectMapper = new ObjectMapper();
List<EmployeeAttendanceBo> employeeList = new ArrayList<>();
try {
// 将JSON数组转化为Java对象的列表
employeeList = Arrays.asList(objectMapper.readValue(manTimeJson, EmployeeAttendanceBo[].class));
// 打印列表中的每个对象
for (EmployeeAttendanceBo employee : employeeList) {
System.out.println(employee);
}
} catch (IOException e) {
e.printStackTrace();
}
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyExcel没有关系
String fileName = URLEncoder.encode("事务分发模板", "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream(), EmployeeAttendanceBo.class).sheet("模板").doWrite(employeeList);
}
}

View File

@ -0,0 +1,101 @@
package com.cpop.clockin.business.controller;
import com.cpop.clockin.business.dto.StaffClassesDto;
import com.cpop.clockin.business.service.StaffClassesService;
import com.cpop.clockin.business.vo.StaffClassesVo;
import com.cpop.core.base.R;
import com.mybatisflex.core.paginate.Page;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import com.cpop.clockin.business.entity.StaffClasses;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import java.io.Serializable;
import java.util.List;
/**
* 员工-班次关联表 控制层
*
* @author Yxz
* @since 2024-01-23
*/
@RestController
@Api(tags = "员工-班次关联表接口")
@RequestMapping("/backstage/staffClasses")
public class StaffClassesController {
@Autowired
private StaffClassesService staffClassesService;
/**
* 添加员工-班次关联表
*
* @author: Yxz
* @date: 2024/1/24 20:54
* @param: [staffClassesDto]
* @return: com.cpop.core.base.R<java.lang.Void>
**/
@PostMapping("/save")
@ApiOperation("保存员工-班次关联表")
public R<Void> save(@RequestBody @ApiParam("员工-班次保存Dto") StaffClassesDto staffClassesDto) {
staffClassesService.saveAll(staffClassesDto);
return R.ok();
}
/**
* 根据主键更新员工-班次关联表
*
* @author: Yxz
* @date: 2024/1/24 20:54
* @param: [staffClassesDto]
* @return: com.cpop.core.base.R<java.lang.Void>
**/
@PutMapping("/update")
@ApiOperation("更新员工-班次关联表")
public R<Void> update(@RequestBody @ApiParam("员工-班次修改Dto") StaffClassesDto staffClassesDto) {
staffClassesService.updateAll(staffClassesDto);
return R.ok();
}
/**
* 查询所有员工-班次关联表
*
* @return 所有数据
*/
@GetMapping("/list")
@ApiOperation("查询员工班次信息")
public R<List<StaffClassesVo>> list() {
return R.ok(staffClassesService.getStaffClassesVolist());
}
/**
* 根据员工-班次关联表主键获取详细信息
*
* @param id 员工-班次关联表主键
* @return 员工-班次关联表详情
*/
@GetMapping("/getInfo/{id}")
@ApiOperation("根据主键获取员工-班次关联表")
public R<StaffClasses> getInfo(@PathVariable @ApiParam("员工-班次关联表主键") Serializable id) {
return R.ok(staffClassesService.getById(id));
}
/**
* 分页查询员工-班次关联表
*
* @author: Yxz
* @date: 2024/1/24 20:55
* @param: [staffName]
* @return: com.cpop.core.base.R<com.mybatisflex.core.paginate.Page<com.cpop.clockin.business.vo.StaffClassesVo>>
**/
@GetMapping("/page")
@ApiOperation("分页查询员工-班次信息")
public R<Page<StaffClassesVo>> page( @ApiParam("员工名称") @RequestParam(value = "staffName", required = false)String staffName) {
return R.ok(staffClassesService.selectPage(staffName));
}
}

View File

@ -0,0 +1,19 @@
package com.cpop.clockin.business.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Author: Yxz
* @Date: 2024/1/23 16:26
* @Version: 1.0
*/
@Data
@ApiModel(value = "员工班次DTO")
public class StaffClassesDto {
@ApiModelProperty(value = "员工id")
private String staffId;
@ApiModelProperty(value = "班次id数组")
private String[] classId;
}

View File

@ -0,0 +1,67 @@
package com.cpop.clockin.business.entity;
import com.cpop.core.base.entity.BaseEntity;
import com.cpop.core.base.entity.BaseInsertListener;
import com.cpop.core.base.entity.BaseUpdateListener;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.Accessors;
/**
* 打卡班次表 实体类
*
* @author Yxz
* @since 2024-01-23
*/
@Data
@EqualsAndHashCode(callSuper=false)
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@ApiModel(value = "打卡班次表对象")
@Table(value = "cp_oam_classes", onInsert = BaseInsertListener.class, onUpdate = BaseUpdateListener.class, mapperGenerateEnable = false)
public class Classes extends BaseEntity implements Serializable {
@Id
private String id;
/**
* 班次名称
*/
@ApiModelProperty(value = "班次名称")
private String className;
/**
* 开始时间
*/
@ApiModelProperty(value = "开始时间")
@JsonFormat(pattern = "HH:mm:ss",timezone = "GMT+8")
private Date startTime;
/**
* 结束时间
*/
@ApiModelProperty(value = "结束时间")
@JsonFormat(pattern = "HH:mm:ss",timezone = "GMT+8")
private Date endTime;
/**
* 逻辑删除0否1是
*/
@ApiModelProperty(value = "逻辑删除0否1是")
@Column(isLogicDelete = true)
private Integer isDelete;
}

View File

@ -0,0 +1,110 @@
package com.cpop.clockin.business.entity;
import com.cpop.core.base.entity.BaseEntity;
import com.cpop.core.base.entity.BaseInsertListener;
import com.cpop.core.base.entity.BaseUpdateListener;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.Accessors;
/**
* 部门表 实体类
*
* @author Yxz
* @since 2024-01-23
*/
@Data
@EqualsAndHashCode(callSuper=false)
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@ApiModel(value = "部门表对象")
@Table(value = "cp_oam_dept", onInsert = BaseInsertListener.class, onUpdate = BaseUpdateListener.class, mapperGenerateEnable = false)
public class ClockInDept extends BaseEntity implements Serializable {
/**
* 部门id
*/
@ApiModelProperty(value = "部门id")
@Id
private String id;
/**
* 父部门id
*/
@ApiModelProperty(value = "父部门id")
private String parentId;
/**
* 企微id
*/
@ApiModelProperty(value = "企微id")
private Long wxCpId;
/**
* 企微父id
*/
@ApiModelProperty(value = "企微父id")
private Long wxCpParentId;
/**
* 部门名称
*/
@ApiModelProperty(value = "部门名称")
private String name;
/**
* 排序
*/
@ApiModelProperty(value = "排序")
private Integer orderNo;
/**
* 负责人
*/
@ApiModelProperty(value = "负责人")
private String leader;
/**
* 电话
*/
@ApiModelProperty(value = "电话")
private String phone;
/**
* 邮箱
*/
@ApiModelProperty(value = "邮箱")
private String email;
/**
* 部门状态:1正常,0停用
*/
@ApiModelProperty(value = "部门状态:1正常,0停用")
private Boolean status;
/**
* 备注
*/
@ApiModelProperty(value = "备注")
private String remark;
/**
* 逻辑删除(0否1是)
*/
@ApiModelProperty(value = "逻辑删除(0否1是)")
@Column(isLogicDelete = true)
private Boolean isDelete;
}

View File

@ -0,0 +1,86 @@
package com.cpop.clockin.business.entity;
import com.cpop.core.base.entity.BaseEntity;
import com.cpop.core.base.entity.BaseInsertListener;
import com.cpop.core.base.entity.BaseUpdateListener;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.Accessors;
/**
* 员工表 实体类
*
* @author Yxz
* @since 2024-01-23
*/
@Data
@EqualsAndHashCode(callSuper=false)
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@ApiModel(value = "员工表对象")
@Table(value = "cp_oam_staff", onInsert = BaseInsertListener.class, onUpdate = BaseUpdateListener.class, mapperGenerateEnable = false)
public class ClockInStaff extends BaseEntity implements Serializable {
/**
* 主键
*/
@ApiModelProperty(value = "主键")
@Id
private String id;
/**
* 姓名
*/
@ApiModelProperty(value = "姓名")
private String name;
/**
* 用户id
*/
@ApiModelProperty(value = "用户id")
private String userId;
/**
* 员工类型(0:技术人员;1:售后人员;2:管理人员)
*/
@ApiModelProperty(value = "员工类型(0:技术人员;1:售后人员;2:管理人员)")
private Integer staffType;
/**
* 角色id
*/
@ApiModelProperty(value = "角色id")
private String roleId;
/**
* 微信用userId
*/
@ApiModelProperty(value = "微信用userId")
private String wxCpUserId;
/**
* 是否是运维账号
*/
@ApiModelProperty(value = "是否是运维账号")
private Boolean isOperation;
/**
* 逻辑删除(0否1是)
*/
@ApiModelProperty(value = "逻辑删除(0否1是)")
@Column(isLogicDelete = true)
private Boolean isDelete;
}

View File

@ -0,0 +1,46 @@
package com.cpop.clockin.business.entity;
import com.cpop.core.base.entity.BaseEntity;
import com.cpop.core.base.entity.BaseInsertListener;
import com.cpop.core.base.entity.BaseUpdateListener;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.Accessors;
/**
* Oam-员工-用户中间表 实体类
*
* @author Yxz
* @since 2024-01-23
*/
@Data
@EqualsAndHashCode(callSuper=false)
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@ApiModel(value = "Oam-员工-用户中间表对象")
@Table(value = "cp_oam_staff_mid_dept", onInsert = BaseInsertListener.class, onUpdate = BaseUpdateListener.class, mapperGenerateEnable = false)
public class ClockInStaffMidDept extends BaseEntity implements Serializable {
/**
* 员工id
*/
@ApiModelProperty(value = "员工id")
private String staffId;
/**
* 部门id
*/
@ApiModelProperty(value = "部门id")
private String deptId;
}

View File

@ -0,0 +1,58 @@
package com.cpop.clockin.business.entity;
import com.cpop.core.base.entity.BaseEntity;
import com.cpop.core.base.entity.BaseInsertListener;
import com.cpop.core.base.entity.BaseUpdateListener;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.Accessors;
/**
* 员工-班次关联表 实体类
*
* @author Yxz
* @since 2024-01-23
*/
@Data
@EqualsAndHashCode(callSuper=false)
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@ApiModel(value = "员工-班次关联表对象")
@Table(value = "cp_oam_staff_classes", onInsert = BaseInsertListener.class, onUpdate = BaseUpdateListener.class, mapperGenerateEnable = false)
public class StaffClasses extends BaseEntity implements Serializable {
@Id
private String id;
/**
* 员工id
*/
@ApiModelProperty(value = "员工id")
private String staffId;
/**
* 班次id
*/
@ApiModelProperty(value = "班次id")
private String classId;
/**
* 逻辑删除0否1是
*/
@ApiModelProperty(value = "逻辑删除0否1是")
@Column(isLogicDelete = true)
private Integer isDelete;
}

View File

@ -0,0 +1,14 @@
package com.cpop.clockin.business.mapper;
import com.mybatisflex.core.BaseMapper;
import com.cpop.clockin.business.entity.Classes;
/**
* 打卡班次表 映射层
*
* @author Yxz
* @since 2024-01-23
*/
public interface ClassesMapper extends BaseMapper<Classes> {
}

View File

@ -0,0 +1,14 @@
package com.cpop.clockin.business.mapper;
import com.mybatisflex.core.BaseMapper;
import com.cpop.clockin.business.entity.ClockInDept;
/**
* 部门表 映射层
*
* @author Yxz
* @since 2024-01-23
*/
public interface ClockInDeptMapper extends BaseMapper<ClockInDept> {
}

View File

@ -0,0 +1,14 @@
package com.cpop.clockin.business.mapper;
import com.mybatisflex.core.BaseMapper;
import com.cpop.clockin.business.entity.ClockInStaff;
/**
* 员工表 映射层
*
* @author Yxz
* @since 2024-01-23
*/
public interface ClockInStaffMapper extends BaseMapper<ClockInStaff> {
}

View File

@ -0,0 +1,15 @@
package com.cpop.clockin.business.mapper;
import com.cpop.clockin.business.entity.ClockInStaffMidDept;
import com.mybatisflex.core.BaseMapper;
/**
* Oam-员工-用户中间表 映射层
*
* @author Yxz
* @since 2024-01-23
*/
public interface ClockInStaffMidDeptMapper extends BaseMapper<ClockInStaffMidDept> {
}

View File

@ -0,0 +1,14 @@
package com.cpop.clockin.business.mapper;
import com.mybatisflex.core.BaseMapper;
import com.cpop.clockin.business.entity.StaffClasses;
/**
* 员工-班次关联表 映射层
*
* @author Yxz
* @since 2024-01-23
*/
public interface StaffClassesMapper extends BaseMapper<StaffClasses> {
}

View File

@ -0,0 +1,14 @@
package com.cpop.clockin.business.service;
import com.mybatisflex.core.service.IService;
import com.cpop.clockin.business.entity.Classes;
/**
* 打卡班次表 服务层
*
* @author Yxz
* @since 2024-01-23
*/
public interface ClassesService extends IService<Classes> {
}

View File

@ -0,0 +1,14 @@
package com.cpop.clockin.business.service;
import com.mybatisflex.core.service.IService;
import com.cpop.clockin.business.entity.ClockInDept;
/**
* 部门表 服务层
*
* @author Yxz
* @since 2024-01-23
*/
public interface ClockInDeptService extends IService<ClockInDept> {
}

View File

@ -0,0 +1,26 @@
package com.cpop.clockin.business.service;
import com.cpop.clockin.business.bo.ClockInRecordBo;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.text.ParseException;
import java.util.List;
/**
* 打卡记录服务类
*
* @Author: Yxz
* @Date: 2024/1/23 21:55
*/
public interface ClockInRecordService {
/**
* 上传钉钉Excel表
*
* @author: Yxz
* @date: 2024/1/24 9:33
* @param: [file]
* @return: java.util.List<com.cpop.clockin.business.bo.ClockInRecordBo>
**/
String uploadRecord(MultipartFile file) throws IOException, ParseException;
}

View File

@ -0,0 +1,14 @@
package com.cpop.clockin.business.service;
import com.mybatisflex.core.service.IService;
import com.cpop.clockin.business.entity.ClockInStaffMidDept;
/**
* Oam-员工-用户中间表 服务层
*
* @author Yxz
* @since 2024-01-23
*/
public interface ClockInStaffMidDeptService extends IService<ClockInStaffMidDept> {
}

View File

@ -0,0 +1,14 @@
package com.cpop.clockin.business.service;
import com.mybatisflex.core.service.IService;
import com.cpop.clockin.business.entity.ClockInStaff;
/**
* 员工表 服务层
*
* @author Yxz
* @since 2024-01-23
*/
public interface ClockInStaffService extends IService<ClockInStaff> {
}

View File

@ -0,0 +1,48 @@
package com.cpop.clockin.business.service;
import com.cpop.clockin.business.dto.StaffClassesDto;
import com.cpop.clockin.business.entity.StaffClasses;
import com.cpop.clockin.business.vo.StaffClassesVo;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import java.util.List;
public interface StaffClassesService extends IService<StaffClasses> {
/**
* 保存员工班次信息
*
* @author: Yxz
* @date: 2024/1/23 20:43
* @param: [staffClassesDto]
* @return: void
**/
public void saveAll(StaffClassesDto staffClassesDto);
/**
* 查询所有员工班次信息
*
* @author: Yxz
* @date: 2024/1/23 20:42
* @param: []
* @return: java.util.List<com.cpop.clockin.business.vo.StaffClassesVo>
**/
public List<StaffClassesVo> getStaffClassesVolist();
/**
* 更新员工班次信息
*
* @author: Yxz
* @date: 2024/1/23 20:42
* @param: [staffClassesDto]
* @return: void
**/
void updateAll(StaffClassesDto staffClassesDto);
/**
* 分页查询员工-班次信息
*
* @author: Yxz
* @date: 2024/1/23 20:42
* @param: [staffName]
* @return: com.mybatisflex.core.paginate.Page<com.cpop.clockin.business.vo.StaffClassesVo>
**/
Page<StaffClassesVo> selectPage(String staffName);
}

View File

@ -0,0 +1,18 @@
package com.cpop.clockin.business.service.impl;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.cpop.clockin.business.entity.Classes;
import com.cpop.clockin.business.mapper.ClassesMapper;
import com.cpop.clockin.business.service.ClassesService;
import org.springframework.stereotype.Service;
/**
* 打卡班次表 服务层实现
*
* @author Yxz
* @since 2024-01-23
*/
@Service("classesService")
public class ClassesServiceImpl extends ServiceImpl<ClassesMapper, Classes> implements ClassesService {
}

View File

@ -0,0 +1,18 @@
package com.cpop.clockin.business.service.impl;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.cpop.clockin.business.entity.ClockInDept;
import com.cpop.clockin.business.mapper.ClockInDeptMapper;
import com.cpop.clockin.business.service.ClockInDeptService;
import org.springframework.stereotype.Service;
/**
* 部门表 服务层实现
*
* @author Yxz
* @since 2024-01-23
*/
@Service("clockInDeptService")
public class ClockInDeptServiceImpl extends ServiceImpl<ClockInDeptMapper, ClockInDept> implements ClockInDeptService {
}

View File

@ -0,0 +1,213 @@
package com.cpop.clockin.business.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson2.JSON;
import com.cpop.clockin.business.bo.ClockInRecordBo;
import com.cpop.clockin.business.entity.Classes;
import com.cpop.clockin.business.entity.ClockInStaff;
import com.cpop.clockin.business.entity.StaffClasses;
import com.cpop.clockin.business.service.ClassesService;
import com.cpop.clockin.business.service.ClockInRecordService;
import com.cpop.clockin.business.service.ClockInStaffService;
import com.cpop.clockin.business.service.StaffClassesService;
import com.cpop.clockin.framework.constant.ClockInConstant;
import com.cpop.core.service.RedisService;
import com.mybatisflex.core.query.QueryWrapper;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* 打卡记录服务实现类
* @Author: Yxz
* @Date: 2024/1/23 21:55
* @Version: 1.0
*/
@Service
public class ClockInRecordServiceImpl implements ClockInRecordService {
@Autowired
private RedisService redisService;
@Autowired
private ClockInStaffService clockInStaffService;
@Autowired
private StaffClassesService staffClassesService;
@Autowired
private ClassesService classesService;
/**
* 上传钉钉Excel表
*
* @author: Yxz
* @date: 2024/1/24 14:54
* @param: [file]
* @return: java.lang.String
**/
@Override
public String uploadRecord(MultipartFile file) throws IOException, ParseException {
EasyExcel.read(file.getInputStream())
.sheet()
.registerReadListener(new AnalysisEventListener<Map<Integer, String>>() {
List<Map<Integer, String>> dataList = new ArrayList<>();
@Override
public void invoke(Map<Integer, String> data, AnalysisContext context) {
// 遍历每一列
for (Map.Entry<Integer, String> entry : data.entrySet()) {
Integer columnIndex = entry.getKey();
String columnValue = entry.getValue();
// 如果列的值为null将其替换为空字符串
if (columnValue == null) {
data.put(columnIndex, ""); // 使用空字符串代替null
}
}
dataList.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 处理数据完成后的操作
String jsonData = JSON.toJSONString(dataList);
// 存入Redis中
redisService.setCacheObject(ClockInConstant.CLOCKIN_EXCEL_JSON,jsonData,5, TimeUnit.MINUTES);
System.out.println(jsonData);
}
})
.doRead();
String cacheObject = redisService.getCacheObject(ClockInConstant.CLOCKIN_EXCEL_JSON);
JSONArray jsonArray = new JSONArray(cacheObject);
List<Map> mergedJsonList = new ArrayList<>();
// 依据键从小到大排序
JSONObject titleObject = jsonArray.getJSONObject(1);
Map<String, String> sortedJsonObject = new LinkedHashMap<>();
titleObject.keySet().stream()
.sorted(Comparator.comparingInt(Integer::parseInt))
.forEach(key -> {
// 将排序后的键和对应的值加入新的JSONObject
System.out.println(key + ": " + titleObject.getString(key));
sortedJsonObject.put(key, titleObject.getString(key));
});
// 合并键值对
for (int i = 2; i < jsonArray.length(); i++) {
Map<String, String> mergedJson = new LinkedHashMap<>();
for (String key : sortedJsonObject.keySet()) {
String newKey = titleObject.getString(key);
// 获取当前元素
JSONObject element = jsonArray.getJSONObject(i);
String value = element.getString(key);
// 时间列
if (newKey.matches("-?\\d+(\\.\\d+)?") || newKey.equals("") || newKey.equals("")){
// 工时
double manHour = 0.0;
// 加班时间
double overtime = 0.0;
String name = element.getString("0");
// 匹配员工
ClockInStaff clockInStaff = clockInStaffService.getOne(QueryWrapper.create().eq("name", name));
// 查找班次
if (ObjectUtil.isNotNull( clockInStaff)) {
List<StaffClasses> staffClasses = staffClassesService.list(QueryWrapper.create().eq("staff_id", clockInStaff.getId()));
for (StaffClasses staffClass : staffClasses) {
Classes classes = classesService.getById(staffClass.getClassId());
if (ObjectUtil.isNotNull(classes) && ObjectUtil.isNotEmpty(value)){
// 计算工时
String firstTime = value.substring(0, 5);
// String lastTime = value.substring( value.length() - 5,value.length());
String lastTime = value.substring(value.length() - 5).trim();
String pattern = "HH:mm";
SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
Date firstTimeDate = dateFormat.parse(firstTime);
Date lastTimeDate = dateFormat.parse(lastTime);
Date overTimeDate = dateFormat.parse("21:00");
if (firstTimeDate.before(classes.getStartTime())){
// 正常上班卡
if (lastTimeDate.before(classes.getEndTime())){
// 早退
long timeDifferenceInMillis = lastTimeDate.getTime() - classes.getStartTime().getTime();
manHour = manHour + (double) timeDifferenceInMillis / (1000 * 60 * 60);
}else {
// 正常下班
long timeDifferenceInMillis = classes.getEndTime().getTime() - classes.getStartTime().getTime();
manHour = manHour + (double) timeDifferenceInMillis / (1000 * 60 * 60);
}
}else {
// 迟到
if (lastTimeDate.before(classes.getEndTime())){
// 早退
long timeDifferenceInMillis = lastTimeDate.getTime() - firstTimeDate.getTime();
manHour = manHour + (double) timeDifferenceInMillis / (1000 * 60 * 60);
}else {
// 正常下班
long timeDifferenceInMillis = classes.getEndTime().getTime() - firstTimeDate.getTime();
manHour = manHour + (double) timeDifferenceInMillis / (1000 * 60 * 60);
}
}
if (lastTimeDate.after(overTimeDate)){
// 加班
long timeDifferenceInMillis = lastTimeDate.getTime() - overTimeDate.getTime();
overtime = (double) timeDifferenceInMillis / (1000 * 60 * 60);
}
System.out.println("lastTime==========="+ lastTime);
}
}
}
// 保留两位小数
DecimalFormat decimalFormat = new DecimalFormat("#.##");
// 使用format方法进行格式化
String formatManHour = decimalFormat.format(manHour + overtime);
String formatOverTime = decimalFormat.format(overtime);
value = "工时:" + formatManHour;
if (overtime != 0.0){
//加班
value = value + " " + "加班工时:" +formatOverTime;
}
}
mergedJson.put(newKey,value);
}
mergedJsonList.add(mergedJson);
}
String jsonString = JSON.toJSONString(mergedJsonList);
redisService.setCacheObject(ClockInConstant.MAN_TIME_JSON,jsonString,5,TimeUnit.MINUTES);
return jsonString;
}
}

View File

@ -0,0 +1,18 @@
package com.cpop.clockin.business.service.impl;
import com.cpop.clockin.business.entity.ClockInStaffMidDept;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.cpop.clockin.business.mapper.ClockInStaffMidDeptMapper;
import com.cpop.clockin.business.service.ClockInStaffMidDeptService;
import org.springframework.stereotype.Service;
/**
* Oam-员工-用户中间表 服务层实现
*
* @author Yxz
* @since 2024-01-23
*/
@Service("clockInStaffMidDeptService")
public class ClockInStaffMidDeptServiceImpl extends ServiceImpl<ClockInStaffMidDeptMapper, ClockInStaffMidDept> implements ClockInStaffMidDeptService {
}

View File

@ -0,0 +1,18 @@
package com.cpop.clockin.business.service.impl;
import com.cpop.clockin.business.service.ClockInStaffService;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.cpop.clockin.business.entity.ClockInStaff;
import com.cpop.clockin.business.mapper.ClockInStaffMapper;
import org.springframework.stereotype.Service;
/**
* 员工表 服务层实现
*
* @author Yxz
* @since 2024-01-23
*/
@Service("clockInStaffService")
public class ClockInStaffServiceImpl extends ServiceImpl<ClockInStaffMapper, ClockInStaff> implements ClockInStaffService {
}

View File

@ -0,0 +1,193 @@
package com.cpop.clockin.business.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.cpop.clockin.business.dto.StaffClassesDto;
import com.cpop.clockin.business.entity.*;
import com.cpop.clockin.business.mapper.ClockInStaffMapper;
import com.cpop.clockin.business.service.*;
import com.cpop.clockin.business.vo.ClassesVo;
import com.cpop.clockin.business.vo.StaffClassesVo;
import com.cpop.core.base.entity.PageDomain;
import com.cpop.core.utils.SpringUtils;
import com.cpop.core.utils.sql.SqlUtils;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.row.Db;
import com.mybatisflex.core.row.DbChain;
import com.mybatisflex.core.row.Row;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.cpop.clockin.business.mapper.StaffClassesMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import static com.mybatisflex.core.query.QueryMethods.groupConcat;
/**
* 员工-班次关联表 服务层实现
*
* @author Yxz
* @since 2024-01-23
*/
@Service("staffClassesService")
public class StaffClassesServiceImpl extends ServiceImpl<StaffClassesMapper, StaffClasses> implements StaffClassesService {
@Autowired
private ClockInStaffService clockInStaffService;
@Autowired
private ClockInDeptService clockInDeptService;
@Autowired
private ClockInStaffMidDeptService clockInStaffMidDeptService;
@Autowired
private ClassesService classesService;
@Autowired
private ClockInStaffMapper clockInStaffMapper;
/**
* 保存员工班次
*
* @author: Yxz
* @date: 2024/1/23 16:59
* @param: [staffClassesDto]
* @return: void
**/
@Override
public void saveAll(StaffClassesDto staffClassesDto) {
this.mapper.deleteByQuery(QueryWrapper.create().eq("staff_id",staffClassesDto.getStaffId()));
for (String s : staffClassesDto.getClassId()) {
StaffClasses staffClasses = new StaffClasses();
staffClasses.setStaffId(staffClassesDto.getStaffId());
staffClasses.setClassId(s);
this.save(staffClasses);
}
}
/**
* 查询所有员工-班次关联表
*
* @author: Yxz
* @date: 2024/1/23 17:50
* @param: []
* @return: java.util.List<com.cpop.clockin.business.vo.StaffClassesVo>
**/
@Override
public List<StaffClassesVo> getStaffClassesVolist() {
List<StaffClassesVo> staffClassesVoList= clockInStaffService.list().stream().map(entity -> {
StaffClassesVo vo = new StaffClassesVo();
vo.setStaffName(entity.getName());
vo.setStaffId(entity.getId());
// 部门
String duptName = "";
for (ClockInStaffMidDept staffMidDept : clockInStaffMidDeptService.list(QueryWrapper.create().eq("staff_id", entity.getId()))) {
ClockInDept dept = clockInDeptService.getById(staffMidDept.getDeptId());
duptName = duptName + dept.getName() + " ";
}
vo.setDeptName(duptName);
// 考勤班次字段
String className = "";
List<ClassesVo> classesVos = new ArrayList<>();
for (StaffClasses staffClasses : this.list(QueryWrapper.create().eq("staff_id", entity.getId()))) {
Classes classes = classesService.getById(staffClasses.getClassId());
className = className + classes.getClassName() + "";
ClassesVo classesVO = new ClassesVo();
BeanUtils.copyProperties(classes,classesVO);
classesVos.add(classesVO);
}
vo.setClassName(className);
vo.setClassesVoList(classesVos);
return vo;
}).collect(Collectors.toList());
return staffClassesVoList;
}
@Override
public void updateAll(StaffClassesDto staffClassesDto) {
this.mapper.deleteByQuery(QueryWrapper.create().eq("staff_id",staffClassesDto.getStaffId()));
this.saveAll(staffClassesDto);
}
/**
* 分页查询
*
* @author: Yxz
* @date: 2024/1/24 11:20
* @param: [staffName]
* @return: com.mybatisflex.core.paginate.Page<com.cpop.clockin.business.vo.StaffClassesVo>
**/
@Override
public Page<StaffClassesVo> selectPage(String staffName) {
PageDomain pageDomain = SqlUtils.getInstance().getPageDomain();
/*SpringUtils.getBean(ClockInStaffService.class).getMapper().paginateAs(Page.of(pageDomain.getPageSize(),pageDomain.getPageSize()),
QueryWrapper.create(),
StaffClassesVo.class,
deptName ->deptName.field(StaffClassesVo::getDeptName)
.queryWrapper(vo ->QueryWrapper.create().select(("group_concat(cod.name) as deptName") ).from("cp_oam_dept").as("cod")
.leftJoin("cp_oam_staff_mid_dept").as("cosmd").on("cosmd.dept_id = cos.id")
.leftJoin("cp_oam_staff").as("cos").on("cos.id = cosmd.staff_id")
.where("cos.id = ?",vo.getStaffId())));*/
/*Page<StaffClassesVo> clockInStaffPage1 = DbChain.table("cp_oam_staff")
.select("cos.id as staffId","cos.name as staffName").from("cp_oam_staff").as("cos")
.leftJoin("cp_oam_staff_mid_dept").as("cosmd").on("cosmd.staff_id = cos.id")
.leftJoin("cp_oam_dept").as("cod").on("cod.id = cosmd.dept_id")
.like("name", staffName)
.pageAs(StaffClassesVo.class);
Db.paginate("cp_oam_staff",pageAs(pageDomain.getPageSize(),pageDomain.getPageSize()),
QueryWrapper.create(),)*/
Page<ClockInStaff> clockInStaffPage = clockInStaffMapper.paginate(pageDomain.getPageNum(), pageDomain.getPageSize(), QueryWrapper.create().like("name",staffName));
List<StaffClassesVo> staffClassesVoList = clockInStaffPage.getRecords().stream().map(entity -> {
StaffClassesVo vo = new StaffClassesVo();
vo.setStaffName(entity.getName());
vo.setStaffId(entity.getId());
// 部门
String duptName = "";
for (ClockInStaffMidDept staffMidDept : clockInStaffMidDeptService.list(QueryWrapper.create().eq("staff_id", entity.getId()))) {
ClockInDept dept = clockInDeptService.getById(staffMidDept.getDeptId());
duptName = duptName + dept.getName() + " ";
}
vo.setDeptName(duptName);
// 考勤班次字段
String className = "";
List<ClassesVo> classesVos = new ArrayList<>();
for (StaffClasses staffClasses : this.list(QueryWrapper.create().eq("staff_id", entity.getId()))) {
Classes classes = classesService.getById(staffClasses.getClassId());
if (ObjectUtil.isNotNull(classes)) {
className = className + classes.getClassName() + " ";
ClassesVo classesVO = new ClassesVo();
BeanUtils.copyProperties(classes,classesVO);
classesVos.add(classesVO);
}
}
vo.setClassName(className);
vo.setClassesVoList(classesVos);
return vo;
}).collect(Collectors.toList());
Page<StaffClassesVo> staffClassesVoPage = new Page<>(pageDomain.getPageNum(), pageDomain.getPageSize());
staffClassesVoPage.setRecords(staffClassesVoList);
staffClassesVoPage.setTotalRow(clockInStaffPage.getTotalRow());
staffClassesVoPage.setTotalPage(clockInStaffPage.getTotalPage());
return staffClassesVoPage;
}
}

View File

@ -0,0 +1,23 @@
package com.cpop.clockin.business.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Author: Yxz
* @Date: 2024/1/23 18:56
* @Version: 1.0
*/
@ApiModel(value = "班次VO")
@Data
public class ClassesVo {
@ApiModelProperty(value = "班次Id")
private String id;
/**
* 班次名称
*/
@ApiModelProperty(value = "班次名称")
private String className;
}

View File

@ -0,0 +1,29 @@
package com.cpop.clockin.business.vo;
import com.mybatisflex.annotation.RelationOneToMany;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @Author: Yxz
* @Date: 2024/1/23 17:45
* @Version: 1.0
*/
@ApiModel(value = "员工班次关联VO")
@Data
public class StaffClassesVo {
@ApiModelProperty("员工Id")
private String staffId;
@ApiModelProperty("员工名称")
private String staffName;
@ApiModelProperty("部门名称")
private String deptName;
@ApiModelProperty("考勤班次名称")
private String className;
@ApiModelProperty("考勤班次集合")
private List<ClassesVo> classesVoList;
}

View File

@ -0,0 +1,14 @@
package com.cpop.clockin.framework.constant;
/**
* @Author: Yxz
* @Date: 2024/1/24 11:39
* @Version: 1.0
*/
public class ClockInConstant {
// 打卡表格数据
public static final String CLOCKIN_EXCEL_JSON = "clockin_excel_json";
// 工时数据
public static final String MAN_TIME_JSON = "man_time_json";
}

View File

@ -0,0 +1,7 @@
<?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.cpop.clockin.business.mapper.ClassesMapper">
</mapper>

View File

@ -0,0 +1,7 @@
<?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.cpop.clockin.business.mapper.ClockInDeptMapper">
</mapper>

View File

@ -0,0 +1,7 @@
<?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.cpop.clockin.business.mapper.ClockInStaffMapper">
</mapper>

View File

@ -0,0 +1,7 @@
<?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.cpop.clockin.business.mapper.ClockInStaffMidDeptMapper">
</mapper>

View File

@ -0,0 +1,7 @@
<?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.cpop.clockin.business.mapper.StaffClassesMapper">
</mapper>

View File

@ -45,6 +45,11 @@
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<!-- 打卡Demo包 -->
<dependency>
<groupId>com.cpop</groupId>
<artifactId>Cpop-ClockIn-Demo</artifactId>
</dependency>
</dependencies>
<build>

View File

@ -29,6 +29,7 @@
<module>Cpop-System</module>
<module>Cpop-Mini</module>
<module>Cpop-Pay</module>
<module>Cpop-ClockIn-Demo</module>
</modules>
<properties>
@ -111,6 +112,12 @@
<artifactId>Cpop-Jambox</artifactId>
<version>${cpop.version}</version>
</dependency>
<!-- 打卡Demo包 -->
<dependency>
<groupId>com.cpop</groupId>
<artifactId>Cpop-ClockIn-Demo</artifactId>
<version>${cpop.version}</version>
</dependency>
<dependency>
<groupId>com.cpop</groupId>
<artifactId>Cpop-Mall</artifactId>