feat(oa): 新增考勤汇总功能
- 新增考勤汇总主表和明细表的插入接口 - 实现根据用户ID数组和日期范围计算出勤、加班、出差小时数的功能 - 优化数据结构,将用户ID类型从String改为Long - 添加日期格式注解,规范日期格式 - 重构部分代码,提高可读性和可维护性
This commit is contained in:
@@ -60,7 +60,7 @@ spring:
|
|||||||
lazy: true
|
lazy: true
|
||||||
type: ${spring.datasource.type}
|
type: ${spring.datasource.type}
|
||||||
driverClassName: com.mysql.cj.jdbc.Driver
|
driverClassName: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
|
url: jdbc:mysql://47.117.71.33:11293/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
|
||||||
username:
|
username:
|
||||||
password:
|
password:
|
||||||
# oracle:
|
# oracle:
|
||||||
|
|||||||
@@ -99,4 +99,16 @@ public class GearAttendanceSummaryController extends BaseController {
|
|||||||
@PathVariable Long[] summaryIds) {
|
@PathVariable Long[] summaryIds) {
|
||||||
return toAjax(iGearAttendanceSummaryService.deleteWithValidByIds(Arrays.asList(summaryIds), true));
|
return toAjax(iGearAttendanceSummaryService.deleteWithValidByIds(Arrays.asList(summaryIds), true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//新增主表加明细考勤汇总
|
||||||
|
@Log(title = "考勤汇总主表加明细表", businessType = BusinessType.INSERT)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PostMapping("/addWithDetails")
|
||||||
|
public R<Void> addWithDetails(@Validated(AddGroup.class) @RequestBody GearAttendanceSummaryBo bo) {
|
||||||
|
//调用服务层方法来保存主表和明细表数据
|
||||||
|
boolean result = iGearAttendanceSummaryService.insertWithDetails(bo);
|
||||||
|
return toAjax(result);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public class GearAttendanceRecord extends BaseEntity {
|
|||||||
/**
|
/**
|
||||||
* 用户ID
|
* 用户ID
|
||||||
*/
|
*/
|
||||||
private String userId;
|
private Long userId;
|
||||||
/**
|
/**
|
||||||
* 记录日期
|
* 记录日期
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import java.math.BigDecimal;
|
|||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import com.gear.common.core.domain.BaseEntity;
|
import com.gear.common.core.domain.BaseEntity;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 考勤汇总对象 gear_attendance_summary
|
* 考勤汇总对象 gear_attendance_summary
|
||||||
@@ -36,10 +37,12 @@ public class GearAttendanceSummary extends BaseEntity {
|
|||||||
/**
|
/**
|
||||||
* 汇总开始日期
|
* 汇总开始日期
|
||||||
*/
|
*/
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
private Date startDate;
|
private Date startDate;
|
||||||
/**
|
/**
|
||||||
* 汇总结束日期
|
* 汇总结束日期
|
||||||
*/
|
*/
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
private Date endDate;
|
private Date endDate;
|
||||||
/**
|
/**
|
||||||
* 删除标志
|
* 删除标志
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public class GearAttendanceSummaryDetail extends BaseEntity {
|
|||||||
/**
|
/**
|
||||||
* 用户ID
|
* 用户ID
|
||||||
*/
|
*/
|
||||||
private String userId;
|
private Long userId;
|
||||||
/**
|
/**
|
||||||
* 正常出勤小时数
|
* 正常出勤小时数
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ public class GearAttendanceRecordBo extends BaseEntity {
|
|||||||
/**
|
/**
|
||||||
* 用户ID
|
* 用户ID
|
||||||
*/
|
*/
|
||||||
private String userId;
|
private Long userId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 记录日期
|
* 记录日期
|
||||||
|
|||||||
@@ -9,8 +9,11 @@ import javax.validation.constraints.*;
|
|||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import com.gear.common.core.domain.BaseEntity;
|
import com.gear.common.core.domain.BaseEntity;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 考勤汇总业务对象 gear_attendance_summary
|
* 考勤汇总业务对象 gear_attendance_summary
|
||||||
@@ -36,11 +39,13 @@ public class GearAttendanceSummaryBo extends BaseEntity {
|
|||||||
/**
|
/**
|
||||||
* 汇总开始日期
|
* 汇总开始日期
|
||||||
*/
|
*/
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
private Date startDate;
|
private Date startDate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 汇总结束日期
|
* 汇总结束日期
|
||||||
*/
|
*/
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
private Date endDate;
|
private Date endDate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,5 +53,7 @@ public class GearAttendanceSummaryBo extends BaseEntity {
|
|||||||
*/
|
*/
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
|
//user_id数组
|
||||||
|
private List<Long> userIds;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public class GearAttendanceSummaryDetailBo extends BaseEntity {
|
|||||||
/**
|
/**
|
||||||
* 用户ID
|
* 用户ID
|
||||||
*/
|
*/
|
||||||
private String userId;
|
private Long userId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 正常出勤小时数
|
* 正常出勤小时数
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ public class GearAttendanceRecordVo {
|
|||||||
* 用户ID
|
* 用户ID
|
||||||
*/
|
*/
|
||||||
@ExcelProperty(value = "用户ID")
|
@ExcelProperty(value = "用户ID")
|
||||||
private String userId;
|
private Long userId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 记录日期
|
* 记录日期
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public class GearAttendanceSummaryDetailVo {
|
|||||||
* 用户ID
|
* 用户ID
|
||||||
*/
|
*/
|
||||||
@ExcelProperty(value = "用户ID")
|
@ExcelProperty(value = "用户ID")
|
||||||
private String userId;
|
private Long userId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 正常出勤小时数
|
* 正常出勤小时数
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import com.alibaba.excel.annotation.ExcelProperty;
|
|||||||
import com.gear.common.annotation.ExcelDictFormat;
|
import com.gear.common.annotation.ExcelDictFormat;
|
||||||
import com.gear.common.convert.ExcelDictConvert;
|
import com.gear.common.convert.ExcelDictConvert;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
|
||||||
@@ -38,12 +40,14 @@ public class GearAttendanceSummaryVo {
|
|||||||
/**
|
/**
|
||||||
* 汇总开始日期
|
* 汇总开始日期
|
||||||
*/
|
*/
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
@ExcelProperty(value = "汇总开始日期")
|
@ExcelProperty(value = "汇总开始日期")
|
||||||
private Date startDate;
|
private Date startDate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 汇总结束日期
|
* 汇总结束日期
|
||||||
*/
|
*/
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
@ExcelProperty(value = "汇总结束日期")
|
@ExcelProperty(value = "汇总结束日期")
|
||||||
private Date endDate;
|
private Date endDate;
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|||||||
import com.gear.oa.domain.GearAttendanceRecord;
|
import com.gear.oa.domain.GearAttendanceRecord;
|
||||||
import com.gear.oa.domain.vo.GearAttendanceRecordVo;
|
import com.gear.oa.domain.vo.GearAttendanceRecordVo;
|
||||||
import com.gear.common.core.mapper.BaseMapperPlus;
|
import com.gear.common.core.mapper.BaseMapperPlus;
|
||||||
|
import com.gear.oa.domain.vo.GearAttendanceSummaryDetailVo;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 考勤(含考勤/加班/出差)Mapper接口
|
* 考勤(含考勤/加班/出差)Mapper接口
|
||||||
*
|
*
|
||||||
@@ -17,4 +20,5 @@ import org.apache.ibatis.annotations.Param;
|
|||||||
public interface GearAttendanceRecordMapper extends BaseMapperPlus<GearAttendanceRecordMapper, GearAttendanceRecord, GearAttendanceRecordVo> {
|
public interface GearAttendanceRecordMapper extends BaseMapperPlus<GearAttendanceRecordMapper, GearAttendanceRecord, GearAttendanceRecordVo> {
|
||||||
|
|
||||||
Page<GearAttendanceRecordVo> selectVoPagePlus(Page<Object> build, @Param("ew") QueryWrapper<GearAttendanceRecord> lqw);
|
Page<GearAttendanceRecordVo> selectVoPagePlus(Page<Object> build, @Param("ew") QueryWrapper<GearAttendanceRecord> lqw);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ package com.gear.oa.mapper;
|
|||||||
import com.gear.oa.domain.GearAttendanceSummaryDetail;
|
import com.gear.oa.domain.GearAttendanceSummaryDetail;
|
||||||
import com.gear.oa.domain.vo.GearAttendanceSummaryDetailVo;
|
import com.gear.oa.domain.vo.GearAttendanceSummaryDetailVo;
|
||||||
import com.gear.common.core.mapper.BaseMapperPlus;
|
import com.gear.common.core.mapper.BaseMapperPlus;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 考勤汇总明细Mapper接口
|
* 考勤汇总明细Mapper接口
|
||||||
@@ -12,4 +15,5 @@ import com.gear.common.core.mapper.BaseMapperPlus;
|
|||||||
*/
|
*/
|
||||||
public interface GearAttendanceSummaryDetailMapper extends BaseMapperPlus<GearAttendanceSummaryDetailMapper, GearAttendanceSummaryDetail, GearAttendanceSummaryDetailVo> {
|
public interface GearAttendanceSummaryDetailMapper extends BaseMapperPlus<GearAttendanceSummaryDetailMapper, GearAttendanceSummaryDetail, GearAttendanceSummaryDetailVo> {
|
||||||
|
|
||||||
|
int insertBatchDetails(List<GearAttendanceSummaryDetailVo> detailList);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,4 +46,6 @@ public interface IGearAttendanceSummaryService {
|
|||||||
* 校验并批量删除考勤汇总信息
|
* 校验并批量删除考勤汇总信息
|
||||||
*/
|
*/
|
||||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||||
|
|
||||||
|
boolean insertWithDetails(GearAttendanceSummaryBo bo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ public class GearAttendanceRecordServiceImpl implements IGearAttendanceRecordSer
|
|||||||
Map<String, Object> params = bo.getParams();
|
Map<String, Object> params = bo.getParams();
|
||||||
QueryWrapper<GearAttendanceRecord> lqw = Wrappers.query();
|
QueryWrapper<GearAttendanceRecord> lqw = Wrappers.query();
|
||||||
// 使用表别名 ar 来构建查询条件
|
// 使用表别名 ar 来构建查询条件
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getUserId()), "ar.user_id", bo.getUserId());
|
lqw.eq(bo.getUserId()!=null, "ar.user_id", bo.getUserId());
|
||||||
lqw.eq(bo.getRecordDate() != null, "ar.record_date", bo.getRecordDate());
|
lqw.eq(bo.getRecordDate() != null, "ar.record_date", bo.getRecordDate());
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getRecordType()), "ar.record_type", bo.getRecordType());
|
lqw.eq(StringUtils.isNotBlank(bo.getRecordType()), "ar.record_type", bo.getRecordType());
|
||||||
// 修改开始时间和结束时间为区间查询
|
// 修改开始时间和结束时间为区间查询
|
||||||
@@ -82,7 +82,7 @@ public class GearAttendanceRecordServiceImpl implements IGearAttendanceRecordSer
|
|||||||
private LambdaQueryWrapper<GearAttendanceRecord> buildQueryWrapper(GearAttendanceRecordBo bo) {
|
private LambdaQueryWrapper<GearAttendanceRecord> buildQueryWrapper(GearAttendanceRecordBo bo) {
|
||||||
Map<String, Object> params = bo.getParams();
|
Map<String, Object> params = bo.getParams();
|
||||||
LambdaQueryWrapper<GearAttendanceRecord> lqw = Wrappers.lambdaQuery();
|
LambdaQueryWrapper<GearAttendanceRecord> lqw = Wrappers.lambdaQuery();
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getUserId()), GearAttendanceRecord::getUserId, bo.getUserId());
|
lqw.eq(bo.getUserId()!=null, GearAttendanceRecord::getUserId, bo.getUserId());
|
||||||
lqw.eq(bo.getRecordDate() != null, GearAttendanceRecord::getRecordDate, bo.getRecordDate());
|
lqw.eq(bo.getRecordDate() != null, GearAttendanceRecord::getRecordDate, bo.getRecordDate());
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getRecordType()), GearAttendanceRecord::getRecordType, bo.getRecordType());
|
lqw.eq(StringUtils.isNotBlank(bo.getRecordType()), GearAttendanceRecord::getRecordType, bo.getRecordType());
|
||||||
lqw.eq(bo.getStartTime() != null, GearAttendanceRecord::getStartTime, bo.getStartTime());
|
lqw.eq(bo.getStartTime() != null, GearAttendanceRecord::getStartTime, bo.getStartTime());
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ public class GearAttendanceSummaryDetailServiceImpl implements IGearAttendanceSu
|
|||||||
Map<String, Object> params = bo.getParams();
|
Map<String, Object> params = bo.getParams();
|
||||||
LambdaQueryWrapper<GearAttendanceSummaryDetail> lqw = Wrappers.lambdaQuery();
|
LambdaQueryWrapper<GearAttendanceSummaryDetail> lqw = Wrappers.lambdaQuery();
|
||||||
lqw.eq(bo.getSummaryId() != null, GearAttendanceSummaryDetail::getSummaryId, bo.getSummaryId());
|
lqw.eq(bo.getSummaryId() != null, GearAttendanceSummaryDetail::getSummaryId, bo.getSummaryId());
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getUserId()), GearAttendanceSummaryDetail::getUserId, bo.getUserId());
|
lqw.eq(bo.getUserId()!=null, GearAttendanceSummaryDetail::getUserId, bo.getUserId());
|
||||||
lqw.eq(bo.getNormalHours() != null, GearAttendanceSummaryDetail::getNormalHours, bo.getNormalHours());
|
lqw.eq(bo.getNormalHours() != null, GearAttendanceSummaryDetail::getNormalHours, bo.getNormalHours());
|
||||||
lqw.eq(bo.getOvertimeHours() != null, GearAttendanceSummaryDetail::getOvertimeHours, bo.getOvertimeHours());
|
lqw.eq(bo.getOvertimeHours() != null, GearAttendanceSummaryDetail::getOvertimeHours, bo.getOvertimeHours());
|
||||||
lqw.eq(bo.getTravelHours() != null, GearAttendanceSummaryDetail::getTravelHours, bo.getTravelHours());
|
lqw.eq(bo.getTravelHours() != null, GearAttendanceSummaryDetail::getTravelHours, bo.getTravelHours());
|
||||||
|
|||||||
@@ -1,12 +1,17 @@
|
|||||||
package com.gear.oa.service.impl;
|
package com.gear.oa.service.impl;
|
||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
|
import com.gear.common.core.domain.R;
|
||||||
import com.gear.common.utils.StringUtils;
|
import com.gear.common.utils.StringUtils;
|
||||||
import com.gear.common.core.page.TableDataInfo;
|
import com.gear.common.core.page.TableDataInfo;
|
||||||
import com.gear.common.core.domain.PageQuery;
|
import com.gear.common.core.domain.PageQuery;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
|
import com.gear.oa.domain.GearAttendanceRecord;
|
||||||
|
import com.gear.oa.domain.vo.GearAttendanceSummaryDetailVo;
|
||||||
|
import com.gear.oa.mapper.GearAttendanceRecordMapper;
|
||||||
|
import com.gear.oa.mapper.GearAttendanceSummaryDetailMapper;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import com.gear.oa.domain.bo.GearAttendanceSummaryBo;
|
import com.gear.oa.domain.bo.GearAttendanceSummaryBo;
|
||||||
@@ -15,9 +20,12 @@ import com.gear.oa.domain.GearAttendanceSummary;
|
|||||||
import com.gear.oa.mapper.GearAttendanceSummaryMapper;
|
import com.gear.oa.mapper.GearAttendanceSummaryMapper;
|
||||||
import com.gear.oa.service.IGearAttendanceSummaryService;
|
import com.gear.oa.service.IGearAttendanceSummaryService;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 考勤汇总Service业务层处理
|
* 考勤汇总Service业务层处理
|
||||||
@@ -30,6 +38,8 @@ import java.util.Collection;
|
|||||||
public class GearAttendanceSummaryServiceImpl implements IGearAttendanceSummaryService {
|
public class GearAttendanceSummaryServiceImpl implements IGearAttendanceSummaryService {
|
||||||
|
|
||||||
private final GearAttendanceSummaryMapper baseMapper;
|
private final GearAttendanceSummaryMapper baseMapper;
|
||||||
|
private final GearAttendanceRecordMapper gearAttendanceRecordMapper;
|
||||||
|
private final GearAttendanceSummaryDetailMapper gearAttendanceSummaryDetailMapper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询考勤汇总
|
* 查询考勤汇总
|
||||||
@@ -108,4 +118,81 @@ public class GearAttendanceSummaryServiceImpl implements IGearAttendanceSummaryS
|
|||||||
}
|
}
|
||||||
return baseMapper.deleteBatchIds(ids) > 0;
|
return baseMapper.deleteBatchIds(ids) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean insertWithDetails(GearAttendanceSummaryBo bo) {
|
||||||
|
//新增主表单挑记录根据bo.getSummaryName以及 bo.getStartDate()和bo.getEndDate()来新增主表记录
|
||||||
|
GearAttendanceSummary summary = new GearAttendanceSummary();
|
||||||
|
summary.setSummaryName(bo.getSummaryName());
|
||||||
|
summary.setStartDate(bo.getStartDate());
|
||||||
|
summary.setEndDate(bo.getEndDate());
|
||||||
|
//插入主表记录
|
||||||
|
baseMapper.insert(summary);
|
||||||
|
//接着处理明细表主要是根据gear_attendance_record表来计算出勤小时数、加班小时数、出差小时数等
|
||||||
|
//通过bo.getUserIds()获取用户ID数组
|
||||||
|
List<Long> userIds = bo.getUserIds();
|
||||||
|
//增加空值检查
|
||||||
|
if (bo.getUserIds() == null || bo.getUserIds().isEmpty()) {
|
||||||
|
return true; // 或抛出异常,根据业务需求决定
|
||||||
|
}
|
||||||
|
//根据userIds以及startTime和endTime批量查询record得到每个人的出勤小时数、加班小时数、出差小时数等
|
||||||
|
List<GearAttendanceRecord> records = gearAttendanceRecordMapper.selectList(Wrappers.<GearAttendanceRecord>lambdaQuery()
|
||||||
|
.in(GearAttendanceRecord::getUserId, userIds)
|
||||||
|
.ge(GearAttendanceRecord::getStartTime, bo.getStartDate())
|
||||||
|
.le(GearAttendanceRecord::getEndTime, bo.getEndDate()));
|
||||||
|
//根据records.stream()进行分组统计
|
||||||
|
// 按userId和recordType分组,确保每个用户每种类型正确统计
|
||||||
|
Map<String, List<GearAttendanceRecord>> groupedRecords = records.stream()
|
||||||
|
.collect(Collectors.groupingBy(r -> r.getUserId() + "_" + r.getRecordType()));
|
||||||
|
|
||||||
|
// 为每个用户创建汇总明细
|
||||||
|
Map<Long, GearAttendanceSummaryDetailVo> summaryDetails = new HashMap<>();
|
||||||
|
|
||||||
|
for (List<GearAttendanceRecord> recordList : groupedRecords.values()) {
|
||||||
|
if (recordList.isEmpty()) continue;
|
||||||
|
|
||||||
|
GearAttendanceRecord firstRecord = recordList.get(0);
|
||||||
|
Long userId = firstRecord.getUserId();
|
||||||
|
String recordType = firstRecord.getRecordType();
|
||||||
|
|
||||||
|
// 获取或创建用户的汇总明细
|
||||||
|
GearAttendanceSummaryDetailVo detail = summaryDetails.computeIfAbsent(userId, k -> {
|
||||||
|
GearAttendanceSummaryDetailVo newDetail = new GearAttendanceSummaryDetailVo();
|
||||||
|
newDetail.setUserId(userId);
|
||||||
|
newDetail.setNormalHours(BigDecimal.ZERO);
|
||||||
|
newDetail.setOvertimeHours(BigDecimal.ZERO);
|
||||||
|
newDetail.setTravelHours(BigDecimal.ZERO);
|
||||||
|
return newDetail;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 计算该类型的小时数总和
|
||||||
|
long totalHours = recordList.stream()
|
||||||
|
.mapToLong(GearAttendanceRecord::getDurationHour)
|
||||||
|
.sum();
|
||||||
|
|
||||||
|
// 根据记录类型设置对应的小时数
|
||||||
|
switch (recordType) {
|
||||||
|
case "attendance":
|
||||||
|
detail.setNormalHours(detail.getNormalHours().add(BigDecimal.valueOf(totalHours)));
|
||||||
|
break;
|
||||||
|
case "overtime":
|
||||||
|
detail.setOvertimeHours(detail.getOvertimeHours().add(BigDecimal.valueOf(totalHours)));
|
||||||
|
break;
|
||||||
|
case "travel":
|
||||||
|
detail.setTravelHours(detail.getTravelHours().add(BigDecimal.valueOf(totalHours)));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//将summaryDetails转换为List<GearAttendanceSummaryDetailVo>
|
||||||
|
List<GearAttendanceSummaryDetailVo> detailList = summaryDetails.values().stream()
|
||||||
|
.map(detail -> {
|
||||||
|
detail.setSummaryId(summary.getSummaryId());
|
||||||
|
return detail;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
//批量插入明细表记录
|
||||||
|
if (!detailList.isEmpty()) {
|
||||||
|
return gearAttendanceSummaryDetailMapper.insertBatchDetails(detailList) > 0;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
<result property="delFlag" column="del_flag"/>
|
<result property="delFlag" column="del_flag"/>
|
||||||
<result property="remark" column="remark"/>
|
<result property="remark" column="remark"/>
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
<insert id="insertBatchDetails">
|
||||||
|
insert into gear_attendance_summary_detail (summary_id, user_id, normal_hours,
|
||||||
|
overtime_hours, travel_hours, remark)
|
||||||
|
values
|
||||||
|
<foreach collection="list" item="item" separator=",">
|
||||||
|
( #{item.summaryId}, #{item.userId}, #{item.normalHours},
|
||||||
|
#{item.overtimeHours}, #{item.travelHours}, #{item.remark})
|
||||||
|
</foreach>
|
||||||
|
</insert>
|
||||||
|
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
Reference in New Issue
Block a user