refactor(overtime-application、project): 将加班申请功能重构为业务学习功能、修改应用配置中的cron表达式将每周执行时间从周日改为周五。

This commit is contained in:
dk
2026-07-19 14:03:20 +08:00
parent 0c7e5268e6
commit e207bf0485
25 changed files with 88 additions and 88 deletions

View File

@@ -120,7 +120,7 @@
- 错误码文案用「{}」占位中文名(正面样板 `PERSONAL_ITEM_STATUS_ACTION_NOT_ALLOWED`),不要把 code 写死进文案。
- 新对象类型只要在状态机两张表配好 `status_name` / `action_name`,resolver 自动生效,无需改代码。
完整规范、落地清单与已知缺口(加班申请 `OvertimeApplicationServiceImpl` 待补)见 [`docs/architecture/用户可见错误文案规范.html`](./docs/architecture/用户可见错误文案规范.html)。来源 TD-012。
完整规范、落地清单与已知缺口(业务学习 `OvertimeApplicationServiceImpl` 待补)见 [`docs/architecture/用户可见错误文案规范.html`](./docs/architecture/用户可见错误文案规范.html)。来源 TD-012。
## 数据与 SQL

View File

@@ -231,18 +231,18 @@ public interface ErrorCodeConstants {
ErrorCode PERSONAL_ITEM_NOT_ALLOW_DELETE = new ErrorCode(1_008_008_008, "仅初始态(待开始)的个人事项允许删除");
ErrorCode PERSONAL_ITEM_WRITE_FORBIDDEN = new ErrorCode(1_008_008_009, "无权修改个人事项");
// ========== 加班申请 1_008_009_xxx ==========
ErrorCode OVERTIME_APPLICATION_NOT_EXISTS = new ErrorCode(1_008_009_001, "加班申请不存在");
ErrorCode OVERTIME_APPLICATION_STATUS_MODEL_NOT_EXISTS_OR_DISABLED = new ErrorCode(1_008_009_002, "加班申请状态定义不存在或已停用");
ErrorCode OVERTIME_APPLICATION_STATUS_ACTION_NOT_ALLOWED = new ErrorCode(1_008_009_003, "当前加班申请为「{}」状态,不支持「{}」操作");
// ========== 业务学习 1_008_009_xxx ==========
ErrorCode OVERTIME_APPLICATION_NOT_EXISTS = new ErrorCode(1_008_009_001, "业务学习不存在");
ErrorCode OVERTIME_APPLICATION_STATUS_MODEL_NOT_EXISTS_OR_DISABLED = new ErrorCode(1_008_009_002, "业务学习状态定义不存在或已停用");
ErrorCode OVERTIME_APPLICATION_STATUS_ACTION_NOT_ALLOWED = new ErrorCode(1_008_009_003, "当前业务学习为「{}」状态,不支持「{}」操作");
ErrorCode OVERTIME_APPLICATION_STATUS_ACTION_REASON_REQUIRED = new ErrorCode(1_008_009_004, "「{}」操作必须填写原因");
ErrorCode OVERTIME_APPLICATION_STATUS_CONCURRENT_MODIFIED = new ErrorCode(1_008_009_005, "加班申请状态已发生变化,请刷新后重试");
ErrorCode OVERTIME_APPLICATION_STATUS_CONCURRENT_MODIFIED = new ErrorCode(1_008_009_005, "业务学习状态已发生变化,请刷新后重试");
ErrorCode OVERTIME_APPLICATION_APPLICANT_ONLY = new ErrorCode(1_008_009_006, "仅申请人可执行该操作");
ErrorCode OVERTIME_APPLICATION_APPROVER_ONLY = new ErrorCode(1_008_009_007, "仅当前审核人可执行该操作");
ErrorCode OVERTIME_APPLICATION_APPROVER_INVALID = new ErrorCode(1_008_009_008, "审核人不是有效系统用户");
ErrorCode OVERTIME_APPLICATION_APPROVER_SELF_FORBIDDEN = new ErrorCode(1_008_009_009, "审核人不能选择申请人本人");
ErrorCode OVERTIME_APPLICATION_READ_FORBIDDEN = new ErrorCode(1_008_009_010, "无权查看该加班申请");
ErrorCode OVERTIME_APPLICATION_DELETE_ONLY_REJECTED = new ErrorCode(1_008_009_011, "仅已退回的加班申请允许删除");
ErrorCode OVERTIME_APPLICATION_READ_FORBIDDEN = new ErrorCode(1_008_009_010, "无权查看该业务学习");
ErrorCode OVERTIME_APPLICATION_DELETE_ONLY_REJECTED = new ErrorCode(1_008_009_011, "仅已退回的业务学习允许删除");
ErrorCode TEAM_DASHBOARD_PERMISSION_REQUIRED = new ErrorCode(1_008_009_012, "当前用户无团队视角权限");
ErrorCode TEAM_DASHBOARD_SUBORDINATE_SCOPE_INVALID = new ErrorCode(1_008_009_013, "查询目标超出当前用户下属范围");
// ========== 工作报告 1_008_010_xxx ==========

View File

@@ -1,7 +1,7 @@
package com.njcn.rdms.module.project.constant;
/**
* 加班申请常量。
* 业务学习常量。
*/
public final class OvertimeApplicationConstants {

View File

@@ -39,7 +39,7 @@ import java.util.List;
import static com.njcn.rdms.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static com.njcn.rdms.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 加班申请")
@Tag(name = "管理后台 - 业务学习")
@RestController
@RequestMapping("/project/overtime-applications")
@Validated
@@ -49,14 +49,14 @@ public class OvertimeApplicationController {
private OvertimeApplicationService overtimeApplicationService;
@PostMapping
@Operation(summary = "新增加班申请并提交")
@Operation(summary = "新增业务学习并提交")
@PreAuthorize("@ss.hasPermission('" + OvertimeApplicationConstants.PERMISSION_CREATE + "')")
public CommonResult<Long> create(@Valid @RequestBody OvertimeApplicationSaveReqVO reqVO) {
return success(overtimeApplicationService.createApplication(reqVO));
}
@PutMapping("/{id}")
@Operation(summary = "退回后修改并重新提交加班申请")
@Operation(summary = "退回后修改并重新提交业务学习")
@PreAuthorize("@ss.hasPermission('" + OvertimeApplicationConstants.PERMISSION_UPDATE + "')")
public CommonResult<Boolean> resubmit(@PathVariable("id") Long id,
@Valid @RequestBody OvertimeApplicationSaveReqVO reqVO) {
@@ -65,35 +65,35 @@ public class OvertimeApplicationController {
}
@GetMapping("/{id}")
@Operation(summary = "获取加班申请详情")
@Operation(summary = "获取业务学习详情")
@PreAuthorize("@ss.hasPermission('" + OvertimeApplicationConstants.PERMISSION_QUERY + "')")
public CommonResult<OvertimeApplicationRespVO> get(@PathVariable("id") Long id) {
return success(overtimeApplicationService.getApplication(id));
}
@GetMapping("/status/dict")
@Operation(summary = "获取加班申请所有状态字典")
@Operation(summary = "获取业务学习所有状态字典")
@PreAuthorize("@ss.hasPermission('" + OvertimeApplicationConstants.PERMISSION_QUERY + "')")
public CommonResult<List<OvertimeApplicationStatusDictRespVO>> getStatusDict() {
return success(overtimeApplicationService.getStatusDict());
}
@GetMapping("/page")
@Operation(summary = "获取我的加班申请分页")
@Operation(summary = "获取我的业务学习分页")
@PreAuthorize("@ss.hasPermission('" + OvertimeApplicationConstants.PERMISSION_QUERY + "')")
public CommonResult<PageResult<OvertimeApplicationRespVO>> page(@Valid OvertimeApplicationPageReqVO reqVO) {
return success(overtimeApplicationService.getMyPage(reqVO));
}
@GetMapping("/approval-page")
@Operation(summary = "获取待我审批的加班申请分页")
@Operation(summary = "获取待我审批的业务学习分页")
@PreAuthorize("@ss.hasPermission('" + OvertimeApplicationConstants.PERMISSION_APPROVE + "')")
public CommonResult<PageResult<OvertimeApplicationRespVO>> approvalPage(@Valid OvertimeApplicationPageReqVO reqVO) {
return success(overtimeApplicationService.getApprovalPage(reqVO));
}
@PostMapping("/{id}/approve")
@Operation(summary = "审核通过加班申请")
@Operation(summary = "审核通过业务学习")
@PreAuthorize("@ss.hasPermission('" + OvertimeApplicationConstants.PERMISSION_APPROVE + "')")
public CommonResult<Boolean> approve(@PathVariable("id") Long id,
@Valid @RequestBody OvertimeApplicationStatusActionReqVO reqVO) {
@@ -102,7 +102,7 @@ public class OvertimeApplicationController {
}
@PostMapping("/{id}/reject")
@Operation(summary = "审核退回加班申请")
@Operation(summary = "审核退回业务学习")
@PreAuthorize("@ss.hasPermission('" + OvertimeApplicationConstants.PERMISSION_APPROVE + "')")
public CommonResult<Boolean> reject(@PathVariable("id") Long id,
@Valid @RequestBody OvertimeApplicationStatusActionReqVO reqVO) {
@@ -111,7 +111,7 @@ public class OvertimeApplicationController {
}
@PostMapping("/batch-approve")
@Operation(summary = "批量审核通过加班申请")
@Operation(summary = "批量审核通过业务学习")
@PreAuthorize("@ss.hasPermission('" + OvertimeApplicationConstants.PERMISSION_APPROVE + "')")
public CommonResult<OvertimeApplicationBatchResultRespVO> batchApprove(
@Valid @RequestBody OvertimeApplicationBatchActionReqVO reqVO) {
@@ -119,7 +119,7 @@ public class OvertimeApplicationController {
}
@PostMapping("/batch-reject")
@Operation(summary = "批量审核退回加班申请")
@Operation(summary = "批量审核退回业务学习")
@PreAuthorize("@ss.hasPermission('" + OvertimeApplicationConstants.PERMISSION_APPROVE + "')")
public CommonResult<OvertimeApplicationBatchResultRespVO> batchReject(
@Valid @RequestBody OvertimeApplicationBatchActionReqVO reqVO) {
@@ -127,7 +127,7 @@ public class OvertimeApplicationController {
}
@DeleteMapping("/{id}")
@Operation(summary = "删除已退回的加班申请")
@Operation(summary = "删除已退回的业务学习")
@PreAuthorize("@ss.hasPermission('" + OvertimeApplicationConstants.PERMISSION_DELETE + "')")
public CommonResult<Boolean> delete(@PathVariable("id") Long id) {
overtimeApplicationService.deleteApplication(id);
@@ -135,26 +135,26 @@ public class OvertimeApplicationController {
}
@GetMapping("/{id}/status-logs")
@Operation(summary = "获取加班申请状态日志")
@Operation(summary = "获取业务学习状态日志")
@PreAuthorize("@ss.hasPermission('" + OvertimeApplicationConstants.PERMISSION_QUERY + "')")
public CommonResult<List<OvertimeApplicationStatusLogRespVO>> statusLogs(@PathVariable("id") Long id) {
return success(overtimeApplicationService.getStatusLogs(id));
}
@GetMapping("/{id}/approval-records")
@Operation(summary = "获取加班申请审核记录")
@Operation(summary = "获取业务学习审核记录")
@PreAuthorize("@ss.hasPermission('" + OvertimeApplicationConstants.PERMISSION_QUERY + "')")
public CommonResult<List<OvertimeApplicationApprovalRecordRespVO>> approvalRecords(@PathVariable("id") Long id) {
return success(overtimeApplicationService.getApprovalRecords(id));
}
@GetMapping("/export")
@Operation(summary = "导出我的加班申请")
@Operation(summary = "导出我的业务学习")
@PreAuthorize("@ss.hasPermission('" + OvertimeApplicationConstants.PERMISSION_EXPORT + "')")
@ApiAccessLog(operateType = EXPORT)
public void export(@Valid OvertimeApplicationPageReqVO reqVO, HttpServletResponse response) throws IOException {
List<OvertimeApplicationExportVO> list = overtimeApplicationService.getExportList(reqVO);
ExcelUtils.write(response, "加班申请_" + LocalDate.now() + ".xls", "加班申请",
ExcelUtils.write(response, "业务学习_" + LocalDate.now() + ".xls", "业务学习",
OvertimeApplicationExportVO.class, list);
}
}

View File

@@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.RestController;
import static com.njcn.rdms.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 团队加班申请")
@Tag(name = "管理后台 - 团队业务学习")
@RestController
@RequestMapping("/project/overtime-applications/team")
@Validated
@@ -27,7 +27,7 @@ public class TeamOvertimeController {
private TeamOvertimeService teamOvertimeService;
@GetMapping("/summary")
@Operation(summary = "获取团队加班申请统计")
@Operation(summary = "获取团队业务学习统计")
@PreAuthorize("@ss.hasPermission('" + OvertimeApplicationConstants.PERMISSION_TEAM_DASHBOARD + "')")
public CommonResult<TeamOvertimeSummaryRespVO> getSummary(@Valid TeamOvertimeSummaryReqVO reqVO) {
return success(teamOvertimeService.getSummary(reqVO));

View File

@@ -8,15 +8,15 @@ import java.time.LocalDate;
import static com.njcn.rdms.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
@Schema(description = "管理后台 - 团队加班申请统计 Request VO")
@Schema(description = "管理后台 - 团队业务学习统计 Request VO")
@Data
public class TeamOvertimeSummaryReqVO {
@Schema(description = "加班日期区间起始(不传默认当月第一天)", example = "2026-06-01")
@Schema(description = "学习日期区间起始(不传默认当月第一天)", example = "2026-06-01")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate overtimeDateStart;
@Schema(description = "加班日期区间结束(不传默认当月最后一天)", example = "2026-06-30")
@Schema(description = "学习日期区间结束(不传默认当月最后一天)", example = "2026-06-30")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate overtimeDateEnd;
}

View File

@@ -5,14 +5,14 @@ import lombok.Data;
import java.time.LocalDate;
@Schema(description = "管理后台 - 团队加班申请统计 Response VO")
@Schema(description = "管理后台 - 团队业务学习统计 Response VO")
@Data
public class TeamOvertimeSummaryRespVO {
@Schema(description = "实际查询加班日期区间起始", requiredMode = Schema.RequiredMode.REQUIRED)
@Schema(description = "实际查询学习日期区间起始", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDate overtimeDateStart;
@Schema(description = "实际查询加班日期区间结束", requiredMode = Schema.RequiredMode.REQUIRED)
@Schema(description = "实际查询学习日期区间结束", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDate overtimeDateEnd;
@Schema(description = "申请总数", requiredMode = Schema.RequiredMode.REQUIRED, example = "12")

View File

@@ -5,7 +5,7 @@ import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 加班申请审核记录 Response VO")
@Schema(description = "管理后台 - 业务学习审核记录 Response VO")
@Data
public class OvertimeApplicationApprovalRecordRespVO {

View File

@@ -7,16 +7,16 @@ import lombok.Data;
import java.util.List;
@Schema(description = "管理后台 - 加班申请批量审批 Request VO")
@Schema(description = "管理后台 - 业务学习批量审批 Request VO")
@Data
public class OvertimeApplicationBatchActionReqVO {
@Schema(description = "加班申请编号列表", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,2,3]")
@NotEmpty(message = "加班申请编号列表不能为空")
@Schema(description = "业务学习编号列表", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,2,3]")
@NotEmpty(message = "业务学习编号列表不能为空")
private List<Long> ids;
@Schema(description = "审批意见。是否必填以状态机配置为准;当前退回必填",
example = "已确认,同意加班")
example = "已确认,同意学习")
@Size(max = 1000, message = "审批意见长度不能超过 1000 个字符")
private String reason;

View File

@@ -8,7 +8,7 @@ import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Schema(description = "管理后台 - 加班申请批量审批结果 Response VO")
@Schema(description = "管理后台 - 业务学习批量审批结果 Response VO")
@Data
public class OvertimeApplicationBatchResultRespVO {
@@ -18,14 +18,14 @@ public class OvertimeApplicationBatchResultRespVO {
@Schema(description = "失败的数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer failCount;
@Schema(description = "失败的加班申请编号列表")
@Schema(description = "失败的业务学习编号列表")
private List<FailItem> failItems = new ArrayList<>();
@Data
@Schema(description = "批量审批失败项")
public static class FailItem {
@Schema(description = "加班申请编号", example = "3")
@Schema(description = "业务学习编号", example = "3")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;

View File

@@ -14,16 +14,16 @@ public class OvertimeApplicationExportVO {
@ExcelProperty("申请人")
private String applicantName;
@ExcelProperty("加班日期")
@ExcelProperty("学习日期")
private LocalDate overtimeDate;
@ExcelProperty("加班时长")
@ExcelProperty("学习时长")
private String overtimeDuration;
@ExcelProperty("加班原因")
@ExcelProperty("学习原因")
private String overtimeReason;
@ExcelProperty("加班内容")
@ExcelProperty("学习内容")
private String overtimeContent;
@ExcelProperty("状态")

View File

@@ -14,7 +14,7 @@ import java.util.List;
import static com.njcn.rdms.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
import static com.njcn.rdms.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 加班申请分页 Request VO")
@Schema(description = "管理后台 - 业务学习分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
public class OvertimeApplicationPageReqVO extends PageParam {
@@ -22,7 +22,7 @@ public class OvertimeApplicationPageReqVO extends PageParam {
@Schema(description = "团队视角下的申请人用户编号列表")
private List<Long> applicantIds;
@Schema(description = "关键词,匹配加班原因或加班内容", example = "上线")
@Schema(description = "关键词,匹配学习原因或学习内容", example = "上线")
private String keyword;
@Schema(description = "申请人姓名,模糊匹配", example = "张三")
@@ -38,7 +38,7 @@ public class OvertimeApplicationPageReqVO extends PageParam {
@Size(max = 32, message = "状态编码长度不能超过32个字符")
private String statusCode;
@Schema(description = "加班日期范围", example = "[2026-06-01, 2026-06-30]")
@Schema(description = "学习日期范围", example = "[2026-06-01, 2026-06-30]")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate[] overtimeDate;

View File

@@ -6,11 +6,11 @@ import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 加班申请 Response VO")
@Schema(description = "管理后台 - 业务学习 Response VO")
@Data
public class OvertimeApplicationRespVO {
@Schema(description = "加班申请编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "9001")
@Schema(description = "业务学习编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "9001")
private Long id;
@Schema(description = "申请人用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3001")
@@ -19,16 +19,16 @@ public class OvertimeApplicationRespVO {
@Schema(description = "申请人姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
private String applicantName;
@Schema(description = "加班日期", requiredMode = Schema.RequiredMode.REQUIRED)
@Schema(description = "学习日期", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDate overtimeDate;
@Schema(description = "加班时长", requiredMode = Schema.RequiredMode.REQUIRED, example = "1天")
@Schema(description = "学习时长", requiredMode = Schema.RequiredMode.REQUIRED, example = "1天")
private String overtimeDuration;
@Schema(description = "加班原因", requiredMode = Schema.RequiredMode.REQUIRED)
@Schema(description = "学习原因", requiredMode = Schema.RequiredMode.REQUIRED)
private String overtimeReason;
@Schema(description = "加班内容", requiredMode = Schema.RequiredMode.REQUIRED)
@Schema(description = "学习内容", requiredMode = Schema.RequiredMode.REQUIRED)
private String overtimeContent;
@Schema(description = "审核人用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1001")

View File

@@ -8,27 +8,27 @@ import lombok.Data;
import java.time.LocalDate;
@Schema(description = "管理后台 - 加班申请保存 Request VO")
@Schema(description = "管理后台 - 业务学习保存 Request VO")
@Data
public class OvertimeApplicationSaveReqVO {
@Schema(description = "加班日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "2026-06-01")
@NotNull(message = "加班日期不能为空")
@Schema(description = "学习日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "2026-06-01")
@NotNull(message = "学习日期不能为空")
private LocalDate overtimeDate;
@Schema(description = "加班时长", requiredMode = Schema.RequiredMode.REQUIRED, example = "1天")
@NotBlank(message = "加班时长不能为空")
@Size(max = 30, message = "加班时长长度不能超过30个字符")
@Schema(description = "学习时长", requiredMode = Schema.RequiredMode.REQUIRED, example = "1天")
@NotBlank(message = "学习时长不能为空")
@Size(max = 30, message = "学习时长长度不能超过30个字符")
private String overtimeDuration;
@Schema(description = "加班原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "版本上线保障")
@NotBlank(message = "加班原因不能为空")
@Size(max = 500, message = "加班原因长度不能超过500个字符")
@Schema(description = "学习原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "版本上线保障")
@NotBlank(message = "学习原因不能为空")
@Size(max = 500, message = "学习原因长度不能超过500个字符")
private String overtimeReason;
@Schema(description = "加班内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "处理上线验证和问题修复")
@NotBlank(message = "加班内容不能为空")
@Size(max = 1000, message = "加班内容长度不能超过1000个字符")
@Schema(description = "学习内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "处理上线验证和问题修复")
@NotBlank(message = "学习内容不能为空")
@Size(max = 1000, message = "学习内容长度不能超过1000个字符")
private String overtimeContent;
@Schema(description = "审核人用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1001")

View File

@@ -4,12 +4,12 @@ import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Size;
import lombok.Data;
@Schema(description = "管理后台 - 加班申请状态动作 Request VO")
@Schema(description = "管理后台 - 业务学习状态动作 Request VO")
@Data
public class OvertimeApplicationStatusActionReqVO {
@Schema(description = "动作原因或审核意见。是否必填以状态机配置为准;当前退回必填",
example = "请补充加班内容")
example = "请补充学习内容")
@Size(max = 1000, message = "动作原因长度不能超过 1000 个字符")
private String reason;
}

View File

@@ -4,9 +4,9 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 管理后台 - 加班申请状态字典 Response VO
* 管理后台 - 业务学习状态字典 Response VO
*/
@Schema(description = "管理后台 - 加班申请状态字典 Response VO")
@Schema(description = "管理后台 - 业务学习状态字典 Response VO")
@Data
public class OvertimeApplicationStatusDictRespVO {

View File

@@ -6,14 +6,14 @@ import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 加班申请状态日志 Response VO")
@Schema(description = "管理后台 - 业务学习状态日志 Response VO")
@Data
public class OvertimeApplicationStatusLogRespVO {
@Schema(description = "日志编号", requiredMode = Schema.RequiredMode.REQUIRED)
private Long id;
@Schema(description = "加班申请编号", requiredMode = Schema.RequiredMode.REQUIRED)
@Schema(description = "业务学习编号", requiredMode = Schema.RequiredMode.REQUIRED)
private Long applicationId;
@Schema(description = "动作编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "approve")
@@ -37,10 +37,10 @@ public class OvertimeApplicationStatusLogRespVO {
@Schema(description = "申请人姓名快照", requiredMode = Schema.RequiredMode.REQUIRED)
private String applicantNameSnapshot;
@Schema(description = "加班日期快照", requiredMode = Schema.RequiredMode.REQUIRED)
@Schema(description = "学习日期快照", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDate overtimeDateSnapshot;
@Schema(description = "加班时长快照", requiredMode = Schema.RequiredMode.REQUIRED)
@Schema(description = "学习时长快照", requiredMode = Schema.RequiredMode.REQUIRED)
private String overtimeDurationSnapshot;
@Schema(description = "备注")

View File

@@ -9,7 +9,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 加班申请审核记录。
* 业务学习审核记录。
*/
@TableName("rdms_overtime_application_approval_record")
@Data

View File

@@ -12,7 +12,7 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* 加班申请表。
* 业务学习表。
*/
@TableName("rdms_overtime_application")
@Data

View File

@@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode;
import java.time.LocalDate;
/**
* 加班申请状态日志表。
* 业务学习状态日志表。
*/
@TableName("rdms_overtime_application_status_log")
@Data

View File

@@ -295,7 +295,7 @@ public class OvertimeApplicationServiceImpl implements OvertimeApplicationServic
for (Long id : reqVO.getIds()) {
OvertimeApplicationDO app = appMap.get(id);
if (app == null) {
addFailItem(result, id, "加班申请不存在");
addFailItem(result, id, "业务学习不存在");
} else if (!Objects.equals(app.getApproverId(), loginUserId)) {
addFailItem(result, id, "您不是该申请的审批人");
} else if (!Objects.equals(app.getStatusCode(), OvertimeApplicationConstants.STATUS_PENDING)) {
@@ -461,9 +461,9 @@ public class OvertimeApplicationServiceImpl implements OvertimeApplicationServic
private void applySaveFields(OvertimeApplicationDO target, OvertimeApplicationSaveReqVO reqVO,
AdminUserRespDTO approver) {
target.setOvertimeDate(reqVO.getOvertimeDate());
target.setOvertimeDuration(normalizeRequiredText(reqVO.getOvertimeDuration(), "加班时长不能为空"));
target.setOvertimeReason(normalizeRequiredText(reqVO.getOvertimeReason(), "加班原因不能为空"));
target.setOvertimeContent(normalizeRequiredText(reqVO.getOvertimeContent(), "加班内容不能为空"));
target.setOvertimeDuration(normalizeRequiredText(reqVO.getOvertimeDuration(), "学习时长不能为空"));
target.setOvertimeReason(normalizeRequiredText(reqVO.getOvertimeReason(), "学习原因不能为空"));
target.setOvertimeContent(normalizeRequiredText(reqVO.getOvertimeContent(), "学习内容不能为空"));
target.setApproverId(approver.getId());
target.setApproverName(defaultText(approver.getNickname()));
}
@@ -546,8 +546,8 @@ public class OvertimeApplicationServiceImpl implements OvertimeApplicationServic
private String buildSnapshotRemark(OvertimeApplicationDO application) {
return "申请人:" + defaultText(application.getApplicantName())
+ "加班日期:" + application.getOvertimeDate()
+ "加班时长:" + defaultText(application.getOvertimeDuration());
+ "学习日期:" + application.getOvertimeDate()
+ "学习时长:" + defaultText(application.getOvertimeDuration());
}
private String buildFieldChanges(OvertimeApplicationDO before, OvertimeApplicationDO after) {

View File

@@ -27,7 +27,7 @@ public interface TeamDashboardAccessService {
List<Long> resolveRequestedSubordinateUserIds(Collection<Long> candidateUserIds, String permission);
/**
* 判断当前登录用户是否可读取指定工作报告/加班申请所属人员的数据。
* 判断当前登录用户是否可读取指定工作报告/业务学习所属人员的数据。
*
* @param userId 目标人员 ID
* @return 是否可读

View File

@@ -123,7 +123,7 @@ rdms:
enabled: true
weekly:
enabled: true
cron: "0 0 12 ? * SUN"
cron: "0 0 12 ? * FRI"
monthly:
enabled: true
cron: "0 0 12 1-31 * ?"

View File

@@ -28,7 +28,7 @@ import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.when;
/**
* 加班申请状态机错误文案单测TD-012
* 业务学习状态机错误文案单测TD-012
* 验证:状态机「动作不允许 / 缺原因」抛错时message 填的是 {@link StatusActionTextResolver} 翻出的中文名,
* 不外泄英文动作 / 状态 code技术 token 只进 log不进用户可见 message
* resolver 自身的 DB 翻译由 StatusActionTextResolverTest 覆盖,这里只验证 service 填进 message 的是中文名。

View File

@@ -33,12 +33,12 @@ public interface DictTypeConstants {
String RDMS_TASK_ITEM_TYPE="rdms_task_item_type";
/**
* 加班申请审批状态字典。
* 业务学习审批状态字典。
*/
String RDMS_OVERTIME_APPLICATION_STATUS = "rdms_overtime_application_status";
/**
* 加班申请时长快捷选项字典。
* 业务学习时长快捷选项字典。
*/
String RDMS_OVERTIME_DURATION = "rdms_overtime_duration";