fix: 攀枝花东区-缴费分支代码处理
This commit is contained in:
@@ -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>
|
||||
+29
@@ -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);
|
||||
}
|
||||
}
|
||||
+111
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+26
@@ -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;
|
||||
}
|
||||
}
|
||||
+16
@@ -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;
|
||||
}
|
||||
+170
@@ -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));
|
||||
}
|
||||
}
|
||||
+122
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
+63
@@ -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));
|
||||
}
|
||||
}
|
||||
+116
@@ -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));
|
||||
}
|
||||
}
|
||||
+123
@@ -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));
|
||||
}
|
||||
}
|
||||
+55
@@ -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));
|
||||
}
|
||||
}
|
||||
+57
@@ -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));
|
||||
}
|
||||
}
|
||||
+92
@@ -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);
|
||||
}
|
||||
}
|
||||
+181
@@ -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));
|
||||
}
|
||||
}
|
||||
+42
@@ -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();
|
||||
}
|
||||
}
|
||||
+34
@@ -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();
|
||||
}
|
||||
}
|
||||
+52
@@ -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);
|
||||
}
|
||||
}
|
||||
+26
@@ -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();
|
||||
}
|
||||
}
|
||||
+38
@@ -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();
|
||||
}
|
||||
}
|
||||
+29
@@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
+28
@@ -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));
|
||||
}
|
||||
}
|
||||
+30
@@ -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));
|
||||
}
|
||||
}
|
||||
+60
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+30
@@ -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)));
|
||||
}
|
||||
}
|
||||
+44
@@ -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));
|
||||
}
|
||||
}
|
||||
+7
@@ -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> {
|
||||
}
|
||||
+28
@@ -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);
|
||||
}
|
||||
+35
@@ -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);
|
||||
}
|
||||
+7
@@ -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> {
|
||||
}
|
||||
+14
@@ -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> {
|
||||
|
||||
}
|
||||
+18
@@ -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);
|
||||
}
|
||||
+7
@@ -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> {
|
||||
}
|
||||
+111
@@ -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);
|
||||
|
||||
}
|
||||
+179
@@ -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);
|
||||
}
|
||||
+13
@@ -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);
|
||||
}
|
||||
+7
@@ -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> {
|
||||
}
|
||||
+7
@@ -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> {
|
||||
}
|
||||
+66
@@ -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);
|
||||
|
||||
}
|
||||
+20
@@ -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);
|
||||
}
|
||||
+130
@@ -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);
|
||||
}
|
||||
+89
@@ -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);
|
||||
|
||||
|
||||
}
|
||||
+14
@@ -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> {
|
||||
|
||||
}
|
||||
+25
@@ -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);
|
||||
}
|
||||
+18
@@ -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);
|
||||
}
|
||||
+42
@@ -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);
|
||||
}
|
||||
+14
@@ -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> {
|
||||
|
||||
}
|
||||
+14
@@ -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> {
|
||||
|
||||
}
|
||||
+14
@@ -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> {
|
||||
|
||||
}
|
||||
+7
@@ -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> {
|
||||
}
|
||||
+14
@@ -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> {
|
||||
|
||||
}
|
||||
+14
@@ -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> {
|
||||
|
||||
}
|
||||
+7
@@ -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> {
|
||||
}
|
||||
+14
@@ -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> {
|
||||
|
||||
}
|
||||
+9
@@ -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> {
|
||||
}
|
||||
+20
@@ -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);
|
||||
}
|
||||
+61
@@ -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);
|
||||
}
|
||||
+7
@@ -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> {
|
||||
}
|
||||
+91
@@ -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);
|
||||
}
|
||||
+26
@@ -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);
|
||||
}
|
||||
+17
@@ -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();
|
||||
}
|
||||
+17
@@ -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);
|
||||
}
|
||||
+48
@@ -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);
|
||||
|
||||
}
|
||||
+89
@@ -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);
|
||||
}
|
||||
+7
@@ -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> {
|
||||
}
|
||||
+7
@@ -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> {
|
||||
}
|
||||
+7
@@ -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> {
|
||||
}
|
||||
+44
@@ -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);
|
||||
}
|
||||
+19
@@ -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);
|
||||
}
|
||||
+35
@@ -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();
|
||||
}
|
||||
+72
@@ -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);
|
||||
}
|
||||
+14
@@ -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> {
|
||||
}
|
||||
+13
@@ -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> {
|
||||
}
|
||||
+27
@@ -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);
|
||||
}
|
||||
+14
@@ -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> {
|
||||
}
|
||||
+18
@@ -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();
|
||||
}
|
||||
+62
@@ -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);
|
||||
}
|
||||
+14
@@ -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> {
|
||||
}
|
||||
+7
@@ -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> {
|
||||
}
|
||||
+13
@@ -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> {
|
||||
}
|
||||
+14
@@ -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> {
|
||||
}
|
||||
+159
@@ -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);
|
||||
|
||||
}
|
||||
+25
@@ -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);
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
+16
@@ -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);
|
||||
}
|
||||
+25
@@ -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);
|
||||
}
|
||||
+93
@@ -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;
|
||||
}
|
||||
}
|
||||
+118
@@ -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);
|
||||
}
|
||||
}
|
||||
+13
@@ -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 {
|
||||
}
|
||||
+488
@@ -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;
|
||||
}
|
||||
}
|
||||
+66
@@ -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;
|
||||
}
|
||||
}
|
||||
+99
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+26
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
+793
@@ -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()));
|
||||
//
|
||||
// }
|
||||
}
|
||||
+665
@@ -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;
|
||||
}
|
||||
}
|
||||
+420
@@ -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;
|
||||
// }
|
||||
//}
|
||||
+12
@@ -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 {
|
||||
}
|
||||
+12
@@ -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 {
|
||||
}
|
||||
+11
@@ -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 {
|
||||
}
|
||||
+236
@@ -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;
|
||||
}
|
||||
}
|
||||
+35
@@ -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);
|
||||
}
|
||||
}
|
||||
+366
@@ -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
Reference in New Issue
Block a user