refactor(overtime-application、project): 将加班申请功能重构为业务学习功能、修改应用配置中的cron表达式将每周执行时间从周日改为周五。
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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 ==========
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.njcn.rdms.module.project.constant;
|
||||
|
||||
/**
|
||||
* 加班申请常量。
|
||||
* 业务学习常量。
|
||||
*/
|
||||
public final class OvertimeApplicationConstants {
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -5,7 +5,7 @@ import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Schema(description = "管理后台 - 加班申请审核记录 Response VO")
|
||||
@Schema(description = "管理后台 - 业务学习审核记录 Response VO")
|
||||
@Data
|
||||
public class OvertimeApplicationApprovalRecordRespVO {
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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("状态")
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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 = "备注")
|
||||
|
||||
@@ -9,7 +9,7 @@ import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* 加班申请审核记录。
|
||||
* 业务学习审核记录。
|
||||
*/
|
||||
@TableName("rdms_overtime_application_approval_record")
|
||||
@Data
|
||||
|
||||
@@ -12,7 +12,7 @@ import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* 加班申请表。
|
||||
* 业务学习表。
|
||||
*/
|
||||
@TableName("rdms_overtime_application")
|
||||
@Data
|
||||
|
||||
@@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode;
|
||||
import java.time.LocalDate;
|
||||
|
||||
/**
|
||||
* 加班申请状态日志表。
|
||||
* 业务学习状态日志表。
|
||||
*/
|
||||
@TableName("rdms_overtime_application_status_log")
|
||||
@Data
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -27,7 +27,7 @@ public interface TeamDashboardAccessService {
|
||||
List<Long> resolveRequestedSubordinateUserIds(Collection<Long> candidateUserIds, String permission);
|
||||
|
||||
/**
|
||||
* 判断当前登录用户是否可读取指定工作报告/加班申请所属人员的数据。
|
||||
* 判断当前登录用户是否可读取指定工作报告/业务学习所属人员的数据。
|
||||
*
|
||||
* @param userId 目标人员 ID
|
||||
* @return 是否可读
|
||||
|
||||
@@ -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 * ?"
|
||||
|
||||
@@ -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 的是中文名。
|
||||
|
||||
@@ -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";
|
||||
|
||||
|
||||
Reference in New Issue
Block a user