From 39f52238ec9697bc5b6ac9bf774a8f5d4bcc5383 Mon Sep 17 00:00:00 2001 From: yinq Date: Thu, 4 Jun 2026 16:40:18 +0800 Subject: [PATCH] =?UTF-8?q?1.1.58=20=E5=BC=80=E7=A5=A8=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=BC=80=E7=A5=A8?= =?UTF-8?q?=E6=AF=94=E4=BE=8B=E6=A0=A1=E9=AA=8C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../strategy/AbstractWorkflowService.java | 2 +- .../workflow/strategy/WorkflowStrategy.java | 7 +++++ .../oa/erp/domain/bo/ErpFinInvoiceInfoBo.java | 5 ++++ .../impl/ErpContractOrderServiceImpl.java | 20 +++++-------- .../impl/ErpFinInvoiceInfoServiceImpl.java | 29 +++++++++++++++++++ .../strategy/InvoiceWorkflowStrategy.java | 12 +++++++- 6 files changed, 61 insertions(+), 14 deletions(-) diff --git a/ruoyi-common/hwbm-common-workflow/src/main/java/org/dromara/workflow/strategy/AbstractWorkflowService.java b/ruoyi-common/hwbm-common-workflow/src/main/java/org/dromara/workflow/strategy/AbstractWorkflowService.java index 24cf67b5..b9e8fc3f 100644 --- a/ruoyi-common/hwbm-common-workflow/src/main/java/org/dromara/workflow/strategy/AbstractWorkflowService.java +++ b/ruoyi-common/hwbm-common-workflow/src/main/java/org/dromara/workflow/strategy/AbstractWorkflowService.java @@ -30,7 +30,7 @@ public abstract class AbstractWorkflowService { startProcess.setBusinessId(strategy.getBusinessId(bo)); startProcess.setVariables(strategy.getVariables(bo)); FlowConfigEnum flowConfigEnum = strategy.getFlowConfig(bo); - startProcess.setFlowConfig(flowConfigEnum.getFlowCode(), flowConfigEnum.getBusinessTitle(), strategy.getBusinessCode(bo)); + startProcess.setFlowConfig(flowConfigEnum.getFlowCode(), strategy.getBusinessTitle(bo), strategy.getBusinessCode(bo)); boolean flagOne = this.doStartWorkflow(startProcess); if (!flagOne) { diff --git a/ruoyi-common/hwbm-common-workflow/src/main/java/org/dromara/workflow/strategy/WorkflowStrategy.java b/ruoyi-common/hwbm-common-workflow/src/main/java/org/dromara/workflow/strategy/WorkflowStrategy.java index f69ebb60..337ac6eb 100644 --- a/ruoyi-common/hwbm-common-workflow/src/main/java/org/dromara/workflow/strategy/WorkflowStrategy.java +++ b/ruoyi-common/hwbm-common-workflow/src/main/java/org/dromara/workflow/strategy/WorkflowStrategy.java @@ -20,4 +20,11 @@ public interface WorkflowStrategy { Map getVariables(T bo); FlowConfigEnum getFlowConfig(T bo); + + /** + * 流程业务标题,默认取流程配置中的标题 + */ + default String getBusinessTitle(T bo) { + return getFlowConfig(bo).getBusinessTitle(); + } } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpFinInvoiceInfoBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpFinInvoiceInfoBo.java index f7be2c9a..e3c98666 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpFinInvoiceInfoBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpFinInvoiceInfoBo.java @@ -207,6 +207,11 @@ public class ErpFinInvoiceInfoBo extends BaseEntity { */ private String requestDeptName; + /** + * 项目经理ID + */ + private Long managerId; + private List erpFinInvoiceDetailList; private List toDeletedInvoiceDetailIdList; diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractOrderServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractOrderServiceImpl.java index 0701a5da..7226f28c 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractOrderServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractOrderServiceImpl.java @@ -767,7 +767,7 @@ public class ErpContractOrderServiceImpl implements IErpContractOrderService { } /** - * 按合同下开票记录汇总计算开票状态。 + * 按合同下开票记录的 returned_rate 计算开票状态。 */ private String resolveInvoiceStatus(Long contractId) { List invoices = finInvoiceInfoMapper.selectList(Wrappers.lambdaQuery() @@ -776,9 +776,8 @@ public class ErpContractOrderServiceImpl implements IErpContractOrderService { if (CollUtil.isEmpty(invoices)) { return OrderInvoiceStatusConstant.NOT_INVOICED; } - boolean hasCompleted = false; boolean hasInProgress = false; - BigDecimal completedAmount = BigDecimal.ZERO; + boolean hasCompleted = false; for (ErpFinInvoiceInfo invoice : invoices) { if (OAStatusEnum.APPROVING.getStatus().equals(invoice.getInvoiceStatus()) || BusinessStatusEnum.WAITING.getStatus().equals(invoice.getFlowStatus())) { @@ -786,19 +785,16 @@ public class ErpContractOrderServiceImpl implements IErpContractOrderService { } if (OAStatusEnum.COMPLETED.getStatus().equals(invoice.getInvoiceStatus())) { hasCompleted = true; - if (invoice.getIssueAmount() != null) { - completedAmount = completedAmount.add(invoice.getIssueAmount()); + if (invoice.getReturnedRate() != null + && invoice.getReturnedRate().compareTo(BigDecimal.valueOf(100)) == 0) { + return OrderInvoiceStatusConstant.INVOICED; } } } - if (!hasCompleted) { - return hasInProgress ? OrderInvoiceStatusConstant.PARTIAL_INVOICED : OrderInvoiceStatusConstant.NOT_INVOICED; + if (hasCompleted || hasInProgress) { + return OrderInvoiceStatusConstant.PARTIAL_INVOICED; } - BigDecimal contractAmount = resolveContractAmount(contractId); - if (contractAmount.compareTo(BigDecimal.ZERO) <= 0 || completedAmount.compareTo(contractAmount) >= 0) { - return OrderInvoiceStatusConstant.INVOICED; - } - return OrderInvoiceStatusConstant.PARTIAL_INVOICED; + return OrderInvoiceStatusConstant.NOT_INVOICED; } /** diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpFinInvoiceInfoServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpFinInvoiceInfoServiceImpl.java index 196ec960..5746165b 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpFinInvoiceInfoServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpFinInvoiceInfoServiceImpl.java @@ -2,6 +2,8 @@ package org.dromara.oa.erp.service.impl; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.apache.dubbo.config.annotation.DubboReference; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.enums.OAStatusEnum; @@ -246,6 +248,33 @@ public class ErpFinInvoiceInfoServiceImpl extends AbstractWorkflowService 0) { throw new ServiceException("本次开具发票比例不能超过100%"); } + validContractIssuancePercentageTotal(entity); + } + + /** + * 同一合同下各开票单本次开具比例累计不得超过100% + */ + private void validContractIssuancePercentageTotal(ErpFinInvoiceInfo entity) { + if (entity.getContractId() == null) { + return; + } + BigDecimal currentPercentage = entity.getIssuancePercentage() == null ? ZERO : entity.getIssuancePercentage(); + LambdaQueryWrapper qw = Wrappers.lambdaQuery(ErpFinInvoiceInfo.class) + .eq(ErpFinInvoiceInfo::getContractId, entity.getContractId()) + .eq(ErpFinInvoiceInfo::getDelFlag, "0") + .ne(ErpFinInvoiceInfo::getInvoiceStatus, OAStatusEnum.INVALID.getStatus()); + if (entity.getInvoiceId() != null) { + qw.ne(ErpFinInvoiceInfo::getInvoiceId, entity.getInvoiceId()); + } + List existingList = baseMapper.selectList(qw); + BigDecimal totalPercentage = existingList.stream() + .map(ErpFinInvoiceInfo::getIssuancePercentage) + .filter(Objects::nonNull) + .reduce(ZERO, BigDecimal::add) + .add(currentPercentage); + if (totalPercentage.compareTo(ONE_HUNDRED) > 0) { + throw new ServiceException("同一合同本次开具发票比例之和不能超过100%"); + } } private void validInvoiceDetailList(List detailList) { diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/workflow/strategy/InvoiceWorkflowStrategy.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/workflow/strategy/InvoiceWorkflowStrategy.java index 72e14232..09b1fc04 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/workflow/strategy/InvoiceWorkflowStrategy.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/workflow/strategy/InvoiceWorkflowStrategy.java @@ -1,7 +1,7 @@ package org.dromara.oa.workflow.strategy; import org.dromara.common.core.enums.OAStatusEnum; -import org.dromara.oa.erp.domain.bo.ErpBudgetInfoBo; +import org.dromara.common.core.utils.StringUtils; import org.dromara.oa.erp.domain.bo.ErpFinInvoiceInfoBo; import org.dromara.workflow.enums.FlowConfigEnum; import org.dromara.workflow.strategy.WorkflowStrategy; @@ -39,6 +39,7 @@ public class InvoiceWorkflowStrategy implements WorkflowStrategy