From a99b97ac8af627b769c094f9b608cb8c0e093e54 Mon Sep 17 00:00:00 2001 From: weicw Date: Sat, 31 Oct 2026 06:37:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=BD=92=E6=A1=A3=E5=89=8D=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E9=92=A9=E5=AD=90=E4=B8=8E=E4=BB=B7=E6=A0=BC=E8=A1=A8?= =?UTF-8?q?=E6=9F=A5=E7=9C=8B=E6=8E=A5=E5=8F=A3=E6=8E=A5=E7=BC=9D=EF=BC=88?= =?UTF-8?q?#57/#58=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ApprovalPriceController.java | 33 ++++++++++++++++ .../document/ApprovalDocumentType.java | 7 ++++ .../document/ApprovalPriceProvider.java | 17 ++++++++ .../document/ApprovalPriceVersion.java | 39 +++++++++++++++++++ .../service/ApprovalPriceService.java | 39 +++++++++++++++++++ .../approval/service/ApprovalTaskService.java | 4 ++ .../approval/vo/ApprovalPriceViewVO.java | 21 ++++++++++ 7 files changed, 160 insertions(+) create mode 100644 src/main/java/com/gxwebsoft/approval/controller/ApprovalPriceController.java create mode 100644 src/main/java/com/gxwebsoft/approval/document/ApprovalPriceProvider.java create mode 100644 src/main/java/com/gxwebsoft/approval/document/ApprovalPriceVersion.java create mode 100644 src/main/java/com/gxwebsoft/approval/service/ApprovalPriceService.java create mode 100644 src/main/java/com/gxwebsoft/approval/vo/ApprovalPriceViewVO.java diff --git a/src/main/java/com/gxwebsoft/approval/controller/ApprovalPriceController.java b/src/main/java/com/gxwebsoft/approval/controller/ApprovalPriceController.java new file mode 100644 index 0000000..15c7618 --- /dev/null +++ b/src/main/java/com/gxwebsoft/approval/controller/ApprovalPriceController.java @@ -0,0 +1,33 @@ +package com.gxwebsoft.approval.controller; + +import com.gxwebsoft.approval.service.ApprovalPriceService; +import com.gxwebsoft.approval.vo.ApprovalPriceViewVO; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.BaseController; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * 设施价格表只读接口:受众全体员工,独立权限点 `approval:price:view`(ADR 0008)。 + */ +@Api(tags = "设施价格表") +@RestController +@RequestMapping("/api/approval/price") +public class ApprovalPriceController extends BaseController { + + @Resource + private ApprovalPriceService priceService; + + @PreAuthorize("hasAuthority('approval:price:view')") + @ApiOperation("当前生效版本与历史版本") + @GetMapping + public ApiResult view() { + return success(priceService.view()); + } +} diff --git a/src/main/java/com/gxwebsoft/approval/document/ApprovalDocumentType.java b/src/main/java/com/gxwebsoft/approval/document/ApprovalDocumentType.java index eb359a1..09ed6e7 100644 --- a/src/main/java/com/gxwebsoft/approval/document/ApprovalDocumentType.java +++ b/src/main/java/com/gxwebsoft/approval/document/ApprovalDocumentType.java @@ -110,4 +110,11 @@ public interface ApprovalDocumentType { /** 撤回/驳回时清空本单需清空的字段(业务表不随引擎回滚)。 */ default void onRoundReset(ApprovalInstance instance, User user) { } + + /** + * 归档前校验:单据可在归档时拒绝(如价格表不允许追溯生效日期)。 + * 失败抛 BusinessException。 + */ + default void validateBeforeArchive(ApprovalInstance instance) { + } } diff --git a/src/main/java/com/gxwebsoft/approval/document/ApprovalPriceProvider.java b/src/main/java/com/gxwebsoft/approval/document/ApprovalPriceProvider.java new file mode 100644 index 0000000..ded6fdc --- /dev/null +++ b/src/main/java/com/gxwebsoft/approval/document/ApprovalPriceProvider.java @@ -0,0 +1,17 @@ +package com.gxwebsoft.approval.document; + +import java.util.List; + +/** + * 价格表查询提供者:只读视图的接缝(ADR 0008 / 0012)。 + * + *

价格表单据实现注册为 Bean 后,价格查看页只依赖本接口;没有实现时页面返回明确空态。

+ */ +public interface ApprovalPriceProvider { + + /** 当前生效版本:已归档且生效日期不晚于今天的最新一版;无则 null。 */ + ApprovalPriceVersion current(); + + /** 历史版本:已归档版本按生效日期倒序,最多 {@code limit} 条。 */ + List history(int limit); +} diff --git a/src/main/java/com/gxwebsoft/approval/document/ApprovalPriceVersion.java b/src/main/java/com/gxwebsoft/approval/document/ApprovalPriceVersion.java new file mode 100644 index 0000000..233c5f9 --- /dev/null +++ b/src/main/java/com/gxwebsoft/approval/document/ApprovalPriceVersion.java @@ -0,0 +1,39 @@ +package com.gxwebsoft.approval.document; + +import com.gxwebsoft.approval.support.ApprovalLineSpec; +import com.gxwebsoft.approval.vo.ApprovalFieldVO; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 价格表版本(审批实例即版本,ADR 0012):当前生效版本与历史版本共用本结构。 + */ +@Data +public class ApprovalPriceVersion implements Serializable { + private static final long serialVersionUID = 1L; + + private Long instanceId; + + private String bizNo; + + private LocalDate effectiveDate; + + private LocalDateTime archiveTime; + + private String reportOrgName; + + private List fields = new ArrayList<>(); + + private List> lines = new ArrayList<>(); + + private List lineColumns = new ArrayList<>(); + + private BigDecimal amountTotal; +} diff --git a/src/main/java/com/gxwebsoft/approval/service/ApprovalPriceService.java b/src/main/java/com/gxwebsoft/approval/service/ApprovalPriceService.java new file mode 100644 index 0000000..5703d18 --- /dev/null +++ b/src/main/java/com/gxwebsoft/approval/service/ApprovalPriceService.java @@ -0,0 +1,39 @@ +package com.gxwebsoft.approval.service; + +import com.gxwebsoft.approval.document.ApprovalPriceProvider; +import com.gxwebsoft.approval.document.ApprovalPriceVersion; +import com.gxwebsoft.approval.vo.ApprovalPriceViewVO; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * 价格表只读查询:当前生效版本 + 历史版本(ADR 0008 / 0012)。 + * + *

没有任何价格表实现时返回空态,不抛异常——页面需要展示明确空态而不是报错。

+ */ +@Service +public class ApprovalPriceService { + + /** 历史版本默认展示条数。 */ + private static final int DEFAULT_HISTORY_LIMIT = 50; + + @Resource + private org.springframework.beans.factory.ObjectProvider provider; + + public ApprovalPriceViewVO view() { + ApprovalPriceProvider priceProvider = provider.getIfAvailable(); + ApprovalPriceViewVO vo = new ApprovalPriceViewVO(); + if (priceProvider == null) { + vo.setCurrent(null); + vo.setHistory(new ArrayList<>()); + return vo; + } + vo.setCurrent(priceProvider.current()); + List history = priceProvider.history(DEFAULT_HISTORY_LIMIT); + vo.setHistory(history == null ? new ArrayList<>() : history); + return vo; + } +} diff --git a/src/main/java/com/gxwebsoft/approval/service/ApprovalTaskService.java b/src/main/java/com/gxwebsoft/approval/service/ApprovalTaskService.java index b7ad5bc..96f309e 100644 --- a/src/main/java/com/gxwebsoft/approval/service/ApprovalTaskService.java +++ b/src/main/java/com/gxwebsoft/approval/service/ApprovalTaskService.java @@ -374,6 +374,10 @@ public class ApprovalTaskService { if (!ApprovalConstants.STATUS_APPROVED.equals(locked.getStatus())) { throw new BusinessException("单据状态已变化,请刷新后重试"); } + ApprovalDocumentType documentType = documentRegistry.find(locked.getFlowCode()); + if (documentType != null) { + documentType.validateBeforeArchive(locked); + } ensureTaskCurrent(task, locked); if (updatePendingTask(taskId, ApprovalConstants.TASK_DONE, null) == 0) { throw new BusinessException("任务已处理"); diff --git a/src/main/java/com/gxwebsoft/approval/vo/ApprovalPriceViewVO.java b/src/main/java/com/gxwebsoft/approval/vo/ApprovalPriceViewVO.java new file mode 100644 index 0000000..af3ace7 --- /dev/null +++ b/src/main/java/com/gxwebsoft/approval/vo/ApprovalPriceViewVO.java @@ -0,0 +1,21 @@ +package com.gxwebsoft.approval.vo; + +import com.gxwebsoft.approval.document.ApprovalPriceVersion; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 价格表查看页数据:上半部分当前生效版本,下半部分历史版本(按生效日期倒序)。 + */ +@Data +@ApiModel(description = "价格表查看") +public class ApprovalPriceViewVO implements Serializable { + private static final long serialVersionUID = 1L; + + private ApprovalPriceVersion current; + + private List history; +}