From a0bc26ef3ab6e20eed40c3f84f8e9061c4715710 Mon Sep 17 00:00:00 2001 From: hdka <823267011@qq.com> Date: Thu, 15 May 2025 21:35:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=BD=A6=E9=97=B4=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E8=AE=B0=E5=BD=95=E4=B8=8E=E6=95=B0=E6=8D=AE=E7=9C=8B?= =?UTF-8?q?=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OaAttendanceRecordController.java | 102 ++++++++++ .../controller/OaReportDetailController.java | 7 - .../controller/OaReportSummaryController.java | 6 - .../controller/SysOaAttendanceController.java | 18 ++ .../com/ruoyi/oa/domain/LaborCostData.java | 6 + .../ruoyi/oa/domain/OaAttendanceRecord.java | 78 ++++++++ .../com/ruoyi/oa/domain/OaReportDetail.java | 4 +- .../com/ruoyi/oa/domain/OaReportSummary.java | 6 +- .../oa/domain/bo/OaAttendanceRecordBo.java | 86 ++++++++ .../ruoyi/oa/domain/bo/OaReportDetailBo.java | 9 +- .../ruoyi/oa/domain/bo/OaReportSummaryBo.java | 4 +- .../oa/domain/vo/AttendanceMonthlyCount.java | 30 +++ .../oa/domain/vo/OaAttendanceRecordVo.java | 97 +++++++++ .../ruoyi/oa/domain/vo/OaReportDetailVo.java | 2 +- .../ruoyi/oa/domain/vo/OaReportSummaryVo.java | 4 +- .../domain/vo/ProjectAttendanceSummaryVo.java | 17 ++ .../oa/mapper/OaAttendanceRecordMapper.java | 41 ++++ .../ruoyi/oa/mapper/OaReportDetailMapper.java | 3 + .../oa/mapper/SysOaAttendanceMapper.java | 10 +- .../service/IOaAttendanceRecordService.java | 56 ++++++ .../oa/service/ISysOaAttendanceService.java | 12 ++ .../impl/OaAttendanceRecordServiceImpl.java | 133 +++++++++++++ .../service/impl/OaProgressServiceImpl.java | 10 +- .../impl/OaReportDetailServiceImpl.java | 4 +- .../impl/OaReportSummaryServiceImpl.java | 2 +- .../impl/SysOaAttendanceServiceImpl.java | 98 ++++++++- .../mapper/oa/OaAttendanceRecordMapper.xml | 125 ++++++++++++ .../mapper/oa/OaReportDetailMapper.xml | 25 ++- .../mapper/oa/OaReportSummaryMapper.xml | 5 +- .../mapper/oa/SysOaAttendanceMapper.xml | 186 +++++++++++++++--- script/sql/attendance.sql | 19 ++ 31 files changed, 1127 insertions(+), 78 deletions(-) create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaAttendanceRecordController.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaAttendanceRecord.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaAttendanceRecordBo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/AttendanceMonthlyCount.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaAttendanceRecordVo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/ProjectAttendanceSummaryVo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaAttendanceRecordMapper.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaAttendanceRecordService.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaAttendanceRecordServiceImpl.java create mode 100644 ruoyi-oa/src/main/resources/mapper/oa/OaAttendanceRecordMapper.xml create mode 100644 script/sql/attendance.sql diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaAttendanceRecordController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaAttendanceRecordController.java new file mode 100644 index 0000000..97a740d --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaAttendanceRecordController.java @@ -0,0 +1,102 @@ +package com.ruoyi.oa.controller; + +import java.util.List; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.common.core.validate.QueryGroup; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.oa.domain.vo.OaAttendanceRecordVo; +import com.ruoyi.oa.domain.bo.OaAttendanceRecordBo; +import com.ruoyi.oa.service.IOaAttendanceRecordService; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 计算记录 + * + * @author ruoyi + * @date 2025-05-15 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oa/attendanceRecord") +public class OaAttendanceRecordController extends BaseController { + + private final IOaAttendanceRecordService iOaAttendanceRecordService; + + /** + * 查询计算记录列表 + */ + @GetMapping("/list") + public TableDataInfo list(OaAttendanceRecordBo bo, PageQuery pageQuery) { + return iOaAttendanceRecordService.queryPageList(bo, pageQuery); + } + + @GetMapping("/gen-list/{date}") + public R> list(@PathVariable String date) { + return R.ok(iOaAttendanceRecordService.listGenDate(date)); + } + + /** + * 导出计算记录列表 + */ + @PostMapping("/export") + public void export(OaAttendanceRecordBo bo, HttpServletResponse response) { + List list = iOaAttendanceRecordService.queryList(bo); + ExcelUtil.exportExcel(list, "计算记录", OaAttendanceRecordVo.class, response); + } + + /** + * 获取计算记录详细信息 + * + * @param recordId 主键 + */ + @GetMapping("/{recordId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long recordId) { + return R.ok(iOaAttendanceRecordService.queryById(recordId)); + } + + /** + * 新增计算记录 + */ + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody OaAttendanceRecordBo bo) { + return toAjax(iOaAttendanceRecordService.insertByBo(bo)); + } + + /** + * 修改计算记录 + */ + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody OaAttendanceRecordBo bo) { + return toAjax(iOaAttendanceRecordService.updateByBo(bo)); + } + + /** + * 删除计算记录 + * + * @param recordIds 主键串 + */ + @DeleteMapping("/{recordIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] recordIds) { + return toAjax(iOaAttendanceRecordService.deleteWithValidByIds(Arrays.asList(recordIds), true)); + } +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaReportDetailController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaReportDetailController.java index d0e6971..08371ba 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaReportDetailController.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaReportDetailController.java @@ -42,7 +42,6 @@ public class OaReportDetailController extends BaseController { /** * 查询设计项目汇报详情列表 */ - @SaCheckPermission("system:reportDetail:list") @GetMapping("/list") public TableDataInfo list(OaReportDetailBo bo, PageQuery pageQuery) { return iOaReportDetailService.queryPageList(bo, pageQuery); @@ -51,7 +50,6 @@ public class OaReportDetailController extends BaseController { /** * 导出设计项目汇报详情列表 */ - @SaCheckPermission("system:reportDetail:export") @Log(title = "设计项目汇报详情", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(OaReportDetailBo bo, HttpServletResponse response) { @@ -64,7 +62,6 @@ public class OaReportDetailController extends BaseController { * * @param id 主键 */ - @SaCheckPermission("system:reportDetail:query") @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { @@ -74,7 +71,6 @@ public class OaReportDetailController extends BaseController { /** * 新增设计项目汇报详情 */ - @SaCheckPermission("system:reportDetail:add") @Log(title = "设计项目汇报详情", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() @@ -85,7 +81,6 @@ public class OaReportDetailController extends BaseController { /** * 修改设计项目汇报详情 */ - @SaCheckPermission("system:reportDetail:edit") @Log(title = "设计项目汇报详情", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() @@ -98,8 +93,6 @@ public class OaReportDetailController extends BaseController { * * @param ids 主键串 */ - @SaCheckPermission("system:reportDetail:remove") - @Log(title = "设计项目汇报详情", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaReportSummaryController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaReportSummaryController.java index 777340b..7f7af40 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaReportSummaryController.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaReportSummaryController.java @@ -42,7 +42,6 @@ public class OaReportSummaryController extends BaseController { /** * 查询设计项目汇报概述列表 */ - @SaCheckPermission("system:reportSummary:list") @GetMapping("/list") public TableDataInfo list(OaReportSummaryBo bo, PageQuery pageQuery) { return iOaReportSummaryService.queryPageList(bo, pageQuery); @@ -51,7 +50,6 @@ public class OaReportSummaryController extends BaseController { /** * 导出设计项目汇报概述列表 */ - @SaCheckPermission("system:reportSummary:export") @Log(title = "设计项目汇报概述", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(OaReportSummaryBo bo, HttpServletResponse response) { @@ -64,7 +62,6 @@ public class OaReportSummaryController extends BaseController { * * @param id 主键 */ - @SaCheckPermission("system:reportSummary:query") @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { @@ -74,7 +71,6 @@ public class OaReportSummaryController extends BaseController { /** * 新增设计项目汇报概述 */ - @SaCheckPermission("system:reportSummary:add") @Log(title = "设计项目汇报概述", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() @@ -85,7 +81,6 @@ public class OaReportSummaryController extends BaseController { /** * 修改设计项目汇报概述 */ - @SaCheckPermission("system:reportSummary:edit") @Log(title = "设计项目汇报概述", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() @@ -98,7 +93,6 @@ public class OaReportSummaryController extends BaseController { * * @param ids 主键串 */ - @SaCheckPermission("system:reportSummary:remove") @Log(title = "设计项目汇报概述", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public R remove(@NotEmpty(message = "主键不能为空") diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaAttendanceController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaAttendanceController.java index 0b92e22..75b318d 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaAttendanceController.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaAttendanceController.java @@ -8,6 +8,7 @@ import java.util.Arrays; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.oa.domain.LaborCostData; +import com.ruoyi.oa.domain.vo.AttendanceMonthlyCount; import com.ruoyi.oa.domain.vo.SysUserVo; import lombok.RequiredArgsConstructor; import javax.servlet.http.HttpServletResponse; @@ -163,4 +164,21 @@ public class SysOaAttendanceController extends BaseController { public R insertBatch(@Validated(AddGroup.class) @RequestBody SysOaAttendanceBo bo) { return toAjax( iSysOaAttendanceService.insertBatch(bo)); } + + @GetMapping("/data/{refDate}") + public R> selectLastSixMonthsByMonth(@PathVariable String refDate) { + return R.ok(iSysOaAttendanceService.selectLastSixMonthsByMonth(refDate)); + } + + + @GetMapping("/data/pie/{refDate}") + public R selectAttendanceMonthlyCountByMonth(@PathVariable String refDate) { + return R.ok(iSysOaAttendanceService.selectAttendanceMonthlyCountByMonth(refDate)); + } + + + @GetMapping("/data/card/{refDate}") + public R> selectMonthlyCounts(@PathVariable String refDate) { + return R.ok(iSysOaAttendanceService.selectMonthlyCounts(refDate)); + } } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/LaborCostData.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/LaborCostData.java index 2d67c19..f258a04 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/LaborCostData.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/LaborCostData.java @@ -32,6 +32,12 @@ public class LaborCostData extends BaseEntity { // 加班时间 private Double overtime; + // 出差次数 + private Double tripTimes; + + // 请假次数 + private Double absenceDays; + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaAttendanceRecord.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaAttendanceRecord.java new file mode 100644 index 0000000..78b3db3 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaAttendanceRecord.java @@ -0,0 +1,78 @@ +package com.ruoyi.oa.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 计算记录对象 oa_attendance_record + * + * @author ruoyi + * @date 2025-05-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("oa_attendance_record") +public class OaAttendanceRecord extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 主键id + */ + @TableId(value = "record_id") + private Long recordId; + /** + * 涉及月份 + */ + private Date relationMonth; + /** + * 生成时间 + */ + private Date calcTime; + /** + * 统计者姓名 + */ + private String nickName; + /** + * 出差天数 + */ + private BigDecimal trips; + /** + * 请假次数 + */ + private BigDecimal notNum; + /** + * 出勤天数 + */ + private BigDecimal works; + /** + * 涉及项目 + */ + private String projectIds; + /** + * 加班时长 + */ + private BigDecimal overNum; + /** + * 删除标志 + */ + @TableLogic + private Long delFlag; + /** + * 备注 + */ + private String remark; + + + private Long userId; + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaReportDetail.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaReportDetail.java index 44e5916..531459a 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaReportDetail.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaReportDetail.java @@ -25,8 +25,8 @@ public class OaReportDetail extends BaseEntity { /** * 主键ID */ - @TableId(value = "id") - private Long id; + @TableId(value = "detail_id") + private Long detailId; /** * 关联汇报概述ID(oa_report_summary.id) */ diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaReportSummary.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaReportSummary.java index aa119c0..f105e94 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaReportSummary.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaReportSummary.java @@ -27,8 +27,8 @@ public class OaReportSummary extends BaseEntity { /** * 主键ID */ - @TableId(value = "id") - private Long id; + @TableId(value = "summary_id") + private Long summaryId; /** * 汇报标题 */ @@ -55,4 +55,6 @@ public class OaReportSummary extends BaseEntity { */ private String remark; + private Long type; + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaAttendanceRecordBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaAttendanceRecordBo.java new file mode 100644 index 0000000..5124b0f --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaAttendanceRecordBo.java @@ -0,0 +1,86 @@ +package com.ruoyi.oa.domain.bo; + +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.util.Date; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 计算记录业务对象 oa_attendance_record + * + * @author ruoyi + * @date 2025-05-15 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class OaAttendanceRecordBo extends BaseEntity { + + /** + * 主键id + */ + private Long recordId; + + /** + * 涉及月份 + */ + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date relationMonth; + + /** + * 生成时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date calcTime; + + /** + * 统计者姓名 + */ + private String nickName; + + /** + * 出差天数 + */ + private BigDecimal trips; + + /** + * 请假次数 + */ + private BigDecimal notNum; + + /** + * 出勤天数 + */ + private BigDecimal works; + + /** + * 涉及项目 + */ + private String projectIds; + + /** + * 加班时长 + */ + private BigDecimal overNum; + + /** + * 备注 + */ + private String remark; + + + private Long userId; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaReportDetailBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaReportDetailBo.java index 1dbb47b..20e1a21 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaReportDetailBo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaReportDetailBo.java @@ -25,48 +25,41 @@ public class OaReportDetailBo extends BaseEntity { * 主键ID */ @NotNull(message = "主键ID不能为空", groups = { EditGroup.class }) - private Long id; + private Long detailId; /** * 关联汇报概述ID(oa_report_summary.id) */ - @NotNull(message = "关联汇报概述ID(oa_report_summary.id)不能为空", groups = { AddGroup.class, EditGroup.class }) private Long summaryId; /** * 设备唯一编号 */ - @NotBlank(message = "设备唯一编号不能为空", groups = { AddGroup.class, EditGroup.class }) private String deviceCode; /** * 设备类别 */ - @NotBlank(message = "设备类别不能为空", groups = { AddGroup.class, EditGroup.class }) private String category; /** * 设备生产说明 */ - @NotBlank(message = "设备生产说明不能为空", groups = { AddGroup.class, EditGroup.class }) private String deviceDescription; /** * 汇报详情内容(含文字、图像说明等) */ - @NotBlank(message = "汇报详情内容(含文字、图像说明等)不能为空", groups = { AddGroup.class, EditGroup.class }) private String reportDetail; /** * 关联图像 OSS ID 列表(逗号分隔) */ - @NotBlank(message = "关联图像 OSS ID 列表(逗号分隔)不能为空", groups = { AddGroup.class, EditGroup.class }) private String ossIds; /** * 备注 */ - @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) private String remark; diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaReportSummaryBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaReportSummaryBo.java index f412121..bbc234e 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaReportSummaryBo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaReportSummaryBo.java @@ -27,7 +27,7 @@ public class OaReportSummaryBo extends BaseEntity { * 主键ID */ @NotNull(message = "主键ID不能为空", groups = { EditGroup.class }) - private Long id; + private Long summaryId; /** * 汇报标题 @@ -59,4 +59,6 @@ public class OaReportSummaryBo extends BaseEntity { private String remark; + private Long type; + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/AttendanceMonthlyCount.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/AttendanceMonthlyCount.java new file mode 100644 index 0000000..ec72c02 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/AttendanceMonthlyCount.java @@ -0,0 +1,30 @@ +package com.ruoyi.oa.domain.vo; + + +import lombok.Data; + +@Data +public class AttendanceMonthlyCount { + /** 格式:"2025-05" */ + private String month; + /** 出勤次数(含出差) */ + private Integer attendanceCount; + /** 请假次数 */ + private Integer leaveCount; + // + getters/setters + + private Long workHours; + + private Long leaveHours; + + private Long overtimeHours; + + private Long tripHours; + + + private Double attendanceRate; // 出勤率(0‑1 之间) + + private Integer tripCount; // 出差次数 + + private Integer leavePeople; // 请假人数 +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaAttendanceRecordVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaAttendanceRecordVo.java new file mode 100644 index 0000000..586fbd5 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaAttendanceRecordVo.java @@ -0,0 +1,97 @@ +package com.ruoyi.oa.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.ruoyi.common.annotation.ExcelDictFormat; +import com.ruoyi.common.convert.ExcelDictConvert; +import com.ruoyi.oa.domain.LaborCostData; +import lombok.Data; +import java.util.Date; +import java.util.List; + + +/** + * 计算记录视图对象 oa_attendance_record + * + * @author ruoyi + * @date 2025-05-15 + */ +@Data +@ExcelIgnoreUnannotated +public class OaAttendanceRecordVo { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @ExcelProperty(value = "主键id") + private Long recordId; + + /** + * 涉及月份 + */ + @ExcelProperty(value = "涉及月份") + private Date relationMonth; + + /** + * 生成时间 + */ + @ExcelProperty(value = "生成时间") + private Date calcTime; + + /** + * 统计者姓名 + */ + @ExcelProperty(value = "统计者姓名") + private String nickName; + + /** + * 出差天数 + */ + @ExcelProperty(value = "出差天数") + private BigDecimal trips; + + /** + * 请假次数 + */ + @ExcelProperty(value = "请假次数") + private BigDecimal notNum; + + /** + * 出勤天数 + */ + @ExcelProperty(value = "出勤天数") + private BigDecimal works; + + /** + * 涉及项目 + */ + @ExcelProperty(value = "涉及项目") + private String projectIds; + + /** + * 加班时长 + */ + @ExcelProperty(value = "加班时长") + private BigDecimal overNum; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + private List attendanceList; + + private Long userId; + + + /** ▶︎ 按项目汇总 */ + private List projectList; + + private Long laborCost; +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaReportDetailVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaReportDetailVo.java index ca94345..3d90032 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaReportDetailVo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaReportDetailVo.java @@ -25,7 +25,7 @@ public class OaReportDetailVo { * 主键ID */ @ExcelProperty(value = "主键ID") - private Long id; + private Long detailId; /** * 关联汇报概述ID(oa_report_summary.id) diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaReportSummaryVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaReportSummaryVo.java index dd2787d..ec6c796 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaReportSummaryVo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaReportSummaryVo.java @@ -27,7 +27,7 @@ public class OaReportSummaryVo { * 主键ID */ @ExcelProperty(value = "主键ID") - private Long id; + private Long summaryId; /** * 汇报标题 @@ -65,5 +65,7 @@ public class OaReportSummaryVo { @ExcelProperty(value = "备注") private String remark; + private Long type; + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/ProjectAttendanceSummaryVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/ProjectAttendanceSummaryVo.java new file mode 100644 index 0000000..58b56c8 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/ProjectAttendanceSummaryVo.java @@ -0,0 +1,17 @@ +package com.ruoyi.oa.domain.vo; + + +import lombok.Data; + +/** 项目维度汇总行 */ +@Data +public class ProjectAttendanceSummaryVo { + private Long projectId; + private String projectName; + private String color; + + private Integer workTimes; // 出勤天数 + private Integer hourWorkTimes; // 工作时长(h) + private Integer overTime; // 加班时长(h) + private Integer tripDays; // 出差天数 +} \ No newline at end of file diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaAttendanceRecordMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaAttendanceRecordMapper.java new file mode 100644 index 0000000..581a477 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaAttendanceRecordMapper.java @@ -0,0 +1,41 @@ +package com.ruoyi.oa.mapper; + +import com.ruoyi.oa.domain.OaAttendanceRecord; +import com.ruoyi.oa.domain.vo.OaAttendanceRecordVo; +import com.ruoyi.common.core.mapper.BaseMapperPlus; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 计算记录Mapper接口 + * + * @author ruoyi + * @date 2025-05-15 + */ +public interface OaAttendanceRecordMapper extends BaseMapperPlus { + + /** + * 获取全部的生成日期 + * @param date + * @return + */ + List listGenDate(String date); + + /** + * 获取全部相同日期数据 + * + * @param date + * @param firstDay + * @return + */ + List listCommonDateRecord(@Param("date") String date, @Param("firstDay") Date firstDay); + + /** + * 查询详情 + * @param recordId + * @return + */ + OaAttendanceRecordVo selectVoByIdPlus(Long recordId); +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaReportDetailMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaReportDetailMapper.java index d64d492..2422de4 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaReportDetailMapper.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaReportDetailMapper.java @@ -14,4 +14,7 @@ import org.apache.ibatis.annotations.Select; public interface OaReportDetailMapper extends BaseMapperPlus { @Select("SELECT url FROM sys_oss WHERE oss_id = #{ossId}") String selectImageUrlByOssId(String ossId); + + + OaReportDetailVo selectVoByIdPlus(Long id); } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaAttendanceMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaAttendanceMapper.java index 0b4a893..ef0063e 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaAttendanceMapper.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaAttendanceMapper.java @@ -1,8 +1,7 @@ package com.ruoyi.oa.mapper; -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.ruoyi.oa.domain.SysOaAttendance; -import com.ruoyi.oa.domain.bo.SysOaAttendanceBo; +import com.ruoyi.oa.domain.vo.AttendanceMonthlyCount; import com.ruoyi.oa.domain.vo.SysOaAttendanceVo; import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.oa.domain.vo.SysUserVo; @@ -38,4 +37,11 @@ public interface SysOaAttendanceMapper extends BaseMapperPlus selectNowMonthUserId(Date firstDay); + + List selectLastSixMonthsByMonth(String refDate); + + AttendanceMonthlyCount selectAttendanceMonthlyCountByMonth(String refDate); + + List selectMonthlyCounts(String refDate); } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaAttendanceRecordService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaAttendanceRecordService.java new file mode 100644 index 0000000..63b1ad0 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaAttendanceRecordService.java @@ -0,0 +1,56 @@ +package com.ruoyi.oa.service; + +import com.ruoyi.oa.domain.vo.OaAttendanceRecordVo; +import com.ruoyi.oa.domain.bo.OaAttendanceRecordBo; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 计算记录Service接口 + * + * @author ruoyi + * @date 2025-05-15 + */ +public interface IOaAttendanceRecordService { + + /** + * 查询计算记录 + */ + OaAttendanceRecordVo queryById(Long recordId); + + /** + * 查询计算记录列表 + */ + TableDataInfo queryPageList(OaAttendanceRecordBo bo, PageQuery pageQuery); + + /** + * 查询计算记录列表 + */ + List queryList(OaAttendanceRecordBo bo); + + /** + * 新增计算记录 + */ + Boolean insertByBo(OaAttendanceRecordBo bo); + + /** + * 修改计算记录 + */ + Boolean updateByBo(OaAttendanceRecordBo bo); + + /** + * 校验并批量删除计算记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 获取某月的所有数据报告的生成日期 + * @param date + * @return + */ + List listGenDate(String date); + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaAttendanceService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaAttendanceService.java index 9b98880..28c2070 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaAttendanceService.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaAttendanceService.java @@ -1,6 +1,7 @@ package com.ruoyi.oa.service; import com.ruoyi.oa.domain.LaborCostData; +import com.ruoyi.oa.domain.vo.AttendanceMonthlyCount; import com.ruoyi.oa.domain.vo.SysOaAttendanceVo; import com.ruoyi.oa.domain.bo.SysOaAttendanceBo; import com.ruoyi.common.core.page.TableDataInfo; @@ -77,4 +78,15 @@ public interface ISysOaAttendanceService { * @return */ int delOaAttendanceAll(Long day); + + /** + * @param refDate + * @return + */ + List selectLastSixMonthsByMonth(String refDate); + + AttendanceMonthlyCount selectAttendanceMonthlyCountByMonth(String refDate); + + List selectMonthlyCounts(String refDate); + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaAttendanceRecordServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaAttendanceRecordServiceImpl.java new file mode 100644 index 0000000..a82b5c1 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaAttendanceRecordServiceImpl.java @@ -0,0 +1,133 @@ +package com.ruoyi.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.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 lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.ruoyi.oa.domain.bo.OaAttendanceRecordBo; +import com.ruoyi.oa.domain.vo.OaAttendanceRecordVo; +import com.ruoyi.oa.domain.OaAttendanceRecord; +import com.ruoyi.oa.mapper.OaAttendanceRecordMapper; +import com.ruoyi.oa.service.IOaAttendanceRecordService; + +import java.util.*; + +/** + * 计算记录Service业务层处理 + * + * @author ruoyi + * @date 2025-05-15 + */ +@RequiredArgsConstructor +@Service +public class OaAttendanceRecordServiceImpl implements IOaAttendanceRecordService { + + private final OaAttendanceRecordMapper baseMapper; + + /** + * 查询计算记录 + */ + @Override + public OaAttendanceRecordVo queryById(Long recordId){ + return baseMapper.selectVoByIdPlus(recordId); + } + + /** + * 查询计算记录列表 + */ + @Override + public TableDataInfo queryPageList(OaAttendanceRecordBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + private LambdaQueryWrapper buildQueryWrapper(OaAttendanceRecordBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + if (bo.getRelationMonth() != null) { + lqw.apply( + + "YEAR(relation_month) = YEAR({0}) AND MONTH(relation_month) = MONTH({1})", + bo.getRelationMonth(), bo.getRelationMonth()); + if (bo.getCalcTime() != null) { + // 2a) 如果前端传了 genTime,就按那天精准过滤 + lqw.apply("DATE(calc_time) = {0}", bo.getCalcTime()); + } else { + // 2b) 如果没传 genTime,就只拿该月最新一次的记录 + lqw.apply( + "calc_time = (" + + "SELECT MAX(calc_time) FROM oa_attendance_record " + + "WHERE YEAR(relation_month)=YEAR({0}) AND MONTH(relation_month)=MONTH({1})" + + ")", + bo.getRelationMonth(), bo.getRelationMonth() + ); + } + + } + return lqw; + } + + /** + * 查询计算记录列表 + */ + @Override + public List queryList(OaAttendanceRecordBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + + + /** + * 新增计算记录 + */ + @Override + public Boolean insertByBo(OaAttendanceRecordBo bo) { + OaAttendanceRecord add = BeanUtil.toBean(bo, OaAttendanceRecord.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setRecordId(add.getRecordId()); + } + return flag; + } + + /** + * 修改计算记录 + */ + @Override + public Boolean updateByBo(OaAttendanceRecordBo bo) { + OaAttendanceRecord update = BeanUtil.toBean(bo, OaAttendanceRecord.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(OaAttendanceRecord entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除计算记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public List listGenDate(String date) { + + return baseMapper.listGenDate(date); + } +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProgressServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProgressServiceImpl.java index c342882..6ff8dc1 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProgressServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProgressServiceImpl.java @@ -88,11 +88,13 @@ public class OaProgressServiceImpl implements IOaProgressService { OaProgress add = BeanUtil.toBean(bo, OaProgress.class); validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; - List detailList = bo.getDetailList(); - for (OaProgressDetailBo detailBo : detailList) { - detailBo.setProgressId(add.getProgressId()); - detailService.insertByBo(detailBo); + if(bo.getDetailList() != null && !bo.getDetailList().isEmpty()) { + for (OaProgressDetailBo detailBo : bo.getDetailList()) { + detailBo.setProgressId(add.getProgressId()); + detailService.insertByBo(detailBo); + } } + return flag; } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaReportDetailServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaReportDetailServiceImpl.java index 7eb7e21..d2cb568 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaReportDetailServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaReportDetailServiceImpl.java @@ -38,7 +38,7 @@ public class OaReportDetailServiceImpl implements IOaReportDetailService { @Override public OaReportDetailVo queryById(Long id){ - return baseMapper.selectVoById(id); + return baseMapper.selectVoByIdPlus(id); } /** @@ -119,7 +119,7 @@ public class OaReportDetailServiceImpl implements IOaReportDetailService { validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; if (flag) { - bo.setId(add.getId()); + bo.setDetailId(add.getDetailId()); } return flag; } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaReportSummaryServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaReportSummaryServiceImpl.java index 63fbd7a..c2e78b4 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaReportSummaryServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaReportSummaryServiceImpl.java @@ -78,7 +78,7 @@ public class OaReportSummaryServiceImpl implements IOaReportSummaryService { validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; if (flag) { - bo.setId(add.getId()); + bo.setSummaryId(add.getSummaryId()); } return flag; } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaAttendanceServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaAttendanceServiceImpl.java index d92a03b..f08dd88 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaAttendanceServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaAttendanceServiceImpl.java @@ -8,8 +8,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.oa.domain.LaborCostData; +import com.ruoyi.oa.domain.OaAttendanceRecord; +import com.ruoyi.oa.domain.vo.AttendanceMonthlyCount; import com.ruoyi.oa.domain.vo.SysOaProjectVo; import com.ruoyi.oa.domain.vo.SysUserVo; +import com.ruoyi.oa.mapper.OaAttendanceRecordMapper; import com.ruoyi.oa.service.ISysOaProjectService; import com.ruoyi.system.mapper.SysUserRoleMapper; import com.ruoyi.system.service.ISysUserService; @@ -23,9 +26,10 @@ import com.ruoyi.oa.domain.SysOaAttendance; import com.ruoyi.oa.mapper.SysOaAttendanceMapper; import com.ruoyi.oa.service.ISysOaAttendanceService; -import javax.validation.constraints.NotNull; +import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 人员考勤Service业务层处理 @@ -49,6 +53,9 @@ public class SysOaAttendanceServiceImpl implements ISysOaAttendanceService { @Autowired private ISysOaProjectService projectService; + @Autowired + private OaAttendanceRecordMapper recordMapper; + /** * 查询人员考勤 */ @@ -84,7 +91,7 @@ public class SysOaAttendanceServiceImpl implements ISysOaAttendanceService { lqw.eq(bo.getProjectId() != null, SysOaAttendance::getProjectId, bo.getProjectId()); lqw.eq(bo.getDayLength() != null, SysOaAttendance::getDayLength, bo.getDayLength()); lqw.eq(bo.getHour() != null, SysOaAttendance::getHour, bo.getHour()); - lqw.like(bo.getCreateTime()!=null, SysOaAttendance::getCreateTime, bo.getCreateTime()); + lqw.like(bo.getCreateTime() != null, SysOaAttendance::getCreateTime, bo.getCreateTime()); return lqw; } @@ -122,8 +129,8 @@ public class SysOaAttendanceServiceImpl implements ISysOaAttendanceService { sysOaAttendanceVo.setProjectId(bo.getProjectId()); sysOaAttendanceVo.setCreateTime(firstDay); sysOaAttendanceVo.setDelFlag(0L); - sysOaAttendanceVo.setDayLength(bo.getDayLength()!=null?bo.getDayLength():0); - sysOaAttendanceVo.setHour(bo.getHour()!=null?bo.getHour():0); + sysOaAttendanceVo.setDayLength(bo.getDayLength() != null ? bo.getDayLength() : 0); + sysOaAttendanceVo.setHour(bo.getHour() != null ? bo.getHour() : 0); return baseMapper.updateDelAttendance(BeanUtil.toBean(sysOaAttendanceVo, SysOaAttendance.class)) > 0; } @@ -201,13 +208,29 @@ public class SysOaAttendanceServiceImpl implements ISysOaAttendanceService { */ @Override public List workerCalc(Date time) { - // 查询所有的工人 - List userIds = sysUserRoleMapper.selectUserIdsByRoleId(1852970465740505090L); Date firstDay = getFirstDay(time); Date lastDay = getLastDay(time); + // 查询所有的工人 + List userIds = sysUserRoleMapper.selectUserIdsByRoleId(1852970465740505090L); + List workerIds = baseMapper.selectNowMonthUserId(firstDay); + // 合并并去重 + workerIds = Stream + .concat(userIds.stream(), workerIds.stream()) + .distinct() + .collect(Collectors.toList()); List costDataList = new ArrayList<>(); - for (Long userId : userIds) { + + + // 检测当天是否生成了完全一样的数据 + List recordIds = recordMapper.listCommonDateRecord(DateUtils.getDate(), firstDay); + if (!recordIds.isEmpty()) { + // 如果有重复的就删掉 + recordMapper.deleteBatchIds(recordIds); + } + + // 开始写入 + for (Long userId : workerIds) { SysUserVo sysUser = BeanUtil.toBean(sysUserService.selectUserByIdIncludingDel(userId), SysUserVo.class); SysOaAttendanceVo sysOaAttendanceVo = new SysOaAttendanceVo(); sysOaAttendanceVo.setUserId(sysUser.getUserId()); @@ -218,8 +241,19 @@ public class SysOaAttendanceServiceImpl implements ISysOaAttendanceService { Double workTimes = 0.0; Double hourWorkTimes = 0.0; Double overTime = 0.0; + Double tripDays = 0.0; + Double leaveCount = 0.0; + Double workDays = 0.0; + Set projSet = new HashSet<>(); for (SysOaAttendanceVo oaAttendanceVo : sysOaAttendanceVos) { // 出差问题解决 + // 出差 + if (oaAttendanceVo.getProjectId() == 0) { + tripDays++; + + } else if (oaAttendanceVo.getProjectId() == 1) { + leaveCount++; + } if (oaAttendanceVo.getProjectId() != 0 && oaAttendanceVo.getProjectId() != 1) { SysOaProjectVo sysOaProjectVo = projectService.queryById(oaAttendanceVo.getProjectId()); oaAttendanceVo.setColor(sysOaProjectVo.getColor()); @@ -228,7 +262,9 @@ public class SysOaAttendanceServiceImpl implements ISysOaAttendanceService { projectVos.add(sysOaProjectVo); workTimes += oaAttendanceVo.getWorkTimes(); hourWorkTimes += oaAttendanceVo.getHourWorkTimes(); - overTime+=oaAttendanceVo.getOverTime(); + overTime += oaAttendanceVo.getOverTime(); + projSet.add(oaAttendanceVo.getProjectId()); + workDays++; } } // 此为所有小时计的综合 @@ -238,16 +274,43 @@ public class SysOaAttendanceServiceImpl implements ISysOaAttendanceService { laborCostData.setAttendances(sysOaAttendanceVos); laborCostData.setSysUser(sysUser); laborCostData.setWorkTimes(workTimes); + laborCostData.setTripTimes(tripDays); + laborCostData.setAbsenceDays(leaveCount); laborCostData.setHourWorkTime(hourWorkTimes); // 加班时间 laborCostData.setOvertime(overTime); costDataList.add(laborCostData); + // 构造并保存记录 + addGenData(firstDay, sysUser, tripDays, leaveCount, workDays, projSet, overTime); } return costDataList; } + private void addGenData(Date firstDay, SysUserVo sysUser, Double tripDays, Double leaveCount, Double workDays, Set projSet, Double overtimeSum) { + OaAttendanceRecord rec = new OaAttendanceRecord(); + // relationMonth 只保留年月,可直接传入 firstDay(其 day=1) + rec.setRelationMonth(firstDay); + // calcTime 为当前时间 + rec.setCalcTime(new Date()); + // 当前操作人昵称 + rec.setNickName(sysUser.getNickName()); + rec.setUserId(sysUser.getUserId()); + rec.setTrips(BigDecimal.valueOf(tripDays)); + rec.setNotNum(BigDecimal.valueOf(leaveCount)); + rec.setWorks(BigDecimal.valueOf(workDays)); + rec.setProjectIds( + String.join(",", + projSet.stream().map(String::valueOf).toArray(String[]::new) + ) + ); + rec.setOverNum(BigDecimal.valueOf(overtimeSum)); + rec.setRemark("自动统计生成"); + recordMapper.insert(rec); + + } + /** * 删除当月某日所有人的记录 * @@ -261,6 +324,25 @@ public class SysOaAttendanceServiceImpl implements ISysOaAttendanceService { return baseMapper.delOaAttendanceAll(getFirstDay(now), getLastDay(now), day); } + @Override + public List selectLastSixMonthsByMonth(String refDate) { + + return baseMapper.selectLastSixMonthsByMonth(refDate); + } + + + @Override + public AttendanceMonthlyCount selectAttendanceMonthlyCountByMonth(String refDate) { + + return baseMapper.selectAttendanceMonthlyCountByMonth(refDate); + } + + @Override + public List selectMonthlyCounts(String refDate) { + + return baseMapper.selectMonthlyCounts(refDate); + } + private Date getFirstDay(Date time) { String firstDay = DateUtils.parseDateToStr("yyyy-MM-01", time); return DateUtils.parseDate(firstDay); diff --git a/ruoyi-oa/src/main/resources/mapper/oa/OaAttendanceRecordMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/OaAttendanceRecordMapper.xml new file mode 100644 index 0000000..dcfad8a --- /dev/null +++ b/ruoyi-oa/src/main/resources/mapper/oa/OaAttendanceRecordMapper.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-oa/src/main/resources/mapper/oa/OaReportDetailMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/OaReportDetailMapper.xml index 133f014..7dff389 100644 --- a/ruoyi-oa/src/main/resources/mapper/oa/OaReportDetailMapper.xml +++ b/ruoyi-oa/src/main/resources/mapper/oa/OaReportDetailMapper.xml @@ -5,7 +5,7 @@ - + @@ -19,6 +19,29 @@ + diff --git a/ruoyi-oa/src/main/resources/mapper/oa/OaReportSummaryMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/OaReportSummaryMapper.xml index 8093ecb..f0390a5 100644 --- a/ruoyi-oa/src/main/resources/mapper/oa/OaReportSummaryMapper.xml +++ b/ruoyi-oa/src/main/resources/mapper/oa/OaReportSummaryMapper.xml @@ -5,7 +5,7 @@ - + @@ -16,11 +16,12 @@ + - select sum(day_length) - from sys_oa_attendance - where user_id = #{userId} and project_id = #{projectId} and del_flag = '0' + select sum(day_length) + from sys_oa_attendance + where user_id = #{userId} + and project_id = #{projectId} + and del_flag = '0' + + + + + + + + + + + + + + + + + + diff --git a/script/sql/attendance.sql b/script/sql/attendance.sql new file mode 100644 index 0000000..a018f7c --- /dev/null +++ b/script/sql/attendance.sql @@ -0,0 +1,19 @@ +create table oa_attendance_record +( + record_id bigint auto_increment comment '主键id' + primary key, + relation_month date null comment '涉及月份', + calc_time date null comment '生成时间', + nick_name varchar(40) null comment '统计者姓名', + trips decimal(18, 2) null comment '出差天数', + not_num decimal(18, 2) null comment '请假次数', + works decimal(18, 2) null comment '出勤天数', + project_ids varchar(500) null comment '涉及项目', + over_num decimal(18, 2) null comment '加班时长', + create_time datetime default current_timestamp not null comment '创建时间', + create_by varchar(50) default 'system' null comment '创建人', + update_time datetime default current_timestamp not null on update current_timestamp comment '更新时间', + update_by varchar(50) null comment '更新人', + del_flag int default 0 not null comment '删除标志', + remark varchar(1024) default '无' null comment '备注' +);