diff --git a/gear-admin/src/main/resources/application-prod.yml b/gear-admin/src/main/resources/application-prod.yml index f1f8369..758469c 100644 --- a/gear-admin/src/main/resources/application-prod.yml +++ b/gear-admin/src/main/resources/application-prod.yml @@ -60,7 +60,7 @@ spring: lazy: true type: ${spring.datasource.type} 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: password: # oracle: diff --git a/gear-oa/src/main/java/com/gear/oa/controller/GearAttendanceSummaryController.java b/gear-oa/src/main/java/com/gear/oa/controller/GearAttendanceSummaryController.java index 7581104..7d49008 100644 --- a/gear-oa/src/main/java/com/gear/oa/controller/GearAttendanceSummaryController.java +++ b/gear-oa/src/main/java/com/gear/oa/controller/GearAttendanceSummaryController.java @@ -99,4 +99,16 @@ public class GearAttendanceSummaryController extends BaseController { @PathVariable Long[] summaryIds) { return toAjax(iGearAttendanceSummaryService.deleteWithValidByIds(Arrays.asList(summaryIds), true)); } + + + //新增主表加明细考勤汇总 + @Log(title = "考勤汇总主表加明细表", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/addWithDetails") + public R addWithDetails(@Validated(AddGroup.class) @RequestBody GearAttendanceSummaryBo bo) { + //调用服务层方法来保存主表和明细表数据 + boolean result = iGearAttendanceSummaryService.insertWithDetails(bo); + return toAjax(result); + } + } diff --git a/gear-oa/src/main/java/com/gear/oa/domain/GearAttendanceRecord.java b/gear-oa/src/main/java/com/gear/oa/domain/GearAttendanceRecord.java index bb2dfca..8630a41 100644 --- a/gear-oa/src/main/java/com/gear/oa/domain/GearAttendanceRecord.java +++ b/gear-oa/src/main/java/com/gear/oa/domain/GearAttendanceRecord.java @@ -33,7 +33,7 @@ public class GearAttendanceRecord extends BaseEntity { /** * 用户ID */ - private String userId; + private Long userId; /** * 记录日期 */ diff --git a/gear-oa/src/main/java/com/gear/oa/domain/GearAttendanceSummary.java b/gear-oa/src/main/java/com/gear/oa/domain/GearAttendanceSummary.java index bffc02e..a77faf7 100644 --- a/gear-oa/src/main/java/com/gear/oa/domain/GearAttendanceSummary.java +++ b/gear-oa/src/main/java/com/gear/oa/domain/GearAttendanceSummary.java @@ -10,6 +10,7 @@ import java.math.BigDecimal; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import com.gear.common.core.domain.BaseEntity; +import org.springframework.format.annotation.DateTimeFormat; /** * 考勤汇总对象 gear_attendance_summary @@ -36,10 +37,12 @@ public class GearAttendanceSummary extends BaseEntity { /** * 汇总开始日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date startDate; /** * 汇总结束日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date endDate; /** * 删除标志 diff --git a/gear-oa/src/main/java/com/gear/oa/domain/GearAttendanceSummaryDetail.java b/gear-oa/src/main/java/com/gear/oa/domain/GearAttendanceSummaryDetail.java index 9471346..145a666 100644 --- a/gear-oa/src/main/java/com/gear/oa/domain/GearAttendanceSummaryDetail.java +++ b/gear-oa/src/main/java/com/gear/oa/domain/GearAttendanceSummaryDetail.java @@ -35,7 +35,7 @@ public class GearAttendanceSummaryDetail extends BaseEntity { /** * 用户ID */ - private String userId; + private Long userId; /** * 正常出勤小时数 */ diff --git a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearAttendanceRecordBo.java b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearAttendanceRecordBo.java index fcde093..293bbfa 100644 --- a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearAttendanceRecordBo.java +++ b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearAttendanceRecordBo.java @@ -27,7 +27,7 @@ public class GearAttendanceRecordBo extends BaseEntity { /** * 用户ID */ - private String userId; + private Long userId; /** * 记录日期 diff --git a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearAttendanceSummaryBo.java b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearAttendanceSummaryBo.java index 06586bd..ad6db96 100644 --- a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearAttendanceSummaryBo.java +++ b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearAttendanceSummaryBo.java @@ -9,8 +9,11 @@ import javax.validation.constraints.*; import java.util.Date; import java.util.Date; +import java.util.List; + import com.fasterxml.jackson.annotation.JsonFormat; import com.gear.common.core.domain.BaseEntity; +import org.springframework.format.annotation.DateTimeFormat; /** * 考勤汇总业务对象 gear_attendance_summary @@ -36,11 +39,13 @@ public class GearAttendanceSummaryBo extends BaseEntity { /** * 汇总开始日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date startDate; /** * 汇总结束日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date endDate; /** @@ -48,5 +53,7 @@ public class GearAttendanceSummaryBo extends BaseEntity { */ private String remark; + //user_id数组 + private List userIds; } diff --git a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearAttendanceSummaryDetailBo.java b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearAttendanceSummaryDetailBo.java index 73dc927..a873ed9 100644 --- a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearAttendanceSummaryDetailBo.java +++ b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearAttendanceSummaryDetailBo.java @@ -35,7 +35,7 @@ public class GearAttendanceSummaryDetailBo extends BaseEntity { /** * 用户ID */ - private String userId; + private Long userId; /** * 正常出勤小时数 diff --git a/gear-oa/src/main/java/com/gear/oa/domain/vo/GearAttendanceRecordVo.java b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearAttendanceRecordVo.java index 4e385fa..45ffa05 100644 --- a/gear-oa/src/main/java/com/gear/oa/domain/vo/GearAttendanceRecordVo.java +++ b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearAttendanceRecordVo.java @@ -34,7 +34,7 @@ public class GearAttendanceRecordVo { * 用户ID */ @ExcelProperty(value = "用户ID") - private String userId; + private Long userId; /** * 记录日期 diff --git a/gear-oa/src/main/java/com/gear/oa/domain/vo/GearAttendanceSummaryDetailVo.java b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearAttendanceSummaryDetailVo.java index 53a37ff..31518a4 100644 --- a/gear-oa/src/main/java/com/gear/oa/domain/vo/GearAttendanceSummaryDetailVo.java +++ b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearAttendanceSummaryDetailVo.java @@ -38,7 +38,7 @@ public class GearAttendanceSummaryDetailVo { * 用户ID */ @ExcelProperty(value = "用户ID") - private String userId; + private Long userId; /** * 正常出勤小时数 diff --git a/gear-oa/src/main/java/com/gear/oa/domain/vo/GearAttendanceSummaryVo.java b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearAttendanceSummaryVo.java index 9c32ef5..0a268ad 100644 --- a/gear-oa/src/main/java/com/gear/oa/domain/vo/GearAttendanceSummaryVo.java +++ b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearAttendanceSummaryVo.java @@ -7,6 +7,8 @@ import com.alibaba.excel.annotation.ExcelProperty; import com.gear.common.annotation.ExcelDictFormat; import com.gear.common.convert.ExcelDictConvert; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + import java.util.Date; @@ -38,12 +40,14 @@ public class GearAttendanceSummaryVo { /** * 汇总开始日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "汇总开始日期") private Date startDate; /** * 汇总结束日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "汇总结束日期") private Date endDate; diff --git a/gear-oa/src/main/java/com/gear/oa/mapper/GearAttendanceRecordMapper.java b/gear-oa/src/main/java/com/gear/oa/mapper/GearAttendanceRecordMapper.java index e519ca8..620e3b5 100644 --- a/gear-oa/src/main/java/com/gear/oa/mapper/GearAttendanceRecordMapper.java +++ b/gear-oa/src/main/java/com/gear/oa/mapper/GearAttendanceRecordMapper.java @@ -6,8 +6,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.gear.oa.domain.GearAttendanceRecord; import com.gear.oa.domain.vo.GearAttendanceRecordVo; import com.gear.common.core.mapper.BaseMapperPlus; +import com.gear.oa.domain.vo.GearAttendanceSummaryDetailVo; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** * 考勤(含考勤/加班/出差)Mapper接口 * @@ -17,4 +20,5 @@ import org.apache.ibatis.annotations.Param; public interface GearAttendanceRecordMapper extends BaseMapperPlus { Page selectVoPagePlus(Page build, @Param("ew") QueryWrapper lqw); + } diff --git a/gear-oa/src/main/java/com/gear/oa/mapper/GearAttendanceSummaryDetailMapper.java b/gear-oa/src/main/java/com/gear/oa/mapper/GearAttendanceSummaryDetailMapper.java index 61be57c..21a2476 100644 --- a/gear-oa/src/main/java/com/gear/oa/mapper/GearAttendanceSummaryDetailMapper.java +++ b/gear-oa/src/main/java/com/gear/oa/mapper/GearAttendanceSummaryDetailMapper.java @@ -3,6 +3,9 @@ package com.gear.oa.mapper; import com.gear.oa.domain.GearAttendanceSummaryDetail; import com.gear.oa.domain.vo.GearAttendanceSummaryDetailVo; import com.gear.common.core.mapper.BaseMapperPlus; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 考勤汇总明细Mapper接口 @@ -12,4 +15,5 @@ import com.gear.common.core.mapper.BaseMapperPlus; */ public interface GearAttendanceSummaryDetailMapper extends BaseMapperPlus { + int insertBatchDetails(List detailList); } diff --git a/gear-oa/src/main/java/com/gear/oa/service/IGearAttendanceSummaryService.java b/gear-oa/src/main/java/com/gear/oa/service/IGearAttendanceSummaryService.java index 813e0ef..a1fa2a5 100644 --- a/gear-oa/src/main/java/com/gear/oa/service/IGearAttendanceSummaryService.java +++ b/gear-oa/src/main/java/com/gear/oa/service/IGearAttendanceSummaryService.java @@ -46,4 +46,6 @@ public interface IGearAttendanceSummaryService { * 校验并批量删除考勤汇总信息 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + boolean insertWithDetails(GearAttendanceSummaryBo bo); } diff --git a/gear-oa/src/main/java/com/gear/oa/service/impl/GearAttendanceRecordServiceImpl.java b/gear-oa/src/main/java/com/gear/oa/service/impl/GearAttendanceRecordServiceImpl.java index 2c736d8..57e4134 100644 --- a/gear-oa/src/main/java/com/gear/oa/service/impl/GearAttendanceRecordServiceImpl.java +++ b/gear-oa/src/main/java/com/gear/oa/service/impl/GearAttendanceRecordServiceImpl.java @@ -54,7 +54,7 @@ public class GearAttendanceRecordServiceImpl implements IGearAttendanceRecordSer Map params = bo.getParams(); QueryWrapper lqw = Wrappers.query(); // 使用表别名 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(StringUtils.isNotBlank(bo.getRecordType()), "ar.record_type", bo.getRecordType()); // 修改开始时间和结束时间为区间查询 @@ -82,7 +82,7 @@ public class GearAttendanceRecordServiceImpl implements IGearAttendanceRecordSer private LambdaQueryWrapper buildQueryWrapper(GearAttendanceRecordBo bo) { Map params = bo.getParams(); LambdaQueryWrapper 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(StringUtils.isNotBlank(bo.getRecordType()), GearAttendanceRecord::getRecordType, bo.getRecordType()); lqw.eq(bo.getStartTime() != null, GearAttendanceRecord::getStartTime, bo.getStartTime()); diff --git a/gear-oa/src/main/java/com/gear/oa/service/impl/GearAttendanceSummaryDetailServiceImpl.java b/gear-oa/src/main/java/com/gear/oa/service/impl/GearAttendanceSummaryDetailServiceImpl.java index 7a37320..519ea0f 100644 --- a/gear-oa/src/main/java/com/gear/oa/service/impl/GearAttendanceSummaryDetailServiceImpl.java +++ b/gear-oa/src/main/java/com/gear/oa/service/impl/GearAttendanceSummaryDetailServiceImpl.java @@ -62,7 +62,7 @@ public class GearAttendanceSummaryDetailServiceImpl implements IGearAttendanceSu Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); 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.getOvertimeHours() != null, GearAttendanceSummaryDetail::getOvertimeHours, bo.getOvertimeHours()); lqw.eq(bo.getTravelHours() != null, GearAttendanceSummaryDetail::getTravelHours, bo.getTravelHours()); diff --git a/gear-oa/src/main/java/com/gear/oa/service/impl/GearAttendanceSummaryServiceImpl.java b/gear-oa/src/main/java/com/gear/oa/service/impl/GearAttendanceSummaryServiceImpl.java index 263b6b9..f9b05c9 100644 --- a/gear-oa/src/main/java/com/gear/oa/service/impl/GearAttendanceSummaryServiceImpl.java +++ b/gear-oa/src/main/java/com/gear/oa/service/impl/GearAttendanceSummaryServiceImpl.java @@ -1,12 +1,17 @@ package com.gear.oa.service.impl; import cn.hutool.core.bean.BeanUtil; +import com.gear.common.core.domain.R; import com.gear.common.utils.StringUtils; import com.gear.common.core.page.TableDataInfo; import com.gear.common.core.domain.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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 org.springframework.stereotype.Service; 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.service.IGearAttendanceSummaryService; +import java.math.BigDecimal; import java.util.List; import java.util.Map; import java.util.Collection; +import java.util.stream.Collectors; +import java.util.HashMap; /** * 考勤汇总Service业务层处理 @@ -30,6 +38,8 @@ import java.util.Collection; public class GearAttendanceSummaryServiceImpl implements IGearAttendanceSummaryService { 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; } + + @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 userIds = bo.getUserIds(); + //增加空值检查 + if (bo.getUserIds() == null || bo.getUserIds().isEmpty()) { + return true; // 或抛出异常,根据业务需求决定 + } + //根据userIds以及startTime和endTime批量查询record得到每个人的出勤小时数、加班小时数、出差小时数等 + List records = gearAttendanceRecordMapper.selectList(Wrappers.lambdaQuery() + .in(GearAttendanceRecord::getUserId, userIds) + .ge(GearAttendanceRecord::getStartTime, bo.getStartDate()) + .le(GearAttendanceRecord::getEndTime, bo.getEndDate())); + //根据records.stream()进行分组统计 + // 按userId和recordType分组,确保每个用户每种类型正确统计 + Map> groupedRecords = records.stream() + .collect(Collectors.groupingBy(r -> r.getUserId() + "_" + r.getRecordType())); + + // 为每个用户创建汇总明细 + Map summaryDetails = new HashMap<>(); + + for (List 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 + List 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; + } } diff --git a/gear-oa/src/main/resources/mapper/oa/GearAttendanceSummaryDetailMapper.xml b/gear-oa/src/main/resources/mapper/oa/GearAttendanceSummaryDetailMapper.xml index 7493a4f..5746168 100644 --- a/gear-oa/src/main/resources/mapper/oa/GearAttendanceSummaryDetailMapper.xml +++ b/gear-oa/src/main/resources/mapper/oa/GearAttendanceSummaryDetailMapper.xml @@ -18,6 +18,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + insert into gear_attendance_summary_detail (summary_id, user_id, normal_hours, + overtime_hours, travel_hours, remark) + values + + ( #{item.summaryId}, #{item.userId}, #{item.normalHours}, + #{item.overtimeHours}, #{item.travelHours}, #{item.remark}) + +