From 52afb4b44ae97eeadb77f055b686884ef329af18 Mon Sep 17 00:00:00 2001
From: xxssyyyyssxx <xxssyyyyssxx@126.com>
Date: Thu, 4 Nov 2021 18:45:11 +0800
Subject: [PATCH] =?UTF-8?q?=E8=B5=84=E9=87=91=E5=88=A9=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../controller/backend/ProjectController.java |   4 -
 .../work/service/ProjectBudgetService.java    |  10 ++
 .../static/assets/js/project_budget_plan.js   | 147 ++++++++++++++++++
 3 files changed, 157 insertions(+), 4 deletions(-)

diff --git a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java
index 70a428c..875d071 100644
--- a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java
+++ b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java
@@ -188,7 +188,6 @@ public class ProjectController extends BaseController{
 
         Project project = projectService.getProject(jsonObject.getInteger("projectId"));
 
-        projectBudgetService.clearBudgetIncomeDetail(project);
         projectBudgetService.saveBudgetIncomeDetail(project, detailList);
 
         return ResponseMsg.buildSuccessMsg("成功");
@@ -209,7 +208,6 @@ public class ProjectController extends BaseController{
 
         Project project = projectService.getProject(jsonObject.getInteger("projectId"));
 
-        projectBudgetService.clearBudgetCostDetail(project);
         projectBudgetService.saveBudgetCostDetail(project, detailList);
 
         return ResponseMsg.buildSuccessMsg("成功");
@@ -230,7 +228,6 @@ public class ProjectController extends BaseController{
 
         Project project = projectService.getProject(jsonObject.getInteger("projectId"));
 
-        projectBudgetService.clearBudgetCostProjectManageDetail(project);
         projectBudgetService.saveBudgetCostProjectManageDetail(project, detailList);
 
         return ResponseMsg.buildSuccessMsg("成功");
@@ -251,7 +248,6 @@ public class ProjectController extends BaseController{
 
         Project project = projectService.getProject(jsonObject.getInteger("projectId"));
 
-        projectBudgetService.clearBudgetPlanDetail(project);
         projectBudgetService.saveBudgetPlanDetail(project, detailList);
 
         return ResponseMsg.buildSuccessMsg("成功");
diff --git a/src/main/java/cn/palmte/work/service/ProjectBudgetService.java b/src/main/java/cn/palmte/work/service/ProjectBudgetService.java
index 92a7260..75e4881 100644
--- a/src/main/java/cn/palmte/work/service/ProjectBudgetService.java
+++ b/src/main/java/cn/palmte/work/service/ProjectBudgetService.java
@@ -5,6 +5,7 @@ import cn.palmte.work.model.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import top.jfunc.common.utils.CollectionUtil;
 
 import java.math.BigDecimal;
@@ -225,7 +226,9 @@ public class ProjectBudgetService {
     /**
      * 保存项目的收入明细
      */
+    @Transactional(rollbackFor = RuntimeException.class)
     public void saveBudgetIncomeDetail(Project project, List<ProjectBudgetIncomeDetail> detailList){
+        clearBudgetIncomeDetail(project);
         if(CollectionUtil.isNotEmpty(detailList)){
             for (ProjectBudgetIncomeDetail projectBudgetIncomeDetail : detailList) {
                 projectBudgetIncomeDetail.setProjectId(project.getId());
@@ -253,7 +256,10 @@ public class ProjectBudgetService {
     /**
      * 保存项目的成本明细
      */
+    @Transactional(rollbackFor = RuntimeException.class)
     public void saveBudgetCostDetail(Project project, List<ProjectBudgetCostDetail> detailList){
+        clearBudgetCostDetail(project);
+
         if(CollectionUtil.isNotEmpty(detailList)){
             for (ProjectBudgetCostDetail projectBudgetCostDetail : detailList) {
                 projectBudgetCostDetail.setProjectId(project.getId());
@@ -281,7 +287,9 @@ public class ProjectBudgetService {
     /**
      * 保存项目的项目管理成本明细
      */
+    @Transactional(rollbackFor = RuntimeException.class)
     public void saveBudgetCostProjectManageDetail(Project project, List<ProjectBudgetCostProjectManageDetail> detailList){
+        clearBudgetCostProjectManageDetail(project);
         if(CollectionUtil.isNotEmpty(detailList)){
             for (ProjectBudgetCostProjectManageDetail projectBudgetCostProjectManageDetail : detailList) {
                 projectBudgetCostProjectManageDetail.setProjectId(project.getId());
@@ -332,7 +340,9 @@ public class ProjectBudgetService {
     /**
      * 保存项目的资金计划明细
      */
+    @Transactional(rollbackFor = RuntimeException.class)
     public void saveBudgetPlanDetail(Project project, List<ProjectBudgetPlanDetail> detailList){
+        clearBudgetPlanDetail(project);
         if(CollectionUtil.isNotEmpty(detailList)){
             for (ProjectBudgetPlanDetail projectBudgetPlanDetail : detailList) {
                 projectBudgetPlanDetail.setProjectId(project.getId());
diff --git a/src/main/resources/static/assets/js/project_budget_plan.js b/src/main/resources/static/assets/js/project_budget_plan.js
index 3764cd9..448ab80 100644
--- a/src/main/resources/static/assets/js/project_budget_plan.js
+++ b/src/main/resources/static/assets/js/project_budget_plan.js
@@ -69,6 +69,12 @@ function bindBudgetPlanDeleteBtn() {
 
         //更新余额
         updateEachFundBalance();
+        //更新垫资计划
+        updateEachUnderwrittenPlan();
+        //更新回款计划
+        updateEachRepaymentPlan();
+        //更新资金利息
+        updateEachCapitalInterest();
 
     });
 }
@@ -91,6 +97,12 @@ function bindChangeableInputBudgetPlanDetail() {
         updateBudgetPlanTotal("input-changeable-total-cost-budget-plan","input-total-total-cost-budget-plan");
         //更新余额
         updateEachFundBalance();
+        //更新垫资计划
+        updateEachUnderwrittenPlan();
+        //更新回款计划
+        updateEachRepaymentPlan();
+        //更新资金利息
+        updateEachCapitalInterest();
     });
     //工程支出改变
     $(".input-changeable-engineer-cost-budget-plan").change(function () {
@@ -109,6 +121,12 @@ function bindChangeableInputBudgetPlanDetail() {
         updateBudgetPlanTotal("input-changeable-total-cost-budget-plan","input-total-total-cost-budget-plan");
         //更新余额
         updateEachFundBalance();
+        //更新垫资计划
+        updateEachUnderwrittenPlan();
+        //更新回款计划
+        updateEachRepaymentPlan();
+        //更新资金利息
+        updateEachCapitalInterest();
     });
     //经营性支出改变
     $(".input-changeable-project-manage-cost-budget-plan").change(function () {
@@ -127,6 +145,12 @@ function bindChangeableInputBudgetPlanDetail() {
         updateBudgetPlanTotal("input-changeable-total-cost-budget-plan","input-total-total-cost-budget-plan");
         //更新余额
         updateEachFundBalance();
+        //更新垫资计划
+        updateEachUnderwrittenPlan();
+        //更新回款计划
+        updateEachRepaymentPlan();
+        //更新资金利息
+        updateEachCapitalInterest();
     });
     //保证金改变
     $(".input-changeable-earnest-money-cost-budget-plan").change(function () {
@@ -145,6 +169,12 @@ function bindChangeableInputBudgetPlanDetail() {
         updateBudgetPlanTotal("input-changeable-total-cost-budget-plan","input-total-total-cost-budget-plan");
         //更新余额
         updateEachFundBalance();
+        //更新垫资计划
+        updateEachUnderwrittenPlan();
+        //更新回款计划
+        updateEachRepaymentPlan();
+        //更新资金利息
+        updateEachCapitalInterest();
     });
 
     //销售收款改变
@@ -162,6 +192,12 @@ function bindChangeableInputBudgetPlanDetail() {
         updateBudgetPlanTotal("input-changeable-total-income-budget-plan","input-total-total-income-budget-plan");
         //更新余额
         updateEachFundBalance();
+        //更新垫资计划
+        updateEachUnderwrittenPlan();
+        //更新回款计划
+        updateEachRepaymentPlan();
+        //更新资金利息
+        updateEachCapitalInterest();
     });
     //保证金收款改变
     $(".input-changeable-earnest-money-income-budget-plan").change(function () {
@@ -178,6 +214,12 @@ function bindChangeableInputBudgetPlanDetail() {
         updateBudgetPlanTotal("input-changeable-total-income-budget-plan","input-total-total-income-budget-plan");
         //更新余额
         updateEachFundBalance();
+        //更新垫资计划
+        updateEachUnderwrittenPlan();
+        //更新回款计划
+        updateEachRepaymentPlan();
+        //更新资金利息
+        updateEachCapitalInterest();
     });
 
 
@@ -238,6 +280,111 @@ function updateEachFundBalance() {
 }
 
 
+/**
+ * 更新每一行【即每个月】的垫资计划
+ */
+function updateEachUnderwrittenPlan() {
+    var total = 0;
+    //找到每个月的垫资计划输入框
+    $(".input-changeable-underwritten-plan-budget-plan").each(function (t) {
+        //找到当前月的收入和支出
+        var income = parseFloat($(this).parent().parent().find(".input-changeable-total-income-budget-plan").val());
+        var cost = parseFloat($(this).parent().parent().find(".input-changeable-total-cost-budget-plan").val());
+        //我的上月余额
+        var prevFundBalance = parseFloat($(this).parent().parent().prev("tr").find(".input-changeable-fund-balance-budget-plan").val());
+        if(!prevFundBalance){
+            //第一个月的话,上月余额就为0
+            prevFundBalance = 0;
+        }
+
+        var underwrittenPlan = 0;
+
+        if(income - cost >= 0){
+            underwrittenPlan = 0;
+        }else {
+            if(prevFundBalance<0){
+                underwrittenPlan = cost - income;
+            }else {
+                if(prevFundBalance <= cost - income){
+                    underwrittenPlan = cost - income - prevFundBalance;
+                }else {
+                    underwrittenPlan = 0;
+                }
+            }
+        }
+
+        total += underwrittenPlan;
+
+        $(this).val(underwrittenPlan);
+    });
+
+    //总垫资计划=所有月累加
+    $(".input-total-underwritten-plan-budget-plan").val(total);
+}
+/**
+ * 更新每一行【即每个月】的还款计划
+ */
+function updateEachRepaymentPlan() {
+    var total = 0;
+    //找到每个月的回款计划输入框
+    $(".input-changeable-repayment-plan-budget-plan").each(function (t) {
+        //找到当前月的收入和支出
+        var income = parseFloat($(this).parent().parent().find(".input-changeable-total-income-budget-plan").val());
+        var cost = parseFloat($(this).parent().parent().find(".input-changeable-total-cost-budget-plan").val());
+        //我的上月余额
+        var prevFundBalance = parseFloat($(this).parent().parent().prev("tr").find(".input-changeable-fund-balance-budget-plan").val());
+        if(!prevFundBalance){
+            //第一个月的话,上月余额就为0
+            prevFundBalance = 0;
+        }
+
+        var repaymentPlan = 0;
+        if(income - cost <= 0){
+            repaymentPlan = 0;
+        }else {
+            if(prevFundBalance >= 0){
+                repaymentPlan = 0;
+            }else {
+                if(income - cost <= -prevFundBalance){
+                    repaymentPlan = income - cost;
+                }else {
+                    repaymentPlan = -prevFundBalance;
+                }
+            }
+        }
+
+
+        total += repaymentPlan;
+
+        $(this).val(repaymentPlan);
+
+    });
+
+    //总回款计划=所有月累加
+    $(".input-total-repayment-plan-budget-plan").val(total);
+}
+/**
+ * 更新每一行【即每个月】的资金利息
+ */
+function updateEachCapitalInterest() {
+    var total = 0;
+    //找到每个月的资金利息输入框
+    $(".input-changeable-capital-interest-budget-plan").each(function (t) {
+        //找到当前月的垫资计划
+        var underwrittenPlan = parseFloat($(this).parent().parent().find(".input-changeable-underwritten-plan-budget-plan").val());
+        var capitalInterest = underwrittenPlan*0.0566/12;
+        total += capitalInterest;
+
+        $(this).val(capitalInterest);
+
+    });
+
+    //总资金利息=所有月累加
+    $(".input-total-capital-interest-budget-plan").val(total);
+}
+
+
+
 /**
  * 更新页面收入的数据
  */