From 74dcdc7c2abcbb461b71788c00b941fafb36c56d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=B9=BE=E7=BF=94?= Date: Tue, 19 May 2026 16:38:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E6=B4=BE=E9=85=8D=E7=BD=AE=E5=AE=A1?= =?UTF-8?q?=E6=89=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constant/DispatchConfigApprovalConst.java | 45 ++++ .../pojo/entity/DispatchConfigApproval.java | 69 ++++++ .../quality/pojo/request/AuditRequest.java | 31 +++ .../DispatchConfigApprovalRequest.java | 47 ++++ .../pojo/vo/DispatchConfigApprovalVO.java | 115 +++++++++ .../DispatchConfigApprovalController.java | 202 +++++++++++++++ .../excel/DispatchConfigApprovalExcel.java | 40 +++ .../mapper/DispatchConfigApprovalMapper.java | 14 ++ .../IDispatchConfigApprovalService.java | 86 +++++++ .../DispatchConfigApprovalServiceImpl.java | 230 ++++++++++++++++++ .../DispatchConfigApprovalWrapper.java | 23 ++ 11 files changed, 902 insertions(+) create mode 100644 blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/constant/DispatchConfigApprovalConst.java create mode 100644 blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/DispatchConfigApproval.java create mode 100644 blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/request/AuditRequest.java create mode 100644 blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/request/DispatchConfigApprovalRequest.java create mode 100644 blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/DispatchConfigApprovalVO.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/DispatchConfigApprovalController.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/quality/excel/DispatchConfigApprovalExcel.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/DispatchConfigApprovalMapper.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/IDispatchConfigApprovalService.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/DispatchConfigApprovalServiceImpl.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/quality/wrapper/DispatchConfigApprovalWrapper.java diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/constant/DispatchConfigApprovalConst.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/constant/DispatchConfigApprovalConst.java new file mode 100644 index 000000000..6813edfba --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/constant/DispatchConfigApprovalConst.java @@ -0,0 +1,45 @@ +package org.springblade.desk.quality.constant; + +/** + * 分派配置审批常量 + * + * @author AI + * @since 2026-05-19 + */ +public interface DispatchConfigApprovalConst { + + /** + * 状态-草稿 + */ + Integer STATUS_DRAFT = 0; + + /** + * 状态-审批中 + */ + Integer STATUS_APPROVING = 1; + + /** + * 状态-审批通过 + */ + Integer STATUS_APPROVED = 2; + + /** + * 状态-审批驳回 + */ + Integer STATUS_REJECTED = 3; + + /** + * 状态-已撤销 + */ + Integer STATUS_CANCELLED = 4; + + /** + * 审批结果-通过 + */ + Integer AUDIT_RESULT_PASS = 1; + + /** + * 审批结果-驳回 + */ + Integer AUDIT_RESULT_REJECT = 2; +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/DispatchConfigApproval.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/DispatchConfigApproval.java new file mode 100644 index 000000000..1ef243b70 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/DispatchConfigApproval.java @@ -0,0 +1,69 @@ +package org.springblade.desk.quality.pojo.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +import java.util.Date; + +/** + * 分派配置审批实体类 + * + * @author AI + * @since 2026-05-19 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("QA_DISPATCH_CONFIG_APPROVAL") +@Schema(description = "分派配置审批实体") +public class DispatchConfigApproval extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "ID", type = IdType.ASSIGN_ID) + @Schema(description = "主键ID") + private Long id; + + /** + * 申请单号 + */ + @Schema(description = "申请单号") + private String applicationNo; + + /** + * 申请人ID + */ + @Schema(description = "申请人ID") + private Long applicantId; + + /** + * 申请人姓名 + */ + @Schema(description = "申请人姓名") + private String applicantName; + + /** + * 申请时间 + */ + @Schema(description = "申请时间") + private Date applicationTime; + + /** + * 申请描述/备注 + */ + @Schema(description = "申请描述/备注") + private String remark; + + /** + * 状态: 0-草稿, 1-审批中, 2-审批通过, 3-审批驳回, 4-已撤销 + */ + @Schema(description = "状态: 0-草稿, 1-审批中, 2-审批通过, 3-审批驳回, 4-已撤销") + private Integer status; +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/request/AuditRequest.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/request/AuditRequest.java new file mode 100644 index 000000000..dbd8aa148 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/request/AuditRequest.java @@ -0,0 +1,31 @@ +package org.springblade.desk.quality.pojo.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 审核请求DTO + * + * @author qyl + * @since 2026-05-13 + */ +@Data +@Schema(description = "审核请求DTO") +public class AuditRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "模板ID不能为空") + @Schema(description = "模板ID") + private Long id; + + @NotNull(message = "审核结果不能为空") + @Schema(description = "审核结果: 1-通过, 2-不通过") + private Integer result; + + @Schema(description = "审核意见(不通过时必填)") + private String remark; +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/request/DispatchConfigApprovalRequest.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/request/DispatchConfigApprovalRequest.java new file mode 100644 index 000000000..4a66b12f1 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/request/DispatchConfigApprovalRequest.java @@ -0,0 +1,47 @@ +package org.springblade.desk.quality.pojo.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 分派配置审批请求DTO + * + * @author AI + * @since 2026-05-19 + */ +@Data +@Schema(description = "分派配置审批请求DTO") +public class DispatchConfigApprovalRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID(修改时必填) + */ + @Schema(description = "主键ID(修改时必填)") + private Long id; + + /** + * 申请描述/备注 + */ + @NotBlank(message = "申请描述不能为空") + @Schema(description = "申请描述/备注", required = true) + private String remark; + + /** + * 审批结果: 1-通过, 2-驳回 + */ + @NotNull(message = "审批结果不能为空") + @Schema(description = "审批结果: 1-通过, 2-驳回", required = true) + private Integer auditResult; + + /** + * 审批意见 + */ + @Schema(description = "审批意见") + private String auditRemark; +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/DispatchConfigApprovalVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/DispatchConfigApprovalVO.java new file mode 100644 index 000000000..a4ad3bbdd --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/DispatchConfigApprovalVO.java @@ -0,0 +1,115 @@ +package org.springblade.desk.quality.pojo.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; +import org.springblade.desk.quality.pojo.entity.DispatchConfigApproval; + +import java.util.Date; + +/** + * 分派配置审批VO类 + * + * @author AI + * @since 2026-05-19 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "分派配置审批VO") +public class DispatchConfigApprovalVO extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @Schema(description = "主键ID") + private Long id; + + /** + * 申请单号 + */ + @Schema(description = "申请单号") + private String applicationNo; + + /** + * 申请人ID + */ + @Schema(description = "申请人ID") + private Long applicantId; + + /** + * 申请人姓名 + */ + @Schema(description = "申请人姓名") + private String applicantName; + + /** + * 申请时间 + */ + @Schema(description = "申请时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date applicationTime; + + /** + * 申请描述/备注 + */ + @Schema(description = "申请描述/备注") + private String remark; + + /** + * 状态: 0-草稿, 1-审批中, 2-审批通过, 3-审批驳回, 4-已撤销 + */ + @Schema(description = "状态: 0-草稿, 1-审批中, 2-审批通过, 3-审批驳回, 4-已撤销") + private Integer status; + + /** + * 状态名称 + */ + @Schema(description = "状态名称") + private String statusName; + + /** + * 从实体转换为VO + */ + public static DispatchConfigApprovalVO fromEntity(DispatchConfigApproval entity) { + if (entity == null) { + return null; + } + DispatchConfigApprovalVO vo = new DispatchConfigApprovalVO(); + vo.setId(entity.getId()); + vo.setApplicationNo(entity.getApplicationNo()); + vo.setApplicantId(entity.getApplicantId()); + vo.setApplicantName(entity.getApplicantName()); + vo.setApplicationTime(entity.getApplicationTime()); + vo.setRemark(entity.getRemark()); + vo.setStatus(entity.getStatus()); + vo.setStatusName(getStatusName(entity.getStatus())); + return vo; + } + + /** + * 获取状态名称 + */ + private static String getStatusName(Integer status) { + if (status == null) { + return "未知"; + } + switch (status) { + case 0: + return "草稿"; + case 1: + return "审批中"; + case 2: + return "审批通过"; + case 3: + return "审批驳回"; + case 4: + return "已撤销"; + default: + return "未知"; + } + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/DispatchConfigApprovalController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/DispatchConfigApprovalController.java new file mode 100644 index 000000000..71c45c1b2 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/DispatchConfigApprovalController.java @@ -0,0 +1,202 @@ +package org.springblade.desk.quality.controller; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.excel.util.ExcelUtil; +import org.springblade.core.log.annotation.ApiLog; +import org.springblade.core.mp.support.Condition; +import org.springblade.core.mp.support.Query; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.DateUtil; +import org.springblade.desk.quality.constant.QAModuleConst; +import org.springblade.desk.quality.excel.DispatchConfigApprovalExcel; +import org.springblade.desk.quality.pojo.entity.DispatchConfigApproval; +import org.springblade.desk.quality.pojo.request.DispatchConfigApprovalRequest; +import org.springblade.desk.quality.pojo.vo.DispatchConfigApprovalVO; +import org.springblade.desk.quality.service.IDispatchConfigApprovalService; +import org.springblade.desk.quality.wrapper.DispatchConfigApprovalWrapper; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * [分派配置审批] 控制器 + * + * @author AI + * @since 2026-05-19 + */ +@RestController +@RequestMapping(QAModuleConst.CONTROLLER_PREFIX + "/DispatchConfigApproval") +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Slf4j +@Tag(name = "[分派配置审批]", description = "[分派配置审批]接口") +public class DispatchConfigApprovalController extends BladeController { + + @Resource + private IDispatchConfigApprovalService service; + + /** + * [分派配置审批] 详情 + */ + @GetMapping("/detail") + @ApiOperationSupport(order = 10) + @Operation(summary = "详情", description = "传入DispatchConfigApproval Obj") + public R detail(DispatchConfigApproval dispatchConfigApproval) { + QueryWrapper qw = Condition.getQueryWrapper(dispatchConfigApproval); + DispatchConfigApproval detail = service.getOne(qw); + DispatchConfigApprovalVO detailVO = DispatchConfigApprovalWrapper.build().entityVO(detail); + return R.data(detailVO); + } + + /** + * [分派配置审批] list分页 + */ + @GetMapping("/list") + @ApiOperationSupport(order = 20) + @Operation(summary = "list分页", description = "传入DispatchConfigApproval Obj") + public R> list(@Parameter(hidden = true) @RequestParam Map dispatchConfigApproval, + Query query) { + QueryWrapper qw = Condition.getQueryWrapper(dispatchConfigApproval, DispatchConfigApproval.class); + IPage pages = service.page(Condition.getPage(query), qw); + IPage pagesVO = DispatchConfigApprovalWrapper.build().pageVO(pages); + return R.data(pagesVO); + } + + /** + * [分派配置审批] page分页 + */ + @GetMapping("/page") + @ApiOperationSupport(order = 21) + @Operation(summary = "page分页", description = "传入DispatchConfigApproval Obj") + public R> page(DispatchConfigApprovalVO dispatchConfigApproval, Query query) { + IPage pagesVO = service.selectDispatchConfigApprovalPage( + Condition.getPage(query), dispatchConfigApproval + ); + return R.data(pagesVO); + } + + /** + * [分派配置审批] list下拉选择 + */ + @GetMapping("/listForSelect") + @ApiOperationSupport(order = 22) + @Operation(summary = "list下拉选择", description = "") + public R> listForSelect() { + List list = service.list(); + List listVO = DispatchConfigApprovalWrapper.build().listVO(list); + return R.data(listVO); + } + + /** + * [分派配置审批] 新增一条 + */ + @PostMapping("/save") + @ApiOperationSupport(order = 30) + @ApiLog("新增分派配置审批") + @Operation(summary = "新增一条", description = "传入DispatchConfigApproval Obj") + public R save(@Valid @RequestBody DispatchConfigApproval addOne) { + return service.saveDispatchConfigApproval(addOne); + } + + /** + * [分派配置审批] 新增批量 + */ + @PostMapping("/saveBat") + @ApiOperationSupport(order = 31) + @ApiLog("新增分派配置审批") + @Operation(summary = "新增批量", description = "传入DispatchConfigApproval List") + public R saveBat(@Valid @RequestBody List addList) { + addList.forEach(one -> { + one.setId(null); + }); + return R.status(service.saveBatch(addList)); + } + + /** + * [分派配置审批] 修改一条 + */ + @PostMapping("/update") + @ApiOperationSupport(order = 40) + @ApiLog("修改分派配置审批") + @Operation(summary = "修改一条", description = "传入DispatchConfigApproval Obj") + public R update(@Valid @RequestBody DispatchConfigApproval updateOne) { + return service.updateDispatchConfigApproval(updateOne); + } + + /** + * [分派配置审批] 删除 + */ + @PostMapping("/remove") + @ApiOperationSupport(order = 50) + @ApiLog("删除分派配置审批") + @Operation(summary = "删除", description = "传入主键集合") + public R remove(@RequestParam List ids) { + return service.removeDispatchConfigApproval(ids); + } + + /** + * [分派配置审批] 导出 + */ + @GetMapping("/export") + @ApiOperationSupport(order = 60) + @ApiLog("导出分派配置审批") + @Operation(summary = "导出", description = "传入DispatchConfigApproval Obj") + public void export(DispatchConfigApproval dispatchConfigApproval, HttpServletResponse response) { + List list = service.exportDispatchConfigApproval( + DispatchConfigApprovalWrapper.build().entityVO(dispatchConfigApproval) + ); + ExcelUtil.export(response, "分派配置审批数据" + DateUtil.time(), "分派配置审批数据表", list, DispatchConfigApprovalExcel.class); + } + + /** + * [分派配置审批] 提交审批 + */ + @PostMapping("/submitApproval") + @ApiOperationSupport(order = 70) + @ApiLog("提交分派配置审批") + @Operation(summary = "提交审批", description = "传入主键ID") + public R submitApproval(@Parameter(description = "主键ID", required = true) @RequestParam Long id) { + return service.submitApproval(id); + } + + /** + * [分派配置审批] 审批(待实现) + */ + @PostMapping("/audit") + @ApiOperationSupport(order = 80) + @ApiLog("审批分派配置") + @Operation(summary = "审批", description = "审批功能待实现") + public R audit(@Parameter(description = "主键ID", required = true) @RequestParam Long id, + @Parameter(description = "审批结果: 1-通过, 2-驳回", required = true) @RequestParam Integer result, + @Parameter(description = "审批意见") @RequestParam(required = false) String remark) { + return service.audit(id, result, remark); + } + + /** + * [分派配置审批] 查询审批历史 + */ + @GetMapping("/auditHistory/{id}") + @ApiOperationSupport(order = 90) + @Operation(summary = "查询审批历史", description = "传入主键ID") + public R getAuditHistory(@Parameter(description = "主键ID", required = true) @PathVariable Long id) { + return R.data(service.getAuditHistory(id)); + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/excel/DispatchConfigApprovalExcel.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/excel/DispatchConfigApprovalExcel.java new file mode 100644 index 000000000..f99d06b8d --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/excel/DispatchConfigApprovalExcel.java @@ -0,0 +1,40 @@ +package org.springblade.desk.quality.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 分派配置审批Excel类 + * + * @author AI + * @since 2026-05-19 + */ +@Data +public class DispatchConfigApprovalExcel implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty("申请单号") + @ColumnWidth(20) + private String applicationNo; + + @ExcelProperty("申请人") + @ColumnWidth(15) + private String applicantName; + + @ExcelProperty("申请时间") + @ColumnWidth(20) + private Date applicationTime; + + @ExcelProperty("申请描述") + @ColumnWidth(40) + private String remark; + + @ExcelProperty("状态") + @ColumnWidth(15) + private String statusName; +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/DispatchConfigApprovalMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/DispatchConfigApprovalMapper.java new file mode 100644 index 000000000..c23ae84de --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/DispatchConfigApprovalMapper.java @@ -0,0 +1,14 @@ +package org.springblade.desk.quality.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springblade.desk.quality.pojo.entity.DispatchConfigApproval; + +/** + * 分派配置审批Mapper接口 + * + * @author AI + * @since 2026-05-19 + */ +public interface DispatchConfigApprovalMapper extends BaseMapper { + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/IDispatchConfigApprovalService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/IDispatchConfigApprovalService.java new file mode 100644 index 000000000..fe810ac43 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/IDispatchConfigApprovalService.java @@ -0,0 +1,86 @@ +package org.springblade.desk.quality.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springblade.core.tool.api.R; +import org.springblade.desk.basic.service.en.EnBaseService; +import org.springblade.desk.quality.excel.DispatchConfigApprovalExcel; +import org.springblade.desk.quality.pojo.entity.DispatchConfigApproval; +import org.springblade.desk.quality.pojo.vo.DispatchConfigApprovalVO; + +import java.util.List; + +/** + * 分派配置审批服务接口 + * + * @author AI + * @since 2026-05-19 + */ +public interface IDispatchConfigApprovalService extends EnBaseService { + + /** + * 自定义分页查询 + * + * @param page 分页参数 + * @param entity 查询条件 + * @return 分页结果 + */ + IPage selectDispatchConfigApprovalPage(IPage page, DispatchConfigApprovalVO entity); + + /** + * 导出数据 + * + * @param entity 查询条件 + * @return Excel数据列表 + */ + List exportDispatchConfigApproval(DispatchConfigApprovalVO entity); + + /** + * 新增分派配置审批 + * + * @param entity 分派配置审批实体 + * @return 操作结果 + */ + R saveDispatchConfigApproval(DispatchConfigApproval entity); + + /** + * 修改分派配置审批 + * + * @param entity 分派配置审批实体 + * @return 操作结果 + */ + R updateDispatchConfigApproval(DispatchConfigApproval entity); + + /** + * 删除分派配置审批 + * + * @param ids 主键ID列表 + * @return 操作结果 + */ + R removeDispatchConfigApproval(List ids); + + /** + * 提交审批 + * + * @param id 主键ID + * @return 操作结果 + */ + R submitApproval(Long id); + + /** + * 审批(待实现) + * + * @param id 主键ID + * @param result 审批结果: 1-通过, 2-驳回 + * @param remark 审批意见 + * @return 操作结果 + */ + R audit(Long id, Integer result, String remark); + + /** + * 查询审批历史 + * + * @param id 主键ID + * @return 审批历史信息 + */ + DispatchConfigApprovalVO getAuditHistory(Long id); +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/DispatchConfigApprovalServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/DispatchConfigApprovalServiceImpl.java new file mode 100644 index 000000000..2cf538125 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/DispatchConfigApprovalServiceImpl.java @@ -0,0 +1,230 @@ +package org.springblade.desk.quality.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.api.R; +import org.springblade.desk.basic.service.en.impl.EnBaseServiceImpl; +import org.springblade.desk.quality.constant.DispatchConfigApprovalConst; +import org.springblade.desk.quality.excel.DispatchConfigApprovalExcel; +import org.springblade.desk.quality.mapper.DispatchConfigApprovalMapper; +import org.springblade.desk.quality.pojo.entity.DispatchConfigApproval; +import org.springblade.desk.quality.pojo.request.DispatchConfigApprovalRequest; +import org.springblade.desk.quality.pojo.vo.DispatchConfigApprovalVO; +import org.springblade.desk.quality.service.IDispatchConfigApprovalService; +import org.springblade.desk.quality.wrapper.DispatchConfigApprovalWrapper; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 分派配置审批服务实现类 + * + * @author AI + * @since 2026-05-19 + */ +@Slf4j +@Service +public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl implements IDispatchConfigApprovalService { + + @Override + public IPage selectDispatchConfigApprovalPage(IPage page, DispatchConfigApprovalVO entity) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + // 查询条件 + if (entity != null) { + if (StrUtil.isNotBlank(entity.getApplicationNo())) { + queryWrapper.like("APPLICATION_NO", entity.getApplicationNo()); + } + if (StrUtil.isNotBlank(entity.getApplicantName())) { + queryWrapper.like("APPLICANT_NAME", entity.getApplicantName()); + } + if (entity.getStatus() != null) { + queryWrapper.eq("STATUS", entity.getStatus()); + } + } + + // 按创建时间降序 + queryWrapper.orderByDesc("CREATE_TIME"); + + IPage pages = baseMapper.selectPage( + page, + queryWrapper + ); + return DispatchConfigApprovalWrapper.build().pageVO(pages); + } + + @Override + public List exportDispatchConfigApproval(DispatchConfigApprovalVO entity) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + // 查询条件 + if (entity != null) { + if (StrUtil.isNotBlank(entity.getApplicationNo())) { + queryWrapper.like("APPLICATION_NO", entity.getApplicationNo()); + } + if (StrUtil.isNotBlank(entity.getApplicantName())) { + queryWrapper.like("APPLICANT_NAME", entity.getApplicantName()); + } + if (entity.getStatus() != null) { + queryWrapper.eq("STATUS", entity.getStatus()); + } + } + + queryWrapper.orderByDesc("CREATE_TIME"); + List list = list(queryWrapper); + + List excelList = new ArrayList<>(); + for (DispatchConfigApproval item : list) { + DispatchConfigApprovalExcel excel = new DispatchConfigApprovalExcel(); + BeanUtils.copyProperties(item, excel); + excel.setStatusName(getStatusName(item.getStatus())); + excelList.add(excel); + } + + return excelList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public R saveDispatchConfigApproval(DispatchConfigApproval entity) { + // 生成申请单号 + String applicationNo = generateApplicationNo(); + entity.setApplicationNo(applicationNo); + + // 设置申请人信息 + entity.setApplicantId(AuthUtil.getUserId()); + entity.setApplicantName(AuthUtil.getUserName()); + entity.setApplicationTime(new Date()); + + // 设置初始状态为草稿 + entity.setStatus(DispatchConfigApprovalConst.STATUS_DRAFT); + + return R.status(save(entity)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public R updateDispatchConfigApproval(DispatchConfigApproval entity) { + // 检查是否存在 + DispatchConfigApproval existing = getById(entity.getId()); + if (existing == null) { + return R.fail("记录不存在"); + } + + // 只有草稿状态可以修改 + if (!DispatchConfigApprovalConst.STATUS_DRAFT.equals(existing.getStatus())) { + return R.fail("只有草稿状态的记录可以修改"); + } + + return R.status(updateById(entity)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public R removeDispatchConfigApproval(List ids) { + if (ids == null || ids.isEmpty()) { + return R.fail("请选择要删除的记录"); + } + + // 检查状态,只有草稿状态可以删除 + for (Long id : ids) { + DispatchConfigApproval entity = getById(id); + if (entity != null && !DispatchConfigApprovalConst.STATUS_DRAFT.equals(entity.getStatus())) { + return R.fail("只有草稿状态的记录可以删除"); + } + } + + return R.status(removeByIds(ids)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public R submitApproval(Long id) { + DispatchConfigApproval entity = getById(id); + if (entity == null) { + return R.fail("记录不存在"); + } + + // 只有草稿状态可以提交审批 + if (!DispatchConfigApprovalConst.STATUS_DRAFT.equals(entity.getStatus())) { + return R.fail("只有草稿状态的记录可以提交审批"); + } + + // 更新状态为审批中 + entity.setStatus(DispatchConfigApprovalConst.STATUS_APPROVING); + updateById(entity); + + // TODO: 发送消息通知给审批人 + + return R.success("提交审批成功"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public R audit(Long id, Integer result, String remark) { + // TODO: 审批功能逻辑待确认,暂时返回提示信息 + return R.fail("审批功能待实现"); + } + + @Override + public DispatchConfigApprovalVO getAuditHistory(Long id) { + DispatchConfigApproval entity = getById(id); + if (entity == null) { + return null; + } + return DispatchConfigApprovalVO.fromEntity(entity); + } + + /** + * 生成申请单号 + * 格式:YYYYMMDD + 3位序号 + */ + private String generateApplicationNo() { + String dateStr = cn.hutool.core.date.DateUtil.format(new Date(), "yyyyMMdd"); + + // 查询当天最大序号 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.likeRight("APPLICATION_NO", dateStr) + .orderByDesc("APPLICATION_NO") + .last("LIMIT 1"); + + DispatchConfigApproval last = getOne(queryWrapper); + int seq = 1; + if (last != null && StrUtil.isNotBlank(last.getApplicationNo())) { + String lastSeq = last.getApplicationNo().substring(8); + seq = Integer.parseInt(lastSeq) + 1; + } + + return dateStr + String.format("%03d", seq); + } + + /** + * 获取状态名称 + */ + private String getStatusName(Integer status) { + if (status == null) { + return "未知"; + } + switch (status) { + case 0: + return "草稿"; + case 1: + return "审批中"; + case 2: + return "审批通过"; + case 3: + return "审批驳回"; + case 4: + return "已撤销"; + default: + return "未知"; + } + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/wrapper/DispatchConfigApprovalWrapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/wrapper/DispatchConfigApprovalWrapper.java new file mode 100644 index 000000000..2e0dd6092 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/wrapper/DispatchConfigApprovalWrapper.java @@ -0,0 +1,23 @@ +package org.springblade.desk.quality.wrapper; + +import org.springblade.core.mp.support.BaseEntityWrapper; +import org.springblade.desk.quality.pojo.entity.DispatchConfigApproval; +import org.springblade.desk.quality.pojo.vo.DispatchConfigApprovalVO; + +/** + * 分派配置审批包装类 + * + * @author AI + * @since 2026-05-19 + */ +public class DispatchConfigApprovalWrapper extends BaseEntityWrapper { + + public static DispatchConfigApprovalWrapper build() { + return new DispatchConfigApprovalWrapper(); + } + + @Override + public DispatchConfigApprovalVO entityVO(DispatchConfigApproval entity) { + return DispatchConfigApprovalVO.fromEntity(entity); + } +}