fix: 攀枝花东区-缴费分支代码处理

This commit is contained in:
2025-05-15 23:21:29 +08:00
parent bafd4aa3ab
commit 6bef534d7d
1097 changed files with 12395 additions and 61340 deletions
@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>edu-attendance</artifactId>
<groupId>com.yida.data.attendance</groupId>
<version>2.2-RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>edu-attendance-biz</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--mqtt-->
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>${paho.mqttv3.version}</version>
</dependency>
<dependency>
<groupId>com.yida.data.system</groupId>
<artifactId>febs-server-system-api</artifactId>
<version>${febs-cloud.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.yida.data.user</groupId>
<artifactId>edu-user-api</artifactId>
<version>${febs-cloud.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.yida.data.school</groupId>
<artifactId>edu-school-api</artifactId>
<version>${febs-cloud.version}</version>
<scope>compile</scope>
</dependency>
<!--通用工具-->
<dependency>
<groupId>com.yida.data.common</groupId>
<artifactId>edu-common</artifactId>
<version>${febs-cloud.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.yida.data.job</groupId>
<artifactId>febs-server-job-api</artifactId>
<version>${febs-cloud.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.yida.data.attendance</groupId>
<artifactId>edu-attendance-api</artifactId>
<version>${febs-cloud.version}</version>
<scope>compile</scope>
</dependency>
<!--activemq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>com.yida.data.server</groupId>
<artifactId>edu-card-server-api</artifactId>
<version>2.2-RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<outputDirectory>../../../febs-jar</outputDirectory>
</configuration>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,29 @@
package com.yida.data.attendance;
import cc.mrbird.febs.common.security.starter.annotation.EnableFebsCloudResourceServer;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableAsync
@EnableScheduling
@EnableFebsCloudResourceServer
@EnableFeignClients(basePackages = "com.yida.data")
@MapperScan("com.yida.data.attendance.mapper")
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
@EnableJms
public class EduAttendanceApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(EduAttendanceApplication.class)
.web(WebApplicationType.SERVLET)
.run(args);
}
}
@@ -0,0 +1,111 @@
package com.yida.data.attendance.configure;
import cc.mrbird.febs.common.redis.service.RedisService;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.yida.data.attendance.dto.DealRecordDTO;
import com.yida.data.attendance.service.EduAttendanceRecordService;
import com.yida.data.common.core.entity.ReceiveMsg;
import com.yida.data.common.core.entity.constant.CachePrefixConstant;
import com.yida.data.common.core.entity.user.EduStaff;
import com.yida.data.common.core.entity.user.EduStudent;
import com.yida.data.common.core.enums.MsgChannel;
import com.yida.data.user.feign.RemoteStaffService;
import com.yida.data.user.feign.RemoteStudentService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.JmsListener;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Objects;
@RequiredArgsConstructor
@Slf4j
@Configuration
public class ActiveMqConfigure {
private final EduAttendanceRecordService eduAttendanceRecordService;
private final RemoteStaffService remoteStaffService;
private final RemoteStudentService remoteStudentService;
private final RedisService redisService;
private static Snowflake snowflake;
static {
snowflake = new Snowflake(1L, 1L);
}
@JmsListener(destination = "mq.bfms.client.msg.topic")
public void consumeAttendance(String text) {
try {
// 保存接收消息到es
ReceiveMsg receiveMsg = new ReceiveMsg();
receiveMsg.setTopic("mq.bfms.client.msg.topic");
receiveMsg.setMsg(text);
receiveMsg.setId(snowflake.nextId());
receiveMsg.setChannel(MsgChannel.ACTIVE.getValue());
receiveMsg.setCreateDate(LocalDateTime.now());
redisService.lSet(CachePrefixConstant.RECEIVE_MSG, receiveMsg);
// 处理业务
JSONObject json = JSONUtil.parseObj(text);
String method = json.getStr("method");
if ("bfms.notifyFaceInfo".equals(method)) {
JSONObject data = json.getJSONObject("info");
JSONArray jsonArray = data.getJSONArray("similarFaces");
if (Objects.isNull(jsonArray)) {
return;
}
JSONObject personData = (JSONObject) jsonArray.get(0);
String personId = personData.getStr("personId");
Integer personType = personData.getInt("personTypeId");
DealRecordDTO dto = new DealRecordDTO();
String pictureUrl = data.getStr("pictureUrl");
String[] pictureUrls = pictureUrl.split("\\|");
if (pictureUrls.length < 2) {
// 图片未上传 不处理该数据
return;
}
dto.setPicUrl(pictureUrls[1]);
dto.setDate(LocalDateTimeUtil.of(data.getLong("beginTime") * 1000)
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
dto.setSn(data.getStr("channelId"));
dto.setUserFlag(personId);
Object userId = redisService.hget(CachePrefixConstant.USER_DAHUA_USER, personId);
// 查询用户
if (personType == 2) {
if (userId == null) {
EduStaff staff = remoteStaffService.getStaffByDahuaNoPermission(personId).getData();
if (staff != null) {
dto.setUserId(staff.getId());
redisService.hset(CachePrefixConstant.USER_DAHUA_USER, personId, dto.getUserId());
}
} else {
dto.setUserId(Long.valueOf(userId.toString()));
}
dto.setUserType(1);
} else if (personType == 1) {
if (userId == null) {
EduStudent student = remoteStudentService.getStudentByDahuaNoPermission(personId).getData();
if (student != null) {
dto.setUserId(student.getId());
redisService.hset(CachePrefixConstant.USER_DAHUA_USER, personId, dto.getUserId());
}
} else {
dto.setUserId(Long.valueOf(userId.toString()));
}
dto.setUserType(0);
}
if (dto.getUserId() != null) {
eduAttendanceRecordService.receiveRecord(dto);
}
}
} catch (Exception e) {
log.error("处理大华人脸推送错误,接收消息:[{}]", text, e);
}
}
}
@@ -0,0 +1,26 @@
package com.yida.data.attendance.configure;
import java.util.concurrent.ThreadPoolExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
public class ThreadPollConfigure {
public static final String POLL_NAME = "attendance_thread_pool";
@Bean(POLL_NAME)
public ThreadPoolTaskExecutor asyncThreadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(20);
executor.setKeepAliveSeconds(30);
executor.setThreadNamePrefix("attendance-thread");
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
}
@@ -0,0 +1,16 @@
package com.yida.data.attendance.constant;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import lombok.Data;
@Data
@Component
@ConfigurationProperties(prefix = "febs.mqtt")
public class MqttConstant {
private String url;
private String username;
private String password;
}
@@ -0,0 +1,170 @@
package com.yida.data.attendance.controller;
import cn.hutool.core.util.ArrayUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.yida.data.attendance.dto.DevicePage;
import com.yida.data.attendance.dto.IssuedFaceDTO;
import com.yida.data.attendance.dto.RemoveFaceDTO;
import com.yida.data.attendance.service.EduAttendanceDeviceService;
import com.yida.data.attendance.vo.DeviceNumberVO;
import com.yida.data.attendance.vo.DeviceVO;
import com.yida.data.attendance.vo.OnlineCountVO;
import com.yida.data.common.core.annotation.ControllerLog;
import com.yida.data.common.core.common.ResultBean;
import com.yida.data.common.core.entity.attendance.EduAttendanceDevice;
import com.yida.data.common.core.entity.system.Dept;
import com.yida.data.common.core.utils.FebsUtil;
import com.yida.data.system.feign.RemoteDeptService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@Api(tags = "考勤-设备", value = "考勤")
@RestController
@RequestMapping("/device")
@RequiredArgsConstructor
public class EduAttendanceDeviceController {
private final EduAttendanceDeviceService eduAttendanceDeviceService;
private final RemoteDeptService remoteDeptService;
@ApiOperation("考勤设备列表分页查询")
@GetMapping("/listDevicePage")
@ControllerLog(operation = "分页查询考勤设备")
@PreAuthorize("hasAuthority('attendance:device:view')")
public ResultBean<DevicePage<DeviceVO>> listDevicePage(@ApiParam("学校名称") String schoolName,
@ApiParam("设备编号或名称") String number,
@ApiParam("进出类型,0-进门,1-出门") Integer scope,
@ApiParam("区域类型,0-校门,1-宿舍") Integer type,
@ApiParam("设备状态,0-在线,1-离线") Integer state,
@ApiParam("当前页码") @RequestParam(defaultValue = "1") Integer pageNum,
@ApiParam("页面大小") @RequestParam(defaultValue = "10") Integer pageSize
) {
return ResultBean.buildSuccess(eduAttendanceDeviceService.listDevicePage(new DevicePage(pageNum,
pageSize), schoolName, number, scope, type, state, FebsUtil.getCurrentUser()));
}
/**
* 考勤设备数量统计
*
* @return com.yida.data.common.core.common.ResultBean<com.yida.data.attendance.vo.DeviceNumberVO>
* @author ZYJ
* @date 2021/10/8 16:57
*/
@ApiOperation("考勤设备数量统计")
@GetMapping("/findDeviceNumber")
@ControllerLog(operation = "考勤设备数量统计")
public ResultBean<DeviceNumberVO> findDeviceNumber() throws NoSuchMethodException {
return eduAttendanceDeviceService.findDeviceNumber();
}
@ApiOperation("新增、修改设备")
@PostMapping("/saveDevice")
@ControllerLog(operation = "新增、修改考勤设备")
@PreAuthorize("hasAuthority('attendance:device:edit')")
public ResultBean saveDevice(@RequestBody EduAttendanceDevice device) {
return ResultBean.buildSuccess(eduAttendanceDeviceService.saveDevice(device));
}
@ApiOperation("删除设备")
@PostMapping("/delDevice")
@ControllerLog(operation = "删除考勤设备")
@PreAuthorize("hasAuthority('attendance:device:delete')")
public ResultBean delDevice(@RequestBody List<Long> ids) {
eduAttendanceDeviceService.removeByIds(ids);
// 更新缓存
return ResultBean.buildSuccess();
}
@ApiOperation("根据学校和区域查询设备列表")
@GetMapping("/listDeviceBySchool")
@ControllerLog(operation = "根据学校和区域查询考勤设备")
public ResultBean<List<EduAttendanceDevice>> listDeviceBySchool(
@ApiParam("学校id") Long schoolId,
@ApiParam("区域类型,0-进门,1-出门") @RequestParam(required = false) Integer scope,
@ApiParam("类型,0-校门,1-宿舍") @RequestParam(required = false) Integer type) {
LambdaQueryWrapper<EduAttendanceDevice> condition = Wrappers.lambdaQuery(new EduAttendanceDevice())
.eq(EduAttendanceDevice::getSchoolId, schoolId);
if (scope != null) {
condition.eq(EduAttendanceDevice::getZoneScope, scope);
}
if (type != null) {
condition.eq(EduAttendanceDevice::getType, type);
}
return ResultBean.buildSuccess(eduAttendanceDeviceService.list(condition));
}
@ApiOperation("根据id查询设备列表")
@GetMapping("/listDeviceById")
ResultBean<List<EduAttendanceDevice>> listDeviceById(@RequestParam("ids") Long[] ids) {
return ResultBean.buildSuccess(
ArrayUtil.isNotEmpty(ids) ? eduAttendanceDeviceService.listByIds(Arrays.asList(ids))
: Collections.EMPTY_LIST);
}
@ApiOperation("根据id开门")
@GetMapping("/openDoor")
@ControllerLog(operation = "根据id开门")
public ResultBean openDoor(@ApiParam("设备id") @RequestParam String eduAttendanceDevice) {
eduAttendanceDeviceService.openDoor(eduAttendanceDevice);
return ResultBean.buildSuccess();
}
@ApiOperation("根据id设置时间")
@GetMapping("/setSysTime")
@ControllerLog(operation = "根据id设置时间")
public ResultBean setSysTime(@ApiParam("设备id") @RequestParam String id) {
eduAttendanceDeviceService.setSysTime(id);
return ResultBean.buildSuccess();
}
@ApiOperation("批量设置时间")
@PostMapping("/setAllTime")
@ControllerLog(operation = "批量分组")
public ResultBean setAllTime(@RequestBody List<String> list) {
eduAttendanceDeviceService.setAllTime(list);
return ResultBean.buildSuccess();
}
@ApiOperation("批量开门")
@PostMapping("/openAllDoor")
@ControllerLog(operation = "批量分组")
public ResultBean openAllDoor(@RequestBody List<String> list) {
eduAttendanceDeviceService.openAllDoor(list);
return ResultBean.buildSuccess();
}
@ApiOperation("下发人脸(下发设备需为同一厂商设备)")
@PostMapping("/issuedFace")
public ResultBean issuedFace(@RequestBody IssuedFaceDTO dto) {
eduAttendanceDeviceService.issuedFace(dto);
return ResultBean.buildSuccess();
}
@ApiOperation("删除设备中的人脸")
@PostMapping("/removeFace")
public ResultBean removeFace(@RequestBody RemoveFaceDTO dto) {
eduAttendanceDeviceService.removeFace(dto);
return ResultBean.buildSuccess();
}
@ApiOperation("获取面板机状态分布")
@GetMapping("/getOnlineDistrib")
public ResultBean<OnlineCountVO> getOnlineDistrib() {
List<Long> schoolIds = remoteDeptService.getSchoolByArea(null, null).getData().stream().map(Dept::getDeptId)
.collect(Collectors.toList());
return ResultBean.buildSuccess(eduAttendanceDeviceService.getOnlineDistrib(schoolIds));
}
}
@@ -0,0 +1,122 @@
package com.yida.data.attendance.controller;
import cn.hutool.core.util.ArrayUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yida.data.attendance.service.EduAttendanceDeviceGroupService;
import com.yida.data.attendance.service.EduDeviceGroupService;
import com.yida.data.attendance.vo.DeviceOrDeviceGroupVO;
import com.yida.data.common.core.annotation.ControllerLog;
import com.yida.data.common.core.common.ResultBean;
import com.yida.data.common.core.entity.CurrentUser;
import com.yida.data.common.core.entity.attendance.EduAttendanceDevice;
import com.yida.data.common.core.entity.attendance.EduAttendanceDeviceGroup;
import com.yida.data.common.core.entity.attendance.EduDeviceGroup;
import com.yida.data.common.core.utils.FebsUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
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;
/**
* 设备分组表 Controller
*
* @author zhanghaijun
* @date 2021-06-16 15:27:11
*/
@Api(tags = "考勤-设备分组")
@Slf4j
@Validated
@RestController
@RequestMapping("/deviceGroup")
@RequiredArgsConstructor
public class EduAttendanceDeviceGroupController {
private final EduAttendanceDeviceGroupService eduAttendanceDeviceGroupService;
private final EduDeviceGroupService eduDeviceGroupService;
@ApiOperation("根据name分页查询分组")
@GetMapping("/listDevicePage")
@ControllerLog(operation = "根据name查询分组")
public ResultBean<IPage<EduAttendanceDeviceGroup>> listDeviceGroupPage(@ApiParam("分组名称") @RequestParam String name,
@ApiParam("当前页码") @RequestParam(defaultValue = "1") Long current,
@ApiParam("页面大小") @RequestParam(defaultValue = "10") Long size,
@ApiParam("学校id") @RequestParam(required = false) Long schoolId) throws NoSuchMethodException {
return ResultBean.buildSuccess(eduAttendanceDeviceGroupService.selectGroup(name, current, size, schoolId));
}
@ApiOperation("全部查询")
@GetMapping("/listDevice")
@ControllerLog(operation = "查询分组")
public ResultBean<List<EduAttendanceDeviceGroup>> listDeviceGroup() {
return ResultBean.buildSuccess(eduAttendanceDeviceGroupService.selectGroupAll());
}
@ApiOperation("新增或修改分组")
@PostMapping("/insertGroup")
@ControllerLog(operation = "新增分组")
public ResultBean insertGroup(@ApiParam("分组详细") @RequestBody EduAttendanceDeviceGroup eduAttendanceDeviceGroup) {
eduAttendanceDeviceGroupService.saveOrUpdate(eduAttendanceDeviceGroup);
return ResultBean.buildSuccess();
}
@ApiOperation("删除分组")
@GetMapping("/delGroup")
@ControllerLog(operation = "删除分组")
public ResultBean delGroup(@RequestParam Long id) {
eduAttendanceDeviceGroupService.delGroup(id);
return ResultBean.buildSuccess();
}
@ApiOperation("查询设备与设备组列表")
@GetMapping("/listDeviceAndDeviceGroup")
public ResultBean<List<DeviceOrDeviceGroupVO>> listDeviceAndDevice(String keyword) {
CurrentUser currentUser = FebsUtil.getCurrentUser();
Long schoolId = null;
if (currentUser.getDeptType() == 0) {
schoolId = currentUser.getDeptId();
}
return ResultBean.buildSuccess(eduAttendanceDeviceGroupService.listDeviceAndDevice(keyword, schoolId));
}
@ApiOperation("根据设备组查询设备")
@GetMapping("/listDeviceByGroup")
public ResultBean<List<EduAttendanceDevice>> listDeviceByGroup(Long[] groupIds) {
return ResultBean.buildSuccess(eduAttendanceDeviceGroupService.listDeviceByGroup(Arrays.asList(groupIds)));
}
@ApiOperation("查询设备组列表")
@GetMapping("/listDeviceGroupById")
public ResultBean<List<EduAttendanceDeviceGroup>> listDeviceGroupById(Long[] ids) {
return ResultBean.buildSuccess(ArrayUtil.isNotEmpty(ids) ? eduAttendanceDeviceGroupService.listByIds(Arrays.asList(ids)) :
Collections.EMPTY_LIST);
}
@ApiOperation("批量分组")
@PostMapping("/batchGroup")
@ControllerLog(operation = "批量分组")
public ResultBean batchGroup(@ApiParam("批量分组") @RequestBody List<EduDeviceGroup> list) {
eduDeviceGroupService.insertGroup(list);
return ResultBean.buildSuccess();
}
}
@@ -0,0 +1,63 @@
package com.yida.data.attendance.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yida.data.attendance.dto.InOutPageDTO;
import com.yida.data.attendance.dto.ListRecordDTO;
import com.yida.data.attendance.service.EduAttendanceRecordService;
import com.yida.data.attendance.vo.InOutDormPageVO;
import com.yida.data.attendance.vo.RecordDetailVO;
import com.yida.data.common.core.common.ModuleName;
import com.yida.data.common.core.common.ResultBean;
import com.yida.data.common.core.entity.CurrentUser;
import com.yida.data.common.core.utils.FebsUtil;
import com.yida.data.log.annotation.OperationLog;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "考勤-学生-进出记录")
@RestController
@RequestMapping("/record")
public class EduAttendanceRecordController {
@Resource
private EduAttendanceRecordService eduAttendanceRecordService;
@ApiOperation("分页查询进出记录")
@GetMapping("/listInOutPage")
@OperationLog(module = ModuleName.ATTENDANCE, methods = "分页查询进出记录")
public ResultBean<IPage<InOutDormPageVO>> listInOutPage(InOutPageDTO dto) {
if (dto.getSchoolId() == null) {
CurrentUser currentUser = FebsUtil.getCurrentUser();
if (currentUser.getDeptType() == 0) {
dto.setSchoolId(currentUser.getDeptId());
}
}
return ResultBean.buildSuccess(eduAttendanceRecordService.listInOutPage(dto));
}
@ApiOperation("导出进出记录")
@PostMapping("/exportInOut")
public void exportInOut(@RequestBody InOutPageDTO dto, HttpServletResponse response) {
eduAttendanceRecordService.exportInOut(dto, response);
}
@ApiOperation("查询进出记录详情")
@GetMapping("/getRecordById")
public ResultBean<RecordDetailVO> getRecordById(Long id) {
return ResultBean.buildSuccess(eduAttendanceRecordService.getRecordDetail(id));
}
@ApiOperation("查询进出记录")
@GetMapping("/listRecord")
public ResultBean<List<RecordDetailVO>> listRecord(ListRecordDTO dto) {
return ResultBean.buildSuccess(eduAttendanceRecordService.listRecord(dto));
}
}
@@ -0,0 +1,116 @@
package com.yida.data.attendance.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yida.data.attendance.dto.AttendanceResultPageDTO;
import com.yida.data.attendance.service.EduAttendanceResultService;
import com.yida.data.attendance.vo.AttendanceResultDormVO;
import com.yida.data.attendance.vo.RuleTimeVO;
import com.yida.data.attendance.vo.StayStudentResultVO;
import com.yida.data.common.core.common.ModuleName;
import com.yida.data.common.core.common.ResultBean;
import com.yida.data.common.core.entity.CurrentUser;
import com.yida.data.common.core.entity.attendance.EduAttendanceVerifyDorm;
import com.yida.data.common.core.utils.FebsUtil;
import com.yida.data.log.annotation.OperationLog;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 考勤结果 Controller
*
* @author wjm
* @date 2021-09-15 09:56:24
*/
@Api("考勤-学生-考勤记录")
@Slf4j
@Validated
@RestController
@RequestMapping("/result")
@RequiredArgsConstructor
public class EduAttendanceResultController {
private final EduAttendanceResultService eduAttendanceResultService;
@ApiOperation("查询一栋宿舍楼的考勤数据")
@GetMapping("/listResultByDorm")
public ResultBean<List<StayStudentResultVO>> listResultByDorm(@ApiParam("宿舍楼id") Long dormId,
@ApiParam("日期(yyyy-MM-dd") String date,
@ApiParam("1-午间,2-晚上") Integer time,
@ApiParam("搜索关键词,寝室号/学生姓名") String keyword,
@ApiParam("考勤结果,0-正常,4-晚归,5-异常晚归,6-旷宿") Integer status) {
return ResultBean.buildSuccess(eduAttendanceResultService.listResultByDorm(dormId, date, time, keyword, status));
}
@ApiOperation("查询某个宿舍学生的考勤状况")
@GetMapping("/listStudentResByDormRoom")
public ResultBean<List<StayStudentResultVO>> listStudentResByDormRoom(@ApiParam("寝室id") Long roomId,
@ApiParam("日期(yyyy-MM-dd") String date,
@ApiParam("1-午间,2-晚上") Integer time) {
return ResultBean.buildSuccess(eduAttendanceResultService.listStudentResByDormRoom(roomId, date, time));
}
@ApiOperation("更改某个学生的在寝状态")
@GetMapping("/changeStayStudentStatus")
public ResultBean changeStayStudentStatus(@ApiParam("学生id") Long studentId,
@ApiParam("日期(yyyy-MM-dd") String date,
@ApiParam("1-午间,2-晚上") Integer time,
@ApiParam("将要修改成的状态,0-归寝,1-未归") Integer status) {
eduAttendanceResultService.changeStayStudentStatus(studentId, date, time, status);
return ResultBean.buildSuccess();
}
@ApiOperation("完成某个寝室的查寝")
@PostMapping("/verifyDormRoom")
public ResultBean verifyDormRoom(@RequestBody EduAttendanceVerifyDorm verifyDorm) {
eduAttendanceResultService.verifyDormRoom(verifyDorm);
return ResultBean.buildSuccess();
}
@ApiOperation("分页查询考勤记录")
@GetMapping("/listResultPage")
@OperationLog(module = ModuleName.ATTENDANCE, methods = "分页查询进出记录")
public ResultBean<IPage<AttendanceResultDormVO>> listResultPage(AttendanceResultPageDTO dto) {
if (dto.getSchoolId() == null) {
CurrentUser currentUser = FebsUtil.getCurrentUser();
if (currentUser.getDeptType() == 0) {
dto.setSchoolId(currentUser.getDeptId());
}
}
return ResultBean.buildSuccess(eduAttendanceResultService.listAttendanceResultPage(dto));
}
@ApiOperation("导出考勤记录")
@PostMapping("/exportAttendanceResult")
public void exportAttendanceResult(@RequestBody AttendanceResultPageDTO dto, HttpServletResponse response) {
if (dto.getSchoolId() == null) {
CurrentUser currentUser = FebsUtil.getCurrentUser();
if (currentUser.getDeptType() == 0) {
dto.setSchoolId(currentUser.getDeptId());
}
}
eduAttendanceResultService.exportAttendanceResult(dto, response);
}
@ApiOperation("查询某年级某天校门考勤记录的规则时间列表")
@GetMapping("/listGradeResultTime")
public ResultBean<List<RuleTimeVO>> listGradeResultTime(@ApiParam("年级id") Long gradeId,
@ApiParam("天,yyyy-MM-dd") String date) {
return ResultBean.buildSuccess(eduAttendanceResultService.listGradeResultTime(gradeId, date));
}
}
@@ -0,0 +1,123 @@
package com.yida.data.attendance.controller;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yida.data.attendance.service.EduAttendanceConfigService;
import com.yida.data.attendance.service.EduAttendanceRuleService;
import com.yida.data.attendance.vo.ConflictRuleVO;
import com.yida.data.attendance.vo.RuleListVO;
import com.yida.data.common.core.annotation.ControllerLog;
import com.yida.data.common.core.common.ResultBean;
import com.yida.data.common.core.entity.CurrentUser;
import com.yida.data.common.core.entity.attendance.EduAttendanceConfig;
import com.yida.data.common.core.entity.attendance.EduAttendanceRule;
import com.yida.data.common.core.exception.FebsException;
import com.yida.data.common.core.utils.FebsUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@Api(tags = "考勤-学生-规则")
@RestController
@RequestMapping("/rule")
public class EduAttendanceRuleController {
@Resource
private EduAttendanceRuleService eduAttendanceRuleService;
@Resource
private EduAttendanceConfigService eduAttendanceConfigService;
@ApiOperation("查询规则列表")
@GetMapping("/listRule")
@ControllerLog(operation = "查询规则列表")
public ResultBean<IPage<RuleListVO>> listRule(
@ApiParam("学校id") Long schoolId,
@ApiParam("校区id") Long campusId,
@ApiParam("规则名称") String ruleName,
@ApiParam("规则类型,0-上学,1-归寝") Integer type,
@ApiParam("运行状态,0-运行中,1-停止,2-失效,3-待运行") Integer status,
@ApiParam("运行日期段开始") String startDate,
@ApiParam("运行日期段结束") String endDate,
@ApiParam("当前页码") @RequestParam(defaultValue = "1") Integer pageNum,
@ApiParam("页面大小") @RequestParam(defaultValue = "10") Integer pageSize) {
return ResultBean.buildSuccess(eduAttendanceRuleService.listRulePage(new Page(pageNum, pageSize),
FebsUtil.getCurrentUser(),
schoolId, campusId, ruleName, type, status, startDate, endDate));
}
@ApiOperation("新增、修改规则")
@PostMapping("/saveRule")
@ControllerLog(operation = "新增、修改考勤规则")
public ResultBean saveRule(@RequestBody EduAttendanceRule rule) {
List<ConflictRuleVO> conflict = eduAttendanceRuleService.checkConflict(rule);
if (CollUtil.isNotEmpty(conflict)) {
StringBuilder builder = new StringBuilder();
for (ConflictRuleVO vo : conflict) {
builder.append(vo.getDeptName())
.append("已存在")
.append(vo.getRuleName())
.append("规则")
.append(",");
}
builder.append("上述规则的运行时间与本规则运行时间有重叠,请调整设置。");
throw new FebsException(builder.toString());
}
eduAttendanceRuleService.saveRule(rule);
return ResultBean.buildSuccess();
}
@ApiOperation("校验规则是否冲突")
@PostMapping("/checkConflict")
@ControllerLog(operation = "校验考勤规则是否冲突")
public ResultBean checkConflict(@RequestBody EduAttendanceRule rule) {
return ResultBean.buildSuccess(eduAttendanceRuleService.checkConflict(rule));
}
@ApiOperation("删除规则")
@PostMapping("/delRule")
@ControllerLog(operation = "删除考勤规则")
public ResultBean delRule(@RequestBody List<Long> ruleIds) {
eduAttendanceRuleService.deleteRule(ruleIds);
return ResultBean.buildSuccess();
}
@ApiOperation("改变规则运行状态")
@GetMapping("/changeRuleRun")
@ControllerLog(operation = "改变考勤规则状态")
public ResultBean changeRuleRun(@ApiParam("规则id") @RequestParam Long id) {
eduAttendanceRuleService.changeRuleRun(id);
return ResultBean.buildSuccess();
}
@ApiOperation("查询考勤设置")
@GetMapping("/getConfig")
public ResultBean<EduAttendanceConfig> getConfig() {
Long schoolId = null;
CurrentUser currentUser = FebsUtil.getCurrentUser();
if (currentUser.getDeptType() == 0) {
schoolId = currentUser.getDeptId();
}
EduAttendanceConfig config = eduAttendanceConfigService.getConfig(schoolId);
return ResultBean.buildSuccess(config);
}
@ApiOperation("更改考勤设置")
@PostMapping("/saveConfig")
public ResultBean saveConfig(@RequestBody EduAttendanceConfig config) {
config.setSchoolId(FebsUtil.getCurrentUser().getDeptId());
eduAttendanceConfigService.saveConfig(config);
return ResultBean.buildSuccess();
}
@ApiOperation("查询当前时间能否查寝")
@GetMapping("/getDormAttendanceStatus")
public ResultBean<Boolean> getDormAttendanceStatus(@ApiParam("学校id") Long schoolId,
@ApiParam("1-中午,2-晚上") Integer time) {
return ResultBean.buildSuccess(eduAttendanceConfigService.getDormAttendanceStatus(schoolId, time));
}
}
@@ -0,0 +1,55 @@
package com.yida.data.attendance.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yida.data.attendance.service.EduAttendanceStaffRecordService;
import com.yida.data.attendance.vo.StaffRecordVO;
import com.yida.data.common.core.common.ResultBean;
import com.yida.data.common.core.utils.FebsUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 教职工考勤-进出记录 Controller
*
* @author ccl
* @date 2021-09-27 18:56:19
*/
@Api(tags = "考勤-教职工-进出记录")
@Slf4j
@Validated
@RestController
@RequestMapping("/staffRecord")
@RequiredArgsConstructor
public class EduAttendanceStaffRecordController {
private final EduAttendanceStaffRecordService eduAttendanceStaffRecordService;
@ApiOperation("查询进出记录")
@GetMapping("/findPageStaffRecord")
public ResultBean<IPage<StaffRecordVO>> findPageStaffRecord(@ApiParam("部门id") @RequestParam(required = false) Long deptId,
@ApiParam("职工姓名或手机号") @RequestParam(required = false) String nameOrPhone,
@ApiParam("开始时间") @RequestParam(required = false) String start,
@ApiParam("结束时间") @RequestParam(required = false) String end,
@RequestParam(defaultValue = "10") Long pageSize,
@RequestParam(defaultValue = "1") Long pageNum) {
Page page = new Page();
page.setSize(pageSize);
page.setCurrent(pageNum);
Long schoolId = null;
if (FebsUtil.getCurrentUser().getDeptType() != 5) {
schoolId = FebsUtil.getCurrentUser().getDeptId();
}
return ResultBean
.buildSuccess(eduAttendanceStaffRecordService.findPageStaffRecord(page, deptId, nameOrPhone, start, end, schoolId));
}
}
@@ -0,0 +1,57 @@
package com.yida.data.attendance.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yida.data.attendance.dto.ListStaffResultDTO;
import com.yida.data.attendance.service.EduAttendanceStaffResultService;
import com.yida.data.attendance.vo.ListStaffResultPageVO;
import com.yida.data.attendance.vo.StaffDateTimeResultInfo;
import com.yida.data.attendance.vo.StaffTimeResultInfo;
import com.yida.data.common.core.common.ResultBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 教职工考勤-考勤结果 Controller
*
* @author ZYJ
* @date 2021-09-27 18:56:23
*/
@Api(tags = "考勤-教职工-考勤结果")
@Slf4j
@Validated
@RestController
@RequestMapping("/staffResult")
@RequiredArgsConstructor
public class EduAttendanceStaffResultController {
private final EduAttendanceStaffResultService eduAttendanceStaffResultService;
@ApiOperation("查询各时段考勤结果")
@GetMapping("/listTimeResult")
public ResultBean<List<StaffTimeResultInfo>> listTimeResult(@ApiParam("教职工id") Long staffId,
@ApiParam("日期,yyyy-MM-dd") String date) {
return ResultBean.buildSuccess(eduAttendanceStaffResultService.listTimeResult(staffId, date));
}
@ApiOperation("查询各天各时段考勤结果")
@GetMapping("/listDateTimeResult")
public ResultBean<List<StaffDateTimeResultInfo>> listDateTimeResult(@ApiParam("教职工id") Long staffId,
@ApiParam("年月,yyyy-MM") String yearMonth) {
return ResultBean.buildSuccess(eduAttendanceStaffResultService.listDateTimeResult(staffId, yearMonth));
}
@ApiOperation("分页查询考勤结果列表 ")
@GetMapping("/listResultPage")
public ResultBean<IPage<ListStaffResultPageVO>> listResultPage(ListStaffResultDTO dto) {
return ResultBean.buildSuccess(eduAttendanceStaffResultService.listResultPage(dto));
}
}
@@ -0,0 +1,92 @@
package com.yida.data.attendance.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yida.data.attendance.dto.StaffRuleDTO;
import com.yida.data.attendance.service.EduAttendanceStaffRuleAdminService;
import com.yida.data.attendance.service.EduAttendanceStaffRuleService;
import com.yida.data.attendance.vo.FindStaffRuleVO;
import com.yida.data.attendance.vo.StaffRuleVO;
import com.yida.data.common.core.common.ResultBean;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleAdmin;
import com.yida.data.common.core.utils.FebsUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
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;
/**
* 教职工考勤规则 Controller
*
* @author ccl
* @date 2021-09-27 18:56:21
*/
@Api(tags = "考勤-教职工-规则")
@Slf4j
@Validated
@RestController
@RequestMapping("/staffRule")
@RequiredArgsConstructor
public class EduAttendanceStaffRuleController {
private final EduAttendanceStaffRuleService eduAttendanceStaffRuleService;
private final EduAttendanceStaffRuleAdminService eduAttendanceStaffRuleAdminService;
@ApiOperation("查询规则列表")
@GetMapping("findStaffRuleList")
public ResultBean<IPage<StaffRuleVO>> findStaffRuleList(@ApiParam("规则名称") @RequestParam(required = false) String ruleName,
@ApiParam("管理员名称") @RequestParam(required = false) String staffName,
@RequestParam(defaultValue = "10") Long pageSize,
@RequestParam(defaultValue = "1") Long pageNum) {
IPage iPage = new Page();
iPage.setSize(pageSize);
iPage.setCurrent(pageNum);
Long schoolId = null;
if (FebsUtil.getCurrentUser().getDeptType() != 5) {
schoolId = FebsUtil.getCurrentUser().getDeptId();
}
return ResultBean.buildSuccess(eduAttendanceStaffRuleService.findStaffRuleList(iPage, ruleName, staffName, schoolId));
}
@ApiOperation("查询规则详情")
@GetMapping("findStaffRule")
public ResultBean<FindStaffRuleVO> findStaffRule(@ApiParam("规则id") @RequestParam Long ruleId) {
return ResultBean.buildSuccess(eduAttendanceStaffRuleService.findStaffRule(ruleId));
}
@ApiOperation("新增或修改规则详情")
@PostMapping("saveOrUpStaffRule")
public ResultBean saveOrUpStaffRule(@RequestBody StaffRuleDTO staffRuleDTO) {
eduAttendanceStaffRuleService.saveOrUpStaffRule(staffRuleDTO);
return ResultBean.buildSuccess();
}
@ApiOperation("删除规则")
@PostMapping("removeStaffRule")
public ResultBean removeStaffRule(@ApiParam("规则id") @RequestParam Long ruleId) {
eduAttendanceStaffRuleService.removeStaffRule(ruleId);
return ResultBean.buildSuccess();
}
@ApiOperation("查询当前用户是否是规则管理员")
@GetMapping("/checkStaffAdmin")
public ResultBean<Boolean> checkStaffAdmin(@ApiParam("职工id") Long staffId) {
return ResultBean
.buildSuccess(eduAttendanceStaffRuleAdminService.count(Wrappers.<EduAttendanceStaffRuleAdmin>lambdaQuery()
.eq(EduAttendanceStaffRuleAdmin::getStaffId, staffId)) > 0);
}
}
@@ -0,0 +1,181 @@
package com.yida.data.attendance.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yida.data.attendance.dto.ListResultStatisticsDTO;
import com.yida.data.attendance.dto.StasticStaffExcepByDayDTO;
import com.yida.data.attendance.dto.StasticStaffResultDTO;
import com.yida.data.attendance.service.EduAttendanceStasticService;
import com.yida.data.attendance.vo.CountVO;
import com.yida.data.attendance.vo.RateRankVO;
import com.yida.data.attendance.vo.RateVO;
import com.yida.data.attendance.vo.StaRecordCountVO;
import com.yida.data.attendance.vo.StasticDormResultVO;
import com.yida.data.attendance.vo.StasticStaffExcepByDayVO;
import com.yida.data.attendance.vo.StasticStaffResultByDayVO;
import com.yida.data.attendance.vo.StasticStaffResultByMonthVO;
import com.yida.data.common.core.common.ModuleName;
import com.yida.data.common.core.common.ResultBean;
import com.yida.data.common.core.entity.CurrentUser;
import com.yida.data.common.core.entity.system.Dept;
import com.yida.data.common.core.utils.FebsUtil;
import com.yida.data.log.annotation.OperationLog;
import com.yida.data.system.feign.RemoteDeptService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import java.time.LocalDate;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
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;
@Api(tags = "考勤-考勤统计")
@RestController
@RequestMapping("/stastic")
@RequiredArgsConstructor
public class EduAttendanceStasticController {
private final EduAttendanceStasticService eduAttendanceStasticService;
private final RemoteDeptService remoteDeptService;
@ApiOperation("查询出勤率最高前五,最低前三")
@GetMapping("/stasticRateRank")
@OperationLog(module = ModuleName.ATTENDANCE, methods = "查询出勤率最高前五,最低前三")
public ResultBean<RateRankVO> stasticRateRank(@ApiParam("日期 yyyy-MM-dd") String date,
@RequestParam(required = false) Long schoolId,
@ApiParam("年级id") Long gradeId,
@ApiParam("时段(校门考勤用)") Long timeId) {
if (schoolId == null) {
CurrentUser currentUser = FebsUtil.getCurrentUser();
if (currentUser.getDeptType() == 0) {
schoolId = currentUser.getDeptId();
}
}
return ResultBean.buildSuccess(eduAttendanceStasticService.stasticRateRank(date, schoolId, gradeId, timeId));
}
@ApiOperation("查询各宿舍楼归寝率排名")
@GetMapping("/stasticDormRateRank")
@OperationLog(module = ModuleName.ATTENDANCE, methods = "查询各宿舍楼归寝率排名")
public ResultBean stasticDormRateRank(@ApiParam("日期 yyyy-MM-dd") String date,
@RequestParam Long schoolId,
@ApiParam("时段(宿舍考勤用),1-中午,2-晚上") Integer duration) {
return ResultBean.buildSuccess(eduAttendanceStasticService.stasticDormRateRank(date, schoolId, duration));
}
@ApiOperation("出勤率统计表")
@GetMapping("/listRate")
@OperationLog(module = ModuleName.ATTENDANCE, methods = "出勤率统计表")
public ResultBean<List<RateVO>> listRate(ListResultStatisticsDTO dto) {
if (dto.getSchoolId() == null) {
CurrentUser currentUser = FebsUtil.getCurrentUser();
if (currentUser.getDeptType() == 0) {
dto.setSchoolId(currentUser.getDeptId());
}
}
return ResultBean.buildSuccess(eduAttendanceStasticService.listRate(dto));
}
@ApiOperation("导出出勤率统计表")
@PostMapping("/exportRateList")
@OperationLog(module = ModuleName.ATTENDANCE, methods = "导出出勤率统计表")
public void exportRateList(@RequestBody ListResultStatisticsDTO dto, HttpServletResponse response) {
if (dto.getSchoolId() == null) {
CurrentUser currentUser = FebsUtil.getCurrentUser();
if (currentUser.getDeptType() == 0) {
dto.setSchoolId(currentUser.getDeptId());
}
}
eduAttendanceStasticService.exportRateList(dto, response);
}
@ApiOperation("分宿舍楼统计当日考勤数据")
@GetMapping("/stasticResultGroupByDorm")
public ResultBean<List<StasticDormResultVO>> stasticResultGroupByDorm(@ApiParam("管理人员id(职工id)") Long staffId,
@ApiParam("时间段,(1-中午,2-晚上)") Integer time,
@ApiParam("日期(yyyy-MM-dd") String date) {
return ResultBean
.buildSuccess(eduAttendanceStasticService.stasticResultGroupByDorm(FebsUtil.getTopDeptId(), staffId, time, date));
}
// @ApiOperation("按班级统计当日宿舍考勤数据")
// @GetMapping("/stasticResultGroupByDorm")
// public ResultBean<List<StasticDormResultVO>> stasticResultGroupByDorm(@ApiParam("管理人员id(职工id)") Long staffId,
// @ApiParam("时间段,(1-中午,2-晚上)") Integer time,
// @ApiParam("日期(yyyy-MM-dd") String date) {
// return ResultBean
// .buildSuccess(eduAttendanceStasticService.stasticResultGroupByDorm(FebsUtil.getTopDeptId(), staffId, time, date));
// }
@ApiOperation("分寝室查询当日考勤数据")
@GetMapping("/stasticResultByDormRoom")
public ResultBean<List<StasticDormResultVO>> stasticResultByDormRoom(
@ApiParam("宿舍楼id,不选择时传全部宿舍楼id") @RequestParam(required = false) Long dormId,
@ApiParam("查寝状态,0-未确认,1-已确认") @RequestParam(required = false) Integer verify,
@ApiParam("归寝状态,0-未归寝,1-已归寝") @RequestParam(required = false) Integer status,
@ApiParam("时间段,(1-中午,2-晚上)") Integer time,
@ApiParam("日期(yyyy-MM-dd") String date,
@ApiParam("寝室号排序,0-顺序,1-倒序,默认顺序") @RequestParam(defaultValue =
"0") Integer sort,
@ApiParam("搜索关键词,寝室名/学生名") String keyword) {
return ResultBean
.buildSuccess(eduAttendanceStasticService.stasticResultByDormRoom(dormId, verify, status, time, date, sort,
keyword));
}
@ApiOperation("按日统计教师考勤数据")
@GetMapping("/stasticStaffResultByDay")
public ResultBean<IPage<StasticStaffResultByDayVO>> stasticStaffResultByDay(StasticStaffResultDTO dto) {
return ResultBean.buildSuccess(eduAttendanceStasticService.stasticStaffResultByDay(FebsUtil.getCurrentUser(), dto));
}
@ApiOperation("导出按日统计教师考勤数据")
@PostMapping("/exportStasticStaffResultByDay")
public void exportStasticStaffResultByDay(@RequestBody StasticStaffResultDTO dto,
HttpServletResponse response) {
eduAttendanceStasticService.exportStasticStaffResultByDay(FebsUtil.getCurrentUser(), dto, response);
}
@ApiOperation("按月统计教师考勤数据")
@GetMapping("/stasticStaffResultByMonth")
public ResultBean<IPage<StasticStaffResultByMonthVO>> stasticStaffResultByMonth(StasticStaffResultDTO dto) {
return ResultBean.buildSuccess(eduAttendanceStasticService.stasticStaffResultByMonth(FebsUtil.getCurrentUser(), dto));
}
@ApiOperation("导出按日统计教师考勤数据")
@PostMapping("/exportStasticStaffResultByMonth")
public void exportStasticStaffResultByMonth(@RequestBody StasticStaffResultDTO dto,
HttpServletResponse response) {
eduAttendanceStasticService.exportStasticStaffResultByMonth(FebsUtil.getCurrentUser(), dto, response);
}
@ApiOperation("按日期段查询具体教职工异常信息")
@GetMapping("/stasticStaffExcepByDay")
public ResultBean<StasticStaffExcepByDayVO> stasticStaffExcepByDay(StasticStaffExcepByDayDTO dto) {
return ResultBean.buildSuccess(eduAttendanceStasticService.stasticStaffExcepByDay(dto));
}
@ApiOperation("查询管理范围内各异常类型人数")
@GetMapping("/countRangeExcepStaff")
public ResultBean<CountVO> countRangeExcepStaff(StasticStaffExcepByDayDTO dto) {
return ResultBean.buildSuccess(eduAttendanceStasticService.countRangeExcepStaff(dto));
}
@ApiOperation("dashboard-考勤概况")
@GetMapping("/staRecordCount")
public ResultBean<StaRecordCountVO> staRecordCount(@ApiParam("yyyy-MM-dd") String startDate,
@ApiParam("yyyy-MM-dd") String endDate) {
List<Long> schoolIds = remoteDeptService.getSchoolByArea(null, null).getData().stream().map(Dept::getDeptId)
.collect(Collectors.toList());
return ResultBean.buildSuccess(eduAttendanceStasticService.staRecordCount(LocalDate.parse(startDate), LocalDate.parse(endDate), schoolIds));
}
}
@@ -0,0 +1,42 @@
package com.yida.data.attendance.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.yida.data.attendance.service.EduAttendanceDeviceService;
import com.yida.data.common.core.common.ResultBean;
import com.yida.data.common.core.entity.attendance.EduAttendanceDevice;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "考勤-设备(不鉴权)")
@RestController
@RequestMapping("/in/device")
public class InEduAttendanceDeviceController {
@Resource
private EduAttendanceDeviceService eduAttendanceDeviceService;
@GetMapping("/listDeviceByType")
public ResultBean<List<EduAttendanceDevice>> listDeviceByType(String type) {
return ResultBean.buildSuccess(eduAttendanceDeviceService.list(
Wrappers.lambdaQuery(new EduAttendanceDevice()).eq(EduAttendanceDevice::getDeviceType, type)));
}
@ApiOperation("更新设备在线状态")
@GetMapping("/updateDeviceStatus")
public ResultBean updateDeviceStatus() {
eduAttendanceDeviceService.updateDeviceStatus();
return ResultBean.buildSuccess();
}
@ApiOperation("校时所有设备")
@GetMapping("/timingAllDevice")
public ResultBean timingAllDevice() {
eduAttendanceDeviceService.timingAllDevice();
return ResultBean.buildSuccess();
}
}
@@ -0,0 +1,34 @@
package com.yida.data.attendance.controller;
import com.yida.data.attendance.service.EduAttendanceNoticeService;
import com.yida.data.common.core.common.ResultBean;
import com.yida.data.common.core.entity.attendance.EduAttendanceNotice;
import io.swagger.annotations.Api;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
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;
@Api(tags = "考勤-学生-通知(不鉴权)")
@RestController
@RequestMapping("/in/notice")
public class InEduAttendanceNoticeController {
@Resource
private EduAttendanceNoticeService eduAttendanceNoticeService;
@PostMapping("/saveNotice")
public ResultBean saveNotice(@RequestBody EduAttendanceNotice notice) {
eduAttendanceNoticeService.save(notice);
return ResultBean.buildSuccess();
}
@GetMapping("/sendNotice")
public ResultBean sendNotice(@RequestParam Long id) {
eduAttendanceNoticeService.sendNotice(id);
return ResultBean.buildSuccess();
}
}
@@ -0,0 +1,52 @@
package com.yida.data.attendance.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.yida.data.attendance.service.EduAttendanceResultService;
import com.yida.data.common.core.common.ResultBean;
import com.yida.data.common.core.entity.attendance.EduAttendanceResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "考勤-学生-考勤记录(不鉴权)")
@RestController
@RequestMapping("/in/result")
@RequiredArgsConstructor
public class InEduAttendanceResultController {
private final EduAttendanceResultService eduAttendanceResultService;
@ApiOperation("检测并发送未到消息")
@GetMapping("/pushNotArriveMsg")
public ResultBean pushNotArriveMsg() {
eduAttendanceResultService.pushNotArriveMsg();
return ResultBean.buildSuccess();
}
@ApiOperation("处理考勤记录")
@GetMapping("/dealAttendanceResult")
public ResultBean dealAttendanceResult() {
eduAttendanceResultService.dealAttendanceResult();
return ResultBean.buildSuccess();
}
@ApiModelProperty("确认未到记录")
@GetMapping("/confirmNotArrive")
public ResultBean confirmNotArrive(@ApiParam("id") Long id) {
eduAttendanceResultService.update(Wrappers.<EduAttendanceResult>lambdaUpdate().eq(EduAttendanceResult::getId, id)
.set(EduAttendanceResult::getNotArriveConfirm, 1));
return ResultBean.buildSuccess();
}
@ApiOperation("查询未到记录是否已经确认")
@GetMapping("/checkResult")
public ResultBean<Boolean> checkResult(Long id) {
EduAttendanceResult result = eduAttendanceResultService.getById(id);
return ResultBean.buildSuccess(result.getNotArriveConfirm() == 1);
}
}
@@ -0,0 +1,26 @@
package com.yida.data.attendance.controller;
import com.yida.data.attendance.service.EduAttendanceRuleService;
import com.yida.data.common.core.common.ResultBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "考勤-学生-考勤规则(不鉴权)")
@RestController
@RequiredArgsConstructor
@RequestMapping("/in/rule")
public class InEduAttendanceRuleController {
private final EduAttendanceRuleService eduAttendanceRuleService;
@ApiOperation("更新规则状态")
@GetMapping("/updateRuleStatus")
public ResultBean updateRuleStatus() {
eduAttendanceRuleService.updateRuleStatus();
return ResultBean.buildSuccess();
}
}
@@ -0,0 +1,38 @@
package com.yida.data.attendance.controller;
import com.yida.data.attendance.service.EduAttendanceStaffRecordService;
import com.yida.data.attendance.service.EduAttendanceStaffRuleRemindService;
import com.yida.data.common.core.common.ResultBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author ccl
*/
@Api(tags = "考勤-教职工-考勤记录(不鉴权)")
@RestController
@RequiredArgsConstructor
@RequestMapping("/in/staffRecord")
public class InEduAttendanceStaffRecordController {
private final EduAttendanceStaffRecordService eduAttendanceStaffRecordService;
private final EduAttendanceStaffRuleRemindService eduAttendanceStaffRuleRemindService;
@ApiOperation("处理记录到结果表")
@GetMapping("/staffRecord")
public ResultBean staffRecord() {
eduAttendanceStaffRecordService.staffRecord();
return ResultBean.buildSuccess();
}
@ApiOperation("提醒打卡")
@GetMapping("/remindStaff")
public ResultBean remindStaff() {
eduAttendanceStaffRuleRemindService.remindStaff();
return ResultBean.buildSuccess();
}
}
@@ -0,0 +1,29 @@
package com.yida.data.attendance.controller.h5;
import com.yida.data.attendance.dto.ListRecordDTO;
import com.yida.data.attendance.service.EduAttendanceRecordService;
import com.yida.data.attendance.vo.RecordDetailVO;
import com.yida.data.common.core.common.ResultBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "考勤-前台-进出记录")
@RequiredArgsConstructor
@RestController
@RequestMapping("/h5/record")
public class H5EduAttendanceRecordController {
private final EduAttendanceRecordService eduAttendanceRecordService;
@ApiOperation("查询进出记录")
@GetMapping("/listRecord")
public ResultBean<List<RecordDetailVO>> listRecord(ListRecordDTO dto) {
return ResultBean.buildSuccess(eduAttendanceRecordService.listRecord(dto));
}
}
@@ -0,0 +1,28 @@
package com.yida.data.attendance.controller.h5;
import com.yida.data.attendance.dto.ListStudentResultDTO;
import com.yida.data.attendance.service.EduAttendanceResultService;
import com.yida.data.attendance.vo.ResultDetailVO;
import com.yida.data.common.core.common.ResultBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "考勤-前台-考勤记录")
@RequiredArgsConstructor
@RestController
@RequestMapping("/h5/result")
public class H5EduAttendanceResultController {
private final EduAttendanceResultService eduAttendanceResultService;
@ApiOperation("查询考勤记录")
@GetMapping("/listStudentResult")
public ResultBean<List<ResultDetailVO>> listStudentResult(ListStudentResultDTO dto) {
return ResultBean.buildSuccess(eduAttendanceResultService.listStudentResultDetail(dto));
}
}
@@ -0,0 +1,30 @@
package com.yida.data.attendance.controller.h5;
import com.yida.data.attendance.service.EduAttendanceRuleTimeService;
import com.yida.data.attendance.vo.RuleTimeVO;
import com.yida.data.common.core.common.ResultBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import java.time.LocalDate;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "考勤-前台-考勤记录")
@RequiredArgsConstructor
@RestController
@RequestMapping("/h5/ruleTime")
public class H5EduAttendanceRuleController {
private final EduAttendanceRuleTimeService eduAttendanceRuleTimeService;
@ApiOperation("查询班级某天匹配的规则时间")
@GetMapping("/listDeptRuleTime")
public ResultBean<List<RuleTimeVO>> listDeptRuleTime(Long deptId, @ApiParam("日期,yyyy-MM-dd") String date,
@ApiParam("规则类型,0-校门,1-宿舍") Integer type) {
return ResultBean.buildSuccess(eduAttendanceRuleTimeService.listDeptRuleTime(deptId, LocalDate.parse(date), type));
}
}
@@ -0,0 +1,60 @@
package com.yida.data.attendance.controller.h5;
import com.yida.data.attendance.service.EduAttendanceStasticService;
import com.yida.data.attendance.vo.CountVO;
import com.yida.data.attendance.vo.TeacherStasticVO;
import com.yida.data.common.core.common.ModuleName;
import com.yida.data.common.core.common.ResultBean;
import com.yida.data.common.core.entity.user.EduStudent;
import com.yida.data.log.annotation.OperationLog;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import java.time.LocalDate;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "考勤-前台-家长考勤统计")
@RequiredArgsConstructor
@RestController
@RequestMapping("/h5/statistics")
public class H5EduAttendanceStatisticsController {
private final EduAttendanceStasticService eduAttendanceStasticService;
@ApiOperation("统计学生出勤次数")
@GetMapping("/countStudentAttendance")
@OperationLog(module = ModuleName.ATTENDANCE, methods = "统计学生出勤次数")
public ResultBean<CountVO> countStudentAttendance(Long studentId, String startDate, String endDate) {
return ResultBean.buildSuccess(
eduAttendanceStasticService.countStudentAttendance(studentId, LocalDate.parse(startDate), LocalDate.parse(endDate)));
}
@ApiOperation("统计某班出勤数据")
@GetMapping("/statisticsClass")
@OperationLog(module = ModuleName.ATTENDANCE, methods = "统计某班出勤数据")
public ResultBean<TeacherStasticVO> statisticsClass(Long classId,
@ApiParam("日期,yyyy-MM-dd (和月必传一个)") @RequestParam(required = false) String date,
@ApiParam("月,yyyy-MM(和日期必传一个)") @RequestParam(required = false) String month,
@RequestParam(required = false) @ApiParam("时段id,按月统计不传") Long timeId) {
return ResultBean.buildSuccess(eduAttendanceStasticService.statisticsClass(classId, date, month, timeId));
}
@ApiOperation("统计班级宿舍考勤")
@GetMapping("/statisticsClassDormAtt")
@OperationLog(module = ModuleName.ATTENDANCE, methods = "统计班级宿舍考勤")
public ResultBean<List<EduStudent>> statisticsClassDormAtt(@ApiParam("学校ID") @RequestParam(required = true) Long schoolId,
@ApiParam("班级ID") @RequestParam(required = true) Long classId,
@ApiParam("日期") @RequestParam(required = true) String date,
@ApiParam("考勤时段,1=午间考勤,2=晚间考勤") @RequestParam(required = false) Integer time) {
return ResultBean.buildSuccess(eduAttendanceStasticService.getStudentDormInfo(schoolId, classId, date, time));
}
}
@@ -0,0 +1,30 @@
package com.yida.data.attendance.controller.out;
import com.yida.data.attendance.service.EduAttendanceDeviceService;
import com.yida.data.attendance.vo.OnlineCountVO;
import com.yida.data.common.core.common.ResultBean;
import com.yida.data.common.core.entity.system.Dept;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "考勤-设备", value = "考勤")
@RestController
@RequestMapping("/out/device")
@RequiredArgsConstructor
public class OutEduAttendanceDeviceController {
private final EduAttendanceDeviceService eduAttendanceDeviceService;
@ApiOperation("获取面板机状态分布")
@GetMapping("/getOnlineDistrib")
public ResultBean<OnlineCountVO> getOnlineDistrib(Long[] schoolIds) {
return ResultBean.buildSuccess(eduAttendanceDeviceService.getOnlineDistrib(Arrays.asList(schoolIds)));
}
}
@@ -0,0 +1,44 @@
package com.yida.data.attendance.controller.out;
import com.yida.data.attendance.service.EduAttendanceManagePushResultService;
import com.yida.data.attendance.service.EduAttendanceStasticService;
import com.yida.data.attendance.vo.StaRecordCountVO;
import com.yida.data.common.core.common.ResultBean;
import com.yida.data.common.core.entity.attendance.EduAttendanceResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;
@Api(tags = "考勤-考勤统计")
@RestController
@RequestMapping("/out/stastic")
@RequiredArgsConstructor
public class OutEduAttendanceStasticController {
private final EduAttendanceStasticService eduAttendanceStasticService;
private final EduAttendanceManagePushResultService eduAttendanceManagePushResultService;
@ApiOperation("dashboard-考勤概况")
@GetMapping("/staRecordCount")
public ResultBean<StaRecordCountVO> staRecordCount(@ApiParam("yyyy-MM-dd") String startDate,
@ApiParam("yyyy-MM-dd") String endDate, Long[] schoolIds) {
return ResultBean
.buildSuccess(eduAttendanceStasticService.staRecordCount(LocalDate.parse(startDate), LocalDate.parse(endDate),
Arrays.asList(schoolIds)));
}
@ApiOperation("查询归寝报告")
@GetMapping("/selectPushList")
public ResultBean<List<EduAttendanceResult>> selectPushList(@RequestParam Long pushId) {
return ResultBean.buildSuccess(eduAttendanceManagePushResultService.selectPushList(pushId));
}
}
@@ -0,0 +1,7 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceConfig;
public interface EduAttendanceConfigMapper extends BaseMapper<EduAttendanceConfig> {
}
@@ -0,0 +1,28 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yida.data.common.core.entity.attendance.EduAttendanceDevice;
import com.yida.data.common.core.entity.attendance.EduAttendanceDeviceGroup;
import com.yida.data.attendance.vo.DeviceOrDeviceGroupVO;
import java.util.List;
import org.apache.ibatis.annotations.Param;
/**
* 设备分组表 Mapper
*
* @author zhanghaijun
* @date 2021-06-16 15:27:11
*/
public interface EduAttendanceDeviceGroupMapper extends BaseMapper<EduAttendanceDeviceGroup> {
List<DeviceOrDeviceGroupVO> listDeviceAndGroup(@Param("keyword") String keyword,
@Param("schoolId") Long schoolId);
List<EduAttendanceDevice> listDeviceByGroup(@Param("groupIds") List<Long> groupIds);
IPage<EduAttendanceDeviceGroup> selectGroup(Page<EduAttendanceDeviceGroup> page,
@Param("name") String name,
@Param("schoolIds") List<Long> schoolId);
}
@@ -0,0 +1,35 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yida.data.attendance.vo.DeviceVO;
import com.yida.data.common.core.entity.attendance.EduAttendanceDevice;
import com.yida.data.attendance.dto.DevicePage;
import java.util.List;
import java.util.Set;
import org.apache.ibatis.annotations.Param;
public interface EduAttendanceDeviceMapper extends BaseMapper<EduAttendanceDevice> {
DevicePage<DeviceVO> listDevicePage(@Param("page") Page page,
@Param("schoolIds") List<Long> schoolIds,
@Param("number") String number,
@Param("scope") Integer scope,
@Param("type") Integer type,
@Param("state") Integer state);
void updateDevice(@Param("operation") Integer operation,
@Param("type") String type,
@Param("aliveDeviceSn") Set<String> aliveDeviceSn);
/**
* 根据学校id和状态查询考勤设备数量统计
*
* @param schoolIds 学校id集合
* @param state 考勤设备状态
* @return java.lang.Long
* @author ZYJ
* @date 2021/10/9 13:36
*/
Long findDeviceNumber(@Param("schoolIds") List<Long> schoolIds, @Param("state") Integer state);
}
@@ -0,0 +1,7 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceDeviceRule;
public interface EduAttendanceDeviceRuleMapper extends BaseMapper<EduAttendanceDeviceRule> {
}
@@ -0,0 +1,14 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceManagePushResult;
/**
* 管理考勤结果推送记录 mapper
*
* @author ZYJ
* @date 2022/7/15
*/
public interface EduAttendanceManagePushResultMapper extends BaseMapper<EduAttendanceManagePushResult> {
}
@@ -0,0 +1,18 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceNotArrive;
import org.apache.ibatis.annotations.Param;
public interface EduAttendanceNotArriveMapper extends BaseMapper<EduAttendanceNotArrive> {
/**
* 查询是否存在
*/
Integer existNotArrive(@Param("studentId") Long studentId);
/**
* 查询上一次最新的未到记录
*/
EduAttendanceNotArrive getLast(@Param("studentId") Long studentId);
}
@@ -0,0 +1,7 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceNotice;
public interface EduAttendanceNoticeMapper extends BaseMapper<EduAttendanceNotice> {
}
@@ -0,0 +1,111 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yida.data.attendance.dto.ListRecordDTO;
import com.yida.data.attendance.vo.AttendanceResultVO;
import com.yida.data.attendance.vo.CountVO;
import com.yida.data.attendance.vo.InOutDormPageVO;
import com.yida.data.attendance.vo.RecordDetailVO;
import com.yida.data.common.core.entity.attendance.EduAttendanceRecord;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import com.yida.data.common.core.entity.attendance.EduAttendanceRule;
import org.apache.ibatis.annotations.Param;
public interface EduAttendanceRecordMapper extends BaseMapper<EduAttendanceRecord> {
List<InOutDormPageVO> listInOut(Page page,
@Param("studentIds") List<Long> studentIds,
@Param("zone") Integer zone,
@Param("startTime") LocalDateTime startTime,
@Param("endTime") LocalDateTime endTime);
IPage<AttendanceResultVO> listAttendanceResultPage(Page page,
@Param("studentIds") List<Long> studentIds,
@Param("ruleId") Long ruleId,
@Param("date") LocalDate date);
List<AttendanceResultVO> listAttendanceResult(@Param("studentIds") List<Long> studentIds,
@Param("ruleId") Long ruleId,
@Param("date") LocalDate date);
List<RecordDetailVO> listRecordDetail(@Param("userId") Long userId,
@Param("date") String date);
RecordDetailVO getRecordDetail(Long id);
/**
* 查询时间段内最后一条记录
*
* @param startTime
* @param endTime
* @param type 0-进入,1-离开
* @return
*/
EduAttendanceRecord getLastRecordByTime(@Param("startTime") LocalDateTime startTime,
@Param("endTime") LocalDateTime endTime,
@Param("type") Integer type,
@Param("studentId") Long studentId);
/**
* 统计时段内迟到早退记录条数
*
* @param startTime
* @param endTime
* @return
*/
CountVO countLateAndLeave(
@Param("startTime") LocalDateTime startTime,
@Param("endTime") LocalDateTime endTime,
@Param("userId") Long userId);
List<RecordDetailVO> listRecord(@Param("dto") ListRecordDTO dto);
/**
* @param startTime 规则开始时间
* @param endTime 规则结束时间
* @param nowDate 当前时间
* @param studentId 学生ID
* @param type 统计类型:0=正常打卡人数,1=迟到人数/晚归人数,2:旷课人数/旷宿人数,3:早退人数,4:请假人数
* @return
*/
Integer stasticTeacherData(@Param("startTime") LocalDateTime startTime,
@Param("endTime") LocalDateTime endTime,
@Param("nowDate") LocalDateTime nowDate,
@Param("studentId") Long studentId,
@Param("type") Integer type);
EduAttendanceRecord getFirstByStudentIdAndRuleTimeId(@Param("studentId") Long studentId,
@Param("ruleTimeId") Long ruleTimeId,
@Param("date") String date,
@Param("deviceIdList") List<Long> deviceIdList);
EduAttendanceRecord getLastByStudentIdAndRuleTimeId(@Param("studentId") Long studentId,
@Param("ruleTimeId") Long ruleTimeId,
@Param("date") String date,
@Param("deviceIdList") List<Long> deviceIdList);
List<EduAttendanceRecord> getRecordByStudentIdAndMonth(@Param("studentId") Long studentId,
@Param("month") String month,
@Param("status") Integer status);
EduAttendanceRecord getDormLastByStudentIdAndRuleTimeId(@Param("studentId") Long studentId,
@Param("date") String date);
EduAttendanceRecord getDormFirstByStudentIdAndRuleTimeId(@Param("studentId") Long studentId,
@Param("date") String date);
}
@@ -0,0 +1,179 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yida.data.attendance.dto.ListStudentResultDTO;
import com.yida.data.attendance.vo.*;
import com.yida.data.common.core.entity.attendance.EduAttendanceResult;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* 考勤结果 Mapper
*
* @author wjm
* @date 2021-09-15 09:56:24
*/
public interface EduAttendanceResultMapper extends BaseMapper<EduAttendanceResult> {
/**
* 查询宿舍楼异常状态人数
*
* @param dormId 宿舍楼id
* @param date 日期
* @param time 0-中午,1-晚上
* @param time 0-中午,1-晚上
*/
StasticDormResultVO countDormLate(@Param("dormId") Long dormId,
@Param("date") String date,
@Param("time") Integer time);
/**
* 统计寝室在寝人数
*
* @param roomId 寝室id
* @param date 日期
*/
Integer countDormStay(@Param("roomId") Long roomId,
@Param("date") String date);
/**
* 查询考勤记录
*
* @param roomIds 寝室id
* @param studentIds 学生id
* @param date 日期
* @param schoolId 学校
* @param campusId 校区
* @param gradeId 年级
* @param classId 班级
* @param timeId 考勤时段id
* @param time 1-中午,2-晚上
* @param type 0-走读,1-住宿
* @return
*/
List<EduAttendanceResult> listStudentResult(@Param("roomIds") List<Long> roomIds,
@Param("studentIds") List<Long> studentIds,
@Param("date") LocalDate date,
@Param("schoolId") Long schoolId,
@Param("campusId") Long campusId,
@Param("gradeId") Long gradeId,
@Param("classId") Long classId,
@Param("timeId") Long timeId,
@Param("time") Integer time,
@Param("type") Integer type,
@Param("status") Integer status);
/**
* 该寝室是否已核查
*
* @param roomId
* @param date
* @param time
* @return 1已核查,0未核查
*/
Integer isVerify(@Param("roomId") Long roomId,
@Param("date") LocalDate date,
@Param("time") Integer time);
List<AttendanceResultDormVO> listAttendanceResult(Page page,
@Param("studentIds") List<Long> studentIds,
@Param("ruleId") Long ruleId,
@Param("startDate") LocalDate startDate,
@Param("endDate") LocalDate endDate);
/**
* 查询是否存在记录
*
* @param userId
* @param date
* @param timeId
* @return 1存在,null不存在
*/
Integer existResult(@Param("userId") Long userId,
@Param("date") LocalDate date,
@Param("timeId") Long timeId);
List<ResultDetailVO> findResult(@Param("userId") Long userId,
@Param("date") LocalDate date,
@Param("timeId") Long timeId);
/**
* 查询需要推送的未到记录
*
* @param compareTime 用来比较的时间
* @param schoolId 学校id
* @return
*/
List<EduAttendanceResult> listPushNotArrive(@Param("compareTime") LocalDateTime compareTime,
@Param("schoolId") Long schoolId);
/**
* 查询校门年级某天 考勤时间段
*
* @param gradeId
* @param date
* @return
*/
List<RuleTimeVO> listGradeResultTime(@Param("gradeId") Long gradeId,
@Param("date") String date);
/**
* 统计各考勤结果数量
*/
CountVO countStudentAttendance(@Param("studentId") Long studentId,
@Param("schoolIds") List<Long> schoolIds,
@Param("startDate") LocalDate startDate,
@Param("endDate") LocalDate endDate);
/**
* 查询学生考勤记录
*
* @param dto
* @return
*/
List<ResultDetailVO> listStudentResultDetail(@Param("dto") ListStudentResultDTO dto,
@Param("studentIds") List<Long> studentIds);
/**
* 查询学生考勤次数
*
* @param studentIds 学生id
* @param timeId 时段id
* @param date 日期
* @param type 考勤结果类型
* @return 符合条件的学生id列表 为去重 大小为考勤次数
*/
List<ResultDetailVO> listResultStudent(@Param("studentIds") List<Long> studentIds,
@Param("timeId") Long timeId,
@Param("date") String date,
@Param("month") String month,
@Param("type") Integer type);
/**
* 查询学生中的到校人数
*/
Integer countRealStudentNum(@Param("studentIds") List<Long> studentIds,
@Param("timeId") Long timeId,
@Param("date") String date);
/**
* 查询需要推送给管理员的记录
*
* @param compareTime 用来比较的时间
* @param schoolId 学校id
* @param status 管理员重复推送状态
* @return java.util.List<com.yida.data.common.core.entity.attendance.EduAttendanceResult>
* @author ZYJ
* @date 2022/7/14 16:41
*/
List<EduAttendanceResult> listManagePushNotArrive(@Param("compareTime") LocalDateTime compareTime,
@Param("schoolId") Long schoolId,
@Param("status") String status);
}
@@ -0,0 +1,13 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceRuleDate;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface EduAttendanceRuleDateMapper extends BaseMapper<EduAttendanceRuleDate> {
void validateNormalRuleDate(@Param("deptIds") List<Integer> deptIds,
@Param("month") List<Integer> month);
}
@@ -0,0 +1,7 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceRuleDept;
public interface EduAttendanceRuleDeptMapper extends BaseMapper<EduAttendanceRuleDept> {
}
@@ -0,0 +1,7 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceRuleDevice;
public interface EduAttendanceRuleDeviceMapper extends BaseMapper<EduAttendanceRuleDevice> {
}
@@ -0,0 +1,66 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yida.data.common.core.entity.attendance.EduAttendanceRule;
import com.yida.data.common.core.entity.attendance.EduAttendanceRuleDate;
import com.yida.data.common.core.entity.attendance.EduAttendanceRuleTime;
import com.yida.data.attendance.vo.ConflictRuleVO;
import com.yida.data.attendance.vo.RuleListVO;
import java.time.LocalDate;
import java.util.List;
import org.apache.ibatis.annotations.Param;
public interface EduAttendanceRuleMapper extends BaseMapper<EduAttendanceRule> {
IPage<RuleListVO> listRulePage(
Page page,
@Param("schoolId") Long schoolId,
@Param("campusId") Long campusId,
@Param("ruleName") String ruleName,
@Param("type") Integer type,
@Param("status") Integer status,
@Param("startDate") String startDate,
@Param("endDate") String endDate);
List<ConflictRuleVO> checkNormalRule(@Param("deptIds") List<Long> deptIds,
@Param("date") List<EduAttendanceRuleDate> date,
@Param("time") List<EduAttendanceRuleTime> time,
@Param("type") Integer type,
@Param("ruleId") Long ruleId);
List<RuleListVO> listValidRule(@Param("deptIds") List<Long> deptIds,
@Param("date") LocalDate date,
@Param("dayOfWeek") Integer dayOfWeek,
@Param("type") Integer type,
@Param("deviceSn") String deviceSn,
@Param("schoolId") Long schoolId);
void updateRuleStatus(@Param("now") LocalDate now,
@Param("status") Integer status);
/**
* 查询到期的规则
*
* @param now
* @return
*/
List<Long> listExpireRule(@Param("now") LocalDate now);
/**
* 查询将要启动的规则
*
* @param now
* @return
*/
List<Long> listNotStartRule(@Param("now") LocalDate now);
/**
* 查询当前时间段将要过期,下一段时间段未到的规则
*/
List<Long> listWillStartRule(@Param("now") LocalDate now);
}
@@ -0,0 +1,20 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceRuleTime;
import com.yida.data.attendance.vo.RuleTimeVO;
import java.time.LocalDate;
import java.util.List;
import org.apache.ibatis.annotations.Param;
/**
* 考勤规则 考勤时间 Mapper
*
* @author zhanghaijun
* @date 2021-06-25 09:51:00
*/
public interface EduAttendanceRuleTimeMapper extends BaseMapper<EduAttendanceRuleTime> {
List<RuleTimeVO> listDeptRuleTime(@Param("deptIds") List<Long> deptIds,
@Param("date") LocalDate date, @Param("week") Integer week, @Param("type") Integer type);
}
@@ -0,0 +1,130 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yida.data.attendance.vo.StaffRecordVO;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRecord;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* 教职工考勤-进出记录 Mapper
*
* @author ZYJ
* @date 2021-09-27 18:56:19
*/
public interface EduAttendanceStaffRecordMapper extends BaseMapper<EduAttendanceStaffRecord> {
/**
* 查询进出记录列表
*
* @param page
* @param schoolId
* @param start
* @param end
* @param staffId
* @return
*/
IPage<StaffRecordVO> findPageStaffRecord(@Param("page") Page page,
@Param("schoolId") Long schoolId,
@Param("start") String start,
@Param("end") String end,
@Param("staffId") List<Long> staffId);
/**
* 查询时间最近的一条进记录
*
* @param staffId
* @return
*/
EduAttendanceStaffRecord finMaxRecord(@Param("staffId") Long staffId, @Param("atDate") LocalDateTime atDate);
/**
* 查询时间最近的一条出记录
*
* @param staffId
* @return
*/
EduAttendanceStaffRecord finMinRecord(@Param("staffId") Long staffId, @Param("endStiTime") LocalDateTime endStiTime);
/**
* 查询开始时间后第一条进记录
*
* @param staffId
* @param startStiTime
* @return
*/
EduAttendanceStaffRecord finMinInRecord(@Param("staffId") Long staffId, @Param("startStiTime") LocalDateTime startStiTime);
/**
* 查询结束时间最近的一条记录
*
* @param staffId
* @param endStiTime
* @return
*/
EduAttendanceStaffRecord findMinOutRecord(@Param("staffId") Long staffId, @Param("endStiTime") LocalDateTime endStiTime);
EduAttendanceStaffRecord findMaxOutRecord(@Param("staffId") Long staffId, @Param("startStiTime") LocalDateTime startStiTime);
/**
* 是否有出的记录
*
* @param staffId
* @param startStiTime
* @return
*/
List<EduAttendanceStaffRecord> findOutRecord(@Param("staffId") Long staffId,
@Param("startStiTime") LocalDateTime startStiTime);
/**
* 查询中间是否有进入的记录
*
* @param staffId
* @param startStiTime
* @param endStiTime
* @return
*/
List<EduAttendanceStaffRecord> findInRecord(@Param("staffId") Long staffId, @Param("startStiTime") LocalDateTime startStiTime,
@Param("endStiTime") LocalDateTime endStiTime);
/**
* 查询进入的记录
*
* @param staffId
* @param startStiTime
* @param endStiTime
* @return
*/
EduAttendanceStaffRecord fintRecord(@Param("staffId") Long staffId, @Param("startStiTime") LocalDateTime startStiTime,
@Param("endStiTime") LocalDateTime endStiTime);
/**
* 查询前一天的最后一次通行记录
*
* @param staffId 职工id
* @param lastDay 前一天日期
* @return com.yida.data.common.core.entity.attendance.EduAttendanceStaffRecord
* @author ZYJ
* @date 2022/9/13 19:55
*/
EduAttendanceStaffRecord findLastDayLastRecord(@Param("staffId") Long staffId, @Param("lastDay") LocalDate lastDay);
/**
* 查询指定时间段是否有通行记录
*
* @return com.yida.data.common.core.entity.attendance.EduAttendanceStaffRecord
* @author ZYJ
* @date 2022/10/27 11:05
*/
EduAttendanceStaffRecord findTimeStaffRecord(@Param("ruleId") Long ruleId, @Param("ruleTimeId") Long ruleTimeId,
@Param("startTime") LocalDateTime startTime,
@Param("endTime") LocalDateTime endTime);
}
@@ -0,0 +1,89 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yida.data.attendance.dto.ListStaffResultDTO;
import com.yida.data.attendance.dto.StasticStaffExcepByDayDTO;
import com.yida.data.attendance.dto.StasticStaffResultDTO;
import com.yida.data.attendance.vo.CountVO;
import com.yida.data.attendance.vo.ListStaffResultPageVO;
import com.yida.data.attendance.vo.StaffDateTimeResultInfo;
import com.yida.data.attendance.vo.StaffTimeResultInfo;
import com.yida.data.attendance.vo.StasticStaffResultByDayVO;
import com.yida.data.attendance.vo.StasticStaffResultByMonthVO;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffResult;
import java.util.List;
import org.apache.ibatis.annotations.Param;
/**
* 教职工考勤-考勤结果 Mapper
*
* @author ZYJ
* @date 2021-09-27 18:56:23
*/
public interface EduAttendanceStaffResultMapper extends BaseMapper<EduAttendanceStaffResult> {
IPage<StasticStaffResultByDayVO> listStaffResultStasticDayPage(Page page,
@Param("dto") StasticStaffResultDTO dto,
@Param("staffIds") List<Long> staffIds);
List<StasticStaffResultByDayVO> listStaffResultStasticDay(@Param("dto") StasticStaffResultDTO dto,
@Param("staffIds") List<Long> staffIds);
IPage<StasticStaffResultByMonthVO> listStaffResultStasticMonthPage(Page page,
@Param("dto") StasticStaffResultDTO dto,
@Param("staffIds") List<Long> staffIds);
List<StasticStaffResultByMonthVO> listStaffResultStasticMonth(@Param("dto") StasticStaffResultDTO dto,
@Param("staffIds") List<Long> staffIds);
/**
* 查询考勤结果列表
*
* @param staffId
* @param date
* @return
*/
List<StaffTimeResultInfo> listTimeResult(@Param("staffId") Long staffId, @Param("date") String date);
/**
* 查询各天各时段考勤结果
*
* @param staffId
* @param yearMonth
* @return
*/
List<StaffDateTimeResultInfo> listDateTimeResult(@Param("staffId") Long staffId, @Param("yearMonth") String yearMonth);
/**
* 查询管理范围内各异常类型人数
*
* @param dto
* @return
*/
CountVO countRangeExcepStaff(@Param("dto") StasticStaffExcepByDayDTO dto);
/**
* 分页查询考勤结果列表
*
* @param dto
* @return
*/
IPage<ListStaffResultPageVO> listResultPage(Page page, @Param("dto") ListStaffResultDTO dto);
/**
* 查询未处理结果 status=null
*
* @param staffId
* @return
*/
List<EduAttendanceStaffResult> findNotResult(@Param("staffId") Long staffId);
}
@@ -0,0 +1,14 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleAdmin;
/**
* 教职工考勤-规则管理员 Mapper
*
* @author ZYJ
* @date 2021-09-27 18:56:15
*/
public interface EduAttendanceStaffRuleAdminMapper extends BaseMapper<EduAttendanceStaffRuleAdmin> {
}
@@ -0,0 +1,25 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleAdminRange;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 教职工考勤-管理员考勤范围 Mapper
*
* @author ZYJ
* @date 2021-09-27 18:56:20
*/
public interface EduAttendanceStaffRuleAdminRangeMapper extends BaseMapper<EduAttendanceStaffRuleAdminRange> {
/**
* 根据管理员职工id查询管理的职工id
*
* @param staffId
* @return
*/
List<Long> listAdminStaffRange(@Param("adminStaffId") Long staffId);
}
@@ -0,0 +1,18 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleDevice;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 教职工考勤-规则设备 Mapper
*
* @author ZYJ
* @date 2022/9/13
*/
public interface EduAttendanceStaffRuleDeviceMapper extends BaseMapper<EduAttendanceStaffRuleDevice> {
List<EduAttendanceStaffRuleDevice> selectStaffRuleDeviceList(@Param("ruleId") Long ruleId);
}
@@ -0,0 +1,42 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yida.data.attendance.vo.FindStaffRuleVO;
import com.yida.data.attendance.vo.StaffRuleVO;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRecord;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRule;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 教职工考勤规则 Mapper
*
* @author ccl
* @date 2021-09-27 18:56:21
*/
public interface EduAttendanceStaffRuleMapper extends BaseMapper<EduAttendanceStaffRule> {
/**
* 查询规则列表
*
* @param iPage
* @param ruleName
* @param schoolId
* @return
*/
IPage<StaffRuleVO> findStaffRuleList(@Param("iPage") IPage iPage, @Param("ruleName") String ruleName,
@Param("schoolId") Long schoolId,
@Param("ruleIds") List<Long> ruleIds);
/**
* 通过id查询
*
* @param ruleId
* @return
*/
FindStaffRuleVO findStaffRuleById(@Param("ruleId") Long ruleId);
FindStaffRuleVO selectMatchStaffRule(EduAttendanceStaffRecord staffRecord);
}
@@ -0,0 +1,14 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleObj;
/**
* 教职工考勤-打卡人员 Mapper
*
* @author ZYJ
* @date 2021-09-27 18:56:22
*/
public interface EduAttendanceStaffRuleObjMapper extends BaseMapper<EduAttendanceStaffRuleObj> {
}
@@ -0,0 +1,14 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleRemind;
/**
* 教职工考勤-打卡提醒 Mapper
*
* @author ZYJ
* @date 2021-09-27 18:56:14
*/
public interface EduAttendanceStaffRuleRemindMapper extends BaseMapper<EduAttendanceStaffRuleRemind> {
}
@@ -0,0 +1,14 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleSpecialDate;
/**
* 教职工考勤-特殊日期 Mapper
*
* @author ZYJ
* @date 2021-09-27 18:56:24
*/
public interface EduAttendanceStaffRuleSpecialDateMapper extends BaseMapper<EduAttendanceStaffRuleSpecialDate> {
}
@@ -0,0 +1,7 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleStaff;
public interface EduAttendanceStaffRuleStaffMapper extends BaseMapper<EduAttendanceStaffRuleStaff> {
}
@@ -0,0 +1,14 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleTime;
/**
* 教职工考勤-打卡时段 Mapper
*
* @author ZYJ
* @date 2021-09-27 18:56:12
*/
public interface EduAttendanceStaffRuleTimeMapper extends BaseMapper<EduAttendanceStaffRuleTime> {
}
@@ -0,0 +1,14 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleWhiteList;
/**
* 教职工考勤-白名单 Mapper
*
* @author ZYJ
* @date 2021-09-27 18:56:13
*/
public interface EduAttendanceStaffRuleWhiteListMapper extends BaseMapper<EduAttendanceStaffRuleWhiteList> {
}
@@ -0,0 +1,7 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduAttendanceVerifyDorm;
public interface EduAttendanceVerifyDormMapper extends BaseMapper<EduAttendanceVerifyDorm> {
}
@@ -0,0 +1,14 @@
package com.yida.data.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yida.data.common.core.entity.attendance.EduDeviceGroup;
/**
* 设备对应分组关系表 Mapper
*
* @author zhanghaijun
* @date 2021-06-16 15:29:10
*/
public interface EduDeviceGroupMapper extends BaseMapper<EduDeviceGroup> {
}
@@ -0,0 +1,9 @@
package com.yida.data.attendance.repository;
import com.yida.data.common.core.entity.ReceiveMsg;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ReceiveMsgRepository extends ElasticsearchRepository<ReceiveMsg, Long> {
}
@@ -0,0 +1,20 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceConfig;
public interface EduAttendanceConfigService extends IService<EduAttendanceConfig> {
EduAttendanceConfig initConfig(Long schoolId);
EduAttendanceConfig getConfig(Long schoolId);
void saveConfig(EduAttendanceConfig config);
/**
* 添加未到推送任务
*/
void addNotArriveTask(Long configId);
Boolean getDormAttendanceStatus(Long schoolId, Integer time);
}
@@ -0,0 +1,61 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceDevice;
import com.yida.data.common.core.entity.attendance.EduAttendanceDeviceGroup;
import com.yida.data.attendance.vo.DeviceOrDeviceGroupVO;
import java.util.List;
/**
* 设备分组表 Service接口
*
* @author zhanghaijun
* @date 2021-06-16 15:27:11
*/
public interface EduAttendanceDeviceGroupService extends IService<EduAttendanceDeviceGroup> {
/**
* 分页模糊查询分组
*
* @param current
* @param size
* @return
*/
IPage<EduAttendanceDeviceGroup> selectGroup(String name, Long current, Long size, Long schoolId) throws NoSuchMethodException;
/**
* 查询全部
*
* @param
* @return
*/
List<EduAttendanceDeviceGroup> selectGroupAll();
/**
* 新增
*
* @param eduAttendanceDeviceGroup
*/
void insertGroup(EduAttendanceDeviceGroup eduAttendanceDeviceGroup);
/**
* 修改
*
* @param eduAttendanceDeviceGroup
*/
void updateGroup(EduAttendanceDeviceGroup eduAttendanceDeviceGroup);
/**
* 删除
*/
void delGroup(Long id);
List<DeviceOrDeviceGroupVO> listDeviceAndDevice(String keyword, Long schoolId);
/**
* 根据设备组id查询设备
*/
List<EduAttendanceDevice> listDeviceByGroup(List<Long> groupIds);
}
@@ -0,0 +1,7 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceDeviceRule;
public interface EduAttendanceDeviceRuleService extends IService<EduAttendanceDeviceRule> {
}
@@ -0,0 +1,91 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.attendance.vo.DeviceNumberVO;
import com.yida.data.attendance.vo.DeviceVO;
import com.yida.data.attendance.vo.OnlineCountVO;
import com.yida.data.common.core.common.ResultBean;
import com.yida.data.common.core.entity.CurrentUser;
import com.yida.data.common.core.entity.attendance.EduAttendanceDevice;
import com.yida.data.common.core.entity.constant.FebsConstant;
import com.yida.data.attendance.dto.DevicePage;
import com.yida.data.attendance.dto.IssuedFaceDTO;
import com.yida.data.attendance.dto.RemoveFaceDTO;
import java.util.List;
import org.springframework.scheduling.annotation.Async;
public interface EduAttendanceDeviceService extends IService<EduAttendanceDevice> {
DevicePage<DeviceVO> listDevicePage(DevicePage page, String schoolName, String number,
Integer scope, Integer type, Integer state, CurrentUser currentUser);
EduAttendanceDevice saveDevice(EduAttendanceDevice device);
/**
* 批量开门
*
* @param list
*/
void openAllDoor(List<String> list);
/**
* 批量设置时间
*
* @param list
*/
void setAllTime(List<String> list);
/**
* 远程开门
*
* @param id
*/
void openDoor(String id);
/**
* 设置时间
*
* @param id
*/
void setSysTime(String id);
/**
* 下发人脸,异步调用 防止超时
*/
@Async(FebsConstant.ASYNC_POOL)
void issuedFace(IssuedFaceDTO dto);
/**
* 删除设备中的人脸
*/
@Async(FebsConstant.ASYNC_POOL)
void removeFace(RemoveFaceDTO dto);
/**
* 检测在线设备
*/
void updateDeviceStatus();
/**
* 考勤设备数量统计
*
* @return com.yida.data.common.core.common.ResultBean<com.yida.data.attendance.vo.DeviceNumberVO>
* @author ZYJ
* @date 2021/10/8 17:14
*/
ResultBean<DeviceNumberVO> findDeviceNumber() throws NoSuchMethodException;
/**
* 校时所有设备
*/
@Async(FebsConstant.ASYNC_POOL)
void timingAllDevice();
/**
* 获取面板机状态分布
* @return
*/
OnlineCountVO getOnlineDistrib(List<Long> schoolIds);
}
@@ -0,0 +1,26 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceManagePushResult;
import com.yida.data.common.core.entity.attendance.EduAttendanceResult;
import java.util.List;
/**
* 管理考勤结果推送记录service
*
* @author ZYJ
* @date 2022/7/15
*/
public interface EduAttendanceManagePushResultService extends IService<EduAttendanceManagePushResult> {
/**
* 查询归寝报告
*
* @param pushId 推送记录id
* @return java.util.List<com.yida.data.common.core.entity.attendance.EduAttendanceResult>
* @author ZYJ
* @date 2022/7/16 14:12
*/
List<EduAttendanceResult> selectPushList(Long pushId);
}
@@ -0,0 +1,17 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceNotArrive;
public interface EduAttendanceNotArriveService extends IService<EduAttendanceNotArrive> {
/**
* 发送未到消息
*/
void pushNotArriveMsg();
/**
* 保存未到记录
*/
// void saveNotArriveResult();
}
@@ -0,0 +1,17 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceNotice;
import java.util.List;
public interface EduAttendanceNoticeService extends IService<EduAttendanceNotice> {
List<EduAttendanceNotice> listNoticeByParent(Long parentId);
/**
* 发送打卡通知
* @param id 教职工考勤规则id
*/
void sendNotice(Long id);
}
@@ -0,0 +1,48 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.attendance.configure.ThreadPollConfigure;
import com.yida.data.attendance.dto.DealRecordDTO;
import com.yida.data.attendance.dto.InOutPageDTO;
import com.yida.data.attendance.dto.ListRecordDTO;
import com.yida.data.attendance.vo.InOutDormPageVO;
import com.yida.data.attendance.vo.RecordDetailVO;
import com.yida.data.common.core.entity.attendance.EduAttendanceRecord;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.scheduling.annotation.Async;
public interface EduAttendanceRecordService extends IService<EduAttendanceRecord> {
/**
* 查询进出记录
*
* @param dto
* @return
*/
IPage<InOutDormPageVO> listInOutPage(InOutPageDTO dto);
/**
* 导出进出记录
*
* @param dto
* @param response
*/
void exportInOut(InOutPageDTO dto, HttpServletResponse response);
RecordDetailVO getRecordDetail(Long id);
@Async(ThreadPollConfigure.POLL_NAME)
void receiveRecord(DealRecordDTO dto);
/**
* 查询进出记录
*
* @param dto
* @return
*/
List<RecordDetailVO> listRecord(ListRecordDTO dto);
}
@@ -0,0 +1,89 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.attendance.vo.AttendanceResultDormVO;
import com.yida.data.attendance.vo.ResultDetailVO;
import com.yida.data.attendance.vo.RuleTimeVO;
import com.yida.data.attendance.vo.StayStudentResultVO;
import com.yida.data.common.core.entity.attendance.EduAttendanceResult;
import com.yida.data.common.core.entity.attendance.EduAttendanceVerifyDorm;
import com.yida.data.common.core.entity.constant.FebsConstant;
import com.yida.data.attendance.dto.AttendanceResultPageDTO;
import com.yida.data.attendance.dto.ListStudentResultDTO;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.scheduling.annotation.Async;
/**
* 考勤结果 Service接口
*
* @author wjm
* @date 2021-09-15 09:56:24
*/
public interface EduAttendanceResultService extends IService<EduAttendanceResult> {
/**
* 查询宿舍楼学生考勤信息
*/
List<StayStudentResultVO> listResultByDorm(Long dormId, String date, Integer time, String keyword, Integer status);
/**
* 查询寝室的学生考勤信息
*
* @param roomId
* @param date
* @param time
* @return
*/
List<StayStudentResultVO> listStudentResByDormRoom(Long roomId, String date, Integer time);
/**
* 改变学生的归寝状态
*
* @param studentId
* @param date
* @param time
* @param status
*/
void changeStayStudentStatus(Long studentId, String date, Integer time, Integer status);
/**
* 完成某个寝室的查寝
*/
void verifyDormRoom(EduAttendanceVerifyDorm verifyDorm);
void exportAttendanceResult(AttendanceResultPageDTO dto, HttpServletResponse response);
/**
* 查询考勤记录
*
* @param dto
* @return
*/
IPage<AttendanceResultDormVO> listAttendanceResultPage(AttendanceResultPageDTO dto);
/**
* 定时处理考勤记录
*/
@Async(FebsConstant.ASYNC_POOL)
void dealAttendanceResult();
/**
* 发送未到消息
*/
@Async(FebsConstant.ASYNC_POOL)
void pushNotArriveMsg();
/**
* 查询某年级某天校门考勤记录的规则时间列表
*/
List<RuleTimeVO> listGradeResultTime(Long gradeId, String date);
/**
* 查询学生考勤记录
*/
List<ResultDetailVO> listStudentResultDetail(ListStudentResultDTO dto);
}
@@ -0,0 +1,7 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceRuleDate;
public interface EduAttendanceRuleDateService extends IService<EduAttendanceRuleDate> {
}
@@ -0,0 +1,7 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceRuleDept;
public interface EduAttendanceRuleDeptService extends IService<EduAttendanceRuleDept> {
}
@@ -0,0 +1,7 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceRuleDevice;
public interface EduAttendanceRuleDeviceService extends IService<EduAttendanceRuleDevice> {
}
@@ -0,0 +1,44 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.CurrentUser;
import com.yida.data.common.core.entity.attendance.EduAttendanceRule;
import com.yida.data.attendance.vo.ConflictRuleVO;
import com.yida.data.attendance.vo.RuleListVO;
import java.time.LocalDateTime;
import java.util.List;
public interface EduAttendanceRuleService extends IService<EduAttendanceRule> {
IPage<RuleListVO> listRulePage(Page page, CurrentUser currentUser, Long schoolId, Long campusId,
String ruleName,
Integer type,
Integer status,
String startDate, String endDate);
List<ConflictRuleVO> checkConflict(EduAttendanceRule rule);
void saveRule(EduAttendanceRule rule);
void deleteRule(List<Long> ids);
void changeRuleRun(Long id);
RuleListVO getValidRule(List<Long> deptIds, LocalDateTime date, Integer type, String deviceSn);
/**
* 更新规则状态
*/
void updateRuleStatus();
/**
* 获取当前运行的考勤规则的适用对象
*
* @param type 0-上学,1-宿舍
* @return
*/
List<Long> listValidRuleDept(Long schoolId, Integer type);
}
@@ -0,0 +1,19 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceRuleTime;
import com.yida.data.attendance.vo.RuleTimeVO;
import java.time.LocalDate;
import java.util.List;
/**
* 考勤规则 考勤时间 Service接口
*
* @author zhanghaijun
* @date 2021-06-25 09:51:00
*/
public interface EduAttendanceRuleTimeService extends IService<EduAttendanceRuleTime> {
List<RuleTimeVO> listDeptRuleTime(Long deptId, LocalDate date, Integer type);
}
@@ -0,0 +1,35 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRecord;
import com.yida.data.attendance.vo.StaffRecordVO;
/**
* 教职工考勤-进出记录 Service接口
*
* @author ZYJ
* @date 2021-09-27 18:56:19
*/
public interface EduAttendanceStaffRecordService extends IService<EduAttendanceStaffRecord> {
/**
* 分页查询教职工进出列表
*
* @param page
* @param deptId
* @param nameOrPhone
* @param start
* @param end
* @return
*/
IPage<StaffRecordVO> findPageStaffRecord(Page page, Long deptId, String nameOrPhone, String start, String end, Long schoolId);
/**
* 定时处理记录数据
*/
void staffRecord();
}
@@ -0,0 +1,72 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.attendance.dto.ListStaffResultDTO;
import com.yida.data.attendance.vo.ListStaffResultPageVO;
import com.yida.data.attendance.vo.StaffDateTimeResultInfo;
import com.yida.data.attendance.vo.StaffTimeResultInfo;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffResult;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;
/**
* 教职工考勤-考勤结果 Service接口
*
* @author ZYJ
* @date 2021-09-27 18:56:23
*/
public interface EduAttendanceStaffResultService extends IService<EduAttendanceStaffResult> {
/**
* 查询各时段考勤结果
*
* @param staffId
* @param date
* @return
*/
List<StaffTimeResultInfo> listTimeResult(Long staffId, String date);
/**
* 查询各天各时段考勤结果
*
* @param staffId
* @param yearMonth
* @return
*/
List<StaffDateTimeResultInfo> listDateTimeResult(Long staffId, String yearMonth);
/**
* 分页查询教职工考勤记录
*
* @param dto
* @return
*/
IPage<ListStaffResultPageVO> listResultPage(ListStaffResultDTO dto);
/**
* 未处理的结果
*
* @param staffId
* @return
*/
List<EduAttendanceStaffResult> findNotResult(Long staffId);
/**
* 生成教师考勤结果
*/
void saveStaffResult();
/**
* 查询上一天最后的结果
*
* @param staffId
* @param startTime
* @param endTime
* @param plusDays
* @return
*/
EduAttendanceStaffResult findLastResult(Long staffId, LocalTime startTime, LocalTime endTime, LocalDate plusDays);
}
@@ -0,0 +1,14 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleAdminRange;
/**
* 教职工考勤-管理员考勤范围 Service接口
*
* @author ZYJ
* @date 2021-09-27 18:56:20
*/
public interface EduAttendanceStaffRuleAdminRangeService extends IService<EduAttendanceStaffRuleAdminRange> {
}
@@ -0,0 +1,13 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleAdmin;
/**
* 教职工考勤-规则管理员 Service接口
*
* @author ZYJ
* @date 2021-09-27 18:56:15
*/
public interface EduAttendanceStaffRuleAdminService extends IService<EduAttendanceStaffRuleAdmin> {
}
@@ -0,0 +1,27 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleDevice;
import java.util.List;
/**
* 教职工考勤-规则设备 service
*
* @author ZYJ
* @date 2022/9/13
*/
public interface EduAttendanceStaffRuleDeviceService extends IService<EduAttendanceStaffRuleDevice> {
/**
* 根据教师考勤规则id查询打卡设备
*
* @param ruleId 教师考勤规则id
* @return java.util.List<com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleDevice>
* @author ZYJ
* @date 2022/9/13 15:28
*/
List<EduAttendanceStaffRuleDevice> selectStaffRuleDeviceList(Long ruleId);
}
@@ -0,0 +1,14 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleObj;
/**
* 教职工考勤-打卡人员 Service接口
*
* @author ZYJ
* @date 2021-09-27 18:56:22
*/
public interface EduAttendanceStaffRuleObjService extends IService<EduAttendanceStaffRuleObj> {
}
@@ -0,0 +1,18 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleRemind;
/**
* 教职工考勤-打卡提醒 Service接口
*
* @author ZYJ
* @date 2021-09-27 18:56:14
*/
public interface EduAttendanceStaffRuleRemindService extends IService<EduAttendanceStaffRuleRemind> {
/**
* 提醒员工打卡
*/
void remindStaff();
}
@@ -0,0 +1,62 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.attendance.vo.FindStaffRuleVO;
import com.yida.data.attendance.vo.StaffRuleVO;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRecord;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRule;
import com.yida.data.attendance.dto.StaffRuleDTO;
/**
* 教职工考勤规则 Service接口
*
* @author ZYJ
* @date 2021-09-27 18:56:21
*/
public interface EduAttendanceStaffRuleService extends IService<EduAttendanceStaffRule> {
/**
* 查询规则列表
*
* @param iPage
* @param ruleName
* @param staffName
* @return staff
*/
IPage<StaffRuleVO> findStaffRuleList(IPage iPage, String ruleName, String staffName, Long schoolId);
/**
* 查询规则详情
*
* @param ruleId
* @return
*/
FindStaffRuleVO findStaffRule(Long ruleId);
/**
* 新增或修改规则详情
*
* @param staffRuleDTO
*/
void saveOrUpStaffRule(StaffRuleDTO staffRuleDTO);
/**
* 删除规则接口
*
* @param ruleId
*/
void removeStaffRule(Long ruleId);
/**
* 查询教职工适用的考勤规则
*
* @param staffRecord 教职工考勤-进出记录
* @return com.yida.data.attendance.vo.FindStaffRuleVO
* @author ZYJ
* @date 2022/9/13 17:01
*/
FindStaffRuleVO selectMatchStaffRule(EduAttendanceStaffRecord staffRecord);
}
@@ -0,0 +1,14 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleSpecialDate;
/**
* 教职工考勤-特殊日期 Service接口
*
* @author ZYJ
* @date 2021-09-27 18:56:24
*/
public interface EduAttendanceStaffRuleSpecialDateService extends IService<EduAttendanceStaffRuleSpecialDate> {
}
@@ -0,0 +1,7 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleStaff;
public interface EduAttendanceStaffRuleStaffService extends IService<EduAttendanceStaffRuleStaff> {
}
@@ -0,0 +1,13 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleTime;
/**
* 教职工考勤-打卡时段 Service接口
*
* @author ZYJ
* @date 2021-09-27 18:56:12
*/
public interface EduAttendanceStaffRuleTimeService extends IService<EduAttendanceStaffRuleTime> {
}
@@ -0,0 +1,14 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRuleWhiteList;
/**
* 教职工考勤-白名单 Service接口
*
* @author ZYJ
* @date 2021-09-27 18:56:13
*/
public interface EduAttendanceStaffRuleWhiteListService extends IService<EduAttendanceStaffRuleWhiteList> {
}
@@ -0,0 +1,159 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yida.data.attendance.vo.*;
import com.yida.data.common.core.entity.CurrentUser;
import com.yida.data.attendance.dto.ListResultStatisticsDTO;
import com.yida.data.attendance.dto.StasticStaffExcepByDayDTO;
import com.yida.data.attendance.dto.StasticStaffResultDTO;
import com.yida.data.common.core.entity.user.EduStudent;
import java.time.LocalDate;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
public interface EduAttendanceStasticService {
/**
* 统计学生出勤次数
*/
CountVO countStudentAttendance(Long studentId, LocalDate startDate, LocalDate endDate);
/**
* 统计某班学生某天出勤次数
*
* @param classId
* @param date
* @param timeId
* @return
*/
TeacherStasticVO statisticsClass(Long classId, String date, String month, Long timeId);
TeacherStasticVO statisticsClassCopy(Long classId, String date, String month, Long timeId);
TeacherStasticVO statisticsClassCopyByMonth(Long classId, String month);
/**
* 查询上学出勤率前五与后三名
*
* @param date
* @param schoolId
* @param gradeId
* @param timeId
* @return
*/
RateRankVO stasticRateRank(String date, Long schoolId, Long gradeId, Long timeId);
/**
* 查询宿舍楼的考勤率
*
* @param date
* @param schoolId
* @param duration
* @return
*/
List<RateVO> stasticDormRateRank(String date, Long schoolId, Integer duration);
/**
* 出勤率统计表
*
* @return
*/
List<RateVO> listRate(ListResultStatisticsDTO dto);
/**
* 导出出勤率统计表
*
* @param date
* @param schoolId
* @param campusId
* @param gradeId
* @param classId
* @param dormId
* @param type
* @param timeId
* @param duration
*/
void exportRateList(ListResultStatisticsDTO dto, HttpServletResponse response);
/**
* 分宿舍楼统计考勤结果
*/
List<StasticDormResultVO> stasticResultGroupByDorm(Long schoolId, Long staffId, Integer time, String date);
/**
* 分寝室统计及考勤结果
*
* @param time
* @param date
* @return
*/
List<StasticDormResultVO> stasticResultByDormRoom(Long dormId, Integer verify, Integer status, Integer time, String date,
Integer sort, String keyword);
/**
* 按日统计教职工考勤结果
*/
IPage<StasticStaffResultByDayVO> stasticStaffResultByDay(CurrentUser currentUser, StasticStaffResultDTO dto);
void exportStasticStaffResultByDay(CurrentUser currentUser, StasticStaffResultDTO dto, HttpServletResponse response);
/**
* 按月统计教职工考勤结果
*
* @param schoolId
* @param dto
* @return
*/
IPage<StasticStaffResultByMonthVO> stasticStaffResultByMonth(CurrentUser currentUser, StasticStaffResultDTO dto);
/**
* 导出按月同i教职工考勤结果
*
* @param schoolId
* @param dto
* @param response
*/
void exportStasticStaffResultByMonth(CurrentUser currentUser, StasticStaffResultDTO dto, HttpServletResponse response);
/**
* 按日期段统计教职工各异常数据
*
* @param dto
* @return
*/
StasticStaffExcepByDayVO stasticStaffExcepByDay(StasticStaffExcepByDayDTO dto);
/**
* 查询管理范围内各异常类型人数
*
* @param dto
* @return
*/
CountVO countRangeExcepStaff(StasticStaffExcepByDayDTO dto);
/**
* 查询各考勤状态数量
*
* @param startDate
* @param endDate
* @return
*/
StaRecordCountVO staRecordCount(LocalDate startDate, LocalDate endDate, List<Long> schoolIds);
/**
* 根据班级、日期查询学生当日寝室考勤数据
*
* @param schoolId
* @param classId
* @param date
* @return
*/
List<EduStudent> getStudentDormInfo(Long schoolId, Long classId, String date,Integer time);
}
@@ -0,0 +1,25 @@
package com.yida.data.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.attendance.EduDeviceGroup;
import java.util.List;
/**
* 设备对应分组关系表 Service接口
*
* @author zhanghaijun
* @date 2021-06-16 15:29:10
*/
public interface EduDeviceGroupService extends IService<EduDeviceGroup> {
/**
* 批量分组
* @param list
*/
void insertGroup(List<EduDeviceGroup> list);
}
@@ -0,0 +1,16 @@
package com.yida.data.attendance.service;
import com.yida.data.common.core.entity.attendance.EduAttendanceConfig;
import com.yida.data.common.core.entity.user.EduStudent;
import java.util.List;
public interface GenerateAttendanceResultService {
/**
* 生成学生考勤记录
*
* @param config 学校的考勤配置
* @param schoolStudentList 学校的学生列表
*/
void generateStudentAttendanceResult(EduAttendanceConfig config, List<EduStudent> schoolStudentList);
}
@@ -0,0 +1,25 @@
package com.yida.data.attendance.service;
import com.yida.data.attendance.vo.AttendanceResVO;
public interface NoticeService {
/**
* 发送考勤进出通知
*
* @param url
* @param student
* @param result
*/
void sendAttendanceNotice(AttendanceResVO result);
/**
* 重新采集人脸通知
*
* @param picUrl
* @param userId
* @param type
*/
void sendCollectFailNotice(String picUrl, Long userId, Integer type);
}
@@ -0,0 +1,93 @@
package com.yida.data.attendance.service.impl;
import cc.mrbird.febs.common.redis.service.RedisService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yida.data.attendance.mapper.EduAttendanceConfigMapper;
import com.yida.data.attendance.service.EduAttendanceConfigService;
import com.yida.data.common.core.entity.attendance.EduAttendanceConfig;
import com.yida.data.common.core.entity.constant.CachePrefixConstant;
import com.yida.data.common.core.entity.constant.LockPrefixConstant;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Service
@RequiredArgsConstructor
public class EduAttendanceConfigServiceImpl extends ServiceImpl<EduAttendanceConfigMapper, EduAttendanceConfig> implements
EduAttendanceConfigService {
private final RedisService redisService;
@Override
public EduAttendanceConfig initConfig(Long schoolId) {
EduAttendanceConfig config = new EduAttendanceConfig();
config.setSchoolId(schoolId);
config.setDormitoryNoonDdl(EduAttendanceConfig.DORMITORY_NOON_DDL_DEFAULT);
config.setDormitoryNightDdl(EduAttendanceConfig.DORMITORY_NIGHT_DDL_DEFAULT);
config.setSchoolPushInterval(EduAttendanceConfig.SCHOOL_PUSH_INTERVAL_DEFAULT);
config.setSchoolPushObj(EduAttendanceConfig.SCHOOL_PUSH_OBJ_DEFAULT);
config.setDormitoryPushInterval(EduAttendanceConfig.DORMITORY_PUSH_INTERVAL_DEFAULT);
config.setDormitoryPushObj(EduAttendanceConfig.DORMITORY_PUSH_OBJ_DEFAULT);
// 家长默认重复推送
config.setSchoolRepeatPushStatus(EduAttendanceConfig.REPEAT_PUSH_STATUS);
config.setDormitoryRepeatPushStatus(EduAttendanceConfig.REPEAT_PUSH_STATUS);
// 管理员默认不重复推送
config.setManageRepeatPushStatus(EduAttendanceConfig.NOT_REPEAT_PUSH_STATUS);
config.setDormitoryManagePushObj(EduAttendanceConfig.DORMITORY_MANAGE_PUSH_OBJ_DEFAULT);
save(config);
redisService.hset(CachePrefixConstant.ATTENDANCE_CONFIG, config.getSchoolId().toString(), config);
return config;
}
@Override
public EduAttendanceConfig getConfig(Long schoolId) {
EduAttendanceConfig config = getOne(Wrappers.lambdaQuery(new EduAttendanceConfig()).eq(EduAttendanceConfig::getSchoolId,
schoolId));
if (config == null) {
redisService.lock(LockPrefixConstant.GET_ATTENDANCE_CONFIG_LOCK + schoolId);
config = getOne(Wrappers.lambdaQuery(new EduAttendanceConfig()).eq(EduAttendanceConfig::getSchoolId,
schoolId));
if (config == null) {
config = initConfig(schoolId);
}
redisService.unlock(LockPrefixConstant.GET_ATTENDANCE_CONFIG_LOCK + schoolId);
}
return config;
}
@Override
public void saveConfig(EduAttendanceConfig config) {
EduAttendanceConfig exist = getOne(Wrappers.lambdaQuery(new EduAttendanceConfig()).eq(EduAttendanceConfig::getSchoolId,
config.getSchoolId()));
if (exist != null) {
config.setId(exist.getId());
}
saveOrUpdate(config);
redisService.hset(CachePrefixConstant.ATTENDANCE_CONFIG, config.getSchoolId().toString(), config);
}
@Override
public void addNotArriveTask(Long configId) {
// EduAttendanceConfig config = getById(configId);
// 查询未到学生
// 查询应该推送消息的学生
//eduAttendanceRecordMapper.list
}
@Override
public Boolean getDormAttendanceStatus(Long schoolId, Integer time) {
boolean flag = true;
LocalDateTime now = LocalDateTime.now();
LocalDate today = now.toLocalDate();
EduAttendanceConfig config = getConfig(schoolId);
if ((time == 1 && today.atTime(config.getDormitoryNoonDdl()).isBefore(now))
|| (time == 2 && today.minusDays(1L).atTime(config.getDormitoryNightDdl()).isBefore(now))) {
flag = false;
}
return flag;
}
}
@@ -0,0 +1,118 @@
package com.yida.data.attendance.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yida.data.attendance.mapper.EduAttendanceDeviceGroupMapper;
import com.yida.data.attendance.mapper.EduDeviceGroupMapper;
import com.yida.data.attendance.service.EduAttendanceDeviceGroupService;
import com.yida.data.attendance.vo.DeviceOrDeviceGroupVO;
import com.yida.data.common.core.entity.CurrentUser;
import com.yida.data.common.core.entity.attendance.EduAttendanceDevice;
import com.yida.data.common.core.entity.attendance.EduAttendanceDeviceGroup;
import com.yida.data.common.core.entity.system.Dept;
import com.yida.data.common.core.entity.system.enums.RoleEnum;
import com.yida.data.common.core.utils.FebsUtil;
import com.yida.data.common.core.utils.RoleUtil;
import com.yida.data.system.feign.RemoteDeptService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 设备分组表 Service实现
*
* @author zhanghaijun
* @date 2021-06-16 15:27:11
*/
@Service
@RequiredArgsConstructor
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public class EduAttendanceDeviceGroupServiceImpl extends ServiceImpl
<EduAttendanceDeviceGroupMapper, EduAttendanceDeviceGroup> implements EduAttendanceDeviceGroupService {
private final EduDeviceGroupMapper eduDeviceGroupMapper;
private final RemoteDeptService remoteDeptService;
@Resource
private EduAttendanceDeviceGroupMapper eduAttendanceDeviceGroupMapper;
/**
* 分页查分组
*
* @param current
* @param size
* @return
*/
@Override
public IPage<EduAttendanceDeviceGroup> selectGroup(String name, Long current, Long size, Long schoolId)
throws NoSuchMethodException {
Page<EduAttendanceDeviceGroup> page = new Page<>(current, size);
CurrentUser currentUser = FebsUtil.getCurrentUser();
// 获取登陆用户的最大角色
RoleEnum roleEnum = RoleUtil.getMaxRole(currentUser);
List<Long> schoolIds = new ArrayList<>();
// 代理商相关账号
if (RoleEnum.ROLE_AGENT_ADMIN.equals(roleEnum) || RoleEnum.ROLE_AGENT_NORMAL.equals(roleEnum)) {
if (schoolId != null) {
schoolIds.add(schoolId);
} else {
List<Dept> deptList = remoteDeptService.getSchoolByArea(null, null).getData();
if (CollUtil.isNotEmpty(deptList)) {
schoolIds = deptList.stream().map(Dept::getDeptId).collect(Collectors.toList());
}
}
} else {
// 学校账号
schoolIds.add(currentUser.getDeptId());
}
return baseMapper.selectGroup(page, name, schoolIds);
}
@Override
public List<EduAttendanceDeviceGroup> selectGroupAll() {
return eduAttendanceDeviceGroupMapper.selectList(null);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void insertGroup(EduAttendanceDeviceGroup eduAttendanceDeviceGroup) {
baseMapper.insert(eduAttendanceDeviceGroup);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateGroup(EduAttendanceDeviceGroup eduAttendanceDeviceGroup) {
baseMapper.updateById(eduAttendanceDeviceGroup);
}
@Override
public void delGroup(Long id) {
removeById(id);
}
@Override
public List<DeviceOrDeviceGroupVO> listDeviceAndDevice(String keyword, Long schoolId) {
return baseMapper.listDeviceAndGroup(keyword, schoolId);
}
@Override
public List<EduAttendanceDevice> listDeviceByGroup(List<Long> groupIds) {
return baseMapper.listDeviceByGroup(groupIds);
}
}
@@ -0,0 +1,13 @@
package com.yida.data.attendance.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yida.data.attendance.mapper.EduAttendanceDeviceRuleMapper;
import com.yida.data.attendance.service.EduAttendanceDeviceRuleService;
import com.yida.data.common.core.entity.attendance.EduAttendanceDeviceRule;
import org.springframework.stereotype.Service;
@Service
public class EduAttendanceDeviceRuleServiceImpl extends ServiceImpl<EduAttendanceDeviceRuleMapper,
EduAttendanceDeviceRule> implements EduAttendanceDeviceRuleService {
}
@@ -0,0 +1,488 @@
package com.yida.data.attendance.service.impl;
import cc.mrbird.febs.common.redis.service.RedisService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.thread.ThreadFactoryBuilder;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yida.data.attendance.mapper.EduAttendanceDeviceMapper;
import com.yida.data.attendance.service.EduAttendanceDeviceService;
import com.yida.data.attendance.utils.MqttUtil;
import com.yida.data.attendance.vo.DeviceNumberVO;
import com.yida.data.attendance.vo.DeviceVO;
import com.yida.data.attendance.vo.OnlineCountVO;
import com.yida.data.common.core.common.ResultBean;
import com.yida.data.common.core.entity.CurrentUser;
import com.yida.data.common.core.entity.agent.EduAgentWxPublicReceiver;
import com.yida.data.common.core.entity.attendance.EduAttendanceDevice;
import com.yida.data.common.core.entity.attendance.enums.DeviceStateEnum;
import com.yida.data.common.core.entity.constant.CachePrefixConstant;
import com.yida.data.common.core.entity.constant.LockPrefixConstant;
import com.yida.data.common.core.entity.constant.StringConstant;
import com.yida.data.common.core.entity.system.Dept;
import com.yida.data.common.core.entity.system.EduDeptWxPublic;
import com.yida.data.common.core.entity.system.enums.RoleEnum;
import com.yida.data.common.core.entity.telephone.EduTelephoneCard;
import com.yida.data.common.core.entity.user.EduUserDeviceFactory;
import com.yida.data.common.core.entity.user.EduUserFace;
import com.yida.data.common.core.enums.DeviceType;
import com.yida.data.common.core.utils.EnumUtils;
import com.yida.data.common.core.utils.FebsUtil;
import com.yida.data.common.core.utils.WxPublicUtil;
import com.yida.data.common.service.CommonService;
import com.yida.data.attendance.dto.DevicePage;
import com.yida.data.attendance.dto.IssuedFaceDTO;
import com.yida.data.attendance.dto.RemoveFaceDTO;
import com.yida.data.system.feign.RemoteAgentService;
import com.yida.data.system.feign.RemoteDeptService;
import com.yida.data.user.feign.RemoteUserDeviceFactoryService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Service
@Slf4j
@RequiredArgsConstructor
public class EduAttendanceDeviceServiceImpl extends
ServiceImpl<EduAttendanceDeviceMapper, EduAttendanceDevice> implements EduAttendanceDeviceService {
private static final ThreadFactory FACE_THREAD_FACTORY = new ThreadFactoryBuilder()
.setNamePrefix("hq-issue-face-factory-").build();
private static final ExecutorService FACE_POOL = new ThreadPoolExecutor(10, 10, 1000,
TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), FACE_THREAD_FACTORY);
private final RemoteDeptService remoteDeptService;
private final RemoteAgentService remoteAgentService;
private final RemoteUserDeviceFactoryService remoteUserDeviceFactoryService;
private final CommonService commonService;
private final MqttUtil mqttUtil;
private final RedisService redisService;
private final WxPublicUtil wxPublicUtil;
@Override
public DevicePage<DeviceVO> listDevicePage(DevicePage page, String schoolName, String number,
Integer scope, Integer type, Integer state,
CurrentUser currentUser) {
List<Long> schoolIds = new ArrayList<>();
// 查询关联学校信息
List<Dept> deptList = this.remoteDeptService.getSchoolByArea(null, schoolName).getData();
if (CollUtil.isNotEmpty(deptList)) {
schoolIds = deptList.stream().map(Dept::getDeptId).collect(Collectors.toList());
} else {
// 添加默认值,防止报错
schoolIds.add(-1L);
}
DevicePage<DeviceVO> res = baseMapper.listDevicePage(page, schoolIds, number, scope, type, state);
// 在线离线数量
res.setOnlineNumber((int) count(Wrappers.<EduAttendanceDevice>lambdaQuery()
.eq(EduAttendanceDevice::getState, DeviceStateEnum.ONLINE_STATUS.getStatus())
.in(EduAttendanceDevice::getSchoolId, schoolIds)));
res.setOfflineNumber((int) count(Wrappers.<EduAttendanceDevice>lambdaQuery()
.eq(EduAttendanceDevice::getState, DeviceStateEnum.OFFLINE_STATUS.getStatus())
.in(EduAttendanceDevice::getSchoolId, schoolIds)));
if (CollUtil.isNotEmpty(res.getRecords())) {
for (DeviceVO record : res.getRecords()) {
record.setSchoolName(commonService.getDept(record.getSchoolId()).getDeptName());
}
}
return res;
}
@Override
public EduAttendanceDevice saveDevice(EduAttendanceDevice device) {
if (device.getId() == null && StrUtil.isNotEmpty(device.getSn()) && DeviceType.HAIQING.getValue()
.equals(device.getDeviceType())) {
mqttUtil.addTopic("$queue/mqtt/face/" + device.getSn() + "/Ack");
mqttUtil.addTopic("$queue/mqtt/face/" + device.getSn() + "/Rec");
}
if (StrUtil.isNotBlank(device.getMacAddress())) {
device.setMacAddress(device.getMacAddress().toUpperCase());
}
saveOrUpdate(device);
redisService.hdel(CachePrefixConstant.DEVICE_DATA, device.getSn());
return device;
}
/**
* 批量openDoor
*
* @param list
*/
@Override
public void openAllDoor(List<String> list) {
list.forEach(s -> mqttUtil.pulish(spliceOpenDoor(),
spliceTopic(s)));
}
/**
* 批量设置时间
*
* @param list
*/
@Override
public void setAllTime(List<String> list) {
list.forEach(s -> mqttUtil.pulish(spliceSetSysTime(), spliceTopic(s)));
}
@Override
public void openDoor(String id) {
mqttUtil.pulish(spliceOpenDoor(), spliceTopic(id));
}
@Override
public void setSysTime(String id) {
mqttUtil.pulish(spliceSetSysTime(), spliceTopic(id));
}
@Override
public void issuedFace(IssuedFaceDTO dto) {
List<EduUserFace> userFaceList = dto.getUserFaceList();
List<EduAttendanceDevice> deviceList = listByIds(dto.getDeviceList());
// 用户与厂商关联信息
List<EduUserDeviceFactory> userDeviceFactoryList = new ArrayList<>();
if (DeviceType.HAIQING.getValue().equals(deviceList.get(0).getDeviceType())) {
// 海清设备
JSONObject params = new JSONObject();
params.set("operator", dto.getType() == 0 ? "AddPersons" : "EditPersons");
params.set("DataBegin", "BeginFlag");
params.set("DataEnd", "EndFlag");
int size = 100;
// 下发总数
int totalSize = userFaceList.size() * deviceList.size();
redisService.set(CachePrefixConstant.ISSUE_FACE_TOTAL + dto.getGroupId(), totalSize);
// 进度相关信息
redisService.set(CachePrefixConstant.ISSUE_FACE_FINISH + dto.getGroupId(), 0);
redisService.set(CachePrefixConstant.ISSUE_FACE_ERROR + dto.getGroupId(), 0);
redisService.del(CachePrefixConstant.ISSUE_FACE_ERROR_MSG + dto.getGroupId());
log.info("错误数据:[{}],groupId:[{}]",
redisService.lGet(CachePrefixConstant.ISSUE_FACE_ERROR_MSG + dto.getGroupId(), 0L, -1L),
dto.getGroupId());
// 将人脸数据缓存到redis中
Map<Object, Object> userFaceMap = new HashMap<>();
for (EduUserFace userFace : userFaceList) {
userFaceMap.put(userFace.getUserId().toString() + userFace.getUserType().toString(), userFace);
// 厂商关联信息
EduUserDeviceFactory userDeviceFactory = new EduUserDeviceFactory();
userDeviceFactory.setUserId(userFace.getUserId());
userDeviceFactory.setUserType(userFace.getUserType());
userDeviceFactory.setTypeName(DeviceType.HAIQING.getValue());
userDeviceFactory.setTypeFlag(userFace.getUserId().toString() + userFace.getUserType().toString());
userDeviceFactoryList.add(userDeviceFactory);
}
// 遍历向每个设备下发信息
for (EduAttendanceDevice device : deviceList) {
//保存每个设备要添加的信息
redisService.hmset(CachePrefixConstant.HQ_EDIT_BATCH + device.getSn(), userFaceMap);
// 当前设备下发的人脸组
redisService.hset(CachePrefixConstant.ISSUE_FACE_GROUP_DEVICE, device.getSn(), dto.getGroupId());
// 每个设备一个线程
FACE_POOL.execute(() -> {
while (redisService.hasKey(CachePrefixConstant.HQ_EDIT_BATCH + device.getSn())) {
Map<Object, Object> saveData = redisService
.hmget(CachePrefixConstant.HQ_EDIT_BATCH + device.getSn());
log.info("循环下发");
log.info("数据:[{}]", saveData);
if (saveData.size() == 0) {
break;
}
Set<Map.Entry<Object, Object>> entries = saveData.entrySet();
log.info("处理后数据:[{}]", entries);
log.info("锁标识:[{}]",
redisService.get(LockPrefixConstant.HQ_DEVICE_USER_EDIT_LOCK + device.getSn()));
for (int i = 0; i < entries.size(); i += size) {
// 每size个下发一次
List<EduUserFace> tempFace;
if (i + size <= entries.size()) {
tempFace =
CollUtil.sub(entries, i, i + size).stream().map(x -> ((EduUserFace) x.getValue()))
.collect(Collectors.toList());
} else {
tempFace =
CollUtil.sub(entries, i, i + entries.size()).stream()
.map(x -> ((EduUserFace) x.getValue())).collect(Collectors.toList());
}
JSONArray userFaces = new JSONArray();
for (EduUserFace userFace : tempFace) {
JSONObject oneUserFace = new JSONObject();
oneUserFace.set("name", userFace.getName());
oneUserFace.set("customId",
userFace.getUserId().toString() + userFace.getUserType().toString());
oneUserFace.set("picURI", userFace.getPicPath());
// 永久白名单
oneUserFace.set("personType", 0);
oneUserFace.set("tempCardType", 0);
userFaces.set(oneUserFace);
}
params.set("info", userFaces);
params.set("PersonNum", userFaces.size());
params.set("messageId", StrUtil.uuid().replace("-", ""));
// 获取编辑锁
redisService.falseLock(LockPrefixConstant.HQ_DEVICE_USER_EDIT_LOCK + device.getSn());
// 发送消息
mqttUtil.pulish(params.toString(), "mqtt/face/" + device.getSn());
// 等待设备消息释放锁
while (redisService.hasKey(LockPrefixConstant.HQ_DEVICE_USER_EDIT_LOCK + device.getSn())) {
try {
Thread.sleep(1000);
} catch (Exception e) {
log.error("阻塞下发人脸失败", e);
}
}
}
}
log.info("下发结束");
});
}
}
log.info("--------------------------");
if (dto.getType() == 0) {
// 只有添加人脸需要保存厂商唯一标识
remoteUserDeviceFactoryService.batchSaveUserDeviceFactory(userDeviceFactoryList);
}
}
@Override
public void removeFace(RemoveFaceDTO dto) {
List<EduAttendanceDevice> deviceList = listByIds(dto.getDeviceList());
int size = 200;
String deviceType = deviceList.get(0).getDeviceType();
List<String> deviceFactoryUserIds = dto.getDeviceFactoryUserId();
if (DeviceType.HAIQING.getValue().equals(deviceType)) {
for (EduAttendanceDevice device : deviceList) {
FACE_POOL.execute(() -> {
JSONObject params = new JSONObject();
params.set("operator", "DeletePersons");
params.set("DataBegin", "BeginFlag");
params.set("DataEnd", "EndFlag");
// 每次最多删除200条
for (int i = 0; i < deviceFactoryUserIds.size(); i += size) {
List<String> tempIds;
if (i + size <= deviceFactoryUserIds.size()) {
tempIds = deviceFactoryUserIds.subList(i, i + size);
} else {
tempIds = deviceFactoryUserIds.subList(i, deviceFactoryUserIds.size());
}
params.set("info", new JSONObject() {{
set("customId", JSONUtil.parseArray(tempIds));
}});
params.set("PersonNum", tempIds.size());
params.set("messageId", StrUtil.uuid().replace("-", ""));
// 获取该台设备的删除锁
redisService.falseLock(LockPrefixConstant.HQ_DEVICE_USER_DELETE_LOCK + device.getSn());
// 发送消息
mqttUtil.pulish(params.toString(), "mqtt/face/" + device.getSn());
// 等待设备消息释放锁
while (redisService.hasKey(LockPrefixConstant.HQ_DEVICE_USER_DELETE_LOCK + device.getSn())) {
try {
Thread.sleep(1000);
} catch (Exception e) {
log.error("阻塞删除人脸失败", e);
}
}
}
});
}
}
}
@Override
public void updateDeviceStatus() {
Set<String> aliveDeviceSnKeys = redisService.keys(CachePrefixConstant.ALIVE_DEVICE);
Set<String> aliveDeviceSn = CollUtil.isNotEmpty(aliveDeviceSnKeys) ?
aliveDeviceSnKeys.stream().map(x -> x.substring(CachePrefixConstant.ALIVE_DEVICE.length()))
.collect(Collectors.toSet()) : new HashSet<String>() {{
add("000");
}};
log.info("alive device list sn:[{}]", aliveDeviceSn);
// 系统内在线 此刻不在线的设备
List<EduAttendanceDevice> noticeDeice = list(Wrappers.<EduAttendanceDevice>lambdaQuery()
.eq(EduAttendanceDevice::getState, 0)
.notIn(EduAttendanceDevice::getSn, aliveDeviceSn));
// 系统内不在线 此刻上线的设备
//noticeDeice.addAll(list(Wrappers.<EduAttendanceDevice>lambdaQuery()
// .eq(EduAttendanceDevice::getState, 1)
// .in(EduAttendanceDevice::getSn, aliveDeviceSn)));
if (CollUtil.isNotEmpty(noticeDeice)) {
EduDeptWxPublic sysWxPublic = commonService.getWxPublic(1L);
String accessToken = wxPublicUtil.getAccessToken(sysWxPublic.getAppId(), sysWxPublic.getSecret());
// 本地缓存加速
Map<Long, List<EduAgentWxPublicReceiver>> receiversCache = new HashMap<>();
for (EduAttendanceDevice device : noticeDeice) {
Long schoolId = device.getSchoolId();
Dept school = commonService.getDept(device.getSchoolId());
List<EduAgentWxPublicReceiver> receiverList = receiversCache.containsKey(schoolId)
? receiversCache.get(schoolId)
: remoteAgentService.listReceiverBySchool(schoolId).getData();
receiversCache.put(schoolId, receiverList);
// 如果有通知接收者
if (CollUtil.isNotEmpty(receiverList)) {
for (EduAgentWxPublicReceiver receiver : receiverList) {
JSONObject msgData = new JSONObject() {{
set("first", new JSONObject() {{
set("value", school.getDeptName() + "设备掉线通知");
set("color", "#173177");
}});
set("keyword1", new JSONObject() {{
set("value", "人脸面板机-" + device.getName()
+ (device.getZoneScope() == 0 ? "进门" : "出门")
+ "" + device.getSn() + "");
set("color", "#173177");
}});
set("keyword2", new JSONObject() {{
set("value", LocalDateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd " +
"HH:mm"));
set("color", "#173177");
}});
set("remark", new JSONObject() {{
set("value", "请尽快登录后台进行检查!");
set("color", "#173177");
}});
}};
wxPublicUtil.publishTemplateMsg(accessToken, receiver.getWxPublicOpenId(),
WxPublicUtil.DEVICE_OFFLINE_TEMPLATE_ID, null, msgData);
}
}
}
}
if (CollUtil.isNotEmpty(aliveDeviceSn)) {
baseMapper.updateDevice(0, DeviceType.HAIQING.getValue(), aliveDeviceSn);
}
baseMapper.updateDevice(1, DeviceType.HAIQING.getValue(), aliveDeviceSn);
}
private String spliceOpenDoor() {
//拼接json
HashMap<String, Object> map = new HashMap<>();
map.put("messageId", UUID.randomUUID().toString());
map.put("operator", "Unlock");
HashMap<String, Object> info = new HashMap<>();
info.put("openDoor", 1);
map.put("info", info);
return JSON.toJSONString(map);
}
private String spliceTopic(String deviceId) {
return "mqtt/face/" + deviceId;
}
private String spliceSetSysTime() {
HashMap<String, Object> map = new HashMap<>();
map.put("messageId", UUID.randomUUID().toString());
map.put("operator", "SetSysTime");
String date = LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.UTC_SIMPLE_PATTERN);
map.put("info", new HashMap<String, String>() {{
put("SysTime", date);
}});
return JSON.toJSONString(map);
}
/**
* 考勤设备数量统计
*
* @return com.yida.data.common.core.common.ResultBean<com.yida.data.attendance.vo.DeviceNumberVO>
* @author ZYJ
* @date 2021/10/8 17:14
*/
@Override
public ResultBean<DeviceNumberVO> findDeviceNumber() throws NoSuchMethodException {
// 需要查询的学校id集合
List<Long> schoolIds = new ArrayList<>();
CurrentUser currentUser = FebsUtil.getCurrentUser();
// 获取登陆用户角色类型
List<RoleEnum> roleList = new ArrayList<>();
if (StringUtils.isNotBlank(Objects.requireNonNull(currentUser).getRolePerms())) {
for (String rolePerm : Objects.requireNonNull(currentUser).getRolePerms().split(StringConstant.COMMA)) {
// 获取登陆角色类型
RoleEnum roleEnum = EnumUtils.valueOf(RoleEnum.class, rolePerm,
RoleEnum.class.getMethod("getValue"));
if (Objects.nonNull(roleEnum)) {
roleList.add(roleEnum);
}
}
}
if (CollectionUtils.isNotEmpty(roleList)) {
// 排序
RoleEnum roleEnum = roleList.stream().sorted(Comparator.comparing(RoleEnum::getOrder))
.collect(Collectors.toList()).get(0);
// 代理商相关账号
if (RoleEnum.ROLE_AGENT_ADMIN.equals(roleEnum) || RoleEnum.ROLE_AGENT_NORMAL.equals(roleEnum)) {
List<Dept> deptList = remoteDeptService.getSchoolByArea(null, null).getData();
if (CollUtil.isNotEmpty(deptList)) {
schoolIds = deptList.stream().map(Dept::getDeptId).collect(Collectors.toList());
}
} else if (RoleEnum.ROLE_SCHOOL_PRINCIPAL.equals(roleEnum)) {
// 学校负责人账号
schoolIds.add(currentUser.getDeptId());
} else {
return ResultBean.buildSuccess(
DeviceNumberVO.builder()
.totalNumber(0L)
.onlineNumber(0L)
.offlineNumber(0L)
.build());
}
}
// 查询不同状态考勤设备数量
Long offlineNumber = this.baseMapper.findDeviceNumber(schoolIds, DeviceStateEnum.OFFLINE_STATUS.getStatus());
Long onlineNumber = this.baseMapper.findDeviceNumber(schoolIds, DeviceStateEnum.ONLINE_STATUS.getStatus());
return ResultBean.buildSuccess(
DeviceNumberVO.builder()
.totalNumber(offlineNumber + onlineNumber)
.onlineNumber(onlineNumber)
.offlineNumber(offlineNumber)
.build()
);
}
@Override
public void timingAllDevice() {
Set<String> aliveDeviceSnKeys = redisService.keys(CachePrefixConstant.ALIVE_DEVICE);
List<String> aliveDeviceSn = CollUtil.isNotEmpty(aliveDeviceSnKeys)
? aliveDeviceSnKeys.stream().map(x -> x.substring(CachePrefixConstant.ALIVE_DEVICE.length()))
.collect(Collectors.toList()) : null;
if (CollUtil.isNotEmpty(aliveDeviceSn)) {
setAllTime(aliveDeviceSn);
}
}
@Override
public OnlineCountVO getOnlineDistrib(List<Long> schoolIds) {
OnlineCountVO vo = new OnlineCountVO();
if (CollUtil.isNotEmpty(schoolIds)) {
List<EduAttendanceDevice> cardList = list(
Wrappers.<EduAttendanceDevice>lambdaQuery().in(EduAttendanceDevice::getSchoolId, schoolIds)
.select(EduAttendanceDevice::getState));
Map<Integer, List<EduAttendanceDevice>> onlineGroup = cardList.stream()
.collect(Collectors.groupingBy(EduAttendanceDevice::getState));
vo.setOnlineNum(onlineGroup.getOrDefault(0, Collections.emptyList()).size());
vo.setOfflineNum(onlineGroup.getOrDefault(1, Collections.emptyList()).size());
}
return vo;
}
}
@@ -0,0 +1,66 @@
package com.yida.data.attendance.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yida.data.attendance.mapper.EduAttendanceManagePushResultMapper;
import com.yida.data.attendance.mapper.EduAttendanceResultMapper;
import com.yida.data.attendance.service.EduAttendanceManagePushResultService;
import com.yida.data.common.core.entity.attendance.EduAttendanceManagePushResult;
import com.yida.data.common.core.entity.attendance.EduAttendanceResult;
import com.yida.data.common.core.entity.constant.StringConstant;
import com.yida.data.common.core.entity.user.EduStudent;
import com.yida.data.user.feign.RemoteStudentService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 管理考勤结果推送记录service
*
* @author ZYJ
* @date 2022/7/15
*/
@Slf4j
@Service
@RequiredArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class EduAttendanceManagePushResultServiceImpl extends ServiceImpl<EduAttendanceManagePushResultMapper, EduAttendanceManagePushResult>
implements EduAttendanceManagePushResultService {
private final EduAttendanceResultMapper eduAttendanceResultMapper;
private final RemoteStudentService remoteStudentService;
@Override
public List<EduAttendanceResult> selectPushList(Long pushId) {
EduAttendanceManagePushResult result = getOne(Wrappers.lambdaQuery(new EduAttendanceManagePushResult())
.eq(EduAttendanceManagePushResult::getId, pushId));
if (Objects.isNull(result)) {
return new ArrayList<>();
}
List<EduAttendanceResult> resultList = new ArrayList<>();
// 考勤记录id
List<Long> resultIds = Stream.of(result.getResultId().split(StringConstant.COMMA))
.map(Long::valueOf).collect(Collectors.toList());
resultIds.forEach(resultId -> {
EduAttendanceResult eduAttendanceResult = eduAttendanceResultMapper.selectById(resultId);
EduStudent student = remoteStudentService.getStudentNoPermission(eduAttendanceResult.getStudentId()).getData();
if (Objects.nonNull(student)) {
eduAttendanceResult.setStuName(student.getStuName());
eduAttendanceResult.setPicUrl(student.getAvatar());
eduAttendanceResult.setStuNo(student.getStuNumber());
resultList.add(eduAttendanceResult);
}
});
return resultList;
}
}
@@ -0,0 +1,99 @@
package com.yida.data.attendance.service.impl;
import cc.mrbird.febs.common.redis.service.RedisService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yida.data.attendance.mapper.EduAttendanceNotArriveMapper;
import com.yida.data.attendance.service.EduAttendanceConfigService;
import com.yida.data.attendance.service.EduAttendanceNotArriveService;
import com.yida.data.common.core.entity.attendance.EduAttendanceConfig;
import com.yida.data.common.core.entity.attendance.EduAttendanceNotArrive;
import com.yida.data.common.core.entity.constant.AppConstant;
import com.yida.data.common.core.entity.constant.CachePrefixConstant;
import com.yida.data.common.core.entity.notice.qywx.TextSchoolNotice;
import com.yida.data.common.core.entity.notice.qywx.inside.Text;
import com.yida.data.common.core.entity.system.EduApp;
import com.yida.data.common.core.entity.user.EduParent;
import com.yida.data.common.core.entity.user.EduStudent;
import com.yida.data.common.core.utils.WxUtil;
import com.yida.data.common.service.CommonService;
import com.yida.data.user.feign.RemoteStudentService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;
@Slf4j
@Service
@RequiredArgsConstructor
@RefreshScope
public class EduAttendanceNotArriveServiceImpl extends ServiceImpl<EduAttendanceNotArriveMapper,
EduAttendanceNotArrive> implements EduAttendanceNotArriveService {
private static final String NOTICE_URL = "/attendance/url";
private final EduAttendanceConfigService eduAttendanceConfigService;
private final RemoteStudentService remoteStudentService;
private final RedisService redisService;
private final CommonService commonService;
private final WxUtil wxUtil;
@Value("${febs.pageUrl}")
private String pageUrl;
@Override
public void pushNotArriveMsg() {
List<EduAttendanceNotArrive> notArriveList = list();
if (CollUtil.isNotEmpty(notArriveList)) {
for (EduAttendanceNotArrive notArrive : notArriveList) {
LocalDateTime now = LocalDateTime.now();
EduAttendanceConfig config = eduAttendanceConfigService.getConfig(notArrive.getSchoolId());
// 推送间隔
Integer interval = notArrive.getType() == 0 ? config.getSchoolPushInterval() :
config.getDormitoryPushInterval();
// 未推送或已超过推送间隔
if (notArrive.getPushTime() == null || LocalDateTimeUtil.between(notArrive.getPushTime(),
now).toMinutes() >= interval) {
// 推送包含家长
if (notArrive.getPushObj() == 0 || notArrive.getPushObj() == 2) {
EduStudent student = (EduStudent) redisService.hget(CachePrefixConstant.STUDENT_DATA,
notArrive.getStudentId().toString());
if (student == null) {
student = remoteStudentService.getStudentNoPermission(notArrive.getStudentId()).getData();
}
if (student != null && CollUtil.isNotEmpty(student.getParents())) {
for (EduParent parent : student.getParents()) {
//构建消息
// String msg = String.format("【平安校园警告】尊敬的%s%s,截止%s,%s" +
// "并未进入学校,请您尽快确认学生位置,确保学生的人身安全。<a href=\"%s\">请点击此处确认消息</a>",
String msg = String.format("【平安校园警告】尊敬的%s%s,截止%s,%s" +
"并未进入学校,请您尽快确认学生位置,确保学生的人身安全。",
notArrive.getStudentName(), parent.getParentType(),
LocalDateTimeUtil.format(now, "yyyy年MM月dd日HH时mm分ss秒"),
notArrive.getStudentName());
// 发送通知消息
EduApp app = commonService.getAppByCodeAndSchool(AppConstant.ATTENDANCE_PARENT, null,
notArrive.getSchoolId());
TextSchoolNotice notice = new TextSchoolNotice();
notice.setTo_parent_userid(Collections.singletonList(parent.getWxId()));
notice.setText(new Text(msg));
wxUtil.pushSchoolNotice(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()),
notice);
notArrive.setPushTime(now);
}
}
}
}
}
// 更新推送
updateBatchById(notArriveList);
}
}
}
@@ -0,0 +1,26 @@
package com.yida.data.attendance.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yida.data.common.core.entity.attendance.EduAttendanceNotice;
import com.yida.data.attendance.mapper.EduAttendanceNoticeMapper;
import com.yida.data.attendance.service.EduAttendanceNoticeService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class EduAttendanceNoticeServiceImpl extends ServiceImpl<EduAttendanceNoticeMapper, EduAttendanceNotice> implements EduAttendanceNoticeService {
@Override
public List<EduAttendanceNotice> listNoticeByParent(Long parentId) {
return list(Wrappers.lambdaQuery(new EduAttendanceNotice()).eq(EduAttendanceNotice::getParentId
, parentId).orderByDesc(EduAttendanceNotice::getId));
}
@Override
public void sendNotice(Long id) {
}
}
@@ -0,0 +1,793 @@
package com.yida.data.attendance.service.impl;
import cc.mrbird.febs.common.redis.service.RedisService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yida.data.attendance.dto.DealRecordDTO;
import com.yida.data.attendance.dto.InOutPageDTO;
import com.yida.data.attendance.dto.ListRecordDTO;
import com.yida.data.attendance.mapper.EduAttendanceDeviceMapper;
import com.yida.data.attendance.mapper.EduAttendanceRecordMapper;
import com.yida.data.attendance.mapper.EduAttendanceStaffRecordMapper;
import com.yida.data.attendance.service.*;
import com.yida.data.attendance.vo.*;
import com.yida.data.common.core.entity.attendance.*;
import com.yida.data.common.core.entity.constant.CachePrefixConstant;
import com.yida.data.common.core.entity.school.EduDormitoryRoom;
import com.yida.data.common.core.entity.user.EduStaff;
import com.yida.data.common.core.entity.user.EduStudent;
import com.yida.data.common.core.enums.AttendanceResult;
import com.yida.data.common.core.utils.ExcelUtil;
import com.yida.data.common.service.CommonService;
import com.yida.data.school.dto.index.ListDormRoomDTO;
import com.yida.data.school.feign.facility.RemoteDormitoryService;
import com.yida.data.user.dto.ListStudentDTO;
import com.yida.data.user.feign.RemoteStaffService;
import com.yida.data.user.feign.RemoteStudentService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Slf4j
@RequiredArgsConstructor
@Service
public class EduAttendanceRecordServiceImpl extends
ServiceImpl<EduAttendanceRecordMapper, EduAttendanceRecord> implements EduAttendanceRecordService {
// 修改学生在校,离校,在寝,离寝状态线程池
private static final ExecutorService UPDATE_STUDENT_POOL = new ThreadPoolExecutor(5, 10, 1,
TimeUnit.MINUTES, new LinkedBlockingQueue<>());
private final EduAttendanceRuleService eduAttendanceRuleService;
private final EduAttendanceConfigService eduAttendanceConfigService;
private final NoticeService noticeService;
private final EduAttendanceDeviceMapper eduAttendanceDeviceMapper;
private final EduAttendanceResultService eduAttendanceResultService;
private final EduAttendanceStaffRecordMapper eduAttendanceStaffRecordMapper;
private final RemoteStudentService remoteStudentService;
private final RemoteStaffService remoteStaffService;
private final RemoteDormitoryService remoteDormitoryService;
private final RedisService redisService;
private final EduAttendanceStaffRuleService eduAttendanceStaffRuleService;
private final EduAttendanceStaffResultService eduAttendanceStaffResultService;
private final CommonService commonService;
@Override
public IPage<InOutDormPageVO> listInOutPage(InOutPageDTO dto) {
// 获取学生
List<Long> studentIds = null;
ListStudentDTO listStudentDTO = ListStudentDTO.builder().isQueryParent(false).isQuerySchoolName(false).build();
BeanUtils.copyProperties(dto, listStudentDTO);
listStudentDTO.setType(null);
if (dto.getDormId() != null) {
List<EduDormitoryRoom> data =
remoteDormitoryService
.listDormRoom(ListDormRoomDTO.builder().dormIds(Collections.singletonList(dto.getDormId())).build())
.getData();
if (CollUtil.isNotEmpty(data)) {
listStudentDTO.setDormRoomIds(data.stream().map(EduDormitoryRoom::getId).collect(Collectors.toList()));
}
}
// 查询匹配的学生
List<EduStudent> studentList = remoteStudentService.listStudent(listStudentDTO).getData();
if (CollUtil.isNotEmpty(studentList)) {
if (StrUtil.isNotBlank(dto.getKeyword())) {
studentList = studentList.stream()
.filter(x -> StrUtil.concat(true, x.getStuName(), x.getStuNumber()).contains(dto.getKeyword()))
.collect(Collectors.toList());
}
if (CollUtil.isNotEmpty(studentList)) {
studentIds = studentList.stream().map(EduStudent::getId).collect(Collectors.toList());
}
}
Page<InOutDormPageVO> recordPage = Page.of(dto.getPageNum(), dto.getPageSize());
recordPage.setRecords(baseMapper.listInOut(recordPage, studentIds, dto.getType(), dto.getStartTime(), dto.getEndTime()));
if (CollUtil.isNotEmpty(recordPage.getRecords()) && CollUtil.isNotEmpty(studentList)) {
List<InOutDormPageVO> records = recordPage.getRecords();
List<Long> studentId = records.stream().map(InOutPageVO::getStudentId).collect(Collectors.toList());
Map<Long, List<EduStudent>> studengIdGroup = studentList.stream().filter(x -> studentId.contains(x.getId()))
.collect(Collectors.groupingBy(EduStudent::getId));
for (InOutPageVO record : records) {
EduStudent eduStudent = studengIdGroup.get(record.getStudentId()).get(0);
record.setCampusName(eduStudent.getCampusName());
record.setStuName(eduStudent.getStuName());
record.setStuNumber(eduStudent.getStuNumber());
}
}
return recordPage;
}
@Override
public void exportInOut(InOutPageDTO dto, HttpServletResponse response) {
// 获取学生
List<Long> studentIds = null;
ListStudentDTO listStudentDTO = ListStudentDTO.builder().isQueryParent(false).isQuerySchoolName(false).build();
BeanUtils.copyProperties(dto, listStudentDTO);
listStudentDTO.setType(null);
if (dto.getDormId() != null) {
List<EduDormitoryRoom> data = remoteDormitoryService
.listDormRoom(ListDormRoomDTO.builder().dormIds(Collections.singletonList(dto.getDormId())).build()).getData();
if (CollUtil.isNotEmpty(data)) {
listStudentDTO.setDormRoomIds(data.stream().map(EduDormitoryRoom::getId).collect(Collectors.toList()));
}
}
// 查询匹配的学生
List<EduStudent> studentList = remoteStudentService.listStudent(listStudentDTO).getData();
if (CollUtil.isNotEmpty(studentList)) {
if (StrUtil.isNotBlank(dto.getKeyword())) {
studentList = studentList.stream()
.filter(
x -> x.getStuName().contains(dto.getKeyword()) || x.getStuNumber().contains(dto.getKeyword()))
.collect(Collectors.toList());
}
if (CollUtil.isNotEmpty(studentList)) {
studentIds = studentList.stream().map(EduStudent::getId).collect(Collectors.toList());
}
}
List<InOutDormPageVO> recordList = baseMapper.listInOut(null, studentIds, dto.getType(), dto.getStartTime(),
dto.getEndTime());
if (CollUtil.isNotEmpty(studentList)) {
for (InOutPageVO record : recordList) {
for (EduStudent student : studentList) {
if (record.getStudentId().equals(student.getId())) {
record.setCampusName(student.getCampusName());
record.setStuName(student.getStuName());
record.setStuNumber(student.getStuNumber());
break;
}
}
}
}
if (dto.getType() == 0) {
ExcelUtil.export("校门进出记录表.xlsx", InOutPageVO.class, recordList.stream().map(x -> {
InOutPageVO vo = new InOutPageVO();
BeanUtils.copyProperties(x, vo);
return vo;
}).collect(Collectors.toList()), response);
} else {
ExcelUtil.export("宿舍进出记录表.xlsx", InOutDormPageVO.class, recordList, response);
}
}
@Override
public RecordDetailVO getRecordDetail(Long id) {
return baseMapper.getRecordDetail(id);
}
@Override
public void receiveRecord(DealRecordDTO dto) {
String createTimeStr = dto.getDate();
// 从缓存中获取上一条考勤记录时间
Object lastRecordTime = redisService.hget(CachePrefixConstant.ATTENDANCE_RECORD_LAST, dto.getUserFlag());
if (createTimeStr.equals(lastRecordTime)) {
return;
}
redisService.hset(CachePrefixConstant.ATTENDANCE_RECORD_LAST, dto.getUserFlag(), createTimeStr);
// 查设备
EduAttendanceDevice device = (EduAttendanceDevice) redisService
.hget(CachePrefixConstant.DEVICE_DATA, dto.getSn());
if (device == null) {
device = eduAttendanceDeviceMapper.selectOne(Wrappers.<EduAttendanceDevice>lambdaQuery()
.eq(EduAttendanceDevice::getSn, dto.getSn()));
if (device == null) {
return;
}
redisService.hset(CachePrefixConstant.DEVICE_DATA, dto.getSn(), device);
}
AttendanceResVO attendanceResVO = dealAttendance(dto, device);
if (dto.getUserType() == 0 && attendanceResVO != null) {
try {
noticeService.sendAttendanceNotice(attendanceResVO);
} catch (Exception e) {
log.error("考勤消息推送失败", e);
}
}
}
@Override
public List<RecordDetailVO> listRecord(ListRecordDTO dto) {
return baseMapper.listRecord(dto);
}
private AttendanceResVO dealAttendance(DealRecordDTO dto, EduAttendanceDevice device) {
AttendanceResVO vo = new AttendanceResVO();
// 学生考勤
if (dto.getUserType() == 0) {
EduAttendanceRecord record = new EduAttendanceRecord();
//考勤记录基本信息
record.setPicUrl(dto.getPicUrl());
record.setStudentId(dto.getUserId());
record.setDeviceId(device.getId());
record.setDeviceName(device.getName());
record.setScope(device.getZoneScope());
record.setZone(device.getType());
record.setCreateDate(LocalDateTime.now());
record.setCreateTime(LocalDateTimeUtil.parse(dto.getDate(), "yyyy-MM-dd HH:mm:ss"));
// 查询学生
EduStudent student = (EduStudent) redisService
.hget(CachePrefixConstant.STUDENT_DATA, dto.getUserId().toString());
if (student == null) {
student = remoteStudentService.getStudentNoPermission(dto.getUserId()).getData();
if (student == null) {
log.error("学生不存在,无法处理考勤数据,id:[{}]", dto.getUserId().toString());
return null;
} else {
redisService.hset(CachePrefixConstant.STUDENT_DATA, dto.getUserId().toString(), student);
}
}
// 处理学生在校离校,在寝离寝状态,处于门禁 与考勤无关
EduStudent finalStudent = student;
UPDATE_STUDENT_POOL.execute(() -> {
//0-校门,1-宿舍
if (device.getType() == 0) {
//更新在校离校
if (!device.getZoneScope().equals(finalStudent.getStatus())) {
remoteStudentService.updateStudentStatus(finalStudent.getId(), device.getZoneScope(), null);
}
} else {
//更新宿舍-在寝离寝状态
if (finalStudent.getType() == 1 && !device.getZoneScope().equals(finalStudent.getDormStatus())) {
remoteStudentService.updateStudentStatus(finalStudent.getId(), 0, device.getZoneScope());
}
}
// if (device.getType() == 0 && !device.getZoneScope().equals(finalStudent.getStatus())) {
// remoteStudentService.updateStudentStatus(finalStudent.getId(), device.getZoneScope(), null);
// } else if (finalStudent.getType() == 1 && device.getType() == 1
// && !device.getZoneScope().equals(finalStudent.getDormStatus())) {
// remoteStudentService.updateStudentStatus(finalStudent.getId(), 0, device.getZoneScope());
// }
});
// 学生相关信息
record.setSchoolId(student.getSchoolId());
record.setCampusId(student.getCampusId());
record.setGradeId(student.getGradeId());
record.setGradeName(student.getGradeName());
record.setClassId(student.getClassId());
record.setClassName(student.getClassName());
vo.setStudent(student);
// 该条考勤记录适用的规则
RuleListVO validRule = eduAttendanceRuleService.getValidRule(
Arrays.asList(
student.getClassId(), student.getGradeId(), student.getSectionId(), student.getCampusId(),
-student.getSchoolId()),
record.getCreateTime(),
null,
device.getSn());
// 学校的考勤设置
EduAttendanceConfig config =
(EduAttendanceConfig) redisService.hget(CachePrefixConstant.ATTENDANCE_CONFIG,
student.getSchoolId().toString());
if (config == null) {
config = eduAttendanceConfigService.getConfig(student.getSchoolId());
redisService.hset(CachePrefixConstant.ATTENDANCE_CONFIG, student.getSchoolId().toString(), config);
}
LocalTime operateTime = record.getCreateTime().toLocalTime();
//根据规则判断上学考勤还是宿舍考勤
if (validRule != null) {
for (int i = 0; i < validRule.getTimeList().size(); i++) {
EduAttendanceRuleTime ruleTime = validRule.getTimeList().get(i);
if (validRule.getType() == 0) {
//上学考勤
//
if (operateTime.isBefore(ruleTime.getTime1())) {
if (ruleTime.getTime1Openset() == 1) {
if (operateTime.isAfter(ruleTime.getTime1Start()) && operateTime
.isBefore(ruleTime.getTime1End())) {
// 在有效打卡时间段之内
record.setStatus(0);
record.setStiTime(ruleTime.getTime1());
} else {
record.setStatus(10);
record.setStiTime(ruleTime.getTime1());
}
} else {
// 在时间一之前正常
record.setStatus(0);
record.setStiTime(ruleTime.getTime1());
}
} else if (operateTime.isAfter(ruleTime.getTime1()) && operateTime
.isBefore(ruleTime.getTime2())) {
//是否前面有签到记录,如果前面无打卡记录则为迟到,如果有打卡记录则为早退
if (fingStudentRecord(student.getId(), validRule.getId(), ruleTime.getId())) {
//含有打卡记录为早退
record.setStatus(2);
record.setStiTime(ruleTime.getTime2());
} else {
//不含有打卡记录为迟到
record.setStatus(1);
record.setStiTime(ruleTime.getTime1());
}
} else if (operateTime.isAfter(ruleTime.getTime2())) {
if (fingStudentRecord(student.getId(), validRule.getId(), ruleTime.getId())) {
//前面含有打卡记录,如果无打卡记录,则表示下一时间段的开始时间打卡,此次不记录
//在时间段2之后 与 下一时间段time1之前为 正常,
EduAttendanceRuleTime nextRuleTime = validRule.getTimeList().get(i + 1);
if (ObjectUtil.isNotNull(nextRuleTime)) {
//含有下一时间段
if (operateTime.isBefore(nextRuleTime.getTime1())) {
if (ruleTime.getTime2Openset() == 1) {
if (operateTime.isAfter(ruleTime.getTime2Start()) && operateTime
.isBefore(ruleTime.getTime2End())) {
//下一时间段之前,下课考勤正常
record.setStatus(0);
record.setStiTime(ruleTime.getTime2());
} else {
//下一时间段之前,下课考勤正常
record.setStatus(20);
record.setStiTime(ruleTime.getTime2());
}
} else {
//下一时间段之前,下课考勤正常
record.setStatus(0);
record.setStiTime(ruleTime.getTime2());
}
}
} else {
if (ruleTime.getTime2Openset() == 1) {
if (operateTime.isAfter(ruleTime.getTime2Start()) && operateTime
.isBefore(ruleTime.getTime2End())) {
//下学有效打卡时间段内
record.setStatus(0);
record.setStiTime(ruleTime.getTime2());
} else {
//未在下学有效打卡时间段内
record.setStatus(20);
record.setStiTime(ruleTime.getTime2());
}
} else {
//不含有下一时间段,
record.setStatus(0);
record.setStiTime(ruleTime.getTime2());
}
}
}
}
} else {
//宿舍考勤
if (operateTime.isBefore(ruleTime.getTime2()) && operateTime.isAfter(ruleTime.getTime1())) {
// 在时间二之前、时间一之后正常
record.setStatus(0);
record.setStiTime(ruleTime.getTime1());
} else if (operateTime.isAfter(ruleTime.getTime2()) && operateTime
.isBefore(ruleTime.getTime3())) {
// 在时间二与时间三之间晚归
record.setStatus(4);
record.setStiTime(ruleTime.getTime2());
} else if (operateTime.isAfter(ruleTime.getTime3())) {
//大于晚归时间
if (i < validRule.getTimeList().size() - 1) {
EduAttendanceRuleTime nextRuleTime = validRule.getTimeList().get(i + 1);
if (ObjectUtil.isNotNull(nextRuleTime)) {
if (operateTime.isBefore(nextRuleTime.getTime1())) {
record.setStatus(5);
}
} else {
record.setStatus(5);
}
} else {
record.setStatus(5);
}
}
}
if (record.getStatus() != null) {
// 拿到考勤结果 不再匹配
record.setRuleId(validRule.getId());
record.setRuleTimeId(ruleTime.getId());
break;
}
}
}
// 住宿生的宿舍情况
if (student.getType() == 1 && device.getType() == 1) {
record.setDormId(student.getDormId());
record.setDormRoomId(student.getDormRoomId());
if (student.getDormRoomId() != null) {
// 录缓存
EduDormitoryRoom dormRoom = (EduDormitoryRoom) redisService
.hget(CachePrefixConstant.FACILITY_DORM_ROOM, student.getDormRoomId().toString());
if (dormRoom == null) {
dormRoom = remoteDormitoryService.getDormRoomNoPermission(student.getDormRoomId()).getData();
if (dormRoom != null) {
redisService
.hset(CachePrefixConstant.FACILITY_DORM_ROOM, student.getDormRoomId().toString(), dormRoom);
}
}
if (dormRoom != null) {
record.setDormName(dormRoom.getDormName());
record.setDormRoomName(dormRoom.getName());
}
}
}
// 判断该次考勤状态
// if (validRule != null) {
// for (EduAttendanceRuleTime ruleTime : validRule.getTimeList()) {
// // 遍历每一个时间
// if (device.getType() == 0) {
// // 校门
// if (device.getZoneScope() == 0) {
// // 进门
// if (operateTime.isBefore(ruleTime.getTime1())) {
// // 在时间一之前正常
// record.setStatus(0);
// record.setStiTime(ruleTime.getTime1());
// } else if (operateTime.isAfter(ruleTime.getTime1()) && operateTime
// .isBefore(ruleTime.getTime2())) {
// // 在时间二与时间一之间为迟到
// record.setStatus(1);
// record.setStiTime(ruleTime.getTime1());
// }
// } else if (device.getZoneScope() == 1) {
// // 出门
// if (operateTime.isBefore(ruleTime.getTime1())) {
// // 在时间一之前正常
// record.setStatus(0);
// record.setStiTime(ruleTime.getTime2());
// } else if (operateTime.isAfter(ruleTime.getTime1()) && operateTime
// .isBefore(ruleTime.getTime2())) {
// // 在时间二与时间一之间为早退
// record.setStatus(2);
// record.setStiTime(ruleTime.getTime2());
// }
// }
// } else if (device.getType() == 1) {
// // 宿舍
// if (device.getZoneScope() == 0) {
// // 进门
// if (operateTime.isBefore(ruleTime.getTime2()) && operateTime.isAfter(ruleTime.getTime1())) {
// // 在时间二之前、时间一之后正常
// record.setStatus(0);
// } else if (operateTime.isAfter(ruleTime.getTime2()) && operateTime
// .isBefore(ruleTime.getTime3())) {
// // 在时间二与时间三之间晚归
// record.setStatus(4);
// } else if (operateTime.isAfter(ruleTime.getTime3()) && ruleTime.getType() == 1
// && operateTime.isBefore(config.getDormitoryNoonDdl())) {
// // 中午的截止考勤时间之后 旷宿时间之前
// record.setStatus(5);
// } else if (ruleTime.getType() == 2 && (operateTime.isAfter(ruleTime.getTime3())
// || (operateTime.isBefore(config.getDormitoryNightDdl())))) {
// // 晚上的截止考勤时间之后或者凌晨的旷宿时间之前
// record.setStatus(5);
// }
// }
// }
// if (record.getStatus() != null) {
// // 拿到考勤结果 不再匹配
// record.setRuleId(validRule.getId());
// record.setRuleTimeId(ruleTime.getId());
// break;
// }
// }
// }
// 保存考勤结果
save(record);
vo.setRecord(record);
//生成考勤结果 TODO
//去查询当前规则下学员的考勤记录,进行综合判断
// if(ObjectUtil.equal("1",config.getState())){
// //启用考勤
// }
// saveAttendanceResult(record);
} else {
EduAttendanceStaffRecord staffRecord = new EduAttendanceStaffRecord();
// 查询教职工
EduStaff staff = (EduStaff) redisService.hget(CachePrefixConstant.STAFF_DATA, dto.getUserId().toString());
if (staff == null) {
staff = remoteStaffService.getStaff(dto.getUserId()).getData();
redisService.hset(CachePrefixConstant.STAFF_DATA, dto.getUserId().toString(), staff);
}
staffRecord.setStaffId(staff.getId());
staffRecord.setDeviceId(device.getId());
staffRecord.setSchoolId(staff.getSchoolId());
staffRecord.setCreateTime(DateUtil.parseLocalDateTime(dto.getDate(), "yyyy-MM-dd HH:mm:ss"));
staffRecord.setScope(device.getZoneScope());
staffRecord.setPicUrl(dto.getPicUrl());
eduAttendanceStaffRecordMapper.insert(staffRecord);
// 处理职工考勤结果
dealStaffAttendanceResult(staffRecord);
vo.setStaff(staff);
}
return vo;
}
public void saveAttendanceResult(EduAttendanceRecord record) {
if (ObjectUtil.isNull(record)) {
return;
}
if (ObjectUtil.isNull(record.getStatus())) {
return;
}
//迟到,早退、上学未在打卡时间段、下学未在打卡时间段、晚归 、异常晚归 直接记录考勤结果,其他结果需要统计
//-1-宿管添加的考勤记录,0-正常,1-迟到,10-上学未在打卡时间段,2-早退,20-下学未在打卡时间段,3-未到,4-晚归,5-异常晚归,6-旷宿
//查询当天此考勤结果是否已录入
List<EduAttendanceResult> list = eduAttendanceResultService.list(Wrappers.lambdaQuery(new EduAttendanceResult())
.eq(EduAttendanceResult::getRuleTimeId, record.getRuleTimeId())
.eq(EduAttendanceResult::getStudentId, record.getStudentId())
.eq(EduAttendanceResult::getStatus, record.getStatus())
.eq(EduAttendanceResult::getAttendanceDate, record.getCreateDate().toLocalDate()));
EduAttendanceResult eduAttendanceResult = new EduAttendanceResult();
eduAttendanceResult.setStudentId(record.getStudentId());
eduAttendanceResult.setSchoolId(record.getSchoolId());
eduAttendanceResult.setCampusId(record.getCampusId());
eduAttendanceResult.setGradeId(record.getGradeId());
eduAttendanceResult.setGradeName(record.getGradeName());
eduAttendanceResult.setClassId(record.getClassId());
eduAttendanceResult.setClassName(record.getClassName());
eduAttendanceResult.setCreateDate(LocalDateTime.now());
eduAttendanceResult.setAttendanceDate(LocalDate.now());
eduAttendanceResult.setRuleId(record.getRuleId());
eduAttendanceResult.setRuleTimeId(record.getRuleTimeId());
eduAttendanceResult.setRecordId(record.getId());
//查找出当前时间段内学生已记录的考勤记录
// EduAttendanceResult alreadyResult = eduAttendanceResultService.getOne(Wrappers.lambdaQuery(new EduAttendanceResult())
// .eq(EduAttendanceResult::getAttendanceDate, LocalDate.now())
// .eq(EduAttendanceResult::getStudentId, record.getStudentId())
// .eq(EduAttendanceResult::getRuleId, record.getRuleId())
// .eq(EduAttendanceResult::getRuleTimeId, record.getRuleTimeId()));
//
// if (ObjectUtil.isNull(alreadyResult)) {
// eduAttendanceResult.setStudentId(record.getStudentId());
// eduAttendanceResult.setSchoolId(record.getSchoolId());
// eduAttendanceResult.setCampusId(record.getCampusId());
// eduAttendanceResult.setGradeId(record.getGradeId());
// eduAttendanceResult.setGradeName(record.getGradeName());
// eduAttendanceResult.setClassId(record.getClassId());
// eduAttendanceResult.setClassName(record.getClassName());
// eduAttendanceResult.setCreateDate(LocalDateTime.now());
// eduAttendanceResult.setAttendanceDate(LocalDate.now());
// eduAttendanceResult.setRuleId(record.getRuleId());
// eduAttendanceResult.setRuleTimeId(record.getRuleTimeId());
// eduAttendanceResult.setRecordId(record.getId());
// } else {
// eduAttendanceResult.setId(alreadyResult.getId());
// }
//100-正常,201-迟到,202-早退,203-迟到早退,204-旷课,205-请假,211-晚归,212-异常晚归,213-旷宿,214-已被核查但学生还未归寝
// -1-宿管添加的考勤记录,0-正常,1-迟到,10-上学未在打卡时间段,2-早退,20-下学未在打卡时间段,3-未到,4-晚归,5-异常晚归,6-旷宿
if (record.getStatus() == 0 || record.getStatus() == 1 || record.getStatus() == 10 || record.getStatus() == 2
|| record.getStatus() == 20
|| record.getStatus() == 4 || record.getStatus() == 5) {
if (CollUtil.isEmpty(list)) {
eduAttendanceResult.setStatus(
record.getStatus() == 0 ? AttendanceResult.NORMAL.getValue()
: record.getStatus() == 1 ? AttendanceResult.STU_LATE
.getValue() : record.getStatus() == 10 ? AttendanceResult.STU_START_NOT_IN.getValue()
: record.getStatus() == 2 ? AttendanceResult.STU_LEAVE
.getValue() : record.getStatus() == 20 ? AttendanceResult.STU_END_NOT_IN.getValue()
: record.getStatus() == 4 ? AttendanceResult.STU_D_LATE.getValue()
: AttendanceResult.STU_D_EX_LATE.getValue());
if (record.getZone() == 1) {
//宿舍考勤
eduAttendanceResult.setDormId(record.getDormId());
eduAttendanceResult.setDormName(record.getDormName());
eduAttendanceResult.setDormRoomId(record.getDormRoomId());
eduAttendanceResult.setDormRoomName(record.getDormRoomName());
}
eduAttendanceResultService.save(eduAttendanceResult);
}
}
}
public boolean fingStudentRecord(Long studentId, Long ruleId, Long ruleTimeId) {
List<EduAttendanceRecord> eduAttendanceRecords = baseMapper.selectList(Wrappers.lambdaQuery(new EduAttendanceRecord())
.eq(EduAttendanceRecord::getStudentId, studentId)
.eq(EduAttendanceRecord::getRuleId, ruleId)
.eq(EduAttendanceRecord::getRuleTimeId, ruleTimeId));
if (ObjectUtil.isNotEmpty(eduAttendanceRecords)) {
return true;
}
return false;
}
/**
* 处理教职工考勤结果
*
* @param staffRecord 教职工考勤-进出记录
* @author ZYJ
* @date 2022/9/13 16:06
*/
public void dealStaffAttendanceResult(EduAttendanceStaffRecord staffRecord) {
// 查询教职工适用的考勤规则
FindStaffRuleVO staffRuleVO = eduAttendanceStaffRuleService.selectMatchStaffRule(staffRecord);
// log.info("教师适用考勤规则:{}", staffRuleVO);
// 没有匹配的规则就不生成考勤结果
if (Objects.nonNull(staffRuleVO)) {
boolean isSpecialDate = false;
// 判断是否为特殊日期
LocalDate nowDate = LocalDate.now();
if (CollUtil.isNotEmpty(staffRuleVO.getSpecialDate())) {
for (EduAttendanceStaffRuleSpecialDate specialDate : staffRuleVO.getSpecialDate()) {
if (nowDate.isEqual(specialDate.getDate())) {
isSpecialDate = true;
break;
}
}
}
if (isSpecialDate) {
return;
}
// 判断是否为节假日
Boolean workDay = commonService.isWorkDay(nowDate);
if (!workDay) {
return;
}
Long ruleId = staffRuleVO.getId();
// 考勤-打卡时间段
List<EduAttendanceStaffRuleTime> staffRuleTimes = staffRuleVO.getRuleTimes();
// 循环打卡时间段
for (int i = 0; i < staffRuleTimes.size(); i++) {
EduAttendanceStaffRuleTime eduAttendanceStaffRuleTime = staffRuleTimes.get(i);
// 考勤开始时间
LocalTime startTime = eduAttendanceStaffRuleTime.getStartTime();
// 考勤结束时间
LocalTime endTime = eduAttendanceStaffRuleTime.getEndTime();
Long ruleTimeId = eduAttendanceStaffRuleTime.getId();
// 判断是否包含白名单. 白名单内不需要考勤
boolean whiteFlag = false;
if (CollUtil.isNotEmpty(staffRuleVO.getWhiteList())) {
List<Long> list = staffRuleVO.getWhiteList().stream()
.map(EduAttendanceStaffRuleWhiteList::getStaffId).collect(Collectors.toList());
whiteFlag = list.contains(staffRecord.getStaffId());
}
// 进出日期
LocalDate date = staffRecord.getCreateTime().toLocalDate();
// 进出时间
LocalTime time = staffRecord.getCreateTime().toLocalTime();
// 判断当天是否有生成对应时段的考勤结果
EduAttendanceStaffResult staffResult = eduAttendanceStaffResultService.getOne(
Wrappers.lambdaQuery(new EduAttendanceStaffResult())
.eq(EduAttendanceStaffResult::getStaffId, staffRecord.getStaffId())
.eq(EduAttendanceStaffResult::getRuleId, ruleId)
.eq(EduAttendanceStaffResult::getRuleTimeId, ruleTimeId)
.eq(EduAttendanceStaffResult::getAttendanceDate, date)
);
// 当天没有考勤结果
if (Objects.isNull(staffResult)) {
// 设置考勤结果基础数据
staffResult = new EduAttendanceStaffResult();
staffResult.setStaffId(staffRecord.getStaffId());
staffResult.setSchoolId(staffRecord.getSchoolId());
staffResult.setRuleId(ruleId);
staffResult.setRuleTimeId(ruleTimeId);
staffResult.setAttendanceDate(date);
staffResult.setStartStiTime(eduAttendanceStaffRuleTime.getStartEffectiveStatus() == 0 ?
startTime : eduAttendanceStaffRuleTime.getStartEffectiveStartTime());
staffResult.setEndStiTime(eduAttendanceStaffRuleTime.getEndEffectiveStatus() == 0 ?
endTime : eduAttendanceStaffRuleTime.getEndEffectiveStartTime());
}
// 状态 0-正常,1-迟到,2-早退,3-旷工,4-迟到早退,5-上班未在打卡时间段,6-下班未在打卡时间段
if (time.isBefore(eduAttendanceStaffRuleTime.getStartTime())) {
// 启用上班打卡时段
if (eduAttendanceStaffRuleTime.getStartEffectiveStatus() == 1) {
if (time.isAfter(eduAttendanceStaffRuleTime.getStartEffectiveStartTime()) && time
.isBefore(eduAttendanceStaffRuleTime.getStartEffectiveEndTime())) {
// 在有效打卡时间段之内
staffResult.setStatus(0);
staffResult.setStartRealTime(time);
} else {
staffResult.setStatus(whiteFlag ? 0 : 5);
staffResult.setStartRealTime(time);
}
} else {
// 未启用上班打卡时段
// 在时间一之前正常
staffResult.setStatus(0);
staffResult.setStartRealTime(time);
}
staffRecord.setRuleId(ruleId);
staffRecord.setRuleTimeId(ruleTimeId);
} else if (time.isAfter(eduAttendanceStaffRuleTime.getStartTime()) && time
.isBefore(eduAttendanceStaffRuleTime.getEndTime())) {
// 是否前面有签到记录,如果前面无打卡记录则为迟到,如果有打卡记录则为早退
if (Objects.nonNull(staffResult.getId())) {
// 含有打卡记录为早退
staffResult.setStatus(whiteFlag ? 0 : 2);
} else {
// 不含有打卡记录为迟到
staffResult.setStatus(whiteFlag ? 0 : 1);
}
staffResult.setStartRealTime(time);
staffRecord.setRuleId(ruleId);
staffRecord.setRuleTimeId(ruleTimeId);
} else if (time.isAfter(eduAttendanceStaffRuleTime.getEndTime())) {
// 前面含有打卡记录,如果无打卡记录,则表示下一时间段的开始时间打卡,此次不记录
// 在时间段2之后 与 下一时间段time1之前为 正常
// 状态 0-正常,1-迟到,2-早退,3-旷工,4-迟到早退,5-上班未在打卡时间段,6-下班未在打卡时间段
EduAttendanceStaffRuleTime nextRuleTime = staffRuleTimes.get(i + 1);
if (Objects.nonNull(nextRuleTime)) {
// 含有下一时间段
if (time.isBefore(nextRuleTime.getStartTime())) {
if (eduAttendanceStaffRuleTime.getEndEffectiveStatus() == 1) {
if (time.isAfter(eduAttendanceStaffRuleTime.getEndEffectiveStartTime()) && time
.isBefore(eduAttendanceStaffRuleTime.getEndEffectiveEndTime())) {
// 下一时间段之前,下班考勤正常
staffResult.setStatus(0);
staffResult.setEndRealTime(time);
} else {
// 下一时间段之前,下课考勤正常
staffResult.setStatus(whiteFlag ? 0 : 6);
staffResult.setEndRealTime(time);
}
} else {
// 下一时间段之前,下课考勤正常
staffResult.setStatus(0);
staffResult.setEndRealTime(time);
}
staffRecord.setRuleId(ruleId);
staffRecord.setRuleTimeId(ruleTimeId);
}
} else {
if (eduAttendanceStaffRuleTime.getEndEffectiveStatus() == 1) {
if (time.isAfter(eduAttendanceStaffRuleTime.getEndEffectiveStartTime()) && time
.isBefore(eduAttendanceStaffRuleTime.getEndEffectiveEndTime())) {
// 下班有效打卡时间段内
staffResult.setStatus(0);
staffResult.setEndRealTime(time);
} else {
// 未在下学有效打卡时间段内
staffResult.setStatus(whiteFlag ? 0 : 6);
staffResult.setEndRealTime(time);
}
} else {
// 不含有下一时间段
staffResult.setStatus(0);
staffResult.setEndRealTime(time);
staffResult.setEndRealTime(time);
}
staffRecord.setRuleId(ruleId);
staffRecord.setRuleTimeId(ruleTimeId);
}
}
eduAttendanceStaffRecordMapper.updateById(staffRecord);
boolean b = eduAttendanceStaffResultService.saveOrUpdate(staffResult);
}
}
}
// public void dealStudentAttendanceResult(EduAttendanceRecord record) {
// //迟到,
// Integer status = record.getStatus();
// eduAttendanceResultService.getOne(Wrappers.lambdaQuery(new EduAttendanceResult())
// .eq(EduAttendanceResult::getAttendanceDate,LocalDateTimeUtil.now().toLocalDate())
// .eq(EduAttendanceResult::getStudentId,record.getStudentId()));
//
// }
}
@@ -0,0 +1,665 @@
package com.yida.data.attendance.service.impl;
import cc.mrbird.febs.common.redis.service.RedisService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yida.data.attendance.dto.AttendanceResultPageDTO;
import com.yida.data.attendance.dto.ListStudentResultDTO;
import com.yida.data.attendance.mapper.EduAttendanceRecordMapper;
import com.yida.data.attendance.mapper.EduAttendanceResultMapper;
import com.yida.data.attendance.mapper.EduAttendanceVerifyDormMapper;
import com.yida.data.attendance.service.EduAttendanceConfigService;
import com.yida.data.attendance.service.EduAttendanceManagePushResultService;
import com.yida.data.attendance.service.EduAttendanceResultService;
import com.yida.data.attendance.service.GenerateAttendanceResultService;
import com.yida.data.attendance.vo.*;
import com.yida.data.common.core.entity.attendance.*;
import com.yida.data.common.core.entity.constant.AppConstant;
import com.yida.data.common.core.entity.constant.CachePrefixConstant;
import com.yida.data.common.core.entity.constant.StringConstant;
import com.yida.data.common.core.entity.notice.qywx.NewsStaffNotice;
import com.yida.data.common.core.entity.notice.qywx.TextSchoolNotice;
import com.yida.data.common.core.entity.notice.qywx.inside.Article;
import com.yida.data.common.core.entity.notice.qywx.inside.News;
import com.yida.data.common.core.entity.notice.qywx.inside.Text;
import com.yida.data.common.core.entity.school.EduDormitory;
import com.yida.data.common.core.entity.school.EduDormitoryRoom;
import com.yida.data.common.core.entity.system.EduApp;
import com.yida.data.common.core.entity.user.EduParent;
import com.yida.data.common.core.entity.user.EduStaff;
import com.yida.data.common.core.entity.user.EduStudent;
import com.yida.data.common.core.enums.AttendanceResult;
import com.yida.data.common.core.utils.EnumUtils;
import com.yida.data.common.core.utils.ExcelUtil;
import com.yida.data.common.core.utils.WxUtil;
import com.yida.data.common.service.CommonService;
import com.yida.data.school.dto.index.ListDormRoomDTO;
import com.yida.data.school.feign.facility.RemoteDormitoryService;
import com.yida.data.user.dto.ListStudentDTO;
import com.yida.data.user.dto.ListStudentDTO.ListStudentDTOBuilder;
import com.yida.data.user.feign.RemoteStaffService;
import com.yida.data.user.feign.RemoteStudentService;
import com.yida.data.user.feign.RemoteTeacherService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
* 考勤结果 Service实现
*
* @author wjm
* @date 2021-09-15 09:56:24
*/
@Slf4j
@Service
@RequiredArgsConstructor
@RefreshScope
public class EduAttendanceResultServiceImpl extends ServiceImpl<EduAttendanceResultMapper, EduAttendanceResult>
implements EduAttendanceResultService {
private static final String NOTICE_URL = "/attendance/url";
private static final String MANAGE_NOTICE_URL = "/attendance/teacher/result";
private final EduAttendanceConfigService eduAttendanceConfigService;
private final EduAttendanceManagePushResultService eduAttendanceManagePushResultService;
private final EduAttendanceRecordMapper eduAttendanceRecordMapper;
private final EduAttendanceVerifyDormMapper eduAttendanceVerifyDormMapper;
private final RemoteDormitoryService remoteDormitoryService;
private final RemoteStudentService remoteStudentService;
private final RemoteStaffService remoteStaffService;
private final RemoteTeacherService remoteTeacherService;
private final RedisService redisService;
private final CommonService commonService;
private final WxUtil wxUtil;
private final GenerateAttendanceResultService generateAttendanceResultService;
@Value("${febs.pageUrl}")
private String pageUrl;
@Override
@Transactional
public List<StayStudentResultVO> listResultByDorm(Long dormId, String date, Integer time, String keyword, Integer status) {
List<StayStudentResultVO> resList = new ArrayList<>();
List<EduDormitoryRoom> roomList =
remoteDormitoryService.listDormRoom(ListDormRoomDTO.builder().dormIds(Collections.singletonList(dormId)).build())
.getData();
if (CollUtil.isNotEmpty(roomList)) {
List<Long> roomIds = roomList.stream().map(EduDormitoryRoom::getId).collect(Collectors.toList());
// 查询所有寝室的考勤记录
List<EduAttendanceResult> resultList = baseMapper
.listStudentResult(roomIds, null, LocalDateTimeUtil.parseDate(date, DateTimeFormatter.ISO_DATE),
null, null, null, null, null, time, 1, status);
List<Long> studentIds = resultList.stream().map(EduAttendanceResult::getStudentId).distinct()
.collect(Collectors.toList());
// 查询考勤记录的学生
List<EduStudent> studentList = remoteStudentService
.listStudent(ListStudentDTO.builder().studentIds(studentIds).isQuerySchoolName(false).isQueryParent(false)
.isQueryUserDept(false).build()).getData();
Map<Long, List<EduStudent>> studentGroup = studentList.stream().collect(Collectors.groupingBy(EduStudent::getId));
Map<Long, List<EduDormitoryRoom>> roomGroup = roomList.stream()
.collect(Collectors.groupingBy(EduDormitoryRoom::getId));
for (EduAttendanceResult result : resultList) {
if (studentGroup.containsKey(result.getStudentId())) {
List<EduStudent> student = studentGroup.get(result.getStudentId());
StayStudentResultVO res = new StayStudentResultVO();
res.setStudentName(student.get(0).getStuName());
res.setStudentId(result.getStudentId());
res.setDormRoomName(roomGroup.get(result.getDormRoomId()).get(0).getName());
res.setTime(result.getInTime());
res.setResult(translateResult(result.getStatus()));
if (StrUtil.isNotBlank(keyword)) {
if (!(res.getStudentName() + res.getDormRoomName()).contains(keyword)) {
continue;
}
}
resList.add(res);
}
}
}
return resList;
}
@Override
@Transactional
public List<StayStudentResultVO> listStudentResByDormRoom(Long roomId, String date, Integer time) {
List<StayStudentResultVO> resList = new ArrayList<>();
// 查询考勤记录的学生
List<EduStudent> studentList = remoteStudentService.listStudent(
ListStudentDTO.builder().dormRoomIds(Collections.singletonList(roomId)).isQueryUserDept(false).isQueryParent(false)
.isQuerySchoolName(false).build())
.getData();
LocalDate day = LocalDate.parse(date);
LocalDateTime startTime = day.atStartOfDay();
LocalDateTime endTime = day.atTime(23, 59, 59);
// 循环每个学生
for (EduStudent student : studentList) {
StayStudentResultVO res = new StayStudentResultVO();
res.setAvatar(student.getAvatar());
res.setStudentNumber(student.getStuNumber());
res.setStudentName(student.getStuName());
res.setStudentId(student.getId());
EduAttendanceRecord lastRecord = eduAttendanceRecordMapper
.getLastRecordByTime(startTime, endTime, null, student.getId());
// 学生有在寝的记录
if (lastRecord == null || lastRecord.getScope() == 1) {
res.setStatus(1);
} else {
res.setStatus(0);
}
resList.add(res);
}
return resList;
}
@Override
@Transactional
public void changeStayStudentStatus(Long studentId, String date, Integer time, Integer status) {
EduStudent student = (EduStudent) redisService.hget(CachePrefixConstant.STUDENT_DATA, studentId.toString());
if (student == null) {
student = remoteStudentService.getStudentNoPermission(studentId).getData();
}
EduAttendanceRecord record = new EduAttendanceRecord();
record.setSchoolId(student.getSchoolId());
record.setCampusId(student.getCampusId());
record.setGradeId(student.getGradeId());
record.setGradeName(student.getGradeName());
record.setClassId(student.getClassId());
record.setClassName(student.getClassName());
record.setStudentId(studentId);
record.setStatus(-1);
record.setCreateTime(LocalDateTime.now());
record.setDormId(student.getDormId());
record.setDormRoomId(student.getDormRoomId());
record.setZone(1);
if (status == 0) {
record.setScope(0);
} else {
record.setScope(1);
}
eduAttendanceRecordMapper.insert(record);
}
@Override
@Transactional
public void verifyDormRoom(EduAttendanceVerifyDorm verifyDorm) {
eduAttendanceVerifyDormMapper.insert(verifyDorm);
}
@Override
@Transactional
public IPage<AttendanceResultDormVO> listAttendanceResultPage(AttendanceResultPageDTO dto) {
// 获取学生
List<Long> studentIds = null;
ListStudentDTO listStudentDTO = ListStudentDTO.builder().isQueryParent(false).isQuerySchoolName(false).build();
BeanUtils.copyProperties(dto, listStudentDTO);
if (dto.getType() == 0) {
//查询全部学生
listStudentDTO.setType(null);
} else {
//查询住宿生
listStudentDTO.setType(1);
}
// 筛选寝室
List<Long> roomList = new ArrayList<>();
if (dto.getDormRoomId() != null) {
roomList.add(dto.getDormRoomId());
} else if (dto.getDormId() != null) {
List<EduDormitoryRoom> data = remoteDormitoryService
.listDormRoom(ListDormRoomDTO.builder().dormIds(Collections.singletonList(dto.getDormId())).build()).getData();
if (CollUtil.isNotEmpty(data)) {
roomList = data.stream().map(EduDormitoryRoom::getId).collect(Collectors.toList());
}
}
listStudentDTO.setDormRoomIds(roomList);
// 查询匹配的学生
List<EduStudent> studentList = remoteStudentService.listStudent(listStudentDTO).getData();
if (CollUtil.isNotEmpty(studentList)) {
if (StrUtil.isNotBlank(dto.getKeyword())) {
studentList = studentList.stream()
.filter(x -> x.getStuName().contains(dto.getKeyword()) || x.getStuNumber().contains(dto.getKeyword()))
.collect(Collectors.toList());
}
if (CollUtil.isNotEmpty(studentList)) {
studentIds = studentList.stream().map(EduStudent::getId).collect(Collectors.toList());
}
}
// 查询考勤结果记录
Page<AttendanceResultDormVO> recordPage = Page.of(dto.getPageNum(), dto.getPageSize());
recordPage.setRecords(
baseMapper.listAttendanceResult(recordPage, studentIds, dto.getRuleId(), dto.getStartDate(), dto.getEndDate()));
if (CollUtil.isNotEmpty(recordPage.getRecords()) && CollUtil.isNotEmpty(studentList)) {
for (AttendanceResultDormVO record : recordPage.getRecords()) {
for (EduStudent student : studentList) {
if (student.getId().equals(record.getStudentId())) {
record.setCampusName(student.getCampusName());
record.setStuName(student.getStuName());
record.setStuNumber(student.getStuNumber());
break;
}
}
}
}
return recordPage;
}
@Override
@Transactional
public void exportAttendanceResult(AttendanceResultPageDTO dto, HttpServletResponse response) {
// 获取学生
List<Long> studentIds = null;
ListStudentDTO listStudentDTO = ListStudentDTO.builder().isQueryParent(false).isQuerySchoolName(false).build();
BeanUtils.copyProperties(dto, listStudentDTO);
// 筛选寝室
List<Long> roomList = new ArrayList<>();
if (dto.getDormRoomId() != null) {
roomList.add(dto.getDormRoomId());
} else if (dto.getDormId() != null) {
List<EduDormitoryRoom> data = remoteDormitoryService
.listDormRoom(ListDormRoomDTO.builder().dormIds(Collections.singletonList(dto.getDormId())).build()).getData();
if (CollUtil.isNotEmpty(data)) {
roomList = data.stream().map(EduDormitoryRoom::getId).collect(Collectors.toList());
}
}
listStudentDTO.setDormRoomIds(roomList);
// 查询匹配的学生
List<EduStudent> studentList = remoteStudentService.listStudent(listStudentDTO).getData();
if (CollUtil.isNotEmpty(studentList)) {
if (StrUtil.isNotBlank(dto.getKeyword())) {
studentList = studentList.stream()
.filter(x -> x.getStuName().contains(dto.getKeyword()) || x.getStuNumber().contains(dto.getKeyword()))
.collect(Collectors.toList());
}
if (CollUtil.isNotEmpty(studentList)) {
studentIds = studentList.stream().map(EduStudent::getId).collect(Collectors.toList());
}
}
// 考勤结果列表
List<AttendanceResultDormVO> recordList = baseMapper.listAttendanceResult(null, studentIds, dto.getRuleId(),
dto.getStartDate(), dto.getEndDate());
if (CollUtil.isNotEmpty(recordList) && CollUtil.isNotEmpty(studentList)) {
for (AttendanceResultDormVO record : recordList) {
for (EduStudent student : studentList) {
if (student.getId().equals(record.getStudentId())) {
record.setCampusName(student.getCampusName());
record.setStuName(student.getStuName());
record.setStuNumber(student.getStuNumber());
break;
}
}
}
}
if (dto.getType() == 0) {
ExcelUtil.export("校门考勤记录表.xlsx", AttendanceResultVO.class, recordList.stream().map(x -> {
AttendanceResultVO vo = new AttendanceResultVO();
BeanUtils.copyProperties(x, vo);
return vo;
}).collect(Collectors.toList()), response);
} else {
ExcelUtil.export("宿舍考勤记录表.xlsx", AttendanceResultDormVO.class, recordList, response);
}
}
/**
* 定时处理考勤记录
*/
@Override
public void dealAttendanceResult() {
log.info("进入考勤统计:[{}]", LocalDateTime.now());
List<EduAttendanceConfig> configList = eduAttendanceConfigService.list();
if (CollUtil.isNotEmpty(configList)) {
// 每个学校分开查询
for (EduAttendanceConfig config : configList) {
if (ObjectUtil.equal("1", config.getState())) {
LocalDateTime begin = LocalDateTime.now();
log.info("开始生成[{}]学校学生考勤结果", config.getSchoolId());
// 远程调用不放入事务 减少长事务
List<EduStudent> schoolStudentList =
remoteStudentService.listStudent(
ListStudentDTO.builder().isQuerySchoolName(false).isQueryParent(false).schoolId(config.getSchoolId())
.build()).getData();
generateAttendanceResultService.generateStudentAttendanceResult(config, schoolStudentList);
LocalDateTime end = LocalDateTime.now();
log.info("完成[{}]学校学生考勤结果生成,开始时间:[{}],结束时间:[{}]", config.getSchoolId(), begin, end);
}
}
}
log.info("结束考勤统计:[{}]", LocalDateTime.now());
}
@Override
@Transactional
public void pushNotArriveMsg() {
List<EduAttendanceConfig> configList = eduAttendanceConfigService.list();
if (CollUtil.isNotEmpty(configList)) {
for (EduAttendanceConfig config : configList) {
// 查询需要推送给管理员的记录 TODO 2022/7/14 此处暂时只推送一次, 也没有确认记录选项
List<EduAttendanceResult> managePushResult = list(Wrappers.lambdaQuery(new EduAttendanceResult())
.eq(EduAttendanceResult::getSchoolId, config.getSchoolId())
.eq(EduAttendanceResult::getPushStatus, "0")
.in(EduAttendanceResult::getStatus,
CollUtil.newArrayList(AttendanceResult.STU_D_LATE, AttendanceResult.STU_D_EX_LATE)));
if (CollUtil.isNotEmpty(managePushResult)) {
// 推送管理员对象
String[] objs = config.getDormitoryManagePushObj().split(StringConstant.COMMA);
for (String obj : objs) {
switch (obj) {
// 宿管
case "0":
checkDormitory(config, managePushResult);
break;
// 班主任
case "1":
checkClassHeadTeacher(config, managePushResult);
break;
// 年级长
case "2":
checkGradeHeadTeacher(config, managePushResult);
break;
// 副校长
case "3":
// TODO 2022/7/16 需要处理副校长数据
break;
default:
break;
}
}
}
// 查询需要推送给家长的记录
LocalDateTime now = LocalDateTime.now();
List<EduAttendanceResult> pushMessage = baseMapper
.listPushNotArrive(now.minusMinutes(config.getSchoolPushInterval()), config.getSchoolId());
if (CollUtil.isNotEmpty(pushMessage)) {
for (EduAttendanceResult result : pushMessage) {
EduStudent student = (EduStudent) redisService.hget(CachePrefixConstant.STUDENT_DATA,
result.getStudentId().toString());
if (student == null) {
student = remoteStudentService.getStudentNoPermission(result.getStudentId()).getData();
}
if (student != null) {
// 推送包含家长
if (config.getSchoolPushObj() == 0) {
for (EduParent parent : student.getParents()) {
//构建消息
// String msg = String.format("【平安校园警告】尊敬的%s%s,截止%s,%s" +
// "并未归寝,请您尽快确认学生位置,确保学生的人身安全。<a href=\"%s\">请点击此处确认消息</a>",
// student.getStuName(), parent.getParentType(),
// LocalDateTimeUtil.format(now, "yyyy年MM月dd日HH时mm分秒"),
// student.getStuName(), pageUrl + NOTICE_URL + "?id=" + result.getId().toString());
String msg = String.format("【平安校园警告】尊敬的%s%s,截止%s,%s" +
"并未归寝,请您尽快确认学生位置,确保学生的人身安全。",
student.getStuName(), parent.getParentType(),
LocalDateTimeUtil.format(now, "yyyy年MM月dd日HH时mm分秒"),
student.getStuName());
// 发送通知消息
EduApp app = commonService.getAppByCodeAndSchool(AppConstant.ATTENDANCE_PARENT, null,
student.getSchoolId());
TextSchoolNotice notice = new TextSchoolNotice();
notice.setTo_parent_userid(Collections.singletonList(parent.getWxId()));
notice.setText(new Text(msg));
notice.setAgentid(app.getWxAgentId());
wxUtil.pushSchoolNotice(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()),
notice);
result.setLastPushTime(now);
}
}
result.setNotArriveConfirm(null);
result.setPushStatus("1");
}
}
updateBatchById(pushMessage);
}
}
}
}
/**
* 判断宿管推送记录
*
* @param config 考勤配置
* @param managePushResult 考勤记录
* @author ZYJ
* @date 2022/7/15 10:19
*/
private void checkDormitory(EduAttendanceConfig config, List<EduAttendanceResult> managePushResult) {
// 查询宿舍id
List<Long> dormIds = managePushResult.stream().map(EduAttendanceResult::getDormId)
.distinct().collect(Collectors.toList());
Map<Long, List<EduAttendanceResult>> dormResults = managePushResult.stream()
.collect(Collectors.groupingBy(EduAttendanceResult::getDormId));
// 职工发送消息集合
Map<Long, AttendanceResultPushVO> pushData = new ConcurrentHashMap<>(16);
dormIds.forEach(dormId -> {
List<Long> resultIds = dormResults.get(dormId).stream().map(EduAttendanceResult::getId).collect(Collectors.toList());
// 根据宿舍id查询对应宿管信息
EduDormitory dormitory = remoteDormitoryService.getDormNoPermission(dormId).getData();
// 宿管信息
List<EduStaff> staffList = dormitory.getEduStaffList();
if (CollUtil.isNotEmpty(staffList)) {
staffList.forEach(eduStaff -> {
// 推送信息
AttendanceResultPushVO attendanceResultPushVO;
// 记录集合
List<Long> list;
if (pushData.containsKey(eduStaff.getId())) {
attendanceResultPushVO = pushData.get(eduStaff.getId());
list = attendanceResultPushVO.getResultIds();
list.addAll(resultIds);
} else {
attendanceResultPushVO = new AttendanceResultPushVO();
attendanceResultPushVO.setEduStaff(eduStaff);
list = new ArrayList<>(resultIds);
}
attendanceResultPushVO.setResultIds(list);
pushData.put(eduStaff.getId(), attendanceResultPushVO);
});
}
});
// 推送消息
pushData(pushData, config);
}
/**
* 判断班主任推送记录
*
* @param config 考勤配置
* @param managePushResult 考勤记录
* @author ZYJ
* @date 2022/7/15 10:19
*/
private void checkClassHeadTeacher(EduAttendanceConfig config, List<EduAttendanceResult> managePushResult) {
// 查询班级id
List<Long> classIds = managePushResult.stream().map(EduAttendanceResult::getClassId)
.distinct().collect(Collectors.toList());
Map<Long, List<EduAttendanceResult>> classResults = managePushResult.stream()
.collect(Collectors.groupingBy(EduAttendanceResult::getClassId));
// 职工发送消息集合
Map<Long, AttendanceResultPushVO> pushData = new ConcurrentHashMap<>(16);
classIds.forEach(classId -> {
List<Long> resultIds = classResults.get(classId).stream().map(EduAttendanceResult::getId)
.collect(Collectors.toList());
// 教师类型 1表示校区负责人,2表示年级负责人,3表示班主任,4表示任课老师,5表示学段负责人
List<EduStaff> staffList = remoteTeacherService.listTeacherByDeptId(classId, "3").getData();
staffList.forEach(staff -> {
// 推送信息
AttendanceResultPushVO attendanceResultPushVO;
// 记录集合
List<Long> list;
if (pushData.containsKey(staff.getId())) {
attendanceResultPushVO = pushData.get(staff.getId());
list = attendanceResultPushVO.getResultIds();
list.addAll(resultIds);
} else {
attendanceResultPushVO = new AttendanceResultPushVO();
attendanceResultPushVO.setEduStaff(staff);
list = new ArrayList<>(resultIds);
}
attendanceResultPushVO.setResultIds(list);
pushData.put(staff.getId(), attendanceResultPushVO);
});
});
// 推送消息
pushData(pushData, config);
}
/**
* 判断年级长推送记录
*
* @param config 考勤配置
* @param managePushResult 考勤记录
* @author ZYJ
* @date 2022/7/16 10:20
*/
private void checkGradeHeadTeacher(EduAttendanceConfig config, List<EduAttendanceResult> managePushResult) {
// 查询年级id
List<Long> gradeIds = managePushResult.stream().map(EduAttendanceResult::getGradeId)
.distinct().collect(Collectors.toList());
Map<Long, List<EduAttendanceResult>> gradeResults = managePushResult.stream()
.collect(Collectors.groupingBy(EduAttendanceResult::getGradeId));
// 职工发送消息集合
Map<Long, AttendanceResultPushVO> pushData = new ConcurrentHashMap<>(16);
gradeIds.forEach(gradeId -> {
List<Long> resultIds = gradeResults.get(gradeId).stream().map(EduAttendanceResult::getId)
.collect(Collectors.toList());
// 教师类型 1表示校区负责人,2表示年级负责人,3表示班主任,4表示任课老师,5表示学段负责人
List<EduStaff> staffList = remoteTeacherService.listTeacherByDeptId(gradeId, "2").getData();
staffList.forEach(staff -> {
// 推送信息
AttendanceResultPushVO attendanceResultPushVO;
// 记录集合
List<Long> list;
if (pushData.containsKey(staff.getId())) {
attendanceResultPushVO = pushData.get(staff.getId());
list = attendanceResultPushVO.getResultIds();
list.addAll(resultIds);
} else {
attendanceResultPushVO = new AttendanceResultPushVO();
attendanceResultPushVO.setEduStaff(staff);
list = new ArrayList<>(resultIds);
}
attendanceResultPushVO.setResultIds(list);
pushData.put(staff.getId(), attendanceResultPushVO);
});
});
// 推送消息
pushData(pushData, config);
}
/**
* 推送消息
*
* @param pushData 职工发送消息集合
* @param config 考勤配置
* @author ZYJ
* @date 2022/7/16 10:11
*/
private void pushData(Map<Long, AttendanceResultPushVO> pushData, EduAttendanceConfig config) {
// 判断是否需要推送消息
if (CollUtil.isNotEmpty(pushData)) {
EduApp app = commonService.getAppByCodeAndSchool(AppConstant.ATTENDANCE_TEACHER, null,
config.getSchoolId());
pushData.forEach((staffId, pushVO) -> {
// 保存推送记录
EduAttendanceManagePushResult attendanceManagePushResult = EduAttendanceManagePushResult.builder()
.createDate(LocalDateTime.now())
.staffId(staffId)
.resultId(pushVO.getResultIds().stream().map(Object::toString).collect(Collectors.joining()))
.build();
eduAttendanceManagePushResultService.save(attendanceManagePushResult);
// 推送微信消息
NewsStaffNotice newsStaffNotice = new NewsStaffNotice();
newsStaffNotice.setAgentid(app.getWxAgentId());
Article article = new Article();
// TODO 2022/7/15 此处为通知图片和点击页面地址
article.setPicurl("");
article.setUrl(pageUrl + MANAGE_NOTICE_URL + "?id=" + attendanceManagePushResult.getId());
article.setTitle(LocalDateTimeUtil.format(LocalDateTime.now(), "MM月dd日") + "归寝报告");
article.setDescription("点击查看报告详情,即时关注学生归寝情况");
newsStaffNotice.setNews(new News(Collections.singletonList(article)));
newsStaffNotice.setTouser(pushVO.getEduStaff().getWxId());
wxUtil.pushStaffNotice(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()), newsStaffNotice);
});
}
}
@Override
@Transactional
public List<RuleTimeVO> listGradeResultTime(Long gradeId, String date) {
return baseMapper.listGradeResultTime(gradeId, date);
}
@Override
@Transactional
public List<ResultDetailVO> listStudentResultDetail(ListStudentResultDTO dto) {
ListStudentDTOBuilder builder = ListStudentDTO.builder().isQueryParent(false).isQuerySchoolName(false)
.isQueryUserDept(false);
if (dto.getClassId() != null) {
builder.classId(dto.getClassId());
}
if (dto.getStudentId() != null) {
builder.studentIds(Collections.singletonList(dto.getStudentId()));
}
List<EduStudent> studentList = remoteStudentService.listStudent(builder.build()).getData();
List<ResultDetailVO> details = null;
if (CollUtil.isNotEmpty(studentList)) {
details = baseMapper.listStudentResultDetail(dto,
studentList.stream().map(EduStudent::getId).collect(Collectors.toList()));
if (CollUtil.isNotEmpty(details)) {
Map<Long, List<EduStudent>> studentGroup = studentList.stream().collect(Collectors.groupingBy(EduStudent::getId));
for (ResultDetailVO detail : details) {
EduStudent student = studentGroup.get(detail.getStudentId()).get(0);
detail.setStudentName(student.getStuName());
detail.setStudentNum(student.getStuNumber());
detail.setStudentType(student.getType());
}
}
}
return details;
}
private String translateResult(Integer status) {
AttendanceResult value = null;
try {
value = EnumUtils.valueOf(AttendanceResult.class, status, AttendanceResult.class.getMethod("getValue"));
} catch (NoSuchMethodException e) {
log.error("考勤结果值获取失败,:[{}]", status);
}
return value != null ? value.getName() : null;
}
}
@@ -0,0 +1,420 @@
//package com.yida.data.attendance.service.impl;
//
//
//import cc.mrbird.febs.common.redis.service.RedisService;
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.date.LocalDateTimeUtil;
//import cn.hutool.core.util.StrUtil;
//import com.baomidou.mybatisplus.core.metadata.IPage;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.yida.data.attendance.dto.AttendanceResultPageDTO;
//import com.yida.data.attendance.dto.ListStudentResultDTO;
//import com.yida.data.attendance.mapper.EduAttendanceRecordMapper;
//import com.yida.data.attendance.mapper.EduAttendanceResultMapper;
//import com.yida.data.attendance.mapper.EduAttendanceVerifyDormMapper;
//import com.yida.data.attendance.service.EduAttendanceConfigService;
//import com.yida.data.attendance.service.EduAttendanceResultService;
//import com.yida.data.attendance.service.GenerateAttendanceResultService;
//import com.yida.data.attendance.vo.*;
//import com.yida.data.common.core.entity.attendance.EduAttendanceConfig;
//import com.yida.data.common.core.entity.attendance.EduAttendanceRecord;
//import com.yida.data.common.core.entity.attendance.EduAttendanceResult;
//import com.yida.data.common.core.entity.attendance.EduAttendanceVerifyDorm;
//import com.yida.data.common.core.entity.constant.AppConstant;
//import com.yida.data.common.core.entity.constant.CachePrefixConstant;
//import com.yida.data.common.core.entity.notice.qywx.TextSchoolNotice;
//import com.yida.data.common.core.entity.notice.qywx.inside.Text;
//import com.yida.data.common.core.entity.school.EduDormitoryRoom;
//import com.yida.data.common.core.entity.system.EduApp;
//import com.yida.data.common.core.entity.user.EduParent;
//import com.yida.data.common.core.entity.user.EduStudent;
//import com.yida.data.common.core.enums.AttendanceResult;
//import com.yida.data.common.core.utils.EnumUtils;
//import com.yida.data.common.core.utils.ExcelUtil;
//import com.yida.data.common.core.utils.WxUtil;
//import com.yida.data.common.service.CommonService;
//import com.yida.data.school.dto.index.ListDormRoomDTO;
//import com.yida.data.school.feign.facility.RemoteDormitoryService;
//import com.yida.data.user.dto.ListStudentDTO;
//import com.yida.data.user.dto.ListStudentDTO.ListStudentDTOBuilder;
//import com.yida.data.user.feign.RemoteStudentService;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.BeanUtils;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.cloud.context.config.annotation.RefreshScope;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import javax.servlet.http.HttpServletResponse;
//import java.time.LocalDate;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.util.ArrayList;
//import java.util.Collections;
//import java.util.List;
//import java.util.Map;
//import java.util.stream.Collectors;
//
///**
// * 考勤结果 Service实现
// *
// * @author wjm
// * @date 2021-09-15 09:56:24
// */
//@Slf4j
//@Service
//@RequiredArgsConstructor
//@RefreshScope
//public class EduAttendanceResultServiceImplBack extends ServiceImpl<EduAttendanceResultMapper, EduAttendanceResult>
// implements EduAttendanceResultService {
//
// private static final String NOTICE_URL = "/attendance/url";
// private final EduAttendanceConfigService eduAttendanceConfigService;
// private final EduAttendanceRecordMapper eduAttendanceRecordMapper;
// private final EduAttendanceVerifyDormMapper eduAttendanceVerifyDormMapper;
// private final RemoteDormitoryService remoteDormitoryService;
// private final RemoteStudentService remoteStudentService;
// private final RedisService redisService;
// private final CommonService commonService;
// private final WxUtil wxUtil;
// private final GenerateAttendanceResultService generateAttendanceResultService;
// @Value("${febs.pageUrl}")
// private String pageUrl;
//
// @Override
// @Transactional
// public List<StayStudentResultVO> listResultByDorm(Long dormId, String date, Integer time, String keyword, Integer status) {
// List<StayStudentResultVO> resList = new ArrayList<>();
// List<EduDormitoryRoom> roomList =
// remoteDormitoryService.listDormRoom(ListDormRoomDTO.builder().dormIds(Collections.singletonList(dormId)).build())
// .getData();
// if (CollUtil.isNotEmpty(roomList)) {
// List<Long> roomIds = roomList.stream().map(EduDormitoryRoom::getId).collect(Collectors.toList());
// // 查询所有寝室的考勤记录
// List<EduAttendanceResult> resultList = baseMapper
// .listStudentResult(roomIds, null, LocalDateTimeUtil.parseDate(date, DateTimeFormatter.ISO_DATE),
// null, null, null, null, null, time, 1, status);
// List<Long> studentIds = resultList.stream().map(EduAttendanceResult::getStudentId).distinct()
// .collect(Collectors.toList());
// // 查询考勤记录的学生
// List<EduStudent> studentList = remoteStudentService
// .listStudent(ListStudentDTO.builder().studentIds(studentIds).isQuerySchoolName(false).isQueryParent(false)
// .isQueryUserDept(false).build()).getData();
// Map<Long, List<EduStudent>> studentGroup = studentList.stream().collect(Collectors.groupingBy(EduStudent::getId));
// Map<Long, List<EduDormitoryRoom>> roomGroup = roomList.stream()
// .collect(Collectors.groupingBy(EduDormitoryRoom::getId));
// for (EduAttendanceResult result : resultList) {
// if (studentGroup.containsKey(result.getStudentId())) {
// List<EduStudent> student = studentGroup.get(result.getStudentId());
// StayStudentResultVO res = new StayStudentResultVO();
// res.setStudentName(student.get(0).getStuName());
// res.setStudentId(result.getStudentId());
// res.setDormRoomName(roomGroup.get(result.getDormRoomId()).get(0).getName());
// res.setTime(result.getInTime());
// res.setResult(translateResult(result.getStatus()));
// if (StrUtil.isNotBlank(keyword)) {
// if (!(res.getStudentName() + res.getDormRoomName()).contains(keyword)) {
// continue;
// }
// }
// resList.add(res);
// }
// }
// }
// return resList;
// }
//
// @Override
// @Transactional
// public List<StayStudentResultVO> listStudentResByDormRoom(Long roomId, String date, Integer time) {
// List<StayStudentResultVO> resList = new ArrayList<>();
// // 查询考勤记录的学生
// List<EduStudent> studentList = remoteStudentService.listStudent(
// ListStudentDTO.builder().dormRoomIds(Collections.singletonList(roomId)).isQueryUserDept(false).isQueryParent(false)
// .isQuerySchoolName(false).build())
// .getData();
// LocalDate day = LocalDate.parse(date);
// LocalDateTime startTime = day.atStartOfDay();
// LocalDateTime endTime = day.atTime(23, 59, 59);
// // 循环每个学生
// for (EduStudent student : studentList) {
// StayStudentResultVO res = new StayStudentResultVO();
// res.setAvatar(student.getAvatar());
// res.setStudentNumber(student.getStuNumber());
// res.setStudentName(student.getStuName());
// res.setStudentId(student.getId());
// EduAttendanceRecord lastRecord = eduAttendanceRecordMapper
// .getLastRecordByTime(startTime, endTime, null, student.getId());
// // 学生有在寝的记录
// if (lastRecord == null || lastRecord.getScope() == 1) {
// res.setStatus(1);
// } else {
// res.setStatus(0);
// }
// resList.add(res);
// }
// return resList;
// }
//
// @Override
// @Transactional
// public void changeStayStudentStatus(Long studentId, String date, Integer time, Integer status) {
// EduStudent student = (EduStudent) redisService.hget(CachePrefixConstant.STUDENT_DATA, studentId.toString());
// if (student == null) {
// student = remoteStudentService.getStudentNoPermission(studentId).getData();
// }
// EduAttendanceRecord record = new EduAttendanceRecord();
// record.setSchoolId(student.getSchoolId());
// record.setCampusId(student.getCampusId());
// record.setGradeId(student.getGradeId());
// record.setGradeName(student.getGradeName());
// record.setClassId(student.getClassId());
// record.setClassName(student.getClassName());
// record.setStudentId(studentId);
// record.setStatus(-1);
// record.setCreateTime(LocalDateTime.now());
// record.setDormId(student.getDormId());
// record.setDormRoomId(student.getDormRoomId());
// record.setZone(1);
// if (status == 0) {
// record.setScope(0);
// } else {
// record.setScope(1);
// }
// eduAttendanceRecordMapper.insert(record);
// }
//
// @Override
// @Transactional
// public void verifyDormRoom(EduAttendanceVerifyDorm verifyDorm) {
// eduAttendanceVerifyDormMapper.insert(verifyDorm);
// }
//
// @Override
// @Transactional
// public IPage<AttendanceResultDormVO> listAttendanceResultPage(AttendanceResultPageDTO dto) {
// // 获取学生
// List<Long> studentIds = null;
// ListStudentDTO listStudentDTO = ListStudentDTO.builder().isQueryParent(false).isQuerySchoolName(false).build();
// BeanUtils.copyProperties(dto, listStudentDTO);
// // 筛选寝室
// List<Long> roomList = new ArrayList<>();
// if (dto.getDormRoomId() != null) {
// roomList.add(dto.getDormRoomId());
// } else if (dto.getDormId() != null) {
// List<EduDormitoryRoom> data = remoteDormitoryService
// .listDormRoom(ListDormRoomDTO.builder().dormIds(Collections.singletonList(dto.getDormId())).build()).getData();
// if (CollUtil.isNotEmpty(data)) {
// roomList = data.stream().map(EduDormitoryRoom::getId).collect(Collectors.toList());
// }
// }
// listStudentDTO.setDormRoomIds(roomList);
// // 查询匹配的学生
// List<EduStudent> studentList = remoteStudentService.listStudent(listStudentDTO).getData();
// if (CollUtil.isNotEmpty(studentList)) {
// if (StrUtil.isNotBlank(dto.getKeyword())) {
// studentList = studentList.stream()
// .filter(x -> x.getStuName().contains(dto.getKeyword()) || x.getStuNumber().contains(dto.getKeyword()))
// .collect(Collectors.toList());
// }
// if (CollUtil.isNotEmpty(studentList)) {
// studentIds = studentList.stream().map(EduStudent::getId).collect(Collectors.toList());
// }
// }
//
// // 查询考勤结果记录
// Page<AttendanceResultDormVO> recordPage = Page.of(dto.getPageNum(), dto.getPageSize());
// recordPage.setRecords(
// baseMapper.listAttendanceResult(recordPage, studentIds, dto.getRuleId(), dto.getStartDate(), dto.getEndDate()));
// if (CollUtil.isNotEmpty(recordPage.getRecords()) && CollUtil.isNotEmpty(studentList)) {
// for (AttendanceResultDormVO record : recordPage.getRecords()) {
// for (EduStudent student : studentList) {
// if (student.getId().equals(record.getStudentId())) {
// record.setCampusName(student.getCampusName());
// record.setStuName(student.getStuName());
// record.setStuNumber(student.getStuNumber());
// break;
// }
// }
// }
// }
// return recordPage;
// }
//
// @Override
// @Transactional
// public void exportAttendanceResult(AttendanceResultPageDTO dto, HttpServletResponse response) {
// // 获取学生
// List<Long> studentIds = null;
// ListStudentDTO listStudentDTO = ListStudentDTO.builder().isQueryParent(false).isQuerySchoolName(false).build();
// BeanUtils.copyProperties(dto, listStudentDTO);
// // 筛选寝室
// List<Long> roomList = new ArrayList<>();
// if (dto.getDormRoomId() != null) {
// roomList.add(dto.getDormRoomId());
// } else if (dto.getDormId() != null) {
// List<EduDormitoryRoom> data = remoteDormitoryService
// .listDormRoom(ListDormRoomDTO.builder().dormIds(Collections.singletonList(dto.getDormId())).build()).getData();
// if (CollUtil.isNotEmpty(data)) {
// roomList = data.stream().map(EduDormitoryRoom::getId).collect(Collectors.toList());
// }
// }
// listStudentDTO.setDormRoomIds(roomList);
// // 查询匹配的学生
// List<EduStudent> studentList = remoteStudentService.listStudent(listStudentDTO).getData();
// if (CollUtil.isNotEmpty(studentList)) {
// if (StrUtil.isNotBlank(dto.getKeyword())) {
// studentList = studentList.stream()
// .filter(x -> x.getStuName().contains(dto.getKeyword()) || x.getStuNumber().contains(dto.getKeyword()))
// .collect(Collectors.toList());
// }
// if (CollUtil.isNotEmpty(studentList)) {
// studentIds = studentList.stream().map(EduStudent::getId).collect(Collectors.toList());
// }
// }
// // 考勤结果列表
// List<AttendanceResultDormVO> recordList = baseMapper.listAttendanceResult(null, studentIds, dto.getRuleId(),
// dto.getStartDate(), dto.getEndDate());
// if (CollUtil.isNotEmpty(recordList) && CollUtil.isNotEmpty(studentList)) {
// for (AttendanceResultDormVO record : recordList) {
// for (EduStudent student : studentList) {
// if (student.getId().equals(record.getStudentId())) {
// record.setCampusName(student.getCampusName());
// record.setStuName(student.getStuName());
// record.setStuNumber(student.getStuNumber());
// break;
// }
// }
// }
// }
//
// if (dto.getType() == 0) {
// ExcelUtil.export("校门考勤记录表.xlsx", AttendanceResultVO.class, recordList.stream().map(x -> {
// AttendanceResultVO vo = new AttendanceResultVO();
// BeanUtils.copyProperties(x, vo);
// return vo;
// }).collect(Collectors.toList()), response);
// } else {
// ExcelUtil.export("宿舍考勤记录表.xlsx", AttendanceResultDormVO.class, recordList, response);
// }
// }
//
// /**
// * 定时处理考勤记录
// */
// @Override
// public void dealAttendanceResult() {
// List<EduAttendanceConfig> configList = eduAttendanceConfigService.list();
// if (CollUtil.isNotEmpty(configList)) {
// // 每个学校分开查询
// for (EduAttendanceConfig config : configList) {
// LocalDateTime begin = LocalDateTime.now();
// log.info("开始生成[{}]学校学生考勤结果", config.getSchoolId());
// // 远程调用不放入事务 减少长事务
// List<EduStudent> schoolStudentList =
// remoteStudentService.listStudent(
// ListStudentDTO.builder().isQuerySchoolName(false).isQueryParent(false).schoolId(config.getSchoolId())
// .build()).getData();
// generateAttendanceResultService.generateStudentAttendanceResult(config, schoolStudentList);
// LocalDateTime end = LocalDateTime.now();
// log.info("完成[{}]学校学生考勤结果生成,开始时间:[{}],结束时间:[{}]", config.getSchoolId(), begin, end);
// }
// }
// }
//
//
// @Override
// @Transactional
// public void pushNotArriveMsg() {
// List<EduAttendanceConfig> configList = eduAttendanceConfigService.list();
// if (CollUtil.isNotEmpty(configList)) {
// for (EduAttendanceConfig config : configList) {
// // 查询学校需要推送的消息
// LocalDateTime now = LocalDateTime.now();
// List<EduAttendanceResult> pushMessage = baseMapper
// .listPushNotArrive(now.minusMinutes(config.getSchoolPushInterval()), config.getSchoolId());
// if (CollUtil.isNotEmpty(pushMessage)) {
// for (EduAttendanceResult result : pushMessage) {
// EduStudent student = (EduStudent) redisService.hget(CachePrefixConstant.STUDENT_DATA,
// result.getStudentId().toString());
// if (student == null) {
// student = remoteStudentService.getStudentNoPermission(result.getStudentId()).getData();
// }
// if (student != null) {
// // 推送包含家长
// if (config.getSchoolPushObj() == 0) {
// for (EduParent parent : student.getParents()) {
// //构建消息
// String msg = String.format("【平安校园警告】尊敬的%s%s,截止%s,%s" +
// "并未归寝,请您尽快确认学生位置,确保学生的人身安全。<a href=\"%s\">请点击此处确认消息</a>",
// student.getStuName(), parent.getParentType(),
// LocalDateTimeUtil.format(now, "yyyy年MM月dd日HH时mm分秒"),
// student.getStuName(), pageUrl + NOTICE_URL + "?id=" + result.getId().toString());
// // 发送通知消息
// EduApp app = commonService.getAppByCodeAndSchool(AppConstant.ATTENDANCE_PARENT, null,
// student.getSchoolId());
// TextSchoolNotice notice = new TextSchoolNotice();
// notice.setTo_parent_userid(Collections.singletonList(parent.getWxId()));
// notice.setText(new Text(msg));
// notice.setAgentid(app.getWxAgentId());
// wxUtil.pushSchoolNotice(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()),
// notice);
// result.setLastPushTime(now);
// }
// }
// result.setNotArriveConfirm(null);
// }
// }
// updateBatchById(pushMessage);
// }
// }
// }
// }
//
// @Override
// @Transactional
// public List<RuleTimeVO> listGradeResultTime(Long gradeId, String date) {
// return baseMapper.listGradeResultTime(gradeId, date);
// }
//
// @Override
// @Transactional
// public List<ResultDetailVO> listStudentResultDetail(ListStudentResultDTO dto) {
// ListStudentDTOBuilder builder = ListStudentDTO.builder().isQueryParent(false).isQuerySchoolName(false)
// .isQueryUserDept(false);
// if (dto.getClassId() != null) {
// builder.classId(dto.getClassId());
// }
// if (dto.getStudentId() != null) {
// builder.studentIds(Collections.singletonList(dto.getStudentId()));
// }
// List<EduStudent> studentList = remoteStudentService.listStudent(builder.build()).getData();
// List<ResultDetailVO> details = null;
// if (CollUtil.isNotEmpty(studentList)) {
// details = baseMapper.listStudentResultDetail(dto,
// studentList.stream().map(EduStudent::getId).collect(Collectors.toList()));
// if (CollUtil.isNotEmpty(details)) {
// Map<Long, List<EduStudent>> studentGroup = studentList.stream().collect(Collectors.groupingBy(EduStudent::getId));
// for (ResultDetailVO detail : details) {
// EduStudent student = studentGroup.get(detail.getStudentId()).get(0);
// detail.setStudentName(student.getStuName());
// detail.setStudentNum(student.getStuNumber());
// detail.setStudentType(student.getType());
// }
// }
// }
// return details;
// }
//
// private String translateResult(Integer status) {
// AttendanceResult value = null;
// try {
// value = EnumUtils.valueOf(AttendanceResult.class, status, AttendanceResult.class.getMethod("getValue"));
// } catch (NoSuchMethodException e) {
// log.error("考勤结果值获取失败,:[{}]", status);
// }
// return value != null ? value.getName() : null;
// }
//}
@@ -0,0 +1,12 @@
package com.yida.data.attendance.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yida.data.attendance.mapper.EduAttendanceRuleDateMapper;
import com.yida.data.attendance.service.EduAttendanceRuleDateService;
import com.yida.data.common.core.entity.attendance.EduAttendanceRuleDate;
import org.springframework.stereotype.Service;
@Service
public class EduAttendanceRuleDateServiceImpl extends ServiceImpl<EduAttendanceRuleDateMapper, EduAttendanceRuleDate> implements EduAttendanceRuleDateService {
}
@@ -0,0 +1,12 @@
package com.yida.data.attendance.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yida.data.attendance.mapper.EduAttendanceRuleDeptMapper;
import com.yida.data.attendance.service.EduAttendanceRuleDeptService;
import com.yida.data.common.core.entity.attendance.EduAttendanceRuleDept;
import org.springframework.stereotype.Service;
@Service
public class EduAttendanceRuleDeptServiceImpl extends ServiceImpl<EduAttendanceRuleDeptMapper, EduAttendanceRuleDept> implements EduAttendanceRuleDeptService {
}
@@ -0,0 +1,11 @@
package com.yida.data.attendance.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yida.data.attendance.mapper.EduAttendanceRuleDeviceMapper;
import com.yida.data.attendance.service.EduAttendanceRuleDeviceService;
import com.yida.data.common.core.entity.attendance.EduAttendanceRuleDevice;
import org.springframework.stereotype.Service;
@Service
public class EduAttendanceRuleDeviceServiceImpl extends ServiceImpl<EduAttendanceRuleDeviceMapper, EduAttendanceRuleDevice> implements EduAttendanceRuleDeviceService {
}
@@ -0,0 +1,236 @@
package com.yida.data.attendance.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yida.data.attendance.mapper.EduAttendanceDeviceMapper;
import com.yida.data.attendance.mapper.EduAttendanceRuleMapper;
import com.yida.data.attendance.service.*;
import com.yida.data.attendance.vo.ConflictRuleVO;
import com.yida.data.attendance.vo.RuleListVO;
import com.yida.data.common.core.entity.CurrentUser;
import com.yida.data.common.core.entity.attendance.*;
import com.yida.data.common.core.entity.system.Dept;
import com.yida.data.common.core.entity.system.SystemUser;
import com.yida.data.common.core.utils.Asserts;
import com.yida.data.system.feign.RemoteDeptService;
import com.yida.data.system.feign.RemoteUserService;
import com.yida.data.user.feign.RemoteUserDeptService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
@Slf4j
@RequiredArgsConstructor
@Transactional
public class EduAttendanceRuleServiceImpl extends ServiceImpl<EduAttendanceRuleMapper, EduAttendanceRule> implements
EduAttendanceRuleService {
private final EduAttendanceDeviceRuleService eduAttendanceDeviceRuleService;
private final EduAttendanceRuleDateService eduAttendanceRuleDateService;
private final EduAttendanceRuleTimeService eduAttendanceRuleTimeService;
private final EduAttendanceRuleDeptService eduAttendanceRuleDeptService;
private final EduAttendanceRuleDeviceService eduAttendanceRuleDeviceService;
private final EduAttendanceDeviceMapper eduAttendanceDeviceMapper;
private final RemoteDeptService remoteDeptService;
private final RemoteUserDeptService remoteUserDeptService;
private final RemoteUserService remoteUserService;
@Override
public IPage<RuleListVO> listRulePage(Page page, CurrentUser currentUser, Long schoolId, Long campusId,
String ruleName,
Integer type,
Integer status, String startDate, String endDate) {
if (currentUser.getDeptType() == 0) {
schoolId = currentUser.getDeptId();
} else if (currentUser.getDeptType() != 5) {
Dept school = remoteDeptService.findSchoolByDept(currentUser.getDeptId()).getData();
if (school != null) {
schoolId = school.getDeptId();
}
}
IPage<RuleListVO> res = baseMapper.listRulePage(page, schoolId, campusId, ruleName, type, status,
startDate,
endDate);
res.getRecords().forEach(ruleListVO -> {
SystemUser systemUser = remoteUserService.getInfoById(ruleListVO.getCreateId()).getData();
if (Objects.nonNull(systemUser)) {
ruleListVO.setCreateName(systemUser.getNickname());
}
});
return res;
}
@Override
@Transactional
public void saveRule(EduAttendanceRule rule) {
if (rule.getId() != null) {
// 更新前删除原有关系(设备绑定,运行时间,绑定部门)
eduAttendanceRuleDateService.remove(
Wrappers.lambdaQuery(new EduAttendanceRuleDate()).eq(EduAttendanceRuleDate::getRuleId,
rule.getId()));
eduAttendanceRuleTimeService.remove(
Wrappers.lambdaQuery(new EduAttendanceRuleTime()).eq(EduAttendanceRuleTime::getRuleId,
rule.getId()));
eduAttendanceRuleDeptService.remove(
Wrappers.lambdaQuery(new EduAttendanceRuleDept()).eq(EduAttendanceRuleDept::getRuleId,
rule.getId()));
eduAttendanceRuleDeviceService.remove(
Wrappers.lambdaQuery(new EduAttendanceRuleDevice()).eq(EduAttendanceRuleDevice::getRuleId,
rule.getId()));
} else {
LocalDateTime now = LocalDateTime.now();
for (EduAttendanceRuleDate ruleDate : rule.getDateList()) {
if (now.isAfter(ruleDate.getStartDate().atTime(0, 0, 0))) {
rule.setStatus(0);
break;
}
}
}
saveOrUpdate(rule);
// 保存运行时间
for (EduAttendanceRuleDate ruleDate : rule.getDateList()) {
ruleDate.setId(null);
ruleDate.setRuleId(rule.getId());
}
eduAttendanceRuleDateService.saveBatch(rule.getDateList());
// 保存考勤时间
for (EduAttendanceRuleTime ruleTime : rule.getTimeList()) {
ruleTime.setId(null);
ruleTime.setRuleId(rule.getId());
}
eduAttendanceRuleTimeService.saveBatch(rule.getTimeList());
// 保存部门绑定关系
for (EduAttendanceRuleDept ruleDept : rule.getDeptList()) {
ruleDept.setRuleId(rule.getId());
ruleDept.setId(null);
}
eduAttendanceRuleDeptService.saveBatch(rule.getDeptList());
// 保存规则与设备关系
for (EduAttendanceRuleDevice ruleDevice : rule.getDeviceList()) {
EduAttendanceDevice eduAttendanceDevice = eduAttendanceDeviceMapper.selectById(ruleDevice.getDeviceId());
ruleDevice.setDeviceId(eduAttendanceDevice.getId());
ruleDevice.setDeviceSn(eduAttendanceDevice.getSn());
ruleDevice.setRuleId(rule.getId());
ruleDevice.setCreateDate(LocalDateTime.now());
}
eduAttendanceRuleDeviceService.saveBatch(rule.getDeviceList());
}
@Override
public List<ConflictRuleVO> checkConflict(EduAttendanceRule rule) {
// 校验规则时间是否冲突
List<Long> dept = rule.getDeptList().stream().map(x -> x.getDeptId()).collect(Collectors.toList());
// 查询有关联的部门
List<Long> deptIds = remoteUserDeptService.getUpAndDownId(dept.toArray(new Long[0])).getData();
List<EduAttendanceRuleDate> date = rule.getDateList();
List<EduAttendanceRuleTime> time = rule.getTimeList();
log.info("deptIds:[{}]", deptIds);
return baseMapper.checkNormalRule(deptIds, date, time, rule.getType(), rule.getId());
}
@Override
@Transactional
public void deleteRule(List<Long> ids) {
eduAttendanceDeviceRuleService.remove(
Wrappers.lambdaQuery(new EduAttendanceDeviceRule()).in(EduAttendanceDeviceRule::getRuleId, ids));
eduAttendanceRuleDateService.remove(
Wrappers.lambdaQuery(new EduAttendanceRuleDate()).in(EduAttendanceRuleDate::getRuleId, ids));
eduAttendanceRuleTimeService.remove(
Wrappers.lambdaQuery(new EduAttendanceRuleTime()).in(EduAttendanceRuleTime::getRuleId, ids));
eduAttendanceRuleDeptService.remove(
Wrappers.lambdaQuery(new EduAttendanceRuleDept()).in(EduAttendanceRuleDept::getRuleId, ids));
removeByIds(ids);
}
@Override
public void changeRuleRun(Long id) {
EduAttendanceRule rule = getById(id);
Integer status = rule.getStatus();
if (rule.getStatus() == 0) {
// 运行中得规则可以停止
status = 1;
} else if (rule.getStatus() == 1) {
List<EduAttendanceRuleDate> dateList = eduAttendanceRuleDateService.list(
Wrappers.lambdaQuery(new EduAttendanceRuleDate())
.eq(EduAttendanceRuleDate::getRuleId, id));
LocalDateTime now = LocalDateTime.now();
for (EduAttendanceRuleDate ruleDate : dateList) {
LocalDateTime startTime = ruleDate.getStartDate().atTime(0, 0, 0);
LocalDateTime endTime = ruleDate.getEndDate().atTime(23, 59, 59);
if (now.isAfter(startTime) && now.isBefore(endTime)) {
// 已经停止得规则未过期可以再次运行
status = 0;
break;
}
}
}
Asserts.isTrue(!rule.getStatus().equals(status), "变更状态失败");
rule.setStatus(status);
updateById(rule);
}
@Override
public RuleListVO getValidRule(List<Long> deptIds, LocalDateTime date, Integer type, String deviceSn) {
// 向上获取部门id
// List<Long> deptIds = remoteUserDeptService.getUpAndDownId(new Long[]{deptId}).getData();
List<RuleListVO> ruleList = baseMapper.listValidRule(deptIds, date.toLocalDate(),
date.getDayOfWeek().getValue(), null, deviceSn, null);
RuleListVO validRule = CollUtil.isNotEmpty(ruleList) ? ruleList.get(0) : null;
return validRule;
}
@Override
public void updateRuleStatus() {
// 到期的规则
List<Long> expireIds = baseMapper.listExpireRule(LocalDate.now());
if (CollUtil.isNotEmpty(expireIds)) {
baseMapper.update(null, Wrappers.lambdaUpdate(new EduAttendanceRule())
.in(EduAttendanceRule::getId, expireIds)
.set(EduAttendanceRule::getStatus, 2));
}
// 启动规则
List<Long> notStartIds = baseMapper.listNotStartRule(LocalDate.now());
if (CollUtil.isNotEmpty(notStartIds)) {
baseMapper.update(null, Wrappers.lambdaUpdate(new EduAttendanceRule())
.in(EduAttendanceRule::getId, notStartIds)
.set(EduAttendanceRule::getStatus, 0));
}
// 一段时间到期 另一端时间未到
List<Long> willStartIds = baseMapper.listWillStartRule(LocalDate.now());
if (CollUtil.isNotEmpty(willStartIds)) {
baseMapper.update(null, Wrappers.lambdaUpdate(new EduAttendanceRule())
.in(EduAttendanceRule::getId, willStartIds)
.set(EduAttendanceRule::getStatus, 3));
}
}
@Override
public List<Long> listValidRuleDept(Long schoolId, Integer type) {
LocalDateTime now = LocalDateTime.now();
List<Long> deptIds = new ArrayList<>();
List<RuleListVO> ruleList = baseMapper.listValidRule(null, now.toLocalDate(), now.getDayOfWeek().getValue(), type, null,
schoolId);
if (CollUtil.isNotEmpty(ruleList)) {
for (RuleListVO rule : ruleList) {
deptIds.addAll(rule.getDeptList().stream().map(x -> x.getDeptId()).collect(Collectors.toList()));
}
deptIds = deptIds.stream().distinct().collect(Collectors.toList());
}
return deptIds;
}
}
@@ -0,0 +1,35 @@
package com.yida.data.attendance.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yida.data.attendance.mapper.EduAttendanceRuleTimeMapper;
import com.yida.data.attendance.service.EduAttendanceRuleTimeService;
import com.yida.data.common.core.entity.attendance.EduAttendanceRuleTime;
import com.yida.data.attendance.vo.RuleTimeVO;
import com.yida.data.user.feign.RemoteUserDeptService;
import java.time.LocalDate;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
* 考勤规则 考勤时间 Service实现
*
* @author zhanghaijun
* @date 2021-06-25 09:51:00
*/
@Service
@RequiredArgsConstructor
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public class EduAttendanceRuleTimeServiceImpl extends ServiceImpl
<EduAttendanceRuleTimeMapper, EduAttendanceRuleTime> implements EduAttendanceRuleTimeService {
private final RemoteUserDeptService remoteUserDeptService;
@Override
public List<RuleTimeVO> listDeptRuleTime(Long deptId, LocalDate date, Integer type) {
List<Long> deptIds = remoteUserDeptService.getUpId(new Long[]{deptId}).getData();
return baseMapper.listDeptRuleTime(deptIds, date, date.getDayOfWeek().getValue(), type);
}
}
@@ -0,0 +1,366 @@
//package com.yida.data.attendance.service.impl;
//
//import cc.mrbird.febs.common.redis.service.RedisService;
//import cn.hutool.core.collection.CollectionUtil;
//import cn.hutool.core.util.ObjectUtil;
//import com.baomidou.mybatisplus.core.metadata.IPage;
//import com.baomidou.mybatisplus.core.toolkit.StringUtils;
//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.yida.data.attendance.mapper.EduAttendanceStaffRecordMapper;
//import com.yida.data.attendance.service.*;
//import com.yida.data.attendance.vo.StaffRecordVO;
//import com.yida.data.common.core.entity.attendance.*;
//import com.yida.data.common.core.entity.user.EduStaff;
//import com.yida.data.common.core.entity.user.EduStaffDept;
//import com.yida.data.common.service.CommonService;
//import com.yida.data.user.feign.RemoteStaffService;
//import lombok.RequiredArgsConstructor;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Propagation;
//import org.springframework.transaction.annotation.Transactional;
//
//import java.time.LocalDate;
//import java.time.LocalDateTime;
//import java.util.List;
//
//import static com.yida.data.common.core.entity.constant.CachePrefixConstant.STAFF_DATA;
//
///**
// * 教职工考勤-进出记录 Service实现
// *
// * @author ccl
// * @date 2021-09-27 18:56:19
// */
//@Service
//@RequiredArgsConstructor
//@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
//public class EduAttendanceStaffRecordServiceImpBak extends ServiceImpl
// <EduAttendanceStaffRecordMapper, EduAttendanceStaffRecord> implements EduAttendanceStaffRecordService {
//
// private final EduAttendanceStaffResultService eduAttendanceStaffResultService;
// private final EduAttendanceStaffRuleService eduAttendanceStaffRuleService;
// private final EduAttendanceStaffRuleStaffService eduAttendanceStaffRuleStaffService;
// private final EduAttendanceStaffRuleTimeService eduAttendanceStaffRuleTimeService;
//
// private final RemoteStaffService remoteStaffService;
// private final CommonService commonService;
// private final RedisService redisService;
//
//
// @Override
// public IPage<StaffRecordVO> findPageStaffRecord(Page page, Long deptId, String nameOrPhone, String start, String end,
// Long schoolId) {
// List<Long> staffId = remoteStaffService.listStaffByDeptId(deptId, nameOrPhone, schoolId).getData();
// if (CollectionUtil.isEmpty(staffId)) {
// return page;
// }
// List<EduStaffDept> data = remoteStaffService.getStaffDeptByStaffIds(staffId).getData();
// if (StringUtils.isNotEmpty(start)) {
// start = start + " 00:00:00";
// }
// if (StringUtils.isNotEmpty(end)) {
// end = end + " 23:59:59";
// }
//
// IPage<StaffRecordVO> staffRecordVO = baseMapper.findPageStaffRecord(page, schoolId, start, end, staffId);
// List<StaffRecordVO> records = staffRecordVO.getRecords();
// if (CollectionUtil.isEmpty(records)) {
// return staffRecordVO;
// }
//
// for (StaffRecordVO record : records) {
// for (EduStaffDept staffDept : data) {
// if (staffDept.getStaffId().equals(record.getStaffId())) {
// EduStaff staff = (EduStaff) redisService.hget(STAFF_DATA, staffDept.getStaffId().toString());
// if (ObjectUtil.isEmpty(staff)) {
// staff = remoteStaffService.getStaff(staffDept.getStaffId()).getData();
// }
// List<EduStaffDept> staffDeptList = staff.getStaffDept();
// StringBuilder deptName = new StringBuilder();
// for (int i = 0; i < staffDeptList.size(); i++) {
// if (i == staffDeptList.size() - 1) {
// deptName.append(staffDeptList.get(i).getDeptName());
// } else {
// deptName.append(staffDeptList.get(i).getDeptName()).append(",");
// }
// }
// if (ObjectUtil.isEmpty(deptName.toString())) {
// deptName = new StringBuilder(staff.getSchoolName());
// }
// record.setDeptName(deptName.toString());
// record.setPhone(staffDept.getMobile());
// record.setStaffName(staffDept.getStaffName());
// break;
// }
// }
// LocalDateTime time = record.getTime();
// record.setWeek("星期" + time.getDayOfWeek().getValue());
// }
// return staffRecordVO;
// }
//
// /**
// * 定时处理数据
// */
// @Override
// @Transactional(rollbackFor = Exception.class)
// public void staffRecord() {
//
// LocalDateTime now = LocalDateTime.now();
//
// LocalDate today = LocalDate.now();
// //遍历所有规则0进1出
// List<EduAttendanceStaffRule> staffRules = eduAttendanceStaffRuleService
// .list(Wrappers.lambdaQuery(new EduAttendanceStaffRule()));
//
// for (EduAttendanceStaffRule staffRule : staffRules) {
// //规则对应的职工
// List<EduAttendanceStaffRuleStaff> ruleStaffs = eduAttendanceStaffRuleStaffService
// .list(Wrappers.lambdaQuery(new EduAttendanceStaffRuleStaff())
// .eq(EduAttendanceStaffRuleStaff::getRuleId, staffRule.getId()));
// for (EduAttendanceStaffRuleStaff ruleStaff : ruleStaffs) {
// //职工对应的结果
//
// List<EduAttendanceStaffRuleTime> ruleTimes = eduAttendanceStaffRuleTimeService
// .list(Wrappers.lambdaQuery(new EduAttendanceStaffRuleTime())
// .eq(EduAttendanceStaffRuleTime::getRuleId, staffRule.getId())
// .orderByAsc(EduAttendanceStaffRuleTime::getStartTime));
// for (int i = 0; i < ruleTimes.size(); i++) {
//
// if (ruleTimes.get(i).getStartTime().atDate(today).isBefore(now)) {
//
// if (i == 0) {
// //如果这个规则是第一天运行,则不生成昨天的记录
// if (today.isEqual(staffRule.getCreateDate().toLocalDate())) {
// continue;
// }
//
// //第一条则处理昨天最后一条数据
// EduAttendanceStaffRuleTime ruleTime = ruleTimes.get(ruleTimes.size() - 1);
// EduAttendanceStaffResult result = new EduAttendanceStaffResult();
// //查询上一天的最后一个时间段
//
// EduAttendanceStaffResult one = eduAttendanceStaffResultService
// .getOne(Wrappers.lambdaQuery(new EduAttendanceStaffResult())
// .eq(EduAttendanceStaffResult::getStaffId, ruleStaff.getStaffId())
// .eq(EduAttendanceStaffResult::getAttendanceDate, today.minusDays(1))
// .eq(EduAttendanceStaffResult::getRuleTimeId, ruleTimes.get(ruleTimes.size() - 1).getId())
// .eq(EduAttendanceStaffResult::getRuleId, staffRule.getId()));
//
// //如果上一天最后一个时间段有结果,则跳过
// if (ObjectUtil.isNotEmpty(one)) {
// continue;
// }
//
// //没有则生成结果
// one = new EduAttendanceStaffResult();
// result.setRuleTimeId(ruleTimes.get(ruleTimes.size() - 1).getId());
// result.setRuleId(staffRule.getId());
// result.setAttendanceDate(today.minusDays(1));
// result.setStartStiTime(ruleTime.getStartTime());
// result.setEndStiTime(ruleTime.getEndTime());
// result.setSchoolId(staffRule.getSchoolId());
// result.setStaffId(ruleStaff.getStaffId());
//
// EduAttendanceStaffRecord record = baseMapper
// .finMaxRecord(ruleStaff.getStaffId(), ruleTime.getStartTime().atDate(today));
// if (ObjectUtil.isEmpty(record)) {
// //迟到旷工
// List<EduAttendanceStaffRecord> staffRecords = baseMapper
// .findInRecord(ruleStaff.getStaffId(), result.getStartStiTime().atDate(today),
// result.getEndStiTime().atDate(today));
// if (CollectionUtil.isEmpty(staffRecords)) {
// result.setStatus(3);
// eduAttendanceStaffResultService.save(result);
// continue;
// }
// //迟到
// } else if (record.getScope() == 0) {
// EduAttendanceStaffRecord inRecord = baseMapper
// .fintRecord(ruleStaff.getStaffId(), ruleTime.getStartTime().atDate(today),
// ruleTimes.get(ruleTimes.size() - 1).getEndTime().atDate(today.minusDays(1)));
// if (ObjectUtil.isNotEmpty(inRecord)) {
// result.setStartRealTime(record.getCreateTime().toLocalTime());
// }
//
// //早退和正常
// EduAttendanceStaffRecord record2 = baseMapper
// .findMinOutRecord(ruleStaff.getStaffId(), ruleTime.getEndTime().atDate(today.plusDays(-1)));
// //如果没有记录则扩大范围到进入,看有没有出记录
// if (ObjectUtil.isEmpty(record2)) {
// EduAttendanceStaffRecord record3 = baseMapper.findMaxOutRecord(ruleStaff.getStaffId(),
// ruleTime.getStartTime().atDate(today.plusDays(-1)));
// //如果没有记录,则没有出去,记录为正常
// if (ObjectUtil.isEmpty(record3)) {
// result.setStatus(0);
// eduAttendanceStaffResultService.save(result);
// continue;
// }
// //有记录,则为早退
// result.setStatus(2);
// result.setEndRealTime(record3.getCreateTime().toLocalTime());
// eduAttendanceStaffResultService.save(result);
// continue;
// }
// result.setStatus(0);
// result.setEndRealTime(record2.getCreateTime().toLocalTime());
// eduAttendanceStaffResultService.save(result);
//
// } else if (record.getScope() == 1) {
// //迟到,旷工,迟到早退
//
// //查询结束之前没有进入的记录
// List<EduAttendanceStaffRecord> staffRecords = baseMapper
// .findInRecord(ruleStaff.getStaffId(), result.getStartStiTime().atDate(today.plusDays(-1)),
// result.getEndStiTime().atDate(today.plusDays(-1)));
// //如果没有进入的记录则是旷工
// if (CollectionUtil.isEmpty(staffRecords)) {
// result.setStatus(3);
// eduAttendanceStaffResultService.save(result);
// continue;
// }
// //第一条为最小的一条
// result.setStartRealTime(staffRecords.get(0).getCreateTime().toLocalTime());
// //查看是否正常下班
// EduAttendanceStaffRecord minOutRecord = baseMapper
// .findMinOutRecord(ruleStaff.getStaffId(), result.getEndStiTime().atDate(today.minusDays(1)));
// if (ObjectUtil.isEmpty(minOutRecord)) {
// //查看是否早退
// List<EduAttendanceStaffRecord> recordList = baseMapper.findOutRecord(ruleStaff.getStaffId(),
// result.getStartStiTime().atDate(today.minusDays(1)));
// //一直没有出去
// if (CollectionUtil.isEmpty(recordList)) {
// result.setStatus(1);
// eduAttendanceStaffResultService.save(result);
// break;
// }
// //迟到早退
// result.setStatus(4);
// result.setEndRealTime(recordList.get(0).getCreateTime().toLocalTime());
// eduAttendanceStaffResultService.save(result);
// break;
//
// }
// //迟到
// result.setEndRealTime(minOutRecord.getCreateTime().toLocalTime());
// result.setStatus(1);
// eduAttendanceStaffResultService.save(result);
// }
// }
// //后面一条则生成上一个时间段的结果
// else {
// EduAttendanceStaffResult one = eduAttendanceStaffResultService
// .getOne(Wrappers.lambdaQuery(new EduAttendanceStaffResult())
// .eq(EduAttendanceStaffResult::getStaffId, ruleStaff.getStaffId())
// .eq(EduAttendanceStaffResult::getAttendanceDate, today)
// .eq(EduAttendanceStaffResult::getRuleTimeId, ruleTimes.get(i - 1).getId())
// .eq(EduAttendanceStaffResult::getRuleId, staffRule.getId()));
// if (ObjectUtil.isNotEmpty(one)) {
// continue;
// }
// EduAttendanceStaffRuleTime ruleTime = ruleTimes.get(i - 1);
// EduAttendanceStaffResult result = new EduAttendanceStaffResult();
// result.setRuleTimeId(ruleTimes.get(i - 1).getId());
// result.setRuleId(staffRule.getId());
// result.setAttendanceDate(today);
// result.setStartStiTime(ruleTime.getStartTime());
// result.setEndStiTime(ruleTime.getEndTime());
// result.setSchoolId(staffRule.getSchoolId());
// result.setStaffId(ruleStaff.getStaffId());
//
// EduAttendanceStaffRecord record = baseMapper
// .finMaxRecord(ruleStaff.getStaffId(), ruleTime.getStartTime().atDate(today));
// if (ObjectUtil.isEmpty(record)) {
// //迟到旷工
// List<EduAttendanceStaffRecord> staffRecords = baseMapper
// .findInRecord(ruleStaff.getStaffId(), result.getStartStiTime().atDate(today),
// result.getEndStiTime().atDate(today));
// if (CollectionUtil.isEmpty(staffRecords)) {
// //没有进的记录
// result.setStatus(3);
// eduAttendanceStaffResultService.save(result);
// continue;
// }
// } else if (record.getScope() == 1) {
// //迟到,旷工,迟到早退
//
// //查询结束之前没有进入的记录
// List<EduAttendanceStaffRecord> staffRecords = baseMapper
// .findInRecord(ruleStaff.getStaffId(), result.getStartStiTime().atDate(today),
// result.getEndStiTime().atDate(today));
// //如果没有进入的记录则是旷工
// if (CollectionUtil.isEmpty(staffRecords)) {
// result.setStatus(3);
// eduAttendanceStaffResultService.save(result);
// continue;
// }
// //第一条为最小的一条
// result.setStartRealTime(staffRecords.get(0).getCreateTime().toLocalTime());
// //查看是否正常下班
// EduAttendanceStaffRecord minOutRecord = baseMapper
// .findMinOutRecord(ruleStaff.getStaffId(), result.getEndStiTime().atDate(today));
// if (ObjectUtil.isEmpty(minOutRecord)) {
// //查看是否早退
// List<EduAttendanceStaffRecord> recordList = baseMapper
// .findOutRecord(ruleStaff.getStaffId(), result.getStartStiTime().atDate(today));
// //一直没有出去
// if (CollectionUtil.isEmpty(recordList)) {
// result.setStatus(1);
// eduAttendanceStaffResultService.save(result);
// continue;
// }
// //迟到早退
// result.setStatus(4);
// result.setEndRealTime(recordList.get(0).getCreateTime().toLocalTime());
// eduAttendanceStaffResultService.save(result);
// continue;
//
// }
// //迟到
// result.setEndRealTime(minOutRecord.getCreateTime().toLocalTime());
// result.setStatus(1);
// eduAttendanceStaffResultService.save(result);
// continue;
// } else if (record.getScope() == 0) {
// EduAttendanceStaffRecord inRecord = baseMapper
// .fintRecord(ruleStaff.getStaffId(), ruleTime.getStartTime().atDate(today),
// ruleTimes.get(i - 1).getEndTime().atDate(today));
// if (ObjectUtil.isNotEmpty(inRecord)) {
// result.setStartRealTime(inRecord.getCreateTime().toLocalTime());
// }
//
// //早退和正常
// EduAttendanceStaffRecord record2 = baseMapper
// .findMinOutRecord(ruleStaff.getStaffId(), ruleTime.getEndTime().atDate(today));
// //如果没有记录则扩大范围到进入,看有没有出记录
// if (ObjectUtil.isEmpty(record2)) {
// EduAttendanceStaffRecord record3 = baseMapper
// .findMaxOutRecord(ruleStaff.getStaffId(), ruleTime.getStartTime().atDate(today));
// //如果没有记录,则没有出去,记录为正常
// if (ObjectUtil.isEmpty(record3)) {
// result.setStatus(0);
// eduAttendanceStaffResultService.save(result);
// continue;
// }
// //有记录,则为早退
// result.setStatus(2);
// result.setEndRealTime(record3.getCreateTime().toLocalTime());
// eduAttendanceStaffResultService.save(result);
// continue;
// }
// result.setStatus(0);
// result.setEndRealTime(record2.getCreateTime().toLocalTime());
// eduAttendanceStaffResultService.save(result);
//
// }
// }
// }
// }
//
// }
// }
//
// }
//}

Some files were not shown because too many files have changed in this diff Show More