diff --git a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizProjectController.java b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizProjectController.java index ce2b705..2b49ea7 100644 --- a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizProjectController.java +++ b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizProjectController.java @@ -172,6 +172,7 @@ public class BizProjectController extends BaseController public AjaxResult saveAssigns(@PathVariable("projectId") Long projectId, @RequestBody List assigns) { if (assigns == null) assigns = new ArrayList<>(); + bizProjectAssignService.validateSum(projectId, assigns); bizProjectAssignService.deleteByProjectId(projectId); for (BizProjectAssign a : assigns) { a.setProjectId(projectId); diff --git a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/service/IBizProjectAssignService.java b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/service/IBizProjectAssignService.java index 2b8eee0..f5186b7 100644 --- a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/service/IBizProjectAssignService.java +++ b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/service/IBizProjectAssignService.java @@ -15,4 +15,9 @@ public interface IBizProjectAssignService int updateByPrimaryKey(BizProjectAssign entity); int deleteByPrimaryKey(String assignId); int deleteByProjectId(Long projectId); + /** + * 校验多个执行方总金额不超过项目总金额 (服务端二次校验, 防前端绕过) + * 超额抛 ServiceException + */ + void validateSum(Long projectId, List assigns); } diff --git a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/service/impl/BizProjectAssignServiceImpl.java b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/service/impl/BizProjectAssignServiceImpl.java index 68a62d1..e32c325 100644 --- a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/service/impl/BizProjectAssignServiceImpl.java +++ b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/service/impl/BizProjectAssignServiceImpl.java @@ -1,13 +1,16 @@ package com.ruoyi.business.service.impl; +import java.math.BigDecimal; import java.util.Date; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.business.domain.BizOrg; +import com.ruoyi.business.domain.BizProject; import com.ruoyi.business.domain.BizProjectAssign; import com.ruoyi.business.mapper.BizOrgMapper; import com.ruoyi.business.mapper.BizProjectAssignMapper; +import com.ruoyi.business.mapper.BizProjectMapper; import com.ruoyi.business.service.IBizProjectAssignService; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; @@ -20,6 +23,8 @@ public class BizProjectAssignServiceImpl implements IBizProjectAssignService private BizProjectAssignMapper bizProjectAssignMapper; @Autowired private BizOrgMapper bizOrgMapper; + @Autowired + private BizProjectMapper bizProjectMapper; @Override public BizProjectAssign getById(String assignId) { return bizProjectAssignMapper.selectByPrimaryKey(assignId); } @@ -84,4 +89,27 @@ public class BizProjectAssignServiceImpl implements IBizProjectAssignService @Override public int deleteByProjectId(Long projectId) { return bizProjectAssignMapper.deleteByProjectId(projectId); } + + /** + * 校验多个执行方总金额不超过项目总金额 (服务端二次校验, 防前端绕过) + * 超额抛 ServiceException, 由 axios 拦截器统一弹 ElMessage.error + */ + @Override + public void validateSum(Long projectId, List assigns) { + if (assigns == null || assigns.isEmpty()) return; + BigDecimal sum = BigDecimal.ZERO; + for (BizProjectAssign a : assigns) { + if (a.getAmount() != null) sum = sum.add(a.getAmount()); + } + if (sum.signum() <= 0) return; + BizProject p = bizProjectMapper.selectByPrimaryKey(projectId); + if (p == null) throw new ServiceException("项目 " + projectId + " 不存在"); + BigDecimal total = p.getTotalAmount(); + if (total == null || total.signum() <= 0) return; + if (sum.compareTo(total) > 0) { + throw new ServiceException( + "多个执行方的总金额(" + sum.toPlainString() + ")超过项目总金额(" + total.toPlainString() + ")" + ); + } + } } \ No newline at end of file diff --git a/ry-vue3/src/views/manager/ManagerProjectsAssign.vue b/ry-vue3/src/views/manager/ManagerProjectsAssign.vue index c5998ca..0749d89 100644 --- a/ry-vue3/src/views/manager/ManagerProjectsAssign.vue +++ b/ry-vue3/src/views/manager/ManagerProjectsAssign.vue @@ -6,7 +6,7 @@ -
+
已选 {{ assignBatchProjects.length }} 个项目 (本次分配将按各项目自身的总场次 / 总金额逐项校验)
@@ -14,7 +14,7 @@
- + {{ currentProject?.projectNo || '-' }} {{ currentProject?.projectName || '-' }} {{ currentProject?.projectForm || '-' }} @@ -24,7 +24,7 @@ - + - 执行方分配 + 执行单位分配
@@ -43,6 +43,9 @@ 总金额(元): {{ assignForm.totalAmount || 0 }} 已分配金额: ¥ {{ assignedAmount }} ⚠ 已超出 ¥ {{ Math.round((assignedAmount - assignForm.totalAmount) * 100) / 100 }} + | + 可用金额: ¥ {{ availableAmount }} + (公式: 总金额×(1-管理费/总金额)-累计劳务-累计会务)
@@ -52,7 +55,7 @@ - +