新增考勤接口
This commit is contained in:
parent
fa5450c571
commit
262e138752
|
@ -1,6 +1,15 @@
|
||||||
package com.snow.system.controller;
|
package com.snow.system.controller;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import com.snow.common.constant.SequenceConstants;
|
||||||
|
import com.snow.framework.util.ShiroUtils;
|
||||||
|
import com.snow.system.domain.SysUser;
|
||||||
|
import com.snow.system.service.ISysSequenceService;
|
||||||
|
import com.snow.system.service.ISysUserService;
|
||||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.ui.ModelMap;
|
import org.springframework.ui.ModelMap;
|
||||||
|
@ -34,6 +43,12 @@ public class SysOaAttendanceController extends BaseController
|
||||||
@Autowired
|
@Autowired
|
||||||
private ISysOaAttendanceService sysOaAttendanceService;
|
private ISysOaAttendanceService sysOaAttendanceService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ISysSequenceService sequenceService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ISysUserService sysUserService;
|
||||||
|
|
||||||
@RequiresPermissions("system:attendance:view")
|
@RequiresPermissions("system:attendance:view")
|
||||||
@GetMapping()
|
@GetMapping()
|
||||||
public String attendance()
|
public String attendance()
|
||||||
|
@ -51,6 +66,12 @@ public class SysOaAttendanceController extends BaseController
|
||||||
{
|
{
|
||||||
startPage();
|
startPage();
|
||||||
List<SysOaAttendance> list = sysOaAttendanceService.selectSysOaAttendanceList(sysOaAttendance);
|
List<SysOaAttendance> list = sysOaAttendanceService.selectSysOaAttendanceList(sysOaAttendance);
|
||||||
|
if(CollUtil.isNotEmpty(list)){
|
||||||
|
list.forEach(t->{
|
||||||
|
SysUser sysUser = sysUserService.selectUserById(Long.parseLong(t.getUserId()));
|
||||||
|
t.setUserId(sysUser.getUserName());
|
||||||
|
});
|
||||||
|
}
|
||||||
return getDataTable(list);
|
return getDataTable(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,6 +107,15 @@ public class SysOaAttendanceController extends BaseController
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public AjaxResult addSave(SysOaAttendance sysOaAttendance)
|
public AjaxResult addSave(SysOaAttendance sysOaAttendance)
|
||||||
{
|
{
|
||||||
|
Long userId = ShiroUtils.getUserId();
|
||||||
|
sysOaAttendance.setUserId(String.valueOf(userId));
|
||||||
|
if(ObjectUtil.isEmpty(sysOaAttendance.getUserCheckTime())){
|
||||||
|
sysOaAttendance.setUserCheckTime(new Date());
|
||||||
|
}
|
||||||
|
String attendanceCode = sequenceService.getNewSequenceNo(SequenceConstants.OA_ATTENDANCE_SEQUENCE);
|
||||||
|
sysOaAttendance.setAttendanceCode(attendanceCode);
|
||||||
|
sysOaAttendance.setSourceType("USER");
|
||||||
|
sysOaAttendance.setWorkDate(new Date());
|
||||||
return toAjax(sysOaAttendanceService.insertSysOaAttendance(sysOaAttendance));
|
return toAjax(sysOaAttendanceService.insertSysOaAttendance(sysOaAttendance));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,56 +8,7 @@
|
||||||
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
|
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
|
||||||
<form class="form-horizontal m" id="form-attendance-add">
|
<form class="form-horizontal m" id="form-attendance-add">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label is-required">考勤编码:</label>
|
<label class="col-sm-3 control-label">考勤类型:</label>
|
||||||
<div class="col-sm-8">
|
|
||||||
<input name="attendanceCode" class="form-control" type="text" required>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="col-sm-3 control-label">考勤来源:详见字典表sys_oa_attendance_source_type(ATM:考勤机打卡:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<select name="sourceType" class="form-control m-b" th:with="type=${@dict.getType('sys_oa_attendance_source_type')}">
|
|
||||||
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="col-sm-3 control-label">关联的审批实例ID,当该字段非空时,表示打卡记录与请假、加班等审批有关:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input name="procInstId" class="form-control" type="text">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="col-sm-3 control-label is-required">关联的审批实例ID,当该字段非空时,表示打卡记录与请假、加班等审批有关:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input name="approveId" class="form-control" type="text" required>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="col-sm-3 control-label">打卡结果:详见字典表sys_oa_attendance_time_result(Normal:正常Early:早退Late:迟到SeriousLate:严重迟到Absenteeism:旷工迟到NotSigned:未打卡):</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<select name="timeResult" class="form-control m-b" th:with="type=${@dict.getType('sys_oa_attendance_time_result')}">
|
|
||||||
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="col-sm-3 control-label">位置结果:详见字典表sys_oa_attendance_location_result :</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<div class="radio-box" th:each="dict : ${@dict.getType('sys_oa_attendance_location_result')}">
|
|
||||||
<input type="radio" th:id="${'locationResult_' + dict.dictCode}" name="locationResult" th:value="${dict.dictValue}" th:checked="${dict.default}">
|
|
||||||
<label th:for="${'locationResult_' + dict.dictCode}" th:text="${dict.dictLabel}"></label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="col-sm-3 control-label">打卡人的UserID:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input name="userId" class="form-control" type="text">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="col-sm-3 control-label">考勤类型:详见字典表sys_oa_attendance_check_type(OnDuty:上班OffDuty:下班:</label>
|
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<div class="radio-box" th:each="dict : ${@dict.getType('sys_oa_attendance_check_type')}">
|
<div class="radio-box" th:each="dict : ${@dict.getType('sys_oa_attendance_check_type')}">
|
||||||
<input type="radio" th:id="${'checkType_' + dict.dictCode}" name="checkType" th:value="${dict.dictValue}" th:checked="${dict.default}">
|
<input type="radio" th:id="${'checkType_' + dict.dictCode}" name="checkType" th:value="${dict.dictValue}" th:checked="${dict.default}">
|
||||||
|
@ -65,63 +16,15 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label">实际打卡时间:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<div class="input-group date">
|
|
||||||
<input name="userCheckTime" class="form-control" placeholder="yyyy-MM-dd" type="text">
|
|
||||||
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="col-sm-3 control-label">工作日:</label>
|
<label class="col-sm-3 control-label">工作日:</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<div class="input-group date">
|
<div class="input-group date">
|
||||||
<input name="workDate" class="form-control" placeholder="yyyy-MM-dd" type="text">
|
<input type="text" class="date-input form-control" name="workDate" placeholder="请选择补卡工作日" required/>
|
||||||
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
|
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
|
||||||
<label class="col-sm-3 control-label">打卡记录ID:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input name="recordId" class="form-control" type="text">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="col-sm-3 control-label">排班ID:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input name="planId" class="form-control" type="text">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="col-sm-3 control-label">考勤组id:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input name="groupId" class="form-control" type="text">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="col-sm-3 control-label">考勤组id:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input name="attendanceId" class="form-control" type="text">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="col-sm-3 control-label">计算迟到和早退,基准时间:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<div class="input-group date">
|
|
||||||
<input name="baseCheckTime" class="form-control" placeholder="yyyy-MM-dd" type="text">
|
|
||||||
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="col-sm-3 control-label">删除标识:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input name="isDelete" class="form-control" type="text">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<th:block th:include="include :: footer" />
|
<th:block th:include="include :: footer" />
|
||||||
|
|
|
@ -59,7 +59,7 @@
|
||||||
|
|
||||||
<div class="btn-group-sm" id="toolbar" role="group">
|
<div class="btn-group-sm" id="toolbar" role="group">
|
||||||
<a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="system:attendance:add">
|
<a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="system:attendance:add">
|
||||||
<i class="fa fa-plus"></i> 添加
|
<i class="fa fa-plus"></i> 补卡
|
||||||
</a>
|
</a>
|
||||||
<a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="system:attendance:edit">
|
<a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="system:attendance:edit">
|
||||||
<i class="fa fa-edit"></i> 修改
|
<i class="fa fa-edit"></i> 修改
|
||||||
|
|
|
@ -12,8 +12,11 @@ import com.snow.dingtalk.model.request.AttendanceListRequest;
|
||||||
import com.snow.dingtalk.model.response.AttendanceListResponse;
|
import com.snow.dingtalk.model.response.AttendanceListResponse;
|
||||||
import com.snow.dingtalk.service.AttendanceService;
|
import com.snow.dingtalk.service.AttendanceService;
|
||||||
import com.snow.system.domain.SysOaAttendance;
|
import com.snow.system.domain.SysOaAttendance;
|
||||||
|
import com.snow.system.domain.SysUser;
|
||||||
|
import com.snow.system.mapper.SysUserMapper;
|
||||||
import com.snow.system.service.ISysOaAttendanceService;
|
import com.snow.system.service.ISysOaAttendanceService;
|
||||||
import com.snow.system.service.ISysSequenceService;
|
import com.snow.system.service.ISysSequenceService;
|
||||||
|
import com.snow.system.service.ISysUserService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.compress.utils.Lists;
|
import org.apache.commons.compress.utils.Lists;
|
||||||
|
@ -39,6 +42,8 @@ public class SyncDingAttendanceTask {
|
||||||
|
|
||||||
private final ISysSequenceService sequenceService;
|
private final ISysSequenceService sequenceService;
|
||||||
|
|
||||||
|
private final SysUserMapper sysUserMapper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 定时任务同步数据,每十分钟同步一次
|
* 定时任务同步数据,每十分钟同步一次
|
||||||
* @param dataFrom 开始时间
|
* @param dataFrom 开始时间
|
||||||
|
@ -54,13 +59,16 @@ public class SyncDingAttendanceTask {
|
||||||
if(StrUtil.isNotBlank(dataTo)){
|
if(StrUtil.isNotBlank(dataTo)){
|
||||||
attendanceListRequest.setWorkDateTo(dataTo);
|
attendanceListRequest.setWorkDateTo(dataTo);
|
||||||
}else {
|
}else {
|
||||||
attendanceListRequest.setWorkDateTo(DateUtils.getDate()+" 59:59:59");
|
attendanceListRequest.setWorkDateTo(DateUtils.getDate()+" 23:59:59");
|
||||||
}
|
}
|
||||||
long offset=0L;
|
long offset=0L;
|
||||||
long limit=10L;
|
long limit=10L;
|
||||||
attendanceListRequest.setOffset(offset);
|
attendanceListRequest.setOffset(offset);
|
||||||
attendanceListRequest.setLimit(limit);
|
attendanceListRequest.setLimit(limit);
|
||||||
attendanceListRequest.setUserIdList(CollUtil.newArrayList("manager4480"));
|
//获取所有用户
|
||||||
|
SysUser sysUser=new SysUser();
|
||||||
|
List<SysUser> sysUsers = sysUserMapper.selectUserList(sysUser);
|
||||||
|
attendanceListRequest.setUserIdList(sysUsers.stream().map(SysUser::getDingUserId).collect(Collectors.toList()));
|
||||||
AttendanceListResponse attendanceListResponse = attendanceService.getAttendanceList(attendanceListRequest);
|
AttendanceListResponse attendanceListResponse = attendanceService.getAttendanceList(attendanceListRequest);
|
||||||
saveSysOaAttendance(attendanceListResponse);
|
saveSysOaAttendance(attendanceListResponse);
|
||||||
boolean isHasMore=attendanceListResponse.isHasMore();
|
boolean isHasMore=attendanceListResponse.isHasMore();
|
||||||
|
@ -86,6 +94,12 @@ public class SyncDingAttendanceTask {
|
||||||
SysOaAttendance sysOaAttendance = BeanUtil.copyProperties(attendance, SysOaAttendance.class);
|
SysOaAttendance sysOaAttendance = BeanUtil.copyProperties(attendance, SysOaAttendance.class);
|
||||||
sysOaAttendance.setAttendanceCode(newSequenceNo);
|
sysOaAttendance.setAttendanceCode(newSequenceNo);
|
||||||
sysOaAttendance.setAttendanceId(attendance.getId());
|
sysOaAttendance.setAttendanceId(attendance.getId());
|
||||||
|
//把钉钉的userId转化成系统userId保存
|
||||||
|
SysUser sysUser = sysUserMapper.selectUserByDingUserId(attendance.getUserId());
|
||||||
|
if(ObjectUtil.isNull(sysUser)){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
sysOaAttendance.setUserId(String.valueOf(sysUser.getUserId()));
|
||||||
//判断是否已同步过
|
//判断是否已同步过
|
||||||
LambdaQueryWrapper<SysOaAttendance> sysOaAttendanceLambdaQueryWrapper = new QueryWrapper<SysOaAttendance>().lambda().eq(SysOaAttendance::getAttendanceId,attendance.getId());
|
LambdaQueryWrapper<SysOaAttendance> sysOaAttendanceLambdaQueryWrapper = new QueryWrapper<SysOaAttendance>().lambda().eq(SysOaAttendance::getAttendanceId,attendance.getId());
|
||||||
SysOaAttendance oaAttendance= sysOaAttendanceService.getOne(sysOaAttendanceLambdaQueryWrapper);
|
SysOaAttendance oaAttendance= sysOaAttendanceService.getOne(sysOaAttendanceLambdaQueryWrapper);
|
||||||
|
|
|
@ -62,7 +62,7 @@ public class SysOaAttendance extends BaseEntity
|
||||||
private Date userCheckTime;
|
private Date userCheckTime;
|
||||||
|
|
||||||
/** 工作日 */
|
/** 工作日 */
|
||||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
|
||||||
@Excel(name = "工作日", width = 30, dateFormat = "yyyy-MM-dd")
|
@Excel(name = "工作日", width = 30, dateFormat = "yyyy-MM-dd")
|
||||||
private Date workDate;
|
private Date workDate;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue